Workflow & Automation

dsh-skills-manager

zhangzheng25/dsh-skills-manager · ★ 0

zhangzheng25

DeepSeek Harness plugin: skill management settings page. Browse/search agent skills, view SKILL.md details, and copy content/path directly from Settings → Skill Manager.

License
MIT
Added
2026-08-16
Maintenance
active
Install kind
github
Manifest details
Manifest status
Declared
Manifest path
package.json#dsh
Manifest checked
2026-08-19
Lifecycle scripts
None found

Static manifest checks report declarations only; they are not compatibility or security review.

安装

dsh plugin --profile web add github:zhangzheng25/dsh-skills-manager

GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试

For install and environment setup, plus plugin development tutorials, see DSH community docs ↗

README

Source README · body: en · Read Chinese README

Table of contents
  1. Features
  2. Install
  3. Architecture
  4. Data sources
  5. Known limitations
  6. Development
  7. License

A DeepSeek Harness plugin: shows the current agent skill catalog on Settings → Skill Manager. It reads the host ctx.skills registry directly and merges skills from every agent preset scope, so there is no hand-maintained list.

Skill Manager page

Features

  • 🧭 Skill catalog — lists all merged skills visible to the current environment: name, description, source (project .dsh / project .agents / custom / user .dsh / user .agents / bundled / runtime), provider, model/user invocation policy, and the preset scopes where each skill appears.
  • 🔍 Search & filter — live search by name / description / when-to-use; filter by "all / model-invocable / user-invocable".
  • 📄 Details — clicking a skill expands the detail panel directly below that card: whenToUse, file path, resource directory, metadata, and the full SKILL.md body.
  • 📋 Copy — one-click copy of the skill body or local path.
  • 🔄 Auto refresh — polls every 30 seconds, plus a manual refresh button; shows a warning when skill discovery is incomplete.
  • 🎨 Native DSH style — adapts to light/dark themes using --dsw-alias-* tokens; flat cards, 1px hairline borders, 8–10px radii, no shadows.

Note: this is a read-only management surface. The DSH skill registry is owned by providers (mainly dsh-skill-filesystem) and does not expose deletion/disable for existing skills; this plugin focuses on browsing, searching, viewing bodies, and locating files.

Install

From GitHub:

dsh plugin --profile web add github:zhangzheng25/dsh-skills-manager

Or from a local directory:

dsh plugin --profile web add E:\path\to\dsh-skills-manager

dsh plugin forwards installation to pnpm in the profile directory and reconciles dsh.profile.bundles; dsh.bundle.patch (cordis.patch.yml) inserts the plugin row into the host composition, and dsh.client.platform: "web" makes the web shell load client/bundle.js.

Restart DSH after installation, then open Settings → Skill Manager.

Architecture

┌────────────────────────── Host (Node.js) ──────────────────────────┐
│ src/index.js                                                       │
│  • ctx.get('skills')               ← read the DSH skill registry   │
│  • skills.snapshot({ cwd })        ← read the global layer          │
│  • skills.snapshot({ cwd, scope }) ← read and merge every preset    │
│      (cwd = process.cwd(), so the filesystem provider scans project│
│       roots; user/custom/bundled roots are always scanned)         │
│  • skills.get(name, { cwd, scope })← load full SKILL.md on demand  │
│  • webServer.register('/skills-manager/snapshot')                  │
│  • webServer.register('/skills-manager/skill?name=…')              │
└─────────────────────────────────────────────────────────────────────┘
                          │ fetch('/skills-manager/snapshot')
                          │ fetch('/skills-manager/skill?name=…')
                          ▼
┌────────────────────────── Client (browser) ────────────────────────┐
│ client/bundle.js — hand-written web bundle following the           │
│ client-modules protocol (window.__ModuleLoader__.load)             │
│  • slots.inject('settings.section') → "Skill Manager" settings page│
│  • metric cards + search + filters + skill list + inline details   │
│  • 30s polling, manual refresh, copy body/path                     │
└─────────────────────────────────────────────────────────────────────┘

Data sources

  • Catalog: ctx.skills.snapshot({ cwd }) returns the global-layer SkillSummary[] plus a complete flag; then each available agent preset is read with ctx.skills.snapshot({ cwd, scope }) and merged/deduplicated by skill name.
  • Details: ctx.skills.get(name, { cwd }) tries the global layer first, then each preset scope, returning SkillDefinition (content, path, metadata, resourceBase).
  • Project scope: cwd is the host process process.cwd(). dsh-skill-filesystem finds the nearest .git ancestor and scans <projectRoot>/.dsh/skills and <projectRoot>/.agents/skills, while always scanning user/custom/bundled roots.
  • Preset scopes: ctx.agentPresets.standingKeyFor(preset.id) provides the standing scope key for each preset, so skill-filesystem mounted by an agent preset in the web profile is visible too.

Known limitations

  • Read-only: this plugin cannot enable/disable/edit existing skills; it only views and copies.
  • Settings nav icon: DSH's settings.section registration currently supports only id / order / label; the settings nav icon is hardcoded by dsh-client-ui-settings-general, and non-built-in ids fall back to the gear icon. The conversation.view main-tab approach was investigated, but this version keeps only the settings entry while waiting for an official icon option or a better extension point.

Development

npm run check      # node --check on both halves (syntax only, no tests)

The client bundle is hand-written to match the client-modules bundle protocol; there is no build step.

License

MIT