@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.
- package/LICENSE +21 -0
- package/README.md +98 -0
- package/README.zh.md +100 -0
- package/client.js +122 -0
- package/cordis.patch.yml +8 -0
- package/dist/check-building.js +1669 -0
- package/dist/check-room.js +980 -0
- package/dist/index.js +2873 -0
- package/package.json +60 -0
- package/skills/specdev-building/SKILL.md +85 -0
- package/skills/specdev-building/assets/layouts/court.json +53 -0
- package/skills/specdev-building/assets/layouts/row.json +48 -0
- package/skills/specdev-building/assets/layouts/single.json +27 -0
- package/skills/specdev-building/assets/layouts/tower-9.json +71 -0
- package/skills/specdev-building/assets/layouts/tower.json +59 -0
- package/skills/specdev-building/references/blueprint-contract.md +126 -0
- package/skills/specdev-building/references/diagnostics.md +101 -0
- package/skills/specdev-building/references/layouts.md +112 -0
- package/skills/specdev-business/SKILL.md +91 -0
- package/skills/specdev-business/assets/plan-template.md +66 -0
- package/skills/specdev-business/assets/spec-template.md +111 -0
- package/skills/specdev-business/assets/tasks-template.md +36 -0
- package/skills/specdev-business/references/change.md +117 -0
- package/skills/specdev-business/references/evidence-review.md +125 -0
- package/skills/specdev-business/references/implementation.md +67 -0
- package/skills/specdev-business/references/project-contract.md +211 -0
- package/skills/specdev-business/references/source-map.md +110 -0
- package/skills/specdev-business/references/specification.md +93 -0
- package/skills/specdev-business/references/workflow.md +126 -0
- package/skills/specdev-room/SKILL.md +77 -0
- package/skills/specdev-room/assets/intro-room.json +14 -0
- package/skills/specdev-room/references/diagnostics.md +21 -0
- package/skills/specdev-room/references/room-contract.md +59 -0
- package/vendor/archify-renderer/VERSION.md +52 -0
- package/vendor/archify-renderer/archify/LICENSE +22 -0
- package/vendor/archify-renderer/archify/THIRD_PARTY_NOTICES.md +56 -0
- package/vendor/archify-renderer/archify/assets/template.html +14787 -0
- package/vendor/archify-renderer/archify/bin/archify.mjs +1990 -0
- package/vendor/archify-renderer/archify/renderers/shared/brand-marks.mjs +563 -0
- package/vendor/archify-renderer/archify/renderers/shared/cli.mjs +218 -0
- package/vendor/archify-renderer/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/vendor/archify-renderer/archify/renderers/shared/diagnostics.mjs +127 -0
- package/vendor/archify-renderer/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/vendor/archify-renderer/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/vendor/archify-renderer/archify/renderers/shared/generated-validators.mjs +13 -0
- package/vendor/archify-renderer/archify/renderers/shared/geometry.mjs +1423 -0
- package/vendor/archify-renderer/archify/renderers/shared/i18n.mjs +594 -0
- package/vendor/archify-renderer/archify/renderers/shared/legend.mjs +217 -0
- package/vendor/archify-renderer/archify/renderers/shared/output-path.mjs +321 -0
- package/vendor/archify-renderer/archify/renderers/shared/repository-evidence.mjs +235 -0
- package/vendor/archify-renderer/archify/renderers/shared/text-fit.mjs +49 -0
- package/vendor/archify-renderer/archify/renderers/shared/utils.mjs +232 -0
- package/vendor/archify-renderer/archify/renderers/shared/validator.mjs +86 -0
- package/vendor/archify-renderer/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/vendor/archify-renderer/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/vendor/archify-renderer/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/vendor/archify-renderer/archify/schemas/common.schema.json +115 -0
- package/vendor/archify-renderer/archify/schemas/workflow.schema.json +428 -0
- package/vendor/archify-renderer/archify/scripts/check-render-output.mjs +835 -0
- package/vendor/archify-renderer/shims/process.mjs +18 -0
- package/vendor/archify-renderer/stubs/child_process.mjs +2 -0
- package/vendor/archify-renderer/stubs/crypto.mjs +3 -0
- package/vendor/archify-renderer/stubs/dns-promises.mjs +2 -0
- package/vendor/archify-renderer/stubs/fs.mjs +3 -0
- package/vendor/archify-renderer/stubs/http.mjs +3 -0
- package/vendor/archify-renderer/stubs/https.mjs +3 -0
- package/vendor/archify-renderer/stubs/net.mjs +3 -0
- package/vendor/archify-renderer/stubs/path.mjs +3 -0
- package/vendor/archify-renderer/stubs/url.mjs +3 -0
- package/web/assets/building-kit.js +1157 -0
- package/web/assets/building-look.js +185 -0
- package/web/assets/building-plan.js +495 -0
- package/web/assets/building-scene.js +529 -0
- package/web/assets/building-walk.js +248 -0
- package/web/assets/building.js +859 -0
- package/web/assets/business.js +124 -0
- package/web/assets/chart-link.js +165 -0
- package/web/assets/common.js +302 -0
- package/web/assets/details.js +197 -0
- package/web/assets/evidence.js +30 -0
- package/web/assets/furniture/SOURCES.md +24 -0
- package/web/assets/furniture/assets/ceramic-display-stand-01/asset.json +25 -0
- package/web/assets/furniture/assets/ceramic-display-stand-01/model.js +116 -0
- package/web/assets/furniture/assets/ceramic-display-stand-01/preview.webp +0 -0
- package/web/assets/furniture/assets/ceramic-floor-lamp-01/asset.json +61 -0
- package/web/assets/furniture/assets/ceramic-floor-lamp-01/model.js +56 -0
- package/web/assets/furniture/assets/ceramic-floor-lamp-01/preview.webp +0 -0
- package/web/assets/furniture/assets/ceramic-low-cabinet-01/asset.json +81 -0
- package/web/assets/furniture/assets/ceramic-low-cabinet-01/model.js +67 -0
- package/web/assets/furniture/assets/ceramic-low-cabinet-01/preview.webp +0 -0
- package/web/assets/furniture/assets/ceramic-vase-01/asset.json +21 -0
- package/web/assets/furniture/assets/ceramic-vase-01/model.js +119 -0
- package/web/assets/furniture/assets/ceramic-vase-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-bed-01/asset.json +61 -0
- package/web/assets/furniture/assets/fairy-bed-01/model.js +63 -0
- package/web/assets/furniture/assets/fairy-bed-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-book-stack-01/asset.json +21 -0
- package/web/assets/furniture/assets/fairy-book-stack-01/model.js +71 -0
- package/web/assets/furniture/assets/fairy-book-stack-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-bookshelf-01/asset.json +32 -0
- package/web/assets/furniture/assets/fairy-bookshelf-01/model.js +168 -0
- package/web/assets/furniture/assets/fairy-bookshelf-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-desk-01/asset.json +25 -0
- package/web/assets/furniture/assets/fairy-desk-01/model.js +132 -0
- package/web/assets/furniture/assets/fairy-desk-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-notice-board-01/asset.json +23 -0
- package/web/assets/furniture/assets/fairy-notice-board-01/model.js +125 -0
- package/web/assets/furniture/assets/fairy-notice-board-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-potted-plant-01/asset.json +21 -0
- package/web/assets/furniture/assets/fairy-potted-plant-01/model.js +128 -0
- package/web/assets/furniture/assets/fairy-potted-plant-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-reading-chair-01/asset.json +61 -0
- package/web/assets/furniture/assets/fairy-reading-chair-01/model.js +66 -0
- package/web/assets/furniture/assets/fairy-reading-chair-01/preview.webp +0 -0
- package/web/assets/furniture/assets/fairy-table-lamp-01/asset.json +21 -0
- package/web/assets/furniture/assets/fairy-table-lamp-01/model.js +182 -0
- package/web/assets/furniture/assets/fairy-table-lamp-01/preview.webp +0 -0
- package/web/assets/furniture/catalog.js +137 -0
- package/web/assets/furniture/index.json +110 -0
- package/web/assets/furniture/registry.js +72 -0
- package/web/assets/furniture-page.css +68 -0
- package/web/assets/furniture-page.js +302 -0
- package/web/assets/home.js +65 -0
- package/web/assets/node-detail.js +148 -0
- package/web/assets/panel-link.js +47 -0
- package/web/assets/read.js +746 -0
- package/web/assets/room-scene.js +386 -0
- package/web/assets/room.css +287 -0
- package/web/assets/room.js +437 -0
- package/web/assets/rooms/bindings.js +449 -0
- package/web/assets/rooms/ceramic-reflection.js +193 -0
- package/web/assets/rooms/ceramic-room.js +302 -0
- package/web/assets/rooms/door.js +35 -0
- package/web/assets/rooms/fairy-room.js +492 -0
- package/web/assets/rooms/furniture-assembly.js +113 -0
- package/web/assets/rooms/navigation.js +262 -0
- package/web/assets/rooms/placeholder-catalog.json +71 -0
- package/web/assets/rooms/placeholder-furniture.js +76 -0
- package/web/assets/rooms/placement.js +588 -0
- package/web/assets/rooms/reader.js +441 -0
- package/web/assets/rooms/reading-gate.js +157 -0
- package/web/assets/rooms/room-lighting.js +50 -0
- package/web/assets/rooms/templates.json +50 -0
- package/web/assets/rooms/walk-frame.js +64 -0
- package/web/assets/rooms/walk-session.js +138 -0
- package/web/assets/save-result.js +89 -0
- package/web/assets/screenshots/business.png +0 -0
- package/web/assets/screenshots/node-detail.png +0 -0
- package/web/assets/screenshots/project-home.png +0 -0
- package/web/assets/screenshots/workflow.png +0 -0
- package/web/assets/showcase.js +232 -0
- package/web/assets/style.css +836 -0
- package/web/assets/template.js +7 -0
- package/web/assets/theme.js +29 -0
- package/web/assets/three/OrbitControls.js +1972 -0
- package/web/assets/three/VERSION.md +12 -0
- package/web/assets/three/three.core.js +60586 -0
- package/web/assets/three/three.module.js +19719 -0
- package/web/assets/workspaces.css +21 -0
- package/web/assets/workspaces.js +81 -0
- package/web/building.html +131 -0
- package/web/business.html +43 -0
- package/web/furniture.html +47 -0
- package/web/index.html +57 -0
- package/web/read.html +107 -0
- package/web/room.html +146 -0
- package/web/showcase.html +50 -0
- package/web/workspaces.html +32 -0
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pioneer_zmc/dsh-workbench",
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"description": "SpecDev 工作台:浏览业务说明、流程图、建筑与独立房间,按 Git 附注标签阅读和登记历史版本;插件页面唯一写操作是给提交挂附注标签,不改业务项目的文件、分支与提交。",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./client": "./client.js",
|
|
11
|
+
"./package.json": "./package.json"
|
|
12
|
+
},
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"web",
|
|
16
|
+
"vendor",
|
|
17
|
+
"skills",
|
|
18
|
+
"client.js",
|
|
19
|
+
"cordis.patch.yml",
|
|
20
|
+
"README.zh.md"
|
|
21
|
+
],
|
|
22
|
+
"dsh": {
|
|
23
|
+
"bundle": {
|
|
24
|
+
"patch": "./cordis.patch.yml"
|
|
25
|
+
},
|
|
26
|
+
"client": {
|
|
27
|
+
"platform": "web",
|
|
28
|
+
"inject": [
|
|
29
|
+
"@deepseek-ai/dsh-client-ui-sidebar"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"scripts": {
|
|
34
|
+
"typecheck": "tsc --noEmit",
|
|
35
|
+
"build": "node scripts/build.mjs",
|
|
36
|
+
"pack:tgz": "npm run typecheck && npm run build && npm pack --pack-destination ."
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/node": "26.5.1",
|
|
40
|
+
"esbuild": "0.28.2",
|
|
41
|
+
"typescript": "7.0.2"
|
|
42
|
+
},
|
|
43
|
+
"pnpm": {
|
|
44
|
+
"onlyBuiltDependencies": [
|
|
45
|
+
"esbuild"
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"registry": "https://registry.npmjs.org/",
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"repository": {
|
|
53
|
+
"type": "git",
|
|
54
|
+
"url": "git+https://github.com/pioneer666-user/specdev-workbench.git"
|
|
55
|
+
},
|
|
56
|
+
"homepage": "https://github.com/pioneer666-user/specdev-workbench#readme",
|
|
57
|
+
"bugs": {
|
|
58
|
+
"url": "https://github.com/pioneer666-user/specdev-workbench/issues"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: specdev-building
|
|
3
|
+
description: 在需要为某个已有 SpecDev 业务清单的项目生成或重建数字房蓝图时使用:读 docs/specdev 的项目与全部业务,按已有四种户型为每个业务安排房间,写出唯一的 docs/specdev/building.json,再用建筑诊断命令行逐项修正后交作者进房验收。也用于按作者要求调整项目级整栋 building.json 的房间数量、尺寸或户型;独立房间、家具及 room.json 用 specdev-room。写业务规格文档、workflow 图与节点详情用 specdev-business;业务关系(管道)、源码逆向推断业务、发明新房型、替作者决定业务取舍或面积分档都不在本技能范围。纯讨论、普通问答和只读审查不触发本技能。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SpecDev Building(建筑布置)
|
|
7
|
+
|
|
8
|
+
把**项目清单**变成**一栋能走进去的房子**:产出唯一一个文件 `docs/specdev/building.json`(建筑蓝图)。本文件是入口,只管顺序、纪律和交付边界;字段、户型算术、诊断修法在各参考文件里,按需读取,不在此重复。
|
|
9
|
+
|
|
10
|
+
房子的内容(项目名、业务名、业务介绍、资料目录、门牌上的字)**不写在蓝图里**——由插件从项目清单注入。蓝图只安排空间:楼层、房间、门窗、楼梯、屋顶、入口。
|
|
11
|
+
|
|
12
|
+
## 适用范围
|
|
13
|
+
|
|
14
|
+
- **用本技能**:为已有 `docs/specdev/project.json` 与业务目录的项目建房,或按作者要求调整已有项目级整栋 building.json(加/减房间、改尺寸、换户型);独立房间底座选择、家具布置和 room.json 交 specdev-room。
|
|
15
|
+
- **不做的**:业务关系与管道界面;读源码推断业务重要性;发明样板之外的新户型;替作者决定业务取舍(哪个业务该在清单里)与面积分档;补清单缺件(缺 `project.json`/`business.json` 指向 `specdev-business` 或作者);改插件代码与生成器。
|
|
16
|
+
- **纯讨论交方案**:作者问"有没有办法/有什么建议"时交付方案,不动手。
|
|
17
|
+
|
|
18
|
+
## 唯一产物与边界
|
|
19
|
+
|
|
20
|
+
1. 只写 `docs/specdev/building.json` 一个文件,不新建、不改动清单里的任何其它文件。
|
|
21
|
+
2. **改已有蓝图按授权走**:作者已经明确要求加房、改尺寸或换户型时,按授权范围直接改,并在报告里写明改了哪几处;**没有**这类明确要求而要重建或覆盖别人的蓝图时,先给方案等作者裁决。
|
|
22
|
+
3. 蓝图里不写项目名、业务名、介绍、资料路径——那是清单的事,写进来只会与清单打架。
|
|
23
|
+
4. 不代作者声明实现状态:`implementation: present`、`tests: passed`、`acceptance: passed` 都要有真实出处,否则留默认(样板的 `construction` 块就是安全默认)。
|
|
24
|
+
|
|
25
|
+
## 主流程(按序执行)
|
|
26
|
+
|
|
27
|
+
1. **确认目标**:项目仓库根(必须是 Git 仓库顶层)与分支状态。工作区标识不是开工前置,也**不是本技能能自己查到的信息**(它只出现在作者从 DSH 侧栏进管理页的链接里),只在交付页面入口时用到,见"交付报告"第 5 条。
|
|
28
|
+
2. **勘察清单**:读 `docs/specdev/project.json` 和每个 `docs/specdev/<业务>/business.json`,列出「业务 id/名称/一句话职责/资料数(文档 × 图)」。
|
|
29
|
+
- **资料数怎么数**(与插件清单同一口径,不要另立数法):**文档数**=该业务 `business.json` 的 `docs` 数组里非空字符串的条数;**图数**=该业务目录下的**子目录个数**(目录名就是图编号,`chart.json` 缺失或坏也照样算一张,只是诊断会另报 `MATERIAL_UNREADABLE`)。全部业务的「文档+图」之和=诊断输出里的「资料入口 N 条」,拿它对数。
|
|
30
|
+
- 清单缺件、`business.json` 坏、业务目录名含中文或其它写不进蓝图的字符(**业务 id 就是业务目录名**,而蓝图的 `businessId` 只接受 `^[A-Za-z0-9][A-Za-z0-9._-]*$`)→ **停下报告**,不自己补、不自造业务 id。
|
|
31
|
+
3. **定户型**:按下方选型规则挑一份样板,说明理由(作者可否决)。
|
|
32
|
+
4. **出设计表**:业务 → 房间 id → 面积档 → 所在层。房间 id 由业务 id **归一化**得到(转小写、`.`/`_` 换成 `-`、加 `room-` 前缀);**不要直接拿 `businessId` 当房间 id**(业务 id 允许大写和点,蓝图 id 不允许);归一化后若重名(如 `a.b` 与 `a-b`)就在后一个上加 `-2`/`-3`,保证全文件唯一。房间排列用**清单顺序**=`docs/specdev/` 下业务目录名的字典序(`row` 一族从西到东、`tower` 按它分层),作者另有指定时从作者并在报告里写明。**面积档只写在报告里**——蓝图没有档位字段,档位不落盘。
|
|
33
|
+
5. **写蓝图**:以样板为骨架,照抄结构、按递推表改数量与坐标(见 [layouts.md](references/layouts.md))。风格取下方选型表的"风格"列;`defaults`/`prototype`/`wallType`/`accent` 这些可选字段**默认不写**——省略就是取契约里的缺省值,**显式写出与缺省相同的值才是等价的**;**改值就会改几何**(墙厚、楼板厚参与构件尺寸与楼层净空,门高参与门洞与漫游落点),别凭空填(取值范围见 [blueprint-contract.md](references/blueprint-contract.md))。字段与取值按契约核对一遍再落盘。
|
|
34
|
+
6. **跑诊断**,按码逐项修:
|
|
35
|
+
```
|
|
36
|
+
node "<插件包根>/dist/check-building.js" <项目仓库根>
|
|
37
|
+
```
|
|
38
|
+
退出码 `0` 通过(可含 warning)、`1` 有 error、`2` 读不了。每条 error 都带 `subject.path` 与「修复方向」;按 [diagnostics.md](references/diagnostics.md) 改,**一轮只修一类**,改完用同一条命令重跑。**同一问题两轮修不成**:停下,交证据与疑点给作者。
|
|
39
|
+
7. **交付报告**(固定格式,见下),交作者进房验收。
|
|
40
|
+
|
|
41
|
+
## 选型规则(区间不重叠;样板的业务 id 是演示值,必须逐个替换)
|
|
42
|
+
|
|
43
|
+
| 业务数 | 户型 | 风格 | 说明 |
|
|
44
|
+
|---|---|---|---|
|
|
45
|
+
| 0 | **不建房** | — | 清单里没有业务目录:停下报告并指向 `specdev-business`;确实要空院子由作者明确要求 |
|
|
46
|
+
| 1 | `single` 一间房+前庭 | `warm-modern` | 不需要走廊——门直接开向前庭 |
|
|
47
|
+
| 2 | `row` 两间房+走廊+前庭 | `warm-modern` | 同一套递推,房间宽度可放宽 |
|
|
48
|
+
| 3–8 | `row` 一排房+走廊+前庭 | `warm-modern` | 默认 |
|
|
49
|
+
| 9–16 | `tower` 两层 | `warm-modern` | 每层 ≤8 间,按清单顺序前 ⌈N/2⌉ 间放一层 |
|
|
50
|
+
| >16 | **停下问作者** | — | 两层最多 16 间,超出 v1 户型能力 |
|
|
51
|
+
| 4–10 任意 | `court` 合院 | `chinese-timber` | 只在作者指定"要中庭/围合"时用,不参与自动选型 |
|
|
52
|
+
|
|
53
|
+
**风格只有两个取值**(`warm-modern`/`chinese-timber`),只影响配色与构件材质,**不影响布局、几何与诊断**;上表就是各户型样板的同款写法。作者另有指定时按作者指定,并在报告里写明。
|
|
54
|
+
|
|
55
|
+
要因场地或观感改选,在报告里说明理由,由作者确认或否决。
|
|
56
|
+
|
|
57
|
+
## 三条底线
|
|
58
|
+
|
|
59
|
+
1. **面积档由作者定**:默认全部基础档,交付报告逐间标"待作者定档",**不宣称房间已有特色、不暗示已按价值排序**;不按代码量、文件数、文档长度推断业务价值。
|
|
60
|
+
2. **蓝图能生成 ≠ 房子能走通**:诊断通过只说明模型可生成。漫游手感、门牌点不点得开、观感如何,一律交作者在页面验收;不许把校验通过说成"已验收"。
|
|
61
|
+
3. **不越权**:业务取舍、面积分档、是否覆盖已有蓝图,都是作者的裁决——**未获修改授权时只提方案与理由;已获修改授权时按授权范围实施**(口径同"唯一产物与边界"第 2 条)。
|
|
62
|
+
|
|
63
|
+
## 按需读取
|
|
64
|
+
|
|
65
|
+
| 要做什么 | 先读 |
|
|
66
|
+
|---|---|
|
|
67
|
+
| 写蓝图前核对字段、取值、默认值 | [references/blueprint-contract.md](references/blueprint-contract.md) |
|
|
68
|
+
| 选定户型、算坐标、加房/改尺寸 | [references/layouts.md](references/layouts.md) + `assets/layouts/*.json` |
|
|
69
|
+
| 看懂诊断、按码修 | [references/diagnostics.md](references/diagnostics.md) |
|
|
70
|
+
|
|
71
|
+
同一会话已读且未变化的内容直接复用;只展开当前步骤用到的文件。
|
|
72
|
+
|
|
73
|
+
## 交付报告(固定格式)
|
|
74
|
+
|
|
75
|
+
1. **文件路径**:`docs/specdev/building.json`(新建或修改;改了哪几处)。
|
|
76
|
+
2. **设计表**:业务 ↔ 房间 id ↔ 面积档(逐间标"待作者定档";蓝图里没有档位字段,档位只出现在这张表里)↔ 所在层;资料数(文档 × 图,数法见主流程第 2 步);户型与风格的选择理由。
|
|
77
|
+
3. **诊断结果**:命令原文、退出码、最终 error/warning 条数;保留的 warning 逐条写明理由;修了几轮、每轮改了什么。
|
|
78
|
+
4. **未决项**:需要作者裁决的(面积档、是否保留某业务、是否覆盖旧蓝图),无则写"无"。
|
|
79
|
+
5. **页面入口与检查点**:页面路径 `/specdev-workbench/building`。**工作区标识不在本技能能取到的信息里**——它只出现在作者从 DSH 侧栏进管理页时的链接 `?workspace=<id>` 中(命令行诊断 `--json` 里的 `repo.workspaceId` 恒为空串)。按拿没拿到分两种写法:
|
|
80
|
+
- 拿到(作者贴过含 `?workspace=` 的链接)→ 原样写全:`/specdev-workbench/building?workspace=<实际标识>`;
|
|
81
|
+
- 没拿到 → **只写不带参数的路径**,并写明"请从 DSH 侧栏打开本项目的工作区,标识由侧栏带出";也可以请作者贴一次链接再补全。
|
|
82
|
+
- **不许编造标识,也不许把 `<工作区标识>` 这类占位符当成可点的链接交出去**——占位符只能出现在"待作者补"的说明里。
|
|
83
|
+
另附建议作者重点看什么(走进每间房、点门牌、切完整外观、上楼)。
|
|
84
|
+
6. **提交状态**:分支与提交号,或注明"未提交,待验收"。
|
|
85
|
+
7. **未验证项**:明确写"漫游与观感未由本技能验证,待作者页面验收"。
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "specdev-building",
|
|
3
|
+
"schema": "specdev/building/1",
|
|
4
|
+
"units": "m",
|
|
5
|
+
"style": "chinese-timber",
|
|
6
|
+
"floors": [{ "id": "floor-ground", "name": "一层", "elevation": 0, "height": 3.8 }],
|
|
7
|
+
"spaces": [
|
|
8
|
+
{ "id": "room-account", "kind": "room", "floorId": "floor-ground", "businessId": "account-access",
|
|
9
|
+
"rect": { "x": -19, "z": -4.5, "width": 6, "depth": 7 } },
|
|
10
|
+
{ "id": "room-form", "kind": "room", "floorId": "floor-ground", "businessId": "form-design",
|
|
11
|
+
"rect": { "x": 19, "z": -4.5, "width": 6, "depth": 7 } },
|
|
12
|
+
{ "id": "room-fill", "kind": "room", "floorId": "floor-ground", "businessId": "fill-submit",
|
|
13
|
+
"rect": { "x": -8, "z": -8, "width": 16, "depth": 7 } },
|
|
14
|
+
{ "id": "room-review", "kind": "room", "floorId": "floor-ground", "businessId": "review-audit",
|
|
15
|
+
"rect": { "x": 8, "z": -8, "width": 16, "depth": 7 } },
|
|
16
|
+
{ "id": "room-file", "kind": "room", "floorId": "floor-ground", "businessId": "file-material",
|
|
17
|
+
"rect": { "x": -19, "z": 2.5, "width": 6, "depth": 7 } },
|
|
18
|
+
{ "id": "room-stats", "kind": "room", "floorId": "floor-ground", "businessId": "stats-export",
|
|
19
|
+
"rect": { "x": 19, "z": 2.5, "width": 6, "depth": 7 } },
|
|
20
|
+
{ "id": "corridor-court", "name": "中庭", "kind": "corridor", "floorId": "floor-ground",
|
|
21
|
+
"rect": { "x": 0, "z": 1.25, "width": 32, "depth": 11.5 } },
|
|
22
|
+
{ "id": "yard-entry", "name": "前庭", "kind": "yard", "floorId": "floor-ground",
|
|
23
|
+
"rect": { "x": 0, "z": 13, "width": 32, "depth": 12 } }
|
|
24
|
+
],
|
|
25
|
+
"openings": [
|
|
26
|
+
{ "id": "door-fill", "kind": "door", "spaceId": "room-fill", "side": "south", "offset": 0, "width": 2.2, "to": "corridor-court" },
|
|
27
|
+
{ "id": "door-review", "kind": "door", "spaceId": "room-review", "side": "south", "offset": 0, "width": 2.2, "to": "corridor-court" },
|
|
28
|
+
{ "id": "door-account", "kind": "door", "spaceId": "room-account", "side": "east", "offset": 1.75, "width": 1.6, "to": "corridor-court" },
|
|
29
|
+
{ "id": "door-form", "kind": "door", "spaceId": "room-form", "side": "west", "offset": 1.75, "width": 1.6, "to": "corridor-court" },
|
|
30
|
+
{ "id": "door-file", "kind": "door", "spaceId": "room-file", "side": "east", "offset": 0, "width": 1.6, "to": "corridor-court" },
|
|
31
|
+
{ "id": "door-stats", "kind": "door", "spaceId": "room-stats", "side": "west", "offset": 0, "width": 1.6, "to": "corridor-court" },
|
|
32
|
+
{ "id": "window-fill", "kind": "window", "spaceId": "room-fill", "side": "north", "offset": -3, "width": 2.4 },
|
|
33
|
+
{ "id": "window-review", "kind": "window", "spaceId": "room-review", "side": "north", "offset": 3, "width": 2.4 },
|
|
34
|
+
{ "id": "window-account", "kind": "window", "spaceId": "room-account", "side": "west", "offset": 0, "width": 2.4 },
|
|
35
|
+
{ "id": "window-form", "kind": "window", "spaceId": "room-form", "side": "east", "offset": 0, "width": 2.4 },
|
|
36
|
+
{ "id": "window-file", "kind": "window", "spaceId": "room-file", "side": "west", "offset": 0, "width": 2.4 },
|
|
37
|
+
{ "id": "window-stats", "kind": "window", "spaceId": "room-stats", "side": "east", "offset": 0, "width": 2.4 }
|
|
38
|
+
],
|
|
39
|
+
"stairs": [],
|
|
40
|
+
"roofs": [
|
|
41
|
+
{ "id": "roof-fill", "spaceIds": ["room-fill"], "type": "gable", "rise": 2, "overhang": 0 },
|
|
42
|
+
{ "id": "roof-review", "spaceIds": ["room-review"], "type": "gable", "rise": 2, "overhang": 0 },
|
|
43
|
+
{ "id": "roof-account", "spaceIds": ["room-account"], "type": "gable", "rise": 1.6, "overhang": 0 },
|
|
44
|
+
{ "id": "roof-form", "spaceIds": ["room-form"], "type": "gable", "rise": 1.6, "overhang": 0 },
|
|
45
|
+
{ "id": "roof-file", "spaceIds": ["room-file"], "type": "gable", "rise": 1.6, "overhang": 0 },
|
|
46
|
+
{ "id": "roof-stats", "spaceIds": ["room-stats"], "type": "gable", "rise": 1.6, "overhang": 0 }
|
|
47
|
+
],
|
|
48
|
+
"construction": {
|
|
49
|
+
"phase": "design",
|
|
50
|
+
"status": { "design": "detailed", "approval": "pending", "implementation": "unknown", "tests": "pending", "acceptance": "pending", "evidence": {} }
|
|
51
|
+
},
|
|
52
|
+
"entry": { "spaceId": "yard-entry", "x": 0, "z": 12 }
|
|
53
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "specdev-building",
|
|
3
|
+
"schema": "specdev/building/1",
|
|
4
|
+
"units": "m",
|
|
5
|
+
"style": "warm-modern",
|
|
6
|
+
"floors": [{ "id": "floor-ground", "name": "一层", "elevation": 0, "height": 3.6 }],
|
|
7
|
+
"spaces": [
|
|
8
|
+
{ "id": "room-account", "kind": "room", "floorId": "floor-ground", "businessId": "account-access",
|
|
9
|
+
"rect": { "x": -22.5, "z": -5, "width": 9, "depth": 8 } },
|
|
10
|
+
{ "id": "room-form", "kind": "room", "floorId": "floor-ground", "businessId": "form-design",
|
|
11
|
+
"rect": { "x": -13.5, "z": -5, "width": 9, "depth": 8 } },
|
|
12
|
+
{ "id": "room-fill", "kind": "room", "floorId": "floor-ground", "businessId": "fill-submit",
|
|
13
|
+
"rect": { "x": -4.5, "z": -5, "width": 9, "depth": 8 } },
|
|
14
|
+
{ "id": "room-file", "kind": "room", "floorId": "floor-ground", "businessId": "file-material",
|
|
15
|
+
"rect": { "x": 4.5, "z": -5, "width": 9, "depth": 8 } },
|
|
16
|
+
{ "id": "room-review", "kind": "room", "floorId": "floor-ground", "businessId": "review-audit",
|
|
17
|
+
"rect": { "x": 13.5, "z": -5, "width": 9, "depth": 8 } },
|
|
18
|
+
{ "id": "room-stats", "kind": "room", "floorId": "floor-ground", "businessId": "stats-export",
|
|
19
|
+
"rect": { "x": 22.5, "z": -5, "width": 9, "depth": 8 } },
|
|
20
|
+
{ "id": "corridor-main", "name": "南廊", "kind": "corridor", "floorId": "floor-ground",
|
|
21
|
+
"rect": { "x": 0, "z": 3, "width": 58, "depth": 8 } },
|
|
22
|
+
{ "id": "yard-entry", "name": "前庭", "kind": "yard", "floorId": "floor-ground",
|
|
23
|
+
"rect": { "x": 0, "z": 13, "width": 58, "depth": 12 } }
|
|
24
|
+
],
|
|
25
|
+
"openings": [
|
|
26
|
+
{ "id": "door-account", "kind": "door", "spaceId": "room-account", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
27
|
+
{ "id": "door-form", "kind": "door", "spaceId": "room-form", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
28
|
+
{ "id": "door-fill", "kind": "door", "spaceId": "room-fill", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
29
|
+
{ "id": "door-file", "kind": "door", "spaceId": "room-file", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
30
|
+
{ "id": "door-review", "kind": "door", "spaceId": "room-review", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
31
|
+
{ "id": "door-stats", "kind": "door", "spaceId": "room-stats", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-main" },
|
|
32
|
+
{ "id": "window-account", "kind": "window", "spaceId": "room-account", "side": "north", "offset": 0, "width": 3 },
|
|
33
|
+
{ "id": "window-form", "kind": "window", "spaceId": "room-form", "side": "north", "offset": 0, "width": 3 },
|
|
34
|
+
{ "id": "window-fill", "kind": "window", "spaceId": "room-fill", "side": "north", "offset": 0, "width": 3 },
|
|
35
|
+
{ "id": "window-file", "kind": "window", "spaceId": "room-file", "side": "north", "offset": 0, "width": 3 },
|
|
36
|
+
{ "id": "window-review", "kind": "window", "spaceId": "room-review", "side": "north", "offset": 0, "width": 3 },
|
|
37
|
+
{ "id": "window-stats", "kind": "window", "spaceId": "room-stats", "side": "north", "offset": 0, "width": 3 }
|
|
38
|
+
],
|
|
39
|
+
"stairs": [],
|
|
40
|
+
"roofs": [
|
|
41
|
+
{ "id": "roof-main", "spaceIds": ["room-account", "room-form", "room-fill", "room-file", "room-review", "room-stats"], "type": "gable", "rise": 1.8, "overhang": 0.35 }
|
|
42
|
+
],
|
|
43
|
+
"construction": {
|
|
44
|
+
"phase": "design",
|
|
45
|
+
"status": { "design": "detailed", "approval": "pending", "implementation": "unknown", "tests": "pending", "acceptance": "pending", "evidence": {} }
|
|
46
|
+
},
|
|
47
|
+
"entry": { "spaceId": "yard-entry", "x": 0, "z": 17 }
|
|
48
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "specdev-building",
|
|
3
|
+
"schema": "specdev/building/1",
|
|
4
|
+
"units": "m",
|
|
5
|
+
"style": "warm-modern",
|
|
6
|
+
"defaults": { "wallThickness": 0.18, "slabThickness": 0.18, "doorHeight": 2.5 },
|
|
7
|
+
"floors": [{ "id": "floor-ground", "name": "一层", "elevation": 0, "height": 3.6 }],
|
|
8
|
+
"spaces": [
|
|
9
|
+
{ "id": "room-sample", "kind": "room", "floorId": "floor-ground", "businessId": "sample-business",
|
|
10
|
+
"rect": { "x": 0, "z": -1, "width": 8, "depth": 6 } },
|
|
11
|
+
{ "id": "yard-entry", "name": "前庭", "kind": "yard", "floorId": "floor-ground",
|
|
12
|
+
"rect": { "x": 0, "z": 6, "width": 14, "depth": 8 } }
|
|
13
|
+
],
|
|
14
|
+
"openings": [
|
|
15
|
+
{ "id": "door-sample", "kind": "door", "spaceId": "room-sample", "side": "south", "offset": 0, "width": 1.8, "to": "yard-entry" },
|
|
16
|
+
{ "id": "window-sample", "kind": "window", "spaceId": "room-sample", "side": "north", "offset": 0, "width": 3 }
|
|
17
|
+
],
|
|
18
|
+
"stairs": [],
|
|
19
|
+
"roofs": [
|
|
20
|
+
{ "id": "roof-sample", "spaceIds": ["room-sample"], "type": "gable", "rise": 1.8, "overhang": 0.35 }
|
|
21
|
+
],
|
|
22
|
+
"construction": {
|
|
23
|
+
"phase": "design",
|
|
24
|
+
"status": { "design": "detailed", "approval": "pending", "implementation": "unknown", "tests": "pending", "acceptance": "pending", "evidence": {} }
|
|
25
|
+
},
|
|
26
|
+
"entry": { "spaceId": "yard-entry", "x": 0, "z": 8 }
|
|
27
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "specdev-building",
|
|
3
|
+
"schema": "specdev/building/1",
|
|
4
|
+
"units": "m",
|
|
5
|
+
"style": "warm-modern",
|
|
6
|
+
"floors": [
|
|
7
|
+
{ "id": "floor-ground", "name": "一层", "elevation": 0, "height": 3.6 },
|
|
8
|
+
{ "id": "floor-upper", "name": "二层", "elevation": 4.2, "height": 3.6 }
|
|
9
|
+
],
|
|
10
|
+
"spaces": [
|
|
11
|
+
{ "id": "room-alpha", "kind": "room", "floorId": "floor-ground", "businessId": "alpha",
|
|
12
|
+
"rect": { "x": -8, "z": -4, "width": 4, "depth": 6 } },
|
|
13
|
+
{ "id": "room-beta", "kind": "room", "floorId": "floor-ground", "businessId": "beta",
|
|
14
|
+
"rect": { "x": -4, "z": -4, "width": 4, "depth": 6 } },
|
|
15
|
+
{ "id": "room-gamma", "kind": "room", "floorId": "floor-ground", "businessId": "gamma",
|
|
16
|
+
"rect": { "x": 0, "z": -4, "width": 4, "depth": 6 } },
|
|
17
|
+
{ "id": "room-delta", "kind": "room", "floorId": "floor-ground", "businessId": "delta",
|
|
18
|
+
"rect": { "x": 4, "z": -4, "width": 4, "depth": 6 } },
|
|
19
|
+
{ "id": "room-epsilon", "kind": "room", "floorId": "floor-ground", "businessId": "epsilon",
|
|
20
|
+
"rect": { "x": 8, "z": -4, "width": 4, "depth": 6 } },
|
|
21
|
+
{ "id": "corridor-ground", "name": "一层前廊", "kind": "corridor", "floorId": "floor-ground",
|
|
22
|
+
"rect": { "x": 0, "z": 0, "width": 20, "depth": 2 } },
|
|
23
|
+
{ "id": "yard-entry", "name": "项目前庭", "kind": "yard", "floorId": "floor-ground",
|
|
24
|
+
"rect": { "x": 0, "z": 4, "width": 10, "depth": 6 } },
|
|
25
|
+
{ "id": "room-zeta", "kind": "room", "floorId": "floor-upper", "businessId": "zeta",
|
|
26
|
+
"rect": { "x": -7.5, "z": -4, "width": 5, "depth": 6 } },
|
|
27
|
+
{ "id": "room-eta", "kind": "room", "floorId": "floor-upper", "businessId": "eta",
|
|
28
|
+
"rect": { "x": -2.5, "z": -4, "width": 5, "depth": 6 } },
|
|
29
|
+
{ "id": "room-theta", "kind": "room", "floorId": "floor-upper", "businessId": "theta",
|
|
30
|
+
"rect": { "x": 2.5, "z": -4, "width": 5, "depth": 6 } },
|
|
31
|
+
{ "id": "room-iota", "kind": "room", "floorId": "floor-upper", "businessId": "iota",
|
|
32
|
+
"rect": { "x": 7.5, "z": -4, "width": 5, "depth": 6 } },
|
|
33
|
+
{ "id": "corridor-upper", "name": "二层前廊", "kind": "corridor", "floorId": "floor-upper",
|
|
34
|
+
"rect": { "x": 0, "z": 0, "width": 20, "depth": 2 } },
|
|
35
|
+
{ "id": "landing-upper", "name": "二层梯台", "kind": "terrace", "floorId": "floor-upper",
|
|
36
|
+
"rect": { "x": 17, "z": 1, "width": 2, "depth": 4 } },
|
|
37
|
+
{ "id": "return-upper", "name": "二层回廊", "kind": "corridor", "floorId": "floor-upper",
|
|
38
|
+
"rect": { "x": 3, "z": 2, "width": 26, "depth": 2 } }
|
|
39
|
+
],
|
|
40
|
+
"openings": [
|
|
41
|
+
{ "id": "door-alpha", "kind": "door", "spaceId": "room-alpha", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
42
|
+
{ "id": "door-beta", "kind": "door", "spaceId": "room-beta", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
43
|
+
{ "id": "door-gamma", "kind": "door", "spaceId": "room-gamma", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
44
|
+
{ "id": "door-delta", "kind": "door", "spaceId": "room-delta", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
45
|
+
{ "id": "door-epsilon", "kind": "door", "spaceId": "room-epsilon", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
46
|
+
{ "id": "door-zeta", "kind": "door", "spaceId": "room-zeta", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-upper" },
|
|
47
|
+
{ "id": "door-eta", "kind": "door", "spaceId": "room-eta", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-upper" },
|
|
48
|
+
{ "id": "door-theta", "kind": "door", "spaceId": "room-theta", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-upper" },
|
|
49
|
+
{ "id": "door-iota", "kind": "door", "spaceId": "room-iota", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-upper" },
|
|
50
|
+
{ "id": "window-alpha", "kind": "window", "spaceId": "room-alpha", "side": "north", "offset": 0, "width": 2.4 },
|
|
51
|
+
{ "id": "window-beta", "kind": "window", "spaceId": "room-beta", "side": "north", "offset": 0, "width": 2.4 },
|
|
52
|
+
{ "id": "window-gamma", "kind": "window", "spaceId": "room-gamma", "side": "north", "offset": 0, "width": 2.4 },
|
|
53
|
+
{ "id": "window-delta", "kind": "window", "spaceId": "room-delta", "side": "north", "offset": 0, "width": 2.4 },
|
|
54
|
+
{ "id": "window-epsilon", "kind": "window", "spaceId": "room-epsilon", "side": "north", "offset": 0, "width": 2.4 },
|
|
55
|
+
{ "id": "window-zeta", "kind": "window", "spaceId": "room-zeta", "side": "north", "offset": 0, "width": 3 },
|
|
56
|
+
{ "id": "window-eta", "kind": "window", "spaceId": "room-eta", "side": "north", "offset": 0, "width": 3 },
|
|
57
|
+
{ "id": "window-theta", "kind": "window", "spaceId": "room-theta", "side": "north", "offset": 0, "width": 3 },
|
|
58
|
+
{ "id": "window-iota", "kind": "window", "spaceId": "room-iota", "side": "north", "offset": 0, "width": 3 }
|
|
59
|
+
],
|
|
60
|
+
"stairs": [
|
|
61
|
+
{ "id": "stair-ground-upper", "from": { "spaceId": "corridor-ground", "x": 10, "z": 0 }, "to": { "spaceId": "landing-upper", "x": 16, "z": 0 }, "width": 1.4, "steps": 22 }
|
|
62
|
+
],
|
|
63
|
+
"roofs": [
|
|
64
|
+
{ "id": "roof-upper", "spaceIds": ["room-zeta", "room-eta", "room-theta", "room-iota"], "type": "gable", "rise": 1.8, "overhang": 0.35 }
|
|
65
|
+
],
|
|
66
|
+
"construction": {
|
|
67
|
+
"phase": "design",
|
|
68
|
+
"status": { "design": "detailed", "approval": "pending", "implementation": "unknown", "tests": "pending", "acceptance": "pending", "evidence": {} }
|
|
69
|
+
},
|
|
70
|
+
"entry": { "spaceId": "yard-entry", "x": 0, "z": 5 }
|
|
71
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"format": "specdev-building",
|
|
3
|
+
"schema": "specdev/building/1",
|
|
4
|
+
"units": "m",
|
|
5
|
+
"style": "warm-modern",
|
|
6
|
+
"floors": [
|
|
7
|
+
{ "id": "floor-ground", "name": "一层", "elevation": 0, "height": 3.6 },
|
|
8
|
+
{ "id": "floor-upper", "name": "二层", "elevation": 4.2, "height": 3.6 }
|
|
9
|
+
],
|
|
10
|
+
"spaces": [
|
|
11
|
+
{ "id": "room-account", "kind": "room", "floorId": "floor-ground", "businessId": "account-access",
|
|
12
|
+
"rect": { "x": -5.5, "z": -4, "width": 5, "depth": 6 } },
|
|
13
|
+
{ "id": "room-form", "kind": "room", "floorId": "floor-ground", "businessId": "form-design",
|
|
14
|
+
"rect": { "x": 0, "z": -4, "width": 6, "depth": 6 } },
|
|
15
|
+
{ "id": "room-fill", "kind": "room", "floorId": "floor-ground", "businessId": "fill-submit",
|
|
16
|
+
"rect": { "x": 5.5, "z": -4, "width": 5, "depth": 6 } },
|
|
17
|
+
{ "id": "corridor-ground", "name": "一层前廊", "kind": "corridor", "floorId": "floor-ground",
|
|
18
|
+
"rect": { "x": 0, "z": 0, "width": 16, "depth": 2 } },
|
|
19
|
+
{ "id": "yard-entry", "name": "项目前庭", "kind": "yard", "floorId": "floor-ground",
|
|
20
|
+
"rect": { "x": 0, "z": 4, "width": 8, "depth": 6 } },
|
|
21
|
+
{ "id": "room-file", "kind": "room", "floorId": "floor-upper", "businessId": "file-material",
|
|
22
|
+
"rect": { "x": -6, "z": -4, "width": 4, "depth": 6 } },
|
|
23
|
+
{ "id": "room-review", "kind": "room", "floorId": "floor-upper", "businessId": "review-audit",
|
|
24
|
+
"rect": { "x": 0, "z": -4, "width": 8, "depth": 6 } },
|
|
25
|
+
{ "id": "room-stats", "kind": "room", "floorId": "floor-upper", "businessId": "stats-export",
|
|
26
|
+
"rect": { "x": 6, "z": -4, "width": 4, "depth": 6 } },
|
|
27
|
+
{ "id": "corridor-upper", "name": "二层前廊", "kind": "corridor", "floorId": "floor-upper",
|
|
28
|
+
"rect": { "x": 0, "z": 0, "width": 16, "depth": 2 } },
|
|
29
|
+
{ "id": "landing-upper", "name": "二层梯台", "kind": "terrace", "floorId": "floor-upper",
|
|
30
|
+
"rect": { "x": 15, "z": 1, "width": 2, "depth": 4 } },
|
|
31
|
+
{ "id": "return-upper", "name": "二层回廊", "kind": "corridor", "floorId": "floor-upper",
|
|
32
|
+
"rect": { "x": 3, "z": 2, "width": 22, "depth": 2 } }
|
|
33
|
+
],
|
|
34
|
+
"openings": [
|
|
35
|
+
{ "id": "door-account", "kind": "door", "spaceId": "room-account", "side": "south", "offset": 0, "width": 1.6, "to": "corridor-ground" },
|
|
36
|
+
{ "id": "door-form", "kind": "door", "spaceId": "room-form", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-ground" },
|
|
37
|
+
{ "id": "door-fill", "kind": "door", "spaceId": "room-fill", "side": "south", "offset": 0, "width": 1.6, "to": "corridor-ground" },
|
|
38
|
+
{ "id": "door-file", "kind": "door", "spaceId": "room-file", "side": "south", "offset": 0, "width": 1.6, "to": "corridor-upper" },
|
|
39
|
+
{ "id": "door-review", "kind": "door", "spaceId": "room-review", "side": "south", "offset": 0, "width": 1.8, "to": "corridor-upper" },
|
|
40
|
+
{ "id": "door-stats", "kind": "door", "spaceId": "room-stats", "side": "south", "offset": 0, "width": 1.6, "to": "corridor-upper" },
|
|
41
|
+
{ "id": "window-account", "kind": "window", "spaceId": "room-account", "side": "north", "offset": 0, "width": 3 },
|
|
42
|
+
{ "id": "window-form", "kind": "window", "spaceId": "room-form", "side": "north", "offset": 0, "width": 3 },
|
|
43
|
+
{ "id": "window-fill", "kind": "window", "spaceId": "room-fill", "side": "north", "offset": 0, "width": 3 },
|
|
44
|
+
{ "id": "window-file", "kind": "window", "spaceId": "room-file", "side": "north", "offset": 0, "width": 2.4 },
|
|
45
|
+
{ "id": "window-review", "kind": "window", "spaceId": "room-review", "side": "north", "offset": 0, "width": 3 },
|
|
46
|
+
{ "id": "window-stats", "kind": "window", "spaceId": "room-stats", "side": "north", "offset": 0, "width": 2.4 }
|
|
47
|
+
],
|
|
48
|
+
"stairs": [
|
|
49
|
+
{ "id": "stair-ground-upper", "from": { "spaceId": "corridor-ground", "x": 8, "z": 0 }, "to": { "spaceId": "landing-upper", "x": 14, "z": 0 }, "width": 1.4, "steps": 22 }
|
|
50
|
+
],
|
|
51
|
+
"roofs": [
|
|
52
|
+
{ "id": "roof-upper", "spaceIds": ["room-file", "room-review", "room-stats"], "type": "gable", "rise": 1.8, "overhang": 0.35 }
|
|
53
|
+
],
|
|
54
|
+
"construction": {
|
|
55
|
+
"phase": "design",
|
|
56
|
+
"status": { "design": "detailed", "approval": "pending", "implementation": "unknown", "tests": "pending", "acceptance": "pending", "evidence": {} }
|
|
57
|
+
},
|
|
58
|
+
"entry": { "spaceId": "yard-entry", "x": 0, "z": 5 }
|
|
59
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# 蓝图契约(字段、取值、默认值)
|
|
2
|
+
|
|
3
|
+
**以生成器为准,本表是索引**:字段行为的唯一来源是插件 `src/core/house.ts` 的 `blueprintRule` 与几何检查;本表与它不一致时以代码为准,并回报作者修订本文件。写蓝图前逐项对照一遍,比事后看诊断便宜得多。
|
|
4
|
+
|
|
5
|
+
形状校验**不容错**:出现未定义字段(拼错一个字母也算)直接 `INPUT_UNKNOWN_FIELD`。
|
|
6
|
+
|
|
7
|
+
## 1. 顶层
|
|
8
|
+
|
|
9
|
+
| 字段 | 必填 | 取值 | 说明 |
|
|
10
|
+
|---|---|---|---|
|
|
11
|
+
| `format` | ✓ | `"specdev-building"` | 固定 |
|
|
12
|
+
| `schema` | ✓ | `"specdev/building/1"` | 固定 |
|
|
13
|
+
| `units` | ✓ | `"m"` | 固定,米 |
|
|
14
|
+
| `style` | ✓ | `"warm-modern"`/`"chinese-timber"` | 影响配色与构件材质,**不影响几何与诊断**;怎么选见 SKILL.md 选型表的"风格"列(跟各户型样板同款:`single`/`row`/`tower` 一族 `warm-modern`,`court` `chinese-timber`) |
|
|
15
|
+
| `defaults` | | `{wallThickness, slabThickness, doorHeight}` | 厚度 ∈ (0, 0.6] 米、门高 ∈ (0, 8];**整块可以省略**,省略即 0.18/0.18/2.5(`single.json` 里那一块就是这个值——写它和省略**等价**);也可以只写要改的字段。**只有"写与缺省相同的值"才等价**:改墙厚/楼板厚会改构件尺寸与楼层净空,改门高会改门洞与漫游落点 |
|
|
16
|
+
| `floors` | ✓ | 数组,至少一条 | 见 §2 |
|
|
17
|
+
| `spaces` | ✓ | 数组,至少一条 | 见 §3 |
|
|
18
|
+
| `openings` | | 数组 | 见 §4 |
|
|
19
|
+
| `stairs` | | 数组 | 见 §5 |
|
|
20
|
+
| `roofs` | | 数组 | 见 §6 |
|
|
21
|
+
| `construction` | | `{phase, status}` | 缺省 `design` + 全 pending/unknown,见 §7 |
|
|
22
|
+
| `entry` | ✓ | `{spaceId, x, z}` | 必须在已登记空间内,且离该空间边缘 ≥ 0.35 米 |
|
|
23
|
+
|
|
24
|
+
规模上限:≤ 240 空间、≤ 24 层、≤ 2000 开口、≤ 96 跑楼梯、≤ 240 屋顶(`INPUT_LIMIT`)。
|
|
25
|
+
|
|
26
|
+
可选数组(`openings`/`stairs`/`roofs`)不需要时**省略或写空数组都合法**、几何一样:照抄样板即可(`row.json` 里就写着 `"stairs": []`)。
|
|
27
|
+
|
|
28
|
+
## 2. floors[]
|
|
29
|
+
|
|
30
|
+
| 字段 | 必填 | 取值 |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| `id` | ✓ | `^[a-z][a-z0-9-]*$`,全文件唯一 |
|
|
33
|
+
| `name` | ✓ | 非空字符串(如 `一层`) |
|
|
34
|
+
| `elevation` | ✓ | 数字,该层楼板上表面标高;绝对值 ≤ 500 |
|
|
35
|
+
| `height` | ✓ | 2.6—12(室内净高,不含楼板) |
|
|
36
|
+
|
|
37
|
+
## 3. spaces[]
|
|
38
|
+
|
|
39
|
+
| 字段 | 必填 | 取值 |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `id` | ✓ | `^[a-z][a-z0-9-]*$`,全文件唯一 |
|
|
42
|
+
| `kind` | ✓ | `room`/`corridor`/`terrace`/`yard` |
|
|
43
|
+
| `floorId` | ✓ | 必须指向已登记楼层 |
|
|
44
|
+
| `rect` | ✓ | `{x, z, width, depth}`:`x`/`z` 是**中心**坐标;边长 1.6—200 米;坐标绝对值 ≤ 1000 |
|
|
45
|
+
| `businessId` | room 必填 | **只填业务目录名**(如 `account-access`),不带 `docs/specdev/` 前缀;一个业务只能绑一间房 |
|
|
46
|
+
| `directory` | | 布尔;缺省=开。`false` 会关掉该房间的资料目录 → 该业务的资料全部报 `MATERIAL_NO_ENTRY`,只在作者要求时用 |
|
|
47
|
+
| `name` | | 非 room 空间的显示名(room 的显示名以清单为准);可照抄样板(走廊「南廊」、前庭「前庭」),不影响校验 |
|
|
48
|
+
| `prototype` | | `foyer`/`studio`/`archive`/`review`/`observatory`:只影响色调与标签,**不参与户型算术**;建房 v1 **一律省略**(省略即 `studio`,五份样板都没用它) |
|
|
49
|
+
| `height` | | 2.6—12;缺省跟随所在楼层 |
|
|
50
|
+
| `accent` | | `#rrggbb`;省略时随 `prototype` 取色——建房 v1 不写 |
|
|
51
|
+
| `wallType` | | `plaster`/`brick`/`timber`,**省略即 `plaster`**;共墙两侧的房间必须同墙高、同墙材(否则 `SHARED_WALL_CONFLICT`)——比的是**两侧的最终取值**,所以两侧都不写=两侧都 `plaster`(一致);要写就两侧写同一个值 |
|
|
52
|
+
| `status` | | 建造状态,见 §7 |
|
|
53
|
+
|
|
54
|
+
几何硬约束:
|
|
55
|
+
|
|
56
|
+
- `rect` 是**墙中心线**范围:室内净尺寸还要扣掉墙厚(`defaults.wallThickness`)。
|
|
57
|
+
- 同层空间**不许内部重叠**,可以共边(差 0.1 米既不是共边也不算重叠,会各建一堵墙)。
|
|
58
|
+
- 上下层空间重叠时,必须留出净空:下层顶 ≤ 上层地坪 − 楼板厚(`FLOOR_CLEARANCE`)。
|
|
59
|
+
- 房间(`room`)必须有门;从入口经门、楼梯、相邻非房间空间要能走遍每个空间(`SPACE_UNREACHABLE`)。
|
|
60
|
+
|
|
61
|
+
## 4. openings[](门与窗)
|
|
62
|
+
|
|
63
|
+
| 字段 | 必填 | 取值 |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| `id` | ✓ | `^[a-z][a-z0-9-]*$`,全文件唯一 |
|
|
66
|
+
| `kind` | ✓ | `door`/`window` |
|
|
67
|
+
| `spaceId` | ✓ | 必须是 `kind: "room"` 的空间(开口只挂在房间上) |
|
|
68
|
+
| `side` | ✓ | `north`/`south`/`east`/`west`(世界坐标的四个方向) |
|
|
69
|
+
| `offset` | ✓ | **相对该墙中心**的距离(米),不是"从左数第几块";南北墙沿 +X 增大,东西墙沿 +Z 增大 |
|
|
70
|
+
| `width` | ✓ | 门 ≥ 0.95;窗 ≥ 0.2;且 ≤ 房间该边长度 − 0.4(墙角各留 0.2 米) |
|
|
71
|
+
| `height` | | 门省略时取 `defaults.doorHeight`(`defaults` 缺省 2.5,**必须 ≥ 2.2**,否则所有门报错);窗缺省 1.2;`sill + height` ≤ 空间净高 − 0.12 |
|
|
72
|
+
| `sill` | | 门缺省 0(**门不许有门槛**);窗缺省 1(窗台高) |
|
|
73
|
+
| `to` | 门必填 | 门通向的空间 id,见下 |
|
|
74
|
+
|
|
75
|
+
门的额外要求(`DOOR_CONNECTION`):
|
|
76
|
+
|
|
77
|
+
- 必须落在**来源房间与 `to` 空间的共边**上,同一层,且整扇门都在共边范围内;
|
|
78
|
+
- 跨房间的共墙只登记**一次**门,两边各写一扇会重叠(`OPENING_OVERLAP`);
|
|
79
|
+
- 门不许跨过共墙的分区端点(`OPENING_PARTITION`):同一面墙线上,每个房间与走廊的共边是独立墙段,门要整扇落在其中一段里。
|
|
80
|
+
|
|
81
|
+
窗:`to` 一律不写(`WINDOW_CONNECTION`)。
|
|
82
|
+
|
|
83
|
+
## 5. stairs[](只支持轴向直跑梯)
|
|
84
|
+
|
|
85
|
+
| 字段 | 必填 | 取值 |
|
|
86
|
+
|---|---|---|
|
|
87
|
+
| `id` | ✓ | 同上 |
|
|
88
|
+
| `from`/`to` | ✓ | `{spaceId, x, z}`;端点空间**不能是 room**(走廊/平台/庭院),必须不同层且 `to` 更高 |
|
|
89
|
+
| `width` | ✓ | 1.2—8 米 |
|
|
90
|
+
| `steps` | ✓ | 整数 2—120 |
|
|
91
|
+
|
|
92
|
+
硬约束:
|
|
93
|
+
|
|
94
|
+
- 只能沿 X 或 Z 一个方向(`dx`、`dz` 至多一个非零);
|
|
95
|
+
- 水平长度 ≥ 上升高度(≤ 45°);
|
|
96
|
+
- 两端要"落"在平台里:沿行进方向平台向外至少留 0.6 米,左右要容得下梯宽(`STAIR_LANDING`);
|
|
97
|
+
- 楼梯投影**不许与任何平层空间相交**:楼板要拆成避开梯井的矩形(`STAIR_SPACE_INTERSECTION`);梯段之间头部净空 ≥ 2.2 米(`STAIR_INTERSECTION`)。
|
|
98
|
+
|
|
99
|
+
## 6. roofs[]
|
|
100
|
+
|
|
101
|
+
| 字段 | 必填 | 取值 |
|
|
102
|
+
|---|---|---|
|
|
103
|
+
| `id` | ✓ | 同上 |
|
|
104
|
+
| `spaceIds` | ✓ | 不重复的现有空间 id 列表 |
|
|
105
|
+
| `type` | ✓ | `flat`/`gable`(坡顶屋脊只沿 X) |
|
|
106
|
+
| `rise` | | 坡顶可省略,缺省 1.8,取值 (0, 8];平顶省略或显式写 `0`(写其它值报 `ROOF_SIZE`) |
|
|
107
|
+
| `overhang` | | 0—2 米,缺省 0.35 |
|
|
108
|
+
|
|
109
|
+
硬约束:同一个屋顶引用的空间必须**同层、同墙顶标高**,且并集正好是一个**完整矩形**(不能有空洞,不能用一个大矩形无意盖上中庭)。屋顶包络不许穿进上层空间(`ROOF_UPPER_FLOOR`)或与另一个屋顶相交(`ROOF_INTERSECTION`)。
|
|
110
|
+
|
|
111
|
+
**每个房间上方都要有屋顶**,否则报 `ROOF_MISSING`(warning,不阻塞生成,但要在交付说明里写明理由)。第四种做法:一排等高等深的房间可以合成一个组合屋顶(见 `assets/layouts/row.json`)。
|
|
112
|
+
|
|
113
|
+
## 7. construction 与 status
|
|
114
|
+
|
|
115
|
+
| 字段 | 取值 |
|
|
116
|
+
|---|---|
|
|
117
|
+
| `phase` | `design`/`foundation`/`structure`/`enclosure`/`services`/`interior`/`accepted` |
|
|
118
|
+
| `status.design` | `concept`/`detailed` |
|
|
119
|
+
| `status.approval` | `pending`/`approved`(`approved` 要求 `design: detailed`) |
|
|
120
|
+
| `status.implementation` | `absent`/`unknown`/`present` |
|
|
121
|
+
| `status.tests`/`acceptance` | `pending`/`passed` |
|
|
122
|
+
| `status.evidence` | `{implementation, tests, acceptance}`:声明 `present`/`passed` 时**必须**给出处,否则 `STATE_EVIDENCE_REQUIRED` |
|
|
123
|
+
|
|
124
|
+
一致性:`tests`/`acceptance` 为 `passed` 时 `implementation` 必须是 `present`(`STATE_CONTRADICTION`);`phase: "accepted"` 要求每间业务房四项齐备(`ACCEPTANCE_INCOMPLETE`)。
|
|
125
|
+
|
|
126
|
+
**建房的默认写法**:整块照抄样板(`design` + `detailed`/`pending`/`unknown`/`pending`/`pending`/空 `evidence`)。计划、实现、测试、验收是**四种不同的事实**——生成器诊断通过不是业务实现证据,本技能不替作者声明任何一项。
|