DSH Skill Manager
为 DSH 打造的技能管理器插件,随 dsh web 启动自动加载(无需审批)。
- 扫描 / 导入 / 上传:列出来源目录(
~/.agents/skills、$DSH_HOME/skills)的全部技能,一键复制进$DSH_HOME/skills,或浏览器上传.zip/ 文件夹 - 分组启停:建组、加技能、组内停用;停用即把
SKILL.md原子改名为SKILL.md.disable(零内容写入、并发安全) - 默认组:控制所有会话的模型技能目录;保留 id
__all_off__= 全部禁用 - 会话级选择器:聊天输入栏左侧下拉,为当前会话单独指定分组
- 全中文 UI,官方 DSH 主题 token;
skillmg_*模型工具让 AI 可自主完成全部管理
截图
| 技能导入 | 分组管理 | 会话级选择器 |
|---|---|---|
安装
前置条件:已启动过一次 dsh web(需已生成 web profile)。
# Windows
git clone https://github.com/Mvyvn/dsh-skill-manager.git
cd dsh-skill-manager
powershell -ExecutionPolicy Bypass -File scripts/install.ps1
# macOS / Linux
git clone https://github.com/Mvyvn/dsh-skill-manager.git
cd dsh-skill-manager
bash scripts/install.sh
脚本把插件装入 $DSH_HOME/profiles/web/node_modules/dsh-skill-manager/($DSH_HOME 默认 ~/.dsh),然后完全重启 dsh web(结束进程重开,不是刷新页面)。也可手动复制 lib/、cordis.patch.yml、package.json 到同目录。
验证:设置里出现「Skill 管理」侧栏;聊天输入栏左侧出现「技能组:」下拉。
快速上手
- 设置 → Skill 管理 → 技能导入:勾选技能,点「导入所选」;
- 切到 分组管理:新建分组,把技能加入;
- 点「设为默认」→ 所有会话的技能目录立即切换为该分组;
- 想让 AI 自己管?直接对它说「把 xxx 技能分到 xxx 组」即可。
⚠️ 技能可见性:两套引擎(skill-only 预设已非必需)
插件控制"模型能看到哪些技能"有两套引擎,启动时自动选择(skillmg_get_config 的 engine 字段可查):
| 引擎 | 何时使用 | 行为 |
|---|---|---|
| scope(新,推荐) | DSH ≥ 0.1.7 且按会话分层可用(启动时自动探测) | 在每个会话自己的注册表层里隐藏/放行技能:选组只影响这一个会话、下一步生效、完全不动磁盘;两个会话可同时使用不同分组 |
| rename(旧,自动回退) | 探测失败,或配置 engine: "rename" |
原子改名 SKILL.md ⇄ SKILL.md.disable 控制可见性:全局生效,切组会重排磁盘 |
scope 引擎下磁盘必须保留可发现的 SKILL.md(引擎需要先从官方 provider 取到真实定义才能遮蔽它),
因此首次启用会把历史 .disable 文件改回来一次,此后切组不再触碰磁盘。
旧引擎仍需要 skill-only 预设:DSH 默认从多个根合并加载技能(~/.agents/skills、项目根、bundled),改名只作用于导入目标那一份,其他根里同名技能照样能被发现。需要 multi-root 兼容时运行:
node scripts/apply-skill-only-preset.mjs # 追加 skill-only 预设,并设为默认
node scripts/apply-skill-only-preset.mjs --refresh # DSH 升级后重新对齐官方插件表
bash scripts/install.sh # 或 install.ps1:装完会提示这一步
脚本从你本机已安装的 @deepseek-ai/dsh-web-app/presets/standard.patch.yml 复制完整能力表,只把 skill-filesystem 改成单一根(includeDefaultRoots: false + customSkillDirs: [导入目标]),因此 DSH 升级后不会和官方预设漂移;写前自动备份该 profile 的 cordis.patch.yml。之后完全重启 dsh web。原理见 docs/how-it-works.md。
> DSH 版本差异:0.1.7 起,预设是 profile 组合里的声明式行(@deepseek-ai/dsh-agent-preset),默认值来自 agent-preset-registry 行的 config.default;0.1.6 及更早则是 $DSH_HOME/.agent-presets// 目录 + settings.yaml 的 agent-presets.default。旧目录形式在 0.1.7 已被完全移除(settings.yaml 也只剩 settings.yaml.imported),继续留在那里会让会话恢复直接失败:Unknown agent preset: (gateway/internal)。
配置
全部保存在 $DSH_HOME/skill-mgmt.json(写入受跨进程锁保护):
| 字段 | 说明 |
|---|---|
sourceDirs |
技能来源目录,默认 ~/.agents/skills、$DSH_HOME/skills |
importTarget |
导入目标,默认 $DSH_HOME/skills |
groups |
分组数组:{id, name, skills: [{name, enabled}]} |
defaultGroup |
默认分组 id;null = 全部启用;__all_off__ = 全部禁用 |
perSessionGroups |
会话级分组;scope 引擎下每个会话独立生效,rename 引擎下仅记录 |
disabled |
禁用清单(rename 引擎的磁盘状态;scope 引擎下为空) |
engine |
"auto"(默认,自动探测)/ "scope" / "rename" |
scopeNormalized |
scope 引擎是否已完成"把 .disable 改回来"的一次性迁移 |
AI 自主管理(skillmg_* 工具)
| 工具 | 作用 |
|---|---|
skillmg_get_config / skillmg_scan |
查看配置、列出技能 |
skillmg_import |
导入技能(overwrite 可覆盖) |
skillmg_create_group / skillmg_update_group / skillmg_delete_group |
分组管理 |
skillmg_set_default_group |
设置默认组(空串=全部启用,__all_off__=全部禁用) |
skillmg_set_session_group / skillmg_get_session |
会话级分组覆盖 |
skillmg_debug_catalog |
运行时技能目录快照(诊断) |
项目结构
dsh-skill-manager/
├── lib/ # 宿主端 index.js + 浏览器端 client.js
├── presets/ # 预设格式说明(0.1.7 起由 scripts/apply-skill-only-preset.mjs 生成)
├── skills/ # 自动维护的 companion 技能 skill-grouping
├── scripts/ # 安装脚本 + apply-skill-only-preset.mjs(写入 skill-only 预设)
├── docs/ # 架构、原理、上手文档
├── screenshots/
├── cordis.patch.yml
└── package.json
工作机制与限制
- 停用 =
SKILL.md原子改名SKILL.md.disable,技能从模型目录消失;启用 = 改回。依赖 DSH(rc 系列)「只识别精确文件名SKILL.md」的语义;若官方改变此规则需回退disable-model-invocation字段方案(代码已兼容并会清理旧标记)。 - 多根加载会绕过分组启停——按上文用
scripts/apply-skill-only-preset.mjs启用 skill-only 预设即可解决。 - DSH 0.1.7+:
skillmg_*工具的返回值会按声明的输出 schema 校验(声明为{ type: 'json' });0.1.6 及更早不校验,因此本插件同时兼容两个分支。 - 会话级覆盖(
perSessionGroups)当前仅记录,模型目录仍由默认组决定。 - 主要在 Windows 开发测试;macOS/Linux 路径使用
~与$DSH_HOME语义,欢迎反馈。 - 浏览器上传仅支持文本文件(SKILL.md 场景),单文件 ≤ 2MB,总内容 ≤ 16MB。
许可证
MIT © 2026 沐云 (Mvyvn)