@hyzyn/dsh-plugin-kit 0.1.37 → 0.1.39

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.
Files changed (3) hide show
  1. package/README.en.md +126 -273
  2. package/README.md +82 -253
  3. package/package.json +5 -5
package/README.en.md CHANGED
@@ -11,344 +11,197 @@
11
11
   
12
12
  <img src="https://img.shields.io/npm/v/@hyzyn%2Fdsh-all?style=flat-square&label=npm" alt="npm">
13
13
  &nbsp;
14
+ <img src="https://img.shields.io/npm/dt/@hyzyn%2Fdsh-all?style=flat-square&label=downloads" alt="Downloads">
15
+ &nbsp;
14
16
  <img src="https://img.shields.io/badge/license-Apache--2.0-blue?style=flat-square" alt="License">
15
17
  </p>
16
18
 
17
19
  Repo gates: `pnpm typecheck` / `pnpm build` / `pnpm test` / `pnpm aggregate`.
18
20
 
19
21
  <p align="center">
20
- <strong>The plugin family for the DeepSeek Harness (DSH) Web GUI</strong><br>
21
- <em>Environment variables · MCP servers · Prompt · Profile · RSS · Global search · Codegraph · Terminal panel · Container panel · Plugin scaffolding</em>
22
+ <strong>A plugin family for the DeepSeek Harness (DSH) Web GUI</strong><br>
23
+ <em>Environment · MCP servers · Prompt · Profile · RSS · Global search · Codegraph · Terminal panel · Container panel · Scaffolding</em>
22
24
  </p>
23
25
 
24
26
  <p align="center">
25
27
 
26
- [What It Is](#what-it-is) · [Feature Plugins](#feature-plugins) · [Quick Start](#quick-start) · [Developing a New Plugin](#developing-a-new-plugin) · [FAQ](#faq) · [Known Limitations](#known-limitations) · [Contributing](#contributing)
28
+ [What it is](#what-it-is) · [Packages](#packages) · [Quick start](#quick-start) · [Writing a new plugin](#writing-a-new-plugin) · [Documentation map](#documentation-map) · [Contributing](#contributing)
27
29
 
28
30
  </p>
29
31
 
30
- ## What It Is
32
+ ## What it is
31
33
 
32
- dsh-plugin-kit is a general-purpose plugin collection for the DeepSeek Harness (DSH) Web GUI: MCP server configuration, Profile management, RSS / news aggregation, global search, Codegraph integration, a terminal panel, a Docker container panel (containers and images on the local or an SSH host, read-only by default), environment variable / secret management, and Prompt management, plus a one-command scaffolding tool for generating new plugins. Everything mounts into `dsh web` through the official profile mechanism, so no DSH source changes are needed. Install the plugins individually, or install everything at once with the aggregate package.
34
+ dsh-plugin-kit is a general-purpose plugin collection for the DeepSeek Harness (DSH) Web GUI.
35
+ Every plugin mounts through the official profile mechanism — **DSH itself is never patched** —
36
+ and you can install them one by one or all at once with the aggregate package.
33
37
 
34
- ![SFTP dual pane: local left / remote right, inline ⇨/⇦ server-side streaming transfer](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dual.png)
38
+ ![SFTP dual pane: local on the left, remote on the right, inline transfer](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dual.png)
35
39
 
36
- ![Terminal panel: the sidebar entry opens a multi-tab xterm.js terminal](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty.png)
40
+ ![Docker container panel: docked as a sidebar tab next to the conversation](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-docker-dock.png)
37
41
 
38
- | Capability | Stock dsh web | dsh-plugin-kit family |
42
+ | Capability | Plain `dsh web` | The dsh-plugin-kit family |
39
43
  | --- | --- | --- |
40
- | MCP servers | Manual patch / CLI | Visual card + connection test + hot reload after saving |
41
- | Profile management | CLI | Visual create / copy / rename / delete |
42
- | RSS aggregation | None | Multiple sources + daily “Today’s Worth Reading” digest + optional AI summaries (follows the host default model, zero config) |
43
- | Global search | Session titles/content only | Unified sidebar full-text search over historical sessions |
44
- | Codegraph integration | None | Code-graph card: index status / symbol search / callers-callees-impact / one-click sync-index |
45
- | Terminal panel | None | Sidebar “Terminal” entry + xterm.js modal: multi-tab real PTY terminal (vim / htop / dev servers), cwd follows session, hot-reload config |
46
- | Docker container panel | None | Sidebar “Containers” entry + multi-target (local / SSH) container list with search and state filter, start / stop / remove, details, logs (snapshot + **live follow via SSE**), resource usage (snapshot + **live follow with sparklines**), a **Compose project view with merged logs**, a **read-only multi-target overview**, image list plus details (layers / build history), a **`docker pull` progress stream**, and image remove / dangling prune; **read-only by default**, mutations and exec gated behind explicit switches; `docker_*` agent tools |
47
- | Environment variables | CLI / manual config | Web GUI card, saves directly into `process.env` |
48
- | Prompt management | Manual config | Visual editing + versioning / A/B testing / export & sharing |
49
- | Plugin development | Hand-written boilerplate | `pnpm create-plugin` scaffolding + `@hyzyn/dsh-kit` type helpers and host-side shared utilities (HTTP fence / managed blocks / `!!js` expressions) |
50
-
51
- ## Feature Plugins
52
-
53
- ### MCP Server Configuration (@hyzyn/dsh-mcp)
54
-
55
- - **What it does**: add MCP servers to DSH. After saving, they hot-load into `mcp__<server name>__<tool name>` tools within 1–2 seconds, so models can call them directly without restarting.
56
- - **How to use**: open Settings → Plugins → “MCP Server Configuration” → add a server (choose transport) → (it is recommended to click “Connection Test” first) → save.
57
- - **Supports**: two transports — stdio (local subprocess, e.g. `npx -y @modelcontextprotocol/server-filesystem`) and streamable-http (remote service); `js:` prefixed expressions (e.g. `js:process.env.GITHUB_TOKEN`); enable/disable, edit, delete; status badges.
58
- - **Where it is stored**: the managed block of `~/.dsh/cordis.patch.yml`.
59
- - **Note**: **do not** manually append plugin lines to this file, otherwise DSH may fail to start with `duplicate loader entry id`.
60
-
61
- ![MCP server configuration plugin](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-mcp.png)
62
-
63
- ### Profile Management (@hyzyn/dsh-profile)
64
-
65
- - **What it does**: visually view all DSH profiles under `~/.dsh/profiles`, with create, copy, rename, and delete operations for maintaining multiple DSH environments.
66
- - **How to use**: open Settings → Plugins → “Profile Management” → view the profile list → create / copy / rename / delete; set a port for each profile and copy a startup command with `--port`.
67
- - **Supports**: initialization status, bundle layer and dependency display; create from basic / `web` / `headless` templates; copy excludes `node_modules` and lock files and automatically installs dependencies; rename; port configuration and startup command copy.
68
- - **Where it is stored**: directly manages the `~/.dsh/profiles/<name>` directory.
69
- - **Note**: deletion is recursive — confirm twice before operating; the built-in `web` default profile cannot be deleted, while `headless` can be deleted; after creating a new profile, dependencies are installed on demand when you first run `dsh plugin --profile <name> add ...`.
70
-
71
- ![Profile management configuration UI](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-profile.png)
72
-
73
- ![Example of starting a headless profile from the command line](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-profile-example-headless1.png)
74
-
75
- ### RSS / News Aggregation (@hyzyn/dsh-rss)
76
-
77
- - **What it does**: subscribe to multiple RSS / Atom sources and automatically compile a daily “Today’s Worth Reading” Markdown digest, injected into systemPrompt for the model to reference.
78
- - **How to use**: after installing, click “Today’s Worth Reading” in the sidebar below “New Session” to view news directly; you can also open Settings → Plugins → “RSS / News Aggregation” to toggle built-in channels, add custom channels (validated on save), search and one-click add feeds from the [awesome-rsshub-routes](https://jackyst0.github.io/awesome-rsshub-routes/) catalog, and manage categories and aggregation settings. Saving refreshes the digest automatically.
79
- - **Built-in channels**: Ruanyifeng, sspai, Solidot, Hacker News, Juejin, ITHome, 36Kr (36Kr’s official feed is blocked by anti-bot protection, so the built-in entry uses a third-party RSSHub mirror) — check to show, uncheck to stop fetching.
80
- - **Custom channels**: enter any RSS / Atom URL; it is validated with a real fetch on save — homepages, non-feed pages, and empty feeds are rejected with a clear error and not saved.
81
- - **Source catalog**: ships the awesome-rsshub-routes curated catalog (official RSS and RSSHub routes, 98 feeds / 12 categories), searchable and filterable by category with one-click add to custom channels; bundled snapshot silently refreshes from the upstream OPML every 12 hours at runtime (falling back to the snapshot when offline).
82
- - **Categories**: a channel’s category is picked from the category list, and the digest (Markdown, systemPrompt, modal) is grouped by category; categories in use are merged into the list automatically on save.
83
- - **AI summaries (optional)**: once enabled in the card, each digest item gets a one-sentence Chinese summary generated by the host’s configured default model (no API key needed; you can also pair a custom provider / model in the card). Results are cached per item for 30 days so regenerating does not re-bill; a failed item falls back to the truncated original text without blocking the rest. Summaries flow into the Markdown digest, the modal, search, and systemPrompt.
84
- - **Supports**: RSS 2.0 / Atom parsing, deduplication, per-source item limits, daily scheduled generation, startup catch-up generation, custom output directory, and the built-in channel library.
85
- - **Where it is stored**: `~/.dsh/rss-digest/YYYY-MM-DD.md` (override with `DSH_RSS_DIGEST_DIR`).
86
- - **Note**: the first startup will fetch feeds over the network; unreachable sources are listed in the digest’s “fetch failed” section and do not block the remaining sources. With AI summaries enabled, generation time depends on model responses (failed items fall back instead of blocking).
87
-
88
- ![RSS / News Aggregation settings card](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-setting.png)
89
-
90
- ![Sidebar “Today’s Worth Reading” modal: grouped by category, each source links to its website](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-view.png)
91
-
92
- ![Query today’s news: ask the model for “Today’s Worth Reading” and it cites the daily digest](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-query-news.png)
93
-
94
- ### Global Search (@hyzyn/dsh-search)
95
-
96
- - **What it does**: adds a “Global Search” entry to the Web GUI sidebar (⌘/Ctrl+K also opens it) that presents a command-palette window: grouped rows for recent sessions, full-text session hits, Prompts, MCP tools, quick actions, and settings sections.
97
- - **How to use**: click the sidebar search box or press ⌘/Ctrl+K — the palette **opens with content already in it** (recent sessions + quick actions + settings sections, rendered locally with no request); typing filters local candidates instantly while host full-text hits stream in. ↑/↓ select, ↵ opens, esc closes; ⌥1-9 opens the Nth recent session, and ⌥N / ⌥O / ⌥, trigger New session / Open folder / Open settings. Clicking a session result opens it and tries to locate the matching text; Prompt and MCP tool rows jump to their settings cards; settings sections jump to the corresponding section of the settings dialog.
98
- - **Supports**: full-text session search via DSH’s built-in `sessionQuery` plus instant title candidates from the client session list; settings sections enumerated live from the client slot registry (`settings.section`, so third-party sections such as “Skins” or “Pets” are listed too, in the same order as the settings navigation); Prompts read from the `~/.dsh/prompts.yml` managed block; MCP tools enumerated by the `mcp__` prefix with their server shown; keyword highlighting; configurable result limits.
99
- - **Where it is stored**: no separate config.
100
- - **Note**: requires the host `sessionQuery` service; if absent, session search returns an empty list. If the `session-query` full-text index is configured with `openAt: "never"`, session search automatically degrades to per-session scanning; session results are filtered to currently visible/jumpable sessions. “New session” reuses the GUI’s own `uiWorkspace.startSession()`; “Open folder” is hidden when no directory-picker plugin is installed.
101
-
102
- ![Global search plugin](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-search.png)
103
-
104
- ![Global search results (recent sessions / session hits / Prompt / MCP tools / settings)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-search-query.png)
105
-
106
- ### Codegraph Integration (@hyzyn/dsh-codegraph)
107
-
108
- - **What it does**: code-graph integration — the “Codegraph” card under Settings → Plugins shows index status, symbol search, callers / callees / impact, and one-click sync / index. On install it automatically injects a CodeGraph usage guideline into systemPrompt so the model prefers `codegraph_explore` / `codegraph explore` over grep / read in indexed projects.
109
- - **How to use**: open Settings → Plugins → “Codegraph” → view index status, search symbols, click a result to inspect source and call chains / impact, or run Sync / rebuild index manually.
110
- - **Supports**: index status (version, file / symbol / edge counts, last indexed time, pending changes); symbol search with node / callers / callees / impact details; **the default path follows the active session’s workspace directory** (switches when you switch projects; a manual input temporarily overrides it); one-click incremental sync and full rebuild.
111
- - **MCP integration (on by default)**: DSH’s MCP client does not declare roots, so `codegraph serve --mcp` can only look upward from its working directory for `.codegraph/` — when the host starts in the home directory, `mcp__codegraph__*` calls fail with “No CodeGraph project is loaded”. This plugin manages the codegraph MCP server row in `~/.dsh/cordis.patch.yml` and aligns its cwd with the default project path (the card’s “Set as default project” switches it in one click and the MCP server hot-restarts on save); a row already configured in the MCP card only gets its cwd filled in, other fields are left untouched. Disable with `mcpIntegration: false`.
112
- - **Where it is stored**: the index lives in the project’s `.codegraph/` directory (created by `codegraph index`); the default path and the switches persist in this plugin entry’s profile configuration, written into the current profile’s `cordis.patch.yml` user layer.
113
- - **Note**: the target project needs a Codegraph index first; unindexed projects return guidance to fall back to regular tools. Indexing / rebuilding are local CLI operations that consume real disk and CPU.
114
- - **Compatibility and tuning**: current baseline DSH `0.1.7-rc.1` (declares `peerDependencies: @deepseek-ai/dsh ^0.1.7-rc.1`) + codegraph CLI `1.5.0`; the CLI commands and flags used are listed in the package README. For large repositories, raise `indexTimeoutMs` (default 600s; `cliTimeoutMs` covers query commands, default 60s), and enable `indexForce` when the CLI refuses to index a home directory / filesystem root.
115
-
116
- ![Codegraph settings card](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-codegraph.png)
117
-
118
- ### Terminal Panel (@hyzyn/dsh-tty)
119
-
120
- - **What it does**: adds a “Terminal” entry to the Web GUI sidebar that opens a large modal with an embedded xterm.js interactive terminal (real PTY via node-pty) and multi-tab support, capable of running arbitrary commands and TUI programs (vim / htop / dev servers). It also does **direct SSH to remote hosts** (connection book / host-key pinning / automatic reconnect / port-forward tunnels) and **SFTP file transfer** — either the single-pane dialog or the “local left / remote right” dual pane, with upload / download / rename / delete.
121
- - **How to use**: install, then restart `dsh web`; click “Terminal” in the sidebar → the first terminal is created automatically (default `$SHELL`) → use “+” in the tab bar for a new tab (local terminal / SSH connection book / SSH connection…) and ✕ to close; new tabs default to the current DSH session’s working directory; SSH tabs expose SFTP and tunnel entries in their connection bar; Ctrl+F searches inside the terminal, and the toolbar offers clear / copy / paste.
122
- - **Two SFTP layouts (configurable)**: `dialog` — a single pane with remote directory browsing, multi-select / drag-and-drop upload (recursive folders), download, rename, delete; `dual` — local pane on the left, remote on the right, where the inline `⇨ / ⇦` buttons stream both paths through the host server (recursive folders, same-name overwrite, bytes never pass through the browser).
123
- - **Minimize (state folded into the sidebar entry)**: clicking outside the modal, pressing Esc, or the title-bar “—” collapses the panel while PTY sessions and their output buffers stay alive; the sidebar “Terminal” entry then shows a session-count badge and a status dot, and clicking it brings the panel back. Only the floating bar’s ✕ or the title-bar ✕ really closes it and ends every session.
124
- - **Supports**: multi-tab sessions (multiple sessions per connection); working directory follows the current session; TERM=xterm-256color injection (TUI apps don’t degrade); automatic reconnect after a drop (session keep-alive + output-buffer replay); SSH agent / key / password auth with `env:VAR` secret references that never touch disk; port-forward tunnels (-L / -R, kept alive by the host); downstream backpressure protection; loopback trust fence; concurrency cap (default 4); settings hot-reload; agent tools (`tty_list` / `tty_capture` / `tty_screen` / `tty_expect` / `tty_send` / `sftp_*` / `tunnel_list`).
125
- - **Where it is stored**: this plugin entry’s profile configuration, written into the current profile’s `cordis.patch.yml` user layer — the “Settings → Plugins → Terminal Panel” card reads and writes it.
126
- - **What 0.19.0 fixed**: 48 audited defects — SFTP overwrites now go through a temp part + atomic rename (a failed upload no longer destroys the target), in-flight spawns no longer leave zombie sessions, importing known_hosts no longer raises a false “man-in-the-middle”, plaintext passwords never reach browser storage, force-killing a local PTY no longer crashes the host on Windows, and `tty_capture{last}` / `tty_expect` work again on modern Linux (bash ≥4.4). See `packages/tty/DEFECTS.md` for the list and index.
127
- - **Note**: resize relies on DSH’s internal terminal-handle shape (known limitation); output is a UTF-8 text stream, so `cat`-ing binary files shows replacement characters. See `packages/tty/README.md` for details.
128
-
129
- ![Terminal panel: the sidebar entry opens a multi-tab xterm.js terminal with a compact two-row header (tabs + SSH connection bar)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty.png)
130
-
131
- ![SFTP dual pane: local left / remote right, inline ⇨/⇦ server-side streaming transfer (sftpStyle=dual)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dual.png)
132
-
133
- ![SFTP single-pane dialog: remote directory browsing with download / rename / delete](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dialog.png)
134
-
135
- ![Terminal panel settings card: shell / TERM / SFTP style / concurrency cap, saved and applied hot](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-setting.png)
136
-
137
- ### Docker Container Panel (@hyzyn/dsh-docker)
138
-
139
- - **What it does**: adds a “Containers” entry to the Web GUI sidebar for inspecting containers on the **local machine or an SSH host** — list with state / health / ports / compose project, a **read-only multi-target overview**, a **Compose project view (project → service → containers, plus project-level merged logs)**, container details, log tails, resource usage (**live follow + mini sparklines**), and images (list plus details: layers / build history). Once you explicitly enable the switches, it can also start / stop / remove containers, pull / remove / prune images, and run a one-shot `docker exec`.
140
- - **How to use**: install, restart `dsh web`, then click “Containers” in the sidebar → pick a target (local / SSH) → the container list supports search and state filtering → open a card for details / logs / stats, or start / stop / remove (requires “allow mutations”); manage targets and switches under Settings → Plugins → “Docker Container Panel”, saved and applied hot.
141
- - **Terminal button**: with tty ≥ 0.15.0 installed, the first icon on a card opens an **in-panel terminal drawer** (tty's `ttyTerminal.mount` embeds the terminal in place, so the panel stays open); with tty 0.14.0 it falls back to opening a new terminal tab and closing the panel, and without tty it copies the command `docker exec -it '<container>' sh` (falls back to copying the command when tty's terminal capability is unavailable).
142
- - **Contextual entry**: with tty ≥ 0.13.0 installed, the SSH tab’s connection bar (next to SFTP) shows a “Containers” button — it opens the panel straight for the host you are connected to (shown whenever the plugin is loaded; the target is resolved at click time by connection-book name or `host:port`, and a missing target shows how to configure it).
143
- - **Targets**: `kind=local` runs the host machine’s docker CLI; `kind=ssh` can **reference a tty connection-book entry by name** (data-level reuse, tty unchanged; inline host/username when tty is not installed) and runs docker on the remote host over an ssh2 exec channel, with TOFU host-key pinning seeded from tty’s existing records.
144
- - **Supports**: container list (`all` includes stopped containers), `docker inspect` details, logs (tail / timestamps / since), **live log streaming** (a FOLLOW toggle backed by SSE `docker logs --follow`, for both local and SSH targets, with auto-scroll and the same filtering/coloring as the snapshot; switches back to snapshot automatically when the container exits), `docker stats` **snapshots and a live stream** (SSE with a 60-point CPU / memory sparkline; this stream never ends on its own, so the front end closes it), a **Compose project view** (grouped by `composeProject` / `composeService`, with project-level logs merged client-side behind a `[service]` prefix), a **container event activity stream** (SSE `docker events` feeding an "Activity" bar in the list plus a 500 ms debounced list refresh), a **read-only multi-target overview** (one screen for every configured target: count cards plus a table of unhealthy / restarting containers, fetched in parallel with per-target failure tolerance and no cross-target actions), **networks and volumes** (lists plus details: subnets / gateways / attached containers, mountpoints / options / labels; removal and prune require `allowMutations`), plus **ephemeral multi-select merged logs from the container list** (2–8 containers), image list plus **image details** (`docker image inspect` layers / size and `docker history` build steps), a **`docker pull` progress stream** (per-layer, over SSE), image remove / dangling prune (requires `allowMutations`), and one-shot exec (exit code plus stdout/stderr); `dockerBin` can be set to `podman`; oversized output is truncated. All four SSE streams (logs / stats / events / pull) share one `openSseStream` foundation (heartbeat, active-stream registry, disconnect cleanup).
145
- - **Security model (important)**: the docker socket is equivalent to root on the target host, so the plugin is **read-only by default** — with `allowMutations` off, start / stop / remove are rejected (HTTP 403 and no agent tool registered); with `allowExec` off, exec is rejected. Container names/IDs pass a whitelist check, commands are always built as argv arrays with single-quote escaping, and passwords / passphrases should use `env:VAR` and are never sent back to the browser.
146
- - **Where it is stored**: this plugin entry’s profile configuration, written into the current profile’s `cordis.patch.yml` user layer (legacy `~/.dsh/settings.yaml` sections were imported once by DSH).
147
- - **Note**: there is no interactive TTY (exec is a one-shot command; use the terminal panel for `docker exec -it`), streaming exists only in the browser panel (the `docker_logs` / `docker_stats` / `docker_image_pull` agent tools keep snapshot semantics), there is no `docker build` / `save` / `load` / `push`, Compose is a read-only view (no `compose up/down`), and the multi-target overview is a **read-only** summary (there are no cross-target actions; start / stop / remove stay per-target); `docker rm` and `docker image rm` are issued without `-f`, so a running container or a referenced image fails with an explanatory hint. See `packages/docker/README.md` for details.
148
-
149
- ### Environment Variables / Secrets Management (@hyzyn/dsh-env)
150
-
151
- - **What it does**: add, edit, or delete environment variables and secrets in the Web GUI. After saving, they are immediately written into the current process’s `process.env`, so both the host and subsequently started child processes can read them without restarting.
152
- - **How to use**: open Settings → Plugins → “Environment Variables / Secrets Management” → add a key-value pair → (check “Secret” for sensitive entries; secret values are never sent back to the browser, and saving with an empty field keeps the stored value) → save.
153
- - **Supports**: plain strings; `js:` prefixed expressions (e.g. `js:process.env.API_KEY`); secret values migrate automatically into the official credentials store `.credentials.yaml` (write-only: the API never sends secrets back, env file keeps only the manifest; existing refs are never overwritten — conflicting entries stay in the env file with a warning).
154
- - **Where it is stored**: the managed block of `~/.dsh/env.yml` (auto-generated; do not edit by hand).
155
- - **Note**: key names may only contain letters, digits, and underscores, and must not be duplicated.
156
-
157
- ![Environment variables / secrets management plugin](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-env.png)
158
-
159
- ### Prompt Management (@hyzyn/dsh-prompt)
160
-
161
- - **What it does**: visually edit systemPrompt. When enabled, its content is injected as a systemPrompt section and takes effect immediately after saving.
162
- - **How to use**: open Settings → Plugins → “Prompt Management” → create/edit a Prompt (multiple versions can be saved) → enable.
163
- - **Supports**: version switching/rollback; A/B testing (choose A/B versions for the same Prompt and randomly match them by weight); export JSON/Markdown, one-click copy & share, import from JSON.
164
- - **Where it is stored**: the managed block of `~/.dsh/prompts.yml`.
165
- - **Note**: each Prompt must have at least one version, and a single version’s content must be ≤ 500KB.
166
-
167
- ![Prompt management plugin](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-prompt.png)
168
-
169
- ## Quick Start
170
-
171
- ### System Requirements
172
-
173
- - DeepSeek Harness installed and `dsh web` starts normally. **The current baseline is DSH `0.1.7-rc.1`**: settings now live in the current profile’s plugin-entry configuration, and compatibility is enforced from `peerDependencies` both before install and at startup; `0.1.6-alpha.2` and earlier are no longer supported.
174
- - Every installable plugin declares `@deepseek-ai/dsh: ^0.1.7-rc.1` in `peerDependencies`. Since DSH 0.1.7-rc.1 that declaration is enforced **before install** (`incompatible-version`) and **at startup** (the row becomes `disabled`), with prereleases participating in range matching. The plugins also keep `dsh.engines.dsh: ">=0.1.7-rc.1"` as a **marketplace display field**: the rc.1 host does not read it (app-boot README: “these checks use peer declarations, not `engines.dsh`”), but the plugin market / community listings still display compatibility from it — it must match the peer floor, otherwise it states something untrue. To admit one exact version combination, write an exemption into the profile’s own `compatibility.json`: `dsh plugin --profile <p> allow-version <pkg@ver> --dsh-version <ver> --accept-risk`. CI enforces this with `node scripts/check-dsh-peers.mjs`, which checks the peer floor, the engines floor and `dsh.manifestVersion`, and can additionally run DSH’s own evaluator via `--app-boot <path>`.
44
+ | MCP servers | edit the patch file / CLI | visual card + connection test + hot reload after saving |
45
+ | Profile management | CLI | visual create / copy / rename / delete |
46
+ | RSS aggregation | none | multi-source subscriptions + a daily digest + optional AI summaries (uses the host’s default model, zero config) |
47
+ | Global search | session titles/content only | one full-text search over past sessions, Prompts, MCP tools and settings panels |
48
+ | Codegraph integration | none | code graph card: index status / symbol search / call chain / impact / one-click sync-index |
49
+ | Terminal panel | none | real xterm.js multi-tab PTY (vim/htop/dev server); native SSH (connection book, host-key pinning, auto reconnect); SFTP single-dialog / dual-pane transfer; `tty_*` / `sftp_*` agent tools |
50
+ | Docker container panel | none | containers / images / Compose / live logs and stats / multi-target overview; **read-only by default**, mutations and exec behind explicit switches; `docker_*` agent tools |
51
+ | Environment variables | CLI / hand-edited config | Web GUI card, written into `process.env` on save |
52
+ | Prompt management | hand-edited config | visual editing + versioning / A/B testing / export & share |
53
+ | Plugin development | boilerplate by hand | `pnpm create-plugin` scaffolding + the `@hyzyn/dsh-kit` shared library |
54
+
55
+ > **Each plugin’s full feature set, screenshots and caveats live in its own README** (table below).
56
+ > This file only covers *what it is* and *what to install*.
57
+
58
+ ## Packages
59
+
60
+ **1 shared library + 10 feature plugins + 1 aggregate package.** How they relate, their dependency
61
+ direction and how they cooperate: [docs/architecture.md](docs/architecture.md) (Chinese).
62
+
63
+ | Package | What it does | Docs |
64
+ |---|---|---|
65
+ | `@hyzyn/dsh-kit` | **Library** (not a plugin): shared host-half utilities — HTTP loopback fence, managed blocks, `!!js` expressions, service access | [README](packages/kit/README.md) · [DEFECTS](packages/kit/DEFECTS.md) |
66
+ | `@hyzyn/dsh-mcp` | MCP server configuration card, hot-reloaded on save | [README](packages/mcp/README.md) |
67
+ | `@hyzyn/dsh-env` | Environment variables / secrets management | [README](packages/env/README.md) |
68
+ | `@hyzyn/dsh-prompt` | systemPrompt editing / versions / A-B testing | [README](packages/prompt/README.md) |
69
+ | `@hyzyn/dsh-profile` | Graphical management of `~/.dsh/profiles` | [README](packages/profile/README.md) |
70
+ | `@hyzyn/dsh-rss` | RSS aggregation → a daily digest | [README](packages/rss/README.md) |
71
+ | `@hyzyn/dsh-search` | Sidebar global search | [README](packages/search/README.md) |
72
+ | `@hyzyn/dsh-codegraph` | Code graph card + MCP management + adoption measurement | [README](packages/codegraph/README.md) · [DEFECTS](packages/codegraph/DEFECTS.md) · [ROADMAP](packages/codegraph/ROADMAP.md) |
73
+ | `@hyzyn/dsh-tty` | Terminal panel (PTY / SSH / SFTP / tunnels) | [README](packages/tty/README.md) · [DEFECTS](packages/tty/DEFECTS.md) · [ROADMAP](packages/tty/ROADMAP.md) |
74
+ | `@hyzyn/dsh-docker` | Docker container panel (local / SSH), read-only by default | [README](packages/docker/README.md) · [DEFECTS](packages/docker/DEFECTS.md) · [ROADMAP](packages/docker/ROADMAP.md) |
75
+ | `@hyzyn/dsh-kit-settings` | Adds a “Plugin configuration” row next to “General settings” | [README](packages/kit-settings/README.md) |
76
+ | `@hyzyn/dsh-all` | Aggregate package: one bundle patch that mounts the 10 plugins above | [README](packages/all/README.md) |
77
+
78
+ ## Quick start
79
+
80
+ ### System requirements
81
+
82
+ - DeepSeek Harness installed and `dsh web` starts normally. **The current baseline is DSH `0.1.7-rc.2`**:
83
+ settings now live in the current profile’s plugin-entry configuration, and compatibility is enforced
84
+ from `peerDependencies` both before install and at startup; `0.1.6-alpha.2` and earlier are no longer
85
+ supported.
86
+ - Every installable plugin declares `@deepseek-ai/dsh: ^0.1.7-rc.2` in `peerDependencies`, enforced
87
+ both **before install** and **at startup**; `dsh.engines.dsh` is kept as a **marketplace display
88
+ field** (it must match the peer floor). Mechanics, what to do when a version is rejected, and how to
89
+ admit an exact combination → [docs/troubleshooting.md § Compatibility](docs/troubleshooting.md#兼容性校验).
175
90
  - No extra requirements for npm installs; installing from this repository requires Node.js >= 22.19 and pnpm 10.
176
91
 
177
- ### Three-Step Setup
178
-
179
- 1. Install the aggregate package: `dsh plugin --profile web add @hyzyn/dsh-all`
180
- 2. Restart `dsh web`; all management cards appear under Settings → Plugins
181
- 3. Open “Settings > Plugins” and use the cards as needed; changes take effect immediately after saving
182
-
183
92
  ### Install from npm (recommended)
184
93
 
185
- The plugins are published to npm (under the `@hyzyn` scope). Install everything with one command — either of these two equivalent options:
186
-
187
94
  ```sh
188
95
  dsh plugin --profile web add @hyzyn/dsh-all # aggregate package
189
96
  dsh plugin --profile web add @hyzyn/dsh-plugin-kit # repo root bundle (mounts the whole family too)
190
97
  ```
191
98
 
192
- After installation, restart `dsh web` and open Settings → Plugins to see all the cards. If you only want one plugin, see “Install a Single Plugin” below.
99
+ **Restart `dsh web`** afterwards; all cards appearing under Settings → Plugins means it worked.
100
+ If a card does not appear, you probably forgot to restart. You can also use
101
+ `dsh --profile web --dump-config` to confirm the plugin configuration layer is mounted.
102
+ For one plugin only, see “Install a single plugin” below.
103
+ Uninstall: `dsh plugin --profile web remove @hyzyn/dsh-all` (or the matching subpackage), then restart.
193
104
 
194
- ### Install from the GitHub Repository (Development / Debugging)
105
+ > **Which configuration entry exists in which version**: DSH ≥ `0.1.6-alpha.2` has **two** entries
106
+ > pointing at the same configuration — the sidebar **“Plugins”** → pick a plugin → its row’s
107
+ > “Configure” (the official two-pane page), and **Settings → “Plugin configuration”** (a row next to
108
+ > “General settings”, provided by `@hyzyn/dsh-kit-settings`).
109
+ > DSH ≤ `0.1.5` uses the cards inside **Settings → Plugins → “Plugin configuration”**.
110
+ > Client halves register all three slot generations (`plugins.row.config`, `settings.kit.item`,
111
+ > `settings.plugin.item`), so one build works on every generation.
195
112
 
196
- The plugin packages are already on npm; installing from the repository is for development and debugging (requires Node.js >= 22.19 and pnpm 10).
197
- The repository root is itself a DSH bundle (`package.json#dsh.bundle.patch`, generated by `pnpm aggregate`),
198
- so `dsh plugin add link:$(pwd)` recognizes and mounts the whole family as one plugin:
113
+ ### Install from the GitHub repository (development / debugging)
114
+
115
+ Requires Node.js >= 22.19 and pnpm 10. The repository root is itself a DSH bundle
116
+ (`package.json#dsh.bundle.patch`, generated by `pnpm aggregate`):
199
117
 
200
118
  ```sh
201
- # 1. Clone the repository
202
119
  git clone https://github.com/hyzyn/dsh-plugin-kit.git
203
120
  cd dsh-plugin-kit
204
-
205
- # 2. Install dependencies and build
206
121
  pnpm install
207
122
  pnpm build
208
123
 
209
- # 3. Link the family into the web profile (the root bundle is equivalent to installing @hyzyn/dsh-all)
210
- dsh plugin --profile web add link:$(pwd)
211
-
212
- # 4. Restart dsh web
124
+ dsh plugin --profile web add link:$(pwd) # the root bundle is equivalent to installing @hyzyn/dsh-all
213
125
  dsh web
214
126
  ```
215
127
 
216
128
  > ⚠️ If the web profile already has `@hyzyn/dsh-all` or any `@hyzyn/dsh-<pkg>` installed, do **not**
217
129
  > add the root bundle (or `packages/all`) again — duplicate plugin rows cause a
218
- > `duplicate loader entry id` error at startup.
219
-
220
- > If you only want one subpackage, replace step 3 with `dsh plugin --profile web add link:$(pwd)/packages/<name>`, e.g. `packages/mcp`.
221
-
222
- > With the `dsh` field declared on the root package, GitHub DSH plugin marketplaces
223
- > (e.g. DSH-Plugins-Marketplace, which detects plugins by the `dsh` field or
224
- > `@deepseek-ai/*` dependencies) now classify this repository as a DSH plugin
225
- > (cordis-plugin) instead of flagging it as "non-plugin".
130
+ > `duplicate loader entry id` error at startup. For one subpackage only, replace the add step with
131
+ > `dsh plugin --profile web add link:$(pwd)/packages/<name>`.
132
+ >
133
+ > With the `dsh` field on the root package, GitHub DSH marketplaces classify this repository as a DSH
134
+ > plugin (cordis-plugin) instead of flagging it as “non-plugin”.
226
135
 
227
- ### Install a Single Plugin
136
+ ### Install a single plugin
228
137
 
229
- If you do not want the whole family, you can install any plugin individually (published on npm, use the package name directly):
138
+ Swap the package name for any entry in the table above (`@hyzyn/dsh-all` → `@hyzyn/dsh-<pkg>`):
230
139
 
231
140
  ```sh
232
- dsh plugin --profile web add @hyzyn/dsh-env # Environment variables / secrets management
233
- dsh plugin --profile web add @hyzyn/dsh-mcp # MCP server configuration
234
- dsh plugin --profile web add @hyzyn/dsh-prompt # Prompt management
235
- dsh plugin --profile web add @hyzyn/dsh-profile # Profile management
236
- dsh plugin --profile web add @hyzyn/dsh-rss # RSS / news aggregation
237
- dsh plugin --profile web add @hyzyn/dsh-search # Global search
238
- dsh plugin --profile web add @hyzyn/dsh-codegraph # Codegraph integration
239
- dsh plugin --profile web add @hyzyn/dsh-tty # Terminal panel
240
- dsh plugin --profile web add @hyzyn/dsh-docker # Docker container panel
141
+ dsh plugin --profile web add @hyzyn/dsh-env # Environment variables / secrets management
142
+ dsh plugin --profile web add @hyzyn/dsh-tty # Terminal panel
143
+ dsh plugin --profile web add @hyzyn/dsh-docker # Docker container panel
241
144
  ```
242
145
 
243
- ### Verify and Uninstall
244
-
245
- After installing, restart `dsh web`; the corresponding card appearing under Settings → Plugins means it worked. You can also use `dsh --profile web --dump-config` to confirm the plugin configuration layer is mounted. If a card does not appear, you probably forgot to restart `dsh web`.
246
-
247
- Uninstall: `dsh plugin --profile web remove @hyzyn/dsh-all` (or the corresponding `@hyzyn/dsh-<package>`), then restart `dsh web`.
146
+ Install failures / missing cards / HTTP 401 or 403 → [docs/troubleshooting.md](docs/troubleshooting.md).
248
147
 
249
- ### Installation Troubleshooting
148
+ Install failures / missing cards / HTTP 401 or 403 → [docs/troubleshooting.md](docs/troubleshooting.md) (Chinese).
250
149
 
251
- <details>
252
- <summary><strong>Expand for common installation problems</strong></summary>
253
-
254
- <br>
255
-
256
- > **Card does not appear?** Restart `dsh web`; make sure you are using the official `dsh-web-app` settings panel (the browser half depends on the core slots service).
257
-
258
- > **No tools appear after saving an MCP server?** Wait 1–2 seconds for HMR; check the status badge and conflict hints in the card; click “Connection Test” before saving.
259
-
260
- > **Getting `duplicate loader entry id`?** Most likely you manually added plugin lines to `~/.dsh/cordis.patch.yml`. Remove the duplicate lines — plugin lines should only be mounted by bundle patches; the managed block is only for server configuration.
261
-
262
- > **`npm install` / `npm view` reports EPERM?** There may be root-owned files in the local `~/.npm` cache (a historical npm bug). Run `sudo chown -R $(id -u):$(id -g) ~/.npm` to fix it. pnpm is not affected.
263
-
264
- </details>
265
-
266
- ## Developing a New Plugin
150
+ ## Writing a new plugin
267
151
 
268
152
  ```sh
269
153
  pnpm create-plugin <name> [id]
270
- # Example: pnpm create-plugin timer → packages/timer (@hyzyn/dsh-timer, plugin id: timer)
271
- # Example: pnpm create-plugin pet-tracker pt → packages/pet-tracker (plugin id: pt)
154
+ # e.g. pnpm create-plugin timer → packages/timer (@hyzyn/dsh-timer, plugin id: timer)
155
+ # e.g. pnpm create-plugin pet-tracker pt → packages/pet-tracker (plugin id: pt)
272
156
  ```
273
157
 
274
- The script copies the `templates/hello` template, replaces the package name and plugin id, and automatically updates the aggregate package. Then:
275
-
276
- 1. Edit `packages/<name>/src/index.ts` to write your plugin logic;
277
- 2. Build and install locally for debugging:
158
+ The script copies the `templates/hello` template, substitutes the package name and plugin id, and
159
+ updates the aggregate package. Then edit `packages/<name>/src/index.ts` and build for local debugging:
278
160
 
279
161
  ```sh
280
162
  pnpm --filter @hyzyn/dsh-<name> build
281
163
  dsh plugin --profile web add link:$(pwd)/packages/<name>
282
164
  ```
283
165
 
284
- ### What a Plugin Package Looks Like (using hello as an example)
285
-
286
- | File / field | Purpose |
287
- | --- | --- |
288
- | `package.json#dsh.bundle.patch` | Points to `cordis.patch.yml`, declaring this package as a bundle patch layer |
289
- | `cordis.patch.yml` | Inserts one line to mount the plugin into the profile lineup |
290
- | `src/index.ts` | Host half: exports a Cordis plugin shaped like `{ name, inject, apply }` |
291
- | `package.json#dsh.client` | Optional: declares the browser half; Web GUI loads it as `/plugins/<id>/client.js` |
292
-
293
- There are two ways to inject services: use `inject: ['tools', 'webServer']` and then access `ctx.tools` directly; or call `ctx.get('tools')` at runtime and check for null. Use schemastery to export a same-name `Config` schema for configuration.
294
-
295
- ## FAQ
296
-
297
- <details>
298
- <summary><strong>I restarted, but there is still no card under Settings → Plugins?</strong></summary>
299
-
300
- A: First make sure the plugin was installed into the `web` profile (the `--profile web` flag), then use `dsh --profile web --dump-config` to confirm the plugin configuration layer is mounted. If it still does not work, see “Installation Troubleshooting” above. Refreshing the page is not enough — restart the `dsh web` process.
301
-
302
- </details>
303
-
304
- <details>
305
- <summary><strong>Changes to plugin code do not take effect?</strong></summary>
306
-
307
- A: Run `pnpm build` again, then restart `dsh web`. If you changed the browser half, you may also need to clear the browser cache or do a hard refresh.
308
-
309
- </details>
310
-
311
- <details>
312
- <summary><strong>No tools appear after saving an MCP server?</strong></summary>
313
-
314
- A: Wait 1–2 seconds for HMR; check the status badge and conflict hints in the card; click “Connection Test” before saving. If it still fails, check whether the server process can actually start and whether the address is reachable.
315
-
316
- </details>
317
-
318
- <details>
319
- <summary><strong>Getting `duplicate loader entry id`?</strong></summary>
320
-
321
- A: Most likely you manually added plugin lines to `~/.dsh/cordis.patch.yml`. Remove the duplicate lines — plugin lines should only be mounted by bundle patches; the managed block is only for server configuration.
322
-
323
- </details>
324
-
325
- <details>
326
- <summary><strong>`npm install` / `npm view` reports EPERM?</strong></summary>
327
-
328
- A: There may be root-owned files in the local `~/.npm` cache (a historical npm bug). Run `sudo chown -R $(id -u):$(id -g) ~/.npm` to fix it. pnpm is not affected.
329
-
330
- </details>
331
-
332
- ## Known Limitations
333
-
334
- - The managed block in `~/.dsh/cordis.patch.yml` is only for MCP server configuration; manually adding plugin lines can cause `duplicate loader entry id` at startup.
335
- - Codegraph’s MCP integration only aligns the working directory of the single `codegraph` server; DSH’s MCP client does not declare roots yet, so switching projects means using the card’s “Set as default project” or passing `projectPath` on the tool call.
336
- - Profile deletion is recursive and irreversible after the in-panel confirmation. The built-in `web` profile is protected; `headless` can be deleted.
337
- - RSS needs network access on first startup. An unreachable source does not block other sources, but that source may be missing from the day’s digest. AI summaries require a model configured on the host (`agent-default-model`, or a provider/model pair set in the card); when none is configured or a call fails, items fall back to the truncated original text.
338
- - The browser half depends on the official `dsh-web-app` settings panel slots service; non-official Web GUIs may not show the management cards.
339
- - The terminal panel (dsh-tty) resize passthrough relies on DSH’s internal terminal-handle shape, and TERM injection needs the `-c` wrapper layer (DSH hard-codes node-pty `name:"dumb"`); see `packages/tty/README.md`.
340
- - Installing from the repository requires Node.js >= 22.19 and pnpm 10; it is for development/debugging only. npm installs are not affected.
166
+ **Which docs a new package needs, how long they may be, and where its numbering starts** →
167
+ [docs/conventions.md](docs/conventions.md) (Chinese).
168
+ **The anatomy of a plugin package** (`dsh.bundle.patch` / `cordis.patch.yml` / `src/index.ts` /
169
+ `dsh.client`) → [docs/conventions.md § Package anatomy](docs/conventions.md#插件包解剖).
170
+ **Two rules that are easy to trip over** (where a client half may derive its host address; extracting
171
+ pure logic into modules) → [docs/conventions.md § Client half](docs/conventions.md#客户端半体两条硬规矩).
172
+
173
+ ## Documentation map
174
+
175
+ | You want to know | Read |
176
+ |---|---|
177
+ | What this is, what to install | this file |
178
+ | How the 12 packages cooperate, dependency direction, who writes which config file | [docs/architecture.md](docs/architecture.md) |
179
+ | Naming / commits / doc layers / numbering / package anatomy | [docs/conventions.md](docs/conventions.md) |
180
+ | Terminology (host half, managed block, TOFU, slot generations…) | [docs/glossary.md](docs/glossary.md) |
181
+ | Install failures, missing cards, HTTP 401/403, known limits | [docs/troubleshooting.md](docs/troubleshooting.md) |
182
+ | How to run real-machine tests, and what counts as passing | [docs/agent-real-test.md](docs/agent-real-test.md) |
183
+ | Windows 11 test environment setup | [scripts/windows/README.md](scripts/windows/README.md) |
184
+ | Cross-package backlog | [ROADMAP.md](ROADMAP.md) |
185
+ | Release process | [RELEASING.md](RELEASING.md) |
186
+ | Runtime linking between plugins and the host in a dev checkout | [docs/link-dsh-runtime.md](docs/link-dsh-runtime.md) |
187
+ | How one package is used | `packages/<pkg>/README.md` |
188
+ | What a defect number means | `packages/<pkg>/DEFECTS.md` |
189
+
190
+ > The L0 documents under `docs/` are currently Chinese-only. Each package’s `README.md` is bilingual
191
+ > (see `README.en.md` next to it).
341
192
 
342
193
  ## Contributing
343
194
 
344
- - Generate new plugins with the scaffolding command: `pnpm create-plugin <name> [id]`, instead of writing boilerplate by hand.
345
- - Follow Conventional Commits for commit messages (e.g. `fix(mcp): fix connection test timeout`). For user-visible changes, please include screenshots or verification evidence.
346
- - Run the gates before submitting: `pnpm typecheck && pnpm build && pnpm test && pnpm aggregate`.
347
- - After adding or removing plugins, run `pnpm aggregate` to regenerate the `packages/all` manifest.
195
+ - Generate new plugins with the scaffolding: `pnpm create-plugin <name> [id]`.
196
+ - Commits follow Conventional Commits (e.g. `fix(mcp): …`); user-visible changes should come with
197
+ screenshots or verification evidence.
198
+ - Run the gates before committing: `pnpm typecheck && pnpm build && pnpm test && pnpm aggregate`.
199
+ - After adding or removing a plugin, re-run `pnpm aggregate` to regenerate the `packages/all` manifest.
200
+ - Full conventions: [docs/conventions.md](docs/conventions.md).
348
201
 
349
202
  ## License
350
203
 
351
- This repository is licensed under the [Apache License 2.0](LICENSE).
204
+ Licensed under the [Apache License 2.0](LICENSE).
352
205
 
353
206
  ## Contributors
354
207
 
@@ -356,6 +209,6 @@ This repository is licensed under the [Apache License 2.0](LICENSE).
356
209
 
357
210
  **Like this project? Give it a star.**
358
211
 
359
- [Report Bug](https://github.com/hyzyn/dsh-plugin-kit/issues) · [Request Feature](https://github.com/hyzyn/dsh-plugin-kit/issues) · [View Releases](https://github.com/hyzyn/dsh-plugin-kit/releases)
212
+ [Report a bug](https://github.com/hyzyn/dsh-plugin-kit/issues) · [Request a feature](https://github.com/hyzyn/dsh-plugin-kit/issues) · [See releases](https://github.com/hyzyn/dsh-plugin-kit/releases)
360
213
 
361
214
  </div>
package/README.md CHANGED
@@ -25,17 +25,18 @@
25
25
 
26
26
  <p align="center">
27
27
 
28
- [是什么](#是什么) · [功能插件](#功能插件) · [快速开始](#快速开始) · [开发新插件](#开发新插件) · [常见问题](#常见问题) · [已知限制](#已知限制) · [参与贡献](#参与贡献)
28
+ [是什么](#是什么) · [包索引](#包索引) · [快速开始](#快速开始) · [开发新插件](#开发新插件) · [文档地图](#文档地图) · [参与贡献](#参与贡献)
29
29
 
30
30
  </p>
31
31
 
32
32
  ## 是什么
33
33
 
34
- dsh-plugin-kit 是给 DeepSeek Harness(DSH)Web GUI 用的通用插件集合:MCP 服务器配置、Profile 管理、RSS / 新闻聚合、全局搜索、Codegraph 集成、终端面板(本地 + SSH 终端、SFTP 文件传输)、Docker 容器面板(本机 / SSH 主机上的容器与镜像查看,默认只读)、环境变量 / 密钥管理、Prompt 管理,外加一条命令生成新插件的开发脚手架。所有插件都走官方 profile 机制挂载到 `dsh web`,不改 DSH 源码;可以逐个安装,也可以用聚合包一次装齐。
34
+ dsh-plugin-kit 是给 DeepSeek Harness(DSH)Web GUI 用的通用插件集合。所有插件都走官方 profile
35
+ 机制挂载到 `dsh web`,**不改 DSH 源码**;可以逐个安装,也可以用聚合包一次装齐。
35
36
 
36
37
  ![SFTP 双栏:左本机 / 右远程,行内直传](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dual.png)
37
38
 
38
- ![终端面板:侧边栏入口打开 xterm.js 多标签终端](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty.png)
39
+ ![Docker 容器面板:会话右侧栏标签,与对话同屏](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-docker-dock.png)
39
40
 
40
41
  | 能力 | 原生 dsh web | dsh-plugin-kit 全家桶 |
41
42
  | --- | --- | --- |
@@ -44,182 +45,76 @@ dsh-plugin-kit 是给 DeepSeek Harness(DSH)Web GUI 用的通用插件集合
44
45
  | RSS 聚合 | 无 | 多源订阅 + 每日「今日值得读」+ 可选 AI 摘要(跟随宿主默认模型,零配置) |
45
46
  | 全局搜索 | 仅会话标题/内容 | 侧边栏统一全文搜索历史会话、Prompt、MCP 工具与设置面板 |
46
47
  | Codegraph 集成 | 无 | 代码图谱卡片:索引状态 / 符号搜索 / 调用链 / 影响面 / 一键 sync-index |
47
- | 终端面板 | 无 | 侧边栏「终端」入口 + xterm.js 多标签真实 PTY 终端(vim/htop/dev server);SSH 直连远程主机(连接簿、指纹钉扎、断线重连);**SFTP 文件传输**(单窗体 / 左本机右远程双栏直传、拖拽上传);agent 配套 `tty_*` / `sftp_*` 工具 |
48
- | Docker 容器面板 | 无 | 侧边栏「容器」入口 + 多目标(本机 / SSH)容器列表(搜索 / 状态筛选)、启停删、详情、日志(快照 + **SSE 实时跟随**)、资源占用(快照 + **实时跟随 + sparkline**)、**多目标总览(只读)**、**Compose 项目视图 + 项目级聚合日志**、镜像列表与详情(层 / 构建历史)、**`docker pull` 进度流**、删除 / dangling 清理;**默认只读**,变更与 exec 需显式开关;agent 配套 `docker_*` 工具 |
48
+ | 终端面板 | 无 | xterm.js 多标签真实 PTY(vim/htop/dev server);SSH 直连(连接簿、指纹钉扎、断线重连);SFTP 单窗体 / 双栏直传;`tty_*` / `sftp_*` 工具 |
49
+ | Docker 容器面板 | 无 | 容器 / 镜像 / Compose / 实时日志与统计 / 多目标总览;**默认只读**,变更与 exec 需显式开关;`docker_*` 工具 |
49
50
  | 环境变量管理 | 命令行 / 手改配置 | Web GUI 卡片,保存即写入 `process.env` |
50
51
  | Prompt 管理 | 手改配置 | 可视化编辑 + 版本管理 / A/B 测试 / 导出分享 |
51
- | 插件开发 | 手写样板 | `pnpm create-plugin` 脚手架 + `@hyzyn/dsh-kit` 类型助手与宿主半体共享工具库(HTTP 围栏 / 托管区块 / !!js 表达式) |
52
-
53
- ## 功能插件
54
-
55
- ### MCP 服务器配置(@hyzyn/dsh-mcp)
56
-
57
- - **做什么**:给 DSH 添加 MCP 服务器,保存后 1~2 秒内热加载为 `mcp__<服务器名>__<工具名>` 工具,模型即可直接调用,无需重启。
58
- - **怎么用**:打开 插件配置里的「MCP 服务器配置」→ 添加服务器(选传输方式)→(建议先点「连接测试」)→ 保存。
59
- - **支持**:两种传输——stdio(本地子进程,如 `npx -y @modelcontextprotocol/server-filesystem`)与 streamable-http(远程服务);`js:` 前缀表达式(如 `js:process.env.GITHUB_TOKEN`);启用 / 停用、编辑、删除;状态徽章。
60
- - **存哪里**:`~/.dsh/cordis.patch.yml` 的托管区块。
61
- - **注意**:**不要**手工往该文件里追加插件行,否则启动时报 `duplicate loader entry id` 直接退出。
62
-
63
- ![MCP 服务器配置插件](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-mcp.png)
64
-
65
- ### Profile 管理(@hyzyn/dsh-profile)
66
-
67
- - **做什么**:可视化查看 `~/.dsh/profiles` 下的全部 DSH profile,支持创建、复制、重命名、删除,方便维护多套 DSH 环境。
68
- - **怎么用**:打开 插件配置里的「Profile 管理」→ 查看 profile 列表 → 新建 / 复制 / 重命名 / 删除;可为每个 profile 设置端口并复制带 `--port` 的启动命令。
69
- - **支持**:初始化状态、bundle 层与依赖展示;基础模板 / `web` / `headless` 模板新建;复制排除 `node_modules` 与锁文件并自动安装依赖;重命名;端口配置与复制启动命令。
70
- - **存哪里**:直接管理 `~/.dsh/profiles/<name>` 目录。
71
- - **注意**:删除为递归删除,操作前请二次确认;内置的 `web` 默认 profile 不允许删除,`headless` 可以删除;新建后首次使用 `dsh plugin --profile <name> add ...` 时按需安装依赖。
72
-
73
- ![Profile 管理配置界面](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-profile.png)
74
-
75
- ![命令行启动 headless profile 示例](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-profile-example-headless1.png)
76
-
77
- ### RSS / 新闻聚合(@hyzyn/dsh-rss)
78
-
79
- - **做什么**:订阅多个 RSS / Atom 源,每天自动汇总成一篇「今日值得读」Markdown,并注入 systemPrompt 供模型直接引用。
80
- - **怎么用**:安装后可在侧边栏「新建会话」下方点击「今日值得读」直接查看新闻;也可打开 插件配置里的「RSS / 新闻聚合」勾选内置渠道、添加自定义渠道(保存时即时校验地址)、从 [awesome-rsshub-routes](https://jackyst0.github.io/awesome-rsshub-routes/) 订阅源目录搜索并一键添加,维护新闻分类与聚合设置,保存后自动刷新。
81
- - **内置渠道**:阮一峰、少数派、Solidot、Hacker News、掘金、IT之家、36氪(36氪官方 feed 被反爬拦截,内置为第三方 RSSHub 镜像),勾选即展示、取消勾选即不抓取。
82
- - **自定义渠道**:填写任意 RSS / Atom 地址,保存时真实抓取校验——官网首页、非 feed、抓不到内容的地址会报错且不保存。
83
- - **订阅源目录**:内置 awesome-rsshub-routes 精选目录(官方 RSS 与 RSSHub 路由,98 条 / 12 分类),可搜索 / 按分类筛选并一键加入自定义渠道;快照随插件内置,运行时每 12 小时从上游 OPML 静默刷新。
84
- - **新闻分类**:渠道的分类从「新闻分类」列表里选择;digest(Markdown、systemPrompt、弹窗)按分类分组展示,保存时自动把使用中的分类合并进列表。
85
- - **AI 摘要(可选)**:卡片里开启后,每天 digest 的条目由宿主已配置的默认模型各生成一句中文摘要(无需填 API key;也可在卡片里成对指定 provider/model 用别的模型)。结果按条目缓存 30 天,重复生成不重复计费;单条失败自动回落原文截断,不影响其它条目。摘要同时进 Markdown、弹窗、搜索与 systemPrompt。
86
- - **支持**:RSS 2.0 / Atom 解析、按来源去重、每源条数限制、每日定时生成、启动补生成、自定义输出目录、内置渠道库。
87
- - **存哪里**:`~/.dsh/rss-digest/YYYY-MM-DD.md`(可用 `DSH_RSS_DIGEST_DIR` 覆盖)。
88
- - **注意**:首次安装启动时会联网抓取一次;某个源不可达时会在 digest 的「抓取失败」里列出,不影响其它源。AI 摘要开启时生成耗时取决于模型响应(失败条目回落,不会卡死生成)。
89
-
90
- ![RSS / 新闻聚合设置卡片](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-setting.png)
91
-
92
- ![侧边栏「今日值得读」弹窗:按分类分组,来源带「查看更多」直达官网](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-view.png)
93
-
94
- ![查询今日新闻:向模型提问「今日值得读」直接引用当天 digest](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-rss-query-news.png)
95
-
96
- ### 全局搜索(@hyzyn/dsh-search)
97
-
98
- - **做什么**:在 Web GUI 侧边栏加一个「全局搜索」入口(⌘/Ctrl+K 同样唤出),打开的是命令面板式搜索窗:分组列出最近会话、历史会话全文命中、Prompt、MCP 工具、快捷操作与设置大类。
99
- - **怎么用**:点侧边栏搜索框或按 ⌘/Ctrl+K 打开——**打开即出内容**(最近会话 + 快捷操作 + 设置大类,零延迟,不发请求);输入关键词后本地候选即时过滤、宿主全文命中异步补齐。↑↓ 选择、↵ 打开、esc 关闭;⌥1-9 直接打开第 N 条最近会话,⌥N / ⌥O / ⌥, 触发新会话 / 打开文件夹 / 打开设置。点会话会打开并尝试定位到匹配文字;点 Prompt / MCP 工具跳对应设置卡片;点设置大类跳到设置窗对应分区。
100
- - **支持**:历史会话全文搜索(走 DSH 自带的 sessionQuery 索引)+ 会话标题即时候选;设置大类实时读客户端 slots 注册表(第三方插件注册的「皮肤」「宠物」「侧边卡片」等同样在列,顺序与设置窗导航一致);Prompt 读 `~/.dsh/prompts.yml` 托管区块;MCP 工具按 `mcp__` 前缀枚举并标注所属 server;结果关键词高亮;结果数量可配置。
101
- - **存哪里**:无独立配置。
102
- - **注意**:需要宿主已安装 `sessionQuery` 服务;缺失时会话搜索返回空列表。若 `session-query` 全文索引配置为 `openAt: "never"`,历史会话会自动降级为逐会话扫描;会话结果会过滤为当前可跳转的可见会话。「新会话」复用 GUI 自己的 `uiWorkspace.startSession()`;「打开文件夹」在未安装目录选择器插件时不出现。
103
-
104
- ![全局搜索插件](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-search.png)
105
-
106
- ![全局搜索的检索结果(最近会话 / 历史会话 / Prompt / MCP 工具 / 设置分组)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-search-query.png)
107
-
108
- ### Codegraph 集成(@hyzyn/dsh-codegraph)
109
-
110
- - **做什么**:代码图谱集成——插件配置里的「Codegraph」卡片提供索引状态、符号搜索、callers / callees / impact 查看和一键 sync / index;安装后自动向 systemPrompt 注入 CodeGraph 使用指引,模型在已索引项目里优先用 `codegraph_explore` / `codegraph explore` 查询代码而不是 grep / read。
111
- - **怎么用**:打开 插件配置里的「Codegraph」→ 查看索引状态、搜索符号、点击结果查看源码与调用链 / 影响面、手动 Sync / 重建索引。
112
- - **支持**:索引状态(版本、文件 / 符号 / 边数量、最后索引时间、待同步变更);符号搜索与 node / callers / callees / impact 详情;**默认路径跟随当前活动会话的工作目录**(切换项目会话自动切换,手动输入可临时覆盖);一键增量 sync 与全量重建。
113
- - **MCP 托管(默认开)**:DSH 的 MCP 客户端不声明 roots,`codegraph serve --mcp` 只能从工作目录向上找 `.codegraph/`——宿主若从家目录启动,模型调用 `mcp__codegraph__*` 会拿到 "No CodeGraph project is loaded"。本插件自动在 `~/.dsh/cordis.patch.yml` 托管 codegraph MCP 服务器行并把 cwd 对齐默认项目路径(卡片「设为默认项目」一键切换,保存即热重启 MCP 服务器);已在 MCP 卡片配置过的行只补 cwd 不动其它字段。可用 `mcpIntegration: false` 关闭。
114
- - **存哪里**:索引在项目 `.codegraph/` 目录(由 `codegraph index` 生成);默认项目路径与各开关持久化在本插件 entry 的 profile 配置(写进当前 profile 的 `cordis.patch.yml` 用户层)。
115
- - **注意**:查询目标项目需要先有 Codegraph 索引;未索引项目会返回指引改用常规工具。索引 / 重建为本地 CLI 操作,消耗真实磁盘与 CPU。一台 codegraph MCP 服务器同一时刻只挂载一个默认项目,其它已索引项目可在工具调用里传 `projectPath` 查询。
116
- - **兼容与调优**:当前适配基线 DSH `0.1.7-rc.1`(声明 `peerDependencies: @deepseek-ai/dsh ^0.1.7-rc.1`)+ codegraph CLI `1.5.0`;CLI 命令与旗标见包内 README。大仓库全量重建可调 `indexTimeoutMs`(默认 600s,查询档 `cliTimeoutMs` 默认 60s),CLI 拒绝索引家目录 / 文件系统根时开 `indexForce`。
117
-
118
- ![Codegraph 设置卡片](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-codegraph.png)
119
-
120
- ### 终端面板(@hyzyn/dsh-tty)
121
-
122
- - **做什么**:在 Web GUI 侧边栏加一个「终端」入口,点击打开大弹窗,内嵌 xterm.js 全交互终端(node-pty 真实 PTY),支持多标签页,可运行任意命令与 TUI 程序(vim / htop / dev server 等);还能 **SSH 直连远程主机**(连接簿 / 主机指纹钉扎 / 断线自动重连 / 端口转发隧道),以及 **SFTP 文件传输**——单窗体或「左本机 / 右远程」双栏两种界面,上传 / 下载 / 重命名 / 删除一应俱全。
123
- - **怎么用**:安装后重启 `dsh web`,侧边栏点击「终端」→ 自动创建第一个终端(默认 `$SHELL`)→ 标签栏「+」新建(本地终端 / SSH 连接簿 / SSH 连接…)、✕ 关闭;新标签默认在当前 DSH 会话工作目录打开;SSH 标签的连接栏提供 SFTP / 隧道入口;Ctrl+F 终端内搜索,工具栏清屏/复制/粘贴。
124
- - **SFTP 两种界面(设置可选)**:`dialog` 单窗体——远程目录浏览、多选/拖拽上传(文件夹递归)、下载、重命名、删除;`dual` 双栏——左本机 / 右远程,行内 `⇨ / ⇦` 由宿主服务端把两个路径流式直传(目录递归、同名覆盖,字节不经过浏览器)。
125
- - **最小化(状态并入侧边栏入口)**:点弹窗外空白处、按 Esc 或标题栏「—」把面板收起,PTY 会话与输出缓冲保持存活;侧边栏「终端」入口显示会话数徽标与状态点,点击入口恢复;悬浮条 ✕ / 标题栏 ✕ 才真正关闭并结束全部会话。
126
- - **支持**:多标签页(单连接多会话);cwd 跟随当前会话;TERM=xterm-256color 注入(TUI 应用不退化);断线自动重连(会话保活 + 输出缓冲回放);SSH agent / 密钥 / 密码认证,`env:VAR` 密钥引用不落盘;端口转发隧道(-L/-R,宿主自持重连);下行背压保护;loopback 信任围栏;并发上限(默认 4);配置保存即热生效;agent 工具集(`tty_list` / `tty_capture` / `tty_screen` / `tty_expect` / `tty_send` / `sftp_*` / `tunnel_list`)。
127
- - **存哪里**:本插件 entry 的 profile 配置,写进当前 profile 的 `cordis.patch.yml` 用户层——「插件配置 → 终端面板」卡片读写的就是它。
128
- - **0.19.0 修了什么**:48 项审计修复——SFTP 覆盖上传改为临时分片 + 原子 rename(失败不再毁原文件)、断线在途 spawn 不再留僵尸会话、known_hosts 导入不再误报「中间人」、明文口令不再落浏览器存储、Windows 强杀本地 PTY 不再崩宿主、现代 Linux(bash ≥4.4)的 `tty_capture{last}` / `tty_expect` 恢复可用。清单与索引见 `packages/tty/DEFECTS.md`。
129
- - **注意**:resize 依赖 DSH 内部 terminal handle 结构(已知限制);输出为 utf8 文本流,`cat` 二进制文件会有替换字符。详细见 `packages/tty/README.md`。
130
-
131
- ![终端面板:侧边栏入口打开 xterm.js 多标签终端,紧凑两行头部(标签 + SSH 连接栏)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty.png)
132
-
133
- ![SFTP 双栏:左本机 / 右远程,行内 ⇨/⇦ 服务端直传(sftpStyle=dual)](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dual.png)
134
-
135
- ![SFTP 单窗体:远程目录浏览 + 下载/重命名/删除](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-sftp-dialog.png)
136
-
137
- ![终端面板设置卡片:shell / TERM / SFTP 风格 / 并发上限等保存即热生效](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-tty-setting.png)
138
-
139
- ### Docker 容器面板(@hyzyn/dsh-docker)
140
-
141
- - **做什么**:在 Web GUI 侧边栏加一个「容器」入口,面板**作为会话右侧栏标签与对话同屏**(老宿主自动退回 dock / 模态),查看**本机或 SSH 主机**上的容器列表(状态 / 健康 / 端口 / compose 项目)、**Compose 项目视图(项目 → 服务 → 容器 + 项目级聚合日志)**、容器详情、日志尾部、资源占用(**实时跟随 + 迷你趋势图**)、**多目标总览**(一屏汇总全部目标的容器计数与异常容器)与镜像(列表 + 详情:层 / 构建历史);显式打开开关后可启停删容器、拉取 / 删除 / 清理镜像、执行一次性 `docker exec`。
142
- - **怎么用**:安装后重启 `dsh web`,侧边栏点击「容器」→ 选择目标(本机 / SSH)→ 工具条三段切换「容器 / 镜像 / Compose」:容器卡片(镜像 / ID / 端口 / 创建 + 图标操作条)支持搜索与状态筛选,点卡片进整栏详情(概览 / 日志 / 统计,统计页有 **FOLLOW 实时跟随 + 迷你趋势图**),日志页有 LINES / TIMESTAMPS / AUTO REFRESH / **FOLLOW(实时跟随)** 工具条与过滤行;镜像页每行可看**详情(层 / 构建历史)**、删除,工具条有**拉取镜像(图标,SSE 逐层进度)**与「清理 dangling」;Compose 页按项目分组,点进项目看服务表或**项目级聚合日志**(客户端按 `[service]` 前缀混流)。插件配置里的「Docker 容器面板」维护目标与开关,保存即热生效。
143
- - **终端按钮**:装了 tty ≥ 0.15.0 时,卡片第一个图标是「终端」——点击在**面板底部弹出终端抽屉**(tty 的 `ttyTerminal.mount` 就地嵌入),看着日志直接进容器敲命令,面板不收起;tty 为 0.14.0 时退回「新开终端标签 + 收面板」,更旧或未装则退化为复制命令。
144
- - **上下文入口**:装了 tty ≥ 0.13.0 时,SSH 标签的连接栏(SFTP 旁)会出现「容器」按钮——点击直接用当前会话那台主机打开面板(插件加载期间一直显示;目标在点击时按连接簿名 / `host:port` 解析,没配目标会提示怎么配)。
145
- - **目标**:`kind=local` 走宿主所在机器的 docker CLI;`kind=ssh` 可直接**引用 tty 连接簿条目名**(数据级复用,tty 零改动;未装 tty 时用内联 host/username),经 ssh2 exec channel 在远端执行,主机指纹 TOFU 钉扎并以 tty 已有记录作种子。
146
- - **跨目标与需关注**:总览页一屏汇总全部目标(计数卡 + 跨目标异常表,单目标失败不影响其余);「需关注」口径覆盖不健康 / 反复重启 / **被 OOM 杀** / 非零退出 / 僵死,agent 侧 `docker_attention` 与 `docker_ps target:'*'` 同样支持跨目标聚合。
147
- - **支持**:容器列表(`all` 含已停止)、`docker inspect` 详情、日志(tail / 时间戳 / since)、**实时日志流**(FOLLOW 开关走 SSE `docker logs --follow`,本地与 SSH 目标都支持,自动滚动 / 过滤着色与快照共用,容器退出自动切回快照)、`docker stats` **快照 + 实时流**(SSE,60 点 sparkline 看 CPU / 内存趋势;这条流不会自然结束,前端主动断)、**Compose 项目视图**(按 `composeProject` / `composeService` 分组,项目级聚合日志在客户端按 `[service]` 前缀混流)、**容器事件活动流**(SSE `docker events` → 列表头部「活动」条 + 500ms 防抖刷新容器列表)、**网络与卷**(列表 + 详情:子网 / 网关 / 接入容器、挂载点 / 选项 / 标签;删除与 prune 需 `allowMutations`)、**多目标总览**(不选目标一屏看全部主机:计数卡 + 异常容器置顶表;并行取数、单目标失败只影响自己那一格;只读、无跨目标操作)、以及**容器列表多选的临时聚合日志**(勾 2~8 个容器即开混流;**SSH 目标上限 6**——一条连接要同时装下实时流与「刷新列表」这类短命令)、镜像列表 + **镜像详情**(`docker image inspect` 的层 / 大小 + `docker history` 构建历史)、**`docker pull` 进度流**(SSE 逐层)、镜像删除 / dangling 清理(需 `allowMutations`)、一次性 exec(返回退出码与 stdout/stderr);`dockerBin` 可填 `podman`;输出超限自动截断。四条 SSE 长流(日志 / 统计 / 事件 / 拉取)共用同一份 `openSseStream` 基建(心跳 / 活跃流登记 / 断开清理)。
148
- - **安全模型(重点)**:docker socket ≈ 目标主机 root 权限,因此**默认只读**——`allowMutations` 未开启时启停删被拒(HTTP 403,工具不注册),`allowExec` 未开启时 exec 被拒;容器名 / ID 过白名单校验,命令一律 argv 构造 + 单引号转义;密码 / 口令建议 `env:VAR` 引用且永不回传浏览器。
149
- - **存哪里**:本插件 entry 的 profile 配置,写进当前 profile 的 `cordis.patch.yml` 用户层(旧的 `~/.dsh/settings.yaml` section 已由 DSH 一次性导入)。
150
- - **注意**:没有交互式 TTY(exec 是一次性命令,交互排障请到终端面板跑 `docker exec -it`),流式能力只在浏览器面板里(agent 的 `docker_logs` / `docker_stats` / `docker_image_pull` 保持快照语义),没有 `docker build` / `save` / `load` / `push`,Compose 是只读视图(不提供 `compose up/down`),多目标总览是**只读**汇总(没有跨目标操作,启停删仍需逐目标);`docker rm` 与 `docker image rm` 都不带 `-f`,运行中容器 / 被引用的镜像会报错并给出提示。详细见 `packages/docker/README.md`。
151
-
152
- ### 环境变量 / 密钥管理(@hyzyn/dsh-env)
153
-
154
- - **做什么**:在 Web GUI 里增删改环境变量和密钥,保存后立即写入当前进程的 `process.env`,宿主和之后启动的子进程都能读到,无需重启。
155
- - **怎么用**:打开 插件配置里的「环境变量 / 密钥管理」→ 添加键值 →(敏感条目勾选「密钥」,值不回传浏览器,留空保存=保持已存值)→ 保存。
156
- - **支持**:普通字符串;`js:` 前缀表达式(如 `js:process.env.API_KEY`);密钥值自动迁入官方凭据存储 `.credentials.yaml`(write-only:接口不回明文,env 文件只留清单;refs 已有同名键不覆盖,留文件并提示)。
157
- - **存哪里**:`~/.dsh/env.yml` 的托管区块(自动生成,请勿手改)。
158
- - **注意**:键名只允许字母 / 数字 / 下划线,且不能重复。
159
-
160
- ![环境变量 / 密钥管理插件](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-env.png)
161
-
162
- ### Prompt 管理(@hyzyn/dsh-prompt)
163
-
164
- - **做什么**:可视化编辑 systemPrompt,启用后其内容作为 systemPrompt section 注入,保存即生效。
165
- - **怎么用**:打开 插件配置里的「Prompt 管理」→ 新建 / 编辑 Prompt(可保存多个版本)→ 启用。
166
- - **支持**:版本切换 / 回滚;A/B 测试(为同一 Prompt 选 A/B 两版并按权重随机命中);导出 JSON / Markdown、一键复制分享、从 JSON 导入。
167
- - **存哪里**:`~/.dsh/prompts.yml` 的托管区块。
168
- - **注意**:每个 Prompt 至少一个版本,单版本内容 ≤ 500KB。
169
-
170
- ![Prompt 管理插件](https://cdn.jsdelivr.net/gh/hyzyn/dsh-plugin-kit@main/docs/dsh-plugin-kit-prompt.png)
52
+ | 插件开发 | 手写样板 | `pnpm create-plugin` 脚手架 + `@hyzyn/dsh-kit` 共享工具库 |
53
+
54
+ > **每个插件的完整功能、截图与注意事项在它自己的 README 里**(见下表)。本文件只讲「是什么 + 装哪个」。
55
+
56
+ ## 包索引
57
+
58
+ **1 个共享库 + 10 个功能插件 + 1 个聚合包**;包之间的关系、依赖方向与跨插件协作见
59
+ [docs/architecture.md](docs/architecture.md)。
60
+
61
+ | 包 | 干什么 | 文档 |
62
+ |---|---|---|
63
+ | `@hyzyn/dsh-kit` | **库**(非插件):宿主半体共享工具——HTTP 回环围栏、托管区块、`!!js` 表达式、服务读取 | [README](packages/kit/README.md) · [DEFECTS](packages/kit/DEFECTS.md) |
64
+ | `@hyzyn/dsh-mcp` | MCP 服务器配置卡片,保存后热加载 | [README](packages/mcp/README.md) |
65
+ | `@hyzyn/dsh-env` | 环境变量 / 密钥管理 | [README](packages/env/README.md) |
66
+ | `@hyzyn/dsh-prompt` | systemPrompt 编辑 / 版本 / A/B | [README](packages/prompt/README.md) |
67
+ | `@hyzyn/dsh-profile` | `~/.dsh/profiles` 图形化管理 | [README](packages/profile/README.md) |
68
+ | `@hyzyn/dsh-rss` | RSS 聚合 → 每日「今日值得读」 | [README](packages/rss/README.md) |
69
+ | `@hyzyn/dsh-search` | 侧边栏全局搜索 | [README](packages/search/README.md) |
70
+ | `@hyzyn/dsh-codegraph` | 代码图谱卡片 + MCP 托管 + 采纳率测量 | [README](packages/codegraph/README.md) · [DEFECTS](packages/codegraph/DEFECTS.md) · [ROADMAP](packages/codegraph/ROADMAP.md) |
71
+ | `@hyzyn/dsh-tty` | 终端面板(PTY / SSH / SFTP / 隧道) | [README](packages/tty/README.md) · [DEFECTS](packages/tty/DEFECTS.md) · [ROADMAP](packages/tty/ROADMAP.md) |
72
+ | `@hyzyn/dsh-docker` | Docker 容器面板(本机 / SSH),默认只读 | [README](packages/docker/README.md) · [DEFECTS](packages/docker/DEFECTS.md) · [ROADMAP](packages/docker/ROADMAP.md) |
73
+ | `@hyzyn/dsh-kit-settings` | 在官方「设置」里补一行「插件配置」入口 | [README](packages/kit-settings/README.md) |
74
+ | `@hyzyn/dsh-all` | 聚合安装包:一条 bundle patch 挂载上面 10 个插件 | [README](packages/all/README.md) |
171
75
 
172
76
  ## 快速开始
173
77
 
174
78
  ### 系统要求
175
79
 
176
- - 已安装 DeepSeek Harness,`dsh web` 可正常启动。**当前适配基线为 DSH `0.1.7-rc.1`**:settings 存储改为「当前 profile 的插件 entry 配置」,兼容性改由 `peerDependencies` 在安装前与启动时强制校验;`0.1.6-alpha.2` 及更早不再支持。
177
- - 每个可安装插件都在 `peerDependencies` 声明 `@deepseek-ai/dsh: ^0.1.7-rc.1`。DSH 0.1.7-rc.1 起在**安装前**(`incompatible-version`)与**启动时**(该行整行 `disabled`)都用它判定兼容性,预发布参与范围匹配。同时保留 `dsh.engines.dsh: ">=0.1.7-rc.1"` 作为**市场展示位**:rc.1 宿主不读它(app-boot README 原文「这些检查使用 peer 声明,而不是 engines.dsh」),但插件市场 / 社区条目那类外部消费方仍按它展示兼容性——值必须与 peer 下限一致,否则就是一条与事实不符的声明。需要临时放行某个确切版本组合时,把豁免写进 profile 自己的 `compatibility.json`:`dsh plugin --profile <p> allow-version <pkg@ver> --dsh-version <ver> --accept-risk`。CI 跑 `node scripts/check-dsh-peers.mjs` 兜底:它同时校验 peer 下限、engines 下限与 `dsh.manifestVersion`,并可按 `--app-boot <path>` 直接调 DSH 官方判定器复核。
80
+ - 已安装 DeepSeek Harness,`dsh web` 可正常启动。**当前适配基线为 DSH `0.1.7-rc.2`**:
81
+ settings 存储改为「当前 profile 的插件 entry 配置」,兼容性改由 `peerDependencies`
82
+ 在安装前与启动时强制校验;`0.1.6-alpha.2` 及更早不再支持。
83
+ - 每个可安装插件都在 `peerDependencies` 声明 `@deepseek-ai/dsh: ^0.1.7-rc.2`,DSH 在**安装前**与
84
+ **启动时**都用它判定兼容性;同时保留 `dsh.engines.dsh` 作**市场展示位**(值必须与 peer 下限一致)。
85
+ 机制细节、被拦下怎么办、怎么临时放行 → [docs/troubleshooting.md § 兼容性校验](docs/troubleshooting.md#兼容性校验)。
178
86
  - npm 安装方式无额外要求;从仓库安装需要 Node.js >= 22.19 与 pnpm 10。
179
87
 
180
- ### 三步上手
181
-
182
- 1. 安装聚合包:`dsh plugin --profile web add @hyzyn/dsh-all`
183
- 2. 重启 `dsh web`,插件配置页里出现全部管理条目
184
- 3. 打开插件配置页按需使用各条目,保存后即时生效
185
-
186
- > **配置入口在哪一版**:DSH ≥ `0.1.6-alpha.2` 有**两个**入口,指向同一份配置——侧边栏
187
- > **「插件」**→ 选插件 → 该行的「配置」(官方新版两视图页面),以及**设置 →「插件配置」**
188
- > (与「通用设置」平级的一行,由 `@hyzyn/dsh-kit-settings` 提供,0.1.5 时代那种可折叠卡片)。
189
- > DSH ≤ `0.1.5` 是**设置 → 插件 →「插件配置」**标签页里的卡片。
190
- > 客户端半体同时注册三代插槽(`plugins.row.config`、`settings.kit.item`、`settings.plugin.item`),
191
- > 一份产物在各代上都能用。
192
-
193
88
  ### 从 npm 安装(推荐)
194
89
 
195
- 插件已发布到 npm(`@hyzyn` scope),一条命令装齐——两种等价方式任选:
196
-
197
90
  ```sh
198
91
  dsh plugin --profile web add @hyzyn/dsh-all # 聚合安装包
199
92
  dsh plugin --profile web add @hyzyn/dsh-plugin-kit # 仓库根 bundle(同样挂载全家桶)
200
93
  ```
201
94
 
202
- 装完重启 `dsh web`,打开插件配置页(见上方「配置入口在哪一版」)即可看到全部条目。只想用某一个插件,见下文「单独安装某个插件」。
95
+ 装完**重启** `dsh web`,插件配置页里出现全部条目即生效。只想用某一个插件,见下方「单独安装某个插件」。
96
+ 条目没出现多半是没重启;也可以用 `dsh --profile web --dump-config` 确认插件配置层已挂载。
97
+ 卸载:`dsh plugin --profile web remove @hyzyn/dsh-all`(或对应子包名),再重启。
98
+
99
+ > **配置入口在哪一版**:DSH ≥ `0.1.6-alpha.2` 有**两个**入口,指向同一份配置——侧边栏
100
+ > **「插件」**→ 选插件 → 该行的「配置」(官方新版两视图页面),以及**设置 →「插件配置」**
101
+ > (与「通用设置」平级的一行,由 `@hyzyn/dsh-kit-settings` 提供)。
102
+ > DSH ≤ `0.1.5` 是**设置 → 插件 →「插件配置」**标签页里的卡片。
103
+ > 客户端半体同时注册三代插槽(`plugins.row.config`、`settings.kit.item`、`settings.plugin.item`),
104
+ > 一份产物在各代上都能用。
203
105
 
204
106
  ### 从 GitHub 仓库安装(开发调试)
205
107
 
206
- 插件包已在 npm 发布,仓库安装仅供开发调试(需要 Node.js >= 22.19 与 pnpm 10)。
207
- 仓库根目录本身也是一个 DSH bundle(`package.json#dsh.bundle.patch`,由 `pnpm aggregate` 生成),
208
- `dsh plugin add link:$(pwd)` 即可把整个全家桶识别并挂载为一个插件:
108
+ 需要 Node.js >= 22.19 与 pnpm 10。仓库根目录本身也是一个 DSH bundle
109
+ (`package.json#dsh.bundle.patch`,由 `pnpm aggregate` 生成):
209
110
 
210
111
  ```sh
211
- # 1. 克隆仓库
212
112
  git clone https://github.com/hyzyn/dsh-plugin-kit.git
213
113
  cd dsh-plugin-kit
214
-
215
- # 2. 安装依赖并构建
216
114
  pnpm install
217
115
  pnpm build
218
116
 
219
- # 3. 把全家桶链接进 web profile(根包即 bundle,等价于安装 @hyzyn/dsh-all)
220
- dsh plugin --profile web add link:$(pwd)
221
-
222
- # 4. 重启 dsh web
117
+ dsh plugin --profile web add link:$(pwd) # 根包即 bundle,等价于安装 @hyzyn/dsh-all
223
118
  dsh web
224
119
  ```
225
120
 
@@ -227,50 +122,21 @@ dsh web
227
122
  > 不要再 add 根包(或 `packages/all`),否则插件行重复挂载会在启动时报
228
123
  > `duplicate loader entry id`。
229
124
 
230
- > 只想用某个子包:第 3 步改为 `dsh plugin --profile web add link:$(pwd)/packages/<name>` 即可,例如 `packages/mcp`。
125
+ > 只想用某个子包:第 3 步改为 `dsh plugin --profile web add link:$(pwd)/packages/<name>`。
231
126
 
232
- > 根包声明了 `dsh` 字段后,GitHub 的 DSH 插件市场(如 DSH-Plugins-Marketplace,
233
- > 按 `dsh.bundle` / `@deepseek-ai/*` 依赖识别)会把本仓库识别为 DSH 插件
234
- > (cordis-plugin),不再标记「非 DSH 插件」。
127
+ > 根包声明了 `dsh` 字段后,GitHub 的 DSH 插件市场会把本仓库识别为 DSH 插件(cordis-plugin)。
235
128
 
236
129
  ### 单独安装某个插件
237
130
 
238
- 不想装全家桶时,可单独安装任意插件(npm 已发布,直接用包名):
131
+ 不想装全家桶时,把包名换成上表里的任意一个即可(`@hyzyn/dsh-all` → `@hyzyn/dsh-<包名>`):
239
132
 
240
133
  ```sh
241
- dsh plugin --profile web add @hyzyn/dsh-env # 环境变量 / 密钥管理
242
- dsh plugin --profile web add @hyzyn/dsh-mcp # MCP 服务器配置
243
- dsh plugin --profile web add @hyzyn/dsh-prompt # Prompt 管理
244
- dsh plugin --profile web add @hyzyn/dsh-profile # Profile 管理
245
- dsh plugin --profile web add @hyzyn/dsh-rss # RSS / 新闻聚合
246
- dsh plugin --profile web add @hyzyn/dsh-search # 全局搜索
247
- dsh plugin --profile web add @hyzyn/dsh-codegraph # Codegraph 集成
248
- dsh plugin --profile web add @hyzyn/dsh-tty # 终端面板
249
- dsh plugin --profile web add @hyzyn/dsh-docker # Docker 容器面板
134
+ dsh plugin --profile web add @hyzyn/dsh-env # 环境变量 / 密钥管理
135
+ dsh plugin --profile web add @hyzyn/dsh-tty # 终端面板
136
+ dsh plugin --profile web add @hyzyn/dsh-docker # Docker 容器面板
250
137
  ```
251
138
 
252
- ### 验证与卸载
253
-
254
- 装好重启 `dsh web`,插件配置页里出现对应条目就是生效了;也可以用 `dsh --profile web --dump-config` 确认插件配置层已挂载。条目没出现,多半是装完没重启 `dsh web`。
255
-
256
- 卸载:`dsh plugin --profile web remove @hyzyn/dsh-all`(或对应的 `@hyzyn/dsh-<包名>`),然后重启 `dsh web`。
257
-
258
- ### 安装排障
259
-
260
- <details>
261
- <summary><strong>展开查看常见安装问题</strong></summary>
262
-
263
- <br>
264
-
265
- > **卡片没出现?** 重启 `dsh web`;确认用的是官方 `dsh-web-app` 设置面板(浏览器半体依赖核心 slots 服务)。
266
-
267
- > **MCP 服务器保存后没有工具?** 等 1~2 秒 HMR;在卡片里看状态徽章与冲突提示;保存前先点「连接测试」。
268
-
269
- > **报 `duplicate loader entry id`?** 多半是手工往 `~/.dsh/cordis.patch.yml` 加了插件行。删掉重复行——插件行只由 bundle 补丁挂载,托管区块只放服务器配置。
270
-
271
- > **`npm install` / `npm view` 报 EPERM?** 本机 `~/.npm` 缓存存在 root-owned 文件(历史 npm bug),执行 `sudo chown -R $(id -u):$(id -g) ~/.npm` 修复。pnpm 不受影响。
272
-
273
- </details>
139
+ 装不上 / 卡片不出现 / 接口报 401、403 → [docs/troubleshooting.md](docs/troubleshooting.md)。
274
140
 
275
141
  ## 开发新插件
276
142
 
@@ -280,80 +146,43 @@ pnpm create-plugin <name> [id]
280
146
  # 例:pnpm create-plugin pet-tracker pt → packages/pet-tracker(插件 id: pt)
281
147
  ```
282
148
 
283
- 脚本会复制 `templates/hello` 模板、替换包名与插件 id,并自动更新聚合包。然后:
284
-
285
- 1. 编辑 `packages/<name>/src/index.ts` 写插件逻辑;
286
- 2. 构建并本地安装调试:
149
+ 脚本会复制 `templates/hello` 模板、替换包名与插件 id,并自动更新聚合包。然后编辑
150
+ `packages/<name>/src/index.ts`,构建后本地调试:
287
151
 
288
152
  ```sh
289
153
  pnpm --filter @hyzyn/dsh-<name> build
290
154
  dsh plugin --profile web add link:$(pwd)/packages/<name>
291
155
  ```
292
156
 
293
- ### 插件包长什么样(以 hello 为例)
294
-
295
- | 文件 / 字段 | 作用 |
296
- | --- | --- |
297
- | `package.json#dsh.bundle.patch` | 指向 `cordis.patch.yml`,声明本包是 bundle 补丁层 |
298
- | `cordis.patch.yml` | `insert` 一行,把插件挂进 profile 阵容 |
299
- | `src/index.ts` | 宿主半体:导出 `{ name, inject, apply }` 形状的 Cordis 插件 |
300
- | `package.json#dsh.client` | 可选:声明浏览器半体,Web GUI 以 `/plugins/<id>/client.js` 加载 |
301
-
302
- 服务注入两种写法:`inject: ['tools', 'webServer']` 后直接 `ctx.tools`;或运行时 `ctx.get('tools')` 判空。配置用 schemastery 导出同名 `Config` schema。
303
-
304
- ## 常见问题
305
-
306
- <details>
307
- <summary><strong>装完重启了,插件配置页里还是没有条目?</strong></summary>
308
-
309
- A: 先确认插件装进了 `web` profile(命令里的 `--profile web`),再用 `dsh --profile web --dump-config` 确认插件配置层已挂载;还不行就看上文「安装排障」。注意页面刷新不够,要重启 `dsh web` 进程。
310
-
311
- </details>
312
-
313
- <details>
314
- <summary><strong>改了插件代码不生效?</strong></summary>
315
-
316
- A: 重新 `pnpm build` 后重启 `dsh web`。如果改的是浏览器半体,可能还需要清一下浏览器缓存或硬刷新。
317
-
318
- </details>
319
-
320
- <details>
321
- <summary><strong>MCP 服务器保存后没有工具?</strong></summary>
322
-
323
- A: 等 1~2 秒 HMR;在卡片里看状态徽章与冲突提示;保存前先点「连接测试」。仍不行就检查服务器进程是否真的能启动、地址是否可达。
324
-
325
- </details>
326
-
327
- <details>
328
- <summary><strong>报 `duplicate loader entry id`?</strong></summary>
329
-
330
- A: 多半是手工往 `~/.dsh/cordis.patch.yml` 加了插件行。删掉重复行——插件行只由 bundle 补丁挂载,托管区块只放服务器配置。
331
-
332
- </details>
333
-
334
- <details>
335
- <summary><strong>`npm install` / `npm view` 报 EPERM?</strong></summary>
336
-
337
- A: 本机 `~/.npm` 缓存存在 root-owned 文件(历史 npm bug),执行 `sudo chown -R $(id -u):$(id -g) ~/.npm` 修复。pnpm 不受影响。
338
-
339
- </details>
340
-
341
- ## 已知限制
342
-
343
- - MCP 的 `~/.dsh/cordis.patch.yml` 里托管区块只应放服务器配置;手工追加插件行会导致 `duplicate loader entry id` 启动失败。
344
- - Codegraph 的 MCP 托管只对齐 codegraph 一个服务器的工作目录;DSH 的 MCP 客户端暂不声明 roots,切换项目需在 Codegraph 卡片「设为默认项目」或调用工具时传 `projectPath`。
345
- - Profile 删除为递归删除,面板内会二次确认,但一旦执行不可撤销;内置 `web` profile 受保护,`headless` 可删。
346
- - RSS 首次启动需要联网抓取;某个源不可达不会阻塞其它源,但当天 digest 可能缺少该源内容。AI 摘要依赖宿主已配置的模型(`agent-default-model` 或卡片里成对指定的 provider/model),未配置或调用失败时条目回落原文截断。
347
- - 浏览器半体依赖官方 `dsh-web-app` 的设置面板 slots 服务,非官方 Web GUI 可能不显示管理卡片。
348
- - 终端面板(dsh-tty)的 resize 透传依赖 DSH 内部 terminal handle 结构,TERM 注入需经 `-c` 包装层(DSH 硬编码 node-pty name:"dumb");详见 `packages/tty/README.md`。
349
- - 仓库安装需要 Node.js >= 22.19 与 pnpm 10,仅供开发调试;npm 安装不受影响。
157
+ **新包要建哪些文档、多长、编号怎么起**,**插件包的解剖**(`dsh.bundle.patch` / `cordis.patch.yml` /
158
+ `src/index.ts` / `dsh.client`),以及**两条容易踩的硬规矩**(客户端半体的地址来源、纯逻辑抽模块)
159
+ → [docs/conventions.md](docs/conventions.md)。
160
+
161
+ ## 文档地图
162
+
163
+ | 想知道 | 看 |
164
+ |---|---|
165
+ | 项目是什么、装哪个 | 本文件 |
166
+ | 12 个包怎么协作、依赖方向、谁写哪个配置文件 | [docs/architecture.md](docs/architecture.md) |
167
+ | 命名 / 提交 / 文档分层 / 编号规范 / 插件解剖 | [docs/conventions.md](docs/conventions.md) |
168
+ | 术语(宿主半体、托管区块、TOFU、三代插槽…) | [docs/glossary.md](docs/glossary.md) |
169
+ | 装不上、卡片不出现、接口 401/403、已知限制 | [docs/troubleshooting.md](docs/troubleshooting.md) |
170
+ | 真机测试怎么跑、什么算通过 | [docs/agent-real-test.md](docs/agent-real-test.md) |
171
+ | Windows 11 真机环境搭建 | [scripts/windows/README.md](scripts/windows/README.md) |
172
+ | 跨包待办 | [ROADMAP.md](ROADMAP.md) |
173
+ | 发版流程 | [RELEASING.md](RELEASING.md) |
174
+ | 开发环境里插件与宿主的 runtime 链接 | [docs/link-dsh-runtime.md](docs/link-dsh-runtime.md) |
175
+ | 某个包怎么用 | `packages/<pkg>/README.md` |
176
+ | 某个编号是什么意思 | `packages/<pkg>/DEFECTS.md` |
350
177
 
351
178
  ## 参与贡献
352
179
 
353
180
  - 新插件用脚手架生成:`pnpm create-plugin <name> [id]`,避免手写样板。
354
- - 提交信息遵循 Conventional Commits(如 `fix(mcp): 修复连接测试超时`),用户可见变更请附截图或验证证据。
355
- - 提交前过门禁:`pnpm typecheck && pnpm build && pnpm test && pnpm aggregate`。
356
- - 增删插件后记得跑 `pnpm aggregate` 重新生成 `packages/all` 聚合清单。
181
+ - 提交信息遵循 Conventional Commits(如 `fix(mcp): 修复连接测试超时`),
182
+ 用户可见变更请附截图或验证证据。
183
+ - 提交前过门禁:`pnpm typecheck && pnpm build && pnpm test && pnpm aggregate`;
184
+ 增删插件后必须跑 `pnpm aggregate` 重新生成 `packages/all` 聚合清单。
185
+ - 命名 / 编号 / 文档分层等完整规范见 [docs/conventions.md](docs/conventions.md)。
357
186
 
358
187
  ## 许可证
359
188
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyzyn/dsh-plugin-kit",
3
- "version": "0.1.37",
3
+ "version": "0.1.39",
4
4
  "type": "module",
5
5
  "description": "通用 DSH 插件库(pnpm monorepo):模板插件、插件开发工具包、一键聚合安装包。根包同时是全家桶 bundle(dsh.bundle.patch),DSH 与插件市场可直接识别安装。",
6
6
  "main": "lib/index.js",
@@ -14,7 +14,7 @@
14
14
  "patch": "./cordis.patch.yml"
15
15
  },
16
16
  "engines": {
17
- "dsh": ">=0.1.7-rc.1"
17
+ "dsh": ">=0.1.7-rc.2"
18
18
  }
19
19
  },
20
20
  "devDependencies": {
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@hyzyn/dsh-codegraph": "0.5.2",
43
- "@hyzyn/dsh-docker": "0.7.3",
43
+ "@hyzyn/dsh-docker": "0.8.1",
44
44
  "@hyzyn/dsh-env": "0.2.7",
45
45
  "@hyzyn/dsh-kit-settings": "0.1.1",
46
46
  "@hyzyn/dsh-mcp": "0.1.15",
@@ -48,10 +48,10 @@
48
48
  "@hyzyn/dsh-prompt": "0.1.13",
49
49
  "@hyzyn/dsh-rss": "0.3.6",
50
50
  "@hyzyn/dsh-search": "0.3.6",
51
- "@hyzyn/dsh-tty": "0.20.2"
51
+ "@hyzyn/dsh-tty": "0.21.0"
52
52
  },
53
53
  "peerDependencies": {
54
- "@deepseek-ai/dsh": "^0.1.7-rc.1"
54
+ "@deepseek-ai/dsh": "^0.1.7-rc.2"
55
55
  },
56
56
  "peerDependenciesMeta": {
57
57
  "@deepseek-ai/dsh": {