前言¶
DeepSeek Harness(dsh)把智能体能力拆成插件和技能两层。插件改运行时,技能则是一份带 YAML frontmatter 的 SKILL.md:模型或用户按名称调用,用来约束某类任务怎么做。问题是技能文件并不只住在一个目录里。DSH 自己有 ~/.dsh/skills 和 ~/.agents/skills,项目里还有 .dsh/skills、.agents/skills;如果同时用 Codex 或 Claude,还会再出现 ~/.codex/skills 和 ~/.claude/skills。GitHub 上的技能仓库又是另一套来源。要启停某一个技能,往往得自己找文件、改名、再确认 /技能 列表有没有刷新。
dsh-skill-manager 做的事情比较直接:在 DSH Web 的设置页加一个「技能管理」分区,把上述来源收进同一张列表,用开关热启停,也可以从本地 ZIP 或 GitHub 仓库安装。本文按社区目录页、GitHub 仓库 README、package.json 和源码交叉核对后整理。
这是什么¶
dsh-skill-manager 是一个面向 DeepSeek Harness Web 界面的技能管理插件,由 sulfide2085 维护,许可证为 MIT,主要语言是 JavaScript。package.json 里的版本号是 0.1.0。仓库收录在 GitHub 的 dsh-plugin 话题下。撰稿时打开 GitHub 仓库显示 9 星;社区目录页上的数字可能滞后,以仓库页面为准。
它解决的是「技能散落、启停靠改文件」这件事:
- 把 DSH、Agents、项目目录,以及 Codex、Claude 目录里的技能合并展示
- 用重命名
SKILL.md↔SKILL.md.disabled做热开关,文件系统 watcher 大约 200ms 内生效 - 从本地 ZIP 或 GitHub 技能仓库发现并安装技能,装完立刻进入
~/.dsh/skills并启用
DeepSeek Harness 官方仓库的口号是「一切皆插件」。本文介绍的社区目录 deepseek-harness-plugin.com 是独立站点,与 DeepSeek / 幻方没有官方从属关系,不能当成官方应用商店。社区里还有名称接近的仓库(例如 dsh-skill-manager-ytxue),安装时请以目录页给出的 github:sulfide2085/dsh-skill-manager 为准。
核心功能¶
按来源合并的技能列表¶
插件在设置页注册 settings.section,分区 id 为 skill-manager,排序值为 17,界面文案是「技能管理」,位置在「插件」和「agent 预设」之间。
列表会合并两套数据:注册表里当前启用的技能,以及磁盘上已经停用(*.disabled)的条目。界面按来源分组,源码里的分组标签包括:
| 来源 | 界面标签 |
|---|---|
user-dsh |
DeepSeek Harness |
user-agents |
Agents |
project-dsh / project-agents |
项目 / 项目 Agents |
codex-user / codex-project |
Codex / 项目 Codex |
claude-user / claude-project |
Claude / 项目 Claude |
每张卡片显示名称、描述、来源、调用策略(仅模型 / 仅用户 / 模型+用户 / 已禁用调用)和启用状态。从 GitHub 装进来的技能会额外带来源标签。点击卡片可展开技能全文。标题旁有手动刷新按钮;ZIP 或仓库安装成功后列表会自动刷新。本地列表另有独立搜索框,只过滤已经装上的技能。
未打开会话时,只显示用户级和全局技能。项目级技能依赖当前会话的工作目录,没有 cwd 就扫不到 .dsh/skills 这类项目根。
扫描优先级在 lib/skill-files.js 里写得很明确:项目 .dsh > 项目 .agents > 项目 .codex > 项目 .claude > 用户 .dsh > 用户 .agents > 用户 .codex > 用户 .claude。同名技能靠前的根胜出;同名时启用条目优先于停用条目。
热开关与目录级启停¶
DSH / Agents 目录下的启停,实现方式是重命名:
- 启用:
SKILL.md.disabled→SKILL.md - 停用:
SKILL.md→SKILL.md.disabled
DSH 的 skill-filesystem 提供方会监视这些文件,README 写明大约 200ms 生效,不需要重启网关。Codex 和 Claude 也遵循同一套 .disabled 约定。停用只改文件名,不删除内容,随时可以再打开。
Codex / Claude 目录里的技能默认全部停用,只有在面板里显式打开后,才会进入官方 /技能 注册表。第三方目录的启用名单写在 DSH home 下的状态文件 dsh-skill-manager.json 里(默认路径 ~/.dsh/dsh-skill-manager.json)。
组头上还有目录级开关,一次操作整个来源目录。bundled / runtime 来源的技能没有磁盘文件,不可编辑,开关会置灰。
本地 ZIP 安装¶
界面上的「ZIP 安装」会让你选择本地 .zip(上限 64 MiB)。host 端把文件按 base64 传上来,用自带的 ZIP 解析器解压(支持 store 和 deflate),做 CRC32 校验和条目名安全检查(拒绝绝对路径、盘符、.. 段和 NUL)。随后在包内查找技能:
- 目录束:含
SKILL.md的目录 - 平铺技能:根目录下带合法 frontmatter 的
.md
查重后装入 ~/.dsh/skills 并保持启用形态。包内没有技能会报错;同名已存在则跳过并提示冲突。符号链接条目会被忽略,不会物化到磁盘。
README 和源码都标明尚未实现:zip-bomb 解压预算、symlink 物化、ZIP64。遇到 ZIP64 归档会直接报「暂不支持 ZIP64 归档」。
GitHub 技能搜索与安装¶
「GitHub 技能市场」不是一个中心化商店,而是:你先添加仓库坐标(owner / 仓库名 / 分支,分支可留空),插件再去拉该仓库的 GitHub 归档,扫描其中的 SKILL.md,按关键词搜索后逐个安装。
首次运行时,如果状态文件里还没有 repos 字段,会预置两个仓库并落盘:
anthropics/skills(分支main)obra/superpowers(分支main)
如果用户把仓库列表删空,空数组会保留,不会再自动把这两个仓库加回来。
下载行为在 lib/skill-repo.js 里可以核对:
- 分支回退顺序:指定分支 →
main→master - 归档大小上限 128 MiB,单次下载超时 60 秒,网络失败默认再试 2 次
- 缓存在
~/.dsh/cache/dsh-skill-manager,默认 30 分钟 - 默认从
https://github.com拉归档;可用环境变量DSH_SKILL_GITHUB_BASE换成镜像前缀 - 下载代理尚未实现
安装目标同样是用户级 ~/.dsh/skills。装完后列表刷新,卡片上能看到 GitHub 来源。
安装与启用¶
社区目录页给出的安装命令如下,在 DeepSeek Harness 终端中运行即可:
dsh plugin add github:sulfide2085/dsh-skill-manager
dsh CLI 会从 GitHub 解析插件并装进当前 profile。这个插件的客户端声明了 "platform": "web",界面只出现在 Web 设置页。若当前用的不是默认 profile,可以按官方文档的写法显式指定,例如:
dsh plugin --profile web add github:sulfide2085/dsh-skill-manager
需要可复现安装时,把 commit 哈希钉在仓库后面。目录页给出的形式是:
dsh plugin add github:sulfide2085/dsh-skill-manager#commit
把 commit 换成实际哈希。官方文档也建议对 git 源固定 commit,避免仓库后续推送悄悄改变正在运行的代码。
如果是克隆仓库后在本地目录安装,README 写的是:
dsh plugin --profile web add .
代码更新后需要重启 DSH Web。README 说明:host 的 manifest 在网关启动时注册,不重启的话新接口会 404。
插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前请自己查看 源代码仓库 和 MIT 许可证。
典型用法¶
下面这些步骤都来自 README 和设置页文案,可以在 Web UI 里直接做,不需要额外写配置。
1. 打开技能管理
启动 DSH Web(官方默认地址是 http://127.0.0.1:3080),进入设置,找到「技能管理」。首次打开会读取当前会话能看见的技能;没有会话时,项目级目录不会出现。
2. 查看并启停
列表按来源分组。卡片右侧是开关:打开或关闭后,对应目录里的 SKILL.md 会被重命名,大约 200ms 后 DSH、Codex、Claude 都会按各自的约定刷新。组头开关作用于整个来源。bundled / runtime 技能的开关是灰的,这是预期行为。
需要看正文时点开卡片。本地搜索框只过滤已安装技能,不会去 GitHub 上搜。
3. 用 ZIP 装一份技能
把技能打成 zip(目录束或平铺 .md 都可以),在「ZIP 安装」里选择文件。成功后会提示已安装的数量;同名冲突会跳过。装入位置是 ~/.dsh/skills,随后可被 /技能 和模型看见。
4. 从 GitHub 仓库发现技能
在「GitHub 技能市场」填 owner、仓库名,分支可留空。添加仓库后,用市场搜索框按关键词查找,命中项可以逐个点「安装」。仓库列表可以随时移除。若网络访问 GitHub 归档不稳定,README / 源码提供了 DSH_SKILL_GITHUB_BASE 作为镜像基址,需要自己准备可用的前缀。
适用场景与注意事项¶
比较适合这几类人:
- 同时在 DSH Web、Codex、Claude 里放了技能,不想在
~/.dsh、~/.agents、~/.codex、~/.claude之间手工改名 - 需要按任务临时关掉一批技能,减少模型上下文里的技能噪音
- 要从 GitHub 上的技能仓库(例如公开的
SKILL.md集合)挑几份装进 DSH - 手里有现成的技能 zip,想装到用户级目录并马上启用
使用前需要知道边界:
- 只覆盖 Web 设置页。
package.json的 client 平台是web,不要指望它给 TUI 或 headless profile 画同一块面板。 - 权限与信任。 插件和它拉下来的技能都在当前
dsh进程权限下运行。ZIP 和 GitHub 归档会在本机解压、写文件;安装前检查来源、许可证和SKILL.md内容。 - 停用不等于删除。
.disabled只是让提供方不再注册该技能,文件还在。 - 项目技能依赖会话。 没开会话就看不到项目根下的技能,不是列表坏了。
- ZIP / 下载限制。 本地 zip ≤ 64 MiB;GitHub 归档 ≤ 128 MiB、超时 60 秒;不支持 ZIP64、zip-bomb 预算、symlink 物化和下载代理。
- 同名插件。 安装命令以目录页的
github:sulfide2085/dsh-skill-manager为准,不要只按名字去 npm 或 GitHub 搜索结果里点第一个。
仓库用 Node 内置的 node:test 写了 100 个用例,覆盖 ZIP 解析与安全过滤、仓库坐标与缓存、host 远程方法和客户端 bundle 加载。需要核对自己改过的行为时,可在插件目录执行 npm test。
小结¶
dsh-skill-manager 没有引入新的技能格式,只是把已经散落在 DSH、Agents、Codex、Claude 目录里的 SKILL.md 收到设置页,用文件系统约定做热启停,并补上 ZIP 和 GitHub 归档两条安装路径。对已经在用 DSH Web、又同时维护多份技能的人来说,它把「改文件名、刷新列表、确认 /技能 看不看得见」收成了面板上的开关和按钮。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-skill-manager/
GitHub:https://github.com/sulfide2085/dsh-skill-manager