Skip to main content
Y

dsh-s-m-c-center

ypipaq/dsh-s-m-c-center

Skills, MCP & CLI manager for the dsh web GUI: browse/enable/import/delete skills across project and user roots; manage MCP servers with a REAL connection through @deepseek-ai/dsh-mcp-client (enabled servers connect and register their tools on ctx.tools;

Install

dsh plugin --profile web add github:ypipaq/dsh-s-m-c-center

README

๐ŸŒ ไธญๆ–‡ ยท English

Three-in-One Console ยท dsh-s-m-c-center

One DeepSeek Harness (DSH) settings page for the agent's three kinds of tools โ€”
skills, MCP servers and local CLIs โ€” plus per-conversation skill injection.


Skill linking ยท Session injection ยท Shadow catalog ยท Real MCP connections ยท CLI probes ยท Bilingual ยท Zero source patching

release stars forks npm total downloads license: MIT dsh node

What it is ยท Screenshots ยท Features ยท Two channels ยท Agent tools ยท Architecture ยท Install ยท Configuration ยท Permissions ยท Repository ยท Development ยท License

Tool manager settings page: Skills tab

Settings โ†’ Web UI plugins โ†’ Tool manager: the unified store, skill linking and the session default, with one tab per tool family.

[!NOTE] As of 0.1.2 the skill catalog is served by this plugin (shadow catalog): catalog membership follows the conversation's injection selection exactly; a catalog change publishes one replacement frame instead of re-appending every step; container directories (DESCRIPTION.md only) are injectable and loadable. Verified by a three-round external test run (16/16 pass).

โœจ What it is

Chinese name: ไธ‰ๅˆไธ€ๅทฅๅ…ทๅฐ (three-in-one console) ๏ฝœ UI entry: Settings โ†’ Web UI Plugins โ†’ Tool Manager ๏ฝœ Aliases: ๅทฅๅ…ท็ฎก็†, ๅทฅๅ…ทไธญๅฟƒ, ๆŠ€่ƒฝ็ฎก็†, MCP ๆœๅŠกๅ™จ็ฎก็†, CLI ๅทฅๅ…ท็ฎก็†, Skills / MCP / CLI manager

A self-contained DSH web plugin: it adds one first-class settings page for the agent's three kinds of tool (skills / MCP servers / local CLI tools), plus a per-conversation skill injection layer; a guide tab explains how each of the three works and, at the bottom, hands everything back cleanly on uninstall.

CapabilityNative dsh webWith this plugin
Skill browsing / togglingEdit skill directories by handOne-click linking / unlinking in the settings page; canonical copies go into the store; SKILL.md is never touched
Per-conversation skill setsโ€”Session default + sidebar panel + skill_select; each conversation stores only its difference from the default
Skill catalog (AI view)Static directory scanShadow catalog: follows the conversation selection exactly, with one smc-skill-index index row
MCP serversHand-edit mcp.jsonForm / JSON creation + one-off connection test + activate / archive switches
Local CLIsโ€”Auto-discovery of skill-wrapped CLIs, system CLI registry, probes for installed / version / subcommands / API key
Intrusivenessโ€”Zero source changes: one npm package + one profile bundle patch line
TabManagesUnder the hood
SkillsBrowse / enable / disable / delete / import skills; the session default decides what a new conversation starts withUser level: canonical copies in ~/.dsh/S-M-C/skills + directory junctions. Project level: frontmatter rewritten in place
MCP serversCreate / edit / test / activate / archive / delete MCP serversReal @deepseek-ai/dsh-mcp-client connections (mcp__<server>__<tool>); archiving moves definitions into S-M-C/mcp-archive.json
CLI toolsDiscover / probe local CLI tools; register system CLIsSkill-embedded scripts/run-cli + S-M-C/cli.json
GuideHow each of the three kinds works, and what to do before uninstallingExplanation lives here; the uninstall preparation sits at the bottom

Full documentation: docs/ๅŠŸ่ƒฝไป‹็ป.md and docs/ๆžถๆž„.md (Chinese).

๐Ÿ“ท Screenshots

Conversation skills panel ๏ฝœ adjust this conversation's injection from the sidebarMCP servers ๏ฝœ real connections, one activate / archive switch each
Sidebar conversation skills panelMCP servers tab
CLI tools ๏ฝœ discover / probe / register local CLIsGuide ๏ฝœ how the three kinds work + uninstall escape hatch
CLI tools tabGuide tab

Skill names, descriptions and MCP server details are redacted in the screenshots.

๐Ÿ’ก Features

  • Skills: grouped by project / user level and by source (.dsh/skills, .agents/skills, ~/.dsh/skills, ~/.agents/skills). User-level skills are adopted into the unified store ~/.dsh/S-M-C/skills; "enable" injects a directory junction in the skill root, "disable" removes it (SKILL.md is never touched). Project-level skills are managed in place through their frontmatter. Deletion is a two-step, physical delete โ€” and it only ever deletes the store's own canonical copy (see below). Open a row for details (description / whenToUse / body); import by scanning any directory.
  • Session default and per-conversation injection: the session default is what a brand-new conversation starts with; each conversation can also carry its own differences (one skill turned off, another added). The agent can flip its own skills in-conversation (written to that conversation's own file), and a small "conversation skills" panel in the sidebar lets you adjust them by hand at any time โ€” both switches list linked skills only. See the next section.
  • MCP: two sub-tabs โ€” "manage" gives each server one activate / archive switch (plus delete), "create" offers a form or raw JSON with a one-off connection test before saving. Activating connects for real and registers mcp__<server>__<tool>; archiving disconnects and moves the definition to S-M-C/mcp-archive.json, fully preserved. Live status: connecting / running / failed / stopped.
  • CLI: discovers skill-wrapped CLIs (scripts/run-cli.* / cli-state.*) and registers system CLIs (gh, git, โ€ฆ in S-M-C/cli.json). Each entry is probed for installed / version / needs-update / API-key state / subcommands, and the row shows where it came from and where it lives. The announce / hide switch only decides whether the CLI is written into the announcement handed to the agent โ€” the plugin cannot start or stop a system-installed CLI, so entries default to hidden.
  • Guide: explains all three kinds and holds the pre-uninstall escape hatch. "Undo migration" moves stored skills back to their original paths; when the store is empty and the skill roots still hold skills, the same button turns into a green "Migrate" โ€” reversible both ways. "Inject all MCP" moves every archived server back and reconnects. The page also lists the directories and config blocks to remove manually after uninstalling.
  • Interface: fully bilingual zh / en (200 keys each; English UI renders no Chinese); destructive actions take two confirmations and reset when you click elsewhere.

๐Ÿง  Two channels: linking vs injection

Enable (linking)Injection (conversation selection)
CarrierA directory junction at ~/.dsh/skills/<slug>One row per conversation in the session table ~/.dsh/S-M-C/contexts.json
ScopeGlobal: every conversation, every workspace, sub-agents includedThis conversation only
Maintained byThe "enable / disable" button on the skills tabThe session default, the sidebar panel, and the model's own skill_select
Seen bydsh's own filesystem scanThis plugin's conversation injection

How a conversation stores its choice: the file keeps the difference from the default (overrides: { on, off }), and the effective set is default โˆช on \ off. Editing the default therefore reaches every conversation that never configured itself, while a skill you turned off in one conversation stays off.

๐Ÿค– Two tools for the agent

ToolWhat it does
skill_selectEnable or disable one skill for this conversation; writes the conversation's own difference and applies immediately. Accepts every linked row โ€” container directories too (their DESCRIPTION.md is the loadable body).
skill_queryRead-only view of the skills visible in this workspace (name / description / group / linked? / injected in this conversation?), computed at call time, with keyword and group filters.

The skill catalog itself is also served by this plugin (shadow catalog): the catalog the AI sees is generated here and carries one extra line, smc-skill-index โ€” an index skill whose body is the complete list of this workspace's skills in the catalog's own shape. Skills that are not injected cannot be loaded ("not enabled in this conversation"); the /skill-name gesture is unaffected.

The guide tab can also switch on announce to agent, which describes the plugin and the current state of all three tool families in every agent's system prompt โ€”

Announce to agent

Announce to agent: expanded, it declares the plugin's capabilities; the setting persists in the dsh-s-m-c-center namespace and applies immediately.

๐Ÿงฑ Architecture

Mounting and the dual-face structure โ€” the plugin is one npm package plus one profile bundle patch; dsh source is untouched:

Mounting and dual-face architecture

The host half registers routes, announces to agents and connects MCP for real; the client half only provides the settings page. They talk over /api/dsh-s-m-c-center/*.

Store layout โ€” every artefact lives under ~/.dsh/S-M-C, while the two directories dsh scans deliberately stay outside it (the plugin only injects and removes junctions there):

Unified external store layout

A skill's canonical copy always lives in the store; the entry under ~/.dsh/skills is only a junction pointing at it.

What the three switches really do on disk โ€” not a config field, but files and connections that actually move:

What the three switches do

Skills: create/remove a junction. MCP activate/archive: the definition moves between mcp.json and mcp-archive.json. CLI: visibility only.

๐Ÿš€ Install

Requirements: DeepSeek Harness >= 0.1.2-alpha.2 (all @deepseek-ai/* packages release together); Node ^22.19.0 || >=24. Status: fully tested on 0.1.6-alpha.1, 0.1.6-alpha.2 and 0.1.5-rc.2; every API used has been checked for existence and signature since 0.1.2-alpha.2.

Install it as a normal package โ€” never as a junction. A junction breaks resolution of dependencies (schemastery / react and friends) and makes the package name disagree with cordis.patch.yml; either one stops DSH from starting.

# From npm
dsh plugin --profile web add dsh-s-m-c-center
# or: npm install dsh-s-m-c-center

# From source (this repository / after cloning)
dsh plugin --profile web add <absolute path to this folder>

# Or from a packed tarball
dsh plugin --profile web add <path>/dsh-s-m-c-center-0.2.0.tgz

# Or the one-shot scripts
bash scripts/install.sh                                        # macOS / Linux / Git Bash
powershell -ExecutionPolicy Bypass -File scripts/install.ps1   # Windows

After the first install, restart DSH and hard-refresh the browser (Cmd/Ctrl+Shift+R), then open "Settings โ†’ Web UI plugins โ†’ Tool manager".

Upgrading: for UI-only changes, overwrite the files and hard-refresh. Changes on the host side (routes / engines / tools) need one DSH process restart.

โš™๏ธ Configuration

# The plugin's own settings namespace (dsh settings)
dsh-s-m-c-center:
  enabled: true        # master switch (routes, MCP connections, CLI probing)
  announceToAgent: true # describe the plugin in every agent's system prompt

Runtime state:

  • Unified external store: ~/.dsh/S-M-C/ (Skills / MCP / CLI) โ€” skills/ (canonical copies plus index.json manifest), skills-links.json (junction ledger), skills-registry.json (registered external skills), mcp.json, mcp-archive.json, cli.json. The old locations are migrated in on first start; the whole store can move elsewhere with DSH_STORE_ROOT (the plugin rebuilds the junctions).
  • Conversation selections: one table for the whole machine at ~/.dsh/S-M-C/contexts.json โ€” default is the session default and sessions.<sessionId> holds that conversation's difference from it (on / off). No workspace is involved: the key is the session id, so the settings page and the sidebar read the same document. An older version kept one file per workspace; those are folded in once, on the first mount with the table missing.
  • MCP: active definitions in S-M-C/mcp.json, archived ones in S-M-C/mcp-archive.json (credentials and headers are stored in plain text โ€” keep both files 0600).
  • CLI registry: S-M-C/cli.json.

๐Ÿ”’ Permissions and dependency disclosure

The plugin runs with the DSH process's privileges and uses four kinds of capability โ€” files, network, commands and credentials:

CapabilityWhat it doesScope and limits
FilesReads and writes the store ~/.dsh/S-M-C/**; creates / removes directory junctions in the skill roots; reads and writes the session table ~/.dsh/S-M-C/contexts.json (plus any legacy <workspace>/.dsh/S-M-C/contexts/*.json, read once by the import); reads SKILL.md and skill-embedded scriptsOnly the store and the four skill roots dsh scans; in-place skills only get their frontmatter rewritten; no other paths are read or written
NetworkConnects to the MCP servers the user configured (stdio through a subprocess, streamable-http over HTTP)Only the addresses typed into the manager page; the plugin has no built-in external service, no telemetry, and reports nothing anywhere
CommandsProbes local CLI tools: runs their --help / --version or the command declared in cli-stateOnly commands inside the registry and visible on the manager page; nothing the user did not register is executed
CredentialsStores MCP env / headers / API keys, reads CLI cli-statePlain text under ~/.dsh/S-M-C/*.json, local only, never sent out; keep those files at 0600

External dependencies: the only runtime dependency is schemastery (settings validation); @deepseek-ai/* and react are peer dependencies provided by DSH; no native modules, and no postinstall / prepare lifecycle scripts.

Failure boundaries: a failed scan or route degrades to an empty list and a placeholder; a failed migration is recorded in failures and ignored, never blocking DSH startup; a failed MCP connection only changes the status line and touches no files; a failed conversation injection never vetoes the conversation and only explains itself in the log. None of them can stop DSH from starting.

Known risks: skill deletion is physical and irreversible (and only the store's copy is ever deleted: a native skill must be migrated into the store first, a registered one is unregistered, and "delete junction" only unlinks and never touches its target); MCP credentials are stored in plain text; enabling / disabling a skill works through a directory junction, so moving the store by hand breaks the junctions (use DSH_STORE_ROOT instead and the plugin rebuilds them).

๐Ÿ—‚๏ธ Expand repository layout
dsh-s-m-c-center/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ index.ts            # host composition root (mount, settings, announcement, tools)
โ”‚   โ”œโ”€โ”€ routes.ts           # route assembly (one entry per feature)
โ”‚   โ”œโ”€โ”€ setup.ts            # identity constants + the agent-facing guidance text
โ”‚   โ”œโ”€โ”€ shared/             # cross-cutting primitives: paths / fs-utils / frontmatter / http / protocol
โ”‚   โ”œโ”€โ”€ features/           # vertical slices, each owning manager + routes + index barrel
โ”‚   โ”‚   โ”œโ”€โ”€ skills/         #   roots / scanner / linking / links / registry /
โ”‚   โ”‚   โ”‚                   #   adopt / delete / migration / store-index / catalog
โ”‚   โ”‚   โ”œโ”€โ”€ mcp/            #   document / manager / routes
โ”‚   โ”‚   โ”œโ”€โ”€ cli/            #   probe / registry / manager / routes
โ”‚   โ”‚   โ”œโ”€โ”€ context/        #   engine / apply / tools / routes
โ”‚   โ”‚   โ”œโ”€โ”€ announce/       #   system-prompt announcement
โ”‚   โ”‚   โ””โ”€โ”€ settings/       #   the plugin's settings namespace
โ”‚   โ””โ”€โ”€ client/             # browser half
โ”‚       โ”œโ”€โ”€ shell/          #   settings-card shell, sidebar "conversation skills" panel
โ”‚       โ”œโ”€โ”€ shared/         #   api / ui / locales (zh+en) / format / css module
โ”‚       โ””โ”€โ”€ features/       #   one panel + hook per tab
โ”œโ”€โ”€ lib/                    # build output (host index.js; client client.js; types/*)
โ”œโ”€โ”€ tests/                  # vitest (13 files)
โ”œโ”€โ”€ cordis.patch.yml        # DSH bundle patch (package name must match package.json)
โ”œโ”€โ”€ dsh.plugin.json         # DSH plugin manifest (id / version / main / client.main)
โ”œโ”€โ”€ package.json            # npm package (dsh.bundle.patch + dsh.client + compatibility)
โ”œโ”€โ”€ LICENSE                 # MIT
โ”œโ”€โ”€ README.md / README.zh.md
โ”œโ”€โ”€ docs/
โ”‚   โ”œโ”€โ”€ ๅŠŸ่ƒฝไป‹็ป.md / ๆžถๆž„.md / development.md
โ”‚   โ”œโ”€โ”€ arch-*.svg          # architecture diagrams (referenced above)
โ”‚   โ”œโ”€โ”€ social-preview.png  # repository social preview
โ”‚   โ””โ”€โ”€ shots/              # UI screenshots (referenced above)
โ””โ”€โ”€ scripts/install.*       # one-shot installers into a DSH profile

๐Ÿงฐ Development

See docs/development.md: dual-half builds (tsdown rebuilds lib/index.js + lib/client.js), type checking (tsc --noEmit) and the test suite (vitest, 13 files / 193 cases).

๐Ÿ“„ License

MIT.


ไธญๆ–‡๏ผšREADME.zh.md.

Related plugins