@dsh-workbench/core 0.3.11 → 1.0.0-beta.1
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/LICENSE +21 -0
- package/README.md +148 -117
- package/bin/dsh-workbench +130 -29
- package/bin/dsh-workbench.cmd +5 -0
- package/bin/opencli-isolated +3 -2
- package/bin/opencli-isolated.mjs +44 -0
- package/bin/opencli-node-mode.cjs +1 -0
- package/bin/seed-workshop-windows.mjs +307 -0
- package/client.js +4632 -2002
- package/cordis.patch.yml +3 -3
- package/dist/client/client.body.js +4632 -2002
- package/dist/client/index.js +5306 -2676
- package/dist/host/index.js +6990 -5879
- package/dist/types/app/client.d.ts +1 -0
- package/dist/types/app/host.d.ts +2 -1
- package/dist/types/app/layouts/approval-detail.d.ts +3 -0
- package/dist/types/app/layouts/env-gate/boot-gate.d.ts +1 -12
- package/dist/types/app/layouts/env-gate/gate-text.d.ts +2 -1
- package/dist/types/app/layouts/market/DiscoverPanel.d.ts +8 -0
- package/dist/types/app/layouts/market/add-module-text.d.ts +1 -1
- package/dist/types/app/layouts/market/discover-categories.d.ts +8 -0
- package/dist/types/app/layouts/market/discover-confirm.d.ts +14 -0
- package/dist/types/app/layouts/market/discover-detail.d.ts +12 -0
- package/dist/types/app/layouts/market/discover-dialogs.d.ts +7 -0
- package/dist/types/app/layouts/market/discover-doc.d.ts +18 -0
- package/dist/types/app/layouts/market/discover-init-dialog.d.ts +10 -0
- package/dist/types/app/layouts/market/discover-rows.d.ts +24 -0
- package/dist/types/app/layouts/market/discover-sources-dialog.d.ts +17 -0
- package/dist/types/app/layouts/market/discover-states.d.ts +22 -0
- package/dist/types/app/layouts/market/discover-toolbar.d.ts +23 -0
- package/dist/types/app/layouts/market/discover-versions.d.ts +9 -0
- package/dist/types/app/layouts/market/discover-view.d.ts +38 -0
- package/dist/types/app/layouts/market/market-header.d.ts +13 -0
- package/dist/types/app/layouts/market/panel.d.ts +1 -1
- package/dist/types/app/layouts/market/use-add-module.d.ts +1 -1
- package/dist/types/app/layouts/market/use-discover.d.ts +73 -0
- package/dist/types/app/layouts/market/use-module-versions.d.ts +1 -8
- package/dist/types/app/layouts/rightbar/MarketView.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/Rightbar.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/board-shape.d.ts +1 -14
- package/dist/types/app/layouts/rightbar/market-busy.d.ts +0 -22
- package/dist/types/app/layouts/rightbar/market-change.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-hint.d.ts +1 -7
- package/dist/types/app/layouts/rightbar/market-plugin-rows.d.ts +0 -7
- package/dist/types/app/layouts/rightbar/market-row-icon.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-row-types.d.ts +2 -2
- package/dist/types/app/layouts/rightbar/market-rows.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-section-icon.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-settle-hold.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-settle.d.ts +4 -7
- package/dist/types/app/layouts/rightbar/market-shared-rows.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/market-update-verdict.d.ts +1 -11
- package/dist/types/app/layouts/rightbar/market-view-text.d.ts +5 -1
- package/dist/types/app/layouts/rightbar/market-workbench-row.d.ts +1 -1
- package/dist/types/app/layouts/rightbar/store.d.ts +0 -12
- package/dist/types/app/layouts/sidebar/LongTaskDot.d.ts +0 -6
- package/dist/types/app/layouts/sidebar/LongTaskHover.d.ts +0 -6
- package/dist/types/app/layouts/sidebar/edition-boot.d.ts +1 -19
- package/dist/types/app/layouts/sidebar/edition.d.ts +1 -18
- package/dist/types/app/layouts/sidebar/use-attention.d.ts +0 -4
- package/dist/types/app/layouts/sidebar/workshop-preset.d.ts +2 -0
- package/dist/types/app/layouts/workbench-settings/AdapterSetItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/ConfigSyncRows.d.ts +11 -0
- package/dist/types/app/layouts/workbench-settings/NewWorkbenchItem.d.ts +5 -0
- package/dist/types/app/layouts/workbench-settings/SettingsItem.d.ts +0 -9
- package/dist/types/app/layouts/workbench-settings/SidebarEditionItem.d.ts +0 -6
- package/dist/types/app/layouts/workbench-settings/WorkbenchSettingsSection.d.ts +0 -6
- package/dist/types/app/units/manifests.d.ts +1 -1
- package/dist/types/{app/units → kernel/client}/registry.d.ts +1 -1
- package/dist/types/kernel/contract/bundle-install.d.ts +2 -0
- package/dist/types/kernel/contract/config-sync.d.ts +2 -0
- package/dist/types/kernel/contract/diy.d.ts +1 -0
- package/dist/types/kernel/contract/dsh-plugins.d.ts +2 -0
- package/dist/types/kernel/contract/index.d.ts +5 -0
- package/dist/types/kernel/contract/long-tasks.d.ts +2 -0
- package/dist/types/kernel/contract/market-index.d.ts +2 -0
- package/dist/types/kernel/contract/platform.d.ts +1 -0
- package/dist/types/kernel/contract/preflight-wake.d.ts +2 -0
- package/dist/types/kernel/contract/profile-create.d.ts +2 -0
- package/dist/types/kernel/contract/sidebar-edition.d.ts +2 -0
- package/dist/types/kernel/contract/unit-manifests.d.ts +2 -0
- package/dist/types/{shared/api → kernel}/host/mount-units.d.ts +5 -1
- package/dist/types/modules/panels/client.d.ts +1 -1
- package/dist/types/modules/panels/model/approval.d.ts +3 -15
- package/dist/types/modules/panels/model/diy-changelog.d.ts +2 -0
- package/dist/types/modules/panels/model/diy-context.d.ts +1 -16
- package/dist/types/modules/panels/model/diy-page.d.ts +1 -0
- package/dist/types/modules/panels/model/diy-record-open.d.ts +0 -15
- package/dist/types/modules/panels/model/diy-record-text.d.ts +0 -2
- package/dist/types/modules/panels/model/diy-record.d.ts +0 -30
- package/dist/types/modules/panels/model/diy-tools.d.ts +1 -0
- package/dist/types/modules/panels/model/long-task-tools.d.ts +0 -11
- package/dist/types/modules/panels/model/market-dependency-update.d.ts +1 -7
- package/dist/types/modules/panels/model/market-dependency.d.ts +15 -10
- package/dist/types/modules/panels/model/market-discover-routes.d.ts +3 -0
- package/dist/types/modules/panels/model/market-discover.d.ts +33 -0
- package/dist/types/modules/panels/model/market-dispatch.d.ts +3 -3
- package/dist/types/modules/panels/model/market-env.d.ts +2 -3
- package/dist/types/modules/panels/model/market-registry.d.ts +3 -3
- package/dist/types/modules/panels/model/market-restart.d.ts +1 -1
- package/dist/types/modules/panels/model/market-route.d.ts +5 -3
- package/dist/types/modules/panels/model/market-sources-act.d.ts +9 -0
- package/dist/types/modules/panels/model/market-types.d.ts +6 -13
- package/dist/types/modules/panels/model/market-update-bundle.d.ts +3 -9
- package/dist/types/modules/panels/model/market-verify.d.ts +3 -19
- package/dist/types/modules/panels/model/market-workbench-update.d.ts +3 -2
- package/dist/types/modules/panels/model/market.d.ts +6 -5
- package/dist/types/modules/panels/model/plugin-actions.d.ts +2 -1
- package/dist/types/modules/panels/model/plugin-section.d.ts +3 -1
- package/dist/types/modules/panels/model/publish-preview-routes.d.ts +2 -0
- package/dist/types/modules/panels/unit.d.ts +7 -3
- package/dist/types/modules/sessions/model/attention.d.ts +0 -11
- package/dist/types/modules/sessions/model/session-node.d.ts +0 -10
- package/dist/types/shared/api/diy.d.ts +6 -4
- package/dist/types/shared/api/host/approval-call.d.ts +0 -9
- package/dist/types/shared/api/host/approval-gate.d.ts +0 -13
- package/dist/types/shared/api/host/bundle-routes.d.ts +1 -1
- package/dist/types/shared/api/host/diy-artifacts.d.ts +0 -11
- package/dist/types/shared/api/host/diy-changelog.d.ts +13 -0
- package/dist/types/shared/api/host/diy-components.d.ts +2 -3
- package/dist/types/shared/api/host/diy-modules.d.ts +0 -16
- package/dist/types/shared/api/host/diy-publish-preview.d.ts +4 -0
- package/dist/types/shared/api/host/diy-recon-fs.d.ts +2 -2
- package/dist/types/shared/api/host/diy-tokens.d.ts +8 -0
- package/dist/types/shared/api/host/host-routes.d.ts +3 -6
- package/dist/types/shared/api/host/long-task-notice.d.ts +0 -20
- package/dist/types/shared/api/host/long-tasks.d.ts +1 -8
- package/dist/types/shared/api/host/market-doc.d.ts +21 -0
- package/dist/types/shared/api/host/market-index-fetch.d.ts +37 -0
- package/dist/types/shared/api/host/market-source-init.d.ts +22 -0
- package/dist/types/shared/api/host/market-sources-store.d.ts +15 -0
- package/dist/types/shared/api/host/permission-mode.d.ts +0 -5
- package/dist/types/shared/api/host/post-channels.d.ts +1 -1
- package/dist/types/shared/api/host/sidebar-edition.d.ts +1 -33
- package/dist/types/shared/api/host/unit-roster-facts.d.ts +1 -1
- package/dist/types/shared/api/host/workspace-root.d.ts +0 -7
- package/dist/types/shared/api/platform/client.d.ts +10 -0
- package/dist/types/shared/api/unit-board.d.ts +0 -16
- package/dist/types/shared/api/write-outcome.d.ts +0 -12
- package/dist/types/shared/components/IconModules.d.ts +0 -6
- package/dist/types/shared/components/PanelFoot.d.ts +0 -9
- package/dist/types/shared/components/blocker-action.d.ts +0 -13
- package/dist/types/shared/dev-surface/index.d.ts +5 -0
- package/dist/types/shared/dev-surface/types.d.ts +79 -0
- package/dist/types/shared/hooks/bundle-queries.d.ts +1 -13
- package/dist/types/shared/hooks/fact-transport.d.ts +4 -0
- package/dist/types/shared/hooks/fact-transports.d.ts +0 -4
- package/dist/types/shared/hooks/market-queries.d.ts +11 -0
- package/dist/types/shared/hooks/panel-state-report.d.ts +0 -12
- package/dist/types/shared/hooks/sidebar-edition.d.ts +1 -6
- package/dist/types/shared/hooks/use-blocker-actions.d.ts +0 -8
- package/dist/types/shared/hooks/use-capabilities.d.ts +0 -59
- package/dist/types/shared/hooks/use-diy-debug.d.ts +0 -13
- package/dist/types/shared/hooks/use-diy-record.d.ts +0 -13
- package/dist/types/shared/hooks/use-shell-long-tasks.d.ts +1 -7
- package/icon.svg +17 -28
- package/package.json +33 -13
- package/preset/diy.patch.yml +1 -1
- package/profile/isolation.patch.yml +8 -8
- package/profile/sandbox.patch.yml +2 -2
- package/scripts/clone-profile.mjs +268 -0
- package/scripts/create-workbench.mjs +166 -0
- package/scripts/seed-profile.sh +22 -10
- package/scripts/seed-workshop.sh +17 -19
- package/skills/workbench-module-diy/BUILD.md +4 -11
- package/skills/workbench-module-diy/COPY.md +1 -1
- package/skills/workbench-module-diy/DATASOURCE.md +107 -22
- package/skills/workbench-module-diy/DESIGN.md +2 -1
- package/skills/workbench-module-diy/FAMILY.md +48 -68
- package/skills/workbench-module-diy/KIT.md +6 -3
- package/skills/workbench-module-diy/LINKAGE.md +1 -1
- package/skills/workbench-module-diy/PANEL.md +5 -3
- package/skills/workbench-module-diy/REVIEW.md +7 -7
- package/skills/workbench-module-diy/SKILL.md +20 -11
- package/skills/workbench-module-diy/STEPS.md +1 -1
- package/skills/workbench-module-diy/TOOLS.md +33 -9
- package/skills/workbench-module-diy/WIRING.md +18 -6
- package/skills/workbench-module-diy/WRITES.md +30 -4
- package/dist/types/shared/api/bundle-install.d.ts +0 -136
- package/dist/types/shared/api/config-sync.d.ts +0 -35
- package/dist/types/shared/api/dsh-plugins.d.ts +0 -11
- package/dist/types/shared/api/host/bundle-manager.d.ts +0 -11
- package/dist/types/shared/api/host/config-sync.d.ts +0 -46
- package/dist/types/shared/api/host/diy-preset-health.d.ts +0 -35
- package/dist/types/shared/api/host/dsh-plugins.d.ts +0 -5
- package/dist/types/shared/api/host/installed-module.d.ts +0 -54
- package/dist/types/shared/api/host/installed-module.test.d.ts +0 -1
- package/dist/types/shared/api/host/opencli-command.d.ts +0 -10
- package/dist/types/shared/api/host/opencli-command.test.d.ts +0 -1
- package/dist/types/shared/api/host/opencli.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-content.d.ts +0 -6
- package/dist/types/shared/api/host/package-content.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-kind.d.ts +0 -21
- package/dist/types/shared/api/host/package-kind.test.d.ts +0 -1
- package/dist/types/shared/api/host/package-route.d.ts +0 -23
- package/dist/types/shared/api/host/package-route.test.d.ts +0 -1
- package/dist/types/shared/api/host/plugin-catalog.d.ts +0 -65
- package/dist/types/shared/api/host/plugin-login-hint.d.ts +0 -2
- package/dist/types/shared/api/host/plugin-tools.d.ts +0 -14
- package/dist/types/shared/api/host/plugin-units.d.ts +0 -48
- package/dist/types/shared/api/host/preflight-route.d.ts +0 -15
- package/dist/types/shared/api/host/preflight.d.ts +0 -75
- package/dist/types/shared/api/host/probe-cache.d.ts +0 -6
- package/dist/types/shared/api/host/probe-libs.d.ts +0 -11
- package/dist/types/shared/api/host/probe-units.d.ts +0 -17
- package/dist/types/shared/api/host/probe-verdict.d.ts +0 -7
- package/dist/types/shared/api/host/profile-registries.d.ts +0 -21
- package/dist/types/shared/api/host/registry-declaration.d.ts +0 -23
- package/dist/types/shared/api/host/release.d.ts +0 -24
- package/dist/types/shared/api/host/runtime-seed.d.ts +0 -40
- package/dist/types/shared/api/host/self-update.d.ts +0 -52
- package/dist/types/shared/api/host/version-range.d.ts +0 -2
- package/dist/types/shared/api/long-tasks.d.ts +0 -19
- package/dist/types/shared/api/sidebar-edition.d.ts +0 -14
- package/dist/types/shared/api/unit-manifests.d.ts +0 -6
- package/docs/HANDOFF.md +0 -333
- package/docs/OPERATIONS.md +0 -240
- package/skills/workbench-module-diy/TOOLING.md +0 -38
- /package/dist/types/{app/layouts/rightbar/registry.d.ts → kernel/client/board-registry.d.ts} +0 -0
- /package/dist/types/{app/layouts/rightbar/registry.test.d.ts → kernel/contract/contracts.test.d.ts} +0 -0
- /package/dist/types/{shared/api/host/bundle-manager.test.d.ts → kernel/contract/index.test.d.ts} +0 -0
- /package/dist/types/{shared/api → kernel}/host/unit-readiness.d.ts +0 -0
- /package/dist/types/{shared/api → kernel}/host/unit-registry.d.ts +0 -0
- /package/dist/types/shared/{api/host/dsh-plugins.test.d.ts → dev-surface/install.d.ts} +0 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 dsh-workbench contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,150 +1,181 @@
|
|
|
1
|
-
# dsh-workbench
|
|
1
|
+
# @dsh-workbench/core
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
**dsh 本体一行不改**,两个实例可以同时开着。
|
|
3
|
+
工作台本体:一个 **DeepSeek Harness 插件**,给 dsh 换一层外壳 —— 左栏项目与会话、
|
|
4
|
+
中间常驻对话、右侧一列实时数据面板。dsh 本体一行不改,装与不装都只影响你自己的这份实例。
|
|
5
|
+
同仓的另外三个包(`shared` / `module-tools` / `module-hello`)是给**模块作者**的库与样本,
|
|
6
|
+
终端用户只会直接装这一个。
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
┌ 左栏 ──────┬ 对话 ───┐ ┌ 左栏 ──────┬ 对话 ────┬ 数据面板 ──┐
|
|
12
|
-
│ ◆ 品牌 │ │ │ ◆ 品牌 │ │ 看板 │
|
|
13
|
-
│ [ + 新会话]│ │ │ [ + 新会话]│ │ 服务状态 │
|
|
14
|
-
│ ◧ 面板 │ │ │ ▸ 项目 │ │ 缺陷分布 │
|
|
15
|
-
│ 会话… │ │ │ ▸ 会话 │ (常驻) │ 最近缺陷 │
|
|
16
|
-
└────────────┴─────────┘ └────────────┴──────────┴────────────┘
|
|
17
|
-
```
|
|
8
|
+
> 只想把它用起来?先看根目录的 [README](../../README.md):三种装法、界面长什么样、
|
|
9
|
+
> 适合谁。这一份讲**装好之后**的事:命令行、数据落在哪、出问题怎么查、从源码怎么跑。
|
|
18
10
|
|
|
19
|
-
|
|
20
|
-
所以界面**只读** —— 面板上没有写按钮,写操作一律由 agent 的工具完成。
|
|
11
|
+
## 装
|
|
21
12
|
|
|
22
|
-
|
|
13
|
+
| 装法 | 命令 | 得到什么 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| 独立实例(推荐) | `npx @dsh-workbench/core create` | 自己的 profile、`:3081`、独立进程与数据 |
|
|
16
|
+
| 装进现有 `dsh web` | 侧栏 Plugins → Add plugin → `@dsh-workbench/core` → Install → Enable now → 刷新 | 当前实例多一列面板,会话不变 |
|
|
17
|
+
| 装进 Desktop | 同上,装完重开窗口 | Desktop 里多一列面板 |
|
|
23
18
|
|
|
24
|
-
|
|
19
|
+
独立实例分两步:先建 profile,再起工作台。
|
|
25
20
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
21
|
+
```bash
|
|
22
|
+
npx @dsh-workbench/core create # 交互式:问来源、名字、复制什么
|
|
23
|
+
npx --yes @dsh-workbench/core@latest setup # 或非交互:建默认的 workbench,可重复跑
|
|
24
|
+
npx @dsh-workbench/core # 起 :3081
|
|
25
|
+
```
|
|
31
26
|
|
|
32
|
-
|
|
27
|
+
`create` 有 `dsh web` 就拿它当模板,并问要不要复制设置、本地插件、项目列表和会话;
|
|
28
|
+
本机一个 profile 都没有时,用 dsh 出厂的 web 模板建一个空的。脚本 / CI 里直接给参数:
|
|
33
29
|
|
|
34
30
|
```bash
|
|
35
|
-
npx --yes @dsh-workbench/core@latest setup
|
|
36
|
-
npx @dsh-workbench/core
|
|
31
|
+
npx --yes @dsh-workbench/core@latest setup --from web --profile wb2 --with-sessions
|
|
32
|
+
npx @dsh-workbench/core --profile wb2
|
|
37
33
|
```
|
|
38
34
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
## 另一种装法:就在你那份 `dsh web` 里装(单 profile)
|
|
42
|
-
|
|
43
|
-
不想多一个 profile、多一个端口、多一个进程?那就**在 `dsh web` 里装**——
|
|
44
|
-
侧栏 **Plugins → Add plugin**,填 `@dsh-workbench/core`(包在公网 npm 上,默认源就能解析),
|
|
45
|
-
**Install → Enable now**,然后**刷新一次页面**。左栏换成工作台,右侧多出面板列。
|
|
46
|
-
|
|
47
|
-
- 装的是**你现在这个 profile**:会话、存储、附件接着用你原来的(**不分家**);
|
|
48
|
-
面板与模块配置照旧落在 `~/.dsh/workbench/**`。
|
|
49
|
-
- 外壳会**自己把缺的那几件补齐**(建隔离 opencli 的入口、把 `dsh-wb-module` 挂上 PATH、
|
|
50
|
-
后台把 DIY 工坊骨架建起来)—— 不需要跑 `setup`、也不需要启动器。后台脚本的输出在
|
|
51
|
-
`~/.dsh/workbench/seed.log`(DIY 工坊的依赖是几百 MB,第一次启动在后台下)。
|
|
52
|
-
- **可写根不随包改**(2026-10-22 起):启用**不会**再动 `sandbox-policy` —— 在线改那一行会把
|
|
53
|
-
dsh 的 session-controller 撞成 failed(症状:新建会话报 `gateway/service-unavailable`,
|
|
54
|
-
**退出重开**即恢复)。要用市场装模块这类走执行缝的命令时,把
|
|
55
|
-
[`profile/sandbox.patch.yml`](profile/sandbox.patch.yml) 那一行写进这个 profile 的
|
|
56
|
-
`cordis.patch.yml`,再退出启动一次;宿主启动时若发现可写根盖不住 `~/.dsh/workbench` 会打一条 warn。
|
|
57
|
-
- **DIY 模式在任意工作区都能开**:开了它,工具就在**这条会话的工作区**里造 / 装 / 上板
|
|
58
|
-
(模块 = 那个工作区里声明了 `dsh.workbench` 的包)。`setup` 建的那个工坊只是「造一个模块」
|
|
59
|
-
那个入口的落脚点(脚手架),不是 DIY 的落点 —— 详见下面「常见问题」。
|
|
60
|
-
- **工坊工具链跟着外壳走**:外壳升级后不用管工坊 —— 每次启动都会把工坊里那三个
|
|
61
|
-
`@dsh-workbench/*` 与**正在跑的那份外壳**比一次,不同代就在后台增量同步到同代(所以升级后
|
|
62
|
-
**下一次启动**就对上了)。离线时停在旧一代,但 `workbench_diy_status` 会直说
|
|
63
|
-
「工坊工具链还是上一代(…):<原因>」并给出修法。
|
|
64
|
-
- 第一次打开照旧走启动体检,自己装隔离 opencli 运行时;装不上时给一条能照抄到终端的命令。
|
|
65
|
-
- 与 `setup` 那条路的差别:**没有独立端口/进程**、**会话不隔离**、**改外壳源码不热重载**,
|
|
66
|
-
DIY 工坊的依赖是第一次启动在后台装的(此后**每次启动工作台时**工具链会自动跟到同代,见上一条)。取舍与理由见
|
|
67
|
-
[ADR-0037](https://github.com/code-farmer-i/dsh-workbench/blob/main/docs/adr/0037-workbench-installs-into-any-profile.md)。
|
|
68
|
-
- 想回到"两条实例并存",就删掉这个包(Plugins 页里卸载),再走上面的 `setup` 那条路 —— 数据都还在。
|
|
35
|
+
全局装过就不用 `npx`:`npm i -g @dsh-workbench/core` 之后直接 `dsh-workbench`。
|
|
69
36
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
- **装 opencli 的隔离运行时**:启动体检自己装,落在 `~/.dsh/workbench/opencli/`,
|
|
73
|
-
**完全不碰**你本机的 `~/.opencli`(插件目录靠改 `HOME` 分开)。装不上时(没网 / 源不通)
|
|
74
|
-
失败态里有一条**能直接照抄到终端**的命令 —— 那条得在终端跑,工作台自己发起的命令带文件沙箱。
|
|
75
|
-
- **要面板有数据,得登录 Coding**:卡片上点「去登录 ↗」,登完切回来按那颗「重试」
|
|
76
|
-
(刻意不做自动重试 —— 登录什么时候完成我们不知道)。
|
|
77
|
-
- 没登录 / 装不上都是**明确的失败态**,不会留一块白屏让你猜。
|
|
37
|
+
先决条件(就三条):
|
|
78
38
|
|
|
79
|
-
|
|
80
|
-
|
|
39
|
+
| 要有 | 为什么 |
|
|
40
|
+
|---|---|
|
|
41
|
+
| `dsh` ≥ 0.2.1-rc.2 | 本体。更旧的会被拒绝:`engines.dsh` 声明了下限,老到不认这个字段的 dsh 由启动器当场拒绝并给升级命令 |
|
|
42
|
+
| Node + pnpm | dsh 的 `plugin` 子命令转发给 pnpm;没有 pnpm 会报 `dsh: pnpm was not found` |
|
|
43
|
+
| 可选:跑过一次 `dsh web` | 想继承它的设置 / 插件 / 项目时。只建工作台不需要 |
|
|
44
|
+
|
|
45
|
+
## 命令行
|
|
46
|
+
|
|
47
|
+
| 命令 | 作用 |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `dsh-workbench create` | 交互式新建一个工作台实例 |
|
|
50
|
+
| `dsh-workbench setup` | 幂等建默认的 `workbench` profile;配 `--from` 建别的名字 |
|
|
51
|
+
| `dsh-workbench` | 起工作台(默认端口 `:3081`,其余参数透传给 `dsh web`) |
|
|
52
|
+
| `dsh-workbench --profile <名字>` | 起指定实例 |
|
|
53
|
+
| `dsh-workbench setup --from <来源> --profile <新名>` | 以某个现有 profile 为模板建一个 |
|
|
54
|
+
| `--with-sessions` / `--no-settings` / `--no-plugins` / `--no-projects` | 复制 / 不复制哪一类(默认复制设置、插件、项目,不复制会话) |
|
|
55
|
+
| `dsh-workbench --help` | 用法;其余参数透传给 `dsh web` |
|
|
56
|
+
|
|
57
|
+
环境变量:
|
|
58
|
+
|
|
59
|
+
| 变量 | 默认 | 作用 |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| `WORKBENCH_PORT` | `3081` | 端口;`dsh web` 默认 `:3080`,两边可以同时开 |
|
|
62
|
+
| `WORKBENCH_PROFILE` | `workbench` | 用哪个 profile(等价于 `--profile`) |
|
|
63
|
+
| `DSH_HOME` | `~/.dsh` | dsh 的数据根 |
|
|
64
|
+
| `DSH_WORKBENCH_HOME` | `$DSH_HOME/workbench` | 工作台自己的数据根(opencli 运行时、模块、截图…) |
|
|
65
|
+
|
|
66
|
+
装进 `dsh web` 或 Desktop 时没有启动命令:它们用自己那一份 profile,工作台只是其中一层插件。
|
|
67
|
+
|
|
68
|
+
## 包里有什么
|
|
69
|
+
|
|
70
|
+
`package.json` 的 `files` 是白名单 —— 漏一项的症状是「仓库里怎么都对,装出去那台静默什么也没做」。
|
|
71
|
+
|
|
72
|
+
| 路径 | 是什么 |
|
|
73
|
+
|---|---|
|
|
74
|
+
| `dist/host/**` | 宿主侧入口(`exports["."]`)与类型;构建产物,不进 git |
|
|
75
|
+
| `client.js` | 浏览器侧 bundle,dsh 客户端按 `dsh.client` 加载 |
|
|
76
|
+
| `cordis.patch.yml` | 把自己插进 profile 组合图的补丁(装载) |
|
|
77
|
+
| `preset/diy.patch.yml` | 「工作台 DIY 模式」的 preset;由 `scripts/gen-diy-preset.mjs` 从 dsh 出厂那份 `standard.patch.yml` 派生(生成后提交,selfcheck 盯过期) |
|
|
78
|
+
| `profile/` | 出厂 profile 模板(隔离 opencli、可写根两份补丁) |
|
|
79
|
+
| `skills/` | 模块 DIY 指引,装好后挂给 agent;漏了不报错,只是 agent 不知道要怎么做模块 |
|
|
80
|
+
| `bin/` | `dsh-workbench` 启动器、隔离 opencli 的入口 |
|
|
81
|
+
| `scripts/` | 随包出货的脚本:`seed-profile.sh` / `seed-workshop.sh` / `create-workbench.mjs` / `clone-profile.mjs` |
|
|
82
|
+
|
|
83
|
+
## 数据落在哪
|
|
84
|
+
|
|
85
|
+
| 内容 | 位置 |
|
|
86
|
+
|---|---|
|
|
87
|
+
| profile(设置、`node_modules`、`cordis.patch.yml`) | `~/.dsh/profiles/<名字>` |
|
|
88
|
+
| 工作台数据(模块、面板、截图与录制、opencli 运行时) | `~/.dsh/workbench/**` |
|
|
89
|
+
| API 凭据 | `~/.dsh/.credentials.yaml` —— 它与 `dsh web` **有意共用**,一台机器一把 key |
|
|
90
|
+
| DIY 工坊依赖安装日志 | `~/.dsh/workbench/seed.log` |
|
|
91
|
+
|
|
92
|
+
独立实例与 `dsh web` **数据分家**:各自会话、各自设置,互不影响。装进 `dsh web` / Desktop
|
|
93
|
+
则沿用它们自己的会话与存储,面板与模块配置照旧落在 `~/.dsh/workbench/**`。
|
|
94
|
+
|
|
95
|
+
设置只有一份,写在哪都看得见:
|
|
96
|
+
|
|
97
|
+
- 独立实例:`:3081` → Settings,落进 `profiles/<名字>/cordis.patch.yml`,每一行都改得动。
|
|
98
|
+
- 想用 `dsh web` 已经配好的行:`:3081` → `Meta+,` → 「工作台设置」→「配置同步」→
|
|
99
|
+
选来源 → 勾行 → 同步,即时生效。只搬显式配过的行,同 id 内容不同默认不覆盖;
|
|
100
|
+
web 后来改的不会自动过来,再打开这一页拉一次即可。
|
|
81
101
|
|
|
82
102
|
## 日常
|
|
83
103
|
|
|
84
104
|
| 想做什么 | 怎么做 |
|
|
85
|
-
|
|
105
|
+
|---|---|
|
|
86
106
|
| 起工作台 | `npx @dsh-workbench/core` |
|
|
87
107
|
| 换端口 | `WORKBENCH_PORT=3091 npx @dsh-workbench/core` |
|
|
88
|
-
| 升级 | 重跑一次 `npx --yes @dsh-workbench/core@latest setup
|
|
108
|
+
| 升级 | 重跑一次 `npx --yes @dsh-workbench/core@latest setup`(幂等),然后重启工作台。工坊工具链会在下一次启动时自动跟到同代,不必手动删工坊 |
|
|
89
109
|
| 重建 profile | `mv ~/.dsh/profiles/workbench ~/.dsh/profiles/workbench.bak`,再跑一次 `setup` |
|
|
110
|
+
| 换左栏 | 设置 → 工作台设置 → 会话列表:默认官方;切完自动刷新页面生效(从旧版升上来第一次要重启) |
|
|
111
|
+
| 从 `dsh web` 搬设置 | 设置 → 工作台设置 → 配置同步 → 选来源 → 勾行 → 同步 |
|
|
112
|
+
| 装模块 | `:3081` 的「工作台模块市场」,或让 agent 装 |
|
|
90
113
|
| 彻底不用了 | 删 `~/.dsh/profiles/workbench` 与 `~/.dsh/workbench` 两个目录(都不影响 `dsh web`) |
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
**数据一个都不丢**;把开关拨回来就恢复 —— 进不去设置页就按 `Meta+,`。进程已经退过的话,
|
|
110
|
-
启动器读到"bundle 没被选中"会直接拒绝启动并给一条命令:`./bin/dsh-workbench setup`(幂等,
|
|
111
|
-
把这一项补回 `dsh.profile.bundles`)。别当成故障去重建 profile。
|
|
114
|
+
|
|
115
|
+
外壳本身**零业务模块**:右侧面板装什么有什么。装进 `dsh web` / Desktop 时少一条命令 ——
|
|
116
|
+
没有独立端口与进程,改用它们自己的插件页装模块。
|
|
117
|
+
|
|
118
|
+
⚠️ **别在 Settings → 插件里把 `@dsh-workbench/core` 关掉**:关掉 = 那份 bundle patch 整份不再
|
|
119
|
+
应用,界面退化成原版 `dsh web`(左栏回来、右侧面板消失),数据一个都不丢。拨回来就恢复;
|
|
120
|
+
进不去设置页按 `Meta+,`。进程已经退过的话,启动器读到「bundle 没被选中」会直接拒绝启动并给
|
|
121
|
+
一条命令:`./bin/dsh-workbench setup`(幂等,把这一项补回 `dsh.profile.bundles`)。
|
|
122
|
+
别当成故障去重建 profile。
|
|
123
|
+
|
|
124
|
+
## 首次打开会自己做什么
|
|
125
|
+
|
|
126
|
+
- **装 opencli 的隔离运行时**:落在 `~/.dsh/workbench/opencli/`,靠改 `HOME` 与插件目录分开,
|
|
127
|
+
**完全不碰**你本机的 `~/.opencli`。装不上时(没网 / 源不通)失败态里有一条能直接照抄到终端
|
|
128
|
+
的命令 —— 那条得在终端跑,工作台自己发起的命令带文件沙箱。
|
|
129
|
+
- **要面板有数据,得登录对应平台**:卡片上点「去登录 ↗」,登完切回来按「重试」
|
|
130
|
+
(刻意不做自动重试 —— 登录什么时候完成我们不知道)。
|
|
131
|
+
- 没登录 / 装不上都是**明确的失败态**,不留白屏让人猜。
|
|
112
132
|
|
|
113
133
|
## 常见问题
|
|
114
134
|
|
|
115
135
|
| 症状 | 原因 / 怎么办 |
|
|
116
|
-
|
|
117
|
-
| `setup` 报 `scripts/seed-profile.sh: Permission denied` | 0.1.6
|
|
118
|
-
| 页面白屏、只显示 `Failed to load plugins` |
|
|
119
|
-
|
|
|
120
|
-
|
|
|
121
|
-
|
|
|
122
|
-
|
|
|
123
|
-
|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
126
|
-
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
## 从源码跑 / 参与开发
|
|
136
|
+
|---|---|
|
|
137
|
+
| `setup` 报 `scripts/seed-profile.sh: Permission denied` | 0.1.6 的缺陷(发出去的包丢了脚本可执行位)。应急:`chmod +x ~/.npm/_npx/*/node_modules/@dsh-workbench/core/{scripts/seed-profile.sh,bin/opencli-isolated}` 后重跑;0.1.7 起已修 |
|
|
138
|
+
| 页面白屏、只显示 `Failed to load plugins` | 有插件往未声明的槽注册,抛错即整个 entry 激活失败。看控制台里 `[dsh-workbench] apply failed` |
|
|
139
|
+
| 左栏是出厂样子、右边没有面板 | 工作台插件在 Settings 里被关了(见上一节 ⚠️)。重启后启动器不会再让你拿到这种实例 |
|
|
140
|
+
| 面板一直空着 | 多半是没登录平台(见上);或这个工作区的 git `origin` 不指向它要读的平台 |
|
|
141
|
+
| 打开面板 / 按刷新要等 5–8 秒 | 正常:opencli 每次调用有固定约 5 秒开销(起浏览器会话)。没有缓存,数据一律实时 |
|
|
142
|
+
| 体检说「检测浏览器通道 · 没连上」,可面板照样能用 | 本机全局 opencli 与隔离运行时版本不一致,daemon 被顶成对方那版;下一条浏览器命令会自动把它重启回来,复检后改回「已连接」 |
|
|
143
|
+
| Desktop 里体检一直「没连上」 | 浏览器没开。预检页有「打开浏览器」,点了才开上次承载扩展的那个(没记住就用 Chrome),开完自动复检;点了会切到 Chrome 前台(冷启动抢焦点,静默做不到)。仍连不上多半是扩展没装或被禁用 |
|
|
144
|
+
| 模型列表里只有出厂的几个、没有自己配的供应商 | 新 profile 不带设置。设置 → 工作台设置 → 配置同步 → 勾 `llm-` 那几行 → 同步 |
|
|
145
|
+
| 配置同步里某行说 `@x 还没装` | 那一行点名的包不在这个 profile 的 `node_modules` 里:`dsh plugin --profile workbench add @x`(或在模块市场装),装完 dsh 会自行重组,它报 `restartReason` 时才重启 |
|
|
146
|
+
| 启动被拒,说 dsh 太旧 | `npm i -g @deepseek-ai/dsh@latest`,装完重启工作台 |
|
|
147
|
+
| 左栏没有「工作台DIY」,模式下拉里也没有「工作台 DIY 模式」 | 多半是 dsh 太旧:DIY preset 从 dsh 0.2.1-rc.2 的 preset 清单派生,旧一代挂不起来,而 dsh 的模式选择器只列挂得起来的 ⇒ 整个不见且不报错。启动体检会把它摆出来并给升级命令;自己核对就看 dsh 的 设置 → 「Agent presets」那一行的红标与原因 |
|
|
148
|
+
| 在自己项目里开了 DIY,面板却说没找到模块 | 模块跟**这条会话的工作区**走,不跟工坊走:① 那个工作区要有一个在 `package.json` 里声明 `dsh.workbench` 的包;② 从工坊带过去的,把模块目录挪 / 拷进那个仓库;③ 旧截图不迁移(新的落在 `~/.dsh/workbench/artifacts/<工作区>/`)。细节见工作台模块指引 |
|
|
149
|
+
|
|
150
|
+
## 从源码跑
|
|
132
151
|
|
|
133
152
|
```bash
|
|
134
|
-
git clone git@github.com:
|
|
135
|
-
cd dsh-workbench/packages/
|
|
153
|
+
git clone git@github.com:novaeth/dsh-workbench.git
|
|
154
|
+
cd dsh-workbench/packages/core
|
|
136
155
|
pnpm install
|
|
137
|
-
pnpm run dev # 监听 src/**(重建产物)+ 起工作台 :3081
|
|
138
|
-
pnpm run check #
|
|
156
|
+
pnpm run dev # 监听 src/**(重建产物)+ 起工作台 :3081;改完不用重启、不用刷新
|
|
157
|
+
pnpm run check # 门禁:整仓那一套(= pnpm -w run check)
|
|
139
158
|
./bin/dsh-workbench # 只想起工作台、不需要监听改动时用它
|
|
140
159
|
```
|
|
141
160
|
|
|
142
|
-
`pnpm run dev`
|
|
143
|
-
`:3081`
|
|
144
|
-
|
|
161
|
+
`pnpm run dev` 先替你把 profile 保障成**本仓这份**(不是源上那份),等首次构建完成再起实例;
|
|
162
|
+
`:3081` 已经有实例在跑时就只监听、不重复起第二个。浏览器半侧重建立 `client.js` 后由 dsh 的
|
|
163
|
+
HMR 热换插件(不刷新页面),宿主半侧按模块路径热重载。
|
|
164
|
+
|
|
165
|
+
`cordis.patch.yml` 与 `package.json` 的 bundle 清单也不用重启(`dsh-hmr` 变了就重组);
|
|
166
|
+
要重启的是改 `vite.config.ts`。
|
|
167
|
+
|
|
168
|
+
`pnpm run check` 与 `pnpm release` 的闸是同一条链,别在包内另串一份短的 —— 会漏 lint、
|
|
169
|
+
文档与模块判据。环境、提交与门禁纪律见 [CONTRIBUTING.md](../../CONTRIBUTING.md)。
|
|
145
170
|
|
|
146
|
-
|
|
171
|
+
## 相关文档
|
|
147
172
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
[
|
|
173
|
+
| 想了解 | 读 |
|
|
174
|
+
|---|---|
|
|
175
|
+
| 装法、界面、适合谁 | [根 README](../../README.md) |
|
|
176
|
+
| 架构、两个运行时、槽位、数据通路、门禁 | [ARCHITECTURE.md](../../ARCHITECTURE.md) |
|
|
177
|
+
| 写一个模块 | [DIY 指引](skills/workbench-module-diy/SKILL.md) |
|
|
178
|
+
| 模块的构建与十三条判据 | [module-tools](../module-tools/README.md) |
|
|
179
|
+
| 共享包(契约、哑组件、宿主工具) | [shared](../shared/README.md) |
|
|
180
|
+
| 最小模块样本 | [module-hello](../module-hello/README.md) |
|
|
181
|
+
| 环境、门禁、提交 | [CONTRIBUTING.md](../../CONTRIBUTING.md) |
|
package/bin/dsh-workbench
CHANGED
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
#
|
|
3
3
|
# 工作台:建 profile / 起工作台。
|
|
4
4
|
#
|
|
5
|
-
# ./bin/dsh-workbench
|
|
6
|
-
# ./bin/dsh-workbench
|
|
7
|
-
#
|
|
5
|
+
# ./bin/dsh-workbench create # ① 交互式新建工作台(推荐)
|
|
6
|
+
# ./bin/dsh-workbench setup # 建默认 workbench profile(幂等)
|
|
7
|
+
# ./bin/dsh-workbench setup --from web --profile wb2
|
|
8
|
+
# # 以 web 为模板建一个独立工作台
|
|
9
|
+
# ./bin/dsh-workbench setup --from web --profile wb2 --with-sessions
|
|
10
|
+
# # 连会话一起复制
|
|
11
|
+
# ./bin/dsh-workbench --profile wb2 # ② 起指定 profile,默认 :3081
|
|
8
12
|
# ./bin/dsh-workbench --no-open # 其余参数透传给 dsh web
|
|
9
13
|
# ./bin/dsh-workbench --help
|
|
10
14
|
#
|
|
@@ -26,8 +30,72 @@ set -euo pipefail
|
|
|
26
30
|
PKG='@dsh-workbench/core'
|
|
27
31
|
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
|
|
28
32
|
PROFILE="${WORKBENCH_PROFILE:-workbench}"
|
|
33
|
+
SRC_PROFILE="${WORKBENCH_SOURCE_PROFILE:-web}"
|
|
29
34
|
PORT="${WORKBENCH_PORT:-3081}"
|
|
35
|
+
PROFILE_EXPLICIT=0
|
|
36
|
+
[ -n "${WORKBENCH_PROFILE:-}" ] && PROFILE_EXPLICIT=1
|
|
37
|
+
SETUP=0
|
|
38
|
+
CREATE=0
|
|
39
|
+
DSH_ARGS=()
|
|
40
|
+
|
|
41
|
+
die() {
|
|
42
|
+
echo "dsh-workbench: $*" >&2
|
|
43
|
+
exit 1
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
usage() {
|
|
47
|
+
sed -n '3,13p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if [ "${1:-}" = "create" ]; then
|
|
51
|
+
CREATE=1
|
|
52
|
+
shift
|
|
53
|
+
fi
|
|
54
|
+
if [ "${1:-}" = "setup" ]; then
|
|
55
|
+
SETUP=1
|
|
56
|
+
shift
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
while [ $# -gt 0 ]; do
|
|
60
|
+
case "$1" in
|
|
61
|
+
--profile | --workbench-profile)
|
|
62
|
+
[ $# -ge 2 ] || die "$1 需要跟一个 profile 名字(例如 --profile wb2)"
|
|
63
|
+
PROFILE="$2"
|
|
64
|
+
PROFILE_EXPLICIT=1
|
|
65
|
+
shift 2
|
|
66
|
+
;;
|
|
67
|
+
--from | --source-profile)
|
|
68
|
+
[ "$SETUP" = "1" ] || die "$1 只用于 setup(例如 setup --from web --profile wb2)"
|
|
69
|
+
[ $# -ge 2 ] || die "$1 需要跟一个来源 profile(例如 --from web)"
|
|
70
|
+
SRC_PROFILE="$2"
|
|
71
|
+
export WORKBENCH_SOURCE_PROFILE="$SRC_PROFILE"
|
|
72
|
+
WB_CLONE=1
|
|
73
|
+
shift 2
|
|
74
|
+
;;
|
|
75
|
+
--with-sessions) WB_COPY_SESSIONS=1; shift ;;
|
|
76
|
+
--no-sessions) WB_COPY_SESSIONS=0; shift ;;
|
|
77
|
+
--no-settings) WB_COPY_SETTINGS=0; shift ;;
|
|
78
|
+
--no-plugins) WB_COPY_PLUGINS=0; shift ;;
|
|
79
|
+
--no-projects) WB_COPY_PROJECTS=0; shift ;;
|
|
80
|
+
help | --help | -h) usage; exit 0 ;;
|
|
81
|
+
--) shift; DSH_ARGS+=("$@"); break ;;
|
|
82
|
+
*) DSH_ARGS+=("$1"); shift ;;
|
|
83
|
+
esac
|
|
84
|
+
done
|
|
85
|
+
|
|
86
|
+
if [ "$SETUP" = "1" ] && [ ${#DSH_ARGS[@]} -gt 0 ]; then
|
|
87
|
+
die "setup 不认识这些参数:${DSH_ARGS[*]}"
|
|
88
|
+
fi
|
|
89
|
+
if [ "${WB_CLONE:-0}" = "1" ] && [ "$PROFILE_EXPLICIT" = "0" ]; then
|
|
90
|
+
die "用 --from 时还要指定 --profile <新名字>(例如 --from web --profile wb2)"
|
|
91
|
+
fi
|
|
92
|
+
|
|
93
|
+
export WORKBENCH_PROFILE="$PROFILE"
|
|
94
|
+
export WB_CLONE="${WB_CLONE:-0}"
|
|
30
95
|
PROFILE_DIR="$DSH_HOME/profiles/$PROFILE"
|
|
96
|
+
# 每个 profile 一份自己的运行时数据根;默认 profile 仍是 <home>/workbench。
|
|
97
|
+
WORKBENCH_HOME="${DSH_WORKBENCH_HOME:-$DSH_HOME/$PROFILE}"
|
|
98
|
+
export DSH_WORKBENCH_HOME="$WORKBENCH_HOME"
|
|
31
99
|
|
|
32
100
|
# 本包的真实位置。**不能**直接 `dirname "$0"/..`:npx 是经 `node_modules/.bin/dsh-workbench`
|
|
33
101
|
# 这条软链调进来的,那样算出来会停在 `node_modules`(实测),于是下面
|
|
@@ -43,13 +111,18 @@ GIT_TOP="$(git -C "$REPO_DIR" rev-parse --show-toplevel 2>/dev/null || true)"
|
|
|
43
111
|
# `rev-parse --show-toplevel` 只说明"**某个祖先目录**是个仓库"—— 装出来的那份完全可能刚好落在
|
|
44
112
|
# 某个仓库里:最常见的是 `$HOME` 本身就是 dotfiles 仓库,而 npm 的前缀(`~/.nvm/...`、
|
|
45
113
|
# `~/.npm-global`…)就在 `$HOME` 下。那会把"装出来的那份"当成仓库副本,以 link 装进 profile:
|
|
46
|
-
#
|
|
114
|
+
# 市场里工作台那一行会打上「本地」标,而 `npm i -g …@latest` 之后 profile
|
|
47
115
|
# 指向的东西还会悄悄变。所以还得证明**这份 package.json 本身被那个仓库跟踪**(仓库副本才有的事;
|
|
48
|
-
# 与 seed-workshop.sh 那条"工作树里真有 packages/
|
|
116
|
+
# 与 seed-workshop.sh 那条"工作树里真有 packages/core + packages/module-tools"同旨)。
|
|
49
117
|
if [ -n "$GIT_TOP" ] && ! git -C "$REPO_DIR" ls-files --error-unmatch package.json >/dev/null 2>&1; then
|
|
50
118
|
GIT_TOP=""
|
|
51
119
|
fi
|
|
52
120
|
|
|
121
|
+
if [ "$CREATE" = "1" ]; then
|
|
122
|
+
[ $# -eq 0 ] || die "create 不接受参数;它会在终端里问你"
|
|
123
|
+
exec node "$REPO_DIR/scripts/create-workbench.mjs"
|
|
124
|
+
fi
|
|
125
|
+
|
|
53
126
|
if ! command -v dsh >/dev/null 2>&1; then
|
|
54
127
|
echo "dsh-workbench: PATH 上没有 dsh。先装:npm i -g @deepseek-ai/dsh" >&2
|
|
55
128
|
exit 1
|
|
@@ -102,7 +175,7 @@ for (let i = 0; i < Math.max(have.pre.length, want.pre.length); i += 1) {
|
|
|
102
175
|
process.exit(0);
|
|
103
176
|
' || DSH_FLOOR_GUARD=$?
|
|
104
177
|
if [ "${DSH_FLOOR_GUARD:-0}" -eq 1 ]; then
|
|
105
|
-
echo "dsh-workbench: 这台机器上的 dsh 是 ${DSH_VERSION}
|
|
178
|
+
echo "dsh-workbench: 这台机器上的 dsh 是 ${DSH_VERSION},这份工作台要 ${DSH_FLOOR}。" >&2
|
|
106
179
|
echo " 低于它时 DIY 模式(会话里的「工作台 DIY 模式」)挂不起来,而 dsh 的模式选择器只列挂得起来的" >&2
|
|
107
180
|
echo " —— 它会**整个不出现**,不报错。所以这里直接拒绝启动。" >&2
|
|
108
181
|
echo " 升级 dsh(再重启一次工作台): npm i -g @deepseek-ai/dsh@latest" >&2
|
|
@@ -129,6 +202,29 @@ run_setup() {
|
|
|
129
202
|
# 只有装出来的副本会丢。
|
|
130
203
|
bash "$REPO_DIR/scripts/seed-profile.sh"
|
|
131
204
|
|
|
205
|
+
if [ "${WB_CLONE:-0}" = "1" ]; then
|
|
206
|
+
if [ -z "${WB_SOURCE_HOME:-}" ]; then
|
|
207
|
+
SRC_PATCH="$DSH_HOME/profiles/$SRC_PROFILE/cordis.patch.yml"
|
|
208
|
+
if grep -q 'id: session-persistence-jsonl' "$SRC_PATCH" 2>/dev/null; then
|
|
209
|
+
if [ "$SRC_PROFILE" != "workbench" ] && grep -q 'DSH_WORKBENCH_HOME' "$SRC_PATCH" 2>/dev/null; then
|
|
210
|
+
WB_SOURCE_HOME="$DSH_HOME/$SRC_PROFILE"
|
|
211
|
+
else
|
|
212
|
+
WB_SOURCE_HOME="$DSH_HOME/workbench"
|
|
213
|
+
fi
|
|
214
|
+
else
|
|
215
|
+
WB_SOURCE_HOME="$DSH_HOME"
|
|
216
|
+
fi
|
|
217
|
+
fi
|
|
218
|
+
WB_SOURCE_PROFILE="$SRC_PROFILE" \
|
|
219
|
+
WB_TARGET_PROFILE="$PROFILE" \
|
|
220
|
+
WB_SOURCE_HOME="$WB_SOURCE_HOME" \
|
|
221
|
+
WB_COPY_SETTINGS="${WB_COPY_SETTINGS:-1}" \
|
|
222
|
+
WB_COPY_PLUGINS="${WB_COPY_PLUGINS:-1}" \
|
|
223
|
+
WB_COPY_PROJECTS="${WB_COPY_PROJECTS:-1}" \
|
|
224
|
+
WB_COPY_SESSIONS="${WB_COPY_SESSIONS:-0}" \
|
|
225
|
+
node "$REPO_DIR/scripts/clone-profile.mjs" || die "从 $SRC_PROFILE 初始化 $PROFILE 失败"
|
|
226
|
+
fi
|
|
227
|
+
|
|
132
228
|
if [ -n "$GIT_TOP" ]; then
|
|
133
229
|
SPEC="$REPO_DIR"
|
|
134
230
|
echo "→ 仓库副本:以 link 方式装本目录(${SPEC})"
|
|
@@ -148,31 +244,36 @@ run_setup() {
|
|
|
148
244
|
# 启动器现在拿"选中"当硬门禁(没选中就拒绝启动),这一步就是那条修复命令的落点。
|
|
149
245
|
bash "$REPO_DIR/scripts/seed-profile.sh" ensure-selected
|
|
150
246
|
|
|
247
|
+
if [ -n "$GIT_TOP" ]; then
|
|
248
|
+
BASE_CMD="$REPO_DIR/bin/dsh-workbench"
|
|
249
|
+
elif command -v dsh-workbench >/dev/null 2>&1; then
|
|
250
|
+
BASE_CMD="dsh-workbench"
|
|
251
|
+
else
|
|
252
|
+
BASE_CMD="npx @dsh-workbench/core"
|
|
253
|
+
fi
|
|
254
|
+
if [ "$PROFILE" = "workbench" ]; then
|
|
255
|
+
START_CMD="$BASE_CMD"
|
|
256
|
+
else
|
|
257
|
+
START_CMD="$BASE_CMD --profile $PROFILE"
|
|
258
|
+
fi
|
|
259
|
+
|
|
151
260
|
cat <<EOF
|
|
152
261
|
|
|
153
262
|
装好了。起工作台:
|
|
154
263
|
|
|
155
|
-
$
|
|
264
|
+
$START_CMD
|
|
265
|
+
|
|
266
|
+
(全局装过就用 dsh-workbench;npx 就用 npx @dsh-workbench/core;本仓开发用 ./packages/core/bin/dsh-workbench。)
|
|
156
267
|
|
|
157
268
|
首次打开会走启动体检,它会自己把 opencli 的隔离运行时装好 —— 不用你动手。
|
|
158
269
|
EOF
|
|
159
270
|
}
|
|
160
271
|
|
|
161
|
-
usage() {
|
|
162
|
-
sed -n '3,10p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
|
|
163
|
-
}
|
|
164
272
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
exit 0
|
|
170
|
-
;;
|
|
171
|
-
help | --help | -h)
|
|
172
|
-
usage
|
|
173
|
-
exit 0
|
|
174
|
-
;;
|
|
175
|
-
esac
|
|
273
|
+
if [ "$SETUP" = "1" ]; then
|
|
274
|
+
run_setup
|
|
275
|
+
exit 0
|
|
276
|
+
fi
|
|
176
277
|
|
|
177
278
|
if [ ! -f "$PROFILE_DIR/package.json" ]; then
|
|
178
279
|
echo "dsh-workbench: profile '$PROFILE' 还不存在。" >&2
|
|
@@ -264,7 +365,7 @@ fi
|
|
|
264
365
|
#
|
|
265
366
|
# 现在改成:**工作台自己的 patch 是唯一真相**。想要 web 的哪几行,去
|
|
266
367
|
# 设置 → 「配置同步」里勾(它读源 profile 的 cordis.patch.yml,按行搬运,
|
|
267
|
-
# 见
|
|
368
|
+
# 见 内部设计记录 与 ADR-0044)。启动器只负责把工作台起起来。
|
|
268
369
|
PATCH_ARGS=()
|
|
269
370
|
|
|
270
371
|
# ── 声明工作台运行时的**可写根**(执行缝的沙箱只放行 process.cwd())──────────
|
|
@@ -293,9 +394,9 @@ fi
|
|
|
293
394
|
# —— 见 bin/opencli-isolated 开头的说明。
|
|
294
395
|
#
|
|
295
396
|
# 建一个**稳定路径**的软链:别处(包括给用户"复制这条命令"的文案)都能用
|
|
296
|
-
# $
|
|
397
|
+
# $WORKBENCH_HOME/opencli/bin/opencli 引用它,不必知道本目录在哪 ——
|
|
297
398
|
# 而且从那里跑出来同样是隔离的。指向 profile 里那份,别指 npx 缓存(会回收)。
|
|
298
|
-
OPENCLI_ROOT="$
|
|
399
|
+
OPENCLI_ROOT="$WORKBENCH_HOME/opencli"
|
|
299
400
|
mkdir -p "$OPENCLI_ROOT/bin" "$OPENCLI_ROOT/home"
|
|
300
401
|
|
|
301
402
|
# DIY 工坊的目录必须**每次启动都在**:`cordis.patch.yml` 的 hmr 行把它列成一个监听根
|
|
@@ -303,20 +404,20 @@ mkdir -p "$OPENCLI_ROOT/bin" "$OPENCLI_ROOT/home"
|
|
|
303
404
|
# 所以不把它列进去,模块重建 dist/host.js 就不热换 —— 而且**不报错**)。
|
|
304
405
|
# chokidar 对不存在的根收不到事件,所以这里保住它,不必等用户重跑 setup。
|
|
305
406
|
# 只建目录:骨架与依赖是 seed-profile.sh 第 6 步的事。
|
|
306
|
-
mkdir -p "$
|
|
407
|
+
mkdir -p "$WORKBENCH_HOME/diy/packages"
|
|
307
408
|
|
|
308
409
|
# 工坊的**稳定入口**:每次启动都重写一遍(幂等、几乎不花时间),挂进 PATH。
|
|
309
410
|
# 于是 agent 在工坊里(或任何目录里)都能直接叫 `dsh-wb-module`,不必记着 `pnpm exec` 前缀 ——
|
|
310
411
|
# 指令里那句"工坊里没有全局 dsh-wb-module"是**旧**状态,现在有一个我们自己的转发脚本。
|
|
311
412
|
bash "$REPO_DIR/scripts/seed-workshop.sh" entry || true
|
|
312
|
-
export PATH="$
|
|
413
|
+
export PATH="$WORKBENCH_HOME/bin:$PATH"
|
|
313
414
|
|
|
314
415
|
# 骨架不在就**当场建**(不是只提醒):工坊看着"能用",可模块的 build / check 会把
|
|
315
416
|
# "不在 workspace 里"说成"声明写错了"——实测就是在这一步卡住过(干净机器上 seed 第 6 步没跑)。
|
|
316
417
|
# 提醒是对人说的,而先撞上它的是 agent:它读到的报错指着别的地方,于是开始自由发挥。
|
|
317
|
-
if [ ! -f "$
|
|
418
|
+
if [ ! -f "$WORKBENCH_HOME/diy/package.json" ]; then
|
|
318
419
|
bash "$REPO_DIR/scripts/seed-workshop.sh" || {
|
|
319
|
-
echo "dsh-workbench: 提醒 —— DIY 工坊的骨架没建起来($
|
|
420
|
+
echo "dsh-workbench: 提醒 —— DIY 工坊的骨架没建起来($WORKBENCH_HOME/diy/package.json)。" >&2
|
|
320
421
|
echo " 跑一次 dsh-workbench setup;在那之前工坊里的模块 build / check 都会报错。" >&2
|
|
321
422
|
}
|
|
322
423
|
fi
|
|
@@ -351,4 +452,4 @@ fi
|
|
|
351
452
|
# ⚠️ 顺序有讲究:`--patch` 是 **dsh 本体**的选项,必须排在 `--port`(应用参数)**之前** ——
|
|
352
453
|
# 参数一旦进了应用的透传区(第一个应用自己的选项开始),后面的都直接交给应用,
|
|
353
454
|
# `--patch` 会被应用当成未知选项(实测:`--port` 在前时报 `unknown option '--patch'`)。
|
|
354
|
-
exec dsh "$PROFILE" ${PATCH_ARGS[@]+"${PATCH_ARGS[@]}"} --port "$PORT" "
|
|
455
|
+
exec dsh "$PROFILE" ${PATCH_ARGS[@]+"${PATCH_ARGS[@]}"} --port "$PORT" ${DSH_ARGS[@]+"${DSH_ARGS[@]}"}
|
package/bin/opencli-isolated
CHANGED
|
@@ -22,7 +22,8 @@
|
|
|
22
22
|
set -euo pipefail
|
|
23
23
|
|
|
24
24
|
DSH_HOME="${DSH_HOME:-$HOME/.dsh}"
|
|
25
|
-
|
|
25
|
+
WORKBENCH_HOME="${DSH_WORKBENCH_HOME:-$DSH_HOME/workbench}"
|
|
26
|
+
ROOT="$WORKBENCH_HOME/opencli"
|
|
26
27
|
REAL_HOME="$HOME"
|
|
27
28
|
|
|
28
29
|
mkdir -p "$ROOT/home"
|
|
@@ -43,7 +44,7 @@ fi
|
|
|
43
44
|
# 打出来就是它),这个值一路继承到执行缝里的每条命令。带默认值等于"外面给什么就用什么",
|
|
44
45
|
# 于是隔离形同虚设 —— opencli 自己内部还会跑 npm(`plugin install` 就要,见它 dist 里
|
|
45
46
|
# `execFileSync('npm', ['install', …])`),那次会去写 `~/.npm`;而执行缝只放行
|
|
46
|
-
# `$DSH_HOME/workbench
|
|
47
|
+
# `$DSH_HOME/workbench`(或 `DSH_WORKBENCH_HOME`),写入被拒 → 市场装插件**报错退出 1**,报的还是 npm 那句
|
|
47
48
|
# "cache folder contains root-owned files"(那台机器上其实一个 root 文件都没有,是假话术)。
|
|
48
49
|
# 所以这里是**无条件改写**:缓存落点只有这一处说了算。
|
|
49
50
|
#
|