前言¶
DSH 內置的 skill-filesystem provider 只掃描 skill 根目錄的第一層。如果你把技能按用途分到容器文件夾裏,例如 obsidian-skills/defuddle/SKILL.md,內置 provider 就找不到它,技能等於不存在。dsh-skill-recursive 這個插件解決這個問題:它遞歸掃描標準 skill 根目錄,把嵌套在第二層及更深的 SKILL.md 也納入索引,同時把第一層技能留給內置 provider 管。作者是 DanielEstrada971102,分類屬於工作流,許可證爲 MIT。
下面介紹它的來源、安裝方式、配置項和需要注意的邊界。
這是什麼¶
一句話定位:一個 DSH bundle 插件,爲 DeepSeek Harness 補充遞歸式的 SKILL.md 發現能力,維護者是 DanielEstrada971102。
它的工作方式與內置 provider 有明確的分工:
.dsh/skills/
├── flat-skill/SKILL.md ← built-in provider
└── obsidian-skills/ ← container folder
├── defuddle/SKILL.md ← this plugin
└── json-canvas/SKILL.md ← this plugin
第一層的 flat-skill 仍由內置 provider 負責,插件只追加深度 2 及以上的嵌套技能。這樣避免了兩個 provider 對同一技能重複聲明所有權。
核心功能¶
1、掃描範圍。會遞歸遍歷以下根目錄:項目級 .dsh/skills 與 .agents/skills(取 session 工作目錄最近的 .git 祖先)、$DSH_HOME/skills(默認 ~/.dsh/skills)、$DSH_AGENTS_HOME/skills(默認 ~/.agents/skills),以及配置裏追加的 extraRoots。
2、遞歸遍歷。每個根目錄向下走到 maxDepth,期間跳過 ignoreDirs 中列出的目錄名。
3、深度保護。只有深度 2 及以上的嵌套 bundle 會被收錄,因此第一層技能的發現權仍歸內置 provider,不會被本插件接管。
4、優先級。同名場景下,嵌套候選排名低於對應的第一層根目錄,也就是說存在同名技能時,平鋪的那個勝出。
5、Frontmatter 解析。讀取 name、description、可選的 whenToUse、disable-model-invocation、user-invocable;解析失敗的文件會記日誌並跳過,不會中斷整體掃描。支持的 YAML 形式是純量、引號標量、塊標量(|、>)和布爾值,任意嵌套結構不會向前轉發。
6、熱刷新。監聽根目錄變化並失效 skill 目錄緩存;在遞歸監聽不可用的環境裏退化爲輪詢。
安裝與啓用¶
插件是標準 DSH bundle,Desktop 應用(desktop profile)和瀏覽器託管的 harness(web profile)都能用。每個 profile 只加載實際裝入其中的內容。
Desktop 應用兩種方式的其一:在應用內插件管理器裏安裝,或讓 Harness session 執行:
plugin_manager action=install_bundle target=github:DanielEstrada971102/dsh-skill-recursive#v0.2.0
Web profile 用命令行:
dsh plugin --profile web add github:DanielEstrada971102/dsh-skill-recursive#v0.2.0
本地 clone 方式(僅在已 clone 的前提下,README 給出的命令):
git clone https://github.com/DanielEstrada971102/dsh-skill-recursive.git
dsh plugin --profile <profile> add link:<absolute path to the clone>
裝完或更新 bundle 後需要重啓 host 進程。
配置¶
配置入口是 Settings → Plugins → Recursive Skill Discovery,bundle 頁面會渲染配置表單,DSH 保存後即刻生效,不需要重啓。下表來自 README 的配置說明。
| 字段 | 默認值 | 含義 |
|---|---|---|
minDepth |
2 |
可能包含技能的第一層目錄深度(相對根目錄) |
maxDepth |
8 |
掃描的最大目錄深度 |
watch |
true |
監聽根目錄變化並失效目錄緩存 |
debounceMs |
200 |
watcher 失效的防抖間隔 |
pollIntervalMs |
2000 |
輪詢回退間隔 |
includeProjectRoots |
true |
掃描項目的 .dsh/skills 與 .agents/skills |
includeUserRoots |
true |
掃描用戶級 skill 根目錄 |
followSymlinks |
false |
跟隨符號鏈接目錄(帶環路保護) |
extraRoots |
[] |
額外根目錄,需使用絕對路徑 |
ignoreDirs |
[".system","node_modules",".git"] |
永不進入的目錄名 |
部署時也可以寫 profile patch 作爲默認配置:
- insert:
- id: skill-recursive
name: dsh-skill-recursive
config:
maxDepth: 6
extraRoots:
- C:/shared/skills
兼容性與運行環境¶
README 標註的測試環境是 DeepSeek Harness 0.2.1-rc.5,Node.js 20 及以上。package.json 的 engines 字段同樣要求 node >= 20,依賴只有 @deepseek-ai/schemastery ~3.18.5,沒有其他運行時依賴。設置表單由與 Desktop 和 Web 兩種 profile 相同的 Web client 渲染。
適用場景與注意事項¶
適合把技能按主題分容器管理、並且用 .dsh/skills、.agents/skills 或用戶級 skill 根目錄存放SKILL.md 的開發者。如果你的技能都平鋪在第一層,這個插件沒有額外收益,內置 provider 已經夠用。
幾點需要注意:
1、本插件是對 skill-filesystem 的補充,不是替代。如果那個內置 provider 被禁用,平鋪技能不會被本插件發現。
2、技能文件由 host 進程內的 node:fs 直接讀取,行爲與內置 provider 一致。插件以當前 dsh 進程的權限運行,安裝前應檢查源碼與 MIT 許可證,確認代碼與配置符合你的環境要求。
3、每個不同的根目錄路徑會在進程生命週期內保留一個 watcher,如果根目錄數量很多,留意監聽句柄的佔用。
4、目錄掃描深度默認到 8,配合默認的 ignoreDirs 通常夠用;如果 extraRoots 指向他人的共享目錄,建議先確認其中的 SKILL.md 是否可信,因爲它們會被直接讀入技能目錄。
收尾¶
這個插件的價值很窄也很清楚:補上 DSH 技能發現在嵌套目錄上的缺口,不改動現有平鋪技能的發現邏輯。如果你的項目已經按主題分子目錄組織技能,值得裝一個試;把技能平鋪在第一層的用戶不需要它。
目錄頁:https://www.skillhub.cn/plugins/DanielEstrada971102/dsh-skill-recursive
GitHub:https://github.com/DanielEstrada971102/dsh-skill-recursive