前言¶
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