stylegallery 0.1.0 → 0.1.2

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 +29 -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 +57 -0
  14. package/package.json +183 -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,248 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import path from "node:path";
5
- import { componentStateWorkflowFailures } from "./component-state-workflow-contract.mjs";
6
- import { consumerEvidenceGovernanceFailures } from "./consumer-evidence-governance-contract.mjs";
7
- import { referenceOwnershipFailures } from "./governance-matrix-contract.mjs";
8
- import { immutableActionPins, requiredCodeowners, sentinelProvenanceClauses } from "./governance-policy-contract.mjs";
9
- import { promotionGovernanceFailures } from "./promotion-governance-contract.mjs";
10
- import { workflowActionFailures } from "./workflow-action-contract.mjs";
11
-
12
- const json = new Set(process.argv.slice(2)).has("--json");
13
- const root = process.cwd();
14
- const failures = [];
15
- const warnings = [];
16
- function read(relative) {
17
- const target = path.join(root, relative);
18
- if (!fs.existsSync(target)) {
19
- failures.push(`${relative}: missing file`);
20
- return "";
21
- }
22
- return fs.readFileSync(target, "utf8");
23
- }
24
-
25
- function requireIncludes(relative, text) {
26
- if (!read(relative).includes(text)) failures.push(`${relative}: missing ${text}`);
27
- }
28
-
29
- function recommendIncludes(relative, text, label = `recommended wording missing ${text}`) {
30
- if (!read(relative).includes(text)) warnings.push(`${relative}: ${label}`);
31
- }
32
-
33
- function requirePattern(relative, pattern, label) {
34
- if (!pattern.test(read(relative))) failures.push(`${relative}: missing ${label}`);
35
- }
36
-
37
- function requireGeneratedWarning(relative) {
38
- requirePattern(relative, /Generated from `scripts\/generate-patterns\.mjs` and `scripts\/pattern-data\.mjs`\. Do not hand-edit/, "generated warning");
39
- }
40
-
41
- function requireGeneratedPatternMetadata(relative) {
42
- requireIncludes(relative, "lifecycle: generated");
43
- requireIncludes(relative, "generated_from: scripts/generate-patterns.mjs, scripts/pattern-data.mjs");
44
- }
45
-
46
- function requireGovernanceMatrix() {
47
- const families = [
48
- "Root repository guide",
49
- "OKF bundle map",
50
- "Agent editing rules",
51
- "Planning guides",
52
- "Layout recipes",
53
- "Quality gates and evidence",
54
- "Consumer reference contract",
55
- "Governed local reference profiles",
56
- "Component-state evidence matrices",
57
- "Consumer migration conformance",
58
- "Consumer page-evidence lifecycle",
59
- "Explicit evidence freshness schedule",
60
- "Deterministic consumer browser conformance",
61
- "Shared promotion policy",
62
- "Proposed Chromium sentinel",
63
- "Domain manifest and scope decision",
64
- "Layout domain hub",
65
- "Motion domain guidance",
66
- "Design Engineering domain guidance",
67
- "Game UI domain guidance",
68
- "Platform Guides domain guidance",
69
- "Pattern data and examples",
70
- "Pattern generator",
71
- "Validation scripts",
72
- "CI workflow",
73
- ];
74
- for (const family of families) requireIncludes("GOVERNANCE.md", family);
75
- requireIncludes("GOVERNANCE.md", "| Doc family | Source of truth | Generator | Generated artifacts | Lifecycle state | Stale trigger | Validator | Review owner |");
76
- requireIncludes("GOVERNANCE.md", "`scripts/pattern-data.mjs`");
77
- requireIncludes("GOVERNANCE.md", "`scripts/generate-patterns.mjs`");
78
- requireIncludes("GOVERNANCE.md", "`scripts/validate-patterns.mjs`, `scripts/validate-catalog.mjs`, `scripts/validate-governance.mjs`");
79
- requireIncludes("GOVERNANCE.md", "Source-lineage URL changes, generated drift, category changes, or pattern count changes.");
80
- requireIncludes("GOVERNANCE.md", "Generated structure changes, generated-warning changes, or generated metadata changes.");
81
- requireIncludes("GOVERNANCE.md", "`scripts/generate-consumer-reference-evidence.mjs`");
82
- requireIncludes("GOVERNANCE.md", "Browser state evidence begins with `scripts/create-component-state-session.mjs`");
83
- requireIncludes("GOVERNANCE.md", "Receipt creation rejects dirty relevant sources.");
84
- requireIncludes("GOVERNANCE.md", "browser-authored visual sidecars bind the same session, scenario, capture time, source digest, PNG bytes, dimensions, and hash");
85
- requireIncludes("GOVERNANCE.md", "exactly 30 channel passes over the closed 40-file runtime set");
86
- requireIncludes("GOVERNANCE.md", "Validation uses the receipt and completed manifest interval, not a wall-clock maximum age");
87
- for (const profile of ["editorial", "terminal"]) {
88
- for (const artifact of ["state-matrix.md", "keyboard-matrix.md", "evidence-coverage.md"]) {
89
- requireIncludes("GOVERNANCE.md", `design-engineering/reference-profiles/governed-local/${profile}/generated/${artifact}`);
90
- }
91
- }
92
- }
93
-
94
- function requireLifecycleStates() {
95
- for (const state of ["`draft`", "`stable`", "`deprecated`", "`experimental`", "`generated`"]) {
96
- requireIncludes("GOVERNANCE.md", state);
97
- }
98
- }
99
-
100
- function requireOwnership() {
101
- for (const ownerRule of requiredCodeowners) {
102
- requireIncludes(".github/CODEOWNERS", ownerRule);
103
- }
104
- requireIncludes("GOVERNANCE.md", "Review Ownership");
105
- requireIncludes("GOVERNANCE.md", "CODEOWNERS");
106
- }
107
-
108
- function requireStalenessDecision() {
109
- requireIncludes("GOVERNANCE.md", "Audit trigger:");
110
- requireIncludes("GOVERNANCE.md", "node scripts/validate-links.mjs --json");
111
- }
112
-
113
- function requireCiwiring() {
114
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/component-state-workflow-contract.mjs");
115
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/validate-governance.mjs");
116
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/test-validate-governance.mjs");
117
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-governance.mjs --json");
118
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-governance.mjs --json");
119
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/validate-domains.mjs");
120
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/test-validate-domains.mjs");
121
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-domains.mjs --json");
122
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-domains.mjs");
123
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-webpage-workflow.mjs --json");
124
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-webpage-workflow.mjs --json");
125
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/validate-consumer-reference.mjs");
126
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/test-validate-consumer-reference.mjs");
127
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/consumer-reference-case-runner.mjs");
128
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/governed-profile-registry.mjs");
129
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/promotion-attestation-contract.mjs");
130
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/validate-promotion-rfc.mjs");
131
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/test-validate-promotion-rfc.mjs");
132
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-consumer-reference.mjs --json");
133
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-consumer-reference.mjs --json");
134
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-promotion-rfc.mjs --json");
135
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-promotion-rfc.mjs --json");
136
- requireIncludes(".github/workflows/validate.yml", "consumer-reference/schema/promotion-rfc.schema.json");
137
- requireIncludes(".github/workflows/validate.yml", "consumer-reference/policies/shared-experimental.json");
138
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-consumer-reference-sentinel.mjs");
139
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/baseline-schema-parity.mjs");
140
- requireIncludes(".github/workflows/validate.yml", "node -c scripts/test-component-state-source-contract.mjs");
141
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-component-state-source-contract.mjs");
142
- requireIncludes(".github/workflows/validate.yml", "consumer-reference/schema/visual-evidence.schema.json");
143
- requireIncludes(".github/workflows/validate.yml", "node scripts/create-component-state-session.mjs");
144
- requireIncludes(".github/workflows/validate.yml", "STATE_SESSION_RECEIPT=");
145
- requireIncludes(".github/workflows/validate.yml", "node scripts/finalize-component-state-evidence.mjs");
146
- requireIncludes(".github/workflows/validate.yml", "--runtime-manifest");
147
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-baseline-manifest.mjs --json");
148
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-validate-baseline-manifest.mjs --json");
149
- requireIncludes(".github/workflows/validate.yml", "node scripts/test-summarize-sentinel-calibration.mjs");
150
- requireIncludes(".github/workflows/validate.yml", "node scripts/validate-renderer-purity.mjs --json");
151
- requireIncludes(".github/workflows/validate.yml", "checkout_sha=\"$(git -c safe.directory=\"$GITHUB_WORKSPACE\" rev-parse HEAD)\"");
152
- requireIncludes(".github/workflows/validate.yml", "--repository \"changeroa/StyleGallery\" \\");
153
- requireIncludes(".github/workflows/validate.yml", "--execution-repository \"$GITHUB_REPOSITORY\" \\");
154
- requireIncludes(".github/workflows/validate.yml", "\"repository\":\"%s\",\"execution_repository\":\"%s\"");
155
- requireIncludes(".github/workflows/validate.yml", "\"changeroa/StyleGallery\" \"$GITHUB_REPOSITORY\" \"$GITHUB_RUN_ID\"");
156
- if (/safe\.directory(?:=|\s+)["']?\*["']?/.test(read(".github/workflows/validate.yml"))) {
157
- failures.push(".github/workflows/validate.yml: broad Git safe.directory wildcard is forbidden");
158
- }
159
- requireIncludes(".github/workflows/validate.yml", "permissions:");
160
- requireIncludes(".github/workflows/validate.yml", "contents: read");
161
- }
162
-
163
- function requireComponentStateCiIsolation() {
164
- const relative = ".github/workflows/validate.yml";
165
- for (const failure of componentStateWorkflowFailures(read(relative))) failures.push(`${relative}: ${failure}`);
166
- }
167
-
168
- function requireImmutableActions() {
169
- const relative = ".github/workflows/validate.yml";
170
- const workflow = read(relative);
171
- for (const pin of immutableActionPins) if (!workflow.includes(pin)) failures.push(`${relative}: missing immutable action pin ${pin}`);
172
- failures.push(...workflowActionFailures(workflow, relative));
173
- }
174
-
175
- function requireRootLinks() {
176
- for (const relative of ["README.md", "index.md", "AGENTS.md"]) {
177
- requirePattern(relative, /\[[^\]]+\]\(GOVERNANCE\.md\)/, "link target GOVERNANCE.md");
178
- }
179
- recommendIncludes("README.md", "[Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md)", "recommended link label missing [Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md)");
180
- recommendIncludes("index.md", "[Governance, lifecycle, and docs-as-code](GOVERNANCE.md)", "recommended link label missing [Governance, lifecycle, and docs-as-code](GOVERNANCE.md)");
181
- recommendIncludes("AGENTS.md", "[Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md)", "recommended link label missing [Governance, Lifecycle, And Docs-As-Code](GOVERNANCE.md)");
182
- requireIncludes("README.md", "(DOMAINS.md)");
183
- requireIncludes("index.md", "(DOMAINS.md)");
184
- requireIncludes("AGENTS.md", "(DOMAINS.md)");
185
- }
186
-
187
- function requireEvidenceMap() {
188
- requireIncludes("quality/evidence/executable-evidence.md", "scripts/validate-governance.mjs");
189
- requireIncludes("quality/evidence/executable-evidence.md", "scripts/test-validate-governance.mjs");
190
- recommendIncludes("quality/evidence/executable-evidence.md", "generated warnings, generated metadata, root link targets");
191
- requireIncludes("quality/evidence/executable-evidence.md", "Missing governance file, generated warning, generated metadata, CODEOWNERS coverage, or stale policy fixtures must fail.");
192
- requireIncludes("quality/evidence/executable-evidence.md", "Domain metadata, immutable provenance, scope boundaries, and root-route fixtures must fail.");
193
- requireIncludes("quality/evidence/executable-evidence.md", "Consumer-reference handoffs, schema/runtime parity");
194
- requireIncludes("quality/evidence/executable-evidence.md", "repository handoff omissions must fail");
195
- requireIncludes("quality/evidence/executable-evidence.md", "The proposed Chromium sentinel preserves canonical card-grid geometry and truth-derived calibration evidence.");
196
- requireIncludes("quality/evidence/executable-evidence.md", "Governed-local button states retain source-bound visual, DOM, and accessibility-tree evidence across both example profiles.");
197
- requireIncludes("quality/evidence/executable-evidence.md", "one clean capture session binds the browser artifacts to the governed source inventory");
198
- requireIncludes("quality/evidence/executable-evidence.md", "It does not prove product suitability, independent adoption, full accessibility, cross-browser behavior, or owner approval");
199
- requireIncludes("GOVERNANCE.md", "node scripts/test-consumer-reference-sentinel.mjs");
200
- requireIncludes("GOVERNANCE.md", "owner.enforcement: \"placeholder\"");
201
- requireIncludes("GOVERNANCE.md", "review_independence: \"single_account\"");
202
- }
203
-
204
- function requireSentinelProvenanceBoundary() {
205
- for (const relative of ["consumer-reference/contract.md", "quality/evidence/executable-evidence.md", "GOVERNANCE.md"]) {
206
- for (const clause of sentinelProvenanceClauses) requireIncludes(relative, clause);
207
- }
208
- }
209
-
210
- requireGovernanceMatrix();
211
- failures.push(...referenceOwnershipFailures(read("GOVERNANCE.md")));
212
- requireLifecycleStates();
213
- requireOwnership();
214
- requireStalenessDecision();
215
- requireCiwiring();
216
- failures.push(...consumerEvidenceGovernanceFailures({
217
- evidence: read("quality/evidence/executable-evidence.md"),
218
- freshnessWorkflow: read(".github/workflows/evidence-freshness.yml"),
219
- governance: read("GOVERNANCE.md"),
220
- validationWorkflow: read(".github/workflows/validate.yml"),
221
- }));
222
- requireComponentStateCiIsolation();
223
- requireImmutableActions();
224
- requireRootLinks();
225
- requireEvidenceMap();
226
- requireSentinelProvenanceBoundary();
227
- failures.push(...promotionGovernanceFailures(read));
228
- requireGeneratedWarning("CATALOG.md");
229
- requireGeneratedWarning("patterns/index.md");
230
- requireGeneratedWarning("patterns/stacking/index.md");
231
- requireGeneratedWarning("patterns/stacking/stack.md");
232
- requireGeneratedPatternMetadata("patterns/stacking/stack.md");
233
-
234
- const result = {
235
- failures,
236
- ok: failures.length === 0,
237
- warnings,
238
- };
239
-
240
- if (json) {
241
- console.log(JSON.stringify(result, null, 2));
242
- } else if (result.ok) {
243
- console.log(`ok: governance policy (${warnings.length} warnings)`);
244
- } else {
245
- console.error(result.failures.join("\n"));
246
- }
247
-
248
- process.exitCode = result.ok ? 0 : 1;
@@ -1,136 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import path from "node:path";
5
- import { stripFencedCodeBlocks } from "./markdown-structure.mjs";
6
-
7
- const args = new Set(process.argv.slice(2));
8
- const json = args.has("--json");
9
- const root = process.cwd();
10
- const failures = [];
11
-
12
- const rootRoles = [
13
- ["README.md", "Primary role: repository guide"],
14
- ["index.md", "Primary role: OKF bundle map"],
15
- ["GUIDE.md", "Primary role: planning workflow"],
16
- ["CATALOG.md", "Primary role: pattern lookup"],
17
- ];
18
- const domainRoutes = [
19
- ["Layout", "layout/index.md"],
20
- ["Motion", "motion/index.md"],
21
- ["Design Engineering", "design-engineering/index.md"],
22
- ["Platform Guides", "platform-guides/index.md"],
23
- ];
24
- const leafDirectories = ["patterns", "recipes", "quality", "motion", "design-engineering", "platform-guides", "consumer-reference"];
25
- const nestedIndexes = [
26
- "design-engineering/reference-profiles/index.md",
27
- "design-engineering/reference-profiles/governed-local/index.md",
28
- "design-engineering/reference-profiles/external-adaptation/index.md",
29
- ];
30
- const governedProfileLinks = [
31
- "[Editorial profile](editorial/profile.json)",
32
- "[Editorial state matrix](editorial/generated/state-matrix.md)",
33
- "[Editorial keyboard matrix](editorial/generated/keyboard-matrix.md)",
34
- "[Editorial evidence coverage](editorial/generated/evidence-coverage.md)",
35
- "[Terminal profile](terminal/profile.json)",
36
- "[Terminal state matrix](terminal/generated/state-matrix.md)",
37
- "[Terminal keyboard matrix](terminal/generated/keyboard-matrix.md)",
38
- "[Terminal evidence coverage](terminal/generated/evidence-coverage.md)",
39
- ];
40
- const migrationRoutes = [
41
- ["README.md", "[Consumer Migration Readiness](design-engineering/consumer-migration-readiness.md)"],
42
- ["index.md", "[Consumer migration readiness](design-engineering/consumer-migration-readiness.md)"],
43
- ["design-engineering/index.md", "[Consumer Migration Readiness](consumer-migration-readiness.md)"],
44
- ["consumer-reference/index.md", "[Consumer Migration Readiness](../design-engineering/consumer-migration-readiness.md)"],
45
- ["quality/index.md", "[Consumer migration evidence gate](gates/consumer-migration-evidence.md)"],
46
- ["quality/gates/index.md", "[Consumer migration evidence gate](consumer-migration-evidence.md)"],
47
- ["quality/evidence/index.md", "[Consumer migration evidence](consumer-migration.md)"],
48
- ];
49
-
50
- function read(relative) {
51
- const target = path.join(root, relative);
52
- if (!fs.existsSync(target)) {
53
- failures.push(`${relative}: missing file`);
54
- return "";
55
- }
56
- return fs.readFileSync(target, "utf8");
57
- }
58
-
59
- function walk(dir) {
60
- const absolute = path.join(root, dir);
61
- if (!fs.existsSync(absolute)) return [];
62
- return fs.readdirSync(absolute, { withFileTypes: true }).flatMap((entry) => {
63
- const next = path.join(absolute, entry.name);
64
- if (entry.isDirectory()) return walk(path.relative(root, next));
65
- if (!entry.isFile() || !entry.name.endsWith(".md") || entry.name === "index.md") return [];
66
- return [path.relative(root, next)];
67
- });
68
- }
69
-
70
- function requireIncludes(relative, text) {
71
- if (!stripFencedCodeBlocks(read(relative)).includes(text)) failures.push(`${relative}: missing ${text}`);
72
- }
73
-
74
- function requireRootRoles() {
75
- for (const [relative, role] of rootRoles) {
76
- requireIncludes(relative, role);
77
- }
78
- requireIncludes("README.md", "## Repository Entry Roles");
79
- requireIncludes("README.md", "## Task Routes");
80
- requireIncludes("README.md", "## Link Policy");
81
- requireIncludes("README.md", "Navigation links");
82
- requireIncludes("README.md", "Citation links");
83
- requireIncludes("README.md", "Dependency links");
84
- requireIncludes("quality/index.md", "## Tree-Test Findability QA");
85
- requireIncludes("README.md", "[Consumer Reference](consumer-reference/index.md)");
86
- requireIncludes("index.md", "[Consumer reference](consumer-reference/index.md)");
87
- requireIncludes("design-engineering/index.md", "[Reference Profiles](reference-profiles/index.md)");
88
- requireIncludes("design-engineering/reference-profiles/index.md", "[External Adaptation](external-adaptation/index.md)");
89
- requireIncludes("design-engineering/reference-profiles/index.md", "[Governed Local Profiles](governed-local/index.md)");
90
- for (const link of governedProfileLinks) {
91
- requireIncludes("design-engineering/reference-profiles/governed-local/index.md", link);
92
- }
93
- for (const [relative, link] of migrationRoutes) requireIncludes(relative, link);
94
- }
95
-
96
- function requireTaskRoutes() {
97
- const content = stripFencedCodeBlocks(read("README.md"));
98
- const section = content.split("## Task Routes")[1]?.split("\n## ")[0] ?? "";
99
- const routeRows = section.split("\n").filter((line) => /^\| `[^`]+` \| \[[^\]]+\]\([^)]+\) \|/.test(line));
100
- if (routeRows.length < 10) failures.push(`README.md: expected at least 10 task route rows, found ${routeRows.length}`);
101
- }
102
-
103
- function requireDomainRoutes() {
104
- for (const relative of ["README.md", "index.md"]) {
105
- for (const [label, target] of domainRoutes) requireIncludes(relative, `[${label}](${target})`);
106
- }
107
- }
108
-
109
- function requireLeafNavigation() {
110
- for (const file of [...leafDirectories.flatMap(walk), ...nestedIndexes]) {
111
- const content = stripFencedCodeBlocks(read(file));
112
- if (!/^Parent: \[[^\]]+\]\([^)]+\)/m.test(content)) failures.push(`${file}: missing Parent navigation link`);
113
- if (!/^Next: \[[^\]]+\]\([^)]+\)/m.test(content)) failures.push(`${file}: missing Next navigation link`);
114
- }
115
- }
116
-
117
- requireRootRoles();
118
- requireTaskRoutes();
119
- requireDomainRoutes();
120
- requireLeafNavigation();
121
-
122
- const result = {
123
- checkedLeafFiles: leafDirectories.flatMap(walk).length + nestedIndexes.length,
124
- failures,
125
- ok: failures.length === 0,
126
- };
127
-
128
- if (json) {
129
- console.log(JSON.stringify(result, null, 2));
130
- } else if (result.ok) {
131
- console.log(`ok: ${result.checkedLeafFiles} IA leaf files`);
132
- } else {
133
- console.error(result.failures.join("\n"));
134
- }
135
-
136
- process.exitCode = result.ok ? 0 : 1;
@@ -1,66 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import path from "node:path";
5
-
6
- const args = new Set(process.argv.slice(2));
7
- const json = args.has("--json");
8
- const root = process.cwd();
9
- const failures = [];
10
-
11
- function walk(dir) {
12
- return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
13
- if (entry.name === ".git" || entry.name === ".omo" || entry.name === "node_modules") return [];
14
- const next = path.join(dir, entry.name);
15
- if (entry.isDirectory()) return walk(next);
16
- if (!entry.isFile() || !entry.name.endsWith(".md")) return [];
17
- return [next];
18
- });
19
- }
20
-
21
- function stripFencedCodeBlocks(content) {
22
- return content.replace(/```[\s\S]*?```/g, "");
23
- }
24
-
25
- function localTarget(rawTarget) {
26
- const target = rawTarget.trim();
27
- if (!target || target.startsWith("#")) return null;
28
- if (/^[a-z][a-z0-9+.-]*:/i.test(target)) return null;
29
- return target.split("#")[0].split("?")[0];
30
- }
31
-
32
- function checkLink(file, target) {
33
- const local = localTarget(target);
34
- if (!local) return;
35
- const decoded = decodeURIComponent(local);
36
- const absolute = path.resolve(path.dirname(file), decoded);
37
- if (!absolute.startsWith(root)) {
38
- failures.push(`${path.relative(root, file)}: link escapes repository: ${target}`);
39
- return;
40
- }
41
- if (!fs.existsSync(absolute)) failures.push(`${path.relative(root, file)}: missing link target: ${target}`);
42
- }
43
-
44
- const files = walk(root);
45
- for (const file of files) {
46
- const content = stripFencedCodeBlocks(fs.readFileSync(file, "utf8"));
47
- for (const match of content.matchAll(/(?<!!)\[[^\]]+\]\(([^)\s]+)(?:\s+"[^"]*")?\)/g)) {
48
- checkLink(file, match[1]);
49
- }
50
- }
51
-
52
- const result = {
53
- checkedFiles: files.length,
54
- failures,
55
- ok: failures.length === 0,
56
- };
57
-
58
- if (json) {
59
- console.log(JSON.stringify(result, null, 2));
60
- } else if (result.ok) {
61
- console.log(`ok: ${files.length} markdown files`);
62
- } else {
63
- console.error(result.failures.join("\n"));
64
- }
65
-
66
- process.exitCode = result.ok ? 0 : 1;
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from "node:fs";
4
- import path from "node:path";
5
-
6
- const args = new Set(process.argv.slice(2));
7
- const json = args.has("--json");
8
- const root = process.cwd();
9
- const ignoredDirs = new Set([".git", ".omo", "node_modules"]);
10
- const failures = [];
11
-
12
- function walk(dir) {
13
- return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
14
- if (ignoredDirs.has(entry.name)) return [];
15
- const next = path.join(dir, entry.name);
16
- if (entry.isDirectory()) return walk(next);
17
- return entry.isFile() && entry.name.endsWith(".md") ? [next] : [];
18
- });
19
- }
20
-
21
- function frontmatter(content) {
22
- const match = content.match(/^---\n([\s\S]*?)\n---\n/);
23
- if (!match) return null;
24
- const metadata = {};
25
- for (const line of match[1].split("\n")) {
26
- const index = line.indexOf(":");
27
- if (index === -1) continue;
28
- metadata[line.slice(0, index).trim()] = line.slice(index + 1).trim().replace(/^["']|["']$/g, "");
29
- }
30
- return metadata;
31
- }
32
-
33
- function hasRootOnlyOkfFrontmatter(file, metadata) {
34
- return file === "index.md" && metadata && Object.keys(metadata).every((key) => key === "okf_version");
35
- }
36
-
37
- function checkIndex(file, content) {
38
- const metadata = frontmatter(content);
39
- if (metadata && !hasRootOnlyOkfFrontmatter(file, metadata)) {
40
- failures.push(`${file}: index.md must not contain concept frontmatter`);
41
- }
42
- if (!content.match(/^#\s+\S/m)) failures.push(`${file}: index.md must contain at least one heading`);
43
- if (!content.match(/\[[^\]]+\]\([^)]+\)/)) failures.push(`${file}: index.md must list at least one markdown link`);
44
- }
45
-
46
- function checkLog(file, content) {
47
- if (frontmatter(content)) failures.push(`${file}: log.md must not contain frontmatter`);
48
- if (!content.match(/^#\s+\S/m)) failures.push(`${file}: log.md must contain a title heading`);
49
- const dateHeadings = [...content.matchAll(/^##\s+(.+)$/gm)].map((match) => match[1].trim());
50
- for (const heading of dateHeadings) {
51
- if (!heading.match(/^\d{4}-\d{2}-\d{2}$/)) failures.push(`${file}: log.md date heading must be YYYY-MM-DD: ${heading}`);
52
- }
53
- }
54
-
55
- function checkConcept(file, content) {
56
- const metadata = frontmatter(content);
57
- if (!metadata) {
58
- failures.push(`${file}: missing OKF frontmatter`);
59
- return;
60
- }
61
- if (!metadata.type) failures.push(`${file}: missing required OKF type`);
62
- }
63
-
64
- const files = walk(root);
65
- let conceptCount = 0;
66
- let indexCount = 0;
67
- let logCount = 0;
68
-
69
- for (const absolute of files) {
70
- const file = path.relative(root, absolute);
71
- const content = fs.readFileSync(absolute, "utf8");
72
- const basename = path.basename(file);
73
- if (basename === "index.md") {
74
- indexCount += 1;
75
- checkIndex(file, content);
76
- } else if (basename === "log.md") {
77
- logCount += 1;
78
- checkLog(file, content);
79
- } else {
80
- conceptCount += 1;
81
- checkConcept(file, content);
82
- }
83
- }
84
-
85
- if (!files.includes(path.join(root, "index.md"))) failures.push("missing root index.md");
86
- if (!files.includes(path.join(root, "log.md"))) failures.push("missing root log.md");
87
-
88
- const result = {
89
- ok: failures.length === 0,
90
- conceptCount,
91
- indexCount,
92
- logCount,
93
- failures,
94
- };
95
-
96
- if (json) {
97
- console.log(JSON.stringify(result, null, 2));
98
- } else if (result.ok) {
99
- console.log(`ok: ${conceptCount} concepts, ${indexCount} indexes, ${logCount} logs`);
100
- } else {
101
- console.error(failures.join("\n"));
102
- }
103
-
104
- process.exitCode = result.ok ? 0 : 1;