前言¶
DeepSeek Harness(DSH)采用「一切皆插件」的架构:皮肤、MCP、工具、组合包都会以插件形式挂在当前 profile 上。装多了之后,内置的 plugin_manager 能负责安装和卸载,但很难一眼看清「哪些是皮肤、哪些是 MCP」,也不方便一次性关掉某一类插件。若你同时装了多个 ui-skin-* 换肤包,在设置里逐个开关会更费时。
dsh-plugin-categories(npm 包名 @dsh-external/dsh-plugin-categories)由社区维护者 mozhi66 发布,属于客户端类插件。它不做安装卸载,而是把当前 profile 里已安装的插件按分类组织起来,支持分类级批量启停、拖拽排序,并对皮肤类插件做自动识别归类。
这是什么¶
一句话:DSH 的「分类管理插件的插件」。
它不替代内置 plugin_manager,而是补齐「整理」能力:在设置里按组查看插件、整组开关、把单个插件挪到别的分类,或通过对话工具 plugin_categories 让 agent 代为操作。批量写操作与 plugin_manager 一样需要 danger-full-access 升级审批;审批通道不可用时拒绝执行(fail-closed)。
核心功能¶
设置面板¶
浏览器端通过 client.js 在设置菜单注册「插件分类」入口(settings.section id 为 plugin-categories)。在界面中可以:
- 按分类查看全部已装插件,每行单独启用或禁用某一个插件;
- 对整组执行批量启停:先 dry-run 预览,确认后再执行;若计划涉及
@deepseek-ai/*或cordis:*成员,确认条会显示红色警告; - 分组与组内插件均可拖拽排序(⠿ 把手),顺序写入
assignments.json,刷新后仍保持;窗口聚焦会刷新,挂载期间约 8 秒轮询,以便跟随其他页面改动的开关状态; - 分组改名、单个插件在分类间移动、新建或删除分类;配置里声明的分组若「删除」实为从面板移除,可从底部「已移除的分组」恢复;
uncategorized不可删。
数据经同源 /api/plugin-categories/* 路由访问,loopback 与 Origin 信任与内核 /api 准入语义一致。
自动分类逻辑¶
通过 pluginManager 读取当前 profile 的全部插件条目,按三层归组:
- 运行时指派(
assignments.json); - 配置声明的分类(
cordis.yml/ 设置里的 Config); - 皮肤启发式:名称或描述含
skin、theme、皮肤、换肤、主题、外观等,或组合包名带ui-skin-*,命中时附带 evidence;其余进入uncategorized。
默认配置还会把 @deepseek-ai/* 归为「官方内置」、cordis:* 归为「内核组件」,与自建插件分开,降低误点「整组禁用」关掉框架自身的风险。
工具 plugin_categories¶
面向对话与 agent,主要 action 包括:list、assign、create_category、delete_category、restore_category、set_category(支持 dryRun)、set_plugin、reorder。只读条目在批量开关时会跳过并说明原因。
状态持久化¶
指派关系写在 profile 的 .plugin-categories/assignments.json;探测不到 profile 目录时落到 ~/.dsh-plugin-categories/,也可用 dataDir 指定。启停结果写入 cordis.patch.yml。从旧版 .plugin-curator 路径升级时,首次启动会自动迁移已有分类数据。HMR 开启时改动立即生效,否则可能提示重启。
安装与启用¶
前置要求:@deepseek-ai/dsh >= 0.1.0-rc.5(peer 依赖 @deepseek-ai/cordis、@deepseek-ai/dsh-tools、@deepseek-ai/schemastery 随安装解析)。本机直装 GitHub 源时需已安装 git 且能访问 github.com。
通过插件市场(发现页):DSH → 插件 → 发现 → 添加索引源,粘贴:
https://raw.githubusercontent.com/mozhi66/dsh-plugin-categories/main/index.json
之后在发现里搜索 分类、categories 或 @dsh-external 安装。
直装(推荐):DSH 设置 → 插件 → 添加插件,粘贴仓库地址:
https://github.com/mozhi66/dsh-plugin-categories
也可在对话中让 plugin_manager 安装上述 URL,或执行:
dsh plugin add https://github.com/mozhi66/dsh-plugin-categories
安装后重启或等待 HMR 生效。插件以当前 DSH 进程权限运行,安装前建议查看仓库源码与 MIT 许可证。
典型用法¶
界面¶
安装后打开 DSH 设置,左侧出现「插件分类」(Plugin Categories)。可在 profile 的 cordis.patch.yml 里用 config.categories 覆盖或扩展默认分组;指派在 assignments.json,启停在 cordis.patch.yml。
扩展分类示例(摘自 README):
- insert:
- id: plugin-categories
name: '@dsh-external/dsh-plugin-categories'
config:
categories:
- id: mcp
label: MCP 服务器
namePattern: mcp
对话¶
列出当前所有插件,按分类给我看
→ plugin_categories {action: 'list'}
把 qq2006 和 my-skin 两个皮肤归到"复古皮肤"类
→ {action: 'assign', category: 'retro-skins', label: '复古皮肤', createIfMissing: true, plugins: ['ui-skin-qq2006', 'my-skin']}
先预览,然后关掉所有皮肤类插件
→ {action: 'set_category', category: 'skin', enabled: false, dryRun: true}
→ {action: 'set_category', category: 'skin', enabled: false}
配置项¶
在 cordis.patch.yml 对应插件条目下写 config::
| 字段 | 默认 | 说明 |
|---|---|---|
dataDir |
自动探测 | assignments.json 所在目录 |
skinDetection |
true |
关闭后停用关键词识别;skinPlugins 与已有 skin 指派仍有效 |
skinKeywords |
[] |
追加皮肤关键词 |
skinPlugins |
[] |
强制视为皮肤的插件 key |
categories |
[] |
声明式分类:id、label、plugins?、namePattern? |
较旧 DSH 构建若插件条目不带 meta,皮肤识别会退回到组合包名与组合包描述;仍可用 skinPlugins 或分类配置显式指定。
适用场景与注意¶
适合:已安装多个皮肤或 MCP 插件,需要按类切换、整组关闭,或希望 agent 用 list / set_category 管理启停的用户。
注意:
- 只管理当前 profile 已安装的插件;安装与卸载仍用
plugin_manager。 setPluginEnabled改动写入cordis.patch.yml,对该 profile 的全部会话生效;无 HMR 时可能返回restart-required。- DSH 处于 developer preview,
pluginManager接口可能变化;本插件按0.1.x服务面编写。 - 社区插件目录(如 SkillHub)为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-plugin-categories 把「装了很多插件但不好归类、不好批量开关」的问题收敛到一张分类面板和一套 plugin_categories 工具里,并与内置管理器的权限模型对齐。进一步了解可访问插件目录页与 GitHub 仓库:
- 目录页:https://www.skillhub.cn/plugins/mozhi66/dsh-plugin-categories
- GitHub:https://github.com/mozhi66/dsh-plugin-categories