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 +42 -0
- package/README.md +34 -19
- package/README.zh.md +32 -18
- package/SPEC.md +28 -12
- package/docs/acceptance/live-owner-discovery-2026-08-28.md +64 -0
- package/docs/acceptance/release-candidate-0.1.0-rc.4.md +63 -0
- package/docs/acceptance.md +17 -4
- package/docs/technical-design.md +60 -9
- package/lib/client.js +197 -120
- package/lib/client.js.map +1 -1
- package/lib/errors-BGx4K2uq.js.map +1 -1
- package/lib/index.d.ts +76 -9
- package/lib/index.js +456 -87
- package/lib/index.js.map +1 -1
- package/lib/{search-runtime-Be3SS1k2.d.ts → search-runtime-DsmnI673.d.ts} +13 -2
- package/lib/search-runtime.d.ts +2 -2
- package/lib/search-runtime.js.map +1 -1
- package/package.json +7 -2
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
|
-
#
|
|
1
|
+
# Manage DeepSeek Harness Plugins from Chat
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/relay-dsh-plugin-manager)
|
|
4
4
|
[](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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
+
[](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
|
-
|
|
37
|
-
|
|
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
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
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
|
[](https://www.npmjs.com/package/relay-dsh-plugin-manager)
|
|
4
4
|
[](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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
**只需描述需要的能力,就能查找和管理 DSH 插件;不必离开对话,也不必手工
|
|
17
|
+
编辑 Profile 文件。**
|
|
18
|
+
|
|
19
|
+
`relay-dsh-plugin-manager` 让 DeepSeek Harness Chat 可以查找、安装、更新、
|
|
20
|
+
启用、停用和卸载插件。搜索和查看只读;任何变更执行前,DSH 都会先展示计划,
|
|
21
|
+
并等待单独确认。
|
|
22
|
+
|
|
23
|
+
[](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
|
-
|
|
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
|
-
[](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
|
|
14
|
-
Settings > Plugins. That tab
|
|
15
|
-
|
|
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
|
|
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
|
|
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 `
|
|
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
|
|
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.
|
package/docs/acceptance.md
CHANGED
|
@@ -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,
|
|
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
|
|
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,
|
|
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
|
|
package/docs/technical-design.md
CHANGED
|
@@ -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
|
-
|
|
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 >
|
|
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
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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.
|
|
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.
|
|
116
|
-
|
|
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
|