dsh-toolbox-ui 1.6.1 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +81 -131
- package/README.md +73 -121
- package/docs/installation.md +10 -9
- package/docs/skills.md +23 -2
- package/lib/client.js +89 -47
- package/lib/index.js +68 -17
- package/lib/skills-file-ops.js +48 -7
- package/lib/skills-frontmatter.js +149 -9
- package/lib/skills-registry.js +49 -10
- package/lib/typert.js +1 -0
- package/lib/whats-new.js +26 -0
- package/package.json +4 -4
package/README.en.md
CHANGED
|
@@ -1,202 +1,152 @@
|
|
|
1
|
-
# dsh-toolbox-ui
|
|
2
|
-
|
|
3
|
-
[中文](README.md) | English
|
|
4
|
-
|
|
5
1
|
<p align="center">
|
|
6
|
-
<
|
|
2
|
+
<img src="docs/images/logo.svg" width="104" height="104" alt="dsh-toolbox-ui">
|
|
7
3
|
</p>
|
|
8
4
|
|
|
5
|
+
<h1 align="center">dsh-toolbox-ui</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center"><b>MCP management panel</b> + <b>skills manager</b> for DeepSeek Harness Web</p>
|
|
8
|
+
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://github.com/Imzl-zl/dsh-mcp-manager-ui/actions/workflows/ci.yml"><img src="https://github.com/Imzl-zl/dsh-mcp-manager-ui/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
|
|
11
10
|
<a href="https://www.npmjs.com/package/dsh-toolbox-ui"><img src="https://img.shields.io/npm/v/dsh-toolbox-ui" alt="npm"></a>
|
|
12
11
|
<a href="https://www.npmjs.com/package/dsh-toolbox-ui"><img src="https://img.shields.io/npm/dm/dsh-toolbox-ui" alt="downloads"></a>
|
|
12
|
+
<a href="https://github.com/Imzl-zl/dsh-toolbox-ui/actions/workflows/ci.yml"><img src="https://github.com/Imzl-zl/dsh-toolbox-ui/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
|
|
13
13
|
<a href="./LICENSE"><img src="https://img.shields.io/npm/l/dsh-toolbox-ui" alt="license"></a>
|
|
14
|
-
<img src="https://img.shields.io/badge/DSH-%
|
|
14
|
+
<img src="https://img.shields.io/badge/DSH-%E2%89%A50.1.5--rc.1-blue" alt="DSH >= 0.1.5-rc.1">
|
|
15
15
|
</p>
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
> In-depth design notes (shared-connection model, connection-state semantics, known limits) are currently Chinese-only: [docs/design.md](docs/design.md).
|
|
17
|
+
Click the floating button or the sidebar's "Toolbox" entry: the panel floats above the session, so changing configuration or reading skills never interrupts the conversation you are in. Two ability faces live in the same panel — **MCP** and **skills**.
|
|
20
18
|
|
|
21
19
|
## Screenshots
|
|
22
20
|
|
|
23
|
-
###
|
|
24
|
-
|
|
25
|
-

|
|
21
|
+
### MCP market
|
|
26
22
|
|
|
27
|
-
|
|
23
|
+

|
|
28
24
|
|
|
29
|
-
|
|
25
|
+
47 services, each verified against first-party sources, across 10 categories. Search-first, with a "keyless only" filter and sorting. Every entry states its free tier honestly and what you must supply (key / connection details / arguments to edit after install); one click installs from the card, and already-configured entries are recognised and skipped.
|
|
30
26
|
|
|
31
|
-
###
|
|
27
|
+
### Skills pane
|
|
32
28
|
|
|
33
|
-

|
|
34
30
|
|
|
35
|
-
|
|
31
|
+
See every installed skill's **real scope** and cross-scope shadowing, enable/disable, remove, read the body and diagnostics — and flip **model auto-invocation** with one switch, which edits `disable-model-invocation` in `SKILL.md` in place, touching only that one line.
|
|
36
32
|
|
|
37
33
|
## Features
|
|
38
34
|
|
|
39
|
-
|
|
40
|
-
- Filter by transport (HTTP/stdio) and status, search by name/command/URL
|
|
41
|
-
- Enable, disable, reconnect, add, edit, remove; reveal masked credentials temporarily with the eye button and copy with one click
|
|
42
|
-
- **Global + project scopes**: global servers live in the Web profile and are available to every project; project servers live in that project's `.dsh/mcp.json` and are visible only to its sessions. A project can also hide any global MCP
|
|
43
|
-
- **Two entry points, one panel**: the draggable floating button (position remembered) and the official sidebar entry share the same state; the "Entry" control in the panel header can keep just one of them (never neither)
|
|
44
|
-
- **MCP market**: 47 services across 10 categories (search, dev, security & reverse engineering, data, AI & knowledge, browser automation, cloud & infra, productivity, files, comms), each verified against first-party sources. Search-first, with category and "keyless only" filters, sorting, and one-click install from the card; every entry states its free tier honestly and what you must supply (key / connection details / arguments to edit after install). Already-configured entries are detected and skipped, never overwritten
|
|
45
|
-
- Import MCP configuration from other clients installed on this machine: Claude Code, Codex (`config.toml`), OpenCode (including `.jsonc`), pi, Claude Desktop, Cursor, Windsurf, VS Code, Gemini CLI, Roo Code, and the cross-tool shared config are detected and listed, and one click imports from any of them; you can also paste `mcpServers` JSON from Claude, Cursor, Cline, or Roo, or `servers` JSON from VS Code. Everything is previewed before writing, with "merge" and "replace" modes
|
|
46
|
-
- **Moving servers between workspaces**: copy this project's MCP servers into another registered workspace in one go (done inside the Host, so credentials never pass through the browser), or export the whole project configuration as JSON to download / copy (same shape as `.dsh/mcp.json`, ready to drop into another workspace). See [Moving servers between workspaces](#moving-servers-between-workspaces)
|
|
47
|
-
- Follows the DSH dark/light theme and adapts to narrow/mobile widths
|
|
48
|
-
- Update notice and **one-click upgrade**: a dismissible banner when a newer release exists (at most one check per day; disable with `DSH_MCP_MANAGER_DISABLE_UPDATE_CHECK`). Nothing happens until you press Upgrade — it **never auto-updates**. The upgrade runs through DSH's official pluginManager and tells you to restart the host when done. A local dev copy installed via `link:` / `file:` / `github:` gets no button (upgrading it would replace your link with an npm package)
|
|
49
|
-
- **What changed, said once**: after the version changes, the first time you open the panel a small card lists what's new and where to find it (e.g. that the "Entry" control sits in the panel header); confirming it never shows it again, and it uses no network and sends nothing
|
|
35
|
+
**MCP**
|
|
50
36
|
|
|
51
|
-
|
|
37
|
+
- Per-entry status, transport, connection settings and the **registered tools**; expand a tool for its full input JSON Schema (required/optional, types, enums, defaults)
|
|
38
|
+
- Enable, disable, reconnect, add, edit, remove; credential fields are masked by default — reveal the effective runtime value temporarily and copy it in one click
|
|
39
|
+
- **Global + project scopes**: global writes the Web profile (available to every project), project writes that project's `.dsh/mcp.json` (visible only to its sessions); a project can also **block** a global MCP
|
|
40
|
+
- **Import** configuration from other clients installed on this machine: Claude Code, Codex, OpenCode, pi, Claude Desktop, Cursor, Windsurf, VS Code, Gemini CLI, Roo Code and the cross-tool shared config — or paste JSON directly. Previewed before writing, with merge and replace modes
|
|
41
|
+
- **Move servers between workspaces**: copy this project's MCP servers into another registered workspace (done inside the Host, so credentials never pass through the browser), or export the whole project config as JSON
|
|
52
42
|
|
|
53
|
-
|
|
54
|
-
# Recommended: install from npm — `dsh plugin update` then upgrades within ^1.x automatically
|
|
55
|
-
dsh plugin --profile web add dsh-toolbox-ui@^1.6.1
|
|
43
|
+
**Skills**
|
|
56
44
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
45
|
+
- Real scope and cross-scope shadowing: the same name in different scopes is a legal configuration; the panel lists each copy and marks which one wins
|
|
46
|
+
- Enable/disable (`.disabled`), remove, read the body and diagnostics — the reason a skill "does not take effect" is right there in the panel
|
|
47
|
+
- **Model auto-invocation switch**: edits `disable-model-invocation` in `SKILL.md`; turning it off deletes that line (off → on round-trips byte-for-byte). The state always comes from the skill file itself — when it cannot be read the panel says "unknown" instead of guessing
|
|
48
|
+
- Market backed by [skillhub.cn](https://skillhub.cn): publisher verification and security-scan findings are disclosed before install, followed by one **explicit confirmation** (validated server-side)
|
|
60
49
|
|
|
61
|
-
|
|
50
|
+
**Shared**
|
|
51
|
+
|
|
52
|
+
- Pick one or both entry points: the floating button (draggable, position remembered) and the sidebar "Toolbox" entry — at least one stays on
|
|
53
|
+
- Follows the DSH dark/light theme and adapts to narrow widths
|
|
54
|
+
- Update notice and one-click upgrade: at most one npm check per day, dismissible, **never auto-updates**; after an upgrade it explains what changed, without any network request
|
|
55
|
+
|
|
56
|
+
## Install
|
|
62
57
|
|
|
63
58
|
```sh
|
|
64
|
-
dsh plugin
|
|
59
|
+
# Recommended: from npm — `dsh plugin update` then upgrades within ^1.x
|
|
60
|
+
dsh plugin --profile web add dsh-toolbox-ui@^1.6.3
|
|
61
|
+
|
|
62
|
+
# Or pin a GitHub release tag (no automatic upgrades; re-add with a new tag)
|
|
63
|
+
dsh plugin --profile web add github:Imzl-zl/dsh-toolbox-ui#v1.6.3
|
|
65
64
|
```
|
|
66
65
|
|
|
67
|
-
To uninstall (your
|
|
66
|
+
Then **restart `dsh web`**. To uninstall (your existing MCP entries stay):
|
|
68
67
|
|
|
69
68
|
```sh
|
|
70
69
|
dsh plugin --profile web remove dsh-toolbox-ui
|
|
71
70
|
```
|
|
72
71
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
> Do not add `mcp-manager-ui` to the profile's `cordis.patch.yml`, an agent preset, or an extra `--patch` file by hand — the plugin command already does that, and duplicating it fails loudly on purpose.
|
|
76
|
-
|
|
77
|
-
## Usage
|
|
72
|
+
> Do not add `mcp-manager-ui` to the profile's `cordis.patch.yml`, an agent preset, or an extra `--patch` file by hand — the plugin command already does it, and assembling it twice fails loudly.
|
|
78
73
|
|
|
79
|
-
|
|
74
|
+
## Upgrade
|
|
80
75
|
|
|
81
|
-
|
|
76
|
+
```sh
|
|
77
|
+
dsh plugin --profile web update dsh-toolbox-ui
|
|
78
|
+
```
|
|
82
79
|
|
|
83
|
-
|
|
84
|
-
- **Sidebar "MCP"**: above "Settings" when expanded, icon-only in the 56px rail.
|
|
80
|
+
When a newer version exists the panel shows a dismissible banner; pressing Upgrade runs DSH's official pluginManager.
|
|
85
81
|
|
|
86
|
-
|
|
82
|
+
> ⚠️ **1.6.1 and earlier will not announce 1.6.2 or anything after it.** Their update check read this repository's release feed, whose only `latest` entry is held by the legacy package `dsh-mcp-manager-ui` (frozen at 1.5.5) — so it always answered "up to date". 1.6.2 fixed that by querying **this package's latest on npm**, and the fix can only ship inside a newer version: upgrade once by hand, then the banner works again.
|
|
83
|
+
>
|
|
84
|
+
> ```sh
|
|
85
|
+
> dsh plugin --profile web update dsh-toolbox-ui
|
|
86
|
+
> ```
|
|
87
|
+
>
|
|
88
|
+
> Still on the legacy package (≤1.5.3)? Use the **migration** path: press Upgrade in the panel to reach 1.5.5, then press "Migrate" (it installs this package and removes the old one). See [Install & upgrade](docs/installation.md).
|
|
87
89
|
|
|
88
|
-
|
|
90
|
+
## Quick start
|
|
89
91
|
|
|
90
|
-
|
|
92
|
+
**Open the panel**: the floating button at the bottom right, or "Toolbox" at the bottom of the sidebar. It floats above the session; Esc or "Close" hides it without touching the session.
|
|
91
93
|
|
|
92
|
-
|
|
94
|
+
**Two scopes**:
|
|
93
95
|
|
|
94
|
-
| Tab | Stored in | Visible to |
|
|
96
|
+
| Tab | Stored in | Visible to | Takes effect |
|
|
95
97
|
|---|---|---|---|
|
|
96
|
-
| Global |
|
|
97
|
-
| A project |
|
|
98
|
+
| Global | the Web profile's `cordis.patch.yml` | every project | DSH hot-reloads, usually immediately |
|
|
99
|
+
| A project | that project's `.dsh/mcp.json` | only that project's sessions | **on write** — no need to reopen the session or restart the Host |
|
|
98
100
|
|
|
99
|
-
`serverName` is
|
|
101
|
+
`serverName` is unique per scope: different projects, and global vs. project, **may share a name** and connect independently.
|
|
100
102
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
From a row or the detail pane:
|
|
104
|
-
|
|
105
|
-
- **Toggle**: enable / disable (global writes the profile patch's `disabled`, project writes `.dsh/mcp.json`);
|
|
106
|
-
- **Reconnect**: global only (project connections are held by sessions and `mcp-client` reconnects them on its own);
|
|
107
|
-
- **Edit / Remove**: removal only affects the current scope;
|
|
108
|
-
- **Hide** (a global MCP, from a project tab): writes `exclude` so that project's new sessions no longer see it — the global instance keeps running, so other projects are unaffected.
|
|
109
|
-
|
|
110
|
-
### Adding a server
|
|
111
|
-
|
|
112
|
-
Three ways, all from the panel toolbar:
|
|
113
|
-
|
|
114
|
-
1. **Add MCP**: fill in `command`/`args`/`env`/`cwd` (stdio) or `url`/`headers` (HTTP), optionally set the call timeout, startup-failure policy, and reconnect policy; presets are available for common servers.
|
|
115
|
-
2. **Import JSON**: paste another client's configuration, preview, then write. "Merge (update by name)" and "replace" modes; field mapping and limits in [docs/json-import.md](docs/json-import.md) (Chinese).
|
|
116
|
-
3. **Built-in MCP**: tick the servers you want (Exa, Tavily, Firecrawl, Chrome DevTools, Playwright). The first three work without a key and need no local dependencies; the last two are local tools requiring Node.js and a browser.
|
|
117
|
-
|
|
118
|
-
### Moving servers between workspaces
|
|
119
|
-
|
|
120
|
-
Two entries sit next to the "This project's MCP" heading in a project tab (both apply to the current project only):
|
|
121
|
-
|
|
122
|
-
- **Copy to…**: tick the servers to move (all selected by default), pick a target workspace, and write them in one go. The copy happens inside the Host, so configuration and credentials never pass through the browser. When the target already has the same name the entry is **skipped by default** (the target's own configuration wins); you can explicitly choose "overwrite same names". The result names exactly what was added, overwritten, or skipped. The target's `exclude` list is not carried over — that is the target project's own visibility decision, not configuration data.
|
|
123
|
-
- **Export**: turn this project's configuration into JSON (same shape as `.dsh/mcp.json`) that you can copy or download — for backups, moving to another machine, or sharing. **The export is the full configuration**: literal credentials (tokens in URLs, literal header / env values) appear in it verbatim, so treat it as a secret. Locations written as `${VAR}` keep the reference form and are never resolved to plaintext. The file can be dropped into another workspace's `.dsh/mcp.json`, or pasted back through "Import MCP" (pasting reads `mcpServers` only; `exclude` has to be set by hand).
|
|
124
|
-
|
|
125
|
-
The target workspace must be registered with DSH (i.e. it appears as a tab in the panel) — "Copy to…" does not accept an arbitrary directory, and that limit is enforced by the Host, not just hidden in the UI.
|
|
126
|
-
|
|
127
|
-
### Tools and credentials
|
|
128
|
-
|
|
129
|
-
The detail pane lists the tools a server currently registers; expand one for its full input schema. Credential fields are masked by default — the eye button asks the Host for the **effective runtime value** (environment references already resolved) and shows it temporarily, with one-click copy. If you do not actually edit a field, saving keeps the original reference instead of writing secrets back into the configuration file.
|
|
130
|
-
|
|
131
|
-
## When configuration changes take effect (important)
|
|
132
|
-
|
|
133
|
-
| Scope | When a change takes effect |
|
|
134
|
-
|---|---|
|
|
135
|
-
| Global | DSH hot-reloads it, usually immediately (including running sessions) |
|
|
136
|
-
| Project | **As soon as it is written**: an added server mounts into live sessions, a removed one retracts its tools, and a changed one reloads in place (tool names stay the same) |
|
|
137
|
-
|
|
138
|
-
Project MCPs are shared by every session of that project and configured in `.dsh/mcp.json`. Saving in the panel aligns the running sessions immediately — **no need to reopen a session and no Host restart**; editing the file by hand is picked up at the **next session mount**.
|
|
139
|
-
|
|
140
|
-
> **The connection follows the configuration, not the sessions**: when the last session ends the connection is not torn down — it goes idle and the next session reuses it, so it is already up when you need it (this is also the host's own contract: tools must appear before the first turn). Idle recycling defaults to 5 minutes; `idleTimeoutMs` tunes it and `0` means never recycle automatically.
|
|
141
|
-
>
|
|
142
|
-
> **How to read the state**: a project row states two independent facts instead of merging them.
|
|
143
|
-
> - **Is the connection there**: `已连接 · 当前无会话使用(连接保留,下次直接用)` / `已连接 · N 个会话在用` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`.
|
|
144
|
-
> - **How many sessions use it**: the `N 个会话在用` part above. The old "待会话挂载" wording merged both into one phrase and read like "not connected yet".
|
|
145
|
-
>
|
|
146
|
-
> **Reconnect is a required exit**: mcp-client has a bounded reconnect budget and, once exhausted, it unregisters the tools and stops until the configuration is reloaded or the harness restarts (its README says so). A project MCP is not a resident service, so the panel's "reconnect" button tears the old connection down, rebuilds it from the current configuration, and re-projects it into live sessions.
|
|
103
|
+
**Adding MCP**: use "Add MCP" for the form, or "Import MCP" to paste another client's configuration (previewed before writing). Common servers ship with presets.
|
|
147
104
|
|
|
148
105
|
## FAQ
|
|
149
106
|
|
|
150
|
-
**
|
|
151
|
-
That server is disabled, so it registers no tools. Enable it in the panel (global writes the profile patch and hot-reloads; project writes `.dsh/mcp.json` and applies to new sessions).
|
|
107
|
+
**When does a change in a project take effect?** The moment you save: new entries attach to live sessions, removed ones retract their tools, edits reload the connection in place — no need to reopen the session or restart the Host. Editing `.dsh/mcp.json` by hand is picked up when the next session mounts.
|
|
152
108
|
|
|
153
|
-
**
|
|
154
|
-
Three different things, and the detail pane gives the specific reason: **mount failed** = the plugin could not mount it during session setup (a `${VAR}` resolved to empty, startup failed under `failOnStartupError`, tool registration was rejected); **connection failed** = `mcp-client` could not connect or exhausted its reconnect budget (the reason comes from its logs); **scope isolation failed** = the connection is fine but the tools are not in the shared scope layer (two copies of `@deepseek-ai/dsh-scope` ended up loaded in the Host). See [docs/design.md](docs/design.md) (Chinese) for the diagnosis.
|
|
109
|
+
**The connection follows the configuration, not the session.** When the last session ends the connection is not torn down; it goes idle and the next session reuses it, so it is already there when you need it. Two knobs live on the server entry: `idleTimeoutMs` (how long an idle connection is kept, default 5 minutes, `0` = never reclaim) and `readyTimeoutMs` (the total budget for waiting until ready on mount, default 5s, `0` = do not wait). See [Design & limits](docs/design.md#项目级专有字段dshmcpjson-里每个-server-可写).
|
|
155
110
|
|
|
156
|
-
**What do "waiting for a session
|
|
157
|
-
Respectively: no session of that project holds the shared connection yet / the configuration changed but the old connection is still being reused (see above) / how many sessions currently share it.
|
|
111
|
+
**What do the project row's status strings mean?** They separate two independent facts: **whether a connection exists** (`已连接 · 当前无会话使用(连接保留,下次直接用)` / `已连接 · N 个会话在用` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`) and **how many sessions are using it** — the old "waiting for a session to mount" wording merged both into one sentence and read like "not connected yet".
|
|
158
112
|
|
|
159
|
-
**
|
|
160
|
-
If you installed from npm, `dsh plugin --profile web update dsh-toolbox-ui` upgrades within `^1.x` — or just press Upgrade on the panel banner, which does the same thing without the command. The banner only queries GitHub Releases, at most once a day, is dismissible, and never acts on its own. Tag-pinned installs never cross versions — re-add with the new tag.
|
|
113
|
+
**The panel says "disabled" but the model reports `unknown tool "mcp__xxx__…"`.** That MCP is disabled, so it registers no tools. Enable it in the panel.
|
|
161
114
|
|
|
162
|
-
**
|
|
163
|
-
No. Global edits only rewrite the entries declared by `@deepseek-ai/dsh-mcp-client` that this plugin manages, preserving other plugin rows, comments, and `!!js` expressions; "replace" imports only replace that part and never delete MCPs owned by another bundle or agent preset.
|
|
115
|
+
**How do I tell "mount failed", "connection failed" and "scope isolation failed" apart?** Three different things: **mount failed** = it never attached during session mount; **connection failed** = `mcp-client` cannot connect or ran out of retries; **scope isolation failed** = the connection is fine but its tools are not in the shared scope layer. The detail pane gives the specific reason; see [Design & limits](docs/design.md#连接状态语义).
|
|
164
116
|
|
|
165
|
-
**
|
|
166
|
-
No. Uninstalling the plugin leaves existing `@deepseek-ai/dsh-mcp-client` rows in the profile untouched, and a project's `.dsh/mcp.json` stays where it is (it is an ordinary JSON file).
|
|
117
|
+
**Will it touch my other configuration?** No. Global edits only touch the entries declared by `@deepseek-ai/dsh-mcp-client` and managed by this plugin, preserving other plugin entries, comments and `!!js` expressions. Uninstalling leaves your existing MCP entries and project `.dsh/mcp.json` alone.
|
|
167
118
|
|
|
168
119
|
## Compatibility
|
|
169
120
|
|
|
170
121
|
| Item | Verified |
|
|
171
122
|
|---|---|
|
|
172
|
-
| DeepSeek Harness | `0.1.5-rc.1` and above (verified
|
|
173
|
-
| Node.js |
|
|
174
|
-
| Platform | Windows; Linux
|
|
123
|
+
| DeepSeek Harness | `0.1.5-rc.1` and above (verified up to `0.2.0-rc.2`) |
|
|
124
|
+
| Node.js | the runtime DSH ships with / supports |
|
|
125
|
+
| Platform | Windows; Linux and macOS use the same DSH Web contract |
|
|
175
126
|
|
|
176
|
-
|
|
127
|
+
Requires 0.1.5 or newer (older versions lack per-scope `serverName` uniqueness and the `agent` passed to setup); no downgrade branches are kept for older hosts.
|
|
177
128
|
|
|
178
129
|
## Development
|
|
179
130
|
|
|
180
131
|
```sh
|
|
181
|
-
npm test
|
|
182
|
-
dsh
|
|
183
|
-
dsh web # run the Web UI for real verification
|
|
132
|
+
npm test # full suite, including host-level integration tests (real cordis / dsh-tools / dsh-scope / dsh-mcp-client + a real stdio MCP child process)
|
|
133
|
+
dsh web # start the Web app for hands-on verification
|
|
184
134
|
```
|
|
185
135
|
|
|
186
|
-
Besides fixture-based tests (which check internal consistency), `npm test` includes **real-host integration tests** that run genuine `cordis` + `dsh-tools` + `dsh-scope` + `dsh-mcp-client` plus a real stdio MCP child process, covering "two sessions of one project share a single connection, tools are projected into each session, nothing leaks into the global view, and the child process exits with the last session". CI (push to `main` / pull requests, and tag pushes for releases) runs the same gate; see [docs/installation.md](docs/installation.md#发布流程维护者) (Chinese) for the release flow.
|
|
187
|
-
|
|
188
136
|
## Documentation
|
|
189
137
|
|
|
190
|
-
- [
|
|
191
|
-
- [
|
|
192
|
-
- [
|
|
193
|
-
- [
|
|
138
|
+
- [Install & upgrade](docs/installation.md) — three install flavours, release flow, troubleshooting
|
|
139
|
+
- [Skills](docs/skills.md) — scopes and shadowing, enable/disable, invocation policy, the skill market
|
|
140
|
+
- [JSON import](docs/json-import.md) — field mapping and limits
|
|
141
|
+
- [Design & limits](docs/design.md) — shared connection model, connection-state semantics, known limits, dependency details
|
|
142
|
+
- [DeepSeek Harness plugin publishing guide](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.md)
|
|
194
143
|
|
|
195
|
-
##
|
|
144
|
+
## Friend link
|
|
196
145
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
146
|
+
<p align="center">
|
|
147
|
+
<a href="https://linux.do/" title="LINUX DO"><img src="docs/images/linux-do-logo.svg" alt="LINUX DO" width="44" height="44"></a><br>
|
|
148
|
+
<a href="https://linux.do/">LINUX DO</a>
|
|
149
|
+
</p>
|
|
200
150
|
|
|
201
151
|
## License
|
|
202
152
|
|
package/README.md
CHANGED
|
@@ -1,167 +1,120 @@
|
|
|
1
|
-
# dsh-toolbox-ui
|
|
2
|
-
|
|
3
|
-
中文 | [English](README.en.md)
|
|
4
|
-
|
|
5
1
|
<p align="center">
|
|
6
|
-
<
|
|
2
|
+
<img src="docs/images/logo.svg" width="104" height="104" alt="dsh-toolbox-ui">
|
|
7
3
|
</p>
|
|
8
4
|
|
|
5
|
+
<h1 align="center">dsh-toolbox-ui</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">DeepSeek Harness Web 的 <b>MCP 管理面板</b> + <b>技能管理面板</b></p>
|
|
8
|
+
|
|
9
9
|
<p align="center">
|
|
10
|
-
<a href="https://github.com/Imzl-zl/dsh-mcp-manager-ui/actions/workflows/ci.yml"><img src="https://github.com/Imzl-zl/dsh-mcp-manager-ui/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
|
|
11
10
|
<a href="https://www.npmjs.com/package/dsh-toolbox-ui"><img src="https://img.shields.io/npm/v/dsh-toolbox-ui" alt="npm"></a>
|
|
12
11
|
<a href="https://www.npmjs.com/package/dsh-toolbox-ui"><img src="https://img.shields.io/npm/dm/dsh-toolbox-ui" alt="downloads"></a>
|
|
12
|
+
<a href="https://github.com/Imzl-zl/dsh-toolbox-ui/actions/workflows/ci.yml"><img src="https://github.com/Imzl-zl/dsh-toolbox-ui/actions/workflows/ci.yml/badge.svg" alt="ci"></a>
|
|
13
13
|
<a href="./LICENSE"><img src="https://img.shields.io/npm/l/dsh-toolbox-ui" alt="license"></a>
|
|
14
|
-
<img src="https://img.shields.io/badge/DSH-%
|
|
14
|
+
<img src="https://img.shields.io/badge/DSH-%E2%89%A50.1.5--rc.1-blue" alt="DSH >= 0.1.5-rc.1">
|
|
15
15
|
</p>
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
点右下角悬浮按钮或侧栏「工具箱」打开,面板浮在会话之上——改配置、看技能,都不打断正在进行的对话。两个能力面在同一个面板里切换:**MCP** 与**技能**。
|
|
18
18
|
|
|
19
19
|
## 界面预览
|
|
20
20
|
|
|
21
|
-
###
|
|
21
|
+
### MCP 市场
|
|
22
22
|
|
|
23
|
-

|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
47 个逐条一手核实过的服务,分 10 类;搜索为主操作,配「只要免密钥」筛选与排序。每条如实标注免费额度、要准备什么(密钥 / 连接信息 / 装完还得改的参数),卡片直接安装;已配置的只识别并跳过。
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
### 技能面板
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+

|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
看本机每个技能的**真实作用域**与同名遮蔽,启停、删除、读正文与诊断,并一键切换「模型自动调用」——它直接改 `SKILL.md` 的 `disable-model-invocation`,只动那一行。
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
## 特性
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
**MCP 面**
|
|
36
36
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
- **MCP 市场**:47 个逐条一手核实过的服务,分 10 类(搜索、开发工具、安全与逆向、数据库与数据、AI 与知识、浏览器自动化、云与基础设施、效率协作、文件与本地、通讯)。搜索为主操作,配分类与「只要免密钥」筛选、排序、卡片直接安装;每条如实标注免费额度与需要准备什么(密钥 / 连接信息 / 装完还得改的参数)。已配置的只识别并跳过,不覆盖
|
|
43
|
-
- 导入本机其他客户端的 MCP 配置:自动检测 Claude Code、Codex(`config.toml`)、OpenCode(含 `.jsonc`)、pi、Claude Desktop、Cursor、Windsurf、VS Code、Gemini CLI、Roo Code 与跨工具的共享配置,逐个列出,点一条即导入;也能粘贴 Claude/Cursor/Cline/Roo 的 `mcpServers` 或 VS Code 的 `servers` JSON。写入前预览,支持「合并(同名更新)」与「替换」
|
|
44
|
-
- **跨工作区搬运**:在项目标签页里把本项目的 MCP 一次勾选复制到另一个已注册的工作区(在宿主内完成,凭据不经过浏览器),或把整个项目配置导出成 JSON 下载 / 复制(与 `.dsh/mcp.json` 同格式,可直接放进另一个工作区)。详见[工作区之间复制与导出](#工作区之间复制与导出)
|
|
45
|
-
- 跟随 DSH 深色/浅色主题,适配窄屏与移动宽度
|
|
46
|
-
- 更新提示与**一键升级**:有新版时在面板顶部显示可关闭的提示条(每天最多查一次,可用 `DSH_MCP_MANAGER_DISABLE_UPDATE_CHECK` 关闭)。点了「升级」才动,**不会自动升级**;升级由 DSH 官方的 pluginManager 执行,装完提示重启宿主生效。用 `link:` / `file:` / `github:` 装的本地开发副本不给按钮(那会把链接换成 npm 包)
|
|
47
|
-
- **升级后主动说一次变了什么**:版本变了后第一次打开面板弹一张小卡片,列出本次更新内容,并指路新功能在哪(例如「入口」开关在面板右上角);确认一次后不再提示,不联网、不发任何数据
|
|
37
|
+
- 逐条看状态、传输方式、连接参数与**已注册的工具**;展开工具可看完整输入 JSON Schema(必填/可选、类型、枚举、默认值)
|
|
38
|
+
- 启停、重连、添加、编辑、移除;凭据类字段默认掩码,点眼睛临时揭示有效运行值并一键复制
|
|
39
|
+
- **全局 + 项目双作用域**:全局写 Web profile(所有项目可用),项目写该项目 `.dsh/mcp.json`(只该项目会话可见);项目里还能「屏蔽」某个全局 MCP
|
|
40
|
+
- 从本机其他客户端**导入**:Claude Code、Codex、OpenCode、pi、Claude Desktop、Cursor、Windsurf、VS Code、Gemini CLI、Roo Code 与跨工具共享配置,也能直接粘贴 JSON;写入前预览,支持「合并」与「替换」
|
|
41
|
+
- **跨工作区搬运**:把本项目的 MCP 复制到另一个已注册工作区(在宿主内完成,凭据不经过浏览器),或导出成 JSON 备份 / 分享
|
|
48
42
|
|
|
49
|
-
|
|
43
|
+
**技能面**
|
|
50
44
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
- 真实作用域与同名遮蔽:同名技能跨作用域是合法配置,面板逐条列出并标出哪一份生效
|
|
46
|
+
- 启停(`.disabled`)、删除、读正文与诊断——「技能不生效」的原因直接摆在面板里
|
|
47
|
+
- **「模型自动调用」开关**:直接改 `SKILL.md` 的 `disable-model-invocation`,关掉=删掉那一行(开→关能逐字节还原原文);状态一律取自技能文件本身,读不出来就说「未知」而不是猜一个值
|
|
48
|
+
- 市场接 [skillhub.cn](https://skillhub.cn):安装前披露发布方认证与安全扫描结论,并要一次**显式确认**(该确认在服务端校验)
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
dsh plugin --profile web add github:Imzl-zl/dsh-mcp-manager-ui#v1.6.1
|
|
57
|
-
```
|
|
50
|
+
**公共**
|
|
58
51
|
|
|
59
|
-
|
|
52
|
+
- 入口三选一:右下角悬浮按钮(可拖拽、记忆位置)+ 侧栏「工具箱」;可以只留一个,不能都关
|
|
53
|
+
- 跟随 DSH 深色/浅色主题,适配窄屏与移动宽度
|
|
54
|
+
- 更新提示与一键升级:每天最多查一次 npm、可关闭、**绝不自动升级**;升级后弹一次「本次更新内容」,不联网
|
|
55
|
+
|
|
56
|
+
## 安装
|
|
60
57
|
|
|
61
58
|
```sh
|
|
62
|
-
dsh plugin
|
|
59
|
+
# 推荐:npm 安装 —— 之后 `dsh plugin update` 在 ^1.x 内自动升小版本
|
|
60
|
+
dsh plugin --profile web add dsh-toolbox-ui@^1.6.3
|
|
61
|
+
|
|
62
|
+
# 或固定 GitHub release tag(不自动跨版本,升级要换 tag 重新 add)
|
|
63
|
+
dsh plugin --profile web add github:Imzl-zl/dsh-toolbox-ui#v1.6.3
|
|
63
64
|
```
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
装完**重启 `dsh web`**。卸载(不会删除 profile 里已有的 MCP 条目):
|
|
66
67
|
|
|
67
68
|
```sh
|
|
68
69
|
dsh plugin --profile web remove dsh-toolbox-ui
|
|
69
70
|
```
|
|
70
71
|
|
|
71
|
-
细节、本地开发安装与故障排查见 [安装与升级](docs/installation.md)。
|
|
72
|
-
|
|
73
72
|
> 不要把 `mcp-manager-ui` 手工插进 profile 的 `cordis.patch.yml`、Agent preset 或额外的 `--patch` 文件——插件命令已经完成这件事,重复装配会明确报错。
|
|
74
73
|
|
|
75
|
-
##
|
|
74
|
+
## 升级
|
|
76
75
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
76
|
+
```sh
|
|
77
|
+
dsh plugin --profile web update dsh-toolbox-ui
|
|
78
|
+
```
|
|
80
79
|
|
|
81
|
-
|
|
82
|
-
- **侧栏底部「MCP」**:展开态在「设置」上方,侧栏收起成 56px 轨道时只剩图标。
|
|
80
|
+
面板顶部有新版时会显示可关闭的提示条,点「升级」走 DSH 官方的 pluginManager。
|
|
83
81
|
|
|
84
|
-
|
|
82
|
+
> ⚠️ **1.6.1 及更早的版本不会提示 1.6.2 及之后的新版。** 它们的更新检查读的是本仓库的 release feed,而那条 feed 的 latest 被另一条产品线、即已冻结在 1.5.5 的旧包占着,于是永远显示「已是最新」。这个缺陷在 1.6.2 修掉了(改成查**本包在 npm 上的 latest**),修复只能装在新版里——所以请**手动升一次**,之后就恢复正常:
|
|
83
|
+
>
|
|
84
|
+
> ```sh
|
|
85
|
+
> dsh plugin --profile web update dsh-toolbox-ui
|
|
86
|
+
> ```
|
|
87
|
+
>
|
|
88
|
+
> 仍装着旧包 `dsh-mcp-manager-ui`(≤1.5.3)的话走**迁移**:面板点「升级」升到 1.5.5,再点「迁移」即可(它会装本包、卸掉旧包),详见[安装与升级](docs/installation.md)。
|
|
85
89
|
|
|
86
|
-
|
|
90
|
+
## 快速上手
|
|
87
91
|
|
|
88
|
-
|
|
92
|
+
**打开面板**:右下角悬浮按钮,或侧栏底部「工具箱」。面板浮在会话之上,按 Esc 或点「关闭」收起,不影响会话。
|
|
89
93
|
|
|
90
|
-
|
|
94
|
+
**两个作用域**:
|
|
91
95
|
|
|
92
96
|
| 标签页 | 存哪 | 谁可见 | 改动何时生效 |
|
|
93
97
|
|---|---|---|---|
|
|
94
98
|
| 全局 | Web profile 的 `cordis.patch.yml` | 所有项目 | DSH 热加载,通常立即生效 |
|
|
95
|
-
| 某项目 | 该项目 `.dsh/mcp.json` | 只该项目会话 |
|
|
99
|
+
| 某项目 | 该项目 `.dsh/mcp.json` | 只该项目会话 | **写盘即生效**,不需重开会话或重启 Host |
|
|
96
100
|
|
|
97
101
|
`serverName` 按作用域判重:不同项目之间、全局与项目之间**可以同名**,各自独立连接;同一作用域内不能重名。
|
|
98
102
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
在列表行或详情页里:
|
|
102
|
-
|
|
103
|
-
- **开关**:启用 / 禁用(全局写 profile 补丁的 `disabled`,项目写 `.dsh/mcp.json`);
|
|
104
|
-
- **重连**:全局条目重载 loader 条目;项目连接会拆掉旧连接、按当前配置重建并重新投射给存活会话(`mcp-client` 的重连预算耗尽后必须靠它恢复);
|
|
105
|
-
- **编辑 / 移除**:移除只影响当前作用域;
|
|
106
|
-
- **屏蔽**(项目页里对全局 MCP):写 `exclude`,该项目的新会话不再看到它——全局实例仍在跑,所以不影响其他项目。
|
|
107
|
-
|
|
108
|
-
### 添加 MCP
|
|
109
|
-
|
|
110
|
-
三条路,都从面板顶部工具栏进:
|
|
111
|
-
|
|
112
|
-
1. **添加 MCP**:表单填 `command`/`args`/`env`/`cwd`(stdio)或 `url`/`headers`(HTTP),可设调用超时、启动失败策略与重连策略;常用服务器有预设模板可一键套用。
|
|
113
|
-
2. **导入 JSON**:粘贴其他客户端的配置,先预览再写入。支持「合并(同名更新)」与「替换」,字段映射与限制见 [JSON 导入](docs/json-import.md)。
|
|
114
|
-
3. **内置 MCP**:勾选未配置的项一次装好(Exa、Tavily、Firecrawl、Chrome DevTools、Playwright)。前三项有免密额度、不需要本地依赖;后两项是本地工具,需要 Node.js 与浏览器。已配置的项只识别并跳过,不会覆盖。
|
|
115
|
-
|
|
116
|
-
### 工作区之间复制与导出
|
|
117
|
-
|
|
118
|
-
项目标签页里,「此项目的 MCP」标题右侧有两个入口(都只作用于当前项目):
|
|
119
|
-
|
|
120
|
-
- **复制到…**:勾选要搬的 MCP(默认全选),选一个目标工作区。界面会先把这次的结果算给你看——**新增 / 覆盖 / 跳过**哪些条目(切换「跳过 / 覆盖」时立即重算),确认后才写过去。复制在宿主内完成,配置与凭据不经过浏览器。目标已有同名条目时**默认跳过**(保留目标现有配置),也可以显式选「覆盖目标同名」。结果会如实说出哪几条新增、哪几条覆盖、哪几条被跳过——不会只报一句「已复制」。目标工作区的 `exclude`(屏蔽了哪些全局 MCP)不跟着搬:那是那个项目自己的意图,不是配置数据。
|
|
121
|
-
- **导出**:把本项目配置导出成 JSON(与 `.dsh/mcp.json` 同格式),可复制或下载成文件。用于备份、跨机器迁移或分享给同事。**导出内容是完整配置**:字面写死的凭据(URL 里的 token、字面 header / env 值)会原样出现在里面,请按密钥对待;用 `${VAR}` 引用的位置保持引用写法,不会被解析成明文。这份文件可以直接放进目标工作区的 `.dsh/mcp.json`,也可以用「导入 MCP」粘贴回来(粘贴只读 `mcpServers`,`exclude` 需要手动设)。
|
|
122
|
-
|
|
123
|
-
目标工作区必须在 DSH 里注册过(也就是出现在面板顶部标签里的那些)——「复制到…」不接受任意目录,这条限制在 Host 侧强制,不只是界面不显示。
|
|
124
|
-
|
|
125
|
-
### 看工具与敏感值
|
|
126
|
-
|
|
127
|
-
详情页列出该 MCP 当前注册的工具;展开可看完整输入 Schema。凭据类字段默认掩码,点眼睛图标会向 Host 读取**有效运行值**(已解析过的环境变量)并临时显示,再点一次恢复;已显示的值可一键复制。编辑时若没实际改动输入,保存仍保留原来的引用写法,不会把密钥写回配置文件。
|
|
128
|
-
|
|
129
|
-
## 配置生效时机(重要)
|
|
130
|
-
|
|
131
|
-
| 作用域 | 修改后何时生效 |
|
|
132
|
-
|---|---|
|
|
133
|
-
| 全局 | DSH 热加载,通常立即生效(含运行中的会话) |
|
|
134
|
-
| 项目 | **写盘即生效**:新增立刻挂上存活会话、删除立刻撤掉工具、改动就地重载连接(工具名不变) |
|
|
135
|
-
|
|
136
|
-
项目 MCP 由本项目所有会话共用一份连接,配置写在 `.dsh/mcp.json`。面板保存的那一刻就会对齐到正在运行的会话,**不需要重开会话,也不需要重启 Host**;手工编辑该文件则在**下一次会话挂载**时被采纳。
|
|
137
|
-
|
|
138
|
-
> **连接跟配置走,不跟会话走**:最后一个会话结束不会拆掉连接,它只进入空闲等待,下一次会话直接复用——这样"要用的时候"它已经就绪(这也是宿主自己的契约:工具必须在首轮之前出现)。两个旋钮写在 server 条目里:`idleTimeoutMs`(空闲保留多久,默认 5 分钟,`0` = 永不回收)与 `readyTimeoutMs`(挂载时等就绪的总预算,默认 5s,`0` = 不等)。字段速查与边界见 [设计与限制](docs/design.md#项目级专有字段dshmcpjson-里每个-server-可写)。
|
|
139
|
-
>
|
|
140
|
-
> **状态怎么看**:项目行把两件独立的事分开说,不合成一个状态。
|
|
141
|
-
> - **连接在不在**:`已连接 · 当前无会话使用(连接保留,下次直接用)` / `已连接 · N 个会话在用` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`。
|
|
142
|
-
> - **几个会话在用**:见上一行的 `N 个会话在用`;不再出现「待会话挂载」那种把两者压成一句、容易被读成"还没连上"的写法。
|
|
143
|
-
>
|
|
144
|
-
> **重连是必需出口**:mcp-client 的自动重连有次数上限,耗尽后它会注销工具并停止,只能靠重载配置或重启宿主恢复(它的 README 明写)。项目 MCP 又不是常驻服务,所以面板的「重连」按钮会拆掉旧连接、按当前配置重建,并重新投射给存活会话。
|
|
103
|
+
**加 MCP**:面板顶部「添加 MCP」填表单,「导入 MCP」粘贴其他客户端的配置(先预览再写入)。常用服务器有预设模板。
|
|
145
104
|
|
|
146
105
|
## 常见问题
|
|
147
106
|
|
|
148
|
-
|
|
149
|
-
那个 MCP 被禁用了,所以它没有注册任何工具。在面板里点「启用」即可(全局会写 profile 补丁并热加载,项目写 `.dsh/mcp.json`、写盘即生效)。
|
|
107
|
+
**项目里的改动什么时候生效?** 保存的那一刻就对齐到正在运行的会话:新增立刻挂上存活会话、删除立刻撤掉工具、改动就地重载连接——不需要重开会话,也不需要重启 Host。手工编辑 `.dsh/mcp.json` 则在**下一次会话挂载**时被采纳。
|
|
150
108
|
|
|
151
|
-
|
|
152
|
-
三类是不同的事,详情页会给出具体原因:**挂载失败** = **会话挂载阶段**(`agent/created` 监听器)就没挂上(变量求值为空、`failOnStartupError` 下启动失败、工具注册被拒);**连接失败** = `mcp-client` 连不上或重连耗尽(原因取自它的日志);**作用域隔离失败** = 连接正常但工具不在共享作用域层(宿主里出现了两份 `@deepseek-ai/dsh-scope`)。排查与原理见 [设计与限制](docs/design.md#连接状态语义)。
|
|
109
|
+
**连接跟配置走,不跟会话走。** 最后一个会话结束不会拆掉连接,它只进入空闲等待,下一次会话直接复用——「要用的时候」它已经就绪。两个旋钮写在 server 条目里:`idleTimeoutMs`(空闲保留多久,默认 5 分钟,`0` = 永不回收)与 `readyTimeoutMs`(挂载时等就绪的总预算,默认 5s,`0` = 不等)。字段速查见[设计与限制](docs/design.md#项目级专有字段dshmcpjson-里每个-server-可写)。
|
|
153
110
|
|
|
154
|
-
|
|
155
|
-
它们把两件独立的事分开说:**连接在不在** —— `已连接 · 当前无会话使用(连接保留,下次直接用)`(最后一个会话结束了,连接按空闲策略留着)/ `已连接 · N 个会话在用 · M 工具` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`;**几个会话在用** —— 就是那句里的 `N 个会话在用`。旧版本的「待会话挂载」正是把这两件事压成一句,所以容易被读成"还没连上"。
|
|
111
|
+
**项目行那些状态文案是什么意思?** 它们把两件独立的事分开说:**连接在不在**(`已连接 · 当前无会话使用(连接保留,下次直接用)` / `已连接 · N 个会话在用` / `连接中…` / `连接失败` / `尚未建立连接(新会话自动挂载)`)与**几个会话在用**——不再有「待会话挂载」那种把两者压成一句、容易被读成「还没连上」的合成状态。
|
|
156
112
|
|
|
157
|
-
|
|
158
|
-
从 npm 装的直接 `dsh plugin --profile web update dsh-toolbox-ui` 就会升小版本,也可以直接点面板提示条上的「升级」(同一件事,免去敲命令)。面板的提示条只查 GitHub Releases、每天最多一次、可关闭、不会自己动;固定 tag 安装的用户不会自动跨版本,需要用新 tag 重新 `add`(见 [安装与升级](docs/installation.md))。
|
|
113
|
+
**面板显示「已禁用」,模型却报 `unknown tool "mcp__xxx__…"`?** 那个 MCP 被禁用了,所以它没有注册任何工具。在面板里点「启用」即可。
|
|
159
114
|
|
|
160
|
-
|
|
161
|
-
不会。全局改动只动 profile 补丁里由 `@deepseek-ai/dsh-mcp-client` 声明、且由本插件管理的条目,保留其他插件条目、注释与 `!!js` 表达式;导入「替换」也只替换这一部分,不会删除其他 bundle 或 Agent preset 自带的 MCP。
|
|
115
|
+
**「挂载失败」「连接失败」「作用域隔离失败」怎么区分?** 三件不同的事:**挂载失败**=会话挂载阶段就没挂上;**连接失败**=`mcp-client` 连不上或重连耗尽;**作用域隔离失败**=连接正常但工具不在共享作用域层。详情页会给具体原因,排查见[设计与限制](docs/design.md#连接状态语义)。
|
|
162
116
|
|
|
163
|
-
|
|
164
|
-
卸载插件不会删除 profile 里已有的 `@deepseek-ai/dsh-mcp-client` 条目;项目的 `.dsh/mcp.json` 也留在原处(它本来就是普通 JSON 文件)。
|
|
117
|
+
**会碰到我的其他配置吗?** 不会。全局改动只动由 `@deepseek-ai/dsh-mcp-client` 声明、且由本插件管理的条目,保留其他插件条目、注释与 `!!js` 表达式;卸载也不会删除你已有的 MCP 条目与项目的 `.dsh/mcp.json`。
|
|
165
118
|
|
|
166
119
|
## 兼容性
|
|
167
120
|
|
|
@@ -171,30 +124,29 @@ dsh plugin --profile web remove dsh-toolbox-ui
|
|
|
171
124
|
| Node.js | DSH 自带/支持的运行时 |
|
|
172
125
|
| 平台 | Windows;Linux/macOS 使用同一 DSH Web 契约 |
|
|
173
126
|
|
|
174
|
-
只支持 0.1.5 起(更早的版本缺少「按注册作用域判 `serverName` 唯一性」与「setup 传入 agent
|
|
127
|
+
只支持 0.1.5 起(更早的版本缺少「按注册作用域判 `serverName` 唯一性」与「setup 传入 agent」两个能力),不为旧版本保留降级分支。
|
|
175
128
|
|
|
176
129
|
## 开发
|
|
177
130
|
|
|
178
131
|
```sh
|
|
179
|
-
npm test
|
|
180
|
-
dsh
|
|
181
|
-
dsh web # 起 Web 做真实操作验证
|
|
132
|
+
npm test # 全部测试(含真机集成用例:真 cordis / dsh-tools / dsh-scope / dsh-mcp-client + 真 stdio MCP 子进程)
|
|
133
|
+
dsh web # 起 Web 做真实操作验证
|
|
182
134
|
```
|
|
183
135
|
|
|
184
|
-
`npm test` 里除替身用例(验证插件内部自洽)外,还有一组**真机集成用例**:真 `cordis` + 真 `dsh-tools` + 真 `dsh-scope` + 真 `dsh-mcp-client` + 一个真 stdio MCP 子进程,覆盖「同项目两个会话共用一份连接、工具投射进会话层、不泄漏到全局、子进程随最后一个会话退出」。CI(push 到 main / PR,以及推 tag 发版)跑的是同一条门槛,发版流程见 [安装与升级](docs/installation.md#发布流程维护者)。
|
|
185
|
-
|
|
186
136
|
## 文档
|
|
187
137
|
|
|
188
|
-
- [安装与升级](docs/installation.md)
|
|
189
|
-
- [
|
|
190
|
-
- [
|
|
138
|
+
- [安装与升级](docs/installation.md) —— 三种安装方式、发布流程、故障排查
|
|
139
|
+
- [技能管理](docs/skills.md) —— 作用域与遮蔽、启停、调用权限、技能市场
|
|
140
|
+
- [JSON 导入](docs/json-import.md) —— 字段映射与限制
|
|
141
|
+
- [设计与限制](docs/design.md) —— 共享连接模型、连接状态语义、已知限制、依赖细节
|
|
191
142
|
- [DeepSeek Harness 官方插件发布指南](https://github.com/deepseek-ai/deepseek-harness/blob/master/docs/user/develop/basic/publish.md)
|
|
192
143
|
|
|
193
|
-
##
|
|
144
|
+
## 友情链接
|
|
194
145
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
146
|
+
<p align="center">
|
|
147
|
+
<a href="https://linux.do/" title="LINUX DO"><img src="docs/images/linux-do-logo.svg" alt="LINUX DO" width="44" height="44"></a><br>
|
|
148
|
+
<a href="https://linux.do/">LINUX DO</a>
|
|
149
|
+
</p>
|
|
198
150
|
|
|
199
151
|
## License
|
|
200
152
|
|