dsh-skill-manager
DeepSeek Harness 的 skill 管理插件:列出、查看、创建、编辑、删除 skills,并提供模型调用开关与软删除/还原。插件包含:
- 模型工具(宿主端,注册到全局工具层,所有会话的 agent 都可用):
skill_list— 列出当前工作区可见的全部 skill(名称、描述、model/user 开关、根目录、路径)skill_view— 查看某个 skill 的完整说明(frontmatter + 正文)skill_update— 编辑描述 / 正文 / 调用开关,或重命名skill_delete— 永久删除
- 设置页(浏览器端):设置 →「技能」,可视化清单 + 新建/编辑/删除/软删除还原/开关。
- RPC 服务
ctx.skillManager(Typert 网关,供客户端调用):list/view/update/deleteSkill/trashSkill/restoreSkill/installSkill。
界面预览

安装
# 从 GitHub 安装到 web profile
dsh plugin --profile web add github:KeyboardPrince/dsh-skill-manager
说明:
dsh plugin --profile web add <spec>会原样把参数转发给 pnpm,因此 pnpm 支持的任何写法都可用:
github:KeyboardPrince/dsh-skill-manager— 从 GitHub 安装(推荐)dsh-skill-manager— 从 npm registry 安装(需先npm publish)<tarball>/<目录>— 本地打包或目录安装
命令会把本包加入 profile 的依赖与 dsh.profile.bundles 栈,随后重启 dsh web 生效
(插件在启动时挂载;运行中的进程不会热加载新行)。生效后可在 设置 → 插件 里看到
dsh-skill-manager 行,并在设置 → 技能 打开管理页。
卸载:
dsh plugin --profile web remove dsh-skill-manager
开发循环
# 方式一:直接装目录(无需打包,改完重新 add 即更新)
dsh plugin --profile web add "C:\Users\admin\Desktop\plugin"
# 方式二:从 GitHub 安装指定提交/分支/标签
dsh plugin --profile web add "github:KeyboardPrince/dsh-skill-manager#v1.0"
# 安装后重启 dsh web 使挂载生效
它管理哪些 skill
与 DSH 自带的 dsh-skill-filesystem 发现机制使用同一套根(rank 越高优先级越高):
| rank | 根 | 路径 |
|---|---|---|
| 100 | project-dsh | <项目根>/.dsh/skills |
| 200 | custom | 插件配置 customSkillDirs |
| 400 | user-dsh(默认创建位置) | $DSH_HOME/skills |
项目根 = 最近的 .git 祖先目录(无则取 cwd)。支持两种文件形态:
<root>/<name>/SKILL.md(目录包,创建时默认采用)与 <root>/<name>.md(扁平文件)。
项目技能(project-dsh / project-agents)来自 DSH 在 workspace.json 中登记的工作区,
不依赖当前进程 cwd 是否含 .git,始终在设置页的项目分组中展示。
插件配置(可选)
在 profile 的 cordis.patch.yml 或 bundle 行配置中覆盖:
- insert:
- id: skill-manager
name: dsh-skill-manager
config:
dshHome: C:/path/to/.dsh # 可选:覆盖 $DSH_HOME(默认 ~/.dsh)。不同部署可重定向存储根
customSkillDirs: # 可选:额外自定义根(rank 200)
- D:/my-org/skills
dshHome:指向 DSH 存储根,影响全局技能目录($DSH_HOME/skills)、安装目标与workspace.json读取位置。customSkillDirs:额外的用户自定义 skill 根目录(绝对或相对路径),按RANK.custom = 200排序。- 默认创建位置固定为
user-dsh($DSH_HOME/skills);「添加技能」经 RPCinstallSkill时可指定target改为工作区根。
模型工具说明
| 工具 | 参数 | 作用 |
|---|---|---|
skill_list |
root? / cwd? |
列出全部可见 skill,可按根过滤 |
skill_view |
name(必填) |
查看单个 skill 的完整说明 |
skill_update |
name(必填)、description?、whenToUse?、body?、renameTo?、disableModelInvocation?、userInvocable? |
编辑并可选重命名 |
skill_delete |
name(必填) |
永久删除(不可恢复) |
social_update 等"新建"动作由设置页经 RPC installSkill 完成(把外部 SKILL.md 原样写入目标根)。
skill 文件格式
---
name: my-skill
description: 一句话描述(必填,技能目录中显示)
whenToUse: 可选,说明何时使用
disable-model-invocation: false # true 时从模型目录中隐藏
user-invocable: true # false 时从用户斜杠命令中隐藏
---
# My Skill
正文(agent 加载的完整说明)。frontmatter 之外的额外字段会原样保留。
软删除与还原
设置页的「删除」默认走软删除:skill 被移入系统临时目录的回收区
($TMPDIR/dsh-skill-trash),不会立即丢失,可在设置页还原回原始路径。
模型工具 skill_delete 则是永久删除,操作前请先用 skill_list 确认名称。
安全机制:删除/还原会校验技能真实位置(穿过符号链接后)是否落在其所属根的存储区, 防止删除工作区技能时误删全局/共享数据(如 DSH 自管的
.skills-manager真实存储)。
开发
plugin/
├── cordis.patch.yml # dsh.bundle.patch:插入插件行
├── lib/
│ ├── index.js # 宿主插件:4 个模型工具 + skillManager 服务
│ ├── skills.js # 核心逻辑:根解析 / frontmatter / 文件操作(纯 Node)
│ ├── typert.host.js # Typert RPC 清单(zod v4)
│ └── client.js # 浏览器端设置页 UI(__ModuleLoader__ bundle)
├── package.json # dsh.bundle + dsh.client 声明
├── test/
│ ├── smoke.mjs # 冒烟测试
│ └── verify-install-targets.mjs # 安装目标解析测试
└── README.md
无需构建步骤:宿主端与客户端都是手写 ESM / loader bundle,安装即用。
仅运行时依赖 zod(^4.4.3),要求 Node >=20。
No comments yet. Be the first to write one.