From 834c0f565fdb96ca1edb9e4b54edd5a96e8069e5 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Fri, 16 Jan 2026 13:09:05 -0800 Subject: [PATCH 1/5] test: fix CI failures for allowedColors deprecation - Remove allowedColors from validate-portability fixture contract - Keeps portability test focused on tarball install, not deprecation - Maintains 0 warnings expectation - Add createTempWorkspace helper to color-deprecation tests - Creates minimal valid workspace with proper structure - Includes contract-container, sections, fonts, motion, layout - Ensures tests validate against real workspace structure - Update color-deprecation test assertions - Allow warnings >= 1 instead of exact count - Assert no schema errors for color policy test - Use --workspace-root for proper validation These changes reflect the new allowedColors deprecation behavior while keeping tests focused on their specific concerns. --- .../test/color-deprecation.test.mjs | 212 +++++++++++++++--- .../contracts/ui.contract.json | 6 - .../test/validate-portability.test.mjs | 2 +- 3 files changed, 180 insertions(+), 40 deletions(-) diff --git a/packages/interfacectl-cli/test/color-deprecation.test.mjs b/packages/interfacectl-cli/test/color-deprecation.test.mjs index c35a1f4..9a840c3 100644 --- a/packages/interfacectl-cli/test/color-deprecation.test.mjs +++ b/packages/interfacectl-cli/test/color-deprecation.test.mjs @@ -18,6 +18,105 @@ const __dirname = path.dirname(__filename); const cliPackageDir = path.resolve(__dirname, ".."); const cliExecutable = path.resolve(cliPackageDir, "dist", "index.js"); +/** + * Creates a minimal valid workspace for testing. + * @param {string} tempRoot - Root directory for the workspace + * @param {object} contract - Contract object to write + * @param {string} surfaceId - Surface ID to create directory for + * @returns {Promise} Path to the workspace root + */ +async function createTempWorkspace(tempRoot, contract, surfaceId) { + // Write contract file + const contractPath = path.join(tempRoot, "contract.json"); + await writeFile(contractPath, JSON.stringify(contract, null, 2), "utf-8"); + + // Create surface directory structure + const surfaceDir = path.join(tempRoot, "apps", surfaceId); + await mkdir(surfaceDir, { recursive: true }); + await writeFile( + path.join(surfaceDir, "package.json"), + JSON.stringify({ name: surfaceId }), + "utf-8" + ); + + // Create app directory with analysable files + const appDir = path.join(surfaceDir, "app"); + await mkdir(appDir, { recursive: true }); + + // Get contract requirements + const surface = contract.surfaces[0]; + const firstSection = surface?.requiredSections?.[0] || "header"; + const maxWidth = surface?.layout?.maxContentWidth || 1200; + const allowedFonts = surface?.allowedFonts || ["Inter", "sans-serif"]; + const allowedColors = surface?.allowedColors || []; + const motionDuration = contract.constraints?.motion?.allowedDurationsMs?.[0] || 200; + const motionTiming = contract.constraints?.motion?.allowedTimingFunctions?.[0] || "ease"; + + // Choose a color value - prefer first allowed color, or use CSS variable + const colorValue = allowedColors.length > 0 + ? allowedColors[0] + : "var(--color-background)"; + + // Create globals.css with all required declarations + await writeFile( + path.join(appDir, "globals.css"), + `:root { + --contract-max-width: ${maxWidth}px; + --contract-motion-duration: ${motionDuration}ms; + --contract-motion-timing: ${motionTiming}; + --color-background: #ffffff; +} + +body { + font-family: ${allowedFonts.map(f => f.startsWith("var(") ? f : `"${f}"`).join(", ")}; + background: ${colorValue}; +} + +.contract-container { + max-width: var(--contract-max-width); + transition: opacity var(--contract-motion-duration) var(--contract-motion-timing); + animation-duration: var(--contract-motion-duration); + animation-timing-function: var(--contract-motion-timing); +} +`, + "utf-8" + ); + + // Create layout.tsx with contract-container marker + await writeFile( + path.join(appDir, "layout.tsx"), + `import "./globals.css"; + +export default function Layout({ children }) { + return ( + + +
{children}
+ + + ); +} +`, + "utf-8" + ); + + // Create page.tsx with section marker + await writeFile( + path.join(appDir, "page.tsx"), + `export default function Page() { + return ( +
+

Test

+
+ ); +} +`, + "utf-8" + ); + + return tempRoot; +} + async function runCommand(command, args, options = {}) { const proc = spawn(command, args, { ...options, @@ -46,7 +145,6 @@ test("validate emits deprecation warning for allowedColors", async () => { ); try { - const contractPath = path.join(tempRoot, "contract.json"); const contract = { contractId: "test", version: "1.0.0", @@ -78,39 +176,63 @@ test("validate emits deprecation warning for allowedColors", async () => { }, }; - await writeFile(contractPath, JSON.stringify(contract, null, 2), "utf-8"); - - // Create minimal surface directory structure with source files - const surfaceDir = path.join(tempRoot, "apps", "test-surface"); - await mkdir(surfaceDir, { recursive: true }); - await writeFile(path.join(surfaceDir, "package.json"), JSON.stringify({ name: "test-surface" }), "utf-8"); - // Create minimal app structure for Next.js surface - const appDir = path.join(surfaceDir, "app"); - await mkdir(appDir, { recursive: true }); - await writeFile(path.join(appDir, "layout.tsx"), `export default function Layout({ children }) { return
{children}
; }`, "utf-8"); - await writeFile(path.join(appDir, "page.tsx"), `export default function Page() { return
Test
; }`, "utf-8"); + await createTempWorkspace(tempRoot, contract, "test-surface"); + const contractPath = path.join(tempRoot, "contract.json"); const result = await runCommand( "node", - [cliExecutable, "validate", "--contract", contractPath, "--workspace-root", tempRoot, "--format", "json", "--exit-codes", "v2"], + [ + cliExecutable, + "validate", + "--contract", + contractPath, + "--workspace-root", + tempRoot, + "--format", + "json", + "--exit-codes", + "v2", + ], { cwd: tempRoot }, ); // Should pass schema validation (allowedColors is accepted but deprecated) - assert.equal(result.exitCode, 0, `Command failed: ${result.stderr}\n${result.stdout}`); + assert.equal( + result.exitCode, + 0, + `Command failed: ${result.stderr}\n${result.stdout}` + ); const output = JSON.parse(result.stdout); assert.ok(output.findings); - + + // Should have at least one deprecation warning + assert.ok( + output.summary.warnings >= 1, + `Expected at least 1 warning, got ${output.summary.warnings}` + ); + // Should have deprecation warning const deprecationFinding = output.findings.find( (f) => f.code === "contract.deprecated-field", ); - assert.ok(deprecationFinding, "Should emit contract.deprecated-field finding"); + assert.ok( + deprecationFinding, + "Should emit contract.deprecated-field finding" + ); assert.equal(deprecationFinding.severity, "warning"); - assert(deprecationFinding.message.includes("allowedColors")); - assert(deprecationFinding.message.includes("deprecated")); - assert(deprecationFinding.location, "Should include jsonPointer location"); + assert( + deprecationFinding.message.includes("allowedColors"), + "Deprecation message should mention allowedColors" + ); + assert( + deprecationFinding.message.includes("deprecated"), + "Deprecation message should mention deprecated" + ); + assert.ok( + deprecationFinding.location, + "Should include jsonPointer location" + ); } finally { await rm(tempRoot, { recursive: true, force: true }); } @@ -122,7 +244,6 @@ test("validate accepts contract with color policy", async () => { ); try { - const contractPath = path.join(tempRoot, "contract.json"); const contract = { contractId: "test", version: "1.0.0", @@ -162,26 +283,51 @@ test("validate accepts contract with color policy", async () => { }, }; - await writeFile(contractPath, JSON.stringify(contract, null, 2), "utf-8"); - - // Create minimal surface directory structure with source files - const surfaceDir = path.join(tempRoot, "apps", "test-surface"); - await mkdir(surfaceDir, { recursive: true }); - await writeFile(path.join(surfaceDir, "package.json"), JSON.stringify({ name: "test-surface" }), "utf-8"); - // Create minimal app structure for Next.js surface - const appDir = path.join(surfaceDir, "app"); - await mkdir(appDir, { recursive: true }); - await writeFile(path.join(appDir, "layout.tsx"), `export default function Layout({ children }) { return
{children}
; }`, "utf-8"); - await writeFile(path.join(appDir, "page.tsx"), `export default function Page() { return
Test
; }`, "utf-8"); + await createTempWorkspace(tempRoot, contract, "test-surface"); + const contractPath = path.join(tempRoot, "contract.json"); const result = await runCommand( "node", - [cliExecutable, "validate", "--contract", contractPath, "--workspace-root", tempRoot, "--format", "json", "--exit-codes", "v2"], + [ + cliExecutable, + "validate", + "--contract", + contractPath, + "--workspace-root", + tempRoot, + "--format", + "json", + "--exit-codes", + "v2", + ], { cwd: tempRoot }, ); // Should pass schema validation - assert.equal(result.exitCode, 0, `Command failed: ${result.stderr}\n${result.stdout}`); + assert.equal( + result.exitCode, + 0, + `Command failed: ${result.stderr}\n${result.stdout}` + ); + + const output = JSON.parse(result.stdout); + + // Assert there are no contract.schema-error findings + const schemaErrors = output.findings.filter( + (f) => f.code === "contract.schema-error" + ); + assert.equal( + schemaErrors.length, + 0, + `Expected no schema errors, got: ${JSON.stringify(schemaErrors, null, 2)}` + ); + + // Optionally assert the contract is accepted and surfaces validate + assert.equal( + output.summary.errors, + 0, + `Expected no errors, got: ${output.summary.errors}` + ); } finally { await rm(tempRoot, { recursive: true, force: true }); } diff --git a/packages/interfacectl-cli/test/fixtures/minimal-project/contracts/ui.contract.json b/packages/interfacectl-cli/test/fixtures/minimal-project/contracts/ui.contract.json index b2a3bc7..e62de3a 100644 --- a/packages/interfacectl-cli/test/fixtures/minimal-project/contracts/ui.contract.json +++ b/packages/interfacectl-cli/test/fixtures/minimal-project/contracts/ui.contract.json @@ -15,12 +15,6 @@ "Demo Sans", "sans-serif" ], - "allowedColors": [ - "var(--color-primary)", - "var(--color-background)", - "#ffffff", - "#000000" - ], "layout": { "maxContentWidth": 960 } diff --git a/packages/interfacectl-cli/test/validate-portability.test.mjs b/packages/interfacectl-cli/test/validate-portability.test.mjs index 2cb5bb7..6568282 100644 --- a/packages/interfacectl-cli/test/validate-portability.test.mjs +++ b/packages/interfacectl-cli/test/validate-portability.test.mjs @@ -103,7 +103,7 @@ test("interfacectl validate runs from tarball install", async () => { assert.equal( validateResult.exitCode, 0, - `interfacectl validate failed: ${validateResult.stderr}`, + `interfacectl validate failed: ${validateResult.stderr}\n${validateResult.stdout}`, ); const payload = JSON.parse(validateResult.stdout); From c75b3d2114443bc483e2461c72b042657afab5c7 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Fri, 16 Jan 2026 15:05:32 -0800 Subject: [PATCH 2/5] test: remove allowedColors from pageFrame test fixture Fixes pageFrame test failures caused by deprecated allowedColors field. Tests were expecting exit code 0 but getting exit code 2 due to deprecation warnings/errors. --- .../test/fixtures/pageframe-static/contract.json | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json b/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json index 4efbeb8..389cac9 100644 --- a/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json @@ -8,7 +8,6 @@ "type": "web", "requiredSections": ["header"], "allowedFonts": ["Inter"], - "allowedColors": ["#000000"], "layout": { "maxContentWidth": 1200, "pageFrame": { From 15210f3b443aa106a865708236acc0ab197b4512 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Fri, 16 Jan 2026 15:20:31 -0800 Subject: [PATCH 3/5] test: fix pageFrame test fixtures for complete workspace structure - Add apps/test-surface/app/ directory structure to all fixtures - Create globals.css with required declarations (fonts, colors, motion, layout) - Create page.tsx with section markers for each fixture - Fix inline-styles: use string style prop instead of JSX object - Fix maxwidth-fail: use string style prop with 1400px - Fix css-rule: add CSS variable and import globals.css in layout - Fix font-family: remove 'sans-serif' from non-allowed fonts These changes ensure fixtures have complete workspace structure required for validation, similar to color-deprecation test fixes. All 6 pageFrame tests now passing (tests 54-59). --- .../apps/test-surface/app/globals.css | 4 ++++ .../clamp-padding/apps/test-surface/app/layout.tsx | 9 +++++++++ .../clamp-padding/apps/test-surface/app/page.tsx | 7 +++++++ .../test/fixtures/pageframe-static/contract.json | 1 + .../css-rule/apps/test-surface/app/globals.css | 9 +++++++++ .../css-rule/apps/test-surface/app/layout.tsx | 9 +++++++++ .../css-rule/apps/test-surface/app/page.tsx | 7 +++++++ .../apps/test-surface/app/globals.css | 14 ++++++++++++++ .../inline-styles/apps/test-surface/app/layout.tsx | 10 ++++++++++ .../inline-styles/apps/test-surface/app/page.tsx | 7 +++++++ .../apps/test-surface/app/globals.css | 14 ++++++++++++++ .../maxwidth-fail/apps/test-surface/app/layout.tsx | 10 ++++++++++ .../maxwidth-fail/apps/test-surface/app/page.tsx | 7 +++++++ .../apps/test-surface/app/globals.css | 14 ++++++++++++++ .../apps/test-surface/app/layout.tsx | 8 ++++++++ .../missing-marker/apps/test-surface/app/page.tsx | 7 +++++++ .../tailwind/apps/test-surface/app/globals.css | 14 ++++++++++++++ .../tailwind/apps/test-surface/app/layout.tsx | 11 +++++++++++ .../tailwind/apps/test-surface/app/page.tsx | 7 +++++++ 19 files changed, 169 insertions(+) create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/page.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/page.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/page.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/page.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/page.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/globals.css create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/layout.tsx create mode 100644 packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/page.tsx diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/globals.css new file mode 100644 index 0000000..1aff918 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/globals.css @@ -0,0 +1,4 @@ +[data-contract="page-container"] { + max-width: 1200px; + padding-inline: clamp(16px, 2vw, 24px); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..2af49f5 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/layout.tsx @@ -0,0 +1,9 @@ +import "./globals.css"; +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+
Header
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/clamp-padding/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json b/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json index 389cac9..4efbeb8 100644 --- a/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/contract.json @@ -8,6 +8,7 @@ "type": "web", "requiredSections": ["header"], "allowedFonts": ["Inter"], + "allowedColors": ["#000000"], "layout": { "maxContentWidth": 1200, "pageFrame": { diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/globals.css new file mode 100644 index 0000000..968dc3b --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/globals.css @@ -0,0 +1,9 @@ +:root { + --contract-max-width: 1200px; +} + +[data-contract="page-container"] { + max-width: 1200px; + padding-left: 24px; + padding-right: 24px; +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..3fccca2 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/layout.tsx @@ -0,0 +1,9 @@ +import "./globals.css"; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/css-rule/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/globals.css new file mode 100644 index 0000000..1890dba --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/globals.css @@ -0,0 +1,14 @@ +:root { + --contract-max-width: 1200px; + --contract-motion-duration: 200ms; + --contract-motion-timing: ease; +} + +body { + font-family: "Inter"; +} + +.contract-container { + max-width: var(--contract-max-width); + transition: opacity var(--contract-motion-duration) var(--contract-motion-timing); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..1d2e87b --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/layout.tsx @@ -0,0 +1,10 @@ +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/inline-styles/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/globals.css new file mode 100644 index 0000000..7c29cac --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/globals.css @@ -0,0 +1,14 @@ +:root { + --contract-max-width: 1200px; + --contract-motion-duration: 200ms; + --contract-motion-timing: ease; +} + +body { + font-family: "Inter", sans-serif; +} + +.contract-container { + max-width: var(--contract-max-width); + transition: opacity var(--contract-motion-duration) var(--contract-motion-timing); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..2d97346 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/layout.tsx @@ -0,0 +1,10 @@ +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/maxwidth-fail/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/globals.css new file mode 100644 index 0000000..7c29cac --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/globals.css @@ -0,0 +1,14 @@ +:root { + --contract-max-width: 1200px; + --contract-motion-duration: 200ms; + --contract-motion-timing: ease; +} + +body { + font-family: "Inter", sans-serif; +} + +.contract-container { + max-width: var(--contract-max-width); + transition: opacity var(--contract-motion-duration) var(--contract-motion-timing); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..215b1c8 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/layout.tsx @@ -0,0 +1,8 @@ +import "./globals.css"; +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/missing-marker/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/globals.css b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/globals.css new file mode 100644 index 0000000..1890dba --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/globals.css @@ -0,0 +1,14 @@ +:root { + --contract-max-width: 1200px; + --contract-motion-duration: 200ms; + --contract-motion-timing: ease; +} + +body { + font-family: "Inter"; +} + +.contract-container { + max-width: var(--contract-max-width); + transition: opacity var(--contract-motion-duration) var(--contract-motion-timing); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/layout.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/layout.tsx new file mode 100644 index 0000000..7feff51 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/layout.tsx @@ -0,0 +1,11 @@ +import "./globals.css"; +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/page.tsx b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/page.tsx new file mode 100644 index 0000000..2550a82 --- /dev/null +++ b/packages/interfacectl-cli/test/fixtures/pageframe-static/tailwind/apps/test-surface/app/page.tsx @@ -0,0 +1,7 @@ +export default function Page() { + return ( +
+

Test

+
+ ); +} From 4e5dd3172cf2dcd934dd35b4567f38a4489544c9 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Wed, 28 Jan 2026 21:07:02 -0800 Subject: [PATCH 4/5] chore: align dist with source (color policy schema, types) --- .../dist/utils/normalize.d.ts.map | 2 +- .../interfacectl-cli/dist/utils/normalize.js | 10 +- .../dist/utils/violation-classifier.d.ts.map | 2 +- .../dist/utils/violation-classifier.js | 2 + .../schema/surfaces.web.contract.schema.json | 157 +++++++++++++++++- .../interfacectl-validator/dist/types.d.ts | 37 ++++- .../dist/types.d.ts.map | 2 +- 7 files changed, 201 insertions(+), 11 deletions(-) diff --git a/packages/interfacectl-cli/dist/utils/normalize.d.ts.map b/packages/interfacectl-cli/dist/utils/normalize.d.ts.map index 8e4dcea..5f8bca1 100644 --- a/packages/interfacectl-cli/dist/utils/normalize.d.ts.map +++ b/packages/interfacectl-cli/dist/utils/normalize.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,iBAAiB,EAIlB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAclD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,UAAU,SAAK,EACf,aAAa,GAAE,MAAM,EAAO,GAC3B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA0C9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,GAC1B,kBAAkB,CA4FpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,iBAAiB,GAC5B,oBAAoB,CA4FtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAevD"} \ No newline at end of file +{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,iBAAiB,EAIlB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,EAAE,qBAAqB,CAAC;CACjC;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAclD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,OAAO,EACZ,UAAU,SAAK,EACf,aAAa,GAAE,MAAM,EAAO,GAC3B;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CA0C9C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,iBAAiB,GAC1B,kBAAkB,CA8FpB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,iBAAiB,GAC5B,oBAAoB,CA4FtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAevD"} \ No newline at end of file diff --git a/packages/interfacectl-cli/dist/utils/normalize.js b/packages/interfacectl-cli/dist/utils/normalize.js index f417c1e..79e8eef 100644 --- a/packages/interfacectl-cli/dist/utils/normalize.js +++ b/packages/interfacectl-cli/dist/utils/normalize.js @@ -113,10 +113,12 @@ export function normalizeContract(contract) { } if (SET_LIKE_FIELDS.has("allowedColors")) { const original = surface.allowedColors; - const sorted = normalizeSetField(original); - if (JSON.stringify(original) !== JSON.stringify(sorted)) { - metadata.reorderedPaths.push(`surfaces[${surfaceIdx}].allowedColors`); - normalizedSurface.allowedColors = sorted; + if (original) { + const sorted = normalizeSetField(original); + if (JSON.stringify(original) !== JSON.stringify(sorted)) { + metadata.reorderedPaths.push(`surfaces[${surfaceIdx}].allowedColors`); + normalizedSurface.allowedColors = sorted; + } } } if (surface.layout.requiredContainers && diff --git a/packages/interfacectl-cli/dist/utils/violation-classifier.d.ts.map b/packages/interfacectl-cli/dist/utils/violation-classifier.d.ts.map index d7efbbd..2c8f583 100644 --- a/packages/interfacectl-cli/dist/utils/violation-classifier.d.ts.map +++ b/packages/interfacectl-cli/dist/utils/violation-classifier.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"violation-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/violation-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,GACvB,IAAI,GAAG,IAAI,CAgBb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,MAAM,CA4BR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,EAAE,GACnB,QAAQ,GAAG,IAAI,CAwBjB"} \ No newline at end of file +{"version":3,"file":"violation-classifier.d.ts","sourceRoot":"","sources":["../../src/utils/violation-classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,kBAAkB,GACvB,IAAI,GAAG,IAAI,CAkBb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,MAAM,CA4BR;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,SAAS,EAAE,GACnB,QAAQ,GAAG,IAAI,CAwBjB"} \ No newline at end of file diff --git a/packages/interfacectl-cli/dist/utils/violation-classifier.js b/packages/interfacectl-cli/dist/utils/violation-classifier.js index f870284..f3f64ff 100644 --- a/packages/interfacectl-cli/dist/utils/violation-classifier.js +++ b/packages/interfacectl-cli/dist/utils/violation-classifier.js @@ -10,6 +10,8 @@ export function classifyViolationType(type) { "color-not-allowed", "motion-duration-not-allowed", "motion-timing-not-allowed", + "color-raw-value-used", + "color-token-namespace-violation", ]; if (e1Types.includes(type)) { return "E1"; diff --git a/packages/interfacectl-validator/dist/schema/surfaces.web.contract.schema.json b/packages/interfacectl-validator/dist/schema/surfaces.web.contract.schema.json index 243f641..65c36ba 100644 --- a/packages/interfacectl-validator/dist/schema/surfaces.web.contract.schema.json +++ b/packages/interfacectl-validator/dist/schema/surfaces.web.contract.schema.json @@ -43,6 +43,9 @@ }, "constraints": { "$ref": "#/$defs/constraints" + }, + "color": { + "$ref": "#/$defs/color" } }, "$defs": { @@ -55,7 +58,6 @@ "type", "requiredSections", "allowedFonts", - "allowedColors", "layout" ], "properties": { @@ -99,7 +101,8 @@ "type": "string", "minLength": 1 }, - "uniqueItems": true + "uniqueItems": true, + "description": "Deprecated: Use color.sourceOfTruth and color.rawValues instead. This field will be removed in a future version." }, "layout": { "type": "object", @@ -219,6 +222,156 @@ "default": "strict" } } + }, + "color": { + "type": "object", + "additionalProperties": false, + "properties": { + "sourceOfTruth": { + "$ref": "#/$defs/colorSourceOfTruth" + }, + "rawValues": { + "$ref": "#/$defs/colorRawValues" + }, + "semantics": { + "$ref": "#/$defs/colorSemantics" + }, + "consistency": { + "$ref": "#/$defs/colorConsistency" + } + } + }, + "colorSourceOfTruth": { + "type": "object", + "additionalProperties": false, + "required": ["type"], + "properties": { + "type": { + "type": "string", + "enum": ["tokens", "none"] + }, + "tokenNamespaces": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + }, + "if": { + "properties": { + "type": { + "const": "tokens" + } + } + }, + "then": { + "required": ["tokenNamespaces"] + } + }, + "colorRawValues": { + "type": "object", + "additionalProperties": false, + "required": ["policy"], + "properties": { + "policy": { + "type": "string", + "enum": ["off", "warn", "strict"] + }, + "allowlist": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + }, + "denylist": { + "type": "array", + "items": { + "type": "string", + "minLength": 1 + }, + "uniqueItems": true + } + } + }, + "colorSemantics": { + "type": "object", + "additionalProperties": false, + "properties": { + "roles": { + "type": "object", + "additionalProperties": false, + "properties": { + "accent": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforcement": { + "type": "string", + "enum": ["off", "warn", "strict"] + } + } + }, + "text": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforcement": { + "type": "string", + "enum": ["off", "warn", "strict"] + } + } + }, + "background": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforcement": { + "type": "string", + "enum": ["off", "warn", "strict"] + } + } + }, + "border": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforcement": { + "type": "string", + "enum": ["off", "warn", "strict"] + } + } + } + } + } + } + }, + "colorConsistency": { + "type": "object", + "additionalProperties": false, + "properties": { + "acrossSurfaces": { + "type": "object", + "additionalProperties": false, + "properties": { + "enforcement": { + "type": "string", + "enum": ["off", "warn", "strict"] + }, + "signals": { + "type": "array", + "items": { + "type": "string", + "enum": ["token-name", "css-var-name", "class-fragment"] + }, + "uniqueItems": true + } + } + } + } } } } diff --git a/packages/interfacectl-validator/dist/types.d.ts b/packages/interfacectl-validator/dist/types.d.ts index a7302d1..07ad9ee 100644 --- a/packages/interfacectl-validator/dist/types.d.ts +++ b/packages/interfacectl-validator/dist/types.d.ts @@ -12,7 +12,7 @@ export interface ContractSurface { type: SurfaceType; requiredSections: string[]; allowedFonts: string[]; - allowedColors: string[]; + allowedColors?: string[]; layout: { maxContentWidth: number; requiredContainers?: string[]; @@ -30,6 +30,38 @@ export interface ContractConstraints { allowedTimingFunctions: string[]; }; } +export interface ColorSourceOfTruth { + type: "tokens" | "none"; + tokenNamespaces?: string[]; +} +export interface ColorRawValues { + policy: "off" | "warn" | "strict"; + allowlist?: string[]; + denylist?: string[]; +} +export interface ColorRoleEnforcement { + enforcement: "off" | "warn" | "strict"; +} +export interface ColorSemantics { + roles?: { + accent?: ColorRoleEnforcement; + text?: ColorRoleEnforcement; + background?: ColorRoleEnforcement; + border?: ColorRoleEnforcement; + }; +} +export interface ColorConsistency { + acrossSurfaces?: { + enforcement: "off" | "warn" | "strict"; + signals?: ("token-name" | "css-var-name" | "class-fragment")[]; + }; +} +export interface ColorPolicy { + sourceOfTruth?: ColorSourceOfTruth; + rawValues?: ColorRawValues; + semantics?: ColorSemantics; + consistency?: ColorConsistency; +} export interface InterfaceContract { contractId: string; version: string; @@ -37,6 +69,7 @@ export interface InterfaceContract { surfaces: ContractSurface[]; sections: ContractSection[]; constraints: ContractConstraints; + color?: ColorPolicy; } export interface SurfaceSectionDescriptor { id: string; @@ -79,7 +112,7 @@ export interface SurfaceDescriptor { layout: SurfaceLayoutDescriptor; motion: SurfaceMotionDescriptor[]; } -export type DriftViolationType = "unknown-surface" | "missing-section" | "unknown-section" | "font-not-allowed" | "color-not-allowed" | "layout-width-exceeded" | "layout-width-undetermined" | "layout-container-missing" | "layout-pageframe-selector-unsupported" | "layout-pageframe-container-not-found" | "layout-pageframe-maxwidth-mismatch" | "layout-pageframe-padding-mismatch" | "layout-pageframe-non-deterministic-value" | "layout-pageframe-unextractable-value" | "motion-duration-not-allowed" | "motion-timing-not-allowed" | "descriptor-missing" | "descriptor-unused"; +export type DriftViolationType = "unknown-surface" | "missing-section" | "unknown-section" | "font-not-allowed" | "color-not-allowed" | "layout-width-exceeded" | "layout-width-undetermined" | "layout-container-missing" | "layout-pageframe-selector-unsupported" | "layout-pageframe-container-not-found" | "layout-pageframe-maxwidth-mismatch" | "layout-pageframe-padding-mismatch" | "layout-pageframe-non-deterministic-value" | "layout-pageframe-unextractable-value" | "motion-duration-not-allowed" | "motion-timing-not-allowed" | "descriptor-missing" | "descriptor-unused" | "color-raw-value-used" | "color-token-namespace-violation"; export interface DriftViolation { surfaceId: string; type: DriftViolationType; diff --git a/packages/interfacectl-validator/dist/types.d.ts.map b/packages/interfacectl-validator/dist/types.d.ts.map index e56b3c8..f7a0502 100644 --- a/packages/interfacectl-validator/dist/types.d.ts.map +++ b/packages/interfacectl-validator/dist/types.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"} \ No newline at end of file From 28704d91412d8afa17bc72cb3b215b4cd433617b Mon Sep 17 00:00:00 2001 From: Mike Long Date: Wed, 28 Jan 2026 21:10:51 -0800 Subject: [PATCH 5/5] chore: add scratch/ to gitignore for working notes --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 545e29f..66f7bd4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,4 @@ node_modules .pnpm-store .DS_Store .changeset/*-changes.md - +scratch/