stylegallery 0.1.0 → 0.1.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 (230) hide show
  1. package/AGENTS.md +4 -1
  2. package/DOMAINS.md +2 -6
  3. package/GOVERNANCE.md +10 -9
  4. package/README.md +23 -127
  5. package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
  6. package/consumer-reference/agent-native/v2/material-registry.json +1 -0
  7. package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
  8. package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
  9. package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
  10. package/consumer-reference/contract.md +1 -1
  11. package/consumer-reference/index.md +5 -3
  12. package/layout/index.md +124 -0
  13. package/log.md +51 -0
  14. package/package.json +181 -22
  15. package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
  16. package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
  17. package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
  18. package/scripts/agent-native/v2/material-admission.mjs +295 -0
  19. package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
  20. package/scripts/agent-native/v2/material-context.mjs +251 -0
  21. package/scripts/agent-native/v2/material-identity.mjs +71 -0
  22. package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
  23. package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
  24. package/scripts/agent-native/v2/material-queries.mjs +398 -0
  25. package/scripts/agent-native/v2/material-registry.mjs +319 -0
  26. package/scripts/sg-material-mcp.mjs +98 -0
  27. package/scripts/sg-material.mjs +27 -0
  28. package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
  29. package/consumer-reference/baselines/calibration.json +0 -260
  30. package/consumer-reference/baselines/manifest.json +0 -21
  31. package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
  32. package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
  33. package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
  34. package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
  35. package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
  36. package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
  37. package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
  38. package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
  39. package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
  40. package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
  41. package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
  42. package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
  43. package/consumer-reference/fixtures/promotion/manifest.json +0 -15
  44. package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
  45. package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
  46. package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
  47. package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
  48. package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
  49. package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
  50. package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
  51. package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
  52. package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
  53. package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
  54. package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
  55. package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
  56. package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
  57. package/consumer-reference/fixtures/valid-deprecated.json +0 -21
  58. package/consumer-reference/fixtures/valid-experimental.json +0 -19
  59. package/consumer-reference/generated/manifest.json +0 -40
  60. package/consumer-reference/generated/tokens.css +0 -12
  61. package/consumer-reference/policies/shared-experimental.json +0 -37
  62. package/consumer-reference/schema/ax-evidence.schema.json +0 -30
  63. package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
  64. package/consumer-reference/schema/calibration-record.schema.json +0 -190
  65. package/consumer-reference/schema/capture-session.schema.json +0 -161
  66. package/consumer-reference/schema/component-state.schema.json +0 -150
  67. package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
  68. package/consumer-reference/schema/dom-evidence.schema.json +0 -38
  69. package/consumer-reference/schema/evidence-record.schema.json +0 -81
  70. package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
  71. package/consumer-reference/schema/item.schema.json +0 -188
  72. package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
  73. package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
  74. package/consumer-reference/schema/portable-tokens.schema.json +0 -104
  75. package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
  76. package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
  77. package/consumer-reference/schema/visual-evidence.schema.json +0 -31
  78. package/design-engineering/consumer-migration-readiness.md +0 -124
  79. package/design-engineering/interface-craft.md +0 -107
  80. package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
  81. package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
  82. package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
  83. package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
  84. package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
  85. package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
  86. package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
  87. package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
  88. package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
  89. package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
  90. package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
  91. package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
  92. package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
  93. package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
  94. package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
  95. package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
  96. package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
  97. package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
  98. package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
  99. package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
  100. package/game-ui/classification.md +0 -82
  101. package/game-ui/reference-record.md +0 -62
  102. package/game-ui/screen-hierarchy.md +0 -107
  103. package/game-ui/unity/architecture.md +0 -166
  104. package/game-ui/unity/cli-loop.md +0 -84
  105. package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
  106. package/game-ui/unity/org-wiki.md +0 -146
  107. package/game-ui/unity/repository-map.md +0 -102
  108. package/game-ui/unity/ui-systems.md +0 -85
  109. package/motion/practice-reference.md +0 -145
  110. package/motion/review-workflow.md +0 -86
  111. package/motion/vocabulary.md +0 -82
  112. package/platform-guides/apple-interaction.md +0 -89
  113. package/scripts/agent-native/events.mjs +0 -113
  114. package/scripts/agent-native/immutable-store.mjs +0 -102
  115. package/scripts/artifact-metadata.mjs +0 -20
  116. package/scripts/audit-evidence-freshness.mjs +0 -308
  117. package/scripts/baseline-contract.mjs +0 -189
  118. package/scripts/baseline-schema-parity.mjs +0 -40
  119. package/scripts/build-reference-artifacts.mjs +0 -127
  120. package/scripts/calibration-raw-contract.mjs +0 -172
  121. package/scripts/capture-session-contract.mjs +0 -187
  122. package/scripts/component-state-artifact-fixture.mjs +0 -44
  123. package/scripts/component-state-contract.mjs +0 -99
  124. package/scripts/component-state-semantics.mjs +0 -128
  125. package/scripts/component-state-workflow-contract.mjs +0 -67
  126. package/scripts/component-state-workflow-negative-cases.mjs +0 -64
  127. package/scripts/consumer-conformance-contract.mjs +0 -198
  128. package/scripts/consumer-evidence-governance-contract.mjs +0 -210
  129. package/scripts/consumer-reference-case-runner.mjs +0 -93
  130. package/scripts/consumer-reference-schema.mjs +0 -155
  131. package/scripts/create-component-state-session.mjs +0 -100
  132. package/scripts/create-page-evidence-session.mjs +0 -139
  133. package/scripts/domain-document-boundaries.mjs +0 -40
  134. package/scripts/domain-validation-checks.mjs +0 -141
  135. package/scripts/evidence-artifact-contract.mjs +0 -191
  136. package/scripts/finalize-component-state-evidence.mjs +0 -165
  137. package/scripts/finalize-page-evidence.mjs +0 -197
  138. package/scripts/generate-consumer-reference-evidence.mjs +0 -154
  139. package/scripts/generate-patterns.mjs +0 -218
  140. package/scripts/governance-matrix-contract.mjs +0 -73
  141. package/scripts/governance-matrix-negative-cases.mjs +0 -114
  142. package/scripts/governance-policy-contract.mjs +0 -49
  143. package/scripts/governance-test-fixture.mjs +0 -321
  144. package/scripts/governance-workflow-negative-cases.mjs +0 -241
  145. package/scripts/governed-profile-registry.mjs +0 -125
  146. package/scripts/json-schema-formats.mjs +0 -31
  147. package/scripts/markdown-structure.mjs +0 -45
  148. package/scripts/page-artifact-metadata.mjs +0 -124
  149. package/scripts/page-evidence-contract.mjs +0 -297
  150. package/scripts/page-evidence-fixture.mjs +0 -271
  151. package/scripts/pattern-data.mjs +0 -325
  152. package/scripts/profile-record-contract.mjs +0 -140
  153. package/scripts/promotion-attestation-contract.mjs +0 -91
  154. package/scripts/promotion-boundary-test-contract.mjs +0 -92
  155. package/scripts/promotion-fixture-inventory.mjs +0 -109
  156. package/scripts/promotion-governance-contract.mjs +0 -28
  157. package/scripts/reference-artifact-path-contract.mjs +0 -28
  158. package/scripts/reference-profile-contract.mjs +0 -114
  159. package/scripts/reference-token-contract.mjs +0 -156
  160. package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
  161. package/scripts/summarize-sentinel-calibration.mjs +0 -98
  162. package/scripts/test-agent-adapter-conformance.mjs +0 -250
  163. package/scripts/test-agent-conformance-receipt.mjs +0 -106
  164. package/scripts/test-agent-events.mjs +0 -81
  165. package/scripts/test-agent-execution-effects.mjs +0 -114
  166. package/scripts/test-agent-execution-fixtures.mjs +0 -140
  167. package/scripts/test-agent-execution-kernel.mjs +0 -39
  168. package/scripts/test-agent-execution-learning.mjs +0 -130
  169. package/scripts/test-agent-execution-lifecycle.mjs +0 -143
  170. package/scripts/test-agent-execution-safety.mjs +0 -158
  171. package/scripts/test-agent-execution-views.mjs +0 -117
  172. package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
  173. package/scripts/test-agent-knowledge-kernel.mjs +0 -183
  174. package/scripts/test-agent-learning.mjs +0 -246
  175. package/scripts/test-agent-mcp.mjs +0 -246
  176. package/scripts/test-agent-native-schemas.mjs +0 -215
  177. package/scripts/test-agent-projections.mjs +0 -249
  178. package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
  179. package/scripts/test-agent-registry-mutations.mjs +0 -110
  180. package/scripts/test-audit-evidence-freshness.mjs +0 -177
  181. package/scripts/test-component-state-sentinel.mjs +0 -35
  182. package/scripts/test-component-state-source-contract.mjs +0 -83
  183. package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
  184. package/scripts/test-consumer-reference-sentinel.mjs +0 -31
  185. package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
  186. package/scripts/test-json-cli-output.mjs +0 -151
  187. package/scripts/test-json-schema-formats.mjs +0 -40
  188. package/scripts/test-reference-adapters.mjs +0 -199
  189. package/scripts/test-renderer-purity.mjs +0 -34
  190. package/scripts/test-sg-cli.mjs +0 -129
  191. package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
  192. package/scripts/test-validate-baseline-manifest.mjs +0 -234
  193. package/scripts/test-validate-component-state-artifacts.mjs +0 -243
  194. package/scripts/test-validate-component-state.mjs +0 -106
  195. package/scripts/test-validate-consumer-conformance.mjs +0 -427
  196. package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
  197. package/scripts/test-validate-consumer-reference.mjs +0 -263
  198. package/scripts/test-validate-domains.mjs +0 -357
  199. package/scripts/test-validate-governance.mjs +0 -292
  200. package/scripts/test-validate-ia.mjs +0 -262
  201. package/scripts/test-validate-okf.mjs +0 -73
  202. package/scripts/test-validate-page-evidence.mjs +0 -302
  203. package/scripts/test-validate-patterns.mjs +0 -157
  204. package/scripts/test-validate-promotion-rfc.mjs +0 -250
  205. package/scripts/test-validate-reference-profiles.mjs +0 -170
  206. package/scripts/test-validate-unity-org-wiki.mjs +0 -57
  207. package/scripts/test-validate-unity-source-contracts.mjs +0 -67
  208. package/scripts/test-validate-vocabulary.mjs +0 -174
  209. package/scripts/test-validate-webpage-workflow.mjs +0 -293
  210. package/scripts/validate-baseline-manifest.mjs +0 -44
  211. package/scripts/validate-catalog.mjs +0 -65
  212. package/scripts/validate-component-state.mjs +0 -141
  213. package/scripts/validate-consumer-conformance.mjs +0 -477
  214. package/scripts/validate-consumer-reference.mjs +0 -288
  215. package/scripts/validate-domains.mjs +0 -237
  216. package/scripts/validate-governance.mjs +0 -248
  217. package/scripts/validate-ia.mjs +0 -136
  218. package/scripts/validate-links.mjs +0 -66
  219. package/scripts/validate-okf.mjs +0 -104
  220. package/scripts/validate-page-evidence.mjs +0 -191
  221. package/scripts/validate-patterns.mjs +0 -246
  222. package/scripts/validate-promotion-rfc.mjs +0 -224
  223. package/scripts/validate-reference-artifacts.mjs +0 -125
  224. package/scripts/validate-renderer-purity.mjs +0 -56
  225. package/scripts/validate-unity-org-wiki.mjs +0 -146
  226. package/scripts/validate-unity-source-contracts.mjs +0 -107
  227. package/scripts/validate-vocabulary.mjs +0 -115
  228. package/scripts/validate-webpage-workflow.mjs +0 -254
  229. package/scripts/visual-expectation-contract.mjs +0 -20
  230. package/scripts/workflow-action-contract.mjs +0 -163
@@ -1,357 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import os from "node:os";
5
- import path from "node:path";
6
- import { spawnSync } from "node:child_process";
7
- import { fileURLToPath, pathToFileURL } from "node:url";
8
-
9
- const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
10
- const validator = path.join(root, "scripts", "validate-domains.mjs");
11
- const revision = "220e8607c90b17337d210125777b7b695f26c221";
12
- const repository = "https://github.com/emilkowalski/skills";
13
- const unityCliLoopRepository = "https://github.com/hatayama/unity-cli-loop";
14
- const unityCliLoopRevision = "61a0fe6d7da0aa9d0bcbc6d95944dd069c483ff0";
15
- const vocabularyDomainList = "Use for: Layout, Motion, Design Engineering, Game UI, Platform Guides, root routing, and `domain` frontmatter on governed leaves.";
16
- const qualityDomainList = "`quality/` is shared StyleGallery infrastructure for deciding whether Layout, Motion, Design Engineering, Game UI, and Platform Guides claims are admissible.";
17
- const readmeConsumerReferenceBoundary = "without owning profiles, visual values, components, or a sixth domain";
18
- const qualityConsumerReferenceBoundary = "without classifying it as a sixth domain";
19
- const executableEvidenceDomainCoverage = "Five governed domains and their declared leaves are reachable and attributed.";
20
- const gameUiFindabilityScenario = "| Find the authority route for uGUI, UI Toolkit, or NGUI. | [README](../README.md) | [Unity UI Systems](../game-ui/unity/ui-systems.md) | The first selected route is Game UI, and the system-specific source and version boundary is reached within three hops. |";
21
-
22
- function indexPage(title, links) {
23
- return [
24
- `# ${title}`,
25
- "",
26
- "## Scope Boundary",
27
- "",
28
- "In scope: governed guidance for this domain.",
29
- "Out of scope: reusable Layout pattern CSS and universal authority.",
30
- "",
31
- "## Documents",
32
- "",
33
- ...links.map(([label, target]) => `- [${label}](${target})`),
34
- "",
35
- "## IA Navigation",
36
- "",
37
- "Parent: [StyleGallery](../index.md).",
38
- "Next: [Domains](../DOMAINS.md).",
39
- "",
40
- ].join("\n");
41
- }
42
-
43
- function leafPage({ title, domain, sourcePath, parent, next, lifecycle = "experimental", body = "", provenanceKind, forgedSourceFields = false, omitSourceFields = false }) {
44
- const frontmatter = [
45
- "---",
46
- "type: Domain Guide",
47
- `title: ${title}`,
48
- `description: Bounded ${title} guidance.`,
49
- `domain: ${domain}`,
50
- `lifecycle: ${lifecycle}`,
51
- ];
52
- if (provenanceKind) frontmatter.push(`provenance_kind: ${provenanceKind}`);
53
- if ((sourcePath && !provenanceKind && !omitSourceFields) || forgedSourceFields) {
54
- frontmatter.push(`source_repository: ${repository}`, `source_path: ${sourcePath}`, `source_revision: ${revision}`);
55
- }
56
- const attribution = provenanceKind === "local"
57
- ? ["- Local StyleGallery method; no upstream attribution."]
58
- : sourcePath ? [
59
- `- Upstream inspiration: ${repository}/blob/${revision}/${sourcePath}`,
60
- `- Snapshot: \`${revision}\``,
61
- "- Reuse form: independent method rewrite.",
62
- ] : ["- Reuse form: locally authored method."];
63
- return [
64
- ...frontmatter,
65
- "---",
66
- "",
67
- `# ${title}`,
68
- "",
69
- "## Repository Boundary",
70
- "",
71
- "This page is an independent method rewrite, not universal policy.",
72
- "",
73
- "## Reusable Method",
74
- "",
75
- "Use observable evidence and preserve ambiguity.",
76
- "",
77
- "## Opinionated Guidance",
78
- "",
79
- "Treat practitioner preferences as hypotheses.",
80
- "",
81
- "## Platform-Specific Guidance",
82
- "",
83
- "Label platform examples explicitly.",
84
- "",
85
- "## Unsupported Absolutes",
86
- "",
87
- "Do not promote categorical performance or accessibility claims.",
88
- "",
89
- "## Verification Contract",
90
- "",
91
- "Verify the claim on its actual surface.",
92
- body,
93
- "",
94
- "## Source, License, And Attribution",
95
- "",
96
- ...attribution,
97
- "",
98
- "## IA Navigation",
99
- "",
100
- `Parent: [Domain](${parent}).`,
101
- `Next: [Next](${next}).`,
102
- "",
103
- ].join("\n");
104
- }
105
-
106
- const localLeafPath = "design-engineering/consumer-migration-readiness.md";
107
- const localLeafRegistry = (canonicalDomains) => {
108
- const registry = structuredClone(canonicalDomains);
109
- const designEngineering = registry.find((domain) => domain.slug === "design-engineering");
110
- if (!designEngineering.leaves.some((leaf) => leaf.path === localLeafPath)) designEngineering.leaves.push({ path: localLeafPath, provenance: "local" });
111
- return registry;
112
- };
113
-
114
- const localLeaf = leafPage({
115
- title: "Consumer Migration Readiness",
116
- domain: "design-engineering",
117
- parent: "index.md",
118
- next: "../platform-guides/index.md",
119
- provenanceKind: "local",
120
- sourcePath: "unused/local-source.md",
121
- });
122
-
123
- const baseFiles = {
124
- "README.md": `# StyleGallery\n\nConsumer Reference is shared non-domain infrastructure ${readmeConsumerReferenceBoundary}.\n\n- [Layout](layout/index.md)\n- [Motion](motion/index.md)\n- [Design Engineering](design-engineering/index.md)\n- [Game UI](game-ui/index.md)\n- [Platform Guides](platform-guides/index.md)\n`,
125
- "index.md": "# StyleGallery\n\n- [Layout](layout/index.md)\n- [Motion](motion/index.md)\n- [Design Engineering](design-engineering/index.md)\n- [Game UI](game-ui/index.md)\n- [Platform Guides](platform-guides/index.md)\n",
126
- "DOMAINS.md": [
127
- "# StyleGallery Domains",
128
- "",
129
- "## Domain Contract",
130
- "",
131
- "| Domain | Hub | Lifecycle |",
132
- "| --- | --- | --- |",
133
- "| Layout | [Layout](layout/index.md) | `stable` and `generated` |",
134
- "| Motion | [Motion](motion/index.md) | `experimental` |",
135
- "| Design Engineering | [Design Engineering](design-engineering/index.md) | `experimental` |",
136
- "| Game UI | [Game UI](game-ui/index.md) | `experimental` |",
137
- "| Platform Guides | [Platform Guides](platform-guides/index.md) | `experimental` |",
138
- "",
139
- "## Page Manifest",
140
- "",
141
- "| Domain | Manual hub | Governed leaves |",
142
- "| --- | --- | --- |",
143
- "| Layout | `layout/index.md` | Existing Layout corpus. |",
144
- "| Motion | `motion/index.md` | `motion/vocabulary.md`, `motion/review-workflow.md`, `motion/practice-reference.md` |",
145
- "| Design Engineering | `design-engineering/index.md` | `design-engineering/interface-craft.md`, `design-engineering/consumer-migration-readiness.md`, `design-engineering/reference-profiles/index.md`, `design-engineering/reference-profiles/governed-local/index.md`, `design-engineering/reference-profiles/external-adaptation/index.md` |",
146
- "| Game UI | `game-ui/index.md` | `game-ui/classification.md`, `game-ui/screen-hierarchy.md`, `game-ui/reference-record.md`, `game-ui/unity/architecture.md`, `game-ui/unity/ui-systems.md`, `game-ui/unity/cli-loop.md`, `game-ui/unity/repository-map.md`, `game-ui/unity/org-wiki.md` |",
147
- "| Platform Guides | `platform-guides/index.md` | `platform-guides/apple-interaction.md` |",
148
- "",
149
- `Source snapshot \`${revision}\`.`,
150
- "",
151
- "## Shared Non-Domain Infrastructure",
152
- "",
153
- "[Consumer Reference](consumer-reference/index.md) is shared infrastructure outside the five-domain contract and cannot add a sixth domain row.",
154
- "",
155
- "### Consumer Reference Promotion",
156
- "",
157
- "The gateway applies only to consumer-local → shared-experimental invariant eligibility.",
158
- "Editorial and terminal are related examples in one fixture set.",
159
- "Shared stable has no numeric adoption threshold.",
160
- "Normative correctness may waive adoption count only.",
161
- "A stable contract is never silently relabeled experimental.",
162
- "Promotion records are JSON-only and examples have zero adopter attestations.",
163
- "",
164
- ].join("\n"),
165
- "layout/index.md": indexPage("Layout", [["Catalog", "../CATALOG.md"]]),
166
- "motion/index.md": indexPage("Motion", [["Motion Vocabulary", "vocabulary.md"], ["Motion Review Workflow", "review-workflow.md"], ["Motion Practice Reference", "practice-reference.md"]]),
167
- "motion/vocabulary.md": leafPage({ title: "Motion Vocabulary", domain: "motion", sourcePath: "skills/animation-vocabulary/SKILL.md", parent: "index.md", next: "review-workflow.md" }),
168
- "motion/review-workflow.md": leafPage({ title: "Motion Review Workflow", domain: "motion", sourcePath: "skills/review-animations/SKILL.md", parent: "index.md", next: "practice-reference.md" }),
169
- "motion/practice-reference.md": leafPage({ title: "Motion Practice Reference", domain: "motion", sourcePath: "skills/review-animations/STANDARDS.md", parent: "index.md", next: "../design-engineering/index.md" }),
170
- "design-engineering/index.md": indexPage("Design Engineering", [["Interface Craft", "interface-craft.md"], ["Consumer Migration Readiness", "consumer-migration-readiness.md"], ["Reference Profiles", "reference-profiles/index.md"]]),
171
- "design-engineering/interface-craft.md": leafPage({ title: "Interface Craft", domain: "design-engineering", sourcePath: "skills/emil-design-eng/SKILL.md", parent: "index.md", next: "../platform-guides/index.md" }),
172
- [localLeafPath]: localLeaf,
173
- "design-engineering/reference-profiles/index.md": "# Reference Profiles\n\nDomain classification: design-engineering.\n\n- [Governed Local Profiles](governed-local/index.md)\n\nParent: [Design Engineering](../index.md).\nNext: [External adaptation](external-adaptation/index.md).\n",
174
- "design-engineering/reference-profiles/governed-local/index.md": "# Governed Local Profiles\n\nParent: [Reference Profiles](../index.md).\nNext: [External adaptation](../external-adaptation/index.md).\n",
175
- "design-engineering/reference-profiles/external-adaptation/index.md": "# External Adaptation\n\nSynthetic validator coverage only; no durable adopter record.\n\nParent: [Reference Profiles](../index.md).\nNext: [Platform Guides](../../../platform-guides/index.md).\n",
176
- "game-ui/index.md": indexPage("Game UI", [["Game UI Classification", "classification.md"], ["Game UI Screen Hierarchy", "screen-hierarchy.md"], ["Game UI Reference Record", "reference-record.md"], ["Unity UI Architecture", "unity/architecture.md"], ["Unity UI Systems", "unity/ui-systems.md"], ["Unity CLI Loop", "unity/cli-loop.md"], ["Unity Repository Map", "unity/repository-map.md"], ["Unity Organization Compressed Wiki", "unity/org-wiki.md"]]),
177
- "game-ui/classification.md": leafPage({ title: "Game UI Classification", domain: "game-ui", parent: "index.md", next: "screen-hierarchy.md" }),
178
- "game-ui/screen-hierarchy.md": leafPage({ title: "Game UI Screen Hierarchy", domain: "game-ui", parent: "index.md", next: "reference-record.md" }),
179
- "game-ui/reference-record.md": leafPage({ title: "Game UI Reference Record", domain: "game-ui", parent: "index.md", next: "../platform-guides/index.md" }),
180
- "game-ui/unity/architecture.md": leafPage({ title: "Unity UI Architecture", domain: "game-ui", sourcePath: "README.md", parent: "../index.md", next: "ui-systems.md" })
181
- .replaceAll(repository, "https://github.com/annulusgames/UGUIAnimationSamples")
182
- .replaceAll(revision, "343c8110e5683be209cc01ccb4cb986175e61643"),
183
- "game-ui/unity/ui-systems.md": leafPage({ title: "Unity UI Systems", domain: "game-ui", parent: "../index.md", next: "cli-loop.md" }),
184
- "game-ui/unity/cli-loop.md": leafPage({ title: "Unity CLI Loop", domain: "game-ui", sourcePath: "README.md", parent: "../index.md", next: "repository-map.md" })
185
- .replaceAll(repository, unityCliLoopRepository)
186
- .replaceAll(revision, unityCliLoopRevision),
187
- "game-ui/unity/repository-map.md": leafPage({ title: "Unity Repository Map", domain: "game-ui", parent: "../index.md", next: "org-wiki.md" }),
188
- "game-ui/unity/org-wiki.md": leafPage({ title: "Unity Organization Compressed Wiki", domain: "game-ui", parent: "../index.md", next: "../../platform-guides/index.md" }),
189
- "platform-guides/index.md": indexPage("Platform Guides", [["Apple Interaction", "apple-interaction.md"]]),
190
- "platform-guides/apple-interaction.md": leafPage({ title: "Apple Interaction", domain: "platform-guides", sourcePath: "skills/apple-design/SKILL.md", parent: "index.md", next: "../layout/index.md" }),
191
- "quality/claim-records/stylegallery-multidomain-scope.md": "# Scope Decision\n\nStyleGallery supersedes the layout-only repository identity.\n",
192
- "guides/vocabulary.md": `# Controlled Vocabulary\n\n- Canonical: \`domain\`\n - ${vocabularyDomainList}\n`,
193
- "quality/index.md": `# Quality Gates\n\n${qualityDomainList}\n\nThe handoff reaches the shared contract ${qualityConsumerReferenceBoundary}.\n\n${gameUiFindabilityScenario}\n`,
194
- "quality/evidence/executable-evidence.md": `# Executable Evidence Coverage\n\n${executableEvidenceDomainCoverage}\n`,
195
- "CATALOG.md": "# Catalog\n",
196
- };
197
-
198
- const cases = [
199
- { name: "empty_manifest", mutate: ["DOMAINS.md", baseFiles["DOMAINS.md"], "# Empty manifest\n"], expect: "DOMAINS.md: missing canonical domain contract" },
200
- { name: "manifest_extra_domain", mutate: ["DOMAINS.md", "| Platform Guides | [Platform Guides](platform-guides/index.md) | `experimental` |", "| Platform Guides | [Platform Guides](platform-guides/index.md) | `experimental` |\n| Other | [Other](other/index.md) | `experimental` |"], expect: "DOMAINS.md: missing canonical domain contract" },
201
- { name: "consumer_reference_sixth_domain", mutate: ["DOMAINS.md", "| Platform Guides | [Platform Guides](platform-guides/index.md) | `experimental` |", "| Platform Guides | [Platform Guides](platform-guides/index.md) | `experimental` |\n| Consumer Reference | [Consumer Reference](consumer-reference/index.md) | `stable` |"], expect: "DOMAINS.md: missing canonical domain contract" },
202
- { name: "consumer_reference_four_domain_contract", mutate: ["DOMAINS.md", "five-domain contract", "four-domain contract"], expect: "DOMAINS.md: missing canonical domain contract" },
203
- { name: "promotion_stable_by_count", mutate: ["DOMAINS.md", "Shared stable has no numeric adoption threshold.", "Shared stable uses a numeric adoption threshold."], expect: "DOMAINS.md: missing promotion boundary Shared stable has no numeric adoption threshold" },
204
- { name: "promotion_related_as_independent", mutate: ["DOMAINS.md", "Editorial and terminal are related examples in one fixture set.", "Editorial and terminal are independent consumers."], expect: "DOMAINS.md: missing promotion boundary Editorial and terminal are related examples in one fixture set" },
205
- { name: "promotion_yaml_route", mutate: ["DOMAINS.md", "Promotion records are JSON-only", "Promotion records may use YAML"], expect: "DOMAINS.md: missing promotion boundary Promotion records are JSON-only" },
206
- { name: "reference_profiles_fifth_domain", mutate: ["design-engineering/reference-profiles/index.md", "Domain classification: design-engineering.", "Domain classification: reference-profiles."], expect: "design-engineering/reference-profiles/index.md: reference profiles must remain in the Design Engineering domain" },
207
- { name: "manifest_extra_leaf", mutate: ["DOMAINS.md", "`motion/vocabulary.md`,", "`motion/vocabulary.md`, `motion/ghost.md`,"], expect: "DOMAINS.md: missing canonical domain contract" },
208
- { name: "manifest_wrong_lifecycle", mutate: ["DOMAINS.md", "| Motion | [Motion](motion/index.md) | `experimental` |", "| Motion | [Motion](motion/index.md) | `stable` |"], expect: "DOMAINS.md: missing canonical domain contract" },
209
- { name: "missing_domain_index", omit: ["design-engineering/index.md"], expect: "design-engineering/index.md: missing file" },
210
- { name: "missing_domain_leaf", omit: ["motion/vocabulary.md"], expect: "motion/vocabulary.md: missing file" },
211
- { name: "missing_local_domain_leaf", omit: ["game-ui/classification.md"], expect: "game-ui/classification.md: missing file" },
212
- { name: "missing_unity_ui_systems_leaf", omit: ["game-ui/unity/ui-systems.md"], expect: "game-ui/unity/ui-systems.md: missing file" },
213
- { name: "missing_unity_cli_loop_leaf", omit: ["game-ui/unity/cli-loop.md"], expect: "game-ui/unity/cli-loop.md: missing file" },
214
- { name: "missing_unity_repository_map_leaf", omit: ["game-ui/unity/repository-map.md"], expect: "game-ui/unity/repository-map.md: missing file" },
215
- { name: "missing_unity_org_wiki_leaf", omit: ["game-ui/unity/org-wiki.md"], expect: "game-ui/unity/org-wiki.md: missing file" },
216
- { name: "undeclared_domain_leaf", add: ["motion/rogue.md", "# Rogue\n"], expect: "motion/rogue.md: undeclared governed domain document" },
217
- {
218
- name: "local_leaf_success",
219
- registry: localLeafRegistry,
220
- expect: null,
221
- },
222
- {
223
- name: "local_leaf_missing_provenance",
224
- registry: localLeafRegistry,
225
- mutate: [localLeafPath, "provenance_kind: local\n", ""],
226
- expect: "design-engineering/consumer-migration-readiness.md: missing provenance_kind",
227
- },
228
- {
229
- name: "local_leaf_forged_source",
230
- registry: localLeafRegistry,
231
- add: [localLeafPath, leafPage({ title: "Consumer Migration Readiness", domain: "design-engineering", parent: "index.md", next: "../platform-guides/index.md", sourcePath: "unused/local-source.md", provenanceKind: "local", forgedSourceFields: true })],
232
- expect: "design-engineering/consumer-migration-readiness.md: local leaf must not declare source_repository",
233
- },
234
- { name: "undeclared_local_leaf", add: ["design-engineering/rogue-local.md", localLeaf.replace("title: Consumer Migration Readiness", "title: Rogue Local Method")], expect: "design-engineering/rogue-local.md: undeclared governed domain document" },
235
- { name: "undeclared_nested_game_ui_leaf", add: ["game-ui/unity/rogue.md", "# Rogue\n"], expect: "game-ui/unity/rogue.md: undeclared governed domain document" },
236
- { name: "unknown_domain", mutate: ["motion/vocabulary.md", "domain: motion", "domain: unknown"], expect: "motion/vocabulary.md: unknown domain unknown" },
237
- { name: "wrong_domain", mutate: ["motion/vocabulary.md", "domain: motion", "domain: platform-guides"], expect: "motion/vocabulary.md: domain platform-guides does not match motion" },
238
- { name: "missing_lifecycle", mutate: ["motion/vocabulary.md", "lifecycle: experimental\n", ""], expect: "motion/vocabulary.md: missing lifecycle" },
239
- { name: "short_revision", mutate: ["motion/vocabulary.md", revision, "220e860"], expect: "motion/vocabulary.md: source_revision must be a full 40-character lowercase Git SHA" },
240
- { name: "wrong_full_revision", mutate: ["motion/vocabulary.md", revision, "0000000000000000000000000000000000000000"], expect: "motion/vocabulary.md: unexpected source_revision 0000000000000000000000000000000000000000" },
241
- { name: "wrong_source_path", mutate: ["motion/vocabulary.md", "skills/animation-vocabulary/SKILL.md", "skills/apple-design/SKILL.md"], expect: "motion/vocabulary.md: unexpected source_path skills/apple-design/SKILL.md" },
242
- { name: "unity_wrong_domain", mutate: ["game-ui/unity/architecture.md", "domain: game-ui", "domain: platform-guides"], expect: "game-ui/unity/architecture.md: domain platform-guides does not match game-ui" },
243
- { name: "unity_wrong_repository", mutate: ["game-ui/unity/architecture.md", "https://github.com/annulusgames/UGUIAnimationSamples", repository], expect: `game-ui/unity/architecture.md: unexpected source_repository ${repository}` },
244
- { name: "unity_wrong_revision", mutate: ["game-ui/unity/architecture.md", "343c8110e5683be209cc01ccb4cb986175e61643", revision], expect: `game-ui/unity/architecture.md: unexpected source_revision ${revision}` },
245
- { name: "unity_ui_systems_wrong_domain", mutate: ["game-ui/unity/ui-systems.md", "domain: game-ui", "domain: platform-guides"], expect: "game-ui/unity/ui-systems.md: domain platform-guides does not match game-ui" },
246
- { name: "unity_repository_map_wrong_domain", mutate: ["game-ui/unity/repository-map.md", "domain: game-ui", "domain: motion"], expect: "game-ui/unity/repository-map.md: domain motion does not match game-ui" },
247
- { name: "unity_org_wiki_wrong_domain", mutate: ["game-ui/unity/org-wiki.md", "domain: game-ui", "domain: motion"], expect: "game-ui/unity/org-wiki.md: domain motion does not match game-ui" },
248
- { name: "unity_ui_systems_unexpected_source", mutate: ["game-ui/unity/ui-systems.md", "lifecycle: experimental", `lifecycle: experimental\nsource_repository: ${repository}`], expect: "game-ui/unity/ui-systems.md: locally authored leaf must omit source_repository" },
249
- { name: "unity_repository_map_unexpected_source", mutate: ["game-ui/unity/repository-map.md", "lifecycle: experimental", `lifecycle: experimental\nsource_repository: ${repository}`], expect: "game-ui/unity/repository-map.md: locally authored leaf must omit source_repository" },
250
- { name: "unity_org_wiki_unexpected_source", mutate: ["game-ui/unity/org-wiki.md", "lifecycle: experimental", `lifecycle: experimental\nsource_repository: ${repository}`], expect: "game-ui/unity/org-wiki.md: locally authored leaf must omit source_repository" },
251
- { name: "unity_cli_loop_wrong_repository", mutate: ["game-ui/unity/cli-loop.md", unityCliLoopRepository, repository], expect: `game-ui/unity/cli-loop.md: unexpected source_repository ${repository}` },
252
- { name: "unity_cli_loop_wrong_source_path", mutate: ["game-ui/unity/cli-loop.md", "source_path: README.md", "source_path: package.json"], expect: "game-ui/unity/cli-loop.md: unexpected source_path package.json" },
253
- { name: "unity_cli_loop_wrong_revision", mutate: ["game-ui/unity/cli-loop.md", unityCliLoopRevision, revision], expect: `game-ui/unity/cli-loop.md: unexpected source_revision ${revision}` },
254
- { name: "missing_scope", mutate: ["motion/index.md", "## Scope Boundary", "## Boundary"], expect: "motion/index.md: missing Scope Boundary section" },
255
- { name: "scope_only_in_fence", mutate: ["motion/index.md", "## Scope Boundary", "## Boundary\n\n```md\n## Scope Boundary\nIn scope: fake\nOut of scope: fake\n```"], expect: "motion/index.md: missing Scope Boundary section" },
256
- { name: "scope_only_in_tilde_fence", mutate: ["motion/index.md", "## Scope Boundary", "## Boundary\n\n~~~md\n## Scope Boundary\nIn scope: fake\nOut of scope: fake\n~~~"], expect: "motion/index.md: missing Scope Boundary section" },
257
- { name: "missing_parent", mutate: ["motion/vocabulary.md", "Parent: [Domain](index.md).", ""], expect: "motion/vocabulary.md: missing Parent navigation link" },
258
- { name: "missing_next", mutate: ["motion/vocabulary.md", "Next: [Next](review-workflow.md).", ""], expect: "motion/vocabulary.md: missing Next navigation link" },
259
- { name: "duplicate_title", mutate: ["design-engineering/interface-craft.md", "title: Interface Craft", "title: Motion Vocabulary"], expect: "design-engineering/interface-craft.md: duplicate title Motion Vocabulary" },
260
- { name: "unreachable_domain", mutate: ["README.md", "- [Motion](motion/index.md)\n", ""], expect: "README.md: missing [Motion](motion/index.md)" },
261
- { name: "route_only_in_fence", mutate: ["README.md", "- [Motion](motion/index.md)\n", "```md\n- [Motion](motion/index.md)\n```\n"], expect: "README.md: missing [Motion](motion/index.md)" },
262
- { name: "route_only_in_backtick_fence_with_tilde_info", mutate: ["README.md", "- [Motion](motion/index.md)\n", "```md~example\n- [Motion](motion/index.md)\n```\n"], expect: "README.md: missing [Motion](motion/index.md)" },
263
- { name: "route_only_in_tilde_fence_with_backtick_info", mutate: ["README.md", "- [Motion](motion/index.md)\n", "~~~md`example\n- [Motion](motion/index.md)\n~~~\n"], expect: "README.md: missing [Motion](motion/index.md)" },
264
- { name: "game_ui_route_only_in_html_comment", mutate: ["README.md", "- [Game UI](game-ui/index.md)\n", "<!-- - [Game UI](game-ui/index.md) -->\n"], expect: "README.md: missing [Game UI](game-ui/index.md)" },
265
- { name: "required_section_only_in_html_comment", mutate: ["motion/vocabulary.md", "## Verification Contract", "<!--\n## Verification Contract\n-->"], expect: "motion/vocabulary.md: missing Verification Contract section" },
266
- { name: "blank_forbidden_source_key", mutate: ["game-ui/unity/ui-systems.md", "lifecycle: experimental\n---", "lifecycle: experimental\nsource_repository:\n---"], expect: "game-ui/unity/ui-systems.md: locally authored leaf must omit source_repository" },
267
- { name: "omo_dependency", mutate: ["motion/vocabulary.md", "Verify the claim on its actual surface.", "Verify with [draft](../.omo/research.md)."], expect: "motion/vocabulary.md: tracked document must not depend on .omo" },
268
- { name: "omo_directory_dependency", mutate: ["motion/vocabulary.md", "Verify the claim on its actual surface.", "Verify with [draft](../.omo)."], expect: "motion/vocabulary.md: tracked document must not depend on .omo" },
269
- { name: "omo_reference_dependency", mutate: ["motion/vocabulary.md", "Verify the claim on its actual surface.", "Verify with [draft][work].\n\n[work]: ../.omo/research.md"], expect: "motion/vocabulary.md: tracked document must not depend on .omo" },
270
- { name: "canonical_while_experimental", mutate: ["motion/vocabulary.md", "Treat practitioner preferences as hypotheses.", "This is canonical universal policy."], expect: "motion/vocabulary.md: experimental document claims canonical authority" },
271
- { name: "vocabulary_missing_game_ui", mutate: ["guides/vocabulary.md", vocabularyDomainList, vocabularyDomainList.replace("Game UI, ", "")], expect: "guides/vocabulary.md: missing canonical five-domain vocabulary list" },
272
- { name: "quality_missing_game_ui", mutate: ["quality/index.md", qualityDomainList, qualityDomainList.replace("Game UI, and ", "and ")], expect: "quality/index.md: missing canonical five-domain quality scope" },
273
- { name: "quality_missing_game_ui_findability_scenario", mutate: ["quality/index.md", `${gameUiFindabilityScenario}\n`, ""], expect: "quality/index.md: missing Game UI findability QA scenario" },
274
- { name: "readme_stale_consumer_reference_ordinal", mutate: ["README.md", "sixth domain", "fifth domain"], expect: "README.md: missing canonical Consumer Reference boundary" },
275
- { name: "quality_stale_consumer_reference_ordinal", mutate: ["quality/index.md", "sixth domain", "fifth domain"], expect: "quality/index.md: missing canonical Consumer Reference boundary" },
276
- { name: "executable_evidence_stale_domain_count", mutate: ["quality/evidence/executable-evidence.md", "Five governed domains", "Four governed domains"], expect: "quality/evidence/executable-evidence.md: missing canonical five-domain validator coverage" },
277
- { name: "success_path", expect: null },
278
- ];
279
-
280
- function writeFixture(testCase) {
281
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), `stylegallery-domains-${testCase.name}-`));
282
- const omitted = new Set(testCase.omit ?? []);
283
- const entries = { ...baseFiles };
284
- const mutations = testCase.mutations ?? (testCase.mutate ? [testCase.mutate] : []);
285
- for (const [relative, before, after] of mutations) entries[relative] = entries[relative].replace(before, after);
286
- if (testCase.add) {
287
- const additions = Array.isArray(testCase.add[0]) ? testCase.add : [testCase.add];
288
- for (const [relative, content] of additions) entries[relative] = content;
289
- }
290
- for (const [relative, content] of Object.entries(entries)) {
291
- if (omitted.has(relative)) continue;
292
- const target = path.join(dir, relative);
293
- fs.mkdirSync(path.dirname(target), { recursive: true });
294
- fs.writeFileSync(target, content);
295
- }
296
- return dir;
297
- }
298
-
299
- let validatorModulePromise;
300
- async function loadValidatorModule() {
301
- if (!validatorModulePromise) {
302
- validatorModulePromise = (async () => {
303
- const previousExitCode = process.exitCode;
304
- const originalLog = console.log;
305
- const originalError = console.error;
306
- console.log = () => {};
307
- console.error = () => {};
308
- try {
309
- return await import(pathToFileURL(validator).href);
310
- } catch {
311
- return null;
312
- } finally {
313
- console.log = originalLog;
314
- console.error = originalError;
315
- process.exitCode = previousExitCode;
316
- }
317
- })();
318
- }
319
- return validatorModulePromise;
320
- }
321
-
322
- async function runCase(testCase) {
323
- const dir = writeFixture(testCase);
324
- let output;
325
- if (testCase.registry) {
326
- const module = await loadValidatorModule();
327
- if (module?.validateDomains && module.canonicalDomains) {
328
- output = module.validateDomains({ root: dir, domains: testCase.registry(module.canonicalDomains) });
329
- } else {
330
- output = { ok: false, failures: ["validator does not expose a registry injection function"] };
331
- }
332
- } else {
333
- const result = spawnSync(process.execPath, [validator, "--json"], { cwd: dir, encoding: "utf8" });
334
- try {
335
- output = JSON.parse(result.stdout);
336
- } catch {
337
- output = { ok: false, failures: ["validator unavailable or returned non-JSON output"] };
338
- }
339
- }
340
- fs.rmSync(dir, { force: true, recursive: true });
341
- const passed = testCase.expect ? !output.ok && output.failures.includes(testCase.expect) : output.ok;
342
- return { name: testCase.name, ok: passed, expected: testCase.expect ?? "ok:true", actual: output };
343
- }
344
-
345
- const caseIndex = process.argv.indexOf("--case");
346
- const requestedCase = caseIndex === -1 ? null : process.argv[caseIndex + 1];
347
- const selectedCases = requestedCase ? cases.filter((testCase) => testCase.name === requestedCase) : cases;
348
- if (requestedCase && selectedCases.length === 0) {
349
- console.error(`unknown case: ${requestedCase}`);
350
- process.exitCode = 1;
351
- process.exit();
352
- }
353
-
354
- const results = await Promise.all(selectedCases.map(runCase));
355
- const report = { ok: results.every((result) => result.ok), results };
356
- console.log(JSON.stringify(report, null, 2));
357
- process.exitCode = report.ok ? 0 : 1;