@pioneer_zmc/dsh-workbench 0.2.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.
Files changed (168) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/README.zh.md +100 -0
  4. package/client.js +122 -0
  5. package/cordis.patch.yml +8 -0
  6. package/dist/check-building.js +1669 -0
  7. package/dist/check-room.js +980 -0
  8. package/dist/index.js +2873 -0
  9. package/package.json +60 -0
  10. package/skills/specdev-building/SKILL.md +85 -0
  11. package/skills/specdev-building/assets/layouts/court.json +53 -0
  12. package/skills/specdev-building/assets/layouts/row.json +48 -0
  13. package/skills/specdev-building/assets/layouts/single.json +27 -0
  14. package/skills/specdev-building/assets/layouts/tower-9.json +71 -0
  15. package/skills/specdev-building/assets/layouts/tower.json +59 -0
  16. package/skills/specdev-building/references/blueprint-contract.md +126 -0
  17. package/skills/specdev-building/references/diagnostics.md +101 -0
  18. package/skills/specdev-building/references/layouts.md +112 -0
  19. package/skills/specdev-business/SKILL.md +91 -0
  20. package/skills/specdev-business/assets/plan-template.md +66 -0
  21. package/skills/specdev-business/assets/spec-template.md +111 -0
  22. package/skills/specdev-business/assets/tasks-template.md +36 -0
  23. package/skills/specdev-business/references/change.md +117 -0
  24. package/skills/specdev-business/references/evidence-review.md +125 -0
  25. package/skills/specdev-business/references/implementation.md +67 -0
  26. package/skills/specdev-business/references/project-contract.md +211 -0
  27. package/skills/specdev-business/references/source-map.md +110 -0
  28. package/skills/specdev-business/references/specification.md +93 -0
  29. package/skills/specdev-business/references/workflow.md +126 -0
  30. package/skills/specdev-room/SKILL.md +77 -0
  31. package/skills/specdev-room/assets/intro-room.json +14 -0
  32. package/skills/specdev-room/references/diagnostics.md +21 -0
  33. package/skills/specdev-room/references/room-contract.md +59 -0
  34. package/vendor/archify-renderer/VERSION.md +52 -0
  35. package/vendor/archify-renderer/archify/LICENSE +22 -0
  36. package/vendor/archify-renderer/archify/THIRD_PARTY_NOTICES.md +56 -0
  37. package/vendor/archify-renderer/archify/assets/template.html +14787 -0
  38. package/vendor/archify-renderer/archify/bin/archify.mjs +1990 -0
  39. package/vendor/archify-renderer/archify/renderers/shared/brand-marks.mjs +563 -0
  40. package/vendor/archify-renderer/archify/renderers/shared/cli.mjs +218 -0
  41. package/vendor/archify-renderer/archify/renderers/shared/desktop-readability.mjs +26 -0
  42. package/vendor/archify-renderer/archify/renderers/shared/diagnostics.mjs +127 -0
  43. package/vendor/archify-renderer/archify/renderers/shared/engineering-profiles.mjs +157 -0
  44. package/vendor/archify-renderer/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  45. package/vendor/archify-renderer/archify/renderers/shared/generated-validators.mjs +13 -0
  46. package/vendor/archify-renderer/archify/renderers/shared/geometry.mjs +1423 -0
  47. package/vendor/archify-renderer/archify/renderers/shared/i18n.mjs +594 -0
  48. package/vendor/archify-renderer/archify/renderers/shared/legend.mjs +217 -0
  49. package/vendor/archify-renderer/archify/renderers/shared/output-path.mjs +321 -0
  50. package/vendor/archify-renderer/archify/renderers/shared/repository-evidence.mjs +235 -0
  51. package/vendor/archify-renderer/archify/renderers/shared/text-fit.mjs +49 -0
  52. package/vendor/archify-renderer/archify/renderers/shared/utils.mjs +232 -0
  53. package/vendor/archify-renderer/archify/renderers/shared/validator.mjs +86 -0
  54. package/vendor/archify-renderer/archify/renderers/workflow/render-workflow.mjs +35 -0
  55. package/vendor/archify-renderer/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  56. package/vendor/archify-renderer/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  57. package/vendor/archify-renderer/archify/schemas/common.schema.json +115 -0
  58. package/vendor/archify-renderer/archify/schemas/workflow.schema.json +428 -0
  59. package/vendor/archify-renderer/archify/scripts/check-render-output.mjs +835 -0
  60. package/vendor/archify-renderer/shims/process.mjs +18 -0
  61. package/vendor/archify-renderer/stubs/child_process.mjs +2 -0
  62. package/vendor/archify-renderer/stubs/crypto.mjs +3 -0
  63. package/vendor/archify-renderer/stubs/dns-promises.mjs +2 -0
  64. package/vendor/archify-renderer/stubs/fs.mjs +3 -0
  65. package/vendor/archify-renderer/stubs/http.mjs +3 -0
  66. package/vendor/archify-renderer/stubs/https.mjs +3 -0
  67. package/vendor/archify-renderer/stubs/net.mjs +3 -0
  68. package/vendor/archify-renderer/stubs/path.mjs +3 -0
  69. package/vendor/archify-renderer/stubs/url.mjs +3 -0
  70. package/web/assets/building-kit.js +1157 -0
  71. package/web/assets/building-look.js +185 -0
  72. package/web/assets/building-plan.js +495 -0
  73. package/web/assets/building-scene.js +529 -0
  74. package/web/assets/building-walk.js +248 -0
  75. package/web/assets/building.js +859 -0
  76. package/web/assets/business.js +124 -0
  77. package/web/assets/chart-link.js +165 -0
  78. package/web/assets/common.js +302 -0
  79. package/web/assets/details.js +197 -0
  80. package/web/assets/evidence.js +30 -0
  81. package/web/assets/furniture/SOURCES.md +24 -0
  82. package/web/assets/furniture/assets/ceramic-display-stand-01/asset.json +25 -0
  83. package/web/assets/furniture/assets/ceramic-display-stand-01/model.js +116 -0
  84. package/web/assets/furniture/assets/ceramic-display-stand-01/preview.webp +0 -0
  85. package/web/assets/furniture/assets/ceramic-floor-lamp-01/asset.json +61 -0
  86. package/web/assets/furniture/assets/ceramic-floor-lamp-01/model.js +56 -0
  87. package/web/assets/furniture/assets/ceramic-floor-lamp-01/preview.webp +0 -0
  88. package/web/assets/furniture/assets/ceramic-low-cabinet-01/asset.json +81 -0
  89. package/web/assets/furniture/assets/ceramic-low-cabinet-01/model.js +67 -0
  90. package/web/assets/furniture/assets/ceramic-low-cabinet-01/preview.webp +0 -0
  91. package/web/assets/furniture/assets/ceramic-vase-01/asset.json +21 -0
  92. package/web/assets/furniture/assets/ceramic-vase-01/model.js +119 -0
  93. package/web/assets/furniture/assets/ceramic-vase-01/preview.webp +0 -0
  94. package/web/assets/furniture/assets/fairy-bed-01/asset.json +61 -0
  95. package/web/assets/furniture/assets/fairy-bed-01/model.js +63 -0
  96. package/web/assets/furniture/assets/fairy-bed-01/preview.webp +0 -0
  97. package/web/assets/furniture/assets/fairy-book-stack-01/asset.json +21 -0
  98. package/web/assets/furniture/assets/fairy-book-stack-01/model.js +71 -0
  99. package/web/assets/furniture/assets/fairy-book-stack-01/preview.webp +0 -0
  100. package/web/assets/furniture/assets/fairy-bookshelf-01/asset.json +32 -0
  101. package/web/assets/furniture/assets/fairy-bookshelf-01/model.js +168 -0
  102. package/web/assets/furniture/assets/fairy-bookshelf-01/preview.webp +0 -0
  103. package/web/assets/furniture/assets/fairy-desk-01/asset.json +25 -0
  104. package/web/assets/furniture/assets/fairy-desk-01/model.js +132 -0
  105. package/web/assets/furniture/assets/fairy-desk-01/preview.webp +0 -0
  106. package/web/assets/furniture/assets/fairy-notice-board-01/asset.json +23 -0
  107. package/web/assets/furniture/assets/fairy-notice-board-01/model.js +125 -0
  108. package/web/assets/furniture/assets/fairy-notice-board-01/preview.webp +0 -0
  109. package/web/assets/furniture/assets/fairy-potted-plant-01/asset.json +21 -0
  110. package/web/assets/furniture/assets/fairy-potted-plant-01/model.js +128 -0
  111. package/web/assets/furniture/assets/fairy-potted-plant-01/preview.webp +0 -0
  112. package/web/assets/furniture/assets/fairy-reading-chair-01/asset.json +61 -0
  113. package/web/assets/furniture/assets/fairy-reading-chair-01/model.js +66 -0
  114. package/web/assets/furniture/assets/fairy-reading-chair-01/preview.webp +0 -0
  115. package/web/assets/furniture/assets/fairy-table-lamp-01/asset.json +21 -0
  116. package/web/assets/furniture/assets/fairy-table-lamp-01/model.js +182 -0
  117. package/web/assets/furniture/assets/fairy-table-lamp-01/preview.webp +0 -0
  118. package/web/assets/furniture/catalog.js +137 -0
  119. package/web/assets/furniture/index.json +110 -0
  120. package/web/assets/furniture/registry.js +72 -0
  121. package/web/assets/furniture-page.css +68 -0
  122. package/web/assets/furniture-page.js +302 -0
  123. package/web/assets/home.js +65 -0
  124. package/web/assets/node-detail.js +148 -0
  125. package/web/assets/panel-link.js +47 -0
  126. package/web/assets/read.js +746 -0
  127. package/web/assets/room-scene.js +386 -0
  128. package/web/assets/room.css +287 -0
  129. package/web/assets/room.js +437 -0
  130. package/web/assets/rooms/bindings.js +449 -0
  131. package/web/assets/rooms/ceramic-reflection.js +193 -0
  132. package/web/assets/rooms/ceramic-room.js +302 -0
  133. package/web/assets/rooms/door.js +35 -0
  134. package/web/assets/rooms/fairy-room.js +492 -0
  135. package/web/assets/rooms/furniture-assembly.js +113 -0
  136. package/web/assets/rooms/navigation.js +262 -0
  137. package/web/assets/rooms/placeholder-catalog.json +71 -0
  138. package/web/assets/rooms/placeholder-furniture.js +76 -0
  139. package/web/assets/rooms/placement.js +588 -0
  140. package/web/assets/rooms/reader.js +441 -0
  141. package/web/assets/rooms/reading-gate.js +157 -0
  142. package/web/assets/rooms/room-lighting.js +50 -0
  143. package/web/assets/rooms/templates.json +50 -0
  144. package/web/assets/rooms/walk-frame.js +64 -0
  145. package/web/assets/rooms/walk-session.js +138 -0
  146. package/web/assets/save-result.js +89 -0
  147. package/web/assets/screenshots/business.png +0 -0
  148. package/web/assets/screenshots/node-detail.png +0 -0
  149. package/web/assets/screenshots/project-home.png +0 -0
  150. package/web/assets/screenshots/workflow.png +0 -0
  151. package/web/assets/showcase.js +232 -0
  152. package/web/assets/style.css +836 -0
  153. package/web/assets/template.js +7 -0
  154. package/web/assets/theme.js +29 -0
  155. package/web/assets/three/OrbitControls.js +1972 -0
  156. package/web/assets/three/VERSION.md +12 -0
  157. package/web/assets/three/three.core.js +60586 -0
  158. package/web/assets/three/three.module.js +19719 -0
  159. package/web/assets/workspaces.css +21 -0
  160. package/web/assets/workspaces.js +81 -0
  161. package/web/building.html +131 -0
  162. package/web/business.html +43 -0
  163. package/web/furniture.html +47 -0
  164. package/web/index.html +57 -0
  165. package/web/read.html +107 -0
  166. package/web/room.html +146 -0
  167. package/web/showcase.html +50 -0
  168. package/web/workspaces.html +32 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 pioneer
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 ADDED
@@ -0,0 +1,98 @@
1
+ # SpecDev Workbench 0.2.1
2
+
3
+ English | [简体中文](README.zh.md)
4
+
5
+ Choose a DSH project, read business documents and workflows, or ask a bundled Skill to arrange an independent room for one business.
6
+
7
+ ## Download and install
8
+
9
+ ### npm channel (0.2.1 preparation; not published yet)
10
+
11
+ The npm package is `@pioneer_zmc/dsh-workbench`; the existing GitHub package remains `@specdev/dsh-workbench`. Product name, plugin ID, routes and data paths stay the same. Use these commands only after npm publication. See the verification boundaries below.
12
+
13
+ ### Windows Desktop
14
+
15
+ Save work, exit via the menu or tray, and confirm the background instance ended. Use the bundled Desktop CLI and the actual Desktop DSH_HOME; leave it unset if it was unset before. This example demonstrates a custom root only. CLI and Desktop must share the same root; the variable affects this terminal and its children only.
16
+
17
+ ~~~powershell
18
+ $DesktopDir = 'C:\Apps\DSH' # Replace with the actual installation directory
19
+ $env:DSH_HOME = 'C:\DSHData\desktop' # Custom-root example; existing users keep their actual root
20
+ & "$DesktopDir\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add '@pioneer_zmc/dsh-workbench@0.2.1' '--registry=https://registry.npmjs.org/'
21
+ & "$DesktopDir\DeepSeek Harness.exe"
22
+ ~~~
23
+
24
+ Before upgrading, record the installed package and custom plugin configuration. Remove only an actually installed package with the same bundled CLI's `plugin --profile desktop remove <installed-package>`: GitHub 0.2.x uses `@specdev/dsh-workbench`, earlier releases use `@specdev/dsh-archify-manage`, and npm uses `@pioneer_zmc/dsh-workbench`. Then add, verify the original custom configuration, and restart from the same environment. Do not install old and new packages together or clear data roots. Migration of every old version has not been tested.
25
+
26
+ The sidebar opens SpecDev Workbench in the central panel. Choose a project and use Return to chat to restore the conversation.
27
+
28
+ ### Web
29
+
30
+ Stop the corresponding instance and keep its original data root and Web CLI. Apply the same installed-package removal and configuration checks using the web profile.
31
+
32
+ ~~~sh
33
+ dsh plugin --profile web add @pioneer_zmc/dsh-workbench@0.2.1 --registry=https://registry.npmjs.org/
34
+ ~~~
35
+
36
+ Restart that Web instance. The sidebar opens a new tab with project names and full paths, preserving chat. Create a workspace and refresh an empty list; retry read failures. Both states retain manual configuration. This task does not create a second Web installation, so this command is not evidence of a tested Web install.
37
+
38
+ ### GitHub fallback (original package identity)
39
+
40
+ [Original-identity 0.2.1 package](https://github.com/pioneer666-user/specdev-workbench/releases/download/v0.2.1/specdev-dsh-workbench-0.2.1.tgz) · [Original Release](https://github.com/pioneer666-user/specdev-workbench/releases/tag/v0.2.1). Download to a path without spaces and use the appropriate profile's `plugin add <local-tgz-path>`. This existing asset remains `@specdev/dsh-workbench` and must not coexist with the new npm identity. The old [0.2.0 Release](https://github.com/pioneer666-user/specdev-workbench/releases/tag/v0.2.0) remains available.
41
+
42
+ ## Features
43
+
44
+ - One independent room per business: realistic or fairy base, overview and walking modes, indoor/outdoor passage.
45
+ - Twelve furniture assets and rendered thumbnails: bookshelf, desk, table lamp, notice board, display stand, vase, plant, book stack, bed, reading chair, low cabinet and floor lamp. Select items in the catalog and copy the list to your chat.
46
+ - Furniture with document capabilities can bind that business's registered documents and workflows. Reading pauses walking; closing resumes in place. Decorative assets do not promise sitting, sleeping, light switches or free drag placement.
47
+ - Project/business navigation, interactive workflows, node explanations, pinned source evidence and historical reading. Saving a version only adds an annotated Git tag to committed content.
48
+ - Whole-building overview and walking remain available. Three bundled skills: [specdev-business](skills/specdev-business/SKILL.md), [specdev-building](skills/specdev-building/SKILL.md), [specdev-room](skills/specdev-room/SKILL.md).
49
+
50
+ ## First use
51
+
52
+ 1. Select a DSH workspace at a Git repository root. Existing `docs/specdev` projects can be browsed directly. Otherwise agree business requirements with the AI and use specdev-business to register documents and workflows first.
53
+ 2. In that project's chat, say:
54
+
55
+ > Use specdev-room to create a room for this business.
56
+
57
+ The Skill guides business, style and arrangement choices, reads the current catalog, writes only `docs/specdev/<businessId>/room.json` and invokes the read-only validator. It does not generate models, business documents, new workflows or choose a default project.
58
+
59
+ 3. Open the sidebar entry, choose the project/business, enter the room, inspect the overview and read bound material while walking. Refresh after configuration changes.
60
+
61
+ The management UI only writes snapshot tags, without changing business files, branches or commits. Skills write project files only within your authorization.
62
+
63
+ ## Breaking changes from 0.1.x
64
+
65
+ Current npm package: `@pioneer_zmc/dsh-workbench`. Plugin/sidebar ID: `specdev-workbench`. Client module: `@pioneer_zmc/dsh-workbench/client`. Pages/APIs use `/specdev-workbench`; data uses `docs/specdev`, six formal `specdev/*/1` schemas, SpecDev building formats and `specdev/` snapshot tags. Old archify-maker/archify-house skills become specdev-business/specdev-building, with specdev-room added.
66
+
67
+ Only the new root, formats and tags are read. There is no automatic migration or old URL/skill alias; old bookmarks are not guaranteed. Old files and tags remain intact. Agree migration separately for each old project; do not bulk rename. Registered material can retain its original repository path.
68
+
69
+ ## Limits and verification
70
+
71
+ The new npm identity candidate still requires this task’s isolated loading check, independent review and publication. Its identity changes are not covered by the old GitHub package byte-equivalence claim; the remaining implementation reuses existing evidence.
72
+
73
+ No in-page furniture editing/saving, arbitrary scaling, wall placement, nested supports, jumping/stairs in independent rooms, cross-room links or sitting/sleeping animation. Floor placement and one level of tabletop support are supported; style is a soft recommendation. The CLI checks configuration, placement, bindings and registered material reading. Workflow checks stop at JSON syntax and do not prove diagram compilation/rendering.
74
+
75
+ The 0.2.1 candidate was verified on Windows / DSH Desktop 0.2.0-rc.2 for the central entry, project ownership, room reading, internal navigation and chat draft retention. The three skills were confirmed discoverable with readable bodies and references through the host’s normal viewer. The final release package changes only the READMEs; runtime files match that tested candidate, and the final package was not reinstalled. Existing Web installation/use evidence covers 0.2.0 on Windows / DSH 0.1.6-alpha.2. The 0.2.1 source entry passed its 12 relevant regression checks; a separate isolated newer Web host check covered 0.2.0-rc.2. This does not claim installation of the final 0.2.1 package on every Web host. Other platforms and later host versions are unverified. A separate DSH_HOME isolates plugin/business data; Electron preferences, caches, single-instance behavior and protocol registration may still be shared within the account.
76
+
77
+ ## Build and sample
78
+
79
+ Node.js ≥22. From this repository root, run sequentially:
80
+
81
+ ~~~sh
82
+ npm install
83
+ node node_modules/typescript/bin/tsc --noEmit
84
+ node scripts/build.mjs
85
+ npm pack --pack-destination .
86
+ ~~~
87
+
88
+ Produces `pioneer_zmc-dsh-workbench-0.2.1.tgz`. The renderer and read-only validators are bundled; no private research repository is needed.
89
+
90
+ ~~~sh
91
+ node sample/generate.mjs ./local-artifacts/demo-project
92
+ ~~~
93
+
94
+ The target must not exist. See [sample/README.md](sample/README.md), then open the generated directory as a DSH workspace. Optional checks `node scripts/smoke.mjs` and `node scripts/check-save.mjs` run serially in generated samples without using your business project.
95
+
96
+ ## License and acknowledgments
97
+
98
+ Plugin code, twelve self-created furniture models, generated textures and rendered thumbnails use [MIT](LICENSE). See [furniture sources](web/assets/furniture/SOURCES.md). Bundled [Archify license](vendor/archify-renderer/archify/LICENSE), [third-party notices](vendor/archify-renderer/archify/THIRD_PARTY_NOTICES.md) and [Three.js provenance](web/assets/three/VERSION.md) retain upstream attribution. Thanks to DSH and the upstream projects.
package/README.zh.md ADDED
@@ -0,0 +1,100 @@
1
+ # SpecDev 工作台 0.2.1
2
+
3
+ 简体中文 | [English](README.md)
4
+
5
+ 在 DSH 中选择项目,浏览业务、资料与流程图,也可以用 Skill 为一个业务布置能行走、能读资料的独立房间。
6
+
7
+ ## 下载与安装
8
+
9
+ ### npm 渠道(0.2.1 发布准备,尚未发布)
10
+
11
+ 新 npm 包名为 `@pioneer_zmc/dsh-workbench`,旧 GitHub 包名为 `@specdev/dsh-workbench`。产品名称、插件 ID、页面地址和数据路径不变。下面命令须在 npm 正式发布后使用;本轮安装/加载证据及未验证边界见末尾说明。
12
+
13
+ ### Windows 桌面
14
+
15
+ 先保存任务,从菜单或托盘正常退出并确认后台实例结束。使用桌面随包 CLI,沿用桌面实际 DSH_HOME;原来未设置就保持未设置,不为安装切换数据根。下面只演示自选根;CLI 与桌面必须使用同一个根,此变量只影响当前终端及子进程。
16
+
17
+ ~~~powershell
18
+ $DesktopDir = 'C:\Apps\DSH' # 替换为实际桌面安装目录
19
+ $env:DSH_HOME = 'C:\DSHData\desktop' # 仅自选根示例;已有用户沿用实际根
20
+ & "$DesktopDir\resources\runtime\cli\bin\dsh.cmd" plugin --profile desktop add '@pioneer_zmc/dsh-workbench@0.2.1' '--registry=https://registry.npmjs.org/'
21
+ & "$DesktopDir\DeepSeek Harness.exe"
22
+ ~~~
23
+
24
+ 升级前记录原包名及自定义插件配置。仅对实际安装的包执行同一随包命令的 `plugin --profile desktop remove <原包名>`:旧 GitHub 0.2.x 为 `@specdev/dsh-workbench`,更早身份为 `@specdev/dsh-archify-manage`;已有 npm 包为 `@pioneer_zmc/dsh-workbench`。移除后再 add,核对原自定义配置并从同一环境重启。不同时安装新旧包,不清空数据根,不承诺所有旧版本已实测无损迁移。
25
+
26
+ 侧栏「SpecDev 工作台」在中央面板展开,选择项目后进入业务,使用「返回聊天」回到原会话。
27
+
28
+ ### Web
29
+
30
+ 停止对应实例,沿用原数据根和 Web CLI;旧包移除及配置核对要求同上,profile 使用 web。
31
+
32
+ ~~~sh
33
+ dsh plugin --profile web add @pioneer_zmc/dsh-workbench@0.2.1 --registry=https://registry.npmjs.org/
34
+ ~~~
35
+
36
+ 安装后重启对应 Web 实例。侧栏「SpecDev 工作台 ↗」在新标签列出项目名称和完整路径,原聊天保留。空清单先回 DSH 创建工作区并刷新;读取失败可重试,均保留手动配置入口。本轮不另建 Web 安装环境,以上命令不作为 Web 实装通过证据。
37
+
38
+ ### GitHub 备用下载(原身份包)
39
+
40
+ [旧身份0.2.1安装包](https://github.com/pioneer666-user/specdev-workbench/releases/download/v0.2.1/specdev-dsh-workbench-0.2.1.tgz) · [原Release](https://github.com/pioneer666-user/specdev-workbench/releases/tag/v0.2.1)。下载至无空格路径,用对应 profile 的 `plugin add <本地tgz路径>` 安装;此旧附件仍是 `@specdev/dsh-workbench`,不能与 npm 新身份包并存。旧0.2.0 [Release](https://github.com/pioneer666-user/specdev-workbench/releases/tag/v0.2.0) 保留。
41
+
42
+ ## 本版能力
43
+
44
+ - 一个业务的独立房间:写实/童话两种底座,总览/行走双视角,门内外通行。
45
+ - 十二款家具与真实缩略图图鉴:书架、书桌、台灯、告示牌、展示台、花瓶、盆栽、书堆、床、阅读椅、矮柜、落地灯;图鉴勾选后复制清单回聊天。
46
+ - 具备资料能力的家具可绑定当前业务已登记的文档和流程图;阅读时暂停行走,关闭后原位恢复。其他家具是摆设,不承诺坐卧、灯光开关或任意拖摆。
47
+ - 项目/业务目录、交互流程图、节点说明和固定提交源码证据;版本条回看历史,保存版本只为已提交内容添加附注Git标签。
48
+ - 保留整栋建筑总览与行走。三份Skill:[specdev-business](skills/specdev-business/SKILL.md)、[specdev-building](skills/specdev-building/SKILL.md)、[specdev-room](skills/specdev-room/SKILL.md)。
49
+
50
+ ## 第一次使用
51
+
52
+ 1. 在DSH选择Git仓库顶层工作区。已有 `docs/specdev` 项目可直接浏览;没有业务资料时,先与AI确认业务,再用specdev-business登记说明和流程图。
53
+ 2. 在该项目会话里说:
54
+
55
+ > 用 specdev-room,为这个业务建一个房间。
56
+
57
+ Skill会引导确认业务、风格与布置方式,读取当前家具目录,写唯一 `docs/specdev/<业务ID>/room.json` 并调用只读校验。它不替你生成模型、业务正文或新流程图,也不默认一个项目。
58
+
59
+ 3. 点侧栏工作台,选择项目和业务,进入房间;总览中看布局,行走中阅读已绑定资料。配置修改后刷新页面。
60
+
61
+ 管理页面唯一写操作是保存快照标签,不改业务文件、分支或提交;AI技能只在你的授权范围内写项目文件。
62
+
63
+ ## 0.1.x升级边界
64
+
65
+ 现行 npm 包 `@pioneer_zmc/dsh-workbench`,插件/侧栏ID `specdev-workbench`,客户端模块 `@pioneer_zmc/dsh-workbench/client`。页面和API前缀改为 `/specdev-workbench`,资料根为 `docs/specdev`,六类正式schema为 `specdev/*/1`,建筑格式及快照标签也改为SpecDev命名。旧技能archify-maker/archify-house改为specdev-business/specdev-building,新加specdev-room。
66
+
67
+ 只读新根、新格式和新标签,不自动迁移旧项目,不保证旧书签可用,不注册旧URL或技能别名;旧数据和标签保留。每个旧项目需另行约定迁移,不能直接批量改名。已登记资料路径可继续指向仓库内原位置。
68
+
69
+ ## 限制与验证
70
+
71
+ npm 新身份候选尚待本轮隔离加载、独立审查及正式发布;其必要身份修改不能套用旧 GitHub 包的全字节一致结论。其余实现复用既有验收。
72
+
73
+ 不支持页内家具编辑/保存、任意缩放、墙挂、嵌套承载、跳跃上下楼、跨房连接或坐卧动画。支持地面摆放及一层桌面承载,风格是软推荐。CLI核对配置、摆放、绑定和登记资料读取;流程图只读到JSON语法,不等于图编译/渲染验证。
74
+
75
+ 0.2.1候选已在 Windows / DSH Desktop 0.2.0-rc.2 验收中央入口、项目归属、房间阅读、内部导航和聊天草稿保留;三技能通过宿主正常查看入口确认可发现、正文及参考文件可读。最终发布包仅README变化,运行文件与该实测候选相同,未重新安装最终包。Web既有真实安装/使用覆盖0.2.0发布包、Windows / DSH 0.1.6-alpha.2;0.2.1源码入口相关单档回归12项通过,另有新版Web宿主0.2.0-rc.2隔离验证,不能据此宣称0.2.1最终包已在所有Web宿主安装。其他平台及后续宿主版本未验证。独立DSH_HOME隔离插件/业务数据,同账户Electron偏好、缓存、单实例及协议仍可能共用。
76
+
77
+ ## 源码构建与示例
78
+
79
+ Node.js ≥22。在本仓库根目录依次运行:
80
+
81
+ ~~~sh
82
+ npm install
83
+ node node_modules/typescript/bin/tsc --noEmit
84
+ node scripts/build.mjs
85
+ npm pack --pack-destination .
86
+ ~~~
87
+
88
+ 生成 `pioneer_zmc-dsh-workbench-0.2.1.tgz`。渲染器及只读校验已随包,不依赖外部研究仓。
89
+
90
+ ~~~sh
91
+ node sample/generate.mjs ./local-artifacts/demo-project
92
+ ~~~
93
+
94
+ 目标目录必须不存在;示例说明见 [sample/README.md](sample/README.md)。将生成目录作为DSH工作区打开。
95
+
96
+ 可按需串行运行 `node scripts/smoke.mjs`、`node scripts/check-save.mjs`,会创建独立示例,不操作你的项目。
97
+
98
+ ## 许可与致谢
99
+
100
+ 插件及十二款自制家具的模型、生成纹理、渲染缩略图采用 [MIT](LICENSE),家具逐项来源见 [SOURCES](web/assets/furniture/SOURCES.md)。保留 [Archify许可证](vendor/archify-renderer/archify/LICENSE)、[第三方声明](vendor/archify-renderer/archify/THIRD_PARTY_NOTICES.md) 与 [Three.js版本来源](web/assets/three/VERSION.md)。感谢DSH插件宿主及上游项目。
package/client.js ADDED
@@ -0,0 +1,122 @@
1
+ // Web 保留新标签入口;桌面用宿主中央面板承载同一项目选择页。
2
+ window.__ModuleLoader__.load({
3
+ id: '@pioneer_zmc/dsh-workbench/client',
4
+ factory(require) {
5
+ const React = require('react')
6
+ const desktop = window.location?.protocol === 'dsh-app:' && window.location?.hostname === 'app'
7
+ const entryStyle = { display: 'block', padding: '8px', width: '100%', color: 'inherit', textDecoration: 'none' }
8
+ return {
9
+ inject: desktop ? ['slots', 'layout'] : ['slots'],
10
+ apply(ctx) {
11
+ let panelRegistered = false
12
+ const panelStops = new Set()
13
+ const panelAvailable = () => panelRegistered && typeof ctx.layout?.selectPanel === 'function'
14
+ const unavailable = (error) => `工作台入口无法使用:${error?.message || '宿主面板方法不可用'}。`
15
+
16
+ function ManageEntry() {
17
+ const [error, setError] = React.useState('')
18
+ if (!desktop) return React.createElement('a', {
19
+ href: '/specdev-workbench/workspaces', target: '_blank', rel: 'noopener',
20
+ title: 'SpecDev 工作台', 'aria-label': 'SpecDev 工作台', style: entryStyle,
21
+ }, 'SpecDev 工作台 ↗')
22
+ return React.createElement(React.Fragment, null,
23
+ React.createElement('button', {
24
+ type: 'button', title: 'SpecDev 工作台', 'aria-label': 'SpecDev 工作台',
25
+ style: { ...entryStyle, background: 'none', border: 0, textAlign: 'left', cursor: 'pointer' },
26
+ onClick() {
27
+ try {
28
+ if (!panelAvailable()) throw new Error('宿主面板方法不可用')
29
+ ctx.layout.selectPanel('specdev-workbench')
30
+ setError('')
31
+ } catch (cause) { setError(unavailable(cause)) }
32
+ },
33
+ }, 'SpecDev 工作台'),
34
+ error && React.createElement('p', { role: 'alert' }, error))
35
+ }
36
+
37
+ function WorkbenchPanel() {
38
+ const frameRef = React.useRef(null)
39
+ const [error, setError] = React.useState('')
40
+ React.useLayoutEffect(() => {
41
+ const frame = frameRef.current
42
+ let active = true
43
+ let detachDocument = () => {}
44
+ const sameAuthority = (url) => url.protocol === window.location.protocol
45
+ && url.hostname === window.location.hostname && url.port === window.location.port
46
+ && url.username === '' && url.password === ''
47
+ const internalPath = (url) => url.pathname === '/specdev-workbench'
48
+ || url.pathname.startsWith('/specdev-workbench/')
49
+ const onLoad = () => {
50
+ if (!active) return
51
+ detachDocument()
52
+ detachDocument = () => {}
53
+ try {
54
+ const doc = frame.contentDocument
55
+ if (!doc) throw new Error('无法访问工作台页面')
56
+ const current = new URL(doc.defaultView.location.href)
57
+ if (!sameAuthority(current) || !internalPath(current)) throw new Error('工作台页面来源不符合要求')
58
+ const onClick = (event) => {
59
+ if (!active || event.defaultPrevented || event.button !== 0
60
+ || event.ctrlKey || event.metaKey || event.shiftKey || event.altKey) return
61
+ try {
62
+ if (frame.contentDocument !== doc) return // 换文档到 load 之间的旧事件也无效。
63
+ const target = event.target?.nodeType === 3 ? event.target.parentElement : event.target
64
+ const link = target?.closest?.('a[href]')
65
+ if (!link || link.hasAttribute('download')) return
66
+ const url = new URL(link.href, doc.baseURI)
67
+ if (!sameAuthority(url) || !internalPath(url)) return
68
+ event.preventDefault()
69
+ frame.contentWindow.location.assign(url.href)
70
+ } catch (cause) { if (active) setError(unavailable(cause)) }
71
+ }
72
+ doc.addEventListener('click', onClick)
73
+ detachDocument = () => { doc.removeEventListener('click', onClick) }
74
+ setError('')
75
+ } catch (cause) { if (active) setError(unavailable(cause)) }
76
+ }
77
+ frame.addEventListener('load', onLoad)
78
+ const stop = () => {
79
+ if (!active) return
80
+ active = false
81
+ frame.removeEventListener('load', onLoad)
82
+ detachDocument()
83
+ panelStops.delete(stop)
84
+ }
85
+ panelStops.add(stop)
86
+ return stop
87
+ }, [])
88
+ return React.createElement('section', {
89
+ 'aria-label': 'SpecDev 工作台',
90
+ style: { display: 'flex', flexDirection: 'column', height: '100%', minHeight: 0, overflow: 'hidden' },
91
+ },
92
+ React.createElement('div', { style: { flexShrink: 0, padding: '8px', paddingInlineStart: 'max(8px, var(--dsh-frame-leading-clearance, 0px))' } },
93
+ React.createElement('button', {
94
+ type: 'button', onClick() {
95
+ try {
96
+ if (!panelAvailable()) throw new Error('宿主面板方法不可用')
97
+ ctx.layout.selectPanel(null)
98
+ } catch (cause) { setError(unavailable(cause)) }
99
+ },
100
+ }, '返回聊天'),
101
+ error && React.createElement('p', { role: 'alert' }, error)),
102
+ React.createElement('iframe', {
103
+ ref: frameRef, src: '/specdev-workbench/workspaces', title: 'SpecDev 项目选择与资料阅读',
104
+ style: { flex: 1, minHeight: 0, width: '100%', border: 0 },
105
+ }))
106
+ }
107
+
108
+ if (desktop) ctx.slots.inject('main', () => {
109
+ const unregister = ctx.slots.register({ name: 'main', key: 'specdev-workbench' }, WorkbenchPanel)
110
+ panelRegistered = true
111
+ return () => {
112
+ panelRegistered = false
113
+ for (const stop of [...panelStops]) stop()
114
+ unregister()
115
+ }
116
+ })
117
+ ctx.slots.inject('sidebar.footer.action', () =>
118
+ ctx.slots.register({ name: 'sidebar.footer.action', id: 'specdev-workbench', order: 100 }, ManageEntry))
119
+ },
120
+ }
121
+ },
122
+ })
@@ -0,0 +1,8 @@
1
+ # 本组合包贡献的插件行。repoRoot 默认未配置(空串):插件正常加载,
2
+ # 页面给出配置指引;用户在自己 profile 的 cordis.patch.yml 里按 id 覆盖本行
3
+ # (需重述该行全部键),保存后重启 DSH 生效。
4
+ - insert:
5
+ - id: specdev-workbench
6
+ name: '@pioneer_zmc/dsh-workbench'
7
+ config:
8
+ repoRoot: ''