@bongos/core 1.19.394 → 1.19.396
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/.bongos-core.json +114 -59
- package/.claude/skills/design/SKILL.md +68 -0
- package/.claude/skills/design-sync/SKILL.md +2 -2
- package/.claude/skills/figma-design-sync/SKILL.md +3 -3
- package/clients/bongos-client/index.d.ts +1 -1
- package/config/design-tokens.neutral.json +1 -1
- package/config/design-tokens.schema.json +1 -1
- package/docs/adr/0197-the-ui-design-module.md +52 -0
- package/docs/adr/README.md +1 -0
- package/docs/api/openapi.json +4 -0
- package/docs/api-reference.md +1 -1
- package/docs/architecture.md +1 -1
- package/docs/copy-inventory.md +11 -9
- package/docs/copy-registry.json +30 -12
- package/docs/file-map.md +2 -0
- package/docs/modules-contract.md +1 -0
- package/docs/onboarding/slash-commands.md +1 -1
- package/docs/recipes/claude-design-loop.md +3 -3
- package/docs/recipes/figma-design-loop.md +4 -4
- package/modules/hall-ui/public/my-projects.css +22 -0
- package/modules/hall-ui/public/my-projects.html +7 -1
- package/modules/hall-ui/public/my-projects.js +17 -11
- package/modules/platform-identity/routes/my-projects.js +50 -3
- package/modules/ui-design/CLAUDE.md +15 -0
- package/{src/ui → modules/ui-design}/adapters/claude-design/index.js +1 -1
- package/{src/ui → modules/ui-design}/adapters/figma/index.js +3 -3
- package/{docs → modules/ui-design/docs}/design-contract.md +12 -12
- package/modules/ui-design/kit/README.md +3 -0
- package/modules/ui-design/module.json +11 -0
- package/modules/ui-design/scripts/design-sync.js +65 -0
- package/modules/ui-design/scripts/figma-design-sync.js +64 -0
- package/modules/ui-design/scripts/validate-design.js +258 -0
- package/modules/ui-design/skills/README.md +3 -0
- package/modules/ui-design/styles/README.md +3 -0
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/scripts/gds/copy-inventory.js +7 -5
- package/scripts/gds/design-sync.js +9 -59
- package/scripts/gds/doc-cli-guard.js +11 -5
- package/scripts/gds/figma-design-sync.js +9 -59
- package/scripts/gds/fitness-checks-identity.js +5 -3
- package/scripts/gds/publish-manifest.js +1 -1
- package/scripts/gds/validate-design.js +7 -249
- package/src/bongos/module-scope-map.js +18 -0
- package/src/module-api.js +5 -1
- package/tests/design_tokens_sync.mjs +1 -1
- package/tests/doc_cli_guard.mjs +19 -0
- package/tests/figma_adapter.mjs +1 -1
- package/tests/join_application_note.mjs +112 -0
- package/tests/module_loader.mjs +4 -1
package/.bongos-core.json
CHANGED
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
"artifact": "bongos-core",
|
|
3
3
|
"manifest_schema": 1,
|
|
4
4
|
"generator": "scripts/gds/package-core.js",
|
|
5
|
-
"core_version": "1.19.
|
|
6
|
-
"core_contract": "1.19.
|
|
7
|
-
"source_commit": "
|
|
5
|
+
"core_version": "1.19.396",
|
|
6
|
+
"core_contract": "1.19.396",
|
|
7
|
+
"source_commit": "b4632d6e8d92e8096e958762a36e810fc24c9c35",
|
|
8
8
|
"source_ref": "HEAD",
|
|
9
|
-
"built_at": "2026-08-
|
|
9
|
+
"built_at": "2026-08-28T16:08:46.136Z",
|
|
10
10
|
"redaction": {
|
|
11
11
|
"model": "docs-redacted+functional-verbatim",
|
|
12
|
-
"docs_redacted":
|
|
13
|
-
"agent_docs_stubbed":
|
|
14
|
-
"functional_verbatim":
|
|
12
|
+
"docs_redacted": 345,
|
|
13
|
+
"agent_docs_stubbed": 23,
|
|
14
|
+
"functional_verbatim": 1635,
|
|
15
15
|
"rules": 3,
|
|
16
16
|
"gate_literals": 3,
|
|
17
17
|
"gate": "passed"
|
|
18
18
|
},
|
|
19
|
-
"file_count":
|
|
20
|
-
"tree_sha256": "
|
|
19
|
+
"file_count": 2003,
|
|
20
|
+
"tree_sha256": "950c8c43ac98c0e161e25a1c17cd699ad9582392105dcd0abadc8efc090a95c8",
|
|
21
21
|
"files": [
|
|
22
22
|
{
|
|
23
23
|
"path": ".claude/skills/blocker-review/SKILL.md",
|
|
@@ -122,7 +122,12 @@
|
|
|
122
122
|
{
|
|
123
123
|
"path": ".claude/skills/design-sync/SKILL.md",
|
|
124
124
|
"mode": "0000644",
|
|
125
|
-
"sha256": "
|
|
125
|
+
"sha256": "7ef4539cc8f7a588cac1ab1c81a0bcd2403e1e3f5d67422e53a4973d057b55c7"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"path": ".claude/skills/design/SKILL.md",
|
|
129
|
+
"mode": "0000644",
|
|
130
|
+
"sha256": "83f2d423421bc08e7f460847616bc0cfba636cb24563566724776b2c7c1a1662"
|
|
126
131
|
},
|
|
127
132
|
{
|
|
128
133
|
"path": ".claude/skills/dev/SKILL.md",
|
|
@@ -137,7 +142,7 @@
|
|
|
137
142
|
{
|
|
138
143
|
"path": ".claude/skills/figma-design-sync/SKILL.md",
|
|
139
144
|
"mode": "0000644",
|
|
140
|
-
"sha256": "
|
|
145
|
+
"sha256": "f3abceebc2b098b61e9f0765bf0a515beaf340aa5138b23db1c59ba761a195cd"
|
|
141
146
|
},
|
|
142
147
|
{
|
|
143
148
|
"path": ".claude/skills/fix-task/SKILL.md",
|
|
@@ -367,7 +372,7 @@
|
|
|
367
372
|
{
|
|
368
373
|
"path": "clients/bongos-client/index.d.ts",
|
|
369
374
|
"mode": "0000644",
|
|
370
|
-
"sha256": "
|
|
375
|
+
"sha256": "88bfa3b136c58ce104a56cb2b7c922f11b55ae9e8ca0ec0d30d67bdb78ed70cf"
|
|
371
376
|
},
|
|
372
377
|
{
|
|
373
378
|
"path": "clients/bongos-client/index.mjs",
|
|
@@ -387,12 +392,12 @@
|
|
|
387
392
|
{
|
|
388
393
|
"path": "config/design-tokens.neutral.json",
|
|
389
394
|
"mode": "0000644",
|
|
390
|
-
"sha256": "
|
|
395
|
+
"sha256": "50d0705a8e37af0bda238327ba0a09f96bcec3d8d1eb0e090ea5a2fb22d9f928"
|
|
391
396
|
},
|
|
392
397
|
{
|
|
393
398
|
"path": "config/design-tokens.schema.json",
|
|
394
399
|
"mode": "0000644",
|
|
395
|
-
"sha256": "
|
|
400
|
+
"sha256": "0e1d5d75d0c990b4092876650875330adaaf4b1086d2731c14374a1f5659a31c"
|
|
396
401
|
},
|
|
397
402
|
{
|
|
398
403
|
"path": "config/government.neutral.json",
|
|
@@ -1479,25 +1484,30 @@
|
|
|
1479
1484
|
"mode": "0000644",
|
|
1480
1485
|
"sha256": "838197eef10523949529e6ca906a8b489e5a512df8915a48dc0edb15414a390e"
|
|
1481
1486
|
},
|
|
1487
|
+
{
|
|
1488
|
+
"path": "docs/adr/0197-the-ui-design-module.md",
|
|
1489
|
+
"mode": "0000644",
|
|
1490
|
+
"sha256": "901dcd1ca9748e999ea0db27e213f76c7e38caf620fb6b17fc8d1cf9dbee5e9d"
|
|
1491
|
+
},
|
|
1482
1492
|
{
|
|
1483
1493
|
"path": "docs/adr/README.md",
|
|
1484
1494
|
"mode": "0000644",
|
|
1485
|
-
"sha256": "
|
|
1495
|
+
"sha256": "34f327bac4b238f5af2c47e2eb5298f20c9aac35c336dcab29c11396be992e48"
|
|
1486
1496
|
},
|
|
1487
1497
|
{
|
|
1488
1498
|
"path": "docs/api-reference.md",
|
|
1489
1499
|
"mode": "0000644",
|
|
1490
|
-
"sha256": "
|
|
1500
|
+
"sha256": "567afe22acead45477a501c61b9aea2f6a99eac1cfa3cf87e143f7b5077567ca"
|
|
1491
1501
|
},
|
|
1492
1502
|
{
|
|
1493
1503
|
"path": "docs/api/openapi.json",
|
|
1494
1504
|
"mode": "0000644",
|
|
1495
|
-
"sha256": "
|
|
1505
|
+
"sha256": "e53b70240119fe856005a7627177d26bf559ab60fb003db5a7a31274fa432616"
|
|
1496
1506
|
},
|
|
1497
1507
|
{
|
|
1498
1508
|
"path": "docs/architecture.md",
|
|
1499
1509
|
"mode": "0000644",
|
|
1500
|
-
"sha256": "
|
|
1510
|
+
"sha256": "68d30a764a36e963d40e4271010c56b61a824b9e2fad61599fdc62ee1bc2fddf"
|
|
1501
1511
|
},
|
|
1502
1512
|
{
|
|
1503
1513
|
"path": "docs/branding-contract.md",
|
|
@@ -1517,17 +1527,12 @@
|
|
|
1517
1527
|
{
|
|
1518
1528
|
"path": "docs/copy-inventory.md",
|
|
1519
1529
|
"mode": "0000644",
|
|
1520
|
-
"sha256": "
|
|
1530
|
+
"sha256": "52655bf8c7a2c5860a1ce4486f1715769eba8b3e7162a4e43c78d582c935b7b0"
|
|
1521
1531
|
},
|
|
1522
1532
|
{
|
|
1523
1533
|
"path": "docs/copy-registry.json",
|
|
1524
1534
|
"mode": "0000644",
|
|
1525
|
-
"sha256": "
|
|
1526
|
-
},
|
|
1527
|
-
{
|
|
1528
|
-
"path": "docs/design-contract.md",
|
|
1529
|
-
"mode": "0000644",
|
|
1530
|
-
"sha256": "9623542a240479c3ecec12dd0c9050d4b79b2791a414bc2cd6b05d99530a9c44"
|
|
1535
|
+
"sha256": "da37e58c70ef12e106d81be96072ee66ec52cb26ac4e624b18ca2455b90719d3"
|
|
1531
1536
|
},
|
|
1532
1537
|
{
|
|
1533
1538
|
"path": "docs/design/apex-pass-2-direction.md",
|
|
@@ -1817,7 +1822,7 @@
|
|
|
1817
1822
|
{
|
|
1818
1823
|
"path": "docs/file-map.md",
|
|
1819
1824
|
"mode": "0000644",
|
|
1820
|
-
"sha256": "
|
|
1825
|
+
"sha256": "3789594e075f2501de76ac637a3adcb383e3bc611f84f985ed9e385e5d5c8169"
|
|
1821
1826
|
},
|
|
1822
1827
|
{
|
|
1823
1828
|
"path": "docs/handoff-template.md",
|
|
@@ -1827,7 +1832,7 @@
|
|
|
1827
1832
|
{
|
|
1828
1833
|
"path": "docs/modules-contract.md",
|
|
1829
1834
|
"mode": "0000644",
|
|
1830
|
-
"sha256": "
|
|
1835
|
+
"sha256": "1dddea16f7716cf500e329a73159d5f3a0548e4eed380148668b085712e985a7"
|
|
1831
1836
|
},
|
|
1832
1837
|
{
|
|
1833
1838
|
"path": "docs/onboarding/browser-terminal-guide.md",
|
|
@@ -1892,7 +1897,7 @@
|
|
|
1892
1897
|
{
|
|
1893
1898
|
"path": "docs/onboarding/slash-commands.md",
|
|
1894
1899
|
"mode": "0000644",
|
|
1895
|
-
"sha256": "
|
|
1900
|
+
"sha256": "8e8d5c7d0843faa2dc550a640676a824c9be319c751cf1a1cb19eaebeb86b153"
|
|
1896
1901
|
},
|
|
1897
1902
|
{
|
|
1898
1903
|
"path": "docs/project-context.template.md",
|
|
@@ -1922,7 +1927,7 @@
|
|
|
1922
1927
|
{
|
|
1923
1928
|
"path": "docs/recipes/claude-design-loop.md",
|
|
1924
1929
|
"mode": "0000644",
|
|
1925
|
-
"sha256": "
|
|
1930
|
+
"sha256": "96e8774c29aa5444dd0035af55a24ded99894caff5f901a7dc1eac35e75f605d"
|
|
1926
1931
|
},
|
|
1927
1932
|
{
|
|
1928
1933
|
"path": "docs/recipes/core-release-pipeline.md",
|
|
@@ -1947,7 +1952,7 @@
|
|
|
1947
1952
|
{
|
|
1948
1953
|
"path": "docs/recipes/figma-design-loop.md",
|
|
1949
1954
|
"mode": "0000644",
|
|
1950
|
-
"sha256": "
|
|
1955
|
+
"sha256": "80fcc5cb6e10e6f55bf518604c64072e8a0848cf157dbc1f761519f14eab8399"
|
|
1951
1956
|
},
|
|
1952
1957
|
{
|
|
1953
1958
|
"path": "docs/recipes/gds-db-backup.md",
|
|
@@ -3907,17 +3912,17 @@
|
|
|
3907
3912
|
{
|
|
3908
3913
|
"path": "modules/hall-ui/public/my-projects.css",
|
|
3909
3914
|
"mode": "0000644",
|
|
3910
|
-
"sha256": "
|
|
3915
|
+
"sha256": "443e24fc3e403cfc97c36a8f81fe81a540be84cbe52b6af86a1476fb87bc44b6"
|
|
3911
3916
|
},
|
|
3912
3917
|
{
|
|
3913
3918
|
"path": "modules/hall-ui/public/my-projects.html",
|
|
3914
3919
|
"mode": "0000644",
|
|
3915
|
-
"sha256": "
|
|
3920
|
+
"sha256": "764221e2425c7430e83469fc865198e1020bcc8c5950aae6c3c1cecb49132721"
|
|
3916
3921
|
},
|
|
3917
3922
|
{
|
|
3918
3923
|
"path": "modules/hall-ui/public/my-projects.js",
|
|
3919
3924
|
"mode": "0000644",
|
|
3920
|
-
"sha256": "
|
|
3925
|
+
"sha256": "e664a08787727fcd7019fe3008e3b9d63d07b9ab8be5043a46d3fcac5218f261"
|
|
3921
3926
|
},
|
|
3922
3927
|
{
|
|
3923
3928
|
"path": "modules/hall-ui/public/not-ready.html",
|
|
@@ -4732,7 +4737,7 @@
|
|
|
4732
4737
|
{
|
|
4733
4738
|
"path": "modules/platform-identity/routes/my-projects.js",
|
|
4734
4739
|
"mode": "0000644",
|
|
4735
|
-
"sha256": "
|
|
4740
|
+
"sha256": "fc948963cef6f7ef71b488cc5627310b6b217f3f62e13030b4da42a08e92796c"
|
|
4736
4741
|
},
|
|
4737
4742
|
{
|
|
4738
4743
|
"path": "modules/platform-identity/routes/profile.js",
|
|
@@ -5149,15 +5154,70 @@
|
|
|
5149
5154
|
"mode": "0000644",
|
|
5150
5155
|
"sha256": "75a40d70207669ab57b0be05e4b6be70a2936cb9febf333b0a34224a80047e7e"
|
|
5151
5156
|
},
|
|
5157
|
+
{
|
|
5158
|
+
"path": "modules/ui-design/CLAUDE.md",
|
|
5159
|
+
"mode": "0000644",
|
|
5160
|
+
"sha256": "7cb9dac9cb87b679e1ae50e4112b3a7928a38ebb9902c8947a74d17bec4d9009"
|
|
5161
|
+
},
|
|
5162
|
+
{
|
|
5163
|
+
"path": "modules/ui-design/adapters/claude-design/index.js",
|
|
5164
|
+
"mode": "0000644",
|
|
5165
|
+
"sha256": "3794d5b8736824033a916c77661caf995385334047f3167d29aa3e0aa32b5bed"
|
|
5166
|
+
},
|
|
5167
|
+
{
|
|
5168
|
+
"path": "modules/ui-design/adapters/figma/index.js",
|
|
5169
|
+
"mode": "0000644",
|
|
5170
|
+
"sha256": "859a23a1a10fe74717b37a4c86962750b7fd6d13b56ed801f6e217a245fea956"
|
|
5171
|
+
},
|
|
5172
|
+
{
|
|
5173
|
+
"path": "modules/ui-design/docs/design-contract.md",
|
|
5174
|
+
"mode": "0000644",
|
|
5175
|
+
"sha256": "2095ddb991fa02e6800b4f92e5536e82512af6abb9e791596365a87c541a0530"
|
|
5176
|
+
},
|
|
5177
|
+
{
|
|
5178
|
+
"path": "modules/ui-design/kit/README.md",
|
|
5179
|
+
"mode": "0000644",
|
|
5180
|
+
"sha256": "70f65052951335b63def03590ee971e2f482d6db08365484b532e4bc3c676495"
|
|
5181
|
+
},
|
|
5182
|
+
{
|
|
5183
|
+
"path": "modules/ui-design/module.json",
|
|
5184
|
+
"mode": "0000644",
|
|
5185
|
+
"sha256": "1dedeb68927743a51b048b7d3f70ea939958fcfe3831b22c4120d53d78beb2f8"
|
|
5186
|
+
},
|
|
5187
|
+
{
|
|
5188
|
+
"path": "modules/ui-design/scripts/design-sync.js",
|
|
5189
|
+
"mode": "0000644",
|
|
5190
|
+
"sha256": "c9376b96f9f963425f2cb2552b5b7b2e4d8264e3f4dac27c7e0410f95dfc3e7a"
|
|
5191
|
+
},
|
|
5192
|
+
{
|
|
5193
|
+
"path": "modules/ui-design/scripts/figma-design-sync.js",
|
|
5194
|
+
"mode": "0000644",
|
|
5195
|
+
"sha256": "ce7c64e5068be597e9676e184fc1f411b4a4661a00b4f1df11ea8bb511fb8347"
|
|
5196
|
+
},
|
|
5197
|
+
{
|
|
5198
|
+
"path": "modules/ui-design/scripts/validate-design.js",
|
|
5199
|
+
"mode": "0000644",
|
|
5200
|
+
"sha256": "c9d90b5ffb6e3895c8e98cefbdc89ff4fdd52a22a1073d8fe956a487c4b7816d"
|
|
5201
|
+
},
|
|
5202
|
+
{
|
|
5203
|
+
"path": "modules/ui-design/skills/README.md",
|
|
5204
|
+
"mode": "0000644",
|
|
5205
|
+
"sha256": "709a99b3879eec15552c7ce18291fad5a4922d477955982eb51b718577ee7948"
|
|
5206
|
+
},
|
|
5207
|
+
{
|
|
5208
|
+
"path": "modules/ui-design/styles/README.md",
|
|
5209
|
+
"mode": "0000644",
|
|
5210
|
+
"sha256": "5f98022a5edc4c1b405823cbf8ba8da745f60c3d47a7cb59eba537edf9bf29be"
|
|
5211
|
+
},
|
|
5152
5212
|
{
|
|
5153
5213
|
"path": "package-lock.json",
|
|
5154
5214
|
"mode": "0000644",
|
|
5155
|
-
"sha256": "
|
|
5215
|
+
"sha256": "7dd6552859e62daf201d9fdd1c17f95ea4a97bac3e5dc95d175ed0c8bbac88c7"
|
|
5156
5216
|
},
|
|
5157
5217
|
{
|
|
5158
5218
|
"path": "package.json",
|
|
5159
5219
|
"mode": "0000644",
|
|
5160
|
-
"sha256": "
|
|
5220
|
+
"sha256": "292bfaf5419d894c03339b6363173872ba73e896a9dceec60ff625568fe9ed60"
|
|
5161
5221
|
},
|
|
5162
5222
|
{
|
|
5163
5223
|
"path": "public-docs/index.html",
|
|
@@ -5797,7 +5857,7 @@
|
|
|
5797
5857
|
{
|
|
5798
5858
|
"path": "scripts/gds/copy-inventory.js",
|
|
5799
5859
|
"mode": "0000644",
|
|
5800
|
-
"sha256": "
|
|
5860
|
+
"sha256": "40d3f8bb29ccc13e12fd79de5f79b25eb9d7df5d0500b887c965199187f4ab8b"
|
|
5801
5861
|
},
|
|
5802
5862
|
{
|
|
5803
5863
|
"path": "scripts/gds/coreB-carve-proof.sh",
|
|
@@ -5837,7 +5897,7 @@
|
|
|
5837
5897
|
{
|
|
5838
5898
|
"path": "scripts/gds/design-sync.js",
|
|
5839
5899
|
"mode": "0000644",
|
|
5840
|
-
"sha256": "
|
|
5900
|
+
"sha256": "06901aa9fa0fcf89e0710f8f35274bc589f4711024e88350a981a453d5937f96"
|
|
5841
5901
|
},
|
|
5842
5902
|
{
|
|
5843
5903
|
"path": "scripts/gds/dev-lib.js",
|
|
@@ -5877,7 +5937,7 @@
|
|
|
5877
5937
|
{
|
|
5878
5938
|
"path": "scripts/gds/doc-cli-guard.js",
|
|
5879
5939
|
"mode": "0000644",
|
|
5880
|
-
"sha256": "
|
|
5940
|
+
"sha256": "de19e1ffe48ffb9ad942828dafe858a7d88a9269fa812474be5018b263772a3e"
|
|
5881
5941
|
},
|
|
5882
5942
|
{
|
|
5883
5943
|
"path": "scripts/gds/doc-comment-coverage.js",
|
|
@@ -5912,12 +5972,12 @@
|
|
|
5912
5972
|
{
|
|
5913
5973
|
"path": "scripts/gds/figma-design-sync.js",
|
|
5914
5974
|
"mode": "0000644",
|
|
5915
|
-
"sha256": "
|
|
5975
|
+
"sha256": "b8b1a7ed1d8dd217b24757a3ec9f4b3aa58b26a3e2a7b2cef9de217792e5ea43"
|
|
5916
5976
|
},
|
|
5917
5977
|
{
|
|
5918
5978
|
"path": "scripts/gds/fitness-checks-identity.js",
|
|
5919
5979
|
"mode": "0000644",
|
|
5920
|
-
"sha256": "
|
|
5980
|
+
"sha256": "142b37957cd6205da618001d8a14d45979a8d81107ce60791302b008df276555"
|
|
5921
5981
|
},
|
|
5922
5982
|
{
|
|
5923
5983
|
"path": "scripts/gds/fitness-checks-vocabulary.js",
|
|
@@ -6287,7 +6347,7 @@
|
|
|
6287
6347
|
{
|
|
6288
6348
|
"path": "scripts/gds/publish-manifest.js",
|
|
6289
6349
|
"mode": "0000644",
|
|
6290
|
-
"sha256": "
|
|
6350
|
+
"sha256": "6d97163d0d8019642105d0eef8b8e017ec6763679255053969a8f8db020773a8"
|
|
6291
6351
|
},
|
|
6292
6352
|
{
|
|
6293
6353
|
"path": "scripts/gds/pulse.js",
|
|
@@ -6742,7 +6802,7 @@
|
|
|
6742
6802
|
{
|
|
6743
6803
|
"path": "scripts/gds/validate-design.js",
|
|
6744
6804
|
"mode": "0000644",
|
|
6745
|
-
"sha256": "
|
|
6805
|
+
"sha256": "49e169d297e73fd32f27bc2af746a47c04a107abc39ae720122aa80f1ab1dff1"
|
|
6746
6806
|
},
|
|
6747
6807
|
{
|
|
6748
6808
|
"path": "scripts/gds/version-close.js",
|
|
@@ -6972,7 +7032,7 @@
|
|
|
6972
7032
|
{
|
|
6973
7033
|
"path": "src/bongos/module-scope-map.js",
|
|
6974
7034
|
"mode": "0000644",
|
|
6975
|
-
"sha256": "
|
|
7035
|
+
"sha256": "77dd62d640862624066bfcd2845c6ed2801091ce49ed676a809da3cce5077761"
|
|
6976
7036
|
},
|
|
6977
7037
|
{
|
|
6978
7038
|
"path": "src/bongos/module-submissions.js",
|
|
@@ -7147,7 +7207,7 @@
|
|
|
7147
7207
|
{
|
|
7148
7208
|
"path": "src/module-api.js",
|
|
7149
7209
|
"mode": "0000644",
|
|
7150
|
-
"sha256": "
|
|
7210
|
+
"sha256": "711a3add8803459721523364c9c993e30908475bebdf65eb83789f5520e91104"
|
|
7151
7211
|
},
|
|
7152
7212
|
{
|
|
7153
7213
|
"path": "src/module-loader/catalog.js",
|
|
@@ -7189,16 +7249,6 @@
|
|
|
7189
7249
|
"mode": "0000644",
|
|
7190
7250
|
"sha256": "a012619e42522c8b38ffdaf00cfe8d89a9438fc0cea00752474ab22f13d3f722"
|
|
7191
7251
|
},
|
|
7192
|
-
{
|
|
7193
|
-
"path": "src/ui/adapters/claude-design/index.js",
|
|
7194
|
-
"mode": "0000644",
|
|
7195
|
-
"sha256": "69ec9f8c405987a67570aca7375e8b29951898775cdb56fa7bc68a74dfcfd10b"
|
|
7196
|
-
},
|
|
7197
|
-
{
|
|
7198
|
-
"path": "src/ui/adapters/figma/index.js",
|
|
7199
|
-
"mode": "0000644",
|
|
7200
|
-
"sha256": "4331ee8d20ad98faac520cd42bcee2614820e15d1b1691ad3cee4584bbab9fb7"
|
|
7201
|
-
},
|
|
7202
7252
|
{
|
|
7203
7253
|
"path": "tests/abandon_task.mjs",
|
|
7204
7254
|
"mode": "0000644",
|
|
@@ -7837,7 +7887,7 @@
|
|
|
7837
7887
|
{
|
|
7838
7888
|
"path": "tests/design_tokens_sync.mjs",
|
|
7839
7889
|
"mode": "0000644",
|
|
7840
|
-
"sha256": "
|
|
7890
|
+
"sha256": "0454ee692bbbf19d02c7f19c029f4da5a4dd939b84c4d67ebb713d12de179c2a"
|
|
7841
7891
|
},
|
|
7842
7892
|
{
|
|
7843
7893
|
"path": "tests/dev_lib.mjs",
|
|
@@ -7967,7 +8017,7 @@
|
|
|
7967
8017
|
{
|
|
7968
8018
|
"path": "tests/doc_cli_guard.mjs",
|
|
7969
8019
|
"mode": "0000644",
|
|
7970
|
-
"sha256": "
|
|
8020
|
+
"sha256": "3c7567070ad3ce59fdfef9d57da39d62cf1e7c745bfeefd432c1b96c247b42ec"
|
|
7971
8021
|
},
|
|
7972
8022
|
{
|
|
7973
8023
|
"path": "tests/doc_comment_coverage.mjs",
|
|
@@ -8012,7 +8062,7 @@
|
|
|
8012
8062
|
{
|
|
8013
8063
|
"path": "tests/figma_adapter.mjs",
|
|
8014
8064
|
"mode": "0000644",
|
|
8015
|
-
"sha256": "
|
|
8065
|
+
"sha256": "73bb1d6cbbf6301a8aa92e9cb4fd4b7fe222cf3bb77d01778cbc5438fa549512"
|
|
8016
8066
|
},
|
|
8017
8067
|
{
|
|
8018
8068
|
"path": "tests/file_map.mjs",
|
|
@@ -8694,6 +8744,11 @@
|
|
|
8694
8744
|
"mode": "0000644",
|
|
8695
8745
|
"sha256": "d00e82184fbf7aab49c9b6efe5709b14f300ca0cea277a0eb140f073ded7ff50"
|
|
8696
8746
|
},
|
|
8747
|
+
{
|
|
8748
|
+
"path": "tests/join_application_note.mjs",
|
|
8749
|
+
"mode": "0000644",
|
|
8750
|
+
"sha256": "6db72752d69ebdfcc82bdf4f0e2445d7c8a939f6b4b88c1915c9f1d2f8eb9d76"
|
|
8751
|
+
},
|
|
8697
8752
|
{
|
|
8698
8753
|
"path": "tests/join_relay_outcome.mjs",
|
|
8699
8754
|
"mode": "0000644",
|
|
@@ -8927,7 +8982,7 @@
|
|
|
8927
8982
|
{
|
|
8928
8983
|
"path": "tests/module_loader.mjs",
|
|
8929
8984
|
"mode": "0000644",
|
|
8930
|
-
"sha256": "
|
|
8985
|
+
"sha256": "157fbb9db4830c87654edf6c6548fba2e535830c0c832bbdf0fd199019d6219f"
|
|
8931
8986
|
},
|
|
8932
8987
|
{
|
|
8933
8988
|
"path": "tests/module_manifest.mjs",
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design
|
|
3
|
+
description: The UI design session — the operating playbook for ui-discipline work (layouts, pages, components, design systems, the hall / status / landing surfaces) on ANY Cloud Bongos instance. Triggers when the user says "/design", "design this page", "let's work on the UI", "make this look right", "start a design session", or when a claimed task's discipline routes here (claim.js prints a directive to invoke /design for ui tasks). Show-first like /paint — the interface is judged by looking at it — and world-first: the instance's branding pack + DESIGN.md are read before any taste rule applies. Shipped by the ui-design module (ADR 0197).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are running a **UI design session**. Two things make it different from `/dev`: the work is judged **by looking at it** (so every step ends in a rendered screen, not a paragraph), and it is done **inside a world that is not yours** — the instance's, which you read first and never override. The `ui-design` module's [CLAUDE.md](../../../modules/ui-design/CLAUDE.md) is the reference; this file is the loop.
|
|
7
|
+
|
|
8
|
+
## Step 0 — detect the mode
|
|
9
|
+
|
|
10
|
+
- **Interactive** (someone is here to look and react): show, let them steer, iterate. One or two lines per step, then a screen.
|
|
11
|
+
- **Autonomous** (no one will look): build inside the contract, prove it in both modes, stage or park the screens for review, and **never ship an interface change blind** — a task that cannot be verified visually gets a release with a reason, not a guess.
|
|
12
|
+
|
|
13
|
+
## Step 1 — load the world before you draw anything
|
|
14
|
+
|
|
15
|
+
Read, in this order, and quote nothing from memory:
|
|
16
|
+
|
|
17
|
+
1. `config/branding.json` over `config/branding.neutral.json` — `theme.ui` is **the fifteen tokens** (thirteen colours + two font stacks): the only palette a platform surface may rely on.
|
|
18
|
+
2. `config/design-tokens.json` over `config/design-tokens.neutral.json` — the `--dt-*` tokens an adapter emits; `config/design-sources.json` — which tool authors each surface.
|
|
19
|
+
3. **`DESIGN.md` at the repo root** — the instance's world: palette + derived tiers, faces, materials, motion grammar, components, do's and don'ts, accessibility floors. If it names a rule, it wins over your taste.
|
|
20
|
+
4. The surface's own sheet and the nested `CLAUDE.md` of the directory you're in; `/recall <surface>` for what was already decided.
|
|
21
|
+
|
|
22
|
+
**No `DESIGN.md`?** Then the neutral pack *is* the world and the platform floors below are the whole rulebook. Say so in your notes and build to them. Do not invent a palette.
|
|
23
|
+
|
|
24
|
+
## Step 2 — look before you ship
|
|
25
|
+
|
|
26
|
+
Render the real surface before and after — never reason about layout from source alone:
|
|
27
|
+
|
|
28
|
+
- Stage it (`/builder-stage` on a box; a local stub + Playwright on a laptop — the kit under `modules/ui-design/kit/` ports the apex probes once [task 1003320](https://cloudbongos.com/builders#/task/1003320) lands) and screenshot **three widths (≥1280 / ~900 / ≤480) × two modes (light / dark)** at minimum.
|
|
29
|
+
- Show the screens, then caption them in one line. The person you're working with judges the picture.
|
|
30
|
+
- Grep the receiving page for class collisions before porting a component across pages (the landing's content sections are `.band`; the menu is `.menuBand`).
|
|
31
|
+
|
|
32
|
+
## Step 3 — build inside the contract (the platform floors)
|
|
33
|
+
|
|
34
|
+
These hold on every instance; a `DESIGN.md` may tighten them, never loosen them:
|
|
35
|
+
|
|
36
|
+
- **The Fifteen Rule** — every colour is a `var()` or a `color-mix()` of the fifteen; the only legal literal is pure black or white with alpha as a scrim, mask or halo.
|
|
37
|
+
- **The dark twins** — every dark rule written twice, byte-identical: `:root[data-mode="dark"]` and `@media (prefers-color-scheme: dark) { :root:not([data-mode="light"]) }`.
|
|
38
|
+
- **No page `:root`** — the pack's `:root` is spliced at the end of `<head>`; page tokens live on `body`.
|
|
39
|
+
- **The 24px floor** — every control clears 24px on both sides; primary pills 46–48px.
|
|
40
|
+
- **AA in both modes** — 4.5:1 body text, 3:1 large text and non-text, light *and* dark, measured from the real stylesheet.
|
|
41
|
+
- **The Kill Switch** — `prefers-reduced-motion: reduce` at the foot of the token layer kills every animation and transition; no motion in JavaScript; the rest frame is a complete composition.
|
|
42
|
+
|
|
43
|
+
Generated code uses the `--dt-*` variables; adapters write only `src/ui/<surface>/`, `assets/ui/<surface>/` and `config/design-sources.json`.
|
|
44
|
+
|
|
45
|
+
## Step 4 — prove it, then ship the tests with the UI
|
|
46
|
+
|
|
47
|
+
- `node scripts/gds/validate-design.js --strict` after touching adapters, tokens or `design-sources.json` (fitness runs it on every PR).
|
|
48
|
+
- **New interactive code gets a pin in the page's own test file in the same diff** — the grader's Quality worker fails a chrome change that arrives with no test. Contrast pairs are measured in CI, not eyeballed.
|
|
49
|
+
- The task's DONE WHEN is read literally — "both pages" means both pages. Deliberate deviations from a mock stay minor if the ship notes say why.
|
|
50
|
+
- `/builder-ship` with real `--notes` (what changed, which screens you looked at, in which modes) and a plain-language `--summary`.
|
|
51
|
+
|
|
52
|
+
## Round-tripping with a design tool
|
|
53
|
+
|
|
54
|
+
- **Claude Design** (`/design-sync`): export the tokens + surfaces in, land the generated code back under the claimed task. Design is code; it merges like code.
|
|
55
|
+
- **Figma** (`/figma-design-sync`): push the current state so a designer never opens a stale file; land their edit back as committed code. Canvas art that won't translate becomes an asset, never forced into code.
|
|
56
|
+
- Both are adapters against `modules/ui-design/docs/design-contract.md`; a third tool is a third adapter, not a new integration.
|
|
57
|
+
|
|
58
|
+
## Stay clear of
|
|
59
|
+
|
|
60
|
+
- The pack's neutral values and `DESIGN.md`'s named rules — changing the world is the owner's decision and an ADR, not a session's taste.
|
|
61
|
+
- A page-private palette, a hex that isn't one of the fifteen, a `:root` in a page, motion in JavaScript.
|
|
62
|
+
- Text: the copy half belongs to `copy-desk` — flag a string, don't rewrite the product's voice in passing.
|
|
63
|
+
- Image generation for anything but text-free hero plates (the owner's rule); UI is rebuilt from templates and the instance's world, not painted.
|
|
64
|
+
|
|
65
|
+
## How sessions reach this skill
|
|
66
|
+
|
|
67
|
+
- **Standalone:** invoke `/design` to have the loop in front of you.
|
|
68
|
+
- **From a claim:** a `ui`-discipline task makes `claim.js` print the `/design` directive from `scripts/gds/discipline-modes.json` — one carrier, one lookup, the same map `/dev`, `/paint` and `/ideate` ride.
|
|
@@ -7,7 +7,7 @@ You are helping the builder run the Claude Design sync loop: export the repo's d
|
|
|
7
7
|
|
|
8
8
|
## What this skill does
|
|
9
9
|
|
|
10
|
-
1. **Import** — `node scripts/gds/design-sync.js` builds a token-preview bundle (HTML color/typography/spacing/radii cards, `tokens.css`, `tokens.json`, `surfaces.json`) in a temp directory and prints a JSON manifest.
|
|
10
|
+
1. **Import** — `node scripts/gds/design-sync.js` (a thin shim over `modules/ui-design/scripts/design-sync.js`, the module home — ADR 0197) builds a token-preview bundle (HTML color/typography/spacing/radii cards, `tokens.css`, `tokens.json`, `surfaces.json`) in a temp directory and prints a JSON manifest.
|
|
11
11
|
2. **Push** — the DesignSync MCP tool (`list_projects` → `finalize_plan` → `write_files`) uploads the bundle to a Claude Design project.
|
|
12
12
|
3. **Export (handoff)** — when Claude Design generates UI code, the handoff lands it under a claimed Bongos task via `adapter.export()`.
|
|
13
13
|
|
|
@@ -41,7 +41,7 @@ HTML files with `<!-- @dsCard group="Tokens" -->` appear as Design System cards
|
|
|
41
41
|
When Claude Design finishes and hands off to Claude Code, call the adapter directly in Node:
|
|
42
42
|
|
|
43
43
|
```js
|
|
44
|
-
const adapter = require('./
|
|
44
|
+
const adapter = require('./modules/ui-design/adapters/claude-design/index.js');
|
|
45
45
|
await adapter.export({
|
|
46
46
|
repoRoot: process.cwd(),
|
|
47
47
|
surfaceId: '<surface-id>', // e.g. "hall-ui"
|
|
@@ -7,7 +7,7 @@ You are helping the builder run the Figma round-trip loop for the `ui` disciplin
|
|
|
7
7
|
|
|
8
8
|
## What this skill does
|
|
9
9
|
|
|
10
|
-
1. **Import (push)** — `node scripts/gds/figma-design-sync.js` builds a push plan (`figma-plan.json`: color-swatch frame, typography-specimen frame, one reference frame per surface) in a temp directory and prints a JSON manifest.
|
|
10
|
+
1. **Import (push)** — `node scripts/gds/figma-design-sync.js` (a thin shim over `modules/ui-design/scripts/figma-design-sync.js`, the module home — ADR 0197) builds a push plan (`figma-plan.json`: color-swatch frame, typography-specimen frame, one reference frame per surface) in a temp directory and prints a JSON manifest.
|
|
11
11
|
2. **Push** — the live Figma MCP tool (`mcp__figma__*` write capability, or `use_figma`) creates/updates the frames described in the plan inside the target Figma file. If write capability isn't available in this session, stop and surface the gap — do not fake the push.
|
|
12
12
|
3. **Export (handoff)** — when a designer finishes a Figma edit, hand its output to `adapter.export()`.
|
|
13
13
|
|
|
@@ -34,7 +34,7 @@ Figma hands back one of two shapes, depending on whether Code Connect is wired f
|
|
|
34
34
|
|
|
35
35
|
**Code Connect output (ready code — the common case):**
|
|
36
36
|
```js
|
|
37
|
-
const adapter = require('./
|
|
37
|
+
const adapter = require('./modules/ui-design/adapters/figma/index.js');
|
|
38
38
|
await adapter.export({
|
|
39
39
|
repoRoot: process.cwd(),
|
|
40
40
|
surfaceId: '<surface-id>',
|
|
@@ -61,7 +61,7 @@ Round-trip fidelity is limited to what Code Connect or the Figma MCP can extract
|
|
|
61
61
|
|
|
62
62
|
## Code-canonical vs. Figma-canonical
|
|
63
63
|
|
|
64
|
-
Code-canonical is the default: the repo is authoritative, Figma is a synced view. A surface may be flagged `"figmaCanonical": true` in `config/design-sources.json` as an explicit exception (docs/design-contract.md §3.4) — only do this when the builder explicitly asks for a surface a designer actively iterates on in Figma.
|
|
64
|
+
Code-canonical is the default: the repo is authoritative, Figma is a synced view. A surface may be flagged `"figmaCanonical": true` in `config/design-sources.json` as an explicit exception (modules/ui-design/docs/design-contract.md §3.4) — only do this when the builder explicitly asks for a surface a designer actively iterates on in Figma.
|
|
65
65
|
|
|
66
66
|
## Path safety
|
|
67
67
|
|
|
@@ -292,7 +292,7 @@ export interface PostModulesKeySubmitResponse { ok: boolean; submission: unknown
|
|
|
292
292
|
export interface PostMyProjectsClientIdLeaveResponse { ok: boolean; left: unknown }
|
|
293
293
|
export interface PostMyProjectsInvitesClientIdAcceptResponse { ok: boolean; accepted: boolean }
|
|
294
294
|
export interface PostMyProjectsInvitesClientIdDeclineResponse { ok: boolean; accepted: boolean }
|
|
295
|
-
export interface PostMyProjectsJoinRequest { origin: string }
|
|
295
|
+
export interface PostMyProjectsJoinRequest { origin: string; note?: string }
|
|
296
296
|
export interface PostMyProjectsJoinResponse { ok: boolean; status: unknown; project: unknown; message: unknown }
|
|
297
297
|
export interface PostOverrideRequestsIdDecideRequest { decision: string; note?: string }
|
|
298
298
|
export interface PostProjectsInviteRequest { client_id: string; github_login: string }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_note": "Cloud Bongos neutral design tokens — the baseline every instance resolves over. To override, copy values into config/design-tokens.json (the instance pack). These match config/branding.neutral.json theme.ui (the chrome world, task 1003298; tests/design_tokens_sync.mjs fails on drift) so a vanilla instance with no instance pack still renders correctly. The world's derived tokens, materials and motion grammar are recorded in DESIGN.md. See docs/design-contract.md.",
|
|
2
|
+
"_note": "Cloud Bongos neutral design tokens — the baseline every instance resolves over. To override, copy values into config/design-tokens.json (the instance pack). These match config/branding.neutral.json theme.ui (the chrome world, task 1003298; tests/design_tokens_sync.mjs fails on drift) so a vanilla instance with no instance pack still renders correctly. The world's derived tokens, materials and motion grammar are recorded in DESIGN.md. See modules/ui-design/docs/design-contract.md.",
|
|
3
3
|
"colors": {
|
|
4
4
|
"bg": "#edecee",
|
|
5
5
|
"bgCard": "#fbfafc",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "cloud-bongos/design-tokens",
|
|
4
4
|
"title": "Cloud Bongos design tokens",
|
|
5
|
-
"description": "Canonical design-token schema for a Cloud Bongos instance. Extends config/branding.json theme.ui. Validated by scripts/gds/validate-design.js. See docs/design-contract.md.",
|
|
5
|
+
"description": "Canonical design-token schema for a Cloud Bongos instance. Extends config/branding.json theme.ui. Validated by modules/ui-design/scripts/validate-design.js (node scripts/gds/validate-design.js is its shim). See modules/ui-design/docs/design-contract.md.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": ["colors", "fonts"],
|
|
8
8
|
"additionalProperties": false,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# ADR 0197 — The ui-design module: design is a platform capability; the instance owns its world
|
|
2
|
+
|
|
3
|
+
- **Status:** accepted
|
|
4
|
+
- **Date:** 2026-08-28
|
|
5
|
+
- **Task:** [task 1003324](https://cloudbongos.com/builders#/task/1003324) (goal 1000080 — Apex UI pass 2; the first of five tasks scoped with the owner on 2026-08-28: 1003320 the kit, 1003321 the skills, 1003322 the apex carve, 1003323 the style library)
|
|
6
|
+
- **Relates to:** [ADR 0081](<redacted>.md) (the tool-agnostic design layer this module absorbs), [ADR 0083](<redacted>.md) (the module system + the one-way rule), [ADR 0062 §7](<redacted>.md) (the core ↔ host split), [ADR 0108 §1](<redacted>.md) (host content vs the core package), [ADR 0196](<redacted>.md) (the chrome world as the token contract), ADR 0178 (the copy half), `modules/ui-design/CLAUDE.md`
|
|
7
|
+
|
|
8
|
+
## Context
|
|
9
|
+
|
|
10
|
+
ADR 0081 made the repo the source of truth for design and put its layer in core: two adapters under `src/ui/adapters/`, three CLIs under `scripts/gds/`, the contract at `docs/design-contract.md`, the tokens under `config/`. It shipped as *Cloud Bongos's* design machinery — and the whole-frontend pass under goal 1000080 (tasks 1003296–1003300) then built Cloud Bongos's own world on top of it: the chrome world, the fifteen-token contract, `DESIGN.md`, the probes and renderers that made "look before you ship" real, the vetted taste skills the sessions leaned on.
|
|
11
|
+
|
|
12
|
+
On 2026-08-28 the owner reframed what that work is. It is **not Cloud Bongos's front door**. It is a **platform capability**: every builder on every instance should be able to create and design good-looking, functional UIs *in line with that instance's world* — its palette, its faces, its materials — and build on them. Cloud Bongos's front door is the first customer of that capability, not its owner. The three things a builder needs (the contract and its tooling; a way to look before shipping; the taste and the looks) were scattered across core, session scratchpads and personal skill installs, with no home, no manifest and no line between "this is the platform's rule" and "this is Cloud Bongos's taste".
|
|
13
|
+
|
|
14
|
+
Two facts shaped the shape of the module:
|
|
15
|
+
|
|
16
|
+
1. **The core ↔ host split already had a name for this** (ADR 0062 §7): the core ships method, the instance ships identity. `config/design-tokens.*`, `config/design-sources.json` and `DESIGN.md` are identity; the adapters, the validator, the playbook and the floors are method.
|
|
17
|
+
2. **The module contract is the platform's unit of capability** (ADR 0083): a self-contained directory the loader discovers, that contributes what it ships and reaches core only through the doorway. grading, economy, memory are default-on because every instance grades, pays and remembers. Every instance has a face.
|
|
18
|
+
|
|
19
|
+
## Decision
|
|
20
|
+
|
|
21
|
+
1. **`modules/ui-design/` is a default-on core-domain module** that ships METHOD and never a world. It joins the default-on roster beside grading / economy / memory (`default: true`, `maintenance: core-maintained`) and is allowlisted in `publish-manifest.js`, so a released core carries it.
|
|
22
|
+
|
|
23
|
+
2. **ADR 0081's layer moves in; the host boundary stays out.** `src/ui/adapters/{claude-design,figma}` → `modules/ui-design/adapters/`; `scripts/gds/{design-sync,figma-design-sync,validate-design}.js` → `modules/ui-design/scripts/`; `docs/design-contract.md` → `modules/ui-design/docs/`. `config/design-tokens.neutral.json`, `config/design-tokens.schema.json` and `config/design-sources.json` **stay in `config/`**: they are the branding contract the module reads and never owns. `DESIGN.md` stays at the repo root: it is the instance's world. `src/ui/` is gone from the core tree — the contract's `src/ui/<surface>/` layout is what an adapter *targets* on an instance, not core code.
|
|
24
|
+
|
|
25
|
+
3. **Declaration-only.** The manifest contributes three skills (`design`, `design-sync`, `figma-design-sync`) and nothing else — no routes, pollers, web surfaces, migrations or ports (the `character-anim` shape). Consequences that matter: `GET /modules` lists it; `claude-materialize` skips its skills on an instance that disables it; disabling it withdraws the skills and touches no served surface, which is the DONE WHEN's "can be disabled without breaking anything" in structural form. It contributes **no `ui` discipline yet**: `enabledDisciplines()` feeds the hall settings page and newcomer-restock, neither of which knows `ui`; `discipline-modes.json` already routes a `ui` task to `/design`, so the playbook works today and offering the discipline on sign-up is a follow-up.
|
|
26
|
+
|
|
27
|
+
4. **The `/design` playbook exists.** `discipline-modes.json` has pointed `ui` tasks at a `/design` skill since task 1267; the skill was never written, so a claimed `ui` task told the builder to open a door that wasn't there. It is written now, in the `/paint` shape (show-first) with a world-first Step 1: read the instance's pack + `DESIGN.md`, and where an instance has none, the neutral pack + the floors are the whole rulebook — no page invents a palette.
|
|
28
|
+
|
|
29
|
+
5. **The module's `CLAUDE.md` draws the line between the platform's floors and the instance's world.** Floors — held on every instance, tightenable by a `DESIGN.md`, never loosenable — are the Fifteen Rule (thirteen colours + two font stacks are the only host-overridable surface), the dark twins (every dark rule written twice at (0,2,0)), no page `:root`, the 24px control floor, AA in both modes measured from the real stylesheet, and the Kill Switch (`prefers-reduced-motion` kills everything; no motion in JavaScript). The instance's world is everything those floors leave open: the palette, the faces, the materials, the motion grammar, the taste bans. This is the same split as ADR 0062 §7, written for design.
|
|
30
|
+
|
|
31
|
+
6. **The CLIs keep thin `scripts/gds/` shims** rather than every caller re-pointing at the module. Three reasons, all mechanical: `node scripts/gds/<x>.js` is the invocation form `claude-materialize` rewrites to `bongos exec scripts/gds/<x>.js` for a packaged core (a module path would not be rewritten and would not resolve at an instance root); `doc-cli-guard` (Check 22) resolves documented flags against `scripts/gds/` sources, so the shims carry the usage lines; and every carved domain before this one kept its commands under `scripts/gds/` (memory, ideas, sessions — "a command travels with its domain but stays under scripts/"). The module file is the implementation and the DONE WHEN's `node modules/ui-design/scripts/validate-design.js` runs it directly; the shim is a `require()` and nothing else. Inside the module the CLIs resolve the repo root by walking up from `__dirname` instead of the computed `require(path.resolve(…, 'src', 'instance-config'))` they carried before — a reach into core that the static boundary scanner could not see and that a module may not make (ADR 0083); the instance root *is* the repo root today (ADR 0108 §1), and when the core installs as a package the root arrives through the doorway.
|
|
32
|
+
|
|
33
|
+
7. **Three reserved homes, each named for the task that fills it:** `kit/` (task 1003320 — the stub, the renderer/auditor, the probes, the mock checker), `skills/` (task 1003321 — the vendored UI skills with provenance sidecars, a licence allowlist and the PLATFORM PREAMBLE; **the vendoring policy is that task's ADR**, this one only points at it), `styles/` (task 1003323 — looks as branding packs). A README in each so the home is visible in git and a builder landing there knows what belongs.
|
|
34
|
+
|
|
35
|
+
8. **The front door keeps its own key.** `public-landing` stays a separate module key (and carves to `modules/public-landing/` in task 1003322), because a customer of a capability is not part of it: a second instance's landing must be able to use `ui-design` without inheriting Cloud Bongos's page. The module's scope-map key covers its own dir, the three shims, its contributed skill dirs and the two recipes; none of those paths is protected, so a goal scoped to `ui-design` needs Metic, not Archon.
|
|
36
|
+
|
|
37
|
+
## Consequences
|
|
38
|
+
|
|
39
|
+
- **A builder on any instance gets the same entry.** `modules/ui-design/CLAUDE.md` is the door: what the module gives, how the world is resolved, which rules are the platform's and which are the instance's. The next three tasks fill the kit, the skills and the styles into homes that already exist and already have a manifest.
|
|
40
|
+
- **The one-way rule holds for the design layer for the first time.** The adapters and CLIs reach nothing in core; `<redacted>` guards them from now on. The core-side callers (the shims, `checkDesignContract`) live under `scripts/`, outside the kernel boundary.
|
|
41
|
+
- **knip loses sight of the moved files** — its `project` set covers `src/**` and `scripts/**`, not `modules/ui-design/**`. Accepted: the `knip_issue_count` ratchet is shrink-only and a module's files are exercised by its tests and by fitness, not by knip's reachability graph. Extending knip to module trees is a devsecops decision, not this carve's.
|
|
42
|
+
- **`copy-inventory.js`'s recorded mismatch changes wording, not meaning:** `src/ui/` no longer holds "only `adapters/`" — it no longer exists in the core tree. The registry note says so, and regenerates.
|
|
43
|
+
- **Nothing an instance serves changed.** The move is byte-identical in behaviour: same adapters, same CLIs, same validator, same contract text with its paths updated. `validate-design` runs green from the new home on a fresh clone.
|
|
44
|
+
|
|
45
|
+
## Rejected alternatives
|
|
46
|
+
|
|
47
|
+
- **Leave the layer in core and put only the kit/skills/styles in a module.** Splits one capability across two homes with two rulebooks — the exact scatter the owner asked to end. The contract and its adapters are the method; they go where the method lives.
|
|
48
|
+
- **Move `config/design-tokens.*` and `design-sources.json` into the module.** Makes the instance's world module-owned and module-versioned: re-theming an instance would mean editing the core package. The host boundary is the point of ADR 0062 §7; the tokens stay in `config/`.
|
|
49
|
+
- **Put the front door in the module (`ui-design` owns `public-landing/`).** A capability that ships its first customer's page cannot be reused by a second customer without inheriting the first's world. First customer, not owner.
|
|
50
|
+
- **Module-hosted CLIs with no shims.** Breaks `claude-materialize`'s rewrite on a packaged core and every documented invocation at once, for no boundary benefit — a shim is a `require()`.
|
|
51
|
+
- **Contribute the `ui` discipline now.** Surfaces it on sign-up before the hall settings page and newcomer-restock know it; a discipline that the restock cannot stock is a newcomer with no chore. Follow-up, once those readers are taught.
|
|
52
|
+
- **A `--dt-*`-only contract with no `DESIGN.md` resolution.** Tokens say *what the colours are*; they cannot say *what the world is* (materials, motion, taste bans). The floors/world split needs the prose file as much as the pack.
|