@dsh-workbench/core 0.2.4 → 0.2.6

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.md CHANGED
@@ -25,7 +25,7 @@ dsh web (:3080) dsh workbench (:3081)
25
25
  | --- | --- | --- |
26
26
  | `dsh` | 本体。本包在 `0.1.7-rc.2` 上验过 | `npm i -g @deepseek-ai/dsh` |
27
27
  | `node` + `pnpm` | dsh 的 `plugin` 子命令是**转发给 pnpm** 的;没有 pnpm 会直接报 `dsh: pnpm was not found` | 各自装 |
28
- | 跑过一次 `dsh web` | `setup` 拿 `~/.dsh/profiles/web` 当模板(bundle 清单 + 设置快照 + patch 点名的依赖)。没有它会**明确报错**,不会静默建出半个 profile | `dsh web`,起来就行,然后 Ctrl-C |
28
+ | 跑过一次 `dsh web` | `setup` 拿 `~/.dsh/profiles/web` 当模板(**bundle 清单**:这台机器上装了哪些 bundle),也是「配置同步」的默认来源。没有它会**明确报错**,不会静默建出半个 profile | `dsh web`,起来就行,然后 Ctrl-C |
29
29
 
30
30
  然后两条命令:
31
31
 
@@ -74,7 +74,8 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
74
74
  | 升级 | 重跑一次 `npx --yes @dsh-workbench/core@latest setup`(幂等),再重启工作台进程 |
75
75
  | 重建 profile | `mv ~/.dsh/profiles/workbench ~/.dsh/profiles/workbench.bak`,再跑一次 `setup` |
76
76
  | 彻底不用了 | 删 `~/.dsh/profiles/workbench` 与 `~/.dsh/workbench` 两个目录(都不影响 `dsh web`) |
77
- | 改设置 | 只有工作台要的(面板显示哪些模块、会话隔离)在 `:3081` 的 Settings 里改 |
77
+ | 改设置 | 在 `:3081` 的 Settings 里改(模型供应商 / 搜索源 / MCP 也是这里) |
78
+ | 从 `dsh web` 搬设置过来 | 设置 → 「配置同步」→ 选来源 → 勾行 → 同步 → 重启工作台 |
78
79
 
79
80
  ## 和 `dsh web` 的关系
80
81
 
@@ -83,10 +84,11 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
83
84
  - **另一个 profile、另一个端口、另一个进程**:`workbench` profile 在 `~/.dsh/profiles/workbench`;
84
85
  会话 / 存储 / 附件 / 模块配置全走 `~/.dsh/workbench/**`,与 web **数据分家**。只有一样有意共享:
85
86
  API 凭据(`~/.dsh/.credentials.yaml`,一机一把 key)。
86
- - **两边都要的设置只在 `dsh web` 里配一次**(模型供应商 / API key / 搜索源 / MCP):工作台启动时
87
- 把 web 的 profile patch 叠在自己上面(`--patch`,**单向、实时**)。被 web 管的行在工作台的
88
- Settings 页里会显示 `overridden by a home patch or command-line overlay` —— 那是**提示**,不是故障。
89
- 反向不成立:工作台里配的不会流回 web。
87
+ - **设置是工作台自己那份**:模型供应商 / 搜索源 / MCP 都在 `:3081` 的 Settings 里配,
88
+ 落在 `profiles/workbench/cordis.patch.yml` —— 那是它唯一的一份设置文档,每一行都改得动。
89
+ 想用 `dsh web` 那边已经配好的行:`:3081` → `Meta+,` → 「配置同步」→ 选来源 → 勾行 → 同步 →
90
+ **重启工作台**(只搬显式配过的行;同 id 内容不同默认不覆盖)。web 后来改的不会自动过来,
91
+ 再打开这一页拉一次即可。见 [ADR-0044](../../docs/adr/0044-config-sync-replaces-the-web-patch-overlay.md)。
90
92
  - ⚠️ **别在 Settings → 插件里把 `@dsh-workbench/core` 关掉**:关掉 = 它那份 bundle patch 整份不再应用
91
93
  (包括里面的"禁用出厂左栏"),界面会**退化成原版 dsh web**(左栏回来、右侧面板消失)。
92
94
  **数据一个都不丢**;把开关拨回来就恢复 —— 进不去设置页就按 `Meta+,`。别当成故障去重建 profile。
@@ -101,6 +103,8 @@ npx @dsh-workbench/core # ② 起工作台,默认 :3081
101
103
  | 打开面板 / 按刷新要等 5–8 秒 | 正常:opencli 每次调用有**固定约 5 秒**开销(起浏览器会话)。**没有缓存**,数据一律实时 |
102
104
  | 体检那屏说「检测浏览器通道 · 没连上」,可面板照样能用 | 本机全局 opencli 与隔离运行时版本不一致,daemon 被顶成对方那版;下一条浏览器命令会自动把它重启回来,体检复检后改回「已连接」 |
103
105
  | 一切正常,但左栏是出厂样子、右边没有面板 | 工作台插件在 Settings 里被关了(见上一条 ⚠️) |
106
+ | 模型列表里只有出厂的几个、没有自己配的供应商 | 新装的 profile 不带设置(ADR-0044):设置 → 「配置同步」→ 选来源 → 勾 `llm-` 那几行 → 同步 → 重启 |
107
+ | 「配置同步」里某一行说 `@x 还没装` | 那一行点名的包不在这个 profile 的 `node_modules` 里:`dsh plugin --profile workbench add @x`(或在模块市场装),再重启 |
104
108
 
105
109
  排障全表在仓库的 [`docs/OPERATIONS.md`](https://github.com/code-farmer-i/dsh-workbench/blob/main/packages/workbench/docs/OPERATIONS.md);
106
110
  把工作台装到别人机器上的前置清单见 [`docs/HANDOFF.md`](https://github.com/code-farmer-i/dsh-workbench/blob/main/packages/workbench/docs/HANDOFF.md)。
package/bin/dsh-workbench CHANGED
@@ -138,51 +138,18 @@ else
138
138
  export DSH_WORKBENCH_ROOT="$REPO_DIR"
139
139
  fi
140
140
 
141
- # ── 把 web 的设置**叠加**上来(web → 工作台,单向、实时)────────────────────
141
+ # ── 设置从哪来:工作台自己的 profile patch(不再叠 web 那一份)──────────────
142
142
  #
143
- # 为什么叠而不是复制:`seed-profile.sh` 是把 web 的设置**快照一份**过来,之后两边各自
144
- # 演进 —— 于是"在 web 里加了个模型供应商,工作台却少一个"这种漂移迟早发生(实测撞过)。
145
- # 叠加则是**同一个来源**:供应商 / 搜索源 / MCP 这类机器级设置只在 `dsh web` 里配一次。
143
+ # 以前每次启动都用 `--patch` 把 `profiles/web/cordis.patch.yml` 叠成**最高层**。
144
+ # 代价是那一层盖住的行在 :3081 的 Settings 里**改不动**:dsh 的 config-editor 写文件
145
+ # **之前**会拿组合后的值跟你写的值对,不等就抛
146
+ # `overridden by a home patch or command-line overlay` —— 文件根本没写。
147
+ # 症状就是"模型供应商这类设置只能去 :3080 改,工作台这边看着能点、点了没用"。
146
148
  #
147
- # 为什么是这一层(`--patch`)而不是机器公共层 `$DSH_HOME/cordis.patch.yml`:
148
- # 公共层对所有 profile 生效且**没有 UI 写入路径**(配置编辑器只写当前 profile 的 patch)
149
- # —— 把设置放进去等于要求用户手编。而 `--patch` 叠的是 web 的 profile patch,
150
- # 用户在 web 的 Settings 页里配的就是它,配完即生效。
151
- #
152
- # 副作用(刻意的):被这一层覆盖的行,在工作台的 Settings 页里会显示
153
- # `overridden by a home patch or command-line overlay` —— 那正是"这行由 web 管"的提示。
154
- # 反向不成立:工作台里配的只落在自己的 profile patch(差异层),web 看不到。
155
- # ⚠️ 叠之前先剥掉「每个界面自己的偏好」那一类。
156
- #
157
- # `--patch` 是最高层,被它覆盖的行在工作台的 Settings 页里会显示
158
- # "overridden by a home patch or command-line overlay"、**改了也会跳回去**。
159
- # 供应商 / 搜索源 / MCP 那类机器级设置这样管是对的;但 `ui-theme.preference`
160
- # 是**每个界面自己的**偏好(有人要 web 深色、工作台浅色),叠上来等于把工作台的
161
- # 主题锁成 web 的 —— 实测就是"切到浅色自动跳回深色"。
162
- #
163
- # 剥的方式:按顶层列表项过滤,命中 id 的那一项整块不要(缩进到下一个 `- ` 为止)。
164
- WEB_PATCH="$DSH_HOME/profiles/web/cordis.patch.yml"
165
- WORKBENCH_PATCH_STRIP="${DSH_WORKBENCH_PATCH_STRIP:-ui-theme}"
149
+ # 现在改成:**工作台自己的 patch 是唯一真相**。想要 web 的哪几行,去
150
+ # 设置 → 「配置同步」里勾(它读源 profile 的 cordis.patch.yml,按行搬运,
151
+ # 见 .scratch/config-sync/spec.md 与 ADR-0044)。启动器只负责把工作台起起来。
166
152
  PATCH_ARGS=()
167
- WEB_PATCH_LAYER="$WEB_PATCH"
168
- if [ -f "$WEB_PATCH" ]; then
169
- if [ -n "$WORKBENCH_PATCH_STRIP" ]; then
170
- WEB_PATCH_LAYER="$(mktemp -t dsh-workbench-web-patch)"
171
- trap 'rm -f "$WEB_PATCH_LAYER"' EXIT INT TERM
172
- awk -v strip="$WORKBENCH_PATCH_STRIP" '
173
- /^- / {
174
- id = $0
175
- sub(/^- id:[[:space:]]*/, "", id)
176
- sub(/[[:space:]]*$/, "", id)
177
- skip = (id == strip)
178
- }
179
- !skip { print }
180
- ' "$WEB_PATCH" > "$WEB_PATCH_LAYER"
181
- fi
182
- PATCH_ARGS=(--patch "$WEB_PATCH_LAYER")
183
- else
184
- echo "dsh-workbench: 提醒 —— 找不到 ${WEB_PATCH},这次不叠加 web 的设置(供应商等可能不全)。" >&2
185
- fi
186
153
 
187
154
  # ── 声明工作台运行时的**可写根**(执行缝的沙箱只放行 process.cwd())──────────
188
155
  #
@@ -195,7 +162,7 @@ fi
195
162
  #
196
163
  # 为什么是 `--patch` 叠加而不是改 profile 的 cordis.patch.yml:profile 可能是旧的
197
164
  # (交接出去的机器尤其如此),没人会回头重跑 seed;叠加层每次启动都生效。
198
- # ⚠️ 必须排在 web 的 patch **之后**:工作台的可写根要赢。
165
+ # ⚠️ 必须排在 profile 自己那一层**之后**:工作台的可写根要赢。
199
166
  SANDBOX_PATCH="$REPO_DIR/profile/sandbox.patch.yml"
200
167
  if [ -f "$SANDBOX_PATCH" ]; then
201
168
  PATCH_ARGS+=(--patch "$SANDBOX_PATCH")