DeepSeek Harness Plugin Hub

发布与管理完整 Harness Profiles,发现适合你的插件。

探索

插件目录环境预设文档中心动态

社区

发布插件联系我们报告问题

相关链接

Plugin Hub GitHubDeepSeek Harness 官方项目系统状态隐私说明
© 2026 DeepSeek Harness Plugin HubPowered byPaxTech

独立、非官方社区项目,与 DeepSeek 官方无隶属、授权或背书关系。

DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
P

dsh-preset-categorizer

Preset Categorizer

将插件、MCP 服务器和技能归类到 DSH 代理预设中,使能力集合成为 GUI 选择器中的一级预设。

插件会安装到这里;不确定时保持 web。

npx -y @deepseek-ai/dsh plugin --profile web add github:anonamerjaxon-dev/dsh-preset-categorizer#0a6808027edb79239e69289f0af47d8e16fb33b8
README兼容性版本

兼容性与来源证明

Preset Categorizer 以 dsh-preset-categorizer 发布,当前版本为 0.1.0。Plugin Hub 会校验它的 manifest,并保存精确安装来源,便于复现安装结果。

DSH 兼容范围
*
运行环境
any
发布来源
github
Registry 更新时间
2026/10/22

版本

0.1.0stable
2026/10/22
最新版
0.1.0
DSH
*
HMR
重启进程
Tree shaking
未声明可安全裁剪
解包体积
未提供
文件数
未提供
Surface
any
许可证
MIT
发布源
github
GitHub
★ 0
周下载
0
最近提交
2026/10/31
查看源码 ↗
README Badge

点击下方 Badge 复制 Markdown,粘贴到 README 即可。

这是你的 Plugin?认领权益 · 优先安全扫描

验证 package.json 声明的 GitHub 仓库,即可管理这个公开页面。认领后,Hub 会优先安排当前版本的安全扫描,并在通过后公开展示结果。

认领这个 Plugin →
报告问题

README

dsh-preset-categorizer

Categorize plugins, MCP servers and skills into DeepSeek Harness agent presets.

DSH ships a fixed set of hand-written agent presets. This plugin reads what is actually installed, groups the capabilities into categories, and registers one preset per category with the host's own preset registry — so a category becomes a first-class entry in the GUI's preset picker.

It recognises all three kinds of capability, not just skills:

KindWhat it seesHow it is scoped into a preset
pluginloader entries backed by a package (dsh-ffmpeg, dsh-image-gen)a plugin row
MCPloader entries backed by @deepseek-ai/dsh-mcp-clientan MCP row, with the server's own config
skillthe skill directories under ~/.agents/skills*a skill-provider row for a skill root

Why

A capability that lives in a profile's bundles is mounted into every session, in every preset. That is right for the harness's own machinery and wrong for everything else: a plugin that adds six tools costs every session six tools' worth of schema, whether or not the session will ever use them.

The built-in presets solve this by hand — Creative carries drawio, Blender and FigCraft; Office carries GenOffice; Media carries ffmpeg and Remotion. That works until the set of installed capabilities changes, and then the hand-written lists drift.

This plugin derives the same thing from the machine.


Install

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

Or from a checkout:

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

Mount it inside a preset, not in bundles. It adds no tools, but it does run at boot and it adds presets to the picker, so it should only be present in the sessions that want it:

# ~/.dsh/profiles/web/cordis.patch.yml, inside the Creative preset
- id: preset-categorizer
  name: dsh-preset-categorizer
  config: {}
  # The loader reads `inject` from the ENTRY ROW, not from the module's
  # exports. Without it, ctx.agentPresets throws "cannot get property
  # agentPresets without inject".
  inject:
    - loader
    - agentPresets

How it behaves

Three rules, in the order they matter:

  1. It only adds. Every preset it creates has an id starting with cat-. If the host already has a preset with that id, it is skipped and reported. It never edits, replaces or removes an existing preset, and it never touches the profile's package.json.
  2. It never moves. The plugin reports what belongs where; it does not unmount a capability from the host composition. Moving one is a decision with a cost — a plugin in bundles is also the one whose web UI loads — so it stays with the human.
  3. It adds no tools. A categorizer that carried its own schemas would spend the very budget it exists to protect.

A missing package drops the row, not the preset

A preset that names a package the profile does not have mounts broken and shows up red in the picker. So the categorizer reads the profile's package.json first and drops such rows:

cat-media → [ffmpeg, remotion-skills]        in a profile with both
cat-media → [remotion-skills]                 in a profile without dsh-ffmpeg

Skills are scoped by root, not individually

A skill provider mounts a directory, and the skills on a machine usually live in shared roots. So "genoffice but not mineru" is not expressible as a preset — a category can only say "mount this root". Two categories claiming the same root would mount the same provider twice, so the first wins and the second is reported.


Verify

The plugin writes its own report, including the host's own roster with a broken flag per preset:

cat ~/.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)" }
  ]
}

The category rules have unit tests:

node test.mjs

Configuration

The categories live in lib/categories.js as plain data. Each one declares what it matches and what its preset carries:

{
  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: [],
}
  • include / exclude — glob patterns (*, ?) matched against the capability's id, name and package. exclude wins.
  • mcpRows — literal loader rows. An MCP server is mounted by config (serverName, transport, command/url), which cannot be derived from a package name.
  • skillRoot — an absolute path to a skill directory to mount.

The first matching category wins, so the order of the list is meaningful.


Safety

  • No network. The plugin makes no outbound request of any kind.
  • No subprocess. No exec, no spawn, no eval.
  • Reads only: the skill directories under ~/.agents/skills* and the profile's package.json.
  • Writes one file: ~/.dsh/preset-categorizer-report.json, containing names and counts only — no absolute paths, no credentials.
  • Touches nothing else. No profile manifest, no patch file, no existing preset.

License

MIT — see LICENSE.