DeepSeek Harness Plugin Hub

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

探索

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

社区

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

相关链接

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

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

Plugin Skill Manager — DeepSeek Harness 插件(DSH Plugin)
DeepSeek Harness Plugin Hub
ProfilesPlugins分类动态文档登录管理 Profiles
ProfilesPlugins分类动态文档登录
← Plugins
P

dsh-plugin-skill-manager

Plugin Skill Manager

DSH Web UI 插件:在 Chat/Trajectory 旁添加 Skills 标签页,列出所有可用技能,并提供按技能启用/禁用的切换开关(通过 SKILL.md frontmatter 在模型侧禁用)。

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

npx -y @deepseek-ai/dsh plugin --profile web add github:xhvdhczd/dsh-plugin-skill-manager#b1d1a0bc6232986e1adaab3972cef9a3371a2b88
README兼容性版本

兼容性与来源证明

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

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

版本

0.1.0stable
2026/10/13

相关插件

正在加载相关插件…

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

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

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

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

认领这个 Plugin →
报告问题

相关插件

继续浏览 ui-customization 分类下经过校验的插件。

Web App@deepseek-ai/dsh-web-appdsh 浏览器界面捆绑包:位于 dsh-base 之上的 Web 补丁层,加上运行时粘合插件(提供前端 dist、Web 界面提示符、bash 运行时变量和 URL 行)Experimental Agent Team Web Profile@deepseek-ai/dsh-experimental-agent-team-web-profile用于 Agent Teams Remote 和 UI 插件的实验性 Web 配置层Ab Chartdsh-ab-chart带有绘制其调用的浏览器卡片的图表渲染工具,封装在一个可发布的插件包中Client Ui Skill Explorer@linxin666/dsh-client-ui-skill-explorerDSH 技能中心:按来源(bundled / project / user / custom / runtime)浏览已加载的技能,在 Web GUI 面板中启用或禁用、创建和删除技能。

README

dsh-plugin-skill-manager

English | 简体中文

A DeepSeek Harness (DSH) plugin that adds a Skills tab to the web UI conversation view ring (next to Chat and Trajectory). It lists every available skill with a live search box and a per-skill enable / disable switch, plus a bulk enable-all / disable-all toggle.

Disabling a skill writes disable-model-invocation: true into the skill's SKILL.md frontmatter, so the model-facing skill catalog drops it while the user-facing surface keeps it — the skill stays visible in the list and can be re-enabled at any time.

Features

  • 🗂️ Skills tab registered into the conversation.view slot, alongside Chat and Trajectory
  • 🔍 Search box filtering by skill name or description
  • 🔘 Bulk switch: enable or disable every visible skill at once
  • 🔄 Live list: the tab drops the host's cached catalog on open, polls a cheap structure revision every 3 s while visible, and offers a Reload button
  • 🔒 Read-only rows: skills with no writable SKILL.md (application-bundled skills such as office-docx / office-pptx / office-xlsx, and runtime-registered skills) render with a Built-in badge and no toggle, instead of failing with skill "…" not found

How it works

The plugin ships two halves in one npm package:

HalfEntryWhat it does
Hostlib/index.jsRegisters POST /api/skill-manager/toggle, …/packages, …/refresh, and …/status on the DSH web server, resolves the skill's SKILL.md through the registry and the disk (project roots first, then user roots), rewrites its frontmatter, and watches the user skill roots for new packages
Clientlib/client.jsRegisters the Skills conversation-view tab, renders the list from the skills.list RPC, and calls the host routes on toggle, reload, and revision poll

Disabling one skill (enabled: false) adds:

disable-model-invocation: true

to the skill frontmatter. The filesystem skill provider watches the skill roots, so the catalog invalidates automatically after the write — no restart needed for the catalog itself (a restart is required after installing or updating the plugin).

Why the refresh routes exist

The core filesystem provider discovers one level deep, and this plugin's package provider only watches containers it already knows, so a package installed as <root>/<pkg>/skills/<name>/SKILL.md while DSH is running is observed by neither watcher and would stay invisible until a restart. The host half therefore:

  1. watches $DSH_HOME/skills and $DSH_AGENTS_HOME/skills recursively and invalidates the registry (plus bumps a revision) after each burst of events (400 ms debounce);
  2. exposes POST /api/skill-manager/refresh to invalidate on demand and POST /api/skill-manager/status to read the revision; and
  3. refuses a toggle it cannot perform with 409 read-only-skill and an explanatory message, which the client turns into a permanent read-only row.

Installation

Requires a DSH profile (the example uses the web profile):

# from the plugin checkout, install into the profile
dsh plugin --profile web add file:./dsh-plugin-skill-manager

# or directly with pnpm
pnpm --dir "$HOME/.dsh/profiles/web" add file:./dsh-plugin-skill-manager

Then add the package to the profile's bundle layers. dsh.profile.bundles in ~/.dsh/profiles/web/package.json should include:

{
  "dsh": {
    "profile": {
      "bundles": [
        "@deepseek-ai/dsh-base",
        "@deepseek-ai/dsh-web-app",
        "dsh-plugin-marketplace",
        "dsh-plugin-skill-manager"
      ]
    }
  }
}

Finally restart DSH and refresh the web UI. A Skills tab appears next to Chat and Trajectory.

Note: file: dependencies are copied into the pnpm store. After editing the plugin sources, re-run pnpm --dir "$HOME/.dsh/profiles/web" remove dsh-plugin-skill-manager && pnpm --dir "$HOME/.dsh/profiles/web" add --force file:./dsh-plugin-skill-manager and restart DSH.

Uninstall

pnpm --dir "$HOME/.dsh/profiles/web" remove dsh-plugin-skill-manager

Remove dsh-plugin-skill-manager from dsh.profile.bundles in ~/.dsh/profiles/web/package.json, then restart DSH. Skills disabled by the plugin keep their frontmatter; re-enable them with the plugin, or delete the disable-model-invocation line manually.

Development

# syntax-check both halves
node --check lib/index.js
node --check lib/client.js

# verify the composed profile tree includes the plugin
dsh --profile web --dump-config | grep -A2 skill-manager

Tests

The three suites import the plugin through the profile's node_modules, so copy them next to the profile and run them from there:

cp test/*.test.mjs "$HOME/.dsh/profiles/web/"
cd "$HOME/.dsh/profiles/web"
node package-scan.test.mjs         # package containers, ranks, provider roots()/list()
node target-resolution.test.mjs    # writable roots, read-only classification, toggle targets
node client-load.test.mjs          # browser bundle loads and registers the Skills view

Package layout

dsh-plugin-skill-manager/
├── package.json        # dsh.bundle.patch + dsh.client declarations
├── cordis.patch.yml    # loader row mounting the host plugin
├── test/               # standalone suites (see Tests)
└── lib/
    ├── index.js        # host half: toggle/packages/refresh/status routes + root watcher
    └── client.js       # client half: Skills tab (__ModuleLoader__ bundle)

Skill packages (two-level layout)

The host half also understands skill packages: a skill root may contain package directories where the level-1 name is the installed skill-package name and the level-2 skills directory holds the skill bundles:

~/.dsh/skills/
├── my-package/                       # level 1: skill-package name
│   ├── .claude-plugin/plugin.json    # optional manifest (Claude Code compatible)
│   └── skills/                       # level 2: skills
│       ├── group/                    # optional grouping layer (bounded depth)
│       │   └── some-skill/SKILL.md
│       └── other-skill/SKILL.md
└── flat-skill/SKILL.md               # original flat layout keeps working

Recognition. A package is identified by its manifest first — .claude-plugin/plugin.json or dsh-plugin.json — whose skills array is the authoritative list of skill directories; without a manifest, a package with a skills/ subtree is discovered by a bounded walk (depth ≤ maxNestingDepth). Flat <root>/<skill>/SKILL.md layouts are untouched.

Effects. The host registers a packages skill provider (a FileSystemSkillProvider subclass) whose scan roots are the package containers, ranked root.rank - packageRankOffset — packaged skills join the model catalog and the Skills tab, and win name collisions against flat skills of the same root. The toggle route locates packaged skills too.

UI. The Skills tab groups rows under their package: a collapsible package header (mattpocock ▸) that expands to the package's skills, backed by POST /api/skill-manager/packages; skills outside any package render ungrouped. Searching auto-expands every group so matches stay visible.

Config (cordis plugin config, e.g. via the loader patch row):

KeyDefaultMeaning
enablePackagestrueMaster switch for package scanning
manifestFiles['.claude-plugin/plugin.json','dsh-plugin.json']Manifest file names, in priority order
maxNestingDepth4Fallback walk depth under <pkg>/skills
packageRankOffset10Rank delta so packaged skills beat flat skills of the same root
includeRoots['project-dsh','project-agents','custom','user-dsh','user-agents']Which base roots participate

A DSH restart is required after updating the plugin; the packaged skills then appear without further setup. The package-scan helpers are exported from lib/index.js and covered by a standalone test (run from the profile dir: node skill-pkg-test.mjs).

License

MIT