dsh-skill-recursive:讓 SKILL.md 支持嵌套子目錄

前言

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

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜