@bruc3van/dsh-doctor 0.5.9 → 0.6.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/README.en.md CHANGED
@@ -6,7 +6,7 @@ DSH Doctor is an upgrade and troubleshooting tool for DSH plugin developers and
6
6
 
7
7
  When a change depends on the plugin's business logic, Doctor calls it out for the agent or developer instead of guessing. Every edit is previewed and backed up first, and runtime checks use a temporary DSH environment rather than the developer's everyday profile.
8
8
 
9
- > This is a community-maintained third-party project, not an official DeepSeek project. The current migration scope is DSH 0.1.1 → 0.1.2. The catalog exactly covers `dsh-v0.1.1-rc.2` → `dsh-v0.1.2-rc.1` and retains the alpha.2 and alpha.3 historical rules. Differences outside those catalogs still require a separate investigation and are not proven compatible by the catalog.
9
+ > This is a community-maintained third-party project, not an official DeepSeek project. The current migration scope is DSH 0.1.1 → 0.1.5. The catalog exactly covers `dsh-v0.1.1-rc.2` → `dsh-v0.1.5-rc.2` and retains the 0.1.2 alpha.2, alpha.3, and rc.1 historical rules. Differences outside those catalogs still require a separate investigation and are not proven compatible by the catalog.
10
10
 
11
11
  ## What it helps with
12
12
 
@@ -36,21 +36,21 @@ npx skills add bruc3van/dsh-doctor
36
36
  After installation, ask the agent from inside the plugin repository that needs migration:
37
37
 
38
38
  ```text
39
- Adjust and verify this plugin so that it is compatible with DSH 0.1.2.
39
+ Adjust and verify this plugin so that it is compatible with DSH 0.1.5.
40
40
  ```
41
41
 
42
42
  The skill guides the agent to:
43
43
 
44
44
  1. establish the plugin, actual DSH installation, Harness checkout, package manager, and usable DSH Doctor;
45
45
  2. analyze source, dependencies, configuration, patches, and existing artifacts;
46
- 3. confirm whether the upgraded plugin release targets only 0.1.2 or must remain compatible with 0.1.1;
46
+ 3. confirm whether the upgraded plugin release targets only 0.1.5 or must remain compatible with 0.1.1;
47
47
  4. preview and apply exact changes allowed by that compatibility strategy, then handle semantic migrations that require business context;
48
48
  5. rebuild and report static, artifact, isolated-runtime, and business-behavior evidence separately;
49
49
  6. commit or publish through the plugin repository's own process only when the developer explicitly requests it.
50
50
 
51
51
  `npx skills add` installs agent instructions only; it does not install DSH Doctor globally. The skill checks the local CLI and npm registry first. If the local version is unsuitable, it runs a pinned version through `npm exec` without changing the global installation.
52
52
 
53
- An upgrade request does not itself authorize dropping the old runtime. When compatibility intent is missing, the skill may perform read-only analysis but asks before migration writes, dependency installation, build, or runtime commands. Dual-version mode requires separate 0.1.1 and 0.1.2 evidence; one 0.1.2 smoke test is not dual-version proof.
53
+ An upgrade request does not itself authorize dropping the old runtime. When compatibility intent is missing, the skill may perform read-only analysis but asks before migration writes, dependency installation, build, or runtime commands. Dual-version mode requires separate 0.1.1 and 0.1.5 evidence; one 0.1.5 smoke test is not dual-version proof.
54
54
 
55
55
  ## How it works
56
56
 
@@ -72,9 +72,9 @@ investigate the actual environment
72
72
  → plugin business-behavior verification
73
73
  ```
74
74
 
75
- DSH 0.1.2 changes more than package versions. Legacy owners such as `dsh-client-runtime` and `dsh-host-apiproxy` were split, while Session, Workspace, Conversation, pending interaction, and Settings capabilities moved to new controllers, UI packages, or Services. The CLI only auto-edits relationships marked `exact`; ownership, lifecycle, and business-call changes are reported as `MIG_SEMANTIC_API_CHANGE`.
75
+ Migrating from DSH 0.1.1 to 0.1.5 changes more than package versions. Legacy owners such as `dsh-client-runtime` and `dsh-host-apiproxy` were split, while Session, Workspace, Conversation, pending interaction, and Settings capabilities moved to new controllers, UI packages, or Services; between 0.1.2 and 0.1.5 no package was removed again, and the added session-format or sidebar packages are purely additive capabilities. The CLI only auto-edits relationships marked `exact`; ownership, lifecycle, and business-call changes are reported as `MIG_SEMANTIC_API_CHANGE`.
76
76
 
77
- With an exact Harness checkout, Doctor also verifies the commits behind the two catalog tags and compares entry ids in the target web profile. After the additional source interval has been investigated, `--target-version` can bind dependencies and runtime checks to a newer 0.1.2 target, but it does not extend the catalog's API claims.
77
+ With an exact Harness checkout, Doctor also verifies the commits behind the two catalog tags and compares entry ids in the target web profile. After the additional source interval has been investigated, `--target-version` can bind dependencies and runtime checks to a newer 0.1.5 target, but it does not extend the catalog's API claims.
78
78
 
79
79
  ## Core capabilities
80
80
 
package/README.md CHANGED
@@ -6,7 +6,7 @@ DSH Doctor 是给 DSH 插件开发者和 Agent 使用的升级、排障工具。
6
6
 
7
7
  遇到需要理解业务逻辑的改动,它会明确列出来交给 Agent 或开发者处理,不会直接猜。所有修改都会先生成预览并保留备份,运行验证也会放在临时 DSH 环境中,不影响日常使用的 profile。
8
8
 
9
- > 这是社区维护的第三方工具,不属于 DeepSeek 官方项目。当前迁移范围是 DSH 0.1.1 → 0.1.2;catalog 精确覆盖 `dsh-v0.1.1-rc.2` → `dsh-v0.1.2-rc.1`,并保留 alpha.2、alpha.3 历史规则。未收录的版本差异仍需单独调查,不能视为 catalog 已证明兼容。
9
+ > 这是社区维护的第三方工具,不属于 DeepSeek 官方项目。当前迁移范围是 DSH 0.1.1 → 0.1.5;catalog 精确覆盖 `dsh-v0.1.1-rc.2` → `dsh-v0.1.5-rc.2`,并保留 0.1.2 的 alpha.2、alpha.3、rc.1 历史规则。未收录的版本差异仍需单独调查,不能视为 catalog 已证明兼容。
10
10
 
11
11
  ## 它能解决什么问题
12
12
 
@@ -36,21 +36,21 @@ npx skills add bruc3van/dsh-doctor
36
36
  安装完成后,在需要迁移的插件仓库中告诉 Agent:
37
37
 
38
38
  ```text
39
- 请调整并验证当前插件,使其兼容 DSH 0.1.2
39
+ 请调整并验证当前插件,使其兼容 DSH 0.1.5
40
40
  ```
41
41
 
42
42
  Skill 会引导 Agent:
43
43
 
44
44
  1. 核实插件、实际 DSH、Harness checkout、包管理器和可用的 DSH Doctor;
45
45
  2. 分析源码、依赖、配置、patch 和已有产物;
46
- 3. 确认升级后的同一插件版本是仅支持 0.1.2,还是继续兼容 0.1.1;
46
+ 3. 确认升级后的同一插件版本是仅支持 0.1.5,还是继续兼容 0.1.1;
47
47
  4. 预览并应用符合兼容策略的精确修改,再处理需要理解业务的语义迁移;
48
48
  5. 重新构建,并分别报告静态、产物、隔离运行时和业务行为证据;
49
49
  6. 仅在开发者明确要求后,按插件仓库自己的流程提交和发布。
50
50
 
51
51
  `npx skills add` 只安装 Agent 指令,不会全局安装 DSH Doctor。Skill 会先检查本地 CLI 和 npm registry;本地版本不合适时,默认通过固定版本的 `npm exec` 运行,不会自行修改全局安装。
52
52
 
53
- 升级请求本身不代表可以放弃旧版。兼容目标未明确时,Skill 可以先做只读分析,但会在迁移写入、依赖安装、构建或运行时命令前要求确认。双版本模式必须分别验证 0.1.1 和 0.1.2,不能用一次 0.1.2 smoke 代替双版本结论。
53
+ 升级请求本身不代表可以放弃旧版。兼容目标未明确时,Skill 可以先做只读分析,但会在迁移写入、依赖安装、构建或运行时命令前要求确认。双版本模式必须分别验证 0.1.1 和 0.1.5,不能用一次 0.1.5 smoke 代替双版本结论。
54
54
 
55
55
  ## 工作原理
56
56
 
@@ -72,9 +72,9 @@ DSH Doctor 由三个相互约束的部分组成:
72
72
  → 插件业务行为验证
73
73
  ```
74
74
 
75
- DSH 0.1.2 不只是包版本变化。`dsh-client-runtime` 和 `dsh-host-apiproxy` 等旧 owner 被拆分,Session、Workspace、Conversation、pending interaction、Settings 等能力迁移到新的 controller、UI 包或 ServiceCLI 只自动修改 catalog 标记为 `exact` 的关系;所有权、生命周期和业务调用变化会作为 `MIG_SEMANTIC_API_CHANGE` 报告。
75
+ DSH 0.1.1 迁移到 0.1.5 不只是包版本变化。`dsh-client-runtime` 和 `dsh-host-apiproxy` 等旧 owner 被拆分,Session、Workspace、Conversation、pending interaction、Settings 等能力迁移到新的 controller、UI 包或 Service;0.1.2 到 0.1.5 之间没有再移除任何包,新增的 session-format、sidebar 等包是纯增量能力。CLI 只自动修改 catalog 标记为 `exact` 的关系;所有权、生命周期和业务调用变化会作为 `MIG_SEMANTIC_API_CHANGE` 报告。
76
76
 
77
- 如果提供精确 Harness checkout,Doctor 还会确认 catalog 中两个 tag 的 commit,并比较目标 web profile 的 entry id。`--target-version` 可以在完成额外源码调查后绑定更新的 0.1.2 依赖与 runtime 目标,但不会扩大 catalog 的 API 结论。
77
+ 如果提供精确 Harness checkout,Doctor 还会确认 catalog 中两个 tag 的 commit,并比较目标 web profile 的 entry id。`--target-version` 可以在完成额外源码调查后绑定更新的 0.1.5 依赖与 runtime 目标,但不会扩大 catalog 的 API 结论。
78
78
 
79
79
  ## 核心能力
80
80
 
@@ -0,0 +1,26 @@
1
+ # DSH 0.1.1-rc.2 to 0.1.5-rc.2 behavior migration
2
+
3
+ The old Client Runtime was split by ownership. There is no aggregate replacement package.
4
+
5
+ - Session control, list state, commands, projections, queue and event windows belong to `api-session-controller/client`.
6
+ - Workspace state and commands belong to `api-workspace-controller/client`; navigation policy belongs to `ui-workspace`.
7
+ - Conversation assembly belongs to `ui-conversation`; Chat and Trajectory own their respective projections.
8
+ - Approval and Question own their pending objects; `ui-session` only aggregates domain publications.
9
+ - The store engine belongs to `client-store`; React hook synthesis belongs to the renderer.
10
+ - The Host API Proxy was removed. Unary browser operations live on their natural Remote service owners.
11
+ - The demo-only `dsh-agent-spine-demo` package and the SQLite session persistence package were removed; neither has a catalog-confirmed drop-in replacement.
12
+ - `dsh-tool-subagent-report` was removed after alpha.3: child reporting and parent follow-up were unified into one Steer messaging operation (`SubagentRuntime.sendMessage`, exposed to models through `tool-subagent-control`). Migrating a report-tool integration is semantic work, not an import move.
13
+ - `dsh-code-runtime-python` was renamed to `dsh-experimental-code-runtime-python` when the package moved to the experimental tier. The module rename is exact in shape, but the experimental placement is a support-level change the developer must accept deliberately.
14
+ - 0.1.2 adds the `dsh-session-turn-outline` package and extends session submission/load-through APIs. These additions do not justify mechanical rewrites of existing plugin behavior.
15
+
16
+ ## Interval 0.1.2-rc.1 to 0.1.5-rc.2
17
+
18
+ Verified against both tags: no `@deepseek-ai/dsh-*` package was removed or renamed, and the plugin-facing entrypoints the 0.1.2 migration moves plugins onto (`dsh-settings`, `dsh-client-store`, `dsh-client-ui-session`, `dsh-client-ui-chat`, `dsh-sdk-minimal`, `dsh-webhook`) are unchanged. 0.1.3 never shipped a stable tag and 0.1.4 was skipped upstream.
19
+
20
+ - The web profile removed the patch entries `client-runtime`, `api-gateway`, `tool-subagent-report`, and `tool-str-replace-editor` (verified by scanning both refs' bundle patches; `api-gateway` the entry is gone even though the `dsh-api-gateway` package survives). A plugin overlay that patches one of these entry ids must be re-anchored to the surviving owner entry.
21
+ - 18 packages were added (session-format family with v0-to-v3 migrations, client file-upload and resources, client-ui sidebar packages, dockkit, open-in-app, http-proxy, chunked-list, package-manifest, tool-present, api-workspace-files, host-open-in-app). Additions never force a rewrite; adopt them only when the plugin needs the new capability.
22
+ - `dsh-client-connection` dropped `webServer` from its inject list; export signatures are unchanged. A plugin that injected `webServer` through this module must find the new owner itself.
23
+ - The CLI adds `--from-default-profile <name>` for creating custom profiles from shipped templates. Existing flags and the `profiles/<name>/package.json` layout are unchanged.
24
+ - Cordis stays at 4.0.2, so `--target-version 0.1.5-rc.2` pins only the DSH packages.
25
+
26
+ An import move is safe only when the catalog marks it `exact`. A `semantic` mapping identifies the new owner but still requires the plugin developer to rewrite behavior and verify the real lifecycle.
@@ -0,0 +1,36 @@
1
+ {
2
+ "platformModules": [
3
+ "react",
4
+ "react/jsx-runtime",
5
+ "react-dom",
6
+ "react-dom/client",
7
+ "@deepseek-ai/cordis",
8
+ "@deepseek-ai/dsh-client-store",
9
+ "@deepseek-ai/dsh-client-ui-slots",
10
+ "@deepseek-ai/dsh-client-ui-primitives"
11
+ ],
12
+ "profilePatchPaths": {
13
+ "web": [
14
+ "packages/bundle/base/cordis.patch.yml",
15
+ "packages/bundle/web-app/cordis.patch.yml"
16
+ ]
17
+ },
18
+ "rules": [
19
+ {
20
+ "id": "client-inject-is-informational",
21
+ "note": "dsh.client.inject lists package dependency edges; Cordis service inject controls activation."
22
+ },
23
+ {
24
+ "id": "baseline-external-is-implicit",
25
+ "note": "Platform modules are implicit and must not be repeated in dsh.client.external."
26
+ },
27
+ {
28
+ "id": "feature-values-use-services-or-slots",
29
+ "note": "Feature plugins must not use dsh.client.external as a feature-to-feature value dependency mechanism."
30
+ },
31
+ {
32
+ "id": "client-export-required",
33
+ "note": "A web dsh.client declaration requires a published exports[\"./client\"] artifact."
34
+ }
35
+ ]
36
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "dsh-v0.1.1-rc.2__dsh-v0.1.5-rc.2",
4
+ "from": {
5
+ "ref": "dsh-v0.1.1-rc.2",
6
+ "commit": "b150a551b8d465e31e418e1b2eaf5e79bbb7d28e"
7
+ },
8
+ "to": {
9
+ "ref": "dsh-v0.1.5-rc.2",
10
+ "commit": "fb2c4b9e698e30edb738bca4cf0618587db7d203",
11
+ "version": "0.1.5-rc.2"
12
+ },
13
+ "description": "DeepSeek Harness 0.1.1-rc.2 to 0.1.5-rc.2 plugin migration",
14
+ "references": {
15
+ "ownership": ".agents/notes/implemented/architecture/2026-08-20-client-session-conversation-ownership.md",
16
+ "clientRules": "packages/client/AGENTS.md",
17
+ "steerMessaging": ".agents/notes/implemented/architecture/2026-08-27-adjacent-agent-steer-messaging.md"
18
+ }
19
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "removed": [
3
+ "@deepseek-ai/dsh-acp-demo",
4
+ "@deepseek-ai/dsh-acp-snapshot",
5
+ "@deepseek-ai/dsh-agent-spine-demo",
6
+ "@deepseek-ai/dsh-client-runtime",
7
+ "@deepseek-ai/dsh-code-runtime-python",
8
+ "@deepseek-ai/dsh-host-apiproxy",
9
+ "@deepseek-ai/dsh-sdk-jsonrpc-demo",
10
+ "@deepseek-ai/dsh-session-persistence-sqlite",
11
+ "@deepseek-ai/dsh-tool-subagent-report"
12
+ ],
13
+ "added": [
14
+ "@deepseek-ai/dsh-acp-app",
15
+ "@deepseek-ai/dsh-api-session-controller",
16
+ "@deepseek-ai/dsh-api-settings-controller",
17
+ "@deepseek-ai/dsh-api-workspace-controller",
18
+ "@deepseek-ai/dsh-api-workspace-files",
19
+ "@deepseek-ai/dsh-chunked-list",
20
+ "@deepseek-ai/dsh-client-file-upload",
21
+ "@deepseek-ai/dsh-client-resources",
22
+ "@deepseek-ai/dsh-client-store",
23
+ "@deepseek-ai/dsh-client-ui-approval",
24
+ "@deepseek-ai/dsh-client-ui-chat",
25
+ "@deepseek-ai/dsh-client-ui-dockkit",
26
+ "@deepseek-ai/dsh-client-ui-open-in-app",
27
+ "@deepseek-ai/dsh-client-ui-schedule",
28
+ "@deepseek-ai/dsh-client-ui-session",
29
+ "@deepseek-ai/dsh-client-ui-sidebar-documentpreview",
30
+ "@deepseek-ai/dsh-client-ui-sidebar-files",
31
+ "@deepseek-ai/dsh-client-ui-sidebar-right",
32
+ "@deepseek-ai/dsh-deepseek-llm-api-extensions",
33
+ "@deepseek-ai/dsh-deque",
34
+ "@deepseek-ai/dsh-experimental-agent-team-profile",
35
+ "@deepseek-ai/dsh-experimental-agent-team-web-profile",
36
+ "@deepseek-ai/dsh-experimental-client-ui-agent-team",
37
+ "@deepseek-ai/dsh-experimental-code-runtime-python",
38
+ "@deepseek-ai/dsh-experimental-inspector",
39
+ "@deepseek-ai/dsh-experimental-webworker-packer",
40
+ "@deepseek-ai/dsh-experimental-webworker-runtime",
41
+ "@deepseek-ai/dsh-host-open-in-app",
42
+ "@deepseek-ai/dsh-http-proxy",
43
+ "@deepseek-ai/dsh-package-manifest",
44
+ "@deepseek-ai/dsh-plugin-package-inventory-deepseek",
45
+ "@deepseek-ai/dsh-sdk-app",
46
+ "@deepseek-ai/dsh-sdk-minimal",
47
+ "@deepseek-ai/dsh-session-format",
48
+ "@deepseek-ai/dsh-session-format-catalog",
49
+ "@deepseek-ai/dsh-session-format-v0-to-v1",
50
+ "@deepseek-ai/dsh-session-format-v1-to-v2",
51
+ "@deepseek-ai/dsh-session-format-v2-to-v3",
52
+ "@deepseek-ai/dsh-session-log-deepseek",
53
+ "@deepseek-ai/dsh-session-snapshot",
54
+ "@deepseek-ai/dsh-session-turn-outline",
55
+ "@deepseek-ai/dsh-tool-present",
56
+ "@deepseek-ai/dsh-util-crypto",
57
+ "@deepseek-ai/dsh-util-time",
58
+ "@deepseek-ai/dsh-util-values",
59
+ "@deepseek-ai/dsh-util-workspace-path",
60
+ "@deepseek-ai/dsh-webhook",
61
+ "@deepseek-ai/dsh-webhook-github",
62
+ "@deepseek-ai/dsh-win32-process"
63
+ ],
64
+ "targetVersions": {
65
+ "@deepseek-ai/cordis": "4.0.2"
66
+ },
67
+ "dependencyPolicies": {
68
+ "@deepseek-ai/cordis": {
69
+ "client": ["peerDependencies", "devDependencies"]
70
+ },
71
+ "@deepseek-ai/dsh-client-store": {
72
+ "client": ["devDependencies"]
73
+ },
74
+ "@deepseek-ai/dsh-session": {
75
+ "client": ["devDependencies"]
76
+ }
77
+ },
78
+ "semanticReplacements": {
79
+ "@deepseek-ai/dsh-client-runtime": [
80
+ "@deepseek-ai/dsh-api-session-controller",
81
+ "@deepseek-ai/dsh-api-workspace-controller",
82
+ "@deepseek-ai/dsh-client-store",
83
+ "@deepseek-ai/dsh-client-ui-session",
84
+ "@deepseek-ai/dsh-client-ui-conversation",
85
+ "@deepseek-ai/dsh-client-ui-chat",
86
+ "@deepseek-ai/dsh-client-ui-trajectory",
87
+ "@deepseek-ai/dsh-client-ui-approval",
88
+ "@deepseek-ai/dsh-client-ui-user-questions"
89
+ ],
90
+ "@deepseek-ai/dsh-host-apiproxy": [
91
+ "@deepseek-ai/dsh-api-gateway",
92
+ "@deepseek-ai/dsh-api-remotes"
93
+ ],
94
+ "@deepseek-ai/dsh-code-runtime-python": [
95
+ "@deepseek-ai/dsh-experimental-code-runtime-python"
96
+ ],
97
+ "@deepseek-ai/dsh-tool-subagent-report": [
98
+ "@deepseek-ai/dsh-tool-subagent-control"
99
+ ]
100
+ }
101
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "services": {
3
+ "sessions": {
4
+ "owner": "@deepseek-ai/dsh-api-session-controller/client",
5
+ "confidence": "semantic",
6
+ "note": "The service name survives, but Session snapshots no longer contain Conversation views or pending interactions."
7
+ },
8
+ "workspaces": {
9
+ "owner": "@deepseek-ai/dsh-api-workspace-controller/client",
10
+ "confidence": "semantic",
11
+ "note": "The service name survives, while cross-domain navigation belongs to ui-workspace."
12
+ },
13
+ "conversation": {
14
+ "owner": "@deepseek-ai/dsh-client-ui-conversation/client",
15
+ "confidence": "semantic",
16
+ "note": "Conversation assembly and input are independent of Session lifecycle snapshots."
17
+ },
18
+ "slots": {
19
+ "owner": "@deepseek-ai/dsh-client-ui-renderer/client",
20
+ "confidence": "semantic",
21
+ "note": "Slot declarations stay in ui-slots; runtime registration and binding belong to ui-renderer."
22
+ }
23
+ },
24
+ "removedHostFacade": {
25
+ "package": "@deepseek-ai/dsh-host-apiproxy",
26
+ "replacementPolicy": "Use the natural business Remote owner through generated api-remotes contributions; there is no replacement facade."
27
+ }
28
+ }
@@ -0,0 +1,134 @@
1
+ {
2
+ "modules": {
3
+ "@deepseek-ai/dsh-settings": {
4
+ "settingsNamespace": {
5
+ "toModule": "@deepseek-ai/dsh-settings",
6
+ "toSymbol": "SettingsProvider.register",
7
+ "confidence": "semantic",
8
+ "reason": "The settingsNamespace factory was removed. Inject the settings Service and register the namespace through ctx.settings.register(name, schema)."
9
+ }
10
+ },
11
+ "@deepseek-ai/dsh-client-runtime/client": {
12
+ "ClientContext": {
13
+ "toModule": "@deepseek-ai/cordis",
14
+ "toSymbol": "Context",
15
+ "confidence": "exact",
16
+ "reason": "ClientContext was a type alias of Cordis Context."
17
+ },
18
+ "createSnapshotStore": {
19
+ "toModule": "@deepseek-ai/dsh-client-store",
20
+ "toSymbol": "createSnapshotStore",
21
+ "confidence": "exact",
22
+ "reason": "The React-free store engine moved to client-store."
23
+ },
24
+ "defineStore": {
25
+ "toModule": "@deepseek-ai/dsh-client-store",
26
+ "toSymbol": "defineStore",
27
+ "confidence": "exact",
28
+ "reason": "The declarative store factory moved to client-store."
29
+ },
30
+ "ObservableSnapshot": {
31
+ "toModule": "@deepseek-ai/dsh-client-store",
32
+ "toSymbol": "ObservableSnapshot",
33
+ "confidence": "exact",
34
+ "reason": "The observable store contract moved to client-store."
35
+ },
36
+ "SnapshotStore": {
37
+ "toModule": "@deepseek-ai/dsh-client-store",
38
+ "toSymbol": "SnapshotStore",
39
+ "confidence": "exact",
40
+ "reason": "The writable store contract moved to client-store."
41
+ },
42
+ "shallowEqual": {
43
+ "toModule": "@deepseek-ai/dsh-client-store",
44
+ "toSymbol": "shallowEqual",
45
+ "confidence": "exact",
46
+ "reason": "The store equality helper moved to client-store."
47
+ },
48
+ "SessionId": {
49
+ "toModule": "@deepseek-ai/dsh-session/types",
50
+ "toSymbol": "SessionId",
51
+ "confidence": "exact",
52
+ "reason": "Session identity is owned by the Session domain."
53
+ },
54
+ "ISessions": {
55
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
56
+ "toSymbol": "ISessions",
57
+ "confidence": "semantic",
58
+ "reason": "Session ownership moved to the Session Controller and its snapshots changed."
59
+ },
60
+ "Session": {
61
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
62
+ "toSymbol": "Session",
63
+ "confidence": "semantic",
64
+ "reason": "The Client Session object and lifecycle moved to the Session Controller."
65
+ },
66
+ "SessionBinding": {
67
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
68
+ "toSymbol": "SessionBinding",
69
+ "confidence": "semantic",
70
+ "reason": "Session bindings are now Controller-owned lifetimes."
71
+ },
72
+ "SessionListState": {
73
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
74
+ "toSymbol": "SessionListState",
75
+ "confidence": "semantic",
76
+ "reason": "The list state moved and no longer owns Conversation or pending-interaction facts."
77
+ },
78
+ "SessionSummary": {
79
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
80
+ "toSymbol": "SessionSummary",
81
+ "confidence": "semantic",
82
+ "reason": "The Session summary is now a Controller-owned control snapshot."
83
+ },
84
+ "UseProjection": {
85
+ "toModule": "@deepseek-ai/dsh-api-session-controller/client",
86
+ "toSymbol": "UseProjection",
87
+ "confidence": "semantic",
88
+ "reason": "Projection sources are now exposed by Session Controller bindings and adapted by ui-session."
89
+ },
90
+ "IWorkspaces": {
91
+ "toModule": "@deepseek-ai/dsh-api-workspace-controller/client",
92
+ "toSymbol": "IWorkspaces",
93
+ "confidence": "semantic",
94
+ "reason": "Workspace ownership moved to the Workspace Controller and navigation policy moved to ui-workspace."
95
+ },
96
+ "WorkspaceId": {
97
+ "toModule": "@deepseek-ai/dsh-api-workspace-controller/client",
98
+ "toSymbol": "WorkspaceId",
99
+ "confidence": "semantic",
100
+ "reason": "Workspace identity is re-exported by the Workspace Controller."
101
+ },
102
+ "WorkspaceView": {
103
+ "toModule": "@deepseek-ai/dsh-api-workspace-controller/client",
104
+ "toSymbol": "WorkspaceView",
105
+ "confidence": "semantic",
106
+ "reason": "Workspace snapshots are Controller-owned and their shape changed."
107
+ },
108
+ "ConversationNode": {
109
+ "toModule": "@deepseek-ai/dsh-client-ui-conversation/client",
110
+ "toSymbol": "ConversationNode",
111
+ "confidence": "semantic",
112
+ "reason": "Conversation assembly moved out of Session snapshots into ui-conversation."
113
+ },
114
+ "ConversationSnapshot": {
115
+ "toModule": "@deepseek-ai/dsh-client-ui-conversation/client",
116
+ "toSymbol": "ConversationSnapshot",
117
+ "confidence": "semantic",
118
+ "reason": "Conversation is now an independent target-neutral source."
119
+ },
120
+ "PendingInteraction": {
121
+ "toModule": "@deepseek-ai/dsh-client-ui-session/client",
122
+ "toSymbol": "SessionPendingInteraction",
123
+ "confidence": "semantic",
124
+ "reason": "Approval and Question now publish domain-owned pending interactions through ui-session."
125
+ },
126
+ "PendingWait": {
127
+ "toModule": "@deepseek-ai/dsh-client-ui-session/client",
128
+ "toSymbol": "SessionPendingInteraction",
129
+ "confidence": "semantic",
130
+ "reason": "The Runtime PendingWait aggregate was removed; pending domains own their payloads."
131
+ }
132
+ }
133
+ }
134
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bruc3van/dsh-doctor",
3
- "version": "0.5.9",
4
- "description": "Help agents diagnose and upgrade DeepSeek Harness plugins from DSH 0.1.1 to 0.1.2",
3
+ "version": "0.6.0",
4
+ "description": "Help agents diagnose and upgrade DeepSeek Harness plugins from DSH 0.1.1 to 0.1.5",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "repository": {
@@ -1,22 +1,22 @@
1
1
  ---
2
2
  name: dsh-plugin-upgrade
3
- description: "Help migrate a DeepSeek Harness (DSH) plugin from DSH 0.1.1 to 0.1.2 with the dsh-doctor CLI, deciding explicitly up front whether the upgraded release must stay compatible with DSH 0.1.1. Use when a plugin developer plans a migration or compatibility assessment: checking what changed between DSH versions, replacing imports of packages 0.1.2 removed (such as dsh-client-runtime or dsh-host-apiproxy), migrating settingsNamespace to the settings Service, updating DSH dependency ranges, or verifying and preparing a plugin release for 0.1.2. Applies only catalog-confirmed exact rewrites automatically and guides the semantic changes that need developer judgment. Not for debugging a plugin that already targets 0.1.2, general DSH usage or configuration questions, or developing the Harness itself."
3
+ description: "Help migrate a DeepSeek Harness (DSH) plugin from DSH 0.1.1 to 0.1.5 with the dsh-doctor CLI, deciding explicitly up front whether the upgraded release must stay compatible with DSH 0.1.1. Use when a plugin developer plans a migration or compatibility assessment: checking what changed between DSH versions, replacing imports of packages 0.1.5 removed (such as dsh-client-runtime or dsh-host-apiproxy), migrating settingsNamespace to the settings Service, updating DSH dependency ranges, or verifying and preparing a plugin release for 0.1.5. Applies only catalog-confirmed exact rewrites automatically and guides the semantic changes that need developer judgment. Not for debugging a plugin that already targets 0.1.5, general DSH usage or configuration questions, or developing the Harness itself."
4
4
  ---
5
5
 
6
- # Upgrade a DSH 0.1.1 plugin to 0.1.2
6
+ # Upgrade a DSH 0.1.1 plugin to 0.1.5
7
7
 
8
8
  Help the developer diagnose and modify one plugin at a time. Treat source migration, artifact verification, runtime activation, and business behavior as separate gates.
9
9
 
10
- The migration knowledge covers the DSH 0.1.1 to 0.1.2 transition, derived and verified from one exact catalog version pair (declared below). Keep the skill's product scope at the release-line level (`0.1.1` to `0.1.2`), while keeping the catalog target exact. First record the plugin's actual DSH ranges and requested target. When a newer patch or prerelease appears, use the catalog for known changes only, inspect the additional interval, and report that it is not catalog-confirmed until the catalog and this skill are deliberately updated — a pass for the catalog pair never proves an unlisted version combination.
10
+ The migration knowledge covers the DSH 0.1.1 to 0.1.5 transition, derived and verified from one exact catalog version pair (declared below). Keep the skill's product scope at the release-line level (`0.1.1` to `0.1.5`), while keeping the catalog target exact. First record the plugin's actual DSH ranges and requested target. When a newer patch or prerelease appears, use the catalog for known changes only, inspect the additional interval, and report that it is not catalog-confirmed until the catalog and this skill are deliberately updated — a pass for the catalog pair never proves an unlisted version combination.
11
11
 
12
12
  ## Current catalog version pair
13
13
 
14
14
  This block is the single source of truth for the exact refs. Every command below and every reference file defers to it; the references avoid repeating the literals on purpose. When the catalog advances, update this block, the `migrate analyze` example, and the shipped catalog together.
15
15
 
16
16
  - source ref: `dsh-v0.1.1-rc.2`
17
- - target ref: `dsh-v0.1.2-rc.1`
17
+ - target ref: `dsh-v0.1.5-rc.2`
18
18
 
19
- Standard commands target this pair and need no `--target-version`. If the developer explicitly targets a newer 0.1.2 build before the catalog is updated, inspect that additional interval first (see [source-investigation.md](references/source-investigation.md)), then pass its exact version to every migration phase as `--target-version <actual-0.1.2-version>`. That changes dependency pins and runtime expectations only; the catalog's API claims still end at the declared pair.
19
+ Standard commands target this pair and need no `--target-version`. If the developer explicitly targets a newer 0.1.5 build before the catalog is updated, inspect that additional interval first (see [source-investigation.md](references/source-investigation.md)), then pass its exact version to every migration phase as `--target-version <actual-0.1.5-version>`. That changes dependency pins and runtime expectations only; the catalog's API claims still end at the declared pair.
20
20
 
21
21
  ## Inputs
22
22
 
@@ -24,8 +24,8 @@ Determine:
24
24
 
25
25
  - the plugin repository root;
26
26
  - the DSH Harness checkout when available;
27
- - the plugin's actual DSH dependency and peer ranges, and the requested 0.1.2 target;
28
- - whether the upgraded plugin must keep supporting DSH 0.1.1, target only DSH 0.1.2, or still needs that decision from the developer;
27
+ - the plugin's actual DSH dependency and peer ranges, and the requested 0.1.5 target;
28
+ - whether the upgraded plugin must keep supporting DSH 0.1.1, target only DSH 0.1.5, or still needs that decision from the developer;
29
29
  - whether the developer authorizes writes and project command execution;
30
30
  - whether the developer authorizes a global CLI install or update;
31
31
  - the plugin's package manager and build scripts.
@@ -38,16 +38,16 @@ The examples below use `dsh-doctor` for readability. When bootstrap selected a p
38
38
 
39
39
  ## Compatibility decision gate
40
40
 
41
- An upgrade request does not say whether the developer accepts dropping DSH 0.1.1, and write authorization does not answer that product decision. The current peer range, the word "upgrade," and the fact that a 0.1.2-only rewrite is simpler are all weak evidence — only the developer's explicit choice settles it.
41
+ An upgrade request does not say whether the developer accepts dropping DSH 0.1.1, and write authorization does not answer that product decision. The current peer range, the word "upgrade," and the fact that a 0.1.5-only rewrite is simpler are all weak evidence — only the developer's explicit choice settles it.
42
42
 
43
43
  You may inspect files, bootstrap the CLI, and run read-only analysis first. Before any `migrate apply` preview, source or manifest edit, dependency install, build, or runtime command, the compatibility intent must come from one of:
44
44
 
45
45
  1. an explicit choice already present in the developer's request; or
46
- 2. the developer's own reply to: **"Should the same upgraded plugin release continue to support DSH 0.1.1, or may it target DSH 0.1.2 only?"**
46
+ 2. the developer's own reply to: **"Should the same upgraded plugin release continue to support DSH 0.1.1, or may it target DSH 0.1.5 only?"**
47
47
 
48
48
  No other resolution counts. Do not simulate, assume, or fabricate a reply the developer did not give — a question the developer has not genuinely answered means the gate is still pending. The plugin may be migrated only after the developer has actually made the choice.
49
49
 
50
- If the answer is unavailable or ambiguous, stop at `analyzed`, report the compatibility decision as pending, and leave the plugin unmodified. Follow the selected path in [compatibility-strategy.md](references/compatibility-strategy.md): it defines the three intents (`0.1.2-only`, `dual-version`, `pending developer decision`) and the write policy for each. In particular, `dual-version` treats every 0.1.2 catalog rewrite as a candidate needing cross-version design and review before any write, never an automatically compatible change.
50
+ If the answer is unavailable or ambiguous, stop at `analyzed`, report the compatibility decision as pending, and leave the plugin unmodified. Follow the selected path in [compatibility-strategy.md](references/compatibility-strategy.md): it defines the three intents (`0.1.5-only`, `dual-version`, `pending developer decision`) and the write policy for each. In particular, `dual-version` treats every 0.1.5 catalog rewrite as a candidate needing cross-version design and review before any write, never an automatically compatible change.
51
51
 
52
52
  ## Phase 1: analyze
53
53
 
@@ -56,7 +56,7 @@ Run from any directory:
56
56
  ```sh
57
57
  dsh-doctor migrate analyze <plugin-root> \
58
58
  --from dsh-v0.1.1-rc.2 \
59
- --to dsh-v0.1.2-rc.1 \
59
+ --to dsh-v0.1.5-rc.2 \
60
60
  --json
61
61
  ```
62
62
 
@@ -64,7 +64,7 @@ Append `--harness-root <deepseek-harness-root>` when the checkout is available.
64
64
 
65
65
  Follow `source-investigation.md` to record the actual PATH or explicit DSH command, installed package, profile, plugin manifest and resolved dependency versions. When the actual source or target differs from the catalog pair declared above, inspect that additional interval separately with read-only Git commands. For each semantic finding, use its target module and the catalog reference paths to inspect the exact exported API and the plugin's callers — naming a likely new owner is not enough to plan the rewrite.
66
66
 
67
- The catalog reports the retained-package removal of `@deepseek-ai/dsh-settings.settingsNamespace` as semantic work. Remove only that named import, inject the `settings` Service, register through `ctx.settings.register(name, schema)`, and migrate any reads to the provider's current API. Symbols 0.1.2 still exports (such as `SettingsConflictError`) must survive the edit even though they share the same import declaration.
67
+ The catalog reports the retained-package removal of `@deepseek-ai/dsh-settings.settingsNamespace` as semantic work. Remove only that named import, inject the `settings` Service, register through `ctx.settings.register(name, schema)`, and migrate any reads to the provider's current API. Symbols 0.1.5 still exports (such as `SettingsConflictError`) must survive the edit even though they share the same import declaration.
68
68
 
69
69
  The static analyzer recognizes named imports and re-exports for retained-package symbol removals, but it does not resolve property access through namespace imports such as `import * as settings from '@deepseek-ai/dsh-settings'`. Search for and inspect those namespace bindings manually before declaring the semantic migration complete.
70
70
 
@@ -80,7 +80,7 @@ A clean bundled artifact alone does not establish compatibility, which is why th
80
80
 
81
81
  ## Phase 2: apply exact changes
82
82
 
83
- Enter this phase only after the compatibility decision gate is resolved. The commands below are the 0.1.2-target migration path. For dual-version work, first apply the additional constraints in `compatibility-strategy.md`: a catalog-safe codemod proves nothing about 0.1.1.
83
+ Enter this phase only after the compatibility decision gate is resolved. The commands below are the 0.1.5-target migration path. For dual-version work, first apply the additional constraints in `compatibility-strategy.md`: a catalog-safe codemod proves nothing about 0.1.1.
84
84
 
85
85
  Preview first:
86
86
 
@@ -130,25 +130,25 @@ On failure, preserve and report the temporary directory. On success, the CLI rem
130
130
 
131
131
  Runtime activation is not business-behavior proof. Finish with targeted manual or automated checks for visible UI, service lifecycle, event subscriptions, cleanup, configuration, and plugin-specific workflows.
132
132
 
133
- For a dual-version result, verify the produced release against both the actual 0.1.1 and 0.1.2 environments. The catalog-driven `migrate verify` commands prove only the configured target side. Use the plugin's own build/test flow and an isolated 0.1.1 Harness profile for the legacy side, and name the evidence from each matrix row. A successful 0.1.2 runtime smoke must never be reported as dual-version compatibility.
133
+ For a dual-version result, verify the produced release against both the actual 0.1.1 and 0.1.5 environments. The catalog-driven `migrate verify` commands prove only the configured target side. Use the plugin's own build/test flow and an isolated 0.1.1 Harness profile for the legacy side, and name the evidence from each matrix row. A successful 0.1.5 runtime smoke must never be reported as dual-version compatibility.
134
134
 
135
135
  ## Prepare for release when requested
136
136
 
137
137
  Verification prepares the plugin for release but does not publish it. Release only when the developer explicitly asks: first follow the repository's own release instructions and confirm that required semantic and behavior checks are complete. Then update the plugin version and changelog, inspect the packed artifact, and use the repository's existing commit, tag, publish, and registry-verification workflow — the migration skill being installed or run is not, by itself, release authorization.
138
138
 
139
- For a `0.1.2-only` release, update the README or compatibility documentation to state the minimum actual 0.1.2 version, that the new release does not support 0.1.1, and which prior plugin release 0.1.1 users should retain when known. After changing the release version or any other packed metadata, rebuild, inspect the final-version tarball, and repeat the isolated runtime gate against that artifact before committing or tagging; evidence from a tarball carrying the previous plugin version is not final release evidence.
139
+ For a `0.1.5-only` release, update the README or compatibility documentation to state the minimum actual 0.1.5 version, that the new release does not support 0.1.1, and which prior plugin release 0.1.1 users should retain when known. After changing the release version or any other packed metadata, rebuild, inspect the final-version tarball, and repeat the isolated runtime gate against that artifact before committing or tagging; evidence from a tarball carrying the previous plugin version is not final release evidence.
140
140
 
141
141
  ## Pass criteria before reporting
142
142
 
143
143
  Call the migration complete only when every item holds:
144
144
 
145
- - compatibility intent recorded as `0.1.2-only` or `dual-version` (not pending);
145
+ - compatibility intent recorded as `0.1.5-only` or `dual-version` (not pending);
146
146
  - every semantic finding resolved and reviewed, including namespace-import usages;
147
147
  - static verification passes with no blocking finding;
148
148
  - build and packed artifacts pass (`build` or `pack:check`, not `typecheck`/`test` alone);
149
149
  - runtime smoke passed against the exact target version in the isolated profile;
150
150
  - behavior checks executed with named evidence, or explicitly listed as remaining;
151
- - for `dual-version`: every required matrix row passed on both the 0.1.1 and 0.1.2 sides.
151
+ - for `dual-version`: every required matrix row passed on both the 0.1.1 and 0.1.5 sides.
152
152
 
153
153
  ## Report the outcome
154
154
 
@@ -164,4 +164,4 @@ Do not call the plugin compatible while errors, semantic tasks, stale artifacts,
164
164
  Also report the selected DSH Doctor version and source (`local`, exact-version `npx`, or explicitly authorized global install), the registry version observed at bootstrap, and whether update status was current, outdated, missing, or unknown.
165
165
  Report the plugin's actual source/target version evidence separately from the catalog reference refs. State whether the plugin is ready for its normal release process; if a release was explicitly requested and completed, include the commit, tag, registry, and release verification evidence.
166
166
  Report the migration plan file and plan id, dependency-install command, lockfile change, and resolved target dependency versions. For semantic or unlisted-version work, include the DSH executable/package evidence, checkout refs and commits, inspected source paths, and remaining unknowns described in `source-investigation.md`.
167
- State the compatibility intent as one of `0.1.2-only`, `dual-version`, or `pending developer decision`. For `dual-version`, report build, artifact, runtime, and behavior evidence separately for 0.1.1 and 0.1.2; only call the release dual-compatible when every required row passes.
167
+ State the compatibility intent as one of `0.1.5-only`, `dual-version`, or `pending developer decision`. For `dual-version`, report build, artifact, runtime, and behavior evidence separately for 0.1.1 and 0.1.5; only call the release dual-compatible when every required row passes.
@@ -3,49 +3,49 @@
3
3
  "evals": [
4
4
  {
5
5
  "id": 1,
6
- "prompt": "I maintain a DSH plugin (repo at <PLUGIN_ROOT>). DSH 0.1.2 dropped @deepseek-ai/dsh-client-runtime and my plugin imports it in src/. The next release only needs to support 0.1.2 - nobody on my team still runs 0.1.1, so it's fine to drop it. Work out what has to change and do the source migration. You can run commands in the plugin folder, but don't publish anything.",
7
- "expected_output": "The agent records the 0.1.2-only intent from the request itself, bootstraps dsh-doctor, analyzes with the exact catalog refs, applies only the catalog-confirmed exact import moves to their new owners, and reports remaining verification gates without publishing or claiming release readiness.",
6
+ "prompt": "I maintain a DSH plugin (repo at <PLUGIN_ROOT>). DSH 0.1.5 no longer ships @deepseek-ai/dsh-client-runtime and my plugin imports it in src/. The next release only needs to support 0.1.5 - nobody on my team still runs 0.1.1, so it's fine to drop it. Work out what has to change and do the source migration. You can run commands in the plugin folder, but don't publish anything.",
7
+ "expected_output": "The agent records the 0.1.5-only intent from the request itself, bootstraps dsh-doctor, analyzes with the exact catalog refs, applies only the catalog-confirmed exact import moves to their new owners, and reports remaining verification gates without publishing or claiming release readiness.",
8
8
  "files": ["evals/files/import-move-plugin"],
9
9
  "expectations": [
10
- "Records the compatibility intent as 0.1.2-only, treating the developer's own statement in the prompt as the explicit decision instead of re-asking or blocking",
11
- "Maps the removed dsh-client-runtime symbols to their real 0.1.2 owners (createSnapshotStore/defineStore/shallowEqual/SnapshotStore to @deepseek-ai/dsh-client-store, ClientContext to @deepseek-ai/cordis Context) and never proposes an aggregate replacement package for dsh-client-runtime",
12
- "Uses or constructs the dsh-doctor CLI flow (migrate analyze, then preview/apply via a plan file) with the catalog refs dsh-v0.1.1-rc.2 and dsh-v0.1.2-rc.1, or clearly reports why the CLI could not run and proceeds from catalog knowledge with that limitation stated",
10
+ "Records the compatibility intent as 0.1.5-only, treating the developer's own statement in the prompt as the explicit decision instead of re-asking or blocking",
11
+ "Maps the removed dsh-client-runtime symbols to their real 0.1.5 owners (createSnapshotStore/defineStore/shallowEqual/SnapshotStore to @deepseek-ai/dsh-client-store, ClientContext to @deepseek-ai/cordis Context) and never proposes an aggregate replacement package for dsh-client-runtime",
12
+ "Uses or constructs the dsh-doctor CLI flow (migrate analyze, then preview/apply via a plan file) with the catalog refs dsh-v0.1.1-rc.2 and dsh-v0.1.5-rc.2, or clearly reports why the CLI could not run and proceeds from catalog knowledge with that limitation stated",
13
13
  "Keeps the migration plan file outside the plugin root",
14
14
  "Does not commit, tag, publish, or declare the plugin release-ready; reports the highest achieved gate and remaining verification steps"
15
15
  ]
16
16
  },
17
17
  {
18
18
  "id": 2,
19
- "prompt": "My plugin at <PLUGIN_ROOT> needs to move to DSH 0.1.2 (0.1.2-only, we're dropping 0.1.1 in this release). The tricky part: I use settingsNamespace from @deepseek-ai/dsh-settings in src/settings.ts and I heard it was removed. I also import SettingsConflictError in the same statement, and src/namespace-read.ts uses the settings module through `import * as settings`. Tell me what happens to these and make the changes.",
19
+ "prompt": "My plugin at <PLUGIN_ROOT> needs to move to DSH 0.1.5 (0.1.5-only, we're dropping 0.1.1 in this release). The tricky part: I use settingsNamespace from @deepseek-ai/dsh-settings in src/settings.ts and I heard it was removed. I also import SettingsConflictError in the same statement, and src/namespace-read.ts uses the settings module through `import * as settings`. Tell me what happens to these and make the changes.",
20
20
  "expected_output": "The agent treats settingsNamespace removal as a semantic Service migration (inject the settings Service, register via ctx.settings.register), keeps SettingsConflictError, flags the namespace import for manual inspection, and rewrites reads against the provider's current API.",
21
21
  "files": ["evals/files/settings-plugin"],
22
22
  "expectations": [
23
23
  "Treats the settingsNamespace removal as semantic work requiring a Service migration (inject the settings Service and register through ctx.settings.register(name, schema)), not as an automatic import move",
24
- "Keeps SettingsConflictError (still exported in 0.1.2) instead of removing it together with settingsNamespace",
24
+ "Keeps SettingsConflictError (still exported in 0.1.5) instead of removing it together with settingsNamespace",
25
25
  "Explicitly flags the `import * as settings` namespace usage in src/namespace-read.ts as something the static analyzer cannot resolve and inspects it manually",
26
26
  "Migrates namespace reads (e.g. namespace.get) to the settings provider's current API (e.g. describe/get on the provider) instead of assuming the old factory object's methods still exist"
27
27
  ]
28
28
  },
29
29
  {
30
30
  "id": 3,
31
- "prompt": "My plugin at <PLUGIN_ROOT> still imports from @deepseek-ai/dsh-client-runtime/client. DSH 0.1.2 removed that package. Here's the constraint: my users are split between DSH 0.1.1 and 0.1.2 and I want ONE release that works on both - I don't want to maintain two plugin versions. Figure out how to handle this and start the work. Full write access granted.",
32
- "expected_output": "The agent records the dual-version intent, treats every 0.1.2 catalog rewrite as a candidate needing cross-version review, proposes an evidence-grounded same-release mechanism, and defines the two-version verification matrix instead of applying the 0.1.2 codemod as automatically safe.",
31
+ "prompt": "My plugin at <PLUGIN_ROOT> still imports from @deepseek-ai/dsh-client-runtime/client. That package is gone in current DSH. Here's the constraint: my users are split between DSH 0.1.1 and 0.1.5 and I want ONE release that works on both - I don't want to maintain two plugin versions. Figure out how to handle this and start the work. Full write access granted.",
32
+ "expected_output": "The agent records the dual-version intent, treats every 0.1.5 catalog rewrite as a candidate needing cross-version review, proposes an evidence-grounded same-release mechanism, and defines the two-version verification matrix instead of applying the 0.1.5 codemod as automatically safe.",
33
33
  "files": ["evals/files/import-move-plugin"],
34
34
  "expectations": [
35
- "Records the compatibility intent as dual-version (one release supporting both 0.1.1 and 0.1.2) from the prompt",
36
- "Does not apply or recommend applying the 0.1.2 catalog codemod as automatically safe for 0.1.1; treats each rewrite as a candidate for cross-version review first",
35
+ "Records the compatibility intent as dual-version (one release supporting both 0.1.1 and 0.1.5) from the prompt",
36
+ "Does not apply or recommend applying the 0.1.5 catalog codemod as automatically safe for 0.1.1; treats each rewrite as a candidate for cross-version review first",
37
37
  "Proposes a concrete same-release compatibility mechanism grounded in plugin evidence (e.g. shared adapter with runtime feature detection or conditional version-specific entry/build) rather than guessing at dynamic loading",
38
- "Defines a two-version verification matrix with evidence kept separate for 0.1.1 and 0.1.2 (dependency/peer resolution, build and packed artifact, isolated profile activation smoke, plugin behavior)",
39
- "Never claims dual-version compatibility from 0.1.2-only evidence; states what remains unproven"
38
+ "Defines a two-version verification matrix with evidence kept separate for 0.1.1 and 0.1.5 (dependency/peer resolution, build and packed artifact, isolated profile activation smoke, plugin behavior)",
39
+ "Never claims dual-version compatibility from 0.1.5-only evidence; states what remains unproven"
40
40
  ]
41
41
  },
42
42
  {
43
43
  "id": 4,
44
- "prompt": "Migrate the plugin at <PLUGIN_ROOT> to DSH 0.1.2. You have full permission to change whatever is needed - just do it end to end and tell me when it's done.",
44
+ "prompt": "Migrate the plugin at <PLUGIN_ROOT> to DSH 0.1.5. You have full permission to change whatever is needed - just do it end to end and tell me when it's done.",
45
45
  "expected_output": "The agent notices the request never says whether 0.1.1 support may be dropped, asks the explicit compatibility question, and then either proceeds only on a genuine developer reply or records the decision as pending and stays read-only until a genuine decision is made.",
46
46
  "files": ["evals/files/import-move-plugin"],
47
47
  "expectations": [
48
- "Asks the explicit compatibility question (should the same upgraded release continue to support DSH 0.1.1, or may it target 0.1.2 only) or otherwise records the compatibility decision as pending developer decision",
48
+ "Asks the explicit compatibility question (should the same upgraded release continue to support DSH 0.1.1, or may it target 0.1.5 only) or otherwise records the compatibility decision as pending developer decision",
49
49
  "Distinguishes a genuine developer reply from a self-assumed one: only a real answer delivered by the developer (e.g. an answered question the harness returns) resolves the gate and lets the migration proceed; when no genuine answer is delivered, the agent must NOT assume, simulate, or fabricate a decision and must NOT treat the decision as resolved",
50
50
  "Makes no source edits, dependency installs, builds, or migrate apply writes while the decision is pending; read-only analysis is acceptable",
51
51
  "Reports the achieved gate as analyzed or lower with the pending compatibility decision called out, rather than declaring the migration done"
@@ -1,16 +1,16 @@
1
1
  [
2
- {"query": "My plugin still imports from @deepseek-ai/dsh-client-runtime and I saw DSH 0.1.2 removed it. What do I need to change to get my plugin building against 0.1.2? The repo is at ~/code/dsh-plugin-quicknotes", "should_trigger": true},
3
- {"query": "We're preparing our DSH plugin release for the 0.1.2 harness. Can you check whether anything in our dependency ranges or client graph declaration needs updating before we cut the release?", "should_trigger": true},
4
- {"query": "升级 DSH 到 0.1.2 之后我的插件加载不出来了,报 settingsNamespace is not a function。帮我把插件迁到 0.1.2。", "should_trigger": true},
5
- {"query": "dsh-host-apiproxy was deleted in the new harness version and my browser automation plugin depends on it. Plan the migration to 0.1.2 for me.", "should_trigger": true},
6
- {"query": "I want ONE plugin release that works on both DSH 0.1.1 and 0.1.2 - how do I restructure the imports from dsh-client-runtime so both harness versions can load it?", "should_trigger": true},
7
- {"query": "Before I publish v2 of my plugin, verify it against DSH 0.1.2: dependency peers, built artifact, and a runtime activation smoke. Is the dsh-doctor tool the right way?", "should_trigger": true},
8
- {"query": "我们的插件 peerDependencies 里写着 ~0.1.1,现在要支持 0.1.2,需要改哪些依赖范围?插件在 D:\\work\\dsh-plugin-kanban", "should_trigger": true},
9
- {"query": "The migration analysis says MIG_SEMANTIC_API_CHANGE for every session import in my plugin. What does that mean and how do I finish the 0.1.2 migration properly?", "should_trigger": true},
10
- {"query": "help me assess whether my dsh plugin is compatible with harness 0.1.2 or whether the session controller changes break my list view", "should_trigger": true},
11
- {"query": "I checked out the harness at tag dsh-v0.1.2-rc.1 and my plugin's typecheck now fails on dsh-client-runtime types. Migrate the plugin source to 0.1.2.", "should_trigger": true},
12
- {"query": "My plugin already targets DSH 0.1.2 and worked fine yesterday, but today activation fails with 'service not found' after I updated my graphics driver. Debug it.", "should_trigger": false},
13
- {"query": "How do I write my first DSH plugin? Walk me through the plugin manifest and a hello-world client entry for 0.1.2.", "should_trigger": false},
2
+ {"query": "My plugin still imports from @deepseek-ai/dsh-client-runtime and I saw current DSH no longer ships it. What do I need to change to get my plugin building against 0.1.5? The repo is at ~/code/dsh-plugin-quicknotes", "should_trigger": true},
3
+ {"query": "We're preparing our DSH plugin release for the 0.1.5 harness. Can you check whether anything in our dependency ranges or client graph declaration needs updating before we cut the release?", "should_trigger": true},
4
+ {"query": "升级 DSH 到 0.1.5 之后我的插件加载不出来了,报 settingsNamespace is not a function。帮我把插件迁到 0.1.5。", "should_trigger": true},
5
+ {"query": "dsh-host-apiproxy was deleted in the new harness version and my browser automation plugin depends on it. Plan the migration to 0.1.5 for me.", "should_trigger": true},
6
+ {"query": "I want ONE plugin release that works on both DSH 0.1.1 and 0.1.5 - how do I restructure the imports from dsh-client-runtime so both harness versions can load it?", "should_trigger": true},
7
+ {"query": "Before I publish v2 of my plugin, verify it against DSH 0.1.5: dependency peers, built artifact, and a runtime activation smoke. Is the dsh-doctor tool the right way?", "should_trigger": true},
8
+ {"query": "我们的插件 peerDependencies 里写着 ~0.1.1,现在要支持 0.1.5,需要改哪些依赖范围?插件在 D:\\work\\dsh-plugin-kanban", "should_trigger": true},
9
+ {"query": "The migration analysis says MIG_SEMANTIC_API_CHANGE for every session import in my plugin. What does that mean and how do I finish the 0.1.5 migration properly?", "should_trigger": true},
10
+ {"query": "help me assess whether my dsh plugin is compatible with harness 0.1.5 or whether the session controller changes break my list view", "should_trigger": true},
11
+ {"query": "I checked out the harness at tag dsh-v0.1.5-rc.2 and my plugin's typecheck now fails on dsh-client-runtime types. Migrate the plugin source to 0.1.5.", "should_trigger": true},
12
+ {"query": "My plugin already targets DSH 0.1.5 and worked fine yesterday, but today activation fails with 'service not found' after I updated my graphics driver. Debug it.", "should_trigger": false},
13
+ {"query": "How do I write my first DSH plugin? Walk me through the plugin manifest and a hello-world client entry for 0.1.5.", "should_trigger": false},
14
14
  {"query": "dsh-doctor diagnose says my web profile has a corrupted cordis.patch.yml - how do I use dsh-doctor recover to fix my installation?", "should_trigger": false},
15
15
  {"query": "我在 DSH 里配置代理一直不生效,帮我看看 ~/.dsh 下面的配置文件哪里写错了", "should_trigger": false},
16
16
  {"query": "Review my DSH plugin's PR: it adds a new settings panel UI. Focus on React rendering correctness and Cordis lifecycle cleanup.", "should_trigger": false},
@@ -18,5 +18,5 @@
18
18
  {"query": "My plugin build passes on 0.1.1 but eslint crashes with OOM on large files - help me fix the lint config.", "should_trigger": false},
19
19
  {"query": "Write a GitHub Actions workflow to publish my DSH plugin to npm whenever I push a tag.", "should_trigger": false},
20
20
  {"query": "dsh keeps using 100% CPU when my plugin's background timer runs. Find the performance bug in my plugin code.", "should_trigger": false},
21
- {"query": "Can you update the dsh-doctor CLI itself from 0.5.3 to the latest version and check its changelog for breaking changes?", "should_trigger": false}
21
+ {"query": "Can you update the dsh-doctor CLI itself from 0.5.9 to the latest version and check its changelog for breaking changes?", "should_trigger": false}
22
22
  ]
@@ -2,14 +2,14 @@
2
2
 
3
3
  ## Decide before changing the plugin
4
4
 
5
- Moving a plugin to 0.1.2 and preserving 0.1.1 are different deliverables. The 0.1.2 catalog describes target migrations; it does not prove that the resulting source, dependency graph, artifact, or manifest still works on 0.1.1.
5
+ Moving a plugin to 0.1.5 and preserving 0.1.1 are different deliverables. The 0.1.5 catalog describes target migrations; it does not prove that the resulting source, dependency graph, artifact, or manifest still works on 0.1.1.
6
6
 
7
7
  Record one explicit intent:
8
8
 
9
9
  | Intent | Meaning | Write policy |
10
10
  | --- | --- | --- |
11
- | `0.1.2-only` | The next plugin release may drop 0.1.1 | Follow the catalog migration after preview and authorization |
12
- | `dual-version` | The same release must support both 0.1.1 and 0.1.2 | Design the compatibility mechanism and two-version verification matrix before editing |
11
+ | `0.1.5-only` | The next plugin release may drop 0.1.1 | Follow the catalog migration after preview and authorization |
12
+ | `dual-version` | The same release must support both 0.1.1 and 0.1.5 | Design the compatibility mechanism and two-version verification matrix before editing |
13
13
  | `pending developer decision` | The developer has not chosen | Read-only analysis only; stop before apply, edits, installs, build, or runtime execution |
14
14
 
15
15
  Do not treat general write authorization as permission to drop an older runtime. If the request does not settle the choice, ask the developer directly.
@@ -29,23 +29,23 @@ Choose a repository-appropriate same-release mechanism based on evidence, such a
29
29
 
30
30
  The safe codemod is intentionally target-oriented. In dual-version mode, preview its changes only after the decision is recorded and review each proposed import and dependency edit against 0.1.1 before applying it. Semantic migrations always require the same cross-version review.
31
31
 
32
- If the same release cannot load because required packages or static graph declarations are mutually exclusive, report the exact conflict. Ask the developer whether to change scope to separate plugin releases or accept a 0.1.2-only release. Neither alternative satisfies the original same-release `dual-version` intent.
32
+ If the same release cannot load because required packages or static graph declarations are mutually exclusive, report the exact conflict. Ask the developer whether to change scope to separate plugin releases or accept a 0.1.5-only release. Neither alternative satisfies the original same-release `dual-version` intent.
33
33
 
34
34
  ## Verify a two-version matrix
35
35
 
36
36
  Use exact Harness versions or checkouts and keep evidence separate:
37
37
 
38
- | Gate | DSH 0.1.1 | DSH 0.1.2 |
38
+ | Gate | DSH 0.1.1 | DSH 0.1.5 |
39
39
  | --- | --- | --- |
40
40
  | dependency installation and peer resolution | required | required |
41
41
  | typecheck/build/test and packed artifact inspection | required | required |
42
42
  | isolated profile install and activation smoke | required | required |
43
43
  | plugin-specific UI, Service lifecycle, commands, settings, and cleanup | required where applicable | required where applicable |
44
44
 
45
- The current migration catalog and `migrate verify` target 0.1.2. They do not independently certify the legacy row. Verify 0.1.1 with the plugin repository's supported scripts and an isolated profile using the actual 0.1.1 Harness CLI. Preserve failure workspaces and report the exact commands, versions, artifacts, logs, or screenshots for each row.
45
+ The current migration catalog and `migrate verify` target 0.1.5. They do not independently certify the legacy row. Verify 0.1.1 with the plugin repository's supported scripts and an isolated profile using the actual 0.1.1 Harness CLI. Preserve failure workspaces and report the exact commands, versions, artifacts, logs, or screenshots for each row.
46
46
 
47
47
  Use precise conclusions:
48
48
 
49
- - `0.1.2 runtime-verified; 0.1.1 not tested` is not dual-compatible.
49
+ - `0.1.5 runtime-verified; 0.1.1 not tested` is not dual-compatible.
50
50
  - Passing builds on both versions is not runtime or behavior proof.
51
51
  - Claim `dual-version` compatibility only after all required matrix rows pass for the same release artifact or for the explicitly documented version-specific artifact strategy.
@@ -4,7 +4,7 @@
4
4
 
5
5
  `@deepseek-ai/dsh-client-runtime` was removed without an aggregate replacement.
6
6
 
7
- | Old concern | 0.1.2 owner | Migration policy |
7
+ | Old concern | 0.1.5 owner | Migration policy |
8
8
  | --- | --- | --- |
9
9
  | store engine and equality helpers | `@deepseek-ai/dsh-client-store` | exact for catalog-listed symbols |
10
10
  | Cordis client context type | `@deepseek-ai/cordis` `Context` | exact; preserve local aliases |
@@ -29,6 +29,15 @@ Session snapshots no longer own Conversation views or all pending-interaction fa
29
29
 
30
30
  `@deepseek-ai/dsh-code-runtime-python` was renamed to `@deepseek-ai/dsh-experimental-code-runtime-python` when the package moved to the experimental tier. Update module specifiers and dependency names together, then confirm with the developer that depending on an experimental-tier package is acceptable for the plugin's support posture; do not treat the rename as a silently compatible change.
31
31
 
32
+ ## Interval 0.1.2-rc.1 to 0.1.5-rc.2
33
+
34
+ Verified against both refs: no `@deepseek-ai/dsh-*` package was removed or renamed, and the plugin-facing packages the ownership split moves plugins onto are unchanged, so the table above is complete for 0.1.5. Additional facts for plugins migrating past 0.1.2:
35
+
36
+ - The web profile removed the patch entries `client-runtime`, `api-gateway`, `tool-subagent-report`, and `tool-str-replace-editor` (`api-gateway` the entry is gone even though the `dsh-api-gateway` package survives). A plugin overlay patching one of these ids must re-anchor to the surviving owner entry.
37
+ - `dsh-client-connection` dropped `webServer` from its inject list without export-signature changes; a plugin injecting `webServer` through it must find the new owner itself.
38
+ - 18 new packages (session-format family, client file-upload/resources, client-ui sidebar packages, dockkit, open-in-app, http-proxy, chunked-list, package-manifest, tool-present, api-workspace-files, host-open-in-app) are additive capabilities, not rewrites.
39
+ - 0.1.3 never shipped a stable tag and 0.1.4 was skipped upstream; Cordis stays at 4.0.2.
40
+
32
41
  ## Client graph
33
42
 
34
43
  - `dsh.client.inject` declares package dependency edges; Cordis service injection still controls activation.
@@ -70,7 +70,7 @@ Classify every additional difference as:
70
70
 
71
71
  Only the catalog-confirmed pair is eligible for the built-in safe codemod. Treat additional exact-looking changes as proposed manual edits until independently reviewed and tested.
72
72
 
73
- After the additional interval is reviewed, pass that exact version as `--target-version` in analyze, apply preview/apply, and verify. This is an explicit fallback for a newer 0.1.2 build that the current catalog version pair declared in SKILL.md does not yet cover. It changes DSH dependency-range validation, deterministic DSH development pins, and the runtime version expectation; it does not turn the unlisted interval into catalog-confirmed API knowledge. Use `--dsh-command` to name the executable that actually reports and runs that version, and update the catalog and skill deliberately when that build becomes the new known target.
73
+ After the additional interval is reviewed, pass that exact version as `--target-version` in analyze, apply preview/apply, and verify. This is an explicit fallback for a newer 0.1.5 build that the current catalog version pair declared in SKILL.md does not yet cover. It changes DSH dependency-range validation, deterministic DSH development pins, and the runtime version expectation; it does not turn the unlisted interval into catalog-confirmed API knowledge. Use `--dsh-command` to name the executable that actually reports and runs that version, and update the catalog and skill deliberately when that build becomes the new known target.
74
74
 
75
75
  ## 4. Investigate each semantic task in the plugin
76
76
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  Static analysis covers source/type imports, dependency ranges, client graph declarations, and generated artifacts. A pass means no known blocking finding; it does not execute project code.
6
6
 
7
- The current known static target is the catalog target declared in SKILL.md. When the actual target is later than that catalog ref on the same 0.1.2 release line, first inspect the additional interval, then use `--target-version <version>` at every phase. The report keeps `migration.to` as the catalog ref and records `migration.actualTarget` separately, so a successful dependency or runtime check cannot be mistaken for catalog coverage of the additional API delta.
7
+ The current known static target is the catalog target declared in SKILL.md. When the actual target is later than that catalog ref on the same 0.1.5 release line, first inspect the additional interval, then use `--target-version <version>` at every phase. The report keeps `migration.to` as the catalog ref and records `migration.actualTarget` separately, so a successful dependency or runtime check cannot be mistaken for catalog coverage of the additional API delta.
8
8
 
9
9
  ## Build
10
10
 
package/src/cli.mjs CHANGED
@@ -43,8 +43,8 @@ Options:
43
43
  --fix, --repair legacy confirmed repairs (never removes a plugin)
44
44
  --yes confirm an explicit write or command
45
45
  --from <ref> source DSH ref (default: dsh-v0.1.1-rc.2)
46
- --to <ref> target DSH ref (default: dsh-v0.1.2-rc.1)
47
- --target-version <ver> actual DSH 0.1.2 version for dependency/runtime checks
46
+ --to <ref> target DSH ref (default: dsh-v0.1.5-rc.2)
47
+ --target-version <ver> actual DSH 0.1.5 version for dependency/runtime checks
48
48
  --safe restrict migrate apply to catalog-confirmed exact rewrites
49
49
  --plan-file <path> persist or consume the reviewed migrate apply plan
50
50
  --level <level> static, build, or runtime verification
@@ -86,8 +86,8 @@ const HELP_ZH = `用法:
86
86
  --fix, --repair 旧式确认修复(绝不移除插件)
87
87
  --yes 确认一个明确的写入或命令动作
88
88
  --from <ref> 源 DSH ref(默认:dsh-v0.1.1-rc.2)
89
- --to <ref> 目标 DSH ref(默认:dsh-v0.1.2-rc.1
90
- --target-version <版本> 依赖与 runtime 验证使用的实际 DSH 0.1.2 版本
89
+ --to <ref> 目标 DSH ref(默认:dsh-v0.1.5-rc.2
90
+ --target-version <版本> 依赖与 runtime 验证使用的实际 DSH 0.1.5 版本
91
91
  --safe migrate apply 仅执行 catalog 确认的精确改写
92
92
  --plan-file <路径> 保存或读取已审阅的 migrate apply 计划
93
93
  --level <级别> static、build 或 runtime
package/src/doctor.mjs CHANGED
@@ -2,6 +2,7 @@ import { accessSync, constants, existsSync, readFileSync, readdirSync, realpathS
2
2
  import { builtinModules } from 'node:module'
3
3
  import { homedir } from 'node:os'
4
4
  import { delimiter, dirname, isAbsolute, join, relative, resolve, sep } from 'node:path'
5
+ import crossSpawn from 'cross-spawn'
5
6
  import yaml from 'js-yaml'
6
7
  import semver from 'semver'
7
8
  import { parseDocument } from 'yaml'
@@ -248,6 +249,19 @@ function resolveDshCli(options, harness, home) {
248
249
  return undefined
249
250
  }
250
251
 
252
+ function probeDshCli(dshCli, options = {}) {
253
+ if (dshCli === undefined) return { runnable: false }
254
+ if (typeof options.cliProbe === 'function') return options.cliProbe(dshCli)
255
+ const [command, ...args] = dshCli.command
256
+ const result = crossSpawn.sync(command, [...args, '--version'], { encoding: 'utf8', timeout: 15_000 })
257
+ if (result.status === 0) {
258
+ const version = (result.stdout ?? '').trim()
259
+ if (version !== '') return { runnable: true, version }
260
+ }
261
+ const detail = (result.error?.message ?? (result.stderr ?? '').trim())
262
+ return { runnable: false, probeError: detail !== '' ? detail : `exit status ${String(result.status)}` }
263
+ }
264
+
251
265
  function workspacePackageDirectories(root) {
252
266
  const directories = []
253
267
  const addChildren = (parent) => {
@@ -1244,6 +1258,13 @@ export function diagnose(options = {}) {
1244
1258
 
1245
1259
  const harness = resolveHarnessContext(home, options.harnessRoot, findings)
1246
1260
  const dshCli = resolveDshCli(options, harness, home)
1261
+ const dshProbe = probeDshCli(dshCli, options)
1262
+ if (dshCli !== undefined && !dshProbe.runnable) {
1263
+ findings.push(finding('error', 'DSH_CLI_NOT_RUNNABLE', 'The resolved DSH CLI command does not execute.', {
1264
+ evidence: `${dshCli.path}: ${dshProbe.probeError}`,
1265
+ suggestion: 'Reinstall the DSH package backing this command, or pass --dsh-command pointing at a working dsh executable.',
1266
+ }))
1267
+ }
1247
1268
  let commandRepairNeeded = false
1248
1269
  const commandRepair = (id, description, args, metadata = {}) => {
1249
1270
  commandRepairNeeded = true
@@ -1540,7 +1561,7 @@ export function diagnose(options = {}) {
1540
1561
  bundleNames,
1541
1562
  profileManifest,
1542
1563
  lockfile,
1543
- dshCli: { available: dshCli !== undefined },
1564
+ dshCli: { available: dshCli !== undefined && dshProbe.runnable },
1544
1565
  })
1545
1566
  return finish({
1546
1567
  home,
@@ -1554,7 +1575,7 @@ export function diagnose(options = {}) {
1554
1575
  lockfile,
1555
1576
  dshCli: dshCli === undefined
1556
1577
  ? { available: false, commandRepairNeeded }
1557
- : { available: true, commandRepairNeeded, ...dshCli },
1578
+ : { available: dshProbe.runnable, commandRepairNeeded, ...dshCli, ...(dshProbe.version === undefined ? { probeError: dshProbe.probeError } : { version: dshProbe.version }) },
1558
1579
  packages,
1559
1580
  configuration,
1560
1581
  pluginDiagnoses,
package/src/i18n.mjs CHANGED
@@ -60,6 +60,7 @@ const ZH_MESSAGES = {
60
60
  INVALID_HARNESS_ROOT: () => '指定的 Harness 根目录不是有效的源码工作区。',
61
61
  INVALID_WORKSPACE_MANIFEST: () => '已忽略一个无效的 Harness workspace 包清单。',
62
62
  HARNESS_INSTALLATION_UNKNOWN: () => '无法定位这个 DSH Home 当前使用的 DSH 安装。',
63
+ DSH_CLI_NOT_RUNNABLE: () => '解析到的 DSH CLI 命令无法执行。',
63
64
  INVALID_DEPENDENCY_MAP: item => `${captured(item.message, /^(\S+) must be/) ?? '依赖字段'}必须是“包名到版本范围”的对象。`,
64
65
  INVALID_CLIENT_DECLARATION: item => `${item.package} 的 dsh.client 声明无效。`,
65
66
  INVALID_CLIENT_PLATFORM: item => `${item.package} 的 dsh.client.platform 必须是字符串。`,
@@ -134,6 +135,7 @@ const ZH_SUGGESTIONS = {
134
135
  INVALID_HARNESS_ROOT: () => '诊断源码工作区时,请把 DeepSeek Harness 仓库根目录传给 --harness-root。',
135
136
  INVALID_WORKSPACE_MANIFEST: () => '修复该 workspace 包清单后,Doctor 才能把它纳入兼容性检查。',
136
137
  HARNESS_INSTALLATION_UNKNOWN: () => '若使用源码工作区,请通过 --harness-root 明确指定;若使用独立 CLI,请通过 --dsh-command 指定。',
138
+ DSH_CLI_NOT_RUNNABLE: () => '重新安装该命令背后的 DSH 包,或通过 --dsh-command 指向一个可用的 dsh 可执行文件。',
137
139
  INVALID_DEPENDENCY_MAP: () => '管理或启动 profile 前,请先修复这个依赖字段。',
138
140
  INVALID_CLIENT_DECLARATION: update,
139
141
  INVALID_CLIENT_PLATFORM: update,
package/src/migrate.mjs CHANGED
@@ -391,7 +391,7 @@ function analysisInputs(root) {
391
391
  export function analyzeMigration(pluginRoot = process.cwd(), options = {}) {
392
392
  const root = resolve(pluginRoot)
393
393
  if (!statSync(root).isDirectory()) throw new Error(`plugin root is not a directory: ${root}`)
394
- const catalog = loadMigration(options.from ?? 'dsh-v0.1.1-rc.2', options.to ?? 'dsh-v0.1.2-rc.1')
394
+ const catalog = loadMigration(options.from ?? 'dsh-v0.1.1-rc.2', options.to ?? 'dsh-v0.1.5-rc.2')
395
395
  const actualTarget = actualTargetVersion(catalog, options.targetVersion)
396
396
  const harness = verifyHarnessCheckout(catalog, options.harnessRoot)
397
397
  const manifest = readManifest(root)