@dsh-workbench/core 1.1.7 → 1.1.9
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/bin/dsh-workbench +11 -45
- package/client.js +379 -305
- package/dist/client/client.body.js +379 -305
- package/dist/client/index.js +252 -178
- package/dist/host/index.js +4684 -4129
- package/dist/types/app/layouts/approval-detail.d.ts +5 -5
- package/dist/types/app/layouts/env-gate/gate-text.d.ts +5 -4
- package/dist/types/app/layouts/rightbar/MarketView.d.ts +25 -3
- package/dist/types/app/layouts/rightbar/market-rows.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/market-view-text.d.ts +1 -2
- package/dist/types/app/layouts/sidebar/ProjectSwitcher.d.ts +1 -1
- package/dist/types/app/layouts/sidebar/workspace-groups.d.ts +4 -1
- package/dist/types/kernel/contract/index.d.ts +1 -0
- package/dist/types/modules/panels/model/approval-questions.d.ts +6 -0
- package/dist/types/modules/panels/model/diy-browser-act.d.ts +2 -2
- package/dist/types/modules/panels/model/diy-browser.d.ts +4 -2
- package/dist/types/modules/panels/model/diy-page.d.ts +2 -1
- package/dist/types/modules/panels/model/diy-record.d.ts +2 -1
- package/dist/types/modules/panels/model/diy-tools.d.ts +1 -0
- package/dist/types/modules/panels/model/market-dependency.d.ts +1 -1
- package/dist/types/modules/panels/model/market-env.d.ts +2 -0
- package/dist/types/modules/panels/model/market.d.ts +1 -1
- package/dist/types/modules/panels/model/plugin-ledger.d.ts +3 -0
- package/dist/types/modules/panels/model/plugin-name.d.ts +7 -3
- package/dist/types/modules/sessions/index.d.ts +1 -1
- package/dist/types/modules/sessions/model/attention.d.ts +1 -0
- package/dist/types/shared/api/host/diy-recon-fs.d.ts +1 -1
- package/dist/types/shared/api/host/diy-recon.d.ts +12 -5
- package/dist/types/shared/api/host/flow/task.d.ts +10 -0
- package/dist/types/shared/api/host/flow/tool.d.ts +12 -0
- package/dist/types/shared/api/host/host-routes.d.ts +2 -2
- package/dist/types/shared/api/host/plugin-term.d.ts +2 -0
- package/dist/types/shared/api/host/runtime-surface.d.ts +3 -0
- package/dist/types/shared/hooks/locale-text.d.ts +3 -0
- package/dist/types/shared/hooks/runtime-queries.d.ts +6 -0
- package/dist/types/shared/hooks/runtime-terms.d.ts +2 -0
- package/dist/types/shared/hooks/use-runtime-capabilities.d.ts +6 -0
- package/package.json +6 -3
- package/scripts/seed-workshop.sh +1 -1
- package/skills/workbench-module-diy/DESIGN.md +3 -1
- package/skills/workbench-module-diy/FAMILY.md +1 -0
- package/skills/workbench-module-diy/FLOW.md +117 -0
- package/skills/workbench-module-diy/PANEL.md +9 -7
- package/skills/workbench-module-diy/SKILL.md +8 -1
- package/skills/workbench-module-diy/STEPS.md +12 -1
- package/skills/workbench-module-diy/TOOLS.md +16 -4
- package/skills/workbench-module-diy/WIRING.md +6 -4
- package/skills/workbench-module-diy/WRITES.md +2 -2
- package/bin/opencli-isolated +0 -62
- package/bin/opencli-isolated.mjs +0 -44
- package/bin/opencli-node-mode.cjs +0 -1
- package/dist/types/app/layouts/rightbar/AskAgentButton.d.ts +0 -6
- package/dist/types/app/layouts/rightbar/board-columns.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/dsh-borrow.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/dsh-column-source.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/dsh-surface.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/presentation.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/rightbar-width.test.d.ts +0 -1
- package/dist/types/app/layouts/rightbar/store.test.d.ts +0 -1
- package/dist/types/kernel/contract/contracts.test.d.ts +0 -1
- package/dist/types/kernel/contract/index.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-browser-act.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-browser-tools-shot.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-browser-tools.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-browser.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-components.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-context.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-debug-routes.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-debug-tools.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-logs.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-observers.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-page.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-bar.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-beat.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-capture.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-close.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-failure.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-hook.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-open.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-routes.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-shot.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record-text.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-record.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-schema.test.d.ts +0 -1
- package/dist/types/modules/panels/model/diy-spec.test.d.ts +0 -1
- package/dist/types/modules/panels/model/handoff.test.d.ts +0 -1
- package/dist/types/modules/panels/model/long-task-tools.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-install-error.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-installed.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-registry.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-remove.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-restart.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-sources-tool.test.d.ts +0 -1
- package/dist/types/modules/panels/model/market-swap-stuck.test.d.ts +0 -1
- package/dist/types/modules/panels/model/plugin-name.test.d.ts +0 -1
- package/dist/types/modules/panels/model/routes.test.d.ts +0 -1
- package/dist/types/modules/sessions/model/attention-long-task.test.d.ts +0 -1
- package/dist/types/modules/sessions/model/attention.test.d.ts +0 -1
- package/dist/types/modules/sessions/model/scroll-edges.test.d.ts +0 -1
- package/dist/types/modules/sessions/model/session-node.test.d.ts +0 -1
- package/dist/types/shared/api/config-sync.test.d.ts +0 -1
- package/dist/types/shared/api/diy.test.d.ts +0 -1
- package/dist/types/shared/api/dsh-plugins.test.d.ts +0 -1
- package/dist/types/shared/api/host/bundle-inspect-kind.test.d.ts +0 -1
- package/dist/types/shared/api/host/bundle-routes-self.test.d.ts +0 -1
- package/dist/types/shared/api/host/bundle-routes.test.d.ts +0 -1
- package/dist/types/shared/api/host/diy-facts.test.d.ts +0 -1
- package/dist/types/shared/api/host/diy-recon-fs.test.d.ts +0 -1
- package/dist/types/shared/api/host/diy-recon.test.d.ts +0 -1
- package/dist/types/shared/api/host/diy.test.d.ts +0 -1
- package/dist/types/shared/api/host/http.test.d.ts +0 -1
- package/dist/types/shared/api/host/png-crop.test.d.ts +0 -1
- package/dist/types/shared/api/host/runtime-seed.test.d.ts +0 -1
- package/dist/types/shared/api/host/self-update-marker.test.d.ts +0 -1
- package/dist/types/shared/api/host/shell.test.d.ts +0 -1
- package/dist/types/shared/api/unit-manifests.test.d.ts +0 -1
- package/dist/types/shared/components/blocker-action.test.d.ts +0 -1
- package/dist/types/shared/hooks/panel-state-report.test.d.ts +0 -1
|
@@ -2,21 +2,23 @@
|
|
|
2
2
|
|
|
3
3
|
步骤 1 的参考。
|
|
4
4
|
|
|
5
|
-
## 1
|
|
5
|
+
## 1 只放四类东西
|
|
6
6
|
|
|
7
7
|
| 类 | 例 | 承接 |
|
|
8
8
|
|---|---|---|
|
|
9
9
|
| 导航 | 换项目、切面板、折叠 | 界面自身 |
|
|
10
|
-
| 呈现 | 状态、数字、最近几条 |
|
|
11
|
-
|
|
|
10
|
+
| 呈现 | 状态、数字、最近几条 | 轻交互(筛选、展开、复制) |
|
|
11
|
+
| 动作 | 单步发布、同步、提交 | 动作路由:用户按,记一次 run(ADR-0090) |
|
|
12
|
+
| 交代 | "交给 agent"、预填指令 | 转给 agent |
|
|
12
13
|
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
不放:批量、跨对象的平台写 → agent;详情 / 评论 / 日志 / 翻页 → "去平台看"。
|
|
15
|
+
单步动作可以有一个按钮,但必须与一把 agent 工具共用同一实现,并记一次 run;不能只在 UI 里另写业务逻辑。
|
|
15
16
|
|
|
16
17
|
## 2 封动作还是交 agent
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
单步、用户自己就能确认、且与一把工具 1:1 → 封动作(动作路由)。
|
|
20
|
+
批量、跨对象、需要用户逐步判断或编排 → 交给 agent。
|
|
21
|
+
长等、中途要人、失败要续,不改变归属:用户发起的仍是动作路由,agent 发起的仍是工具与审批。
|
|
20
22
|
|
|
21
23
|
## 3 什么算配置
|
|
22
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: workbench-module-diy
|
|
3
|
-
description: 在工作台里把当前面板调明白,或者给它造一块新内容 —— 用在「这块板为什么空白 / 这张卡不对 / 它到底发了什么」「我想在面板上看到 X / 加一块卡」「让 agent
|
|
3
|
+
description: 在工作台里把当前面板调明白,或者给它造一块新内容 —— 用在「这块板为什么空白 / 这张卡不对 / 它到底发了什么」「我想在面板上看到 X / 加一块卡」「让 agent 替我读或写某个东西」「这件事以后还要跑 / 每次都要 / 固化 workflow / 多步要等要重试」这类话上。用户只说需求,实现由 agent 自己做、自己验过。
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# workbench-module-diy
|
|
@@ -9,6 +9,9 @@ description: 在工作台里把当前面板调明白,或者给它造一块新
|
|
|
9
9
|
|---|---|---|
|
|
10
10
|
| 「这块板空白 / 这张卡不对 / 数据不对 / 它到底发了什么」 | 调:查现有面板 | `workbench_diy_panel` / `_status`;动屏要调试约定 |
|
|
11
11
|
| 「我想在面板上看到 X / 加一块卡」 | 造:新建模块 | 一个能放代码的包(没有就问用户) |
|
|
12
|
+
| 「这件事以后还要跑 / 每次都要 / 固化 workflow / 多步要等要重试」 | **先分叉**:一次性直接跑;固化写一条 workflow | 先问用户([FLOW.md](FLOW.md) §1);固化再进「造」 |
|
|
13
|
+
|
|
14
|
+
> **先分叉**:多步、要等、要重试、要写平台的活,先问「一次性还是以后还要跑」;一次性不建模块,固化再按下面「造」。判断与问法见 [FLOW.md](FLOW.md) §1。
|
|
12
15
|
|
|
13
16
|
调交付"面板现在怎么样"的事实;造交付面板上能点开的一块内容。不交技术方案。
|
|
14
17
|
|
|
@@ -24,6 +27,8 @@ description: 在工作台里把当前面板调明白,或者给它造一块新
|
|
|
24
27
|
抓"点了之后发了什么":`workbench_diy_record_prepare` → 用户操作 → `_record_read`;收工 `_debug_stop` / `_record_stop`。
|
|
25
28
|
不需要源码、工具链、工坊。
|
|
26
29
|
|
|
30
|
+
**先分叉** —— 用户说的是多步、要等、要重试、还要再跑的活时,先问 [FLOW.md](FLOW.md) §1;一次性直接跑,固化再进「造」。
|
|
31
|
+
|
|
27
32
|
**造** —— 模块落 `<dir>`。那里没有能放代码的包(没 `package.json`,或有但没声明 workspace)时,问用户二选一:
|
|
28
33
|
在这里建 workspace,还是去工坊那个脚手架工作区。不改用户仓库结构。
|
|
29
34
|
从「造一个模块」进入的会话已在工坊里,`<dir>` 就是工坊。
|
|
@@ -47,6 +52,7 @@ description: 在工作台里把当前面板调明白,或者给它造一块新
|
|
|
47
52
|
审批项标注「要你真用一次」,不打勾。结论只报:已装、在面板哪一格。
|
|
48
53
|
8. **发布** —— 只在用户说「帮我发布」之后:`workbench_diy_publish`(`unit=…`);这一版还没有更新日志就带上 `changelogNote`(一行一条),
|
|
49
54
|
发布时一起写进 `CHANGELOG.md` 并随包发,审批屏会展示将写入的那一段。
|
|
55
|
+
还没有市集标签就自己给 1–2 个短词放进 `labels`(说它干什么,比如「发布编排」「构建状态」);已有标签就不用传。
|
|
50
56
|
不手改 `package.json`、不补标题/署名、不问出口:工具与审批屏已经处理;他明确点名安装包 / 公开 / git 才传 target。
|
|
51
57
|
他说要换作者才传 `author="姓名 <邮箱>"`,别自己编一个;没写作者时审批屏显示推断的署名,他拒绝后再说。
|
|
52
58
|
市场里一个包名归第一次发布的人:换署名发同名会被拒;真是接手,让维护者先改那一条的 `owner`。
|
|
@@ -58,6 +64,7 @@ description: 在工作台里把当前面板调明白,或者给它造一块新
|
|
|
58
64
|
| 需要 | 读 |
|
|
59
65
|
|---|---|
|
|
60
66
|
| 判域、三张表、ASCII 规则 | [DESIGN.md](DESIGN.md) |
|
|
67
|
+
| 一次性还是固化、workflow 怎么写 | [FLOW.md](FLOW.md) |
|
|
61
68
|
| 步骤与完成判据 | [STEPS.md](STEPS.md) |
|
|
62
69
|
| 探测数据源、固化读、错误码 | [DATASOURCE.md](DATASOURCE.md) |
|
|
63
70
|
| 写通道四步、回读、撤销 | [WRITES.md](WRITES.md) |
|
|
@@ -1,8 +1,19 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 先分叉,再三步:问什么、产出什么、何时算完
|
|
2
2
|
|
|
3
3
|
每一步的结果当场写进 `design.json`:`panel` / `states` / `config` / `capabilities` / `linkage` /
|
|
4
4
|
`datasource` / `reads[]` / `writes[]` / `acceptance`。`design check` 列出空格。
|
|
5
5
|
|
|
6
|
+
## 步骤 0 — 一次性还是固化
|
|
7
|
+
|
|
8
|
+
多步、要等、要重试、要写平台的活,先问一句:
|
|
9
|
+
|
|
10
|
+
> 这件事是一次性的,还是以后还要按同样步骤跑?我建议 <…>,因为 <…>。
|
|
11
|
+
|
|
12
|
+
- **一次性**:不建模块,直接用现有工具 / 命令跑;不进下面的三张表,也不写 `design.json`。
|
|
13
|
+
- **固化**:继续步骤 1–3;先把「步骤、输入、写到哪、失败停在哪、哪些要点头」写进能力表;实现见 [FLOW.md](FLOW.md)。
|
|
14
|
+
|
|
15
|
+
只问一次;用户已说过「就这一次 / 以后都要 / 固化」就照办,不追问。
|
|
16
|
+
|
|
6
17
|
## 步骤 1 — 面板
|
|
7
18
|
|
|
8
19
|
一次问一组,每组给推荐答案:
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
| 同一件事、同一份数据,只是要不要展开明细 | 一件事 + 一个"展开"选项 |
|
|
10
10
|
| 动作或后果不同(看 vs 改) | 拆开 |
|
|
11
11
|
| 用户反复做、每次都要点头 | 封成一个动作(一个按钮 + 一件事),不拆成多个小工具 |
|
|
12
|
+
| 用户反复做、步骤多、要等 / 重试 | 固化成一条 workflow([FLOW.md](FLOW.md)),不拆成多个小工具 |
|
|
12
13
|
|
|
13
14
|
每件事都要能回答:"用户会怎么对 agent 说这件事?"
|
|
14
15
|
|
|
@@ -134,11 +135,11 @@
|
|
|
134
135
|
库版本太旧、没有 `setOpencliRunner` 时外壳只记一条 warn,照旧按 PATH 跑;用 `version` 卡住那一版即可。
|
|
135
136
|
- `extension` 的 `sources[].kind` 只有 `npm` / `git` / `local`;`lib` 只认 `npm`。
|
|
136
137
|
未知 `kind` 或 `source.kind` 判红;need 里未知字段只警告,`x-` 前缀忽略。
|
|
137
|
-
- 未装好文案由模块写:`libInstallCommand({ need, source })
|
|
138
|
+
- 未装好文案由模块写:`deps.libInstallCommand({ need, source })` 拼好源与缓存目录,
|
|
138
139
|
原样输出;放进失败态。
|
|
139
140
|
- `contracts` 判据:`apiVersion` 必须是 3;`needs` 走同一份 `NEED_KINDS` 注册表校验(`purpose` 必填、
|
|
140
141
|
`bin`/`env` 不许带 `sources`(`bin` 要代装就写 `install`)、`lib` 只认 npm 源);
|
|
141
|
-
声明了 `lib` 必须用 `libInstallCommand`。
|
|
142
|
+
声明了 `lib` 必须用 `deps.libInstallCommand`。
|
|
142
143
|
未知 `runtime` 不判红:探针会给「这个运行时工作台还不认识」的 `unchecked`,等运行时 provider 补上。
|
|
143
144
|
|
|
144
145
|
## 9 长任务
|
|
@@ -150,8 +151,7 @@ longTasks.create({ key, run, step, outcome, view, stopped })
|
|
|
150
151
|
// run({ payload, onStep, signal }):onStep({ kind: 'start', text }) 报步骤;return 结果
|
|
151
152
|
```
|
|
152
153
|
|
|
153
|
-
- 来源:在工具里 `runs.start({ …, session: sessionIdOf(exec) ?? undefined })
|
|
154
|
-
`@dsh-workbench/shared/host`)。不记 = 用户按的 → 停止需审批。
|
|
154
|
+
- 来源:在工具里 `runs.start({ …, session: deps.sessionIdOf(exec) ?? undefined })`。不记 = 用户按的 → 停止需审批。
|
|
155
155
|
- 浏览器侧:`useLongTask` → `feed.runs` / `feed.stop(id)` / `feed.stopping` / `feed.stopFailed`;
|
|
156
156
|
画 `LongTaskRow`(五态:`running` / `needs-login` / `stopped` / `ok` / `failed`)。
|
|
157
157
|
- 停止:`run` 收到 `signal` 被 abort = 有人按停止;在循环点与每条子命令前后查 `signal.aborted`。
|
|
@@ -166,6 +166,18 @@ longTasks.create({ key, run, step, outcome, view, stopped })
|
|
|
166
166
|
- 左栏 loading 点由外壳按 `live()` 驱动,模块不做。
|
|
167
167
|
- 用 `stop` / `session` / 外壳长任务工具需把 `@dsh-workbench/core` peer 下限抬到含它们的版本(`check --only kit` 查)。
|
|
168
168
|
|
|
169
|
+
## 9.1 多步流程(workflow)
|
|
170
|
+
|
|
171
|
+
多步、要等、要重试、要取消、以后还要跑 → 先按 [FLOW.md](FLOW.md) 问用户是否固化。
|
|
172
|
+
|
|
173
|
+
- 固化 = 模块宿主半侧的 `FlowDefinition`(类型从 `@dsh-workbench/core/contract` 取)+ `deps.flow.run` + §9 的长任务 + `registerTools`。
|
|
174
|
+
- 一次性 = 直接用现有工具 / 命令跑,不建模块。
|
|
175
|
+
- 写平台的 flow 工具在清单里 `writes: true` + `needsApproval`;跑前给对象 / 环境 / 影响。
|
|
176
|
+
- `deps.flow.check(flow, actions)` 先过;动作里用 `ctx.login(url)` 报登录,`ctx.log` 报进度。
|
|
177
|
+
- flow 的运行时只走 `deps.flow`,类型只走 `@dsh-workbench/core/contract`;不要为 flow 直接 import `@dsh-workbench/shared/host`。
|
|
178
|
+
- 不要在 flow 里存凭据;不要把一次性任务静默固化。
|
|
179
|
+
- 工具描述写「跑已固化的 <标题> 流程」;不要用它新建 flow,新需求先问用户。
|
|
180
|
+
|
|
169
181
|
## 12 按工作区 / 模式收窄工具
|
|
170
182
|
|
|
171
183
|
工具是机器级的;不同项目需要不同工具。不要运行时返回"此项目不可用"—— 从清单移除。
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
| 需要 | 来源 |
|
|
8
8
|
|---|---|
|
|
9
|
-
| 宿主侧纯函数 / 常量 | `@dsh-workbench/shared/host
|
|
9
|
+
| 宿主侧纯函数 / 常量 | 优先工具 / 挂载里的 `deps`(`HostKit`);模块顶层常量仍从 `@dsh-workbench/shared/host` 取(`dependencies`) |
|
|
10
10
|
| 浏览器侧 hooks / 组件 / 图标 / 文案工具 | `@dsh-workbench/core/client` 的 `kit` |
|
|
11
11
|
| kit 没有的 dsh 控件 / 图标 | `@deepseek-ai/dsh-client-ui-primitives`(`dsh.client.external` + 精确版 devDependency;[KIT.md](KIT.md) §8) |
|
|
12
12
|
| 类型 | `import type` |
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
- 根入口只许 `import type`。浏览器侧取运行值会打包进产物(第二份实例);宿主侧取运行值会使 `dist/host.js`
|
|
21
21
|
无法 import(根 barrel 拉到 dsh 浏览器件)。浏览器运行值走 `kit`。
|
|
22
|
-
- `@dsh-workbench/shared/host` 仅宿主侧。含 `node:*`;浏览器侧纯函数走 `kit
|
|
22
|
+
- `@dsh-workbench/shared/host` 仅宿主侧。含 `node:*`;浏览器侧纯函数走 `kit`。工具 / 挂载里优先用 `deps`(`HostKit`);模块顶层常量仍从这里取。
|
|
23
23
|
- 契约类型(`Translate` / `ApiError`…)从根入口取,允许。
|
|
24
24
|
|
|
25
25
|
单例只能一份:kit 的 hooks 与容器组件不得复制进模块,否则表现为"agent 改完面板不自动刷新"。
|
|
@@ -74,6 +74,8 @@ DIY 族仅在选了 DIY 模式的会话出现(按模式,不按工作区)
|
|
|
74
74
|
用户真是接手的人,让他先找索引维护者改那一条的 `owner`,别自己改成对方的署名去绕。
|
|
75
75
|
一个模块 id(`dsh.workbench.unit`)在同一个市场里只能有一个条目:换包名、沿用旧 unit 会被拒 ——
|
|
76
76
|
换包名时把 unit 也换掉,别为了保留 id 去改别人的条目。
|
|
77
|
+
这个模块还没有标签时(`workbench_diy_status` 会说),自己给它想 1–2 个短词放进 `labels`(说它干什么,比如「发布编排」「构建状态」),
|
|
78
|
+
别再问用户;已经有标签就不用传,传了会替换掉原来的(仍是最多两个)。发布时会把模块里的标签并进索引(只碰标签)。
|
|
77
79
|
2. 工具回 `needsUser` 时照 `text` 转述,不在对话里要 token / OTP;`otp` 交接后 `verify=true` 只核不发。
|
|
78
|
-
3. 只改市集元数据(标题 / 作者 /
|
|
79
|
-
|
|
80
|
+
3. 只改市集元数据(标题 / 作者 / 说明 / 标签)不升版本:`refresh=true`(换作者时同时传 `author`,仍要过 `owner` 检查)。
|
|
81
|
+
发布新版本不会改这些元数据(工具沿用远端条目当前的值),别指望发一版顺手把标题改掉;标签是例外 —— 发布总会照模块里的标签并一次。
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
[datasource](DATASOURCE.md) 只管读。本文件管写:提交 / 发布 / 建单 / 改配置。
|
|
4
4
|
|
|
5
|
-
判域同 [DESIGN.md](DESIGN.md) §0:复用现有登录、一次调用能改完 → DIY;要新凭据 /
|
|
5
|
+
判域同 [DESIGN.md](DESIGN.md) §0:复用现有登录、一次调用能改完 → DIY;要新凭据 / 新服务或依赖 → 工程域;多步长流程先问一次性还是固化([FLOW.md](FLOW.md))。
|
|
6
6
|
|
|
7
7
|
## 四步
|
|
8
8
|
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
|
|
73
73
|
- **预览**:先确认是否有 `yes` / `dryRun` / `confirm` 档;有则先走预览。`opencli inventory publish` / `inventory build`
|
|
74
74
|
无预览开关,调用即真发布 / 真构建。**无预览档不许试写。**
|
|
75
|
-
- 要新凭据 /
|
|
75
|
+
- 要新凭据 / 新依赖 → 工程域;多步长流程先问固化,固化走 [FLOW.md](FLOW.md) 的 workflow。
|
|
76
76
|
|
|
77
77
|
## 写纪律
|
|
78
78
|
|
package/bin/opencli-isolated
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bash
|
|
2
|
-
#
|
|
3
|
-
# 工作台**隔离的** opencli:所有 opencli 调用都从这里过(探测、取数、装/卸插件)。
|
|
4
|
-
#
|
|
5
|
-
# 为什么需要它:opencli 的**插件目录只认 `HOME`** —— `dist/src/plugin.js` 里
|
|
6
|
-
#
|
|
7
|
-
# function getHomeDir() {
|
|
8
|
-
# return process.env.HOME || process.env.USERPROFILE || os.homedir();
|
|
9
|
-
# }
|
|
10
|
-
#
|
|
11
|
-
# 而 `OPENCLI_CONFIG_DIR` 只管配置 / trace / browser-profiles。两套开关,别混。
|
|
12
|
-
# 所以想让"工作台装的插件"与"用户本机装的插件"分开,唯一的开关是 `HOME`:
|
|
13
|
-
# 指到工作台自己的目录,`~/.opencli` 就一个字节都不会被碰。
|
|
14
|
-
#
|
|
15
|
-
# 为什么必须是**单一路径、不含空格**:`DSH_WORKBENCH_OPENCLI` 既被**原样**当命令跑
|
|
16
|
-
# (能力探测:`$DSH_WORKBENCH_OPENCLI plugin list -f json`),又被 `quoteShellArg`
|
|
17
|
-
# 整体单引号包住(一键修那条 line)。写 `HOME=/x opencli` 会被包成 `'HOME=/x opencli'`,
|
|
18
|
-
# 当成一个不存在的可执行文件。
|
|
19
|
-
#
|
|
20
|
-
# ⚠️ 落点必须与 `src/shared/api/host/opencli-runtime.ts` 一致(两边都从 $DSH_HOME 推)。
|
|
21
|
-
#
|
|
22
|
-
set -euo pipefail
|
|
23
|
-
|
|
24
|
-
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
|
|
25
|
-
WORKBENCH_HOME="${DSH_WORKBENCH_HOME:-$DSH_HOME/workbench}"
|
|
26
|
-
ROOT="$WORKBENCH_HOME/opencli"
|
|
27
|
-
REAL_HOME="$HOME"
|
|
28
|
-
|
|
29
|
-
mkdir -p "$ROOT/home"
|
|
30
|
-
|
|
31
|
-
# 隔离的 HOME:插件、plugins.lock.json、monorepo 克隆、trace 全落这下面。
|
|
32
|
-
export HOME="$ROOT/home"
|
|
33
|
-
|
|
34
|
-
# 换 HOME 会连带丢掉 ~/.npmrc —— 里面有私有源的 _authToken
|
|
35
|
-
# (内网源地址由使用者自己配)。不指回去,从私有源装插件会 404/401(实测)。
|
|
36
|
-
if [ -f "$REAL_HOME/.npmrc" ]; then
|
|
37
|
-
export NPM_CONFIG_USERCONFIG="$REAL_HOME/.npmrc"
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
# npm 缓存**必须留在隔离运行时里**(与 `opencli-runtime.ts` 的 npmCacheDir() 同一落点)。
|
|
41
|
-
#
|
|
42
|
-
# ⚠️ **不能用 `${npm_config_cache:-…}`**:用 `npx` / `npm exec dsh-workbench` 起工作台时,
|
|
43
|
-
# npm 会往进程里**注入** `npm_config_cache=/Users/<你>/.npm`(实测:`npm exec -- node -e …`
|
|
44
|
-
# 打出来就是它),这个值一路继承到执行缝里的每条命令。带默认值等于"外面给什么就用什么",
|
|
45
|
-
# 于是隔离形同虚设 —— opencli 自己内部还会跑 npm(`plugin install` 就要,见它 dist 里
|
|
46
|
-
# `execFileSync('npm', ['install', …])`),那次会去写 `~/.npm`;而执行缝只放行
|
|
47
|
-
# `$DSH_HOME/workbench`(或 `DSH_WORKBENCH_HOME`),写入被拒 → 市场装插件**报错退出 1**,报的还是 npm 那句
|
|
48
|
-
# "cache folder contains root-owned files"(那台机器上其实一个 root 文件都没有,是假话术)。
|
|
49
|
-
# 所以这里是**无条件改写**:缓存落点只有这一处说了算。
|
|
50
|
-
#
|
|
51
|
-
# 另一条老账:`~/.npm` 里只要有一个 root 的文件(以前 `sudo npm` 留下的),npm 也会拒绝
|
|
52
|
-
# 使用整个缓存。隔离运行时本来就有自己的缓存,没理由去赌用户那份。
|
|
53
|
-
export npm_config_cache="$ROOT/npm-cache"
|
|
54
|
-
|
|
55
|
-
BIN="$ROOT/toolchain/node_modules/.bin/opencli"
|
|
56
|
-
if [ ! -x "$BIN" ]; then
|
|
57
|
-
echo "dsh-workbench: opencli 的隔离运行时还没装好($ROOT/toolchain)。" >&2
|
|
58
|
-
echo " 打开工作台:启动体检会给出一条能直接照做的安装命令。" >&2
|
|
59
|
-
exit 127
|
|
60
|
-
fi
|
|
61
|
-
|
|
62
|
-
exec "$BIN" "$@"
|
package/bin/opencli-isolated.mjs
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import { spawn } from 'node:child_process';
|
|
3
|
-
import { existsSync, mkdirSync } from 'node:fs';
|
|
4
|
-
import { homedir } from 'node:os';
|
|
5
|
-
import { dirname, join } from 'node:path';
|
|
6
|
-
import { fileURLToPath } from 'node:url';
|
|
7
|
-
|
|
8
|
-
const dshHome = process.env.DSH_HOME?.trim() || join(homedir(), '.dsh');
|
|
9
|
-
const workbenchHome = process.env.DSH_WORKBENCH_HOME?.trim() || join(dshHome, 'workbench');
|
|
10
|
-
const root = join(workbenchHome, 'opencli');
|
|
11
|
-
const isolatedHome = join(root, 'home');
|
|
12
|
-
const main = join(root, 'toolchain', 'node_modules', '@jackwener', 'opencli', 'dist', 'src', 'main.js');
|
|
13
|
-
const realHome = process.env.HOME || process.env.USERPROFILE || homedir();
|
|
14
|
-
const preload = join(dirname(fileURLToPath(import.meta.url)), 'opencli-node-mode.cjs');
|
|
15
|
-
|
|
16
|
-
mkdirSync(isolatedHome, { recursive: true });
|
|
17
|
-
if (!existsSync(main)) {
|
|
18
|
-
process.stderr.write(`dsh-workbench: opencli 的隔离运行时还没装好(${join(root, 'toolchain')})。\n`);
|
|
19
|
-
process.stderr.write(' 打开工作台:启动体检会给出一条能直接照做的安装命令。\n');
|
|
20
|
-
process.exit(127);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const env = {
|
|
24
|
-
...process.env,
|
|
25
|
-
HOME: isolatedHome,
|
|
26
|
-
npm_config_cache: join(root, 'npm-cache'),
|
|
27
|
-
};
|
|
28
|
-
const userConfig = join(realHome, '.npmrc');
|
|
29
|
-
if (existsSync(userConfig)) env.NPM_CONFIG_USERCONFIG = userConfig;
|
|
30
|
-
if (process.versions.electron !== undefined) env.ELECTRON_RUN_AS_NODE = '1';
|
|
31
|
-
|
|
32
|
-
const child = spawn(process.execPath, ['--require', preload, main, ...process.argv.slice(2)], {
|
|
33
|
-
stdio: 'inherit',
|
|
34
|
-
env,
|
|
35
|
-
windowsHide: true,
|
|
36
|
-
});
|
|
37
|
-
child.on('error', (error) => {
|
|
38
|
-
process.stderr.write(`dsh-workbench: opencli 没跑起来:${String(error)}\n`);
|
|
39
|
-
process.exit(1);
|
|
40
|
-
});
|
|
41
|
-
child.on('exit', (code, signal) => {
|
|
42
|
-
if (signal !== null) process.kill(process.pid, signal);
|
|
43
|
-
else process.exit(code ?? 1);
|
|
44
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
process.defaultApp = true;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|