dsh-preset-categorizer:把已安装能力注册为 DSH 智能体预设

前言

DeepSeek Harness(DSH)的每个智能体预设都有一组固定的能力。这些能力通过 profile 的 bundles 挂载,会进入所有会话。当插件数量增加,每个会话都会带着大量从未使用的工具定义,消耗 schema 预算。

DSH 内置了一些预设(Creative、Office、Media),但它们是手工维护的列表。一旦安装了新的插件或 MCP 服务器,手工列表就会落后。

dsh-preset-categorizer 从机器上读取已安装的能力,按类型分组,自动注册一组预设到 DSH 的预设选择器。每个类别成为一个一等公民,可以在 GUI 中直接选择。

这是什么

dsh-preset-categorizer 是一个 DSH 插件,用于把已安装的插件、MCP 服务器和技能按类别注册为智能体预设。

维护者 anonamerjaxon-dev。插件版本 0.1.0,MIT 许可证,兼容 DSH 0.2.1-rc.2 及以上、Node.js >= 22。

它识别三种能力类型:

类型 识别方式 挂载方式
plugin loader 条目,基于包名(如 dsh-ffmpeg) 插件行
MCP loader 条目,基于 @deepseek-ai/dsh-mcp-client MCP 行,携带服务器配置
skill ~/.agents/skills* 下的技能目录 技能提供者行,按根目录挂载

核心功能

识别并分组能力

插件读取 profile 的 package.json,列出所有已安装的插件、MCP 服务器和技能目录。根据能力类型,将它们归类到预设中。

自动注册预设

为每个类别注册一个预设到 DSH 的预设选择器。预设的 id 以 cat- 开头,例如 cat-media、cat-web。

安全规则

插件遵循三条规则:

  1. 只添加:如果 id 为 cat-* 的预设已存在,则跳过,不编辑、不替换、不删除。不修改 profile 的 package.json。
  2. 不移动:插件只报告能力归属,不从现有配置中卸载能力。移动能力涉及 UI 加载等成本,由用户决策。
  3. 不添加工具:插件本身不提供工具,也不携带 schema。

处理缺失包

如果一个预设引用的包在 profile 中不存在,该预设会显示为 broken。插件在注册前先读取 package.json,跳过包含缺失包的行,避免显示红色 broken 行。

技能按根目录挂载

技能提供者挂载的是目录,而不是单个技能。机器上的技能通常位于共享根目录。因此,一个预设只能挂载一个根目录(如”genoffice 但不包含 mineru”无法表达)。如果两个类别引用同一根目录,第一个生效,第二个被报告。

生成报告

插件生成报告文件 ~/.dsh/preset-categorizer-report.json,包含注册数量和能力统计:

{
  "report": {
    "registered": 5,
    "capabilities": 209,
    "plugins": 194,
    "mcps": 5,
    "skills": 15
  },
  "roster": [
    { "id": "cat-docs", "name": "Documents (office / pdf)" },
    { "id": "cat-web", "name": "Browser (playwright)" }
  ]
}

安装与启用

安装

从 GitHub 仓库安装:

dsh plugin --profile web add dsh-preset-categorizer

或者从本地 checkout 安装:

dsh plugin --profile web add "link:/path/to/dsh-preset-categorizer"

启用

插件不应放在 profile 的 bundles 中,而应放在某个预设的配置里。它在启动时运行,向预设选择器注册类别,因此只需要在需要它的会话中存在。

在预设的 cordis patch 文件中添加:

# ~/.dsh/profiles/web/cordis.patch.yml,在 Creative 预设内部
- id: preset-categorizer
  name: dsh-preset-categorizer
  config: {}
  inject:
    - loader
    - agentPresets

inject 字段告诉 loader 从这一行读取注入的模块,而不是从模块导出中读取。没有它,ctx.agentPresets 会抛出 “cannot get property agentPresets without inject”。

典型用法

安装后,DSH 会根据机器上已安装的能力自动注册预设。可以在智能体配置中选择这些预设。

查看报告:

cat ~/.dsh/preset-categorizer-report.json

运行测试:

node test.mjs

配置与扩展

预设类别定义在 lib/categories.js 中,是纯数据结构:

{
  id: 'cat-web',
  kind: 'mcp',
  preset: {
    id: 'cat-web',
    name: 'Browser (playwright)',
    order: 42,
    mcpRows: [{ id: 'mcp-playwright', name: MCP_CLIENT, config: { /* ... */ } }],
    skillRoot: null,
  },
  include: ['mcp-playwright'],
  exclude: [],
}

字段说明:

  • id:预设唯一标识,以 cat- 开头
  • kind:能力类型,plugin、mcp 或 skill
  • preset:预设配置,包含 id、name、order、mcpRows 或 skillRoot
  • include / exclude:glob 模式,匹配能力的 id、name、package。exclude 优先级更高
  • mcpRows:MCP 服务器的加载行,包含 serverName、transport、command/url 等配置
  • skillRoot:技能根目录的绝对路径

类别匹配采用第一个匹配原则,因此列表顺序有意义。

适用场景与注意

适合已经在使用 DSH,希望按能力类型组织智能体预设的开发者。当你安装了多个插件或 MCP 服务器,手工维护预设列表变得困难时,这个插件可以从机器自动推导。

注意:插件以当前 DSH 进程的权限运行。安装前应检查源码与许可证。

插件安全特性:

  • 无网络请求
  • 无子进程调用(无 exec、spawn、eval)
  • 只读取技能目录和 profile 的 package.json
  • 只写入 ~/.dsh/preset-categorizer-report.json,仅包含名称和计数,无绝对路径、无凭据
  • 不修改任何配置文件或现有预设

小结

dsh-preset-categorizer 解决了 DSH 内置预设手工维护、无法随已安装能力自动更新的问题。它从机器读取能力,按类型注册预设,让每个能力类别在 GUI 中成为一等公民。

  • 插件主页:https://www.skillhub.cn/plugins/anonamerjaxon-dev/dsh-preset-categorizer
  • GitHub 仓库:https://github.com/anonamerjaxon-dev/dsh-preset-categorizer
羽毛球分组比赛记分
小程序二维码

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

Xiaoye