前言¶
在 DeepSeek Harness(DSH)里,技能以目录 + SKILL.md 的形式散落在 profile 与各类 provider 路径下。日常会遇到几类问题:清单里看得到但模型用不上(frontmatter 不合法被静默丢弃)、想备份或迁机却没有带清单与校验的 zip、改过文件却记不清「上一版长什么样」。社区里已有不少插件做列表、策略与导入,但 README 中整理的调研结论是:导出带清单的 zip、可回滚的内容寻址版本史,在生态里相对空缺。@cnhenaihui/dsh-skill-manager(维护者 cnhenaihui,分类:工作流)针对上述缺口,在设置页提供统一的「技能管理」界面,并在宿主侧用覆盖层实现停用/启用,且不声明运行时 npm 依赖。
这是什么¶
一句话:dsh-skill-manager 是 DSH 的技能管理插件,负责技能注册与介绍、带 dsh-skill-package.json 清单的 zip 导出/导入、内容寻址的版本捕获/对比/回滚,以及五档调用策略(不改源文件上的 frontmatter)。
- 包名:
@cnhenaihui/dsh-skill-manager - 当前版本(package.json):
0.4.0 - 许可证:MIT
- 引擎:
node>= 20.0.0;dsh>= 0.2.0-rc.2 < 0.3.0 - 代码结构:宿主半
lib/index.js(装配、覆盖 provider、HTTP 路由);浏览器半client.js(设置 → 技能管理);核心逻辑lib/core/*(纯 Node,可单测)
与同类做法的差异(README 归纳)¶
维护者在文档中对比了 18 个同类插件后的结论,核心差异可概括为下表(细节以仓库 README 为准):
| 能力 | 生态常见情况 | 本插件 |
|---|---|---|
| 清单 / 介绍 / 停启 | 已有多个实现 | 具备,并补诊断与对照 |
| 导出 zip | 多为单向导入,zip 常无清单 | 自带清单 + 逐文件 sha256 |
| 版本跟踪 | 备份目录或内存 manifest,难 diff/回滚 | 内容寻址快照、时间线、逐文件与行级 diff、回滚 |
另外文档还提到:非法 frontmatter 会被官方静默丢弃整个技能——本插件单独列出并说明原因;并把磁盘扫描结果与 ctx.skills.snapshot() 按名对照,标出「看起来存在但用不了」的项。首开可为无版本记录的技能一键建基线,并在磁盘变更时提示「未捕获改动」。
核心功能¶
设置页「技能管理」¶
浏览器进入 设置 → 技能管理(需先按下文完成安装并刷新)。界面按「默认一屏看全库、需要再展开」组织,主要包括:
- 顶栏:技能数、未捕获改动数、扫描时间;
导入、导出全部、重新扫描 - 列表:搜索与筛选、批量操作、分组视图;行内展开详情(策略、路径、版本历史、diff、导出当前等)
- 策略五档(覆盖层,不写回源文件):跟随文件、启用、仅用户可调用、仅模型可调用、停用
- 版本:
捕获当前为新版本、标签/备注、与最新版对比、单文件行级 diff、回滚(回滚前自动备份当前状态) - 导出:单技能 / 选中 / 全部 / 指定历史修订 → 带清单 zip;同名多副本在 zip 顶层目录自动消歧(
name/name--来源) - 导入:上传 zip 后先出计划(create/overwrite/rename/skip/invalid),确认后落盘;校验清单 sha256 与 frontmatter
HTTP 接口¶
路由前缀为 /api/skill-manager.,在 Connection 鉴权栅栏内,例如:ping、list、detail、policy、revisions、capture、annotate、restore、compare、export、import、baseline、status、layout(layout 支持 GET 读、POST 局部更新 groups/assignments/order)。
本机数据目录¶
插件状态与版本对象写在 DSH 用户目录下(README 约定):
<DSH_HOME>/skill-manager/
state.json # 策略覆盖 + 分组/排序
revisions/<sourceKey>/<name>/
objects/<ab>/<sha256> # 内容寻址去重
tmp/
分组与自定义排序只影响本插件列表展示,不改变模型看到的注册顺序;要改可见性需用策略档位。
安装与启用¶
官方 README 给出的是 本地开发安装(junction + profile patch),并注明在声明了 dsh.profile.patchReload: live 的 desktop profile 上可热装。下列命令摘自仓库 README(PowerShell,在本仓库根目录执行):
# 1) 建 junction(零依赖,不需要 pnpm install)
$link = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\@cnhenaihui\dsh-skill-manager"
$target = (Resolve-Path .).Path # 本仓库根目录,请在该目录下执行
New-Item -ItemType Junction -Path $link -Target $target
# 2) 往 profile 的 patch 层追加一段 insert(追加到 ~/.dsh/profiles/desktop/cordis.patch.yml 末尾)
# - insert:
# - id: skill-manager
# name: "@cnhenaihui/dsh-skill-manager"
说明:patch 生效后新装插件可即时装载;修改插件自身代码时 README 要求重启宿主(patchReload: live 不会重载已缓存模块)。卸载时删除 cordis.patch.yml 中对应 insert、junction,以及 ~/.dsh/skill-manager/(技能源文件不受影响)。
社区目录页:SkillHub - dsh-skill-manager。源码与完整说明:GitHub - cnhenaihui/dsh-skill-manager。
典型用法¶
- 按上一节完成 junction 与
cordis.patch.yml追加,刷新浏览器。 - 打开 设置 → 技能管理,点「重新扫描」确认库内技能与诊断区(若有非法 frontmatter 或目录差异会出现在底部折叠区)。
- 对需要留底的技能:在详情里 建立基线 或 捕获当前为新版本;磁盘文件变更后按提示「捕获改动」。
- 迁机或备份:导出 带清单 zip;目标环境用 导入,在计划对话框确认 create/overwrite 等动作后再落盘。
- 临时不让模型或用户看到某技能:在行右侧策略胶囊中选择「停用」或「仅用户/仅模型」——策略在下一模型步生效(README 说明为官方行为)。
开发自检(摘自 README):
node test/run.js # 文档称当前 145 项全绿
node test/run.js zip revisions # 按用例名过滤
UI 可在无宿主时用 .design/harness/harness.html 等页面加载真实 client.js 做可视化检查。
适用场景与注意¶
适合谁:本地 DSH 技能较多、需要可校验的 zip 迁机/备份、需要对比与回滚修订、希望在不改 SKILL.md 的前提下统一管控启停与调用面的开发者。
运行与权限:插件以当前 DSH 进程权限读写 ~/.dsh/skill-manager/ 与用户技能目录;安装前应阅读源码与 MIT 许可证,自行判断是否放入个人或生产 profile。
机制上需知晓的几点(均来自 README「关键机制与坑」):
- 停用依赖更高优先级的同名技能覆盖注册(本插件 rank 0 覆盖层),且需在各 agent 作用域各注册一份,否则部分会话可能失效。
- 不声明
@deepseek-ai/dsh-*peerDependency,是为避免 prerelease 版本被dsh-app-boot整包拒载;能力通过ctx的skills/connection取用。 - 覆盖层按技能名生效时,同名不同来源可能一同被挡(文档写明与生态同类实现一致)。
- 分组、策略覆盖存于本机
state.json,默认不随 zip 导出;换机器需重新导入包并本地重设策略/分组。
尚未完成(README §7):注册脚手架 UI、修订/prune 界面入口、旧 dsh-skills-manager 状态迁移确认界面等,使用前以仓库 CHANGELOG 与 issue 为准。
结尾¶
dsh-skill-manager 把技能清单、诊断、带 sha256 的 zip 包、以及可回滚的版本线收进 DSH 设置页,并坚持零运行时依赖,适合作为 desktop profile 下的日常技能运维入口。更多接口与数据字段见 GitHub README;社区索引见 SkillHub 目录页。