前言¶
在 DeepSeek Harness(DSH)里,agent skill 往往分散在项目目录的 .dsh/skills、.agents/skills,以及用户目录下的全局 skills 路径里。要确认某个 skill 是否生效、来自哪一层、能否安全改动,通常只能自己翻目录、改 SKILL.md 或依赖命令行。下面介绍的 dsh-skill-manager 是社区维护者 Nay-1 提供的客户端插件,在 DSH 设置面板左侧增加「Skill 管理」分区(排在「Agent 预设」下方),把本机 skill 按位置或来源分组列出,并支持搜索、启用/禁用、定位、预览与删除(在权限允许范围内)。
这是什么¶
- 仓库:Nay-1/dsh-skill-manager
- 目录页:skillhub.cn 插件条目
- 分类:客户端(
platform: web,注入@deepseek-ai/dsh-client-ui-slots) - 当前版本(package.json):1.2.0,MIT 许可证
插件由 host 半(lib/index.js:扫描、HTTP API、文件操作)与 client 半(lib/client.js:设置页 UI)组成,通过 cordis.patch.yml 挂入 DSH bundle。它不替换 DSH 自带的 skill provider,而是在 UI 与本地 API 层把「注册表里认得的 skill」和「磁盘上扫到的 skill」合并展示,便于日常打理。
设置里的界面长什么样¶
安装并重启 DSH 后,设置导航大致如下:
设置
├── 通用设置
├── 模型
├── 内置插件
├── Agent 预设
└── Skill 管理 ← 本插件,order 30
页面顶部有搜索框和刷新按钮;汇总行显示 skill 总数、禁用数量、扫描过的根目录数。列表按「位置」分组,交互风格对齐内置「内置插件」页:每组默认收起,点击整行展开;一搜索则自动展开所有组。
分组规则要点:
- 项目级:同一项目的
.dsh/skills与.agents/skills合并为一组,标题为缩短后的项目路径(例如~\Desktop\agent-test),便于区分同名项目。 - 用户级与内置:用户
.dsh→ 用户.agents→ 随包内置 → 运行时,按来源依次排列。
每张卡片统一高度(描述固定两行,超出截断,悬停看全文),展示名称、来源标签、描述、缩短后的 SKILL.md 路径(主目录显示为 ~),以及按权限出现的操作。
| 操作 | 出现条件 | 作用 |
|---|---|---|
| 启用 / 禁用 | 文件系统可写的 skill | 优先写 frontmatter,不改文件名 |
| 打开目录 | 有磁盘或注册表 resourceBase 路径 |
资源管理器定位(Windows;非 Windows 接口返回 revealed: false) |
| 查看 / 收起 | 有路径的 skill | 就地预览 SKILL.md 正文(不渲染 Markdown) |
| 删除 | 文件系统可写的 skill | 删除整个 skill,内联二次确认,不可恢复 |
随包内置(bundled)与运行时 provider 提供的 skill 为只读:可定位、可预览,无启用/禁用与删除(与宿主侧 403 一致)。
它怎么认 skill、清单从哪来¶
扫描规则与 @deepseek-ai/dsh-skill-filesystem 对齐,常见根目录与显示权重如下(权重仅用于本插件排序,与公共契约里的 SkillSummary 无 rank 字段):
| 根目录 | source | 显示权重 |
|---|---|---|
<项目>/.dsh/skills |
project-dsh |
100 |
<项目>/.agents/skills |
project-agents |
200 |
$DSH_HOME/skills(默认 ~/.dsh/skills) |
user-dsh |
400 |
$DSH_AGENTS_HOME/skills(默认 ~/.agents/skills) |
user-agents |
500 |
$DSH_BUNDLED_SKILL_DIR |
bundled |
600 |
项目根来自 DSH 进程 cwd,以及工作区账本(ctx.workspaceRegistry)登记的路径。每个根下识别目录包 <name>/SKILL.md 与平铺文件 <name>.md;以 . 开头的条目(含 .system)跳过。
清单由两处合并:
ctx.skills.list()— DSH 注册表中的 skill(含随包内置与运行时 provider);- 磁盘扫描 — 文件位置与是否可写。
合并只按路径认领,避免把注册表里仍「活着」的条目错挂到磁盘上已禁用的同名文件。注册表不可用时,页面会提示当前仅有磁盘扫描结果。README 注明:在实测版本 0.2.0-rc.2 环境下,宿主上下文里的 ctx.skills.list() 可能只返回随包内置与运行时 provider,文件系统 provider 那批 skill 在页面上来自磁盘扫描,属预期行为;诊断可用 GET /skill-manager/api/registry。
启用与禁用(1.2.0 起)¶
默认禁用不再改文件名。 插件向 SKILL.md frontmatter 写入 DSH 原生开关:
---
name: my-skill
description: ...
disable-model-invocation: true # 模型目录与加载路径都够不到
user-invocable: false # 斜杠命令通道也过滤
---
启用时写回 false / true(显式、幂等)。写入采用同目录临时文件再 rename,保留 BOM 与 CRLF/LF。没有 frontmatter 的裸文件会抛 no-frontmatter,仍退回历史上的改名方式;SKILL.md.disabled / <name>.md.disabled 仍会显示为已禁用,启用时可还原文件名。
注意:标记禁用不会从注册表释放名字;正在跑的会话里已加载的 skill 要等 provider 失效重扫后才反映目录变化;bundled 根下一律不可写(403)。
HTTP API(本机)¶
全部挂在 /skill-manager/api,供设置页与本地脚本使用:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /health |
自检 home、agentsHome、bundledDir、注册表是否可用 |
| GET | /list |
完整清单(并发查注册表,整体 8 秒 deadline) |
| GET | /registry |
诊断:按 cwd 摊开 ctx.skills.list() 原始返回 |
| POST | /toggle |
{ target } 启停 |
| POST | /delete |
{ target } 删除 |
| POST | /read |
{ target } 返回正文(>512 KB 拒绝) |
| POST | /reveal |
{ target } 资源管理器定位(Windows) |
文件类操作的目标路径均经重新扫描校验,禁止路径穿越;写接口对非 JSON 或跨站 Origin 请求有额外限制。
安装与启用¶
插件以 本地 file: 依赖 装入 profile(README 示例为 Windows PowerShell;desktop 为 profile 名,请按自己的环境修改)。路径中不要含空格。
先取得源码到本地,再执行:
git clone https://github.com/Nay-1/dsh-skill-manager.git C:/dsh-plugins/dsh-skill-manager
dsh plugin --profile desktop add "file:C:/dsh-plugins/dsh-skill-manager"
装完后确认该 profile 的 package.json 里 dsh.profile.bundles 包含 dsh-skill-manager(只有进入 bundles,cordis.patch.yml 的插入才会生效;dsh plugin add 通常会写入,否则需手动补一行)。
host 与 client 仅在 DSH 启动时加载一次,无热重载,安装或改源码后需重启桌面端。
若修改了克隆目录里的源码:pnpm 的 file: 依赖是拷贝而非软链,直接再 add 往往显示 Already up to date 且不会更新磁盘拷贝,需先 remove 再 add:
dsh plugin --profile desktop remove dsh-skill-manager
dsh plugin --profile desktop add "file:C:/dsh-plugins/dsh-skill-manager"
卸载:
dsh plugin --profile desktop remove dsh-skill-manager
并从 dsh.profile.bundles 删除同名条目。
运行环境要求(package.json):Node ^22.15.0 || >=24.0.0,peer cordis >=4.0.0-rc <5。
典型用法¶
- 打开 DSH 设置 → Skill 管理,看汇总行与分组列表,确认项目级与用户级 skill 是否都在预期位置。
- 用搜索框按名称或路径片段查找;搜索后分组会自动展开。
- 对可写 skill 点击 禁用,再在对话里确认模型目录与
skill工具是否不再加载该 skill(依赖 frontmatter 策略)。 - 需要核对内容时用 查看 预览
SKILL.md;在 Windows 上用 打开目录 在资源管理器中选中文件。 - 排查「注册表与磁盘不一致」时,可请求本机
GET /skill-manager/api/registry或/list(需 DSH 已加载插件且在本机访问)。
开发插件本身时,仓库提供:
node test-host.mjs # host 半自测(90 项)
node test-client.mjs # client 半自测(67 项)
适用场景与注意事项¶
适合谁:经常在多个项目与用户级目录间切换、需要统一查看 skill 来源与禁用状态、又不想手改 frontmatter 或文件名的 DSH 用户。
使用前请知悉:
- 插件以当前 DSH 进程权限读写本机文件;安装前应阅读源码与 MIT 许可证,确认信任维护者与操作范围。
- 项目根靠猜:host 插件拿不到「当前会话工作目录」的完整语义,仅 cwd 与工作区账本,项目级列表可能多列或少列。
- 删除不可恢复,无回收站;预览不渲染 Markdown。
- 符号链接不跟随,链接形式的 skill 条目会被跳过。
- DSH 社区目录(skillhub.cn)为独立站点,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,本插件为社区贡献,非内置组件。
结尾¶
dsh-skill-manager 把 agent skill 的查看与日常维护收进设置面板:分组清晰、启用禁用对齐 DSH frontmatter 语义、只读来源与可写来源边界分明。若你需要在桌面端集中管理本机 skill,可按 README 用 file: 方式装入 profile 并重启 DSH。
- 目录页:https://www.skillhub.cn/plugins/Nay-1/dsh-skill-manager
- GitHub:https://github.com/Nay-1/dsh-skill-manager