@michengai/dsh-codex-ui 0.2.81 → 0.2.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -4,6 +4,23 @@
4
4
 
5
5
  This changelog records the five most recent published releases of DSH Codex UI and its one-click Suite. Earlier changes remain available in the [Git history](https://github.com/MichengAI/dsh-codex-ui/commits/main).
6
6
 
7
+ ## 0.2.82 — 2026-08-24
8
+
9
+ Companion release: `@michengai/dsh-codex-suite@0.1.14`.
10
+
11
+ ### Fixed
12
+
13
+ - Replaced the Suite's recommended aggregate install with an installer that records all six members as direct profile dependencies, allowing **Settings → About** to detect and update each plugin independently.
14
+ - Made clean custom Web profiles reuse the same `DSH_HOME` while placing DSH's built-in `dsh-web-app` before the member bundles.
15
+ - When About encounters a legacy aggregate Suite, it now promotes all six members before removing the aggregate package instead of retaining only the clicked plugin.
16
+
17
+ ### Suite 0.1.14
18
+
19
+ - Added the cross-platform `dsh-codex-suite` command, legacy migration, config-dump validation, and dry-run support.
20
+ - Preserved exact member version coordination without modifying upstream DSH or creating a separate DSH Home.
21
+
22
+ Published packages: [`@michengai/dsh-codex-ui@0.2.82`](https://www.npmjs.com/package/@michengai/dsh-codex-ui/v/0.2.82) and [`@michengai/dsh-codex-suite@0.1.14`](https://www.npmjs.com/package/@michengai/dsh-codex-suite/v/0.1.14).
23
+
7
24
  ## 0.2.81 — 2026-08-24
8
25
 
9
26
  Companion release: `@michengai/dsh-codex-suite@0.1.13`.
@@ -4,6 +4,23 @@
4
4
 
5
5
  本日志记录 DSH Codex UI 及其一键 Suite 最近发布的五个版本;更早的变更可查看 [Git 提交历史](https://github.com/MichengAI/dsh-codex-ui/commits/main)。
6
6
 
7
+ ## 0.2.82 — 2026-08-24
8
+
9
+ 配套版本:`@michengai/dsh-codex-suite@0.1.14`。
10
+
11
+ ### 修复
12
+
13
+ - Suite 一键入口改为安装器,将六个成员写成 profile 的直接依赖,使「设置 → 关于」可以分别检测和升级每个插件。
14
+ - 新建自定义 Web profile 时自动复用同一 `DSH_HOME`,并把 DSH 内置 `dsh-web-app` 放在成员 bundle 之前。
15
+ - “关于”页遇到旧版聚合 Suite 时,先把全部六个成员提升为直接依赖,再移除聚合包,避免只保留本次点击的一个插件。
16
+
17
+ ### Suite 0.1.14
18
+
19
+ - 新增跨平台 `dsh-codex-suite` 命令、旧 Suite 自动迁移、配置 dump 验证和 dry-run。
20
+ - 保留精确成员版本组合,不修改上游 DSH,也不创建独立 DSH Home。
21
+
22
+ 发布包:[`@michengai/dsh-codex-ui@0.2.82`](https://www.npmjs.com/package/@michengai/dsh-codex-ui/v/0.2.82) 与 [`@michengai/dsh-codex-suite@0.1.14`](https://www.npmjs.com/package/@michengai/dsh-codex-suite/v/0.1.14)。
23
+
7
24
  ## 0.2.81 — 2026-08-24
8
25
 
9
26
  配套版本:`@michengai/dsh-codex-suite@0.1.13`。
package/README.md CHANGED
@@ -55,7 +55,7 @@ Conversation menu: rename, pin, unread, archive, fork, copy, and delete.
55
55
 
56
56
  ## Plugin combo
57
57
 
58
- `@michengai/dsh-codex-suite` is the one-click combo. It installs these six plugins into the same profile:
58
+ `@michengai/dsh-codex-suite` provides a one-click installer that adds these six plugins to the same profile as **direct dependencies**:
59
59
 
60
60
  | Plugin | npm package | Role |
61
61
  | --- | --- | --- |
@@ -68,7 +68,7 @@ Conversation menu: rename, pin, unread, archive, fork, copy, and delete.
68
68
 
69
69
  `dshmarket` stays optional. When it is installed, **Plugins** opens the market first.
70
70
 
71
- Do not install the suite and the individual plugins in the same profile. The two patch sets conflict.
71
+ Direct dependencies let **Settings About** detect and update every plugin independently. The installer also migrates the legacy aggregate Suite without leaving duplicate patches behind.
72
72
 
73
73
  ## DSH product ecosystem
74
74
 
@@ -92,7 +92,7 @@ Copy one of the sentences below into DSH, Codex, or WorkBuddy and let that agent
92
92
  From npm:
93
93
 
94
94
  ```text
95
- Install the latest DSH plugin suite @michengai/dsh-codex-suite into my local web profile using the official npm registry: dsh plugin --profile web add @michengai/dsh-codex-suite@latest --registry=https://registry.npmjs.org/. Then run dsh --profile web --dump-config, confirm codex-ui, agency-agents, skills-manager, archive-manager, im-connect, and dsh-automation are mounted, and remind me to restart DSH Web and hard-refresh the browser.
95
+ Use the one-click installer to add all six DSH Codex Suite members as direct dependencies of my local web profile: npx --yes @michengai/dsh-codex-suite@latest --profile web. Confirm its configuration check succeeds, then remind me to restart DSH Web and hard-refresh the browser.
96
96
  ```
97
97
 
98
98
  UI only:
@@ -107,7 +107,7 @@ Install the latest DSH plugin @michengai/dsh-codex-ui into my local web profile
107
107
  | Codex | Send one of the sentences above to Codex and let it install locally. |
108
108
  | WorkBuddy | Send one of the sentences above to WorkBuddy. |
109
109
 
110
- If `dsh` is not on PATH, replace the leading `dsh` with `npx --yes @deepseek-ai/dsh`.
110
+ The installer needs the current `dsh` on PATH. Set `DSH_BIN` when the executable lives elsewhere.
111
111
 
112
112
  ### Install the complete suite
113
113
 
@@ -116,13 +116,20 @@ This is the one-click combo. Run it from any PowerShell directory:
116
116
  ```powershell
117
117
  [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
118
118
  $OutputEncoding = [System.Text.Encoding]::UTF8
119
- dsh plugin --profile web add @michengai/dsh-codex-suite@latest --registry=https://registry.npmjs.org/
120
- dsh --profile web --dump-config
119
+ npx --yes @michengai/dsh-codex-suite@latest --profile web
121
120
  ```
122
121
 
123
- To pin a release, replace `@latest` with a version such as `@0.1.0`.
122
+ The installer reads the exact member versions verified by that Suite release, adds all six members as direct profile dependencies in one `dsh plugin add`, and finishes with `dsh --profile web --dump-config`. Replace `@latest` with a Suite version to pin the whole set.
123
+
124
+ Restart DSH Web and hard-refresh the browser. Existing members are aligned in place; a legacy `@michengai/dsh-codex-suite` aggregate dependency is removed only after all six direct members have been staged.
125
+
126
+ Use the same command with another profile name for a clean custom Web profile:
127
+
128
+ ```powershell
129
+ npx --yes @michengai/dsh-codex-suite@latest --profile codex
130
+ ```
124
131
 
125
- Restart DSH Web and hard-refresh the browser. If the profile already has any of the six plugins installed individually, uninstall those plugins first.
132
+ The installer stays in the current `DSH_HOME` and places DSH's built-in `@deepseek-ai/dsh-web-app` before the member bundles. It neither creates a separate Home nor reinstalls the official Web package.
126
133
 
127
134
  ### Install Codex UI only
128
135
 
package/README.zh-CN.md CHANGED
@@ -55,7 +55,7 @@
55
55
 
56
56
  ## 插件组合
57
57
 
58
- `@michengai/dsh-codex-suite` 是一键套件,会把下面 6 个插件装进同一个 profile:
58
+ `@michengai/dsh-codex-suite` 提供一键安装器,会把下面 6 个插件作为**直接依赖**装进同一个 profile:
59
59
 
60
60
  | 插件 | npm 包 | 作用 |
61
61
  | --- | --- | --- |
@@ -68,7 +68,7 @@
68
68
 
69
69
  `dshmarket` 仍是可选项。已安装时,「插件」入口会优先进入市场。
70
70
 
71
- 套件安装和单独安装互斥。同一 profile 不要同时安装两者,两套 patch 会冲突。
71
+ 直接依赖让「设置 关于」能够分别检测和升级每个插件。安装器也会自动迁移旧版聚合 Suite,避免聚合 patch 与独立 patch 冲突。
72
72
 
73
73
  ## DSH 产品生态
74
74
 
@@ -92,7 +92,7 @@ Codex UI 既可以独立安装,也可以随桌面端或 Web 套件一起使用
92
92
  从 npm 安装完整套件:
93
93
 
94
94
  ```text
95
- 请把 DSH 套件 @michengai/dsh-codex-suite 最新版装进本机 web profile,使用官方 npm 源执行:dsh plugin --profile web add @michengai/dsh-codex-suite@latest --registry=https://registry.npmjs.org/。装完执行 dsh --profile web --dump-config,确认已挂载 codex-ui、agency-agents、skills-manager、archive-manager、im-connect 和 dsh-automation,并提醒我重启 DSH Web 后硬刷新浏览器。
95
+ 请用一键安装器把 DSH Codex Suite 的六个成员作为直接依赖装进本机 web profile,执行:npx --yes @michengai/dsh-codex-suite@latest --profile web。确认安装器完成配置检查,并提醒我重启 DSH Web 后硬刷新浏览器。
96
96
  ```
97
97
 
98
98
  只安装 Codex UI:
@@ -107,7 +107,7 @@ Codex UI 既可以独立安装,也可以随桌面端或 Web 套件一起使用
107
107
  | Codex | 把上面其中一句发给 Codex,让它在本机执行安装。 |
108
108
  | WorkBuddy | 把上面其中一句发给 WorkBuddy。 |
109
109
 
110
- 未把 `dsh` 装进 PATH 时,把开头的 `dsh` 换成 `npx --yes @deepseek-ai/dsh`。
110
+ 一键安装器需要能从 PATH 找到当前 DSH;也可以用 `DSH_BIN` 指定 `dsh` 可执行文件。
111
111
 
112
112
  ### 安装完整套件
113
113
 
@@ -116,13 +116,20 @@ Codex UI 既可以独立安装,也可以随桌面端或 Web 套件一起使用
116
116
  ```powershell
117
117
  [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
118
118
  $OutputEncoding = [System.Text.Encoding]::UTF8
119
- dsh plugin --profile web add @michengai/dsh-codex-suite@latest --registry=https://registry.npmjs.org/
120
- dsh --profile web --dump-config
119
+ npx --yes @michengai/dsh-codex-suite@latest --profile web
121
120
  ```
122
121
 
123
- 需要钉死某一版时,把 `@latest` 换成具体版本,例如 `@0.1.0`。
122
+ 安装器会读取该 Suite 版本验证过的精确成员版本,用一次 `dsh plugin add` 将六个成员写成 profile 的直接依赖,并在最后运行 `dsh --profile web --dump-config`。需要钉死一组版本时,把 `@latest` 换成具体 Suite 版本。
123
+
124
+ 安装后重启 DSH Web 并硬刷新浏览器。已有成员会原地对齐版本;旧版 `@michengai/dsh-codex-suite` 聚合依赖会在六个成员提升完成后自动移除。
125
+
126
+ 新建自定义 Web profile 也使用同一命令,只需改 profile 名:
127
+
128
+ ```powershell
129
+ npx --yes @michengai/dsh-codex-suite@latest --profile codex
130
+ ```
124
131
 
125
- 安装后重启 DSH Web 并硬刷新浏览器。若该 profile 已单独安装上述任一插件,先卸载这些独立插件,再装套件。
132
+ 安装器会复用当前 `DSH_HOME`,并把 DSH 自带的 `@deepseek-ai/dsh-web-app` 放到成员 bundle 之前;不会创建独立 Home,也不会重新安装官方 Web 包。
126
133
 
127
134
  ### 只安装 Codex UI
128
135
 
package/dist/index.mjs CHANGED
@@ -7,10 +7,10 @@ import { randomUUID } from "node:crypto";
7
7
  //#region src/dependencies.ts
8
8
  const SUITE_PACKAGE = "@michengai/dsh-codex-suite";
9
9
  const SUITE_MEMBER_PACKAGES = [
10
+ "@michengai/dsh-archive-manager",
10
11
  "@michengai/dsh-codex-ui",
11
- "@michengai/dsh-agency-agents",
12
12
  "@michengai/dsh-skills-manager",
13
- "@michengai/dsh-archive-manager",
13
+ "@michengai/dsh-agency-agents",
14
14
  "@michengai/dsh-im-connect",
15
15
  "@michengai/dsh-automation"
16
16
  ];
@@ -122,6 +122,15 @@ async function installedPackageVersion(packageName) {
122
122
  function isManagedPackageInstalled(input) {
123
123
  return input.declared && input.installedVersion !== void 0 && input.installedVersion !== "";
124
124
  }
125
+ /** 旧 Suite 对其六个成员拥有声明权;迁移成直接依赖前也应显示真实安装版本。 */
126
+ function isManagedPackageDeclared(packageName, declared) {
127
+ return declared.includes(packageName) || declared.includes("@michengai/dsh-codex-suite") && SUITE_MEMBER_PACKAGES.includes(packageName);
128
+ }
129
+ /** 更新旧 Suite 中任一成员时,必须一次提升全部成员,避免移除 Suite 后只剩一个插件。 */
130
+ function directPackagesForInstall(requested, declared) {
131
+ const migrateSuite = declared.includes("@michengai/dsh-codex-suite") && requested.some((packageName) => SUITE_MEMBER_PACKAGES.includes(packageName));
132
+ return [...new Set(migrateSuite ? [...SUITE_MEMBER_PACKAGES, ...requested] : requested)];
133
+ }
125
134
  /** npm latest 查询缓存有效期:避免每次打开“关于”页都打 7 个 registry 请求。 */
126
135
  const LATEST_CACHE_TTL_MS = 3e5;
127
136
  const latestCache = /* @__PURE__ */ new Map();
@@ -227,7 +236,7 @@ async function dependencyStatuses() {
227
236
  const declaredNames = await declaredPluginNames();
228
237
  return Promise.all(MANAGED_DEPENDENCIES.map(async (dependency) => {
229
238
  const version = await installedPackageVersion(dependency.packageName);
230
- const declared = isOfficialRuntimePackage(dependency.packageName) || declaredNames.includes(dependency.packageName);
239
+ const declared = isOfficialRuntimePackage(dependency.packageName) || isManagedPackageDeclared(dependency.packageName, declaredNames);
231
240
  if (version === void 0 || !isManagedPackageInstalled({
232
241
  installedVersion: version,
233
242
  declared
@@ -454,7 +463,7 @@ async function installDependenciesLocked(ids, requestHotUpdate) {
454
463
  return dependency;
455
464
  });
456
465
  const declared = await declaredPluginNames();
457
- const targets = await Promise.all(dependencies.map(async (dependency) => {
466
+ const requestedTargets = await Promise.all(dependencies.map(async (dependency) => {
458
467
  const latestVersion = await npmLatestVersion(dependency.packageName);
459
468
  if (latestVersion === void 0) throw new Error("无法获取 npm 最新版本,请检查网络或 npm registry 后重试。");
460
469
  const packageName = resolveDshPluginTarget(dependency.packageName, declared);
@@ -465,6 +474,21 @@ async function installDependenciesLocked(ids, requestHotUpdate) {
465
474
  version
466
475
  };
467
476
  }));
477
+ const requestedVersions = new Map(requestedTargets.map((target) => [target.packageName, target.version]));
478
+ const targetPackages = directPackagesForInstall(requestedTargets.map((target) => target.packageName), declared);
479
+ const targets = await Promise.all(targetPackages.map(async (packageName) => {
480
+ const requestedVersion = requestedVersions.get(packageName);
481
+ if (requestedVersion !== void 0) return {
482
+ packageName,
483
+ version: requestedVersion
484
+ };
485
+ const version = await installedPackageVersion(packageName) ?? await npmLatestVersion(packageName);
486
+ if (version === void 0) throw new Error("无法读取 Suite 成员版本,请检查 npm 安装后重试。");
487
+ return {
488
+ packageName,
489
+ version
490
+ };
491
+ }));
468
492
  const remove = [...new Set(targets.flatMap((target) => pluginsToRemoveBeforeInstall(declared, target.packageName)))];
469
493
  for (const target of targets) {
470
494
  await ensureLatestReleaseAllowed(target.packageName, target.version);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@michengai/dsh-codex-ui",
3
- "version": "0.2.81",
3
+ "version": "0.2.82",
4
4
  "description": "以 Codex 风格重构 DSH Web 侧栏的独立客户端插件",
5
5
  "license": "Apache-2.0",
6
6
  "publishConfig": {
@@ -53,6 +53,11 @@
53
53
  "platform": "web"
54
54
  }
55
55
  },
56
+ "scripts": {
57
+ "build": "tsc --noEmit && tsdown",
58
+ "typecheck": "tsc --noEmit",
59
+ "test": "pnpm run typecheck && vitest run tests/client-runtime.integration.spec.ts && tsdown && node tests/run-assertions.mjs"
60
+ },
56
61
  "peerDependencies": {
57
62
  "@deepseek-ai/cordis": ">=4.0.1 <5.0.0",
58
63
  "@deepseek-ai/dsh-client-locale": ">=0.1.0-rc.0 <0.2.0",
@@ -98,10 +103,5 @@
98
103
  "tsx": "^4.22.4",
99
104
  "typescript": "^6.0.3",
100
105
  "vitest": "^4.1.8"
101
- },
102
- "scripts": {
103
- "build": "tsc --noEmit && tsdown",
104
- "typecheck": "tsc --noEmit",
105
- "test": "pnpm run typecheck && vitest run tests/client-runtime.integration.spec.ts && tsdown && node tests/run-assertions.mjs"
106
106
  }
107
- }
107
+ }