@dsh-workbench/core 0.2.10 → 0.2.12

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.
Files changed (60) hide show
  1. package/client.js +785 -2361
  2. package/dist/board.css +0 -12
  3. package/dist/client/client.body.js +785 -2361
  4. package/dist/client/index.js +786 -2362
  5. package/dist/host/index.js +2902 -859
  6. package/dist/types/app/client.d.ts +42 -52
  7. package/dist/types/app/layouts/rightbar/board-mock.d.ts +1 -1
  8. package/dist/types/app/layouts/rightbar/board-plan.d.ts +2 -12
  9. package/dist/types/app/layouts/rightbar/board-shape.d.ts +14 -0
  10. package/dist/types/app/layouts/rightbar/kit-preview-controls.d.ts +10 -0
  11. package/dist/types/app/layouts/rightbar/kit-preview-frame.d.ts +14 -0
  12. package/dist/types/app/layouts/rightbar/kit-preview-rows.d.ts +5 -0
  13. package/dist/types/app/layouts/rightbar/kit-preview.d.ts +3 -0
  14. package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +1 -1
  15. package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
  16. package/dist/types/app/layouts/sidebar/workspace-groups.d.ts +0 -1
  17. package/dist/types/app/layouts/sidebar/workspace-items.d.ts +2 -3
  18. package/dist/types/dev/MockStrip.d.ts +15 -0
  19. package/dist/types/dev/surface-types.d.ts +53 -0
  20. package/dist/types/dev/surface.d.ts +2 -0
  21. package/dist/types/dev/surface.stub.d.ts +2 -0
  22. package/dist/types/modules/panels/__tests__/diy-harness.d.ts +32 -0
  23. package/dist/types/modules/panels/__tests__/market-tools-harness.d.ts +1 -1
  24. package/dist/types/modules/panels/__tests__/scope-support.d.ts +1 -1
  25. package/dist/types/modules/panels/model/diy-act.d.ts +4 -0
  26. package/dist/types/modules/panels/model/diy-act.test.d.ts +1 -0
  27. package/dist/types/modules/panels/model/diy-browser-act.d.ts +47 -0
  28. package/dist/types/modules/panels/model/diy-browser.d.ts +47 -0
  29. package/dist/types/modules/panels/model/diy-browser.test.d.ts +1 -0
  30. package/dist/types/modules/panels/model/diy-context.d.ts +102 -0
  31. package/dist/types/modules/panels/model/diy-context.test.d.ts +1 -0
  32. package/dist/types/modules/panels/model/diy-logs.d.ts +18 -0
  33. package/dist/types/modules/panels/model/diy-logs.test.d.ts +1 -0
  34. package/dist/types/modules/panels/model/diy-look.d.ts +14 -0
  35. package/dist/types/modules/panels/model/diy-look.test.d.ts +1 -0
  36. package/dist/types/modules/panels/model/diy-net.d.ts +3 -0
  37. package/dist/types/modules/panels/model/diy-net.test.d.ts +1 -0
  38. package/dist/types/modules/panels/model/diy-page.d.ts +15 -0
  39. package/dist/types/modules/panels/model/diy-page.test.d.ts +1 -0
  40. package/dist/types/modules/panels/model/diy-schema.d.ts +9 -0
  41. package/dist/types/modules/panels/model/diy-schema.test.d.ts +1 -0
  42. package/dist/types/modules/panels/model/diy-scripts.d.ts +64 -0
  43. package/dist/types/modules/panels/unit.d.ts +43 -3
  44. package/dist/types/shared/api/diy.d.ts +4 -0
  45. package/dist/types/shared/api/host/__tests__/png-fixtures.d.ts +17 -0
  46. package/dist/types/shared/api/host/mount-units.d.ts +6 -0
  47. package/dist/types/shared/api/host/png-crop.d.ts +21 -0
  48. package/dist/types/shared/api/host/png-crop.test.d.ts +1 -0
  49. package/package.json +2 -2
  50. package/skills/workbench-module-diy/BUILD.md +4 -3
  51. package/skills/workbench-module-diy/DATASOURCE.md +4 -4
  52. package/skills/workbench-module-diy/DESIGN.md +1 -1
  53. package/skills/workbench-module-diy/KIT.md +121 -0
  54. package/skills/workbench-module-diy/PANEL.md +12 -2
  55. package/skills/workbench-module-diy/REVIEW.md +12 -6
  56. package/skills/workbench-module-diy/SKILL.md +7 -6
  57. package/skills/workbench-module-diy/TOOLING.md +5 -4
  58. package/skills/workbench-module-diy/TOOLS.md +3 -3
  59. package/skills/workbench-module-diy/WIRING.md +6 -6
  60. package/dist/types/app/layouts/sidebar/WorkspaceSearchField.d.ts +0 -9
@@ -28,7 +28,7 @@
28
28
 
29
29
  一条结论 + 去哪读全(细节只有一份,住在 BUILD.md):
30
30
 
31
- 1. **装上去没反应** → 先问 `workbench_diy`(`action=status, unit=…`),别自己拼。[WIRING.md](WIRING.md) §3
31
+ 1. **装上去没反应** → 先问 `workbench_diy_status`(`unit=…`),别自己拼。[WIRING.md](WIRING.md) §3
32
32
  2. **改完没热换** → 宿主侧是秒级热换的;客户端侧刷新一下页面。[WIRING.md](WIRING.md) §4
33
33
  3. **"再装一遍"** → 日常迭代只重建、不重装。[WIRING.md](WIRING.md) §3
34
34
 
@@ -36,18 +36,24 @@
36
36
 
37
37
  他说"一片空白 / 一直转圈 / 数字不对"时,**先取证再改代码**,四步按顺序走;前一步有结论就停在那儿修:
38
38
 
39
- 1. **`workbench_diy`(`action=panel`)** —— 这个工作区面板上现在是什么样:哪几张卡、每张最后一次取数
39
+ 1. **`workbench_diy_panel`(``)** —— 这个工作区面板上现在是什么样:哪几张卡、每张最后一次取数
40
40
  是读到了还是读不到(带宿主回的码与原文)、有没有崩过(原因 + 次数)。有答案就别往下走。
41
- 2. **`workbench_diy`(`action=status, unit=…`)** —— 看"起得来:不是 —— …"那一行:模块起不来时
41
+ 1.5 **`workbench_diy_look`(`unit=…`)** —— 只截**这一张卡**(不动用户那一页)+ 它的盒子、卡头、可见文本;要看什么由你点:`props` 挑样式(想解释颜色/圆角就点名 `--dsw-…` 令牌)、`parts` 挑卡片里哪几块。图存进工坊、你自己也能看;配合 `workbench_diy_panel` 的「崩过 / 读到了」就够把"看起来不对"说成"哪一处不对"。
42
+ 2. **`workbench_diy_status`(`unit=…`)** —— 看"起得来:不是 —— …"那一行:模块起不来时
42
43
  原因就在那里(装配抛的错 / 声明被拒的原文)。这一行说"都在生效"才继续第 3 步。
43
44
  3. **自己把那条读跑一遍**:卡片画的就是模块自己那条宿主路由的返回值 ——
44
45
  `curl '<工作台地址>/workbench/api/<unit>/<route>'`(地址就是你起工作台那个,默认 `http://127.0.0.1:3081`)。
45
46
  接口回对了而卡片不对,问题在渲染那一侧;接口就回错,问题在宿主半侧(回头照着 [DATASOURCE.md](DATASOURCE.md) 重探一次)。
46
- 4. **最后才看用户那一页**:`opencli browser <会话> console`(**不带任何过滤** —— 第一次查用过滤会得到
47
- 假的"没有消息",本仓实测踩过)、`state`(这一页是什么、有哪些可点的)、`screenshot <路径>`(截一张自己看)。
47
+ 要的是**浏览器里那一次**的原文(带凭据的那种),用 `workbench_diy_probe`(`script` 里 `fetch` 自己那条读)。
48
+ 4. **最后才看用户那一页**:要这一页的**控制台**,走三拍 —— `workbench_diy_logs_watch`(装上带钩子的收听)→
49
+ 做那件你怀疑会报错的事 → `workbench_diy_logs_read`(最近 50 条,读完 `workbench_diy_logs_stop` 卸掉)。
50
+ 钩子有上限(每页 200 条、单条截 400 字、随刷新消失),不会把用户那一页吃胖。要在页面里跑一段自己的代码
51
+ (读接口 / 抄一个 DOM 值),用 `workbench_diy_probe`。**别用 `opencli browser <会话> console`** ——
52
+ 那条命令拿到的是个 stub(恒回空数组、还 exit 0),看上去像"没有报错"。
53
+ 要看这一页是什么、有哪些可点的,用 `state`;要一张图用 `screenshot <路径>`。
48
54
  宿主侧热换 / 装载的报错在**起工作台那个终端**里,不在浏览器里。
49
55
 
50
- 两条纪律:**别让用户截图或替你转述报错**(第 1 步就是干这个的);**截图与 console 只用来定位,不用来验收** ——
56
+ 两条纪律:**别让用户截图或替你转述报错**(第 1 步就是干这个的);**截图与 probe 只用来定位,不用来验收** ——
51
57
  验收仍是他对着三张表走「打开哪 → 看什么 → 点什么 → 应该看到什么」。
52
58
 
53
59
  面板运行态是**用户那一页自己报上来的**(页面关了就停在最后一次,带时间与新鲜度),所以第 1 步没有内容时,
@@ -14,7 +14,7 @@ description: 在工作台里凭需求造一个模块(面板上的一块内容
14
14
  这一步的产出是 ASCII 画面 + 三张表,不是文字。三张表当场落进模块里的 `design.json`
15
15
  (命令与形状:[DESIGN.md](DESIGN.md) §5)—— 只留在对话里等于没定。
16
16
  3. **先定数据从哪来** —— [DATASOURCE.md](DATASOURCE.md):干净机器上没有现成 skill 可抄,
17
- 用 `workbench_diy`(`action=probe, url=…, script=…`)复用他的登录去探 —— 两拍、重试、失败码归一
17
+ 用 `workbench_diy_probe`(`url=…, script=…`)复用他的登录去探 —— 两拍、重试、失败码归一
18
18
  都在那把工具里;探明后**固化成一条读**(`@dsh-workbench/shared/host` 的 `browserRead`)。顺手把三态写掉。
19
19
  4. **从模板改** —— [BUILD.md](BUILD.md) §1–§2:在工坊里 `dsh-wb-module init` 一个骨架,
20
20
  把 `design.json` 里的**三张表与数据源记录先改成你问出来的那份**(`design check` 会点名叫出还空着哪一格),
@@ -23,14 +23,14 @@ description: 在工作台里凭需求造一个模块(面板上的一块内容
23
23
  命令写成 `pnpm exec dsh-wb-module …`(工坊里 PATH 上也有同名入口,但 `pnpm exec` 到处都对)。
24
24
  5. **自己过门禁** —— `dsh-wb-module build` + `check` + `design check`;
25
25
  红了自己修([REVIEW.md](REVIEW.md) 有对照),不抛给他、也不贴报错给他看。
26
- 6. **让他看一眼** —— 先对着 ASCII 图确认,再用 `workbench_diy`(`action=install, unit=<单元 id>`)装上:
26
+ 6. **让他看一眼** —— 先对着 ASCII 图确认,再用 `workbench_diy_install`(`unit=<单元 id>`)装上:
27
27
  它只认工坊里造好的那个模块,装完顺手在**这个项目**的面板上打开(装的是这台机器上的东西,他会点头一次)。
28
28
  **这一跳永远只走一次**:之后只重建、不重装(宿主侧秒级热换;改了 client.js 刷新一下页面)。
29
29
  拿不准它现在走到哪一步(装了没 / 面板认得没 / 这个项目上开着没 / 产物齐不齐 / 源码比产物新没),
30
- 就问工具:`workbench_diy`(`action=status, unit=<单元 id>`)会把这几件事一次说清并给出下一步 ——
31
- **别自己拼,也别再装一遍**;已经装过只是想上板,用 `action=open`。
30
+ 就问工具:`workbench_diy_status`(`unit=<单元 id>`)会把这几件事一次说清并给出下一步 ——
31
+ **别自己拼,也别再装一遍**;已经装过只是想上板,用 `workbench_diy_show`。
32
32
  7. **验收** —— 逐条对着三张表走:「打开哪 → 看什么 → 点什么 → 应该看到什么」。
33
- 他说哪不对,**先取证再改**:`workbench_diy`(`action=panel`)一次看清面板上每张卡是读到了、读不到还是崩了
33
+ 他说哪不对,**先取证再改**:`workbench_diy_panel` 一次看清面板上每张卡是读到了、读不到还是崩了
34
34
  (四步取证见 [REVIEW.md](REVIEW.md));改完让他看**同一处**;不给他看 diff、日志、代码。
35
35
  逐条过他都说对了,再 `dsh-wb-module design accept` 把验收打勾(**没验完不许打**)。
36
36
 
@@ -48,12 +48,13 @@ description: 在工作台里凭需求造一个模块(面板上的一块内容
48
48
  | 步骤 1 / 2 / 3 各自问什么、什么时候算做完 | [STEPS.md](STEPS.md) |
49
49
  | **数据从哪来**(干净机器上怎么找到那一条读) | [DATASOURCE.md](DATASOURCE.md) |
50
50
  | 面板上该有什么、状态矩阵怎么写、界面习惯 | [PANEL.md](PANEL.md) |
51
+ | **要做什么 → 用哪件 kit → 最小写法**(照抄面) | [KIT.md](KIT.md) |
51
52
  | 能力怎么划、传什么拿回什么、哪几件要点头 | [TOOLS.md](TOOLS.md) |
52
53
  | agent 动完面板哪一格变、他正在干的时候看哪儿 | [LINKAGE.md](LINKAGE.md) |
53
54
  | 落点、文件形状、命令、两个面 | [BUILD.md](BUILD.md) |
54
55
  | 依赖、会被拦的写法、装、热换、发布 | [WIRING.md](WIRING.md) |
55
56
  | 门禁红了、装上去没反应、改完没热换 | [REVIEW.md](REVIEW.md) |
56
- | 用户说"卡片不对 / 一片空白 / 一直转圈"(四步取证) | [REVIEW.md](REVIEW.md) 那一节 · `workbench_diy`(`action=panel`) |
57
+ | 用户说"卡片不对 / 一片空白 / 一直转圈"(四步取证) | [REVIEW.md](REVIEW.md) 那一节 · `workbench_diy_panel`(``) |
57
58
  | 哪条纪律已经固化成工具、哪些还留给 agent | [TOOLING.md](TOOLING.md) |
58
59
 
59
60
  ## 找不到一件事的时候,按这个顺序找
@@ -14,9 +14,10 @@
14
14
  |---|---|
15
15
  | 十一条判据([REVIEW.md](REVIEW.md)) | `dsh-wb-module check`(`--only <判据>` 单跑;`--only kit` 列这份外壳的 kit 成员) |
16
16
  | 落点、文件形状、四个脚本([BUILD.md](BUILD.md) §1–§2) | `dsh-wb-module init --template diy`(骨架带一条真读盘的数据源)+ `scripts/smoke.mjs` |
17
- | 装、上板、不重装([WIRING.md](WIRING.md) §3) | `workbench_diy`(`install` / `open` / `status`)+ `workbench_panels` |
18
- | 它到底起得来没(装配抛的错 / 声明被拒的原文) | `workbench_diy`(`status` 的"起得来"那一行,见 [REVIEW.md](REVIEW.md) 四步取证的第二步) |
19
- | 面板上现在是什么样(每张卡读到没 / 崩没崩) | `workbench_diy`(`panel`:浏览器半侧上报,宿主按 unit 留最新一条;见 [ADR-0042](../../../../docs/adr/0042-panel-runtime-state-is-reported-to-the-host.md)) |
17
+ | 装、上板、不重装([WIRING.md](WIRING.md) §3) | `workbench_diy_install` / `workbench_diy_show` / `workbench_diy_status`(工坊那一跳自己上板,不再指向 `workbench_panels_show`) |
18
+ | 它到底起得来没(装配抛的错 / 声明被拒的原文) | `workbench_diy_status`("起得来"那一行,见 [REVIEW.md](REVIEW.md) 四步取证的第二步) |
19
+ | 这一页的控制台 / 网络怎么取证([REVIEW.md](REVIEW.md) 四步取证) | `workbench_diy_logs_watch` / `_read` / `_stop`(钩子有上限:每页 200 条、单条 400 字);`workbench_diy_net_watch` / `_read` / `_stop`(最多 2000 行 / 15 分钟后自己收工;`_read key=…` 取 body)。**别用 `opencli browser <会话> console`**:那条命令拿到的是 stub,恒回空数组。网络那一头工作台走的是**隔离 opencli**(自己的 `HOME`),它的缓存与你自己 shell 里 `~/.opencli` 那份不是同一个 —— 核验要用工具,别看错文件 |
20
+ | 面板上现在是什么样(每张卡读到没 / 崩没崩) | `workbench_diy_panel`(浏览器半侧上报,宿主按 unit 留最新一条;见 [ADR-0042](../../../../docs/adr/0042-panel-runtime-state-is-reported-to-the-host.md)) |
20
21
  | 空着的格就是还没定的事([DESIGN.md](DESIGN.md) §5) | `design.json` + `design check`(点名叫出空格)/ `render` / `accept` |
21
22
  | 发货前的清单([WIRING.md](WIRING.md) §5) | `dsh-wb-module publish`(门禁 + 打包清单 `files` 漏项,只 dry run) |
22
23
  | 干净机器上的第一脚([SKILL.md](SKILL.md) 第 4 步) | 启动器自愈骨架 + PATH 上的 `dsh-wb-module` |
@@ -29,7 +30,7 @@
29
30
  | DOM 读怎么读([DATASOURCE.md](DATASOURCE.md) 第 2 步) | `probe`(探)+ `browserFind`(固化)—— 切格 / 按列取值是两个纯函数 |
30
31
  | 链接只有一副样子([PANEL.md](PANEL.md) §6) | kit 的 `Link` 是唯一一份(**没有 `icon` 口子**),`check --only style` 拦裸 `<a>` |
31
32
  | 输入框不用自己配样式([PANEL.md](PANEL.md) §5.1) | `TextField` 的默认内边距 + kit 的 `Field`(标签 + 提示的排布) |
32
- | 这个单元在哪些工作区出现([TOOLS.md](TOOLS.md) §12) | **不是模块能声明的事** —— 用户用 `workbench_panels` 的板决定(卡片与全部工具同判);协议里的 `scope` 已删。`gate.deniedTools` 是可选的运行期收窄,门禁不再对它做声明对账 |
33
+ | 这个单元在哪些工作区出现([TOOLS.md](TOOLS.md) §12) | **不是模块能声明的事** —— 用户用 `workbench_panels_*` 的板决定(卡片与全部工具同判);协议里的 `scope` 已删。`gate.deniedTools` 是可选的运行期收窄,门禁不再对它做声明对账 |
33
34
 
34
35
  ## 留给 agent 的(判断,不该固化)
35
36
 
@@ -126,7 +126,7 @@ approvalDetail: async (call) => ({ zh: '会覆盖这 3 个模块的产物,不
126
126
  ## 8 外部供给:这个能力要靠什么才跑得起来
127
127
 
128
128
  模块要的东西机器上不一定有(opencli 插件、内网源上的 npm 库)。**清单里的 `env` 段就是说这件事的** ——
129
- 外壳的隔离运行时按它去装、去探,装机器的状态在 `workbench_modules list` 里逐条看得到
129
+ 外壳的隔离运行时按它去装、去探,状态在 `workbench_modules_list` 里逐条看得到
130
130
  (实测:`cmdb` 声明了插件 `cmdb`/`coding` 与库 `opencli-workflow`,那份列表里就按名字列着它们与版本)。
131
131
 
132
132
  ```ts
@@ -251,10 +251,10 @@ return {
251
251
 
252
252
  外壳自己就是这么用的(工坊里看 `node_modules/@dsh-workbench/core/…`,仓库里是
253
253
  `packages/workbench/src/modules/panels/index.ts`):某张卡在这个项目上没开 → 那张卡的工具全不出现;
254
- 工坊那把窄门工具 `workbench_diy` **只在工坊会话里**出现,别处一律不出现。
254
+ 工坊那七把(`workbench_diy_*`)**只在工坊会话里**出现,别处一律不出现。
255
255
 
256
256
  **"这条能力在哪些工作区出现"不用你声明 —— 那是用户的事。** 用户口径:「模块开发者不能定义 scope,
257
- scope 永远是用户来决定的」。他在 `workbench_panels`(agent 工具)里把它们放上/收起;一个单元在不在,
257
+ scope 永远是用户来决定的」。他在 `workbench_panels_show` / `workbench_panels_hide`(agent 工具)里把它们放上/收起;一个单元在不在,
258
258
  它的卡片与**全部**工具同判(外壳的 `resolveScope` 只看两份板:本工作区那份,否则机器级那份)。
259
259
  协议里那个 `scope`(`dsh.workbench.tools[].scope` / `card.scope`)**已经删掉**,写它就是写了一个
260
260
  不认识的键、`check --only protocol` 当场红(见 [ADR-0038 §2.4 / §6.16](../../../../docs/adr/0038-module-declaration-protocol.md))。
@@ -43,7 +43,7 @@ import 运行值会被**打进你的包**(第二份实例),而且浏览器
43
43
 
44
44
  ## 3 装上,看一眼
45
45
 
46
- 模块造好、门禁绿了,**装这一步你自己做** —— 用 `workbench_diy`(`action=install, unit=<单元 id>`):
46
+ 模块造好、门禁绿了,**装这一步你自己做** —— 用 `workbench_diy_install`(`unit=<单元 id>`):
47
47
 
48
48
  - 它只认**工坊里造好的**那个模块(按 unit 在工坊里查,不接任何路径)。
49
49
  - 装完顺手在**当前会话这个工作区**的面板上把它打开。
@@ -57,15 +57,15 @@ import 运行值会被**打进你的包**(第二份实例),而且浏览器
57
57
  改源码 + `dsh-wb-module build` 就行;同名重装本来就只会得到"要重启",而那一支连重载都不做。
58
58
  - **装 ≠ 上板**:面板默认是空的,得在面板配置里把它打开 —— 那一跳顺手做掉了。
59
59
  只有在"要重启才生效"或它还没登记进外壳时才会没打开,那时返回里会说清:
60
- 等它生效后调 `workbench_panels`(`action=show, id=<单元 id>`)。
61
- - **拿不准它现在走到哪一步就问 `action=status`**:装了没 / 面板认得没 / 这个项目上开着没 / 产物齐不齐 /
60
+ 等它生效后调 `workbench_diy_show`(`unit=<单元 id>`)—— 它只上板、不装,也不会多要一次点头。
61
+ - **拿不准它现在走到哪一步就问 `workbench_diy_status`**:装了没 / 面板认得没 / 这个项目上开着没 / 产物齐不齐 /
62
62
  源码是否比产物新,外加一句"下一步做什么"。这五件事别自己去 panels、profile、工坊目录三处拼 ——
63
63
  实测会拼错(把"要重启才注册"读成"没装上",或者源码改了没 build 却去重装一遍)。
64
- - **已经装过、只是没上板**:`action=open`(只上板,不装)。
64
+ - **已经装过、只是没上板**:`workbench_diy_show`(只上板,不装)。
65
65
 
66
- `workbench_diy` **只在工坊那个会话里**(工具清单按工作区收窄,别处连它都不在),
66
+ 工坊那七把 `workbench_diy_*` **只在工坊那个会话里**(工具清单按工作区收窄,别处连它都不在),
67
67
  落在别的项目里调用会被当场拒 —— 这就是"DIY 模式"在工具面上的样子。
68
- 普通项目里装别的东西是另一把工具:`workbench_modules`。
68
+ 普通项目里装别的东西是另一套工具:`workbench_modules_install` / `workbench_modules_uninstall` 等(见 TOOLS.md)。
69
69
 
70
70
  ## 4 改一行,看到它变
71
71
 
@@ -1,9 +0,0 @@
1
- import type { Translate } from '@dsh-workbench/shared';
2
- export interface WorkspaceSearchFieldProps {
3
- readonly t: Translate;
4
- readonly query: string;
5
- readonly onQuery: (query: string) => void;
6
- readonly onCursor: (step: 1 | -1) => void;
7
- readonly onSubmit: () => void;
8
- }
9
- export declare function WorkspaceSearchField({ t, query, onQuery, onCursor, onSubmit, }: WorkspaceSearchFieldProps): JSX.Element;