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

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

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

小夜