relay-dsh-plugin-manager 0.1.0-rc.3 → 0.1.0

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/CHANGELOG.md CHANGED
@@ -2,6 +2,46 @@
2
2
 
3
3
  All notable changes to this project are documented here.
4
4
 
5
+ ## [0.1.0] - 2026-08-31
6
+
7
+ ### Added
8
+
9
+ - The Settings > Plugins tab now gives each recommended plugin a self-contained
10
+ card headed by its npm package name, carrying its purpose, prerequisite, the
11
+ complete Chat message that installs it, and its post-install check.
12
+
13
+ ### Changed
14
+
15
+ - The Settings > Plugins help tab is now named "Recommended plugins" and sorts
16
+ ahead of the built-in tabs, so it is the tab Settings > Plugins opens on.
17
+ - The tab's copy is condensed and rescoped. Tab-level text claims nothing about
18
+ a specific plugin; anything true of one plugin lives on that plugin's card.
19
+ The former heading, introduction, standalone confirmation notice, and
20
+ search/remove/list example table are gone.
21
+ - The discovery example no longer names a specific third-party integration.
22
+
23
+ ### Compatibility
24
+
25
+ - This release retains the verified DSH `0.1.1-rc.2` baseline. It does not include
26
+ migration to the client APIs introduced in DSH `0.1.2-alpha.2`.
27
+
28
+ ## [0.1.0-rc.4] - 2026-08-28
29
+
30
+ ### Added
31
+
32
+ - GitHub owner discovery with exact-owner ranking, actionable owner-only inspect
33
+ errors, and round-trippable repository identities.
34
+ - Plugin-owned DSH choice confirmation that validates the exact plan answer and
35
+ executes without requiring a duplicate typed confirmation.
36
+ - One-plan, one-confirmation multi-plugin installation with serial child
37
+ outcomes and required peer-dependency preflight.
38
+ - Explicit restart-required and manual-restart operation terminal states.
39
+
40
+ ### Changed
41
+
42
+ - Confirmed plugin operations now queue in FIFO order instead of failing while
43
+ another mutation is active.
44
+
5
45
  ## [0.1.0-rc.3] - 2026-08-26
6
46
 
7
47
  ### Added
@@ -37,3 +77,5 @@ All notable changes to this project are documented here.
37
77
  [0.1.0-rc.1]: https://github.com/yangbobo2021/relay-dsh-plugin-manager/releases/tag/v0.1.0-rc.1
38
78
  [0.1.0-rc.2]: https://github.com/yangbobo2021/relay-dsh-plugin-manager/releases/tag/v0.1.0-rc.2
39
79
  [0.1.0-rc.3]: https://github.com/yangbobo2021/relay-dsh-plugin-manager/compare/v0.1.0-rc.2...v0.1.0-rc.3
80
+ [0.1.0-rc.4]: https://github.com/yangbobo2021/relay-dsh-plugin-manager/compare/v0.1.0-rc.3...v0.1.0-rc.4
81
+ [0.1.0]: https://github.com/yangbobo2021/relay-dsh-plugin-manager/compare/v0.1.0-rc.4...v0.1.0
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Plugin Manager for DeepSeek Harness
1
+ # Manage DeepSeek Harness Plugins from Chat
2
2
 
3
3
  [![npm version](https://img.shields.io/npm/v/relay-dsh-plugin-manager?label=npm)](https://www.npmjs.com/package/relay-dsh-plugin-manager)
4
4
  [![CI](https://github.com/yangbobo2021/relay-dsh-plugin-manager/actions/workflows/ci.yml/badge.svg)](https://github.com/yangbobo2021/relay-dsh-plugin-manager/actions/workflows/ci.yml)
@@ -13,10 +13,24 @@ English | [中文](README.zh.md)
13
13
  **npm package:** [`relay-dsh-plugin-manager`](https://www.npmjs.com/package/relay-dsh-plugin-manager)
14
14
  · [Relay DSH plugin catalog](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/dsh-plugins.md)
15
15
 
16
- `relay-dsh-plugin-manager` lets you discover and manage DSH plugins directly
17
- from a DeepSeek Harness Chat conversation. Ask for the capability you need, or
18
- ask DSH to install, update, enable, disable, or remove a plugin. DSH shows a plan
19
- and waits for confirmation before changing your Profile.
16
+ **Find and manage DSH plugins by describing what you need, without leaving the
17
+ conversation or editing Profile files by hand.**
18
+
19
+ `relay-dsh-plugin-manager` lets DeepSeek Harness Chat discover, install, update,
20
+ enable, disable, and remove plugins. Search and inspection are read-only. Before
21
+ any change, DSH shows the plan and waits for a separate confirmation.
22
+
23
+ [![Plugin Manager installs relay-dsh-plugin-codex successfully in DSH](https://raw.githubusercontent.com/yangbobo2021/Relay/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-success.png)](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.en.mp4?raw=1)
24
+
25
+ *Watch the [40-second real DSH run](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.en.mp4?raw=1):
26
+ search, review a no-change plan, confirm separately, and finish with the Codex
27
+ plugin installed. Recorded on official DSH commit
28
+ [`b150a551`](https://github.com/deepseek-ai/deepseek-harness/commit/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e)
29
+ with Plugin Manager `0.1.0-rc.3` and Codex plugin `0.1.2`.*
30
+
31
+ If conversation-first plugin management is useful to you,
32
+ [star this plugin](https://github.com/yangbobo2021/relay-dsh-plugin-manager) and
33
+ [share your install result or missing plugin use case](https://github.com/yangbobo2021/relay-dsh-plugin-manager/issues).
20
34
 
21
35
  ## Install
22
36
 
@@ -33,8 +47,12 @@ Then start or restart DSH Web:
33
47
  dsh web
34
48
  ```
35
49
 
36
- The plugin appears under **Settings > Plugins > Plugin marketplace**. This page
37
- is a short help view; plugin management itself happens in Chat.
50
+ If `dsh` is not on `PATH`, replace it with
51
+ `pnpm dlx @deepseek-ai/dsh@0.1.1-rc.2` in both commands.
52
+
53
+ The plugin appears under **Settings > Plugins > Recommended plugins**, the tab
54
+ that Settings > Plugins opens on. It presents the recommended conversation-backend
55
+ plugins and a short help view; plugin management itself happens in Chat.
38
56
 
39
57
  ### Installed by KeySync
40
58
 
@@ -49,7 +67,9 @@ Describe what you want in ordinary language:
49
67
 
50
68
  ```text
51
69
  Find a plugin that connects to Lark
70
+ Find DSH plugins owned by GitHub user yangbobo2021
52
71
  Install relay-dsh-plugin-codex
72
+ Install relay-dsh-plugin-codex, relay-dsh-plugin-files, and relay-dsh-plugin-terminal together
53
73
  List my installed plugins and their status
54
74
  Disable example-dsh-plugin
55
75
  Remove example-dsh-plugin
@@ -59,22 +79,17 @@ You can also use the single `/plugins` command:
59
79
 
60
80
  ```text
61
81
  /plugins find a workspace file browser
82
+ /plugins search owner:yangbobo2021
62
83
  /plugins install relay-dsh-plugin-files
63
84
  ```
64
85
 
65
86
  Search and inspection are read-only. Installation, update, removal, enablement,
66
- disablement, and restart always show a plan and require a later confirmation.
67
-
68
- ## Real Install Demo
69
-
70
- [![Plugin Manager installs relay-dsh-plugin-codex successfully in DSH](https://raw.githubusercontent.com/yangbobo2021/Relay/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-success.png)](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.en.mp4?raw=1)
71
-
72
- Watch the [38-second real DSH run](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.en.mp4?raw=1):
73
- search, planning without changes, separate confirmation, installation, and the
74
- final `succeeded` status. It was recorded against official DSH commit
75
- [`b150a551`](https://github.com/deepseek-ai/deepseek-harness/commit/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e)
76
- with Plugin Manager `0.1.0-rc.2` and Codex plugin `0.1.2`. DSH reports when a
77
- restart is required after installation.
87
+ disablement, and restart always show a plan. You can confirm with DSH's choice
88
+ UI, or explicitly approve in a later Chat message.
89
+ When you request multiple installs together, DSH shows one ordered plan and any
90
+ missing companion peers, waits for one confirmation, and runs the installs in
91
+ sequence. Completed changes that still need restart are reported explicitly as
92
+ restart-required or waiting for a manual restart.
78
93
 
79
94
  ## Part of Relay
80
95
 
package/README.zh.md CHANGED
@@ -1,4 +1,4 @@
1
- # DeepSeek Harness 插件管理器
1
+ # DeepSeek Harness 对话中管理插件
2
2
 
3
3
  [![npm 版本](https://img.shields.io/npm/v/relay-dsh-plugin-manager?label=npm)](https://www.npmjs.com/package/relay-dsh-plugin-manager)
4
4
  [![CI](https://github.com/yangbobo2021/relay-dsh-plugin-manager/actions/workflows/ci.yml/badge.svg)](https://github.com/yangbobo2021/relay-dsh-plugin-manager/actions/workflows/ci.yml)
@@ -13,9 +13,24 @@
13
13
  **npm 包名:** [`relay-dsh-plugin-manager`](https://www.npmjs.com/package/relay-dsh-plugin-manager)
14
14
  · [Relay DSH 插件目录](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/dsh-plugins.zh.md)
15
15
 
16
- `relay-dsh-plugin-manager` 让你直接在 DeepSeek Harness 的 Chat 对话中寻找和
17
- 管理 DSH 插件。你可以描述需要的能力,也可以让 DSH 安装、更新、启用、停用
18
- 或卸载插件。修改 Profile 前,DSH 会先展示操作计划并等待确认。
16
+ **只需描述需要的能力,就能查找和管理 DSH 插件;不必离开对话,也不必手工
17
+ 编辑 Profile 文件。**
18
+
19
+ `relay-dsh-plugin-manager` 让 DeepSeek Harness Chat 可以查找、安装、更新、
20
+ 启用、停用和卸载插件。搜索和查看只读;任何变更执行前,DSH 都会先展示计划,
21
+ 并等待单独确认。
22
+
23
+ [![插件管理器在 DSH 中成功安装 relay-dsh-plugin-codex](https://raw.githubusercontent.com/yangbobo2021/Relay/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-success.png)](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.zh.mp4?raw=1)
24
+
25
+ *查看 [38 秒真实 DSH 运行录像](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.zh.mp4?raw=1):
26
+ 从搜索、查看不产生变更的计划、单独确认,到 Codex 插件安装完成。录像基于官方
27
+ DSH 提交
28
+ [`b150a551`](https://github.com/deepseek-ai/deepseek-harness/commit/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e),
29
+ 使用 Plugin Manager `0.1.0-rc.2` 和 Codex 插件 `0.1.2`。*
30
+
31
+ 如果这种对话式插件管理对你有用,欢迎
32
+ [Star 本插件](https://github.com/yangbobo2021/relay-dsh-plugin-manager),并
33
+ [反馈安装结果或缺少的插件场景](https://github.com/yangbobo2021/relay-dsh-plugin-manager/issues)。
19
34
 
20
35
  ## 安装
21
36
 
@@ -31,8 +46,11 @@ dsh plugin --profile web add relay-dsh-plugin-manager@latest
31
46
  dsh web
32
47
  ```
33
48
 
34
- 安装后可以在 **设置 > 插件 > 插件市场** 看到简短帮助。实际的插件管理仍在
35
- Chat 对话中完成。
49
+ 如果 `PATH` 中没有 `dsh`,请在两条命令中将它替换为
50
+ `pnpm dlx @deepseek-ai/dsh@0.1.1-rc.2`。
51
+
52
+ 安装后,**设置 > 插件** 会默认打开 **推荐插件** 标签页,在这里介绍推荐的
53
+ 对话后端插件,并附一份简短帮助。实际的插件管理仍在 Chat 对话中完成。
36
54
 
37
55
  ### KeySync 已内置安装
38
56
 
@@ -46,7 +64,9 @@ Chat 对话中完成。
46
64
 
47
65
  ```text
48
66
  找一个能连接飞书的插件
67
+ 查找 GitHub 用户 yangbobo2021 发布的 DSH 插件
49
68
  安装 relay-dsh-plugin-codex
69
+ 一起安装 relay-dsh-plugin-codex、relay-dsh-plugin-files 和 relay-dsh-plugin-terminal
50
70
  列出已安装插件及其状态
51
71
  停用 example-dsh-plugin
52
72
  卸载 example-dsh-plugin
@@ -56,21 +76,15 @@ Chat 对话中完成。
56
76
 
57
77
  ```text
58
78
  /plugins 找一个工作区文件浏览插件
79
+ /plugins 搜索 owner:yangbobo2021
59
80
  /plugins 安装 relay-dsh-plugin-files
60
81
  ```
61
82
 
62
- 搜索和查看不会修改配置。安装、更新、卸载、启用、停用和重启都会先展示计划,
63
- 并要求用户在后续消息中明确确认。
64
-
65
- ## 真实安装演示
66
-
67
- [![插件管理器在 DSH 中成功安装 relay-dsh-plugin-codex](https://raw.githubusercontent.com/yangbobo2021/Relay/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-success.png)](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.mp4?raw=1)
68
-
69
- 查看 [38 秒真实 DSH 运行录像](https://github.com/yangbobo2021/Relay/blob/codex/relay-foundation/docs/media/dsh-plugin-manager-codex-install-demo.mp4?raw=1):
70
- 从搜索、只生成计划、单独确认,到安装完成并显示 `succeeded`。录像基于官方 DSH
71
- 提交 [`b150a551`](https://github.com/deepseek-ai/deepseek-harness/commit/b150a551b8d465e31e418e1b2eaf5e79bbb7d28e),
72
- 使用 Plugin Manager `0.1.0-rc.2` 和 Codex 插件 `0.1.2`;安装后如需重启,
73
- DSH 会明确提示。
83
+ 搜索和查看不会修改配置。安装、更新、卸载、启用、停用和重启都会先展示计划。
84
+ 你可以直接在 DSH 的选项界面中确认,也可以在后续 Chat 消息中明确批准。
85
+ 一次请求安装多个插件时,DSH 会展示一份有序计划和缺失的配套 peer 插件,等待
86
+ 一次确认后依次安装。修改完成但仍需重启时,状态会明确区分“需要另行重启”和
87
+ “等待人工重启”。
74
88
 
75
89
  ## 与 Relay 的关系
76
90
 
package/SPEC.md CHANGED
@@ -10,9 +10,12 @@ Relay DSH Plugin Manager is a conversation-first, independently installable
10
10
  DeepSeek Harness bundle. It discovers and manages DSH profile plugins through
11
11
  conversation, without management controls or public management HTTP routes.
12
12
 
13
- The package contributes a read-only Plugin Marketplace help tab under
14
- Settings > Plugins. That tab explains how to search, install, remove, and list
15
- plugins from Chat; it does not call the Host or mutate plugin state.
13
+ The package contributes a read-only recommended-plugins tab under
14
+ Settings > Plugins. That tab gives each recommended plugin one self-contained
15
+ card headed by its npm package name, carrying its purpose, prerequisite, the
16
+ complete Chat message that installs it, and the check that confirms it worked.
17
+ It then points at Chat for installing, reviewing, or removing any other plugin;
18
+ it does not call the Host or mutate plugin state.
16
19
 
17
20
  The user may enter `/plugins <request>` or describe the same request in ordinary
18
21
  conversation. Both paths use the same model-facing tools and Host management
@@ -26,23 +29,26 @@ service.
26
29
  | PM-002 | Keep the model surface compact: one discovery tool and one management tool. Natural-language and slash-command requests use these tools. |
27
30
  | PM-003 | List profile dependencies with installed source, bundle membership, package-level enablement, runtime phase, and pending-restart state. |
28
31
  | PM-004 | Provide a versioned `ctx.pluginSearch` registry. Other installed plugins may register abortable search providers. Providers discover candidates only and cannot install or mutate the profile. |
29
- | PM-005 | Search all registered providers concurrently with bounded results, timeout/cancellation, provenance, provider-error isolation, and repository/package-identity deduplication. |
30
- | PM-006 | Ship npm and GitHub search providers. Preserve a syntactically valid exact npm package-name query even when npm search ranking omits it. Search results are inspected before being reported as installable DSH plugins. |
31
- | PM-007 | Accept only core-owned npm and GitHub install-source types. Resolve npm to an exact semantic version with registry integrity and GitHub to a full 40-character commit. |
32
+ | PM-005 | Search all registered providers concurrently with bounded results, timeout/cancellation, provenance, provider-error isolation, and repository/package-identity deduplication. Exact typed intent matches sort before unrelated provider-local ranks. Results expose repository owner, aggregate providers, and bounded match reasons. |
33
+ | PM-006 | Ship npm and GitHub search providers. Preserve a syntactically valid exact npm package-name query even when npm search ranking omits it. Support explicit GitHub owner queries and conservative inferred bare-owner hints; inferred hints with no owned DSH repositories fall back to ordinary GitHub keyword search. Search results are inspected before being reported as installable DSH plugins. |
34
+ | PM-007 | Accept only core-owned npm and GitHub install-source types. GitHub repositories accept `github:owner/repo`, `https://github.com/owner/repo`, and the emitted identity `github.com/owner/repo`. Resolve npm to an exact semantic version with registry integrity and GitHub to a full 40-character commit. |
32
35
  | PM-008 | Inspect the resolved package manifest and require a valid package name plus a DSH surface (`dsh.bundle.patch` or `dsh.client`). Search providers cannot bypass this validation. |
33
- | PM-009 | Every install, remove, update, enable, disable, or restart starts with an immutable plan. A later execute call requires the unexpired, one-use confirmation token returned by that plan. The token is bound to the planning DSH Session and cannot execute until that Session contains a newer user message; the original request is mechanically not confirmation. Execution also refuses a stale plan when the target profile dependency changed after planning. |
36
+ | PM-009 | Every install, multi-install, remove, update, enable, disable, or restart starts with an immutable plan and an unexpired, one-use confirmation token bound to the planning DSH Session. A plain `execute` call requires a newer user message in that Session, so the original request is mechanically not confirmation. A `confirm` call may instead ask the user through the controlled UI flow defined by PM-023. Execution also refuses a stale plan when any target profile dependency changed after planning. |
34
37
  | PM-010 | Install and update through argv-only invocation of the currently running DSH CLI: `dsh plugin --profile web add --save-exact <immutable-source>`. Never build a shell command string. |
35
38
  | PM-011 | Remove through argv-only `dsh plugin --profile web remove <package>`. Verify dependency and bundle postconditions and reconcile a half-removed profile conservatively. |
36
39
  | PM-012 | Enable and disable are package-level projections over owned Cordis Loader entries. Persist manager-owned `disabled` overrides in the profile patch, report `mixed` or `unknown` when ownership is not safely reducible, and never disable the manager itself or protected DSH infrastructure. A disable plan warns that conversations using the target plugin may be interrupted. |
37
40
  | PM-013 | Attempt restart-free activation for newly installed client-only packages and bundles whose patches contain only plain insert rows. Attempt live disposal for removals. Otherwise report `restartRequired` with a concrete reason. |
38
41
  | PM-014 | Enable/disable changes use Loader HMR and normally require no restart. A failed or unverifiable live transition reports pending restart rather than claiming success. |
39
- | PM-015 | Mutations run as tracked operations with stable ids, progress snapshots, terminal exit state, cooperative cancellation, and one active mutation at a time. |
42
+ | PM-015 | Mutations run as tracked FIFO operations with stable ids, progress snapshots, explicit terminal exit state, cooperative cancellation, and one active top-level mutation at a time; additional confirmed operations remain queued rather than failing busy. A multi-install is one top-level operation whose child installs run serially, stop on the first failure, and retain succeeded, failed, skipped, or cancelled child outcomes. Successful mutations that still need restart terminate as `succeeded_restart_required` when a separately confirmed automatic restart is available, or `waiting_for_manual_restart` when it is not. |
40
43
  | PM-016 | Restart is a separately planned operation. When allowed, relaunch the exact current DSH entry/argv/environment through a detached helper, then stop the old process. Refuse automatic restart under a detected service supervisor or explicit disable setting. |
41
44
  | PM-017 | Snapshot the profile manifest before package mutations. Restore failed install/update manifest residue; detect and reconcile a remove that deleted package files before pnpm failed. Never report success before dependency source, installed package identity/version, DSH surface, and bundle-membership postconditions pass. |
42
45
  | PM-018 | Reject unsafe source tokens, flags, whitespace/control characters, shell metacharacters, unsupported URL hosts, ambiguous package names, and mutable execution sources. Build scripts remain governed by pnpm/DSH and are never silently authorized. |
43
46
  | PM-019 | Expose no public plugin-management HTTP routes and impose no client-address, Origin, CORS, or loopback policy. The callable surface is the in-process DSH command/tool plane. |
44
47
  | PM-020 | Remain independently installable. Do not import Relay parent implementation code or KeySync implementation code. Runtime interactions use DSH/Cordis public services and the official CLI. |
45
- | PM-021 | Contribute one localized, read-only `marketplace` tab to `settings.plugins.tab`. It briefly explains conversation-based discovery and lifecycle management, includes representative search/install/remove/list prompts, and states that mutations wait for confirmation. It exposes no management control, Remote call, or additional Host service. |
48
+ | PM-021 | Contribute one localized, read-only `marketplace` tab to `settings.plugins.tab`, sorted ahead of the Host's own tabs so Settings > Plugins opens on it. Each recommended plugin owns one self-contained card: its exact npm package name as the heading, its purpose, its prerequisite, one complete Chat message that installs it by that exact package name, and its post-install check. Tab-level copy claims nothing about a specific plugin and points at Chat for installing, reviewing, or removing any other plugin. It exposes no management control, Remote call, or additional Host service. |
49
+ | PM-022 | Preserve required manifest peer-dependency metadata during source inspection while respecting `peerDependenciesMeta.optional`. A multi-install plan reports required peers absent from both the current profile and the requested set, deduplicated with their ranges, dependents, and suggested npm source. Planning never silently adds an unrequested companion plugin. |
50
+ | PM-023 | `plugin_manage confirm` owns its DSH question: it validates the token, expiry, and exact Session before asking; supplies a stable plan-specific id, visible plan detail, exact approve/decline options, and `plan-review` intent; and executes in that same tool call only for the exact single approve answer. Declines, malformed or unrelated answers, provider failure/cancellation, and cross-session attempts do not execute or consume a still-valid plan. Generic model-authored question results are never mutation authority. |
51
+ | PM-024 | GitHub owner discovery recognizes `owner:<name>`, owner-only GitHub identities, `<name> DSH plugins`, and conservative bare identifiers containing digits. It sends a typed owner intent to providers, uses GitHub's exact owner qualifier, case-insensitively verifies returned ownership, and ranks verified owner matches first. Owner-only `inspect` fails with an actionable error directing callers to search. Every emitted repository identity is accepted by `inspect`; every recommended immutable source is accepted by `plan`. |
46
52
 
47
53
  ## Command Grammar
48
54
 
@@ -62,11 +68,20 @@ behavior drift between direct commands and conversation.
62
68
 
63
69
  Read-only actions: `list`, `search`, `inspect`, `status`.
64
70
 
71
+ `search` accepts capability text or GitHub owner forms such as
72
+ `owner:yangbobo2021`. `inspect` accepts npm sources and all three GitHub
73
+ repository forms from PM-007. An owner without a repository belongs to
74
+ `search`, not `inspect`.
75
+
65
76
  ### `plugin_manage`
66
77
 
67
- State-changing workflow actions: `plan`, `execute`, `status`, `cancel`.
78
+ State-changing workflow actions: `plan`, `confirm`, `execute`, `status`, `cancel`.
68
79
  `plan` carries one operation from `install`, `remove`, `update`, `enable`,
69
- `disable`, or `restart`. `execute` accepts only a confirmation token.
80
+ `disable`, `restart`, or `install_many`. `install_many` accepts a bounded,
81
+ non-empty `sources` array and returns one ordered aggregate plan. `confirm`
82
+ accepts the token and owns the DSH choice UI plus exact-answer validation.
83
+ `execute` accepts the token after a later explicit chat message. The Agent must
84
+ not wrap a plugin plan in the generic `ask_user_question` tool.
70
85
 
71
86
  ## Search Extension Contract
72
87
 
@@ -81,11 +96,12 @@ one provider before deterministic cross-provider ordering.
81
96
  ## Explicit Non-Goals
82
97
 
83
98
  - Settings controls, dashboard, or any other second management workflow. The
84
- read-only Plugin Marketplace help tab is explicitly in scope.
99
+ read-only recommended-plugins help tab is explicitly in scope.
85
100
  - Public management REST/HTTP endpoints.
86
101
  - Provider-defined installers, shell commands, or arbitrary pnpm arguments.
87
102
  - Arbitrary tarball, filesystem, SSH Git, or non-GitHub Git installation in the
88
103
  first release.
89
104
  - Automatic mutation based only on a search query.
105
+ - Silent installation of peer or companion plugins that the user did not request.
90
106
  - Automatic restart as part of install/update/remove.
91
107
  - Managing profiles other than the running `web` profile in the first release.
@@ -0,0 +1,64 @@
1
+ # Live GitHub Owner Discovery Acceptance - 2026-08-28
2
+
3
+ ## Scope
4
+
5
+ This record validates Issue #3 against the real npm and GitHub services and a
6
+ published DSH runtime. It covers GitHub-owner discovery, schemeless repository
7
+ inspection, immutable-source planning, the complete Codex plugin lifecycle, and
8
+ the existing three-plugin batch flow.
9
+
10
+ ## Environment
11
+
12
+ - Date: 2026-08-28 (Asia/Shanghai)
13
+ - Node.js: v25.5.0
14
+ - npm: 11.8.0
15
+ - pnpm: 11.19.0
16
+ - DSH: `@deepseek-ai/dsh@0.1.1-rc.2`
17
+ - Plugin manager base commit: `8d78cd267bd12cea246c97d36a233098d5ceb5ed`
18
+
19
+ The test used an isolated temporary DSH home. It did not make an LLM request,
20
+ require an LLM credential, or persist credentials in repository artifacts.
21
+
22
+ ## Command
23
+
24
+ ```sh
25
+ DSH_CLI_PATH=test/fixtures/dsh-runtime/node_modules/@deepseek-ai/dsh/lib/bin.js \
26
+ npm run acceptance:live:codex
27
+ ```
28
+
29
+ ## Observed Results
30
+
31
+ The live suite passed both tests in 27.8 seconds.
32
+
33
+ The explicit owner query `owner:yangbobo2021` returned and prioritized all six
34
+ owner-matching DSH repositories before unrelated results:
35
+
36
+ 1. `yangbobo2021/relay-dsh-plugin-codex`
37
+ 2. `yangbobo2021/relay-dsh-plugin-claude`
38
+ 3. `yangbobo2021/relay-dsh-plugin-files`
39
+ 4. `yangbobo2021/relay-dsh-plugin-workbench`
40
+ 5. `yangbobo2021/relay-dsh-plugin-manager`
41
+ 6. `yangbobo2021/relay-dsh-plugin-terminal`
42
+
43
+ Each prioritized result exposed its repository owner, contributing provider,
44
+ and exact-owner match reason. Core inspection independently verified the owner
45
+ before the result received exact-match priority.
46
+
47
+ The schemeless identity
48
+ `github.com/yangbobo2021/relay-dsh-plugin-codex` inspected successfully and
49
+ resolved to immutable commit
50
+ `ef65b29dd52c92278a2717f19d2a8f056cefdfaa`. The emitted repository identity
51
+ and immutable recommended source were accepted directly by the next inspect and
52
+ plan actions.
53
+
54
+ The existing live lifecycle also passed for Codex from npm and GitHub,
55
+ including install, enable, disable, update, uninstall, operation polling, Loader
56
+ state, and web boot with HTTP 200. The live batch flow passed for Codex, Files,
57
+ and Terminal. The npm Codex fixture resolved to version `0.1.2`.
58
+
59
+ ## Acceptance Conclusion
60
+
61
+ The live evidence satisfies the network-dependent portions of A-028 and A-029;
62
+ the automated negative suite covers A-030. Owner-oriented discovery works
63
+ without shell or direct-API workflow repair, result identities round-trip
64
+ through the plugin tools, and the pre-existing lifecycle remains operational.
@@ -0,0 +1,63 @@
1
+ # Release Candidate Acceptance - 0.1.0-rc.4
2
+
3
+ ## Scope
4
+
5
+ This record validates the cumulative delivery of PRs #4, #5, and #6 plus the
6
+ A-031 cross-feature release flow. The candidate starts from main commit
7
+ `aa0330c6d7e9ddd5f4d579481e9e14b52b4e6ea7` and changes the package version to
8
+ `0.1.0-rc.4`.
9
+
10
+ ## Environment
11
+
12
+ - Date: 2026-08-28 (Asia/Shanghai)
13
+ - Node.js: v25.5.0 locally; Node.js 22 and 24 in CI
14
+ - npm: 11.8.0
15
+ - pnpm: 11.19.0 locally; 11.7.0 in release CI
16
+ - DSH acceptance fixture: `@deepseek-ai/dsh@0.1.1-rc.2`
17
+ - npm dist-tag target: `next`
18
+
19
+ No LLM request or LLM credential was required. The repository secret scan had
20
+ no matches.
21
+
22
+ ## Cross-Feature Acceptance
23
+
24
+ A-031 runs one scenario through the real DSH `ToolRuntime`, `AgentRegistry`,
25
+ `PluginSearchRuntime`, and `UserQuestionService`, with the production
26
+ `PluginManager` and a controlled official-CLI runner boundary.
27
+
28
+ The scenario passed all of these assertions:
29
+
30
+ 1. Discovery emitted three immutable recommended sources in provider rank.
31
+ 2. Those exact values entered one `install_many` plan without profile mutation.
32
+ 3. The plan exposed the missing Workbench peer and its requesting plugin.
33
+ 4. The plugin-owned question displayed all sources and peer preflight detail.
34
+ 5. No runner call or profile mutation occurred while the UI answer was pending.
35
+ 6. One exact approval started one parent operation.
36
+ 7. Three exact `add --save-exact` calls ran serially with maximum concurrency one.
37
+ 8. Parent and child operations completed successfully and the profile contained
38
+ the three exact versions.
39
+ 9. Approval replay did not reopen the question or start another runner call.
40
+
41
+ ## Verification Results
42
+
43
+ - Typecheck: passed
44
+ - Vitest: 90 passed; 2 opt-in live tests skipped in the default suite
45
+ - Release metadata tests: 4 passed
46
+ - Build: passed
47
+ - Packed-package install through the official DSH CLI: passed
48
+ - npm production dependency audit: 0 vulnerabilities
49
+ - Credential scan: passed
50
+ - Simulated tag metadata: `v0.1.0-rc.4` -> `0.1.0-rc.4` on `next`
51
+ - Registry preflight: `0.1.0-rc.4` was not already published
52
+ - `npm publish --dry-run --tag next`: passed; 25 files, approximately 89.7 kB
53
+
54
+ The opt-in real-network suite also passed both tests. It discovered the six
55
+ owner repositories, resolved the Codex GitHub source to commit
56
+ `ef65b29dd52c92278a2717f19d2a8f056cefdfaa`, completed the npm/GitHub Codex
57
+ lifecycle, booted Web with HTTP 200, and batch-installed Codex, Files, and
58
+ Terminal through the published DSH CLI fixture.
59
+
60
+ ## Release Decision
61
+
62
+ The candidate satisfies A-001 through A-031 and is approved for publication as
63
+ `0.1.0-rc.4` after its release PR and tag workflow pass on the final commit.
@@ -22,13 +22,21 @@ This matrix is the release contract. Tests name the relevant `PM-*` ids.
22
22
  | A-014 disable warns about active-conversation interruption, writes only manager-owned patch rows, HMR-verifies state, survives reload, and enable removes only owned rows | PM-012, PM-014 | plan + profile/loader integration + real DSH walkthrough |
23
23
  | A-015 mixed, unknown, user-patch conflict, self-disable, and protected-infrastructure disable are refused or reported accurately | PM-012, PM-014 | enablement unit/integration |
24
24
  | A-016 simple insert bundle hot-mounts; complex/config patch, unavailable Include, timeout, and thrown activation require restart | PM-013 | hot-runtime unit/integration |
25
- | A-017 operation progress is bounded, a concurrent mutation is refused, cancellation reaches the runner, and terminal status is retained | PM-015 | operation integration |
25
+ | A-017 operation progress is bounded, concurrently confirmed mutations run in FIFO order with one active runner, queued cancellation never starts its runner, active cancellation reaches the runner, and terminal status is retained | PM-015 | operation unit + manager integration |
26
26
  | A-018 restart requires a separate plan, is refused under supervisor/disabled config, and schedules exact invocation otherwise | PM-016 | restart unit |
27
27
  | A-019 package exposes only a read-only help client entry, no management HTTP route, and registers exactly one command/two tools | PM-001, PM-002, PM-019, PM-021 | package/loader integration |
28
28
  | A-020 packed tarball installs through official DSH CLI into a clean profile and contributes both Host rows without modifying DSH | PM-020 | local checkout E2E + CI against the locked published DSH runtime fixture |
29
29
  | A-021 optional live-network acceptance discovers the real Codex plugin through npm/GitHub, installs npm and immutable GitHub sources in isolated DSH homes, boots the npm-installed Web profile, exercises enable/disable/update, and removes both | PM-003-PM-017 | `npm run acceptance:live:codex` |
30
30
  | A-022 a real DSH Web Session exposes both tools, serves slash-command and natural-language search, rejects same-turn confirmation, executes later confirmation, and observes Loader HMR without restarting DSH | PM-001, PM-002, PM-009, PM-012, PM-014 | release-candidate walkthrough with real Codex backend |
31
- | A-023 Settings > Plugins contains one localized Plugin Marketplace tab with search/install/remove/list Chat examples and confirmation guidance; the page has no action control, Host call, or Remote dependency | PM-019, PM-021 | client registration + server-rendered component unit tests + packed client-bundle E2E |
31
+ | A-023 Settings > Plugins opens on one localized recommended-plugins tab that gives each recommended plugin a self-contained card headed by its exact npm package name, carrying its purpose, prerequisite, a complete install message repeating that package name, and its post-install check, with tab-level copy claiming nothing about a specific plugin; the page has no action control, Host call, or Remote dependency | PM-019, PM-021 | client registration + server-rendered component unit tests + packed client-bundle E2E |
32
+ | A-024 three immutable plugin sources produce one deeply immutable plan and token, execute serially after one confirmation, expose per-child outcomes, stop/skip after failure, cancel without starting later children, and reject duplicates, invalid bounds, or aggregate stale state before mutation | PM-009, PM-010, PM-015, PM-017, PM-018 | plan/operation unit + conversation tool + fake-CLI manager integration |
33
+ | A-025 multi-install planning deduplicates missing peer dependencies, excludes optional peers and peers already installed or requested, suggests but never silently installs companions, and successful operations terminate as `succeeded`, `succeeded_restart_required`, or `waiting_for_manual_restart` according to activation and restart availability | PM-013, PM-015, PM-016, PM-022 | source/plan unit + manager integration + opt-in real Codex/Files/Terminal DSH CLI lifecycle |
34
+ | A-026 a valid Session-bound plan opens one plugin-owned DSH `plan-review` question; no mutation starts before an answer, and the exact single approve answer executes once without a typed chat message | PM-009, PM-023 | conversation state-machine unit + real UserQuestionService integration |
35
+ | A-027 decline, malformed/unrelated/custom answers, provider failure/cancellation, cross-session use, pre-prompt expiry, expiry while waiting, and approval replay never cause an unauthorized mutation; a still-valid rejected plan remains retriable, while later-message `execute` remains supported | PM-009, PM-023 | negative confirmation matrix + manager expiry/replay integration |
36
+ | A-028 explicit, natural-language, and conservative bare GitHub owner queries issue an exact owner-qualified search, verify ownership, rank inspected owner plugins ahead of unrelated rows, expose owner/provider/reason metadata, and fall back from an empty inferred hint to keyword search | PM-005, PM-006, PM-024 | query/provider unit + mixed-provider search integration + opt-in live owner search |
37
+ | A-029 `github.com/owner/repo`, canonical HTTPS, and `github:owner/repo` inspect to the same immutable plugin; emitted repository identities round-trip into inspect and recommended sources round-trip into install planning | PM-007, PM-008, PM-024 | source unit + manager integration + opt-in live schemeless inspection |
38
+ | A-030 owner-only inspect forms return actionable search guidance while malformed, unsafe, and non-GitHub inputs remain rejected without weakening source validation | PM-018, PM-024 | source/manager negative unit |
39
+ | A-031 search results feed one immutable multi-install plan through the real DSH tool and user-question registries; no mutation starts before one exact UI approval, then child installs execute serially and approval replay is rejected | PM-002, PM-005, PM-009, PM-010, PM-015, PM-023, PM-024 | combined host/tool/search/question/manager integration |
32
40
 
33
41
  ## Test Layers
34
42
 
@@ -45,7 +53,8 @@ injected fakes.
45
53
  Use temporary profiles and an in-process fake official CLI runner that performs
46
54
  the same manifest/bundle changes DSH owns. Exercise real manager orchestration,
47
55
  postconditions, rollback, operation polling, cancellation, Loader state, actual
48
- DSH command/tool registries, and model-tool execution.
56
+ DSH command/tool/user-question registries, controlled confirmation, and
57
+ model-tool execution.
49
58
 
50
59
  ### E2E
51
60
 
@@ -68,7 +77,11 @@ commit, and sanitized output.
68
77
  The current evidence record is
69
78
  [`live-codex-2026-08-26.md`](./live-codex-2026-08-26.md). The real
70
79
  conversation and Loader record is
71
- [`release-candidate-2026-08-26.md`](./release-candidate-2026-08-26.md).
80
+ [`release-candidate-2026-08-26.md`](./release-candidate-2026-08-26.md). GitHub
81
+ owner discovery and schemeless repository round-trip evidence is recorded in
82
+ [`live-owner-discovery-2026-08-28.md`](./acceptance/live-owner-discovery-2026-08-28.md).
83
+ The cumulative `0.1.0-rc.4` release decision and A-031 evidence are recorded in
84
+ [`release-candidate-0.1.0-rc.4.md`](./acceptance/release-candidate-0.1.0-rc.4.md).
72
85
 
73
86
  ## Review Gates
74
87
 
@@ -9,7 +9,7 @@ The bundle mounts two Host entries:
9
9
  model tools, and `/plugins`.
10
10
 
11
11
  It also ships one browser client entry that registers a static, read-only
12
- Plugin Marketplace help tab in `settings.plugins.tab`. The client has no Remote
12
+ recommended-plugins help tab in `settings.plugins.tab`. The client has no Remote
13
13
  dependency and exposes no management action. There is no management HTTP route.
14
14
 
15
15
  ## Request Flow
@@ -31,8 +31,10 @@ natural language --------------------------+
31
31
  |
32
32
  restart fallback
33
33
 
34
- Settings > Plugins > Plugin Marketplace
34
+ Settings > Plugins > Recommended plugins (first tab, opened by default)
35
35
  |
36
+ +-- one card per recommended plugin: package name + purpose
37
+ | + requires / install message / check
36
38
  +-- localized Chat examples only (no Host call or mutation control)
37
39
  ```
38
40
 
@@ -48,12 +50,24 @@ Two model tools are sufficient:
48
50
  - management separates planning from execution and also owns operation status
49
51
  and cancellation.
50
52
 
51
- The tool descriptions instruct the model to show a plan and wait for a later
52
- affirmative user message before calling `execute`. The conversation adapter
53
- also binds each token to the Agent Session and its latest `user/message` seq at
54
- planning time. Same-turn and cross-session execution fail before the manager
53
+ The tool descriptions instruct the model to show a plan and then use one of two
54
+ confirmation paths. `confirm` asks through the plugin-owned DSH choice UI and,
55
+ on an exact approval, executes in the same tool call. `execute` remains the
56
+ plain-chat path and requires a later affirmative user message. The conversation
57
+ adapter binds each token to the Agent Session and its latest `user/message` seq
58
+ at planning time. Same-turn and cross-session execution fail before the manager
55
59
  can consume the token.
56
60
 
61
+ The plugin-owned question has a plan-derived stable id, visible plan detail,
62
+ fixed approve and decline labels, single-selection semantics, and DSH's
63
+ `plan-review` intent. The adapter accepts only one answer with that exact id,
64
+ the exact approve label, and no custom text. It never interprets results from a
65
+ generic, model-authored `ask_user_question` call as mutation authority.
66
+ Declines, malformed answers, provider errors, and cancellation leave a valid
67
+ token retriable. Expiry is checked both before opening UI and atomically by the
68
+ manager when approval returns, covering a plan that expires while the UI is
69
+ open.
70
+
57
71
  ## Source Resolution
58
72
 
59
73
  The core recognizes only this closed union:
@@ -87,11 +101,25 @@ candidate when the registry search ranking omits it. This is not trusted as an
87
101
  installation result: the same core registry metadata, integrity, manifest, and
88
102
  DSH-surface inspection still runs before it can be returned.
89
103
 
104
+ The query parser also recognizes explicit GitHub owner forms and conservative
105
+ bare-owner hints. A typed owner intent reaches the GitHub provider, which uses
106
+ `user:<owner> topic:dsh-plugin`, verifies every returned `full_name` owner, and
107
+ marks exact matches structurally. Inferred bare hints fall back to the ordinary
108
+ keyword query when the owner search returns no repositories. Exact typed
109
+ matches sort before provider-local rank; local scores remain incomparable.
110
+
111
+ Search results expose the canonical repository owner, aggregate provider ids,
112
+ and bounded match reasons in addition to per-source provenance. The emitted
113
+ `github.com/owner/repo` identity is itself an accepted source, so it can flow
114
+ directly into `inspect`; `recommendedSource` is immutable and can flow directly
115
+ into `plan`. Owner-only identities fail inspection with guidance to use owner
116
+ search instead of falling through to npm validation.
117
+
90
118
  No provider callback participates after discovery.
91
119
 
92
120
  ## Confirmation Plans
93
121
 
94
- Plans live in memory for ten minutes. Each carries:
122
+ Plans live in memory for ten minutes. A single-mutation plan carries:
95
123
 
96
124
  - operation and profile;
97
125
  - package/source and immutable target where applicable;
@@ -105,6 +133,15 @@ compares the planned dependency source with the current profile and refuses a
105
133
  stale plan. This prevents confirmation replay, plan substitution, and mutation
106
134
  after an out-of-band profile change.
107
135
 
136
+ An `install_many` plan contains an ordered, bounded list of the same immutable
137
+ install items under one digest and confirmation token. Nested plan data is
138
+ deeply frozen. Planning resolves every source before creating the plan, rejects
139
+ duplicate package identities, and reports required peer dependencies that are
140
+ absent from both the profile and the requested list. Peers marked optional in
141
+ `peerDependenciesMeta` are excluded. Missing peers are advisory: the manager
142
+ suggests their npm source but does not silently expand the confirmed mutation
143
+ scope.
144
+
108
145
  ## Package Mutations
109
146
 
110
147
  The runner reuses the current DSH installation. When the current Node entry is
@@ -112,14 +149,28 @@ an existing file, it invokes `process.execPath <current-entry> plugin ...`;
112
149
  otherwise it uses explicit `DSH_EXECUTABLE` or the `dsh` command. Arguments are
113
150
  always an array. Windows shell fallback is limited to a bare `.cmd` executable.
114
151
 
115
- Only one mutation runs at once. Output is bounded and exposed as progress.
116
- Cancellation sends SIGTERM and later SIGKILL if needed.
152
+ Only one top-level mutation runs at once. Additional confirmed operations enter
153
+ a FIFO and retain `queued` status instead of failing busy. Plans are checked
154
+ again when they leave the queue so an intervening mutation cannot execute a
155
+ stale target. An `install_many` operation owns one queue slot and invokes child
156
+ installs serially, so child work never competes for the tracker. The batch stops
157
+ on the first child failure, retains earlier successes, and marks later children
158
+ skipped. Output is bounded and exposed as progress. Cancellation removes queued
159
+ work without starting it, or reaches the active child and prevents later
160
+ children from starting.
117
161
 
118
162
  After add succeeds, the manager verifies the saved immutable dependency, the
119
163
  installed package name and exact npm version, a declared DSH surface, and exact
120
164
  bundle membership before reporting success. A failed check restores the saved
121
165
  profile manifest and reports a failed operation.
122
166
 
167
+ Tracked operations have explicit restart-aware terminal states. A successful
168
+ mutation that needs a separately confirmed restart finishes as
169
+ `succeeded_restart_required` when the restarter is available, or
170
+ `waiting_for_manual_restart` when the deployment requires an operator action.
171
+ The mutation itself is complete in both cases; it is never left `running` while
172
+ waiting for restart.
173
+
123
174
  ## Enablement
124
175
 
125
176
  DSH has Loader-entry enablement, not a native package-level boolean. The manager