用 dsh-skill-manager 在 DeepSeek Harness 设置页统一管理 AI 技能

前言

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.mdSKILL.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.disabledSKILL.md
  • 停用:SKILL.mdSKILL.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 里可以核对:

  • 分支回退顺序:指定分支 → mainmaster
  • 归档大小上限 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

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

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

小夜