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.
- package/AGENTS.md +4 -1
- package/DOMAINS.md +2 -6
- package/GOVERNANCE.md +10 -9
- package/README.md +23 -127
- package/consumer-reference/agent-native/v2/admission-policy.json +646 -0
- package/consumer-reference/agent-native/v2/material-registry.json +1 -0
- package/consumer-reference/agent-native/v2/schema/admission-policy.schema.json +50 -0
- package/consumer-reference/agent-native/v2/schema/material-manifest.schema.json +17 -0
- package/consumer-reference/agent-native/v2/schema/material-record.schema.json +20 -0
- package/consumer-reference/contract.md +1 -1
- package/consumer-reference/index.md +5 -3
- package/layout/index.md +124 -0
- package/log.md +51 -0
- package/package.json +181 -22
- package/scripts/agent-native/v2/experimental-extension-registry.mjs +143 -0
- package/scripts/agent-native/v2/extensions/a2a-projection.mjs +264 -0
- package/scripts/agent-native/v2/extensions/agui-projection.mjs +191 -0
- package/scripts/agent-native/v2/material-admission.mjs +295 -0
- package/scripts/agent-native/v2/material-cli-adapter.mjs +134 -0
- package/scripts/agent-native/v2/material-context.mjs +251 -0
- package/scripts/agent-native/v2/material-identity.mjs +71 -0
- package/scripts/agent-native/v2/material-mcp-adapter.mjs +253 -0
- package/scripts/agent-native/v2/material-operation-registry.mjs +123 -0
- package/scripts/agent-native/v2/material-queries.mjs +398 -0
- package/scripts/agent-native/v2/material-registry.mjs +319 -0
- package/scripts/sg-material-mcp.mjs +98 -0
- package/scripts/sg-material.mjs +27 -0
- package/consumer-reference/adapters/style-dictionary.config.mjs +0 -36
- package/consumer-reference/baselines/calibration.json +0 -260
- package/consumer-reference/baselines/manifest.json +0 -21
- package/consumer-reference/fixtures/consumer-conformance/e2e-fixture.mjs +0 -282
- package/consumer-reference/fixtures/consumer-conformance/manifest.json +0 -102
- package/consumer-reference/fixtures/consumer-conformance/runtime-proof.mjs +0 -32
- package/consumer-reference/fixtures/consumer-conformance/valid-migration-result.json +0 -18
- package/consumer-reference/fixtures/consumer-conformance/valid-migration.json +0 -142
- package/consumer-reference/fixtures/invalid-stable-ended-support.json +0 -19
- package/consumer-reference/fixtures/promotion/invalid-blocking-evidence.json +0 -26
- package/consumer-reference/fixtures/promotion/invalid-count-only.json +0 -29
- package/consumer-reference/fixtures/promotion/invalid-missing-owner-migration.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-normative-bypass-no-regression.json +0 -25
- package/consumer-reference/fixtures/promotion/invalid-related-counted-independent.json +0 -45
- package/consumer-reference/fixtures/promotion/invalid-stable-ended-support.json +0 -26
- package/consumer-reference/fixtures/promotion/manifest.json +0 -15
- package/consumer-reference/fixtures/promotion/valid-deferred-example.json +0 -67
- package/consumer-reference/fixtures/promotion/valid-normative-bypass.json +0 -67
- package/consumer-reference/fixtures/token-portability/invalid-cycle.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-dangling-alias.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-extends.json +0 -4
- package/consumer-reference/fixtures/token-portability/invalid-json-pointer.json +0 -7
- package/consumer-reference/fixtures/token-portability/invalid-resolver.json +0 -9
- package/consumer-reference/fixtures/token-portability/invalid-type-mismatch.json +0 -10
- package/consumer-reference/fixtures/token-portability/invalid-unknown-reserved.json +0 -6
- package/consumer-reference/fixtures/token-portability/invalid-untested-type.json +0 -6
- package/consumer-reference/fixtures/token-portability/valid-border.json +0 -14
- package/consumer-reference/fixtures/token-portability/valid-reference.json +0 -32
- package/consumer-reference/fixtures/token-portability/valid-whole-alias.json +0 -7
- package/consumer-reference/fixtures/valid-deprecated.json +0 -21
- package/consumer-reference/fixtures/valid-experimental.json +0 -19
- package/consumer-reference/generated/manifest.json +0 -40
- package/consumer-reference/generated/tokens.css +0 -12
- package/consumer-reference/policies/shared-experimental.json +0 -37
- package/consumer-reference/schema/ax-evidence.schema.json +0 -30
- package/consumer-reference/schema/baseline-manifest.schema.json +0 -55
- package/consumer-reference/schema/calibration-record.schema.json +0 -190
- package/consumer-reference/schema/capture-session.schema.json +0 -161
- package/consumer-reference/schema/component-state.schema.json +0 -150
- package/consumer-reference/schema/consumer-conformance-record.schema.json +0 -365
- package/consumer-reference/schema/dom-evidence.schema.json +0 -38
- package/consumer-reference/schema/evidence-record.schema.json +0 -81
- package/consumer-reference/schema/fixture-manifest.schema.json +0 -32
- package/consumer-reference/schema/item.schema.json +0 -188
- package/consumer-reference/schema/page-evidence-manifest.schema.json +0 -216
- package/consumer-reference/schema/page-evidence-session.schema.json +0 -119
- package/consumer-reference/schema/portable-tokens.schema.json +0 -104
- package/consumer-reference/schema/promotion-rfc.schema.json +0 -219
- package/consumer-reference/schema/runtime-evidence-manifest.schema.json +0 -33
- package/consumer-reference/schema/visual-evidence.schema.json +0 -31
- package/design-engineering/consumer-migration-readiness.md +0 -124
- package/design-engineering/interface-craft.md +0 -107
- package/design-engineering/reference-profiles/external-adaptation/index.md +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/editorial/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/editorial/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/editorial/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/editorial/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/editorial/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/editorial/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/editorial/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/editorial/tokens.dtcg.json +0 -17
- package/design-engineering/reference-profiles/governed-local/terminal/components/button.component.json +0 -125
- package/design-engineering/reference-profiles/governed-local/terminal/evidence/button.evidence.json +0 -3504
- package/design-engineering/reference-profiles/governed-local/terminal/fixtures/button.fixture.json +0 -65
- package/design-engineering/reference-profiles/governed-local/terminal/generated/evidence-coverage.md +0 -23
- package/design-engineering/reference-profiles/governed-local/terminal/generated/keyboard-matrix.md +0 -19
- package/design-engineering/reference-profiles/governed-local/terminal/generated/state-matrix.md +0 -21
- package/design-engineering/reference-profiles/governed-local/terminal/local-foundations.json +0 -12
- package/design-engineering/reference-profiles/governed-local/terminal/profile.json +0 -43
- package/design-engineering/reference-profiles/governed-local/terminal/states/button.states.json +0 -195
- package/design-engineering/reference-profiles/governed-local/terminal/tokens.dtcg.json +0 -17
- package/game-ui/classification.md +0 -82
- package/game-ui/reference-record.md +0 -62
- package/game-ui/screen-hierarchy.md +0 -107
- package/game-ui/unity/architecture.md +0 -166
- package/game-ui/unity/cli-loop.md +0 -84
- package/game-ui/unity/data/unity-technologies-public-repositories.json +0 -26654
- package/game-ui/unity/org-wiki.md +0 -146
- package/game-ui/unity/repository-map.md +0 -102
- package/game-ui/unity/ui-systems.md +0 -85
- package/motion/practice-reference.md +0 -145
- package/motion/review-workflow.md +0 -86
- package/motion/vocabulary.md +0 -82
- package/platform-guides/apple-interaction.md +0 -89
- package/scripts/agent-native/events.mjs +0 -113
- package/scripts/agent-native/immutable-store.mjs +0 -102
- package/scripts/artifact-metadata.mjs +0 -20
- package/scripts/audit-evidence-freshness.mjs +0 -308
- package/scripts/baseline-contract.mjs +0 -189
- package/scripts/baseline-schema-parity.mjs +0 -40
- package/scripts/build-reference-artifacts.mjs +0 -127
- package/scripts/calibration-raw-contract.mjs +0 -172
- package/scripts/capture-session-contract.mjs +0 -187
- package/scripts/component-state-artifact-fixture.mjs +0 -44
- package/scripts/component-state-contract.mjs +0 -99
- package/scripts/component-state-semantics.mjs +0 -128
- package/scripts/component-state-workflow-contract.mjs +0 -67
- package/scripts/component-state-workflow-negative-cases.mjs +0 -64
- package/scripts/consumer-conformance-contract.mjs +0 -198
- package/scripts/consumer-evidence-governance-contract.mjs +0 -210
- package/scripts/consumer-reference-case-runner.mjs +0 -93
- package/scripts/consumer-reference-schema.mjs +0 -155
- package/scripts/create-component-state-session.mjs +0 -100
- package/scripts/create-page-evidence-session.mjs +0 -139
- package/scripts/domain-document-boundaries.mjs +0 -40
- package/scripts/domain-validation-checks.mjs +0 -141
- package/scripts/evidence-artifact-contract.mjs +0 -191
- package/scripts/finalize-component-state-evidence.mjs +0 -165
- package/scripts/finalize-page-evidence.mjs +0 -197
- package/scripts/generate-consumer-reference-evidence.mjs +0 -154
- package/scripts/generate-patterns.mjs +0 -218
- package/scripts/governance-matrix-contract.mjs +0 -73
- package/scripts/governance-matrix-negative-cases.mjs +0 -114
- package/scripts/governance-policy-contract.mjs +0 -49
- package/scripts/governance-test-fixture.mjs +0 -321
- package/scripts/governance-workflow-negative-cases.mjs +0 -241
- package/scripts/governed-profile-registry.mjs +0 -125
- package/scripts/json-schema-formats.mjs +0 -31
- package/scripts/markdown-structure.mjs +0 -45
- package/scripts/page-artifact-metadata.mjs +0 -124
- package/scripts/page-evidence-contract.mjs +0 -297
- package/scripts/page-evidence-fixture.mjs +0 -271
- package/scripts/pattern-data.mjs +0 -325
- package/scripts/profile-record-contract.mjs +0 -140
- package/scripts/promotion-attestation-contract.mjs +0 -91
- package/scripts/promotion-boundary-test-contract.mjs +0 -92
- package/scripts/promotion-fixture-inventory.mjs +0 -109
- package/scripts/promotion-governance-contract.mjs +0 -28
- package/scripts/reference-artifact-path-contract.mjs +0 -28
- package/scripts/reference-profile-contract.mjs +0 -114
- package/scripts/reference-token-contract.mjs +0 -156
- package/scripts/run-consumer-page-evidence-ci.mjs +0 -170
- package/scripts/summarize-sentinel-calibration.mjs +0 -98
- package/scripts/test-agent-adapter-conformance.mjs +0 -250
- package/scripts/test-agent-conformance-receipt.mjs +0 -106
- package/scripts/test-agent-events.mjs +0 -81
- package/scripts/test-agent-execution-effects.mjs +0 -114
- package/scripts/test-agent-execution-fixtures.mjs +0 -140
- package/scripts/test-agent-execution-kernel.mjs +0 -39
- package/scripts/test-agent-execution-learning.mjs +0 -130
- package/scripts/test-agent-execution-lifecycle.mjs +0 -143
- package/scripts/test-agent-execution-safety.mjs +0 -158
- package/scripts/test-agent-execution-views.mjs +0 -117
- package/scripts/test-agent-identity-integrity-cases.mjs +0 -160
- package/scripts/test-agent-knowledge-kernel.mjs +0 -183
- package/scripts/test-agent-learning.mjs +0 -246
- package/scripts/test-agent-mcp.mjs +0 -246
- package/scripts/test-agent-native-schemas.mjs +0 -215
- package/scripts/test-agent-projections.mjs +0 -249
- package/scripts/test-agent-registry-mcp-integrity.mjs +0 -215
- package/scripts/test-agent-registry-mutations.mjs +0 -110
- package/scripts/test-audit-evidence-freshness.mjs +0 -177
- package/scripts/test-component-state-sentinel.mjs +0 -35
- package/scripts/test-component-state-source-contract.mjs +0 -83
- package/scripts/test-consumer-conformance-sentinel.mjs +0 -165
- package/scripts/test-consumer-reference-sentinel.mjs +0 -31
- package/scripts/test-generate-consumer-reference-evidence.mjs +0 -124
- package/scripts/test-json-cli-output.mjs +0 -151
- package/scripts/test-json-schema-formats.mjs +0 -40
- package/scripts/test-reference-adapters.mjs +0 -199
- package/scripts/test-renderer-purity.mjs +0 -34
- package/scripts/test-sg-cli.mjs +0 -129
- package/scripts/test-summarize-sentinel-calibration.mjs +0 -226
- package/scripts/test-validate-baseline-manifest.mjs +0 -234
- package/scripts/test-validate-component-state-artifacts.mjs +0 -243
- package/scripts/test-validate-component-state.mjs +0 -106
- package/scripts/test-validate-consumer-conformance.mjs +0 -427
- package/scripts/test-validate-consumer-reference-cli.mjs +0 -69
- package/scripts/test-validate-consumer-reference.mjs +0 -263
- package/scripts/test-validate-domains.mjs +0 -357
- package/scripts/test-validate-governance.mjs +0 -292
- package/scripts/test-validate-ia.mjs +0 -262
- package/scripts/test-validate-okf.mjs +0 -73
- package/scripts/test-validate-page-evidence.mjs +0 -302
- package/scripts/test-validate-patterns.mjs +0 -157
- package/scripts/test-validate-promotion-rfc.mjs +0 -250
- package/scripts/test-validate-reference-profiles.mjs +0 -170
- package/scripts/test-validate-unity-org-wiki.mjs +0 -57
- package/scripts/test-validate-unity-source-contracts.mjs +0 -67
- package/scripts/test-validate-vocabulary.mjs +0 -174
- package/scripts/test-validate-webpage-workflow.mjs +0 -293
- package/scripts/validate-baseline-manifest.mjs +0 -44
- package/scripts/validate-catalog.mjs +0 -65
- package/scripts/validate-component-state.mjs +0 -141
- package/scripts/validate-consumer-conformance.mjs +0 -477
- package/scripts/validate-consumer-reference.mjs +0 -288
- package/scripts/validate-domains.mjs +0 -237
- package/scripts/validate-governance.mjs +0 -248
- package/scripts/validate-ia.mjs +0 -136
- package/scripts/validate-links.mjs +0 -66
- package/scripts/validate-okf.mjs +0 -104
- package/scripts/validate-page-evidence.mjs +0 -191
- package/scripts/validate-patterns.mjs +0 -246
- package/scripts/validate-promotion-rfc.mjs +0 -224
- package/scripts/validate-reference-artifacts.mjs +0 -125
- package/scripts/validate-renderer-purity.mjs +0 -56
- package/scripts/validate-unity-org-wiki.mjs +0 -146
- package/scripts/validate-unity-source-contracts.mjs +0 -107
- package/scripts/validate-vocabulary.mjs +0 -115
- package/scripts/validate-webpage-workflow.mjs +0 -254
- package/scripts/visual-expectation-contract.mjs +0 -20
- 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;
|