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
羽毛球分组比赛记分
小程序二维码

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

小夜