dsh-skill-manager:DSH 技能注册、版本与 zip 包管理

前言

在 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。

典型用法

  1. 按上一节完成 junction 与 cordis.patch.yml 追加,刷新浏览器。
  2. 打开 设置 → 技能管理,点「重新扫描」确认库内技能与诊断区(若有非法 frontmatter 或目录差异会出现在底部折叠区)。
  3. 对需要留底的技能:在详情里 建立基线 或 捕获当前为新版本;磁盘文件变更后按提示「捕获改动」。
  4. 迁机或备份:导出 带清单 zip;目标环境用 导入,在计划对话框确认 create/overwrite 等动作后再落盘。
  5. 临时不让模型或用户看到某技能:在行右侧策略胶囊中选择「停用」或「仅用户/仅模型」——策略在下一模型步生效(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 目录页。

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

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

小夜