@usefragments/core 1.2.0 → 1.4.0

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 (57) hide show
  1. package/dist/{chunk-BQQTMGLA.js → chunk-57QDBEHQ.js} +79 -6
  2. package/dist/chunk-57QDBEHQ.js.map +1 -0
  3. package/dist/{chunk-DBVTSUMT.js → chunk-CBSNXFOD.js} +20 -6
  4. package/dist/chunk-CBSNXFOD.js.map +1 -0
  5. package/dist/codes/index.d.ts +1 -1
  6. package/dist/codes/index.js +2 -2
  7. package/dist/compiled-types/index.d.ts +1 -1
  8. package/dist/generate/index.d.ts +1 -1
  9. package/dist/{governance-DYSirwJu.d.ts → governance-DxdJV6lx.d.ts} +10 -0
  10. package/dist/index-0lmh0Lbo.d.ts +6981 -0
  11. package/dist/index.d.ts +65 -29
  12. package/dist/index.js +397 -127
  13. package/dist/index.js.map +1 -1
  14. package/dist/react-types.d.ts +1 -1
  15. package/dist/registry.d.ts +18 -18
  16. package/dist/schemas/index.d.ts +3 -3377
  17. package/dist/schemas/index.js +1 -1
  18. package/dist/test-utils.d.ts +1 -1
  19. package/package.json +1 -1
  20. package/src/agent-format.test.ts +75 -3
  21. package/src/agent-format.ts +28 -6
  22. package/src/constants.ts +3 -0
  23. package/src/evidence.ts +27 -0
  24. package/src/facts/builders.ts +3 -1
  25. package/src/facts/fact-index.ts +22 -2
  26. package/src/facts/facts.test.ts +1 -1
  27. package/src/facts/types.ts +16 -1
  28. package/src/index.ts +4 -0
  29. package/src/rules/__tests__/fix-emission-invariant.test.ts +174 -0
  30. package/src/rules/__tests__/tokens-require-dual-fallback.test.ts +90 -0
  31. package/src/rules/components-prefer-library.test.ts +148 -0
  32. package/src/rules/components-prefer-library.ts +52 -1
  33. package/src/rules/emit-gate.test.ts +16 -0
  34. package/src/rules/emit-gate.ts +6 -3
  35. package/src/rules/finding.ts +3 -0
  36. package/src/rules/rules.test.ts +2 -1
  37. package/src/rules/spacing-resolution.ts +5 -8
  38. package/src/rules/styles-no-raw-color.test.ts +213 -0
  39. package/src/rules/styles-no-raw-color.ts +157 -23
  40. package/src/rules/styles-no-raw-dimensions.ts +31 -12
  41. package/src/rules/styles-no-raw-spacing.ts +33 -11
  42. package/src/rules/styles-no-raw-typography.ts +37 -15
  43. package/src/rules/taxonomy.test.ts +13 -0
  44. package/src/rules/tokens-require-dual-fallback.ts +54 -17
  45. package/src/rules/utils.ts +51 -0
  46. package/src/schema.ts +6 -2
  47. package/src/schemas/index.ts +81 -3
  48. package/src/token-types.ts +18 -0
  49. package/src/tokens/__tests__/source-names.test.ts +42 -0
  50. package/src/tokens/categories.ts +54 -24
  51. package/src/tokens/design-token-parser.test.ts +24 -5
  52. package/src/tokens/design-token-parser.ts +40 -8
  53. package/src/tokens/scss.test.ts +94 -0
  54. package/src/tokens/scss.ts +11 -4
  55. package/src/types.ts +11 -0
  56. package/dist/chunk-BQQTMGLA.js.map +0 -1
  57. package/dist/chunk-DBVTSUMT.js.map +0 -1
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/conform-prove.ts","../src/agent-format.ts","../src/performance-presets.ts","../src/bundle.ts","../src/registry-install-plan.ts","../src/mcp-snapshot.ts","../src/tokens/color.ts","../src/style-comparison.ts","../src/schema.ts","../src/rules/composition-pattern-schema.ts","../src/config.ts","../src/defineFragment.ts","../src/storyAdapter.ts","../src/storybook-csf.ts","../src/storyFilters.ts","../src/figma.ts","../src/tokens/dtcg.ts","../src/tokens/categories.ts","../src/tokens/scss.ts","../src/tokens/tailwind-v4.ts","../src/tokens/design-token-parser.ts","../src/tokens/index.ts","../src/dtcg.ts","../src/component-contract.ts","../src/contract-parser.ts","../src/dtcg-generators.ts","../src/composition.ts","../src/preview-runtime.tsx","../src/component-discovery.ts","../src/rules/finding.ts","../src/rules/utils.ts","../src/rules/a11y-required-accessible-name.ts","../src/raw-html-canonical.ts","../src/rules/components-prefer-library.ts","../src/rules/components-forbidden-prop-value.ts","../src/rules/components-unknown-prop.ts","../src/rules/composition-pattern.ts","../src/rules/jsx-preferred-component.ts","../src/rules/jsx-preferred-import-path.ts","../src/rules/props-invalid-value.ts","../src/rules/color-math.ts","../src/rules/styles-no-raw-color.ts","../src/rules/styles-no-raw-dimensions.ts","../src/rules/spacing-resolution.ts","../src/rules/styles-no-raw-spacing.ts","../src/rules/styles-no-raw-typography.ts","../src/rules/theme-no-theme-coupled-literal.ts","../src/rules/tailwind-arbitrary-color.ts","../src/rules/tailwind-arbitrary-spacing.ts","../src/rules/tailwind-rule-utils.ts","../src/rules/tailwind-forbidden-palette.ts","../src/rules/tailwind-off-scale-spacing-token.ts","../src/rules/tailwind-raw-color-via-token.ts","../src/rules/tailwind-unknown-class.ts","../src/rules/tokens-require-dual-fallback.ts","../src/rules/tokens-css-vars-must-be-defined.ts","../src/rules/emit-gate.ts","../src/rules/tiers.ts","../src/rules/presets.ts","../src/rules/index.ts","../src/governance-integrity.ts","../src/contract/preimage.ts","../src/contract/stamp.ts","../src/contract/fixture.ts","../src/local-canonical.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files — V2 canonical format */\n fileExtension: \".contract.json\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Default compiler governance report path */\n governanceFile: \".fragments/governance.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","/**\n * Contract Mode — Phase 2: the prove-compliant loop as a PURE primitive.\n *\n * A validate-fix-validate loop over UI code: run the conform engine, apply its\n * deterministic fixes, and re-validate until the engine proves zero findings,\n * the pass budget is exhausted, or progress stalls. When deterministic fixes\n * stall on residual issues, an optional async `sampler` repairs them (model\n * call), and the loop re-validates the result — a sampled fix is never trusted\n * without a clean re-validation pass.\n *\n * This is the engine behind `contract.prove` (architecture §2 move #4). It is\n * deliberately framework-agnostic: it takes a `conform` callback (so Cloud,\n * CLI, and the standalone MCP each inject their own engine binding) and returns\n * a plain result — no MCP plumbing, no task store, no transport coupling.\n *\n * Determinism (architecture §6.3): the sampler receives `(seq, codeHashAtRequest)`\n * so a durable-replay layer can key recorded sampler output on the exact code it\n * was asked to repair and hard-invalidate on a hash mismatch.\n *\n * Browser-safe: depends only on the conform contract types + the pure SHA-256\n * in this package. No Node APIs.\n */\nimport type {\n ConformInput,\n ConformResult,\n ConformSuggestion,\n ConformUnresolved,\n} from \"./conform.js\";\nimport { sha256Hex } from \"./contract/hash.js\";\n\n/** Upper bound on validate/fix passes. */\nexport const PROVE_MAX_PASSES = 8;\n/** Default validate/fix passes when the caller does not specify. */\nexport const PROVE_DEFAULT_MAX_PASSES = 4;\n\n/**\n * 3-valued verdict. `insufficient_coverage` is NOT a pass: a clean run over an\n * empty catalog (no tokens, no component mappings) proves nothing, so the loop\n * never certifies compliance it could not actually evaluate.\n */\nexport type ProveVerdict = \"pass\" | \"fail\" | \"insufficient_coverage\";\n\nexport interface ProvePassSampling {\n requested?: boolean;\n used?: boolean;\n model?: string;\n stopReason?: string;\n reason?: string;\n}\n\nexport interface ProvePass {\n pass: number;\n issues: number;\n deterministicChanges: number;\n suggestions: number;\n unresolved: number;\n changed: boolean;\n sampling?: ProvePassSampling;\n}\n\nexport interface ProveResidual {\n suggestions: ConformSuggestion[];\n unresolved: ConformUnresolved[];\n}\n\nexport interface ProveSample {\n /** Repaired code, or omitted/empty when the sampler declined. */\n code?: string;\n model?: string;\n stopReason?: string;\n reason?: string;\n}\n\nexport interface ProveSamplerArgs {\n /** The current code the sampler is asked to repair. */\n code: string;\n /** The residual findings deterministic fixes could not resolve. */\n residual: ProveResidual;\n metadata: {\n /** 1-indexed validate/fix pass that stalled. */\n pass: number;\n /** 0-indexed sampler attempt counter (independent of `pass`). */\n seq: number;\n /** SHA-256 of `code` — the durable-replay key + hard-invalidation guard. */\n codeHashAtRequest: string;\n };\n}\n\nexport interface ProveCallbacks {\n /** Validate + apply deterministic fixes for one pass. */\n conform(input: ConformInput): Promise<ConformResult> | ConformResult;\n /** Optional model-backed repair for residual issues conform cannot resolve. */\n sampler?(args: ProveSamplerArgs): Promise<ProveSample | null> | ProveSample | null;\n}\n\nexport interface ProveOptions {\n /** Max validate/fix passes (clamped to 1..8). Defaults to 4. */\n maxPasses?: number;\n /** Allow the sampler to repair residual issues. Defaults to true. */\n allowSampling?: boolean;\n}\n\nexport interface ProveLoopResult {\n /** Code after all passes + sampling. */\n conformed: string;\n /** Whether `conformed` differs from the input code. */\n changed: boolean;\n verdict: ProveVerdict;\n /** True only on a clean, evaluated pass. */\n provedCompliant: boolean;\n /** Findings remaining in the final pass (changes + suggestions + unresolved). */\n issueCount: number;\n /** Total deterministic edits applied across all passes. */\n corrections: number;\n passHistory: ProvePass[];\n residual: ProveResidual;\n /** The final conform result (for receipt / summary rendering). */\n result: ConformResult;\n /** Human-readable reason for the verdict. */\n reason: string;\n}\n\n/** Total findings in a conform result: applied changes + suggestions + unresolved. */\nexport function proveIssueCount(result: ConformResult): number {\n return result.changes.length + result.suggestions.length + result.unresolved.length;\n}\n\n/** A neutral conform result for the \"no result produced\" fallback path. */\nexport function emptyConformResult(code: string): ConformResult {\n return {\n conformed: code,\n changed: false,\n summary: \"No conform result was produced.\",\n changes: [],\n suggestions: [],\n unresolved: [],\n };\n}\n\n/**\n * Resolve the 3-valued verdict. Coverage trumps everything: an unevaluated\n * catalog is `insufficient_coverage` regardless of issue count.\n */\nexport function resolveProveVerdict(args: {\n coverageEvaluated: boolean;\n provedCompliant: boolean;\n}): ProveVerdict {\n if (!args.coverageEvaluated) return \"insufficient_coverage\";\n return args.provedCompliant ? \"pass\" : \"fail\";\n}\n\n/** Clamp a requested pass count into the supported 1..8 range (default 4). */\nexport function clampMaxPasses(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n return PROVE_DEFAULT_MAX_PASSES;\n }\n return Math.min(PROVE_MAX_PASSES, Math.max(1, Math.trunc(value)));\n}\n\nfunction incompleteReason(args: {\n passCount: number;\n maxPasses: number;\n finalIssues: number;\n allowSampling: boolean;\n hasSampler: boolean;\n}): string {\n if (args.passCount >= args.maxPasses) {\n return `stopped after ${args.maxPasses} passes with ${args.finalIssues} finding(s).`;\n }\n if (!args.allowSampling) {\n return \"sampling was disabled and residual issues remain.\";\n }\n if (!args.hasSampler) {\n return \"no sampler was available and residual issues remain.\";\n }\n return `${args.finalIssues} residual finding(s) remain after deterministic and sampled fixes.`;\n}\n\n/**\n * Run the validate-fix-validate loop. Pure: never mutates `input`; all state\n * flows through the return value.\n */\nexport async function proveCompliant(\n input: ConformInput,\n callbacks: ProveCallbacks,\n options: ProveOptions = {}\n): Promise<ProveLoopResult> {\n const maxPasses = clampMaxPasses(options.maxPasses);\n const allowSampling = options.allowSampling !== false;\n const { filename } = input;\n const hasSampler = typeof callbacks.sampler === \"function\";\n\n let current = input.code;\n const passHistory: ProvePass[] = [];\n let corrections = 0;\n let samplingAttempts = 0;\n let lastResult: ConformResult | null = null;\n\n while (passHistory.length < maxPasses) {\n const pass = passHistory.length + 1;\n const result = await callbacks.conform({\n code: current,\n filename,\n apply: \"deterministic\",\n });\n lastResult = result;\n\n const issues = proveIssueCount(result);\n passHistory.push({\n pass,\n issues,\n deterministicChanges: result.changes.length,\n suggestions: result.suggestions.length,\n unresolved: result.unresolved.length,\n changed: result.changed,\n });\n corrections += result.changes.length;\n\n if (issues === 0) {\n const coverageEvaluated = result.coverage?.evaluated !== false;\n return {\n conformed: current,\n changed: current !== input.code,\n verdict: resolveProveVerdict({\n coverageEvaluated,\n provedCompliant: coverageEvaluated,\n }),\n provedCompliant: coverageEvaluated,\n issueCount: 0,\n corrections,\n passHistory,\n residual: { suggestions: [], unresolved: [] },\n result,\n reason: coverageEvaluated\n ? `0 findings after ${pass} pass${pass === 1 ? \"\" : \"es\"}.`\n : \"the design-system catalog has no tokens or components, so compliance could not be evaluated.\",\n };\n }\n\n // Deterministic progress — keep looping on the rewritten code.\n if (result.changed && result.conformed !== current) {\n current = result.conformed;\n continue;\n }\n\n // Conform stalled with residual issues. Try the sampler if it is available\n // and we are under the attempt cap (kept strictly below maxPasses so a\n // revalidation pass always remains in budget).\n //\n // The loop re-samples only while the sampler keeps producing *new* code\n // (each fresh snippet is re-validated on the next pass). A sample that\n // returns nothing new — null, no `code`, or byte-identical code — ends the\n // loop. Re-asking the model with the identical residual rarely helps and\n // burns tokens.\n const residual: ProveResidual = {\n suggestions: result.suggestions,\n unresolved: result.unresolved,\n };\n const canSample =\n allowSampling &&\n hasSampler &&\n samplingAttempts < maxPasses - 1 &&\n (residual.suggestions.length > 0 || residual.unresolved.length > 0);\n\n if (canSample) {\n const seq = samplingAttempts;\n const codeHashAtRequest = sha256Hex(current);\n const last = passHistory[passHistory.length - 1];\n if (last) last.sampling = { requested: true };\n\n const sampled = await callbacks.sampler!({\n code: current,\n residual,\n metadata: { pass, seq, codeHashAtRequest },\n });\n samplingAttempts += 1;\n\n if (last) {\n last.sampling = {\n ...(last.sampling ?? {}),\n used: Boolean(sampled?.code),\n model: sampled?.model,\n stopReason: sampled?.stopReason,\n reason: sampled?.reason,\n };\n }\n\n if (sampled?.code && sampled.code !== current) {\n current = sampled.code;\n continue;\n }\n }\n\n break;\n }\n\n const fallback = lastResult ?? emptyConformResult(current);\n const finalIssues = proveIssueCount(fallback);\n const coverageEvaluated = fallback.coverage?.evaluated !== false;\n\n return {\n conformed: current,\n changed: current !== input.code,\n verdict: resolveProveVerdict({ coverageEvaluated, provedCompliant: false }),\n provedCompliant: false,\n issueCount: finalIssues,\n corrections,\n passHistory,\n residual: {\n suggestions: fallback.suggestions,\n unresolved: fallback.unresolved,\n },\n result: fallback,\n reason: incompleteReason({\n passCount: passHistory.length,\n maxPasses,\n finalIssues,\n allowSampling,\n hasSampler,\n }),\n };\n}\n","import { severityLevel } from \"./severity.js\";\nimport { AGENT_FORMAT_SCHEMA_VERSION, type AgentFormat, type Finding } from \"./schemas/index.js\";\nimport type { SuppressionDirectiveFact } from \"./facts/index.js\";\n\nexport interface BuildAgentFormatInput {\n findings: readonly Finding[];\n filesScanned: number;\n integrity: AgentFormat[\"integrity\"];\n passed?: boolean;\n suppressions?: readonly SuppressionDirectiveFact[];\n iteration?: number;\n maxIterations?: number;\n previousScore?: number;\n maxFindings?: number;\n includeEvidence?: boolean;\n includeFindings?: boolean;\n}\n\nexport function buildAgentFormat(input: BuildAgentFormatInput): AgentFormat {\n const integrityFailed = !input.integrity.healthy || input.integrity.inert;\n const score = integrityFailed ? 0 : scoreFindings(input.findings);\n const visibleFindings = uniqueFindings(input.findings).slice(0, input.maxFindings ?? 50);\n const agentFindings = visibleFindings.map((finding) => ({\n code: finding.code,\n ruleId: finding.ruleId,\n filePath: finding.location.file,\n line: finding.location.line,\n col: finding.location.column,\n severity: finding.severity,\n level: severityLevel(finding.severity),\n message: finding.message,\n evidence: input.includeEvidence ? finding.evidence : [],\n plan: planForFinding(finding),\n }));\n\n // Keep this aligned with the report summary: warn-level findings are debt, not\n // scan failure, unless the caller has already folded fail-on-warnings into\n // `passed:false`.\n const hasErrors = input.findings.some((finding) => severityLevel(finding.severity) === \"error\");\n\n return {\n schemaVersion: AGENT_FORMAT_SCHEMA_VERSION,\n passed: !integrityFailed && (input.passed ?? true) && !hasErrors,\n score,\n summary: integrityFailed\n ? `failed with score ${score}; ${input.integrity.reasons.join(\"; \") || \"governance integrity is unhealthy\"}`\n : agentSummary(input.findings.length, input.filesScanned, score),\n integrity: input.integrity,\n fix_first: agentFindings.filter((finding) => finding.plan.confidence >= 0.8),\n remaining: agentFindings.filter((finding) => finding.plan.confidence < 0.8),\n suppression_template: {\n directive: '// @fragments-expect-error {code} reason=\"...\" expires=\"YYYY-MM-DD\"',\n requiredFields: [\"reason\"],\n example:\n '// @fragments-expect-error FUI2001 reason=\"hero brand red approved\" expires=\"2026-08-01\"',\n },\n budget: {\n iteration: input.iteration ?? 0,\n maxIterations: input.maxIterations ?? 3,\n scoreDelta: input.previousScore === undefined ? 0 : score - input.previousScore,\n },\n ...(input.includeFindings ? { findings: [...input.findings] } : {}),\n ...(input.suppressions\n ? {\n suppressions: input.suppressions.map((suppression) => ({\n code: suppression.code,\n reason: suppression.reason,\n ...(suppression.expiresOn ? { expiresOn: suppression.expiresOn } : {}),\n scope: \"line\" as const,\n })),\n }\n : {}),\n };\n}\n\nfunction uniqueFindings(findings: readonly Finding[]): Finding[] {\n const seen = new Set<string>();\n const out: Finding[] = [];\n for (const finding of findings) {\n const key =\n finding.fingerprint ??\n `${finding.ruleId}\\0${finding.location.file}\\0${finding.location.line}\\0${finding.message}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(finding);\n }\n return out;\n}\n\nfunction scoreFindings(findings: readonly Finding[]): number {\n if (findings.length === 0) return 100;\n let penalty = 0;\n for (const finding of findings) {\n const level = severityLevel(finding.severity);\n penalty += level === \"error\" ? 10 : level === \"warn\" ? 3 : 1;\n }\n return Math.max(1, Math.round(100 / (1 + penalty / 40)));\n}\n\nfunction agentSummary(count: number, filesScanned: number, score: number): string {\n if (count === 0) return `passed with score ${score}; no findings`;\n return `${count} finding${count === 1 ? \"\" : \"s\"} across ${filesScanned} file${filesScanned === 1 ? \"\" : \"s\"}; score ${score}`;\n}\n\nfunction planForFinding(finding: Finding): AgentFormat[\"fix_first\"][number][\"plan\"] {\n if (finding.fix?.deterministic === true) {\n return {\n tool: \"design_system/conform\",\n args: {\n filePath: finding.location.file,\n fingerprint: finding.fingerprint,\n apply: \"deterministic\",\n },\n confidence: 0.95,\n };\n }\n if (\n finding.code?.startsWith(\"FUI1\") ||\n finding.ruleId.includes(\"component\") ||\n finding.ruleId.includes(\"canonical\")\n ) {\n return {\n tool: \"design_system/conform\",\n args: { filePath: finding.location.file, apply: \"deterministic\" },\n confidence: 0.65,\n };\n }\n return {\n tool: \"design_system/conform\",\n args: {\n filePath: finding.location.file,\n property:\n stringAttribute(finding.attributes?.property) ??\n stringAttribute(finding.attributes?.prop) ??\n \"color\",\n value:\n stringAttribute(finding.attributes?.rawValue) ?? stringAttribute(finding.attributes?.color),\n apply: \"deterministic\",\n },\n confidence: 0.55,\n };\n}\n\nfunction stringAttribute(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","/**\n * Performance budget presets and classification utilities.\n *\n * ESLint model: global defaults, zero-config, auto-measurement.\n * Users configure 0-3 numbers. Per-component overrides are the `eslint-disable` equivalent.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PerformanceBudgets {\n /** Maximum gzipped bundle size in bytes */\n bundleSize: number;\n}\n\nexport interface PerformanceConfig {\n preset: string;\n budgets: PerformanceBudgets;\n}\n\nexport type ComplexityTier = 'lightweight' | 'moderate' | 'heavy';\n\nexport interface PerformanceData {\n /** Gzipped bundle size in bytes */\n bundleSize: number;\n /** Raw (minified, not gzipped) bundle size in bytes */\n rawSize: number;\n /** Complexity classification */\n complexity: ComplexityTier;\n /** Percentage of budget used (0-100+) */\n budgetPercent: number;\n /** Whether the component exceeds its budget */\n overBudget: boolean;\n /** ISO timestamp when measured */\n measuredAt: string;\n}\n\nexport interface PerformanceSummary {\n /** Preset name used */\n preset: string;\n /** Budget applied in bytes */\n budget: number;\n /** Total components measured */\n total: number;\n /** Number of components over budget */\n overBudget: number;\n /** Distribution by tier */\n tiers: Record<ComplexityTier, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Presets\n// ---------------------------------------------------------------------------\n\nconst PRESETS: Record<string, PerformanceBudgets> = {\n strict: { bundleSize: 8 * 1024 }, // 8KB gzipped\n standard: { bundleSize: 15 * 1024 }, // 15KB gzipped\n relaxed: { bundleSize: 30 * 1024 }, // 30KB gzipped\n};\n\nexport const PRESET_NAMES = Object.keys(PRESETS) as readonly string[];\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a performance config from user input.\n * Accepts a preset name string or a custom config object.\n */\nexport function resolvePerformanceConfig(\n input: string | { preset?: string; budgets?: Partial<PerformanceBudgets> } | undefined\n): PerformanceConfig {\n if (!input) {\n return { preset: 'standard', budgets: PRESETS.standard };\n }\n\n if (typeof input === 'string') {\n const budgets = PRESETS[input];\n if (!budgets) {\n throw new Error(\n `Unknown performance preset \"${input}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n return { preset: input, budgets };\n }\n\n const presetName = input.preset ?? 'standard';\n const baseBudgets = PRESETS[presetName];\n if (!baseBudgets) {\n throw new Error(\n `Unknown performance preset \"${presetName}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n\n return {\n preset: presetName,\n budgets: {\n bundleSize: input.budgets?.bundleSize ?? baseBudgets.bundleSize,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Classify a component's complexity based on gzipped bundle size.\n *\n * - lightweight: < 5KB — simple, leaf components\n * - moderate: < 15KB — typical composed components\n * - heavy: >= 15KB — complex widgets with dependencies\n */\nexport function classifyComplexity(gzipBytes: number): ComplexityTier {\n if (gzipBytes < 5 * 1024) return 'lightweight';\n if (gzipBytes < 15 * 1024) return 'moderate';\n return 'heavy';\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format bytes to a human-readable string (e.g. \"2.1KB\", \"15.3KB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n const kb = bytes / 1024;\n return kb < 10 ? `${kb.toFixed(1)}KB` : `${Math.round(kb)}KB`;\n}\n\n/**\n * Create a visual budget bar for terminal output.\n */\nexport function budgetBar(percent: number, width = 20): string {\n const filled = Math.min(Math.round((percent / 100) * width), width);\n const bar = '█'.repeat(filled) + '░'.repeat(width - filled);\n return percent > 100 ? `\\x1b[31m${bar}\\x1b[0m` : `\\x1b[32m${bar}\\x1b[0m`;\n}\n","import { z } from 'zod';\n\nexport const bundleSchemaVersionSchema = z.literal(1);\nexport const bundleTargetSchema = z.enum([\n 'cursor',\n 'agents',\n 'claude',\n 'copilot',\n]);\n\nexport const bundleArtifactMetadataSchema = z.object({\n kind: z.enum([\n 'manifest',\n 'tokens',\n 'design-system',\n 'readme',\n 'helper',\n 'component',\n ]),\n key: z.string().min(1),\n label: z.string().min(1),\n path: z.string().min(1),\n etag: z.string().min(1),\n updatedAt: z.string().datetime(),\n target: bundleTargetSchema.optional(),\n componentId: z.string().optional(),\n contentType: z.enum(['application/json', 'text/markdown']),\n});\n\nconst bundleManifestRelationSchema = z.object({\n type: z.string().min(1),\n componentId: z.string().min(1),\n name: z.string().min(1),\n});\n\nconst bundleManifestCompoundChildSchema = z.object({\n componentId: z.string().min(1),\n name: z.string().min(1),\n});\n\nexport const bundleManifestComponentEntrySchema = z.object({\n componentId: z.string().min(1),\n file: z.string().min(1),\n name: z.string().min(1),\n publicSlug: z.string().nullable(),\n tier: z.enum(['core', 'composition']),\n category: z.string().min(1),\n status: z.string().min(1),\n description: z.string(),\n propCount: z.number().int().nonnegative(),\n hasExamples: z.boolean(),\n hasCompoundChildren: z.boolean(),\n relations: z.array(bundleManifestRelationSchema),\n compoundChildren: z.array(bundleManifestCompoundChildSchema),\n});\n\nexport const bundleManifestSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n org: z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n slug: z.string().min(1),\n }),\n designSystem: z.object({\n name: z.string().min(1),\n packageName: z.string().nullable(),\n importPath: z.string().nullable(),\n }),\n sourceBinding: z.object({\n bindingId: z.string().min(1),\n projectId: z.string().min(1),\n projectName: z.string().min(1),\n repoFullName: z.string().min(1),\n resolution: z.enum(['explicit', 'auto']),\n }),\n totalComponents: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n tokenCategories: z.record(z.string(), z.number().int().nonnegative()),\n components: z.record(z.string(), bundleManifestComponentEntrySchema),\n});\n\nconst bundleTokenEntrySchema = z.object({\n name: z.string().min(1),\n path: z.array(z.string().min(1)),\n category: z.string().min(1),\n value: z.string(),\n type: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const bundleTokenFileSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n categories: z.record(\n z.string(),\n z.object({\n count: z.number().int().nonnegative(),\n tokens: z.array(bundleTokenEntrySchema),\n }),\n ),\n flat: z.array(bundleTokenEntrySchema),\n});\n\nexport const bundleComponentShardSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n componentId: z.string().min(1),\n file: z.string().min(1),\n component: z.object({\n componentKey: z.string().min(1),\n publicRef: z.string().min(1),\n publicId: z.string().nullable(),\n publicSlug: z.string().nullable(),\n isCanonical: z.boolean().optional(),\n name: z.string().min(1),\n tier: z.enum(['core', 'composition']),\n category: z.string().min(1),\n status: z.string().min(1),\n description: z.string(),\n usageGuidance: z.string(),\n dos: z.array(z.string()),\n donts: z.array(z.string()),\n props: z.record(z.string(), z.unknown()),\n relations: z.array(z.record(z.string(), z.unknown())),\n compoundChildren: z.array(bundleManifestCompoundChildSchema),\n examples: z.array(z.record(z.string(), z.unknown())),\n source: z.literal('design-system'),\n sourcePath: z.string().optional(),\n sourceRepoFullName: z.string().optional(),\n parentComponentName: z.string().optional(),\n parentComponentKey: z.string().optional(),\n }),\n});\n\nexport type BundleSchemaVersion = z.infer<typeof bundleSchemaVersionSchema>;\nexport type BundleTarget = z.infer<typeof bundleTargetSchema>;\nexport type BundleArtifactMetadata = z.infer<\n typeof bundleArtifactMetadataSchema\n>;\nexport type BundleManifestComponentEntry = z.infer<\n typeof bundleManifestComponentEntrySchema\n>;\nexport type BundleManifest = z.infer<typeof bundleManifestSchema>;\nexport type BundleComponentShard = z.infer<typeof bundleComponentShardSchema>;\nexport type BundleTokenFile = z.infer<typeof bundleTokenFileSchema>;\n","import { portableRepoPathError } from \"./config-paths.js\";\nimport {\n REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION,\n hashRegistryFileContent,\n registryInstallReceiptSchema,\n type RegistryArtifact,\n type RegistryDependency,\n type RegistryFile,\n type RegistryInstallReceipt,\n} from \"./registry.js\";\n\nexport interface RegistryWritePlan {\n path: string;\n sourcePath: string;\n content: string;\n componentId?: string;\n}\n\nexport interface BuildRegistryInstallPlanInput {\n artifact: RegistryArtifact;\n requestedComponents: readonly string[];\n targetPath: string;\n all?: boolean;\n includeTests?: boolean;\n}\n\nexport interface RegistryInstallPlan {\n componentNames: string[];\n plans: RegistryWritePlan[];\n dependencies: RegistryDependency[];\n}\n\nexport function normalizeRegistryRepoPath(path: string): string {\n return path\n .split(\"\\\\\")\n .join(\"/\")\n .replace(/^\\.\\/+/, \"\");\n}\n\nexport function assertPortableRegistryPath(path: string, label: string): string {\n const normalized = normalizeRegistryRepoPath(path);\n const error = portableRepoPathError(normalized);\n if (error) throw new Error(`${label}: ${error}`);\n return normalized;\n}\n\nfunction joinRegistryPath(...parts: string[]): string {\n return normalizeRegistryRepoPath(parts.filter(Boolean).join(\"/\"));\n}\n\nexport function sourceToRegistryTargetPath(targetRoot: string, sourcePath: string): string {\n const source = normalizeRegistryRepoPath(sourcePath);\n const withoutSrc = source.startsWith(\"src/\") ? source.slice(\"src/\".length) : source;\n return assertPortableRegistryPath(\n joinRegistryPath(targetRoot, withoutSrc),\n \"Registry install target\"\n );\n}\n\nexport function selectedRegistryComponentNames(\n artifact: RegistryArtifact,\n requested: readonly string[],\n all: boolean | undefined\n): string[] {\n if (all || requested.includes(\"*\")) {\n return Object.keys(artifact.manifest.components).sort((left, right) =>\n left.localeCompare(right)\n );\n }\n if (requested.length === 0) {\n throw new Error(\"Choose at least one registry component to install.\");\n }\n for (const name of requested) {\n if (!artifact.manifest.components[name]) {\n throw new Error(`Unknown registry component ${name}`);\n }\n }\n return [...new Set(requested)].sort();\n}\n\nfunction installsCompleteRegistry(\n artifact: RegistryArtifact,\n componentNames: readonly string[]\n): boolean {\n const allComponents = Object.keys(artifact.manifest.components);\n return (\n componentNames.length === allComponents.length &&\n allComponents.every((name) => componentNames.includes(name))\n );\n}\n\nfunction shouldInstallFile(file: RegistryFile, includeTests: boolean | undefined): boolean {\n if (includeTests) return true;\n return file.role !== \"test\" && file.role !== \"story\";\n}\n\nfunction dependencyKey(dependency: RegistryDependency): string {\n return `${dependency.type}:${dependency.name}:${dependency.versionRange}:${dependency.optional ? 1 : 0}`;\n}\n\nexport function collectRegistryInstallDependencies(\n artifact: RegistryArtifact,\n componentNames: readonly string[]\n): RegistryDependency[] {\n const dependencies = new Map<string, RegistryDependency>();\n for (const dependency of artifact.manifest.dependencies) {\n dependencies.set(dependencyKey(dependency), dependency);\n }\n for (const name of componentNames) {\n const component = artifact.manifest.components[name];\n for (const dependency of [...component.runtimeDependencies, ...component.peerDependencies]) {\n dependencies.set(dependencyKey(dependency), dependency);\n }\n }\n return [...dependencies.values()].sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction collectComponentWritePlan(args: {\n artifact: RegistryArtifact;\n componentNames: readonly string[];\n targetPath: string;\n includeTests?: boolean;\n}): RegistryWritePlan[] {\n const writes = new Map<string, RegistryWritePlan>();\n for (const componentName of args.componentNames) {\n const component = args.artifact.manifest.components[componentName];\n for (const file of component.files) {\n if (!shouldInstallFile(file, args.includeTests)) continue;\n const content = args.artifact.files[file.path];\n if (!content) throw new Error(`Artifact is missing file content for ${file.path}`);\n const target = sourceToRegistryTargetPath(args.targetPath, file.path);\n writes.set(target, {\n path: target,\n sourcePath: file.path,\n content: content.content,\n componentId: component.componentId,\n });\n }\n }\n return [...writes.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction rewriteInstalledPackagePath(value: string): string {\n if (value.startsWith(\"./src/\")) return `./${value.slice(\"./src/\".length)}`;\n if (value.startsWith(\"src/\")) return value.slice(\"src/\".length);\n return value;\n}\n\nfunction rewriteInstalledPackageExport(value: unknown): unknown {\n if (typeof value === \"string\") return rewriteInstalledPackagePath(value);\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, rewriteInstalledPackageExport(nested)])\n );\n}\n\nfunction rewriteInstalledPackageJson(content: string): string {\n const parsed = JSON.parse(content) as {\n name?: string;\n version?: string;\n type?: string;\n sideEffects?: unknown;\n main?: string;\n types?: string;\n fragments?: string;\n exports?: unknown;\n dependencies?: unknown;\n peerDependencies?: unknown;\n peerDependenciesMeta?: unknown;\n };\n\n const installed = {\n ...(parsed.name && { name: parsed.name }),\n ...(parsed.version && { version: parsed.version }),\n private: true,\n ...(parsed.type && { type: parsed.type }),\n ...(parsed.sideEffects !== undefined && { sideEffects: parsed.sideEffects }),\n ...(parsed.main && { main: rewriteInstalledPackagePath(parsed.main) }),\n ...(parsed.types && { types: rewriteInstalledPackagePath(parsed.types) }),\n fragments: rewriteInstalledPackagePath(parsed.fragments ?? \"fragments.json\"),\n ...(parsed.exports !== undefined && {\n exports: rewriteInstalledPackageExport(parsed.exports),\n }),\n ...(parsed.dependencies !== undefined && { dependencies: parsed.dependencies }),\n ...(parsed.peerDependencies !== undefined && { peerDependencies: parsed.peerDependencies }),\n ...(parsed.peerDependenciesMeta !== undefined && {\n peerDependenciesMeta: parsed.peerDependenciesMeta,\n }),\n };\n\n return `${JSON.stringify(installed, null, 2)}\\n`;\n}\n\nfunction collectPackageWritePlan(args: {\n artifact: RegistryArtifact;\n targetPath: string;\n includeTests?: boolean;\n}): RegistryWritePlan[] {\n const writes = new Map<string, RegistryWritePlan>();\n const packageFiles = new Map(\n args.artifact.manifest.packageFiles.map((file) => [file.path, file])\n );\n for (const entrypoint of args.artifact.manifest.entrypoints) {\n const file = packageFiles.get(entrypoint.sourcePath);\n if (file) continue;\n const content = args.artifact.files[entrypoint.sourcePath];\n if (!content) throw new Error(`Artifact is missing file content for ${entrypoint.sourcePath}`);\n packageFiles.set(entrypoint.sourcePath, {\n path: entrypoint.sourcePath,\n role: \"barrel\",\n sha256: content.sha256,\n size: content.size,\n contentType: content.contentType,\n contentRef: `sha256:${content.sha256}`,\n });\n }\n\n for (const file of packageFiles.values()) {\n if (!shouldInstallFile(file, args.includeTests)) continue;\n const content = args.artifact.files[file.path];\n if (!content) throw new Error(`Artifact is missing file content for ${file.path}`);\n const target = sourceToRegistryTargetPath(args.targetPath, file.path);\n writes.set(target, {\n path: target,\n sourcePath: file.path,\n content:\n file.path === \"package.json\"\n ? rewriteInstalledPackageJson(content.content)\n : content.content,\n });\n }\n\n return [...writes.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction generatedIndexPlan(args: {\n componentNames: readonly string[];\n targetPath: string;\n artifact: RegistryArtifact;\n}): RegistryWritePlan {\n const lines = args.componentNames.map((name) => {\n const component = args.artifact.manifest.components[name];\n const exportName = component.exports[0]?.name ?? component.name;\n return `export { ${exportName} } from \"./components/${component.componentId}\";`;\n });\n return {\n path: assertPortableRegistryPath(\n joinRegistryPath(args.targetPath, \"index.ts\"),\n \"Registry index target\"\n ),\n sourcePath: \"registry/generated-index.ts\",\n content: `${lines.join(\"\\n\")}\\n`,\n };\n}\n\nfunction dedupePlans(plans: readonly RegistryWritePlan[]): RegistryWritePlan[] {\n const byPath = new Map<string, RegistryWritePlan>();\n for (const plan of plans) {\n const existing = byPath.get(plan.path);\n if (existing && existing.content !== plan.content) {\n throw new Error(`Conflicting registry write plans for ${plan.path}`);\n }\n byPath.set(plan.path, existing ?? plan);\n }\n return [...byPath.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nexport function buildRegistryInstallPlan(\n input: BuildRegistryInstallPlanInput\n): RegistryInstallPlan {\n const targetPath = assertPortableRegistryPath(input.targetPath, \"Registry target\");\n const componentNames = selectedRegistryComponentNames(\n input.artifact,\n input.requestedComponents,\n input.all\n );\n const dependencies = collectRegistryInstallDependencies(input.artifact, componentNames);\n const isCompleteInstall = installsCompleteRegistry(input.artifact, componentNames);\n const hasPackageRoot = input.artifact.manifest.entrypoints.some(\n (entrypoint) => entrypoint.specifier === \".\"\n );\n const plans = dedupePlans([\n ...(isCompleteInstall\n ? collectPackageWritePlan({\n artifact: input.artifact,\n targetPath,\n includeTests: input.includeTests,\n })\n : []),\n ...collectComponentWritePlan({\n artifact: input.artifact,\n componentNames,\n targetPath,\n includeTests: input.includeTests,\n }),\n ...(isCompleteInstall && hasPackageRoot\n ? []\n : [generatedIndexPlan({ artifact: input.artifact, componentNames, targetPath })]),\n ]);\n\n return { componentNames, plans, dependencies };\n}\n\nexport function buildRegistryInstallReceipt(args: {\n artifact: RegistryArtifact;\n targetPath: string;\n importPath: string;\n componentNames: readonly string[];\n plans: readonly RegistryWritePlan[];\n dependencies: readonly RegistryDependency[];\n installedAt?: string;\n}): RegistryInstallReceipt {\n const installedComponents = args.componentNames.map((name) => {\n const component = args.artifact.manifest.components[name];\n return {\n componentId: component.componentId,\n publicRef: component.publicRef,\n name: component.name,\n files: args.plans\n .filter((plan) => plan.componentId === component.componentId)\n .map((plan) => plan.path),\n };\n });\n\n return registryInstallReceiptSchema.parse({\n schemaVersion: REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION,\n registryId: args.artifact.manifest.registryId,\n registryVersion: args.artifact.manifest.version,\n registryHash: args.artifact.manifest.registryHash,\n fcid: args.artifact.manifest.fcid,\n channel: args.artifact.manifest.channel,\n targetPath: assertPortableRegistryPath(args.targetPath, \"Registry target\"),\n importPath: args.importPath,\n installedComponents,\n files: args.plans.map((plan) => ({\n path: plan.path,\n sourcePath: plan.sourcePath,\n sha256: hashRegistryFileContent(plan.content),\n componentId: plan.componentId,\n })),\n dependencies: args.dependencies,\n installedAt: args.installedAt ?? new Date().toISOString(),\n });\n}\n","import { z } from 'zod';\n\nexport const mcpSnapshotSchemaVersionSchema = z.literal(1);\n\nexport const mcpSourceTypeSchema = z.enum([\n 'fragments-json',\n 'cloud',\n 'auto-extract',\n 'custom-json',\n 'bundle',\n]);\n\nexport const mcpCapabilitySchema = z.enum([\n 'components',\n 'tokens',\n 'blocks',\n 'graph',\n 'performance',\n]);\n\nexport const mcpPerformanceImportSchema = z.object({\n path: z.string().min(1),\n bytes: z.number().nonnegative(),\n percent: z.number().nonnegative(),\n});\n\nexport const mcpPerformanceDataSchema = z.object({\n bundleSize: z.number().nonnegative(),\n rawSize: z.number().nonnegative(),\n complexity: z.enum(['lightweight', 'moderate', 'heavy']),\n budgetPercent: z.number().nonnegative(),\n overBudget: z.boolean(),\n measuredAt: z.string().datetime(),\n imports: z.array(mcpPerformanceImportSchema).optional(),\n});\n\nexport const mcpPerformanceSummarySchema = z.object({\n preset: z.string().min(1),\n budget: z.number().nonnegative(),\n total: z.number().int().nonnegative(),\n overBudget: z.number().int().nonnegative(),\n tiers: z.record(\n z.enum(['lightweight', 'moderate', 'heavy']),\n z.number().int().nonnegative(),\n ),\n});\n\nexport const mcpComponentPropSchema = z.object({\n type: z.string().min(1),\n description: z.string().default(''),\n required: z.boolean().default(false),\n default: z.unknown().optional(),\n values: z.array(z.string()).optional(),\n constraints: z.array(z.string()).optional(),\n});\n\nexport const mcpComponentExampleSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n code: z.string().optional(),\n kind: z.string().optional(),\n});\n\nexport const mcpComponentRelationSchema = z.object({\n componentName: z.string().min(1),\n componentId: z.string().optional(),\n relationship: z.string().min(1),\n note: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const mcpCompoundChildSchema = z.object({\n name: z.string().min(1),\n componentId: z.string().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n});\n\nexport const mcpGuidancePatternSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n});\n\nexport const mcpComponentGuidanceSchema = z.object({\n when: z.array(z.string()).default([]),\n whenNot: z.array(z.string()).default([]),\n guidelines: z.array(z.string()).default([]),\n accessibility: z.array(z.string()).default([]),\n usageGuidance: z.string().optional(),\n dos: z.array(z.string()).default([]),\n donts: z.array(z.string()).default([]),\n patterns: z.array(mcpGuidancePatternSchema).default([]),\n});\n\nexport const mcpComponentMetadataSchema = z.object({\n a11yRules: z.array(z.string()).default([]),\n scenarioTags: z.array(z.string()).default([]),\n});\n\nexport const mcpComponentSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().default(''),\n category: z.string().default('uncategorized'),\n status: z.string().default('stable'),\n tags: z.array(z.string()).default([]),\n props: z.record(z.string(), mcpComponentPropSchema).default({}),\n propsSummary: z.array(z.string()).default([]),\n examples: z.array(mcpComponentExampleSchema).default([]),\n relations: z.array(mcpComponentRelationSchema).default([]),\n compoundChildren: z.array(mcpCompoundChildSchema).default([]),\n guidance: mcpComponentGuidanceSchema.default({\n when: [],\n whenNot: [],\n guidelines: [],\n accessibility: [],\n dos: [],\n donts: [],\n patterns: [],\n }),\n sourceType: mcpSourceTypeSchema,\n sourcePath: z.string().optional(),\n sourceRepoFullName: z.string().optional(),\n packageName: z.string().optional(),\n importPath: z.string().optional(),\n publicRef: z.string().optional(),\n publicSlug: z.string().nullable().optional(),\n isCanonical: z.boolean().optional(),\n tier: z.string().optional(),\n parentComponentId: z.string().optional(),\n parentComponentName: z.string().optional(),\n performance: mcpPerformanceDataSchema.optional(),\n metadata: mcpComponentMetadataSchema.default({\n a11yRules: [],\n scenarioTags: [],\n }),\n});\n\nexport const mcpBlockSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().default(''),\n category: z.string().default('uncategorized'),\n components: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n code: z.string().default(''),\n});\n\nexport const mcpTokenSchema = z.object({\n name: z.string().min(1),\n category: z.string().min(1),\n value: z.string().optional(),\n description: z.string().optional(),\n path: z.array(z.string()).optional(),\n type: z.string().optional(),\n});\n\nexport const mcpTokenDataSchema = z.object({\n prefix: z.string(),\n total: z.number().int().nonnegative(),\n categories: z.record(z.string(), z.array(mcpTokenSchema)),\n flat: z.array(mcpTokenSchema).default([]),\n});\n\nexport const mcpSnapshotMetadataSchema = z.object({\n designSystemName: z.string().optional(),\n packageName: z.string().optional(),\n importPath: z.string().optional(),\n revision: z.string().optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const mcpSnapshotSchema = z.object({\n schemaVersion: mcpSnapshotSchemaVersionSchema,\n sourceType: mcpSourceTypeSchema,\n sourceLabel: z.string().min(1),\n capabilities: z.array(mcpCapabilitySchema),\n metadata: mcpSnapshotMetadataSchema.default({}),\n components: z.record(z.string(), mcpComponentSchema),\n blocks: z.record(z.string(), mcpBlockSchema).optional(),\n tokens: mcpTokenDataSchema.optional(),\n graph: z.unknown().optional(),\n performanceSummary: mcpPerformanceSummarySchema.optional(),\n packageMap: z.record(z.string(), z.string()).default({}),\n defaultPackageName: z.string().optional(),\n});\n\nexport type McpSnapshotSchemaVersion = z.infer<\n typeof mcpSnapshotSchemaVersionSchema\n>;\nexport type McpSourceType = z.infer<typeof mcpSourceTypeSchema>;\nexport type McpCapability = z.infer<typeof mcpCapabilitySchema>;\nexport type McpPerformanceImport = z.infer<\n typeof mcpPerformanceImportSchema\n>;\nexport type McpPerformanceData = z.infer<typeof mcpPerformanceDataSchema>;\nexport type McpPerformanceSummary = z.infer<\n typeof mcpPerformanceSummarySchema\n>;\nexport type McpComponentProp = z.infer<typeof mcpComponentPropSchema>;\nexport type McpComponentExample = z.infer<typeof mcpComponentExampleSchema>;\nexport type McpComponentRelation = z.infer<\n typeof mcpComponentRelationSchema\n>;\nexport type McpCompoundChild = z.infer<typeof mcpCompoundChildSchema>;\nexport type McpGuidancePattern = z.infer<typeof mcpGuidancePatternSchema>;\nexport type McpComponentGuidance = z.infer<\n typeof mcpComponentGuidanceSchema\n>;\nexport type McpComponentMetadata = z.infer<\n typeof mcpComponentMetadataSchema\n>;\nexport type McpComponent = z.infer<typeof mcpComponentSchema>;\nexport type McpBlock = z.infer<typeof mcpBlockSchema>;\nexport type McpToken = z.infer<typeof mcpTokenSchema>;\nexport type McpTokenData = z.infer<typeof mcpTokenDataSchema>;\nexport type McpSnapshotMetadata = z.infer<\n typeof mcpSnapshotMetadataSchema\n>;\nexport type McpSnapshot = z.infer<typeof mcpSnapshotSchema>;\n","export interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RGBA extends RGB {\n a?: number;\n}\n\nconst NAMED_COLORS: Record<string, RGB> = {\n white: { r: 255, g: 255, b: 255 },\n black: { r: 0, g: 0, b: 0 },\n transparent: { r: 0, g: 0, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n green: { r: 0, g: 128, b: 0 },\n blue: { r: 0, g: 0, b: 255 },\n};\n\nexport function hexToRgb(hex: string): RGB | null {\n const match = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return `#${[r, g, b]\n .map((x) => Math.round(x).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nexport function parseRgb(color: string): RGBA | null {\n const match = color.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/i,\n );\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 10),\n g: parseInt(match[2], 10),\n b: parseInt(match[3], 10),\n a: match[4] ? parseFloat(match[4]) : undefined,\n };\n}\n\nexport function parseColor(color: string): RGBA | null {\n const hex = hexToRgb(color);\n if (hex) return hex;\n\n const rgb = parseRgb(color);\n if (rgb) {\n return {\n ...rgb,\n a: rgb.a ?? 1,\n };\n }\n\n return null;\n}\n\nexport function parseColorToRgb(color: string): RGB | null {\n const lower = color.toLowerCase().trim();\n const named = NAMED_COLORS[lower];\n if (named) return named;\n\n const parsed = parseColor(color);\n if (!parsed) return null;\n\n return {\n r: parsed.r,\n g: parsed.g,\n b: parsed.b,\n };\n}\n\nexport function normalizeColor(color: string): string {\n if (color.startsWith(\"#\")) {\n return color.toLowerCase();\n }\n\n const rgb = parseRgb(color);\n if (rgb) {\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n }\n\n return color.toLowerCase();\n}\n\nexport function isColorLike(value: string): boolean {\n return (\n value.startsWith(\"#\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"hsl\") ||\n /^(transparent|white|black|red|blue|green|yellow|orange|purple|pink|gray|grey)$/i.test(\n value,\n )\n );\n}\n\nexport function familyDistance(c1: RGB, c2: RGB): number {\n const maxDistance = Math.sqrt(255 ** 2 * 3);\n return (\n Math.sqrt((c1.r - c2.r) ** 2 + (c1.g - c2.g) ** 2 + (c1.b - c2.b) ** 2) /\n maxDistance\n );\n}\n\nexport function colorSimilarity(c1: RGB, c2: RGB): number {\n return 1 - familyDistance(c1, c2);\n}\n\nexport function calculateDeltaE(c1: RGB, c2: RGB): number {\n const lab1 = rgbToLab(c1);\n const lab2 = rgbToLab(c2);\n\n return Math.sqrt(\n Math.pow(lab2.l - lab1.l, 2) +\n Math.pow(lab2.a - lab1.a, 2) +\n Math.pow(lab2.b - lab1.b, 2),\n );\n}\n\nexport interface NearestByDeltaEOptions {\n threshold?: number;\n limit?: number;\n}\n\nexport interface DeltaEMatch<T> {\n item: T;\n distance: number;\n confidence: number;\n}\n\nexport function nearestByDeltaE<T>(\n target: RGB | string,\n candidates: readonly T[],\n resolveColor: (candidate: T) => RGB | string | null | undefined,\n options: NearestByDeltaEOptions = {},\n): Array<DeltaEMatch<T>> {\n const targetRgb = typeof target === \"string\" ? parseColorToRgb(target) : target;\n if (!targetRgb) return [];\n\n const threshold = options.threshold ?? Number.POSITIVE_INFINITY;\n const confidenceScale = Number.isFinite(threshold) && threshold > 0 ? threshold : 100;\n const matches: Array<DeltaEMatch<T>> = [];\n\n for (const candidate of candidates) {\n const resolved = resolveColor(candidate);\n const rgb = typeof resolved === \"string\" ? parseColorToRgb(resolved) : resolved;\n if (!rgb) continue;\n\n const distance = calculateDeltaE(targetRgb, rgb);\n if (distance <= threshold) {\n matches.push({\n item: candidate,\n distance,\n confidence: Math.max(0, 1 - distance / confidenceScale),\n });\n }\n }\n\n matches.sort((a, b) => a.distance - b.distance);\n return matches.slice(0, options.limit ?? matches.length);\n}\n\nfunction rgbToLab(rgb: RGB): { l: number; a: number; b: number } {\n let r = rgb.r / 255;\n let g = rgb.g / 255;\n let b = rgb.b / 255;\n\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124564 + g * 0.3575761 + b * 0.1804375) / 0.95047;\n let y = r * 0.2126729 + g * 0.7151522 + b * 0.072175;\n let z = (r * 0.0193339 + g * 0.119192 + b * 0.9503041) / 1.08883;\n\n x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n return {\n l: 116 * y - 16,\n a: 500 * (x - y),\n b: 200 * (y - z),\n };\n}\n","/**\n * Canonical Style Comparison Engine\n *\n * Pure comparison logic for design-code drift detection.\n * No React, no filesystem, no browser APIs, no Figma client, no Cloud types.\n *\n * This module is the single source of truth for style comparison.\n * CLI comparison surfaces consume these exports.\n */\n\nimport type {\n EnhancedStyleDiffItem,\n TokenCategory,\n TokenUsageSummary,\n} from \"./token-types.js\";\nimport { parseColor } from \"./tokens/color.js\";\nimport type { TokenLookup } from \"./tokens/lookup.js\";\n\nexport { parseColor } from \"./tokens/color.js\";\nexport type { TokenLookup } from \"./tokens/lookup.js\";\n\n// ─── Canonical Contract Types ────────────────────────────────────────────────\n\n/**\n * Source-agnostic normalized token for comparison.\n *\n * This is the canonical shape that all token sources (CSS vars, Tailwind,\n * DTCG, Figma) must produce before entering the comparison engine.\n * A `DesignToken` (CSS-custom-property-specific) can be converted to this\n * by dropping source-specific fields.\n */\nexport interface NormalizedToken {\n /** Canonical token name (e.g., \"--color-primary\", \"colors.primary\") */\n name: string;\n /** Normalized resolved value suitable for comparison (e.g., \"#0051c2\", \"16px\") */\n value: string;\n /** Token category for grouping */\n category: TokenCategory;\n /** Source system identifier */\n source: \"css-var\" | \"tailwind\" | \"dtcg\" | \"figma\" | (string & {});\n /** Original token name as declared in the source system */\n originalName: string;\n /** Theme or mode (e.g., \"default\", \"dark\", \"light\") */\n theme: string;\n}\n\n/**\n * Normalized style map: a record of CSS property names to their string values.\n * Used as the canonical input shape for both design-side and code-side styles.\n */\nexport type NormalizedStyleMap = Record<string, string>;\n\n/**\n * Options for configuring style comparison behavior.\n */\nexport interface StyleComparisonOptions {\n /** Color comparison tolerance in RGB channel delta (default: 5) */\n colorTolerance?: number;\n /** Numeric comparison tolerance in pixels (default: 1) */\n numericTolerance?: number;\n /** Alpha channel comparison tolerance (default: 0.05) */\n alphaTolerance?: number;\n /** CSS properties to compare. If omitted, uses DEFAULT_STYLE_PROPERTIES */\n properties?: string[];\n /** Theme to use for token lookup (default: \"default\") */\n theme?: string;\n}\n\n// ─── Comparison Types ────────────────────────────────────────────────────────\n\n/**\n * Style diff result for a single CSS property.\n */\nexport interface StyleDiffItem {\n /** CSS property name */\n property: string;\n /** Expected value from design source */\n figma: string;\n /** Actual value from rendered component */\n rendered: string;\n /** Whether values match (within tolerance) */\n match: boolean;\n}\n\n/**\n * Result of comparing styles between design and code.\n */\nexport interface StyleComparisonResult {\n /** Whether all styles match */\n match: boolean;\n /** Individual property comparisons */\n properties: StyleDiffItem[];\n /** CSS properties from design source */\n figmaStyles: NormalizedStyleMap;\n /** Computed CSS properties from rendered component */\n renderedStyles: NormalizedStyleMap;\n}\n\n/**\n * Enhanced style comparison result with token information.\n */\nexport interface EnhancedStyleComparisonResult extends StyleComparisonResult {\n /** Individual property comparisons with token info */\n properties: EnhancedStyleDiffItem[];\n /** Token usage summary */\n tokenSummary?: TokenUsageSummary;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Properties that use color comparison with tolerance */\nconst COLOR_PROPERTIES = new Set([\"backgroundColor\", \"borderColor\", \"color\"]);\n\n/** Properties that use numeric comparison with tolerance */\nconst NUMERIC_PROPERTIES = new Set([\n \"borderWidth\",\n \"borderRadius\",\n \"fontSize\",\n \"padding\",\n \"gap\",\n]);\n\n/** Default CSS properties compared by compareStyles() */\nexport const DEFAULT_STYLE_PROPERTIES = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"gap\",\n \"opacity\",\n] as const;\n\n/** Default CSS properties compared by compareStylesWithTokens() (includes \"color\") */\nexport const DEFAULT_ENHANCED_STYLE_PROPERTIES = [\n ...DEFAULT_STYLE_PROPERTIES,\n \"color\",\n] as const;\n\n// ─── Pure Comparison Functions ───────────────────────────────────────────────\n\n/**\n * Normalize a style value for comparison.\n */\nexport function normalizeStyleValue(prop: string, value: string): string {\n let normalized = value.trim().replace(/\\s+/g, \" \");\n\n // Normalize \"none\" shadow to empty\n if (prop === \"boxShadow\" && normalized === \"none\") {\n normalized = \"\";\n }\n\n // Normalize rgba(0, 0, 0, 0) to \"transparent\"\n if (normalized.match(/rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/)) {\n normalized = \"transparent\";\n }\n\n return normalized;\n}\n\n/**\n * Compare two color values with tolerance.\n */\nexport function compareColors(\n color1: string,\n color2: string,\n tolerance: number,\n alphaTolerance = 0.05\n): boolean {\n const rgb1 = parseColor(color1);\n const rgb2 = parseColor(color2);\n\n if (!rgb1 || !rgb2) {\n return color1 === color2;\n }\n\n return (\n Math.abs(rgb1.r - rgb2.r) <= tolerance &&\n Math.abs(rgb1.g - rgb2.g) <= tolerance &&\n Math.abs(rgb1.b - rgb2.b) <= tolerance &&\n Math.abs((rgb1.a ?? 1) - (rgb2.a ?? 1)) <= alphaTolerance\n );\n}\n\n/**\n * Compare numeric values (e.g., \"10px\" vs \"11px\") with tolerance.\n */\nexport function compareNumericValues(\n value1: string,\n value2: string,\n tolerance: number\n): boolean {\n const num1 = parseFloat(value1);\n const num2 = parseFloat(value2);\n\n if (isNaN(num1) || isNaN(num2)) {\n return value1 === value2;\n }\n\n return Math.abs(num1 - num2) <= tolerance;\n}\n\n/**\n * Compare a single style value with tolerance for color and numeric differences.\n */\nexport function compareStyleValue(\n prop: string,\n figma: string,\n rendered: string\n): boolean {\n const normalizedFigma = normalizeStyleValue(prop, figma);\n const normalizedRendered = normalizeStyleValue(prop, rendered);\n\n // Direct match\n if (normalizedFigma === normalizedRendered) {\n return true;\n }\n\n // Color comparison with tolerance\n if (COLOR_PROPERTIES.has(prop)) {\n return compareColors(normalizedFigma, normalizedRendered, 5);\n }\n\n // Numeric comparison with tolerance (for pixels)\n if (NUMERIC_PROPERTIES.has(prop)) {\n return compareNumericValues(normalizedFigma, normalizedRendered, 1);\n }\n\n return false;\n}\n\n/**\n * Compare design CSS properties with rendered computed styles.\n */\nexport function compareStyles(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap\n): StyleComparisonResult {\n const properties: StyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n properties.push({\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n });\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n };\n}\n\n// ─── Token-Aware Comparison ──────────────────────────────────────────────────\n\n/**\n * Compare styles with token awareness.\n *\n * This enhanced version:\n * 1. Performs normal style comparison\n * 2. Identifies which values match design tokens\n * 3. Flags hardcoded values that should use tokens\n * 4. Generates fix suggestions\n */\nexport function compareStylesWithTokens(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap,\n tokenLookup?: TokenLookup,\n theme = \"default\"\n): EnhancedStyleComparisonResult {\n const properties: EnhancedStyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_ENHANCED_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n\n const item: EnhancedStyleDiffItem = {\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n isHardcoded: false,\n };\n\n if (tokenLookup) {\n const figmaTokens = tokenLookup.findByValue(figmaValue, theme);\n const renderedTokens = renderedValue\n ? tokenLookup.findByValue(renderedValue, theme)\n : [];\n\n if (figmaTokens.length > 0) {\n item.figmaToken = figmaTokens[0];\n }\n\n if (renderedTokens.length > 0) {\n item.renderedToken = renderedTokens[0];\n }\n\n // Hardcoded = Figma matches a token, but rendered doesn't use a token\n item.isHardcoded = !!item.figmaToken && !item.renderedToken;\n\n if (item.isHardcoded && item.figmaToken) {\n const token = tokenLookup.getToken(item.figmaToken);\n if (token) {\n const cssProperty = toCssProperty(prop);\n item.suggestedFix = {\n tokenName: item.figmaToken,\n tokenValue: token.resolvedValue,\n codeFix: `${cssProperty}: var(${item.figmaToken});`,\n confidence: 0.9,\n reason: `Figma uses token ${item.figmaToken} (${token.resolvedValue}). Replace hardcoded value with token for consistency.`,\n };\n }\n }\n }\n\n properties.push(item);\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n let tokenSummary: TokenUsageSummary | undefined;\n if (tokenLookup) {\n tokenSummary = tokenLookup.calculateUsageSummary(\n properties.map((p) => ({\n property: p.property,\n figma: p.figma,\n rendered: p.rendered,\n match: p.match,\n })),\n theme\n );\n }\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n tokenSummary,\n };\n}\n\n// ─── Formatting Helpers ──────────────────────────────────────────────────────\n\n/**\n * Convert camelCase CSS property name to kebab-case.\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n/**\n * Format token usage summary for display.\n */\nexport function formatTokenSummary(summary: TokenUsageSummary): string {\n const lines: string[] = [];\n\n lines.push(`Token Compliance: ${summary.compliancePercent}%`);\n lines.push(\n `${summary.usingTokens}/${summary.totalProperties} properties using tokens`\n );\n\n if (summary.hardcoded > 0) {\n lines.push(`${summary.hardcoded} hardcoded value(s) detected`);\n }\n\n if (summary.implicitMatches > 0) {\n lines.push(`${summary.implicitMatches} implicit match(es)`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get status badge for token compliance level.\n */\nexport function getComplianceBadge(\n compliancePercent: number\n): { label: string; color: string } {\n if (compliancePercent >= 100) {\n return { label: \"Excellent\", color: \"green\" };\n } else if (compliancePercent >= 80) {\n return { label: \"Good\", color: \"blue\" };\n } else if (compliancePercent >= 50) {\n return { label: \"Fair\", color: \"yellow\" };\n } else {\n return { label: \"Poor\", color: \"red\" };\n }\n}\n","import { z } from \"zod\";\nimport { portableRepoPathError } from \"./config-paths.js\";\nimport { componentGovernanceRecordSchema, governanceConfigSchema } from \"./governance.js\";\nimport { compositionAuthoringEntrySchema } from \"./rules/composition-pattern-schema.js\";\n\n/**\n * Zod schemas for runtime validation of fragment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal(\"figma-string\"),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal(\"figma-boolean\"),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal(\"figma-enum\"),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal(\"figma-instance\"),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal(\"figma-children\"),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal(\"figma-text-content\"),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion(\"__type\", [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const fragmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum([\"stable\", \"beta\", \"deprecated\", \"experimental\"]).optional(),\n since: z.string().optional(),\n dependencies: z\n .array(\n z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n reason: z.string().optional(),\n })\n )\n .optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const fragmentUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"enum\",\n \"function\",\n \"node\",\n \"element\",\n \"object\",\n \"array\",\n \"union\",\n \"custom\",\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n \"alternative\",\n \"sibling\",\n \"parent\",\n \"child\",\n \"composition\",\n \"complementary\",\n \"used-by\",\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const fragmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.custom<(...args: unknown[]) => unknown>(\n (value) => typeof value === \"function\",\n \"Expected a render function\"\n ),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const fragmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const fragmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(fragmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n performanceBudget: z.number().positive().optional(),\n compoundChildren: z\n .record(\n z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })\n )\n .optional(),\n canonicalUsage: z.array(z.string()).optional(),\n // Region-scoped composition constraints (brief 04 §10). Authors write the\n // `{ inRegion, rule }` sugar; `lowerCompositionContract` lowers it to the\n // `CompositionPattern[]` the composition/* rules read from policy.\n composition: z.array(compositionAuthoringEntrySchema).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated fragments\n */\nexport const fragmentGeneratedSchema = z.object({\n source: z.enum([\"storybook\", \"manual\", \"ai\"]),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for AI-specific metadata for playground context generation\n */\nexport const aiMetadataSchema = z.object({\n compositionPattern: z.enum([\"compound\", \"simple\", \"controlled\", \"wrapper\"]).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\nexport const observedUsagePropSchema = z.object({\n name: z.string().min(1),\n kind: z.enum([\"static\", \"dynamic\", \"spread\", \"jsx\", \"boolean\", \"null\"]),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n});\n\nexport const observedComponentUsageSchema = z.object({\n file: z.string().min(1),\n line: z.number().int().positive(),\n column: z.number().int().nonnegative(),\n props: z.array(observedUsagePropSchema),\n parentElement: z.string().optional(),\n conditional: z.boolean().optional(),\n});\n\n/**\n * Schema for block definitions\n */\nexport const blockDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const fragmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: fragmentMetaSchema,\n usage: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(fragmentVariantSchema), // Allow empty variants array\n contract: fragmentContractSchema.optional(),\n ai: aiMetadataSchema.optional(),\n usages: z.array(observedComponentUsageSchema).optional(),\n _generated: fragmentGeneratedSchema.optional(),\n});\n\nconst repoRelativePathSchema = z\n .string()\n .min(1)\n .superRefine((path, ctx) => {\n const error = portableRepoPathError(path);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n });\n }\n });\n\nconst repoRelativePathsSchema = z.array(repoRelativePathSchema).min(1);\n\nconst tokenSourceSchema = z.object({\n path: repoRelativePathSchema,\n format: z.enum([\"auto\", \"css\", \"scss\", \"dtcg\", \"tailwind\"]).optional(),\n});\n\nconst tokenConfigSchema = z\n .object({\n include: repoRelativePathsSchema.optional(),\n sources: z.array(tokenSourceSchema).min(1).optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n themeSelectors: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n format: z.enum([\"auto\", \"css\", \"scss\", \"dtcg\", \"tailwind\"]).optional(),\n namespace: z.string().min(1).optional(),\n })\n .passthrough()\n .superRefine((tokens, ctx) => {\n if (!tokens.include?.length && !tokens.sources?.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Add tokens.include or tokens.sources\",\n path: [\"sources\"],\n });\n }\n });\n\nconst topologySchema = z.object({\n version: z.number().int().positive(),\n base: z.enum([\"app\", \"repo\"]).optional(),\n areas: z.array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n criticality: z.enum([\"low\", \"medium\", \"high\", \"revenue\", \"regulated\"]),\n owners: z.array(z.string()),\n files: repoRelativePathsSchema,\n routes: z.array(z.string().min(1)).optional(),\n priority: z.number().optional(),\n })\n ),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const fragmentsConfigSchema = z.object({\n app: z\n .object({\n path: repoRelativePathSchema.optional(),\n include: repoRelativePathsSchema.optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n })\n .optional(),\n designSystem: z\n .object({\n path: repoRelativePathSchema.optional(),\n packageName: z.string().min(1).optional(),\n components: repoRelativePathsSchema.optional(),\n })\n .optional(),\n include: repoRelativePathsSchema.optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n components: repoRelativePathsSchema.optional(),\n outFile: repoRelativePathSchema.optional(),\n framework: z.enum([\"react\", \"vue\", \"svelte\"]).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: tokenConfigSchema.optional(),\n snippets: z\n .object({\n mode: z.enum([\"warn\", \"error\"]).optional(),\n scope: z.enum([\"snippet\", \"snippet+render\"]).optional(),\n requireFullSnippet: z.boolean().optional(),\n allowedExternalModules: z.array(z.string().min(1)).optional(),\n })\n .optional(),\n performance: z\n .union([\n z.enum([\"strict\", \"standard\", \"relaxed\"]),\n z.object({\n preset: z.enum([\"strict\", \"standard\", \"relaxed\"]).optional(),\n budgets: z\n .object({\n bundleSize: z.number().positive().optional(),\n })\n .optional(),\n }),\n ])\n .optional(),\n storybook: z\n .object({\n exclude: z.array(z.string()).optional(),\n include: z.array(z.string()).optional(),\n excludeDeprecated: z.boolean().optional(),\n excludeTests: z.boolean().optional(),\n excludeSvgIcons: z.boolean().optional(),\n excludeSubComponents: z.boolean().optional(),\n })\n .optional(),\n topology: topologySchema.optional(),\n govern: governanceConfigSchema.optional(),\n inspect: z\n .object({\n localCanonical: z\n .record(\n z.string().min(1),\n z.object({\n importPath: z.string().min(1),\n resolves: z\n .array(\n z.object({\n tag: z.string().min(1),\n role: z.string().min(1).optional(),\n inputType: z.string().min(1).optional(),\n })\n )\n .min(1),\n })\n )\n .optional(),\n })\n .optional(),\n recognizedClassHelpers: z.array(z.string().min(1)).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// v2 Schemas — alongside v1 (non-breaking)\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for v2 composition metadata (promoted from ai)\n * Uses shorter field names since parent field is `composition`.\n */\nexport const compositionMetadataSchema = z.object({\n pattern: z.enum([\"compound\", \"simple\", \"controlled\", \"wrapper\"]).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 extended provenance tracking\n */\nexport const fragmentProvenanceSchema = z.object({\n source: z.enum([\"storybook\", \"manual\", \"ai\", \"scan\"]),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n autoFields: z.array(z.string()).optional(),\n humanFields: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 fragment definitions.\n * Accepts the v2 field names (guidance, examples, composition, _provenance).\n */\nexport const fragmentDefinitionV2Schema = z.object({\n component: z.any(),\n meta: fragmentMetaSchema,\n guidance: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n examples: z.array(fragmentVariantSchema),\n composition: compositionMetadataSchema.optional(),\n contract: fragmentContractSchema.optional(),\n _provenance: fragmentProvenanceSchema.optional(),\n});\n\nexport const governedFragmentDefinitionSchema = z.object({\n component: z.any(),\n meta: fragmentMetaSchema,\n guidance: fragmentUsageSchema,\n props: z.record(propDefinitionSchema).optional(),\n relations: z.array(componentRelationSchema).optional(),\n examples: z.array(fragmentVariantSchema).optional(),\n composition: compositionMetadataSchema.optional(),\n contract: fragmentContractSchema.optional(),\n _provenance: fragmentProvenanceSchema.optional(),\n govern: z.function().optional(),\n governance: z.array(componentGovernanceRecordSchema).optional(),\n});\n\n/**\n * @deprecated Use blockDefinitionSchema instead\n */\nexport const recipeDefinitionSchema = blockDefinitionSchema;\n","/**\n * The composition config contract — shared across the policy boundary.\n *\n * `CompositionPattern` is what the `composition/cardinality` and\n * `composition/co-occurrence` rules read from\n * `governance_rule_config.options.patterns`. Brief 03 defined it inline in the\n * rule; brief 04 lifted it here because the same shape now has to round-trip\n * across three boundaries that must not all hand-roll it:\n * - the rule's `isCompositionPattern` guard (validates untyped policy facts),\n * - cloud policy storage + delivery (`apps/cloud` validates on write against\n * `compositionPatternSchema` before persisting), and\n * - fragment authoring sugar (`lowerCompositionContract` lowers a fragment's\n * `contract.composition` block to the same `CompositionPattern[]`).\n *\n * Defining it once as a zod schema means the wire shape and the runtime guard\n * are the same artifact — the guard is `safeParse().success`, never a second\n * copy that can drift from the type.\n *\n * Browser-safe: imports `zod` only. No facts, no Node, no JSX.\n */\n\nimport { z } from \"zod\";\n\n// ── The rule-input contract ──────────────────────────────────────────────\n\n/** Which container a pattern applies to. `component` = canonical componentId. */\nexport const compositionRegionSelectorSchema = z.object({\n component: z.string().optional(),\n /** Marker attribute (e.g. `data-fui-region`). Typed; matched in a later brief. */\n marker: z.string().optional(),\n role: z.string().optional(),\n});\n\n/** Which children inside the region the constraint counts. */\nexport const compositionChildSelectorSchema = z.object({\n component: z.string(),\n prop: z.string().optional(),\n value: z.string().optional(),\n});\n\nexport const compositionConstraintSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"cardinality\"),\n max: z.number().optional(),\n min: z.number().optional(),\n }),\n z.object({\n kind: z.literal(\"co-occurrence\"),\n requires: z.object({ prop: z.string(), value: z.string() }),\n }),\n]);\n\nexport const compositionPatternSchema = z.object({\n region: compositionRegionSelectorSchema,\n select: compositionChildSelectorSchema,\n constraint: compositionConstraintSchema,\n});\n\nexport type CompositionRegionSelector = z.infer<typeof compositionRegionSelectorSchema>;\nexport type CompositionChildSelector = z.infer<typeof compositionChildSelectorSchema>;\nexport type CompositionConstraint = z.infer<typeof compositionConstraintSchema>;\nexport type CompositionPattern = z.infer<typeof compositionPatternSchema>;\n\n/**\n * Type guard for a single policy entry. Config arrives untyped from cloud\n * policy / fragment prose and the facts layer passes `options` through without\n * a shape, so a malformed entry would otherwise emit garbage findings. The rule\n * filters `options.patterns` through this; a bad entry is skipped, the rest keep\n * scanning (architecture failure mode).\n */\nexport function isCompositionPattern(value: unknown): value is CompositionPattern {\n return compositionPatternSchema.safeParse(value).success;\n}\n\n// ── Authoring sugar → constraint (Layer 3, brief 04 §10) ──────────────────\n\n/**\n * The structured block a fragment author writes in `contract.composition`. This\n * is the enforceable form of the prose they already keep (`relations`,\n * `usage.whenNot`); `lowerCompositionContract` turns it into the same\n * `CompositionPattern[]` the rule reads from cloud policy. v0 is this explicit\n * block — free-text inference from `whenNot` strings is out of scope.\n */\nexport const compositionAuthoringEntrySchema = z.object({\n inRegion: z.string(),\n rule: z.union([\n z.object({ atMost: z.number(), of: compositionChildSelectorSchema }),\n z.object({\n when: z.object({\n component: z.string(),\n prop: z.string(),\n value: z.string(),\n }),\n require: z.object({ prop: z.string(), value: z.string() }),\n }),\n ]),\n});\n\nexport type CompositionAuthoringEntry = z.infer<typeof compositionAuthoringEntrySchema>;\n\n/**\n * Lower a fragment's `contract.composition` block to the policy patterns the\n * rule consumes. The authoring shape ({ inRegion, rule }) and the rule shape\n * ({ region, select, constraint }) converge here, so fragment-authored and\n * cloud-delivered constraints reach the rule as one identical config.\n */\nexport function lowerCompositionContract(\n entries: CompositionAuthoringEntry[] | undefined\n): CompositionPattern[] {\n return (entries ?? []).map((entry) => {\n const region = { component: entry.inRegion };\n if (\"atMost\" in entry.rule) {\n return {\n region,\n select: entry.rule.of,\n constraint: { kind: \"cardinality\", max: entry.rule.atMost },\n };\n }\n return {\n region,\n select: entry.rule.when,\n constraint: { kind: \"co-occurrence\", requires: entry.rule.require },\n };\n });\n}\n","import { fragmentsConfigSchema } from \"./schema.js\";\nimport type { FragmentsConfig } from \"./types.js\";\nimport { normalizeGovernanceConfig } from \"./governance.js\";\n\nfunction formatZodErrors(errors: Array<{ path: (string | number)[]; message: string }>) {\n return errors.map((error) => ` - ${error.path.join(\".\")}: ${error.message}`).join(\"\\n\");\n}\n\nexport function defineConfig<TConfig extends FragmentsConfig>(config: TConfig): TConfig {\n const normalized = normalizeGovernanceConfig(config);\n const result = fragmentsConfigSchema.safeParse(normalized);\n\n if (!result.success) {\n throw new Error(`Invalid fragments config:\\n${formatZodErrors(result.error.errors)}`);\n }\n\n return result.data as TConfig;\n}\n","import type {\n FragmentDefinition,\n FragmentDefinitionV2,\n CompiledFragment,\n FragmentComponent,\n BlockDefinition,\n CompiledBlock,\n AIMetadata,\n FragmentGenerated,\n} from \"./types.js\";\nimport type {\n GovernedFragmentDefinition,\n ResolvedGovernedFragmentDefinition,\n} from \"./governance.js\";\nimport {\n fragmentDefinitionSchema,\n fragmentDefinitionV2Schema,\n governedFragmentDefinitionSchema,\n blockDefinitionSchema,\n} from \"./schema.js\";\nimport { resolveComponentGovernance } from \"./governance.js\";\n\nfunction isGovernedDefinition<T>(\n def: FragmentDefinition<T> | FragmentDefinitionV2<T> | GovernedFragmentDefinition<T>\n): def is GovernedFragmentDefinition<T> {\n return \"govern\" in def || \"governance\" in def;\n}\n\n/**\n * Check if a definition uses v2 field names.\n * Detects `guidance` or `examples` (v2) vs `usage` or `variants` (v1).\n */\nfunction isV2Definition<T>(\n def: FragmentDefinition<T> | FragmentDefinitionV2<T> | GovernedFragmentDefinition<T>\n): def is FragmentDefinitionV2<T> {\n return !isGovernedDefinition(def) && (\"guidance\" in def || \"examples\" in def);\n}\n\n/**\n * Normalize a v2 definition to v1 shape for downstream compatibility.\n * The build pipeline, compiler, and validators all work with v1 internally.\n */\nexport function normalizeToV1<T>(def: FragmentDefinitionV2<T>): FragmentDefinition<T> {\n // Map composition → ai (rename fields)\n let ai: AIMetadata | undefined;\n if (def.composition) {\n ai = {\n compositionPattern: def.composition.pattern,\n subComponents: def.composition.subComponents,\n requiredChildren: def.composition.requiredChildren,\n commonPatterns: def.composition.commonPatterns,\n };\n }\n\n // Map _provenance → _generated (narrow source type, drop extended fields)\n let generated: FragmentGenerated | undefined;\n if (def._provenance) {\n generated = {\n source: def._provenance.source === \"scan\" ? \"ai\" : def._provenance.source,\n sourceFile: def._provenance.sourceFile,\n confidence: def._provenance.confidence,\n timestamp: def._provenance.timestamp,\n };\n }\n\n return {\n component: def.component,\n meta: def.meta,\n usage: def.guidance,\n props: def.props,\n relations: def.relations,\n variants: def.examples,\n contract: def.contract,\n ai,\n _generated: generated,\n };\n}\n\n/**\n * Define a fragment for a component.\n *\n * This is the main API for creating fragment documentation.\n * It provides runtime validation and type safety.\n *\n * Accepts both v1 and v2 shapes:\n * - v1: `{ usage, variants, ai, _generated }`\n * - v2: `{ guidance, examples, composition, _provenance }`\n *\n * @example v1\n * ```tsx\n * import { defineFragment } from '@usefragments/core';\n * import { Button } from './Button';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * },\n * usage: {\n * when: ['User needs to trigger an action'],\n * whenNot: ['Navigation without side effects'],\n * },\n * props: {\n * variant: {\n * type: 'enum',\n * values: ['primary', 'secondary'],\n * default: 'primary',\n * description: 'Visual style',\n * },\n * },\n * variants: [\n * {\n * name: 'Default',\n * description: 'Default button',\n * render: () => <Button>Click me</Button>,\n * },\n * ],\n * });\n * ```\n *\n * @example v2\n * ```tsx\n * import { defineFragment } from '@usefragments/core';\n * import { Card } from './Card';\n *\n * export default defineFragment({\n * component: Card,\n * meta: { name: 'Card', description: 'Content container', category: 'layout' },\n * guidance: {\n * when: ['Grouping related content'],\n * whenNot: ['Full-page layouts'],\n * },\n * props: { ... },\n * examples: [{ name: 'Default', description: 'Basic card', render: () => <Card>...</Card> }],\n * composition: { pattern: 'compound', subComponents: ['Header', 'Body', 'Footer'] },\n * });\n * ```\n */\nexport function defineFragment<TProps>(\n definition: GovernedFragmentDefinition<TProps>\n): ResolvedGovernedFragmentDefinition<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinition<TProps>\n): FragmentDefinition<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinitionV2<TProps>\n): FragmentDefinitionV2<TProps>;\nexport function defineFragment<TProps>(\n definition:\n | FragmentDefinition<TProps>\n | FragmentDefinitionV2<TProps>\n | GovernedFragmentDefinition<TProps>\n):\n | FragmentDefinition<TProps>\n | FragmentDefinitionV2<TProps>\n | ResolvedGovernedFragmentDefinition<TProps> {\n // Validate at runtime in development\n if (process.env.NODE_ENV !== \"production\") {\n const governed = isGovernedDefinition(definition);\n const v2 = isV2Definition(definition);\n const schema = governed\n ? governedFragmentDefinitionSchema\n : v2\n ? fragmentDefinitionV2Schema\n : fragmentDefinitionSchema;\n const result = schema.safeParse(definition);\n if (!result.success) {\n const name = definition.meta?.name || \"unknown\";\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid fragment definition for \"${name}\":\\n${errors}`);\n }\n }\n\n if (isGovernedDefinition(definition)) {\n const governance = resolveComponentGovernance(definition);\n return {\n ...definition,\n governance,\n };\n }\n\n return definition;\n}\n\n/**\n * Compile a fragment definition to JSON-serializable format.\n * Used for generating fragments.json for AI consumption.\n *\n * Accepts both v1 and v2 shapes. V2 is normalized to v1 internally.\n */\nexport function compileFragment(\n definition: FragmentDefinition | FragmentDefinitionV2 | GovernedFragmentDefinition,\n filePath: string\n): CompiledFragment {\n // Normalize v2 → v1 if needed\n const v1 = isGovernedDefinition(definition)\n ? {\n component: definition.component,\n meta: definition.meta,\n usage: definition.guidance,\n props: definition.props ?? {},\n relations: definition.relations,\n variants: definition.examples ?? [],\n contract: definition.contract,\n _generated: definition._provenance\n ? {\n source:\n definition._provenance.source === \"scan\" ? \"ai\" : definition._provenance.source,\n sourceFile: definition._provenance.sourceFile,\n confidence: definition._provenance.confidence,\n timestamp: definition._provenance.timestamp,\n }\n : undefined,\n }\n : isV2Definition(definition)\n ? normalizeToV1(definition)\n : definition;\n\n return {\n filePath,\n meta: v1.meta,\n ...(isGovernedDefinition(definition) && { guidance: definition.guidance }),\n usage: v1.usage,\n props: v1.props,\n ...(isGovernedDefinition(definition) && {\n governance: resolveComponentGovernance(definition),\n }),\n relations: v1.relations,\n variants: v1.variants.map((v) => ({\n name: v.name,\n description: v.description,\n code: v.code,\n figma: v.figma,\n })),\n contract: v1.contract,\n ai: v1.ai,\n _generated: v1._generated,\n };\n}\n\n/**\n * Define a composition block.\n *\n * Blocks are pure data describing how design system components\n * wire together for common use cases.\n */\nexport function defineBlock(definition: BlockDefinition): BlockDefinition {\n if (process.env.NODE_ENV !== \"production\") {\n const result = blockDefinitionSchema.safeParse(definition);\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid block definition for \"${definition.name || \"unknown\"}\":\\n${errors}`);\n }\n }\n\n return definition;\n}\n\n/**\n * @deprecated Use defineBlock instead\n */\nexport const defineRecipe = defineBlock;\n\n/**\n * Compile a block definition to JSON-serializable format.\n */\nexport function compileBlock(definition: BlockDefinition, filePath: string): CompiledBlock {\n return {\n filePath,\n name: definition.name,\n description: definition.description,\n category: definition.category,\n components: definition.components,\n code: definition.code,\n tags: definition.tags,\n };\n}\n\n/**\n * @deprecated Use compileBlock instead\n */\nexport const compileRecipe = compileBlock;\n\n/**\n * Type helper for extracting props type from a component\n */\nexport type InferProps<T> = T extends FragmentComponent<infer P> ? P : never;\n","/**\n * Runtime adapter for converting Storybook CSF modules to Fragment definitions.\n *\n * This operates on IMPORTED modules at runtime, not source code parsing.\n * By leveraging Vite's module system, we get 100% accurate render functions\n * without any regex or AST parsing complexity.\n *\n * Supports Storybook 8.x with both CSF2 (Template.bind) and CSF3 (object stories).\n */\n\nimport { createElement, type ComponentType, type ReactNode } from \"react\";\nimport { toId, storyNameFromExport, isExportStory } from \"./storybook-csf.js\";\nimport type {\n FragmentDefinition,\n FragmentMeta,\n FragmentUsage,\n PropDefinition,\n FragmentVariant,\n ControlType,\n VariantLoader,\n PlayFunction,\n PlayFunctionContext,\n VariantRenderOptions,\n} from \"./types.js\";\n\n// Re-export @storybook/csf utilities for use in other modules\nexport { toId, storyNameFromExport, isExportStory };\n\n/**\n * Storybook decorator function signature\n */\nexport type Decorator = (\n Story: () => ReactNode,\n context: StoryContext\n) => ReactNode;\n\n/**\n * Storybook loader function signature\n */\nexport type Loader = (context: StoryContext) => Promise<Record<string, unknown>>;\n\n/**\n * Storybook play function signature (internal, extends StoryContext)\n */\ntype StorybookPlayFunction = (context: StorybookPlayFunctionContext) => Promise<void>;\n\n/**\n * Context passed to Storybook play functions (extends StoryContext for compatibility)\n */\ninterface StorybookPlayFunctionContext extends StoryContext {\n canvasElement: HTMLElement;\n step: (name: string, fn: () => Promise<void>) => Promise<void>;\n}\n\n/**\n * Context passed to decorators and render functions\n */\nexport interface StoryContext {\n args: Record<string, unknown>;\n argTypes: Record<string, StoryArgType>;\n globals: Record<string, unknown>;\n parameters: Record<string, unknown>;\n id: string;\n kind: string;\n name: string;\n story: string;\n viewMode: \"story\" | \"docs\";\n loaded: Record<string, unknown>;\n abortSignal: AbortSignal;\n componentId: string;\n title: string;\n}\n\n/**\n * Storybook Meta (default export)\n */\nexport interface StoryMeta {\n title?: string;\n component?: ComponentType<unknown>;\n subcomponents?: Record<string, ComponentType<unknown>>;\n tags?: string[];\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n component?: string;\n };\n };\n };\n argTypes?: Record<string, StoryArgType>;\n args?: Record<string, unknown>;\n decorators?: Decorator[];\n loaders?: Loader[];\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n // Story filtering\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\n/**\n * Storybook argType definition\n */\nexport interface StoryArgType {\n control?:\n | string\n | false\n | { type: string; min?: number; max?: number; step?: number; presetColors?: string[] };\n options?: string[];\n description?: string;\n table?: {\n defaultValue?: { summary: string };\n type?: { summary: string };\n category?: string;\n subcategory?: string;\n disable?: boolean;\n };\n type?: { name: string; required?: boolean };\n name?: string;\n defaultValue?: unknown;\n if?: { arg?: string; exists?: boolean };\n mapping?: Record<string, unknown>;\n action?: string;\n}\n\n/**\n * Storybook Story export (CSF3)\n */\nexport interface Story {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n story?: string;\n };\n };\n };\n name?: string;\n storyName?: string; // Legacy CSF2\n tags?: string[];\n}\n\n/**\n * CSF2 story function (from Template.bind({})) with args attached\n */\nexport type CSF2Story = ((args: Record<string, unknown>) => ReactNode) & {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown>;\n storyName?: string;\n};\n\n/**\n * A complete Storybook module with default meta and named story exports\n */\nexport interface StoryModule {\n default: StoryMeta;\n [exportName: string]: Story | CSF2Story | StoryMeta | unknown;\n}\n\n/**\n * Global configuration from preview.tsx\n */\nexport interface PreviewConfig {\n decorators?: Decorator[];\n parameters?: Record<string, unknown>;\n globalTypes?: Record<string, unknown>;\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n loaders?: Loader[];\n}\n\n// Store for global preview config (set by previewLoader)\nlet globalPreviewConfig: PreviewConfig = {};\n\n/**\n * Set the global preview configuration loaded from .storybook/preview.tsx\n */\nexport function setPreviewConfig(config: PreviewConfig): void {\n globalPreviewConfig = config;\n}\n\n/**\n * Get the current global preview configuration\n */\nexport function getPreviewConfig(): PreviewConfig {\n return globalPreviewConfig;\n}\n\n/**\n * Convert a Storybook module to a Fragment definition at runtime.\n *\n * @param storyModule - The imported Storybook module\n * @param filePath - File path for metadata extraction\n * @returns A complete FragmentDefinition ready for the viewer\n */\nexport function storyModuleToFragment(\n storyModule: StoryModule,\n filePath: string\n): FragmentDefinition | null {\n const meta = storyModule.default;\n const component = meta.component;\n\n // Stories without a component (e.g., documentation pages, icon galleries) are skipped\n if (!component) {\n return null;\n }\n\n const componentName = extractComponentName(meta, filePath);\n const category = extractCategory(meta.title);\n const props = convertArgTypes(meta.argTypes ?? {}, globalPreviewConfig.argTypes);\n const variants = extractVariants(storyModule, component, meta);\n\n // Extract Figma URL from parameters.design.url (storybook-addon-designs) or parameters.figma\n const figmaUrl = extractFigmaUrl(meta.parameters);\n\n const fragmentMeta: FragmentMeta = {\n name: componentName,\n description:\n meta.parameters?.docs?.description?.component ??\n `${componentName} component`,\n category,\n tags: meta.tags?.filter((t) => t !== \"autodocs\"),\n status: \"stable\",\n figma: figmaUrl,\n };\n\n const usage: FragmentUsage = {\n when: [`Use ${componentName} for its intended purpose`],\n whenNot: [\"When a more specific component is available\"],\n };\n\n return {\n component,\n meta: fragmentMeta,\n usage,\n props,\n variants,\n };\n}\n\n/**\n * Extract component name from meta or file path\n */\nfunction extractComponentName(meta: StoryMeta, filePath: string): string {\n // Try title (last fragment of path like \"Components/Forms/Button\" -> \"Button\")\n if (meta.title) {\n const parts = meta.title.split(\"/\");\n return parts[parts.length - 1];\n }\n\n // Try component displayName\n if (meta.component?.displayName) {\n return meta.component.displayName;\n }\n\n // Try component name\n if (meta.component?.name && meta.component.name !== \"Component\") {\n return meta.component.name;\n }\n\n // Fallback: extract from file path\n const match = filePath.match(/([^/\\\\]+)\\.stories\\.(tsx?|jsx?)$/);\n return match?.[1] ?? \"Unknown\";\n}\n\n/**\n * Extract category from Storybook title path\n */\nfunction extractCategory(title?: string): string {\n if (!title) return \"general\";\n\n const parts = title.split(\"/\");\n // \"Components/Forms/Button\" -> \"forms\" (need at least 3 parts for a subcategory)\n if (parts.length >= 3) {\n return parts[parts.length - 2].toLowerCase();\n }\n // \"Components/Button\" -> \"general\" (no subcategory specified)\n return \"general\";\n}\n\n/**\n * Extract Figma URL from Storybook parameters\n * Supports storybook-addon-designs format and custom figma parameter\n */\nfunction extractFigmaUrl(parameters?: Record<string, unknown>): string | undefined {\n if (!parameters) return undefined;\n\n // Try storybook-addon-designs format: parameters.design.url\n const design = parameters.design as { url?: string; type?: string } | undefined;\n if (design?.url && typeof design.url === \"string\") {\n return design.url;\n }\n\n // Try custom figma parameter: parameters.figma\n if (typeof parameters.figma === \"string\") {\n return parameters.figma;\n }\n\n return undefined;\n}\n\n/**\n * Convert Storybook argTypes to Fragment props\n * Merges global argTypes from preview config with meta argTypes\n */\nfunction convertArgTypes(\n argTypes: Record<string, StoryArgType>,\n globalArgTypes?: Record<string, StoryArgType>\n): Record<string, PropDefinition> {\n const props: Record<string, PropDefinition> = {};\n\n // Merge global and meta argTypes (meta takes precedence)\n const mergedArgTypes = { ...globalArgTypes, ...argTypes };\n\n for (const [name, argType] of Object.entries(mergedArgTypes)) {\n // Skip disabled argTypes\n if (argType.table?.disable) continue;\n // Skip action-only argTypes (no control)\n if (argType.control === false && argType.action) continue;\n\n // Extract control type and options\n const { controlType, controlOptions } = extractControlInfo(argType);\n\n props[name] = {\n type: inferPropType(argType),\n description: argType.description ?? `${name} prop`,\n ...(argType.options && { values: argType.options }),\n ...(argType.table?.defaultValue && {\n default: argType.table.defaultValue.summary,\n }),\n ...(argType.defaultValue !== undefined && {\n default: argType.defaultValue,\n }),\n ...(argType.type?.required && { required: true }),\n ...(controlType && { controlType }),\n ...(controlOptions && Object.keys(controlOptions).length > 0 && { controlOptions }),\n };\n }\n\n return props;\n}\n\n/**\n * Extract control type and options from a Storybook argType\n */\nfunction extractControlInfo(argType: StoryArgType): {\n controlType?: ControlType;\n controlOptions?: PropDefinition[\"controlOptions\"];\n} {\n // Handle no control or explicitly disabled control\n if (argType.control === undefined || argType.control === false) {\n return {};\n }\n\n const control = typeof argType.control === \"string\"\n ? { type: argType.control }\n : argType.control;\n\n // Map control type string to ControlType\n const validControlTypes: ControlType[] = [\n \"text\", \"number\", \"range\", \"boolean\", \"select\", \"multi-select\",\n \"radio\", \"inline-radio\", \"check\", \"inline-check\", \"object\", \"file\", \"color\", \"date\"\n ];\n\n const controlType = validControlTypes.includes(control.type as ControlType)\n ? (control.type as ControlType)\n : undefined;\n\n // Extract control options for controls that need them\n const controlOptions: PropDefinition[\"controlOptions\"] = {};\n\n if (control.min !== undefined) controlOptions.min = control.min;\n if (control.max !== undefined) controlOptions.max = control.max;\n if (control.step !== undefined) controlOptions.step = control.step;\n if (control.presetColors) controlOptions.presetColors = control.presetColors;\n\n return {\n controlType,\n controlOptions: Object.keys(controlOptions).length > 0 ? controlOptions : undefined,\n };\n}\n\n/**\n * Infer prop type from Storybook control/type\n * Handles all Storybook 8.x control types\n */\nfunction inferPropType(argType: StoryArgType): PropDefinition[\"type\"] {\n // Action argType → function\n if (argType.action) return \"function\";\n\n // If has options, it's an enum\n if (argType.options?.length) return \"enum\";\n\n // Check explicit type\n if (argType.type?.name) {\n const typeMap: Record<string, PropDefinition[\"type\"]> = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n function: \"function\",\n };\n const mapped = typeMap[argType.type.name];\n if (mapped) return mapped;\n }\n\n // Check control type\n const control =\n typeof argType.control === \"string\"\n ? argType.control\n : argType.control\n ? argType.control.type\n : undefined;\n\n if (control) {\n const controlMap: Record<string, PropDefinition[\"type\"]> = {\n // Text controls\n text: \"string\",\n\n // Number controls\n number: \"number\",\n range: \"number\",\n\n // Boolean controls\n boolean: \"boolean\",\n check: \"boolean\",\n \"inline-check\": \"boolean\",\n\n // Enum/selection controls\n select: \"enum\",\n \"multi-select\": \"enum\",\n radio: \"enum\",\n \"inline-radio\": \"enum\",\n\n // Object controls\n object: \"object\",\n file: \"object\",\n\n // Special string controls\n color: \"string\",\n date: \"string\",\n };\n const mapped = controlMap[control];\n if (mapped) return mapped;\n }\n\n return \"string\";\n}\n\n/**\n * Check if a value looks like a Storybook story\n * Handles both CSF 3 (objects) and CSF 2 (functions from Template.bind({}))\n */\nfunction isStory(value: unknown): value is Story | CSF2Story {\n // CSF 3: Story is an object with args/render/play\n if (typeof value === \"object\" && value !== null) {\n const obj = value as Record<string, unknown>;\n if (\"args\" in obj || \"render\" in obj || \"play\" in obj) return true;\n }\n\n // CSF 2: Story is a function (from Template.bind({})) with args attached\n if (typeof value === \"function\") {\n const fn = value as ((...args: unknown[]) => unknown) & { args?: unknown };\n if (\"args\" in fn) return true;\n }\n\n return false;\n}\n\n/**\n * Extract variants from story exports using @storybook/csf utilities\n */\nfunction extractVariants(\n storyModule: StoryModule,\n component: ComponentType<unknown>,\n meta: StoryMeta\n): FragmentVariant[] {\n const variants: FragmentVariant[] = [];\n\n for (const [exportName, exportValue] of Object.entries(storyModule)) {\n // Skip default export\n if (exportName === \"default\") continue;\n\n // Use isExportStory to filter based on includeStories/excludeStories\n if (!isExportStory(exportName, meta)) continue;\n\n // Check if it's a story\n if (!isStory(exportValue)) continue;\n\n const story = exportValue as Story | CSF2Story;\n\n // Get story name using storyNameFromExport\n const storyName =\n (typeof story === \"object\" && story.name) ||\n (typeof story === \"object\" && story.storyName) ||\n (typeof story === \"function\" && story.storyName) ||\n storyNameFromExport(exportName);\n\n // Generate story ID matching Storybook format\n const storyId = toId(meta.title || \"Unknown\", exportName);\n\n // Extract description based on story format\n let description = `${storyName} variant`;\n if (typeof story === \"object\" && story.parameters?.docs?.description?.story) {\n description = story.parameters.docs.description.story;\n }\n\n // Check for play function and capture it\n const storyPlayFn = typeof story === \"object\" ? story.play : story.play;\n const hasPlayFunction = !!storyPlayFn;\n\n // Create wrapped play function that adapts Storybook context to our PlayFunctionContext\n const wrappedPlay: PlayFunction | undefined = storyPlayFn\n ? async (context: PlayFunctionContext): Promise<void> => {\n // Build full Storybook context for compatibility\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n const fullContext = buildStoryContext(meta, story, args, storyId, storyName);\n\n // Merge our context with Storybook context\n const playContext = {\n ...fullContext,\n canvasElement: context.canvasElement,\n args: context.args,\n step: context.step,\n };\n\n await storyPlayFn(playContext as unknown as StorybookPlayFunctionContext);\n }\n : undefined;\n\n // Get story tags\n const storyTags = typeof story === \"object\" ? story.tags : undefined;\n\n // Collect loaders from global, meta, and story (in order)\n const loaders = collectLoaders(meta, story);\n\n // Compute the merged args for this variant (for code generation)\n const variantArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n\n // Only include args if there are any defined\n const hasArgs = Object.keys(variantArgs).length > 0;\n\n variants.push({\n name: storyName,\n description,\n render: createRenderFunction(story, component, meta, storyId, storyName),\n // Store Storybook-specific metadata\n ...(hasPlayFunction && { hasPlayFunction: true }),\n ...(wrappedPlay && { play: wrappedPlay }),\n ...(storyId && { storyId }),\n ...(storyTags && { tags: storyTags }),\n ...(loaders.length > 0 && { loaders }),\n ...(hasArgs && { args: variantArgs }),\n });\n }\n\n return variants;\n}\n\n/**\n * Collect loaders from global, meta, and story levels\n * Returns wrapped loader functions that execute with context\n */\nfunction collectLoaders(\n meta: StoryMeta,\n story: Story | CSF2Story\n): VariantLoader[] {\n const allLoaders: Loader[] = [\n ...(globalPreviewConfig.loaders ?? []),\n ...(meta.loaders ?? []),\n ...(typeof story === \"function\" ? story.loaders ?? [] : story.loaders ?? []),\n ];\n\n if (allLoaders.length === 0) {\n return [];\n }\n\n // Wrap each loader to execute without requiring context at call time\n // The actual context will be built when the loader is executed\n return allLoaders.map((loader) => {\n return async (): Promise<Record<string, unknown>> => {\n // Create a minimal context for loader execution\n const minimalContext: StoryContext = {\n args: {},\n argTypes: {},\n globals: {},\n parameters: {},\n id: \"\",\n kind: meta.title || \"Unknown\",\n name: \"\",\n story: \"\",\n viewMode: \"story\",\n loaded: {},\n abortSignal: new AbortController().signal,\n componentId: \"\",\n title: meta.title || \"Unknown\",\n };\n return loader(minimalContext);\n };\n });\n}\n\n/**\n * Build a StoryContext for decorators and render functions\n */\nfunction buildStoryContext(\n meta: StoryMeta,\n story: Story | CSF2Story,\n args: Record<string, unknown>,\n storyId: string,\n storyName: string,\n loadedData?: Record<string, unknown>\n): StoryContext {\n const mergedArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"object\" ? story.args : story.args),\n ...args,\n };\n\n const mergedArgTypes = {\n ...globalPreviewConfig.argTypes,\n ...meta.argTypes,\n ...(typeof story === \"object\" ? story.argTypes : story.argTypes),\n };\n\n const mergedParameters = {\n ...globalPreviewConfig.parameters,\n ...meta.parameters,\n ...(typeof story === \"object\" ? story.parameters : story.parameters),\n };\n\n return {\n args: mergedArgs,\n argTypes: mergedArgTypes ?? {},\n globals: {},\n parameters: mergedParameters ?? {},\n id: storyId,\n kind: meta.title || \"Unknown\",\n name: storyName,\n story: storyName,\n viewMode: \"story\",\n loaded: loadedData ?? {},\n abortSignal: new AbortController().signal,\n componentId: toId(meta.title || \"Unknown\", \"\"),\n title: meta.title || \"Unknown\",\n };\n}\n\n/**\n * Create a render function for a story\n * Handles both CSF 3 (objects) and CSF 2 (functions)\n * Applies decorators in correct order: story → meta → global (innermost first)\n * Accepts optional args overrides and loaded data from loaders\n */\nfunction createRenderFunction(\n story: Story | CSF2Story,\n component: ComponentType<unknown>,\n meta: StoryMeta,\n storyId: string,\n storyName: string\n): (options?: VariantRenderOptions) => ReactNode {\n return (options?: VariantRenderOptions) => {\n // Merge args: global → meta → story → runtime overrides\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n ...options?.args, // Runtime overrides from viewer props panel\n };\n\n const loadedData = options?.loadedData;\n\n // Build the story context with loaded data\n const context = buildStoryContext(meta, story, args, storyId, storyName, loadedData);\n\n // Create the base render function\n let renderFn: () => ReactNode;\n\n if (typeof story === \"function\") {\n // CSF 2: Story is a function (from Template.bind({}))\n renderFn = () => story(args);\n } else if (story.render) {\n // CSF 3: Story has custom render function\n // Support both render(args) and render(args, context) signatures\n renderFn = () =>\n story.render!.length >= 2\n ? story.render!(args, context)\n : story.render!(args);\n } else if (meta.render) {\n // CSF 3: Meta has default render function\n renderFn = () =>\n meta.render!.length >= 2\n ? meta.render!(args, context)\n : meta.render!(args);\n } else {\n // Default: render component with args\n renderFn = () => createElement(component, args);\n }\n\n // Collect decorators in Storybook order\n // story → meta → global, then reverse to apply innermost first\n const allDecorators = [\n ...(globalPreviewConfig.decorators ?? []),\n ...(meta.decorators ?? []),\n ...(typeof story === \"function\" ? story.decorators ?? [] : story.decorators ?? []),\n ].reverse();\n\n // Apply decorators if any\n if (allDecorators.length > 0) {\n return applyDecorators(renderFn, allDecorators, context);\n }\n\n return renderFn();\n };\n}\n\n/**\n * Apply decorators in the correct order\n * Decorators wrap from innermost to outermost\n */\nfunction applyDecorators(\n renderFn: () => ReactNode,\n decorators: Decorator[],\n context: StoryContext\n): ReactNode {\n // Start with the base render function\n let storyFn: () => ReactNode = renderFn;\n\n // Each decorator wraps the previous one\n for (const decorator of decorators) {\n const wrappedFn = storyFn;\n storyFn = () => decorator(wrappedFn, context);\n }\n\n return storyFn();\n}\n\n/**\n * Convert PascalCase to Title Case\n * @deprecated Use storyNameFromExport from @storybook/csf instead\n */\nfunction pascalToTitle(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").trim();\n}\n","import {\n toId as storybookToId,\n storyNameFromExport as storybookStoryNameFromExport,\n isExportStory as storybookIsExportStory,\n} from \"@storybook/csf\";\n\nexport const toId: typeof storybookToId = (...args) => storybookToId(...args);\nexport const storyNameFromExport: typeof storybookStoryNameFromExport = (...args) =>\n storybookStoryNameFromExport(...args);\nexport const isExportStory: typeof storybookIsExportStory = (...args) =>\n storybookIsExportStory(...args);\n","/**\n * Smart filtering for Storybook adapter.\n *\n * Two layers:\n * 1. Per-file heuristics — checkStoryExclusion() checks title, tags, component name, etc.\n * 2. Cross-file sub-component detection — detectSubComponentPaths() uses directory structure.\n *\n * All functions are pure (no I/O, no side effects) for easy testing.\n */\n\nimport type { StorybookFilterConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ExclusionReason =\n | 'deprecated' // title contains \"Deprecated\"\n | 'test-story' // title ends /tests? OR file matches *.test.stories.*\n | 'svg-icon' // component name starts with Svg[A-Z]\n | 'tag-excluded' // meta.tags includes hidden/internal/no-fragment\n | 'empty-variants' // zero renderable story exports\n | 'sub-component' // directory-based: file in another component's folder\n | 'config-excluded'; // user explicit exclude pattern\n\nexport interface ExclusionResult {\n excluded: boolean;\n reason?: ExclusionReason;\n detail?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Per-file heuristics\n// ---------------------------------------------------------------------------\n\nconst EXCLUDED_TAGS = new Set(['hidden', 'internal', 'no-fragment']);\n\nconst SVG_ICON_RE = /^Svg[A-Z]/;\nconst TEST_TITLE_RE = /\\/tests?$/i;\nconst TEST_FILE_RE = /\\.test\\.stories\\./;\nconst DEPRECATED_TITLE_RE = /\\bDeprecated\\b/i;\n\nexport interface CheckStoryExclusionOpts {\n storybookTitle?: string;\n componentName: string;\n componentDisplayName?: string;\n componentFunctionName?: string;\n tags?: string[];\n variantCount: number;\n filePath: string;\n config: StorybookFilterConfig;\n}\n\n/**\n * Per-file exclusion check. Returns `{ excluded: true, reason, detail }` when\n * the fragment should be filtered out, or `{ excluded: false }` when it should\n * be kept.\n *\n * Config `include` trumps everything — if a name matches `include`, it is\n * never excluded by heuristics.\n */\nexport function checkStoryExclusion(opts: CheckStoryExclusionOpts): ExclusionResult {\n const { config } = opts;\n\n // Force-included names bypass all heuristic filters\n if (isForceIncluded(opts.componentName, config)) {\n return { excluded: false };\n }\n\n // Config explicit exclude\n if (isConfigExcluded(opts.componentName, config)) {\n return {\n excluded: true,\n reason: 'config-excluded',\n detail: `'${opts.componentName}' matches storybook.exclude pattern`,\n };\n }\n\n // Deprecated\n if (config.excludeDeprecated !== false && opts.storybookTitle && DEPRECATED_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'deprecated',\n detail: `Title \"${opts.storybookTitle}\" contains \"Deprecated\"`,\n };\n }\n\n // Test stories\n if (config.excludeTests !== false) {\n if (opts.storybookTitle && TEST_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `Title \"${opts.storybookTitle}\" ends with /test(s)`,\n };\n }\n if (TEST_FILE_RE.test(opts.filePath)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `File path matches *.test.stories.*`,\n };\n }\n }\n\n // SVG icons\n if (config.excludeSvgIcons !== false) {\n const names = [opts.componentName, opts.componentDisplayName, opts.componentFunctionName].filter(Boolean) as string[];\n for (const name of names) {\n if (SVG_ICON_RE.test(name)) {\n return {\n excluded: true,\n reason: 'svg-icon',\n detail: `Component name \"${name}\" matches Svg[A-Z] pattern`,\n };\n }\n }\n }\n\n // Excluded tags\n if (opts.tags?.length) {\n const hit = opts.tags.find(t => EXCLUDED_TAGS.has(t));\n if (hit) {\n return {\n excluded: true,\n reason: 'tag-excluded',\n detail: `Tag \"${hit}\" is in the exclusion set`,\n };\n }\n }\n\n // Empty variants\n if (opts.variantCount === 0) {\n return {\n excluded: true,\n reason: 'empty-variants',\n detail: 'Zero renderable story exports',\n };\n }\n\n return { excluded: false };\n}\n\n// ---------------------------------------------------------------------------\n// Cross-file sub-component detection\n// ---------------------------------------------------------------------------\n\n/**\n * Given all story file relative paths, detect which ones are sub-components\n * based on directory structure.\n *\n * Heuristic: within a directory, if one story file's base name matches the\n * directory name, it is the \"primary\" component. All other story files in\n * the same directory are considered sub-components.\n *\n * Example:\n * src/components/Form/Form.stories.tsx → primary (\"Form\")\n * src/components/Form/Checkbox.stories.tsx → sub-component of \"Form\"\n * src/components/Form/RadioGroup.stories.tsx → sub-component of \"Form\"\n *\n * Returns a Map from relative path → parent component name.\n * Paths NOT in the map are standalone components.\n */\nexport function detectSubComponentPaths(\n storyFiles: Array<{ relativePath: string }>\n): Map<string, string> {\n // Group story files by their parent directory\n const byDir = new Map<string, Array<{ relativePath: string; baseName: string }>>();\n\n for (const file of storyFiles) {\n const parts = file.relativePath.split('/');\n if (parts.length < 2) continue; // skip root-level files\n\n const fileName = parts[parts.length - 1];\n // Extract base name: \"Form.stories.tsx\" → \"Form\"\n const baseMatch = fileName.match(/^([^.]+)\\.stories\\./);\n if (!baseMatch) continue;\n\n const dir = parts.slice(0, -1).join('/');\n const baseName = baseMatch[1];\n\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push({ relativePath: file.relativePath, baseName });\n }\n\n const subComponentMap = new Map<string, string>();\n\n for (const [dir, files] of byDir) {\n if (files.length <= 1) continue; // single file in dir → always standalone\n\n // Directory name is the last segment: \"src/components/Form\" → \"Form\"\n const dirName = dir.split('/').pop()!;\n\n // Find the primary: story whose base name matches the directory name\n const primary = files.find(f => f.baseName === dirName);\n if (!primary) continue; // no clear primary → keep all\n\n // All others in this dir are sub-components\n for (const file of files) {\n if (file.relativePath === primary.relativePath) continue;\n subComponentMap.set(file.relativePath, primary.baseName);\n }\n }\n\n return subComponentMap;\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a component name matches the `storybook.include` patterns.\n * Include is a force-include that bypasses all heuristic filters.\n */\nexport function isForceIncluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.include?.length) return false;\n return config.include.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Check if a component name matches the `storybook.exclude` patterns.\n */\nexport function isConfigExcluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.exclude?.length) return false;\n return config.exclude.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Simple pattern matching: exact match or glob-style prefix/suffix wildcards.\n * \"Button\" → exact match\n * \"Svg*\" → prefix match\n * \"*Icon\" → suffix match\n * \"*Badge*\" → contains match\n */\nfunction matchesPattern(name: string, pattern: string): boolean {\n if (!pattern.includes('*')) {\n return name === pattern;\n }\n\n const parts = pattern.split('*');\n if (parts.length === 2) {\n const [prefix, suffix] = parts;\n if (prefix && suffix) return name.startsWith(prefix) && name.endsWith(suffix);\n if (prefix) return name.startsWith(prefix);\n if (suffix) return name.endsWith(suffix);\n return true; // pattern is just \"*\"\n }\n\n // Multi-wildcard: convert to regex\n const escaped = parts.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('.*');\n return new RegExp(`^${escaped}$`).test(name);\n}\n","/**\n * Figma property mapping DSL\n *\n * Provides helpers for mapping Figma component properties to code props.\n * Inspired by Figma Code Connect's API.\n *\n * @example\n * ```tsx\n * import { defineFragment, figma } from '@usefragments/cli/core';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * figma: 'https://figma.com/file/abc/Design?node-id=1-2',\n * figmaProps: {\n * children: figma.string('Label'),\n * disabled: figma.boolean('Disabled'),\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * }),\n * },\n * },\n * // ...\n * });\n * ```\n */\n\nimport type {\n FigmaStringMapping,\n FigmaBooleanMapping,\n FigmaEnumMapping,\n FigmaInstanceMapping,\n FigmaChildrenMapping,\n FigmaTextContentMapping,\n} from './types.js';\n\n/**\n * Map a Figma text property to a string prop.\n *\n * @param figmaProperty - The name of the text property in Figma\n * @returns A string mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * label: figma.string('Button Text'),\n * placeholder: figma.string('Placeholder'),\n * }\n * ```\n */\nfunction string(figmaProperty: string): FigmaStringMapping {\n return {\n __type: 'figma-string',\n figmaProperty,\n };\n}\n\n/**\n * Map a Figma boolean property to a boolean prop.\n * Optionally map true/false to different values.\n *\n * @param figmaProperty - The name of the boolean property in Figma\n * @param valueMapping - Optional mapping of true/false to other values\n * @returns A boolean mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * disabled: figma.boolean('Disabled'),\n * // Map boolean to string values\n * size: figma.boolean('Large', { true: 'lg', false: 'md' }),\n * }\n * ```\n */\nfunction boolean(\n figmaProperty: string,\n valueMapping?: { true: unknown; false: unknown }\n): FigmaBooleanMapping {\n return {\n __type: 'figma-boolean',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Map a Figma variant property to an enum prop.\n *\n * @param figmaProperty - The name of the variant property in Figma\n * @param valueMapping - Mapping of Figma values to code values\n * @returns An enum mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * 'Outline': 'outline',\n * }),\n * size: figma.enum('Size', {\n * 'Small': 'sm',\n * 'Medium': 'md',\n * 'Large': 'lg',\n * }),\n * }\n * ```\n */\nfunction enumValue<T extends Record<string, unknown>>(\n figmaProperty: string,\n valueMapping: T\n): FigmaEnumMapping {\n return {\n __type: 'figma-enum',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Reference a nested Figma component instance.\n * Use this when a prop accepts a component that's represented\n * as an instance swap in Figma.\n *\n * @param figmaProperty - The name of the instance property in Figma\n * @returns An instance mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * icon: figma.instance('Icon'),\n * avatar: figma.instance('Avatar'),\n * }\n * ```\n */\nfunction instance(figmaProperty: string): FigmaInstanceMapping {\n return {\n __type: 'figma-instance',\n figmaProperty,\n };\n}\n\n/**\n * Render children from specific Figma layers.\n * Use this when children are represented as named layers in Figma.\n *\n * @param layers - Array of layer names to include as children\n * @returns A children mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * children: figma.children(['Title', 'Description', 'Actions']),\n * }\n * ```\n */\nfunction children(layers: string[]): FigmaChildrenMapping {\n return {\n __type: 'figma-children',\n layers,\n };\n}\n\n/**\n * Extract text content from a Figma text layer.\n * Use this when a prop should be the actual text from a layer.\n *\n * @param layer - The name of the text layer in Figma\n * @returns A text content mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * title: figma.textContent('Header Text'),\n * description: figma.textContent('Body Text'),\n * }\n * ```\n */\nfunction textContent(layer: string): FigmaTextContentMapping {\n return {\n __type: 'figma-text-content',\n layer,\n };\n}\n\n/**\n * Figma property mapping helpers.\n *\n * Use these to define how Figma properties map to your component props.\n * The mappings are used for:\n * - Generating accurate code snippets in Figma Dev Mode\n * - AI agents understanding the design-to-code relationship\n * - Automated design verification\n */\nexport const figma = {\n string,\n boolean,\n enum: enumValue,\n instance,\n children,\n textContent,\n} as const;\n\n/**\n * Helper type to check if a value is a Figma prop mapping\n */\nexport function isFigmaPropMapping(\n value: unknown\n): value is FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping {\n if (typeof value !== 'object' || value === null || !('__type' in value)) {\n return false;\n }\n const typeValue = (value as Record<string, unknown>).__type;\n return typeof typeValue === 'string' && typeValue.startsWith('figma-');\n}\n\n/**\n * Resolve a Figma prop mapping to an actual value given Figma property values.\n *\n * @param mapping - The Figma prop mapping\n * @param figmaValues - Object containing Figma property values\n * @returns The resolved value for the code prop\n */\nexport function resolveFigmaMapping(\n mapping: FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping,\n figmaValues: Record<string, unknown>\n): unknown {\n switch (mapping.__type) {\n case 'figma-string':\n return figmaValues[mapping.figmaProperty] ?? '';\n\n case 'figma-boolean': {\n const boolValue = figmaValues[mapping.figmaProperty] as boolean;\n if (mapping.valueMapping) {\n return boolValue ? mapping.valueMapping.true : mapping.valueMapping.false;\n }\n return boolValue;\n }\n\n case 'figma-enum': {\n const enumKey = figmaValues[mapping.figmaProperty] as string;\n return mapping.valueMapping[enumKey] ?? enumKey;\n }\n\n case 'figma-instance':\n // Instance mappings return the instance reference\n return figmaValues[mapping.figmaProperty];\n\n case 'figma-children':\n // Children mappings return array of layer contents\n return mapping.layers.map((layer) => figmaValues[layer]);\n\n case 'figma-text-content':\n return figmaValues[mapping.layer] ?? '';\n\n default:\n return undefined;\n }\n}\n","import type {\n DTCGGroup,\n DTCGTokenFile,\n DTCGTokenType,\n ResolvedDTCGToken,\n} from \"../dtcg.js\";\nimport { hexToRgb } from \"./color.js\";\nimport type { ParsedToken, TokenParseOutput } from \"./types.js\";\n\nconst DTCG_META_KEYS = new Set([\n \"$type\",\n \"$value\",\n \"$description\",\n \"$deprecated\",\n \"$extensions\",\n \"$extends\",\n]);\n\nconst MAX_ALIAS_DEPTH = 10;\n\nexport function isDTCGFile(filePath: string): boolean {\n return (\n filePath.endsWith(\".tokens.json\") ||\n filePath.endsWith(\".tokens\") ||\n filePath.endsWith(\"design-tokens.json\") ||\n filePath.endsWith(\"tokens.json\")\n );\n}\n\nfunction mapDTCGTypeToCategory(type: DTCGTokenType, tokenPath: string): string {\n switch (type) {\n case \"color\":\n return \"colors\";\n case \"dimension\":\n if (/radius/i.test(tokenPath)) return \"radius\";\n return \"spacing\";\n case \"fontFamily\":\n case \"fontWeight\":\n return \"typography\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"duration\":\n case \"cubicBezier\":\n case \"transition\":\n return \"transitions\";\n case \"typography\":\n return \"typography\";\n case \"gradient\":\n return \"colors\";\n case \"strokeStyle\":\n return \"borders\";\n case \"number\":\n return \"other\";\n default:\n return \"other\";\n }\n}\n\nfunction colorValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (typeof obj.hex === \"string\") {\n if (obj.alpha !== undefined && typeof obj.alpha === \"number\" && obj.alpha < 1) {\n const rgb = hexToRgb(obj.hex);\n if (rgb) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${obj.alpha})`;\n }\n }\n return obj.hex;\n }\n if (Array.isArray(obj.components)) {\n const comps = obj.components as number[];\n if (comps.length >= 3) {\n const alpha = obj.alpha ?? (comps.length >= 4 ? comps[3] : 1);\n if (typeof alpha === \"number\" && alpha < 1) {\n return `rgba(${Math.round(comps[0] * 255)}, ${Math.round(comps[1] * 255)}, ${Math.round(comps[2] * 255)}, ${alpha})`;\n }\n if (comps.every((c) => c <= 1)) {\n return `rgb(${Math.round(comps[0] * 255)}, ${Math.round(comps[1] * 255)}, ${Math.round(comps[2] * 255)})`;\n }\n return `rgb(${comps[0]}, ${comps[1]}, ${comps[2]})`;\n }\n }\n }\n return String(value);\n}\n\nfunction dimensionValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (typeof obj.value === \"number\" && typeof obj.unit === \"string\") {\n return `${obj.value}${obj.unit}`;\n }\n }\n return String(value);\n}\n\nfunction shadowValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value.map((v) => shadowSingleToCSS(v)).join(\", \");\n }\n return shadowSingleToCSS(value);\n}\n\nfunction shadowSingleToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.inset) parts.push(\"inset\");\n parts.push(dimensionValueToCSS(obj.offsetX));\n parts.push(dimensionValueToCSS(obj.offsetY));\n parts.push(dimensionValueToCSS(obj.blur));\n if (obj.spread !== undefined) parts.push(dimensionValueToCSS(obj.spread));\n parts.push(colorValueToCSS(obj.color));\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction borderValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return `${dimensionValueToCSS(obj.width)} ${obj.style ?? \"solid\"} ${colorValueToCSS(obj.color)}`;\n }\n return String(value);\n}\n\nfunction typographyValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.fontWeight) parts.push(String(obj.fontWeight));\n if (obj.fontSize) parts.push(dimensionValueToCSS(obj.fontSize));\n if (obj.lineHeight) parts.push(`/ ${obj.lineHeight}`);\n if (obj.fontFamily) {\n const family = Array.isArray(obj.fontFamily)\n ? obj.fontFamily.join(\", \")\n : String(obj.fontFamily);\n parts.push(family);\n }\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction cubicBezierValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.length === 4) {\n return `cubic-bezier(${value.join(\", \")})`;\n }\n return String(value);\n}\n\nfunction transitionValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.duration) parts.push(String(obj.duration));\n if (obj.timingFunction) parts.push(cubicBezierValueToCSS(obj.timingFunction));\n if (obj.delay) parts.push(String(obj.delay));\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction gradientValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n const stops = value.map((stop) => {\n if (stop && typeof stop === \"object\") {\n const s = stop as Record<string, unknown>;\n const color = colorValueToCSS(s.color);\n const position = typeof s.position === \"number\" ? ` ${s.position * 100}%` : \"\";\n return `${color}${position}`;\n }\n return String(stop);\n });\n return `linear-gradient(${stops.join(\", \")})`;\n }\n return String(value);\n}\n\nfunction fontFamilyValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n\nfunction valueToCSS(type: DTCGTokenType, value: unknown): string {\n switch (type) {\n case \"color\":\n return colorValueToCSS(value);\n case \"dimension\":\n return dimensionValueToCSS(value);\n case \"shadow\":\n return shadowValueToCSS(value);\n case \"border\":\n return borderValueToCSS(value);\n case \"typography\":\n return typographyValueToCSS(value);\n case \"cubicBezier\":\n return cubicBezierValueToCSS(value);\n case \"transition\":\n return transitionValueToCSS(value);\n case \"gradient\":\n return gradientValueToCSS(value);\n case \"fontFamily\":\n return fontFamilyValueToCSS(value);\n case \"fontWeight\":\n case \"duration\":\n case \"number\":\n return String(value);\n case \"strokeStyle\":\n return typeof value === \"string\" ? value : String(value);\n default:\n return String(value);\n }\n}\n\nfunction isAlias(value: unknown): value is string {\n return typeof value === \"string\" && /^\\{.+\\}$/.test(value);\n}\n\nfunction resolveAliasPath(alias: string): string {\n return alias.slice(1, -1);\n}\n\nfunction resolveAlias(\n alias: string,\n root: DTCGTokenFile,\n visited: Set<string>,\n depth: number,\n): unknown {\n if (depth > MAX_ALIAS_DEPTH) {\n throw new Error(`Circular alias detected: ${alias} (max depth ${MAX_ALIAS_DEPTH} reached)`);\n }\n\n const path = resolveAliasPath(alias);\n\n if (visited.has(path)) {\n throw new Error(`Circular alias detected: ${[...visited, path].join(\" -> \")}`);\n }\n visited.add(path);\n\n const parts = path.split(\".\");\n let current: unknown = root;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[part];\n } else {\n throw new Error(`Alias reference \"${alias}\" could not be resolved: \"${part}\" not found in path \"${path}\"`);\n }\n }\n\n if (current && typeof current === \"object\" && \"$value\" in (current as Record<string, unknown>)) {\n const resolvedValue = (current as Record<string, unknown>).$value;\n if (isAlias(resolvedValue)) {\n return resolveAlias(resolvedValue, root, visited, depth + 1);\n }\n return resolvedValue;\n }\n\n if (isAlias(current)) {\n return resolveAlias(current, root, visited, depth + 1);\n }\n\n return current;\n}\n\nfunction resolveExtends(\n group: DTCGGroup,\n root: DTCGTokenFile,\n visited: Set<string>,\n): DTCGGroup {\n if (!group.$extends) return group;\n\n const extendsPath = group.$extends;\n if (visited.has(extendsPath)) {\n throw new Error(`Circular $extends detected: ${[...visited, extendsPath].join(\" -> \")}`);\n }\n visited.add(extendsPath);\n\n const parts = extendsPath.split(\".\");\n let parent: unknown = root;\n for (const part of parts) {\n if (parent && typeof parent === \"object\" && part in (parent as Record<string, unknown>)) {\n parent = (parent as Record<string, unknown>)[part];\n } else {\n throw new Error(`$extends reference \"${extendsPath}\" could not be resolved`);\n }\n }\n\n if (!parent || typeof parent !== \"object\") {\n throw new Error(`$extends target \"${extendsPath}\" is not a group`);\n }\n\n const resolvedParent = resolveExtends(parent as DTCGGroup, root, visited);\n const merged: Record<string, unknown> = { ...resolvedParent };\n for (const [key, value] of Object.entries(group)) {\n if (key === \"$extends\") continue;\n merged[key] = value;\n }\n\n return merged as DTCGGroup;\n}\n\nfunction walkTokenTree(\n node: DTCGGroup,\n root: DTCGTokenFile,\n path: string[],\n inheritedType: DTCGTokenType | undefined,\n tokens: ResolvedDTCGToken[],\n): void {\n const resolved = resolveExtends(node, root, new Set());\n const currentType = resolved.$type ?? inheritedType;\n\n for (const [key, child] of Object.entries(resolved)) {\n if (DTCG_META_KEYS.has(key)) continue;\n if (typeof child !== \"object\" || child === null) continue;\n\n const childObj = child as Record<string, unknown>;\n const childPath = [...path, key];\n\n if (\"$value\" in childObj) {\n const tokenType = (childObj.$type as DTCGTokenType | undefined) ?? currentType;\n if (!tokenType) continue;\n\n let rawValue = childObj.$value;\n if (isAlias(rawValue)) {\n try {\n rawValue = resolveAlias(rawValue, root, new Set(), 0);\n } catch {\n // Keep raw alias value if resolution fails.\n }\n }\n\n tokens.push({\n path: childPath.join(\".\"),\n type: tokenType,\n rawValue,\n cssValue: valueToCSS(tokenType, rawValue),\n description: childObj.$description as string | undefined,\n deprecated: childObj.$deprecated as boolean | string | undefined,\n extensions: childObj.$extensions as Record<string, unknown> | undefined,\n });\n } else {\n walkTokenTree(childObj as DTCGGroup, root, childPath, currentType, tokens);\n }\n }\n}\n\nfunction detectDTCGPrefix(tokens: ResolvedDTCGToken[], root: DTCGTokenFile): string {\n const extensions = root.$extensions as Record<string, unknown> | undefined;\n if (extensions) {\n const fragmentsExt = extensions[\"com.usefragments\"] as Record<string, unknown> | undefined;\n if (fragmentsExt?.prefix && typeof fragmentsExt.prefix === \"string\") {\n const p = fragmentsExt.prefix.replace(/-$/, \"\");\n return `--${p}-`;\n }\n }\n\n const topLevelKeys = Object.keys(root).filter((k) => !DTCG_META_KEYS.has(k));\n if (topLevelKeys.length === 1) {\n return `--${topLevelKeys[0]}-`;\n }\n if (topLevelKeys.length > 1) {\n return \"--\";\n }\n\n if (tokens.length === 0) return \"--\";\n\n const firstParts = tokens[0].path.split(\".\");\n if (firstParts.length > 0) {\n return `--${firstParts[0]}-`;\n }\n\n return \"--\";\n}\n\nfunction tokenPathToCSSName(path: string, prefix: string): string {\n const suffix = path.replace(/\\./g, \"-\");\n const normalizedPrefix = prefix.endsWith(\"-\") ? prefix : `${prefix}-`;\n const prefixBase = normalizedPrefix.replace(/^--/, \"\").replace(/-$/, \"\");\n if (suffix.startsWith(prefixBase + \"-\") || suffix === prefixBase) {\n return `--${suffix}`;\n }\n return `${normalizedPrefix}${suffix}`;\n}\n\nexport function parseDtcgTokens(content: string, filePath = \"tokens.tokens.json\"): TokenParseOutput {\n const root: DTCGTokenFile = JSON.parse(content);\n const resolvedTokens: ResolvedDTCGToken[] = [];\n walkTokenTree(root, root, [], undefined, resolvedTokens);\n\n const prefix = detectDTCGPrefix(resolvedTokens, root);\n const categories: Record<string, ParsedToken[]> = {};\n\n for (const token of resolvedTokens) {\n const category = mapDTCGTypeToCategory(token.type, token.path);\n const parsed: ParsedToken = {\n name: tokenPathToCSSName(token.path, prefix),\n value: token.cssValue,\n category,\n description: token.description,\n };\n\n categories[category] ??= [];\n categories[category].push(parsed);\n }\n\n return {\n prefix,\n categories,\n total: resolvedTokens.length,\n };\n}\n\nexport const parseDTCGFile = parseDtcgTokens;\n","import type { TokenCategory } from \"../token-types.js\";\n\nconst TOKEN_CATEGORY_PATTERNS: Array<{\n pattern: RegExp;\n category: TokenCategory;\n}> = [\n { pattern: /color|bg|background|border-color|fill|stroke/i, category: \"color\" },\n {\n pattern: /spacing|margin|padding|gap|space|inset|(?:^|[-_])sp(?:[-_]|$)/i,\n category: \"spacing\",\n },\n { pattern: /font|text|line-height|letter-spacing|typography/i, category: \"typography\" },\n { pattern: /radius|rounded|corner/i, category: \"radius\" },\n { pattern: /shadow|elevation/i, category: \"shadow\" },\n { pattern: /size|width|height|min|max/i, category: \"sizing\" },\n { pattern: /border(?!-color)|stroke-width|outline/i, category: \"border\" },\n { pattern: /animation|transition|duration|timing|delay/i, category: \"animation\" },\n { pattern: /z-index|layer|stack/i, category: \"z-index\" },\n];\n\nconst TOKEN_GROUP_PATTERNS: Array<{ pattern: RegExp; category: string }> = [\n {\n pattern: /--(?:[\\w]+-)?(?:font|line-height|letter-spacing|typography)-/,\n category: \"typography\",\n },\n { pattern: /--(?:[\\w]+-)?(?:sp|space|spacing|padding|gap|margin|inset)-/, category: \"spacing\" },\n { pattern: /--(?:[\\w]+-)?(?:radius|rounded|corner)-/, category: \"radius\" },\n { pattern: /--(?:[\\w]+-)?color-/, category: \"colors\" },\n { pattern: /--(?:[\\w]+-)?(?:bg|background)-/, category: \"surfaces\" },\n { pattern: /--(?:[\\w]+-)?text-/, category: \"text\" },\n { pattern: /--(?:[\\w]+-)?border/, category: \"borders\" },\n { pattern: /--(?:[\\w]+-)?(?:shadow|elevation)-/, category: \"shadows\" },\n { pattern: /--(?:[\\w]+-)?focus-/, category: \"focus\" },\n {\n pattern: /--(?:[\\w]+-)?(?:transition|animation|duration|timing|delay)-/,\n category: \"transitions\",\n },\n { pattern: /--(?:[\\w]+-)?scrollbar-/, category: \"scrollbar\" },\n { pattern: /--(?:[\\w]+-)?z-index/, category: \"z-index\" },\n { pattern: /--(?:[\\w]+-)?(?:button|input|touch)-/, category: \"component-sizing\" },\n { pattern: /--(?:[\\w]+-)?(?:appshell|header)-/, category: \"layout\" },\n { pattern: /--(?:[\\w]+-)?code-/, category: \"code\" },\n { pattern: /--(?:[\\w]+-)?tooltip-/, category: \"tooltip\" },\n { pattern: /--(?:[\\w]+-)?hero-/, category: \"marketing\" },\n];\n\nexport function inferTokenCategory(name: string, value?: string): TokenCategory {\n const valueCategory = value ? inferTokenCategoryFromValue(value) : null;\n if (valueCategory) return valueCategory;\n\n const lowerName = name.toLowerCase();\n\n for (const { pattern, category } of TOKEN_CATEGORY_PATTERNS) {\n if (pattern.test(lowerName)) {\n return category;\n }\n }\n\n return \"other\";\n}\n\nfunction inferTokenCategoryFromValue(value: string): TokenCategory | null {\n const normalized = value.trim().toLowerCase();\n if (\n /^#(?:[0-9a-f]{3,8})$/i.test(normalized) ||\n /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\\(/.test(normalized) ||\n normalized === \"currentcolor\"\n ) {\n return \"color\";\n }\n\n return null;\n}\n\nexport function inferTokenGroup(name: string): string {\n const lowerName = name.toLowerCase();\n\n for (const { pattern, category } of TOKEN_GROUP_PATTERNS) {\n if (pattern.test(lowerName)) {\n return category;\n }\n }\n\n const category = inferTokenCategory(name);\n switch (category) {\n case \"color\":\n return \"colors\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"animation\":\n return \"transitions\";\n default:\n return category;\n }\n}\n\nexport function normalizeTokenGroupComment(comment: string): string {\n const text = comment\n .trim()\n .replace(/^\\/\\/\\s*/, \"\")\n .replace(/^\\/\\*+\\s*/, \"\")\n .replace(/\\s*\\*+\\/$/, \"\")\n .trim()\n .toLowerCase();\n\n const mappings: Record<string, string> = {\n \"base configuration\": \"base\",\n typography: \"typography\",\n \"spacing (micro)\": \"spacing\",\n spacing: \"spacing\",\n \"density padding\": \"spacing\",\n \"border radius\": \"radius\",\n transitions: \"transitions\",\n colors: \"colors\",\n surfaces: \"surfaces\",\n text: \"text\",\n borders: \"borders\",\n shadows: \"shadows\",\n focus: \"focus\",\n scrollbar: \"scrollbar\",\n \"component heights\": \"component-sizing\",\n \"appshell layout\": \"layout\",\n codeblock: \"code\",\n tooltip: \"tooltip\",\n \"hero/marketing gradient\": \"marketing\",\n };\n\n return mappings[text] ?? text.replace(/\\s+/g, \"-\");\n}\n","import { inferTokenGroup, normalizeTokenGroupComment } from \"./categories.js\";\nimport type { ParsedToken, TokenParseOutput } from \"./types.js\";\n\nexport function detectTokenPrefix(names: string[]): string {\n if (names.length === 0) return \"--\";\n\n const stripped = names.map((name) => name.slice(2));\n let prefix = \"\";\n const first = stripped[0] ?? \"\";\n\n for (let i = 0; i < first.length; i++) {\n const ch = first[i];\n if (stripped.every((s) => s[i] === ch)) {\n prefix += ch;\n } else {\n break;\n }\n }\n\n const lastHyphen = prefix.lastIndexOf(\"-\");\n if (lastHyphen > 0) {\n prefix = prefix.slice(0, lastHyphen + 1);\n }\n\n return `--${prefix}`;\n}\n\nexport function parseScssVariables(content: string): Map<string, string> {\n const vars = new Map<string, string>();\n const scssVarRegex = /^\\s*(\\$[\\w-]+)\\s*:\\s*(.+?)\\s*(?:!default\\s*)?;/gm;\n\n let match: RegExpExecArray | null;\n while ((match = scssVarRegex.exec(content)) !== null) {\n const name = match[1];\n const value = match[2].replace(/\\s*\\/\\/.*$/, \"\").trim();\n if (!vars.has(name)) {\n vars.set(name, value);\n }\n }\n\n return vars;\n}\n\nexport function resolveTokenValue(\n rawValue: string,\n scssVars: Map<string, string>,\n cssVarValues: Map<string, string>,\n depth = 0,\n): string {\n if (depth > 5) return rawValue;\n\n let resolved = rawValue;\n\n resolved = resolved.replace(/#\\{(\\$[\\w-]+)\\}/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : `#{${varName}}`;\n });\n\n resolved = resolved.replace(/(?<![#\\{])(\\$[\\w-]+)/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : varName;\n });\n\n resolved = resolved.replace(\n /var\\((--[\\w-]+)(?:\\s*,\\s*(.+?))?\\)/g,\n (original, tokenName, fallback) => {\n const tokenVal = cssVarValues.get(tokenName);\n if (tokenVal !== undefined) {\n return resolveTokenValue(tokenVal, scssVars, cssVarValues, depth + 1);\n }\n if (fallback) {\n return resolveTokenValue(fallback.trim(), scssVars, cssVarValues, depth + 1);\n }\n return original;\n },\n );\n\n return resolved;\n}\n\nexport function parseScssTokens(content: string, filePath = \"tokens.scss\"): TokenParseOutput {\n const lines = content.split(\"\\n\");\n const tokens: ParsedToken[] = [];\n const seenNames = new Set<string>();\n let currentCategory = \"other\";\n let hasCommentCategories = false;\n\n const scssVars = parseScssVariables(content);\n const varDeclRegex = /^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*;/;\n const sectionCommentRegex = /^\\s*\\/\\/\\s+([A-Z].+)$/;\n\n for (const line of lines) {\n const commentMatch = line.match(sectionCommentRegex);\n if (commentMatch) {\n const normalized = normalizeTokenGroupComment(commentMatch[0]);\n if (normalized) {\n currentCategory = normalized;\n hasCommentCategories = true;\n }\n continue;\n }\n\n const varMatch = line.match(varDeclRegex);\n if (varMatch) {\n const name = varMatch[1];\n const rawValue = varMatch[2];\n\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n\n const inlineComment = line.match(/\\/\\/\\s*(.+)$/);\n const description = inlineComment ? inlineComment[1].trim() : undefined;\n const cleanValue = rawValue.replace(/\\s*\\/\\/.*$/, \"\").trim();\n\n tokens.push({\n name,\n value: cleanValue || undefined,\n category: hasCommentCategories ? currentCategory : inferTokenGroup(name),\n description,\n });\n }\n }\n\n for (const [name, value] of scssVars) {\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n tokens.push({\n name,\n value,\n category: hasCommentCategories ? currentCategory : inferTokenGroup(name),\n });\n }\n\n const cssVarValues = new Map<string, string>();\n for (const token of tokens) {\n if (token.value) {\n cssVarValues.set(token.name, token.value);\n }\n }\n\n for (const token of tokens) {\n if (token.value) {\n const resolved = resolveTokenValue(token.value, scssVars, cssVarValues);\n if (resolved !== token.value && !resolved.includes(\"#{\") && !resolved.includes(\"$\")) {\n token.resolvedValue = resolved;\n }\n }\n }\n\n const categories: Record<string, ParsedToken[]> = {};\n for (const token of tokens) {\n categories[token.category] ??= [];\n categories[token.category].push(token);\n }\n\n return {\n prefix: detectTokenPrefix(tokens.map((token) => token.name)),\n categories,\n total: tokens.length,\n };\n}\n\nexport function parseCssTokens(content: string, filePath = \"tokens.css\"): TokenParseOutput {\n return parseScssTokens(content, filePath);\n}\n\nexport const parseTokenFile = parseScssTokens;\n","import type { DesignToken } from \"../token-types.js\";\nimport { inferTokenCategory } from \"./categories.js\";\nimport type { ThemeParserResult } from \"./types.js\";\n\nconst CUSTOM_PROPERTY_PATTERN = /^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*;?\\s*$/;\n\nexport function containsTailwindV4Theme(content: string): boolean {\n return /^@theme\\b/m.test(content);\n}\n\nexport function parseTailwindV4Theme(\n cssContent: string,\n filePath?: string,\n): ThemeParserResult {\n const startTime = performance.now();\n const tokens: DesignToken[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n const source = filePath ?? \"unknown\";\n\n const cleaned = stripBlockComments(cssContent);\n const lines = cleaned.split(\"\\n\");\n\n let insideTheme = false;\n let themeDepth = 0;\n let pendingTheme = false;\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n const lineNumber = i + 1;\n\n const singleCommentIdx = line.indexOf(\"//\");\n if (singleCommentIdx !== -1) {\n const beforeComment = line.slice(0, singleCommentIdx);\n const singleQuotes = (beforeComment.match(/'/g) || []).length;\n const doubleQuotes = (beforeComment.match(/\"/g) || []).length;\n if (singleQuotes % 2 === 0 && doubleQuotes % 2 === 0) {\n line = beforeComment;\n }\n }\n\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n\n if (!insideTheme && !pendingTheme && /^@theme\\b/.test(trimmed)) {\n pendingTheme = true;\n const braceIdx = trimmed.indexOf(\"{\");\n if (braceIdx !== -1) {\n pendingTheme = false;\n insideTheme = true;\n themeDepth = 1;\n\n const afterBrace = trimmed.slice(braceIdx + 1);\n for (const ch of afterBrace) {\n if (ch === \"{\") themeDepth++;\n else if (ch === \"}\") themeDepth--;\n }\n\n const inlineContent = afterBrace.trim();\n if (inlineContent && themeDepth > 0) {\n processThemeLine(inlineContent, lineNumber, source, tokens, warnings);\n }\n\n if (themeDepth <= 0) {\n insideTheme = false;\n }\n }\n continue;\n }\n\n if (pendingTheme) {\n const braceIdx = trimmed.indexOf(\"{\");\n if (braceIdx !== -1) {\n pendingTheme = false;\n insideTheme = true;\n themeDepth = 1;\n\n const afterBrace = trimmed.slice(braceIdx + 1);\n for (const ch of afterBrace) {\n if (ch === \"{\") themeDepth++;\n else if (ch === \"}\") themeDepth--;\n }\n\n const inlineContent = afterBrace.trim();\n if (inlineContent && themeDepth > 0) {\n processThemeLine(inlineContent, lineNumber, source, tokens, warnings);\n }\n\n if (themeDepth <= 0) {\n insideTheme = false;\n }\n }\n continue;\n }\n\n if (insideTheme) {\n for (const ch of trimmed) {\n if (ch === \"{\") {\n themeDepth++;\n } else if (ch === \"}\") {\n themeDepth--;\n if (themeDepth <= 0) {\n insideTheme = false;\n break;\n }\n }\n }\n\n if (insideTheme || themeDepth > 0) {\n const contentLine = trimmed.replace(/\\}/g, \"\").trim();\n if (contentLine) {\n processThemeLine(contentLine, lineNumber, source, tokens, warnings);\n }\n }\n }\n }\n\n if (pendingTheme) {\n warnings.push(`@theme keyword found but no opening brace - incomplete block in ${source}`);\n }\n\n if (insideTheme) {\n warnings.push(`Unclosed @theme block - missing closing brace in ${source}`);\n }\n\n return {\n tokens,\n errors,\n warnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\nfunction stripBlockComments(css: string): string {\n return css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n}\n\nfunction processThemeLine(\n line: string,\n lineNumber: number,\n source: string,\n tokens: DesignToken[],\n warnings: string[],\n): void {\n const match = line.match(CUSTOM_PROPERTY_PATTERN);\n\n if (!match) {\n const partialMatch = line.match(/^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*$/);\n if (partialMatch) {\n const [, name, rawValue] = partialMatch;\n tokens.push(buildToken(name, rawValue, lineNumber, source));\n return;\n }\n\n if (/^\\s*--/.test(line)) {\n warnings.push(\n `Line ${lineNumber}: Could not parse custom property declaration: ${line.trim()}`,\n );\n }\n return;\n }\n\n const [, name, rawValue] = match;\n tokens.push(buildToken(name, rawValue, lineNumber, source));\n}\n\nfunction buildToken(\n name: string,\n rawValue: string,\n lineNumber: number,\n source: string,\n): DesignToken {\n const value = rawValue.trim();\n\n return {\n name,\n rawValue: value,\n resolvedValue: value,\n category: inferTokenCategory(name),\n level: /var\\(/.test(value) ? 2 : 1,\n referenceChain: [],\n sourceFile: source,\n lineNumber,\n theme: \"default\",\n selector: \"@theme\",\n };\n}\n","import type {\n DesignToken,\n TokenCategory,\n TokenParseError,\n TokenParseResult,\n} from \"../token-types.js\";\nimport { inferTokenCategory } from \"./categories.js\";\nimport { isDTCGFile, parseDtcgTokens } from \"./dtcg.js\";\nimport { parseScssTokens } from \"./scss.js\";\nimport { containsTailwindV4Theme, parseTailwindV4Theme } from \"./tailwind-v4.js\";\nimport type { DesignTokenParseOptions, ParsedToken, TokenParseOutput } from \"./types.js\";\n\n// Token declaration value class excludes `;` (the normal terminator), and `{`/`}`\n// so the final declaration in a block (no trailing `;` — valid CSS, #34) and a\n// value that wraps across newlines (#35) are both captured without swallowing a\n// following block. Matched over the FULL content string (not per-line) so the\n// `[^;{}]+?` class can span `\\n`. Terminates on `;`, the next `}`, or EOF.\nconst TOKEN_DECLARATION_PATTERN = /--([a-zA-Z0-9_-]+)\\s*:\\s*([^;{}]+?)\\s*(?:;|(?=\\})|$)/g;\nconst VAR_REFERENCE_PATTERN = /var\\(\\s*--([a-zA-Z0-9_-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/;\n\nexport function parseDesignTokenContent(\n content: string,\n options: DesignTokenParseOptions = {}\n): TokenParseResult {\n const startTime = performance.now();\n const tokens: DesignToken[] = [];\n const errors: TokenParseError[] = [];\n const warnings: string[] = [];\n const filePath = options.filePath ?? \"unknown\";\n const themeSelectors = options.themeSelectors ?? { \":root\": \"default\" };\n const includeTailwindV4 = options.includeTailwindV4 ?? true;\n\n // Format dispatch (single chokepoint for the CLI's buildContractVocabularyFacts).\n // DTCG/JSON and SCSS files produce NO `--name:` CSS declarations, so the CSS\n // line-loop below yields an empty vocabulary and FUI2015 silently disables — the\n // worst failure mode (#10 DTCG, #32 SCSS). Route those through the sibling\n // parsers (both already emit `--kebab` CSS names the rule consumes unchanged),\n // each returning early. A 0-token result surfaces a NON-SILENT warning rather\n // than a quietly-empty vocabulary. The CSS path (with the #34/#35 robustness\n // fixes) is the fallthrough default.\n const trimmed = content.trimStart();\n const looksDtcg =\n isDTCGFile(filePath) || /\\.jsonc?$|\\.tokens$/i.test(filePath) || trimmed.startsWith(\"{\");\n if (looksDtcg) {\n try {\n // Fail-soft per the architecture spine: a malformed .json must never throw\n // or break the scan — fall through to the CSS path on any parse error.\n const out = parseDtcgTokens(content, filePath);\n const dtTokens = parsedOutputToDesignTokens(out, filePath);\n const dtcgWarnings =\n dtTokens.length === 0\n ? [\n `Token source file ${filePath}: DTCG/JSON file produced no token names; FUI2015 token-drift is inactive for it.`,\n ]\n : [];\n return {\n tokens: dtTokens,\n errors: [],\n warnings: dtcgWarnings,\n parseTimeMs: performance.now() - startTime,\n };\n } catch {\n // Fall through to the CSS path; if nothing matches there, the 0-token\n // warning at the end of the CSS path still fires (non-silent).\n }\n }\n\n const isScss = /\\.(scss|sass)$/i.test(filePath);\n const hasCssVar = /--[\\w-]+\\s*:/.test(content);\n const hasScssVar = /(^|\\n)\\s*\\$[\\w-]+\\s*:/.test(content);\n if (isScss || (!hasCssVar && hasScssVar)) {\n // parseScssTokens emits BOTH `--css-var` and `$scss-var` names. Normalize\n // every `$name` to `--name`: the mandated dual-fallback convention\n // `var(--fui-x, $fui-x)` guarantees a 1:1 `$`↔`--` correspondence, and `--x`\n // is exactly the name the rule judges (it reads `var(--x)` references).\n const out = parseScssTokens(content, filePath);\n const scssTokens = scssOutputToDesignTokens(out, filePath);\n const scssWarnings =\n scssTokens.length === 0\n ? [\n `Token source file ${filePath}: SCSS file produced no token names; FUI2015 token-drift is inactive for it.`,\n ]\n : [];\n return {\n tokens: scssTokens,\n errors: [],\n warnings: scssWarnings,\n parseTimeMs: performance.now() - startTime,\n };\n }\n\n if (includeTailwindV4 && containsTailwindV4Theme(content)) {\n const v4Result = parseTailwindV4Theme(content, filePath);\n tokens.push(...v4Result.tokens);\n warnings.push(...v4Result.warnings);\n for (const err of v4Result.errors) {\n errors.push({ message: err, file: filePath });\n }\n }\n\n const tokensByName = new Map<string, { rawValue: string; line?: number }>();\n\n // Match over the FULL content so a value spanning newlines (#35) is captured.\n // The line number is recomputed from the match index because findSelectorForLine\n // and extractDescription still attribute by line. Internal whitespace (incl.\n // newlines) is collapsed so a multi-line value stores cleanly.\n for (const match of content.matchAll(TOKEN_DECLARATION_PATTERN)) {\n const [, name, rawValue] = match;\n const fullName = `--${name}`;\n const lineNumber = countNewlines(content, match.index ?? 0) + 1;\n tokensByName.set(fullName, {\n rawValue: rawValue.trim().replace(/\\s+/g, \" \"),\n line: lineNumber,\n });\n }\n\n for (const [name, { rawValue, line }] of tokensByName) {\n const selector = findSelectorForLine(content, line ?? 1);\n const theme = themeSelectors[selector] || \"default\";\n const { resolvedValue, chain, hasCircular, unresolvedRef } = resolveDesignTokenValue(\n rawValue,\n tokensByName\n );\n\n if (hasCircular) {\n warnings.push(`Circular reference detected for ${name} at line ${line}`);\n }\n\n if (unresolvedRef) {\n warnings.push(`Unresolved reference in ${name}: ${unresolvedRef}`);\n }\n\n tokens.push({\n name,\n rawValue,\n resolvedValue,\n category: inferTokenCategory(name, resolvedValue || rawValue),\n level: inferTokenLevel(name, rawValue, chain),\n referenceChain: chain,\n sourceFile: filePath,\n lineNumber: line,\n theme,\n selector,\n description: extractDescription(content, line ?? 1),\n });\n }\n\n // NON-SILENT invariant: a non-empty CSS file that yields no token names means\n // FUI2015 has no vocabulary from it — surface a warning instead of a quietly\n // empty result (mirrors the DTCG/SCSS 0-token warnings above).\n if (tokens.length === 0 && trimmed.length > 0) {\n warnings.push(\n `Token source file ${filePath}: CSS file produced no token names; FUI2015 token-drift is inactive for it.`\n );\n }\n\n return {\n tokens,\n errors,\n warnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\n/** Count the `\\n` characters in `content` up to (not including) `index`. */\nfunction countNewlines(content: string, index: number): number {\n let count = 0;\n for (let i = 0; i < index && i < content.length; i++) {\n if (content.charCodeAt(i) === 10) count++;\n }\n return count;\n}\n\n/**\n * Flatten a DTCG/JSON `TokenParseOutput` into `DesignToken[]`. Names pass through\n * verbatim (parseDtcgTokens already emits `--kebab` CSS names via\n * tokenPathToCSSName). Determinism: walkTokenTree preserves JSON object key order.\n */\nfunction parsedOutputToDesignTokens(output: TokenParseOutput, filePath: string): DesignToken[] {\n const tokens: DesignToken[] = [];\n for (const cat of Object.values(output.categories)) {\n for (const t of cat) {\n tokens.push(designTokenFromParsed(t.name, t, filePath));\n }\n }\n return tokens;\n}\n\n/**\n * Flatten an SCSS `TokenParseOutput` into `DesignToken[]`, normalizing every\n * `$name` to `--name` (the mandated dual-fallback `var(--fui-x, $fui-x)` makes\n * this 1:1 and deterministic) and de-duping so a file declaring both `--fui-x`\n * and `$fui-x` yields one `--fui-x`.\n */\nfunction scssOutputToDesignTokens(output: TokenParseOutput, filePath: string): DesignToken[] {\n const names = new Set<string>();\n const tokens: DesignToken[] = [];\n for (const cat of Object.values(output.categories)) {\n for (const t of cat) {\n const cssName = t.name.startsWith(\"$\") ? `--${t.name.slice(1)}` : t.name;\n if (!cssName.startsWith(\"--\") || names.has(cssName)) continue;\n names.add(cssName);\n tokens.push(designTokenFromParsed(cssName, t, filePath));\n }\n }\n return tokens;\n}\n\n/** Build a `DesignToken` from a sibling-parser `ParsedToken` under a CSS name. */\nfunction designTokenFromParsed(name: string, parsed: ParsedToken, filePath: string): DesignToken {\n return {\n name,\n rawValue: parsed.value ?? \"\",\n resolvedValue: parsed.resolvedValue ?? parsed.value ?? \"\",\n category: normalizeParsedTokenCategory(\n parsed.category,\n name,\n parsed.resolvedValue ?? parsed.value ?? \"\"\n ),\n level: 1,\n referenceChain: [],\n sourceFile: filePath,\n theme: \"default\",\n selector: \":root\",\n description: parsed.description,\n };\n}\n\nfunction normalizeParsedTokenCategory(\n category: string | undefined,\n name: string,\n value: string\n): TokenCategory {\n switch (category?.toLowerCase()) {\n case \"colors\":\n case \"color\":\n case \"surfaces\":\n case \"surface\":\n case \"text\":\n return \"color\";\n case \"spacing\":\n case \"space\":\n return \"spacing\";\n case \"typography\":\n case \"font\":\n return \"typography\";\n case \"radius\":\n case \"radii\":\n return \"radius\";\n case \"shadows\":\n case \"shadow\":\n return \"shadow\";\n case \"borders\":\n case \"border\":\n return \"border\";\n case \"animation\":\n case \"animations\":\n case \"transitions\":\n case \"transition\":\n return \"animation\";\n case \"sizing\":\n case \"size\":\n return \"sizing\";\n case \"z-index\":\n case \"zindex\":\n return \"z-index\";\n default:\n return inferTokenCategory(name, value);\n }\n}\n\nexport function resolveDesignTokenValue(\n rawValue: string,\n tokensByName: Map<string, { rawValue: string; line?: number }>,\n visited = new Set<string>()\n): {\n resolvedValue: string;\n chain: string[];\n hasCircular: boolean;\n unresolvedRef?: string;\n} {\n const chain: string[] = [];\n let current = rawValue;\n let hasCircular = false;\n let unresolvedRef: string | undefined;\n\n const maxIterations = 20;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n const varMatch = current.match(VAR_REFERENCE_PATTERN);\n if (!varMatch) break;\n\n const [, refName, fallback] = varMatch;\n const fullRefName = `--${refName}`;\n\n if (visited.has(fullRefName)) {\n hasCircular = true;\n break;\n }\n\n visited.add(fullRefName);\n chain.push(fullRefName);\n\n const refToken = tokensByName.get(fullRefName);\n if (refToken) {\n current = current.replace(varMatch[0], refToken.rawValue);\n } else if (fallback) {\n current = current.replace(varMatch[0], fallback.trim());\n } else {\n unresolvedRef = fullRefName;\n break;\n }\n }\n\n return {\n resolvedValue: normalizeTokenValue(current.trim()),\n chain,\n hasCircular,\n unresolvedRef,\n };\n}\n\nexport function normalizeTokenValue(value: string): string {\n value = value.replace(/#[0-9a-fA-F]+/g, (match) => match.toLowerCase());\n value = value.replace(/\\s+/g, \" \").trim();\n value = value.replace(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/g,\n (_, r, g, b, a) => (a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`)\n );\n\n return value;\n}\n\nfunction inferTokenLevel(name: string, rawValue: string, referenceChain: string[]): 1 | 2 | 3 {\n const lowerName = name.toLowerCase();\n\n if (/btn|button|input|card|modal|dialog|menu|nav|header|footer|table|form/i.test(lowerName)) {\n return 3;\n }\n\n if (referenceChain.length > 0) {\n return 2;\n }\n\n if (rawValue.match(/^#[0-9a-fA-F]+$/) || rawValue.match(/^\\d+(\\.\\d+)?(px|rem|em|%|vh|vw)?$/)) {\n return 1;\n }\n\n return 2;\n}\n\nfunction findSelectorForLine(content: string, targetLine: number): string {\n const lines = content.split(\"\\n\");\n let currentSelector = \":root\";\n let braceDepth = 0;\n\n for (let i = 0; i < Math.min(targetLine, lines.length); i++) {\n const line = lines[i];\n const selectorMatch = line.match(/^\\s*([^{]+)\\s*\\{/);\n if (selectorMatch) {\n const selector = selectorMatch[1].trim();\n if ((line.match(/\\{/g) || []).length > (line.match(/\\}/g) || []).length) {\n currentSelector = selector;\n }\n }\n\n braceDepth += (line.match(/\\{/g) || []).length;\n braceDepth -= (line.match(/\\}/g) || []).length;\n\n if (braceDepth === 0) {\n currentSelector = \":root\";\n }\n }\n\n return currentSelector;\n}\n\nfunction extractDescription(content: string, line: number): string | undefined {\n const lines = content.split(\"\\n\");\n if (line <= 1) return undefined;\n\n const prevLine = lines[line - 2]?.trim();\n const singleLineMatch = prevLine?.match(/\\/\\/\\s*(.+)$/);\n if (singleLineMatch) {\n return singleLineMatch[1].trim();\n }\n\n const multiLineMatch = prevLine?.match(/\\*\\s*(.+)\\s*\\*\\//);\n if (multiLineMatch) {\n return multiLineMatch[1].trim();\n }\n\n const inlineMatch = prevLine?.match(/\\/\\*\\s*(.+)\\s*\\*\\//);\n if (inlineMatch) {\n return inlineMatch[1].trim();\n }\n\n return undefined;\n}\n","import type { DesignToken, TokenCategory } from \"../token-types.js\";\nimport { isDTCGFile, parseDtcgTokens } from \"./dtcg.js\";\nimport { parseCssTokens, parseScssTokens, detectTokenPrefix } from \"./scss.js\";\nimport { containsTailwindV4Theme, parseTailwindV4Theme } from \"./tailwind-v4.js\";\nimport type { ParsedToken, ParseTokensOptions, TokenFormat, TokenParseOutput } from \"./types.js\";\n\nexport type {\n DesignTokenParseOptions,\n ParsedToken,\n ParseTokensOptions,\n ThemeParserResult,\n TokenFormat,\n TokenParseOutput,\n} from \"./types.js\";\n\nexport {\n inferTokenCategory,\n inferTokenGroup,\n normalizeTokenGroupComment,\n} from \"./categories.js\";\n\nexport {\n calculateDeltaE,\n colorSimilarity,\n familyDistance,\n hexToRgb,\n isColorLike,\n nearestByDeltaE,\n normalizeColor,\n parseColor,\n parseColorToRgb,\n parseRgb,\n rgbToHex,\n type DeltaEMatch,\n type NearestByDeltaEOptions,\n type RGB,\n type RGBA,\n} from \"./color.js\";\n\nexport { type TokenLookup } from \"./lookup.js\";\n\nexport {\n detectTokenPrefix,\n parseCssTokens,\n parseScssTokens,\n parseScssVariables,\n parseTokenFile,\n resolveTokenValue,\n} from \"./scss.js\";\n\nexport {\n isDTCGFile,\n parseDTCGFile,\n parseDtcgTokens,\n} from \"./dtcg.js\";\n\nexport {\n containsTailwindV4Theme,\n parseTailwindV4Theme,\n} from \"./tailwind-v4.js\";\n\nexport {\n normalizeTokenValue,\n parseDesignTokenContent,\n resolveDesignTokenValue,\n} from \"./design-token-parser.js\";\n\nexport function parseTokens(\n content: string,\n formatOrOptions: TokenFormat | ParseTokensOptions = \"auto\",\n): TokenParseOutput {\n const options =\n typeof formatOrOptions === \"string\"\n ? { format: formatOrOptions }\n : formatOrOptions;\n const format = options.format ?? \"auto\";\n const filePath = options.filePath ?? \"\";\n\n if (format === \"dtcg\" || (format === \"auto\" && isDTCGFile(filePath))) {\n return parseDtcgTokens(content, filePath);\n }\n\n if (format === \"tailwind-v4\" || (format === \"auto\" && containsTailwindV4Theme(content))) {\n return designTokensToParseOutput(parseTailwindV4Theme(content, filePath).tokens);\n }\n\n if (format === \"css\") {\n return parseCssTokens(content, filePath);\n }\n\n return parseScssTokens(content, filePath);\n}\n\nfunction designTokensToParseOutput(tokens: DesignToken[]): TokenParseOutput {\n const categories: Record<string, ParsedToken[]> = {};\n\n for (const token of tokens) {\n const category = tokenCategoryToGroup(token.category);\n categories[category] ??= [];\n categories[category].push({\n name: token.name,\n value: token.rawValue,\n resolvedValue:\n token.resolvedValue !== token.rawValue ? token.resolvedValue : undefined,\n category,\n description: token.description,\n });\n }\n\n return {\n prefix: detectTokenPrefix(tokens.map((token) => token.name)),\n categories,\n total: tokens.length,\n };\n}\n\nfunction tokenCategoryToGroup(category: TokenCategory): string {\n switch (category) {\n case \"color\":\n return \"colors\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"animation\":\n return \"transitions\";\n default:\n return category;\n }\n}\n","/**\n * W3C Design Token Community Group (DTCG) format types and Zod schemas.\n *\n * Implements the W3C DTCG specification for design token files.\n * @see https://www.designtokens.org/tr/2025.10/format/\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Token types per DTCG spec\n// ---------------------------------------------------------------------------\n\nexport type DTCGTokenType =\n | 'color'\n | 'dimension'\n | 'fontFamily'\n | 'fontWeight'\n | 'duration'\n | 'cubicBezier'\n | 'number'\n | 'shadow'\n | 'border'\n | 'strokeStyle'\n | 'transition'\n | 'gradient'\n | 'typography';\n\n// ---------------------------------------------------------------------------\n// Value types per DTCG spec\n// ---------------------------------------------------------------------------\n\n/** Color value (sRGB) */\nexport interface DTCGColorValue {\n colorSpace: string;\n components: number[];\n hex?: string;\n alpha?: number;\n}\n\n/** Dimension value */\nexport interface DTCGDimensionValue {\n value: number;\n unit: 'px' | 'rem';\n}\n\n/** Shadow value (single layer) */\nexport interface DTCGShadowValue {\n color: string | DTCGColorValue;\n offsetX: string | DTCGDimensionValue;\n offsetY: string | DTCGDimensionValue;\n blur: string | DTCGDimensionValue;\n spread: string | DTCGDimensionValue;\n inset?: boolean;\n}\n\n/** Border value */\nexport interface DTCGBorderValue {\n color: string | DTCGColorValue;\n width: string | DTCGDimensionValue;\n style: string;\n}\n\n/** Typography value */\nexport interface DTCGTypographyValue {\n fontFamily: string | string[];\n fontSize: string | DTCGDimensionValue;\n fontWeight: number | string;\n letterSpacing?: string | DTCGDimensionValue;\n lineHeight?: string | number;\n}\n\n/** Transition value */\nexport interface DTCGTransitionValue {\n duration: string;\n delay?: string;\n timingFunction: number[];\n}\n\n/** Gradient stop */\nexport interface DTCGGradientStop {\n color: string | DTCGColorValue;\n position: number;\n}\n\n/** Cubic bezier value */\nexport type DTCGCubicBezierValue = [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Token and group structures\n// ---------------------------------------------------------------------------\n\n/** A single design token */\nexport interface DTCGToken {\n $value: unknown;\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n}\n\n/** A group (recursive container for tokens and sub-groups) */\nexport interface DTCGGroup {\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n $extends?: string;\n [key: string]: DTCGToken | DTCGGroup | unknown;\n}\n\n/** Root file structure — a top-level group */\nexport type DTCGTokenFile = DTCGGroup;\n\n// ---------------------------------------------------------------------------\n// Resolved token (after parsing)\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedDTCGToken {\n /** Dot-separated path (e.g., \"color.brand.primary\") */\n path: string;\n /** Resolved type (inherited from group if not set on token) */\n type: DTCGTokenType;\n /** Raw $value from the token */\n rawValue: unknown;\n /** CSS-compatible string value */\n cssValue: string;\n /** Description */\n description?: string;\n /** Whether token is deprecated */\n deprecated?: boolean | string;\n /** Extensions data */\n extensions?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Zod schemas for runtime validation\n// ---------------------------------------------------------------------------\n\nconst dtcgTokenTypeSchema = z.enum([\n 'color', 'dimension', 'fontFamily', 'fontWeight',\n 'duration', 'cubicBezier', 'number',\n 'shadow', 'border', 'strokeStyle', 'transition',\n 'gradient', 'typography',\n]);\n\nconst dtcgColorValueSchema = z.union([\n z.string(),\n z.object({\n colorSpace: z.string().default('srgb'),\n components: z.array(z.number()),\n hex: z.string().optional(),\n alpha: z.number().optional(),\n }),\n]);\n\nconst dtcgDimensionValueSchema = z.union([\n z.string(),\n z.object({\n value: z.number(),\n unit: z.enum(['px', 'rem']),\n }),\n]);\n\nconst dtcgShadowValueSchema = z.object({\n color: dtcgColorValueSchema,\n offsetX: dtcgDimensionValueSchema,\n offsetY: dtcgDimensionValueSchema,\n blur: dtcgDimensionValueSchema,\n spread: dtcgDimensionValueSchema.optional(),\n inset: z.boolean().optional(),\n});\n\nconst dtcgBorderValueSchema = z.object({\n color: dtcgColorValueSchema,\n width: dtcgDimensionValueSchema,\n style: z.string(),\n});\n\nconst dtcgTypographyValueSchema = z.object({\n fontFamily: z.union([z.string(), z.array(z.string())]),\n fontSize: dtcgDimensionValueSchema,\n fontWeight: z.union([z.number(), z.string()]),\n letterSpacing: dtcgDimensionValueSchema.optional(),\n lineHeight: z.union([z.string(), z.number()]).optional(),\n});\n\nconst dtcgTransitionValueSchema = z.object({\n duration: z.string(),\n delay: z.string().optional(),\n timingFunction: z.array(z.number()).length(4),\n});\n\nconst dtcgGradientStopSchema = z.object({\n color: dtcgColorValueSchema,\n position: z.number(),\n});\n\nconst dtcgCubicBezierValueSchema = z.tuple([\n z.number(), z.number(), z.number(), z.number(),\n]);\n\n/** Schema for a single token node (has $value) */\nconst dtcgTokenSchema = z.object({\n $value: z.unknown(),\n $type: dtcgTokenTypeSchema.optional(),\n $description: z.string().optional(),\n $deprecated: z.union([z.boolean(), z.string()]).optional(),\n $extensions: z.record(z.string(), z.unknown()).optional(),\n}).passthrough();\n\n/**\n * Top-level schema for a DTCG token file.\n * Validates the root structure — individual tokens are validated by type\n * during parsing since the tree is recursive.\n */\nexport const dtcgTokenFileSchema = z.record(z.string(), z.unknown()).refine(\n (data) => {\n // A valid DTCG file should not be empty and should not be an array\n return data !== null && typeof data === 'object' && !Array.isArray(data);\n },\n { message: 'DTCG token file must be a JSON object' },\n);\n\n// Export individual schemas for consumers\nexport {\n dtcgTokenTypeSchema,\n dtcgTokenSchema,\n dtcgColorValueSchema,\n dtcgDimensionValueSchema,\n dtcgShadowValueSchema,\n dtcgBorderValueSchema,\n dtcgTypographyValueSchema,\n dtcgTransitionValueSchema,\n dtcgGradientStopSchema,\n dtcgCubicBezierValueSchema,\n};\n","/**\n * Framework-agnostic component contract format.\n *\n * Allows non-React teams to define component metadata via `.contract.json`\n * files instead of `.fragment.tsx`. Maps trivially to CompiledFragment.\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Component Contract interface\n// ---------------------------------------------------------------------------\n\nexport interface ComponentContract {\n /** JSON Schema reference for tooling — required for validation */\n $schema: string;\n\n /** Component name */\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n\n /** Framework hint (for extraction and documentation) */\n framework?: 'react' | 'vue' | 'svelte' | 'web-components' | 'angular';\n\n /** Path to the component source file, relative to fragments.config.ts root */\n sourcePath: string;\n\n /** Named export from the source file */\n exportName: string;\n\n /** Compact one-line-per-prop summaries for agent first-pass (e.g., \"variant: primary|secondary (required)\") */\n propsSummary: string[];\n\n /** Component props schema */\n props: Record<string, {\n type: string;\n values?: string[];\n default?: unknown;\n description: string;\n required?: boolean;\n constraints?: string[];\n }>;\n\n /** Usage guidelines */\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n\n /** Code examples (as strings, not render functions) */\n examples?: Array<{\n name: string;\n description: string;\n code: string;\n args?: Record<string, unknown>;\n }>;\n\n /** Relations to other components */\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n\n /** AI generation contract */\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n /** Sub-component slot metadata for compound components */\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n /** Canonical JSX usage examples */\n canonicalUsage?: string[];\n /** Per-component performance budget override in bytes (gzipped) */\n performanceBudget?: number;\n };\n\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n\n /** Per-component preview configuration */\n preview?: {\n setupModule?: string;\n wrapperModule?: string;\n wrapperExport?: string;\n css?: string[];\n theme?: 'light' | 'dark';\n };\n\n /** Provenance tracking — required for verification */\n provenance: {\n source: 'manual' | 'extracted' | 'merged' | 'migrated';\n verified: boolean;\n frameworkSupport?: 'native' | 'manual-only';\n sourceHash?: string;\n extractedAt?: string;\n };\n\n /** Design token references used by this component */\n tokens?: string[];\n\n /** Figma mappings (same DSL as .fragment.tsx but in JSON form) */\n figma?: {\n nodeUrl?: string;\n propMappings?: Record<string, {\n type: 'string' | 'boolean' | 'enum' | 'instance' | 'children' | 'textContent';\n figmaProperty: string;\n values?: Record<string, string>;\n }>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Zod schema for validation\n// ---------------------------------------------------------------------------\n\nconst contractPropSchema = z.object({\n type: z.string(),\n values: z.array(z.string()).optional(),\n default: z.unknown().optional(),\n description: z.string(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n});\n\nconst contractUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nconst contractExampleSchema = z.object({\n name: z.string(),\n description: z.string(),\n code: z.string(),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst contractRelationSchema = z.object({\n component: z.string(),\n relationship: z.enum(['alternative', 'parent', 'child', 'sibling', 'composition', 'complementary', 'used-by']),\n note: z.string(),\n});\n\nconst contractContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n scenarioTags: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(z.object({\n pattern: z.string(),\n message: z.string(),\n })).optional(),\n compoundChildren: z.record(z.string(), z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })).optional(),\n canonicalUsage: z.array(z.string()).optional(),\n performanceBudget: z.number().optional(),\n});\n\nconst contractAiSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\nconst contractPreviewSchema = z.object({\n setupModule: z.string().optional(),\n wrapperModule: z.string().optional(),\n wrapperExport: z.string().optional(),\n css: z.array(z.string()).optional(),\n theme: z.enum(['light', 'dark']).optional(),\n});\n\nconst contractProvenanceSchema = z.object({\n source: z.enum(['manual', 'extracted', 'merged', 'migrated']),\n verified: z.boolean(),\n frameworkSupport: z.enum(['native', 'manual-only']).optional(),\n sourceHash: z.string().optional(),\n extractedAt: z.string().optional(),\n});\n\nconst contractFigmaSchema = z.object({\n nodeUrl: z.string().optional(),\n propMappings: z.record(z.string(), z.object({\n type: z.enum(['string', 'boolean', 'enum', 'instance', 'children', 'textContent']),\n figmaProperty: z.string(),\n values: z.record(z.string(), z.string()).optional(),\n })).optional(),\n});\n\nexport const componentContractSchema = z.object({\n $schema: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.string(),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n framework: z.enum(['react', 'vue', 'svelte', 'web-components', 'angular']).optional(),\n sourcePath: z.string(),\n exportName: z.string(),\n propsSummary: z.array(z.string()),\n props: z.record(z.string(), contractPropSchema),\n usage: contractUsageSchema,\n examples: z.array(contractExampleSchema).optional(),\n relations: z.array(contractRelationSchema).optional(),\n contract: contractContractSchema.optional(),\n ai: contractAiSchema.optional(),\n preview: contractPreviewSchema.optional(),\n provenance: contractProvenanceSchema,\n tokens: z.array(z.string()).optional(),\n figma: contractFigmaSchema.optional(),\n});\n","/**\n * Component Contract Parser — converts .contract.json files to CompiledFragment.\n *\n * Maps the framework-agnostic ComponentContract format to the same\n * CompiledFragment type used by .fragment.tsx, so all downstream consumers\n * (MCP tools, governance, search) work unchanged.\n */\n\nimport { componentContractSchema } from './component-contract.js';\nimport type { ComponentContract } from './component-contract.js';\n\n// Use the context package's CompiledFragment type via re-export from types.ts\n// Since core can't depend on context, we define the minimal output shape here\n// that matches CompiledFragment structurally.\n\nexport interface CompiledContractOutput {\n filePath: string;\n meta: {\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n figma?: string;\n figmaProps?: Record<string, unknown>;\n };\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n props: Record<string, {\n type: string;\n description: string;\n default?: unknown;\n required?: boolean;\n values?: string[];\n constraints?: string[];\n }>;\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n variants: Array<{\n name: string;\n description: string;\n code?: string;\n args?: Record<string, unknown>;\n }>;\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n canonicalUsage?: string[];\n performanceBudget?: number;\n };\n /** Framework hint from contract, used by extractor adapter selection */\n framework?: string;\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n /** Top-level compact prop summaries for agent first-pass */\n propsSummary?: string[];\n /** Provenance tracking */\n provenance?: {\n source: string;\n verified: boolean;\n frameworkSupport?: string;\n sourceHash?: string;\n extractedAt?: string;\n };\n /** Source file path relative to config root */\n sourcePath?: string;\n /** Named export from source file */\n exportName?: string;\n}\n\n/**\n * Check if a file path is a component contract file.\n */\nexport function isContractFile(filePath: string): boolean {\n return filePath.endsWith('.contract.json');\n}\n\n/**\n * Parse a component contract JSON file into CompiledFragment-compatible output.\n */\nexport function parseComponentContract(\n content: string,\n filePath: string,\n): CompiledContractOutput {\n const raw = JSON.parse(content);\n const validated: ComponentContract = componentContractSchema.parse(raw);\n\n return {\n filePath,\n meta: {\n name: validated.name,\n description: validated.description,\n category: validated.category,\n tags: validated.tags,\n status: validated.status,\n figma: validated.figma?.nodeUrl,\n figmaProps: validated.figma?.propMappings as Record<string, unknown> | undefined,\n },\n usage: validated.usage,\n props: validated.props,\n relations: validated.relations ?? [],\n variants: (validated.examples ?? []).map((ex) => ({\n name: ex.name,\n description: ex.description,\n code: ex.code,\n args: ex.args,\n })),\n contract: validated.contract ? {\n ...validated.contract,\n // Merge top-level propsSummary into contract.propsSummary if not already set\n propsSummary: validated.contract.propsSummary ?? validated.propsSummary,\n } : {\n propsSummary: validated.propsSummary,\n },\n framework: validated.framework,\n ai: validated.ai,\n propsSummary: validated.propsSummary,\n provenance: validated.provenance,\n sourcePath: validated.sourcePath,\n exportName: validated.exportName,\n };\n}\n","/**\n * DTCG Output Generators — generate CSS, SCSS, Tailwind, and Figma output\n * from a DTCG token source file.\n *\n * Makes DTCG the single source of truth with everything else as derived output.\n */\n\nimport type { DTCGTokenFile } from './dtcg.js';\nimport { parseColor, parseDtcgTokens } from './tokens/index.js';\n\n// ---------------------------------------------------------------------------\n// Internal: parse a DTCG file to flat tokens\n// ---------------------------------------------------------------------------\n\nfunction parseToFlatTokens(\n tokens: DTCGTokenFile,\n prefix?: string,\n): Array<{ cssName: string; cssValue: string; category: string; description?: string }> {\n // Use parseDTCGFile to get consistent output\n const parsed = parseDtcgTokens(JSON.stringify(tokens), 'tokens.tokens.json');\n const effectivePrefix = prefix ? `--${prefix.replace(/^--/, '').replace(/-$/, '')}-` : parsed.prefix;\n\n const result: Array<{ cssName: string; cssValue: string; category: string; description?: string }> = [];\n\n for (const [category, categoryTokens] of Object.entries(parsed.categories)) {\n for (const token of categoryTokens) {\n // Re-prefix if a custom prefix was requested\n let cssName = token.name;\n if (prefix && token.name.startsWith(parsed.prefix)) {\n cssName = effectivePrefix + token.name.slice(parsed.prefix.length);\n }\n\n result.push({\n cssName,\n cssValue: token.value ?? '',\n category,\n description: token.description,\n });\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// CSS Custom Properties Generator\n// ---------------------------------------------------------------------------\n\nexport interface CSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '--ds-*') */\n prefix?: string;\n /** CSS selector to wrap variables in (default: ':root') */\n selector?: string;\n}\n\n/**\n * Generate CSS custom properties from a DTCG token file.\n */\nexport function generateCSSCustomProperties(\n tokens: DTCGTokenFile,\n options?: CSSGeneratorOptions,\n): string {\n const selector = options?.selector ?? ':root';\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push(`${selector} {`);\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(` /* ${category} */`);\n for (const token of categoryTokens) {\n if (token.description) {\n lines.push(` /* ${token.description} */`);\n }\n lines.push(` ${token.cssName}: ${token.cssValue};`);\n }\n lines.push('');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// SCSS Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface SCSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '$ds-*') */\n prefix?: string;\n}\n\n/**\n * Generate SCSS variables from a DTCG token file.\n */\nexport function generateSCSSVariables(\n tokens: DTCGTokenFile,\n options?: SCSSGeneratorOptions,\n): string {\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push('// Auto-generated from DTCG token file');\n lines.push('// Do not edit directly — modify the .tokens.json source');\n lines.push('');\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(`// ${category}`);\n for (const token of categoryTokens) {\n // Convert CSS variable name to SCSS variable name\n const scssName = token.cssName.replace(/^--/, '$');\n lines.push(`${scssName}: ${token.cssValue} !default;`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Tailwind Config Generator\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a Tailwind CSS configuration object from a DTCG token file.\n * Compatible with Tailwind v3 and v4.\n */\nexport function generateTailwindConfig(\n tokens: DTCGTokenFile,\n): Record<string, unknown> {\n const flatTokens = parseToFlatTokens(tokens);\n\n const theme: Record<string, Record<string, string>> = {};\n\n for (const token of flatTokens) {\n const tailwindKey = categoryToTailwindKey(token.category);\n if (!tailwindKey) continue;\n\n if (!theme[tailwindKey]) {\n theme[tailwindKey] = {};\n }\n\n // Convert CSS name to Tailwind token key\n // e.g., \"--ds-color-brand-primary\" → \"brand-primary\"\n const parts = token.cssName.replace(/^--[\\w]+-/, '').split('-');\n // Remove the category prefix if it matches\n const tokenKey = parts.join('-') || token.cssName;\n\n theme[tailwindKey][tokenKey] = `var(${token.cssName})`;\n }\n\n return {\n theme: {\n extend: theme,\n },\n };\n}\n\nfunction categoryToTailwindKey(category: string): string | undefined {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'colors';\n case 'spacing':\n return 'spacing';\n case 'radius':\n return 'borderRadius';\n case 'typography':\n return 'fontFamily';\n case 'shadows':\n return 'boxShadow';\n case 'borders':\n return 'borderWidth';\n case 'transitions':\n return 'transitionDuration';\n case 'z-index':\n return 'zIndex';\n default:\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Figma Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface FigmaVariable {\n name: string;\n type: 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN';\n value: unknown;\n description?: string;\n scopes?: string[];\n}\n\nexport interface FigmaVariableCollection {\n name: string;\n modes: Array<{ name: string; modeId: string }>;\n variables: FigmaVariable[];\n}\n\n/**\n * Generate Figma Variables REST API-compatible payload from a DTCG token file.\n */\nexport function generateFigmaVariables(\n tokens: DTCGTokenFile,\n): FigmaVariableCollection[] {\n const flatTokens = parseToFlatTokens(tokens);\n\n // Group by category into collections\n const collections = new Map<string, FigmaVariable[]>();\n\n for (const token of flatTokens) {\n const collectionName = categoryToFigmaCollection(token.category);\n const vars = collections.get(collectionName) ?? [];\n\n vars.push({\n name: token.cssName.replace(/^--/, '').replace(/-/g, '/'),\n type: categoryToFigmaType(token.category),\n value: parseFigmaValue(token.cssValue, token.category),\n description: token.description,\n scopes: categoryToFigmaScopes(token.category),\n });\n\n collections.set(collectionName, vars);\n }\n\n return Array.from(collections.entries()).map(([name, variables]) => ({\n name,\n modes: [{ name: 'Default', modeId: 'default' }],\n variables,\n }));\n}\n\nfunction categoryToFigmaCollection(category: string): string {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'Colors';\n case 'spacing':\n case 'radius':\n return 'Dimensions';\n case 'typography':\n return 'Typography';\n case 'shadows':\n return 'Effects';\n default:\n return 'Other';\n }\n}\n\nfunction categoryToFigmaType(category: string): 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN' {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'COLOR';\n case 'spacing':\n case 'radius':\n case 'z-index':\n return 'FLOAT';\n default:\n return 'STRING';\n }\n}\n\nfunction categoryToFigmaScopes(category: string): string[] {\n switch (category) {\n case 'colors':\n return ['ALL_FILLS', 'STROKE_COLOR'];\n case 'surfaces':\n return ['FRAME_FILL', 'SHAPE_FILL'];\n case 'text':\n return ['TEXT_FILL'];\n case 'spacing':\n return ['GAP', 'WIDTH_HEIGHT'];\n case 'radius':\n return ['CORNER_RADIUS'];\n default:\n return ['ALL_SCOPES'];\n }\n}\n\nfunction parseFigmaValue(cssValue: string, category: string): unknown {\n // For colors, try to parse hex to Figma RGBA object\n if (category === 'colors' || category === 'surfaces' || category === 'text') {\n const color = parseColor(cssValue);\n if (color) {\n return {\n r: color.r / 255,\n g: color.g / 255,\n b: color.b / 255,\n a: color.a ?? 1,\n };\n }\n }\n\n // For dimensions, extract numeric value\n if (category === 'spacing' || category === 'radius') {\n const numMatch = cssValue.match(/^(\\d+(?:\\.\\d+)?)/);\n if (numMatch) {\n return parseFloat(numMatch[1]);\n }\n }\n\n return cssValue;\n}\n","import type { CompiledFragment, RelationshipType } from \"./types.js\";\nimport type { ComponentGraph } from \"./graph/index.js\";\nimport { ComponentGraphEngine } from \"./graph/index.js\";\n\n// --- Public types ---\n\nexport interface CompositionWarning {\n type:\n | \"missing_parent\"\n | \"missing_child\"\n | \"missing_composition\"\n | \"redundant_alternative\"\n | \"deprecated\"\n | \"experimental\";\n component: string;\n message: string;\n relatedComponent?: string;\n}\n\nexport interface CompositionSuggestion {\n component: string;\n reason: string;\n relationship: RelationshipType | \"category_gap\";\n sourceComponent: string;\n}\n\nexport interface CompositionGuideline {\n component: string;\n guideline: string;\n}\n\nexport interface CompositionAnalysis {\n /** The validated component names (filtered to those that exist) */\n components: string[];\n\n /** Components requested but not found in the registry */\n unknown: string[];\n\n /** Issues with the current selection */\n warnings: CompositionWarning[];\n\n /** Components to consider adding */\n suggestions: CompositionSuggestion[];\n\n /** Relevant usage guidelines for the selected components */\n guidelines: CompositionGuideline[];\n}\n\n// --- Category affinities ---\n\nconst CATEGORY_AFFINITIES: Record<string, string[]> = {\n forms: [\"feedback\"],\n actions: [\"feedback\"],\n};\n\n// --- Main function ---\n\n/**\n * Analyzes a set of components as a composition group.\n * Returns warnings about missing relations, usage conflicts,\n * and suggestions for additional components.\n *\n * When a ComponentGraph is provided via `options.graph`, the analysis is\n * enhanced with graph-based dependency detection and block-based suggestions.\n *\n * Browser-safe: no Node.js APIs used.\n */\nexport function analyzeComposition(\n fragments: Record<string, CompiledFragment>,\n componentNames: string[],\n _context?: string,\n options?: { graph?: ComponentGraph },\n): CompositionAnalysis {\n const allNames = new Set(Object.keys(fragments));\n\n // 1. Validate names\n const components: string[] = [];\n const unknown: string[] = [];\n for (const name of componentNames) {\n if (allNames.has(name)) {\n components.push(name);\n } else {\n unknown.push(name);\n }\n }\n\n const selectedSet = new Set(components);\n const warnings: CompositionWarning[] = [];\n const suggestions: CompositionSuggestion[] = [];\n const guidelines: CompositionGuideline[] = [];\n\n // Track suggestions to avoid duplicates\n const suggestedSet = new Set<string>();\n\n for (const name of components) {\n const fragment = fragments[name];\n\n // 2. Relation checks\n if (fragment.relations) {\n for (const rel of fragment.relations) {\n switch (rel.relationship) {\n case \"parent\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_parent\",\n component: name,\n message: `\"${name}\" expects to be wrapped by \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"child\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${name}\" typically contains \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"child\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"composition\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_composition\",\n component: name,\n message: `\"${name}\" is typically used together with \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"sibling\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${rel.component}\" is a sibling of \"${name}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"sibling\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"alternative\":\n if (selectedSet.has(rel.component)) {\n warnings.push({\n type: \"redundant_alternative\",\n component: name,\n message: `\"${name}\" and \"${rel.component}\" are alternatives — using both may be redundant${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n }\n }\n }\n\n // 3. Usage conflict checks (whenNot)\n if (fragment.usage?.whenNot) {\n for (const whenNotEntry of fragment.usage.whenNot) {\n const lower = whenNotEntry.toLowerCase();\n for (const other of components) {\n if (other !== name && lower.includes(other.toLowerCase())) {\n guidelines.push({\n component: name,\n guideline: `Potential conflict with \"${other}\": ${whenNotEntry}`,\n });\n }\n }\n }\n }\n\n // 4. Status warnings\n if (fragment.meta.status === \"deprecated\") {\n warnings.push({\n type: \"deprecated\",\n component: name,\n message: fragment.meta.description\n ? `\"${name}\" is deprecated: ${fragment.meta.description}`\n : `\"${name}\" is deprecated`,\n });\n } else if (fragment.meta.status === \"experimental\") {\n warnings.push({\n type: \"experimental\",\n component: name,\n message: `\"${name}\" is experimental and may change without notice`,\n });\n }\n }\n\n // 5. Category gap analysis\n const selectedCategories = new Set(\n components.map((name) => fragments[name].meta.category)\n );\n\n for (const [category, affinities] of Object.entries(CATEGORY_AFFINITIES)) {\n if (!selectedCategories.has(category)) continue;\n\n for (const neededCategory of affinities) {\n if (selectedCategories.has(neededCategory)) continue;\n\n // Find the best component from the needed category\n const candidate = findBestCategoryCandidate(\n fragments,\n neededCategory,\n selectedSet,\n suggestedSet\n );\n if (candidate) {\n suggestions.push({\n component: candidate,\n reason: `Compositions using \"${category}\" components often benefit from a \"${neededCategory}\" component`,\n relationship: \"category_gap\",\n sourceComponent: components.find(\n (n) => fragments[n].meta.category === category\n )!,\n });\n suggestedSet.add(candidate);\n }\n }\n }\n\n // 6. Graph-enhanced analysis (when graph data is available)\n if (options?.graph) {\n const engine = new ComponentGraphEngine(options.graph);\n\n // Add graph-based dependency warnings\n for (const name of components) {\n const deps = engine.dependencies(name, [\"imports\", \"hook-depends\"]);\n for (const dep of deps) {\n if (\n !selectedSet.has(dep.target) &&\n !suggestedSet.has(dep.target) &&\n allNames.has(dep.target)\n ) {\n suggestions.push({\n component: dep.target,\n reason: `\"${name}\" ${dep.type === \"hook-depends\" ? \"uses a hook from\" : \"imports\"} \"${dep.target}\"`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(dep.target);\n }\n }\n }\n\n // Add block-based suggestions\n for (const name of components) {\n const blocks = engine.blocksUsing(name);\n for (const blockName of blocks) {\n // Find other components in this block that aren't selected\n const blockComps = options.graph.edges\n .filter(\n (e) =>\n e.type === \"composes\" &&\n e.provenance === `block:${blockName}` &&\n (e.source === name || e.target === name)\n )\n .map((e) => (e.source === name ? e.target : e.source));\n\n for (const comp of blockComps) {\n if (\n !selectedSet.has(comp) &&\n !suggestedSet.has(comp) &&\n allNames.has(comp)\n ) {\n suggestions.push({\n component: comp,\n reason: `\"${name}\" and \"${comp}\" are used together in the \"${blockName}\" block`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(comp);\n }\n }\n }\n }\n }\n\n return { components, unknown, warnings, suggestions, guidelines };\n}\n\n/**\n * Find the best candidate component from a given category.\n * Prefers stable components and avoids already-selected or already-suggested ones.\n */\nfunction findBestCategoryCandidate(\n fragments: Record<string, CompiledFragment>,\n category: string,\n selectedSet: Set<string>,\n suggestedSet: Set<string>\n): string | null {\n let best: string | null = null;\n let bestScore = -1;\n\n for (const [name, fragment] of Object.entries(fragments)) {\n if (fragment.meta.category !== category) continue;\n if (selectedSet.has(name) || suggestedSet.has(name)) continue;\n\n const status = fragment.meta.status ?? \"stable\";\n let score = 0;\n if (status === \"stable\") score = 3;\n else if (status === \"beta\") score = 2;\n else if (status === \"experimental\") score = 1;\n // deprecated gets 0\n\n if (score > bestScore) {\n bestScore = score;\n best = name;\n }\n }\n\n return best;\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { VariantLoader, VariantRenderOptions } from \"./types.js\";\n\n/**\n * Minimal contract for rendering a preview variant.\n * Compatible with fragment variants and Storybook-adapted variants.\n */\nexport interface PreviewVariantLike {\n render: (options?: VariantRenderOptions) => ReactNode;\n loaders?: VariantLoader[];\n}\n\nexport interface PreviewRuntimeState {\n content: ReactNode | null;\n isLoading: boolean;\n error: Error | null;\n loadedData?: Record<string, unknown>;\n}\n\nexport interface PreviewRuntimeOptions {\n variant?: PreviewVariantLike | null;\n loadedData?: Record<string, unknown>;\n}\n\nconst EMPTY_STATE: PreviewRuntimeState = {\n content: null,\n isLoading: false,\n error: null,\n loadedData: undefined,\n};\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Execute all variant loaders and merge their payloads.\n * `loadedData` is applied last so host-level overrides win.\n */\nexport async function executeVariantLoaders(\n loaders: VariantLoader[] | undefined,\n loadedData?: Record<string, unknown>,\n): Promise<Record<string, unknown> | undefined> {\n const hasLoaders = !!loaders && loaders.length > 0;\n if (!hasLoaders) {\n return loadedData;\n }\n\n const results = await Promise.all(loaders.map((loader) => loader()));\n const mergedFromLoaders = results.reduce<Record<string, unknown>>(\n (acc, result) => ({ ...acc, ...result }),\n {},\n );\n\n return loadedData ? { ...mergedFromLoaders, ...loadedData } : mergedFromLoaders;\n}\n\n/**\n * Resolve a full runtime state (loader execution + render) in one async call.\n * This is useful for testing and for hook/component orchestration.\n */\nexport async function resolvePreviewRuntimeState(\n options: PreviewRuntimeOptions,\n): Promise<PreviewRuntimeState> {\n const { variant, loadedData } = options;\n if (!variant) {\n return EMPTY_STATE;\n }\n\n try {\n const mergedLoadedData = await executeVariantLoaders(variant.loaders, loadedData);\n const content = variant.render({ loadedData: mergedLoadedData });\n return {\n content,\n isLoading: false,\n error: null,\n loadedData: mergedLoadedData,\n };\n } catch (error) {\n return {\n content: null,\n isLoading: false,\n error: toError(error),\n loadedData: undefined,\n };\n }\n}\n\n/**\n * Hook for rendering a preview variant with loader support.\n */\nexport function usePreviewVariantRuntime(\n options: PreviewRuntimeOptions,\n): PreviewRuntimeState {\n const { variant, loadedData } = options;\n const [state, setState] = useState<PreviewRuntimeState>(EMPTY_STATE);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!variant) {\n setState(EMPTY_STATE);\n return () => {\n cancelled = true;\n };\n }\n\n const hasLoaders = !!variant.loaders && variant.loaders.length > 0;\n setState({\n content: null,\n isLoading: hasLoaders,\n error: null,\n loadedData: undefined,\n });\n\n resolvePreviewRuntimeState({ variant, loadedData }).then((nextState) => {\n if (!cancelled) {\n setState(nextState);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [variant, loadedData]);\n\n return state;\n}\n\ninterface PreviewVariantRuntimeProps extends PreviewRuntimeOptions {\n children: (state: PreviewRuntimeState) => ReactNode;\n}\n\n/**\n * Render-prop component wrapper around `usePreviewVariantRuntime`.\n */\nexport function PreviewVariantRuntime({\n variant,\n loadedData,\n children,\n}: PreviewVariantRuntimeProps) {\n const state = usePreviewVariantRuntime({ variant, loadedData });\n return <>{children(state)}</>;\n}\n","/**\n * Component discovery utilities.\n *\n * Extracted from the docs app component-registry so that any consumer\n * (govern presets, CLI tools, third-party integrations) can discover\n * components from a module's exports without duplicating the logic.\n */\n\n/**\n * Check if a value is likely a React component.\n * Functions or objects with $$typeof (forwardRef, memo) qualify.\n */\nexport function isReactComponent(value: unknown): boolean {\n if (!value) return false;\n\n // Function component (most common case)\n if (typeof value === 'function') {\n return true;\n }\n\n // ForwardRef, memo, etc. have $$typeof\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (obj.$$typeof) return true;\n }\n\n return false;\n}\n\nexport interface DiscoverComponentsOptions {\n /** Set of export names to skip */\n exclude?: Set<string>;\n}\n\n/**\n * Discover all components and sub-components from a module's exports.\n * Returns a sorted array of component names including compound names (e.g. 'Card.Header').\n *\n * @param moduleExports - The exports object from a component library (e.g. `import * as UI from '@usefragments/ui'`)\n * @param options - Optional configuration\n */\nexport function discoverComponents(\n moduleExports: Record<string, unknown>,\n options?: DiscoverComponentsOptions,\n): string[] {\n const exclude = options?.exclude;\n const names: string[] = [];\n\n for (const [exportName, exportValue] of Object.entries(moduleExports)) {\n // Skip excluded exports\n if (exclude?.has(exportName)) continue;\n\n // Skip non-components (types, constants, etc.)\n if (!isReactComponent(exportValue)) continue;\n\n // Skip lowercase exports (likely utilities)\n if (exportName[0] !== exportName[0].toUpperCase()) continue;\n\n // Add the main component\n names.push(exportName);\n\n // Check for sub-components by looking at ALL properties of the component\n const componentObj = exportValue as Record<string, unknown>;\n\n for (const key of Object.keys(componentObj)) {\n // Skip internal properties and non-component properties\n if (key.startsWith('_') || key.startsWith('$')) continue;\n if (key === 'displayName' || key === 'propTypes' || key === 'defaultProps') continue;\n // Skip 'render' which is a forwardRef internal, and 'Tabbed' which is a special variant\n if (key === 'render' || key === 'Tabbed') continue;\n\n const subComponent = componentObj[key];\n if (isReactComponent(subComponent)) {\n names.push(`${exportName}.${key}`);\n }\n }\n }\n\n return names.sort();\n}\n","/**\n * Finding builder — assembles a `Finding` and computes its fingerprint.\n *\n * The fingerprint is a content-addressed hash of a small identity tuple chosen\n * by each rule. It is *not* the source location: two findings at different\n * lines for the same offending value should have different fingerprints, but\n * adding a blank line above them must not change either fingerprint. Rules\n * pick identity inputs that capture \"what's wrong\" (file, ruleId, componentId,\n * prop, property, value) without leaning on lineNumber/column.\n */\n\nimport type { GovernanceSeverity } from \"../governance.js\";\nimport type { FactEvidence, FactLocation } from \"../facts/index.js\";\nimport { canonicalJson, hash64Hex } from \"../facts/ids.js\";\nimport { byRuleId } from \"../codes/index.js\";\nimport { normalizeFinding, normalizeSeverity } from \"../schemas/index.js\";\nimport type { Severity } from \"../schemas/index.js\";\n\nimport type { Finding, FindingFix } from \"./types.js\";\n\nexport interface MakeFindingInput {\n ruleId: string;\n ruleVersion: string;\n severity: GovernanceSeverity | Severity;\n message: string;\n location: FactLocation;\n evidence: FactEvidence[];\n fingerprintIdentity: Record<string, unknown>;\n fix?: FindingFix;\n attributes?: Record<string, unknown>;\n}\n\nexport function makeFinding(input: MakeFindingInput): Finding {\n if (input.evidence.length === 0) {\n throw new Error(`makeFinding(${input.ruleId}): findings must carry at least one evidence fact`);\n }\n const fingerprint = hash64Hex(\n canonicalJson({ ruleId: input.ruleId, ...input.fingerprintIdentity })\n );\n const code = byRuleId.get(input.ruleId);\n return normalizeFinding({\n ruleId: input.ruleId,\n ruleVersion: input.ruleVersion,\n severity: normalizeSeverity(input.severity),\n code: code?.code,\n helpUrl: code?.explainUrl,\n message: input.message,\n fingerprint,\n location: input.location,\n evidence: input.evidence,\n fix: input.fix,\n attributes: input.attributes,\n });\n}\n","/**\n * Rule helpers — small internal queries shared by Phase 5 rules.\n *\n * These live next to the rules instead of on `FactIndex` until they prove\n * useful for two or more rules. The plan is to lift them onto the index only\n * when a third caller appears.\n */\n\nimport type {\n Fact,\n FactId,\n FactIndex,\n StyleDeclarationFact,\n TokenDefinitionFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n UsageTextChildFact,\n} from \"../facts/index.js\";\n\nexport interface LengthScale {\n unit: \"px\" | \"rem\";\n rootFontSizePx?: number;\n emBasePx?: number;\n}\n\n/** Group `usage_prop_resolved` facts by their parent `usage_node` id. */\nexport function indexPropsByNodeId(ix: FactIndex): Map<FactId, UsagePropResolvedFact[]> {\n const out = new Map<FactId, UsagePropResolvedFact[]>();\n for (const fact of ix.byKind(\"usage_prop_resolved\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Group `usage_text_child` facts by their parent `usage_node` id. */\nexport function indexTextChildrenByNodeId(ix: FactIndex): Map<FactId, UsageTextChildFact[]> {\n const out = new Map<FactId, UsageTextChildFact[]>();\n for (const fact of ix.byKind(\"usage_text_child\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Group `usage_inline_style` facts by their parent `usage_node` id. */\nexport function indexInlineStylesByNodeId(ix: FactIndex): Map<FactId, UsageInlineStyleFact[]> {\n const out = new Map<FactId, UsageInlineStyleFact[]>();\n for (const fact of ix.byKind(\"usage_inline_style\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Map `usage_component` records by their `nodeId` for fast component lookup. */\nexport function indexComponentByNodeId(ix: FactIndex): Map<FactId, UsageComponentFact> {\n const out = new Map<FactId, UsageComponentFact>();\n for (const fact of ix.byKind(\"usage_component\")) {\n out.set(fact.nodeId, fact);\n }\n return out;\n}\n\n/**\n * A region: a container node paired with every `usage_node` nested beneath it\n * within the same root tree. Membership is decided purely by `nodePath` — no\n * component identity, no framework knowledge — so the same grouping works for\n * any adapter that emits conformant paths.\n */\nexport interface Region {\n /** The container node whose `nodePath` is a strict prefix of every member. */\n container: UsageNodeFact;\n /** Every node strictly nested beneath the container, at any depth. */\n members: UsageNodeFact[];\n}\n\n/**\n * Group `usage_node` facts into regions by shared `nodePath` prefix.\n *\n * Every node is treated as a potential container; a node B is a member of node\n * A's region iff A's path segments are a *strict* prefix of B's and both share\n * the same `(file, rootIndex)`. The consuming rule decides which containers\n * matter via its region selector — this helper does not interpret what a\n * container \"is.\"\n *\n * `nodePath` segments are opaque. The path is split into a leading `rootIndex`\n * token (everything before the first `:`) and `/`-joined segments; only whole\n * segments are compared. The `expr:` / `attr:` / `jsx:` tokens a JSX adapter\n * encodes inside a segment are never parsed — that is what keeps this helper\n * framework-blind (per the usage-node-fact contract). Non-conformant paths are\n * skipped rather than mis-grouped.\n *\n * Cost is O(nodes²) within one `(file, rootIndex)` bucket (each path is parsed\n * once up front); root trees are small in practice, so this stays well inside\n * the per-file scan budget.\n */\nexport function regionsByPrefix(ix: FactIndex): Region[] {\n // Bucket by (file, rootIndex) so a prefix comparison never crosses root\n // trees — separate roots in one file restart segment numbering, so their\n // paths can collide segment-for-segment without actually being nested.\n const buckets = new Map<string, Array<{ fact: UsageNodeFact; segments: string[] }>>();\n for (const fact of ix.byKind(\"usage_node\")) {\n const parsed = parseNodePath(fact.nodePath);\n if (!parsed) continue;\n // rootIndex is colon-free (it is the token before nodePath's first \":\"), so\n // putting it first lets that \":\" cleanly delimit it from the free-form file.\n const key = `${parsed.rootIndex}:${fact.file}`;\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = [];\n buckets.set(key, bucket);\n }\n bucket.push({ fact, segments: parsed.segments });\n }\n\n const regions: Region[] = [];\n for (const bucket of buckets.values()) {\n for (const candidate of bucket) {\n const members: UsageNodeFact[] = [];\n for (const other of bucket) {\n if (other !== candidate && isStrictSegmentPrefix(candidate.segments, other.segments)) {\n members.push(other.fact);\n }\n }\n regions.push({ container: candidate.fact, members });\n }\n }\n return regions;\n}\n\n/**\n * Split a `nodePath` into its leading `rootIndex` token and whole segments.\n * Returns `null` for a path with no `rootIndex:` prefix (non-conformant — e.g.\n * a future non-React adapter that hasn't adopted the contract); the caller\n * skips those rather than risk mis-grouping. Segments are never split below the\n * `/` boundary, keeping `expr:` / `attr:` / `jsx:` tokens opaque.\n */\nfunction parseNodePath(nodePath: string): { rootIndex: string; segments: string[] } | null {\n const colon = nodePath.indexOf(\":\");\n if (colon === -1) return null;\n const rest = nodePath.slice(colon + 1);\n return {\n rootIndex: nodePath.slice(0, colon),\n segments: rest === \"\" ? [] : rest.split(\"/\"),\n };\n}\n\n/** Whether `prefix` is a strict (shorter) whole-segment prefix of `full`. */\nfunction isStrictSegmentPrefix(prefix: readonly string[], full: readonly string[]): boolean {\n if (prefix.length >= full.length) return false;\n for (let i = 0; i < prefix.length; i++) {\n if (prefix[i] !== full[i]) return false;\n }\n return true;\n}\n\n/** Read a `usage_node` fact through the index and narrow the kind. */\nexport function readUsageNode(ix: FactIndex, id: FactId): UsageNodeFact | undefined {\n const fact: Fact | undefined = ix.get(id);\n return fact && fact.kind === \"usage_node\" ? fact : undefined;\n}\n\n/** Read a `style_declaration` fact through the index and narrow the kind. */\nexport function readStyleDeclaration(ix: FactIndex, id: FactId): StyleDeclarationFact | undefined {\n const fact: Fact | undefined = ix.get(id);\n return fact && fact.kind === \"style_declaration\" ? fact : undefined;\n}\n\n/**\n * The set of CSS custom-property names a token vocabulary defines, normalized to\n * `--`-prefixed form. Shared by the token-vocabulary rules\n * (`require-dual-fallback`, `css-vars-must-be-defined`).\n */\nexport function cssVariableNames(tokens: readonly TokenDefinitionFact[]): Set<string> {\n const names = new Set<string>();\n for (const token of tokens) {\n names.add(token.name.startsWith(\"--\") ? token.name : `--${token.name}`);\n }\n return names;\n}\n\n/**\n * The prefix families of a token vocabulary — the namespace each token name\n * declares, up to and including the first hyphen after the leading `--`\n * (`--fui-color-accent` → `--fui-`). A single-segment token (`--accent`, no\n * namespace) contributes no family. Used to decide whether an unknown `var(--x)`\n * is \"shaped like a contract token\" (off-contract drift) or a genuinely foreign\n * custom property (`--swiper-*`, `--radix-*`, layout/animation vars — ignored).\n */\nexport function contractPrefixFamilies(names: ReadonlySet<string>): Set<string> {\n const families = new Set<string>();\n for (const name of names) {\n const hyphen = name.indexOf(\"-\", 2);\n if (hyphen === -1) continue;\n families.add(name.slice(0, hyphen + 1));\n }\n return families;\n}\n\n/**\n * Universal JSX props that pass `components/unknown-prop` regardless of the\n * component's prop schema. These are React/DOM concerns, not design system\n * concerns, and asking authors to declare them in `*.fragment.ts` would noise\n * up every component.\n */\nconst UNIVERSAL_JSX_PROPS = new Set([\n \"key\",\n \"ref\",\n \"children\",\n \"className\",\n \"style\",\n \"id\",\n \"role\",\n \"tabIndex\",\n \"title\",\n \"slot\",\n \"lang\",\n \"dir\",\n \"hidden\",\n \"draggable\",\n \"spellCheck\",\n \"translate\",\n \"contentEditable\",\n \"suppressContentEditableWarning\",\n \"suppressHydrationWarning\",\n]);\n\nexport function isUniversalJsxProp(prop: string): boolean {\n if (UNIVERSAL_JSX_PROPS.has(prop)) return true;\n if (prop.startsWith(\"aria-\")) return true;\n if (prop.startsWith(\"data-\")) return true;\n if (prop.startsWith(\"on\") && prop.length > 2 && prop[2] === prop[2].toUpperCase()) {\n return true;\n }\n return false;\n}\n\n/**\n * Parse a length-ish CSS value (e.g., `13px`, `13`, `1.5rem`, `0`) into a\n * numeric value and unit. Returns `null` for values that include CSS function\n * calls, multi-value shorthands, or anything else that can't be cleanly\n * compared against a numeric scale.\n */\nexport function parseLengthValue(\n raw: string\n): { value: number; unit: \"px\" | \"rem\" | \"em\" | null } | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const match = /^(-?\\d+(?:\\.\\d+)?)(px|rem|em)?$/i.exec(trimmed);\n if (!match) return null;\n const value = Number.parseFloat(match[1]);\n if (!Number.isFinite(value)) return null;\n const rawUnit = match[2]?.toLowerCase();\n const unit = rawUnit === \"px\" || rawUnit === \"rem\" || rawUnit === \"em\" ? rawUnit : null;\n return { value, unit };\n}\n\nexport type ParsedLengthValue = NonNullable<ReturnType<typeof parseLengthValue>>;\n\nexport function matchesScale(value: number, allowed: readonly number[]): boolean {\n const magnitude = Math.abs(value);\n if (magnitude === 0) return allowed.includes(0);\n return allowed.includes(magnitude);\n}\n\nexport function normalizeLengthForScale(\n parsed: ParsedLengthValue,\n scale: LengthScale\n): {\n value: number;\n deterministicFix: boolean;\n assumedRootFontSizePx?: number;\n assumedEmBasePx?: number;\n} | null {\n const unit = parsed.unit ?? scale.unit;\n if (unit === scale.unit) {\n return { value: parsed.value, deterministicFix: true };\n }\n\n if (scale.unit === \"px\" && unit === \"rem\") {\n const explicit = scale.rootFontSizePx !== undefined;\n const rootFontSizePx = scale.rootFontSizePx ?? 16;\n return {\n value: parsed.value * rootFontSizePx,\n deterministicFix: explicit,\n assumedRootFontSizePx: explicit ? undefined : rootFontSizePx,\n };\n }\n\n if (scale.unit === \"px\" && unit === \"em\") {\n const explicit = scale.emBasePx !== undefined;\n const emBasePx = scale.emBasePx ?? scale.rootFontSizePx ?? 16;\n return {\n value: parsed.value * emBasePx,\n deterministicFix: explicit,\n assumedEmBasePx: explicit ? undefined : emBasePx,\n };\n }\n\n if (scale.unit === \"rem\" && unit === \"px\") {\n const explicit = scale.rootFontSizePx !== undefined;\n if (!explicit) return null;\n return {\n value: parsed.value / scale.rootFontSizePx!,\n deterministicFix: true,\n };\n }\n\n return null;\n}\n\nexport function nearestScaleValue(value: number, allowed: readonly number[]): number | null {\n if (allowed.length === 0) return null;\n let best = allowed[0];\n let bestDelta = Math.abs(value - best);\n for (let i = 1; i < allowed.length; i++) {\n const candidate = allowed[i];\n const delta = Math.abs(value - candidate);\n if (delta < bestDelta || (delta === bestDelta && candidate < best)) {\n best = candidate;\n bestDelta = delta;\n }\n }\n return best;\n}\n\nexport function nearestSignedScaleValue(value: number, allowed: readonly number[]): number | null {\n const nearest = nearestScaleValue(Math.abs(value), allowed);\n if (nearest === null) return null;\n if (nearest === 0) return 0;\n return value < 0 ? -nearest : nearest;\n}\n\n/**\n * Detect whether a CSS value contains a raw color literal — hex, rgb/rgba,\n * hsl/hsla, or a named color. Returns the color literal so the rule can quote\n * it in the message and as a fingerprint input. Returns `null` for token\n * references (`var(--...)`) and for values that don't look like a color.\n */\nexport function detectRawColor(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n\n // A hex/color literal sitting inside a `var(--token, <fallback>)` expression\n // is the *fallback*, not a raw color — flagging it both produces false\n // positives on shorthands (`border: 1px solid var(--x, #hex)`) and fights the\n // dual-fallback rule, which mandates exactly that literal. Strip every var()\n // expression (innermost-first, so nested fallbacks are handled) before\n // scanning, so only a literal *outside* any var() is treated as raw.\n const scanned = stripVarExpressions(trimmed);\n if (!scanned.trim()) return null;\n\n const hex = /#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})\\b/i.exec(scanned);\n if (hex) return hex[0];\n\n const fn = /(rgb|rgba|hsl|hsla)\\s*\\([^)]*\\)/i.exec(scanned);\n if (fn) return fn[0];\n\n for (const part of scanned.split(/\\s+/)) {\n const lower = part.toLowerCase();\n if (/^[a-z]+$/i.test(lower) && CSS_NAMED_COLORS.has(lower)) {\n return lower;\n }\n }\n\n return null;\n}\n\n/**\n * Remove every `var(--token, …)` expression from a CSS value, innermost-first,\n * so a literal inside a var() fallback is not mistaken for a raw color. A bare\n * `var(--token)` (no fallback) also disappears, preserving the previous\n * behavior of exempting whole-value token references.\n */\nfunction stripVarExpressions(value: string): string {\n let out = value;\n const innermost = /var\\([^()]*\\)/gi;\n // Iterate so nested fallbacks (`var(--a, var(--b, #fff))`) collapse fully.\n for (let i = 0; i < 10 && innermost.test(out); i += 1) {\n out = out.replace(innermost, \" \");\n innermost.lastIndex = 0;\n }\n return out;\n}\n\nconst CSS_NAMED_COLORS = new Set([\n \"aliceblue\",\n \"antiquewhite\",\n \"aqua\",\n \"aquamarine\",\n \"azure\",\n \"beige\",\n \"bisque\",\n \"black\",\n \"blanchedalmond\",\n \"blue\",\n \"blueviolet\",\n \"brown\",\n \"burlywood\",\n \"cadetblue\",\n \"chartreuse\",\n \"chocolate\",\n \"coral\",\n \"cornflowerblue\",\n \"cornsilk\",\n \"crimson\",\n \"cyan\",\n \"darkblue\",\n \"darkcyan\",\n \"darkgoldenrod\",\n \"darkgray\",\n \"darkgreen\",\n \"darkgrey\",\n \"darkkhaki\",\n \"darkmagenta\",\n \"darkolivegreen\",\n \"darkorange\",\n \"darkorchid\",\n \"darkred\",\n \"darksalmon\",\n \"darkseagreen\",\n \"darkslateblue\",\n \"darkslategray\",\n \"darkslategrey\",\n \"darkturquoise\",\n \"darkviolet\",\n \"deeppink\",\n \"deepskyblue\",\n \"dimgray\",\n \"dimgrey\",\n \"dodgerblue\",\n \"firebrick\",\n \"floralwhite\",\n \"forestgreen\",\n \"fuchsia\",\n \"gainsboro\",\n \"ghostwhite\",\n \"gold\",\n \"goldenrod\",\n \"gray\",\n \"green\",\n \"greenyellow\",\n \"grey\",\n \"honeydew\",\n \"hotpink\",\n \"indianred\",\n \"indigo\",\n \"ivory\",\n \"khaki\",\n \"lavender\",\n \"lavenderblush\",\n \"lawngreen\",\n \"lemonchiffon\",\n \"lightblue\",\n \"lightcoral\",\n \"lightcyan\",\n \"lightgoldenrodyellow\",\n \"lightgray\",\n \"lightgreen\",\n \"lightgrey\",\n \"lightpink\",\n \"lightsalmon\",\n \"lightseagreen\",\n \"lightskyblue\",\n \"lightslategray\",\n \"lightslategrey\",\n \"lightsteelblue\",\n \"lightyellow\",\n \"lime\",\n \"limegreen\",\n \"linen\",\n \"magenta\",\n \"maroon\",\n \"mediumaquamarine\",\n \"mediumblue\",\n \"mediumorchid\",\n \"mediumpurple\",\n \"mediumseagreen\",\n \"mediumslateblue\",\n \"mediumspringgreen\",\n \"mediumturquoise\",\n \"mediumvioletred\",\n \"midnightblue\",\n \"mintcream\",\n \"mistyrose\",\n \"moccasin\",\n \"navajowhite\",\n \"navy\",\n \"oldlace\",\n \"olive\",\n \"olivedrab\",\n \"orange\",\n \"orangered\",\n \"orchid\",\n \"palegoldenrod\",\n \"palegreen\",\n \"paleturquoise\",\n \"palevioletred\",\n \"papayawhip\",\n \"peachpuff\",\n \"peru\",\n \"pink\",\n \"plum\",\n \"powderblue\",\n \"purple\",\n \"rebeccapurple\",\n \"red\",\n \"rosybrown\",\n \"royalblue\",\n \"saddlebrown\",\n \"salmon\",\n \"sandybrown\",\n \"seagreen\",\n \"seashell\",\n \"sienna\",\n \"silver\",\n \"skyblue\",\n \"slateblue\",\n \"slategray\",\n \"slategrey\",\n \"snow\",\n \"springgreen\",\n \"steelblue\",\n \"tan\",\n \"teal\",\n \"thistle\",\n \"tomato\",\n \"turquoise\",\n \"violet\",\n \"wheat\",\n \"white\",\n \"whitesmoke\",\n \"yellow\",\n \"yellowgreen\",\n]);\n\n/**\n * Default exemptions for raw color rule. Combines policy-supplied `except`\n * with universally meaningful keywords that aren't true colors.\n */\nexport const COLOR_KEYWORD_EXEMPTIONS = new Set([\n \"transparent\",\n \"currentcolor\",\n \"inherit\",\n \"initial\",\n \"unset\",\n]);\n\nexport function isExemptColor(value: string, except: readonly string[]): boolean {\n const lower = value.trim().toLowerCase();\n if (COLOR_KEYWORD_EXEMPTIONS.has(lower)) return true;\n for (const ex of except) {\n if (ex.toLowerCase() === lower) return true;\n }\n return false;\n}\n\n/**\n * Render a token name as the reference an author would write: SCSS `$vars`\n * pass through, dotted/bare names become a `var(--…)` custom property. Shared by\n * the color and spacing rules so a \"use the token\" fix is expressed the same way\n * everywhere.\n */\nexport function tokenReference(name: string): string {\n if (name.startsWith(\"$\")) return name;\n const cssVarName = name.startsWith(\"--\") ? name : `--${name.replace(/\\./g, \"-\")}`;\n return `var(${cssVarName})`;\n}\n\n/**\n * Whether a token reference can be *applied* automatically (written verbatim\n * and still compile). A `css-var` / `scss-var` token resolves on its own; a\n * `scss-map` member (synthetic `$colors-primary` minted from a Sass map) or a\n * `dtcg` JSON token (no CSS custom property emitted by default) does not, so\n * those fixes are surfaced as suggestions rather than deterministic rewrites.\n * Tokens without a known format (legacy/hand-built facts) are treated as safe.\n */\nexport function isApplicableTokenReference(\n referenceFormat: TokenDefinitionFact[\"referenceFormat\"]\n): boolean {\n return (\n referenceFormat === undefined || referenceFormat === \"css-var\" || referenceFormat === \"scss-var\"\n );\n}\n","/**\n * `a11y/required-accessible-name` — fires for components with an\n * `a11y.requireName` policy whose JSX usage has no discoverable accessible\n * name.\n *\n * Accepted name sources (any one is enough):\n * - non-empty `usage_text_child` content\n * - `aria-label=\"...\"` (static or dynamic both pass; we cannot prove a\n * dynamic value is empty at scan time)\n * - `aria-labelledby={...}`\n * - `title=\"...\"`\n *\n * Components that explicitly opt out via `aria-hidden=\"true\"` are skipped —\n * they are not part of the accessibility tree.\n */\n\nimport type { FactIndex, UsagePropResolvedFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexPropsByNodeId, indexTextChildrenByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"a11y/required-accessible-name\";\nexport const RULE_VERSION = \"1\";\n\nconst NAME_SOURCE_PROPS = new Set([\"aria-label\", \"aria-labelledby\", \"title\"]);\n\nexport function ruleA11yRequiredAccessibleName(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n const propsByNode = indexPropsByNodeId(ix);\n const textByNode = indexTextChildrenByNodeId(ix);\n\n for (const usageComponent of ix.byKind(\"usage_component\")) {\n const policy = ix.policy.a11yNameRequired(usageComponent.componentId);\n if (!policy) continue;\n\n const node = readUsageNode(ix, usageComponent.nodeId);\n if (!node) continue;\n\n const props = propsByNode.get(node.id) ?? [];\n if (props.some(isAriaHidden)) continue;\n\n if (hasAccessibleName(props, textByNode.get(node.id) ?? [])) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `<${node.element}> has no accessible name. ${policy.because}`.trim(),\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n },\n attributes: {\n componentId: usageComponent.componentId,\n element: node.element,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction hasAccessibleName(\n props: UsagePropResolvedFact[],\n textChildren: ReadonlyArray<{ text: string }>\n): boolean {\n for (const child of textChildren) {\n if (typeof child.text === \"string\" && child.text.trim().length > 0) return true;\n }\n for (const prop of props) {\n if (!NAME_SOURCE_PROPS.has(prop.prop)) continue;\n if (prop.resolution === \"spread\") continue;\n if (prop.resolution === \"dynamic\") return true;\n if (prop.resolution === \"static\") {\n if (typeof prop.value === \"string\" && prop.value.trim().length > 0) return true;\n if (prop.value !== undefined && prop.value !== \"\" && prop.value !== null) return true;\n }\n }\n return false;\n}\n\nfunction isAriaHidden(prop: UsagePropResolvedFact): boolean {\n if (prop.prop !== \"aria-hidden\") return false;\n if (prop.resolution !== \"static\") return false;\n return prop.value === true || prop.value === \"true\";\n}\n","export type RawHtmlPrecisionTier =\n | \"exact-html\"\n | \"html-advisory\"\n | \"input-type\"\n | \"role-reimpl\"\n | \"interactive-nonsemantic\"\n | \"icon-only\";\n\nexport interface RawHtmlCanonicalMatch {\n canonical: string;\n tier: RawHtmlPrecisionTier;\n}\n\nconst EXACT_HTML_CANONICALS = new Map<string, string>([[\"button\", \"Button\"]]);\n\nconst ADVISORY_HTML_CANONICALS = new Map<string, string>([\n [\"textarea\", \"Textarea\"],\n [\"select\", \"Select\"],\n [\"dialog\", \"Dialog\"],\n [\"progress\", \"Progress\"],\n [\"details\", \"Collapsible\"],\n [\"table\", \"Table\"],\n]);\n\nconst INPUT_TYPE_CANONICALS = new Map<string, string>([\n [\"checkbox\", \"Checkbox\"],\n [\"radio\", \"Radio\"],\n [\"number\", \"NumberInput\"],\n [\"password\", \"PasswordInput\"],\n [\"range\", \"Slider\"],\n]);\n\nconst ROLE_CANONICALS = new Map<string, string>([\n [\"button\", \"Button\"],\n [\"checkbox\", \"Checkbox\"],\n [\"radio\", \"Radio\"],\n [\"switch\", \"Switch\"],\n [\"tab\", \"Tabs\"],\n [\"tablist\", \"Tabs\"],\n [\"dialog\", \"Dialog\"],\n [\"menu\", \"Menu\"],\n [\"status\", \"Alert\"],\n]);\n\nexport const RAW_HTML_CANONICAL_TAGS = Object.freeze(\n Array.from(EXACT_HTML_CANONICALS, ([tagName, canonical]) => ({\n tagName,\n canonical,\n tier: \"exact-html\" as const,\n }))\n);\n\nexport const RAW_HTML_ADVISORY_TAGS = Object.freeze(\n Array.from(ADVISORY_HTML_CANONICALS, ([tagName, canonical]) => ({\n tagName,\n canonical,\n tier: \"html-advisory\" as const,\n }))\n);\n\nexport const RAW_HTML_INPUT_TYPE_CANONICALS = Object.freeze(\n Array.from(INPUT_TYPE_CANONICALS, ([type, canonical]) => ({\n type,\n canonical,\n tier: \"input-type\" as const,\n }))\n);\n\nexport const RAW_HTML_ROLE_CANONICALS = Object.freeze(\n Array.from(ROLE_CANONICALS, ([role, canonical]) => ({\n role,\n canonical,\n tier: \"role-reimpl\" as const,\n }))\n);\n\nexport function resolveCanonicalForRawHtml(\n tagName: string,\n inputType?: string\n): RawHtmlCanonicalMatch | null {\n const tag = tagName.toLowerCase();\n if (tag === \"input\") {\n const normalizedType = inputType?.trim().toLowerCase();\n if (!normalizedType) return null;\n const canonical = INPUT_TYPE_CANONICALS.get(normalizedType);\n return canonical ? { canonical, tier: \"input-type\" } : null;\n }\n\n const exactCanonical = EXACT_HTML_CANONICALS.get(tag);\n if (exactCanonical) return { canonical: exactCanonical, tier: \"exact-html\" };\n const advisoryCanonical = ADVISORY_HTML_CANONICALS.get(tag);\n return advisoryCanonical ? { canonical: advisoryCanonical, tier: \"html-advisory\" } : null;\n}\n\nexport function resolveCanonicalForAriaRole(role: string): RawHtmlCanonicalMatch | null {\n const canonical = ROLE_CANONICALS.get(role.trim().toLowerCase());\n return canonical ? { canonical, tier: \"role-reimpl\" } : null;\n}\n\nexport function isRawHtmlAdvisoryTier(tier: RawHtmlPrecisionTier): boolean {\n return (\n tier === \"html-advisory\" ||\n tier === \"role-reimpl\" ||\n tier === \"interactive-nonsemantic\" ||\n tier === \"icon-only\"\n );\n}\n\n/**\n * Low-frequency, typically-1:1 semantic tags where a per-component inferred\n * `htmlEquivalent` mapping is safe even with a custom-named component\n * (`<dialog>` → Modal). Mirrors `ADVISORY_HTML_CANONICALS` + the `input` family.\n *\n * Deliberately EXCLUDES generic structural containers (`div`, `span`) and the\n * ambiguous common tags (`button`, `a`): those are handled by the stricter\n * agreement check in `isEnforceableHtmlEquivalent`.\n */\nconst SEMANTIC_HTML_EQUIVALENT_TAGS = new Set<string>([\n \"input\",\n \"textarea\",\n \"select\",\n \"dialog\",\n \"progress\",\n \"details\",\n \"table\",\n]);\n\n/**\n * Specific interactive tags that an EXPLICITLY-DECLARED project mapping may\n * enforce against ANY canonical component NAME — making the rule component-\n * library agnostic (so `@acme/ui`'s `AcmeButton` fires on a raw `<button>`, not\n * only the curated built-in \"Button\").\n *\n * Deliberately EXCLUDES generic structural containers (`div`, `span`): even an\n * explicit declaration must never turn every `<div>` into a bespoke\n * re-implementation. The `explicit` gate only applies to user-declared tag\n * mappings (provenance: `localCanonical.resolves`), never to inferred\n * `htmlEquivalent`s — so the `<button>` → Chip flood class stays name-gated.\n */\nconst EXPLICITLY_ENFORCEABLE_AMBIGUOUS_TAGS = new Set<string>([\"button\", \"a\"]);\n\n/**\n * Decide whether a per-component `htmlEquivalent` mapping (raw `tag` → a\n * `canonical` component) may drive a bare-tag canonical-usage finding.\n *\n * The contract:\n * - Low-frequency SEMANTIC tags (dialog, select, textarea, input, …) are always\n * enforceable, so a custom-named component (`<dialog>` → Modal) still maps.\n * - Common/ambiguous tags (button, a, …) enforce ONLY when the mapping AGREES\n * with the framework's curated canonical for that tag — so `<button>` → Button\n * fires, but `<button>` → Chip does not.\n * - Generic structural containers (div, span) have no curated answer and are not\n * semantic → never enforce.\n *\n * This is the guard that stops the canonical-usage flood: a library component\n * being built on a `<div>` must not make every `<div>` a bespoke re-implementation\n * of it (every `<div>` → Accordion, every `<span>` → Badge, every `<button>` → Chip).\n */\nexport function isEnforceableHtmlEquivalent(args: {\n tag: string;\n canonical: string;\n inputType?: string;\n /**\n * The mapping is an EXPLICIT project declaration of this tag → component\n * (provenance: `localCanonical.resolves`), not a low-confidence inferred\n * `htmlEquivalent`. Explicit declarations enforce a specific interactive tag\n * (`button`/`a`) against any canonical NAME — the agnosticism path — while\n * inferred mappings stay name-gated to the curated canonical (the flood\n * guard). Generic containers (`div`/`span`) are never enforceable even when\n * explicit.\n */\n explicit?: boolean;\n}): boolean {\n const tag = args.tag.toLowerCase();\n if (SEMANTIC_HTML_EQUIVALENT_TAGS.has(tag)) return true;\n if (args.explicit && EXPLICITLY_ENFORCEABLE_AMBIGUOUS_TAGS.has(tag)) return true;\n const builtIn = resolveCanonicalForRawHtml(tag, args.inputType);\n return builtIn !== null && builtIn.canonical === args.canonical;\n}\n","import type { CanonicalSource, GovernanceSeverity } from \"../governance.js\";\nimport type {\n FactIndex,\n UsageImportFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n UsageTextChildFact,\n} from \"../facts/index.js\";\nimport {\n isEnforceableHtmlEquivalent,\n isRawHtmlAdvisoryTier,\n resolveCanonicalForAriaRole,\n resolveCanonicalForRawHtml,\n type RawHtmlPrecisionTier,\n} from \"../raw-html-canonical.js\";\nimport { ownedImportMatchesRoot, ownedImportsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexPropsByNodeId, indexTextChildrenByNodeId } from \"./utils.js\";\n\nexport const RULE_ID = \"components/prefer-library\";\nexport const RULE_VERSION = \"1\";\n\ninterface CanonicalMappingOption {\n name: string;\n /** Internal conform-boundary assertion; only the conform policy builder sets it. */\n conformStatus?: \"confirmed\";\n canonical?: string;\n htmlEquivalent?: string;\n /**\n * ARIA role of the canonical primitive this mapping points at (e.g. `status`\n * for Toast, `alert` for Alert). Lets the rule key on element *semantics*\n * rather than the raw tag name, so a bespoke `<div role=\"status\">` re-impl is\n * flagged structurally — not just literal tag/import matches.\n */\n ariaRole?: string;\n /**\n * Intrinsic input `type` of the canonical primitive this mapping points at\n * (e.g. `checkbox` for Checkbox, `radio` for RadioGroup). Only meaningful when\n * `htmlEquivalent === \"input\"`: it discriminates one raw `<input>` from\n * another so a library can map `<input type=\"checkbox\">` → Checkbox and\n * `<input type=\"radio\">` → RadioGroup independently. Unset → matches any\n * `<input>` regardless of type (backward-compatible tag-level match).\n */\n htmlType?: string;\n importPath?: string;\n propMapping?: Array<{\n rawProp: string;\n canonicalProp: string;\n valueMap?: Record<string, string>;\n }>;\n confidence?: number;\n /**\n * The `htmlEquivalent` was EXPLICITLY declared by the project (provenance:\n * `localCanonical.resolves`), not inferred. Lets the enforceability gate fire\n * a specific interactive tag (button/a) against any canonical NAME — the\n * library-agnostic path — without re-opening the inferred-htmlEquivalent flood.\n */\n declaredHtmlEquivalent?: boolean;\n}\n\nfunction isExplicitTagDeclaration(mapping: CanonicalMappingOption): boolean {\n return mapping.declaredHtmlEquivalent === true;\n}\n\n/** Advisory findings never exceed `warn`, whatever the project configured. */\nfunction capAdvisorySeverity(configured: GovernanceSeverity | undefined): GovernanceSeverity {\n const base = configured ?? \"warn\";\n return base === \"error\" ? \"warn\" : base;\n}\n\n/**\n * Advisory-precision matches (role-reimpl, interactive-nonsemantic, html-advisory,\n * icon-only) are lower-confidence and never carry a deterministic fix, so they must\n * never hard-block a write or hard-fail CI. Cap their severity at `warn` even when a\n * project raises `components/prefer-library` to `error` — only the confident\n * exact-html / input-type tiers inherit the escalated severity. (The blocking hook's\n * `isDenyEligible` also refuses to deny `attributes.advisory` findings; this keeps\n * the CI severity honest to the same confidence line.)\n */\nfunction severityForTier(\n configured: GovernanceSeverity | undefined,\n tier: RawHtmlPrecisionTier\n): GovernanceSeverity {\n return isRawHtmlAdvisoryTier(tier) ? capAdvisorySeverity(configured) : (configured ?? \"warn\");\n}\n\n/**\n * Generic structural / typography / primitive class names that routinely appear\n * as plain layout classes even in fully-canonical codebases. Even when one equals\n * a canonical component name (Box, Grid, Stack, List, Text…), a `<div class=\"box\">`\n * is almost never a hand-rolled component — so they are excluded from the\n * className-reimplementation heuristic to keep it low-noise. Distinctive component\n * names (card, badge, alert, dialog, tooltip, drawer, accordion, chip…) are NOT\n * listed here, so they still flag.\n */\nconst GENERIC_CLASSNAME_DENYLIST: ReadonlySet<string> = new Set([\n \"box\",\n \"grid\",\n \"stack\",\n \"row\",\n \"col\",\n \"cols\",\n \"column\",\n \"columns\",\n \"flex\",\n \"wrap\",\n \"wrapper\",\n \"container\",\n \"content\",\n \"inner\",\n \"outer\",\n \"main\",\n \"root\",\n \"layout\",\n \"panel\",\n \"group\",\n \"area\",\n \"block\",\n \"section\",\n \"item\",\n \"items\",\n \"entry\",\n \"list\",\n \"header\",\n \"heading\",\n \"footer\",\n \"nav\",\n \"navbar\",\n \"bar\",\n \"toolbar\",\n \"sidebar\",\n \"aside\",\n \"body\",\n \"cell\",\n \"title\",\n \"subtitle\",\n \"label\",\n \"caption\",\n \"text\",\n \"copy\",\n \"icon\",\n \"img\",\n \"image\",\n \"media\",\n \"link\",\n \"links\",\n \"button\",\n \"btn\",\n \"input\",\n \"field\",\n \"fields\",\n \"form\",\n \"control\",\n \"controls\",\n \"menu\",\n \"dropdown\",\n \"table\",\n \"page\",\n \"view\",\n \"screen\",\n \"overlay\",\n \"backdrop\",\n \"spacer\",\n \"divider\",\n \"separator\",\n \"line\",\n \"dot\",\n \"tabs\",\n]);\n\ninterface ReimplTarget {\n name: string;\n import?: string;\n}\n\n/** lowercased class token → the canonical component it likely reimplements. */\nfunction canonicalReimplTargets(\n sources: readonly CanonicalSource[],\n mappings: readonly CanonicalMappingOption[]\n): Map<string, ReimplTarget> {\n const out = new Map<string, ReimplTarget>();\n const add = (name: string | undefined, importPath: string | undefined) => {\n if (!name || !isIdentifier(name)) return;\n const key = name.toLowerCase();\n if (GENERIC_CLASSNAME_DENYLIST.has(key) || out.has(key)) return;\n out.set(key, { name, ...(importPath ? { import: importPath } : {}) });\n };\n for (const mapping of mappings) add(mapping.name, mapping.importPath);\n for (const source of sources) {\n const label = sourceLabel(source);\n for (const name of source.include ?? []) add(name, label);\n }\n return out;\n}\n\n/** The CSS-module member of a `styles.card` / `styles[\"card\"]` snippet, or null. */\nfunction classMemberFromSnippet(snippet: string): string | null {\n const bracket = /\\[\\s*[\"'`]([A-Za-z0-9_-]+)[\"'`]\\s*\\]\\s*$/.exec(snippet);\n if (bracket) return bracket[1];\n const dot = /\\.([A-Za-z_$][\\w$]*)\\s*$/.exec(snippet);\n return dot ? dot[1] : null;\n}\n\n/** Candidate class-name tokens per node: literal classes + resolvable module members. */\nfunction indexClassTokensByNode(ix: FactIndex): Map<string, string[]> {\n const out = new Map<string, string[]>();\n const push = (nodeId: string, token: string | null) => {\n if (!token) return;\n const list = out.get(nodeId);\n if (list) list.push(token);\n else out.set(nodeId, [token]);\n };\n for (const fact of ix.byKind(\"classname_literal\")) {\n for (const cls of fact.classes) push(fact.nodeId, cls);\n }\n for (const fact of ix.byKind(\"classname_dynamic\")) {\n // Only the `styles.card` identifier form yields a clean member name; clsx()/\n // template/spread forms are too fuzzy to key a suggestion on.\n if (fact.reason !== \"identifier\") continue;\n push(fact.nodeId, classMemberFromSnippet(fact.snippet));\n }\n return out;\n}\n\ninterface ClassNameReimplMatch {\n canonical: string;\n matchedClass: string;\n import?: string;\n}\n\nfunction findClassNameReimpl(\n node: UsageNodeFact,\n classTokensByNode: Map<string, string[]>,\n targets: Map<string, ReimplTarget>\n): ClassNameReimplMatch | null {\n const tokens = classTokensByNode.get(node.id);\n if (!tokens) return null;\n for (const token of tokens) {\n const target = targets.get(token.toLowerCase());\n if (target) {\n return {\n canonical: target.name,\n matchedClass: token,\n ...(target.import ? { import: target.import } : {}),\n };\n }\n }\n return null;\n}\n\nexport function ruleComponentsPreferLibrary(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n const sources = canonicalSourcesFromPolicy(policy.options?.canonicalSources);\n const mappings = canonicalMappingsFromPolicy(policy.options?.canonicalMappings);\n if (sources.length === 0 && mappings.length === 0) return [];\n\n const importsByFileAndLocal = indexImportsByFileAndLocal(ix);\n const propsByNode = indexPropsByNodeId(ix);\n const textByNode = indexTextChildrenByNodeId(ix);\n const classTokensByNode = indexClassTokensByNode(ix);\n const reimplTargets = canonicalReimplTargets(sources, mappings);\n const findings: Finding[] = [];\n const seenImportFixes = new Set<string>();\n\n for (const node of ix.byKind(\"usage_node\")) {\n if (isCanonicalSourceImplementationFile(node.file, sources)) continue;\n if (node.element.includes(\".\")) continue;\n const props = propsByNode.get(node.id) ?? [];\n const textChildren = textByNode.get(node.id) ?? [];\n const importsForFile = importsByFileAndLocal.get(node.file);\n const imported = importsForFile?.get(node.element);\n const nodeInputType =\n node.element === \"input\" ? readStaticStringProp(props, \"type\") : undefined;\n const mapped = findMapping(node, nodeInputType, mappings);\n if (mapped && imported && isMappedCanonicalImport(imported, mapped)) continue;\n if (imported && isCanonicalImport(imported, node.element, sources)) continue;\n\n if (mapped) {\n if (!shouldSuggestMapped(node, nodeInputType, imported, mapped)) continue;\n const importPath = mapped.importPath;\n const suggestedComponent = mapped.name;\n const suggestedImport = importPath ?? \"the canonical library\";\n const propMapping = mapped.propMapping ?? [];\n const propCompatibility = assessMappedPropCompatibility(props, propMapping);\n const roleMatch = isRoleMatch(node, mapped);\n const precisionTier: RawHtmlPrecisionTier = roleMatch ? \"role-reimpl\" : \"exact-html\";\n\n if (\n imported &&\n importPath &&\n !ownedImportsEqual(imported.source, importPath) &&\n node.element === suggestedComponent\n ) {\n // A same-name package import is not proof that the package implements\n // our canonical primitive. For example, TanStack Router's `Link` and a\n // design-system `Link` share a local JSX name but have different\n // contracts. Only an unaliased local import is a useful guided\n // candidate; package migrations need an explicit import policy.\n if (!isLocalExactComponentImportRedirectCandidate(imported, suggestedComponent)) continue;\n const key = `${imported.file}\\0${imported.local}\\0${imported.source}\\0${importPath}`;\n if (seenImportFixes.has(key)) continue;\n seenImportFixes.add(key);\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element}> may need to import from ${importPath}; verify that the local component contract is compatible first.`,\n location: imported.location,\n evidence: ix.evidence([node.id, imported.id, policy.id]),\n fingerprintIdentity: {\n file: imported.file,\n local: imported.local,\n from: imported.source,\n to: importPath,\n },\n fix: {\n kind: \"replaceImport\",\n title: `Replace import path with \"${importPath}\"`,\n from: imported.source,\n to: importPath,\n deterministic: false,\n },\n attributes: {\n rawValue: imported.source,\n suggestedComponent,\n suggestedImport: importPath,\n canonical: mapped.canonical,\n confidence: mapped.confidence,\n advisory: true,\n contractProof: \"missing\",\n },\n })\n );\n continue;\n }\n\n // No-op guard: the element already IS the suggested canonical (any\n // wrong-import-path fix was handled just above). \"Replace <X> with <X>\"\n // is not drift — skip it. This kills the icon self-mappings\n // (e.g. <GitBranch> → <GitBranch>) that floated up as noise.\n if (node.element === suggestedComponent) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: severityForTier(policy.severity, precisionTier),\n message:\n node.element === \"button\"\n ? `Bespoke <button> has a library equivalent. Swap to <${suggestedComponent}> from ${suggestedImport}.`\n : roleMatch\n ? `Custom <${node.element} role=\"${node.role}\"> reimplements a primitive. Use <${suggestedComponent}> from ${suggestedImport}.`\n : `Bespoke <${node.element}> should use <${suggestedComponent}> from ${suggestedImport}.`,\n location: node.location,\n evidence: ix.evidence(\n imported ? [node.id, imported.id, policy.id] : [node.id, policy.id]\n ),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent,\n suggestedImport,\n },\n ...(!isRawHtmlAdvisoryTier(precisionTier) &&\n isIdentifier(node.element) &&\n isIdentifier(suggestedComponent)\n ? {\n fix: {\n kind: \"replaceComponent\" as const,\n title: `Replace <${node.element}> with <${suggestedComponent}>`,\n from: node.element,\n to: suggestedComponent,\n // The fact IR cannot prove that it observed every JSX\n // attribute shape (notably dynamic inline styles). The\n // conform AST preflight may promote this guided fix only\n // after it proves the complete prop surface directly.\n deterministic: false,\n },\n }\n : {}),\n attributes: {\n rawValue: node.element,\n suggestedComponent,\n suggestedImport,\n canonical: mapped.canonical,\n confidence: mapped.confidence,\n propMapping,\n propCompatibility: propCompatibility.complete ? \"observed-complete\" : \"incomplete\",\n ...(mapped.conformStatus === \"confirmed\" ? { canonicalMappingConfirmed: true } : {}),\n ...(propCompatibility.unprovenProps.length > 0\n ? { unprovenProps: propCompatibility.unprovenProps }\n : {}),\n precisionTier,\n ...(roleMatch ? { matchedRole: node.role } : {}),\n ...(isRawHtmlAdvisoryTier(precisionTier) ? { advisory: true } : {}),\n },\n })\n );\n continue;\n }\n\n // #2 — className reimplementation heuristic (advisory-only). A plain\n // <div>/<span> with no ARIA role and no handler whose class name matches a\n // canonical component name is very likely a hand-rolled reimplementation\n // (`<div className={styles.card}>` for a Card). class-name↔component is a\n // naming-intent signal, not structural proof — so this is advisory, capped at\n // warn, carries no auto-fix, and never blocks a write (see emit-gate). DOG-03\n // backlog: deterministic canonical-shell signatures may promote proven matches.\n if (\n (node.element === \"div\" || node.element === \"span\") &&\n node.role === undefined &&\n node.interactive !== true &&\n !hasEventHandler(props)\n ) {\n const reimpl = findClassNameReimpl(node, classTokensByNode, reimplTargets);\n if (reimpl) {\n const suggestedImport = reimpl.import ?? \"the canonical library\";\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element} class=\"${reimpl.matchedClass}\"> looks like a hand-rolled <${reimpl.canonical}>. Use <${reimpl.canonical}> from ${suggestedImport} instead of restyling a <${node.element}>.`,\n location: node.location,\n evidence: ix.evidence([node.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent: reimpl.canonical,\n matchedClass: reimpl.matchedClass,\n },\n attributes: {\n rawValue: node.element,\n suggestedComponent: reimpl.canonical,\n ...(reimpl.import ? { suggestedImport: reimpl.import } : {}),\n precisionTier: \"classname-reimpl\",\n matchedClass: reimpl.matchedClass,\n advisory: true,\n },\n })\n );\n continue;\n }\n }\n\n const builtIn = findBuiltInRawHtmlMatch(node, props, textChildren, nodeInputType);\n const suggestedComponent =\n builtIn?.canonical ?? (node.element === \"button\" ? \"Button\" : node.element);\n const suggestion = findSuggestionSource(suggestedComponent, sources);\n if (!suggestion) continue;\n if (!builtIn && !shouldSuggest(node, imported)) continue;\n\n // An exact component-name match is either already canonical (handled near\n // the top of the loop), a safely redirectable local component import, or an\n // unrelated component that happens to share a name. Never report a\n // replaceComponent X -> X no-op, and never infer that one package's `Link`\n // is interchangeable with another package's `Link`.\n if (node.element === suggestedComponent) {\n const importPath = canonicalImportPath(suggestion);\n if (\n !imported ||\n !importPath ||\n !isLocalExactComponentImportRedirectCandidate(imported, suggestedComponent)\n ) {\n continue;\n }\n const key = `${imported.file}\\0${imported.local}\\0${imported.source}\\0${importPath}`;\n if (seenImportFixes.has(key)) continue;\n seenImportFixes.add(key);\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element}> may need to import from ${importPath}; verify that the local component contract is compatible first.`,\n location: imported.location,\n evidence: ix.evidence([node.id, imported.id, policy.id]),\n fingerprintIdentity: {\n file: imported.file,\n local: imported.local,\n from: imported.source,\n to: importPath,\n },\n fix: {\n kind: \"replaceImport\",\n title: `Replace import path with \"${importPath}\"`,\n from: imported.source,\n to: importPath,\n deterministic: false,\n },\n attributes: {\n rawValue: imported.source,\n suggestedComponent,\n suggestedImport: importPath,\n suggestedImportSourceKind: suggestion.kind,\n advisory: true,\n contractProof: \"missing\",\n },\n })\n );\n continue;\n }\n // Directory canonical sources are typically derived without an `include`\n // filter (cloud pushes `{ kind: \"directory\", path }` for every component\n // folder), so `sourceIncludesComponent` matches EVERY name. Without the same\n // guards #224 added to the mapped path, that turns every imported component\n // — Phosphor icons included — into a no-op `<X> → <X>` finding, and lets a\n // non-enforceable raw-tag match (`<button>` → a non-Button canonical) slip\n // through. Hold the directory path to the semantic-only contract:\n // (i) never a no-op (element already IS the suggestion),\n // (ii) only raw lowercase HTML tags are targets (an already-capitalized\n // component is not a prefer-library candidate for a directory source),\n // (iii) only when the raw tag → canonical mapping is enforceable\n // (isEnforceableHtmlEquivalent) — so `<button>` → Button fires but a\n // disagreeing `<button>` → Chip does not.\n // npm/registry sources are curated (specifier + usual include lists) and keep\n // their import-redirect behavior, so this gate is directory-scoped only.\n if (suggestion.kind === \"directory\") {\n if (node.element === suggestedComponent) continue;\n if (!builtIn) continue;\n if (isIdentifier(node.element) && /^[A-Z]/.test(node.element)) continue;\n if (\n !isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: suggestedComponent,\n inputType: nodeInputType,\n })\n ) {\n continue;\n }\n }\n const suggestedImport = sourceLabel(suggestion);\n const precisionTier = builtIn?.tier ?? \"exact-html\";\n const rawElement = formatRawElement(node, props);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: severityForTier(policy.severity, precisionTier),\n message: messageForBuiltInMatch({\n node,\n rawElement,\n suggestedComponent,\n suggestedImport,\n precisionTier,\n }),\n location: node.location,\n evidence: ix.evidence(imported ? [node.id, imported.id, policy.id] : [node.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent,\n suggestedImport,\n },\n ...(!isRawHtmlAdvisoryTier(precisionTier) &&\n isIdentifier(node.element) &&\n isIdentifier(suggestedComponent)\n ? {\n fix: {\n kind: \"replaceComponent\" as const,\n title: `Replace ${rawElement} with <${suggestedComponent}>`,\n from: node.element,\n to: suggestedComponent,\n // A canonical source proves that the target exists, not that\n // this native element's complete prop contract is compatible.\n // Only explicit canonical mappings carry that proof.\n deterministic: false,\n },\n }\n : {}),\n attributes: {\n rawValue: node.element,\n suggestedComponent,\n suggestedImport,\n suggestedImportSourceKind: suggestion.kind,\n precisionTier,\n propCompatibility: \"unknown\",\n ...(builtIn?.matchedRole ? { matchedRole: builtIn.matchedRole } : {}),\n ...(builtIn?.inputType ? { matchedInputType: builtIn.inputType } : {}),\n ...(isRawHtmlAdvisoryTier(precisionTier) ? { advisory: true } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\ninterface BuiltInRawHtmlMatch {\n canonical: string;\n tier: RawHtmlPrecisionTier;\n matchedRole?: string;\n inputType?: string;\n}\n\nfunction findBuiltInRawHtmlMatch(\n node: UsageNodeFact,\n props: readonly UsagePropResolvedFact[],\n textChildren: readonly UsageTextChildFact[],\n inputType: string | undefined\n): BuiltInRawHtmlMatch | null {\n if (isIconOnlyButton(node, props, textChildren)) {\n return { canonical: \"IconButton\", tier: \"icon-only\" };\n }\n\n const rawMatch = resolveCanonicalForRawHtml(node.element, inputType);\n if (rawMatch) {\n return {\n ...rawMatch,\n ...(inputType ? { inputType } : {}),\n };\n }\n\n if (node.role && isRoleReimplementationHost(node.element)) {\n const roleMatch = resolveCanonicalForAriaRole(node.role);\n if (roleMatch) {\n return {\n ...roleMatch,\n matchedRole: node.role,\n };\n }\n }\n\n if (\n (node.element === \"div\" || node.element === \"span\") &&\n node.role === undefined &&\n node.interactive === true &&\n hasEventHandler(props)\n ) {\n return { canonical: \"Button\", tier: \"interactive-nonsemantic\" };\n }\n\n return null;\n}\n\nfunction isIconOnlyButton(\n node: UsageNodeFact,\n props: readonly UsagePropResolvedFact[],\n textChildren: readonly UsageTextChildFact[]\n): boolean {\n if (node.element !== \"button\") return false;\n if (node.interactive !== true && !hasEventHandler(props)) return false;\n if (!hasExplicitAriaName(props)) return false;\n return !hasVisibleText(textChildren);\n}\n\nfunction isRoleReimplementationHost(element: string): boolean {\n return element === \"div\" || element === \"span\" || element === \"a\";\n}\n\nfunction hasEventHandler(props: readonly UsagePropResolvedFact[]): boolean {\n return props.some((prop) => /^on[A-Z]/.test(prop.prop));\n}\n\nfunction hasExplicitAriaName(props: readonly UsagePropResolvedFact[]): boolean {\n return props.some(\n (prop) =>\n (prop.prop === \"aria-label\" || prop.prop === \"aria-labelledby\") &&\n prop.resolution === \"static\" &&\n typeof prop.value === \"string\" &&\n prop.value.trim().length > 0\n );\n}\n\nfunction hasVisibleText(textChildren: readonly UsageTextChildFact[]): boolean {\n return textChildren.some((child) => child.text.trim().length > 0);\n}\n\nfunction readStaticStringProp(\n props: readonly UsagePropResolvedFact[],\n propName: string\n): string | undefined {\n const prop = props.find((candidate) => candidate.prop === propName);\n if (!prop || prop.resolution !== \"static\") return undefined;\n return typeof prop.value === \"string\" ? prop.value : undefined;\n}\n\nfunction formatRawElement(node: UsageNodeFact, props: readonly UsagePropResolvedFact[]): string {\n if (node.element === \"input\") {\n const inputType = readStaticStringProp(props, \"type\");\n if (inputType) return `<input type=\"${inputType}\">`;\n }\n if (node.role) return `<${node.element} role=\"${node.role}\">`;\n return `<${node.element}>`;\n}\n\nfunction messageForBuiltInMatch({\n node,\n rawElement,\n suggestedComponent,\n suggestedImport,\n precisionTier,\n}: {\n node: UsageNodeFact;\n rawElement: string;\n suggestedComponent: string;\n suggestedImport: string;\n precisionTier: RawHtmlPrecisionTier;\n}) {\n if (precisionTier === \"icon-only\") {\n return `Icon-only ${rawElement} should use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (precisionTier === \"role-reimpl\") {\n return `Custom ${rawElement} reimplements a primitive. Use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (precisionTier === \"interactive-nonsemantic\") {\n return `Interactive <${node.element}> reimplements a Button. Use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (node.element === \"button\") {\n return `Bespoke <button> has a library equivalent. Swap to <Button> from ${suggestedImport}.`;\n }\n return `Bespoke ${rawElement} should use <${suggestedComponent}> from ${suggestedImport}.`;\n}\n\nfunction shouldSuggestMapped(\n node: UsageNodeFact,\n nodeInputType: string | undefined,\n imported: UsageImportFact | undefined,\n mapping: CanonicalMappingOption\n): boolean {\n if (\n sameHtmlTag(mapping.htmlEquivalent, node.element) &&\n // Enforceability is checked against `mapping.name` — the component this rule\n // actually EMITS as `suggestedComponent` — not `mapping.canonical`. For\n // ambiguous/common tags (button, a) `isEnforceableHtmlEquivalent` requires\n // agreement with the curated canonical, so a Chip whose `canonical: \"Button\"`\n // but `name: \"Chip\"` no longer leaks `suggestedComponent: \"Chip\"` while the\n // canonical reads \"Button\". `<button>` → Button (name === canonical) still\n // fires; semantic tags (textarea → Textarea) are unaffected (always\n // enforceable regardless of name).\n isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: mapping.name,\n inputType: nodeInputType,\n explicit: isExplicitTagDeclaration(mapping),\n })\n ) {\n return true;\n }\n if (node.role !== undefined && node.role === mapping.ariaRole) return true;\n // Only a literal use of the component's own NAME (e.g. <Modal> for name\n // \"Modal\") is a candidate here — resolved as an import-redirect / no-op by the\n // caller. We deliberately do NOT match on `mapping.canonical` (the vocabulary\n // id): when name === canonical this clause would be redundant (the htmlEquivalent\n // / name paths already cover it), and when they diverge (name \"Modal\", canonical\n // \"Dialog\") matching `<Dialog>` only ever produced a self-contradicting swap\n // (rawValue === canonical, suggestion is the renamed wrapper) and let any common\n // vocab id (Dialog/Tooltip/Card) hijack an unrelated third-party usage. Same\n // divergence principle as the button→Chip fix (#229) — audit #1/#2.\n if (node.element === mapping.name) {\n return imported !== undefined;\n }\n return false;\n}\n\nfunction shouldSuggest(node: UsageNodeFact, imported: UsageImportFact | undefined): boolean {\n if (node.element === \"button\") return true;\n if (!/^[A-Z]/.test(node.element)) return false;\n return imported !== undefined;\n}\n\ninterface PropCompatibilityAssessment {\n complete: boolean;\n unprovenProps: string[];\n}\n\n/**\n * Prove that every observed prop can survive the component replacement.\n *\n * An explicit pass-through (`rawProp === canonicalProp`) is proof too. Spreads,\n * missing entries, and value translations that cannot be applied exactly stay\n * unresolved: the canonical mapping proves the target component, but it does\n * not imply that the target forwards the native element's entire prop surface.\n */\nfunction assessMappedPropCompatibility(\n props: readonly UsagePropResolvedFact[],\n mappings: ReadonlyArray<NonNullable<CanonicalMappingOption[\"propMapping\"]>[number]>\n): PropCompatibilityAssessment {\n const byRawProp = new Map(mappings.map((mapping) => [mapping.rawProp, mapping]));\n const unprovenProps = props.flatMap((prop) => {\n if (prop.resolution === \"spread\") return [prop.prop];\n const mapping = byRawProp.get(prop.prop);\n if (!mapping || !mappingCanPreserveProp(mapping, prop)) return [prop.prop];\n return [];\n });\n return { complete: unprovenProps.length === 0, unprovenProps };\n}\n\nfunction mappingCanPreserveProp(\n mapping: NonNullable<CanonicalMappingOption[\"propMapping\"]>[number],\n prop: UsagePropResolvedFact\n): boolean {\n const renames = mapping.rawProp !== mapping.canonicalProp;\n const valueMap = mapping.valueMap;\n const translatesValue = valueMap !== undefined && Object.keys(valueMap).length > 0;\n\n // The conform editor can only rename simple JSX identifiers. A pass-through\n // needs no edit and can therefore retain valid JSX names such as aria-label.\n if (renames && (!isIdentifier(mapping.rawProp) || !isIdentifier(mapping.canonicalProp))) {\n return false;\n }\n if (!translatesValue) return true;\n if (!isIdentifier(mapping.rawProp)) return false;\n return (\n prop.resolution === \"static\" &&\n typeof prop.value === \"string\" &&\n Object.prototype.hasOwnProperty.call(valueMap, prop.value)\n );\n}\n\nfunction isLocalExactComponentImportRedirectCandidate(\n usage: UsageImportFact,\n componentName: string\n): boolean {\n return isUnaliasedNamedImport(usage, componentName) && isProjectLocalImportSource(usage.source);\n}\n\nfunction isUnaliasedNamedImport(usage: UsageImportFact, componentName: string): boolean {\n return isSimpleComponentBinding(usage, componentName) && usage.imported === componentName;\n}\n\nfunction isSimpleComponentBinding(usage: UsageImportFact, componentName: string): boolean {\n return usage.namespace !== true && usage.local === componentName;\n}\n\nfunction isProjectLocalImportSource(source: string): boolean {\n return (\n source.startsWith(\".\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"@/\") ||\n source.startsWith(\"~/\")\n );\n}\n\n/**\n * Case-INSENSITIVE equality for the `htmlEquivalent` ↔ raw-tag comparison.\n * Raw HTML tag names are case-insensitive, but a catalog/author can store a\n * mis-cased `htmlEquivalent` (\"Button\", \"INPUT\"). The enforceability gate\n * already lowercases internally, but the OUTER comparison gated whether the\n * gate ran at all — so a mis-cased equivalent silently made a valid mapping\n * inert (audit #29). Component NAME matches stay case-sensitive; only the\n * raw-tag side is normalized here.\n */\nfunction sameHtmlTag(htmlEquivalent: string | undefined, element: string): boolean {\n return htmlEquivalent !== undefined && htmlEquivalent.toLowerCase() === element.toLowerCase();\n}\n\nfunction indexImportsByFileAndLocal(ix: FactIndex): Map<string, Map<string, UsageImportFact>> {\n const out = new Map<string, Map<string, UsageImportFact>>();\n for (const usage of ix.byKind(\"usage_import\")) {\n const importsForFile = out.get(usage.file) ?? new Map<string, UsageImportFact>();\n importsForFile.set(usage.local, usage);\n out.set(usage.file, importsForFile);\n }\n return out;\n}\n\nfunction canonicalSourcesFromPolicy(value: unknown): CanonicalSource[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCanonicalSource);\n}\n\nfunction canonicalMappingsFromPolicy(value: unknown): CanonicalMappingOption[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCanonicalMappingOption);\n}\n\nfunction isCanonicalMappingOption(value: unknown): value is CanonicalMappingOption {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (typeof record.name !== \"string\" || !isIdentifier(record.name)) return false;\n if (record.canonical !== undefined && typeof record.canonical !== \"string\") return false;\n if (record.htmlEquivalent !== undefined && typeof record.htmlEquivalent !== \"string\") {\n return false;\n }\n if (record.ariaRole !== undefined && typeof record.ariaRole !== \"string\") return false;\n if (record.htmlType !== undefined && typeof record.htmlType !== \"string\") return false;\n if (record.importPath !== undefined && typeof record.importPath !== \"string\") return false;\n if (record.confidence !== undefined && typeof record.confidence !== \"number\") return false;\n if (record.conformStatus !== undefined && record.conformStatus !== \"confirmed\") return false;\n if (\n record.declaredHtmlEquivalent !== undefined &&\n typeof record.declaredHtmlEquivalent !== \"boolean\"\n ) {\n return false;\n }\n if (record.propMapping !== undefined) {\n if (!Array.isArray(record.propMapping)) return false;\n if (!record.propMapping.every(isPropMappingOption)) return false;\n }\n return true;\n}\n\nfunction isPropMappingOption(\n value: unknown\n): value is NonNullable<CanonicalMappingOption[\"propMapping\"]>[number] {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.rawProp === \"string\" &&\n typeof record.canonicalProp === \"string\" &&\n (record.valueMap === undefined || isStringRecord(record.valueMap))\n );\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every(\n (entry) => typeof entry === \"string\"\n );\n}\n\nfunction isCanonicalSource(value: unknown): value is CanonicalSource {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n if (!hasValidComponentList(record.include)) return false;\n if (!hasValidComponentList(record.exclude)) return false;\n if (record.implementationPath !== undefined && typeof record.implementationPath !== \"string\") {\n return false;\n }\n if (record.kind === \"npm\") return typeof record.specifier === \"string\";\n if (record.kind === \"directory\") return typeof record.path === \"string\";\n if (record.kind === \"registry\") {\n return typeof record.registryId === \"string\" && typeof record.installPath === \"string\";\n }\n return false;\n}\n\nfunction hasValidComponentList(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n\nfunction findMapping(\n node: UsageNodeFact,\n nodeInputType: string | undefined,\n mappings: readonly CanonicalMappingOption[]\n): CanonicalMappingOption | undefined {\n // A type-specific input mapping wins over a generic tag-level one, so a\n // library mapping `<input type=\"checkbox\">` → Checkbox is never shadowed by a\n // catch-all `<input>` → TextField entry. Normalized to lower-case to mirror\n // the resolved `type` prop value the extractor records.\n if (node.element === \"input\" && nodeInputType) {\n const typed = mappings.find(\n (mapping) =>\n sameHtmlTag(mapping.htmlEquivalent, \"input\") &&\n mapping.htmlType !== undefined &&\n mapping.htmlType.toLowerCase() === nodeInputType.toLowerCase()\n );\n if (typed) return typed;\n }\n\n return mappings.find((mapping) => {\n if (\n sameHtmlTag(mapping.htmlEquivalent, node.element) &&\n // Match enforceability against the EMITTED `mapping.name` (see\n // shouldSuggestMapped): for ambiguous tags this requires the suggested\n // component to BE the tag's curated canonical, so a disagreeing\n // `<button>` → Chip mapping never matches in the first place.\n isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: mapping.name,\n inputType: nodeInputType,\n explicit: isExplicitTagDeclaration(mapping),\n })\n ) {\n // A type-constrained mapping only matches the matching input type; an\n // unconstrained one matches any element with that tag (back-compat).\n // Gated so an inferred `div`/`span` primitive (or a `button` → specialized\n // component) never blanket-flags every container — see\n // isEnforceableHtmlEquivalent.\n return mapping.htmlType === undefined || matchesInputType(mapping, nodeInputType);\n }\n if (mapping.name === node.element) return true;\n // Deliberately NOT matching on `mapping.canonical` (the vocabulary id): see\n // shouldSuggestMapped. Selecting a mapping purely because the element name\n // equals a canonical vocab id (Dialog/Tooltip/Card…) produced divergent swaps\n // and cross-mapping hijacking (audit #1/#2). A real name match (above), an\n // enforceable htmlEquivalent (above), or an ARIA-role match (below) remain.\n // Semantic match: a bespoke element whose declared ARIA role equals the\n // canonical primitive's role (e.g. `<div role=\"status\">` → Toast). Keyed on\n // normalized `usage_node.role`, so it is framework-agnostic.\n return node.role !== undefined && mapping.ariaRole === node.role;\n });\n}\n\nfunction matchesInputType(\n mapping: CanonicalMappingOption,\n nodeInputType: string | undefined\n): boolean {\n if (mapping.htmlType === undefined) return true;\n if (nodeInputType === undefined) return false;\n return mapping.htmlType.toLowerCase() === nodeInputType.toLowerCase();\n}\n\n/** True when `mapped` was selected for `node` purely on an ARIA-role match. */\nfunction isRoleMatch(node: UsageNodeFact, mapping: CanonicalMappingOption): boolean {\n return (\n node.role !== undefined &&\n node.role === mapping.ariaRole &&\n node.element !== mapping.htmlEquivalent &&\n node.element !== mapping.name &&\n node.element !== mapping.canonical\n );\n}\n\nfunction isMappedCanonicalImport(usage: UsageImportFact, mapping: CanonicalMappingOption): boolean {\n return Boolean(mapping.importPath && ownedImportsEqual(usage.source, mapping.importPath));\n}\n\nfunction isCanonicalImport(\n usage: UsageImportFact,\n componentName: string,\n sources: readonly CanonicalSource[]\n): boolean {\n return sources.some((source) => {\n if (!sourceIncludesComponent(source, componentName)) return false;\n if (source.exclude?.includes(componentName)) return false;\n if (source.kind === \"npm\") {\n return ownedImportMatchesRoot(usage.source, source.specifier);\n }\n if (source.kind === \"registry\") {\n if (!source.importPath) return false;\n return ownedImportMatchesRoot(usage.source, source.importPath);\n }\n return normalizePath(usage.source).startsWith(normalizePath(source.path));\n });\n}\n\nfunction findSuggestionSource(\n componentName: string,\n sources: readonly CanonicalSource[]\n): CanonicalSource | undefined {\n return sources.find(\n (source) =>\n sourceIncludesComponent(source, componentName) && !source.exclude?.includes(componentName)\n );\n}\n\nfunction sourceIncludesComponent(source: CanonicalSource, componentName: string): boolean {\n if (source.include) return source.include.includes(componentName);\n // Package-like canonical sources must be backed by an explicit export\n // inventory before they can suggest arbitrary component names. Without this,\n // a bare `{ kind: \"npm\", specifier: \"@acme/ui\" }` treats every imported\n // PascalCase symbol as canonical and emits self-referential/noisy swaps.\n if (source.kind === \"npm\" || source.kind === \"registry\") return false;\n return true;\n}\n\nfunction sourceLabel(source: CanonicalSource): string {\n if (source.kind === \"npm\") return source.specifier;\n if (source.kind === \"registry\") return source.importPath ?? source.installPath;\n return source.path;\n}\n\nfunction canonicalImportPath(source: CanonicalSource): string | undefined {\n if (source.kind === \"npm\") return source.specifier;\n if (source.kind === \"registry\") return source.importPath;\n return undefined;\n}\n\nfunction isCanonicalSourceImplementationFile(\n file: string,\n sources: readonly CanonicalSource[]\n): boolean {\n const normalizedFile = normalizePath(file);\n return sources.some((source) => {\n if (source.kind === \"npm\" && source.implementationPath) {\n return isPathInSource(normalizedFile, source.implementationPath);\n }\n if (source.kind === \"directory\") {\n return isPathInSource(normalizedFile, source.path);\n }\n if (source.kind === \"registry\") {\n return isPathInSource(normalizedFile, source.installPath);\n }\n return false;\n });\n}\n\nfunction isPathInSource(file: string, sourcePath: string): boolean {\n const normalizedSource = normalizePath(sourcePath).replace(/\\/$/, \"\");\n return file === normalizedSource || file.startsWith(`${normalizedSource}/`);\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][\\w$]*$/.test(value);\n}\n","/**\n * `components/forbidden-prop-value` — fires when a JSX prop is assigned a\n * value that the component governance forbids. Path-scoped policies only\n * fire when the file matches the policy's path glob; unscoped policies fire\n * everywhere.\n *\n * Only static prop values are checked. Dynamic props (`variant={kind}`) and\n * spreads (`{...props}`) cannot be evaluated at scan time.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexComponentByNodeId, indexPropsByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"components/forbidden-prop-value\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleComponentsForbiddenPropValue(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution !== \"static\") continue;\n if (propUsage.value === undefined) continue;\n\n const matched = ix.policy.forbiddenPropValues(usageComponent.componentId, {\n prop: propUsage.prop,\n value: propUsage.value,\n path: node.file,\n });\n if (matched.length === 0) continue;\n\n const policy = matched[0];\n const replacement = policy.replaceWith;\n const fix =\n replacement !== undefined\n ? {\n kind: \"replacePropValue\" as const,\n title: `Replace ${propUsage.prop} with ${formatValue(replacement)}`,\n prop: propUsage.prop,\n value: replacement,\n deterministic: true,\n }\n : undefined;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: buildMessage(\n node.element,\n propUsage.prop,\n propUsage.value,\n policy.because,\n replacement\n ),\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n value: propUsage.value,\n },\n fix,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n rawValue: propUsage.value,\n suggestedValue: replacement,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n return String(value);\n}\n\nfunction buildMessage(\n element: string,\n prop: string,\n value: unknown,\n because: string,\n replacement: unknown\n): string {\n const head = `<${element}> ${prop}=${formatValue(value)} is forbidden.`;\n const reason = because ? ` ${because.trim()}` : \"\";\n const suggestion = replacement !== undefined ? ` Use ${formatValue(replacement)}.` : \"\";\n return `${head}${reason}${suggestion}`.trim();\n}\n","/**\n * `components/unknown-prop` — fires when JSX uses a prop that isn't in the\n * component's declared prop schema and the global `jsx.unknownProps.forbid`\n * policy is active. Universal React/DOM props (data-*, aria-*, on*, key, ref,\n * className, style, etc.) are exempt.\n *\n * The rule only fires for components we have prop metadata for. If the\n * component has no `prop_metadata` facts (e.g., third-party imports we don't\n * model yet), we cannot tell whether a prop is unknown and the rule stays\n * silent.\n */\n\nimport type { FactIndex, FactId } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n isUniversalJsxProp,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"components/unknown-prop\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleComponentsUnknownProp(ix: FactIndex): Finding[] {\n const policy = ix.policy.jsxUnknownPropsForbidden();\n if (!policy) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n\n const knownProps = ix.components.propsOf(usageComponent.componentId);\n if (knownProps.length === 0) continue;\n const knownNames = new Set(knownProps.map((p) => p.prop));\n\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution === \"spread\") continue;\n if (isUniversalJsxProp(propUsage.prop)) continue;\n if (knownNames.has(propUsage.prop)) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `Unknown prop \"${propUsage.prop}\" on <${node.element}>. Allowed props: ${formatPropList(knownNames)}.`,\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n } satisfies UnknownPropFingerprint,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\ninterface UnknownPropFingerprint {\n file: string;\n componentId: string;\n element: string;\n nodePath: string;\n prop: string;\n}\n\nfunction formatPropList(names: Set<string>): string {\n if (names.size === 0) return \"(none)\";\n const sorted = [...names].sort();\n if (sorted.length <= 6) return sorted.join(\", \");\n return `${sorted.slice(0, 6).join(\", \")}, …`;\n}\n\n// Re-exported for type-tests / tooling that wants to read the rule's id.\nexport type { FactId };\n","/**\n * `composition/cardinality` + `composition/co-occurrence` — region-scoped rules\n * over how components are arranged inside a container, not just per node.\n *\n * Both share the same region machinery: `regionsByPrefix` groups usage into\n * `(container, members)`; a `CompositionPattern` names the container (by\n * canonical `componentId`), a child `select`or, and a `constraint`. The config\n * rides in `governance_rule_config.options.patterns` — no new fact kind. Brief\n * 04 delivers that config from cloud policy / fragment prose; this brief drives\n * the rules from it directly.\n *\n * Static-resolution ceiling: a child is \"selected\" only when its prop resolves\n * statically to the configured value. A dynamic `variant={kind}` is unknown —\n * never a match, never treated as absent. Dynamic composition is the\n * render-time validator's job (doc 14), not this static rule's.\n *\n * Matching is on the resolved canonical component (its `componentId`), never the\n * raw `element` string — that is what makes the rule survive wrappers and\n * renames. A policy component ref may be fully qualified (`pkg#Name`) or a bare\n * name (the common authoring case); see `componentMatches`.\n */\n\nimport type {\n FactId,\n FactIndex,\n UsageComponentFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n} from \"../facts/index.js\";\nimport type { GovernanceSeverity } from \"../governance.js\";\nimport { ownedComponentIdsEqual } from \"../package-identity-match.js\";\n\nimport {\n type CompositionChildSelector,\n type CompositionConstraint,\n type CompositionPattern,\n type CompositionRegionSelector,\n isCompositionPattern,\n} from \"./composition-pattern-schema.js\";\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n regionsByPrefix,\n type Region,\n} from \"./utils.js\";\n\nexport const CARDINALITY_RULE_ID = \"composition/cardinality\";\nexport const CO_OCCURRENCE_RULE_ID = \"composition/co-occurrence\";\nconst RULE_VERSION = \"1\";\n\n/** ≤ `max` / ≥ `min` of a selected child per matching region. */\nexport function ruleCompositionCardinality(ix: FactIndex): Finding[] {\n return evaluate(ix, CARDINALITY_RULE_ID, \"cardinality\");\n}\n\n/** A selected child requires a co-occurring sibling in the same region. */\nexport function ruleCompositionCoOccurrence(ix: FactIndex): Finding[] {\n return evaluate(ix, CO_OCCURRENCE_RULE_ID, \"co-occurrence\");\n}\n\ninterface EvalCtx {\n ix: FactIndex;\n ruleId: string;\n severity: GovernanceSeverity;\n componentByNode: Map<FactId, UsageComponentFact>;\n propsByNode: Map<FactId, UsagePropResolvedFact[]>;\n}\n\nfunction evaluate(ix: FactIndex, ruleId: string, kind: CompositionConstraint[\"kind\"]): Finding[] {\n const config = ix.policy.ruleConfig(ruleId);\n if (!config || !config.enabled) return [];\n const patterns = readPatterns(config.options);\n if (patterns.length === 0) return [];\n\n const ctx: EvalCtx = {\n ix,\n ruleId,\n severity: config.severity ?? \"warn\",\n componentByNode: indexComponentByNodeId(ix),\n propsByNode: indexPropsByNodeId(ix),\n };\n const regions = regionsByPrefix(ix);\n\n const findings: Finding[] = [];\n for (const pattern of patterns) {\n const constraint = pattern.constraint;\n if (constraint.kind !== kind) continue;\n for (const region of regions) {\n if (!regionMatches(region, pattern.region, ctx.componentByNode)) continue;\n const selected = region.members.filter((m) => memberMatches(m.id, pattern.select, ctx));\n const finding =\n constraint.kind === \"cardinality\"\n ? checkCardinality(ctx, region, pattern, constraint, selected)\n : checkCoOccurrence(ctx, region, pattern, constraint, selected);\n if (finding) findings.push(finding);\n }\n }\n return findings;\n}\n\nfunction readPatterns(options: Record<string, unknown> | undefined): CompositionPattern[] {\n const raw = options?.patterns;\n // Validate each pattern rather than trusting the shape: config arrives from\n // cloud policy / fragment prose (brief 04) and the facts layer passes\n // `options` through untyped, so a malformed entry would otherwise emit garbage\n // findings. A bad pattern is skipped and the rest keep scanning (architecture\n // failure mode); a non-array yields nothing.\n if (!Array.isArray(raw)) return [];\n return raw.filter(isCompositionPattern);\n}\n\nfunction regionMatches(\n region: Region,\n selector: CompositionRegionSelector,\n componentByNode: Map<FactId, UsageComponentFact>\n): boolean {\n // v0 matches the container by canonical componentId only. `marker`/`role` are\n // typed for brief 04 but unexercised by ACCEPTANCE §3–§8; a marker policy will\n // land with its own case (see brief 03 Deviations).\n if (!selector.component) return false;\n return componentMatches(\n componentByNode.get(region.container.id)?.componentId,\n selector.component\n );\n}\n\n/**\n * Match a usage node's resolved `componentId` against a policy component ref.\n * A ref may be fully qualified (`@scope/pkg#Name`) or a bare name (`Name`) — the\n * common authoring case (ACCEPTANCE §3 and the §10 fragment sugar both write\n * bare names). Matching the resolved componentId — not the raw JSX element —\n * survives import aliasing and wrapper renames.\n */\nfunction componentMatches(componentId: string | undefined, ref: string): boolean {\n if (componentId === undefined) return false;\n if (componentId === ref) return true;\n if (ref.includes(\"#\") && ownedComponentIdsEqual(componentId, ref)) return true;\n const hash = componentId.indexOf(\"#\");\n return hash !== -1 && componentId.slice(hash + 1) === ref;\n}\n\nfunction memberMatches(nodeId: FactId, select: CompositionChildSelector, ctx: EvalCtx): boolean {\n if (!componentMatches(ctx.componentByNode.get(nodeId)?.componentId, select.component))\n return false;\n if (select.prop === undefined) return true;\n // Static ceiling: only a statically-resolved matching prop counts. A dynamic\n // or spread prop is unknown — not a match (and not treated as absent).\n const props = ctx.propsByNode.get(nodeId) ?? [];\n return props.some((p) => {\n if (p.prop !== select.prop || p.resolution !== \"static\") return false;\n return select.value === undefined || p.value === select.value;\n });\n}\n\nfunction checkCardinality(\n ctx: EvalCtx,\n region: Region,\n pattern: CompositionPattern,\n constraint: { kind: \"cardinality\"; max?: number; min?: number },\n selected: UsageNodeFact[]\n): Finding | null {\n const count = selected.length;\n if (constraint.max !== undefined && count > constraint.max) {\n const extras = selected.slice(constraint.max); // the (max+1)th and later\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: cardinalityMaxMessage(pattern, constraint.max, count),\n location: extras[0].location,\n evidence: ctx.ix.evidence([region.container.id, ...extras.map((e) => e.id)]),\n fingerprintIdentity: cardinalityFingerprint(region, pattern, \"max\"),\n });\n }\n if (constraint.min !== undefined && count < constraint.min) {\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: cardinalityMinMessage(pattern, constraint.min, count),\n location: region.container.location,\n evidence: ctx.ix.evidence([region.container.id, ...selected.map((s) => s.id)]),\n fingerprintIdentity: cardinalityFingerprint(region, pattern, \"min\"),\n });\n }\n return null;\n}\n\nfunction checkCoOccurrence(\n ctx: EvalCtx,\n region: Region,\n pattern: CompositionPattern,\n constraint: { kind: \"co-occurrence\"; requires: { prop: string; value: string } },\n selected: UsageNodeFact[]\n): Finding | null {\n if (selected.length === 0) return null; // nothing triggers the requirement\n const requiredSelect: CompositionChildSelector = {\n component: pattern.select.component,\n prop: constraint.requires.prop,\n value: constraint.requires.value,\n };\n const satisfied = region.members.some((m) => memberMatches(m.id, requiredSelect, ctx));\n if (satisfied) return null;\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: coOccurrenceMessage(pattern, constraint),\n location: region.container.location,\n evidence: ctx.ix.evidence([region.container.id, ...selected.map((s) => s.id)]),\n fingerprintIdentity: {\n kind: \"co-occurrence\",\n file: region.container.file,\n container: region.container.nodePath,\n region: pattern.region.component,\n requires: `${constraint.requires.prop}=${constraint.requires.value}`,\n },\n });\n}\n\nfunction cardinalityFingerprint(\n region: Region,\n pattern: CompositionPattern,\n bound: \"max\" | \"min\"\n): Record<string, unknown> {\n return {\n kind: \"cardinality\",\n bound,\n file: region.container.file,\n container: region.container.nodePath,\n region: pattern.region.component,\n select: `${pattern.select.prop ?? \"\"}=${pattern.select.value ?? \"\"}`,\n };\n}\n\nfunction childLabel(select: CompositionChildSelector, plural: boolean): string {\n const base = select.value ? `${select.value} ${select.component}` : select.component;\n return plural ? `${base}s` : base;\n}\n\n/** The human-facing region name; falls back to a generic word when unnamed. */\nfunction regionLabel(pattern: CompositionPattern): string {\n return pattern.region.component ?? \"region\";\n}\n\nfunction cardinalityMaxMessage(pattern: CompositionPattern, max: number, count: number): string {\n const region = regionLabel(pattern);\n const limit = max === 1 ? \"one\" : String(max);\n const label = childLabel(pattern.select, max !== 1);\n const verb = max === 1 ? \"is\" : \"are\";\n return `At most ${limit} ${label} ${verb} allowed per ${region} (found ${count}).`;\n}\n\nfunction cardinalityMinMessage(pattern: CompositionPattern, min: number, count: number): string {\n const region = regionLabel(pattern);\n const label = childLabel(pattern.select, min !== 1);\n const verb = min === 1 ? \"is\" : \"are\";\n return `At least ${min} ${label} ${verb} required per ${region} (found ${count}).`;\n}\n\nfunction coOccurrenceMessage(\n pattern: CompositionPattern,\n constraint: { requires: { value: string } }\n): string {\n const region = regionLabel(pattern);\n const selectLabel = childLabel(pattern.select, false);\n const requiresLabel = `${constraint.requires.value} ${pattern.select.component}`;\n return `A ${region} with a ${selectLabel} should also contain a ${requiresLabel}.`;\n}\n","import type { FactIndex } from \"../facts/index.js\";\nimport { ownedComponentIdsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexComponentByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"components/preferred-component\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleJsxPreferredComponent(ix: FactIndex): Finding[] {\n const policies = ix.policy.jsxComponentPreferred();\n if (policies.length === 0) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n\n for (const [nodeId, usageComponent] of componentByNode) {\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n if (node.element.includes(\".\")) continue;\n\n for (const policy of policies) {\n if (!ownedComponentIdsEqual(usageComponent.componentId, policy.from)) continue;\n\n const replacement = componentNameFromId(policy.to);\n if (!replacement) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `<${node.element}> should use <${replacement}>.`,\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n from: policy.from,\n to: policy.to,\n },\n fix: {\n kind: \"replaceComponent\",\n title: policy.because ?? `Replace <${node.element}> with <${replacement}>`,\n from: node.element,\n to: replacement,\n deterministic: true,\n },\n attributes: {\n componentId: usageComponent.componentId,\n rawValue: node.element,\n suggestedComponent: replacement,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction componentNameFromId(componentId: string): string | undefined {\n const hash = componentId.lastIndexOf(\"#\");\n const name = hash >= 0 ? componentId.slice(hash + 1) : componentId;\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) return undefined;\n return name;\n}\n","import type { FactIndex } from \"../facts/index.js\";\nimport { ownedImportsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\n\nexport const RULE_ID = \"imports/preferred-path\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleJsxPreferredImportPath(ix: FactIndex): Finding[] {\n const policies = ix.policy.jsxImportPathPreferred();\n if (policies.length === 0) return [];\n\n const findings: Finding[] = [];\n const seen = new Set<string>();\n\n for (const usage of ix.byKind(\"usage_import\")) {\n const matches = policies.filter((policy) => {\n if (!ownedImportsEqual(policy.from, usage.source)) return false;\n if (policy.imported !== undefined && policy.imported !== usage.imported) return false;\n return true;\n });\n\n for (const policy of matches) {\n if (ownedImportsEqual(usage.source, policy.to)) continue;\n const importedIdentity = policy.imported ?? \"*\";\n const key = `${policy.id}\\0${usage.file}\\0${usage.source}\\0${usage.location.line}\\0${usage.location.column}\\0${importedIdentity}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `Import from \"${usage.source}\" should use \"${policy.to}\".`,\n location: usage.location,\n evidence: ix.evidence([usage.id, policy.id]),\n fingerprintIdentity: {\n file: usage.file,\n from: usage.source,\n to: policy.to,\n imported: policy.imported,\n line: usage.location.line,\n column: usage.location.column,\n },\n fix: {\n kind: \"replaceImport\",\n title: policy.because ?? `Replace import path with \"${policy.to}\"`,\n from: usage.source,\n to: policy.to,\n deterministic: true,\n },\n attributes: {\n importPath: usage.source,\n suggestedImport: policy.to,\n imported: usage.imported,\n local: usage.local,\n rawValue: usage.source,\n },\n })\n );\n }\n }\n\n return findings;\n}\n","/**\n * `props/invalid-value` — fires when a JSX prop is statically assigned a\n * value outside the component's declared enum values.\n *\n * The rule is intentionally conservative: it only runs for exact static\n * prop values and prop metadata that declares an allowed values list.\n * Dynamic expressions, spreads, JSX values, and open-ended prop schemas stay\n * silent so the scanner does not turn weak metadata into false certainty.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n isUniversalJsxProp,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"props/invalid-value\";\nexport const RULE_VERSION = \"1\";\n\nexport function rulePropsInvalidValue(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution !== \"static\") continue;\n if (propUsage.value === undefined) continue;\n if (isUniversalJsxProp(propUsage.prop)) continue;\n\n const metadata = ix.components.propOf(usageComponent.componentId, propUsage.prop);\n if (!metadata?.values?.length) continue;\n const allowedValues = metadata.values;\n\n const rawValue = toComparableValue(propUsage.value);\n if (rawValue === null) continue;\n if (allowedValues.includes(rawValue)) continue;\n\n const fix =\n allowedValues.length === 1\n ? {\n kind: \"replacePropValue\" as const,\n title: `Replace ${propUsage.prop} with ${formatValue(allowedValues[0])}`,\n prop: propUsage.prop,\n value: allowedValues[0],\n deterministic: true,\n }\n : undefined;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: buildMessage(node.element, propUsage.prop, propUsage.value, allowedValues),\n location: propUsage.location ?? node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, metadata.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n value: propUsage.value,\n },\n fix,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n rawValue: propUsage.value,\n allowedValues,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction toComparableValue(value: unknown): string | null {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value === null) return \"null\";\n return null;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n return String(value);\n}\n\nfunction buildMessage(\n element: string,\n prop: string,\n value: unknown,\n allowedValues: readonly string[]\n): string {\n const allowed = allowedValues.map(formatValue).join(\", \");\n return `<${element}> ${prop}=${formatValue(value)} is not an allowed value. Allowed values: ${allowed}.`;\n}\n","/**\n * Color parsing + perceptual distance for nearest-token suggestions.\n *\n * Every supported notation normalizes to 8-bit sRGB before comparison, so a\n * raw `#7c3acc` can match a token authored as `oklch(0.54 0.2 295)` and vice\n * versa. Only fully-opaque colors parse — a nearest suggestion that changes\n * opacity is worse than no suggestion. Unsupported notations (named colors,\n * lab/lch, color()) return null and simply get no nearest hint.\n */\n\nexport interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\n/** Parse a fully-opaque CSS color literal (hex, rgb/rgba, hsl/hsla, oklch) to sRGB. */\nexport function parseOpaqueColor(value: string): Rgb | null {\n const lower = value.trim().toLowerCase();\n return (\n parseHex(lower) ?? parseRgbFunction(lower) ?? parseHslFunction(lower) ?? parseOklch(lower)\n );\n}\n\n/**\n * Redmean — a cheap perceptually-weighted RGB distance (range 0–~765).\n * Good enough to separate \"same color family, different shade\" from\n * \"different hue\" without a full CIE pipeline.\n */\nexport function colorDistance(a: Rgb, b: Rgb): number {\n const rMean = (a.r + b.r) / 2;\n const dr = a.r - b.r;\n const dg = a.g - b.g;\n const db = a.b - b.b;\n return Math.sqrt(\n (2 + rMean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rMean) / 256) * db * db\n );\n}\n\nfunction parseHex(lower: string): Rgb | null {\n const hex = /^#([0-9a-f]{3,8})$/.exec(lower)?.[1];\n if (!hex) return null;\n if (hex.length === 3 || hex.length === 4) {\n if (hex.length === 4 && hex[3] !== \"f\") return null;\n return {\n r: parseInt(hex[0] + hex[0], 16),\n g: parseInt(hex[1] + hex[1], 16),\n b: parseInt(hex[2] + hex[2], 16),\n };\n }\n if (hex.length === 6 || hex.length === 8) {\n if (hex.length === 8 && hex.slice(6) !== \"ff\") return null;\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n return null;\n}\n\n/** A number with an optional `%` or `deg` suffix, used by every function notation. */\nconst COMPONENT = String.raw`[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:%|deg)?`;\n\n/**\n * Split a CSS color function's arguments, accepting both legacy comma syntax\n * (`rgb(1, 2, 3)`, `rgba(1, 2, 3, 1)`) and modern space syntax with an\n * optional `/ alpha` (`rgb(1 2 3 / 1)`). Returns the channel components plus\n * the alpha component (null when omitted).\n */\nfunction splitColorArgs(\n lower: string,\n fn: string\n): { components: string[]; alpha: string | null } | null {\n const match = new RegExp(`^${fn}a?\\\\(([^)]+)\\\\)$`).exec(lower);\n if (!match) return null;\n const body = match[1].trim();\n\n let channelPart = body;\n let alpha: string | null = null;\n if (body.includes(\"/\")) {\n const [channels, alphaPart, ...rest] = body.split(\"/\");\n if (rest.length > 0) return null;\n channelPart = channels.trim();\n alpha = alphaPart.trim();\n }\n\n const components = channelPart.includes(\",\")\n ? channelPart.split(\",\").map((part) => part.trim())\n : channelPart.split(/\\s+/);\n if (alpha === null && components.length === 4) {\n alpha = components.pop() ?? null;\n }\n if (components.length !== 3) return null;\n if (!components.every((part) => new RegExp(`^${COMPONENT}$`).test(part))) return null;\n if (alpha !== null && !new RegExp(`^${COMPONENT}$`).test(alpha)) return null;\n return { components, alpha };\n}\n\n/** True when an alpha component is omitted or fully opaque (`1`, `1.0`, `100%`). */\nfunction isOpaqueAlpha(alpha: string | null): boolean {\n if (alpha === null) return true;\n const value = alpha.endsWith(\"%\") ? Number(alpha.slice(0, -1)) / 100 : Number(alpha);\n return value === 1;\n}\n\nfunction numberOrPercent(part: string, percentScale: number): number {\n return part.endsWith(\"%\") ? (Number(part.slice(0, -1)) / 100) * percentScale : Number(part);\n}\n\nfunction clampByte(value: number): number {\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction parseRgbFunction(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"rgb\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const [r, g, b] = args.components.map((part) => numberOrPercent(part, 255));\n if ([r, g, b].some((channel) => Number.isNaN(channel) || channel < 0 || channel > 255)) {\n return null;\n }\n return { r: Math.round(r), g: Math.round(g), b: Math.round(b) };\n}\n\nfunction parseHslFunction(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"hsl\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const h = Number(args.components[0].replace(/deg$/, \"\"));\n const s = numberOrPercent(args.components[1], 1);\n const l = numberOrPercent(args.components[2], 1);\n if ([h, s, l].some(Number.isNaN) || s < 0 || s > 1 || l < 0 || l > 1) return null;\n\n const hue = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((hue / 60) % 2) - 1));\n const m = l - c / 2;\n const sector = Math.floor(hue / 60);\n const [r1, g1, b1] = [\n [c, x, 0],\n [x, c, 0],\n [0, c, x],\n [0, x, c],\n [x, 0, c],\n [c, 0, x],\n ][sector] ?? [0, 0, 0];\n return {\n r: clampByte((r1 + m) * 255),\n g: clampByte((g1 + m) * 255),\n b: clampByte((b1 + m) * 255),\n };\n}\n\n/**\n * oklch(L C H [/ alpha]) → sRGB via OKLab. L accepts 0–1 or a percentage; C\n * accepts a number or a percentage of 0.4 (per spec); H is degrees. Out-of-gamut\n * results clamp to sRGB — fine for nearness, which only needs \"is this the same\n * color family\", not colorimetric fidelity.\n */\nfunction parseOklch(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"oklch\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const l = numberOrPercent(args.components[0], 1);\n const c = numberOrPercent(args.components[1], 0.4);\n const h = Number(args.components[2].replace(/deg$/, \"\"));\n if ([l, c, h].some(Number.isNaN) || l < 0 || l > 1 || c < 0) return null;\n\n const hRad = (h * Math.PI) / 180;\n const labA = c * Math.cos(hRad);\n const labB = c * Math.sin(hRad);\n\n const l_ = l + 0.3963377774 * labA + 0.2158037573 * labB;\n const m_ = l - 0.1055613458 * labA - 0.0638541728 * labB;\n const s_ = l - 0.0894841775 * labA - 1.291485548 * labB;\n const lc = l_ * l_ * l_;\n const mc = m_ * m_ * m_;\n const sc = s_ * s_ * s_;\n\n const linearR = 4.0767416621 * lc - 3.3077115913 * mc + 0.2309699292 * sc;\n const linearG = -1.2684380046 * lc + 2.6097574011 * mc - 0.3413193965 * sc;\n const linearB = -0.0041960863 * lc - 0.7034186147 * mc + 1.707614701 * sc;\n\n return {\n r: clampByte(srgbGamma(linearR) * 255),\n g: clampByte(srgbGamma(linearG) * 255),\n b: clampByte(srgbGamma(linearB) * 255),\n };\n}\n\nfunction srgbGamma(linear: number): number {\n const clamped = Math.min(1, Math.max(0, linear));\n return clamped <= 0.0031308 ? 12.92 * clamped : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;\n}\n","/**\n * `styles/no-raw-color` — fires when a color-bearing CSS declaration or JSX\n * inline style uses a raw color literal (hex, rgb/rgba, hsl/hsla, named) and\n * the global `style.rawColors.forbid` policy is active. Token references\n * (`var(--...)`) and policy-supplied exemptions (`transparent`, etc.) pass.\n *\n * The rule looks at any `style_declaration` or `usage_inline_style` whose\n * value contains a recognizable color literal, not just declarations whose\n * property name suggests a color — backgrounds use `background:` shorthand,\n * borders use `border-color:`, and SVG uses `fill:`/`stroke:`. Detecting on\n * the *value* keeps the rule property-agnostic.\n */\n\nimport type { FactIndex, TokenDefinitionFact } from \"../facts/index.js\";\n\nimport { colorDistance, parseOpaqueColor } from \"./color-math.js\";\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceStyleValueFix } from \"./types.js\";\nimport {\n detectRawColor,\n indexComponentByNodeId,\n isApplicableTokenReference,\n isExemptColor,\n readUsageNode,\n tokenReference,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-color\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleStylesNoRawColor(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawColorPolicy();\n if (!policy) return [];\n\n const colorTokens = ix.tokens.byCategory(\"color\");\n const preferLabel = policy.prefer === \"token\" ? \"design token\" : \"CSS variable\";\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (decl.property.startsWith(\"--\") && decl.declaredTokenSource === true) continue;\n const color = detectRawColor(decl.value);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const resolution = resolveColorToken(decl.property, color, colorTokens);\n const evidenceIds = resolution\n ? [decl.id, policy.id, resolution.token.id]\n : [decl.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: colorMessage(color, `\\`${decl.property}\\``, resolution, preferLabel),\n location: decl.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: color,\n },\n fix:\n resolution?.kind === \"exact\"\n ? buildTokenFix(decl.property, decl.value, color, resolution)\n : undefined,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n color,\n source: \"css\",\n suggestedToken: resolution?.token.name,\n ...(resolution ? { tokenMatch: resolution.kind } : {}),\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n if (inline.valueKind === \"css-variable\") continue;\n const color = detectRawColor(inline.value);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const resolution = resolveColorToken(inline.property, color, colorTokens);\n const baseEvidence = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id]\n : [node.id, inline.id, policy.id];\n const evidenceIds = resolution ? [...baseEvidence, resolution.token.id] : baseEvidence;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: colorMessage(color, `inline \\`${inline.property}\\``, resolution, preferLabel),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: color,\n },\n fix:\n resolution?.kind === \"exact\"\n ? buildTokenFix(inline.property, inline.value, color, resolution)\n : undefined,\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n color,\n source: \"jsx\",\n suggestedToken: resolution?.token.name,\n ...(resolution ? { tokenMatch: resolution.kind } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\ninterface TokenMatch {\n token: TokenDefinitionFact;\n /** True when several tokens share the value and none matches the property's\n * role — the swap is a guess, so the fix must not be applied automatically. */\n ambiguous: boolean;\n}\n\n/**\n * How a raw color resolves against the project's tokens (mirrors the\n * `styles/no-raw-dimensions` resolution semantics):\n * - `exact` — value-identical token; deterministic fix unless role-ambiguous.\n * - `nearest` — no token has this exact value, but one is perceptually close\n * (an off-by-a-shade `#7c3acc` next to a `#7c3aed` accent token). Surfaced as\n * a `suggestedToken` hint on the message + attribute with NO fix object:\n * snapping changes the rendered color, and the conform engine auto-applies\n * token-backed fixes, so attaching one would silently rewrite the value.\n */\ntype ColorResolution =\n | { kind: \"exact\"; token: TokenDefinitionFact; ambiguous: boolean }\n | { kind: \"nearest\"; token: TokenDefinitionFact };\n\nfunction resolveColorToken(\n property: string,\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): ColorResolution | null {\n const exact = findTokenMatch(property, raw, tokens);\n if (exact) return { kind: \"exact\", token: exact.token, ambiguous: exact.ambiguous };\n const nearest = findNearestColorToken(raw, tokens);\n return nearest ? { kind: \"nearest\", token: nearest } : null;\n}\n\nfunction colorMessage(\n color: string,\n propertyLabel: string,\n resolution: ColorResolution | null,\n preferLabel: string\n): string {\n if (resolution?.kind === \"nearest\") {\n return `Raw color ${color} on ${propertyLabel}. Closest token is \\`${resolution.token.name}\\` (${String(resolution.token.value)}); use a ${preferLabel} instead.`;\n }\n return `Raw color ${color} on ${propertyLabel}. Use a ${preferLabel} instead.`;\n}\n\n/**\n * Redmean-weighted RGB distance cutoff for a \"nearest\" suggestion. Redmean\n * ranges 0–~765; ~60 keeps suggestions within the same visual family (an\n * off-by-one-shade brand color) while never bridging genuinely different hues.\n * Both sides parse through `parseOpaqueColor` (hex, rgb/rgba, hsl/hsla,\n * oklch), so the raw value and the token may be authored in different\n * notations and still match.\n */\nconst NEAREST_COLOR_MAX_DISTANCE = 60;\n\nfunction findNearestColorToken(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenDefinitionFact | null {\n const target = parseOpaqueColor(raw);\n if (!target) return null;\n\n let best: TokenDefinitionFact | null = null;\n let bestDistance = Infinity;\n for (const token of tokens) {\n if (typeof token.value !== \"string\") continue;\n const candidate = parseOpaqueColor(token.value);\n if (!candidate) continue;\n const distance = colorDistance(target, candidate);\n // Strict `<` plus stable iteration keeps the pick deterministic on ties.\n if (distance < bestDistance) {\n best = token;\n bestDistance = distance;\n }\n }\n return bestDistance <= NEAREST_COLOR_MAX_DISTANCE ? best : null;\n}\n\n/**\n * Find a color token whose value matches the offending raw color exactly.\n * Comparison is normalized — short hex (`#abc`) is expanded to full hex\n * (`#aabbcc`) so `#fff` and `#ffffff` collapse to the same key.\n *\n * When multiple tokens share the value (e.g. `--color-bg` and `--color-on-x`\n * both `#ffffff`), prefer the one whose name matches the declaration's semantic\n * role (`color:` → foreground, `background:` → surface, `border:` → border) so\n * a foreground color is never auto-rewritten to a background token. If no token\n * matches the role, the swap is flagged ambiguous and emitted as a non-applied\n * suggestion rather than a deterministic fix.\n */\nfunction findTokenMatch(\n property: string,\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenMatch | null {\n const target = normalizeColor(raw);\n const matches = tokens.filter((token) => normalizeColor(token.value) === target);\n if (matches.length === 0) return null;\n\n const role = colorRoleForProperty(property);\n\n if (matches.length === 1) {\n // A single value-match is safe to apply automatically *unless* the token's\n // own name signals a role that contradicts the property — e.g. a background\n // token (`--color-bg`) swapped into `color:` would make text track the page\n // surface and disappear on dark themes. In that case suggest, never apply.\n const conflicts = role ? tokenRoleConflicts(matches[0].name, role) : false;\n return { token: matches[0], ambiguous: conflicts };\n }\n\n const roleMatch = role\n ? matches.find((token) => tokenNameMatchesRole(token.name, role))\n : undefined;\n if (roleMatch) return { token: roleMatch, ambiguous: false };\n return { token: matches[0], ambiguous: true };\n}\n\n/**\n * True when a token's name matches a color role *other than* the property's and\n * not the property's own role — applying it would cross semantic roles (the\n * white-text → background-token trap). Role-neutral names (e.g.\n * `--color-brand-500`) never conflict, so a brand color used as text still gets\n * a deterministic swap.\n */\nfunction tokenRoleConflicts(name: string, role: ColorRole): boolean {\n if (tokenNameMatchesRole(name, role)) return false;\n const others: ColorRole[] = ([\"fg\", \"bg\", \"border\"] as ColorRole[]).filter((r) => r !== role);\n return others.some((other) => tokenNameMatchesRole(name, other));\n}\n\ntype ColorRole = \"fg\" | \"bg\" | \"border\";\n\nfunction colorRoleForProperty(property: string): ColorRole | null {\n const p = property.toLowerCase();\n if (p === \"color\" || p === \"fill\" || p === \"stroke\" || p.endsWith(\"text-color\")) return \"fg\";\n if (p === \"background\" || p.startsWith(\"background\") || p === \"fill\") return \"bg\";\n if (p.startsWith(\"border\") || p.startsWith(\"outline\") || p === \"box-shadow\") return \"border\";\n return null;\n}\n\nfunction tokenNameMatchesRole(name: string, role: ColorRole): boolean {\n const n = name.toLowerCase();\n if (role === \"fg\")\n return /\\b(text|fg|foreground|content|ink|on-|label)\\b|text|foreground/.test(n);\n if (role === \"bg\")\n return /\\b(bg|background|surface|fill|elevated|canvas)\\b|background|surface/.test(n);\n return /\\b(border|outline|stroke|divider|ring)\\b|border|outline/.test(n);\n}\n\nfunction normalizeColor(value: string): string {\n const lower = value.trim().toLowerCase();\n const hex = /^#([0-9a-f]{3})$/.exec(lower);\n if (hex) {\n const [r, g, b] = hex[1];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n const hex4 = /^#([0-9a-f]{4})$/.exec(lower);\n if (hex4) {\n const [r, g, b, a] = hex4[1];\n return `#${r}${r}${g}${g}${b}${b}${a}${a}`;\n }\n return lower;\n}\n\nfunction buildTokenFix(\n property: string,\n rawValue: string,\n rawColor: string,\n match: TokenMatch\n): FindingReplaceStyleValueFix {\n const reference = tokenReference(match.token.name);\n const value = replaceRawColor(rawValue, rawColor, reference);\n return {\n kind: \"replaceStyleValue\",\n title: `Replace ${property} with ${value}`,\n property,\n value,\n // Apply automatically only when the swap is unambiguous AND the reference\n // resolves verbatim. An ambiguous match (several tokens share the value,\n // none role-matching) or a token that can't be referenced from CSS (a Sass\n // *map* member, or a DTCG JSON token with no emitted custom property) is a\n // suggestion — applying it would cross roles or write non-compiling code.\n deterministic: !match.ambiguous && isApplicableTokenReference(match.token.referenceFormat),\n };\n}\n\nfunction replaceRawColor(rawValue: string, rawColor: string, replacement: string): string {\n if (rawValue === rawColor) return replacement;\n if (rawValue.includes(rawColor)) return rawValue.replace(rawColor, replacement);\n\n const pattern = new RegExp(escapeRegExp(rawColor), \"i\");\n return rawValue.replace(pattern, replacement);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/**\n * `styles/no-raw-dimensions` — fires when a length-bearing CSS declaration or\n * JSX inline style uses a raw dimension literal (`16px`, `1rem`, …) on a\n * property covered by the global `style.rawDimensions.forbid` policy.\n *\n * Suggestion strength is tiered, mirroring `styles/no-raw-spacing`:\n *\n * - **exact token match** — the raw value EXACTLY equals a tenant dimension\n * token of the same unit (units are never cross-converted — matching `1rem`\n * to a `16px` token would assume a root font size we cannot guarantee). Emits\n * a value-preserving, deterministic `var(--token)` fix.\n * - **off-scale single value** — `border-radius: 10px` when the tenant has no\n * `10px` token. Names the NEAREST token of the same unit via `suggestedToken`\n * and the message, but attaches NO fix — snapping changes the rendered value,\n * so it must stay a suggestion the author confirms, never an auto-rewrite.\n * Same-unit only: a `px` value never snaps to a `rem` token, keeping the\n * suggestion free of an assumed root-font-size.\n * - **no nearby token** (or a multi-value shorthand off-scale) — flagged with no\n * fix and no suggestion, leaving the choice to the author.\n *\n * Nearest snapping adds NO new findings and changes NO rendered values: an\n * off-scale dimension already fires under this policy; the snap only enriches\n * that finding with a `suggestedToken` hint.\n *\n * The policy is intentionally opt-in (no preset enables it): a plain\n * `fragments govern scan` never flags raw dimensions. Only callers that supply\n * a `style.rawDimensions.forbid` record (e.g. the conform tool) activate it.\n */\n\nimport type { FactId, FactIndex, TokenDefinitionFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceStyleValueFix } from \"./types.js\";\nimport { indexComponentByNodeId, parseLengthValue, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-dimensions\";\nexport const RULE_VERSION = \"1\";\n\ninterface DimensionFixMatch {\n tokens: TokenDefinitionFact[];\n fixValue: string;\n suggestedToken: string;\n}\n\n/**\n * How a raw dimension resolves against the tenant's tokens:\n * - `exact` — value-preserving token swap (deterministic, auto-applicable fix)\n * - `nearest` — closest same-unit token, surfaced as a `suggestedToken` hint with\n * NO fix object: snapping changes the rendered value, and the conform engine\n * auto-applies any token-backed `replaceStyleValue` fix, so attaching one would\n * silently rewrite the value. The suggestion rides on the message + attribute.\n * - `raw` — flagged, but no token to suggest (no fix)\n */\ntype DimensionResolution =\n | { kind: \"exact\"; tokens: TokenDefinitionFact[]; fixValue: string; suggestedToken: string }\n | { kind: \"nearest\"; token: TokenDefinitionFact; suggestedToken: string }\n | { kind: \"raw\" };\n\nexport function ruleStylesNoRawDimensions(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawDimensionPolicy();\n if (!policy) return [];\n\n const appliesTo = new Set(policy.appliesTo);\n const spacingTokens = ix.tokens.byCategory(\"spacing\");\n const radiusTokens = ix.tokens.byCategory(\"radius\");\n const preferLabel = policy.prefer === \"token\" ? \"design token\" : \"CSS variable\";\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n const property = toKebabCase(decl.property);\n if (!appliesTo.has(property)) continue;\n\n const tokens = tokensForProperty(property, spacingTokens, radiusTokens);\n const resolution = resolveDimension(decl.value, tokens);\n if (!resolution) continue;\n const tokenIds = resolutionTokenIds(resolution);\n const evidenceIds = tokenIds.length ? [decl.id, policy.id, ...tokenIds] : [decl.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: dimensionMessage(decl.value, decl.property, preferLabel, resolution, false),\n location: decl.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: dimensionFix(decl.property, resolution),\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n source: \"css\",\n suggestedToken: resolutionSuggestedToken(resolution),\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n if (inline.valueKind === \"css-variable\") continue;\n const property = toKebabCase(inline.property);\n if (!appliesTo.has(property)) continue;\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const tokens = tokensForProperty(property, spacingTokens, radiusTokens);\n const resolution = resolveDimension(inline.value, tokens);\n if (!resolution) continue;\n const baseEvidence = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id]\n : [node.id, inline.id, policy.id];\n const tokenIds = resolutionTokenIds(resolution);\n const evidenceIds = tokenIds.length ? [...baseEvidence, ...tokenIds] : baseEvidence;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: dimensionMessage(inline.value, inline.property, preferLabel, resolution, true),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: dimensionFix(inline.property, resolution),\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n source: \"jsx\",\n suggestedToken: resolutionSuggestedToken(resolution),\n },\n })\n );\n }\n\n return findings;\n}\n\n/** Normalize a JSX camelCase style key (`paddingTop`) to CSS kebab (`padding-top`). */\nfunction toKebabCase(property: string): string {\n return property.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\nfunction tokensForProperty(\n property: string,\n spacingTokens: readonly TokenDefinitionFact[],\n radiusTokens: readonly TokenDefinitionFact[]\n): readonly TokenDefinitionFact[] {\n return property.includes(\"radius\") ? radiusTokens : spacingTokens;\n}\n\n/**\n * Resolve a raw dimension against the candidate tokens, preferring an exact\n * (value-preserving) match, then a nearest same-unit snap, then no token.\n * Returns `null` when the value is neither a token match nor a raw dimension —\n * i.e. nothing to flag.\n */\nfunction resolveDimension(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): DimensionResolution | null {\n const exact = findDimensionFixMatch(raw, tokens);\n if (exact) {\n return {\n kind: \"exact\",\n tokens: exact.tokens,\n fixValue: exact.fixValue,\n suggestedToken: exact.suggestedToken,\n };\n }\n if (!isRawDimensionValue(raw)) return null;\n\n const nearest = findNearestDimensionToken(raw, tokens);\n if (nearest) return { kind: \"nearest\", ...nearest };\n return { kind: \"raw\" };\n}\n\nfunction resolutionTokenIds(resolution: DimensionResolution): FactId[] {\n if (resolution.kind === \"exact\") return resolution.tokens.map((token) => token.id);\n if (resolution.kind === \"nearest\") return [resolution.token.id];\n return [];\n}\n\nfunction resolutionSuggestedToken(resolution: DimensionResolution): string | undefined {\n if (resolution.kind === \"exact\") return resolution.suggestedToken;\n if (resolution.kind === \"nearest\") return resolution.suggestedToken;\n return undefined;\n}\n\nfunction dimensionMessage(\n rawValue: string,\n property: string,\n preferLabel: string,\n resolution: DimensionResolution,\n inline: boolean\n): string {\n const where = inline ? `inline \\`${property}\\`` : `\\`${property}\\``;\n if (resolution.kind === \"nearest\") {\n return `Raw dimension ${rawValue} on ${where}. Closest token is \\`${resolution.suggestedToken}\\` (${resolution.token.value}); use a ${preferLabel} instead.`;\n }\n return `Raw dimension ${rawValue} on ${where}. Use a ${preferLabel} instead.`;\n}\n\nfunction dimensionFix(\n property: string,\n resolution: DimensionResolution\n): FindingReplaceStyleValueFix | undefined {\n if (resolution.kind === \"exact\") {\n return {\n kind: \"replaceStyleValue\",\n title: `Replace ${property} with ${resolution.fixValue}`,\n property,\n value: resolution.fixValue,\n deterministic: true,\n };\n }\n // `nearest` deliberately emits NO fix — a value-changing snap must stay a\n // suggestion (see DimensionResolution); only the exact, value-preserving swap\n // is safe to auto-apply.\n return undefined;\n}\n\n/**\n * Find a dimension token whose value matches the raw literal exactly, compared\n * in canonical px. No fuzzy/nearest matching — only value-preserving swaps earn\n * an exact match.\n */\nfunction findDimensionMatch(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenDefinitionFact | null {\n const target = normalizeDimension(raw);\n if (target === null) return null;\n for (const token of tokens) {\n if (normalizeDimension(token.value) === target) return token;\n }\n return null;\n}\n\nfunction findDimensionFixMatch(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): DimensionFixMatch | null {\n const single = findDimensionMatch(raw, tokens);\n if (single) {\n return {\n tokens: [single],\n fixValue: tokenVar(single),\n suggestedToken: single.name,\n };\n }\n\n const parts = raw.trim().split(/\\s+/);\n if (parts.length < 2 || parts.length > 4) return null;\n\n const matches: TokenDefinitionFact[] = [];\n for (const part of parts) {\n const match = findDimensionMatch(part, tokens);\n if (!match) return null;\n matches.push(match);\n }\n\n return {\n tokens: matches,\n fixValue: matches.map(tokenVar).join(\" \"),\n suggestedToken: matches.map((token) => token.name).join(\" \"),\n };\n}\n\n/**\n * For an off-scale SINGLE dimension value, find the nearest token of the SAME\n * unit. Same-unit only keeps the suggestion value-safe: matching a `px` value\n * to a `rem` token would assume a root font size we cannot guarantee. A non-zero\n * value never snaps to a `0` token (that silently removes the dimension), and a\n * multi-value shorthand returns null (no single nearest target).\n */\nfunction findNearestDimensionToken(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): { token: TokenDefinitionFact; suggestedToken: string } | null {\n const parsed = parseLengthValue(raw);\n if (!parsed) return null;\n const rawUnit = parsed.unit ?? \"px\";\n\n let best: { token: TokenDefinitionFact; value: number } | null = null;\n for (const token of tokens) {\n const tokenLength = parseLengthValue(token.value);\n if (!tokenLength) continue;\n const tokenUnit = tokenLength.unit ?? \"px\";\n if (tokenUnit !== rawUnit) continue;\n if (tokenLength.value === parsed.value) continue; // exact handled elsewhere\n if (tokenLength.value === 0 && parsed.value !== 0) continue; // never snap to 0\n if (best === null) {\n best = { token, value: tokenLength.value };\n continue;\n }\n const delta = Math.abs(parsed.value - tokenLength.value);\n const bestDelta = Math.abs(parsed.value - best.value);\n // Ties break toward the smaller token value, then first-seen, for stability.\n if (delta < bestDelta || (delta === bestDelta && tokenLength.value < best.value)) {\n best = { token, value: tokenLength.value };\n }\n }\n\n if (!best) return null;\n return {\n token: best.token,\n suggestedToken: best.token.name,\n };\n}\n\nfunction isRawDimensionValue(raw: string): boolean {\n if (normalizeDimension(raw) !== null) return true;\n const parts = raw.trim().split(/\\s+/);\n return (\n parts.length >= 2 &&\n parts.length <= 4 &&\n parts.every((part) => normalizeDimension(part) !== null)\n );\n}\n\n/**\n * Canonical match key `${amount}${unit}` (unitless treated as px, for React\n * inline numerics and `0`). Units are intentionally NOT cross-converted:\n * matching `1rem` to a `16px` token would assume a 16px root font size we\n * cannot guarantee, so a unit mismatch never matches. This keeps every emitted\n * fix value-preserving.\n */\nfunction normalizeDimension(value: string): string | null {\n const parsed = parseLengthValue(value);\n if (!parsed) return null;\n return `${parsed.value}${parsed.unit ?? \"px\"}`;\n}\n\nfunction tokenVar(token: TokenDefinitionFact): string {\n if (token.name.startsWith(\"$\")) return token.name;\n const cssVarName = token.name.startsWith(\"--\")\n ? token.name\n : `--${token.name.replace(/\\./g, \"-\")}`;\n return `var(${cssVarName})`;\n}\n","import type { TokenDefinitionFact } from \"../facts/index.js\";\n\nimport {\n isApplicableTokenReference,\n matchesScale,\n nearestSignedScaleValue,\n normalizeLengthForScale,\n parseLengthValue,\n tokenReference,\n type ParsedLengthValue,\n} from \"./utils.js\";\n\nexport interface SpacingResolutionScale {\n name: string;\n unit: \"px\" | \"rem\";\n rootFontSizePx?: number;\n emBasePx?: number;\n}\n\n/** Spacing tokens keyed by their value normalized into a given scale's unit. */\nexport type SpacingTokenLookup = Map<number, TokenDefinitionFact>;\n\nexport interface CheckedSpacingValue {\n normalizedValue: number;\n /** Best-effort suggestion for display, even when no fix is emitted. */\n suggestedValue?: string;\n /** Token name backing suggestedValue, when the canonical token vocabulary has one. */\n suggestedToken?: string;\n /** Whether a fix object should be attached (suggestion reliable enough). */\n fixEmittable: boolean;\n deterministicFix: boolean;\n /** Dominant reason for the finding — drives message wording. */\n reason: \"off-scale\" | \"token-equivalent\";\n /** Token name when the violation is a raw literal that equals a token. */\n matchedToken?: string;\n assumedRootFontSizePx?: number;\n assumedEmBasePx?: number;\n}\n\nexport function buildSpacingTokenLookup(\n tokens: readonly TokenDefinitionFact[],\n scale: SpacingResolutionScale\n): SpacingTokenLookup {\n const out: SpacingTokenLookup = new Map();\n for (const token of tokens) {\n const parsed = parseLengthValue(token.value);\n if (!parsed) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) continue;\n const key = Math.abs(normalized.value);\n // First token wins so the suggestion is stable across runs.\n if (!out.has(key)) out.set(key, token);\n }\n return out;\n}\n\nexport function resolveSpacingValue(input: {\n raw: string;\n allowed: readonly number[];\n scale: SpacingResolutionScale;\n tokens: SpacingTokenLookup;\n bareNumberFix?: boolean;\n}): CheckedSpacingValue | null {\n const parts = parseLengthParts(input.raw);\n if (!parts) return null;\n\n let firstViolation: CheckedSpacingValue | null = null;\n const suggestedParts: string[] = [];\n let anyViolation = false;\n let anyOffScale = false;\n let canFixAll = true;\n // A snap is only reliable enough to *offer* when the value normalization was\n // exact — an assumed em/rem base makes the px guess unreliable, so report the\n // suggestion but attach no deterministic fix.\n let reliableSuggestion = true;\n // Deterministic only when every violating part is a value-preserving,\n // verbatim-resolvable token swap.\n let allApplicableValuePreserving = true;\n\n for (const part of parts) {\n const normalized = normalizeLengthForScale(part.parsed, input.scale);\n if (normalized === null) return null;\n const magnitude = Math.abs(normalized.value);\n const onScale = matchesScale(normalized.value, input.allowed);\n const exactToken = input.tokens.get(magnitude);\n\n if (onScale) {\n if (!exactToken) {\n // On-grid value with no named token (e.g. `0`) — not a violation.\n suggestedParts.push(part.raw);\n continue;\n }\n // On-grid literal that equals a token: value-preserving swap.\n anyViolation = true;\n const reference = tokenReference(exactToken.name);\n const applicable =\n isApplicableTokenReference(exactToken.referenceFormat) && normalized.deterministicFix;\n if (!applicable) allApplicableValuePreserving = false;\n suggestedParts.push(reference);\n if (!firstViolation) {\n firstViolation = {\n normalizedValue: normalized.value,\n suggestedValue: reference,\n suggestedToken: exactToken.name,\n fixEmittable: true,\n deterministicFix: applicable,\n reason: \"token-equivalent\",\n matchedToken: exactToken.name,\n assumedRootFontSizePx: normalized.assumedRootFontSizePx,\n assumedEmBasePx: normalized.assumedEmBasePx,\n };\n }\n continue;\n }\n\n // Off the scale — flag, suggest the nearest scale value as its token when\n // one exists. Snapping changes rendered value, so this is not deterministic.\n anyViolation = true;\n anyOffScale = true;\n allApplicableValuePreserving = false;\n\n const nearest = nearestSignedScaleValue(normalized.value, input.allowed);\n const snapsToZero = nearest === 0 && normalized.value !== 0;\n let suggestedPart: string | undefined;\n let suggestedToken: string | undefined;\n if (nearest === null || snapsToZero) {\n suggestedPart = undefined;\n canFixAll = false;\n suggestedParts.push(part.raw);\n } else {\n const nearestToken = input.tokens.get(Math.abs(nearest));\n suggestedToken = nearestToken?.name;\n suggestedPart = nearestToken\n ? tokenReference(nearestToken.name)\n : input.bareNumberFix\n ? `${nearest}`\n : `${nearest}${input.scale.unit}`;\n suggestedParts.push(suggestedPart);\n if (!normalized.deterministicFix) reliableSuggestion = false;\n }\n\n if (!firstViolation) {\n firstViolation = {\n normalizedValue: normalized.value,\n suggestedValue: suggestedPart,\n suggestedToken,\n fixEmittable: false,\n deterministicFix: false,\n reason: \"off-scale\",\n assumedRootFontSizePx: normalized.assumedRootFontSizePx,\n assumedEmBasePx: normalized.assumedEmBasePx,\n };\n }\n }\n\n if (!firstViolation || !anyViolation) return null;\n\n const joined = suggestedParts.join(\" \");\n const changes = joined !== input.raw.trim().replace(/\\s+/g, \" \");\n const fixEmittable = canFixAll && reliableSuggestion && changes;\n const deterministic = fixEmittable && !anyOffScale && allApplicableValuePreserving;\n\n return {\n ...firstViolation,\n reason: anyOffScale ? \"off-scale\" : \"token-equivalent\",\n fixEmittable,\n deterministicFix: deterministic,\n suggestedValue: canFixAll ? joined : firstViolation.suggestedValue,\n };\n}\n\nfunction parseLengthParts(raw: string): Array<{ raw: string; parsed: ParsedLengthValue }> | null {\n const trimmed = raw.trim();\n if (!trimmed || /var\\(|calc\\(|min\\(|max\\(|clamp\\(|,/i.test(trimmed)) return null;\n const parts = trimmed.split(/\\s+/);\n if (parts.length < 1 || parts.length > 4) return null;\n\n const parsed = parts.map((part) => {\n const length = parseLengthValue(part);\n return length ? { raw: part, parsed: length } : null;\n });\n if (parsed.some((part) => part === null)) return null;\n return parsed as Array<{ raw: string; parsed: ParsedLengthValue }>;\n}\n","/**\n * `styles/no-raw-spacing` — fires when a length-bearing CSS declaration or\n * JSX inline style on a scaled property uses a raw spacing literal instead of\n * a design token.\n *\n * The rule needs both a `style.property.scale` policy (which property is\n * scaled, and which scale name backs it) and a matching set of `scale_value`\n * facts (the allowed numbers). If either is missing the rule is silent for\n * that property.\n *\n * Two violation shapes, mirroring `styles/no-raw-color`:\n *\n * - **off the scale** — `padding: 13px` on a [0,4,8,12,16] scale. Flagged; the\n * suggested fix snaps to the nearest scale value (as the matching token when\n * one exists, else the raw grid value). Because snapping *changes* the\n * rendered value, the fix is a suggestion (non-deterministic) — never applied\n * silently.\n * - **on the scale but a raw literal that equals a token** — `padding: 16px`\n * where `--space-md` is `16px`. Flagged; the fix swaps in `var(--space-md)`.\n * This is value-preserving, so it is a deterministic, auto-applicable fix.\n * (Only fires when a matching spacing token exists — a pure-grid value with no\n * named token, like `0`, stays silent.)\n *\n * `padding: var(--space-3)` → silent (token reference). `padding: 1.5rem` on a\n * px scale → normalized through the configured root font size before matching.\n */\n\nimport type {\n FactId,\n FactIndex,\n ScaleFact,\n StyleDeclarationFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n} from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport {\n buildSpacingTokenLookup,\n resolveSpacingValue,\n type CheckedSpacingValue,\n type SpacingTokenLookup,\n} from \"./spacing-resolution.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexComponentByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-spacing\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleStylesNoRawSpacing(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n\n // Token lookups are scale-relative (token values normalize to the scale's\n // unit), so cache one per scale name to avoid rebuilding per declaration.\n const lookupCache = new Map<string, SpacingTokenLookup>();\n const lookupFor = (scale: ScaleFact): SpacingTokenLookup => {\n let lookup = lookupCache.get(scale.name);\n if (!lookup) {\n lookup = buildSpacingTokenLookup(ix.tokens.byCategory(\"spacing\"), scale);\n lookupCache.set(scale.name, lookup);\n }\n return lookup;\n };\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n const finding = checkDeclaration(ix, decl, lookupFor);\n if (finding) findings.push(finding);\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n const finding = checkInlineStyle(ix, inline, componentByNode, lookupFor);\n if (finding) findings.push(finding);\n }\n\n return findings;\n}\n\n/**\n * Inline style property names arrive camelCase (`marginTop`); the policy keys\n * spacing scales by CSS property (`margin-top`). Normalize so longhand inline\n * props resolve their scale the same way the CSS file path does.\n */\nfunction cssPropertyName(property: string): string {\n return property.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction checkDeclaration(\n ix: FactIndex,\n decl: StyleDeclarationFact,\n lookupFor: (scale: ScaleFact) => SpacingTokenLookup\n): Finding | null {\n const policy = ix.policy.propertyScale(decl.property);\n if (!policy) return null;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return null;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return null;\n\n const checked = resolveSpacingValue({\n raw: decl.value,\n allowed,\n scale,\n tokens: lookupFor(scale),\n });\n if (!checked) return null;\n\n return makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: spacingMessage(decl.property, decl.value, allowed, scale.unit, checked),\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id, scale.id]),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: buildSpacingFix(decl.property, checked),\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n suggestedToken: checked.suggestedToken,\n reason: checked.reason,\n normalizedValue: checked.normalizedValue,\n normalizedUnit: scale.unit,\n assumedRootFontSizePx: checked.assumedRootFontSizePx,\n assumedEmBasePx: checked.assumedEmBasePx,\n source: \"css\",\n },\n });\n}\n\nfunction checkInlineStyle(\n ix: FactIndex,\n inline: UsageInlineStyleFact,\n componentByNode: Map<FactId, UsageComponentFact>,\n lookupFor: (scale: ScaleFact) => SpacingTokenLookup\n): Finding | null {\n const policy = ix.policy.propertyScale(cssPropertyName(inline.property));\n if (!policy) return null;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return null;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return null;\n\n if (inline.valueKind === \"css-variable\") return null;\n\n const checked = resolveSpacingValue({\n raw: inline.value,\n allowed,\n scale,\n tokens: lookupFor(scale),\n bareNumberFix: inline.valueKind === \"number\",\n });\n if (!checked) return null;\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) return null;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const evidenceIds = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id, scale.id]\n : [node.id, inline.id, policy.id, scale.id];\n\n return makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: spacingMessage(inline.property, inline.value, allowed, scale.unit, checked),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: buildSpacingFix(inline.property, checked),\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n suggestedToken: checked.suggestedToken,\n reason: checked.reason,\n normalizedValue: checked.normalizedValue,\n normalizedUnit: scale.unit,\n assumedRootFontSizePx: checked.assumedRootFontSizePx,\n assumedEmBasePx: checked.assumedEmBasePx,\n source: \"jsx\",\n },\n });\n}\n\nfunction buildSpacingFix(property: string, checked: CheckedSpacingValue) {\n if (!checked.fixEmittable || checked.suggestedValue === undefined) return undefined;\n return {\n kind: \"replaceStyleValue\" as const,\n title: `Replace ${property} with ${checked.suggestedValue}`,\n property,\n value: checked.suggestedValue,\n deterministic: checked.deterministicFix,\n };\n}\n\nfunction spacingMessage(\n property: string,\n value: string,\n allowed: number[],\n unit: \"px\" | \"rem\",\n checked: CheckedSpacingValue\n): string {\n if (checked.reason === \"token-equivalent\" && checked.matchedToken) {\n return `\\`${property}: ${value}\\` is a raw literal that matches token \\`${checked.matchedToken}\\`. Reference the token instead.`;\n }\n const sample = allowed\n .slice()\n .sort((a, b) => a - b)\n .slice(0, 6);\n const suffix = `${sample.join(unit + \", \")}${unit}`;\n const ellipsis = allowed.length > sample.length ? \", …\" : \"\";\n return `\\`${property}: ${value}\\` is not on the spacing scale. Allowed: ${suffix}${ellipsis}.`;\n}\n","/**\n * `styles/no-raw-typography` — fires when a `font-size` declaration or JSX\n * inline `fontSize` uses a raw length literal instead of a typography token.\n *\n * Consumes the `style.fontSize.mustMatchScale` policy (a `style_font_size_scale`\n * fact) plus a backing scale. Without both it is silent — typography is only\n * enforced once a project actually has a font-size scale (derived from its\n * detected typography tokens). This closes the teach-vs-enforce gap where the\n * agent context advertises typography tokens but nothing flags off-scale text.\n *\n * Behaviour mirrors `styles/no-raw-spacing`:\n * - off the scale (`font-size: 13px` on [12,14,16]) → suggestion, never applied\n * silently (snapping changes rendered size);\n * - on the scale but a raw literal equal to a token (`font-size: 16px` where\n * `--font-size-md` is `16px`) → deterministic, value-preserving token swap.\n */\n\nimport type {\n FactId,\n FactIndex,\n ScaleFact,\n StyleDeclarationFact,\n TokenDefinitionFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n} from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n isApplicableTokenReference,\n matchesScale,\n nearestSignedScaleValue,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n tokenReference,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-typography\";\nexport const RULE_VERSION = \"1\";\n\nconst FONT_SIZE_PROPERTIES = new Set([\"font-size\", \"fontsize\"]);\n\nexport function ruleStylesNoRawTypography(ix: FactIndex): Finding[] {\n const policy = ix.policy.fontSizeScale();\n if (!policy) return [];\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return [];\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return [];\n\n const tokens = buildTypographyTokenLookup(ix, scale);\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (decl.property.toLowerCase() !== \"font-size\") continue;\n const checked = checkFontSize(decl.value, allowed, scale, tokens);\n if (!checked) continue;\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: typographyMessage(decl.property, decl.value, allowed, scale.unit, checked),\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id, scale.id]),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: buildFix(decl.property, checked),\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n source: \"css\",\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n if (inline.valueKind === \"css-variable\") continue;\n if (!FONT_SIZE_PROPERTIES.has(inline.property.toLowerCase())) continue;\n const checked = checkFontSize(inline.value, allowed, scale, tokens, inline.valueKind === \"number\");\n if (!checked) continue;\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const evidenceIds = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id, scale.id]\n : [node.id, inline.id, policy.id, scale.id];\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: typographyMessage(inline.property, inline.value, allowed, scale.unit, checked),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: buildFix(inline.property, checked),\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n source: \"jsx\",\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction buildTypographyTokenLookup(\n ix: FactIndex,\n scale: ScaleFact\n): Map<number, TokenDefinitionFact> {\n const out = new Map<number, TokenDefinitionFact>();\n for (const token of ix.tokens.byCategory(\"typography\")) {\n const parsed = parseLengthValue(token.value);\n if (!parsed || parsed.unit === null) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) continue;\n const key = Math.abs(normalized.value);\n if (!out.has(key)) out.set(key, token);\n }\n return out;\n}\n\ninterface CheckedFontSize {\n suggestedValue?: string;\n fixEmittable: boolean;\n deterministicFix: boolean;\n reason: \"off-scale\" | \"token-equivalent\";\n matchedToken?: string;\n}\n\nfunction checkFontSize(\n raw: string,\n allowed: number[],\n scale: ScaleFact,\n tokens: Map<number, TokenDefinitionFact>,\n bareNumberFix = false\n): CheckedFontSize | null {\n const trimmed = raw.trim();\n if (!trimmed || /var\\(|calc\\(|clamp\\(|min\\(|max\\(|,|\\s/.test(trimmed)) return null;\n const parsed = parseLengthValue(trimmed);\n if (!parsed) return null;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) return null;\n const magnitude = Math.abs(normalized.value);\n const exactToken = tokens.get(magnitude);\n\n if (matchesScale(normalized.value, allowed)) {\n if (!exactToken) return null;\n const applicable =\n isApplicableTokenReference(exactToken.referenceFormat) && normalized.deterministicFix;\n return {\n suggestedValue: tokenReference(exactToken.name),\n fixEmittable: true,\n deterministicFix: applicable,\n reason: \"token-equivalent\",\n matchedToken: exactToken.name,\n };\n }\n\n const nearest = nearestSignedScaleValue(normalized.value, allowed);\n if (nearest === null || (nearest === 0 && normalized.value !== 0)) {\n return { fixEmittable: false, deterministicFix: false, reason: \"off-scale\" };\n }\n const nearestToken = tokens.get(Math.abs(nearest));\n const suggestedValue = nearestToken\n ? tokenReference(nearestToken.name)\n : bareNumberFix\n ? `${nearest}`\n : `${nearest}${scale.unit}`;\n // Off-scale snaps change rendered size → suggestion only; and an assumed\n // root base makes the px guess unreliable, so attach no fix then.\n return {\n suggestedValue,\n fixEmittable: normalized.deterministicFix,\n deterministicFix: false,\n reason: \"off-scale\",\n };\n}\n\nfunction buildFix(property: string, checked: CheckedFontSize) {\n if (!checked.fixEmittable || checked.suggestedValue === undefined) return undefined;\n return {\n kind: \"replaceStyleValue\" as const,\n title: `Replace ${property} with ${checked.suggestedValue}`,\n property,\n value: checked.suggestedValue,\n deterministic: checked.deterministicFix,\n };\n}\n\nfunction typographyMessage(\n property: string,\n value: string,\n allowed: number[],\n unit: \"px\" | \"rem\",\n checked: CheckedFontSize\n): string {\n if (checked.reason === \"token-equivalent\" && checked.matchedToken) {\n return `\\`${property}: ${value}\\` is a raw literal that matches token \\`${checked.matchedToken}\\`. Reference the token instead.`;\n }\n const sample = allowed\n .slice()\n .sort((a, b) => a - b)\n .slice(0, 6);\n const suffix = `${sample.join(unit + \", \")}${unit}`;\n const ellipsis = allowed.length > sample.length ? \", …\" : \"\";\n return `\\`${property}: ${value}\\` is not on the typography scale. Allowed: ${suffix}${ellipsis}.`;\n}\n","import type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\n\nexport const RULE_ID = \"theme/no-theme-coupled-literal\";\nexport const RULE_VERSION = \"1\";\n\nconst COLOR_LITERAL_GLOBAL =\n /#[0-9a-fA-F]{3,8}\\b|\\b(?:rgba?|hsla?|oklab|oklch|lab|lch)\\(\\s*[\\d.%\\s,\\/]+\\s*\\)/g;\nconst WHITE_RGBA = /^rgba?\\(\\s*255\\s*,\\s*255\\s*,\\s*255/i;\nconst BLACK_RGBA = /^rgba?\\(\\s*0\\s*,\\s*0\\s*,\\s*0/i;\nconst COLOR_MIX_OPEN = \"color-mix(\";\nconst BOX_SHADOW_PROP = /^(?:-webkit-|-moz-)?box-shadow$/i;\nconst NEUTRAL_SHADOW = /^(?:none|inherit|initial|unset|revert|revert-layer)\\s*$/i;\n\nexport function ruleThemeNoThemeCoupledLiteral(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const findings: Finding[] = [];\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (isTokenFile(decl.file)) continue;\n const hit = findThemeCoupledLiteral(decl.property, decl.value);\n if (!hit) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: hit.message,\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n rawValue: hit.rawValue,\n reason: hit.reason,\n },\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n color: hit.rawValue,\n suggestion: hit.suggestion,\n source: \"css\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction findThemeCoupledLiteral(\n property: string,\n value: string,\n): { rawValue: string; reason: string; message: string; suggestion: string } | null {\n COLOR_LITERAL_GLOBAL.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = COLOR_LITERAL_GLOBAL.exec(value)) !== null) {\n const raw = match[0];\n if (insideLightDark(value, match.index)) continue;\n\n if (insideColorMix(value, match.index)) {\n return {\n rawValue: raw,\n reason: \"color-mix\",\n message: `color-mix() argument ${raw} is theme-coupled. Use a semantic token or wrap the declaration in light-dark(...).`,\n suggestion: `Replace ${raw} with a semantic token or light-dark(...)`,\n };\n }\n\n if (BOX_SHADOW_PROP.test(property) && !NEUTRAL_SHADOW.test(value.trim())) {\n return {\n rawValue: raw,\n reason: \"box-shadow\",\n message: `Custom box-shadow with literal color ${raw} is theme-coupled. Use a shadow/elevation token or light-dark(...).`,\n suggestion: \"Use a shadow/elevation token or light-dark(...)\",\n };\n }\n\n if (WHITE_RGBA.test(raw) || BLACK_RGBA.test(raw)) {\n return {\n rawValue: raw,\n reason: \"white-black-rgba\",\n message: `Raw ${raw} assumes one theme. Wrap it in light-dark(...) or use a semantic token.`,\n suggestion: WHITE_RGBA.test(raw)\n ? `light-dark(/* TODO light-theme equivalent */, ${raw})`\n : `light-dark(${raw}, /* TODO dark-theme equivalent */)`,\n };\n }\n }\n\n return null;\n}\n\nfunction insideLightDark(value: string, index: number): boolean {\n return enclosingFunctionName(value, index) === \"light-dark\";\n}\n\nfunction insideColorMix(value: string, index: number): boolean {\n return enclosingFunctionName(value, index) === \"color-mix\";\n}\n\nfunction enclosingFunctionName(value: string, index: number): string | null {\n let depth = 0;\n for (let i = index - 1; i >= 0; i--) {\n const ch = value[i];\n if (ch === \")\") {\n depth++;\n continue;\n }\n if (ch !== \"(\") continue;\n if (depth > 0) {\n depth--;\n continue;\n }\n const before = value.slice(0, i).match(/([a-z-]+)\\s*$/i);\n return before?.[1]?.toLowerCase() ?? null;\n }\n return null;\n}\n\nfunction isTokenFile(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, \"/\");\n const base = normalized.slice(normalized.lastIndexOf(\"/\") + 1);\n if (base === \"_tokens.scss\" || base === \"tokens.scss\") return true;\n return base.startsWith(\"_\") && /(^|\\/)tokens\\//.test(normalized);\n}\n","/**\n * `tailwind/arbitrary-color` — flags color-bearing Tailwind utilities with\n * arbitrary raw color values, e.g. `bg-[#abc123]` or\n * `text-[rgb(10,20,30)]`.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { detectRawColor, isExemptColor, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/arbitrary-color\";\nexport const RULE_VERSION = \"1\";\n\nconst COLOR_UTILITIES = new Set([\n \"accent\",\n \"bg\",\n \"border\",\n \"border-b\",\n \"border-e\",\n \"border-l\",\n \"border-r\",\n \"border-s\",\n \"border-t\",\n \"border-x\",\n \"border-y\",\n \"caret\",\n \"decoration\",\n \"divide\",\n \"fill\",\n \"from\",\n \"outline\",\n \"placeholder\",\n \"ring\",\n \"ring-offset\",\n \"shadow\",\n \"stroke\",\n \"text\",\n \"to\",\n \"via\",\n]);\n\nexport function ruleTailwindArbitraryColor(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawColorPolicy();\n if (!policy) return [];\n\n const findings: Finding[] = [];\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"arbitrary\") continue;\n if (!COLOR_UTILITIES.has(klass.utility)) continue;\n\n const color = detectRawColor(klass.value.raw);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node ? [node.id, klass.id, policy.id] : [klass.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` uses arbitrary raw color ${color}. Use a ${policy.prefer === \"token\" ? \"design token\" : \"CSS variable\"} instead.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: fingerprintIdentity(klass, color),\n attributes: {\n rawClass: klass.raw,\n rawValue: klass.value.raw,\n color,\n utility: klass.utility,\n source: \"tailwind\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction fingerprintIdentity(klass: TailwindClassFact, color: string): Record<string, unknown> {\n return {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n value: color,\n };\n}\n","/**\n * `tailwind/arbitrary-spacing` — flags arbitrary Tailwind spacing utilities\n * that cannot be proven to sit on the configured spacing scale.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n matchesScale,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/arbitrary-spacing\";\nexport const RULE_VERSION = \"1\";\n\nconst SPACING_UTILITY_TO_PROPERTY: ReadonlyMap<string, string> = new Map([\n [\"m\", \"margin\"],\n [\"mt\", \"margin\"],\n [\"mr\", \"margin\"],\n [\"mb\", \"margin\"],\n [\"ml\", \"margin\"],\n [\"ms\", \"margin\"],\n [\"me\", \"margin\"],\n [\"mx\", \"margin\"],\n [\"my\", \"margin\"],\n [\"p\", \"padding\"],\n [\"pt\", \"padding\"],\n [\"pr\", \"padding\"],\n [\"pb\", \"padding\"],\n [\"pl\", \"padding\"],\n [\"ps\", \"padding\"],\n [\"pe\", \"padding\"],\n [\"px\", \"padding\"],\n [\"py\", \"padding\"],\n [\"gap\", \"gap\"],\n [\"gap-x\", \"gap\"],\n [\"gap-y\", \"gap\"],\n [\"space-x\", \"gap\"],\n [\"space-y\", \"gap\"],\n] as const);\n\nexport function ruleTailwindArbitrarySpacing(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"arbitrary\") continue;\n\n const property = SPACING_UTILITY_TO_PROPERTY.get(klass.utility);\n if (!property) continue;\n\n const policy = ix.policy.propertyScale(property);\n if (!policy) continue;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) continue;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) continue;\n\n const parsed = parseLengthValue(klass.value.raw);\n const normalized = parsed ? normalizeLengthForScale(parsed, scale) : null;\n if (normalized && matchesScale(normalized.value, allowed)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, policy.id, scale.id]\n : [klass.id, policy.id, scale.id];\n\n const fix = buildFix(klass);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` is an arbitrary spacing value not on the project's spacing scale.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n value: klass.value.raw,\n },\n fix,\n attributes: {\n rawClass: klass.raw,\n rawValue: klass.value.raw,\n utility: klass.utility,\n property,\n scale: scale.name,\n allowed,\n normalizedValue: normalized?.value,\n normalizedUnit: normalized ? scale.unit : undefined,\n assumedRootFontSizePx: normalized?.assumedRootFontSizePx,\n assumedEmBasePx: normalized?.assumedEmBasePx,\n source: \"tailwind\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction buildFix(klass: TailwindClassFact): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${klass.raw}`,\n from: klass.raw,\n to: null,\n utility: klass.utility,\n deterministic: false,\n };\n}\n","import type { FactIndex, TailwindClassFact, TailwindTokenResolvedFact } from \"../facts/index.js\";\n\nexport const TAILWIND_COLOR_UTILITIES = new Set([\n \"accent\",\n \"bg\",\n \"border\",\n \"border-b\",\n \"border-e\",\n \"border-l\",\n \"border-r\",\n \"border-s\",\n \"border-t\",\n \"border-x\",\n \"border-y\",\n \"caret\",\n \"decoration\",\n \"divide\",\n \"fill\",\n \"from\",\n \"outline\",\n \"placeholder\",\n \"ring\",\n \"ring-offset\",\n \"shadow\",\n \"stroke\",\n \"text\",\n \"to\",\n \"via\",\n]);\n\n/**\n * Tailwind color *keywords* that are not palette families and carry no\n * satisfiable \"use a named family\" remedy. `bg-white`, `text-black`,\n * `border-transparent`, `ring-current`, `divide-inherit` are stock utilities a\n * project ships with regardless of its configured palette, so the palette\n * allow/deny policy must never flag them (doing so produces an unfixable\n * warning and double-reports against `raw-color-via-token`).\n */\nexport const UNIVERSAL_TAILWIND_COLOR_TOKENS = new Set([\n \"white\",\n \"black\",\n \"transparent\",\n \"current\",\n \"inherit\",\n \"none\",\n]);\n\nexport const TAILWIND_SPACING_UTILITY_TO_PROPERTY: ReadonlyMap<string, string> = new Map([\n [\"m\", \"margin\"],\n [\"mt\", \"margin\"],\n [\"mr\", \"margin\"],\n [\"mb\", \"margin\"],\n [\"ml\", \"margin\"],\n [\"ms\", \"margin\"],\n [\"me\", \"margin\"],\n [\"mx\", \"margin\"],\n [\"my\", \"margin\"],\n [\"p\", \"padding\"],\n [\"pt\", \"padding\"],\n [\"pr\", \"padding\"],\n [\"pb\", \"padding\"],\n [\"pl\", \"padding\"],\n [\"ps\", \"padding\"],\n [\"pe\", \"padding\"],\n [\"px\", \"padding\"],\n [\"py\", \"padding\"],\n [\"gap\", \"gap\"],\n [\"gap-x\", \"gap\"],\n [\"gap-y\", \"gap\"],\n [\"space-x\", \"gap\"],\n [\"space-y\", \"gap\"],\n] as const);\n\nexport function indexResolvedTailwindTokens(\n ix: FactIndex\n): Map<string, TailwindTokenResolvedFact> {\n const out = new Map<string, TailwindTokenResolvedFact>();\n for (const fact of ix.byKind(\"tailwind_token_resolved\")) {\n out.set(resolvedKey(fact.utility, fact.token), fact);\n }\n return out;\n}\n\nexport function resolvedForClass(\n resolvedByKey: ReadonlyMap<string, TailwindTokenResolvedFact>,\n klass: TailwindClassFact\n): TailwindTokenResolvedFact | undefined {\n if (klass.value.kind !== \"token\") return undefined;\n return resolvedByKey.get(resolvedKey(klass.utility, klass.value.token));\n}\n\nexport function resolvedKey(utility: string, token: string): string {\n return `${utility}\\0${token}`;\n}\n\nexport function matchPattern(value: string, patterns: readonly string[]): string | null {\n for (const pattern of patterns) {\n if (matchesTokenGlob(value, pattern)) return pattern;\n }\n return null;\n}\n\nfunction matchesTokenGlob(value: string, pattern: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`).test(value);\n}\n","/**\n * `tailwind/forbidden-palette` — enforces Tailwind palette allow/deny policy\n * against resolved token-form color utilities.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n matchPattern,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n UNIVERSAL_TAILWIND_COLOR_TOKENS,\n} from \"./tailwind-rule-utils.js\";\nimport { readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/forbidden-palette\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindForbiddenPalette(ix: FactIndex): Finding[] {\n const deny = ix.policy.tailwindPaletteDeny();\n const allow = ix.policy.tailwindPaletteAllow();\n if (!deny && !allow) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n const token = klass.value.token;\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n if (UNIVERSAL_TAILWIND_COLOR_TOKENS.has(token)) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"color\") continue;\n if (resolved.resolved.source === \"theme-css\") continue;\n\n const deniedPattern = deny ? matchPattern(token, deny.patterns) : null;\n const allowedPattern = allow ? matchPattern(token, allow.patterns) : null;\n const allowViolation = allow && !allowedPattern;\n if (!deniedPattern && !allowViolation) continue;\n\n const policy = deniedPattern ? deny! : allow!;\n const matchedPattern = deniedPattern ?? allowedPattern ?? null;\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id]\n : [klass.id, resolved.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: messageFor(klass, token, deniedPattern, allow?.patterns ?? []),\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token,\n matchedPattern,\n },\n fix: buildFix(klass),\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token,\n matchedPattern,\n allowedPatterns: allow?.patterns,\n source: resolved.resolved.source,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction messageFor(\n klass: TailwindClassFact,\n token: string,\n deniedPattern: string | null,\n allowedPatterns: readonly string[]\n): string {\n if (deniedPattern) {\n return `\\`${klass.raw}\\` uses the \\`${token}\\` palette token, which is forbidden by policy \\`deny: ${deniedPattern}\\`.`;\n }\n return `\\`${klass.raw}\\` uses the \\`${token}\\` palette token, which is outside the allowed Tailwind palette patterns [${allowedPatterns.join(\", \")}].`;\n}\n\nfunction buildFix(klass: TailwindClassFact): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${klass.raw}`,\n from: klass.raw,\n to: null,\n utility: klass.utility,\n deterministic: false,\n };\n}\n","/**\n * `tailwind/off-scale-spacing-token` — checks resolved Tailwind spacing\n * tokens against the same project spacing scale used for CSS declarations.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n resolvedForClass,\n TAILWIND_SPACING_UTILITY_TO_PROPERTY,\n} from \"./tailwind-rule-utils.js\";\nimport {\n matchesScale,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/off-scale-spacing-token\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindOffScaleSpacingToken(ix: FactIndex): Finding[] {\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n const property = TAILWIND_SPACING_UTILITY_TO_PROPERTY.get(klass.utility);\n if (!property) continue;\n\n const policy = ix.policy.propertyScale(property);\n if (!policy) continue;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) continue;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"length\") continue;\n\n const parsed = parseLengthValue(resolved.resolved.value);\n if (!parsed) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (!normalized) continue;\n const signedValue = klass.negative ? -normalized.value : normalized.value;\n if (matchesScale(signedValue, allowed)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id, scale.id]\n : [klass.id, resolved.id, policy.id, scale.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` resolves to ${formatResolvedValue(signedValue, scale.unit)}, which is not on the project's spacing scale [${allowed.join(\", \")}].`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: signedValue,\n scale: scale.name,\n },\n fix: buildFix(klass.raw, klass.utility),\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n property,\n scale: scale.name,\n allowed,\n resolvedValue: resolved.resolved.value,\n resolvedPx: scale.unit === \"px\" ? signedValue : undefined,\n resolvedUnit: scale.unit,\n source: resolved.resolved.source,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction formatResolvedValue(value: number, unit: string): string {\n return unit === \"px\" ? `${value}px` : `${value}${unit}`;\n}\n\nfunction buildFix(raw: string, utility: string): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${raw}`,\n from: raw,\n to: null,\n utility,\n deterministic: false,\n };\n}\n","/**\n * `tailwind/raw-color-via-token` — flags Tailwind color tokens that resolve\n * to literal colors when policy requires named palette families.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n matchPattern,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n UNIVERSAL_TAILWIND_COLOR_TOKENS,\n} from \"./tailwind-rule-utils.js\";\nimport { detectRawColor, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/raw-color-via-token\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindRawColorViaToken(ix: FactIndex): Finding[] {\n const allow = ix.policy.tailwindPaletteAllow();\n if (!allow || allow.patterns.length === 0) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n if (UNIVERSAL_TAILWIND_COLOR_TOKENS.has(klass.value.token)) continue;\n if (matchPattern(klass.value.token, allow.patterns)) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"color\") continue;\n if (resolved.resolved.source === \"theme-css\") continue;\n\n const color = detectRawColor(resolved.resolved.value);\n if (!color) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, allow.id]\n : [klass.id, resolved.id, allow.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: allow.severity,\n message: `\\`${klass.raw}\\` resolves to raw color \\`${color}\\` (${sourceLabel(resolved.resolved.source)}). Project policy requires \\`${allow.patterns.join(\"`, `\")}\\` palette tokens.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: color,\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: color,\n source: resolved.resolved.source,\n allowedPatterns: allow.patterns,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction sourceLabel(source: \"theme-css\" | \"default\"): string {\n return source === \"default\" ? \"Tailwind default\" : source;\n}\n","/**\n * `tailwind/unknown-class` — opt-in strict-mode diagnostics for classes that\n * either fail parser utility recognition or fail token resolution.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n} from \"./tailwind-rule-utils.js\";\nimport { readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/unknown-class\";\nexport const RULE_VERSION = \"1\";\n\n/** Color keywords valid in any palette — never a \"did not resolve\" miss. */\nconst UNIVERSAL_COLOR_KEYWORDS = new Set([\n \"white\",\n \"black\",\n \"transparent\",\n \"current\",\n \"currentcolor\",\n \"inherit\",\n \"none\",\n]);\n\nexport function ruleTailwindUnknownClass(ix: FactIndex): Finding[] {\n const policy = ix.policy.tailwindUnknownClassEnabled();\n if (!policy) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.utility === \"unknown\") {\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node ? [node.id, klass.id, policy.id] : [klass.id, policy.id];\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` could not be parsed as a known Tailwind utility.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n reason: \"parse-failure\",\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n reason: \"parse-failure\",\n },\n })\n );\n continue;\n }\n\n if (klass.value.kind !== \"token\") continue;\n\n // The resolution-miss diagnostic is about PALETTE tokens only. Don't flag\n // non-color utilities (font-medium, items-center, border-2 width), bare\n // numeric tokens (sizes/widths, not colors), or universal color keywords\n // (white/black/transparent) as \"did not resolve to a palette token\".\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n // `shadow` is dual-purpose: `shadow-{size}` (sm/lg/xl/...) is box-shadow,\n // not a color. The resolution-miss check can't distinguish a size keyword\n // from a misspelled color, so it would flag every `shadow-lg`. Skip it —\n // shadow *color* misuse is rare and not worth the false positives.\n if (klass.utility === \"shadow\") continue;\n const token = klass.value.token;\n if (/^\\d/.test(token)) continue;\n if (UNIVERSAL_COLOR_KEYWORDS.has(token.toLowerCase())) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"unknown\") continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id]\n : [klass.id, resolved.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` did not resolve to any known palette token.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n reason: \"resolution-miss\",\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n reason: \"resolution-miss\",\n },\n })\n );\n }\n\n return findings;\n}\n","import type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { cssVariableNames } from \"./utils.js\";\n\nexport const RULE_ID = \"tokens/require-dual-fallback\";\nexport const RULE_VERSION = \"1\";\n\nconst CSS_VAR_WITH_OPTIONAL_FALLBACK = /var\\(\\s*(--[A-Za-z0-9_-]+)(\\s*,\\s*[^)]*)?\\)/g;\n\n/**\n * The dual-fallback convention — `var(--token, $token)` — is only meaningful in\n * a Sass pipeline, where the `$token` half resolves at build time. In plain CSS\n * (`.css`/`.module.css`), inline styles, or CSS-in-JS, a `$token` literal is\n * invalid and would silently break the declaration, so the rule (and its\n * autofix) must never touch those files.\n */\nconst SASS_FILE = /\\.(scss|sass)$/i;\n\nexport function ruleTokensRequireDualFallback(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const knownTokenVars = cssVariableNames(ix.tokens.list());\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (!SASS_FILE.test(decl.file)) continue;\n CSS_VAR_WITH_OPTIONAL_FALLBACK.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = CSS_VAR_WITH_OPTIONAL_FALLBACK.exec(decl.value)) !== null) {\n const tokenName = match[1];\n const hasFallback = match[2] !== undefined;\n if (hasFallback) continue;\n if (!knownTokenVars.has(tokenName) && !tokenName.startsWith(\"--fui-\")) continue;\n\n const rawValue = match[0];\n const scssVar = tokenName.replace(/^--/, \"$\");\n const replacement = `var(${tokenName}, ${scssVar})`;\n const nextValue = decl.value.replace(rawValue, replacement);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: `var(${tokenName}) is missing an SCSS fallback. Use var(${tokenName}, ${scssVar}).`,\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n tokenName,\n },\n fix: {\n kind: \"replaceStyleValue\",\n title: `Add fallback for ${tokenName}`,\n property: decl.property,\n value: nextValue,\n deterministic: true,\n },\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n tokenName,\n suggestedValue: nextValue,\n source: \"css\",\n },\n }),\n );\n }\n }\n\n return findings;\n}\n","import type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { contractPrefixFamilies } from \"./utils.js\";\n\nexport const RULE_ID = \"tokens/css-vars-must-be-defined\";\nexport const RULE_VERSION = \"1\";\n\n// The leading `var(--name` of a reference. The `var(` keyword is matched\n// case-insensitively (CSS function names are case-insensitive per spec, so\n// `VAR(`/`Var(` must be caught — #33) but the captured custom-property name stays\n// case-preserving (custom-property names ARE case-sensitive; vocabulary.has must\n// stay exact). We judge ONLY the PRIMARY var() position — everything in fallback\n// position (a nested `var()`, a `$`/literal fallback) is ignored uniformly (#17):\n// after each match we skip past this var()'s matching close-paren so an inner\n// fallback var() is never re-scanned as a fresh primary.\nconst CSS_VAR_REFERENCE = /var\\(\\s*(--[A-Za-z0-9_-]+)/gi;\n\n/**\n * Off-contract token drift (FUI2015).\n *\n * Activation is gated entirely on the `style.cssVars.mustBeDefined` policy fact,\n * which is declared ONLY when a project has authored token source files (the\n * cloud appends it when `tokenSourceFiles` is non-empty). No fact → no-op, so\n * the `fragments` preset alone never activates this rule.\n *\n * When active, a `var(--x)` is drift iff `--x` is shaped like a contract token\n * but is NOT in the vocabulary. \"Shaped like a contract token\" means one of:\n * 1. it shares a prefix family of the authored vocabulary (e.g. `--fui-`); OR\n * 2. it is single-segment (no hyphen after `--`, e.g. `--accent`) AND the\n * vocabulary itself contains at least one single-segment token.\n * Clause 2 keeps the rule live for FLAT token systems (`--accent`, `--bg`, which\n * yield no prefix family — #22/#25/#31/#36) and enforces the flat half of a MIXED\n * `--fui-*` + `--accent` vocabulary symmetrically with the namespaced half (#18),\n * order-independently. Genuinely foreign custom properties (`--swiper-*`,\n * `--radix-*`, layout/animation vars) are multi-segment with no shared family, so\n * they remain ignored — the rule neither floods on unrelated `var()`s nor fires\n * for projects without a contract. Hardcoded values are handled by the unchanged\n * `styles/no-raw-color` rule; this rule only judges custom-property references.\n */\nexport function ruleTokensCssVarsMustBeDefined(ix: FactIndex): Finding[] {\n const policy = ix.policy.cssVarsMustBeDefined();\n if (!policy) return [];\n\n // The contract vocabulary travels on its OWN fact channel (contract_token),\n // injected by the CLI from the user's token source files — kept separate from\n // the local `token_definition` facts the raw-* rules + scale detection read.\n const vocabulary = new Set(ix.byKind(\"contract_token\").map((token) => token.name));\n // The truly-unauthored case (no contract token facts) is the only hard return —\n // it preserves the §11 inert-without-contract regression lock.\n if (vocabulary.size === 0) return [];\n\n // A flat/single-segment vocabulary (`--accent`, `--bg`) yields no prefix family,\n // but the rule must STILL enforce it (#22/#25/#31/#36) — we no longer hard-return\n // on an empty family set. `hasFlatTokens` lets single-segment refs through the\n // shaped gate whenever the vocabulary itself declares single-segment tokens,\n // which also enforces the flat half of a mixed vocabulary symmetrically (#18).\n const prefixes = contractPrefixFamilies(vocabulary);\n const hasFlatTokens = [...vocabulary].some(isSingleSegmentVarName);\n const locallyDefinedCustomProperties = new Set(\n ix\n .byKind(\"style_declaration\")\n .filter((decl) => decl.property.startsWith(\"--\"))\n .map((decl) => decl.property)\n );\n\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n // Dedupe token names WITHIN one declaration so a value referencing the SAME\n // off-contract var twice yields ONE finding (#11) — otherwise the two share an\n // identical fingerprintIdentity and silently collapse to one at ingest. Scoped\n // per-declaration: the same var in two DIFFERENT declarations still yields two.\n const seen = new Set<string>();\n CSS_VAR_REFERENCE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = CSS_VAR_REFERENCE.exec(decl.value)) !== null) {\n const tokenName = match[1];\n // Advance past this var()'s matching close-paren so an inner fallback var()\n // is never re-scanned as a fresh primary — only the PRIMARY position is\n // judged (#17). `var(` starts at match.index, so the `(` is at +3.\n CSS_VAR_REFERENCE.lastIndex = skipToCloseParen(decl.value, match.index + 3);\n\n if (vocabulary.has(tokenName)) continue;\n const shaped =\n sharesContractPrefix(tokenName, prefixes) ||\n (hasFlatTokens && isSingleSegmentVarName(tokenName)) ||\n locallyDefinedCustomProperties.has(tokenName);\n if (!shaped) continue;\n if (seen.has(tokenName)) continue;\n seen.add(tokenName);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `var(${tokenName}) is not in the contract token vocabulary. Use a token defined in your contract's token source files.`,\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n tokenName,\n },\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n tokenName,\n source: \"css\",\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction sharesContractPrefix(name: string, prefixes: ReadonlySet<string>): boolean {\n for (const prefix of prefixes) {\n if (name.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/**\n * Whether a `--name` is single-segment (no hyphen after the leading `--`), e.g.\n * `--accent` (true) vs `--fui-color-accent` / `--swiper-theme-color` (false).\n * Mirrors `contractPrefixFamilies`' index-of(`-`, 2) so the two stay consistent.\n */\nfunction isSingleSegmentVarName(name: string): boolean {\n return name.indexOf(\"-\", 2) === -1;\n}\n\n/**\n * Index just past the `)` that closes the open paren AT `openParenIndex`\n * (a balanced-paren scan, so a nested fallback `var(--a, var(--b))` is skipped as\n * one unit). Returns the string length if the value is unbalanced (no close),\n * which safely ends the scan.\n */\nfunction skipToCloseParen(value: string, openParenIndex: number): number {\n let depth = 0;\n for (let i = openParenIndex; i < value.length; i++) {\n const ch = value[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i + 1;\n }\n }\n return value.length;\n}\n","/**\n * The blocking deny-set — the SINGLE source of truth for \"which findings may\n * hard-deny a UI write\" across every altitude of the contract: the CLI\n * pre-write hook (Node) AND the Contract Mode emit gate (a browser-safe\n * serverless route). Lifted out of `packages/cli/src/hook/check.ts`\n * (Contract Mode Phase 0) so the two cannot fork — a deny here must imply a CI\n * failure, and that invariant only holds if both read the same criteria.\n *\n * Pure and browser-safe: it reads only a `Finding`'s `ruleId` / `severity` /\n * `fix` shape — no Node APIs, no config off disk, no clock. The CLI hook\n * re-exports `isDenyEligible` from here.\n */\nimport { severityLevel } from \"../severity.js\";\nimport type { Finding } from \"./types.js\";\n\n/**\n * The ONLY rules whose findings may hard-deny a write: deterministic,\n * single-file-decidable, high-confidence classes (architecture Open Q2). A rule\n * is added here DELIBERATELY — new rules gain no blocking power by default, so a\n * future heuristic rule can't silently start denying writes. Heuristic/INFERRED\n * classes (`composition/*`, `tailwind/*arbitrary*`) are absent on purpose: at\n * most advisory, never a block.\n */\nexport const BLOCKING_RULE_ALLOWLIST: ReadonlySet<string> = new Set([\n \"styles/no-raw-color\", // raw hex/rgb/hsl color literal\n \"styles/no-raw-spacing\", // off-scale / untokenized spacing literal\n \"tailwind/off-scale-spacing-token\", // off-scale Tailwind spacing utility\n \"components/prefer-library\", // raw element bypasses a canonical component\n \"components/preferred-component\", // imported component bypasses its canonical\n]);\n\n/**\n * Mirrors `scanWithFacts`'s own CI exit logic: a finding gates CI when it is\n * error-severity, or warn-severity under `ci.failOnWarnings`. Gating on exactly\n * this set is what makes a local/emit deny imply a CI failure.\n */\nexport function gatesCi(finding: Finding, failOnWarnings: boolean): boolean {\n const level = severityLevel(finding.severity);\n return level === \"error\" || (failOnWarnings && level === \"warn\");\n}\n\n/** A finding may deny iff it is allowlisted, gates CI, and is not heuristic. */\nexport function isDenyEligible(finding: Finding, failOnWarnings: boolean): boolean {\n if (!BLOCKING_RULE_ALLOWLIST.has(finding.ruleId)) return false;\n // Advisory findings — the low-confidence precision tiers a rule flags with\n // `attributes.advisory` (prefer-library's role-reimpl / interactive-div /\n // html-advisory / icon-only tiers, and the reimplements-primitive className\n // heuristic) — are surfaced but NEVER block a write, even if a project raises\n // their severity or sets failOnWarnings. Same \"only deny when the engine is\n // confident\" principle as the non-deterministic-fix guard below.\n if (finding.attributes?.advisory === true) return false;\n if (!gatesCi(finding, failOnWarnings)) return false;\n // Most explicitly non-deterministic fixes are the engine's own low-confidence\n // signal (for example, several tokens share a value). A prefer-library\n // finding may still be an exact policy violation, but hard-denying it is only\n // DX-safe when the configured mapping proves that every observed prop can be\n // preserved. The conform AST preflight independently checks the source and\n // binding before any edit is applied.\n if (finding.fix?.deterministic === false) {\n if (\n finding.ruleId !== \"components/prefer-library\" ||\n finding.attributes?.propCompatibility !== \"observed-complete\"\n ) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Rule taxonomy — the single source of truth for tier classification.\n *\n * Every governance rule is either:\n * - **Tier A (contract vocabulary)** — measures drift from a vocabulary the\n * team *declared* (the two-choice contract: canonical components + token\n * source files). Headline-eligible; on by default but *inert until a\n * contract is authored* (each Tier-A rule self-gates on its contract facts).\n * - **Tier B (generic hygiene)** — generic best-practice opinions (raw values,\n * a11y, theme literals, Tailwind). Never the headline; off by default for\n * customers, opt-in per rule.\n *\n * This map is consumed by the core customer-default preset (`./presets.ts`), the\n * cloud policy composer, and the UI rules editor. There is exactly one copy —\n * importers derive their defaults from it rather than re-listing rules (DRY).\n *\n * Identifiers are stable: this introduces no new rule ids, it only attaches a\n * tier label to existing ones.\n */\n\nexport type RuleTier = \"contract\" | \"hygiene\";\n\n/**\n * Tier of every rule in `RULES`. Tier A is exactly the two-choice-contract\n * rules; everything else is hygiene. A coverage test asserts this map and\n * `RULES` stay in lock-step (every rule id classified, no strays).\n */\nexport const RULE_TIER: Readonly<Record<string, RuleTier>> = {\n // ---- Tier A — contract vocabulary -------------------------------------\n \"components/prefer-library\": \"contract\", // canonical-component bypass (FUI1004)\n \"tokens/css-vars-must-be-defined\": \"contract\", // token drift (FUI2015)\n\n // ---- Tier B — generic hygiene -----------------------------------------\n \"components/unknown-prop\": \"hygiene\",\n \"components/forbidden-prop-value\": \"hygiene\",\n \"props/invalid-value\": \"hygiene\",\n \"imports/preferred-path\": \"hygiene\",\n \"components/preferred-component\": \"hygiene\",\n \"styles/no-raw-color\": \"hygiene\",\n \"styles/no-raw-dimensions\": \"hygiene\",\n \"styles/no-raw-spacing\": \"hygiene\",\n \"styles/no-raw-typography\": \"hygiene\",\n \"tailwind/arbitrary-color\": \"hygiene\",\n \"tailwind/arbitrary-spacing\": \"hygiene\",\n \"tailwind/forbidden-palette\": \"hygiene\",\n \"tailwind/off-scale-spacing-token\": \"hygiene\",\n \"tailwind/raw-color-via-token\": \"hygiene\",\n \"tailwind/unknown-class\": \"hygiene\",\n \"tokens/require-dual-fallback\": \"hygiene\",\n \"theme/no-theme-coupled-literal\": \"hygiene\",\n \"a11y/required-accessible-name\": \"hygiene\",\n // Composition constraints are authored contracts, but not part of the\n // two-choice headline contract; they self-activate when patterns are declared\n // (the compiler injects their configs), so off-by-default here is harmless.\n \"composition/cardinality\": \"hygiene\",\n \"composition/co-occurrence\": \"hygiene\",\n};\n\n/**\n * Rules removed from the customer default preset *entirely* — Fragments-internal\n * conventions that are meaningless on a customer repo. They remain available\n * under the full `fragments` preset for Fragments' own dogfooding; they are\n * never even an opt-in toggle in the customer default.\n *\n * `tokens/require-dual-fallback` — the `var(--x, $x)` SCSS micro-convention —\n * was ~51% of the dogfood flood and is the canonical example.\n */\nexport const FRAGMENTS_INTERNAL_RULE_IDS: ReadonlySet<string> = new Set([\n \"tokens/require-dual-fallback\",\n]);\n\n/** Tier of a rule id. Unknown ids fail safe to `hygiene` (off by default). */\nexport function tierFor(ruleId: string): RuleTier {\n return RULE_TIER[ruleId] ?? \"hygiene\";\n}\n\n/** True when the rule measures declared-contract drift (headline-eligible). */\nexport function isContractTierRule(ruleId: string): boolean {\n return tierFor(ruleId) === \"contract\";\n}\n\n/** All Tier-A (contract vocabulary) rule ids, in declaration order. */\nexport function contractTierRuleIds(): string[] {\n return Object.keys(RULE_TIER).filter(isContractTierRule);\n}\n\n/** All Tier-B (generic hygiene) rule ids, in declaration order. */\nexport function hygieneTierRuleIds(): string[] {\n return Object.keys(RULE_TIER).filter((id) => !isContractTierRule(id));\n}\n\n/**\n * Vocabulary-first headline order: canonical-component bypass ranks above token\n * drift, both above any hygiene. This is the SSOT the dashboard headline (brief\n * 05) consumes so \"vocabulary-first\" is defined once, not re-encoded per surface.\n */\nconst VOCABULARY_ORDER: readonly string[] = [\n \"components/prefer-library\",\n \"tokens/css-vars-must-be-defined\",\n];\n\n/** Headline rank of a rule id (lower = higher in the vocabulary-first list). */\nexport function vocabularyRank(ruleId: string): number {\n const index = VOCABULARY_ORDER.indexOf(ruleId);\n return index >= 0 ? index : VOCABULARY_ORDER.length;\n}\n\n/** Comparator ordering rule ids vocabulary-first (Tier A before hygiene). */\nexport function compareByVocabularyRank(a: string, b: string): number {\n return vocabularyRank(a) - vocabularyRank(b);\n}\n","/**\n * Rule presets — the customer default vs the full `fragments` dogfood preset.\n *\n * Both are derived from the tier SSOT (`./tiers.ts`); neither re-lists rules.\n *\n * - **customer default** — Tier A on (inert until a contract is authored),\n * Tier B off, Fragments-internal rules excluded entirely. This is the\n * vocabulary-first, no-flood default a customer repo gets.\n * - **`fragments`** — every rule on, for Fragments' own internal scans.\n *\n * These produce the rule-config half of a `GovernanceConfig`. The hygiene\n * *policy facts* (e.g. `style.rawColors.forbid`, spacing scales) are a separate\n * config axis the customer default simply omits — so a Tier-B rule that gates on\n * a policy fact (raw-color/spacing/typography) stays inert regardless of its\n * config flag, and the customer default produces zero findings without a\n * contract.\n */\n\nimport {\n FRAGMENTS_INTERNAL_RULE_IDS,\n RULE_TIER,\n isContractTierRule,\n} from \"./tiers.js\";\n\nexport interface PresetRuleState {\n enabled: boolean;\n severity?: \"error\" | \"warn\" | \"info\";\n}\n\n/**\n * Customer default rule states: Tier A enabled (self-gating on contract facts),\n * Tier B disabled, Fragments-internal rules omitted entirely. Feed directly to\n * `compileGlobalGovernanceFacts({ rules })` (with no hygiene `styles` config).\n */\nexport function customerDefaultRuleStates(): Record<string, PresetRuleState> {\n const states: Record<string, PresetRuleState> = {};\n for (const ruleId of Object.keys(RULE_TIER)) {\n if (FRAGMENTS_INTERNAL_RULE_IDS.has(ruleId)) continue;\n states[ruleId] = isContractTierRule(ruleId)\n ? { enabled: true, severity: \"warn\" }\n : { enabled: false };\n }\n return states;\n}\n\n/**\n * Full `fragments` preset rule states: every rule on. Includes the\n * Fragments-internal rules (e.g. `tokens/require-dual-fallback`) the customer\n * default excludes.\n */\nexport function fragmentsPresetRuleStates(): Record<string, PresetRuleState> {\n const states: Record<string, PresetRuleState> = {};\n for (const ruleId of Object.keys(RULE_TIER)) {\n states[ruleId] = { enabled: true, severity: \"warn\" };\n }\n return states;\n}\n","/**\n * Rules — pure functions over `FactIndex` that return `Finding[]`.\n *\n * Phase 5 ships five generic rules. They are content-addressed: scanning the\n * same source twice produces the same fingerprints, so Cloud can dedupe and\n * preserve event history. Rules never reach into raw fact arrays — every\n * lookup goes through `FactIndex`.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { ruleA11yRequiredAccessibleName } from \"./a11y-required-accessible-name.js\";\nimport { ruleComponentsPreferLibrary } from \"./components-prefer-library.js\";\nimport { ruleComponentsForbiddenPropValue } from \"./components-forbidden-prop-value.js\";\nimport { ruleComponentsUnknownProp } from \"./components-unknown-prop.js\";\nimport { ruleCompositionCardinality, ruleCompositionCoOccurrence } from \"./composition-pattern.js\";\nimport { ruleJsxPreferredComponent } from \"./jsx-preferred-component.js\";\nimport { ruleJsxPreferredImportPath } from \"./jsx-preferred-import-path.js\";\nimport { rulePropsInvalidValue } from \"./props-invalid-value.js\";\nimport { ruleStylesNoRawColor } from \"./styles-no-raw-color.js\";\nimport { ruleStylesNoRawDimensions } from \"./styles-no-raw-dimensions.js\";\nimport { ruleStylesNoRawSpacing } from \"./styles-no-raw-spacing.js\";\nimport { ruleStylesNoRawTypography } from \"./styles-no-raw-typography.js\";\nimport { ruleThemeNoThemeCoupledLiteral } from \"./theme-no-theme-coupled-literal.js\";\nimport { ruleTailwindArbitraryColor } from \"./tailwind-arbitrary-color.js\";\nimport { ruleTailwindArbitrarySpacing } from \"./tailwind-arbitrary-spacing.js\";\nimport { ruleTailwindForbiddenPalette } from \"./tailwind-forbidden-palette.js\";\nimport { ruleTailwindOffScaleSpacingToken } from \"./tailwind-off-scale-spacing-token.js\";\nimport { ruleTailwindRawColorViaToken } from \"./tailwind-raw-color-via-token.js\";\nimport { ruleTailwindUnknownClass } from \"./tailwind-unknown-class.js\";\nimport { ruleTokensRequireDualFallback } from \"./tokens-require-dual-fallback.js\";\nimport { ruleTokensCssVarsMustBeDefined } from \"./tokens-css-vars-must-be-defined.js\";\nimport type { Finding } from \"./types.js\";\n\nexport type RuleFn = (ix: FactIndex) => Finding[];\n\nexport interface Rule {\n id: string;\n version: string;\n run: RuleFn;\n}\n\nexport const RULES: readonly Rule[] = [\n {\n id: \"components/unknown-prop\",\n version: \"1\",\n run: ruleComponentsUnknownProp,\n },\n {\n id: \"components/forbidden-prop-value\",\n version: \"1\",\n run: ruleComponentsForbiddenPropValue,\n },\n {\n id: \"props/invalid-value\",\n version: \"1\",\n run: rulePropsInvalidValue,\n },\n {\n id: \"imports/preferred-path\",\n version: \"1\",\n run: ruleJsxPreferredImportPath,\n },\n {\n id: \"components/preferred-component\",\n version: \"1\",\n run: ruleJsxPreferredComponent,\n },\n {\n id: \"components/prefer-library\",\n version: \"1\",\n run: ruleComponentsPreferLibrary,\n },\n {\n id: \"styles/no-raw-color\",\n version: \"1\",\n run: ruleStylesNoRawColor,\n },\n {\n id: \"styles/no-raw-dimensions\",\n version: \"1\",\n run: ruleStylesNoRawDimensions,\n },\n {\n id: \"styles/no-raw-spacing\",\n version: \"1\",\n run: ruleStylesNoRawSpacing,\n },\n {\n id: \"styles/no-raw-typography\",\n version: \"1\",\n run: ruleStylesNoRawTypography,\n },\n {\n id: \"tailwind/arbitrary-color\",\n version: \"1\",\n run: ruleTailwindArbitraryColor,\n },\n {\n id: \"tailwind/arbitrary-spacing\",\n version: \"1\",\n run: ruleTailwindArbitrarySpacing,\n },\n {\n id: \"tailwind/forbidden-palette\",\n version: \"1\",\n run: ruleTailwindForbiddenPalette,\n },\n {\n id: \"tailwind/off-scale-spacing-token\",\n version: \"1\",\n run: ruleTailwindOffScaleSpacingToken,\n },\n {\n id: \"tailwind/raw-color-via-token\",\n version: \"1\",\n run: ruleTailwindRawColorViaToken,\n },\n {\n id: \"tailwind/unknown-class\",\n version: \"1\",\n run: ruleTailwindUnknownClass,\n },\n {\n id: \"tokens/require-dual-fallback\",\n version: \"1\",\n run: ruleTokensRequireDualFallback,\n },\n {\n id: \"tokens/css-vars-must-be-defined\",\n version: \"1\",\n run: ruleTokensCssVarsMustBeDefined,\n },\n {\n id: \"theme/no-theme-coupled-literal\",\n version: \"1\",\n run: ruleThemeNoThemeCoupledLiteral,\n },\n {\n id: \"a11y/required-accessible-name\",\n version: \"1\",\n run: ruleA11yRequiredAccessibleName,\n },\n {\n id: \"composition/cardinality\",\n version: \"1\",\n run: ruleCompositionCardinality,\n },\n {\n id: \"composition/co-occurrence\",\n version: \"1\",\n run: ruleCompositionCoOccurrence,\n },\n];\n\n/**\n * Run every Phase 5 rule and return findings sorted by `(file, line, column,\n * fingerprint)` so output is stable across runs.\n */\nexport function runRules(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n for (const rule of RULES) findings.push(...rule.run(ix));\n return sortFindings(findings);\n}\n\nfunction sortFindings(findings: Finding[]): Finding[] {\n return findings.slice().sort((a, b) => {\n const fileCmp = a.location.file.localeCompare(b.location.file);\n if (fileCmp !== 0) return fileCmp;\n if (a.location.line !== b.location.line) return a.location.line - b.location.line;\n if (a.location.column !== b.location.column) return a.location.column - b.location.column;\n return a.fingerprint.localeCompare(b.fingerprint);\n });\n}\n\nexport type {\n Finding,\n FindingFix,\n FindingReplaceComponentFix,\n FindingReplaceImportFix,\n FindingReplacePropValueFix,\n FindingReplaceStyleValueFix,\n FindingReplaceClassTokenFix,\n} from \"./types.js\";\nexport { makeFinding } from \"./finding.js\";\n// Blocking deny-set (Contract Mode Phase 0): the shared \"may this finding\n// hard-deny a write\" criteria, used by the CLI pre-write hook and the emit gate.\nexport { BLOCKING_RULE_ALLOWLIST, gatesCi, isDenyEligible } from \"./emit-gate.js\";\nexport { ruleComponentsUnknownProp } from \"./components-unknown-prop.js\";\nexport { ruleComponentsForbiddenPropValue } from \"./components-forbidden-prop-value.js\";\nexport { ruleComponentsPreferLibrary } from \"./components-prefer-library.js\";\nexport { rulePropsInvalidValue } from \"./props-invalid-value.js\";\nexport { ruleJsxPreferredImportPath } from \"./jsx-preferred-import-path.js\";\nexport { ruleJsxPreferredComponent } from \"./jsx-preferred-component.js\";\nexport { ruleStylesNoRawColor } from \"./styles-no-raw-color.js\";\nexport { ruleStylesNoRawDimensions } from \"./styles-no-raw-dimensions.js\";\nexport { ruleStylesNoRawSpacing } from \"./styles-no-raw-spacing.js\";\nexport { ruleStylesNoRawTypography } from \"./styles-no-raw-typography.js\";\nexport { ruleTailwindArbitraryColor } from \"./tailwind-arbitrary-color.js\";\nexport { ruleTailwindArbitrarySpacing } from \"./tailwind-arbitrary-spacing.js\";\nexport { ruleTailwindForbiddenPalette } from \"./tailwind-forbidden-palette.js\";\nexport { ruleTailwindOffScaleSpacingToken } from \"./tailwind-off-scale-spacing-token.js\";\nexport { ruleTailwindRawColorViaToken } from \"./tailwind-raw-color-via-token.js\";\nexport { ruleTailwindUnknownClass } from \"./tailwind-unknown-class.js\";\nexport { ruleTokensRequireDualFallback } from \"./tokens-require-dual-fallback.js\";\nexport { ruleTokensCssVarsMustBeDefined } from \"./tokens-css-vars-must-be-defined.js\";\nexport { ruleThemeNoThemeCoupledLiteral } from \"./theme-no-theme-coupled-literal.js\";\nexport { ruleA11yRequiredAccessibleName } from \"./a11y-required-accessible-name.js\";\nexport { ruleCompositionCardinality, ruleCompositionCoOccurrence } from \"./composition-pattern.js\";\nexport {\n RULE_TIER,\n FRAGMENTS_INTERNAL_RULE_IDS,\n tierFor,\n isContractTierRule,\n contractTierRuleIds,\n hygieneTierRuleIds,\n vocabularyRank,\n compareByVocabularyRank,\n} from \"./tiers.js\";\nexport type { RuleTier } from \"./tiers.js\";\nexport { customerDefaultRuleStates, fragmentsPresetRuleStates } from \"./presets.js\";\nexport type { PresetRuleState } from \"./presets.js\";\nexport {\n compositionPatternSchema,\n compositionAuthoringEntrySchema,\n isCompositionPattern,\n lowerCompositionContract,\n} from \"./composition-pattern-schema.js\";\nexport type {\n CompositionPattern,\n CompositionRegionSelector,\n CompositionChildSelector,\n CompositionConstraint,\n CompositionAuthoringEntry,\n} from \"./composition-pattern-schema.js\";\n","/**\n * Governance integrity — a pure verdict over a FULLY-resolved governance policy\n * that answers \"is this governance actually armed, or merely declared?\".\n *\n * The load-bearing distinction is **enabled ≠ armed**. A rule can be `enabled`\n * in the policy yet inert because it has no vocabulary to measure against:\n * `components/prefer-library` with no effective canonical source enforces\n * nothing; `tokens/css-vars-must-be-defined` with an empty token vocabulary\n * enforces nothing. This module derives, per rule *family*, whether the family\n * is armed (has both an enabled rule AND the vocabulary/signal it needs), then\n * rolls those up into a single status.\n *\n * Browser-safe and filesystem-free: it never reads the repo. All file-derived\n * signals (token vocabulary size, whether the css-vars rule is active) are\n * supplied by the caller, which is also responsible for fully resolving the\n * policy (merging presets / localCanonical / designSystem / enrichment) BEFORE\n * calling in.\n */\n\nimport type { CanonicalSource, GovernanceConfig, GovernanceSeverity } from \"./governance.js\";\nimport { compileGlobalGovernanceFacts } from \"./facts/index.js\";\nimport { FRAGMENTS_INTERNAL_RULE_IDS, RULE_TIER } from \"./rules/tiers.js\";\nimport { BLOCKING_RULE_ALLOWLIST } from \"./rules/emit-gate.js\";\n\nexport type GovernanceIntegrityStatus = \"healthy\" | \"degraded\" | \"inert\";\n\nexport type GovernanceIntegrityFamilyId =\n | \"policy\"\n | \"components\"\n | \"tokens\"\n | \"hygiene\"\n | \"blocking-deny\";\n\nexport interface GovernanceIntegrityFamily {\n id: GovernanceIntegrityFamilyId;\n armed: boolean;\n rules: string[];\n reason?: string;\n remediation?: string;\n}\n\nexport interface GovernanceIntegrityInput {\n /**\n * FULLY resolved policy — the caller merges presets / localCanonical /\n * designSystem / enrichment first. `undefined` means no policy at all.\n */\n policy: GovernanceConfig | undefined;\n policySource: \"config\" | \"preset\" | \"fallback\" | \"none\";\n /** Any governance intent signal present (caller computes). */\n declared: boolean;\n /** Size of the contract token vocabulary; core cannot read files. */\n tokenVocabularySize?: number;\n /** Whether `tokens/css-vars-must-be-defined` is activated (caller supplies). */\n cssVarsActive?: boolean;\n mode?: \"scan\" | \"ci\" | \"hook\" | \"doctor\" | \"setup\";\n}\n\nexport interface GovernanceIntegrityVerdict {\n status: GovernanceIntegrityStatus;\n declared: boolean;\n fatalForCi: boolean;\n blockingCapable: boolean;\n families: GovernanceIntegrityFamily[];\n armed: GovernanceIntegrityFamilyId[];\n summary: string;\n remediations: string[];\n}\n\ninterface EffectiveRuleConfig {\n enabled: boolean;\n severity?: GovernanceSeverity;\n options?: Record<string, unknown>;\n}\n\n/**\n * Whether a canonical source contributes an effective component vocabulary.\n *\n * Mirrors `sourceIncludesComponent` in `./rules/components-prefer-library.ts`\n * (a follow-up refactor will make that rule import this): a `directory` source\n * with no `include` is a wildcard (armed); an explicit `include` must be\n * non-empty; a package-like `npm`/`registry` source with no `include` is NOT an\n * effective vocabulary, because it has no export inventory to enumerate.\n */\nexport function isEffectiveCanonicalSource(source: CanonicalSource): boolean {\n return source.include !== undefined ? source.include.length > 0 : source.kind === \"directory\";\n}\n\n/**\n * Whether `components/prefer-library`'s effective options carry a real component\n * vocabulary: at least one canonical mapping, or at least one effective\n * canonical source. Accepts the raw fact `options` bag (values are `unknown`).\n */\nexport function hasEffectiveComponentVocabulary(\n options: Record<string, unknown> | undefined\n): boolean {\n const mappings = options?.[\"canonicalMappings\"];\n if (Array.isArray(mappings) && mappings.length > 0) return true;\n const sources = options?.[\"canonicalSources\"];\n return (\n Array.isArray(sources) &&\n sources.some((source) => isEffectiveCanonicalSource(source as CanonicalSource))\n );\n}\n\n/**\n * Compile the policy to effective per-rule configs, keyed by rule id. Reuses the\n * fact compiler so the effective enabled/severity/options match exactly what the\n * scan engine sees (including the canonicalSources → prefer-library injection).\n */\nfunction effectiveRuleConfigs(\n policy: GovernanceConfig | undefined\n): Map<string, EffectiveRuleConfig> {\n const configs = new Map<string, EffectiveRuleConfig>();\n for (const fact of compileGlobalGovernanceFacts(policy)) {\n if (fact.kind !== \"governance_rule_config\") continue;\n configs.set(fact.ruleId, {\n enabled: fact.enabled,\n severity: fact.severity,\n options: fact.options,\n });\n }\n return configs;\n}\n\n/** Whether the policy declares the css-vars-must-be-defined style rule. */\nfunction policyDeclaresCssVars(policy: GovernanceConfig | undefined): boolean {\n return Boolean(policy?.styles?.some((style) => style.kind === \"style.cssVars.mustBeDefined\"));\n}\n\nfunction dedupe(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction summarize(\n status: GovernanceIntegrityStatus,\n flags: { componentsArmed: boolean; tokensArmed: boolean; blockingArmed: boolean }\n): string {\n if (status === \"inert\") {\n return \"Governance inert — no enforceable rule family is armed\";\n }\n if (status === \"degraded\") {\n return \"Governance degraded — hygiene rules armed but no contract vocabulary is declared\";\n }\n const contract: string[] = [];\n if (flags.componentsArmed) contract.push(\"components\");\n if (flags.tokensArmed) contract.push(\"tokens\");\n const suffix = flags.blockingArmed ? \", blocking-capable\" : \"\";\n return `Governance healthy — contract vocabulary armed (${contract.join(\" + \")})${suffix}`;\n}\n\nexport function evaluateGovernanceIntegrity(\n input: GovernanceIntegrityInput\n): GovernanceIntegrityVerdict {\n const configs = effectiveRuleConfigs(input.policy);\n\n // --- policy family --------------------------------------------------------\n const policyArmed = input.policy !== undefined && input.policySource !== \"none\";\n const policyFamily: GovernanceIntegrityFamily = {\n id: \"policy\",\n armed: policyArmed,\n rules: [],\n };\n if (!policyArmed) {\n policyFamily.reason = \"no governance policy resolved\";\n }\n\n // --- components family ----------------------------------------------------\n const componentsConfig = configs.get(\"components/prefer-library\");\n const componentsArmed =\n componentsConfig?.enabled === true && hasEffectiveComponentVocabulary(componentsConfig.options);\n const componentsFamily: GovernanceIntegrityFamily = {\n id: \"components\",\n armed: componentsArmed,\n rules: [\"components/prefer-library\"],\n };\n if (!componentsArmed) {\n if (componentsConfig?.enabled === true) {\n componentsFamily.reason =\n \"components/prefer-library enabled but no effective canonical source\";\n componentsFamily.remediation =\n \"add govern.canonicalSources (a directory source, or npm/registry with a non-empty include) or designSystem.path/packageName\";\n } else {\n componentsFamily.reason = \"components/prefer-library not enabled\";\n componentsFamily.remediation =\n \"add govern.canonicalSources (a directory source, or npm/registry with a non-empty include) or designSystem.path/packageName\";\n }\n }\n\n // --- tokens family --------------------------------------------------------\n const cssVarsActive = input.cssVarsActive ?? policyDeclaresCssVars(input.policy);\n const tokenVocabularySize = input.tokenVocabularySize ?? 0;\n const tokensArmed = cssVarsActive === true && tokenVocabularySize > 0;\n const tokensFamily: GovernanceIntegrityFamily = {\n id: \"tokens\",\n armed: tokensArmed,\n rules: [\"tokens/css-vars-must-be-defined\"],\n };\n if (!tokensArmed) {\n if (!cssVarsActive) {\n tokensFamily.reason = \"tokens/css-vars-must-be-defined not active\";\n tokensFamily.remediation =\n \"activate the css-vars rule (govern.styles: style.cssVars.mustBeDefined)\";\n } else {\n tokensFamily.reason = \"no token vocabulary\";\n tokensFamily.remediation =\n \"declare token source files so the contract token vocabulary is non-empty\";\n }\n }\n\n // --- hygiene family -------------------------------------------------------\n const hygieneRules: string[] = [];\n for (const [ruleId, config] of configs) {\n if (config.enabled !== true) continue;\n if (RULE_TIER[ruleId] !== \"hygiene\") continue;\n if (FRAGMENTS_INTERNAL_RULE_IDS.has(ruleId)) continue;\n hygieneRules.push(ruleId);\n }\n hygieneRules.sort();\n const hygieneArmed = hygieneRules.length > 0;\n const hygieneFamily: GovernanceIntegrityFamily = {\n id: \"hygiene\",\n armed: hygieneArmed,\n rules: hygieneRules,\n };\n if (!hygieneArmed) {\n hygieneFamily.reason = \"no hygiene-tier rule enabled\";\n }\n\n // --- blocking-deny family -------------------------------------------------\n const failOnWarnings = input.policy?.ci?.failOnWarnings === true;\n const blockingRules: string[] = [];\n for (const ruleId of BLOCKING_RULE_ALLOWLIST) {\n const config = configs.get(ruleId);\n if (config?.enabled !== true) continue;\n const familyArmed = ruleId === \"components/prefer-library\" ? componentsArmed : hygieneArmed;\n if (!familyArmed) continue;\n if (config.severity !== \"error\" && !failOnWarnings) continue;\n blockingRules.push(ruleId);\n }\n blockingRules.sort();\n const blockingArmed = blockingRules.length > 0;\n const blockingFamily: GovernanceIntegrityFamily = {\n id: \"blocking-deny\",\n armed: blockingArmed,\n rules: blockingRules,\n };\n if (!blockingArmed) {\n blockingFamily.reason = \"no blocking-capable rule (armed rules are warn-severity only)\";\n blockingFamily.remediation =\n 'raise a blocking-eligible rule to severity \"error\", or set ci.failOnWarnings: true';\n }\n\n // --- roll-up --------------------------------------------------------------\n const contractArmed = componentsArmed || tokensArmed;\n const enforceableArmed = componentsArmed || tokensArmed || hygieneArmed;\n const status: GovernanceIntegrityStatus = !enforceableArmed\n ? \"inert\"\n : contractArmed\n ? \"healthy\"\n : \"degraded\";\n const fatalForCi = input.declared && status === \"inert\";\n\n const families: GovernanceIntegrityFamily[] = [\n policyFamily,\n componentsFamily,\n tokensFamily,\n hygieneFamily,\n blockingFamily,\n ];\n const armed = families.filter((family) => family.armed).map((family) => family.id);\n const remediations = dedupe(\n families\n .map((family) => family.remediation)\n .filter((remediation): remediation is string => remediation !== undefined)\n );\n const summary = summarize(status, { componentsArmed, tokensArmed, blockingArmed });\n\n return {\n status,\n declared: input.declared,\n fatalForCi,\n blockingCapable: blockingArmed,\n families,\n armed,\n summary,\n remediations,\n };\n}\n","/**\n * Frontend Contract preimage — the projection that defines what the contract IS.\n *\n * The FCID used to be a hash of the raw `code-contracts` artifact payload. That\n * conflated identity with display: a copy-edit to a component description moved\n * the hash, and tokens / canonical mappings / policy — the things gates actually\n * enforce — were not part of identity at all. This module widens the preimage to\n * the full enforcement surface as ONE shared projection, imported by both Cloud\n * (mint) and the CLI (reportedHash). Neither side may reimplement it: parity is\n * a property of the shared import, not a test you can fail.\n *\n * Enforced-only is implemented structurally: {@link projectContractPreimage}\n * copies an explicit pick-list of fields per domain. Anything an adapter passes\n * beyond that list (descriptions, docs URLs, timestamps, heuristic signals)\n * never reaches the hash. Proposed canonical mappings are excluded for the same\n * reason — they cannot block, so they are not identity; confirmation is the\n * moment a mapping enters the contract.\n *\n * The preimage itself is the record of four domain sub-hashes, so\n * `contractHash(preimage)` is the fcid and a domain diff is a four-string\n * compare — no deep structural diffing. Determinism (key sorting, undefined\n * dropping, number normalization) is inherited from `canonicalPreimage`; this\n * module adds element-level sorting for the arrays it owns and nothing else.\n *\n * Runtime-portable by construction: no Node APIs, no Convex imports, no React.\n */\nimport type { GovernanceConfig } from \"../governance.js\";\nimport { projectV1OwnedComponentId, projectV1OwnedImportIdentity } from \"../package-identity.js\";\nimport { canonicalPreimage, contractHash } from \"./hash.js\";\n\n// ---------------------------------------------------------------------------\n// Domains\n// ---------------------------------------------------------------------------\n\n/**\n * The fixed domain enum. Adding a domain is a spine change (update\n * `01-architecture.md` first); never rename — deprecate and alias.\n */\nexport const CONTRACT_DOMAINS = [\"components\", \"tokens\", \"canonicalMap\", \"policy\"] as const;\n\nexport type ContractDomain = (typeof CONTRACT_DOMAINS)[number];\n\n// ---------------------------------------------------------------------------\n// Catalog input — the neutral shape adapters assemble\n// ---------------------------------------------------------------------------\n\n/**\n * One component's enforcement identity. Props are the *name* membership surface\n * (what unknown-prop checks today); prop types/defaults are not enforced by the\n * rules engine, so they are not identity — enforced-only cuts both ways.\n */\nexport interface ContractComponentInput {\n name: string;\n /** Parent component name when this is a subcomponent (compound identity). */\n parentName?: string;\n /** Prop names the component accepts. */\n props?: readonly string[];\n /**\n * The per-component enforcement contract as authored (bans, a11y rules,\n * required compound children). Passed through whole — it is enforcement data\n * by definition.\n */\n contract?: unknown;\n /** Required compound-children names, when the structure is declared. */\n compoundChildren?: readonly string[];\n}\n\nexport interface ContractTokenInput {\n name: string;\n value: string | number;\n type?: string;\n}\n\nexport type CanonicalMappingStatus = \"confirmed\" | \"proposed\" | \"unknown\";\n\nexport interface ContractPropMappingInput {\n rawProp: string;\n canonicalProp: string;\n valueMap?: Readonly<Record<string, string>>;\n}\n\nexport interface ContractCanonicalMappingInput {\n /** The raw/source component the mapping covers. */\n component: string;\n /** The canonical component it maps to. */\n canonical: string;\n status: CanonicalMappingStatus;\n /** Local/offline canonical import target, when the mapping is config-authored. */\n importPath?: string;\n /** Explicit raw element or semantic resolutions covered by a local declaration. */\n resolves?: readonly {\n tag: string;\n role?: string;\n inputType?: string;\n }[];\n propMapping?: readonly ContractPropMappingInput[];\n}\n\n/**\n * An authored waiver record. Hashed as data — including `expiresOn` as a plain\n * date string. Expiry *evaluation* happens at enforcement time and must never\n * change the fcid (no time-dependent hashing).\n */\nexport interface ContractWaiverInput {\n id: string;\n /** The diagnostic code or rule the waiver suppresses. */\n target: string;\n reason: string;\n /** YYYY-MM-DD, treated as opaque data. */\n expiresOn?: string;\n}\n\n/**\n * Active policy: everything that changes what a gate would allow or deny.\n * Waivers live here (spine open question 1, resolved): a waiver changes what\n * blocks, so it is enforcement-relevant.\n */\nexport interface ContractPolicyInput {\n rules?: Readonly<Record<string, unknown>>;\n codes?: Readonly<Record<string, unknown>>;\n compositionPatterns?: readonly unknown[];\n waivers?: readonly ContractWaiverInput[];\n}\n\n/**\n * The neutral catalog shape both adapters (Cloud mint, CLI scan) assemble.\n * Adapters gather data; the projection owns all normalization — element order,\n * optional fields, and display-data stripping never reach the hash.\n */\nexport interface ContractCatalogInput {\n components?: readonly ContractComponentInput[];\n tokens?: readonly ContractTokenInput[];\n canonicalMappings?: readonly ContractCanonicalMappingInput[];\n policy?: ContractPolicyInput | null;\n}\n\n// ---------------------------------------------------------------------------\n// Preimage\n// ---------------------------------------------------------------------------\n\nexport const CONTRACT_PREIMAGE_SCHEMA = \"fcid-preimage:v1\" as const;\n/** Request header used by clients that can verify and consume this preimage. */\nexport const CONTRACT_PREIMAGE_CAPABILITY_HEADER = \"X-Fragments-Contract-Preimage\" as const;\n\n/**\n * The hashed identity record: four domain sub-hashes plus the projection schema\n * version (so an intentional projection change mints a new fcid). The fcid is\n * `contractHash(preimage)` — hash of the domain hashes, per the spine pipeline.\n */\nexport interface ContractPreimage {\n schema: typeof CONTRACT_PREIMAGE_SCHEMA;\n domains: Record<ContractDomain, string>;\n}\n\n/**\n * Wire-compatible identity pin carried by Cloud policy responses. Older\n * contract rows may omit the schema/domains, so every field except the FCID is\n * intentionally nullable at this boundary.\n */\nexport interface ContractIdentityPin {\n contractHash: string;\n preimageSchema?: string | null;\n domainHashes?: Readonly<Record<string, string>> | null;\n}\n\nconst SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/u;\n\n/**\n * Reconstruct and verify the canonical preimage behind a published FCID.\n *\n * This is the only supported bridge from the additive ledger/wire shape\n * (`preimageSchema` + `domainHashes`) back to the hash input. Consumers must\n * not trust `enforcedIdentityComparable` on its own: a malformed, partial, or\n * internally inconsistent pin returns `null` and therefore fails closed.\n */\nexport function verifiedContractPreimageFromPin(pin: ContractIdentityPin): ContractPreimage | null {\n if (\n pin.preimageSchema !== CONTRACT_PREIMAGE_SCHEMA ||\n !SHA256_HEX_PATTERN.test(pin.contractHash) ||\n !pin.domainHashes ||\n typeof pin.domainHashes !== \"object\"\n ) {\n return null;\n }\n\n const keys = Object.keys(pin.domainHashes).sort();\n const expectedKeys = [...CONTRACT_DOMAINS].sort();\n if (\n keys.length !== expectedKeys.length ||\n keys.some((key, index) => key !== expectedKeys[index])\n ) {\n return null;\n }\n\n const domains = Object.fromEntries(\n CONTRACT_DOMAINS.map((domain) => [domain, pin.domainHashes?.[domain]])\n ) as Record<ContractDomain, string | undefined>;\n if (CONTRACT_DOMAINS.some((domain) => !SHA256_HEX_PATTERN.test(domains[domain] ?? \"\"))) {\n return null;\n }\n\n const preimage: ContractPreimage = {\n schema: CONTRACT_PREIMAGE_SCHEMA,\n domains: domains as Record<ContractDomain, string>,\n };\n return contractHash(preimage) === pin.contractHash ? preimage : null;\n}\n\n/**\n * Sort projected elements by their canonical serialization: total, deterministic,\n * and independent of adapter iteration order, without per-type comparators.\n */\nfunction sortCanonical<T>(items: readonly T[]): T[] {\n return items\n .map((item) => ({ item, key: canonicalPreimage(item) }))\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))\n .map(({ item }) => item);\n}\n\nfunction projectComponents(components: readonly ContractComponentInput[] | undefined): unknown {\n return sortCanonical(\n (components ?? []).map((component) => ({\n name: component.name,\n parentName: component.parentName,\n props: component.props ? [...component.props].sort() : undefined,\n contract: component.contract,\n compoundChildren: component.compoundChildren\n ? [...component.compoundChildren].sort()\n : undefined,\n }))\n );\n}\n\nfunction projectTokens(tokens: readonly ContractTokenInput[] | undefined): unknown {\n return sortCanonical(\n (tokens ?? []).map((token) => ({\n name: token.name,\n value: token.value,\n type: token.type,\n }))\n );\n}\n\nfunction projectCanonicalMap(\n mappings: readonly ContractCanonicalMappingInput[] | undefined\n): unknown {\n return sortCanonical(\n (mappings ?? [])\n .filter((mapping) => mapping.status === \"confirmed\")\n .map((mapping) => ({\n component: mapping.component,\n canonical: mapping.canonical,\n importPath: mapping.importPath\n ? projectV1OwnedImportIdentity(mapping.importPath)\n : undefined,\n resolves: mapping.resolves ? sortCanonical(mapping.resolves) : undefined,\n propMapping: mapping.propMapping\n ? sortCanonical(\n mapping.propMapping.map((entry) => ({\n rawProp: entry.rawProp,\n canonicalProp: entry.canonicalProp,\n valueMap: entry.valueMap,\n }))\n )\n : undefined,\n }))\n );\n}\n\n/**\n * Project only structured npm-identity fields inside policy material. This is\n * deliberately key- and record-aware: arbitrary strings, repository names,\n * provenance, product markers, and third-party package values retain their\n * original bytes.\n */\nfunction projectV1PolicyMaterial(value: unknown, key?: string): unknown {\n if (typeof value === \"string\") {\n if (key === \"specifier\" || key === \"importPath\") {\n return projectV1OwnedImportIdentity(value);\n }\n if (key === \"componentId\") {\n return projectV1OwnedComponentId(value);\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => projectV1PolicyMaterial(entry));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const record = value as Readonly<Record<string, unknown>>;\n const isImportPathRule = record.kind === \"jsx.importPath.prefer\";\n return Object.fromEntries(\n Object.entries(record).map(([field, fieldValue]) => {\n if (\n isImportPathRule &&\n (field === \"from\" || field === \"to\") &&\n typeof fieldValue === \"string\"\n ) {\n return [field, projectV1OwnedImportIdentity(fieldValue)];\n }\n return [field, projectV1PolicyMaterial(fieldValue, field)];\n })\n );\n}\n\nfunction projectPolicy(policy: ContractPolicyInput | null | undefined): unknown {\n if (!policy) return null;\n return {\n rules: projectV1PolicyMaterial(policy.rules),\n codes: policy.codes,\n compositionPatterns: policy.compositionPatterns\n ? sortCanonical(policy.compositionPatterns)\n : undefined,\n waivers: policy.waivers\n ? sortCanonical(\n policy.waivers.map((waiver) => ({\n id: waiver.id,\n target: waiver.target,\n reason: waiver.reason,\n expiresOn: waiver.expiresOn,\n }))\n )\n : undefined,\n };\n}\n\n/**\n * Project a catalog onto the contract preimage: four enforced-only domain\n * bodies, each hashed independently. `contractHash(projectContractPreimage(x))`\n * is the fcid.\n */\nexport function projectContractPreimage(catalog: ContractCatalogInput): ContractPreimage {\n return {\n schema: CONTRACT_PREIMAGE_SCHEMA,\n domains: {\n components: contractHash(projectComponents(catalog.components)),\n tokens: contractHash(projectTokens(catalog.tokens)),\n canonicalMap: contractHash(projectCanonicalMap(catalog.canonicalMappings)),\n policy: contractHash(projectPolicy(catalog.policy)),\n },\n };\n}\n\n/**\n * Name the domains whose identity differs between two preimages — a four-string\n * compare, no structural diffing. Returned in fixed {@link CONTRACT_DOMAINS}\n * order. Staleness checks compare these, never whole fcids.\n */\nexport function diffContractDomains(a: ContractPreimage, b: ContractPreimage): ContractDomain[] {\n return CONTRACT_DOMAINS.filter((domain) => a.domains[domain] !== b.domains[domain]);\n}\n\n/**\n * Map defineFragment-shaped records — the `code-contracts` payload's\n * `fragments` array (Cloud mint) or the CLI's loaded fragment definitions —\n * onto their enforcement identity. The one shared mapping is what keeps the\n * two adapters from drifting into a second \"catalog → preimage\"\n * implementation: both sides gather fragments however they like, then this\n * picks the identity fields. Records without a string `meta.name` are skipped\n * (no identity to hash).\n */\n/**\n * The enforced-only slice of a resolved CLI governance config — the fields\n * that change what a scan allows or denies. CI gate options, agent repair\n * order, and runner config change how/when gates run, not what they enforce,\n * so they are not identity. This pick-list lives here, beside the projection,\n * so adapters cannot drift into private enforced-only boundaries: a new\n * enforcement field on {@link GovernanceConfig} is added to the contract in\n * exactly one place.\n */\nexport function contractPolicyFromGovernanceConfig(\n config: GovernanceConfig | null | undefined\n): ContractPolicyInput | null {\n if (!config) return null;\n return {\n rules: {\n severity: config.severity,\n rules: config.rules,\n scales: config.scales,\n styles: config.styles,\n jsx: config.jsx,\n tailwind: config.tailwind,\n components: config.components,\n overrides: config.overrides,\n },\n codes: config.codes as Readonly<Record<string, unknown>> | undefined,\n compositionPatterns: config.compositionPatterns as readonly unknown[] | undefined,\n };\n}\n\nexport function contractComponentsFromFragments(\n fragments: readonly unknown[]\n): ContractComponentInput[] {\n const components: ContractComponentInput[] = [];\n for (const candidate of fragments) {\n const fragment = candidate as {\n meta?: { name?: unknown; parentComponentName?: unknown };\n props?: Record<string, unknown>;\n contract?: unknown;\n structure?: { compoundChildren?: unknown };\n } | null;\n const name = fragment?.meta?.name;\n if (typeof name !== \"string\" || !name) continue;\n const parentName = fragment?.meta?.parentComponentName;\n const rawChildren = fragment?.structure?.compoundChildren;\n const compoundChildren = Array.isArray(rawChildren)\n ? rawChildren\n .map((child) => (child as { name?: unknown } | null)?.name)\n .filter((childName): childName is string => typeof childName === \"string\")\n : undefined;\n components.push({\n name,\n parentName: typeof parentName === \"string\" ? parentName : undefined,\n props: Object.keys(fragment?.props ?? {}),\n contract: fragment?.contract,\n compoundChildren,\n });\n }\n return components;\n}\n","/**\n * The shared contract pin formatter. Every surface that shows a human the\n * contract identity — MCP metadata, agent context files, hook output, CI check\n * text, PR comments — interpolates the string this\n * function returns; no surface reformats it. One formatter is what makes\n * \"compare the hashes yourself\" a falsifiable claim instead of three surfaces\n * rendering the pin three ways.\n *\n * Display convention (spine \"Identifiers\"): never a bare hash without the\n * version, never a version without the hash.\n */\n\nimport { CONTRACT_DOMAINS, type ContractDomain } from \"./preimage.js\";\n\n/** The committed agent context file every gate reads for local contract stamps. */\nexport const AGENT_CONTEXT_RELATIVE_PATH = \".fragments/agent-context.md\";\n\n/** Length of the abbreviated fcid in the display form. */\nconst SHORT_FCID_LENGTH = 7;\n\nexport interface ContractStampPin {\n /** Monotonic, human-facing version from the ledger. */\n contractVersion: number;\n /** The 64-hex FCID; abbreviated for display. */\n fcid: string;\n}\n\nexport interface ContractStampRecord extends ContractStampPin {\n /** Full 64-hex domain sub-hashes, when known. */\n domains?: Record<ContractDomain, string>;\n}\n\n/**\n * The bare `v12 · a3f9e21` form, for surfaces where \"contract\" is already said\n * by the surrounding copy (e.g. the hook staleness line's `local v11 · 9c01b22`).\n * {@link formatStampPin} delegates here so the two forms can never drift.\n */\nexport function formatStampVersionHash(pin: ContractStampPin): string {\n return `v${pin.contractVersion} · ${pin.fcid.slice(0, SHORT_FCID_LENGTH)}`;\n}\n\n/**\n * Render the canonical pin: `contract v12 · a3f9e21`.\n */\nexport function formatStampPin(pin: ContractStampPin): string {\n return `contract ${formatStampVersionHash(pin)}`;\n}\n\n/** The context-file header form: `fragments contract v12 · a3f9e21`. */\nexport function formatStampHeader(pin: ContractStampPin): string {\n return `fragments ${formatStampPin(pin)}`;\n}\n\n/**\n * Serialize pin + full fcid (+ domain hashes when known) as plain header lines —\n * no markdown syntax, so the block is safe inside YAML-ish frontmatter and\n * inside HTML-comment blocks. The first line carries the literal\n * {@link formatStampHeader} output; surfaces grep for that substring, so the\n * header form and the serialized form may never diverge.\n */\nexport function serializeContractStamp(record: ContractStampRecord): string {\n const lines = [`contract: ${formatStampHeader(record)}`, `contract-fcid: ${record.fcid}`];\n if (record.domains) {\n const domains = record.domains;\n lines.push(\n `contract-domains: ${CONTRACT_DOMAINS.map((domain) => `${domain}=${domains[domain]}`).join(\" \")}`\n );\n }\n return lines.join(\"\\n\");\n}\n\n// Line-anchored so the stamp is found anywhere in a file — frontmatter, an\n// HTML-comment block, or a marker-merged region — without parsing the host\n// format.\nconst STAMP_HEADER_LINE = /^contract:\\s*fragments contract v(\\d+) · ([0-9a-f]+)\\s*$/mu;\nconst STAMP_FCID_LINE = /^contract-fcid:\\s*([0-9a-f]{64})\\s*$/mu;\nconst STAMP_DOMAINS_LINE = /^contract-domains:\\s*(\\S.*?)\\s*$/mu;\n\n/**\n * Parse a stamp record back out of arbitrary file text. Requires the\n * `contract:` + `contract-fcid:` lines and an abbreviated fcid that prefixes\n * the full one; `contract-domains` is optional. Returns null when absent or\n * malformed — never throws.\n */\nexport function parseContractStamp(text: string): ContractStampRecord | null {\n const header = STAMP_HEADER_LINE.exec(text);\n const fcidLine = STAMP_FCID_LINE.exec(text);\n if (!header || !fcidLine) return null;\n const contractVersion = Number(header[1]);\n if (!Number.isSafeInteger(contractVersion)) return null;\n const fcid = fcidLine[1];\n if (!fcid.startsWith(header[2])) return null;\n\n const domainsLine = STAMP_DOMAINS_LINE.exec(text);\n if (!domainsLine) return { contractVersion, fcid };\n\n const domains = {} as Record<ContractDomain, string>;\n for (const pair of domainsLine[1].split(/\\s+/u)) {\n const match = /^([a-zA-Z]+)=([0-9a-f]{64})$/u.exec(pair);\n if (!match || !(CONTRACT_DOMAINS as readonly string[]).includes(match[1])) return null;\n domains[match[1] as ContractDomain] = match[2];\n }\n if (CONTRACT_DOMAINS.some((domain) => !domains[domain])) return null;\n return { contractVersion, fcid, domains };\n}\n","/**\n * `catalog-fixture-a` — the committed reference catalog shared by the contract\n * acceptance cases (contract-identity ACCEPTANCE §1–§4) and the Cloud-side\n * parity test. Small but full-surface: components with props, tokens, one\n * confirmed + one proposed canonical mapping, a policy with rules, a\n * composition pattern, and one authored waiver.\n *\n * `CATALOG_FIXTURE_A_FCID` is the golden value for\n * `contractHash(projectContractPreimage(catalogFixtureA))`. Cloud's Convex\n * parity test imports BOTH from here, so an intentional projection change is\n * updated in exactly one place and every runtime follows (ACCEPTANCE §1).\n */\nimport type { ContractCatalogInput } from \"./preimage.js\";\n\nexport const catalogFixtureA: ContractCatalogInput = {\n components: [\n {\n name: \"Button\",\n props: [\"variant\", \"size\", \"disabled\"],\n contract: { bans: [{ prop: \"style\", reason: \"token-governed surface\" }] },\n },\n {\n name: \"Card\",\n props: [\"padding\"],\n compoundChildren: [\"Card.Header\", \"Card.Body\"],\n },\n {\n name: \"Card.Header\",\n parentName: \"Card\",\n props: [\"title\"],\n },\n ],\n tokens: [\n { name: \"--fui-color-accent\", value: \"#3366ff\", type: \"color\" },\n { name: \"--fui-space-2\", value: \"8px\", type: \"dimension\" },\n { name: \"--fui-radius-md\", value: \"6px\", type: \"dimension\" },\n ],\n canonicalMappings: [\n {\n component: \"LegacyButton\",\n canonical: \"Button\",\n status: \"confirmed\",\n propMapping: [{ rawProp: \"kind\", canonicalProp: \"variant\" }],\n },\n {\n component: \"AppCard\",\n canonical: \"Card\",\n status: \"proposed\",\n },\n ],\n policy: {\n rules: {\n tokens_hardcoded_values: { enabled: true, severity: \"error\" },\n components_prefer_library: { enabled: true, severity: \"warning\" },\n },\n compositionPatterns: [\n { id: \"card-structure\", region: \"Card\", require: [\"Card.Header\"], severity: \"warning\" },\n ],\n waivers: [\n {\n id: \"waiver-001\",\n target: \"FUI4001\",\n reason: \"legacy promo banner, replacement tracked in #482\",\n expiresOn: \"2026-09-30\",\n },\n ],\n },\n};\n\n/**\n * Golden fcid for {@link catalogFixtureA}. Regenerate only on an intentional\n * projection change: `contractHash(projectContractPreimage(catalogFixtureA))`.\n */\nexport const CATALOG_FIXTURE_A_FCID =\n \"41ae847b36618f25a9aa73bda47851f6467e30ce4bcfb5a5aa25d27fee3fee54\";\n\n/**\n * The same fixture expressed as Cloud-shaped mint materials: the\n * `code-contracts` payload body and the DTCG token document that assemble to\n * exactly {@link catalogFixtureA} through the adapters. Kept here so a fixture\n * edit happens in one file — the core §1 test guards the payload↔components\n * equivalence, and Cloud's parity test asserts the golden fcid end to end.\n */\nexport const catalogFixtureAContractPayload = {\n fragments: [\n {\n meta: { name: \"Button\" },\n props: { variant: {}, size: {}, disabled: {} },\n contract: { bans: [{ prop: \"style\", reason: \"token-governed surface\" }] },\n },\n {\n meta: { name: \"Card\" },\n props: { padding: {} },\n structure: {\n compoundChildren: [{ name: \"Card.Header\" }, { name: \"Card.Body\" }],\n },\n },\n {\n meta: { name: \"Card.Header\", parentComponentName: \"Card\" },\n props: { title: {} },\n },\n ],\n};\n\n/** DTCG form of {@link catalogFixtureA}'s tokens (flattened Cloud-side). */\nexport const catalogFixtureATokensDtcg = {\n \"--fui-color-accent\": { $value: \"#3366ff\", $type: \"color\" },\n \"--fui-space-2\": { $value: \"8px\", $type: \"dimension\" },\n \"--fui-radius-md\": { $value: \"6px\", $type: \"dimension\" },\n};\n","import type { ContractCanonicalMappingInput } from \"./contract/index.js\";\nimport type { GovernanceConfig } from \"./governance.js\";\n\nexport interface LocalCanonicalResolveRule {\n tag: string;\n role?: string;\n inputType?: string;\n}\n\nexport interface LocalCanonicalDeclaration {\n importPath: string;\n resolves: readonly LocalCanonicalResolveRule[];\n}\n\nexport interface InspectConfig {\n localCanonical?: Readonly<Record<string, LocalCanonicalDeclaration>>;\n}\n\ninterface PreferLibraryRuleConfig {\n enabled?: boolean;\n severity?: \"error\" | \"warn\" | \"info\";\n options?: {\n canonicalMappings?: unknown[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport function localCanonicalContractMappings(\n inspect: InspectConfig | null | undefined\n): ContractCanonicalMappingInput[] {\n return localCanonicalRuleMappings(inspect).map((mapping) => ({\n component: mapping.htmlEquivalent,\n canonical: mapping.name,\n status: \"confirmed\",\n importPath: mapping.importPath,\n resolves: [\n {\n tag: mapping.htmlEquivalent,\n ...(mapping.ariaRole ? { role: mapping.ariaRole } : {}),\n ...(mapping.htmlType ? { inputType: mapping.htmlType } : {}),\n },\n ],\n }));\n}\n\nexport function governanceConfigWithLocalCanonical(\n config: GovernanceConfig | undefined,\n inspect: InspectConfig | null | undefined\n): GovernanceConfig | undefined {\n const localMappings = localCanonicalRuleMappings(inspect);\n if (localMappings.length === 0) return config;\n\n const existingRule = readPreferLibraryRule(config);\n const existingOptions = existingRule.options ?? {};\n return {\n ...(config ?? {}),\n rules: {\n ...(config?.rules ?? {}),\n \"components/prefer-library\": {\n ...existingRule,\n enabled: existingRule.enabled ?? true,\n severity: existingRule.severity ?? \"error\",\n options: {\n ...existingOptions,\n canonicalMappings: [\n ...(Array.isArray(existingOptions.canonicalMappings)\n ? existingOptions.canonicalMappings\n : []),\n ...localMappings,\n ],\n },\n },\n },\n };\n}\n\nfunction localCanonicalRuleMappings(inspect: InspectConfig | null | undefined) {\n return Object.entries(inspect?.localCanonical ?? {}).flatMap(([name, declaration]) =>\n declaration.resolves.map((rule) => ({\n name,\n canonical: name,\n htmlEquivalent: rule.tag,\n ...(rule.role ? { ariaRole: rule.role } : {}),\n ...(rule.inputType ? { htmlType: rule.inputType } : {}),\n importPath: declaration.importPath,\n confidence: 1,\n // Provenance: the user explicitly declared this tag → component mapping\n // (not an inferred htmlEquivalent), so prefer-library may enforce a\n // specific interactive tag against this exact (possibly non-Fragments)\n // component name. See isEnforceableHtmlEquivalent(explicit).\n declaredHtmlEquivalent: true,\n }))\n );\n}\n\nfunction readPreferLibraryRule(config: GovernanceConfig | undefined): PreferLibraryRuleConfig {\n const raw = config?.rules?.[\"components/prefer-library\"];\n return raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as PreferLibraryRuleConfig)\n : {};\n}\n"],"mappings":"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AA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AA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","names":["coverageEvaluated","z","g","z","figma","z","z","z","category","name","rawValue","g","z","z","children","RULE_ID","RULE_VERSION","suggestedComponent","suggestedImport","precisionTier","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_VERSION","componentId","RULE_ID","RULE_VERSION","componentId","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","formatValue","buildMessage","g","RULE_ID","RULE_VERSION","normalizeColor","g","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","sourceLabel","RULE_ID","RULE_VERSION","node","evidenceIds","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/evidence.ts","../src/conform-prove.ts","../src/agent-format.ts","../src/performance-presets.ts","../src/bundle.ts","../src/registry-install-plan.ts","../src/mcp-snapshot.ts","../src/tokens/color.ts","../src/style-comparison.ts","../src/schema.ts","../src/rules/composition-pattern-schema.ts","../src/config.ts","../src/defineFragment.ts","../src/storyAdapter.ts","../src/storybook-csf.ts","../src/storyFilters.ts","../src/figma.ts","../src/tokens/dtcg.ts","../src/tokens/categories.ts","../src/tokens/scss.ts","../src/tokens/tailwind-v4.ts","../src/tokens/design-token-parser.ts","../src/tokens/index.ts","../src/dtcg.ts","../src/component-contract.ts","../src/contract-parser.ts","../src/dtcg-generators.ts","../src/composition.ts","../src/preview-runtime.tsx","../src/component-discovery.ts","../src/rules/finding.ts","../src/rules/utils.ts","../src/rules/a11y-required-accessible-name.ts","../src/raw-html-canonical.ts","../src/rules/components-prefer-library.ts","../src/rules/components-forbidden-prop-value.ts","../src/rules/components-unknown-prop.ts","../src/rules/composition-pattern.ts","../src/rules/jsx-preferred-component.ts","../src/rules/jsx-preferred-import-path.ts","../src/rules/props-invalid-value.ts","../src/rules/color-math.ts","../src/rules/styles-no-raw-color.ts","../src/rules/styles-no-raw-dimensions.ts","../src/rules/spacing-resolution.ts","../src/rules/styles-no-raw-spacing.ts","../src/rules/styles-no-raw-typography.ts","../src/rules/theme-no-theme-coupled-literal.ts","../src/rules/tailwind-arbitrary-color.ts","../src/rules/tailwind-arbitrary-spacing.ts","../src/rules/tailwind-rule-utils.ts","../src/rules/tailwind-forbidden-palette.ts","../src/rules/tailwind-off-scale-spacing-token.ts","../src/rules/tailwind-raw-color-via-token.ts","../src/rules/tailwind-unknown-class.ts","../src/rules/tokens-require-dual-fallback.ts","../src/rules/tokens-css-vars-must-be-defined.ts","../src/rules/emit-gate.ts","../src/rules/tiers.ts","../src/rules/presets.ts","../src/rules/index.ts","../src/governance-integrity.ts","../src/contract/preimage.ts","../src/contract/stamp.ts","../src/contract/fixture.ts","../src/local-canonical.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files — V2 canonical format */\n fileExtension: \".contract.json\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Full user-facing CLI invocation for copy printed to end users (e.g., \"npx @usefragments/cli\") */\n cliInvocation: \"npx @usefragments/cli\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Default compiler governance report path */\n governanceFile: \".fragments/governance.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","/** Stable evidence grades shared by scanners, renderers, Inspect, and Cloud. */\nexport type EvidenceGrade =\n | \"none\"\n | \"runtime_advisory\"\n | \"provenance_bound\"\n | \"source_backed\"\n | \"receipt_backed\";\n\nexport const EVIDENCE_ORDER = [\n \"none\",\n \"runtime_advisory\",\n \"provenance_bound\",\n \"source_backed\",\n \"receipt_backed\",\n] as const satisfies readonly EvidenceGrade[];\n\n/** Only source-backed or receipt-backed claims may block a write or CI gate. */\nexport function canBlock(grade: EvidenceGrade): boolean {\n return EVIDENCE_ORDER.indexOf(grade) >= EVIDENCE_ORDER.indexOf(\"source_backed\");\n}\n\nexport type InspectClaimTier = \"advisory\" | \"local_only\" | \"team_ci\" | \"receipt\";\n\nexport interface InspectClaim {\n tier: InspectClaimTier;\n text: string;\n}\n","/**\n * Contract Mode — Phase 2: the prove-compliant loop as a PURE primitive.\n *\n * A validate-fix-validate loop over UI code: run the conform engine, apply its\n * deterministic fixes, and re-validate until the engine proves zero findings,\n * the pass budget is exhausted, or progress stalls. When deterministic fixes\n * stall on residual issues, an optional async `sampler` repairs them (model\n * call), and the loop re-validates the result — a sampled fix is never trusted\n * without a clean re-validation pass.\n *\n * This is the engine behind `contract.prove` (architecture §2 move #4). It is\n * deliberately framework-agnostic: it takes a `conform` callback (so Cloud,\n * CLI, and the standalone MCP each inject their own engine binding) and returns\n * a plain result — no MCP plumbing, no task store, no transport coupling.\n *\n * Determinism (architecture §6.3): the sampler receives `(seq, codeHashAtRequest)`\n * so a durable-replay layer can key recorded sampler output on the exact code it\n * was asked to repair and hard-invalidate on a hash mismatch.\n *\n * Browser-safe: depends only on the conform contract types + the pure SHA-256\n * in this package. No Node APIs.\n */\nimport type {\n ConformInput,\n ConformResult,\n ConformSuggestion,\n ConformUnresolved,\n} from \"./conform.js\";\nimport { sha256Hex } from \"./contract/hash.js\";\n\n/** Upper bound on validate/fix passes. */\nexport const PROVE_MAX_PASSES = 8;\n/** Default validate/fix passes when the caller does not specify. */\nexport const PROVE_DEFAULT_MAX_PASSES = 4;\n\n/**\n * 3-valued verdict. `insufficient_coverage` is NOT a pass: a clean run over an\n * empty catalog (no tokens, no component mappings) proves nothing, so the loop\n * never certifies compliance it could not actually evaluate.\n */\nexport type ProveVerdict = \"pass\" | \"fail\" | \"insufficient_coverage\";\n\nexport interface ProvePassSampling {\n requested?: boolean;\n used?: boolean;\n model?: string;\n stopReason?: string;\n reason?: string;\n}\n\nexport interface ProvePass {\n pass: number;\n issues: number;\n deterministicChanges: number;\n suggestions: number;\n unresolved: number;\n changed: boolean;\n sampling?: ProvePassSampling;\n}\n\nexport interface ProveResidual {\n suggestions: ConformSuggestion[];\n unresolved: ConformUnresolved[];\n}\n\nexport interface ProveSample {\n /** Repaired code, or omitted/empty when the sampler declined. */\n code?: string;\n model?: string;\n stopReason?: string;\n reason?: string;\n}\n\nexport interface ProveSamplerArgs {\n /** The current code the sampler is asked to repair. */\n code: string;\n /** The residual findings deterministic fixes could not resolve. */\n residual: ProveResidual;\n metadata: {\n /** 1-indexed validate/fix pass that stalled. */\n pass: number;\n /** 0-indexed sampler attempt counter (independent of `pass`). */\n seq: number;\n /** SHA-256 of `code` — the durable-replay key + hard-invalidation guard. */\n codeHashAtRequest: string;\n };\n}\n\nexport interface ProveCallbacks {\n /** Validate + apply deterministic fixes for one pass. */\n conform(input: ConformInput): Promise<ConformResult> | ConformResult;\n /** Optional model-backed repair for residual issues conform cannot resolve. */\n sampler?(args: ProveSamplerArgs): Promise<ProveSample | null> | ProveSample | null;\n}\n\nexport interface ProveOptions {\n /** Max validate/fix passes (clamped to 1..8). Defaults to 4. */\n maxPasses?: number;\n /** Allow the sampler to repair residual issues. Defaults to true. */\n allowSampling?: boolean;\n}\n\nexport interface ProveLoopResult {\n /** Code after all passes + sampling. */\n conformed: string;\n /** Whether `conformed` differs from the input code. */\n changed: boolean;\n verdict: ProveVerdict;\n /** True only on a clean, evaluated pass. */\n provedCompliant: boolean;\n /** Findings remaining in the final pass (changes + suggestions + unresolved). */\n issueCount: number;\n /** Total deterministic edits applied across all passes. */\n corrections: number;\n passHistory: ProvePass[];\n residual: ProveResidual;\n /** The final conform result (for receipt / summary rendering). */\n result: ConformResult;\n /** Human-readable reason for the verdict. */\n reason: string;\n}\n\n/** Total findings in a conform result: applied changes + suggestions + unresolved. */\nexport function proveIssueCount(result: ConformResult): number {\n return result.changes.length + result.suggestions.length + result.unresolved.length;\n}\n\n/** A neutral conform result for the \"no result produced\" fallback path. */\nexport function emptyConformResult(code: string): ConformResult {\n return {\n conformed: code,\n changed: false,\n summary: \"No conform result was produced.\",\n changes: [],\n suggestions: [],\n unresolved: [],\n };\n}\n\n/**\n * Resolve the 3-valued verdict. Coverage trumps everything: an unevaluated\n * catalog is `insufficient_coverage` regardless of issue count.\n */\nexport function resolveProveVerdict(args: {\n coverageEvaluated: boolean;\n provedCompliant: boolean;\n}): ProveVerdict {\n if (!args.coverageEvaluated) return \"insufficient_coverage\";\n return args.provedCompliant ? \"pass\" : \"fail\";\n}\n\n/** Clamp a requested pass count into the supported 1..8 range (default 4). */\nexport function clampMaxPasses(value: number | undefined): number {\n if (typeof value !== \"number\" || Number.isNaN(value)) {\n return PROVE_DEFAULT_MAX_PASSES;\n }\n return Math.min(PROVE_MAX_PASSES, Math.max(1, Math.trunc(value)));\n}\n\nfunction incompleteReason(args: {\n passCount: number;\n maxPasses: number;\n finalIssues: number;\n allowSampling: boolean;\n hasSampler: boolean;\n}): string {\n if (args.passCount >= args.maxPasses) {\n return `stopped after ${args.maxPasses} passes with ${args.finalIssues} finding(s).`;\n }\n if (!args.allowSampling) {\n return \"sampling was disabled and residual issues remain.\";\n }\n if (!args.hasSampler) {\n return \"no sampler was available and residual issues remain.\";\n }\n return `${args.finalIssues} residual finding(s) remain after deterministic and sampled fixes.`;\n}\n\n/**\n * Run the validate-fix-validate loop. Pure: never mutates `input`; all state\n * flows through the return value.\n */\nexport async function proveCompliant(\n input: ConformInput,\n callbacks: ProveCallbacks,\n options: ProveOptions = {}\n): Promise<ProveLoopResult> {\n const maxPasses = clampMaxPasses(options.maxPasses);\n const allowSampling = options.allowSampling !== false;\n const { filename } = input;\n const hasSampler = typeof callbacks.sampler === \"function\";\n\n let current = input.code;\n const passHistory: ProvePass[] = [];\n let corrections = 0;\n let samplingAttempts = 0;\n let lastResult: ConformResult | null = null;\n\n while (passHistory.length < maxPasses) {\n const pass = passHistory.length + 1;\n const result = await callbacks.conform({\n code: current,\n filename,\n apply: \"deterministic\",\n });\n lastResult = result;\n\n const issues = proveIssueCount(result);\n passHistory.push({\n pass,\n issues,\n deterministicChanges: result.changes.length,\n suggestions: result.suggestions.length,\n unresolved: result.unresolved.length,\n changed: result.changed,\n });\n corrections += result.changes.length;\n\n if (issues === 0) {\n const coverageEvaluated = result.coverage?.evaluated !== false;\n return {\n conformed: current,\n changed: current !== input.code,\n verdict: resolveProveVerdict({\n coverageEvaluated,\n provedCompliant: coverageEvaluated,\n }),\n provedCompliant: coverageEvaluated,\n issueCount: 0,\n corrections,\n passHistory,\n residual: { suggestions: [], unresolved: [] },\n result,\n reason: coverageEvaluated\n ? `0 findings after ${pass} pass${pass === 1 ? \"\" : \"es\"}.`\n : \"the design-system catalog has no tokens or components, so compliance could not be evaluated.\",\n };\n }\n\n // Deterministic progress — keep looping on the rewritten code.\n if (result.changed && result.conformed !== current) {\n current = result.conformed;\n continue;\n }\n\n // Conform stalled with residual issues. Try the sampler if it is available\n // and we are under the attempt cap (kept strictly below maxPasses so a\n // revalidation pass always remains in budget).\n //\n // The loop re-samples only while the sampler keeps producing *new* code\n // (each fresh snippet is re-validated on the next pass). A sample that\n // returns nothing new — null, no `code`, or byte-identical code — ends the\n // loop. Re-asking the model with the identical residual rarely helps and\n // burns tokens.\n const residual: ProveResidual = {\n suggestions: result.suggestions,\n unresolved: result.unresolved,\n };\n const canSample =\n allowSampling &&\n hasSampler &&\n samplingAttempts < maxPasses - 1 &&\n (residual.suggestions.length > 0 || residual.unresolved.length > 0);\n\n if (canSample) {\n const seq = samplingAttempts;\n const codeHashAtRequest = sha256Hex(current);\n const last = passHistory[passHistory.length - 1];\n if (last) last.sampling = { requested: true };\n\n const sampled = await callbacks.sampler!({\n code: current,\n residual,\n metadata: { pass, seq, codeHashAtRequest },\n });\n samplingAttempts += 1;\n\n if (last) {\n last.sampling = {\n ...(last.sampling ?? {}),\n used: Boolean(sampled?.code),\n model: sampled?.model,\n stopReason: sampled?.stopReason,\n reason: sampled?.reason,\n };\n }\n\n if (sampled?.code && sampled.code !== current) {\n current = sampled.code;\n continue;\n }\n }\n\n break;\n }\n\n const fallback = lastResult ?? emptyConformResult(current);\n const finalIssues = proveIssueCount(fallback);\n const coverageEvaluated = fallback.coverage?.evaluated !== false;\n\n return {\n conformed: current,\n changed: current !== input.code,\n verdict: resolveProveVerdict({ coverageEvaluated, provedCompliant: false }),\n provedCompliant: false,\n issueCount: finalIssues,\n corrections,\n passHistory,\n residual: {\n suggestions: fallback.suggestions,\n unresolved: fallback.unresolved,\n },\n result: fallback,\n reason: incompleteReason({\n passCount: passHistory.length,\n maxPasses,\n finalIssues,\n allowSampling,\n hasSampler,\n }),\n };\n}\n","import { severityLevel } from \"./severity.js\";\nimport { AGENT_FORMAT_SCHEMA_VERSION, type AgentFormat, type Finding } from \"./schemas/index.js\";\nimport type { SuppressionDirectiveFact } from \"./facts/index.js\";\n\nexport interface BuildAgentFormatInput {\n findings: readonly Finding[];\n filesScanned: number;\n integrity: AgentFormat[\"integrity\"];\n passed?: boolean;\n suppressions?: readonly SuppressionDirectiveFact[];\n iteration?: number;\n maxIterations?: number;\n previousScore?: number;\n maxFindings?: number;\n includeEvidence?: boolean;\n includeFindings?: boolean;\n provenance?: NonNullable<AgentFormat[\"provenance\"]>;\n verdict?: NonNullable<AgentFormat[\"verdict\"]>;\n}\n\nexport function buildAgentFormat(input: BuildAgentFormatInput): AgentFormat {\n const zeroRulesLoaded = input.integrity.rulesLoaded === 0;\n const integrityFailed = !input.integrity.healthy || input.integrity.inert;\n const score = integrityFailed ? 0 : scoreFindings(input.findings);\n const visibleFindings = uniqueFindings(input.findings).slice(0, input.maxFindings ?? 50);\n const agentFindings = visibleFindings.map((finding) => ({\n code: finding.code,\n ruleId: finding.ruleId,\n filePath: finding.location.file,\n line: finding.location.line,\n col: finding.location.column,\n severity: finding.severity,\n level: severityLevel(finding.severity),\n message: finding.message,\n evidenceGrade: finding.evidenceGrade,\n evidence: input.includeEvidence ? finding.evidence : [],\n plan: planForFinding(finding),\n }));\n\n // Keep this aligned with the report summary: warn-level findings are debt, not\n // scan failure, unless the caller has already folded fail-on-warnings into\n // `passed:false`.\n const hasErrors = input.findings.some((finding) => severityLevel(finding.severity) === \"error\");\n\n const shared = {\n schemaVersion: AGENT_FORMAT_SCHEMA_VERSION,\n summary: zeroRulesLoaded\n ? \"indeterminate; zero_rules_loaded\"\n : integrityFailed\n ? `failed with score ${score}; ${input.integrity.reasons.join(\"; \") || \"governance integrity is unhealthy\"}`\n : agentSummary(input.findings.length, input.filesScanned, score),\n integrity: input.integrity,\n fix_first: agentFindings.filter((finding) => finding.plan.confidence >= 0.8),\n remaining: agentFindings.filter((finding) => finding.plan.confidence < 0.8),\n suppression_template: {\n directive: '// @fragments-expect-error {code} reason=\"...\" expires=\"YYYY-MM-DD\"',\n requiredFields: [\"reason\"],\n example:\n '// @fragments-expect-error FUI2001 reason=\"hero brand red approved\" expires=\"2026-08-01\"',\n },\n budget: {\n iteration: input.iteration ?? 0,\n maxIterations: input.maxIterations ?? 3,\n scoreDelta: input.previousScore === undefined ? 0 : score - input.previousScore,\n },\n ...(input.includeFindings ? { findings: [...input.findings] } : {}),\n ...(input.suppressions\n ? {\n suppressions: input.suppressions.map((suppression) => ({\n code: suppression.code,\n reason: suppression.reason,\n ...(suppression.expiresOn ? { expiresOn: suppression.expiresOn } : {}),\n scope: \"line\" as const,\n })),\n }\n : {}),\n ...(input.provenance ? { provenance: input.provenance } : {}),\n ...(input.verdict ? { verdict: input.verdict } : {}),\n };\n\n if (zeroRulesLoaded) {\n return {\n ...shared,\n integrity: { ...input.integrity, rulesLoaded: 0 },\n passed: false,\n status: \"indeterminate\",\n reasons: [\"zero_rules_loaded\"],\n };\n }\n\n return {\n ...shared,\n passed: !integrityFailed && (input.passed ?? true) && !hasErrors,\n score,\n };\n}\n\nfunction uniqueFindings(findings: readonly Finding[]): Finding[] {\n const seen = new Set<string>();\n const out: Finding[] = [];\n for (const finding of findings) {\n const key =\n finding.fingerprint ??\n `${finding.ruleId}\\0${finding.location.file}\\0${finding.location.line}\\0${finding.message}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(finding);\n }\n return out;\n}\n\nfunction scoreFindings(findings: readonly Finding[]): number {\n if (findings.length === 0) return 100;\n let penalty = 0;\n for (const finding of findings) {\n const level = severityLevel(finding.severity);\n penalty += level === \"error\" ? 10 : level === \"warn\" ? 3 : 1;\n }\n return Math.max(1, Math.round(100 / (1 + penalty / 40)));\n}\n\nfunction agentSummary(count: number, filesScanned: number, score: number): string {\n if (count === 0) return `passed with score ${score}; no findings`;\n return `${count} finding${count === 1 ? \"\" : \"s\"} across ${filesScanned} file${filesScanned === 1 ? \"\" : \"s\"}; score ${score}`;\n}\n\nfunction planForFinding(finding: Finding): AgentFormat[\"fix_first\"][number][\"plan\"] {\n if (finding.fix?.deterministic === true) {\n return {\n tool: \"design_system/conform\",\n args: {\n filePath: finding.location.file,\n fingerprint: finding.fingerprint,\n apply: \"deterministic\",\n },\n confidence: 0.95,\n };\n }\n if (\n finding.code?.startsWith(\"FUI1\") ||\n finding.ruleId.includes(\"component\") ||\n finding.ruleId.includes(\"canonical\")\n ) {\n return {\n tool: \"design_system/conform\",\n args: { filePath: finding.location.file, apply: \"deterministic\" },\n confidence: 0.65,\n };\n }\n return {\n tool: \"design_system/conform\",\n args: {\n filePath: finding.location.file,\n property:\n stringAttribute(finding.attributes?.property) ??\n stringAttribute(finding.attributes?.prop) ??\n \"color\",\n value:\n stringAttribute(finding.attributes?.rawValue) ?? stringAttribute(finding.attributes?.color),\n apply: \"deterministic\",\n },\n confidence: 0.55,\n };\n}\n\nfunction stringAttribute(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n","/**\n * Performance budget presets and classification utilities.\n *\n * ESLint model: global defaults, zero-config, auto-measurement.\n * Users configure 0-3 numbers. Per-component overrides are the `eslint-disable` equivalent.\n */\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface PerformanceBudgets {\n /** Maximum gzipped bundle size in bytes */\n bundleSize: number;\n}\n\nexport interface PerformanceConfig {\n preset: string;\n budgets: PerformanceBudgets;\n}\n\nexport type ComplexityTier = 'lightweight' | 'moderate' | 'heavy';\n\nexport interface PerformanceData {\n /** Gzipped bundle size in bytes */\n bundleSize: number;\n /** Raw (minified, not gzipped) bundle size in bytes */\n rawSize: number;\n /** Complexity classification */\n complexity: ComplexityTier;\n /** Percentage of budget used (0-100+) */\n budgetPercent: number;\n /** Whether the component exceeds its budget */\n overBudget: boolean;\n /** ISO timestamp when measured */\n measuredAt: string;\n}\n\nexport interface PerformanceSummary {\n /** Preset name used */\n preset: string;\n /** Budget applied in bytes */\n budget: number;\n /** Total components measured */\n total: number;\n /** Number of components over budget */\n overBudget: number;\n /** Distribution by tier */\n tiers: Record<ComplexityTier, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Presets\n// ---------------------------------------------------------------------------\n\nconst PRESETS: Record<string, PerformanceBudgets> = {\n strict: { bundleSize: 8 * 1024 }, // 8KB gzipped\n standard: { bundleSize: 15 * 1024 }, // 15KB gzipped\n relaxed: { bundleSize: 30 * 1024 }, // 30KB gzipped\n};\n\nexport const PRESET_NAMES = Object.keys(PRESETS) as readonly string[];\n\n// ---------------------------------------------------------------------------\n// Resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve a performance config from user input.\n * Accepts a preset name string or a custom config object.\n */\nexport function resolvePerformanceConfig(\n input: string | { preset?: string; budgets?: Partial<PerformanceBudgets> } | undefined\n): PerformanceConfig {\n if (!input) {\n return { preset: 'standard', budgets: PRESETS.standard };\n }\n\n if (typeof input === 'string') {\n const budgets = PRESETS[input];\n if (!budgets) {\n throw new Error(\n `Unknown performance preset \"${input}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n return { preset: input, budgets };\n }\n\n const presetName = input.preset ?? 'standard';\n const baseBudgets = PRESETS[presetName];\n if (!baseBudgets) {\n throw new Error(\n `Unknown performance preset \"${presetName}\". Available: ${PRESET_NAMES.join(', ')}`\n );\n }\n\n return {\n preset: presetName,\n budgets: {\n bundleSize: input.budgets?.bundleSize ?? baseBudgets.bundleSize,\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Classification\n// ---------------------------------------------------------------------------\n\n/**\n * Classify a component's complexity based on gzipped bundle size.\n *\n * - lightweight: < 5KB — simple, leaf components\n * - moderate: < 15KB — typical composed components\n * - heavy: >= 15KB — complex widgets with dependencies\n */\nexport function classifyComplexity(gzipBytes: number): ComplexityTier {\n if (gzipBytes < 5 * 1024) return 'lightweight';\n if (gzipBytes < 15 * 1024) return 'moderate';\n return 'heavy';\n}\n\n// ---------------------------------------------------------------------------\n// Formatting helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Format bytes to a human-readable string (e.g. \"2.1KB\", \"15.3KB\").\n */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes}B`;\n const kb = bytes / 1024;\n return kb < 10 ? `${kb.toFixed(1)}KB` : `${Math.round(kb)}KB`;\n}\n\n/**\n * Create a visual budget bar for terminal output.\n */\nexport function budgetBar(percent: number, width = 20): string {\n const filled = Math.min(Math.round((percent / 100) * width), width);\n const bar = '█'.repeat(filled) + '░'.repeat(width - filled);\n return percent > 100 ? `\\x1b[31m${bar}\\x1b[0m` : `\\x1b[32m${bar}\\x1b[0m`;\n}\n","import { z } from 'zod';\n\nexport const bundleSchemaVersionSchema = z.literal(1);\nexport const bundleTargetSchema = z.enum([\n 'cursor',\n 'agents',\n 'claude',\n 'copilot',\n]);\n\nexport const bundleArtifactMetadataSchema = z.object({\n kind: z.enum([\n 'manifest',\n 'tokens',\n 'design-system',\n 'readme',\n 'helper',\n 'component',\n ]),\n key: z.string().min(1),\n label: z.string().min(1),\n path: z.string().min(1),\n etag: z.string().min(1),\n updatedAt: z.string().datetime(),\n target: bundleTargetSchema.optional(),\n componentId: z.string().optional(),\n contentType: z.enum(['application/json', 'text/markdown']),\n});\n\nconst bundleManifestRelationSchema = z.object({\n type: z.string().min(1),\n componentId: z.string().min(1),\n name: z.string().min(1),\n});\n\nconst bundleManifestCompoundChildSchema = z.object({\n componentId: z.string().min(1),\n name: z.string().min(1),\n});\n\nexport const bundleManifestComponentEntrySchema = z.object({\n componentId: z.string().min(1),\n file: z.string().min(1),\n name: z.string().min(1),\n publicSlug: z.string().nullable(),\n tier: z.enum(['core', 'composition']),\n category: z.string().min(1),\n status: z.string().min(1),\n description: z.string(),\n propCount: z.number().int().nonnegative(),\n hasExamples: z.boolean(),\n hasCompoundChildren: z.boolean(),\n relations: z.array(bundleManifestRelationSchema),\n compoundChildren: z.array(bundleManifestCompoundChildSchema),\n});\n\nexport const bundleManifestSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n org: z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n slug: z.string().min(1),\n }),\n designSystem: z.object({\n name: z.string().min(1),\n packageName: z.string().nullable(),\n importPath: z.string().nullable(),\n }),\n sourceBinding: z.object({\n bindingId: z.string().min(1),\n projectId: z.string().min(1),\n projectName: z.string().min(1),\n repoFullName: z.string().min(1),\n resolution: z.enum(['explicit', 'auto']),\n }),\n totalComponents: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n tokenCategories: z.record(z.string(), z.number().int().nonnegative()),\n components: z.record(z.string(), bundleManifestComponentEntrySchema),\n});\n\nconst bundleTokenEntrySchema = z.object({\n name: z.string().min(1),\n path: z.array(z.string().min(1)),\n category: z.string().min(1),\n value: z.string(),\n type: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const bundleTokenFileSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n categories: z.record(\n z.string(),\n z.object({\n count: z.number().int().nonnegative(),\n tokens: z.array(bundleTokenEntrySchema),\n }),\n ),\n flat: z.array(bundleTokenEntrySchema),\n});\n\nexport const bundleComponentShardSchema = z.object({\n schemaVersion: bundleSchemaVersionSchema,\n catalogRevision: z.string().min(1),\n catalogUpdatedAt: z.string().datetime(),\n componentId: z.string().min(1),\n file: z.string().min(1),\n component: z.object({\n componentKey: z.string().min(1),\n publicRef: z.string().min(1),\n publicId: z.string().nullable(),\n publicSlug: z.string().nullable(),\n isCanonical: z.boolean().optional(),\n name: z.string().min(1),\n tier: z.enum(['core', 'composition']),\n category: z.string().min(1),\n status: z.string().min(1),\n description: z.string(),\n usageGuidance: z.string(),\n dos: z.array(z.string()),\n donts: z.array(z.string()),\n props: z.record(z.string(), z.unknown()),\n relations: z.array(z.record(z.string(), z.unknown())),\n compoundChildren: z.array(bundleManifestCompoundChildSchema),\n examples: z.array(z.record(z.string(), z.unknown())),\n source: z.literal('design-system'),\n sourcePath: z.string().optional(),\n sourceRepoFullName: z.string().optional(),\n parentComponentName: z.string().optional(),\n parentComponentKey: z.string().optional(),\n }),\n});\n\nexport type BundleSchemaVersion = z.infer<typeof bundleSchemaVersionSchema>;\nexport type BundleTarget = z.infer<typeof bundleTargetSchema>;\nexport type BundleArtifactMetadata = z.infer<\n typeof bundleArtifactMetadataSchema\n>;\nexport type BundleManifestComponentEntry = z.infer<\n typeof bundleManifestComponentEntrySchema\n>;\nexport type BundleManifest = z.infer<typeof bundleManifestSchema>;\nexport type BundleComponentShard = z.infer<typeof bundleComponentShardSchema>;\nexport type BundleTokenFile = z.infer<typeof bundleTokenFileSchema>;\n","import { portableRepoPathError } from \"./config-paths.js\";\nimport {\n REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION,\n hashRegistryFileContent,\n registryInstallReceiptSchema,\n type RegistryArtifact,\n type RegistryDependency,\n type RegistryFile,\n type RegistryInstallReceipt,\n} from \"./registry.js\";\n\nexport interface RegistryWritePlan {\n path: string;\n sourcePath: string;\n content: string;\n componentId?: string;\n}\n\nexport interface BuildRegistryInstallPlanInput {\n artifact: RegistryArtifact;\n requestedComponents: readonly string[];\n targetPath: string;\n all?: boolean;\n includeTests?: boolean;\n}\n\nexport interface RegistryInstallPlan {\n componentNames: string[];\n plans: RegistryWritePlan[];\n dependencies: RegistryDependency[];\n}\n\nexport function normalizeRegistryRepoPath(path: string): string {\n return path\n .split(\"\\\\\")\n .join(\"/\")\n .replace(/^\\.\\/+/, \"\");\n}\n\nexport function assertPortableRegistryPath(path: string, label: string): string {\n const normalized = normalizeRegistryRepoPath(path);\n const error = portableRepoPathError(normalized);\n if (error) throw new Error(`${label}: ${error}`);\n return normalized;\n}\n\nfunction joinRegistryPath(...parts: string[]): string {\n return normalizeRegistryRepoPath(parts.filter(Boolean).join(\"/\"));\n}\n\nexport function sourceToRegistryTargetPath(targetRoot: string, sourcePath: string): string {\n const source = normalizeRegistryRepoPath(sourcePath);\n const withoutSrc = source.startsWith(\"src/\") ? source.slice(\"src/\".length) : source;\n return assertPortableRegistryPath(\n joinRegistryPath(targetRoot, withoutSrc),\n \"Registry install target\"\n );\n}\n\nexport function selectedRegistryComponentNames(\n artifact: RegistryArtifact,\n requested: readonly string[],\n all: boolean | undefined\n): string[] {\n if (all || requested.includes(\"*\")) {\n return Object.keys(artifact.manifest.components).sort((left, right) =>\n left.localeCompare(right)\n );\n }\n if (requested.length === 0) {\n throw new Error(\"Choose at least one registry component to install.\");\n }\n for (const name of requested) {\n if (!artifact.manifest.components[name]) {\n throw new Error(`Unknown registry component ${name}`);\n }\n }\n return [...new Set(requested)].sort();\n}\n\nfunction installsCompleteRegistry(\n artifact: RegistryArtifact,\n componentNames: readonly string[]\n): boolean {\n const allComponents = Object.keys(artifact.manifest.components);\n return (\n componentNames.length === allComponents.length &&\n allComponents.every((name) => componentNames.includes(name))\n );\n}\n\nfunction shouldInstallFile(file: RegistryFile, includeTests: boolean | undefined): boolean {\n if (includeTests) return true;\n return file.role !== \"test\" && file.role !== \"story\";\n}\n\nfunction dependencyKey(dependency: RegistryDependency): string {\n return `${dependency.type}:${dependency.name}:${dependency.versionRange}:${dependency.optional ? 1 : 0}`;\n}\n\nexport function collectRegistryInstallDependencies(\n artifact: RegistryArtifact,\n componentNames: readonly string[]\n): RegistryDependency[] {\n const dependencies = new Map<string, RegistryDependency>();\n for (const dependency of artifact.manifest.dependencies) {\n dependencies.set(dependencyKey(dependency), dependency);\n }\n for (const name of componentNames) {\n const component = artifact.manifest.components[name];\n for (const dependency of [...component.runtimeDependencies, ...component.peerDependencies]) {\n dependencies.set(dependencyKey(dependency), dependency);\n }\n }\n return [...dependencies.values()].sort((left, right) => left.name.localeCompare(right.name));\n}\n\nfunction collectComponentWritePlan(args: {\n artifact: RegistryArtifact;\n componentNames: readonly string[];\n targetPath: string;\n includeTests?: boolean;\n}): RegistryWritePlan[] {\n const writes = new Map<string, RegistryWritePlan>();\n for (const componentName of args.componentNames) {\n const component = args.artifact.manifest.components[componentName];\n for (const file of component.files) {\n if (!shouldInstallFile(file, args.includeTests)) continue;\n const content = args.artifact.files[file.path];\n if (!content) throw new Error(`Artifact is missing file content for ${file.path}`);\n const target = sourceToRegistryTargetPath(args.targetPath, file.path);\n writes.set(target, {\n path: target,\n sourcePath: file.path,\n content: content.content,\n componentId: component.componentId,\n });\n }\n }\n return [...writes.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction rewriteInstalledPackagePath(value: string): string {\n if (value.startsWith(\"./src/\")) return `./${value.slice(\"./src/\".length)}`;\n if (value.startsWith(\"src/\")) return value.slice(\"src/\".length);\n return value;\n}\n\nfunction rewriteInstalledPackageExport(value: unknown): unknown {\n if (typeof value === \"string\") return rewriteInstalledPackagePath(value);\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return value;\n return Object.fromEntries(\n Object.entries(value).map(([key, nested]) => [key, rewriteInstalledPackageExport(nested)])\n );\n}\n\nfunction rewriteInstalledPackageJson(content: string): string {\n const parsed = JSON.parse(content) as {\n name?: string;\n version?: string;\n type?: string;\n sideEffects?: unknown;\n main?: string;\n types?: string;\n fragments?: string;\n exports?: unknown;\n dependencies?: unknown;\n peerDependencies?: unknown;\n peerDependenciesMeta?: unknown;\n };\n\n const installed = {\n ...(parsed.name && { name: parsed.name }),\n ...(parsed.version && { version: parsed.version }),\n private: true,\n ...(parsed.type && { type: parsed.type }),\n ...(parsed.sideEffects !== undefined && { sideEffects: parsed.sideEffects }),\n ...(parsed.main && { main: rewriteInstalledPackagePath(parsed.main) }),\n ...(parsed.types && { types: rewriteInstalledPackagePath(parsed.types) }),\n fragments: rewriteInstalledPackagePath(parsed.fragments ?? \"fragments.json\"),\n ...(parsed.exports !== undefined && {\n exports: rewriteInstalledPackageExport(parsed.exports),\n }),\n ...(parsed.dependencies !== undefined && { dependencies: parsed.dependencies }),\n ...(parsed.peerDependencies !== undefined && { peerDependencies: parsed.peerDependencies }),\n ...(parsed.peerDependenciesMeta !== undefined && {\n peerDependenciesMeta: parsed.peerDependenciesMeta,\n }),\n };\n\n return `${JSON.stringify(installed, null, 2)}\\n`;\n}\n\nfunction collectPackageWritePlan(args: {\n artifact: RegistryArtifact;\n targetPath: string;\n includeTests?: boolean;\n}): RegistryWritePlan[] {\n const writes = new Map<string, RegistryWritePlan>();\n const packageFiles = new Map(\n args.artifact.manifest.packageFiles.map((file) => [file.path, file])\n );\n for (const entrypoint of args.artifact.manifest.entrypoints) {\n const file = packageFiles.get(entrypoint.sourcePath);\n if (file) continue;\n const content = args.artifact.files[entrypoint.sourcePath];\n if (!content) throw new Error(`Artifact is missing file content for ${entrypoint.sourcePath}`);\n packageFiles.set(entrypoint.sourcePath, {\n path: entrypoint.sourcePath,\n role: \"barrel\",\n sha256: content.sha256,\n size: content.size,\n contentType: content.contentType,\n contentRef: `sha256:${content.sha256}`,\n });\n }\n\n for (const file of packageFiles.values()) {\n if (!shouldInstallFile(file, args.includeTests)) continue;\n const content = args.artifact.files[file.path];\n if (!content) throw new Error(`Artifact is missing file content for ${file.path}`);\n const target = sourceToRegistryTargetPath(args.targetPath, file.path);\n writes.set(target, {\n path: target,\n sourcePath: file.path,\n content:\n file.path === \"package.json\"\n ? rewriteInstalledPackageJson(content.content)\n : content.content,\n });\n }\n\n return [...writes.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nfunction generatedIndexPlan(args: {\n componentNames: readonly string[];\n targetPath: string;\n artifact: RegistryArtifact;\n}): RegistryWritePlan {\n const lines = args.componentNames.map((name) => {\n const component = args.artifact.manifest.components[name];\n const exportName = component.exports[0]?.name ?? component.name;\n return `export { ${exportName} } from \"./components/${component.componentId}\";`;\n });\n return {\n path: assertPortableRegistryPath(\n joinRegistryPath(args.targetPath, \"index.ts\"),\n \"Registry index target\"\n ),\n sourcePath: \"registry/generated-index.ts\",\n content: `${lines.join(\"\\n\")}\\n`,\n };\n}\n\nfunction dedupePlans(plans: readonly RegistryWritePlan[]): RegistryWritePlan[] {\n const byPath = new Map<string, RegistryWritePlan>();\n for (const plan of plans) {\n const existing = byPath.get(plan.path);\n if (existing && existing.content !== plan.content) {\n throw new Error(`Conflicting registry write plans for ${plan.path}`);\n }\n byPath.set(plan.path, existing ?? plan);\n }\n return [...byPath.values()].sort((left, right) => left.path.localeCompare(right.path));\n}\n\nexport function buildRegistryInstallPlan(\n input: BuildRegistryInstallPlanInput\n): RegistryInstallPlan {\n const targetPath = assertPortableRegistryPath(input.targetPath, \"Registry target\");\n const componentNames = selectedRegistryComponentNames(\n input.artifact,\n input.requestedComponents,\n input.all\n );\n const dependencies = collectRegistryInstallDependencies(input.artifact, componentNames);\n const isCompleteInstall = installsCompleteRegistry(input.artifact, componentNames);\n const hasPackageRoot = input.artifact.manifest.entrypoints.some(\n (entrypoint) => entrypoint.specifier === \".\"\n );\n const plans = dedupePlans([\n ...(isCompleteInstall\n ? collectPackageWritePlan({\n artifact: input.artifact,\n targetPath,\n includeTests: input.includeTests,\n })\n : []),\n ...collectComponentWritePlan({\n artifact: input.artifact,\n componentNames,\n targetPath,\n includeTests: input.includeTests,\n }),\n ...(isCompleteInstall && hasPackageRoot\n ? []\n : [generatedIndexPlan({ artifact: input.artifact, componentNames, targetPath })]),\n ]);\n\n return { componentNames, plans, dependencies };\n}\n\nexport function buildRegistryInstallReceipt(args: {\n artifact: RegistryArtifact;\n targetPath: string;\n importPath: string;\n componentNames: readonly string[];\n plans: readonly RegistryWritePlan[];\n dependencies: readonly RegistryDependency[];\n installedAt?: string;\n}): RegistryInstallReceipt {\n const installedComponents = args.componentNames.map((name) => {\n const component = args.artifact.manifest.components[name];\n return {\n componentId: component.componentId,\n publicRef: component.publicRef,\n name: component.name,\n files: args.plans\n .filter((plan) => plan.componentId === component.componentId)\n .map((plan) => plan.path),\n };\n });\n\n return registryInstallReceiptSchema.parse({\n schemaVersion: REGISTRY_INSTALL_RECEIPT_SCHEMA_VERSION,\n registryId: args.artifact.manifest.registryId,\n registryVersion: args.artifact.manifest.version,\n registryHash: args.artifact.manifest.registryHash,\n fcid: args.artifact.manifest.fcid,\n channel: args.artifact.manifest.channel,\n targetPath: assertPortableRegistryPath(args.targetPath, \"Registry target\"),\n importPath: args.importPath,\n installedComponents,\n files: args.plans.map((plan) => ({\n path: plan.path,\n sourcePath: plan.sourcePath,\n sha256: hashRegistryFileContent(plan.content),\n componentId: plan.componentId,\n })),\n dependencies: args.dependencies,\n installedAt: args.installedAt ?? new Date().toISOString(),\n });\n}\n","import { z } from 'zod';\n\nexport const mcpSnapshotSchemaVersionSchema = z.literal(1);\n\nexport const mcpSourceTypeSchema = z.enum([\n 'fragments-json',\n 'cloud',\n 'auto-extract',\n 'custom-json',\n 'bundle',\n]);\n\nexport const mcpCapabilitySchema = z.enum([\n 'components',\n 'tokens',\n 'blocks',\n 'graph',\n 'performance',\n]);\n\nexport const mcpPerformanceImportSchema = z.object({\n path: z.string().min(1),\n bytes: z.number().nonnegative(),\n percent: z.number().nonnegative(),\n});\n\nexport const mcpPerformanceDataSchema = z.object({\n bundleSize: z.number().nonnegative(),\n rawSize: z.number().nonnegative(),\n complexity: z.enum(['lightweight', 'moderate', 'heavy']),\n budgetPercent: z.number().nonnegative(),\n overBudget: z.boolean(),\n measuredAt: z.string().datetime(),\n imports: z.array(mcpPerformanceImportSchema).optional(),\n});\n\nexport const mcpPerformanceSummarySchema = z.object({\n preset: z.string().min(1),\n budget: z.number().nonnegative(),\n total: z.number().int().nonnegative(),\n overBudget: z.number().int().nonnegative(),\n tiers: z.record(\n z.enum(['lightweight', 'moderate', 'heavy']),\n z.number().int().nonnegative(),\n ),\n});\n\nexport const mcpComponentPropSchema = z.object({\n type: z.string().min(1),\n description: z.string().default(''),\n required: z.boolean().default(false),\n default: z.unknown().optional(),\n values: z.array(z.string()).optional(),\n constraints: z.array(z.string()).optional(),\n});\n\nexport const mcpComponentExampleSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n code: z.string().optional(),\n kind: z.string().optional(),\n});\n\nexport const mcpComponentRelationSchema = z.object({\n componentName: z.string().min(1),\n componentId: z.string().optional(),\n relationship: z.string().min(1),\n note: z.string().optional(),\n description: z.string().optional(),\n});\n\nexport const mcpCompoundChildSchema = z.object({\n name: z.string().min(1),\n componentId: z.string().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n visibility: z.enum(['public', 'internal']).optional(),\n});\n\nexport const mcpGuidancePatternSchema = z.object({\n name: z.string().min(1),\n description: z.string().optional(),\n});\n\nexport const mcpComponentGuidanceSchema = z.object({\n when: z.array(z.string()).default([]),\n whenNot: z.array(z.string()).default([]),\n guidelines: z.array(z.string()).default([]),\n accessibility: z.array(z.string()).default([]),\n usageGuidance: z.string().optional(),\n dos: z.array(z.string()).default([]),\n donts: z.array(z.string()).default([]),\n patterns: z.array(mcpGuidancePatternSchema).default([]),\n});\n\nexport const mcpComponentMetadataSchema = z.object({\n a11yRules: z.array(z.string()).default([]),\n scenarioTags: z.array(z.string()).default([]),\n});\n\nexport const mcpComponentSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().default(''),\n category: z.string().default('uncategorized'),\n status: z.string().default('stable'),\n tags: z.array(z.string()).default([]),\n props: z.record(z.string(), mcpComponentPropSchema).default({}),\n propsSummary: z.array(z.string()).default([]),\n examples: z.array(mcpComponentExampleSchema).default([]),\n relations: z.array(mcpComponentRelationSchema).default([]),\n compoundChildren: z.array(mcpCompoundChildSchema).default([]),\n guidance: mcpComponentGuidanceSchema.default({\n when: [],\n whenNot: [],\n guidelines: [],\n accessibility: [],\n dos: [],\n donts: [],\n patterns: [],\n }),\n sourceType: mcpSourceTypeSchema,\n sourcePath: z.string().optional(),\n sourceRepoFullName: z.string().optional(),\n packageName: z.string().optional(),\n importPath: z.string().optional(),\n publicRef: z.string().optional(),\n publicSlug: z.string().nullable().optional(),\n isCanonical: z.boolean().optional(),\n tier: z.string().optional(),\n parentComponentId: z.string().optional(),\n parentComponentName: z.string().optional(),\n performance: mcpPerformanceDataSchema.optional(),\n metadata: mcpComponentMetadataSchema.default({\n a11yRules: [],\n scenarioTags: [],\n }),\n});\n\nexport const mcpBlockSchema = z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n description: z.string().default(''),\n category: z.string().default('uncategorized'),\n components: z.array(z.string()).default([]),\n tags: z.array(z.string()).default([]),\n code: z.string().default(''),\n});\n\nexport const mcpTokenSchema = z.object({\n name: z.string().min(1),\n category: z.string().min(1),\n value: z.string().optional(),\n description: z.string().optional(),\n path: z.array(z.string()).optional(),\n type: z.string().optional(),\n});\n\nexport const mcpTokenDataSchema = z.object({\n prefix: z.string(),\n total: z.number().int().nonnegative(),\n categories: z.record(z.string(), z.array(mcpTokenSchema)),\n flat: z.array(mcpTokenSchema).default([]),\n});\n\nexport const mcpSnapshotMetadataSchema = z.object({\n designSystemName: z.string().optional(),\n packageName: z.string().optional(),\n importPath: z.string().optional(),\n revision: z.string().optional(),\n updatedAt: z.string().optional(),\n});\n\nexport const mcpSnapshotSchema = z.object({\n schemaVersion: mcpSnapshotSchemaVersionSchema,\n sourceType: mcpSourceTypeSchema,\n sourceLabel: z.string().min(1),\n capabilities: z.array(mcpCapabilitySchema),\n metadata: mcpSnapshotMetadataSchema.default({}),\n components: z.record(z.string(), mcpComponentSchema),\n blocks: z.record(z.string(), mcpBlockSchema).optional(),\n tokens: mcpTokenDataSchema.optional(),\n graph: z.unknown().optional(),\n performanceSummary: mcpPerformanceSummarySchema.optional(),\n packageMap: z.record(z.string(), z.string()).default({}),\n defaultPackageName: z.string().optional(),\n});\n\nexport type McpSnapshotSchemaVersion = z.infer<\n typeof mcpSnapshotSchemaVersionSchema\n>;\nexport type McpSourceType = z.infer<typeof mcpSourceTypeSchema>;\nexport type McpCapability = z.infer<typeof mcpCapabilitySchema>;\nexport type McpPerformanceImport = z.infer<\n typeof mcpPerformanceImportSchema\n>;\nexport type McpPerformanceData = z.infer<typeof mcpPerformanceDataSchema>;\nexport type McpPerformanceSummary = z.infer<\n typeof mcpPerformanceSummarySchema\n>;\nexport type McpComponentProp = z.infer<typeof mcpComponentPropSchema>;\nexport type McpComponentExample = z.infer<typeof mcpComponentExampleSchema>;\nexport type McpComponentRelation = z.infer<\n typeof mcpComponentRelationSchema\n>;\nexport type McpCompoundChild = z.infer<typeof mcpCompoundChildSchema>;\nexport type McpGuidancePattern = z.infer<typeof mcpGuidancePatternSchema>;\nexport type McpComponentGuidance = z.infer<\n typeof mcpComponentGuidanceSchema\n>;\nexport type McpComponentMetadata = z.infer<\n typeof mcpComponentMetadataSchema\n>;\nexport type McpComponent = z.infer<typeof mcpComponentSchema>;\nexport type McpBlock = z.infer<typeof mcpBlockSchema>;\nexport type McpToken = z.infer<typeof mcpTokenSchema>;\nexport type McpTokenData = z.infer<typeof mcpTokenDataSchema>;\nexport type McpSnapshotMetadata = z.infer<\n typeof mcpSnapshotMetadataSchema\n>;\nexport type McpSnapshot = z.infer<typeof mcpSnapshotSchema>;\n","export interface RGB {\n r: number;\n g: number;\n b: number;\n}\n\nexport interface RGBA extends RGB {\n a?: number;\n}\n\nconst NAMED_COLORS: Record<string, RGB> = {\n white: { r: 255, g: 255, b: 255 },\n black: { r: 0, g: 0, b: 0 },\n transparent: { r: 0, g: 0, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n green: { r: 0, g: 128, b: 0 },\n blue: { r: 0, g: 0, b: 255 },\n};\n\nexport function hexToRgb(hex: string): RGB | null {\n const match = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n };\n}\n\nexport function rgbToHex(r: number, g: number, b: number): string {\n return `#${[r, g, b]\n .map((x) => Math.round(x).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\nexport function parseRgb(color: string): RGBA | null {\n const match = color.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/i,\n );\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 10),\n g: parseInt(match[2], 10),\n b: parseInt(match[3], 10),\n a: match[4] ? parseFloat(match[4]) : undefined,\n };\n}\n\nexport function parseColor(color: string): RGBA | null {\n const hex = hexToRgb(color);\n if (hex) return hex;\n\n const rgb = parseRgb(color);\n if (rgb) {\n return {\n ...rgb,\n a: rgb.a ?? 1,\n };\n }\n\n return null;\n}\n\nexport function parseColorToRgb(color: string): RGB | null {\n const lower = color.toLowerCase().trim();\n const named = NAMED_COLORS[lower];\n if (named) return named;\n\n const parsed = parseColor(color);\n if (!parsed) return null;\n\n return {\n r: parsed.r,\n g: parsed.g,\n b: parsed.b,\n };\n}\n\nexport function normalizeColor(color: string): string {\n if (color.startsWith(\"#\")) {\n return color.toLowerCase();\n }\n\n const rgb = parseRgb(color);\n if (rgb) {\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n }\n\n return color.toLowerCase();\n}\n\nexport function isColorLike(value: string): boolean {\n return (\n value.startsWith(\"#\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"hsl\") ||\n /^(transparent|white|black|red|blue|green|yellow|orange|purple|pink|gray|grey)$/i.test(\n value,\n )\n );\n}\n\nexport function familyDistance(c1: RGB, c2: RGB): number {\n const maxDistance = Math.sqrt(255 ** 2 * 3);\n return (\n Math.sqrt((c1.r - c2.r) ** 2 + (c1.g - c2.g) ** 2 + (c1.b - c2.b) ** 2) /\n maxDistance\n );\n}\n\nexport function colorSimilarity(c1: RGB, c2: RGB): number {\n return 1 - familyDistance(c1, c2);\n}\n\nexport function calculateDeltaE(c1: RGB, c2: RGB): number {\n const lab1 = rgbToLab(c1);\n const lab2 = rgbToLab(c2);\n\n return Math.sqrt(\n Math.pow(lab2.l - lab1.l, 2) +\n Math.pow(lab2.a - lab1.a, 2) +\n Math.pow(lab2.b - lab1.b, 2),\n );\n}\n\nexport interface NearestByDeltaEOptions {\n threshold?: number;\n limit?: number;\n}\n\nexport interface DeltaEMatch<T> {\n item: T;\n distance: number;\n confidence: number;\n}\n\nexport function nearestByDeltaE<T>(\n target: RGB | string,\n candidates: readonly T[],\n resolveColor: (candidate: T) => RGB | string | null | undefined,\n options: NearestByDeltaEOptions = {},\n): Array<DeltaEMatch<T>> {\n const targetRgb = typeof target === \"string\" ? parseColorToRgb(target) : target;\n if (!targetRgb) return [];\n\n const threshold = options.threshold ?? Number.POSITIVE_INFINITY;\n const confidenceScale = Number.isFinite(threshold) && threshold > 0 ? threshold : 100;\n const matches: Array<DeltaEMatch<T>> = [];\n\n for (const candidate of candidates) {\n const resolved = resolveColor(candidate);\n const rgb = typeof resolved === \"string\" ? parseColorToRgb(resolved) : resolved;\n if (!rgb) continue;\n\n const distance = calculateDeltaE(targetRgb, rgb);\n if (distance <= threshold) {\n matches.push({\n item: candidate,\n distance,\n confidence: Math.max(0, 1 - distance / confidenceScale),\n });\n }\n }\n\n matches.sort((a, b) => a.distance - b.distance);\n return matches.slice(0, options.limit ?? matches.length);\n}\n\nfunction rgbToLab(rgb: RGB): { l: number; a: number; b: number } {\n let r = rgb.r / 255;\n let g = rgb.g / 255;\n let b = rgb.b / 255;\n\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n let x = (r * 0.4124564 + g * 0.3575761 + b * 0.1804375) / 0.95047;\n let y = r * 0.2126729 + g * 0.7151522 + b * 0.072175;\n let z = (r * 0.0193339 + g * 0.119192 + b * 0.9503041) / 1.08883;\n\n x = x > 0.008856 ? Math.pow(x, 1 / 3) : 7.787 * x + 16 / 116;\n y = y > 0.008856 ? Math.pow(y, 1 / 3) : 7.787 * y + 16 / 116;\n z = z > 0.008856 ? Math.pow(z, 1 / 3) : 7.787 * z + 16 / 116;\n\n return {\n l: 116 * y - 16,\n a: 500 * (x - y),\n b: 200 * (y - z),\n };\n}\n","/**\n * Canonical Style Comparison Engine\n *\n * Pure comparison logic for design-code drift detection.\n * No React, no filesystem, no browser APIs, no Figma client, no Cloud types.\n *\n * This module is the single source of truth for style comparison.\n * CLI comparison surfaces consume these exports.\n */\n\nimport type {\n EnhancedStyleDiffItem,\n TokenCategory,\n TokenUsageSummary,\n} from \"./token-types.js\";\nimport { parseColor } from \"./tokens/color.js\";\nimport type { TokenLookup } from \"./tokens/lookup.js\";\n\nexport { parseColor } from \"./tokens/color.js\";\nexport type { TokenLookup } from \"./tokens/lookup.js\";\n\n// ─── Canonical Contract Types ────────────────────────────────────────────────\n\n/**\n * Source-agnostic normalized token for comparison.\n *\n * This is the canonical shape that all token sources (CSS vars, Tailwind,\n * DTCG, Figma) must produce before entering the comparison engine.\n * A `DesignToken` (CSS-custom-property-specific) can be converted to this\n * by dropping source-specific fields.\n */\nexport interface NormalizedToken {\n /** Canonical token name (e.g., \"--color-primary\", \"colors.primary\") */\n name: string;\n /** Normalized resolved value suitable for comparison (e.g., \"#0051c2\", \"16px\") */\n value: string;\n /** Token category for grouping */\n category: TokenCategory;\n /** Source system identifier */\n source: \"css-var\" | \"tailwind\" | \"dtcg\" | \"figma\" | (string & {});\n /** Original token name as declared in the source system */\n originalName: string;\n /** Theme or mode (e.g., \"default\", \"dark\", \"light\") */\n theme: string;\n}\n\n/**\n * Normalized style map: a record of CSS property names to their string values.\n * Used as the canonical input shape for both design-side and code-side styles.\n */\nexport type NormalizedStyleMap = Record<string, string>;\n\n/**\n * Options for configuring style comparison behavior.\n */\nexport interface StyleComparisonOptions {\n /** Color comparison tolerance in RGB channel delta (default: 5) */\n colorTolerance?: number;\n /** Numeric comparison tolerance in pixels (default: 1) */\n numericTolerance?: number;\n /** Alpha channel comparison tolerance (default: 0.05) */\n alphaTolerance?: number;\n /** CSS properties to compare. If omitted, uses DEFAULT_STYLE_PROPERTIES */\n properties?: string[];\n /** Theme to use for token lookup (default: \"default\") */\n theme?: string;\n}\n\n// ─── Comparison Types ────────────────────────────────────────────────────────\n\n/**\n * Style diff result for a single CSS property.\n */\nexport interface StyleDiffItem {\n /** CSS property name */\n property: string;\n /** Expected value from design source */\n figma: string;\n /** Actual value from rendered component */\n rendered: string;\n /** Whether values match (within tolerance) */\n match: boolean;\n}\n\n/**\n * Result of comparing styles between design and code.\n */\nexport interface StyleComparisonResult {\n /** Whether all styles match */\n match: boolean;\n /** Individual property comparisons */\n properties: StyleDiffItem[];\n /** CSS properties from design source */\n figmaStyles: NormalizedStyleMap;\n /** Computed CSS properties from rendered component */\n renderedStyles: NormalizedStyleMap;\n}\n\n/**\n * Enhanced style comparison result with token information.\n */\nexport interface EnhancedStyleComparisonResult extends StyleComparisonResult {\n /** Individual property comparisons with token info */\n properties: EnhancedStyleDiffItem[];\n /** Token usage summary */\n tokenSummary?: TokenUsageSummary;\n}\n\n// ─── Constants ───────────────────────────────────────────────────────────────\n\n/** Properties that use color comparison with tolerance */\nconst COLOR_PROPERTIES = new Set([\"backgroundColor\", \"borderColor\", \"color\"]);\n\n/** Properties that use numeric comparison with tolerance */\nconst NUMERIC_PROPERTIES = new Set([\n \"borderWidth\",\n \"borderRadius\",\n \"fontSize\",\n \"padding\",\n \"gap\",\n]);\n\n/** Default CSS properties compared by compareStyles() */\nexport const DEFAULT_STYLE_PROPERTIES = [\n \"backgroundColor\",\n \"borderColor\",\n \"borderWidth\",\n \"borderRadius\",\n \"fontFamily\",\n \"fontSize\",\n \"fontWeight\",\n \"lineHeight\",\n \"letterSpacing\",\n \"textAlign\",\n \"boxShadow\",\n \"padding\",\n \"gap\",\n \"opacity\",\n] as const;\n\n/** Default CSS properties compared by compareStylesWithTokens() (includes \"color\") */\nexport const DEFAULT_ENHANCED_STYLE_PROPERTIES = [\n ...DEFAULT_STYLE_PROPERTIES,\n \"color\",\n] as const;\n\n// ─── Pure Comparison Functions ───────────────────────────────────────────────\n\n/**\n * Normalize a style value for comparison.\n */\nexport function normalizeStyleValue(prop: string, value: string): string {\n let normalized = value.trim().replace(/\\s+/g, \" \");\n\n // Normalize \"none\" shadow to empty\n if (prop === \"boxShadow\" && normalized === \"none\") {\n normalized = \"\";\n }\n\n // Normalize rgba(0, 0, 0, 0) to \"transparent\"\n if (normalized.match(/rgba\\(\\s*0\\s*,\\s*0\\s*,\\s*0\\s*,\\s*0\\s*\\)/)) {\n normalized = \"transparent\";\n }\n\n return normalized;\n}\n\n/**\n * Compare two color values with tolerance.\n */\nexport function compareColors(\n color1: string,\n color2: string,\n tolerance: number,\n alphaTolerance = 0.05\n): boolean {\n const rgb1 = parseColor(color1);\n const rgb2 = parseColor(color2);\n\n if (!rgb1 || !rgb2) {\n return color1 === color2;\n }\n\n return (\n Math.abs(rgb1.r - rgb2.r) <= tolerance &&\n Math.abs(rgb1.g - rgb2.g) <= tolerance &&\n Math.abs(rgb1.b - rgb2.b) <= tolerance &&\n Math.abs((rgb1.a ?? 1) - (rgb2.a ?? 1)) <= alphaTolerance\n );\n}\n\n/**\n * Compare numeric values (e.g., \"10px\" vs \"11px\") with tolerance.\n */\nexport function compareNumericValues(\n value1: string,\n value2: string,\n tolerance: number\n): boolean {\n const num1 = parseFloat(value1);\n const num2 = parseFloat(value2);\n\n if (isNaN(num1) || isNaN(num2)) {\n return value1 === value2;\n }\n\n return Math.abs(num1 - num2) <= tolerance;\n}\n\n/**\n * Compare a single style value with tolerance for color and numeric differences.\n */\nexport function compareStyleValue(\n prop: string,\n figma: string,\n rendered: string\n): boolean {\n const normalizedFigma = normalizeStyleValue(prop, figma);\n const normalizedRendered = normalizeStyleValue(prop, rendered);\n\n // Direct match\n if (normalizedFigma === normalizedRendered) {\n return true;\n }\n\n // Color comparison with tolerance\n if (COLOR_PROPERTIES.has(prop)) {\n return compareColors(normalizedFigma, normalizedRendered, 5);\n }\n\n // Numeric comparison with tolerance (for pixels)\n if (NUMERIC_PROPERTIES.has(prop)) {\n return compareNumericValues(normalizedFigma, normalizedRendered, 1);\n }\n\n return false;\n}\n\n/**\n * Compare design CSS properties with rendered computed styles.\n */\nexport function compareStyles(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap\n): StyleComparisonResult {\n const properties: StyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n properties.push({\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n });\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n };\n}\n\n// ─── Token-Aware Comparison ──────────────────────────────────────────────────\n\n/**\n * Compare styles with token awareness.\n *\n * This enhanced version:\n * 1. Performs normal style comparison\n * 2. Identifies which values match design tokens\n * 3. Flags hardcoded values that should use tokens\n * 4. Generates fix suggestions\n */\nexport function compareStylesWithTokens(\n figmaStyles: Record<string, string | undefined>,\n renderedStyles: NormalizedStyleMap,\n tokenLookup?: TokenLookup,\n theme = \"default\"\n): EnhancedStyleComparisonResult {\n const properties: EnhancedStyleDiffItem[] = [];\n const cleanFigmaStyles: NormalizedStyleMap = {};\n\n const propsToCompare = DEFAULT_ENHANCED_STYLE_PROPERTIES;\n\n for (const prop of propsToCompare) {\n const figmaValue = figmaStyles[prop];\n const renderedValue = renderedStyles[prop];\n\n if (figmaValue !== undefined) {\n cleanFigmaStyles[prop] = figmaValue;\n\n const match = compareStyleValue(prop, figmaValue, renderedValue || \"\");\n\n const item: EnhancedStyleDiffItem = {\n property: prop,\n figma: figmaValue,\n rendered: renderedValue || \"(not set)\",\n match,\n isHardcoded: false,\n };\n\n if (tokenLookup) {\n const figmaTokens = tokenLookup.findByValue(figmaValue, theme);\n const renderedTokens = renderedValue\n ? tokenLookup.findByValue(renderedValue, theme)\n : [];\n\n if (figmaTokens.length > 0) {\n item.figmaToken = figmaTokens[0];\n }\n\n if (renderedTokens.length > 0) {\n item.renderedToken = renderedTokens[0];\n }\n\n // Hardcoded = Figma matches a token, but rendered doesn't use a token\n item.isHardcoded = !!item.figmaToken && !item.renderedToken;\n\n if (item.isHardcoded && item.figmaToken) {\n const token = tokenLookup.getToken(item.figmaToken);\n if (token) {\n const cssProperty = toCssProperty(prop);\n item.suggestedFix = {\n tokenName: item.figmaToken,\n tokenValue: token.resolvedValue,\n codeFix: `${cssProperty}: var(${item.figmaToken});`,\n confidence: 0.9,\n reason: `Figma uses token ${item.figmaToken} (${token.resolvedValue}). Replace hardcoded value with token for consistency.`,\n };\n }\n }\n }\n\n properties.push(item);\n }\n }\n\n const allMatch = properties.every((p) => p.match);\n\n let tokenSummary: TokenUsageSummary | undefined;\n if (tokenLookup) {\n tokenSummary = tokenLookup.calculateUsageSummary(\n properties.map((p) => ({\n property: p.property,\n figma: p.figma,\n rendered: p.rendered,\n match: p.match,\n })),\n theme\n );\n }\n\n return {\n match: allMatch,\n properties,\n figmaStyles: cleanFigmaStyles,\n renderedStyles,\n tokenSummary,\n };\n}\n\n// ─── Formatting Helpers ──────────────────────────────────────────────────────\n\n/**\n * Convert camelCase CSS property name to kebab-case.\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n/**\n * Format token usage summary for display.\n */\nexport function formatTokenSummary(summary: TokenUsageSummary): string {\n const lines: string[] = [];\n\n lines.push(`Token Compliance: ${summary.compliancePercent}%`);\n lines.push(\n `${summary.usingTokens}/${summary.totalProperties} properties using tokens`\n );\n\n if (summary.hardcoded > 0) {\n lines.push(`${summary.hardcoded} hardcoded value(s) detected`);\n }\n\n if (summary.implicitMatches > 0) {\n lines.push(`${summary.implicitMatches} implicit match(es)`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Get status badge for token compliance level.\n */\nexport function getComplianceBadge(\n compliancePercent: number\n): { label: string; color: string } {\n if (compliancePercent >= 100) {\n return { label: \"Excellent\", color: \"green\" };\n } else if (compliancePercent >= 80) {\n return { label: \"Good\", color: \"blue\" };\n } else if (compliancePercent >= 50) {\n return { label: \"Fair\", color: \"yellow\" };\n } else {\n return { label: \"Poor\", color: \"red\" };\n }\n}\n","import { z } from \"zod\";\nimport { portableRepoPathError } from \"./config-paths.js\";\nimport { componentGovernanceRecordSchema, governanceConfigSchema } from \"./governance.js\";\nimport { compositionAuthoringEntrySchema } from \"./rules/composition-pattern-schema.js\";\n\n/**\n * Zod schemas for runtime validation of fragment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal(\"figma-string\"),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal(\"figma-boolean\"),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal(\"figma-enum\"),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal(\"figma-instance\"),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal(\"figma-children\"),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal(\"figma-text-content\"),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion(\"__type\", [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const fragmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum([\"stable\", \"beta\", \"deprecated\", \"experimental\"]).optional(),\n since: z.string().optional(),\n dependencies: z\n .array(\n z.object({\n name: z.string().min(1),\n version: z.string().min(1),\n reason: z.string().optional(),\n })\n )\n .optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const fragmentUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n \"string\",\n \"number\",\n \"boolean\",\n \"enum\",\n \"function\",\n \"node\",\n \"element\",\n \"object\",\n \"array\",\n \"union\",\n \"custom\",\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n \"alternative\",\n \"sibling\",\n \"parent\",\n \"child\",\n \"composition\",\n \"complementary\",\n \"used-by\",\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const fragmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.custom<(...args: unknown[]) => unknown>(\n (value) => typeof value === \"function\",\n \"Expected a render function\"\n ),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const fragmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const fragmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(fragmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n performanceBudget: z.number().positive().optional(),\n compoundChildren: z\n .record(\n z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })\n )\n .optional(),\n canonicalUsage: z.array(z.string()).optional(),\n // Region-scoped composition constraints (brief 04 §10). Authors write the\n // `{ inRegion, rule }` sugar; `lowerCompositionContract` lowers it to the\n // `CompositionPattern[]` the composition/* rules read from policy.\n composition: z.array(compositionAuthoringEntrySchema).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated fragments\n */\nexport const fragmentGeneratedSchema = z.object({\n source: z.enum([\"storybook\", \"manual\", \"ai\"]),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for AI-specific metadata for playground context generation\n */\nexport const aiMetadataSchema = z.object({\n compositionPattern: z.enum([\"compound\", \"simple\", \"controlled\", \"wrapper\"]).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\nexport const observedUsagePropSchema = z.object({\n name: z.string().min(1),\n kind: z.enum([\"static\", \"dynamic\", \"spread\", \"jsx\", \"boolean\", \"null\"]),\n value: z.union([z.string(), z.number(), z.boolean(), z.null()]).optional(),\n});\n\nexport const observedComponentUsageSchema = z.object({\n file: z.string().min(1),\n line: z.number().int().positive(),\n column: z.number().int().nonnegative(),\n props: z.array(observedUsagePropSchema),\n parentElement: z.string().optional(),\n conditional: z.boolean().optional(),\n});\n\n/**\n * Schema for block definitions\n */\nexport const blockDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const fragmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: fragmentMetaSchema,\n usage: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(fragmentVariantSchema), // Allow empty variants array\n contract: fragmentContractSchema.optional(),\n ai: aiMetadataSchema.optional(),\n usages: z.array(observedComponentUsageSchema).optional(),\n _generated: fragmentGeneratedSchema.optional(),\n});\n\nconst repoRelativePathSchema = z\n .string()\n .min(1)\n .superRefine((path, ctx) => {\n const error = portableRepoPathError(path);\n if (error) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: error,\n });\n }\n });\n\nconst repoRelativePathsSchema = z.array(repoRelativePathSchema).min(1);\n\nconst tokenSourceSchema = z.object({\n path: repoRelativePathSchema,\n format: z.enum([\"auto\", \"css\", \"scss\", \"dtcg\", \"tailwind\"]).optional(),\n});\n\nconst tokenConfigSchema = z\n .object({\n include: repoRelativePathsSchema.optional(),\n sources: z.array(tokenSourceSchema).min(1).optional(),\n // Declared design-system packages whose shipped fragments.json token\n // vocabulary seeds the known-token set (#7c). A packages-only tokens block\n // is valid — see the superRefine below.\n packages: z.array(z.string().min(1)).optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n themeSelectors: z.record(z.string()).optional(),\n enabled: z.boolean().optional(),\n format: z.enum([\"auto\", \"css\", \"scss\", \"dtcg\", \"tailwind\"]).optional(),\n namespace: z.string().min(1).optional(),\n })\n .passthrough()\n .superRefine((tokens, ctx) => {\n if (!tokens.include?.length && !tokens.sources?.length && !tokens.packages?.length) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Add tokens.include, tokens.sources, or tokens.packages\",\n path: [\"sources\"],\n });\n }\n });\n\nconst topologySchema = z.object({\n version: z.number().int().positive(),\n base: z.enum([\"app\", \"repo\"]).optional(),\n areas: z.array(\n z.object({\n id: z.string().min(1),\n name: z.string().min(1),\n criticality: z.enum([\"low\", \"medium\", \"high\", \"revenue\", \"regulated\"]),\n owners: z.array(z.string()),\n files: repoRelativePathsSchema,\n routes: z.array(z.string().min(1)).optional(),\n priority: z.number().optional(),\n })\n ),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const fragmentsConfigSchema = z.object({\n app: z\n .object({\n path: repoRelativePathSchema.optional(),\n include: repoRelativePathsSchema.optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n })\n .optional(),\n designSystem: z\n .object({\n path: repoRelativePathSchema.optional(),\n packageName: z.string().min(1).optional(),\n components: repoRelativePathsSchema.optional(),\n })\n .optional(),\n include: repoRelativePathsSchema.optional(),\n exclude: z.array(repoRelativePathSchema).optional(),\n components: repoRelativePathsSchema.optional(),\n outFile: repoRelativePathSchema.optional(),\n framework: z.enum([\"react\", \"vue\", \"svelte\"]).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: tokenConfigSchema.optional(),\n snippets: z\n .object({\n mode: z.enum([\"warn\", \"error\"]).optional(),\n scope: z.enum([\"snippet\", \"snippet+render\"]).optional(),\n requireFullSnippet: z.boolean().optional(),\n allowedExternalModules: z.array(z.string().min(1)).optional(),\n })\n .optional(),\n performance: z\n .union([\n z.enum([\"strict\", \"standard\", \"relaxed\"]),\n z.object({\n preset: z.enum([\"strict\", \"standard\", \"relaxed\"]).optional(),\n budgets: z\n .object({\n bundleSize: z.number().positive().optional(),\n })\n .optional(),\n }),\n ])\n .optional(),\n storybook: z\n .object({\n exclude: z.array(z.string()).optional(),\n include: z.array(z.string()).optional(),\n excludeDeprecated: z.boolean().optional(),\n excludeTests: z.boolean().optional(),\n excludeSvgIcons: z.boolean().optional(),\n excludeSubComponents: z.boolean().optional(),\n })\n .optional(),\n topology: topologySchema.optional(),\n govern: governanceConfigSchema.optional(),\n inspect: z\n .object({\n localCanonical: z\n .record(\n z.string().min(1),\n z.object({\n importPath: z.string().min(1),\n resolves: z\n .array(\n z.object({\n tag: z.string().min(1),\n role: z.string().min(1).optional(),\n inputType: z.string().min(1).optional(),\n })\n )\n .min(1),\n })\n )\n .optional(),\n })\n .optional(),\n recognizedClassHelpers: z.array(z.string().min(1)).optional(),\n});\n\n// ---------------------------------------------------------------------------\n// v2 Schemas — alongside v1 (non-breaking)\n// ---------------------------------------------------------------------------\n\n/**\n * Schema for v2 composition metadata (promoted from ai)\n * Uses shorter field names since parent field is `composition`.\n */\nexport const compositionMetadataSchema = z.object({\n pattern: z.enum([\"compound\", \"simple\", \"controlled\", \"wrapper\"]).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 extended provenance tracking\n */\nexport const fragmentProvenanceSchema = z.object({\n source: z.enum([\"storybook\", \"manual\", \"ai\", \"scan\"]),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n autoFields: z.array(z.string()).optional(),\n humanFields: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for v2 fragment definitions.\n * Accepts the v2 field names (guidance, examples, composition, _provenance).\n */\nexport const fragmentDefinitionV2Schema = z.object({\n component: z.any(),\n meta: fragmentMetaSchema,\n guidance: fragmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n examples: z.array(fragmentVariantSchema),\n composition: compositionMetadataSchema.optional(),\n contract: fragmentContractSchema.optional(),\n _provenance: fragmentProvenanceSchema.optional(),\n});\n\nexport const governedFragmentDefinitionSchema = z.object({\n component: z.any(),\n meta: fragmentMetaSchema,\n guidance: fragmentUsageSchema,\n props: z.record(propDefinitionSchema).optional(),\n relations: z.array(componentRelationSchema).optional(),\n examples: z.array(fragmentVariantSchema).optional(),\n composition: compositionMetadataSchema.optional(),\n contract: fragmentContractSchema.optional(),\n _provenance: fragmentProvenanceSchema.optional(),\n govern: z.function().optional(),\n governance: z.array(componentGovernanceRecordSchema).optional(),\n});\n\n/**\n * @deprecated Use blockDefinitionSchema instead\n */\nexport const recipeDefinitionSchema = blockDefinitionSchema;\n","/**\n * The composition config contract — shared across the policy boundary.\n *\n * `CompositionPattern` is what the `composition/cardinality` and\n * `composition/co-occurrence` rules read from\n * `governance_rule_config.options.patterns`. Brief 03 defined it inline in the\n * rule; brief 04 lifted it here because the same shape now has to round-trip\n * across three boundaries that must not all hand-roll it:\n * - the rule's `isCompositionPattern` guard (validates untyped policy facts),\n * - cloud policy storage + delivery (`apps/cloud` validates on write against\n * `compositionPatternSchema` before persisting), and\n * - fragment authoring sugar (`lowerCompositionContract` lowers a fragment's\n * `contract.composition` block to the same `CompositionPattern[]`).\n *\n * Defining it once as a zod schema means the wire shape and the runtime guard\n * are the same artifact — the guard is `safeParse().success`, never a second\n * copy that can drift from the type.\n *\n * Browser-safe: imports `zod` only. No facts, no Node, no JSX.\n */\n\nimport { z } from \"zod\";\n\n// ── The rule-input contract ──────────────────────────────────────────────\n\n/** Which container a pattern applies to. `component` = canonical componentId. */\nexport const compositionRegionSelectorSchema = z.object({\n component: z.string().optional(),\n /** Marker attribute (e.g. `data-fui-region`). Typed; matched in a later brief. */\n marker: z.string().optional(),\n role: z.string().optional(),\n});\n\n/** Which children inside the region the constraint counts. */\nexport const compositionChildSelectorSchema = z.object({\n component: z.string(),\n prop: z.string().optional(),\n value: z.string().optional(),\n});\n\nexport const compositionConstraintSchema = z.discriminatedUnion(\"kind\", [\n z.object({\n kind: z.literal(\"cardinality\"),\n max: z.number().optional(),\n min: z.number().optional(),\n }),\n z.object({\n kind: z.literal(\"co-occurrence\"),\n requires: z.object({ prop: z.string(), value: z.string() }),\n }),\n]);\n\nexport const compositionPatternSchema = z.object({\n region: compositionRegionSelectorSchema,\n select: compositionChildSelectorSchema,\n constraint: compositionConstraintSchema,\n});\n\nexport type CompositionRegionSelector = z.infer<typeof compositionRegionSelectorSchema>;\nexport type CompositionChildSelector = z.infer<typeof compositionChildSelectorSchema>;\nexport type CompositionConstraint = z.infer<typeof compositionConstraintSchema>;\nexport type CompositionPattern = z.infer<typeof compositionPatternSchema>;\n\n/**\n * Type guard for a single policy entry. Config arrives untyped from cloud\n * policy / fragment prose and the facts layer passes `options` through without\n * a shape, so a malformed entry would otherwise emit garbage findings. The rule\n * filters `options.patterns` through this; a bad entry is skipped, the rest keep\n * scanning (architecture failure mode).\n */\nexport function isCompositionPattern(value: unknown): value is CompositionPattern {\n return compositionPatternSchema.safeParse(value).success;\n}\n\n// ── Authoring sugar → constraint (Layer 3, brief 04 §10) ──────────────────\n\n/**\n * The structured block a fragment author writes in `contract.composition`. This\n * is the enforceable form of the prose they already keep (`relations`,\n * `usage.whenNot`); `lowerCompositionContract` turns it into the same\n * `CompositionPattern[]` the rule reads from cloud policy. v0 is this explicit\n * block — free-text inference from `whenNot` strings is out of scope.\n */\nexport const compositionAuthoringEntrySchema = z.object({\n inRegion: z.string(),\n rule: z.union([\n z.object({ atMost: z.number(), of: compositionChildSelectorSchema }),\n z.object({\n when: z.object({\n component: z.string(),\n prop: z.string(),\n value: z.string(),\n }),\n require: z.object({ prop: z.string(), value: z.string() }),\n }),\n ]),\n});\n\nexport type CompositionAuthoringEntry = z.infer<typeof compositionAuthoringEntrySchema>;\n\n/**\n * Lower a fragment's `contract.composition` block to the policy patterns the\n * rule consumes. The authoring shape ({ inRegion, rule }) and the rule shape\n * ({ region, select, constraint }) converge here, so fragment-authored and\n * cloud-delivered constraints reach the rule as one identical config.\n */\nexport function lowerCompositionContract(\n entries: CompositionAuthoringEntry[] | undefined\n): CompositionPattern[] {\n return (entries ?? []).map((entry) => {\n const region = { component: entry.inRegion };\n if (\"atMost\" in entry.rule) {\n return {\n region,\n select: entry.rule.of,\n constraint: { kind: \"cardinality\", max: entry.rule.atMost },\n };\n }\n return {\n region,\n select: entry.rule.when,\n constraint: { kind: \"co-occurrence\", requires: entry.rule.require },\n };\n });\n}\n","import { fragmentsConfigSchema } from \"./schema.js\";\nimport type { FragmentsConfig } from \"./types.js\";\nimport { normalizeGovernanceConfig } from \"./governance.js\";\n\nfunction formatZodErrors(errors: Array<{ path: (string | number)[]; message: string }>) {\n return errors.map((error) => ` - ${error.path.join(\".\")}: ${error.message}`).join(\"\\n\");\n}\n\nexport function defineConfig<TConfig extends FragmentsConfig>(config: TConfig): TConfig {\n const normalized = normalizeGovernanceConfig(config);\n const result = fragmentsConfigSchema.safeParse(normalized);\n\n if (!result.success) {\n throw new Error(`Invalid fragments config:\\n${formatZodErrors(result.error.errors)}`);\n }\n\n return result.data as TConfig;\n}\n","import type {\n FragmentDefinition,\n FragmentDefinitionV2,\n CompiledFragment,\n FragmentComponent,\n BlockDefinition,\n CompiledBlock,\n AIMetadata,\n FragmentGenerated,\n} from \"./types.js\";\nimport type {\n GovernedFragmentDefinition,\n ResolvedGovernedFragmentDefinition,\n} from \"./governance.js\";\nimport {\n fragmentDefinitionSchema,\n fragmentDefinitionV2Schema,\n governedFragmentDefinitionSchema,\n blockDefinitionSchema,\n} from \"./schema.js\";\nimport { resolveComponentGovernance } from \"./governance.js\";\n\nfunction isGovernedDefinition<T>(\n def: FragmentDefinition<T> | FragmentDefinitionV2<T> | GovernedFragmentDefinition<T>\n): def is GovernedFragmentDefinition<T> {\n return \"govern\" in def || \"governance\" in def;\n}\n\n/**\n * Check if a definition uses v2 field names.\n * Detects `guidance` or `examples` (v2) vs `usage` or `variants` (v1).\n */\nfunction isV2Definition<T>(\n def: FragmentDefinition<T> | FragmentDefinitionV2<T> | GovernedFragmentDefinition<T>\n): def is FragmentDefinitionV2<T> {\n return !isGovernedDefinition(def) && (\"guidance\" in def || \"examples\" in def);\n}\n\n/**\n * Normalize a v2 definition to v1 shape for downstream compatibility.\n * The build pipeline, compiler, and validators all work with v1 internally.\n */\nexport function normalizeToV1<T>(def: FragmentDefinitionV2<T>): FragmentDefinition<T> {\n // Map composition → ai (rename fields)\n let ai: AIMetadata | undefined;\n if (def.composition) {\n ai = {\n compositionPattern: def.composition.pattern,\n subComponents: def.composition.subComponents,\n requiredChildren: def.composition.requiredChildren,\n commonPatterns: def.composition.commonPatterns,\n };\n }\n\n // Map _provenance → _generated (narrow source type, drop extended fields)\n let generated: FragmentGenerated | undefined;\n if (def._provenance) {\n generated = {\n source: def._provenance.source === \"scan\" ? \"ai\" : def._provenance.source,\n sourceFile: def._provenance.sourceFile,\n confidence: def._provenance.confidence,\n timestamp: def._provenance.timestamp,\n };\n }\n\n return {\n component: def.component,\n meta: def.meta,\n usage: def.guidance,\n props: def.props,\n relations: def.relations,\n variants: def.examples,\n contract: def.contract,\n ai,\n _generated: generated,\n };\n}\n\n/**\n * Define a fragment for a component.\n *\n * This is the main API for creating fragment documentation.\n * It provides runtime validation and type safety.\n *\n * Accepts both v1 and v2 shapes:\n * - v1: `{ usage, variants, ai, _generated }`\n * - v2: `{ guidance, examples, composition, _provenance }`\n *\n * @example v1\n * ```tsx\n * import { defineFragment } from '@usefragments/core';\n * import { Button } from './Button';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * },\n * usage: {\n * when: ['User needs to trigger an action'],\n * whenNot: ['Navigation without side effects'],\n * },\n * props: {\n * variant: {\n * type: 'enum',\n * values: ['primary', 'secondary'],\n * default: 'primary',\n * description: 'Visual style',\n * },\n * },\n * variants: [\n * {\n * name: 'Default',\n * description: 'Default button',\n * render: () => <Button>Click me</Button>,\n * },\n * ],\n * });\n * ```\n *\n * @example v2\n * ```tsx\n * import { defineFragment } from '@usefragments/core';\n * import { Card } from './Card';\n *\n * export default defineFragment({\n * component: Card,\n * meta: { name: 'Card', description: 'Content container', category: 'layout' },\n * guidance: {\n * when: ['Grouping related content'],\n * whenNot: ['Full-page layouts'],\n * },\n * props: { ... },\n * examples: [{ name: 'Default', description: 'Basic card', render: () => <Card>...</Card> }],\n * composition: { pattern: 'compound', subComponents: ['Header', 'Body', 'Footer'] },\n * });\n * ```\n */\nexport function defineFragment<TProps>(\n definition: GovernedFragmentDefinition<TProps>\n): ResolvedGovernedFragmentDefinition<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinition<TProps>\n): FragmentDefinition<TProps>;\nexport function defineFragment<TProps>(\n definition: FragmentDefinitionV2<TProps>\n): FragmentDefinitionV2<TProps>;\nexport function defineFragment<TProps>(\n definition:\n | FragmentDefinition<TProps>\n | FragmentDefinitionV2<TProps>\n | GovernedFragmentDefinition<TProps>\n):\n | FragmentDefinition<TProps>\n | FragmentDefinitionV2<TProps>\n | ResolvedGovernedFragmentDefinition<TProps> {\n // Validate at runtime in development\n if (process.env.NODE_ENV !== \"production\") {\n const governed = isGovernedDefinition(definition);\n const v2 = isV2Definition(definition);\n const schema = governed\n ? governedFragmentDefinitionSchema\n : v2\n ? fragmentDefinitionV2Schema\n : fragmentDefinitionSchema;\n const result = schema.safeParse(definition);\n if (!result.success) {\n const name = definition.meta?.name || \"unknown\";\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid fragment definition for \"${name}\":\\n${errors}`);\n }\n }\n\n if (isGovernedDefinition(definition)) {\n const governance = resolveComponentGovernance(definition);\n return {\n ...definition,\n governance,\n };\n }\n\n return definition;\n}\n\n/**\n * Compile a fragment definition to JSON-serializable format.\n * Used for generating fragments.json for AI consumption.\n *\n * Accepts both v1 and v2 shapes. V2 is normalized to v1 internally.\n */\nexport function compileFragment(\n definition: FragmentDefinition | FragmentDefinitionV2 | GovernedFragmentDefinition,\n filePath: string\n): CompiledFragment {\n // Normalize v2 → v1 if needed\n const v1 = isGovernedDefinition(definition)\n ? {\n component: definition.component,\n meta: definition.meta,\n usage: definition.guidance,\n props: definition.props ?? {},\n relations: definition.relations,\n variants: definition.examples ?? [],\n contract: definition.contract,\n _generated: definition._provenance\n ? {\n source:\n definition._provenance.source === \"scan\" ? \"ai\" : definition._provenance.source,\n sourceFile: definition._provenance.sourceFile,\n confidence: definition._provenance.confidence,\n timestamp: definition._provenance.timestamp,\n }\n : undefined,\n }\n : isV2Definition(definition)\n ? normalizeToV1(definition)\n : definition;\n\n return {\n filePath,\n meta: v1.meta,\n ...(isGovernedDefinition(definition) && { guidance: definition.guidance }),\n usage: v1.usage,\n props: v1.props,\n ...(isGovernedDefinition(definition) && {\n governance: resolveComponentGovernance(definition),\n }),\n relations: v1.relations,\n variants: v1.variants.map((v) => ({\n name: v.name,\n description: v.description,\n code: v.code,\n figma: v.figma,\n })),\n contract: v1.contract,\n ai: v1.ai,\n _generated: v1._generated,\n };\n}\n\n/**\n * Define a composition block.\n *\n * Blocks are pure data describing how design system components\n * wire together for common use cases.\n */\nexport function defineBlock(definition: BlockDefinition): BlockDefinition {\n if (process.env.NODE_ENV !== \"production\") {\n const result = blockDefinitionSchema.safeParse(definition);\n if (!result.success) {\n const errors = result.error.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\");\n throw new Error(`Invalid block definition for \"${definition.name || \"unknown\"}\":\\n${errors}`);\n }\n }\n\n return definition;\n}\n\n/**\n * @deprecated Use defineBlock instead\n */\nexport const defineRecipe = defineBlock;\n\n/**\n * Compile a block definition to JSON-serializable format.\n */\nexport function compileBlock(definition: BlockDefinition, filePath: string): CompiledBlock {\n return {\n filePath,\n name: definition.name,\n description: definition.description,\n category: definition.category,\n components: definition.components,\n code: definition.code,\n tags: definition.tags,\n };\n}\n\n/**\n * @deprecated Use compileBlock instead\n */\nexport const compileRecipe = compileBlock;\n\n/**\n * Type helper for extracting props type from a component\n */\nexport type InferProps<T> = T extends FragmentComponent<infer P> ? P : never;\n","/**\n * Runtime adapter for converting Storybook CSF modules to Fragment definitions.\n *\n * This operates on IMPORTED modules at runtime, not source code parsing.\n * By leveraging Vite's module system, we get 100% accurate render functions\n * without any regex or AST parsing complexity.\n *\n * Supports Storybook 8.x with both CSF2 (Template.bind) and CSF3 (object stories).\n */\n\nimport { createElement, type ComponentType, type ReactNode } from \"react\";\nimport { toId, storyNameFromExport, isExportStory } from \"./storybook-csf.js\";\nimport type {\n FragmentDefinition,\n FragmentMeta,\n FragmentUsage,\n PropDefinition,\n FragmentVariant,\n ControlType,\n VariantLoader,\n PlayFunction,\n PlayFunctionContext,\n VariantRenderOptions,\n} from \"./types.js\";\n\n// Re-export @storybook/csf utilities for use in other modules\nexport { toId, storyNameFromExport, isExportStory };\n\n/**\n * Storybook decorator function signature\n */\nexport type Decorator = (\n Story: () => ReactNode,\n context: StoryContext\n) => ReactNode;\n\n/**\n * Storybook loader function signature\n */\nexport type Loader = (context: StoryContext) => Promise<Record<string, unknown>>;\n\n/**\n * Storybook play function signature (internal, extends StoryContext)\n */\ntype StorybookPlayFunction = (context: StorybookPlayFunctionContext) => Promise<void>;\n\n/**\n * Context passed to Storybook play functions (extends StoryContext for compatibility)\n */\ninterface StorybookPlayFunctionContext extends StoryContext {\n canvasElement: HTMLElement;\n step: (name: string, fn: () => Promise<void>) => Promise<void>;\n}\n\n/**\n * Context passed to decorators and render functions\n */\nexport interface StoryContext {\n args: Record<string, unknown>;\n argTypes: Record<string, StoryArgType>;\n globals: Record<string, unknown>;\n parameters: Record<string, unknown>;\n id: string;\n kind: string;\n name: string;\n story: string;\n viewMode: \"story\" | \"docs\";\n loaded: Record<string, unknown>;\n abortSignal: AbortSignal;\n componentId: string;\n title: string;\n}\n\n/**\n * Storybook Meta (default export)\n */\nexport interface StoryMeta {\n title?: string;\n component?: ComponentType<unknown>;\n subcomponents?: Record<string, ComponentType<unknown>>;\n tags?: string[];\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n component?: string;\n };\n };\n };\n argTypes?: Record<string, StoryArgType>;\n args?: Record<string, unknown>;\n decorators?: Decorator[];\n loaders?: Loader[];\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n // Story filtering\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\n/**\n * Storybook argType definition\n */\nexport interface StoryArgType {\n control?:\n | string\n | false\n | { type: string; min?: number; max?: number; step?: number; presetColors?: string[] };\n options?: string[];\n description?: string;\n table?: {\n defaultValue?: { summary: string };\n type?: { summary: string };\n category?: string;\n subcategory?: string;\n disable?: boolean;\n };\n type?: { name: string; required?: boolean };\n name?: string;\n defaultValue?: unknown;\n if?: { arg?: string; exists?: boolean };\n mapping?: Record<string, unknown>;\n action?: string;\n}\n\n/**\n * Storybook Story export (CSF3)\n */\nexport interface Story {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n render?: (args: Record<string, unknown>, context?: StoryContext) => ReactNode;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown> & {\n docs?: {\n description?: {\n story?: string;\n };\n };\n };\n name?: string;\n storyName?: string; // Legacy CSF2\n tags?: string[];\n}\n\n/**\n * CSF2 story function (from Template.bind({})) with args attached\n */\nexport type CSF2Story = ((args: Record<string, unknown>) => ReactNode) & {\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n decorators?: Decorator[];\n loaders?: Loader[];\n play?: StorybookPlayFunction;\n parameters?: Record<string, unknown>;\n storyName?: string;\n};\n\n/**\n * A complete Storybook module with default meta and named story exports\n */\nexport interface StoryModule {\n default: StoryMeta;\n [exportName: string]: Story | CSF2Story | StoryMeta | unknown;\n}\n\n/**\n * Global configuration from preview.tsx\n */\nexport interface PreviewConfig {\n decorators?: Decorator[];\n parameters?: Record<string, unknown>;\n globalTypes?: Record<string, unknown>;\n args?: Record<string, unknown>;\n argTypes?: Record<string, StoryArgType>;\n loaders?: Loader[];\n}\n\n// Store for global preview config (set by previewLoader)\nlet globalPreviewConfig: PreviewConfig = {};\n\n/**\n * Set the global preview configuration loaded from .storybook/preview.tsx\n */\nexport function setPreviewConfig(config: PreviewConfig): void {\n globalPreviewConfig = config;\n}\n\n/**\n * Get the current global preview configuration\n */\nexport function getPreviewConfig(): PreviewConfig {\n return globalPreviewConfig;\n}\n\n/**\n * Convert a Storybook module to a Fragment definition at runtime.\n *\n * @param storyModule - The imported Storybook module\n * @param filePath - File path for metadata extraction\n * @returns A complete FragmentDefinition ready for the viewer\n */\nexport function storyModuleToFragment(\n storyModule: StoryModule,\n filePath: string\n): FragmentDefinition | null {\n const meta = storyModule.default;\n const component = meta.component;\n\n // Stories without a component (e.g., documentation pages, icon galleries) are skipped\n if (!component) {\n return null;\n }\n\n const componentName = extractComponentName(meta, filePath);\n const category = extractCategory(meta.title);\n const props = convertArgTypes(meta.argTypes ?? {}, globalPreviewConfig.argTypes);\n const variants = extractVariants(storyModule, component, meta);\n\n // Extract Figma URL from parameters.design.url (storybook-addon-designs) or parameters.figma\n const figmaUrl = extractFigmaUrl(meta.parameters);\n\n const fragmentMeta: FragmentMeta = {\n name: componentName,\n description:\n meta.parameters?.docs?.description?.component ??\n `${componentName} component`,\n category,\n tags: meta.tags?.filter((t) => t !== \"autodocs\"),\n status: \"stable\",\n figma: figmaUrl,\n };\n\n const usage: FragmentUsage = {\n when: [`Use ${componentName} for its intended purpose`],\n whenNot: [\"When a more specific component is available\"],\n };\n\n return {\n component,\n meta: fragmentMeta,\n usage,\n props,\n variants,\n };\n}\n\n/**\n * Extract component name from meta or file path\n */\nfunction extractComponentName(meta: StoryMeta, filePath: string): string {\n // Try title (last fragment of path like \"Components/Forms/Button\" -> \"Button\")\n if (meta.title) {\n const parts = meta.title.split(\"/\");\n return parts[parts.length - 1];\n }\n\n // Try component displayName\n if (meta.component?.displayName) {\n return meta.component.displayName;\n }\n\n // Try component name\n if (meta.component?.name && meta.component.name !== \"Component\") {\n return meta.component.name;\n }\n\n // Fallback: extract from file path\n const match = filePath.match(/([^/\\\\]+)\\.stories\\.(tsx?|jsx?)$/);\n return match?.[1] ?? \"Unknown\";\n}\n\n/**\n * Extract category from Storybook title path\n */\nfunction extractCategory(title?: string): string {\n if (!title) return \"general\";\n\n const parts = title.split(\"/\");\n // \"Components/Forms/Button\" -> \"forms\" (need at least 3 parts for a subcategory)\n if (parts.length >= 3) {\n return parts[parts.length - 2].toLowerCase();\n }\n // \"Components/Button\" -> \"general\" (no subcategory specified)\n return \"general\";\n}\n\n/**\n * Extract Figma URL from Storybook parameters\n * Supports storybook-addon-designs format and custom figma parameter\n */\nfunction extractFigmaUrl(parameters?: Record<string, unknown>): string | undefined {\n if (!parameters) return undefined;\n\n // Try storybook-addon-designs format: parameters.design.url\n const design = parameters.design as { url?: string; type?: string } | undefined;\n if (design?.url && typeof design.url === \"string\") {\n return design.url;\n }\n\n // Try custom figma parameter: parameters.figma\n if (typeof parameters.figma === \"string\") {\n return parameters.figma;\n }\n\n return undefined;\n}\n\n/**\n * Convert Storybook argTypes to Fragment props\n * Merges global argTypes from preview config with meta argTypes\n */\nfunction convertArgTypes(\n argTypes: Record<string, StoryArgType>,\n globalArgTypes?: Record<string, StoryArgType>\n): Record<string, PropDefinition> {\n const props: Record<string, PropDefinition> = {};\n\n // Merge global and meta argTypes (meta takes precedence)\n const mergedArgTypes = { ...globalArgTypes, ...argTypes };\n\n for (const [name, argType] of Object.entries(mergedArgTypes)) {\n // Skip disabled argTypes\n if (argType.table?.disable) continue;\n // Skip action-only argTypes (no control)\n if (argType.control === false && argType.action) continue;\n\n // Extract control type and options\n const { controlType, controlOptions } = extractControlInfo(argType);\n\n props[name] = {\n type: inferPropType(argType),\n description: argType.description ?? `${name} prop`,\n ...(argType.options && { values: argType.options }),\n ...(argType.table?.defaultValue && {\n default: argType.table.defaultValue.summary,\n }),\n ...(argType.defaultValue !== undefined && {\n default: argType.defaultValue,\n }),\n ...(argType.type?.required && { required: true }),\n ...(controlType && { controlType }),\n ...(controlOptions && Object.keys(controlOptions).length > 0 && { controlOptions }),\n };\n }\n\n return props;\n}\n\n/**\n * Extract control type and options from a Storybook argType\n */\nfunction extractControlInfo(argType: StoryArgType): {\n controlType?: ControlType;\n controlOptions?: PropDefinition[\"controlOptions\"];\n} {\n // Handle no control or explicitly disabled control\n if (argType.control === undefined || argType.control === false) {\n return {};\n }\n\n const control = typeof argType.control === \"string\"\n ? { type: argType.control }\n : argType.control;\n\n // Map control type string to ControlType\n const validControlTypes: ControlType[] = [\n \"text\", \"number\", \"range\", \"boolean\", \"select\", \"multi-select\",\n \"radio\", \"inline-radio\", \"check\", \"inline-check\", \"object\", \"file\", \"color\", \"date\"\n ];\n\n const controlType = validControlTypes.includes(control.type as ControlType)\n ? (control.type as ControlType)\n : undefined;\n\n // Extract control options for controls that need them\n const controlOptions: PropDefinition[\"controlOptions\"] = {};\n\n if (control.min !== undefined) controlOptions.min = control.min;\n if (control.max !== undefined) controlOptions.max = control.max;\n if (control.step !== undefined) controlOptions.step = control.step;\n if (control.presetColors) controlOptions.presetColors = control.presetColors;\n\n return {\n controlType,\n controlOptions: Object.keys(controlOptions).length > 0 ? controlOptions : undefined,\n };\n}\n\n/**\n * Infer prop type from Storybook control/type\n * Handles all Storybook 8.x control types\n */\nfunction inferPropType(argType: StoryArgType): PropDefinition[\"type\"] {\n // Action argType → function\n if (argType.action) return \"function\";\n\n // If has options, it's an enum\n if (argType.options?.length) return \"enum\";\n\n // Check explicit type\n if (argType.type?.name) {\n const typeMap: Record<string, PropDefinition[\"type\"]> = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n function: \"function\",\n };\n const mapped = typeMap[argType.type.name];\n if (mapped) return mapped;\n }\n\n // Check control type\n const control =\n typeof argType.control === \"string\"\n ? argType.control\n : argType.control\n ? argType.control.type\n : undefined;\n\n if (control) {\n const controlMap: Record<string, PropDefinition[\"type\"]> = {\n // Text controls\n text: \"string\",\n\n // Number controls\n number: \"number\",\n range: \"number\",\n\n // Boolean controls\n boolean: \"boolean\",\n check: \"boolean\",\n \"inline-check\": \"boolean\",\n\n // Enum/selection controls\n select: \"enum\",\n \"multi-select\": \"enum\",\n radio: \"enum\",\n \"inline-radio\": \"enum\",\n\n // Object controls\n object: \"object\",\n file: \"object\",\n\n // Special string controls\n color: \"string\",\n date: \"string\",\n };\n const mapped = controlMap[control];\n if (mapped) return mapped;\n }\n\n return \"string\";\n}\n\n/**\n * Check if a value looks like a Storybook story\n * Handles both CSF 3 (objects) and CSF 2 (functions from Template.bind({}))\n */\nfunction isStory(value: unknown): value is Story | CSF2Story {\n // CSF 3: Story is an object with args/render/play\n if (typeof value === \"object\" && value !== null) {\n const obj = value as Record<string, unknown>;\n if (\"args\" in obj || \"render\" in obj || \"play\" in obj) return true;\n }\n\n // CSF 2: Story is a function (from Template.bind({})) with args attached\n if (typeof value === \"function\") {\n const fn = value as ((...args: unknown[]) => unknown) & { args?: unknown };\n if (\"args\" in fn) return true;\n }\n\n return false;\n}\n\n/**\n * Extract variants from story exports using @storybook/csf utilities\n */\nfunction extractVariants(\n storyModule: StoryModule,\n component: ComponentType<unknown>,\n meta: StoryMeta\n): FragmentVariant[] {\n const variants: FragmentVariant[] = [];\n\n for (const [exportName, exportValue] of Object.entries(storyModule)) {\n // Skip default export\n if (exportName === \"default\") continue;\n\n // Use isExportStory to filter based on includeStories/excludeStories\n if (!isExportStory(exportName, meta)) continue;\n\n // Check if it's a story\n if (!isStory(exportValue)) continue;\n\n const story = exportValue as Story | CSF2Story;\n\n // Get story name using storyNameFromExport\n const storyName =\n (typeof story === \"object\" && story.name) ||\n (typeof story === \"object\" && story.storyName) ||\n (typeof story === \"function\" && story.storyName) ||\n storyNameFromExport(exportName);\n\n // Generate story ID matching Storybook format\n const storyId = toId(meta.title || \"Unknown\", exportName);\n\n // Extract description based on story format\n let description = `${storyName} variant`;\n if (typeof story === \"object\" && story.parameters?.docs?.description?.story) {\n description = story.parameters.docs.description.story;\n }\n\n // Check for play function and capture it\n const storyPlayFn = typeof story === \"object\" ? story.play : story.play;\n const hasPlayFunction = !!storyPlayFn;\n\n // Create wrapped play function that adapts Storybook context to our PlayFunctionContext\n const wrappedPlay: PlayFunction | undefined = storyPlayFn\n ? async (context: PlayFunctionContext): Promise<void> => {\n // Build full Storybook context for compatibility\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n const fullContext = buildStoryContext(meta, story, args, storyId, storyName);\n\n // Merge our context with Storybook context\n const playContext = {\n ...fullContext,\n canvasElement: context.canvasElement,\n args: context.args,\n step: context.step,\n };\n\n await storyPlayFn(playContext as unknown as StorybookPlayFunctionContext);\n }\n : undefined;\n\n // Get story tags\n const storyTags = typeof story === \"object\" ? story.tags : undefined;\n\n // Collect loaders from global, meta, and story (in order)\n const loaders = collectLoaders(meta, story);\n\n // Compute the merged args for this variant (for code generation)\n const variantArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n };\n\n // Only include args if there are any defined\n const hasArgs = Object.keys(variantArgs).length > 0;\n\n variants.push({\n name: storyName,\n description,\n render: createRenderFunction(story, component, meta, storyId, storyName),\n // Store Storybook-specific metadata\n ...(hasPlayFunction && { hasPlayFunction: true }),\n ...(wrappedPlay && { play: wrappedPlay }),\n ...(storyId && { storyId }),\n ...(storyTags && { tags: storyTags }),\n ...(loaders.length > 0 && { loaders }),\n ...(hasArgs && { args: variantArgs }),\n });\n }\n\n return variants;\n}\n\n/**\n * Collect loaders from global, meta, and story levels\n * Returns wrapped loader functions that execute with context\n */\nfunction collectLoaders(\n meta: StoryMeta,\n story: Story | CSF2Story\n): VariantLoader[] {\n const allLoaders: Loader[] = [\n ...(globalPreviewConfig.loaders ?? []),\n ...(meta.loaders ?? []),\n ...(typeof story === \"function\" ? story.loaders ?? [] : story.loaders ?? []),\n ];\n\n if (allLoaders.length === 0) {\n return [];\n }\n\n // Wrap each loader to execute without requiring context at call time\n // The actual context will be built when the loader is executed\n return allLoaders.map((loader) => {\n return async (): Promise<Record<string, unknown>> => {\n // Create a minimal context for loader execution\n const minimalContext: StoryContext = {\n args: {},\n argTypes: {},\n globals: {},\n parameters: {},\n id: \"\",\n kind: meta.title || \"Unknown\",\n name: \"\",\n story: \"\",\n viewMode: \"story\",\n loaded: {},\n abortSignal: new AbortController().signal,\n componentId: \"\",\n title: meta.title || \"Unknown\",\n };\n return loader(minimalContext);\n };\n });\n}\n\n/**\n * Build a StoryContext for decorators and render functions\n */\nfunction buildStoryContext(\n meta: StoryMeta,\n story: Story | CSF2Story,\n args: Record<string, unknown>,\n storyId: string,\n storyName: string,\n loadedData?: Record<string, unknown>\n): StoryContext {\n const mergedArgs = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"object\" ? story.args : story.args),\n ...args,\n };\n\n const mergedArgTypes = {\n ...globalPreviewConfig.argTypes,\n ...meta.argTypes,\n ...(typeof story === \"object\" ? story.argTypes : story.argTypes),\n };\n\n const mergedParameters = {\n ...globalPreviewConfig.parameters,\n ...meta.parameters,\n ...(typeof story === \"object\" ? story.parameters : story.parameters),\n };\n\n return {\n args: mergedArgs,\n argTypes: mergedArgTypes ?? {},\n globals: {},\n parameters: mergedParameters ?? {},\n id: storyId,\n kind: meta.title || \"Unknown\",\n name: storyName,\n story: storyName,\n viewMode: \"story\",\n loaded: loadedData ?? {},\n abortSignal: new AbortController().signal,\n componentId: toId(meta.title || \"Unknown\", \"\"),\n title: meta.title || \"Unknown\",\n };\n}\n\n/**\n * Create a render function for a story\n * Handles both CSF 3 (objects) and CSF 2 (functions)\n * Applies decorators in correct order: story → meta → global (innermost first)\n * Accepts optional args overrides and loaded data from loaders\n */\nfunction createRenderFunction(\n story: Story | CSF2Story,\n component: ComponentType<unknown>,\n meta: StoryMeta,\n storyId: string,\n storyName: string\n): (options?: VariantRenderOptions) => ReactNode {\n return (options?: VariantRenderOptions) => {\n // Merge args: global → meta → story → runtime overrides\n const args = {\n ...globalPreviewConfig.args,\n ...meta.args,\n ...(typeof story === \"function\" ? story.args : story.args),\n ...options?.args, // Runtime overrides from viewer props panel\n };\n\n const loadedData = options?.loadedData;\n\n // Build the story context with loaded data\n const context = buildStoryContext(meta, story, args, storyId, storyName, loadedData);\n\n // Create the base render function\n let renderFn: () => ReactNode;\n\n if (typeof story === \"function\") {\n // CSF 2: Story is a function (from Template.bind({}))\n renderFn = () => story(args);\n } else if (story.render) {\n // CSF 3: Story has custom render function\n // Support both render(args) and render(args, context) signatures\n renderFn = () =>\n story.render!.length >= 2\n ? story.render!(args, context)\n : story.render!(args);\n } else if (meta.render) {\n // CSF 3: Meta has default render function\n renderFn = () =>\n meta.render!.length >= 2\n ? meta.render!(args, context)\n : meta.render!(args);\n } else {\n // Default: render component with args\n renderFn = () => createElement(component, args);\n }\n\n // Collect decorators in Storybook order\n // story → meta → global, then reverse to apply innermost first\n const allDecorators = [\n ...(globalPreviewConfig.decorators ?? []),\n ...(meta.decorators ?? []),\n ...(typeof story === \"function\" ? story.decorators ?? [] : story.decorators ?? []),\n ].reverse();\n\n // Apply decorators if any\n if (allDecorators.length > 0) {\n return applyDecorators(renderFn, allDecorators, context);\n }\n\n return renderFn();\n };\n}\n\n/**\n * Apply decorators in the correct order\n * Decorators wrap from innermost to outermost\n */\nfunction applyDecorators(\n renderFn: () => ReactNode,\n decorators: Decorator[],\n context: StoryContext\n): ReactNode {\n // Start with the base render function\n let storyFn: () => ReactNode = renderFn;\n\n // Each decorator wraps the previous one\n for (const decorator of decorators) {\n const wrappedFn = storyFn;\n storyFn = () => decorator(wrappedFn, context);\n }\n\n return storyFn();\n}\n\n/**\n * Convert PascalCase to Title Case\n * @deprecated Use storyNameFromExport from @storybook/csf instead\n */\nfunction pascalToTitle(name: string): string {\n return name.replace(/([A-Z])/g, \" $1\").trim();\n}\n","import {\n toId as storybookToId,\n storyNameFromExport as storybookStoryNameFromExport,\n isExportStory as storybookIsExportStory,\n} from \"@storybook/csf\";\n\nexport const toId: typeof storybookToId = (...args) => storybookToId(...args);\nexport const storyNameFromExport: typeof storybookStoryNameFromExport = (...args) =>\n storybookStoryNameFromExport(...args);\nexport const isExportStory: typeof storybookIsExportStory = (...args) =>\n storybookIsExportStory(...args);\n","/**\n * Smart filtering for Storybook adapter.\n *\n * Two layers:\n * 1. Per-file heuristics — checkStoryExclusion() checks title, tags, component name, etc.\n * 2. Cross-file sub-component detection — detectSubComponentPaths() uses directory structure.\n *\n * All functions are pure (no I/O, no side effects) for easy testing.\n */\n\nimport type { StorybookFilterConfig } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ExclusionReason =\n | 'deprecated' // title contains \"Deprecated\"\n | 'test-story' // title ends /tests? OR file matches *.test.stories.*\n | 'svg-icon' // component name starts with Svg[A-Z]\n | 'tag-excluded' // meta.tags includes hidden/internal/no-fragment\n | 'empty-variants' // zero renderable story exports\n | 'sub-component' // directory-based: file in another component's folder\n | 'config-excluded'; // user explicit exclude pattern\n\nexport interface ExclusionResult {\n excluded: boolean;\n reason?: ExclusionReason;\n detail?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Per-file heuristics\n// ---------------------------------------------------------------------------\n\nconst EXCLUDED_TAGS = new Set(['hidden', 'internal', 'no-fragment']);\n\nconst SVG_ICON_RE = /^Svg[A-Z]/;\nconst TEST_TITLE_RE = /\\/tests?$/i;\nconst TEST_FILE_RE = /\\.test\\.stories\\./;\nconst DEPRECATED_TITLE_RE = /\\bDeprecated\\b/i;\n\nexport interface CheckStoryExclusionOpts {\n storybookTitle?: string;\n componentName: string;\n componentDisplayName?: string;\n componentFunctionName?: string;\n tags?: string[];\n variantCount: number;\n filePath: string;\n config: StorybookFilterConfig;\n}\n\n/**\n * Per-file exclusion check. Returns `{ excluded: true, reason, detail }` when\n * the fragment should be filtered out, or `{ excluded: false }` when it should\n * be kept.\n *\n * Config `include` trumps everything — if a name matches `include`, it is\n * never excluded by heuristics.\n */\nexport function checkStoryExclusion(opts: CheckStoryExclusionOpts): ExclusionResult {\n const { config } = opts;\n\n // Force-included names bypass all heuristic filters\n if (isForceIncluded(opts.componentName, config)) {\n return { excluded: false };\n }\n\n // Config explicit exclude\n if (isConfigExcluded(opts.componentName, config)) {\n return {\n excluded: true,\n reason: 'config-excluded',\n detail: `'${opts.componentName}' matches storybook.exclude pattern`,\n };\n }\n\n // Deprecated\n if (config.excludeDeprecated !== false && opts.storybookTitle && DEPRECATED_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'deprecated',\n detail: `Title \"${opts.storybookTitle}\" contains \"Deprecated\"`,\n };\n }\n\n // Test stories\n if (config.excludeTests !== false) {\n if (opts.storybookTitle && TEST_TITLE_RE.test(opts.storybookTitle)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `Title \"${opts.storybookTitle}\" ends with /test(s)`,\n };\n }\n if (TEST_FILE_RE.test(opts.filePath)) {\n return {\n excluded: true,\n reason: 'test-story',\n detail: `File path matches *.test.stories.*`,\n };\n }\n }\n\n // SVG icons\n if (config.excludeSvgIcons !== false) {\n const names = [opts.componentName, opts.componentDisplayName, opts.componentFunctionName].filter(Boolean) as string[];\n for (const name of names) {\n if (SVG_ICON_RE.test(name)) {\n return {\n excluded: true,\n reason: 'svg-icon',\n detail: `Component name \"${name}\" matches Svg[A-Z] pattern`,\n };\n }\n }\n }\n\n // Excluded tags\n if (opts.tags?.length) {\n const hit = opts.tags.find(t => EXCLUDED_TAGS.has(t));\n if (hit) {\n return {\n excluded: true,\n reason: 'tag-excluded',\n detail: `Tag \"${hit}\" is in the exclusion set`,\n };\n }\n }\n\n // Empty variants\n if (opts.variantCount === 0) {\n return {\n excluded: true,\n reason: 'empty-variants',\n detail: 'Zero renderable story exports',\n };\n }\n\n return { excluded: false };\n}\n\n// ---------------------------------------------------------------------------\n// Cross-file sub-component detection\n// ---------------------------------------------------------------------------\n\n/**\n * Given all story file relative paths, detect which ones are sub-components\n * based on directory structure.\n *\n * Heuristic: within a directory, if one story file's base name matches the\n * directory name, it is the \"primary\" component. All other story files in\n * the same directory are considered sub-components.\n *\n * Example:\n * src/components/Form/Form.stories.tsx → primary (\"Form\")\n * src/components/Form/Checkbox.stories.tsx → sub-component of \"Form\"\n * src/components/Form/RadioGroup.stories.tsx → sub-component of \"Form\"\n *\n * Returns a Map from relative path → parent component name.\n * Paths NOT in the map are standalone components.\n */\nexport function detectSubComponentPaths(\n storyFiles: Array<{ relativePath: string }>\n): Map<string, string> {\n // Group story files by their parent directory\n const byDir = new Map<string, Array<{ relativePath: string; baseName: string }>>();\n\n for (const file of storyFiles) {\n const parts = file.relativePath.split('/');\n if (parts.length < 2) continue; // skip root-level files\n\n const fileName = parts[parts.length - 1];\n // Extract base name: \"Form.stories.tsx\" → \"Form\"\n const baseMatch = fileName.match(/^([^.]+)\\.stories\\./);\n if (!baseMatch) continue;\n\n const dir = parts.slice(0, -1).join('/');\n const baseName = baseMatch[1];\n\n if (!byDir.has(dir)) byDir.set(dir, []);\n byDir.get(dir)!.push({ relativePath: file.relativePath, baseName });\n }\n\n const subComponentMap = new Map<string, string>();\n\n for (const [dir, files] of byDir) {\n if (files.length <= 1) continue; // single file in dir → always standalone\n\n // Directory name is the last segment: \"src/components/Form\" → \"Form\"\n const dirName = dir.split('/').pop()!;\n\n // Find the primary: story whose base name matches the directory name\n const primary = files.find(f => f.baseName === dirName);\n if (!primary) continue; // no clear primary → keep all\n\n // All others in this dir are sub-components\n for (const file of files) {\n if (file.relativePath === primary.relativePath) continue;\n subComponentMap.set(file.relativePath, primary.baseName);\n }\n }\n\n return subComponentMap;\n}\n\n// ---------------------------------------------------------------------------\n// Config helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Check if a component name matches the `storybook.include` patterns.\n * Include is a force-include that bypasses all heuristic filters.\n */\nexport function isForceIncluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.include?.length) return false;\n return config.include.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Check if a component name matches the `storybook.exclude` patterns.\n */\nexport function isConfigExcluded(name: string, config: StorybookFilterConfig): boolean {\n if (!config.exclude?.length) return false;\n return config.exclude.some(pattern => matchesPattern(name, pattern));\n}\n\n/**\n * Simple pattern matching: exact match or glob-style prefix/suffix wildcards.\n * \"Button\" → exact match\n * \"Svg*\" → prefix match\n * \"*Icon\" → suffix match\n * \"*Badge*\" → contains match\n */\nfunction matchesPattern(name: string, pattern: string): boolean {\n if (!pattern.includes('*')) {\n return name === pattern;\n }\n\n const parts = pattern.split('*');\n if (parts.length === 2) {\n const [prefix, suffix] = parts;\n if (prefix && suffix) return name.startsWith(prefix) && name.endsWith(suffix);\n if (prefix) return name.startsWith(prefix);\n if (suffix) return name.endsWith(suffix);\n return true; // pattern is just \"*\"\n }\n\n // Multi-wildcard: convert to regex\n const escaped = parts.map(p => p.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')).join('.*');\n return new RegExp(`^${escaped}$`).test(name);\n}\n","/**\n * Figma property mapping DSL\n *\n * Provides helpers for mapping Figma component properties to code props.\n * Inspired by Figma Code Connect's API.\n *\n * @example\n * ```tsx\n * import { defineFragment, figma } from '@usefragments/cli/core';\n *\n * export default defineFragment({\n * component: Button,\n * meta: {\n * name: 'Button',\n * description: 'Primary action trigger',\n * category: 'actions',\n * figma: 'https://figma.com/file/abc/Design?node-id=1-2',\n * figmaProps: {\n * children: figma.string('Label'),\n * disabled: figma.boolean('Disabled'),\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * }),\n * },\n * },\n * // ...\n * });\n * ```\n */\n\nimport type {\n FigmaStringMapping,\n FigmaBooleanMapping,\n FigmaEnumMapping,\n FigmaInstanceMapping,\n FigmaChildrenMapping,\n FigmaTextContentMapping,\n} from './types.js';\n\n/**\n * Map a Figma text property to a string prop.\n *\n * @param figmaProperty - The name of the text property in Figma\n * @returns A string mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * label: figma.string('Button Text'),\n * placeholder: figma.string('Placeholder'),\n * }\n * ```\n */\nfunction string(figmaProperty: string): FigmaStringMapping {\n return {\n __type: 'figma-string',\n figmaProperty,\n };\n}\n\n/**\n * Map a Figma boolean property to a boolean prop.\n * Optionally map true/false to different values.\n *\n * @param figmaProperty - The name of the boolean property in Figma\n * @param valueMapping - Optional mapping of true/false to other values\n * @returns A boolean mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * disabled: figma.boolean('Disabled'),\n * // Map boolean to string values\n * size: figma.boolean('Large', { true: 'lg', false: 'md' }),\n * }\n * ```\n */\nfunction boolean(\n figmaProperty: string,\n valueMapping?: { true: unknown; false: unknown }\n): FigmaBooleanMapping {\n return {\n __type: 'figma-boolean',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Map a Figma variant property to an enum prop.\n *\n * @param figmaProperty - The name of the variant property in Figma\n * @param valueMapping - Mapping of Figma values to code values\n * @returns An enum mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * variant: figma.enum('Type', {\n * 'Primary': 'primary',\n * 'Secondary': 'secondary',\n * 'Outline': 'outline',\n * }),\n * size: figma.enum('Size', {\n * 'Small': 'sm',\n * 'Medium': 'md',\n * 'Large': 'lg',\n * }),\n * }\n * ```\n */\nfunction enumValue<T extends Record<string, unknown>>(\n figmaProperty: string,\n valueMapping: T\n): FigmaEnumMapping {\n return {\n __type: 'figma-enum',\n figmaProperty,\n valueMapping,\n };\n}\n\n/**\n * Reference a nested Figma component instance.\n * Use this when a prop accepts a component that's represented\n * as an instance swap in Figma.\n *\n * @param figmaProperty - The name of the instance property in Figma\n * @returns An instance mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * icon: figma.instance('Icon'),\n * avatar: figma.instance('Avatar'),\n * }\n * ```\n */\nfunction instance(figmaProperty: string): FigmaInstanceMapping {\n return {\n __type: 'figma-instance',\n figmaProperty,\n };\n}\n\n/**\n * Render children from specific Figma layers.\n * Use this when children are represented as named layers in Figma.\n *\n * @param layers - Array of layer names to include as children\n * @returns A children mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * children: figma.children(['Title', 'Description', 'Actions']),\n * }\n * ```\n */\nfunction children(layers: string[]): FigmaChildrenMapping {\n return {\n __type: 'figma-children',\n layers,\n };\n}\n\n/**\n * Extract text content from a Figma text layer.\n * Use this when a prop should be the actual text from a layer.\n *\n * @param layer - The name of the text layer in Figma\n * @returns A text content mapping descriptor\n *\n * @example\n * ```tsx\n * figmaProps: {\n * title: figma.textContent('Header Text'),\n * description: figma.textContent('Body Text'),\n * }\n * ```\n */\nfunction textContent(layer: string): FigmaTextContentMapping {\n return {\n __type: 'figma-text-content',\n layer,\n };\n}\n\n/**\n * Figma property mapping helpers.\n *\n * Use these to define how Figma properties map to your component props.\n * The mappings are used for:\n * - Generating accurate code snippets in Figma Dev Mode\n * - AI agents understanding the design-to-code relationship\n * - Automated design verification\n */\nexport const figma = {\n string,\n boolean,\n enum: enumValue,\n instance,\n children,\n textContent,\n} as const;\n\n/**\n * Helper type to check if a value is a Figma prop mapping\n */\nexport function isFigmaPropMapping(\n value: unknown\n): value is FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping {\n if (typeof value !== 'object' || value === null || !('__type' in value)) {\n return false;\n }\n const typeValue = (value as Record<string, unknown>).__type;\n return typeof typeValue === 'string' && typeValue.startsWith('figma-');\n}\n\n/**\n * Resolve a Figma prop mapping to an actual value given Figma property values.\n *\n * @param mapping - The Figma prop mapping\n * @param figmaValues - Object containing Figma property values\n * @returns The resolved value for the code prop\n */\nexport function resolveFigmaMapping(\n mapping: FigmaStringMapping | FigmaBooleanMapping | FigmaEnumMapping | FigmaInstanceMapping | FigmaChildrenMapping | FigmaTextContentMapping,\n figmaValues: Record<string, unknown>\n): unknown {\n switch (mapping.__type) {\n case 'figma-string':\n return figmaValues[mapping.figmaProperty] ?? '';\n\n case 'figma-boolean': {\n const boolValue = figmaValues[mapping.figmaProperty] as boolean;\n if (mapping.valueMapping) {\n return boolValue ? mapping.valueMapping.true : mapping.valueMapping.false;\n }\n return boolValue;\n }\n\n case 'figma-enum': {\n const enumKey = figmaValues[mapping.figmaProperty] as string;\n return mapping.valueMapping[enumKey] ?? enumKey;\n }\n\n case 'figma-instance':\n // Instance mappings return the instance reference\n return figmaValues[mapping.figmaProperty];\n\n case 'figma-children':\n // Children mappings return array of layer contents\n return mapping.layers.map((layer) => figmaValues[layer]);\n\n case 'figma-text-content':\n return figmaValues[mapping.layer] ?? '';\n\n default:\n return undefined;\n }\n}\n","import type {\n DTCGGroup,\n DTCGTokenFile,\n DTCGTokenType,\n ResolvedDTCGToken,\n} from \"../dtcg.js\";\nimport { hexToRgb } from \"./color.js\";\nimport type { ParsedToken, TokenParseOutput } from \"./types.js\";\n\nconst DTCG_META_KEYS = new Set([\n \"$type\",\n \"$value\",\n \"$description\",\n \"$deprecated\",\n \"$extensions\",\n \"$extends\",\n]);\n\nconst MAX_ALIAS_DEPTH = 10;\n\nexport function isDTCGFile(filePath: string): boolean {\n return (\n filePath.endsWith(\".tokens.json\") ||\n filePath.endsWith(\".tokens\") ||\n filePath.endsWith(\"design-tokens.json\") ||\n filePath.endsWith(\"tokens.json\")\n );\n}\n\nfunction mapDTCGTypeToCategory(type: DTCGTokenType, tokenPath: string): string {\n switch (type) {\n case \"color\":\n return \"colors\";\n case \"dimension\":\n if (/radius/i.test(tokenPath)) return \"radius\";\n return \"spacing\";\n case \"fontFamily\":\n case \"fontWeight\":\n return \"typography\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"duration\":\n case \"cubicBezier\":\n case \"transition\":\n return \"transitions\";\n case \"typography\":\n return \"typography\";\n case \"gradient\":\n return \"colors\";\n case \"strokeStyle\":\n return \"borders\";\n case \"number\":\n return \"other\";\n default:\n return \"other\";\n }\n}\n\nfunction colorValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (typeof obj.hex === \"string\") {\n if (obj.alpha !== undefined && typeof obj.alpha === \"number\" && obj.alpha < 1) {\n const rgb = hexToRgb(obj.hex);\n if (rgb) {\n return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${obj.alpha})`;\n }\n }\n return obj.hex;\n }\n if (Array.isArray(obj.components)) {\n const comps = obj.components as number[];\n if (comps.length >= 3) {\n const alpha = obj.alpha ?? (comps.length >= 4 ? comps[3] : 1);\n if (typeof alpha === \"number\" && alpha < 1) {\n return `rgba(${Math.round(comps[0] * 255)}, ${Math.round(comps[1] * 255)}, ${Math.round(comps[2] * 255)}, ${alpha})`;\n }\n if (comps.every((c) => c <= 1)) {\n return `rgb(${Math.round(comps[0] * 255)}, ${Math.round(comps[1] * 255)}, ${Math.round(comps[2] * 255)})`;\n }\n return `rgb(${comps[0]}, ${comps[1]}, ${comps[2]})`;\n }\n }\n }\n return String(value);\n}\n\nfunction dimensionValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (typeof obj.value === \"number\" && typeof obj.unit === \"string\") {\n return `${obj.value}${obj.unit}`;\n }\n }\n return String(value);\n}\n\nfunction shadowValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n return value.map((v) => shadowSingleToCSS(v)).join(\", \");\n }\n return shadowSingleToCSS(value);\n}\n\nfunction shadowSingleToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.inset) parts.push(\"inset\");\n parts.push(dimensionValueToCSS(obj.offsetX));\n parts.push(dimensionValueToCSS(obj.offsetY));\n parts.push(dimensionValueToCSS(obj.blur));\n if (obj.spread !== undefined) parts.push(dimensionValueToCSS(obj.spread));\n parts.push(colorValueToCSS(obj.color));\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction borderValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n return `${dimensionValueToCSS(obj.width)} ${obj.style ?? \"solid\"} ${colorValueToCSS(obj.color)}`;\n }\n return String(value);\n}\n\nfunction typographyValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.fontWeight) parts.push(String(obj.fontWeight));\n if (obj.fontSize) parts.push(dimensionValueToCSS(obj.fontSize));\n if (obj.lineHeight) parts.push(`/ ${obj.lineHeight}`);\n if (obj.fontFamily) {\n const family = Array.isArray(obj.fontFamily)\n ? obj.fontFamily.join(\", \")\n : String(obj.fontFamily);\n parts.push(family);\n }\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction cubicBezierValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value) && value.length === 4) {\n return `cubic-bezier(${value.join(\", \")})`;\n }\n return String(value);\n}\n\nfunction transitionValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n const parts: string[] = [];\n if (obj.duration) parts.push(String(obj.duration));\n if (obj.timingFunction) parts.push(cubicBezierValueToCSS(obj.timingFunction));\n if (obj.delay) parts.push(String(obj.delay));\n return parts.join(\" \");\n }\n return String(value);\n}\n\nfunction gradientValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) {\n const stops = value.map((stop) => {\n if (stop && typeof stop === \"object\") {\n const s = stop as Record<string, unknown>;\n const color = colorValueToCSS(s.color);\n const position = typeof s.position === \"number\" ? ` ${s.position * 100}%` : \"\";\n return `${color}${position}`;\n }\n return String(stop);\n });\n return `linear-gradient(${stops.join(\", \")})`;\n }\n return String(value);\n}\n\nfunction fontFamilyValueToCSS(value: unknown): string {\n if (typeof value === \"string\") return value;\n if (Array.isArray(value)) return value.join(\", \");\n return String(value);\n}\n\nfunction valueToCSS(type: DTCGTokenType, value: unknown): string {\n switch (type) {\n case \"color\":\n return colorValueToCSS(value);\n case \"dimension\":\n return dimensionValueToCSS(value);\n case \"shadow\":\n return shadowValueToCSS(value);\n case \"border\":\n return borderValueToCSS(value);\n case \"typography\":\n return typographyValueToCSS(value);\n case \"cubicBezier\":\n return cubicBezierValueToCSS(value);\n case \"transition\":\n return transitionValueToCSS(value);\n case \"gradient\":\n return gradientValueToCSS(value);\n case \"fontFamily\":\n return fontFamilyValueToCSS(value);\n case \"fontWeight\":\n case \"duration\":\n case \"number\":\n return String(value);\n case \"strokeStyle\":\n return typeof value === \"string\" ? value : String(value);\n default:\n return String(value);\n }\n}\n\nfunction isAlias(value: unknown): value is string {\n return typeof value === \"string\" && /^\\{.+\\}$/.test(value);\n}\n\nfunction resolveAliasPath(alias: string): string {\n return alias.slice(1, -1);\n}\n\nfunction resolveAlias(\n alias: string,\n root: DTCGTokenFile,\n visited: Set<string>,\n depth: number,\n): unknown {\n if (depth > MAX_ALIAS_DEPTH) {\n throw new Error(`Circular alias detected: ${alias} (max depth ${MAX_ALIAS_DEPTH} reached)`);\n }\n\n const path = resolveAliasPath(alias);\n\n if (visited.has(path)) {\n throw new Error(`Circular alias detected: ${[...visited, path].join(\" -> \")}`);\n }\n visited.add(path);\n\n const parts = path.split(\".\");\n let current: unknown = root;\n\n for (const part of parts) {\n if (current && typeof current === \"object\" && part in (current as Record<string, unknown>)) {\n current = (current as Record<string, unknown>)[part];\n } else {\n throw new Error(`Alias reference \"${alias}\" could not be resolved: \"${part}\" not found in path \"${path}\"`);\n }\n }\n\n if (current && typeof current === \"object\" && \"$value\" in (current as Record<string, unknown>)) {\n const resolvedValue = (current as Record<string, unknown>).$value;\n if (isAlias(resolvedValue)) {\n return resolveAlias(resolvedValue, root, visited, depth + 1);\n }\n return resolvedValue;\n }\n\n if (isAlias(current)) {\n return resolveAlias(current, root, visited, depth + 1);\n }\n\n return current;\n}\n\nfunction resolveExtends(\n group: DTCGGroup,\n root: DTCGTokenFile,\n visited: Set<string>,\n): DTCGGroup {\n if (!group.$extends) return group;\n\n const extendsPath = group.$extends;\n if (visited.has(extendsPath)) {\n throw new Error(`Circular $extends detected: ${[...visited, extendsPath].join(\" -> \")}`);\n }\n visited.add(extendsPath);\n\n const parts = extendsPath.split(\".\");\n let parent: unknown = root;\n for (const part of parts) {\n if (parent && typeof parent === \"object\" && part in (parent as Record<string, unknown>)) {\n parent = (parent as Record<string, unknown>)[part];\n } else {\n throw new Error(`$extends reference \"${extendsPath}\" could not be resolved`);\n }\n }\n\n if (!parent || typeof parent !== \"object\") {\n throw new Error(`$extends target \"${extendsPath}\" is not a group`);\n }\n\n const resolvedParent = resolveExtends(parent as DTCGGroup, root, visited);\n const merged: Record<string, unknown> = { ...resolvedParent };\n for (const [key, value] of Object.entries(group)) {\n if (key === \"$extends\") continue;\n merged[key] = value;\n }\n\n return merged as DTCGGroup;\n}\n\nfunction walkTokenTree(\n node: DTCGGroup,\n root: DTCGTokenFile,\n path: string[],\n inheritedType: DTCGTokenType | undefined,\n tokens: ResolvedDTCGToken[],\n): void {\n const resolved = resolveExtends(node, root, new Set());\n const currentType = resolved.$type ?? inheritedType;\n\n for (const [key, child] of Object.entries(resolved)) {\n if (DTCG_META_KEYS.has(key)) continue;\n if (typeof child !== \"object\" || child === null) continue;\n\n const childObj = child as Record<string, unknown>;\n const childPath = [...path, key];\n\n if (\"$value\" in childObj) {\n const tokenType = (childObj.$type as DTCGTokenType | undefined) ?? currentType;\n if (!tokenType) continue;\n\n let rawValue = childObj.$value;\n if (isAlias(rawValue)) {\n try {\n rawValue = resolveAlias(rawValue, root, new Set(), 0);\n } catch {\n // Keep raw alias value if resolution fails.\n }\n }\n\n tokens.push({\n path: childPath.join(\".\"),\n type: tokenType,\n rawValue,\n cssValue: valueToCSS(tokenType, rawValue),\n description: childObj.$description as string | undefined,\n deprecated: childObj.$deprecated as boolean | string | undefined,\n extensions: childObj.$extensions as Record<string, unknown> | undefined,\n });\n } else {\n walkTokenTree(childObj as DTCGGroup, root, childPath, currentType, tokens);\n }\n }\n}\n\nfunction detectDTCGPrefix(tokens: ResolvedDTCGToken[], root: DTCGTokenFile): string {\n const extensions = root.$extensions as Record<string, unknown> | undefined;\n if (extensions) {\n const fragmentsExt = extensions[\"com.usefragments\"] as Record<string, unknown> | undefined;\n if (fragmentsExt?.prefix && typeof fragmentsExt.prefix === \"string\") {\n const p = fragmentsExt.prefix.replace(/-$/, \"\");\n return `--${p}-`;\n }\n }\n\n const topLevelKeys = Object.keys(root).filter((k) => !DTCG_META_KEYS.has(k));\n if (topLevelKeys.length === 1) {\n return `--${topLevelKeys[0]}-`;\n }\n if (topLevelKeys.length > 1) {\n return \"--\";\n }\n\n if (tokens.length === 0) return \"--\";\n\n const firstParts = tokens[0].path.split(\".\");\n if (firstParts.length > 0) {\n return `--${firstParts[0]}-`;\n }\n\n return \"--\";\n}\n\nfunction tokenPathToCSSName(path: string, prefix: string): string {\n const suffix = path.replace(/\\./g, \"-\");\n const normalizedPrefix = prefix.endsWith(\"-\") ? prefix : `${prefix}-`;\n const prefixBase = normalizedPrefix.replace(/^--/, \"\").replace(/-$/, \"\");\n if (suffix.startsWith(prefixBase + \"-\") || suffix === prefixBase) {\n return `--${suffix}`;\n }\n return `${normalizedPrefix}${suffix}`;\n}\n\nexport function parseDtcgTokens(content: string, filePath = \"tokens.tokens.json\"): TokenParseOutput {\n const root: DTCGTokenFile = JSON.parse(content);\n const resolvedTokens: ResolvedDTCGToken[] = [];\n walkTokenTree(root, root, [], undefined, resolvedTokens);\n\n const prefix = detectDTCGPrefix(resolvedTokens, root);\n const categories: Record<string, ParsedToken[]> = {};\n\n for (const token of resolvedTokens) {\n const category = mapDTCGTypeToCategory(token.type, token.path);\n const parsed: ParsedToken = {\n name: tokenPathToCSSName(token.path, prefix),\n value: token.cssValue,\n category,\n description: token.description,\n };\n\n categories[category] ??= [];\n categories[category].push(parsed);\n }\n\n return {\n prefix,\n categories,\n total: resolvedTokens.length,\n };\n}\n\nexport const parseDTCGFile = parseDtcgTokens;\n","import type { TokenCategory } from \"../token-types.js\";\n\nconst TOKEN_CATEGORY_PATTERNS: Array<{\n pattern: RegExp;\n category: TokenCategory;\n}> = [\n { pattern: /color|bg|background|border-color|fill|stroke/i, category: \"color\" },\n {\n pattern: /spacing|margin|padding|gap|space|inset|(?:^|[-_])sp(?:[-_]|$)/i,\n category: \"spacing\",\n },\n { pattern: /font|text|line-height|letter-spacing|typography/i, category: \"typography\" },\n { pattern: /radius|rounded|corner/i, category: \"radius\" },\n { pattern: /shadow|elevation/i, category: \"shadow\" },\n { pattern: /size|width|height|min|max/i, category: \"sizing\" },\n { pattern: /border(?!-color)|stroke-width|outline/i, category: \"border\" },\n { pattern: /animation|transition|duration|timing|delay/i, category: \"animation\" },\n { pattern: /z-index|layer|stack/i, category: \"z-index\" },\n];\n\nconst TOKEN_GROUP_PATTERNS: Array<{ pattern: RegExp; category: string }> = [\n {\n pattern: /--(?:[\\w]+-)?(?:font|line-height|letter-spacing|typography)-/,\n category: \"typography\",\n },\n { pattern: /--(?:[\\w]+-)?(?:sp|space|spacing|padding|gap|margin|inset)-/, category: \"spacing\" },\n { pattern: /--(?:[\\w]+-)?(?:radius|rounded|corner)-/, category: \"radius\" },\n { pattern: /--(?:[\\w]+-)?color-/, category: \"colors\" },\n { pattern: /--(?:[\\w]+-)?(?:bg|background)-/, category: \"surfaces\" },\n { pattern: /--(?:[\\w]+-)?text-/, category: \"text\" },\n { pattern: /--(?:[\\w]+-)?border/, category: \"borders\" },\n { pattern: /--(?:[\\w]+-)?(?:shadow|elevation)-/, category: \"shadows\" },\n { pattern: /--(?:[\\w]+-)?focus-/, category: \"focus\" },\n {\n pattern: /--(?:[\\w]+-)?(?:transition|animation|duration|timing|delay)-/,\n category: \"transitions\",\n },\n { pattern: /--(?:[\\w]+-)?scrollbar-/, category: \"scrollbar\" },\n { pattern: /--(?:[\\w]+-)?z-index/, category: \"z-index\" },\n { pattern: /--(?:[\\w]+-)?(?:button|input|touch)-/, category: \"component-sizing\" },\n { pattern: /--(?:[\\w]+-)?(?:appshell|header)-/, category: \"layout\" },\n { pattern: /--(?:[\\w]+-)?code-/, category: \"code\" },\n { pattern: /--(?:[\\w]+-)?tooltip-/, category: \"tooltip\" },\n { pattern: /--(?:[\\w]+-)?hero-/, category: \"marketing\" },\n];\n\nexport function inferTokenCategory(name: string, value?: string): TokenCategory {\n const valueCategory = value ? inferTokenCategoryFromValue(value) : null;\n if (valueCategory) return valueCategory;\n\n const lowerName = name.toLowerCase();\n\n for (const { pattern, category } of TOKEN_CATEGORY_PATTERNS) {\n if (pattern.test(lowerName)) {\n return category;\n }\n }\n\n return \"other\";\n}\n\nfunction inferTokenCategoryFromValue(value: string): TokenCategory | null {\n const normalized = value.trim().toLowerCase();\n if (\n /^#(?:[0-9a-f]{3,8})$/i.test(normalized) ||\n /^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch|color|color-mix)\\(/.test(normalized) ||\n normalized === \"currentcolor\"\n ) {\n return \"color\";\n }\n\n return null;\n}\n\nexport function inferTokenGroup(name: string): string {\n const lowerName = name.toLowerCase();\n\n for (const { pattern, category } of TOKEN_GROUP_PATTERNS) {\n if (pattern.test(lowerName)) {\n return category;\n }\n }\n\n const category = inferTokenCategory(name);\n switch (category) {\n case \"color\":\n return \"colors\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"animation\":\n return \"transitions\";\n default:\n return category;\n }\n}\n\n/**\n * Curated section-comment → category map. ONLY these headings (and short, clean\n * uncurated headings) become token categories. A prose comment latched as a\n * category is the #7d smell (`the-@supports-block-below-…` etc.), so anything\n * that is not curated AND does not read like a heading returns `null`, letting\n * the caller fall back to name-based `inferTokenGroup`.\n */\nconst TOKEN_GROUP_COMMENT_MAPPINGS: Record<string, string> = {\n \"base configuration\": \"base\",\n typography: \"typography\",\n \"spacing (micro)\": \"spacing\",\n spacing: \"spacing\",\n \"density padding\": \"spacing\",\n \"border radius\": \"radius\",\n transitions: \"transitions\",\n colors: \"colors\",\n surfaces: \"surfaces\",\n text: \"text\",\n borders: \"borders\",\n shadows: \"shadows\",\n focus: \"focus\",\n scrollbar: \"scrollbar\",\n \"component heights\": \"component-sizing\",\n \"appshell layout\": \"layout\",\n codeblock: \"code\",\n tooltip: \"tooltip\",\n \"hero/marketing gradient\": \"marketing\",\n};\n\n/**\n * A \"clean heading\" is alphanumerics + spaces + hyphens only (no punctuation,\n * symbols, em/en dashes, parens, `@`, `/`, etc.) and at most three words. Prose\n * comments — which carry punctuation and/or run long — fail this and are NOT\n * treated as categories.\n */\nfunction looksLikeCleanHeading(text: string): boolean {\n if (!/^[a-z0-9][a-z0-9 -]*$/.test(text)) return false;\n const wordCount = text.split(/\\s+/).filter(Boolean).length;\n return wordCount > 0 && wordCount <= 3;\n}\n\nexport function normalizeTokenGroupComment(comment: string): string | null {\n const text = comment\n .trim()\n .replace(/^\\/\\/\\s*/, \"\")\n .replace(/^\\/\\*+\\s*/, \"\")\n .replace(/\\s*\\*+\\/$/, \"\")\n .trim()\n .toLowerCase();\n\n if (text in TOKEN_GROUP_COMMENT_MAPPINGS) {\n return TOKEN_GROUP_COMMENT_MAPPINGS[text];\n }\n\n // Uncurated: only accept short, clean headings as categories. Prose comments\n // (punctuation/symbols or >3 words) return null so the token falls through to\n // name-based inference instead of minting a garbage category slug (#7d).\n if (!looksLikeCleanHeading(text)) {\n return null;\n }\n\n return text.replace(/\\s+/g, \"-\");\n}\n","import { inferTokenGroup, normalizeTokenGroupComment } from \"./categories.js\";\nimport type { ParsedToken, TokenParseOutput } from \"./types.js\";\n\nexport function detectTokenPrefix(names: string[]): string {\n if (names.length === 0) return \"--\";\n\n const stripped = names.map((name) => name.slice(2));\n let prefix = \"\";\n const first = stripped[0] ?? \"\";\n\n for (let i = 0; i < first.length; i++) {\n const ch = first[i];\n if (stripped.every((s) => s[i] === ch)) {\n prefix += ch;\n } else {\n break;\n }\n }\n\n const lastHyphen = prefix.lastIndexOf(\"-\");\n if (lastHyphen > 0) {\n prefix = prefix.slice(0, lastHyphen + 1);\n }\n\n return `--${prefix}`;\n}\n\nexport function parseScssVariables(content: string): Map<string, string> {\n const vars = new Map<string, string>();\n const scssVarRegex = /^\\s*(\\$[\\w-]+)\\s*:\\s*(.+?)\\s*(?:!default\\s*)?;/gm;\n\n let match: RegExpExecArray | null;\n while ((match = scssVarRegex.exec(content)) !== null) {\n const name = match[1];\n const value = match[2].replace(/\\s*\\/\\/.*$/, \"\").trim();\n if (!vars.has(name)) {\n vars.set(name, value);\n }\n }\n\n return vars;\n}\n\nexport function resolveTokenValue(\n rawValue: string,\n scssVars: Map<string, string>,\n cssVarValues: Map<string, string>,\n depth = 0,\n): string {\n if (depth > 5) return rawValue;\n\n let resolved = rawValue;\n\n resolved = resolved.replace(/#\\{(\\$[\\w-]+)\\}/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : `#{${varName}}`;\n });\n\n resolved = resolved.replace(/(?<![#\\{])(\\$[\\w-]+)/g, (_, varName) => {\n const val = scssVars.get(varName);\n return val !== undefined\n ? resolveTokenValue(val, scssVars, cssVarValues, depth + 1)\n : varName;\n });\n\n resolved = resolved.replace(\n /var\\((--[\\w-]+)(?:\\s*,\\s*(.+?))?\\)/g,\n (original, tokenName, fallback) => {\n const tokenVal = cssVarValues.get(tokenName);\n if (tokenVal !== undefined) {\n return resolveTokenValue(tokenVal, scssVars, cssVarValues, depth + 1);\n }\n if (fallback) {\n return resolveTokenValue(fallback.trim(), scssVars, cssVarValues, depth + 1);\n }\n return original;\n },\n );\n\n return resolved;\n}\n\nexport function parseScssTokens(content: string, filePath = \"tokens.scss\"): TokenParseOutput {\n const lines = content.split(\"\\n\");\n const tokens: ParsedToken[] = [];\n const seenNames = new Set<string>();\n let currentCategory = \"other\";\n // Tracks whether the CURRENT section comment yielded a curated category. A\n // prose comment (normalizeTokenGroupComment → null) resets this so subsequent\n // tokens fall through to name-based inference instead of inheriting a stale or\n // garbage comment-derived category (#7d).\n let currentCategoryIsCurated = false;\n\n const scssVars = parseScssVariables(content);\n const varDeclRegex = /^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*;/;\n const sectionCommentRegex = /^\\s*\\/\\/\\s+([A-Z].+)$/;\n\n for (const line of lines) {\n const commentMatch = line.match(sectionCommentRegex);\n if (commentMatch) {\n const normalized = normalizeTokenGroupComment(commentMatch[0]);\n if (normalized) {\n currentCategory = normalized;\n currentCategoryIsCurated = true;\n } else {\n // Prose comment: not a category. Drop back to per-token name inference.\n currentCategoryIsCurated = false;\n }\n continue;\n }\n\n const varMatch = line.match(varDeclRegex);\n if (varMatch) {\n const name = varMatch[1];\n const rawValue = varMatch[2];\n\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n\n const inlineComment = line.match(/\\/\\/\\s*(.+)$/);\n const description = inlineComment ? inlineComment[1].trim() : undefined;\n const cleanValue = rawValue.replace(/\\s*\\/\\/.*$/, \"\").trim();\n\n tokens.push({\n name,\n value: cleanValue || undefined,\n category: currentCategoryIsCurated ? currentCategory : inferTokenGroup(name),\n description,\n });\n }\n }\n\n for (const [name, value] of scssVars) {\n if (seenNames.has(name)) continue;\n seenNames.add(name);\n tokens.push({\n name,\n value,\n category: currentCategoryIsCurated ? currentCategory : inferTokenGroup(name),\n });\n }\n\n const cssVarValues = new Map<string, string>();\n for (const token of tokens) {\n if (token.value) {\n cssVarValues.set(token.name, token.value);\n }\n }\n\n for (const token of tokens) {\n if (token.value) {\n const resolved = resolveTokenValue(token.value, scssVars, cssVarValues);\n if (resolved !== token.value && !resolved.includes(\"#{\") && !resolved.includes(\"$\")) {\n token.resolvedValue = resolved;\n }\n }\n }\n\n const categories: Record<string, ParsedToken[]> = {};\n for (const token of tokens) {\n categories[token.category] ??= [];\n categories[token.category].push(token);\n }\n\n return {\n prefix: detectTokenPrefix(tokens.map((token) => token.name)),\n categories,\n total: tokens.length,\n };\n}\n\nexport function parseCssTokens(content: string, filePath = \"tokens.css\"): TokenParseOutput {\n return parseScssTokens(content, filePath);\n}\n\nexport const parseTokenFile = parseScssTokens;\n","import type { DesignToken } from \"../token-types.js\";\nimport { inferTokenCategory } from \"./categories.js\";\nimport type { ThemeParserResult } from \"./types.js\";\n\nconst CUSTOM_PROPERTY_PATTERN = /^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*;?\\s*$/;\n\nexport function containsTailwindV4Theme(content: string): boolean {\n return /^@theme\\b/m.test(content);\n}\n\nexport function parseTailwindV4Theme(\n cssContent: string,\n filePath?: string,\n): ThemeParserResult {\n const startTime = performance.now();\n const tokens: DesignToken[] = [];\n const errors: string[] = [];\n const warnings: string[] = [];\n const source = filePath ?? \"unknown\";\n\n const cleaned = stripBlockComments(cssContent);\n const lines = cleaned.split(\"\\n\");\n\n let insideTheme = false;\n let themeDepth = 0;\n let pendingTheme = false;\n\n for (let i = 0; i < lines.length; i++) {\n let line = lines[i];\n const lineNumber = i + 1;\n\n const singleCommentIdx = line.indexOf(\"//\");\n if (singleCommentIdx !== -1) {\n const beforeComment = line.slice(0, singleCommentIdx);\n const singleQuotes = (beforeComment.match(/'/g) || []).length;\n const doubleQuotes = (beforeComment.match(/\"/g) || []).length;\n if (singleQuotes % 2 === 0 && doubleQuotes % 2 === 0) {\n line = beforeComment;\n }\n }\n\n const trimmed = line.trim();\n if (trimmed === \"\") continue;\n\n if (!insideTheme && !pendingTheme && /^@theme\\b/.test(trimmed)) {\n pendingTheme = true;\n const braceIdx = trimmed.indexOf(\"{\");\n if (braceIdx !== -1) {\n pendingTheme = false;\n insideTheme = true;\n themeDepth = 1;\n\n const afterBrace = trimmed.slice(braceIdx + 1);\n for (const ch of afterBrace) {\n if (ch === \"{\") themeDepth++;\n else if (ch === \"}\") themeDepth--;\n }\n\n const inlineContent = afterBrace.trim();\n if (inlineContent && themeDepth > 0) {\n processThemeLine(inlineContent, lineNumber, source, tokens, warnings);\n }\n\n if (themeDepth <= 0) {\n insideTheme = false;\n }\n }\n continue;\n }\n\n if (pendingTheme) {\n const braceIdx = trimmed.indexOf(\"{\");\n if (braceIdx !== -1) {\n pendingTheme = false;\n insideTheme = true;\n themeDepth = 1;\n\n const afterBrace = trimmed.slice(braceIdx + 1);\n for (const ch of afterBrace) {\n if (ch === \"{\") themeDepth++;\n else if (ch === \"}\") themeDepth--;\n }\n\n const inlineContent = afterBrace.trim();\n if (inlineContent && themeDepth > 0) {\n processThemeLine(inlineContent, lineNumber, source, tokens, warnings);\n }\n\n if (themeDepth <= 0) {\n insideTheme = false;\n }\n }\n continue;\n }\n\n if (insideTheme) {\n for (const ch of trimmed) {\n if (ch === \"{\") {\n themeDepth++;\n } else if (ch === \"}\") {\n themeDepth--;\n if (themeDepth <= 0) {\n insideTheme = false;\n break;\n }\n }\n }\n\n if (insideTheme || themeDepth > 0) {\n const contentLine = trimmed.replace(/\\}/g, \"\").trim();\n if (contentLine) {\n processThemeLine(contentLine, lineNumber, source, tokens, warnings);\n }\n }\n }\n }\n\n if (pendingTheme) {\n warnings.push(`@theme keyword found but no opening brace - incomplete block in ${source}`);\n }\n\n if (insideTheme) {\n warnings.push(`Unclosed @theme block - missing closing brace in ${source}`);\n }\n\n return {\n tokens,\n errors,\n warnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\nfunction stripBlockComments(css: string): string {\n return css.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\");\n}\n\nfunction processThemeLine(\n line: string,\n lineNumber: number,\n source: string,\n tokens: DesignToken[],\n warnings: string[],\n): void {\n const match = line.match(CUSTOM_PROPERTY_PATTERN);\n\n if (!match) {\n const partialMatch = line.match(/^\\s*(--[\\w-]+)\\s*:\\s*(.+?)\\s*$/);\n if (partialMatch) {\n const [, name, rawValue] = partialMatch;\n tokens.push(buildToken(name, rawValue, lineNumber, source));\n return;\n }\n\n if (/^\\s*--/.test(line)) {\n warnings.push(\n `Line ${lineNumber}: Could not parse custom property declaration: ${line.trim()}`,\n );\n }\n return;\n }\n\n const [, name, rawValue] = match;\n tokens.push(buildToken(name, rawValue, lineNumber, source));\n}\n\nfunction buildToken(\n name: string,\n rawValue: string,\n lineNumber: number,\n source: string,\n): DesignToken {\n const value = rawValue.trim();\n\n return {\n name,\n rawValue: value,\n resolvedValue: value,\n category: inferTokenCategory(name),\n level: /var\\(/.test(value) ? 2 : 1,\n referenceChain: [],\n sourceFile: source,\n lineNumber,\n theme: \"default\",\n selector: \"@theme\",\n };\n}\n","import type {\n DesignToken,\n TokenCategory,\n TokenParseError,\n TokenParseResult,\n} from \"../token-types.js\";\nimport { inferTokenCategory } from \"./categories.js\";\nimport { isDTCGFile, parseDtcgTokens } from \"./dtcg.js\";\nimport { parseScssTokens } from \"./scss.js\";\nimport { containsTailwindV4Theme, parseTailwindV4Theme } from \"./tailwind-v4.js\";\nimport type { DesignTokenParseOptions, ParsedToken, TokenParseOutput } from \"./types.js\";\n\n// Token declaration value class excludes `;` (the normal terminator), and `{`/`}`\n// so the final declaration in a block (no trailing `;` — valid CSS, #34) and a\n// value that wraps across newlines (#35) are both captured without swallowing a\n// following block. Matched over the FULL content string (not per-line) so the\n// `[^;{}]+?` class can span `\\n`. Terminates on `;`, the next `}`, or EOF.\nconst TOKEN_DECLARATION_PATTERN = /--([a-zA-Z0-9_-]+)\\s*:\\s*([^;{}]+?)\\s*(?:;|(?=\\})|$)/g;\nconst VAR_REFERENCE_PATTERN = /var\\(\\s*--([a-zA-Z0-9_-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/;\n\nexport function parseDesignTokenContent(\n content: string,\n options: DesignTokenParseOptions = {}\n): TokenParseResult {\n const startTime = performance.now();\n const tokens: DesignToken[] = [];\n const errors: TokenParseError[] = [];\n const warnings: string[] = [];\n const filePath = options.filePath ?? \"unknown\";\n const themeSelectors = options.themeSelectors ?? { \":root\": \"default\" };\n const includeTailwindV4 = options.includeTailwindV4 ?? true;\n\n // Format dispatch (single chokepoint for the CLI's buildContractVocabularyFacts).\n // DTCG/JSON and SCSS files produce NO `--name:` CSS declarations, so the CSS\n // line-loop below yields an empty vocabulary and FUI2015 silently disables — the\n // worst failure mode (#10 DTCG, #32 SCSS). Route those through the sibling\n // parsers (both already emit `--kebab` CSS names the rule consumes unchanged),\n // each returning early. A 0-token result surfaces a NON-SILENT warning rather\n // than a quietly-empty vocabulary. The CSS path (with the #34/#35 robustness\n // fixes) is the fallthrough default.\n const trimmed = content.trimStart();\n const looksDtcg =\n isDTCGFile(filePath) || /\\.jsonc?$|\\.tokens$/i.test(filePath) || trimmed.startsWith(\"{\");\n if (looksDtcg) {\n try {\n // Fail-soft per the architecture spine: a malformed .json must never throw\n // or break the scan — fall through to the CSS path on any parse error.\n const out = parseDtcgTokens(content, filePath);\n const dtTokens = parsedOutputToDesignTokens(out, filePath);\n const dtcgWarnings =\n dtTokens.length === 0\n ? [\n `Token source file ${filePath}: DTCG/JSON file produced no token names; FUI2015 token-drift is inactive for it.`,\n ]\n : [];\n return {\n tokens: dtTokens,\n errors: [],\n warnings: dtcgWarnings,\n parseTimeMs: performance.now() - startTime,\n };\n } catch {\n // Fall through to the CSS path; if nothing matches there, the 0-token\n // warning at the end of the CSS path still fires (non-silent).\n }\n }\n\n const isScss = /\\.(scss|sass)$/i.test(filePath);\n const hasCssVar = /--[\\w-]+\\s*:/.test(content);\n const hasScssVar = /(^|\\n)\\s*\\$[\\w-]+\\s*:/.test(content);\n if (isScss || (!hasCssVar && hasScssVar)) {\n // parseScssTokens emits BOTH `--css-var` and `$scss-var` names. Normalize\n // every `$name` to `--name`: the mandated dual-fallback convention\n // `var(--fui-x, $fui-x)` guarantees a 1:1 `$`↔`--` correspondence, and `--x`\n // is exactly the name the rule judges (it reads `var(--x)` references).\n const out = parseScssTokens(content, filePath);\n const scssTokens = scssOutputToDesignTokens(out, filePath);\n const scssWarnings =\n scssTokens.length === 0\n ? [\n `Token source file ${filePath}: SCSS file produced no token names; FUI2015 token-drift is inactive for it.`,\n ]\n : [];\n return {\n tokens: scssTokens,\n errors: [],\n warnings: scssWarnings,\n parseTimeMs: performance.now() - startTime,\n };\n }\n\n if (includeTailwindV4 && containsTailwindV4Theme(content)) {\n const v4Result = parseTailwindV4Theme(content, filePath);\n tokens.push(...v4Result.tokens);\n warnings.push(...v4Result.warnings);\n for (const err of v4Result.errors) {\n errors.push({ message: err, file: filePath });\n }\n }\n\n const tokensByName = new Map<string, { rawValue: string; line?: number }>();\n\n // Match over the FULL content so a value spanning newlines (#35) is captured.\n // The line number is recomputed from the match index because findSelectorForLine\n // and extractDescription still attribute by line. Internal whitespace (incl.\n // newlines) is collapsed so a multi-line value stores cleanly.\n for (const match of content.matchAll(TOKEN_DECLARATION_PATTERN)) {\n const [, name, rawValue] = match;\n const fullName = `--${name}`;\n const lineNumber = countNewlines(content, match.index ?? 0) + 1;\n tokensByName.set(fullName, {\n rawValue: rawValue.trim().replace(/\\s+/g, \" \"),\n line: lineNumber,\n });\n }\n\n for (const [name, { rawValue, line }] of tokensByName) {\n const selector = findSelectorForLine(content, line ?? 1);\n const theme = themeSelectors[selector] || \"default\";\n const { resolvedValue, chain, hasCircular, unresolvedRef } = resolveDesignTokenValue(\n rawValue,\n tokensByName\n );\n\n if (hasCircular) {\n warnings.push(`Circular reference detected for ${name} at line ${line}`);\n }\n\n if (unresolvedRef) {\n warnings.push(`Unresolved reference in ${name}: ${unresolvedRef}`);\n }\n\n tokens.push({\n name,\n rawValue,\n resolvedValue,\n category: inferTokenCategory(name, resolvedValue || rawValue),\n level: inferTokenLevel(name, rawValue, chain),\n referenceChain: chain,\n sourceFile: filePath,\n lineNumber: line,\n theme,\n selector,\n description: extractDescription(content, line ?? 1),\n });\n }\n\n // NON-SILENT invariant: a non-empty CSS file that yields no token names means\n // FUI2015 has no vocabulary from it — surface a warning instead of a quietly\n // empty result (mirrors the DTCG/SCSS 0-token warnings above).\n if (tokens.length === 0 && trimmed.length > 0) {\n warnings.push(\n `Token source file ${filePath}: CSS file produced no token names; FUI2015 token-drift is inactive for it.`\n );\n }\n\n return {\n tokens,\n errors,\n warnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\n/** Count the `\\n` characters in `content` up to (not including) `index`. */\nfunction countNewlines(content: string, index: number): number {\n let count = 0;\n for (let i = 0; i < index && i < content.length; i++) {\n if (content.charCodeAt(i) === 10) count++;\n }\n return count;\n}\n\n/**\n * Flatten a DTCG/JSON `TokenParseOutput` into `DesignToken[]`. Names pass through\n * verbatim (parseDtcgTokens already emits `--kebab` CSS names via\n * tokenPathToCSSName). Determinism: walkTokenTree preserves JSON object key order.\n */\nfunction parsedOutputToDesignTokens(output: TokenParseOutput, filePath: string): DesignToken[] {\n const tokens: DesignToken[] = [];\n for (const cat of Object.values(output.categories)) {\n for (const t of cat) {\n tokens.push(designTokenFromParsed(t.name, t, filePath));\n }\n }\n return tokens;\n}\n\n/**\n * Flatten an SCSS `TokenParseOutput` into `DesignToken[]`, normalizing every\n * `$name` to `--name` (the mandated dual-fallback `var(--fui-x, $fui-x)` makes\n * this 1:1 and deterministic) and de-duping so a file declaring both `--fui-x`\n * and `$fui-x` yields one `--fui-x`.\n */\nfunction scssOutputToDesignTokens(output: TokenParseOutput, filePath: string): DesignToken[] {\n const tokensByName = new Map<\n string,\n {\n parsed: ParsedToken;\n referenceFormat: \"css-var\" | \"scss-var\";\n sourceNames: Set<string>;\n }\n >();\n for (const cat of Object.values(output.categories)) {\n for (const t of cat) {\n const isScssVariable = t.name.startsWith(\"$\");\n const cssName = isScssVariable ? `--${t.name.slice(1)}` : t.name;\n if (!cssName.startsWith(\"--\")) continue;\n\n const existing = tokensByName.get(cssName);\n if (!existing) {\n tokensByName.set(cssName, {\n parsed: t,\n referenceFormat: isScssVariable ? \"scss-var\" : \"css-var\",\n sourceNames: new Set([t.name]),\n });\n } else {\n existing.sourceNames.add(t.name);\n if (isScssVariable) {\n existing.parsed = t;\n existing.referenceFormat = \"scss-var\";\n }\n }\n }\n }\n return [...tokensByName].map(([name, token]) =>\n designTokenFromParsed(name, token.parsed, filePath, token.referenceFormat, [\n ...token.sourceNames,\n ])\n );\n}\n\n/** Build a `DesignToken` from a sibling-parser `ParsedToken` under a CSS name. */\nfunction designTokenFromParsed(\n name: string,\n parsed: ParsedToken,\n filePath: string,\n referenceFormat?: DesignToken[\"referenceFormat\"],\n sourceNames?: string[]\n): DesignToken {\n return {\n name,\n rawValue: parsed.value ?? \"\",\n resolvedValue: parsed.resolvedValue ?? parsed.value ?? \"\",\n category: normalizeParsedTokenCategory(\n parsed.category,\n name,\n parsed.resolvedValue ?? parsed.value ?? \"\"\n ),\n level: 1,\n referenceChain: [],\n sourceFile: filePath,\n referenceFormat,\n ...(sourceNames?.length ? { sourceNames } : {}),\n theme: \"default\",\n selector: \":root\",\n description: parsed.description,\n };\n}\n\nfunction normalizeParsedTokenCategory(\n category: string | undefined,\n name: string,\n value: string\n): TokenCategory {\n switch (category?.toLowerCase()) {\n case \"colors\":\n case \"color\":\n case \"surfaces\":\n case \"surface\":\n case \"text\":\n return \"color\";\n case \"spacing\":\n case \"space\":\n return \"spacing\";\n case \"typography\":\n case \"font\":\n return \"typography\";\n case \"radius\":\n case \"radii\":\n return \"radius\";\n case \"shadows\":\n case \"shadow\":\n return \"shadow\";\n case \"borders\":\n case \"border\":\n return \"border\";\n case \"animation\":\n case \"animations\":\n case \"transitions\":\n case \"transition\":\n return \"animation\";\n case \"sizing\":\n case \"size\":\n return \"sizing\";\n case \"z-index\":\n case \"zindex\":\n return \"z-index\";\n default:\n return inferTokenCategory(name, value);\n }\n}\n\nexport function resolveDesignTokenValue(\n rawValue: string,\n tokensByName: Map<string, { rawValue: string; line?: number }>,\n visited = new Set<string>()\n): {\n resolvedValue: string;\n chain: string[];\n hasCircular: boolean;\n unresolvedRef?: string;\n} {\n const chain: string[] = [];\n let current = rawValue;\n let hasCircular = false;\n let unresolvedRef: string | undefined;\n\n const maxIterations = 20;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n const varMatch = current.match(VAR_REFERENCE_PATTERN);\n if (!varMatch) break;\n\n const [, refName, fallback] = varMatch;\n const fullRefName = `--${refName}`;\n\n if (visited.has(fullRefName)) {\n hasCircular = true;\n break;\n }\n\n visited.add(fullRefName);\n chain.push(fullRefName);\n\n const refToken = tokensByName.get(fullRefName);\n if (refToken) {\n current = current.replace(varMatch[0], refToken.rawValue);\n } else if (fallback) {\n current = current.replace(varMatch[0], fallback.trim());\n } else {\n unresolvedRef = fullRefName;\n break;\n }\n }\n\n return {\n resolvedValue: normalizeTokenValue(current.trim()),\n chain,\n hasCircular,\n unresolvedRef,\n };\n}\n\nexport function normalizeTokenValue(value: string): string {\n value = value.replace(/#[0-9a-fA-F]+/g, (match) => match.toLowerCase());\n value = value.replace(/\\s+/g, \" \").trim();\n value = value.replace(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/g,\n (_, r, g, b, a) => (a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`)\n );\n\n return value;\n}\n\nfunction inferTokenLevel(name: string, rawValue: string, referenceChain: string[]): 1 | 2 | 3 {\n const lowerName = name.toLowerCase();\n\n if (/btn|button|input|card|modal|dialog|menu|nav|header|footer|table|form/i.test(lowerName)) {\n return 3;\n }\n\n if (referenceChain.length > 0) {\n return 2;\n }\n\n if (rawValue.match(/^#[0-9a-fA-F]+$/) || rawValue.match(/^\\d+(\\.\\d+)?(px|rem|em|%|vh|vw)?$/)) {\n return 1;\n }\n\n return 2;\n}\n\nfunction findSelectorForLine(content: string, targetLine: number): string {\n const lines = content.split(\"\\n\");\n let currentSelector = \":root\";\n let braceDepth = 0;\n\n for (let i = 0; i < Math.min(targetLine, lines.length); i++) {\n const line = lines[i];\n const selectorMatch = line.match(/^\\s*([^{]+)\\s*\\{/);\n if (selectorMatch) {\n const selector = selectorMatch[1].trim();\n if ((line.match(/\\{/g) || []).length > (line.match(/\\}/g) || []).length) {\n currentSelector = selector;\n }\n }\n\n braceDepth += (line.match(/\\{/g) || []).length;\n braceDepth -= (line.match(/\\}/g) || []).length;\n\n if (braceDepth === 0) {\n currentSelector = \":root\";\n }\n }\n\n return currentSelector;\n}\n\nfunction extractDescription(content: string, line: number): string | undefined {\n const lines = content.split(\"\\n\");\n if (line <= 1) return undefined;\n\n const prevLine = lines[line - 2]?.trim();\n const singleLineMatch = prevLine?.match(/\\/\\/\\s*(.+)$/);\n if (singleLineMatch) {\n return singleLineMatch[1].trim();\n }\n\n const multiLineMatch = prevLine?.match(/\\*\\s*(.+)\\s*\\*\\//);\n if (multiLineMatch) {\n return multiLineMatch[1].trim();\n }\n\n const inlineMatch = prevLine?.match(/\\/\\*\\s*(.+)\\s*\\*\\//);\n if (inlineMatch) {\n return inlineMatch[1].trim();\n }\n\n return undefined;\n}\n","import type { DesignToken, TokenCategory } from \"../token-types.js\";\nimport { isDTCGFile, parseDtcgTokens } from \"./dtcg.js\";\nimport { parseCssTokens, parseScssTokens, detectTokenPrefix } from \"./scss.js\";\nimport { containsTailwindV4Theme, parseTailwindV4Theme } from \"./tailwind-v4.js\";\nimport type { ParsedToken, ParseTokensOptions, TokenFormat, TokenParseOutput } from \"./types.js\";\n\nexport type {\n DesignTokenParseOptions,\n ParsedToken,\n ParseTokensOptions,\n ThemeParserResult,\n TokenFormat,\n TokenParseOutput,\n} from \"./types.js\";\n\nexport {\n inferTokenCategory,\n inferTokenGroup,\n normalizeTokenGroupComment,\n} from \"./categories.js\";\n\nexport {\n calculateDeltaE,\n colorSimilarity,\n familyDistance,\n hexToRgb,\n isColorLike,\n nearestByDeltaE,\n normalizeColor,\n parseColor,\n parseColorToRgb,\n parseRgb,\n rgbToHex,\n type DeltaEMatch,\n type NearestByDeltaEOptions,\n type RGB,\n type RGBA,\n} from \"./color.js\";\n\nexport { type TokenLookup } from \"./lookup.js\";\n\nexport {\n detectTokenPrefix,\n parseCssTokens,\n parseScssTokens,\n parseScssVariables,\n parseTokenFile,\n resolveTokenValue,\n} from \"./scss.js\";\n\nexport {\n isDTCGFile,\n parseDTCGFile,\n parseDtcgTokens,\n} from \"./dtcg.js\";\n\nexport {\n containsTailwindV4Theme,\n parseTailwindV4Theme,\n} from \"./tailwind-v4.js\";\n\nexport {\n normalizeTokenValue,\n parseDesignTokenContent,\n resolveDesignTokenValue,\n} from \"./design-token-parser.js\";\n\nexport function parseTokens(\n content: string,\n formatOrOptions: TokenFormat | ParseTokensOptions = \"auto\",\n): TokenParseOutput {\n const options =\n typeof formatOrOptions === \"string\"\n ? { format: formatOrOptions }\n : formatOrOptions;\n const format = options.format ?? \"auto\";\n const filePath = options.filePath ?? \"\";\n\n if (format === \"dtcg\" || (format === \"auto\" && isDTCGFile(filePath))) {\n return parseDtcgTokens(content, filePath);\n }\n\n if (format === \"tailwind-v4\" || (format === \"auto\" && containsTailwindV4Theme(content))) {\n return designTokensToParseOutput(parseTailwindV4Theme(content, filePath).tokens);\n }\n\n if (format === \"css\") {\n return parseCssTokens(content, filePath);\n }\n\n return parseScssTokens(content, filePath);\n}\n\nfunction designTokensToParseOutput(tokens: DesignToken[]): TokenParseOutput {\n const categories: Record<string, ParsedToken[]> = {};\n\n for (const token of tokens) {\n const category = tokenCategoryToGroup(token.category);\n categories[category] ??= [];\n categories[category].push({\n name: token.name,\n value: token.rawValue,\n resolvedValue:\n token.resolvedValue !== token.rawValue ? token.resolvedValue : undefined,\n category,\n description: token.description,\n });\n }\n\n return {\n prefix: detectTokenPrefix(tokens.map((token) => token.name)),\n categories,\n total: tokens.length,\n };\n}\n\nfunction tokenCategoryToGroup(category: TokenCategory): string {\n switch (category) {\n case \"color\":\n return \"colors\";\n case \"shadow\":\n return \"shadows\";\n case \"border\":\n return \"borders\";\n case \"animation\":\n return \"transitions\";\n default:\n return category;\n }\n}\n","/**\n * W3C Design Token Community Group (DTCG) format types and Zod schemas.\n *\n * Implements the W3C DTCG specification for design token files.\n * @see https://www.designtokens.org/tr/2025.10/format/\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Token types per DTCG spec\n// ---------------------------------------------------------------------------\n\nexport type DTCGTokenType =\n | 'color'\n | 'dimension'\n | 'fontFamily'\n | 'fontWeight'\n | 'duration'\n | 'cubicBezier'\n | 'number'\n | 'shadow'\n | 'border'\n | 'strokeStyle'\n | 'transition'\n | 'gradient'\n | 'typography';\n\n// ---------------------------------------------------------------------------\n// Value types per DTCG spec\n// ---------------------------------------------------------------------------\n\n/** Color value (sRGB) */\nexport interface DTCGColorValue {\n colorSpace: string;\n components: number[];\n hex?: string;\n alpha?: number;\n}\n\n/** Dimension value */\nexport interface DTCGDimensionValue {\n value: number;\n unit: 'px' | 'rem';\n}\n\n/** Shadow value (single layer) */\nexport interface DTCGShadowValue {\n color: string | DTCGColorValue;\n offsetX: string | DTCGDimensionValue;\n offsetY: string | DTCGDimensionValue;\n blur: string | DTCGDimensionValue;\n spread: string | DTCGDimensionValue;\n inset?: boolean;\n}\n\n/** Border value */\nexport interface DTCGBorderValue {\n color: string | DTCGColorValue;\n width: string | DTCGDimensionValue;\n style: string;\n}\n\n/** Typography value */\nexport interface DTCGTypographyValue {\n fontFamily: string | string[];\n fontSize: string | DTCGDimensionValue;\n fontWeight: number | string;\n letterSpacing?: string | DTCGDimensionValue;\n lineHeight?: string | number;\n}\n\n/** Transition value */\nexport interface DTCGTransitionValue {\n duration: string;\n delay?: string;\n timingFunction: number[];\n}\n\n/** Gradient stop */\nexport interface DTCGGradientStop {\n color: string | DTCGColorValue;\n position: number;\n}\n\n/** Cubic bezier value */\nexport type DTCGCubicBezierValue = [number, number, number, number];\n\n// ---------------------------------------------------------------------------\n// Token and group structures\n// ---------------------------------------------------------------------------\n\n/** A single design token */\nexport interface DTCGToken {\n $value: unknown;\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n}\n\n/** A group (recursive container for tokens and sub-groups) */\nexport interface DTCGGroup {\n $type?: DTCGTokenType;\n $description?: string;\n $deprecated?: boolean | string;\n $extensions?: Record<string, unknown>;\n $extends?: string;\n [key: string]: DTCGToken | DTCGGroup | unknown;\n}\n\n/** Root file structure — a top-level group */\nexport type DTCGTokenFile = DTCGGroup;\n\n// ---------------------------------------------------------------------------\n// Resolved token (after parsing)\n// ---------------------------------------------------------------------------\n\nexport interface ResolvedDTCGToken {\n /** Dot-separated path (e.g., \"color.brand.primary\") */\n path: string;\n /** Resolved type (inherited from group if not set on token) */\n type: DTCGTokenType;\n /** Raw $value from the token */\n rawValue: unknown;\n /** CSS-compatible string value */\n cssValue: string;\n /** Description */\n description?: string;\n /** Whether token is deprecated */\n deprecated?: boolean | string;\n /** Extensions data */\n extensions?: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// Zod schemas for runtime validation\n// ---------------------------------------------------------------------------\n\nconst dtcgTokenTypeSchema = z.enum([\n 'color', 'dimension', 'fontFamily', 'fontWeight',\n 'duration', 'cubicBezier', 'number',\n 'shadow', 'border', 'strokeStyle', 'transition',\n 'gradient', 'typography',\n]);\n\nconst dtcgColorValueSchema = z.union([\n z.string(),\n z.object({\n colorSpace: z.string().default('srgb'),\n components: z.array(z.number()),\n hex: z.string().optional(),\n alpha: z.number().optional(),\n }),\n]);\n\nconst dtcgDimensionValueSchema = z.union([\n z.string(),\n z.object({\n value: z.number(),\n unit: z.enum(['px', 'rem']),\n }),\n]);\n\nconst dtcgShadowValueSchema = z.object({\n color: dtcgColorValueSchema,\n offsetX: dtcgDimensionValueSchema,\n offsetY: dtcgDimensionValueSchema,\n blur: dtcgDimensionValueSchema,\n spread: dtcgDimensionValueSchema.optional(),\n inset: z.boolean().optional(),\n});\n\nconst dtcgBorderValueSchema = z.object({\n color: dtcgColorValueSchema,\n width: dtcgDimensionValueSchema,\n style: z.string(),\n});\n\nconst dtcgTypographyValueSchema = z.object({\n fontFamily: z.union([z.string(), z.array(z.string())]),\n fontSize: dtcgDimensionValueSchema,\n fontWeight: z.union([z.number(), z.string()]),\n letterSpacing: dtcgDimensionValueSchema.optional(),\n lineHeight: z.union([z.string(), z.number()]).optional(),\n});\n\nconst dtcgTransitionValueSchema = z.object({\n duration: z.string(),\n delay: z.string().optional(),\n timingFunction: z.array(z.number()).length(4),\n});\n\nconst dtcgGradientStopSchema = z.object({\n color: dtcgColorValueSchema,\n position: z.number(),\n});\n\nconst dtcgCubicBezierValueSchema = z.tuple([\n z.number(), z.number(), z.number(), z.number(),\n]);\n\n/** Schema for a single token node (has $value) */\nconst dtcgTokenSchema = z.object({\n $value: z.unknown(),\n $type: dtcgTokenTypeSchema.optional(),\n $description: z.string().optional(),\n $deprecated: z.union([z.boolean(), z.string()]).optional(),\n $extensions: z.record(z.string(), z.unknown()).optional(),\n}).passthrough();\n\n/**\n * Top-level schema for a DTCG token file.\n * Validates the root structure — individual tokens are validated by type\n * during parsing since the tree is recursive.\n */\nexport const dtcgTokenFileSchema = z.record(z.string(), z.unknown()).refine(\n (data) => {\n // A valid DTCG file should not be empty and should not be an array\n return data !== null && typeof data === 'object' && !Array.isArray(data);\n },\n { message: 'DTCG token file must be a JSON object' },\n);\n\n// Export individual schemas for consumers\nexport {\n dtcgTokenTypeSchema,\n dtcgTokenSchema,\n dtcgColorValueSchema,\n dtcgDimensionValueSchema,\n dtcgShadowValueSchema,\n dtcgBorderValueSchema,\n dtcgTypographyValueSchema,\n dtcgTransitionValueSchema,\n dtcgGradientStopSchema,\n dtcgCubicBezierValueSchema,\n};\n","/**\n * Framework-agnostic component contract format.\n *\n * Allows non-React teams to define component metadata via `.contract.json`\n * files instead of `.fragment.tsx`. Maps trivially to CompiledFragment.\n */\n\nimport { z } from 'zod';\n\n// ---------------------------------------------------------------------------\n// Component Contract interface\n// ---------------------------------------------------------------------------\n\nexport interface ComponentContract {\n /** JSON Schema reference for tooling — required for validation */\n $schema: string;\n\n /** Component name */\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n\n /** Framework hint (for extraction and documentation) */\n framework?: 'react' | 'vue' | 'svelte' | 'web-components' | 'angular';\n\n /** Path to the component source file, relative to fragments.config.ts root */\n sourcePath: string;\n\n /** Named export from the source file */\n exportName: string;\n\n /** Compact one-line-per-prop summaries for agent first-pass (e.g., \"variant: primary|secondary (required)\") */\n propsSummary: string[];\n\n /** Component props schema */\n props: Record<string, {\n type: string;\n values?: string[];\n default?: unknown;\n description: string;\n required?: boolean;\n constraints?: string[];\n }>;\n\n /** Usage guidelines */\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n\n /** Code examples (as strings, not render functions) */\n examples?: Array<{\n name: string;\n description: string;\n code: string;\n args?: Record<string, unknown>;\n }>;\n\n /** Relations to other components */\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n\n /** AI generation contract */\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n /** Sub-component slot metadata for compound components */\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n /** Canonical JSX usage examples */\n canonicalUsage?: string[];\n /** Per-component performance budget override in bytes (gzipped) */\n performanceBudget?: number;\n };\n\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n\n /** Per-component preview configuration */\n preview?: {\n setupModule?: string;\n wrapperModule?: string;\n wrapperExport?: string;\n css?: string[];\n theme?: 'light' | 'dark';\n };\n\n /** Provenance tracking — required for verification */\n provenance: {\n source: 'manual' | 'extracted' | 'merged' | 'migrated';\n verified: boolean;\n frameworkSupport?: 'native' | 'manual-only';\n sourceHash?: string;\n extractedAt?: string;\n };\n\n /** Design token references used by this component */\n tokens?: string[];\n\n /** Figma mappings (same DSL as .fragment.tsx but in JSON form) */\n figma?: {\n nodeUrl?: string;\n propMappings?: Record<string, {\n type: 'string' | 'boolean' | 'enum' | 'instance' | 'children' | 'textContent';\n figmaProperty: string;\n values?: Record<string, string>;\n }>;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Zod schema for validation\n// ---------------------------------------------------------------------------\n\nconst contractPropSchema = z.object({\n type: z.string(),\n values: z.array(z.string()).optional(),\n default: z.unknown().optional(),\n description: z.string(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n});\n\nconst contractUsageSchema = z.object({\n when: z.array(z.string()),\n whenNot: z.array(z.string()),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nconst contractExampleSchema = z.object({\n name: z.string(),\n description: z.string(),\n code: z.string(),\n args: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst contractRelationSchema = z.object({\n component: z.string(),\n relationship: z.enum(['alternative', 'parent', 'child', 'sibling', 'composition', 'complementary', 'used-by']),\n note: z.string(),\n});\n\nconst contractContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n scenarioTags: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(z.object({\n pattern: z.string(),\n message: z.string(),\n })).optional(),\n compoundChildren: z.record(z.string(), z.object({\n required: z.boolean().optional(),\n accepts: z.array(z.string()).optional(),\n description: z.string().optional(),\n })).optional(),\n canonicalUsage: z.array(z.string()).optional(),\n performanceBudget: z.number().optional(),\n});\n\nconst contractAiSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled', 'wrapper']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\nconst contractPreviewSchema = z.object({\n setupModule: z.string().optional(),\n wrapperModule: z.string().optional(),\n wrapperExport: z.string().optional(),\n css: z.array(z.string()).optional(),\n theme: z.enum(['light', 'dark']).optional(),\n});\n\nconst contractProvenanceSchema = z.object({\n source: z.enum(['manual', 'extracted', 'merged', 'migrated']),\n verified: z.boolean(),\n frameworkSupport: z.enum(['native', 'manual-only']).optional(),\n sourceHash: z.string().optional(),\n extractedAt: z.string().optional(),\n});\n\nconst contractFigmaSchema = z.object({\n nodeUrl: z.string().optional(),\n propMappings: z.record(z.string(), z.object({\n type: z.enum(['string', 'boolean', 'enum', 'instance', 'children', 'textContent']),\n figmaProperty: z.string(),\n values: z.record(z.string(), z.string()).optional(),\n })).optional(),\n});\n\nexport const componentContractSchema = z.object({\n $schema: z.string(),\n name: z.string(),\n description: z.string(),\n category: z.string(),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n framework: z.enum(['react', 'vue', 'svelte', 'web-components', 'angular']).optional(),\n sourcePath: z.string(),\n exportName: z.string(),\n propsSummary: z.array(z.string()),\n props: z.record(z.string(), contractPropSchema),\n usage: contractUsageSchema,\n examples: z.array(contractExampleSchema).optional(),\n relations: z.array(contractRelationSchema).optional(),\n contract: contractContractSchema.optional(),\n ai: contractAiSchema.optional(),\n preview: contractPreviewSchema.optional(),\n provenance: contractProvenanceSchema,\n tokens: z.array(z.string()).optional(),\n figma: contractFigmaSchema.optional(),\n});\n","/**\n * Component Contract Parser — converts .contract.json files to CompiledFragment.\n *\n * Maps the framework-agnostic ComponentContract format to the same\n * CompiledFragment type used by .fragment.tsx, so all downstream consumers\n * (MCP tools, governance, search) work unchanged.\n */\n\nimport { componentContractSchema } from './component-contract.js';\nimport type { ComponentContract } from './component-contract.js';\n\n// Use the context package's CompiledFragment type via re-export from types.ts\n// Since core can't depend on context, we define the minimal output shape here\n// that matches CompiledFragment structurally.\n\nexport interface CompiledContractOutput {\n filePath: string;\n meta: {\n name: string;\n description: string;\n category: string;\n tags?: string[];\n status?: 'stable' | 'beta' | 'deprecated' | 'experimental';\n figma?: string;\n figmaProps?: Record<string, unknown>;\n };\n usage: {\n when: string[];\n whenNot: string[];\n guidelines?: string[];\n accessibility?: string[];\n };\n props: Record<string, {\n type: string;\n description: string;\n default?: unknown;\n required?: boolean;\n values?: string[];\n constraints?: string[];\n }>;\n relations?: Array<{\n component: string;\n relationship: 'alternative' | 'parent' | 'child' | 'sibling' | 'composition' | 'complementary' | 'used-by';\n note: string;\n }>;\n variants: Array<{\n name: string;\n description: string;\n code?: string;\n args?: Record<string, unknown>;\n }>;\n contract?: {\n propsSummary?: string[];\n scenarioTags?: string[];\n a11yRules?: string[];\n bans?: Array<{ pattern: string; message: string }>;\n compoundChildren?: Record<string, {\n required?: boolean;\n accepts?: string[];\n description?: string;\n }>;\n canonicalUsage?: string[];\n performanceBudget?: number;\n };\n /** Framework hint from contract, used by extractor adapter selection */\n framework?: string;\n /** AI metadata for compound component generation */\n ai?: {\n compositionPattern?: 'compound' | 'simple' | 'controlled' | 'wrapper';\n subComponents?: string[];\n requiredChildren?: string[];\n commonPatterns?: string[];\n };\n /** Top-level compact prop summaries for agent first-pass */\n propsSummary?: string[];\n /** Provenance tracking */\n provenance?: {\n source: string;\n verified: boolean;\n frameworkSupport?: string;\n sourceHash?: string;\n extractedAt?: string;\n };\n /** Source file path relative to config root */\n sourcePath?: string;\n /** Named export from source file */\n exportName?: string;\n}\n\n/**\n * Check if a file path is a component contract file.\n */\nexport function isContractFile(filePath: string): boolean {\n return filePath.endsWith('.contract.json');\n}\n\n/**\n * Parse a component contract JSON file into CompiledFragment-compatible output.\n */\nexport function parseComponentContract(\n content: string,\n filePath: string,\n): CompiledContractOutput {\n const raw = JSON.parse(content);\n const validated: ComponentContract = componentContractSchema.parse(raw);\n\n return {\n filePath,\n meta: {\n name: validated.name,\n description: validated.description,\n category: validated.category,\n tags: validated.tags,\n status: validated.status,\n figma: validated.figma?.nodeUrl,\n figmaProps: validated.figma?.propMappings as Record<string, unknown> | undefined,\n },\n usage: validated.usage,\n props: validated.props,\n relations: validated.relations ?? [],\n variants: (validated.examples ?? []).map((ex) => ({\n name: ex.name,\n description: ex.description,\n code: ex.code,\n args: ex.args,\n })),\n contract: validated.contract ? {\n ...validated.contract,\n // Merge top-level propsSummary into contract.propsSummary if not already set\n propsSummary: validated.contract.propsSummary ?? validated.propsSummary,\n } : {\n propsSummary: validated.propsSummary,\n },\n framework: validated.framework,\n ai: validated.ai,\n propsSummary: validated.propsSummary,\n provenance: validated.provenance,\n sourcePath: validated.sourcePath,\n exportName: validated.exportName,\n };\n}\n","/**\n * DTCG Output Generators — generate CSS, SCSS, Tailwind, and Figma output\n * from a DTCG token source file.\n *\n * Makes DTCG the single source of truth with everything else as derived output.\n */\n\nimport type { DTCGTokenFile } from './dtcg.js';\nimport { parseColor, parseDtcgTokens } from './tokens/index.js';\n\n// ---------------------------------------------------------------------------\n// Internal: parse a DTCG file to flat tokens\n// ---------------------------------------------------------------------------\n\nfunction parseToFlatTokens(\n tokens: DTCGTokenFile,\n prefix?: string,\n): Array<{ cssName: string; cssValue: string; category: string; description?: string }> {\n // Use parseDTCGFile to get consistent output\n const parsed = parseDtcgTokens(JSON.stringify(tokens), 'tokens.tokens.json');\n const effectivePrefix = prefix ? `--${prefix.replace(/^--/, '').replace(/-$/, '')}-` : parsed.prefix;\n\n const result: Array<{ cssName: string; cssValue: string; category: string; description?: string }> = [];\n\n for (const [category, categoryTokens] of Object.entries(parsed.categories)) {\n for (const token of categoryTokens) {\n // Re-prefix if a custom prefix was requested\n let cssName = token.name;\n if (prefix && token.name.startsWith(parsed.prefix)) {\n cssName = effectivePrefix + token.name.slice(parsed.prefix.length);\n }\n\n result.push({\n cssName,\n cssValue: token.value ?? '',\n category,\n description: token.description,\n });\n }\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// CSS Custom Properties Generator\n// ---------------------------------------------------------------------------\n\nexport interface CSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '--ds-*') */\n prefix?: string;\n /** CSS selector to wrap variables in (default: ':root') */\n selector?: string;\n}\n\n/**\n * Generate CSS custom properties from a DTCG token file.\n */\nexport function generateCSSCustomProperties(\n tokens: DTCGTokenFile,\n options?: CSSGeneratorOptions,\n): string {\n const selector = options?.selector ?? ':root';\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push(`${selector} {`);\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(` /* ${category} */`);\n for (const token of categoryTokens) {\n if (token.description) {\n lines.push(` /* ${token.description} */`);\n }\n lines.push(` ${token.cssName}: ${token.cssValue};`);\n }\n lines.push('');\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// SCSS Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface SCSSGeneratorOptions {\n /** Token name prefix (e.g., 'ds' → '$ds-*') */\n prefix?: string;\n}\n\n/**\n * Generate SCSS variables from a DTCG token file.\n */\nexport function generateSCSSVariables(\n tokens: DTCGTokenFile,\n options?: SCSSGeneratorOptions,\n): string {\n const flatTokens = parseToFlatTokens(tokens, options?.prefix);\n\n const lines: string[] = [];\n lines.push('// Auto-generated from DTCG token file');\n lines.push('// Do not edit directly — modify the .tokens.json source');\n lines.push('');\n\n // Group by category for readability\n const grouped = new Map<string, typeof flatTokens>();\n for (const token of flatTokens) {\n const group = grouped.get(token.category) ?? [];\n group.push(token);\n grouped.set(token.category, group);\n }\n\n for (const [category, categoryTokens] of grouped) {\n lines.push(`// ${category}`);\n for (const token of categoryTokens) {\n // Convert CSS variable name to SCSS variable name\n const scssName = token.cssName.replace(/^--/, '$');\n lines.push(`${scssName}: ${token.cssValue} !default;`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Tailwind Config Generator\n// ---------------------------------------------------------------------------\n\n/**\n * Generate a Tailwind CSS configuration object from a DTCG token file.\n * Compatible with Tailwind v3 and v4.\n */\nexport function generateTailwindConfig(\n tokens: DTCGTokenFile,\n): Record<string, unknown> {\n const flatTokens = parseToFlatTokens(tokens);\n\n const theme: Record<string, Record<string, string>> = {};\n\n for (const token of flatTokens) {\n const tailwindKey = categoryToTailwindKey(token.category);\n if (!tailwindKey) continue;\n\n if (!theme[tailwindKey]) {\n theme[tailwindKey] = {};\n }\n\n // Convert CSS name to Tailwind token key\n // e.g., \"--ds-color-brand-primary\" → \"brand-primary\"\n const parts = token.cssName.replace(/^--[\\w]+-/, '').split('-');\n // Remove the category prefix if it matches\n const tokenKey = parts.join('-') || token.cssName;\n\n theme[tailwindKey][tokenKey] = `var(${token.cssName})`;\n }\n\n return {\n theme: {\n extend: theme,\n },\n };\n}\n\nfunction categoryToTailwindKey(category: string): string | undefined {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'colors';\n case 'spacing':\n return 'spacing';\n case 'radius':\n return 'borderRadius';\n case 'typography':\n return 'fontFamily';\n case 'shadows':\n return 'boxShadow';\n case 'borders':\n return 'borderWidth';\n case 'transitions':\n return 'transitionDuration';\n case 'z-index':\n return 'zIndex';\n default:\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Figma Variables Generator\n// ---------------------------------------------------------------------------\n\nexport interface FigmaVariable {\n name: string;\n type: 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN';\n value: unknown;\n description?: string;\n scopes?: string[];\n}\n\nexport interface FigmaVariableCollection {\n name: string;\n modes: Array<{ name: string; modeId: string }>;\n variables: FigmaVariable[];\n}\n\n/**\n * Generate Figma Variables REST API-compatible payload from a DTCG token file.\n */\nexport function generateFigmaVariables(\n tokens: DTCGTokenFile,\n): FigmaVariableCollection[] {\n const flatTokens = parseToFlatTokens(tokens);\n\n // Group by category into collections\n const collections = new Map<string, FigmaVariable[]>();\n\n for (const token of flatTokens) {\n const collectionName = categoryToFigmaCollection(token.category);\n const vars = collections.get(collectionName) ?? [];\n\n vars.push({\n name: token.cssName.replace(/^--/, '').replace(/-/g, '/'),\n type: categoryToFigmaType(token.category),\n value: parseFigmaValue(token.cssValue, token.category),\n description: token.description,\n scopes: categoryToFigmaScopes(token.category),\n });\n\n collections.set(collectionName, vars);\n }\n\n return Array.from(collections.entries()).map(([name, variables]) => ({\n name,\n modes: [{ name: 'Default', modeId: 'default' }],\n variables,\n }));\n}\n\nfunction categoryToFigmaCollection(category: string): string {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'Colors';\n case 'spacing':\n case 'radius':\n return 'Dimensions';\n case 'typography':\n return 'Typography';\n case 'shadows':\n return 'Effects';\n default:\n return 'Other';\n }\n}\n\nfunction categoryToFigmaType(category: string): 'COLOR' | 'FLOAT' | 'STRING' | 'BOOLEAN' {\n switch (category) {\n case 'colors':\n case 'surfaces':\n case 'text':\n return 'COLOR';\n case 'spacing':\n case 'radius':\n case 'z-index':\n return 'FLOAT';\n default:\n return 'STRING';\n }\n}\n\nfunction categoryToFigmaScopes(category: string): string[] {\n switch (category) {\n case 'colors':\n return ['ALL_FILLS', 'STROKE_COLOR'];\n case 'surfaces':\n return ['FRAME_FILL', 'SHAPE_FILL'];\n case 'text':\n return ['TEXT_FILL'];\n case 'spacing':\n return ['GAP', 'WIDTH_HEIGHT'];\n case 'radius':\n return ['CORNER_RADIUS'];\n default:\n return ['ALL_SCOPES'];\n }\n}\n\nfunction parseFigmaValue(cssValue: string, category: string): unknown {\n // For colors, try to parse hex to Figma RGBA object\n if (category === 'colors' || category === 'surfaces' || category === 'text') {\n const color = parseColor(cssValue);\n if (color) {\n return {\n r: color.r / 255,\n g: color.g / 255,\n b: color.b / 255,\n a: color.a ?? 1,\n };\n }\n }\n\n // For dimensions, extract numeric value\n if (category === 'spacing' || category === 'radius') {\n const numMatch = cssValue.match(/^(\\d+(?:\\.\\d+)?)/);\n if (numMatch) {\n return parseFloat(numMatch[1]);\n }\n }\n\n return cssValue;\n}\n","import type { CompiledFragment, RelationshipType } from \"./types.js\";\nimport type { ComponentGraph } from \"./graph/index.js\";\nimport { ComponentGraphEngine } from \"./graph/index.js\";\n\n// --- Public types ---\n\nexport interface CompositionWarning {\n type:\n | \"missing_parent\"\n | \"missing_child\"\n | \"missing_composition\"\n | \"redundant_alternative\"\n | \"deprecated\"\n | \"experimental\";\n component: string;\n message: string;\n relatedComponent?: string;\n}\n\nexport interface CompositionSuggestion {\n component: string;\n reason: string;\n relationship: RelationshipType | \"category_gap\";\n sourceComponent: string;\n}\n\nexport interface CompositionGuideline {\n component: string;\n guideline: string;\n}\n\nexport interface CompositionAnalysis {\n /** The validated component names (filtered to those that exist) */\n components: string[];\n\n /** Components requested but not found in the registry */\n unknown: string[];\n\n /** Issues with the current selection */\n warnings: CompositionWarning[];\n\n /** Components to consider adding */\n suggestions: CompositionSuggestion[];\n\n /** Relevant usage guidelines for the selected components */\n guidelines: CompositionGuideline[];\n}\n\n// --- Category affinities ---\n\nconst CATEGORY_AFFINITIES: Record<string, string[]> = {\n forms: [\"feedback\"],\n actions: [\"feedback\"],\n};\n\n// --- Main function ---\n\n/**\n * Analyzes a set of components as a composition group.\n * Returns warnings about missing relations, usage conflicts,\n * and suggestions for additional components.\n *\n * When a ComponentGraph is provided via `options.graph`, the analysis is\n * enhanced with graph-based dependency detection and block-based suggestions.\n *\n * Browser-safe: no Node.js APIs used.\n */\nexport function analyzeComposition(\n fragments: Record<string, CompiledFragment>,\n componentNames: string[],\n _context?: string,\n options?: { graph?: ComponentGraph },\n): CompositionAnalysis {\n const allNames = new Set(Object.keys(fragments));\n\n // 1. Validate names\n const components: string[] = [];\n const unknown: string[] = [];\n for (const name of componentNames) {\n if (allNames.has(name)) {\n components.push(name);\n } else {\n unknown.push(name);\n }\n }\n\n const selectedSet = new Set(components);\n const warnings: CompositionWarning[] = [];\n const suggestions: CompositionSuggestion[] = [];\n const guidelines: CompositionGuideline[] = [];\n\n // Track suggestions to avoid duplicates\n const suggestedSet = new Set<string>();\n\n for (const name of components) {\n const fragment = fragments[name];\n\n // 2. Relation checks\n if (fragment.relations) {\n for (const rel of fragment.relations) {\n switch (rel.relationship) {\n case \"parent\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_parent\",\n component: name,\n message: `\"${name}\" expects to be wrapped by \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"child\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${name}\" typically contains \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"child\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"composition\":\n if (!selectedSet.has(rel.component)) {\n warnings.push({\n type: \"missing_composition\",\n component: name,\n message: `\"${name}\" is typically used together with \"${rel.component}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n\n case \"sibling\":\n if (!selectedSet.has(rel.component) && !suggestedSet.has(rel.component)) {\n suggestions.push({\n component: rel.component,\n reason: `\"${rel.component}\" is a sibling of \"${name}\"${rel.note ? `: ${rel.note}` : \"\"}`,\n relationship: \"sibling\",\n sourceComponent: name,\n });\n suggestedSet.add(rel.component);\n }\n break;\n\n case \"alternative\":\n if (selectedSet.has(rel.component)) {\n warnings.push({\n type: \"redundant_alternative\",\n component: name,\n message: `\"${name}\" and \"${rel.component}\" are alternatives — using both may be redundant${rel.note ? `: ${rel.note}` : \"\"}`,\n relatedComponent: rel.component,\n });\n }\n break;\n }\n }\n }\n\n // 3. Usage conflict checks (whenNot)\n if (fragment.usage?.whenNot) {\n for (const whenNotEntry of fragment.usage.whenNot) {\n const lower = whenNotEntry.toLowerCase();\n for (const other of components) {\n if (other !== name && lower.includes(other.toLowerCase())) {\n guidelines.push({\n component: name,\n guideline: `Potential conflict with \"${other}\": ${whenNotEntry}`,\n });\n }\n }\n }\n }\n\n // 4. Status warnings\n if (fragment.meta.status === \"deprecated\") {\n warnings.push({\n type: \"deprecated\",\n component: name,\n message: fragment.meta.description\n ? `\"${name}\" is deprecated: ${fragment.meta.description}`\n : `\"${name}\" is deprecated`,\n });\n } else if (fragment.meta.status === \"experimental\") {\n warnings.push({\n type: \"experimental\",\n component: name,\n message: `\"${name}\" is experimental and may change without notice`,\n });\n }\n }\n\n // 5. Category gap analysis\n const selectedCategories = new Set(\n components.map((name) => fragments[name].meta.category)\n );\n\n for (const [category, affinities] of Object.entries(CATEGORY_AFFINITIES)) {\n if (!selectedCategories.has(category)) continue;\n\n for (const neededCategory of affinities) {\n if (selectedCategories.has(neededCategory)) continue;\n\n // Find the best component from the needed category\n const candidate = findBestCategoryCandidate(\n fragments,\n neededCategory,\n selectedSet,\n suggestedSet\n );\n if (candidate) {\n suggestions.push({\n component: candidate,\n reason: `Compositions using \"${category}\" components often benefit from a \"${neededCategory}\" component`,\n relationship: \"category_gap\",\n sourceComponent: components.find(\n (n) => fragments[n].meta.category === category\n )!,\n });\n suggestedSet.add(candidate);\n }\n }\n }\n\n // 6. Graph-enhanced analysis (when graph data is available)\n if (options?.graph) {\n const engine = new ComponentGraphEngine(options.graph);\n\n // Add graph-based dependency warnings\n for (const name of components) {\n const deps = engine.dependencies(name, [\"imports\", \"hook-depends\"]);\n for (const dep of deps) {\n if (\n !selectedSet.has(dep.target) &&\n !suggestedSet.has(dep.target) &&\n allNames.has(dep.target)\n ) {\n suggestions.push({\n component: dep.target,\n reason: `\"${name}\" ${dep.type === \"hook-depends\" ? \"uses a hook from\" : \"imports\"} \"${dep.target}\"`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(dep.target);\n }\n }\n }\n\n // Add block-based suggestions\n for (const name of components) {\n const blocks = engine.blocksUsing(name);\n for (const blockName of blocks) {\n // Find other components in this block that aren't selected\n const blockComps = options.graph.edges\n .filter(\n (e) =>\n e.type === \"composes\" &&\n e.provenance === `block:${blockName}` &&\n (e.source === name || e.target === name)\n )\n .map((e) => (e.source === name ? e.target : e.source));\n\n for (const comp of blockComps) {\n if (\n !selectedSet.has(comp) &&\n !suggestedSet.has(comp) &&\n allNames.has(comp)\n ) {\n suggestions.push({\n component: comp,\n reason: `\"${name}\" and \"${comp}\" are used together in the \"${blockName}\" block`,\n relationship: \"composition\",\n sourceComponent: name,\n });\n suggestedSet.add(comp);\n }\n }\n }\n }\n }\n\n return { components, unknown, warnings, suggestions, guidelines };\n}\n\n/**\n * Find the best candidate component from a given category.\n * Prefers stable components and avoids already-selected or already-suggested ones.\n */\nfunction findBestCategoryCandidate(\n fragments: Record<string, CompiledFragment>,\n category: string,\n selectedSet: Set<string>,\n suggestedSet: Set<string>\n): string | null {\n let best: string | null = null;\n let bestScore = -1;\n\n for (const [name, fragment] of Object.entries(fragments)) {\n if (fragment.meta.category !== category) continue;\n if (selectedSet.has(name) || suggestedSet.has(name)) continue;\n\n const status = fragment.meta.status ?? \"stable\";\n let score = 0;\n if (status === \"stable\") score = 3;\n else if (status === \"beta\") score = 2;\n else if (status === \"experimental\") score = 1;\n // deprecated gets 0\n\n if (score > bestScore) {\n bestScore = score;\n best = name;\n }\n }\n\n return best;\n}\n","import { useEffect, useState, type ReactNode } from \"react\";\nimport type { VariantLoader, VariantRenderOptions } from \"./types.js\";\n\n/**\n * Minimal contract for rendering a preview variant.\n * Compatible with fragment variants and Storybook-adapted variants.\n */\nexport interface PreviewVariantLike {\n render: (options?: VariantRenderOptions) => ReactNode;\n loaders?: VariantLoader[];\n}\n\nexport interface PreviewRuntimeState {\n content: ReactNode | null;\n isLoading: boolean;\n error: Error | null;\n loadedData?: Record<string, unknown>;\n}\n\nexport interface PreviewRuntimeOptions {\n variant?: PreviewVariantLike | null;\n loadedData?: Record<string, unknown>;\n}\n\nconst EMPTY_STATE: PreviewRuntimeState = {\n content: null,\n isLoading: false,\n error: null,\n loadedData: undefined,\n};\n\nfunction toError(error: unknown): Error {\n return error instanceof Error ? error : new Error(String(error));\n}\n\n/**\n * Execute all variant loaders and merge their payloads.\n * `loadedData` is applied last so host-level overrides win.\n */\nexport async function executeVariantLoaders(\n loaders: VariantLoader[] | undefined,\n loadedData?: Record<string, unknown>,\n): Promise<Record<string, unknown> | undefined> {\n const hasLoaders = !!loaders && loaders.length > 0;\n if (!hasLoaders) {\n return loadedData;\n }\n\n const results = await Promise.all(loaders.map((loader) => loader()));\n const mergedFromLoaders = results.reduce<Record<string, unknown>>(\n (acc, result) => ({ ...acc, ...result }),\n {},\n );\n\n return loadedData ? { ...mergedFromLoaders, ...loadedData } : mergedFromLoaders;\n}\n\n/**\n * Resolve a full runtime state (loader execution + render) in one async call.\n * This is useful for testing and for hook/component orchestration.\n */\nexport async function resolvePreviewRuntimeState(\n options: PreviewRuntimeOptions,\n): Promise<PreviewRuntimeState> {\n const { variant, loadedData } = options;\n if (!variant) {\n return EMPTY_STATE;\n }\n\n try {\n const mergedLoadedData = await executeVariantLoaders(variant.loaders, loadedData);\n const content = variant.render({ loadedData: mergedLoadedData });\n return {\n content,\n isLoading: false,\n error: null,\n loadedData: mergedLoadedData,\n };\n } catch (error) {\n return {\n content: null,\n isLoading: false,\n error: toError(error),\n loadedData: undefined,\n };\n }\n}\n\n/**\n * Hook for rendering a preview variant with loader support.\n */\nexport function usePreviewVariantRuntime(\n options: PreviewRuntimeOptions,\n): PreviewRuntimeState {\n const { variant, loadedData } = options;\n const [state, setState] = useState<PreviewRuntimeState>(EMPTY_STATE);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!variant) {\n setState(EMPTY_STATE);\n return () => {\n cancelled = true;\n };\n }\n\n const hasLoaders = !!variant.loaders && variant.loaders.length > 0;\n setState({\n content: null,\n isLoading: hasLoaders,\n error: null,\n loadedData: undefined,\n });\n\n resolvePreviewRuntimeState({ variant, loadedData }).then((nextState) => {\n if (!cancelled) {\n setState(nextState);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [variant, loadedData]);\n\n return state;\n}\n\ninterface PreviewVariantRuntimeProps extends PreviewRuntimeOptions {\n children: (state: PreviewRuntimeState) => ReactNode;\n}\n\n/**\n * Render-prop component wrapper around `usePreviewVariantRuntime`.\n */\nexport function PreviewVariantRuntime({\n variant,\n loadedData,\n children,\n}: PreviewVariantRuntimeProps) {\n const state = usePreviewVariantRuntime({ variant, loadedData });\n return <>{children(state)}</>;\n}\n","/**\n * Component discovery utilities.\n *\n * Extracted from the docs app component-registry so that any consumer\n * (govern presets, CLI tools, third-party integrations) can discover\n * components from a module's exports without duplicating the logic.\n */\n\n/**\n * Check if a value is likely a React component.\n * Functions or objects with $$typeof (forwardRef, memo) qualify.\n */\nexport function isReactComponent(value: unknown): boolean {\n if (!value) return false;\n\n // Function component (most common case)\n if (typeof value === 'function') {\n return true;\n }\n\n // ForwardRef, memo, etc. have $$typeof\n if (typeof value === 'object') {\n const obj = value as Record<string, unknown>;\n if (obj.$$typeof) return true;\n }\n\n return false;\n}\n\nexport interface DiscoverComponentsOptions {\n /** Set of export names to skip */\n exclude?: Set<string>;\n}\n\n/**\n * Discover all components and sub-components from a module's exports.\n * Returns a sorted array of component names including compound names (e.g. 'Card.Header').\n *\n * @param moduleExports - The exports object from a component library (e.g. `import * as UI from '@usefragments/ui'`)\n * @param options - Optional configuration\n */\nexport function discoverComponents(\n moduleExports: Record<string, unknown>,\n options?: DiscoverComponentsOptions,\n): string[] {\n const exclude = options?.exclude;\n const names: string[] = [];\n\n for (const [exportName, exportValue] of Object.entries(moduleExports)) {\n // Skip excluded exports\n if (exclude?.has(exportName)) continue;\n\n // Skip non-components (types, constants, etc.)\n if (!isReactComponent(exportValue)) continue;\n\n // Skip lowercase exports (likely utilities)\n if (exportName[0] !== exportName[0].toUpperCase()) continue;\n\n // Add the main component\n names.push(exportName);\n\n // Check for sub-components by looking at ALL properties of the component\n const componentObj = exportValue as Record<string, unknown>;\n\n for (const key of Object.keys(componentObj)) {\n // Skip internal properties and non-component properties\n if (key.startsWith('_') || key.startsWith('$')) continue;\n if (key === 'displayName' || key === 'propTypes' || key === 'defaultProps') continue;\n // Skip 'render' which is a forwardRef internal, and 'Tabbed' which is a special variant\n if (key === 'render' || key === 'Tabbed') continue;\n\n const subComponent = componentObj[key];\n if (isReactComponent(subComponent)) {\n names.push(`${exportName}.${key}`);\n }\n }\n }\n\n return names.sort();\n}\n","/**\n * Finding builder — assembles a `Finding` and computes its fingerprint.\n *\n * The fingerprint is a content-addressed hash of a small identity tuple chosen\n * by each rule. It is *not* the source location: two findings at different\n * lines for the same offending value should have different fingerprints, but\n * adding a blank line above them must not change either fingerprint. Rules\n * pick identity inputs that capture \"what's wrong\" (file, ruleId, componentId,\n * prop, property, value) without leaning on lineNumber/column.\n */\n\nimport type { GovernanceSeverity } from \"../governance.js\";\nimport type { FactEvidence, FactLocation } from \"../facts/index.js\";\nimport { canonicalJson, hash64Hex } from \"../facts/ids.js\";\nimport { byRuleId } from \"../codes/index.js\";\nimport { normalizeFinding, normalizeSeverity } from \"../schemas/index.js\";\nimport type { Severity } from \"../schemas/index.js\";\nimport type { EvidenceGrade } from \"../evidence.js\";\n\nimport type { Finding, FindingFix } from \"./types.js\";\n\nexport interface MakeFindingInput {\n ruleId: string;\n ruleVersion: string;\n severity: GovernanceSeverity | Severity;\n message: string;\n location: FactLocation;\n evidence: FactEvidence[];\n evidenceGrade?: EvidenceGrade;\n fingerprintIdentity: Record<string, unknown>;\n fix?: FindingFix;\n attributes?: Record<string, unknown>;\n}\n\nexport function makeFinding(input: MakeFindingInput): Finding {\n if (input.evidence.length === 0) {\n throw new Error(`makeFinding(${input.ruleId}): findings must carry at least one evidence fact`);\n }\n const fingerprint = hash64Hex(\n canonicalJson({ ruleId: input.ruleId, ...input.fingerprintIdentity })\n );\n const code = byRuleId.get(input.ruleId);\n return normalizeFinding({\n ruleId: input.ruleId,\n ruleVersion: input.ruleVersion,\n severity: normalizeSeverity(input.severity),\n code: code?.code,\n helpUrl: code?.explainUrl,\n message: input.message,\n fingerprint,\n location: input.location,\n evidence: input.evidence,\n evidenceGrade: input.evidenceGrade ?? \"source_backed\",\n fix: input.fix,\n attributes: input.attributes,\n });\n}\n","/**\n * Rule helpers — small internal queries shared by Phase 5 rules.\n *\n * These live next to the rules instead of on `FactIndex` until they prove\n * useful for two or more rules. The plan is to lift them onto the index only\n * when a third caller appears.\n */\n\nimport type {\n Fact,\n FactId,\n FactIndex,\n StyleDeclarationFact,\n TokenDefinitionFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n UsageTextChildFact,\n} from \"../facts/index.js\";\nimport type { FindingFix } from \"./types.js\";\n\nexport interface FixProof {\n symbols: readonly string[];\n editKind: FindingFix[\"kind\"];\n valuePreserving: boolean;\n}\n\nexport interface FixEmission<F extends FindingFix = FindingFix> {\n fix: F;\n downgradeReason?: string;\n}\n\n/**\n * Gate token-substitution fixes on explicit proof. Callers attach any returned\n * downgradeReason to the finding attributes so machine consumers can explain\n * why a suggestion was not auto-applicable.\n */\nexport function emitFix<F extends FindingFix>(\n fix: F,\n proof: FixProof,\n ix: FactIndex\n): FixEmission<F> {\n const reasons: string[] = [];\n if (proof.editKind !== fix.kind) reasons.push(\"edit kind does not match proof\");\n if (!proof.valuePreserving) reasons.push(\"value-preservation proof missing\");\n if (proof.symbols.length === 0) reasons.push(\"token-symbol proof missing\");\n\n const missingSymbols = proof.symbols.filter((symbol) => !ix.tokens.symbolExists(symbol));\n if (missingSymbols.length > 0) {\n reasons.push(`absent token symbol: ${missingSymbols.join(\", \")}`);\n }\n\n const inapplicableSymbols = proof.symbols.filter((symbol) => {\n const definition = ix.tokens.definitionForSymbol(symbol);\n return definition !== undefined && !isApplicableTokenReference(definition.referenceFormat);\n });\n if (inapplicableSymbols.length > 0) {\n reasons.push(`token reference is not directly applicable: ${inapplicableSymbols.join(\", \")}`);\n }\n\n return {\n fix: { ...fix, deterministic: reasons.length === 0 },\n ...(reasons.length > 0 ? { downgradeReason: reasons.join(\"; \") } : {}),\n };\n}\n\n/** Extract authored token symbols from a replacement string, preserving order. */\nexport function tokenSymbolsInText(value: string): string[] {\n return [...new Set(value.match(/\\$[A-Za-z0-9_-]+|--[A-Za-z0-9_-]+/g) ?? [])];\n}\n\nexport interface LengthScale {\n unit: \"px\" | \"rem\";\n rootFontSizePx?: number;\n emBasePx?: number;\n}\n\n/** Group `usage_prop_resolved` facts by their parent `usage_node` id. */\nexport function indexPropsByNodeId(ix: FactIndex): Map<FactId, UsagePropResolvedFact[]> {\n const out = new Map<FactId, UsagePropResolvedFact[]>();\n for (const fact of ix.byKind(\"usage_prop_resolved\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Group `usage_text_child` facts by their parent `usage_node` id. */\nexport function indexTextChildrenByNodeId(ix: FactIndex): Map<FactId, UsageTextChildFact[]> {\n const out = new Map<FactId, UsageTextChildFact[]>();\n for (const fact of ix.byKind(\"usage_text_child\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Group `usage_inline_style` facts by their parent `usage_node` id. */\nexport function indexInlineStylesByNodeId(ix: FactIndex): Map<FactId, UsageInlineStyleFact[]> {\n const out = new Map<FactId, UsageInlineStyleFact[]>();\n for (const fact of ix.byKind(\"usage_inline_style\")) {\n let bucket = out.get(fact.nodeId);\n if (!bucket) {\n bucket = [];\n out.set(fact.nodeId, bucket);\n }\n bucket.push(fact);\n }\n return out;\n}\n\n/** Map `usage_component` records by their `nodeId` for fast component lookup. */\nexport function indexComponentByNodeId(ix: FactIndex): Map<FactId, UsageComponentFact> {\n const out = new Map<FactId, UsageComponentFact>();\n for (const fact of ix.byKind(\"usage_component\")) {\n out.set(fact.nodeId, fact);\n }\n return out;\n}\n\n/**\n * A region: a container node paired with every `usage_node` nested beneath it\n * within the same root tree. Membership is decided purely by `nodePath` — no\n * component identity, no framework knowledge — so the same grouping works for\n * any adapter that emits conformant paths.\n */\nexport interface Region {\n /** The container node whose `nodePath` is a strict prefix of every member. */\n container: UsageNodeFact;\n /** Every node strictly nested beneath the container, at any depth. */\n members: UsageNodeFact[];\n}\n\n/**\n * Group `usage_node` facts into regions by shared `nodePath` prefix.\n *\n * Every node is treated as a potential container; a node B is a member of node\n * A's region iff A's path segments are a *strict* prefix of B's and both share\n * the same `(file, rootIndex)`. The consuming rule decides which containers\n * matter via its region selector — this helper does not interpret what a\n * container \"is.\"\n *\n * `nodePath` segments are opaque. The path is split into a leading `rootIndex`\n * token (everything before the first `:`) and `/`-joined segments; only whole\n * segments are compared. The `expr:` / `attr:` / `jsx:` tokens a JSX adapter\n * encodes inside a segment are never parsed — that is what keeps this helper\n * framework-blind (per the usage-node-fact contract). Non-conformant paths are\n * skipped rather than mis-grouped.\n *\n * Cost is O(nodes²) within one `(file, rootIndex)` bucket (each path is parsed\n * once up front); root trees are small in practice, so this stays well inside\n * the per-file scan budget.\n */\nexport function regionsByPrefix(ix: FactIndex): Region[] {\n // Bucket by (file, rootIndex) so a prefix comparison never crosses root\n // trees — separate roots in one file restart segment numbering, so their\n // paths can collide segment-for-segment without actually being nested.\n const buckets = new Map<string, Array<{ fact: UsageNodeFact; segments: string[] }>>();\n for (const fact of ix.byKind(\"usage_node\")) {\n const parsed = parseNodePath(fact.nodePath);\n if (!parsed) continue;\n // rootIndex is colon-free (it is the token before nodePath's first \":\"), so\n // putting it first lets that \":\" cleanly delimit it from the free-form file.\n const key = `${parsed.rootIndex}:${fact.file}`;\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = [];\n buckets.set(key, bucket);\n }\n bucket.push({ fact, segments: parsed.segments });\n }\n\n const regions: Region[] = [];\n for (const bucket of buckets.values()) {\n for (const candidate of bucket) {\n const members: UsageNodeFact[] = [];\n for (const other of bucket) {\n if (other !== candidate && isStrictSegmentPrefix(candidate.segments, other.segments)) {\n members.push(other.fact);\n }\n }\n regions.push({ container: candidate.fact, members });\n }\n }\n return regions;\n}\n\n/**\n * Split a `nodePath` into its leading `rootIndex` token and whole segments.\n * Returns `null` for a path with no `rootIndex:` prefix (non-conformant — e.g.\n * a future non-React adapter that hasn't adopted the contract); the caller\n * skips those rather than risk mis-grouping. Segments are never split below the\n * `/` boundary, keeping `expr:` / `attr:` / `jsx:` tokens opaque.\n */\nfunction parseNodePath(nodePath: string): { rootIndex: string; segments: string[] } | null {\n const colon = nodePath.indexOf(\":\");\n if (colon === -1) return null;\n const rest = nodePath.slice(colon + 1);\n return {\n rootIndex: nodePath.slice(0, colon),\n segments: rest === \"\" ? [] : rest.split(\"/\"),\n };\n}\n\n/** Whether `prefix` is a strict (shorter) whole-segment prefix of `full`. */\nfunction isStrictSegmentPrefix(prefix: readonly string[], full: readonly string[]): boolean {\n if (prefix.length >= full.length) return false;\n for (let i = 0; i < prefix.length; i++) {\n if (prefix[i] !== full[i]) return false;\n }\n return true;\n}\n\n/** Read a `usage_node` fact through the index and narrow the kind. */\nexport function readUsageNode(ix: FactIndex, id: FactId): UsageNodeFact | undefined {\n const fact: Fact | undefined = ix.get(id);\n return fact && fact.kind === \"usage_node\" ? fact : undefined;\n}\n\n/** Read a `style_declaration` fact through the index and narrow the kind. */\nexport function readStyleDeclaration(ix: FactIndex, id: FactId): StyleDeclarationFact | undefined {\n const fact: Fact | undefined = ix.get(id);\n return fact && fact.kind === \"style_declaration\" ? fact : undefined;\n}\n\n/**\n * The set of CSS custom-property names a token vocabulary defines, normalized to\n * `--`-prefixed form. Shared by the token-vocabulary rules\n * (`require-dual-fallback`, `css-vars-must-be-defined`).\n */\nexport function cssVariableNames(tokens: readonly TokenDefinitionFact[]): Set<string> {\n const names = new Set<string>();\n for (const token of tokens) {\n names.add(token.name.startsWith(\"--\") ? token.name : `--${token.name}`);\n }\n return names;\n}\n\n/**\n * The prefix families of a token vocabulary — the namespace each token name\n * declares, up to and including the first hyphen after the leading `--`\n * (`--fui-color-accent` → `--fui-`). A single-segment token (`--accent`, no\n * namespace) contributes no family. Used to decide whether an unknown `var(--x)`\n * is \"shaped like a contract token\" (off-contract drift) or a genuinely foreign\n * custom property (`--swiper-*`, `--radix-*`, layout/animation vars — ignored).\n */\nexport function contractPrefixFamilies(names: ReadonlySet<string>): Set<string> {\n const families = new Set<string>();\n for (const name of names) {\n const hyphen = name.indexOf(\"-\", 2);\n if (hyphen === -1) continue;\n families.add(name.slice(0, hyphen + 1));\n }\n return families;\n}\n\n/**\n * Universal JSX props that pass `components/unknown-prop` regardless of the\n * component's prop schema. These are React/DOM concerns, not design system\n * concerns, and asking authors to declare them in `*.fragment.ts` would noise\n * up every component.\n */\nconst UNIVERSAL_JSX_PROPS = new Set([\n \"key\",\n \"ref\",\n \"children\",\n \"className\",\n \"style\",\n \"id\",\n \"role\",\n \"tabIndex\",\n \"title\",\n \"slot\",\n \"lang\",\n \"dir\",\n \"hidden\",\n \"draggable\",\n \"spellCheck\",\n \"translate\",\n \"contentEditable\",\n \"suppressContentEditableWarning\",\n \"suppressHydrationWarning\",\n]);\n\nexport function isUniversalJsxProp(prop: string): boolean {\n if (UNIVERSAL_JSX_PROPS.has(prop)) return true;\n if (prop.startsWith(\"aria-\")) return true;\n if (prop.startsWith(\"data-\")) return true;\n if (prop.startsWith(\"on\") && prop.length > 2 && prop[2] === prop[2].toUpperCase()) {\n return true;\n }\n return false;\n}\n\n/**\n * Parse a length-ish CSS value (e.g., `13px`, `13`, `1.5rem`, `0`) into a\n * numeric value and unit. Returns `null` for values that include CSS function\n * calls, multi-value shorthands, or anything else that can't be cleanly\n * compared against a numeric scale.\n */\nexport function parseLengthValue(\n raw: string\n): { value: number; unit: \"px\" | \"rem\" | \"em\" | null } | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n const match = /^(-?\\d+(?:\\.\\d+)?)(px|rem|em)?$/i.exec(trimmed);\n if (!match) return null;\n const value = Number.parseFloat(match[1]);\n if (!Number.isFinite(value)) return null;\n const rawUnit = match[2]?.toLowerCase();\n const unit = rawUnit === \"px\" || rawUnit === \"rem\" || rawUnit === \"em\" ? rawUnit : null;\n return { value, unit };\n}\n\nexport type ParsedLengthValue = NonNullable<ReturnType<typeof parseLengthValue>>;\n\nexport function matchesScale(value: number, allowed: readonly number[]): boolean {\n const magnitude = Math.abs(value);\n if (magnitude === 0) return allowed.includes(0);\n return allowed.includes(magnitude);\n}\n\nexport function normalizeLengthForScale(\n parsed: ParsedLengthValue,\n scale: LengthScale\n): {\n value: number;\n deterministicFix: boolean;\n assumedRootFontSizePx?: number;\n assumedEmBasePx?: number;\n} | null {\n const unit = parsed.unit ?? scale.unit;\n if (unit === scale.unit) {\n return { value: parsed.value, deterministicFix: true };\n }\n\n if (scale.unit === \"px\" && unit === \"rem\") {\n const explicit = scale.rootFontSizePx !== undefined;\n const rootFontSizePx = scale.rootFontSizePx ?? 16;\n return {\n value: parsed.value * rootFontSizePx,\n deterministicFix: explicit,\n assumedRootFontSizePx: explicit ? undefined : rootFontSizePx,\n };\n }\n\n if (scale.unit === \"px\" && unit === \"em\") {\n const explicit = scale.emBasePx !== undefined;\n const emBasePx = scale.emBasePx ?? scale.rootFontSizePx ?? 16;\n return {\n value: parsed.value * emBasePx,\n deterministicFix: explicit,\n assumedEmBasePx: explicit ? undefined : emBasePx,\n };\n }\n\n if (scale.unit === \"rem\" && unit === \"px\") {\n const explicit = scale.rootFontSizePx !== undefined;\n if (!explicit) return null;\n return {\n value: parsed.value / scale.rootFontSizePx!,\n deterministicFix: true,\n };\n }\n\n return null;\n}\n\nexport function nearestScaleValue(value: number, allowed: readonly number[]): number | null {\n if (allowed.length === 0) return null;\n let best = allowed[0];\n let bestDelta = Math.abs(value - best);\n for (let i = 1; i < allowed.length; i++) {\n const candidate = allowed[i];\n const delta = Math.abs(value - candidate);\n if (delta < bestDelta || (delta === bestDelta && candidate < best)) {\n best = candidate;\n bestDelta = delta;\n }\n }\n return best;\n}\n\nexport function nearestSignedScaleValue(value: number, allowed: readonly number[]): number | null {\n const nearest = nearestScaleValue(Math.abs(value), allowed);\n if (nearest === null) return null;\n if (nearest === 0) return 0;\n return value < 0 ? -nearest : nearest;\n}\n\n/**\n * Detect whether a CSS value contains a raw color literal — hex, rgb/rgba,\n * hsl/hsla, or a named color. Returns the color literal so the rule can quote\n * it in the message and as a fingerprint input. Returns `null` for token\n * references (`var(--...)`) and for values that don't look like a color.\n */\nexport function detectRawColor(raw: string): string | null {\n const trimmed = raw.trim();\n if (!trimmed) return null;\n\n // A hex/color literal sitting inside a `var(--token, <fallback>)` expression\n // is the *fallback*, not a raw color — flagging it both produces false\n // positives on shorthands (`border: 1px solid var(--x, #hex)`) and fights the\n // dual-fallback rule, which mandates exactly that literal. Strip every var()\n // expression (innermost-first, so nested fallbacks are handled) before\n // scanning, so only a literal *outside* any var() is treated as raw.\n const scanned = stripVarExpressions(trimmed);\n if (!scanned.trim()) return null;\n\n const hex = /#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})\\b/i.exec(scanned);\n if (hex) return hex[0];\n\n const fn = /(rgb|rgba|hsl|hsla)\\s*\\([^)]*\\)/i.exec(scanned);\n if (fn) return fn[0];\n\n for (const part of scanned.split(/\\s+/)) {\n const lower = part.toLowerCase();\n if (/^[a-z]+$/i.test(lower) && CSS_NAMED_COLORS.has(lower)) {\n return lower;\n }\n }\n\n return null;\n}\n\n/**\n * Remove every `var(--token, …)` expression from a CSS value, innermost-first,\n * so a literal inside a var() fallback is not mistaken for a raw color. A bare\n * `var(--token)` (no fallback) also disappears, preserving the previous\n * behavior of exempting whole-value token references.\n */\nfunction stripVarExpressions(value: string): string {\n let out = value;\n const innermost = /var\\([^()]*\\)/gi;\n // Iterate so nested fallbacks (`var(--a, var(--b, #fff))`) collapse fully.\n for (let i = 0; i < 10 && innermost.test(out); i += 1) {\n out = out.replace(innermost, \" \");\n innermost.lastIndex = 0;\n }\n return out;\n}\n\nconst CSS_NAMED_COLORS = new Set([\n \"aliceblue\",\n \"antiquewhite\",\n \"aqua\",\n \"aquamarine\",\n \"azure\",\n \"beige\",\n \"bisque\",\n \"black\",\n \"blanchedalmond\",\n \"blue\",\n \"blueviolet\",\n \"brown\",\n \"burlywood\",\n \"cadetblue\",\n \"chartreuse\",\n \"chocolate\",\n \"coral\",\n \"cornflowerblue\",\n \"cornsilk\",\n \"crimson\",\n \"cyan\",\n \"darkblue\",\n \"darkcyan\",\n \"darkgoldenrod\",\n \"darkgray\",\n \"darkgreen\",\n \"darkgrey\",\n \"darkkhaki\",\n \"darkmagenta\",\n \"darkolivegreen\",\n \"darkorange\",\n \"darkorchid\",\n \"darkred\",\n \"darksalmon\",\n \"darkseagreen\",\n \"darkslateblue\",\n \"darkslategray\",\n \"darkslategrey\",\n \"darkturquoise\",\n \"darkviolet\",\n \"deeppink\",\n \"deepskyblue\",\n \"dimgray\",\n \"dimgrey\",\n \"dodgerblue\",\n \"firebrick\",\n \"floralwhite\",\n \"forestgreen\",\n \"fuchsia\",\n \"gainsboro\",\n \"ghostwhite\",\n \"gold\",\n \"goldenrod\",\n \"gray\",\n \"green\",\n \"greenyellow\",\n \"grey\",\n \"honeydew\",\n \"hotpink\",\n \"indianred\",\n \"indigo\",\n \"ivory\",\n \"khaki\",\n \"lavender\",\n \"lavenderblush\",\n \"lawngreen\",\n \"lemonchiffon\",\n \"lightblue\",\n \"lightcoral\",\n \"lightcyan\",\n \"lightgoldenrodyellow\",\n \"lightgray\",\n \"lightgreen\",\n \"lightgrey\",\n \"lightpink\",\n \"lightsalmon\",\n \"lightseagreen\",\n \"lightskyblue\",\n \"lightslategray\",\n \"lightslategrey\",\n \"lightsteelblue\",\n \"lightyellow\",\n \"lime\",\n \"limegreen\",\n \"linen\",\n \"magenta\",\n \"maroon\",\n \"mediumaquamarine\",\n \"mediumblue\",\n \"mediumorchid\",\n \"mediumpurple\",\n \"mediumseagreen\",\n \"mediumslateblue\",\n \"mediumspringgreen\",\n \"mediumturquoise\",\n \"mediumvioletred\",\n \"midnightblue\",\n \"mintcream\",\n \"mistyrose\",\n \"moccasin\",\n \"navajowhite\",\n \"navy\",\n \"oldlace\",\n \"olive\",\n \"olivedrab\",\n \"orange\",\n \"orangered\",\n \"orchid\",\n \"palegoldenrod\",\n \"palegreen\",\n \"paleturquoise\",\n \"palevioletred\",\n \"papayawhip\",\n \"peachpuff\",\n \"peru\",\n \"pink\",\n \"plum\",\n \"powderblue\",\n \"purple\",\n \"rebeccapurple\",\n \"red\",\n \"rosybrown\",\n \"royalblue\",\n \"saddlebrown\",\n \"salmon\",\n \"sandybrown\",\n \"seagreen\",\n \"seashell\",\n \"sienna\",\n \"silver\",\n \"skyblue\",\n \"slateblue\",\n \"slategray\",\n \"slategrey\",\n \"snow\",\n \"springgreen\",\n \"steelblue\",\n \"tan\",\n \"teal\",\n \"thistle\",\n \"tomato\",\n \"turquoise\",\n \"violet\",\n \"wheat\",\n \"white\",\n \"whitesmoke\",\n \"yellow\",\n \"yellowgreen\",\n]);\n\n/**\n * Default exemptions for raw color rule. Combines policy-supplied `except`\n * with universally meaningful keywords that aren't true colors.\n */\nexport const COLOR_KEYWORD_EXEMPTIONS = new Set([\n \"transparent\",\n \"currentcolor\",\n \"inherit\",\n \"initial\",\n \"unset\",\n]);\n\nexport function isExemptColor(value: string, except: readonly string[]): boolean {\n const lower = value.trim().toLowerCase();\n if (COLOR_KEYWORD_EXEMPTIONS.has(lower)) return true;\n for (const ex of except) {\n if (ex.toLowerCase() === lower) return true;\n }\n return false;\n}\n\n/**\n * Render a token name as the reference an author would write: SCSS `$vars`\n * pass through, dotted/bare names become a `var(--…)` custom property. Shared by\n * the color and spacing rules so a \"use the token\" fix is expressed the same way\n * everywhere.\n */\nexport function tokenReference(name: string): string {\n if (name.startsWith(\"$\")) return name;\n const cssVarName = name.startsWith(\"--\") ? name : `--${name.replace(/\\./g, \"-\")}`;\n return `var(${cssVarName})`;\n}\n\n/**\n * Whether a token reference can be *applied* automatically (written verbatim\n * and still compile). A `css-var` / `scss-var` token resolves on its own; a\n * `scss-map` member (synthetic `$colors-primary` minted from a Sass map) or a\n * `dtcg` JSON token (no CSS custom property emitted by default) does not, so\n * those fixes are surfaced as suggestions rather than deterministic rewrites.\n * Tokens without a known format (legacy/hand-built facts) are treated as safe.\n */\nexport function isApplicableTokenReference(\n referenceFormat: TokenDefinitionFact[\"referenceFormat\"]\n): boolean {\n return (\n referenceFormat === undefined || referenceFormat === \"css-var\" || referenceFormat === \"scss-var\"\n );\n}\n","/**\n * `a11y/required-accessible-name` — fires for components with an\n * `a11y.requireName` policy whose JSX usage has no discoverable accessible\n * name.\n *\n * Accepted name sources (any one is enough):\n * - non-empty `usage_text_child` content\n * - `aria-label=\"...\"` (static or dynamic both pass; we cannot prove a\n * dynamic value is empty at scan time)\n * - `aria-labelledby={...}`\n * - `title=\"...\"`\n *\n * Components that explicitly opt out via `aria-hidden=\"true\"` are skipped —\n * they are not part of the accessibility tree.\n */\n\nimport type { FactIndex, UsagePropResolvedFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexPropsByNodeId, indexTextChildrenByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"a11y/required-accessible-name\";\nexport const RULE_VERSION = \"1\";\n\nconst NAME_SOURCE_PROPS = new Set([\"aria-label\", \"aria-labelledby\", \"title\"]);\n\nexport function ruleA11yRequiredAccessibleName(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n const propsByNode = indexPropsByNodeId(ix);\n const textByNode = indexTextChildrenByNodeId(ix);\n\n for (const usageComponent of ix.byKind(\"usage_component\")) {\n const policy = ix.policy.a11yNameRequired(usageComponent.componentId);\n if (!policy) continue;\n\n const node = readUsageNode(ix, usageComponent.nodeId);\n if (!node) continue;\n\n const props = propsByNode.get(node.id) ?? [];\n if (props.some(isAriaHidden)) continue;\n\n if (hasAccessibleName(props, textByNode.get(node.id) ?? [])) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `<${node.element}> has no accessible name. ${policy.because}`.trim(),\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n },\n attributes: {\n componentId: usageComponent.componentId,\n element: node.element,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction hasAccessibleName(\n props: UsagePropResolvedFact[],\n textChildren: ReadonlyArray<{ text: string }>\n): boolean {\n for (const child of textChildren) {\n if (typeof child.text === \"string\" && child.text.trim().length > 0) return true;\n }\n for (const prop of props) {\n if (!NAME_SOURCE_PROPS.has(prop.prop)) continue;\n if (prop.resolution === \"spread\") continue;\n if (prop.resolution === \"dynamic\") return true;\n if (prop.resolution === \"static\") {\n if (typeof prop.value === \"string\" && prop.value.trim().length > 0) return true;\n if (prop.value !== undefined && prop.value !== \"\" && prop.value !== null) return true;\n }\n }\n return false;\n}\n\nfunction isAriaHidden(prop: UsagePropResolvedFact): boolean {\n if (prop.prop !== \"aria-hidden\") return false;\n if (prop.resolution !== \"static\") return false;\n return prop.value === true || prop.value === \"true\";\n}\n","export type RawHtmlPrecisionTier =\n | \"exact-html\"\n | \"html-advisory\"\n | \"input-type\"\n | \"role-reimpl\"\n | \"interactive-nonsemantic\"\n | \"icon-only\";\n\nexport interface RawHtmlCanonicalMatch {\n canonical: string;\n tier: RawHtmlPrecisionTier;\n}\n\nconst EXACT_HTML_CANONICALS = new Map<string, string>([[\"button\", \"Button\"]]);\n\nconst ADVISORY_HTML_CANONICALS = new Map<string, string>([\n [\"textarea\", \"Textarea\"],\n [\"select\", \"Select\"],\n [\"dialog\", \"Dialog\"],\n [\"progress\", \"Progress\"],\n [\"details\", \"Collapsible\"],\n [\"table\", \"Table\"],\n]);\n\nconst INPUT_TYPE_CANONICALS = new Map<string, string>([\n [\"checkbox\", \"Checkbox\"],\n [\"radio\", \"Radio\"],\n [\"number\", \"NumberInput\"],\n [\"password\", \"PasswordInput\"],\n [\"range\", \"Slider\"],\n]);\n\nconst ROLE_CANONICALS = new Map<string, string>([\n [\"button\", \"Button\"],\n [\"checkbox\", \"Checkbox\"],\n [\"radio\", \"Radio\"],\n [\"switch\", \"Switch\"],\n [\"tab\", \"Tabs\"],\n [\"tablist\", \"Tabs\"],\n [\"dialog\", \"Dialog\"],\n [\"menu\", \"Menu\"],\n [\"status\", \"Alert\"],\n]);\n\nexport const RAW_HTML_CANONICAL_TAGS = Object.freeze(\n Array.from(EXACT_HTML_CANONICALS, ([tagName, canonical]) => ({\n tagName,\n canonical,\n tier: \"exact-html\" as const,\n }))\n);\n\nexport const RAW_HTML_ADVISORY_TAGS = Object.freeze(\n Array.from(ADVISORY_HTML_CANONICALS, ([tagName, canonical]) => ({\n tagName,\n canonical,\n tier: \"html-advisory\" as const,\n }))\n);\n\nexport const RAW_HTML_INPUT_TYPE_CANONICALS = Object.freeze(\n Array.from(INPUT_TYPE_CANONICALS, ([type, canonical]) => ({\n type,\n canonical,\n tier: \"input-type\" as const,\n }))\n);\n\nexport const RAW_HTML_ROLE_CANONICALS = Object.freeze(\n Array.from(ROLE_CANONICALS, ([role, canonical]) => ({\n role,\n canonical,\n tier: \"role-reimpl\" as const,\n }))\n);\n\nexport function resolveCanonicalForRawHtml(\n tagName: string,\n inputType?: string\n): RawHtmlCanonicalMatch | null {\n const tag = tagName.toLowerCase();\n if (tag === \"input\") {\n const normalizedType = inputType?.trim().toLowerCase();\n if (!normalizedType) return null;\n const canonical = INPUT_TYPE_CANONICALS.get(normalizedType);\n return canonical ? { canonical, tier: \"input-type\" } : null;\n }\n\n const exactCanonical = EXACT_HTML_CANONICALS.get(tag);\n if (exactCanonical) return { canonical: exactCanonical, tier: \"exact-html\" };\n const advisoryCanonical = ADVISORY_HTML_CANONICALS.get(tag);\n return advisoryCanonical ? { canonical: advisoryCanonical, tier: \"html-advisory\" } : null;\n}\n\nexport function resolveCanonicalForAriaRole(role: string): RawHtmlCanonicalMatch | null {\n const canonical = ROLE_CANONICALS.get(role.trim().toLowerCase());\n return canonical ? { canonical, tier: \"role-reimpl\" } : null;\n}\n\nexport function isRawHtmlAdvisoryTier(tier: RawHtmlPrecisionTier): boolean {\n return (\n tier === \"html-advisory\" ||\n tier === \"role-reimpl\" ||\n tier === \"interactive-nonsemantic\" ||\n tier === \"icon-only\"\n );\n}\n\n/**\n * Low-frequency, typically-1:1 semantic tags where a per-component inferred\n * `htmlEquivalent` mapping is safe even with a custom-named component\n * (`<dialog>` → Modal). Mirrors `ADVISORY_HTML_CANONICALS` + the `input` family.\n *\n * Deliberately EXCLUDES generic structural containers (`div`, `span`) and the\n * ambiguous common tags (`button`, `a`): those are handled by the stricter\n * agreement check in `isEnforceableHtmlEquivalent`.\n */\nconst SEMANTIC_HTML_EQUIVALENT_TAGS = new Set<string>([\n \"input\",\n \"textarea\",\n \"select\",\n \"dialog\",\n \"progress\",\n \"details\",\n \"table\",\n]);\n\n/**\n * Specific interactive tags that an EXPLICITLY-DECLARED project mapping may\n * enforce against ANY canonical component NAME — making the rule component-\n * library agnostic (so `@acme/ui`'s `AcmeButton` fires on a raw `<button>`, not\n * only the curated built-in \"Button\").\n *\n * Deliberately EXCLUDES generic structural containers (`div`, `span`): even an\n * explicit declaration must never turn every `<div>` into a bespoke\n * re-implementation. The `explicit` gate only applies to user-declared tag\n * mappings (provenance: `localCanonical.resolves`), never to inferred\n * `htmlEquivalent`s — so the `<button>` → Chip flood class stays name-gated.\n */\nconst EXPLICITLY_ENFORCEABLE_AMBIGUOUS_TAGS = new Set<string>([\"button\", \"a\"]);\n\n/**\n * Decide whether a per-component `htmlEquivalent` mapping (raw `tag` → a\n * `canonical` component) may drive a bare-tag canonical-usage finding.\n *\n * The contract:\n * - Low-frequency SEMANTIC tags (dialog, select, textarea, input, …) are always\n * enforceable, so a custom-named component (`<dialog>` → Modal) still maps.\n * - Common/ambiguous tags (button, a, …) enforce ONLY when the mapping AGREES\n * with the framework's curated canonical for that tag — so `<button>` → Button\n * fires, but `<button>` → Chip does not.\n * - Generic structural containers (div, span) have no curated answer and are not\n * semantic → never enforce.\n *\n * This is the guard that stops the canonical-usage flood: a library component\n * being built on a `<div>` must not make every `<div>` a bespoke re-implementation\n * of it (every `<div>` → Accordion, every `<span>` → Badge, every `<button>` → Chip).\n */\nexport function isEnforceableHtmlEquivalent(args: {\n tag: string;\n canonical: string;\n inputType?: string;\n /**\n * The mapping is an EXPLICIT project declaration of this tag → component\n * (provenance: `localCanonical.resolves`), not a low-confidence inferred\n * `htmlEquivalent`. Explicit declarations enforce a specific interactive tag\n * (`button`/`a`) against any canonical NAME — the agnosticism path — while\n * inferred mappings stay name-gated to the curated canonical (the flood\n * guard). Generic containers (`div`/`span`) are never enforceable even when\n * explicit.\n */\n explicit?: boolean;\n}): boolean {\n const tag = args.tag.toLowerCase();\n if (SEMANTIC_HTML_EQUIVALENT_TAGS.has(tag)) return true;\n if (args.explicit && EXPLICITLY_ENFORCEABLE_AMBIGUOUS_TAGS.has(tag)) return true;\n const builtIn = resolveCanonicalForRawHtml(tag, args.inputType);\n return builtIn !== null && builtIn.canonical === args.canonical;\n}\n","import type { CanonicalSource, GovernanceSeverity } from \"../governance.js\";\nimport type {\n FactId,\n FactIndex,\n UsageImportFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n UsageTextChildFact,\n} from \"../facts/index.js\";\nimport {\n isEnforceableHtmlEquivalent,\n isRawHtmlAdvisoryTier,\n resolveCanonicalForAriaRole,\n resolveCanonicalForRawHtml,\n type RawHtmlPrecisionTier,\n} from \"../raw-html-canonical.js\";\nimport { ownedImportMatchesRoot, ownedImportsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexPropsByNodeId, indexTextChildrenByNodeId } from \"./utils.js\";\n\nexport const RULE_ID = \"components/prefer-library\";\nexport const RULE_VERSION = \"1\";\n\ninterface CanonicalMappingOption {\n name: string;\n /** Internal conform-boundary assertion; only the conform policy builder sets it. */\n conformStatus?: \"confirmed\";\n canonical?: string;\n htmlEquivalent?: string;\n /**\n * ARIA role of the canonical primitive this mapping points at (e.g. `status`\n * for Toast, `alert` for Alert). Lets the rule key on element *semantics*\n * rather than the raw tag name, so a bespoke `<div role=\"status\">` re-impl is\n * flagged structurally — not just literal tag/import matches.\n */\n ariaRole?: string;\n /**\n * Intrinsic input `type` of the canonical primitive this mapping points at\n * (e.g. `checkbox` for Checkbox, `radio` for RadioGroup). Only meaningful when\n * `htmlEquivalent === \"input\"`: it discriminates one raw `<input>` from\n * another so a library can map `<input type=\"checkbox\">` → Checkbox and\n * `<input type=\"radio\">` → RadioGroup independently. Unset → matches any\n * `<input>` regardless of type (backward-compatible tag-level match).\n */\n htmlType?: string;\n importPath?: string;\n propMapping?: Array<{\n rawProp: string;\n canonicalProp: string;\n valueMap?: Record<string, string>;\n }>;\n confidence?: number;\n /**\n * The `htmlEquivalent` was EXPLICITLY declared by the project (provenance:\n * `localCanonical.resolves`), not inferred. Lets the enforceability gate fire\n * a specific interactive tag (button/a) against any canonical NAME — the\n * library-agnostic path — without re-opening the inferred-htmlEquivalent flood.\n */\n declaredHtmlEquivalent?: boolean;\n}\n\nfunction isExplicitTagDeclaration(mapping: CanonicalMappingOption): boolean {\n return mapping.declaredHtmlEquivalent === true;\n}\n\n/** Advisory findings never exceed `warn`, whatever the project configured. */\nfunction capAdvisorySeverity(configured: GovernanceSeverity | undefined): GovernanceSeverity {\n const base = configured ?? \"warn\";\n return base === \"error\" ? \"warn\" : base;\n}\n\n/**\n * Advisory-precision matches (role-reimpl, interactive-nonsemantic, html-advisory,\n * icon-only) are lower-confidence and never carry a deterministic fix, so they must\n * never hard-block a write or hard-fail CI. Cap their severity at `warn` even when a\n * project raises `components/prefer-library` to `error` — only the confident\n * exact-html / input-type tiers inherit the escalated severity. (The blocking hook's\n * `isDenyEligible` also refuses to deny `attributes.advisory` findings; this keeps\n * the CI severity honest to the same confidence line.)\n */\nfunction severityForTier(\n configured: GovernanceSeverity | undefined,\n tier: RawHtmlPrecisionTier\n): GovernanceSeverity {\n return isRawHtmlAdvisoryTier(tier) ? capAdvisorySeverity(configured) : (configured ?? \"warn\");\n}\n\n/**\n * Generic structural / typography / primitive class names that routinely appear\n * as plain layout classes even in fully-canonical codebases. Even when one equals\n * a canonical component name (Box, Grid, Stack, List, Text…), a `<div class=\"box\">`\n * is almost never a hand-rolled component — so they are excluded from the\n * className-reimplementation heuristic to keep it low-noise. Distinctive component\n * names (card, badge, alert, dialog, tooltip, drawer, accordion, chip…) are NOT\n * listed here, so they still flag.\n */\nconst GENERIC_CLASSNAME_DENYLIST: ReadonlySet<string> = new Set([\n \"box\",\n \"grid\",\n \"stack\",\n \"row\",\n \"col\",\n \"cols\",\n \"column\",\n \"columns\",\n \"flex\",\n \"wrap\",\n \"wrapper\",\n \"container\",\n \"content\",\n \"inner\",\n \"outer\",\n \"main\",\n \"root\",\n \"layout\",\n \"panel\",\n \"group\",\n \"area\",\n \"block\",\n \"section\",\n \"item\",\n \"items\",\n \"entry\",\n \"list\",\n \"header\",\n \"heading\",\n \"footer\",\n \"nav\",\n \"navbar\",\n \"bar\",\n \"toolbar\",\n \"sidebar\",\n \"aside\",\n \"body\",\n \"cell\",\n \"title\",\n \"subtitle\",\n \"label\",\n \"caption\",\n \"text\",\n \"copy\",\n \"icon\",\n \"img\",\n \"image\",\n \"media\",\n \"link\",\n \"links\",\n \"button\",\n \"btn\",\n \"input\",\n \"field\",\n \"fields\",\n \"form\",\n \"control\",\n \"controls\",\n \"menu\",\n \"dropdown\",\n \"table\",\n \"page\",\n \"view\",\n \"screen\",\n \"overlay\",\n \"backdrop\",\n \"spacer\",\n \"divider\",\n \"separator\",\n \"line\",\n \"dot\",\n \"tabs\",\n]);\n\ninterface ReimplTarget {\n name: string;\n import?: string;\n}\n\n/** lowercased class token → the canonical component it likely reimplements. */\nfunction canonicalReimplTargets(\n sources: readonly CanonicalSource[],\n mappings: readonly CanonicalMappingOption[]\n): Map<string, ReimplTarget> {\n const out = new Map<string, ReimplTarget>();\n const add = (name: string | undefined, importPath: string | undefined) => {\n if (!name || !isIdentifier(name)) return;\n const key = name.toLowerCase();\n if (GENERIC_CLASSNAME_DENYLIST.has(key) || out.has(key)) return;\n out.set(key, { name, ...(importPath ? { import: importPath } : {}) });\n };\n for (const mapping of mappings) add(mapping.name, mapping.importPath);\n for (const source of sources) {\n const label = sourceLabel(source);\n for (const name of source.include ?? []) add(name, label);\n }\n return out;\n}\n\n/** The CSS-module member of a `styles.card` / `styles[\"card\"]` snippet, or null. */\nfunction classMemberFromSnippet(snippet: string): string | null {\n const bracket = /\\[\\s*[\"'`]([A-Za-z0-9_-]+)[\"'`]\\s*\\]\\s*$/.exec(snippet);\n if (bracket) return bracket[1];\n const dot = /\\.([A-Za-z_$][\\w$]*)\\s*$/.exec(snippet);\n return dot ? dot[1] : null;\n}\n\n/** Candidate class-name tokens per node: literal classes + resolvable module members. */\nfunction indexClassTokensByNode(ix: FactIndex): Map<string, string[]> {\n const out = new Map<string, string[]>();\n const push = (nodeId: string, token: string | null) => {\n if (!token) return;\n const list = out.get(nodeId);\n if (list) list.push(token);\n else out.set(nodeId, [token]);\n };\n for (const fact of ix.byKind(\"classname_literal\")) {\n for (const cls of fact.classes) push(fact.nodeId, cls);\n }\n for (const fact of ix.byKind(\"classname_dynamic\")) {\n // Only the `styles.card` identifier form yields a clean member name; clsx()/\n // template/spread forms are too fuzzy to key a suggestion on.\n if (fact.reason !== \"identifier\") continue;\n push(fact.nodeId, classMemberFromSnippet(fact.snippet));\n }\n return out;\n}\n\ninterface ClassNameReimplMatch {\n canonical: string;\n matchedClass: string;\n import?: string;\n}\n\nfunction findClassNameReimpl(\n node: UsageNodeFact,\n classTokensByNode: Map<string, string[]>,\n targets: Map<string, ReimplTarget>\n): ClassNameReimplMatch | null {\n const tokens = classTokensByNode.get(node.id);\n if (!tokens) return null;\n for (const token of tokens) {\n const target = targets.get(token.toLowerCase());\n if (target) {\n return {\n canonical: target.name,\n matchedClass: token,\n ...(target.import ? { import: target.import } : {}),\n };\n }\n }\n return null;\n}\n\nexport function ruleComponentsPreferLibrary(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n const sources = canonicalSourcesFromPolicy(policy.options?.canonicalSources);\n const mappings = canonicalMappingsFromPolicy(policy.options?.canonicalMappings);\n if (sources.length === 0 && mappings.length === 0) return [];\n\n const importsByFileAndLocal = indexImportsByFileAndLocal(ix);\n const propsByNode = indexPropsByNodeId(ix);\n const textByNode = indexTextChildrenByNodeId(ix);\n const classTokensByNode = indexClassTokensByNode(ix);\n const reimplTargets = canonicalReimplTargets(sources, mappings);\n // #9e — nodes whose local import a Node-side module resolver already proved\n // resolves INSIDE a directory canonical source (the extractor emitted a\n // `usage_component` whose id points at that directory). These are the genuine\n // canonical primitives imported by a relative/`@/` path; a browser-safe string\n // comparison of the raw specifier could never recognize them, so the resolved\n // fact is the identity of record. Never flag them as import impostors.\n const canonicalDirectoryResolvedNodes = indexCanonicalDirectoryResolvedNodes(ix, sources);\n const findings: Finding[] = [];\n const seenImportFixes = new Set<string>();\n\n for (const node of ix.byKind(\"usage_node\")) {\n if (isCanonicalSourceImplementationFile(node.file, sources)) continue;\n if (node.element.includes(\".\")) continue;\n if (canonicalDirectoryResolvedNodes.has(node.id)) continue;\n const props = propsByNode.get(node.id) ?? [];\n const textChildren = textByNode.get(node.id) ?? [];\n const importsForFile = importsByFileAndLocal.get(node.file);\n const imported = importsForFile?.get(node.element);\n const nodeInputType =\n node.element === \"input\" ? readStaticStringProp(props, \"type\") : undefined;\n const mapped = findMapping(node, nodeInputType, mappings);\n if (mapped && imported && isMappedCanonicalImport(imported, mapped)) continue;\n if (imported && isCanonicalImport(imported, node.element, sources)) continue;\n\n if (mapped) {\n if (!shouldSuggestMapped(node, nodeInputType, imported, mapped)) continue;\n const importPath = mapped.importPath;\n const suggestedComponent = mapped.name;\n const suggestedImport = importPath ?? \"the canonical library\";\n const propMapping = mapped.propMapping ?? [];\n const propCompatibility = assessMappedPropCompatibility(props, propMapping);\n const roleMatch = isRoleMatch(node, mapped);\n const precisionTier: RawHtmlPrecisionTier = roleMatch ? \"role-reimpl\" : \"exact-html\";\n\n if (\n imported &&\n importPath &&\n !ownedImportsEqual(imported.source, importPath) &&\n node.element === suggestedComponent\n ) {\n // A same-name package import is not proof that the package implements\n // our canonical primitive. For example, TanStack Router's `Link` and a\n // design-system `Link` share a local JSX name but have different\n // contracts. Only an unaliased local import is a useful guided\n // candidate; package migrations need an explicit import policy.\n if (!isLocalExactComponentImportRedirectCandidate(imported, suggestedComponent)) continue;\n const key = `${imported.file}\\0${imported.local}\\0${imported.source}\\0${importPath}`;\n if (seenImportFixes.has(key)) continue;\n seenImportFixes.add(key);\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element}> may need to import from ${importPath}; verify that the local component contract is compatible first.`,\n location: imported.location,\n evidence: ix.evidence([node.id, imported.id, policy.id]),\n fingerprintIdentity: {\n file: imported.file,\n local: imported.local,\n from: imported.source,\n to: importPath,\n },\n fix: {\n kind: \"replaceImport\",\n title: `Replace import path with \"${importPath}\"`,\n from: imported.source,\n to: importPath,\n deterministic: false,\n },\n attributes: {\n rawValue: imported.source,\n suggestedComponent,\n suggestedImport: importPath,\n canonical: mapped.canonical,\n confidence: mapped.confidence,\n advisory: true,\n contractProof: \"missing\",\n },\n })\n );\n continue;\n }\n\n // No-op guard: the element already IS the suggested canonical (any\n // wrong-import-path fix was handled just above). \"Replace <X> with <X>\"\n // is not drift — skip it. This kills the icon self-mappings\n // (e.g. <GitBranch> → <GitBranch>) that floated up as noise.\n if (node.element === suggestedComponent) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: severityForTier(policy.severity, precisionTier),\n message:\n node.element === \"button\"\n ? `Bespoke <button> has a library equivalent. Swap to <${suggestedComponent}> from ${suggestedImport}.`\n : roleMatch\n ? `Custom <${node.element} role=\"${node.role}\"> reimplements a primitive. Use <${suggestedComponent}> from ${suggestedImport}.`\n : `Bespoke <${node.element}> should use <${suggestedComponent}> from ${suggestedImport}.`,\n location: node.location,\n evidence: ix.evidence(\n imported ? [node.id, imported.id, policy.id] : [node.id, policy.id]\n ),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent,\n suggestedImport,\n },\n ...(!isRawHtmlAdvisoryTier(precisionTier) &&\n isIdentifier(node.element) &&\n isIdentifier(suggestedComponent)\n ? {\n fix: {\n kind: \"replaceComponent\" as const,\n title: `Replace <${node.element}> with <${suggestedComponent}>`,\n from: node.element,\n to: suggestedComponent,\n // The fact IR cannot prove that it observed every JSX\n // attribute shape (notably dynamic inline styles). The\n // conform AST preflight may promote this guided fix only\n // after it proves the complete prop surface directly.\n deterministic: false,\n },\n }\n : {}),\n attributes: {\n rawValue: node.element,\n suggestedComponent,\n suggestedImport,\n canonical: mapped.canonical,\n confidence: mapped.confidence,\n propMapping,\n propCompatibility: propCompatibility.complete ? \"observed-complete\" : \"incomplete\",\n ...(mapped.conformStatus === \"confirmed\" ? { canonicalMappingConfirmed: true } : {}),\n ...(propCompatibility.unprovenProps.length > 0\n ? { unprovenProps: propCompatibility.unprovenProps }\n : {}),\n precisionTier,\n ...(roleMatch ? { matchedRole: node.role } : {}),\n ...(isRawHtmlAdvisoryTier(precisionTier) ? { advisory: true } : {}),\n },\n })\n );\n continue;\n }\n\n // #2 — className reimplementation heuristic (advisory-only). A plain\n // <div>/<span> with no ARIA role and no handler whose class name matches a\n // canonical component name is very likely a hand-rolled reimplementation\n // (`<div className={styles.card}>` for a Card). class-name↔component is a\n // naming-intent signal, not structural proof — so this is advisory, capped at\n // warn, carries no auto-fix, and never blocks a write (see emit-gate). DOG-03\n // backlog: deterministic canonical-shell signatures may promote proven matches.\n if (\n (node.element === \"div\" || node.element === \"span\") &&\n node.role === undefined &&\n node.interactive !== true &&\n !hasEventHandler(props)\n ) {\n const reimpl = findClassNameReimpl(node, classTokensByNode, reimplTargets);\n if (reimpl) {\n const suggestedImport = reimpl.import ?? \"the canonical library\";\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element} class=\"${reimpl.matchedClass}\"> looks like a hand-rolled <${reimpl.canonical}>. Use <${reimpl.canonical}> from ${suggestedImport} instead of restyling a <${node.element}>.`,\n location: node.location,\n evidence: ix.evidence([node.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent: reimpl.canonical,\n matchedClass: reimpl.matchedClass,\n },\n attributes: {\n rawValue: node.element,\n suggestedComponent: reimpl.canonical,\n ...(reimpl.import ? { suggestedImport: reimpl.import } : {}),\n precisionTier: \"classname-reimpl\",\n matchedClass: reimpl.matchedClass,\n advisory: true,\n },\n })\n );\n continue;\n }\n }\n\n const builtIn = findBuiltInRawHtmlMatch(node, props, textChildren, nodeInputType);\n const suggestedComponent =\n builtIn?.canonical ?? (node.element === \"button\" ? \"Button\" : node.element);\n const suggestion = findSuggestionSource(suggestedComponent, sources);\n if (!suggestion) continue;\n if (!builtIn && !shouldSuggest(node, imported)) continue;\n\n // An exact component-name match is either already canonical (handled near\n // the top of the loop), a safely redirectable local component import, or an\n // unrelated component that happens to share a name. Never report a\n // replaceComponent X -> X no-op, and never infer that one package's `Link`\n // is interchangeable with another package's `Link`.\n if (node.element === suggestedComponent) {\n const importPath = canonicalImportPath(suggestion);\n if (\n !imported ||\n !importPath ||\n !isLocalExactComponentImportRedirectCandidate(imported, suggestedComponent)\n ) {\n continue;\n }\n const key = `${imported.file}\\0${imported.local}\\0${imported.source}\\0${importPath}`;\n if (seenImportFixes.has(key)) continue;\n seenImportFixes.add(key);\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: capAdvisorySeverity(policy.severity),\n message: `<${node.element}> may need to import from ${importPath}; verify that the local component contract is compatible first.`,\n location: imported.location,\n evidence: ix.evidence([node.id, imported.id, policy.id]),\n fingerprintIdentity: {\n file: imported.file,\n local: imported.local,\n from: imported.source,\n to: importPath,\n },\n fix: {\n kind: \"replaceImport\",\n title: `Replace import path with \"${importPath}\"`,\n from: imported.source,\n to: importPath,\n deterministic: false,\n },\n attributes: {\n rawValue: imported.source,\n suggestedComponent,\n suggestedImport: importPath,\n suggestedImportSourceKind: suggestion.kind,\n advisory: true,\n contractProof: \"missing\",\n },\n })\n );\n continue;\n }\n // Directory canonical sources are typically derived without an `include`\n // filter (cloud pushes `{ kind: \"directory\", path }` for every component\n // folder), so `sourceIncludesComponent` matches EVERY name. Without the same\n // guards #224 added to the mapped path, that turns every imported component\n // — Phosphor icons included — into a no-op `<X> → <X>` finding, and lets a\n // non-enforceable raw-tag match (`<button>` → a non-Button canonical) slip\n // through. Hold the directory path to the semantic-only contract:\n // (i) never a no-op (element already IS the suggestion),\n // (ii) only raw lowercase HTML tags are targets (an already-capitalized\n // component is not a prefer-library candidate for a directory source),\n // (iii) only when the raw tag → canonical mapping is enforceable\n // (isEnforceableHtmlEquivalent) — so `<button>` → Button fires but a\n // disagreeing `<button>` → Chip does not.\n // npm/registry sources are curated (specifier + usual include lists) and keep\n // their import-redirect behavior, so this gate is directory-scoped only.\n if (suggestion.kind === \"directory\") {\n if (node.element === suggestedComponent) continue;\n if (!builtIn) continue;\n if (isIdentifier(node.element) && /^[A-Z]/.test(node.element)) continue;\n if (\n !isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: suggestedComponent,\n inputType: nodeInputType,\n })\n ) {\n continue;\n }\n }\n const suggestedImport = sourceLabel(suggestion);\n const precisionTier = builtIn?.tier ?? \"exact-html\";\n const rawElement = formatRawElement(node, props);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: severityForTier(policy.severity, precisionTier),\n message: messageForBuiltInMatch({\n node,\n rawElement,\n suggestedComponent,\n suggestedImport,\n precisionTier,\n }),\n location: node.location,\n evidence: ix.evidence(imported ? [node.id, imported.id, policy.id] : [node.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n suggestedComponent,\n suggestedImport,\n },\n ...(!isRawHtmlAdvisoryTier(precisionTier) &&\n isIdentifier(node.element) &&\n isIdentifier(suggestedComponent)\n ? {\n fix: {\n kind: \"replaceComponent\" as const,\n title: `Replace ${rawElement} with <${suggestedComponent}>`,\n from: node.element,\n to: suggestedComponent,\n // A canonical source proves that the target exists, not that\n // this native element's complete prop contract is compatible.\n // Only explicit canonical mappings carry that proof.\n deterministic: false,\n },\n }\n : {}),\n attributes: {\n rawValue: node.element,\n suggestedComponent,\n suggestedImport,\n suggestedImportSourceKind: suggestion.kind,\n precisionTier,\n propCompatibility: \"unknown\",\n ...(builtIn?.matchedRole ? { matchedRole: builtIn.matchedRole } : {}),\n ...(builtIn?.inputType ? { matchedInputType: builtIn.inputType } : {}),\n ...(isRawHtmlAdvisoryTier(precisionTier) ? { advisory: true } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\ninterface BuiltInRawHtmlMatch {\n canonical: string;\n tier: RawHtmlPrecisionTier;\n matchedRole?: string;\n inputType?: string;\n}\n\nfunction findBuiltInRawHtmlMatch(\n node: UsageNodeFact,\n props: readonly UsagePropResolvedFact[],\n textChildren: readonly UsageTextChildFact[],\n inputType: string | undefined\n): BuiltInRawHtmlMatch | null {\n if (isIconOnlyButton(node, props, textChildren)) {\n return { canonical: \"IconButton\", tier: \"icon-only\" };\n }\n\n const rawMatch = resolveCanonicalForRawHtml(node.element, inputType);\n if (rawMatch) {\n return {\n ...rawMatch,\n ...(inputType ? { inputType } : {}),\n };\n }\n\n if (node.role && isRoleReimplementationHost(node.element)) {\n const roleMatch = resolveCanonicalForAriaRole(node.role);\n if (roleMatch) {\n return {\n ...roleMatch,\n matchedRole: node.role,\n };\n }\n }\n\n if (\n (node.element === \"div\" || node.element === \"span\") &&\n node.role === undefined &&\n node.interactive === true &&\n hasEventHandler(props)\n ) {\n return { canonical: \"Button\", tier: \"interactive-nonsemantic\" };\n }\n\n return null;\n}\n\nfunction isIconOnlyButton(\n node: UsageNodeFact,\n props: readonly UsagePropResolvedFact[],\n textChildren: readonly UsageTextChildFact[]\n): boolean {\n if (node.element !== \"button\") return false;\n if (node.interactive !== true && !hasEventHandler(props)) return false;\n if (!hasExplicitAriaName(props)) return false;\n return !hasVisibleText(textChildren);\n}\n\nfunction isRoleReimplementationHost(element: string): boolean {\n return element === \"div\" || element === \"span\" || element === \"a\";\n}\n\nfunction hasEventHandler(props: readonly UsagePropResolvedFact[]): boolean {\n return props.some((prop) => /^on[A-Z]/.test(prop.prop));\n}\n\nfunction hasExplicitAriaName(props: readonly UsagePropResolvedFact[]): boolean {\n return props.some(\n (prop) =>\n (prop.prop === \"aria-label\" || prop.prop === \"aria-labelledby\") &&\n prop.resolution === \"static\" &&\n typeof prop.value === \"string\" &&\n prop.value.trim().length > 0\n );\n}\n\nfunction hasVisibleText(textChildren: readonly UsageTextChildFact[]): boolean {\n return textChildren.some((child) => child.text.trim().length > 0);\n}\n\nfunction readStaticStringProp(\n props: readonly UsagePropResolvedFact[],\n propName: string\n): string | undefined {\n const prop = props.find((candidate) => candidate.prop === propName);\n if (!prop || prop.resolution !== \"static\") return undefined;\n return typeof prop.value === \"string\" ? prop.value : undefined;\n}\n\nfunction formatRawElement(node: UsageNodeFact, props: readonly UsagePropResolvedFact[]): string {\n if (node.element === \"input\") {\n const inputType = readStaticStringProp(props, \"type\");\n if (inputType) return `<input type=\"${inputType}\">`;\n }\n if (node.role) return `<${node.element} role=\"${node.role}\">`;\n return `<${node.element}>`;\n}\n\nfunction messageForBuiltInMatch({\n node,\n rawElement,\n suggestedComponent,\n suggestedImport,\n precisionTier,\n}: {\n node: UsageNodeFact;\n rawElement: string;\n suggestedComponent: string;\n suggestedImport: string;\n precisionTier: RawHtmlPrecisionTier;\n}) {\n if (precisionTier === \"icon-only\") {\n return `Icon-only ${rawElement} should use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (precisionTier === \"role-reimpl\") {\n return `Custom ${rawElement} reimplements a primitive. Use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (precisionTier === \"interactive-nonsemantic\") {\n return `Interactive <${node.element}> reimplements a Button. Use <${suggestedComponent}> from ${suggestedImport}.`;\n }\n if (node.element === \"button\") {\n return `Bespoke <button> has a library equivalent. Swap to <Button> from ${suggestedImport}.`;\n }\n return `Bespoke ${rawElement} should use <${suggestedComponent}> from ${suggestedImport}.`;\n}\n\nfunction shouldSuggestMapped(\n node: UsageNodeFact,\n nodeInputType: string | undefined,\n imported: UsageImportFact | undefined,\n mapping: CanonicalMappingOption\n): boolean {\n if (\n sameHtmlTag(mapping.htmlEquivalent, node.element) &&\n // Enforceability is checked against `mapping.name` — the component this rule\n // actually EMITS as `suggestedComponent` — not `mapping.canonical`. For\n // ambiguous/common tags (button, a) `isEnforceableHtmlEquivalent` requires\n // agreement with the curated canonical, so a Chip whose `canonical: \"Button\"`\n // but `name: \"Chip\"` no longer leaks `suggestedComponent: \"Chip\"` while the\n // canonical reads \"Button\". `<button>` → Button (name === canonical) still\n // fires; semantic tags (textarea → Textarea) are unaffected (always\n // enforceable regardless of name).\n isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: mapping.name,\n inputType: nodeInputType,\n explicit: isExplicitTagDeclaration(mapping),\n })\n ) {\n return true;\n }\n if (node.role !== undefined && node.role === mapping.ariaRole) return true;\n // Only a literal use of the component's own NAME (e.g. <Modal> for name\n // \"Modal\") is a candidate here — resolved as an import-redirect / no-op by the\n // caller. We deliberately do NOT match on `mapping.canonical` (the vocabulary\n // id): when name === canonical this clause would be redundant (the htmlEquivalent\n // / name paths already cover it), and when they diverge (name \"Modal\", canonical\n // \"Dialog\") matching `<Dialog>` only ever produced a self-contradicting swap\n // (rawValue === canonical, suggestion is the renamed wrapper) and let any common\n // vocab id (Dialog/Tooltip/Card) hijack an unrelated third-party usage. Same\n // divergence principle as the button→Chip fix (#229) — audit #1/#2.\n if (node.element === mapping.name) {\n return imported !== undefined;\n }\n return false;\n}\n\nfunction shouldSuggest(node: UsageNodeFact, imported: UsageImportFact | undefined): boolean {\n if (node.element === \"button\") return true;\n if (!/^[A-Z]/.test(node.element)) return false;\n return imported !== undefined;\n}\n\ninterface PropCompatibilityAssessment {\n complete: boolean;\n unprovenProps: string[];\n}\n\n/**\n * Prove that every observed prop can survive the component replacement.\n *\n * An explicit pass-through (`rawProp === canonicalProp`) is proof too. Spreads,\n * missing entries, and value translations that cannot be applied exactly stay\n * unresolved: the canonical mapping proves the target component, but it does\n * not imply that the target forwards the native element's entire prop surface.\n */\nfunction assessMappedPropCompatibility(\n props: readonly UsagePropResolvedFact[],\n mappings: ReadonlyArray<NonNullable<CanonicalMappingOption[\"propMapping\"]>[number]>\n): PropCompatibilityAssessment {\n const byRawProp = new Map(mappings.map((mapping) => [mapping.rawProp, mapping]));\n const unprovenProps = props.flatMap((prop) => {\n if (prop.resolution === \"spread\") return [prop.prop];\n const mapping = byRawProp.get(prop.prop);\n if (!mapping || !mappingCanPreserveProp(mapping, prop)) return [prop.prop];\n return [];\n });\n return { complete: unprovenProps.length === 0, unprovenProps };\n}\n\nfunction mappingCanPreserveProp(\n mapping: NonNullable<CanonicalMappingOption[\"propMapping\"]>[number],\n prop: UsagePropResolvedFact\n): boolean {\n const renames = mapping.rawProp !== mapping.canonicalProp;\n const valueMap = mapping.valueMap;\n const translatesValue = valueMap !== undefined && Object.keys(valueMap).length > 0;\n\n // The conform editor can only rename simple JSX identifiers. A pass-through\n // needs no edit and can therefore retain valid JSX names such as aria-label.\n if (renames && (!isIdentifier(mapping.rawProp) || !isIdentifier(mapping.canonicalProp))) {\n return false;\n }\n if (!translatesValue) return true;\n if (!isIdentifier(mapping.rawProp)) return false;\n return (\n prop.resolution === \"static\" &&\n typeof prop.value === \"string\" &&\n Object.prototype.hasOwnProperty.call(valueMap, prop.value)\n );\n}\n\nfunction isLocalExactComponentImportRedirectCandidate(\n usage: UsageImportFact,\n componentName: string\n): boolean {\n return isUnaliasedNamedImport(usage, componentName) && isProjectLocalImportSource(usage.source);\n}\n\nfunction isUnaliasedNamedImport(usage: UsageImportFact, componentName: string): boolean {\n return isSimpleComponentBinding(usage, componentName) && usage.imported === componentName;\n}\n\nfunction isSimpleComponentBinding(usage: UsageImportFact, componentName: string): boolean {\n return usage.namespace !== true && usage.local === componentName;\n}\n\nfunction isProjectLocalImportSource(source: string): boolean {\n return (\n source.startsWith(\".\") ||\n source.startsWith(\"/\") ||\n source.startsWith(\"@/\") ||\n source.startsWith(\"~/\")\n );\n}\n\n/**\n * Case-INSENSITIVE equality for the `htmlEquivalent` ↔ raw-tag comparison.\n * Raw HTML tag names are case-insensitive, but a catalog/author can store a\n * mis-cased `htmlEquivalent` (\"Button\", \"INPUT\"). The enforceability gate\n * already lowercases internally, but the OUTER comparison gated whether the\n * gate ran at all — so a mis-cased equivalent silently made a valid mapping\n * inert (audit #29). Component NAME matches stay case-sensitive; only the\n * raw-tag side is normalized here.\n */\nfunction sameHtmlTag(htmlEquivalent: string | undefined, element: string): boolean {\n return htmlEquivalent !== undefined && htmlEquivalent.toLowerCase() === element.toLowerCase();\n}\n\nfunction indexImportsByFileAndLocal(ix: FactIndex): Map<string, Map<string, UsageImportFact>> {\n const out = new Map<string, Map<string, UsageImportFact>>();\n for (const usage of ix.byKind(\"usage_import\")) {\n const importsForFile = out.get(usage.file) ?? new Map<string, UsageImportFact>();\n importsForFile.set(usage.local, usage);\n out.set(usage.file, importsForFile);\n }\n return out;\n}\n\nfunction canonicalSourcesFromPolicy(value: unknown): CanonicalSource[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCanonicalSource);\n}\n\nfunction canonicalMappingsFromPolicy(value: unknown): CanonicalMappingOption[] {\n if (!Array.isArray(value)) return [];\n return value.filter(isCanonicalMappingOption);\n}\n\nfunction isCanonicalMappingOption(value: unknown): value is CanonicalMappingOption {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n if (typeof record.name !== \"string\" || !isIdentifier(record.name)) return false;\n if (record.canonical !== undefined && typeof record.canonical !== \"string\") return false;\n if (record.htmlEquivalent !== undefined && typeof record.htmlEquivalent !== \"string\") {\n return false;\n }\n if (record.ariaRole !== undefined && typeof record.ariaRole !== \"string\") return false;\n if (record.htmlType !== undefined && typeof record.htmlType !== \"string\") return false;\n if (record.importPath !== undefined && typeof record.importPath !== \"string\") return false;\n if (record.confidence !== undefined && typeof record.confidence !== \"number\") return false;\n if (record.conformStatus !== undefined && record.conformStatus !== \"confirmed\") return false;\n if (\n record.declaredHtmlEquivalent !== undefined &&\n typeof record.declaredHtmlEquivalent !== \"boolean\"\n ) {\n return false;\n }\n if (record.propMapping !== undefined) {\n if (!Array.isArray(record.propMapping)) return false;\n if (!record.propMapping.every(isPropMappingOption)) return false;\n }\n return true;\n}\n\nfunction isPropMappingOption(\n value: unknown\n): value is NonNullable<CanonicalMappingOption[\"propMapping\"]>[number] {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const record = value as Record<string, unknown>;\n return (\n typeof record.rawProp === \"string\" &&\n typeof record.canonicalProp === \"string\" &&\n (record.valueMap === undefined || isStringRecord(record.valueMap))\n );\n}\n\nfunction isStringRecord(value: unknown): value is Record<string, string> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n return Object.values(value as Record<string, unknown>).every(\n (entry) => typeof entry === \"string\"\n );\n}\n\nfunction isCanonicalSource(value: unknown): value is CanonicalSource {\n if (!value || typeof value !== \"object\") return false;\n const record = value as Record<string, unknown>;\n if (!hasValidComponentList(record.include)) return false;\n if (!hasValidComponentList(record.exclude)) return false;\n if (record.implementationPath !== undefined && typeof record.implementationPath !== \"string\") {\n return false;\n }\n if (record.kind === \"npm\") return typeof record.specifier === \"string\";\n if (record.kind === \"directory\") return typeof record.path === \"string\";\n if (record.kind === \"registry\") {\n return typeof record.registryId === \"string\" && typeof record.installPath === \"string\";\n }\n return false;\n}\n\nfunction hasValidComponentList(value: unknown): boolean {\n return (\n value === undefined || (Array.isArray(value) && value.every((item) => typeof item === \"string\"))\n );\n}\n\nfunction findMapping(\n node: UsageNodeFact,\n nodeInputType: string | undefined,\n mappings: readonly CanonicalMappingOption[]\n): CanonicalMappingOption | undefined {\n // A type-specific input mapping wins over a generic tag-level one, so a\n // library mapping `<input type=\"checkbox\">` → Checkbox is never shadowed by a\n // catch-all `<input>` → TextField entry. Normalized to lower-case to mirror\n // the resolved `type` prop value the extractor records.\n if (node.element === \"input\" && nodeInputType) {\n const typed = mappings.find(\n (mapping) =>\n sameHtmlTag(mapping.htmlEquivalent, \"input\") &&\n mapping.htmlType !== undefined &&\n mapping.htmlType.toLowerCase() === nodeInputType.toLowerCase()\n );\n if (typed) return typed;\n }\n\n return mappings.find((mapping) => {\n if (\n sameHtmlTag(mapping.htmlEquivalent, node.element) &&\n // Match enforceability against the EMITTED `mapping.name` (see\n // shouldSuggestMapped): for ambiguous tags this requires the suggested\n // component to BE the tag's curated canonical, so a disagreeing\n // `<button>` → Chip mapping never matches in the first place.\n isEnforceableHtmlEquivalent({\n tag: node.element,\n canonical: mapping.name,\n inputType: nodeInputType,\n explicit: isExplicitTagDeclaration(mapping),\n })\n ) {\n // A type-constrained mapping only matches the matching input type; an\n // unconstrained one matches any element with that tag (back-compat).\n // Gated so an inferred `div`/`span` primitive (or a `button` → specialized\n // component) never blanket-flags every container — see\n // isEnforceableHtmlEquivalent.\n return mapping.htmlType === undefined || matchesInputType(mapping, nodeInputType);\n }\n if (mapping.name === node.element) return true;\n // Deliberately NOT matching on `mapping.canonical` (the vocabulary id): see\n // shouldSuggestMapped. Selecting a mapping purely because the element name\n // equals a canonical vocab id (Dialog/Tooltip/Card…) produced divergent swaps\n // and cross-mapping hijacking (audit #1/#2). A real name match (above), an\n // enforceable htmlEquivalent (above), or an ARIA-role match (below) remain.\n // Semantic match: a bespoke element whose declared ARIA role equals the\n // canonical primitive's role (e.g. `<div role=\"status\">` → Toast). Keyed on\n // normalized `usage_node.role`, so it is framework-agnostic.\n return node.role !== undefined && mapping.ariaRole === node.role;\n });\n}\n\nfunction matchesInputType(\n mapping: CanonicalMappingOption,\n nodeInputType: string | undefined\n): boolean {\n if (mapping.htmlType === undefined) return true;\n if (nodeInputType === undefined) return false;\n return mapping.htmlType.toLowerCase() === nodeInputType.toLowerCase();\n}\n\n/** True when `mapped` was selected for `node` purely on an ARIA-role match. */\nfunction isRoleMatch(node: UsageNodeFact, mapping: CanonicalMappingOption): boolean {\n return (\n node.role !== undefined &&\n node.role === mapping.ariaRole &&\n node.element !== mapping.htmlEquivalent &&\n node.element !== mapping.name &&\n node.element !== mapping.canonical\n );\n}\n\nfunction isMappedCanonicalImport(usage: UsageImportFact, mapping: CanonicalMappingOption): boolean {\n return Boolean(mapping.importPath && ownedImportsEqual(usage.source, mapping.importPath));\n}\n\nfunction isCanonicalImport(\n usage: UsageImportFact,\n componentName: string,\n sources: readonly CanonicalSource[]\n): boolean {\n return sources.some((source) => {\n if (!sourceIncludesComponent(source, componentName)) return false;\n if (source.exclude?.includes(componentName)) return false;\n if (source.kind === \"npm\") {\n return ownedImportMatchesRoot(usage.source, source.specifier);\n }\n if (source.kind === \"registry\") {\n if (!source.importPath) return false;\n return ownedImportMatchesRoot(usage.source, source.importPath);\n }\n return normalizePath(usage.source).startsWith(normalizePath(source.path));\n });\n}\n\nfunction findSuggestionSource(\n componentName: string,\n sources: readonly CanonicalSource[]\n): CanonicalSource | undefined {\n return sources.find(\n (source) =>\n sourceIncludesComponent(source, componentName) && !source.exclude?.includes(componentName)\n );\n}\n\nfunction sourceIncludesComponent(source: CanonicalSource, componentName: string): boolean {\n if (source.include) return source.include.includes(componentName);\n // Package-like canonical sources must be backed by an explicit export\n // inventory before they can suggest arbitrary component names. Without this,\n // a bare `{ kind: \"npm\", specifier: \"@acme/ui\" }` treats every imported\n // PascalCase symbol as canonical and emits self-referential/noisy swaps.\n if (source.kind === \"npm\" || source.kind === \"registry\") return false;\n return true;\n}\n\nfunction sourceLabel(source: CanonicalSource): string {\n if (source.kind === \"npm\") return source.specifier;\n if (source.kind === \"registry\") return source.importPath ?? source.installPath;\n return source.path;\n}\n\nfunction canonicalImportPath(source: CanonicalSource): string | undefined {\n if (source.kind === \"npm\") return source.specifier;\n if (source.kind === \"registry\") return source.importPath;\n // #9e — a directory canonical source *does* have a redirect target: its own\n // directory path. Returning it lets the import-identity branch point a local\n // impostor (`<Button>` from `../features/FakeButton`) back at the canonical\n // directory instead of `continue`-ing to zero findings. Gate on an explicit\n // include list: without curated NAMES, `sourceIncludesComponent` matches every\n // PascalCase import, so a redirect target here would blanket-flag them all\n // (#224). Include-less directory sources keep the old no-target behavior.\n return source.include?.length ? source.path : undefined;\n}\n\n/**\n * #9e — index the `usage_node` ids whose import a Node-side module resolver\n * proved resolves INSIDE a directory canonical source. The scan orchestrator's\n * `resolveComponentId` seam emits a `usage_component` fact for such imports with\n * a `<canonicalDirPath>#<Name>` component id; this recovers those node ids so the\n * rule can treat the genuine local canonical primitive as already-compliant.\n */\nfunction indexCanonicalDirectoryResolvedNodes(\n ix: FactIndex,\n sources: readonly CanonicalSource[]\n): Set<FactId> {\n const out = new Set<FactId>();\n const directoryPaths = sources\n .filter((source): source is Extract<CanonicalSource, { kind: \"directory\" }> =>\n source.kind === \"directory\"\n )\n .map((source) => normalizePath(source.path));\n if (directoryPaths.length === 0) return out;\n for (const fact of ix.byKind(\"usage_component\")) {\n const module = componentIdModule(fact.componentId);\n if (module === undefined) continue;\n const normalizedModule = normalizePath(module);\n if (directoryPaths.some((path) => isPathInSource(normalizedModule, path))) {\n out.add(fact.nodeId);\n }\n }\n return out;\n}\n\n/** Extract the module portion (`before#`) of a `module#Export` component id. */\nfunction componentIdModule(componentId: string): string | undefined {\n const hash = componentId.indexOf(\"#\");\n return hash > 0 ? componentId.slice(0, hash) : undefined;\n}\n\nfunction isCanonicalSourceImplementationFile(\n file: string,\n sources: readonly CanonicalSource[]\n): boolean {\n const normalizedFile = normalizePath(file);\n return sources.some((source) => {\n if (source.kind === \"npm\" && source.implementationPath) {\n return isPathInSource(normalizedFile, source.implementationPath);\n }\n if (source.kind === \"directory\") {\n return isPathInSource(normalizedFile, source.path);\n }\n if (source.kind === \"registry\") {\n return isPathInSource(normalizedFile, source.installPath);\n }\n return false;\n });\n}\n\nfunction isPathInSource(file: string, sourcePath: string): boolean {\n const normalizedSource = normalizePath(sourcePath).replace(/\\/$/, \"\");\n return file === normalizedSource || file.startsWith(`${normalizedSource}/`);\n}\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][\\w$]*$/.test(value);\n}\n","/**\n * `components/forbidden-prop-value` — fires when a JSX prop is assigned a\n * value that the component governance forbids. Path-scoped policies only\n * fire when the file matches the policy's path glob; unscoped policies fire\n * everywhere.\n *\n * Only static prop values are checked. Dynamic props (`variant={kind}`) and\n * spreads (`{...props}`) cannot be evaluated at scan time.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexComponentByNodeId, indexPropsByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"components/forbidden-prop-value\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleComponentsForbiddenPropValue(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution !== \"static\") continue;\n if (propUsage.value === undefined) continue;\n\n const matched = ix.policy.forbiddenPropValues(usageComponent.componentId, {\n prop: propUsage.prop,\n value: propUsage.value,\n path: node.file,\n });\n if (matched.length === 0) continue;\n\n const policy = matched[0];\n const replacement = policy.replaceWith;\n const fix =\n replacement !== undefined\n ? {\n kind: \"replacePropValue\" as const,\n title: `Replace ${propUsage.prop} with ${formatValue(replacement)}`,\n prop: propUsage.prop,\n value: replacement,\n deterministic: true,\n }\n : undefined;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: buildMessage(\n node.element,\n propUsage.prop,\n propUsage.value,\n policy.because,\n replacement\n ),\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n value: propUsage.value,\n },\n fix,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n rawValue: propUsage.value,\n suggestedValue: replacement,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n return String(value);\n}\n\nfunction buildMessage(\n element: string,\n prop: string,\n value: unknown,\n because: string,\n replacement: unknown\n): string {\n const head = `<${element}> ${prop}=${formatValue(value)} is forbidden.`;\n const reason = because ? ` ${because.trim()}` : \"\";\n const suggestion = replacement !== undefined ? ` Use ${formatValue(replacement)}.` : \"\";\n return `${head}${reason}${suggestion}`.trim();\n}\n","/**\n * `components/unknown-prop` — fires when JSX uses a prop that isn't in the\n * component's declared prop schema and the global `jsx.unknownProps.forbid`\n * policy is active. Universal React/DOM props (data-*, aria-*, on*, key, ref,\n * className, style, etc.) are exempt.\n *\n * The rule only fires for components we have prop metadata for. If the\n * component has no `prop_metadata` facts (e.g., third-party imports we don't\n * model yet), we cannot tell whether a prop is unknown and the rule stays\n * silent.\n */\n\nimport type { FactIndex, FactId } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n isUniversalJsxProp,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"components/unknown-prop\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleComponentsUnknownProp(ix: FactIndex): Finding[] {\n const policy = ix.policy.jsxUnknownPropsForbidden();\n if (!policy) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n\n const knownProps = ix.components.propsOf(usageComponent.componentId);\n if (knownProps.length === 0) continue;\n const knownNames = new Set(knownProps.map((p) => p.prop));\n\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution === \"spread\") continue;\n if (isUniversalJsxProp(propUsage.prop)) continue;\n if (knownNames.has(propUsage.prop)) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `Unknown prop \"${propUsage.prop}\" on <${node.element}>. Allowed props: ${formatPropList(knownNames)}.`,\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n } satisfies UnknownPropFingerprint,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\ninterface UnknownPropFingerprint {\n file: string;\n componentId: string;\n element: string;\n nodePath: string;\n prop: string;\n}\n\nfunction formatPropList(names: Set<string>): string {\n if (names.size === 0) return \"(none)\";\n const sorted = [...names].sort();\n if (sorted.length <= 6) return sorted.join(\", \");\n return `${sorted.slice(0, 6).join(\", \")}, …`;\n}\n\n// Re-exported for type-tests / tooling that wants to read the rule's id.\nexport type { FactId };\n","/**\n * `composition/cardinality` + `composition/co-occurrence` — region-scoped rules\n * over how components are arranged inside a container, not just per node.\n *\n * Both share the same region machinery: `regionsByPrefix` groups usage into\n * `(container, members)`; a `CompositionPattern` names the container (by\n * canonical `componentId`), a child `select`or, and a `constraint`. The config\n * rides in `governance_rule_config.options.patterns` — no new fact kind. Brief\n * 04 delivers that config from cloud policy / fragment prose; this brief drives\n * the rules from it directly.\n *\n * Static-resolution ceiling: a child is \"selected\" only when its prop resolves\n * statically to the configured value. A dynamic `variant={kind}` is unknown —\n * never a match, never treated as absent. Dynamic composition is the\n * render-time validator's job (doc 14), not this static rule's.\n *\n * Matching is on the resolved canonical component (its `componentId`), never the\n * raw `element` string — that is what makes the rule survive wrappers and\n * renames. A policy component ref may be fully qualified (`pkg#Name`) or a bare\n * name (the common authoring case); see `componentMatches`.\n */\n\nimport type {\n FactId,\n FactIndex,\n UsageComponentFact,\n UsageNodeFact,\n UsagePropResolvedFact,\n} from \"../facts/index.js\";\nimport type { GovernanceSeverity } from \"../governance.js\";\nimport { ownedComponentIdsEqual } from \"../package-identity-match.js\";\n\nimport {\n type CompositionChildSelector,\n type CompositionConstraint,\n type CompositionPattern,\n type CompositionRegionSelector,\n isCompositionPattern,\n} from \"./composition-pattern-schema.js\";\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n regionsByPrefix,\n type Region,\n} from \"./utils.js\";\n\nexport const CARDINALITY_RULE_ID = \"composition/cardinality\";\nexport const CO_OCCURRENCE_RULE_ID = \"composition/co-occurrence\";\nconst RULE_VERSION = \"1\";\n\n/** ≤ `max` / ≥ `min` of a selected child per matching region. */\nexport function ruleCompositionCardinality(ix: FactIndex): Finding[] {\n return evaluate(ix, CARDINALITY_RULE_ID, \"cardinality\");\n}\n\n/** A selected child requires a co-occurring sibling in the same region. */\nexport function ruleCompositionCoOccurrence(ix: FactIndex): Finding[] {\n return evaluate(ix, CO_OCCURRENCE_RULE_ID, \"co-occurrence\");\n}\n\ninterface EvalCtx {\n ix: FactIndex;\n ruleId: string;\n severity: GovernanceSeverity;\n componentByNode: Map<FactId, UsageComponentFact>;\n propsByNode: Map<FactId, UsagePropResolvedFact[]>;\n}\n\nfunction evaluate(ix: FactIndex, ruleId: string, kind: CompositionConstraint[\"kind\"]): Finding[] {\n const config = ix.policy.ruleConfig(ruleId);\n if (!config || !config.enabled) return [];\n const patterns = readPatterns(config.options);\n if (patterns.length === 0) return [];\n\n const ctx: EvalCtx = {\n ix,\n ruleId,\n severity: config.severity ?? \"warn\",\n componentByNode: indexComponentByNodeId(ix),\n propsByNode: indexPropsByNodeId(ix),\n };\n const regions = regionsByPrefix(ix);\n\n const findings: Finding[] = [];\n for (const pattern of patterns) {\n const constraint = pattern.constraint;\n if (constraint.kind !== kind) continue;\n for (const region of regions) {\n if (!regionMatches(region, pattern.region, ctx.componentByNode)) continue;\n const selected = region.members.filter((m) => memberMatches(m.id, pattern.select, ctx));\n const finding =\n constraint.kind === \"cardinality\"\n ? checkCardinality(ctx, region, pattern, constraint, selected)\n : checkCoOccurrence(ctx, region, pattern, constraint, selected);\n if (finding) findings.push(finding);\n }\n }\n return findings;\n}\n\nfunction readPatterns(options: Record<string, unknown> | undefined): CompositionPattern[] {\n const raw = options?.patterns;\n // Validate each pattern rather than trusting the shape: config arrives from\n // cloud policy / fragment prose (brief 04) and the facts layer passes\n // `options` through untyped, so a malformed entry would otherwise emit garbage\n // findings. A bad pattern is skipped and the rest keep scanning (architecture\n // failure mode); a non-array yields nothing.\n if (!Array.isArray(raw)) return [];\n return raw.filter(isCompositionPattern);\n}\n\nfunction regionMatches(\n region: Region,\n selector: CompositionRegionSelector,\n componentByNode: Map<FactId, UsageComponentFact>\n): boolean {\n // v0 matches the container by canonical componentId only. `marker`/`role` are\n // typed for brief 04 but unexercised by ACCEPTANCE §3–§8; a marker policy will\n // land with its own case (see brief 03 Deviations).\n if (!selector.component) return false;\n return componentMatches(\n componentByNode.get(region.container.id)?.componentId,\n selector.component\n );\n}\n\n/**\n * Match a usage node's resolved `componentId` against a policy component ref.\n * A ref may be fully qualified (`@scope/pkg#Name`) or a bare name (`Name`) — the\n * common authoring case (ACCEPTANCE §3 and the §10 fragment sugar both write\n * bare names). Matching the resolved componentId — not the raw JSX element —\n * survives import aliasing and wrapper renames.\n */\nfunction componentMatches(componentId: string | undefined, ref: string): boolean {\n if (componentId === undefined) return false;\n if (componentId === ref) return true;\n if (ref.includes(\"#\") && ownedComponentIdsEqual(componentId, ref)) return true;\n const hash = componentId.indexOf(\"#\");\n return hash !== -1 && componentId.slice(hash + 1) === ref;\n}\n\nfunction memberMatches(nodeId: FactId, select: CompositionChildSelector, ctx: EvalCtx): boolean {\n if (!componentMatches(ctx.componentByNode.get(nodeId)?.componentId, select.component))\n return false;\n if (select.prop === undefined) return true;\n // Static ceiling: only a statically-resolved matching prop counts. A dynamic\n // or spread prop is unknown — not a match (and not treated as absent).\n const props = ctx.propsByNode.get(nodeId) ?? [];\n return props.some((p) => {\n if (p.prop !== select.prop || p.resolution !== \"static\") return false;\n return select.value === undefined || p.value === select.value;\n });\n}\n\nfunction checkCardinality(\n ctx: EvalCtx,\n region: Region,\n pattern: CompositionPattern,\n constraint: { kind: \"cardinality\"; max?: number; min?: number },\n selected: UsageNodeFact[]\n): Finding | null {\n const count = selected.length;\n if (constraint.max !== undefined && count > constraint.max) {\n const extras = selected.slice(constraint.max); // the (max+1)th and later\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: cardinalityMaxMessage(pattern, constraint.max, count),\n location: extras[0].location,\n evidence: ctx.ix.evidence([region.container.id, ...extras.map((e) => e.id)]),\n fingerprintIdentity: cardinalityFingerprint(region, pattern, \"max\"),\n });\n }\n if (constraint.min !== undefined && count < constraint.min) {\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: cardinalityMinMessage(pattern, constraint.min, count),\n location: region.container.location,\n evidence: ctx.ix.evidence([region.container.id, ...selected.map((s) => s.id)]),\n fingerprintIdentity: cardinalityFingerprint(region, pattern, \"min\"),\n });\n }\n return null;\n}\n\nfunction checkCoOccurrence(\n ctx: EvalCtx,\n region: Region,\n pattern: CompositionPattern,\n constraint: { kind: \"co-occurrence\"; requires: { prop: string; value: string } },\n selected: UsageNodeFact[]\n): Finding | null {\n if (selected.length === 0) return null; // nothing triggers the requirement\n const requiredSelect: CompositionChildSelector = {\n component: pattern.select.component,\n prop: constraint.requires.prop,\n value: constraint.requires.value,\n };\n const satisfied = region.members.some((m) => memberMatches(m.id, requiredSelect, ctx));\n if (satisfied) return null;\n return makeFinding({\n ruleId: ctx.ruleId,\n ruleVersion: RULE_VERSION,\n severity: ctx.severity,\n message: coOccurrenceMessage(pattern, constraint),\n location: region.container.location,\n evidence: ctx.ix.evidence([region.container.id, ...selected.map((s) => s.id)]),\n fingerprintIdentity: {\n kind: \"co-occurrence\",\n file: region.container.file,\n container: region.container.nodePath,\n region: pattern.region.component,\n requires: `${constraint.requires.prop}=${constraint.requires.value}`,\n },\n });\n}\n\nfunction cardinalityFingerprint(\n region: Region,\n pattern: CompositionPattern,\n bound: \"max\" | \"min\"\n): Record<string, unknown> {\n return {\n kind: \"cardinality\",\n bound,\n file: region.container.file,\n container: region.container.nodePath,\n region: pattern.region.component,\n select: `${pattern.select.prop ?? \"\"}=${pattern.select.value ?? \"\"}`,\n };\n}\n\nfunction childLabel(select: CompositionChildSelector, plural: boolean): string {\n const base = select.value ? `${select.value} ${select.component}` : select.component;\n return plural ? `${base}s` : base;\n}\n\n/** The human-facing region name; falls back to a generic word when unnamed. */\nfunction regionLabel(pattern: CompositionPattern): string {\n return pattern.region.component ?? \"region\";\n}\n\nfunction cardinalityMaxMessage(pattern: CompositionPattern, max: number, count: number): string {\n const region = regionLabel(pattern);\n const limit = max === 1 ? \"one\" : String(max);\n const label = childLabel(pattern.select, max !== 1);\n const verb = max === 1 ? \"is\" : \"are\";\n return `At most ${limit} ${label} ${verb} allowed per ${region} (found ${count}).`;\n}\n\nfunction cardinalityMinMessage(pattern: CompositionPattern, min: number, count: number): string {\n const region = regionLabel(pattern);\n const label = childLabel(pattern.select, min !== 1);\n const verb = min === 1 ? \"is\" : \"are\";\n return `At least ${min} ${label} ${verb} required per ${region} (found ${count}).`;\n}\n\nfunction coOccurrenceMessage(\n pattern: CompositionPattern,\n constraint: { requires: { value: string } }\n): string {\n const region = regionLabel(pattern);\n const selectLabel = childLabel(pattern.select, false);\n const requiresLabel = `${constraint.requires.value} ${pattern.select.component}`;\n return `A ${region} with a ${selectLabel} should also contain a ${requiresLabel}.`;\n}\n","import type { FactIndex } from \"../facts/index.js\";\nimport { ownedComponentIdsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { indexComponentByNodeId, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"components/preferred-component\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleJsxPreferredComponent(ix: FactIndex): Finding[] {\n const policies = ix.policy.jsxComponentPreferred();\n if (policies.length === 0) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n\n for (const [nodeId, usageComponent] of componentByNode) {\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n if (node.element.includes(\".\")) continue;\n\n for (const policy of policies) {\n if (!ownedComponentIdsEqual(usageComponent.componentId, policy.from)) continue;\n\n const replacement = componentNameFromId(policy.to);\n if (!replacement) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `<${node.element}> should use <${replacement}>.`,\n location: node.location,\n evidence: ix.evidence([node.id, usageComponent.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n nodePath: node.nodePath,\n from: policy.from,\n to: policy.to,\n },\n fix: {\n kind: \"replaceComponent\",\n title: policy.because ?? `Replace <${node.element}> with <${replacement}>`,\n from: node.element,\n to: replacement,\n deterministic: true,\n },\n attributes: {\n componentId: usageComponent.componentId,\n rawValue: node.element,\n suggestedComponent: replacement,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction componentNameFromId(componentId: string): string | undefined {\n const hash = componentId.lastIndexOf(\"#\");\n const name = hash >= 0 ? componentId.slice(hash + 1) : componentId;\n if (!/^[A-Za-z_$][\\w$]*$/.test(name)) return undefined;\n return name;\n}\n","import type { FactIndex } from \"../facts/index.js\";\nimport { ownedImportsEqual } from \"../package-identity-match.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\n\nexport const RULE_ID = \"imports/preferred-path\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleJsxPreferredImportPath(ix: FactIndex): Finding[] {\n const policies = ix.policy.jsxImportPathPreferred();\n if (policies.length === 0) return [];\n\n const findings: Finding[] = [];\n const seen = new Set<string>();\n\n for (const usage of ix.byKind(\"usage_import\")) {\n const matches = policies.filter((policy) => {\n if (!ownedImportsEqual(policy.from, usage.source)) return false;\n if (policy.imported !== undefined && policy.imported !== usage.imported) return false;\n return true;\n });\n\n for (const policy of matches) {\n if (ownedImportsEqual(usage.source, policy.to)) continue;\n const importedIdentity = policy.imported ?? \"*\";\n const key = `${policy.id}\\0${usage.file}\\0${usage.source}\\0${usage.location.line}\\0${usage.location.column}\\0${importedIdentity}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `Import from \"${usage.source}\" should use \"${policy.to}\".`,\n location: usage.location,\n evidence: ix.evidence([usage.id, policy.id]),\n fingerprintIdentity: {\n file: usage.file,\n from: usage.source,\n to: policy.to,\n imported: policy.imported,\n line: usage.location.line,\n column: usage.location.column,\n },\n fix: {\n kind: \"replaceImport\",\n title: policy.because ?? `Replace import path with \"${policy.to}\"`,\n from: usage.source,\n to: policy.to,\n deterministic: true,\n },\n attributes: {\n importPath: usage.source,\n suggestedImport: policy.to,\n imported: usage.imported,\n local: usage.local,\n rawValue: usage.source,\n },\n })\n );\n }\n }\n\n return findings;\n}\n","/**\n * `props/invalid-value` — fires when a JSX prop is statically assigned a\n * value outside the component's declared enum values.\n *\n * The rule is intentionally conservative: it only runs for exact static\n * prop values and prop metadata that declares an allowed values list.\n * Dynamic expressions, spreads, JSX values, and open-ended prop schemas stay\n * silent so the scanner does not turn weak metadata into false certainty.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n indexPropsByNodeId,\n isUniversalJsxProp,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"props/invalid-value\";\nexport const RULE_VERSION = \"1\";\n\nexport function rulePropsInvalidValue(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const findings: Finding[] = [];\n const componentByNode = indexComponentByNodeId(ix);\n const propsByNode = indexPropsByNodeId(ix);\n\n for (const [nodeId, propUsages] of propsByNode) {\n const usageComponent = componentByNode.get(nodeId);\n if (!usageComponent) continue;\n const node = readUsageNode(ix, nodeId);\n if (!node) continue;\n\n for (const propUsage of propUsages) {\n if (propUsage.resolution !== \"static\") continue;\n if (propUsage.value === undefined) continue;\n if (isUniversalJsxProp(propUsage.prop)) continue;\n\n const metadata = ix.components.propOf(usageComponent.componentId, propUsage.prop);\n if (!metadata?.values?.length) continue;\n const allowedValues = metadata.values;\n\n const rawValue = toComparableValue(propUsage.value);\n if (rawValue === null) continue;\n if (allowedValues.includes(rawValue)) continue;\n\n const fix =\n allowedValues.length === 1\n ? {\n kind: \"replacePropValue\" as const,\n title: `Replace ${propUsage.prop} with ${formatValue(allowedValues[0])}`,\n prop: propUsage.prop,\n value: allowedValues[0],\n deterministic: true,\n }\n : undefined;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: buildMessage(node.element, propUsage.prop, propUsage.value, allowedValues),\n location: propUsage.location ?? node.location,\n evidence: ix.evidence([node.id, usageComponent.id, propUsage.id, metadata.id, policy.id]),\n fingerprintIdentity: {\n file: node.file,\n componentId: usageComponent.componentId,\n element: node.element,\n nodePath: node.nodePath,\n prop: propUsage.prop,\n value: propUsage.value,\n },\n fix,\n attributes: {\n componentId: usageComponent.componentId,\n prop: propUsage.prop,\n rawValue: propUsage.value,\n allowedValues,\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction toComparableValue(value: unknown): string | null {\n if (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value === null) return \"null\";\n return null;\n}\n\nfunction formatValue(value: unknown): string {\n if (typeof value === \"string\") return `\"${value}\"`;\n return String(value);\n}\n\nfunction buildMessage(\n element: string,\n prop: string,\n value: unknown,\n allowedValues: readonly string[]\n): string {\n const allowed = allowedValues.map(formatValue).join(\", \");\n return `<${element}> ${prop}=${formatValue(value)} is not an allowed value. Allowed values: ${allowed}.`;\n}\n","/**\n * Color parsing + perceptual distance for nearest-token suggestions.\n *\n * Every supported notation normalizes to 8-bit sRGB before comparison, so a\n * raw `#7c3acc` can match a token authored as `oklch(0.54 0.2 295)` and vice\n * versa. Only fully-opaque colors parse — a nearest suggestion that changes\n * opacity is worse than no suggestion. Unsupported notations (named colors,\n * lab/lch, color()) return null and simply get no nearest hint.\n */\n\nexport interface Rgb {\n r: number;\n g: number;\n b: number;\n}\n\n/** Parse a fully-opaque CSS color literal (hex, rgb/rgba, hsl/hsla, oklch) to sRGB. */\nexport function parseOpaqueColor(value: string): Rgb | null {\n const lower = value.trim().toLowerCase();\n return (\n parseHex(lower) ?? parseRgbFunction(lower) ?? parseHslFunction(lower) ?? parseOklch(lower)\n );\n}\n\n/**\n * Redmean — a cheap perceptually-weighted RGB distance (range 0–~765).\n * Good enough to separate \"same color family, different shade\" from\n * \"different hue\" without a full CIE pipeline.\n */\nexport function colorDistance(a: Rgb, b: Rgb): number {\n const rMean = (a.r + b.r) / 2;\n const dr = a.r - b.r;\n const dg = a.g - b.g;\n const db = a.b - b.b;\n return Math.sqrt(\n (2 + rMean / 256) * dr * dr + 4 * dg * dg + (2 + (255 - rMean) / 256) * db * db\n );\n}\n\nfunction parseHex(lower: string): Rgb | null {\n const hex = /^#([0-9a-f]{3,8})$/.exec(lower)?.[1];\n if (!hex) return null;\n if (hex.length === 3 || hex.length === 4) {\n if (hex.length === 4 && hex[3] !== \"f\") return null;\n return {\n r: parseInt(hex[0] + hex[0], 16),\n g: parseInt(hex[1] + hex[1], 16),\n b: parseInt(hex[2] + hex[2], 16),\n };\n }\n if (hex.length === 6 || hex.length === 8) {\n if (hex.length === 8 && hex.slice(6) !== \"ff\") return null;\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n return null;\n}\n\n/** A number with an optional `%` or `deg` suffix, used by every function notation. */\nconst COMPONENT = String.raw`[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:%|deg)?`;\n\n/**\n * Split a CSS color function's arguments, accepting both legacy comma syntax\n * (`rgb(1, 2, 3)`, `rgba(1, 2, 3, 1)`) and modern space syntax with an\n * optional `/ alpha` (`rgb(1 2 3 / 1)`). Returns the channel components plus\n * the alpha component (null when omitted).\n */\nfunction splitColorArgs(\n lower: string,\n fn: string\n): { components: string[]; alpha: string | null } | null {\n const match = new RegExp(`^${fn}a?\\\\(([^)]+)\\\\)$`).exec(lower);\n if (!match) return null;\n const body = match[1].trim();\n\n let channelPart = body;\n let alpha: string | null = null;\n if (body.includes(\"/\")) {\n const [channels, alphaPart, ...rest] = body.split(\"/\");\n if (rest.length > 0) return null;\n channelPart = channels.trim();\n alpha = alphaPart.trim();\n }\n\n const components = channelPart.includes(\",\")\n ? channelPart.split(\",\").map((part) => part.trim())\n : channelPart.split(/\\s+/);\n if (alpha === null && components.length === 4) {\n alpha = components.pop() ?? null;\n }\n if (components.length !== 3) return null;\n if (!components.every((part) => new RegExp(`^${COMPONENT}$`).test(part))) return null;\n if (alpha !== null && !new RegExp(`^${COMPONENT}$`).test(alpha)) return null;\n return { components, alpha };\n}\n\n/** True when an alpha component is omitted or fully opaque (`1`, `1.0`, `100%`). */\nfunction isOpaqueAlpha(alpha: string | null): boolean {\n if (alpha === null) return true;\n const value = alpha.endsWith(\"%\") ? Number(alpha.slice(0, -1)) / 100 : Number(alpha);\n return value === 1;\n}\n\nfunction numberOrPercent(part: string, percentScale: number): number {\n return part.endsWith(\"%\") ? (Number(part.slice(0, -1)) / 100) * percentScale : Number(part);\n}\n\nfunction clampByte(value: number): number {\n return Math.min(255, Math.max(0, Math.round(value)));\n}\n\nfunction parseRgbFunction(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"rgb\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const [r, g, b] = args.components.map((part) => numberOrPercent(part, 255));\n if ([r, g, b].some((channel) => Number.isNaN(channel) || channel < 0 || channel > 255)) {\n return null;\n }\n return { r: Math.round(r), g: Math.round(g), b: Math.round(b) };\n}\n\nfunction parseHslFunction(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"hsl\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const h = Number(args.components[0].replace(/deg$/, \"\"));\n const s = numberOrPercent(args.components[1], 1);\n const l = numberOrPercent(args.components[2], 1);\n if ([h, s, l].some(Number.isNaN) || s < 0 || s > 1 || l < 0 || l > 1) return null;\n\n const hue = ((h % 360) + 360) % 360;\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((hue / 60) % 2) - 1));\n const m = l - c / 2;\n const sector = Math.floor(hue / 60);\n const [r1, g1, b1] = [\n [c, x, 0],\n [x, c, 0],\n [0, c, x],\n [0, x, c],\n [x, 0, c],\n [c, 0, x],\n ][sector] ?? [0, 0, 0];\n return {\n r: clampByte((r1 + m) * 255),\n g: clampByte((g1 + m) * 255),\n b: clampByte((b1 + m) * 255),\n };\n}\n\n/**\n * oklch(L C H [/ alpha]) → sRGB via OKLab. L accepts 0–1 or a percentage; C\n * accepts a number or a percentage of 0.4 (per spec); H is degrees. Out-of-gamut\n * results clamp to sRGB — fine for nearness, which only needs \"is this the same\n * color family\", not colorimetric fidelity.\n */\nfunction parseOklch(lower: string): Rgb | null {\n const args = splitColorArgs(lower, \"oklch\");\n if (!args || !isOpaqueAlpha(args.alpha)) return null;\n const l = numberOrPercent(args.components[0], 1);\n const c = numberOrPercent(args.components[1], 0.4);\n const h = Number(args.components[2].replace(/deg$/, \"\"));\n if ([l, c, h].some(Number.isNaN) || l < 0 || l > 1 || c < 0) return null;\n\n const hRad = (h * Math.PI) / 180;\n const labA = c * Math.cos(hRad);\n const labB = c * Math.sin(hRad);\n\n const l_ = l + 0.3963377774 * labA + 0.2158037573 * labB;\n const m_ = l - 0.1055613458 * labA - 0.0638541728 * labB;\n const s_ = l - 0.0894841775 * labA - 1.291485548 * labB;\n const lc = l_ * l_ * l_;\n const mc = m_ * m_ * m_;\n const sc = s_ * s_ * s_;\n\n const linearR = 4.0767416621 * lc - 3.3077115913 * mc + 0.2309699292 * sc;\n const linearG = -1.2684380046 * lc + 2.6097574011 * mc - 0.3413193965 * sc;\n const linearB = -0.0041960863 * lc - 0.7034186147 * mc + 1.707614701 * sc;\n\n return {\n r: clampByte(srgbGamma(linearR) * 255),\n g: clampByte(srgbGamma(linearG) * 255),\n b: clampByte(srgbGamma(linearB) * 255),\n };\n}\n\nfunction srgbGamma(linear: number): number {\n const clamped = Math.min(1, Math.max(0, linear));\n return clamped <= 0.0031308 ? 12.92 * clamped : 1.055 * Math.pow(clamped, 1 / 2.4) - 0.055;\n}\n","/**\n * `styles/no-raw-color` — fires when a color-bearing CSS declaration or JSX\n * inline style uses a raw color literal (hex, rgb/rgba, hsl/hsla, named) and\n * the global `style.rawColors.forbid` policy is active. Token references\n * (`var(--...)`) and policy-supplied exemptions (`transparent`, etc.) pass.\n *\n * The rule looks at any `style_declaration` or `usage_inline_style` whose\n * value contains a recognizable color literal, not just declarations whose\n * property name suggests a color — backgrounds use `background:` shorthand,\n * borders use `border-color:`, and SVG uses `fill:`/`stroke:`. Detecting on\n * the *value* keeps the rule property-agnostic.\n */\n\nimport type { FactIndex, TokenDefinitionFact } from \"../facts/index.js\";\n\nimport { colorDistance, parseOpaqueColor } from \"./color-math.js\";\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceStyleValueFix } from \"./types.js\";\nimport {\n detectRawColor,\n emitFix,\n indexComponentByNodeId,\n isExemptColor,\n readUsageNode,\n tokenReference,\n type FixEmission,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-color\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleStylesNoRawColor(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawColorPolicy();\n if (!policy) return [];\n\n const colorTokens = ix.tokens.byCategory(\"color\");\n const preferLabel = policy.prefer === \"token\" ? \"design token\" : \"CSS variable\";\n const findings: Finding[] = [];\n\n // Newly-broadened detections (SVG paint attributes, runtime-constructed\n // colors) ship advisory this release so CI gates do not harden on findings\n // teams have not yet had a chance to triage. Existing passes keep the\n // configured severity.\n const advisorySeverity = policy.severity === \"error\" ? \"warn\" : policy.severity;\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (decl.property.startsWith(\"--\") && decl.declaredTokenSource === true) continue;\n const color = detectRawColor(decl.value);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const resolution = resolveColorToken(decl.property, color, colorTokens);\n const fixEmission =\n resolution?.kind === \"exact\"\n ? buildTokenFix(decl.property, decl.value, color, resolution, ix)\n : undefined;\n const evidenceIds = resolution\n ? [decl.id, policy.id, resolution.token.id]\n : [decl.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: colorMessage(color, `\\`${decl.property}\\``, resolution, preferLabel),\n location: decl.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: color,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n color,\n source: \"css\",\n suggestedToken: resolution?.token.name,\n ...(resolution ? { tokenMatch: resolution.kind } : {}),\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n // #11b — a runtime-constructed color (`` `#${red}` ``, `\"rgb(\" + r + …`).\n // The extractor already proved the static fragments begin a color literal,\n // so surface it detect-only: the value is partly runtime, so it never\n // carries a deterministic fix and cannot resolve to a token.\n if (inline.valueKind === \"dynamic-raw\") {\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const evidenceIds = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id]\n : [node.id, inline.id, policy.id];\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: advisorySeverity,\n message: `Runtime-constructed raw color \\`${inline.value}\\` on inline \\`${inline.property}\\`. Use a ${preferLabel} instead.`,\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style_dynamic\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n source: \"jsx\",\n dynamic: true,\n },\n })\n );\n continue;\n }\n if (inline.valueKind === \"css-variable\") continue;\n const color = detectRawColor(inline.value);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const resolution = resolveColorToken(inline.property, color, colorTokens);\n const fixEmission =\n resolution?.kind === \"exact\"\n ? buildTokenFix(inline.property, inline.value, color, resolution, ix)\n : undefined;\n const baseEvidence = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id]\n : [node.id, inline.id, policy.id];\n const evidenceIds = resolution ? [...baseEvidence, resolution.token.id] : baseEvidence;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: colorMessage(color, `inline \\`${inline.property}\\``, resolution, preferLabel),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: color,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n color,\n source: \"jsx\",\n suggestedToken: resolution?.token.name,\n ...(resolution ? { tokenMatch: resolution.kind } : {}),\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n // #9d — SVG presentation attributes carry color in JSX markup, not CSS, so\n // they arrive as `usage_prop_resolved` facts the two passes above never read.\n // Scan a fixed paint-attribute allowlist for static raw colors. Data-URI\n // colors (hex inside an encoded `url(\"data:…\")`) are intentionally left out.\n for (const prop of ix.byKind(\"usage_prop_resolved\")) {\n if (prop.resolution !== \"static\") continue;\n if (typeof prop.value !== \"string\") continue;\n if (!SVG_PAINT_ATTRS.has(prop.prop)) continue;\n const color = detectRawColor(prop.value);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const node = readUsageNode(ix, prop.nodeId);\n if (!node) continue;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const cssProperty = SVG_PAINT_CSS_PROPERTY[prop.prop] ?? prop.prop;\n const resolution = resolveColorToken(cssProperty, color, colorTokens);\n const fixEmission =\n resolution?.kind === \"exact\"\n ? buildTokenFix(cssProperty, prop.value, color, resolution, ix)\n : undefined;\n const baseEvidence = componentEvidenceId\n ? [node.id, componentEvidenceId, prop.id, policy.id]\n : [node.id, prop.id, policy.id];\n const evidenceIds = resolution ? [...baseEvidence, resolution.token.id] : baseEvidence;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: advisorySeverity,\n message: colorMessage(color, `\\`${prop.prop}\\``, resolution, preferLabel),\n location: prop.location ?? node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_prop_resolved\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: prop.prop,\n value: color,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: prop.prop,\n rawValue: prop.value,\n color,\n source: \"jsx\",\n suggestedToken: resolution?.token.name,\n ...(resolution ? { tokenMatch: resolution.kind } : {}),\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\n/**\n * SVG presentation attributes that carry a paint (color) value in JSX markup.\n * Both the raw-SVG kebab spelling and React's camelCase normalization are\n * listed so `stop-color` and `stopColor` both resolve.\n */\nconst SVG_PAINT_ATTRS = new Set([\n \"fill\",\n \"stroke\",\n \"color\",\n \"stop-color\",\n \"stopColor\",\n \"flood-color\",\n \"floodColor\",\n \"lighting-color\",\n \"lightingColor\",\n]);\n\n/** Map camelCase paint attributes to their CSS property name so the token\n * role-resolver (`colorRoleForProperty`) reasons over a canonical spelling. */\nconst SVG_PAINT_CSS_PROPERTY: Record<string, string> = {\n stopColor: \"stop-color\",\n floodColor: \"flood-color\",\n lightingColor: \"lighting-color\",\n};\n\ninterface TokenMatch {\n token: TokenDefinitionFact;\n /** True when several tokens share the value and none matches the property's\n * role — the swap is a guess, so the fix must not be applied automatically. */\n ambiguous: boolean;\n}\n\n/**\n * How a raw color resolves against the project's tokens (mirrors the\n * `styles/no-raw-dimensions` resolution semantics):\n * - `exact` — value-identical token; deterministic fix unless role-ambiguous.\n * - `nearest` — no token has this exact value, but one is perceptually close\n * (an off-by-a-shade `#7c3acc` next to a `#7c3aed` accent token). Surfaced as\n * a `suggestedToken` hint on the message + attribute with NO fix object:\n * snapping changes the rendered color, and the conform engine auto-applies\n * token-backed fixes, so attaching one would silently rewrite the value.\n */\ntype ColorResolution =\n | { kind: \"exact\"; token: TokenDefinitionFact; ambiguous: boolean }\n | { kind: \"nearest\"; token: TokenDefinitionFact };\n\nfunction resolveColorToken(\n property: string,\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): ColorResolution | null {\n const exact = findTokenMatch(property, raw, tokens);\n if (exact) return { kind: \"exact\", token: exact.token, ambiguous: exact.ambiguous };\n const nearest = findNearestColorToken(raw, tokens);\n return nearest ? { kind: \"nearest\", token: nearest } : null;\n}\n\nfunction colorMessage(\n color: string,\n propertyLabel: string,\n resolution: ColorResolution | null,\n preferLabel: string\n): string {\n if (resolution?.kind === \"nearest\") {\n return `Raw color ${color} on ${propertyLabel}. Closest token is \\`${resolution.token.name}\\` (${String(resolution.token.value)}); use a ${preferLabel} instead.`;\n }\n return `Raw color ${color} on ${propertyLabel}. Use a ${preferLabel} instead.`;\n}\n\n/**\n * Redmean-weighted RGB distance cutoff for a \"nearest\" suggestion. Redmean\n * ranges 0–~765; ~60 keeps suggestions within the same visual family (an\n * off-by-one-shade brand color) while never bridging genuinely different hues.\n * Both sides parse through `parseOpaqueColor` (hex, rgb/rgba, hsl/hsla,\n * oklch), so the raw value and the token may be authored in different\n * notations and still match.\n */\nconst NEAREST_COLOR_MAX_DISTANCE = 60;\n\nfunction findNearestColorToken(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenDefinitionFact | null {\n const target = parseOpaqueColor(raw);\n if (!target) return null;\n\n let best: TokenDefinitionFact | null = null;\n let bestDistance = Infinity;\n for (const token of tokens) {\n if (typeof token.value !== \"string\") continue;\n const candidate = parseOpaqueColor(token.value);\n if (!candidate) continue;\n const distance = colorDistance(target, candidate);\n // Strict `<` plus stable iteration keeps the pick deterministic on ties.\n if (distance < bestDistance) {\n best = token;\n bestDistance = distance;\n }\n }\n return bestDistance <= NEAREST_COLOR_MAX_DISTANCE ? best : null;\n}\n\n/**\n * Find a color token whose value matches the offending raw color exactly.\n * Comparison is normalized — short hex (`#abc`) is expanded to full hex\n * (`#aabbcc`) so `#fff` and `#ffffff` collapse to the same key.\n *\n * When multiple tokens share the value (e.g. `--color-bg` and `--color-on-x`\n * both `#ffffff`), prefer the one whose name matches the declaration's semantic\n * role (`color:` → foreground, `background:` → surface, `border:` → border) so\n * a foreground color is never auto-rewritten to a background token. If no token\n * matches the role, the swap is flagged ambiguous and emitted as a non-applied\n * suggestion rather than a deterministic fix.\n */\nfunction findTokenMatch(\n property: string,\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenMatch | null {\n const target = normalizeColor(raw);\n const matches = tokens.filter((token) => normalizeColor(token.value) === target);\n if (matches.length === 0) return null;\n\n const role = colorRoleForProperty(property);\n\n if (matches.length === 1) {\n // A single value-match is safe to apply automatically *unless* the token's\n // own name signals a role that contradicts the property — e.g. a background\n // token (`--color-bg`) swapped into `color:` would make text track the page\n // surface and disappear on dark themes. In that case suggest, never apply.\n const conflicts = role ? tokenRoleConflicts(matches[0].name, role) : false;\n return { token: matches[0], ambiguous: conflicts };\n }\n\n const roleMatch = role\n ? matches.find((token) => tokenNameMatchesRole(token.name, role))\n : undefined;\n if (roleMatch) return { token: roleMatch, ambiguous: false };\n return { token: matches[0], ambiguous: true };\n}\n\n/**\n * True when a token's name matches a color role *other than* the property's and\n * not the property's own role — applying it would cross semantic roles (the\n * white-text → background-token trap). Role-neutral names (e.g.\n * `--color-brand-500`) never conflict, so a brand color used as text still gets\n * a deterministic swap.\n */\nfunction tokenRoleConflicts(name: string, role: ColorRole): boolean {\n if (tokenNameMatchesRole(name, role)) return false;\n const others: ColorRole[] = ([\"fg\", \"bg\", \"border\"] as ColorRole[]).filter((r) => r !== role);\n return others.some((other) => tokenNameMatchesRole(name, other));\n}\n\ntype ColorRole = \"fg\" | \"bg\" | \"border\";\n\nfunction colorRoleForProperty(property: string): ColorRole | null {\n const p = property.toLowerCase();\n if (p === \"color\" || p === \"fill\" || p === \"stroke\" || p.endsWith(\"text-color\")) return \"fg\";\n if (p === \"background\" || p.startsWith(\"background\") || p === \"fill\") return \"bg\";\n if (p.startsWith(\"border\") || p.startsWith(\"outline\") || p === \"box-shadow\") return \"border\";\n return null;\n}\n\nfunction tokenNameMatchesRole(name: string, role: ColorRole): boolean {\n const n = name.toLowerCase();\n if (role === \"fg\")\n return /\\b(text|fg|foreground|content|ink|on-|label)\\b|text|foreground/.test(n);\n if (role === \"bg\")\n return /\\b(bg|background|surface|fill|elevated|canvas)\\b|background|surface/.test(n);\n return /\\b(border|outline|stroke|divider|ring)\\b|border|outline/.test(n);\n}\n\nfunction normalizeColor(value: string): string {\n const lower = value.trim().toLowerCase();\n const hex = /^#([0-9a-f]{3})$/.exec(lower);\n if (hex) {\n const [r, g, b] = hex[1];\n return `#${r}${r}${g}${g}${b}${b}`;\n }\n const hex4 = /^#([0-9a-f]{4})$/.exec(lower);\n if (hex4) {\n const [r, g, b, a] = hex4[1];\n return `#${r}${r}${g}${g}${b}${b}${a}${a}`;\n }\n return lower;\n}\n\nfunction buildTokenFix(\n property: string,\n rawValue: string,\n rawColor: string,\n match: TokenMatch,\n ix: FactIndex\n): FixEmission<FindingReplaceStyleValueFix> {\n const reference = tokenReference(match.token.name);\n const value = replaceRawColor(rawValue, rawColor, reference);\n return emitFix(\n {\n kind: \"replaceStyleValue\",\n title: `Replace ${property} with ${value}`,\n property,\n value,\n deterministic: true,\n },\n {\n symbols: [match.token.name],\n editKind: \"replaceStyleValue\",\n valuePreserving: !match.ambiguous,\n },\n ix\n );\n}\n\nfunction replaceRawColor(rawValue: string, rawColor: string, replacement: string): string {\n if (rawValue === rawColor) return replacement;\n if (rawValue.includes(rawColor)) return rawValue.replace(rawColor, replacement);\n\n const pattern = new RegExp(escapeRegExp(rawColor), \"i\");\n return rawValue.replace(pattern, replacement);\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/**\n * `styles/no-raw-dimensions` — fires when a length-bearing CSS declaration or\n * JSX inline style uses a raw dimension literal (`16px`, `1rem`, …) on a\n * property covered by the global `style.rawDimensions.forbid` policy.\n *\n * Suggestion strength is tiered, mirroring `styles/no-raw-spacing`:\n *\n * - **exact token match** — the raw value EXACTLY equals a tenant dimension\n * token of the same unit (units are never cross-converted — matching `1rem`\n * to a `16px` token would assume a root font size we cannot guarantee). Emits\n * a value-preserving, deterministic `var(--token)` fix.\n * - **off-scale single value** — `border-radius: 10px` when the tenant has no\n * `10px` token. Names the NEAREST token of the same unit via `suggestedToken`\n * and the message, but attaches NO fix — snapping changes the rendered value,\n * so it must stay a suggestion the author confirms, never an auto-rewrite.\n * Same-unit only: a `px` value never snaps to a `rem` token, keeping the\n * suggestion free of an assumed root-font-size.\n * - **no nearby token** (or a multi-value shorthand off-scale) — flagged with no\n * fix and no suggestion, leaving the choice to the author.\n *\n * Nearest snapping adds NO new findings and changes NO rendered values: an\n * off-scale dimension already fires under this policy; the snap only enriches\n * that finding with a `suggestedToken` hint.\n *\n * The policy is intentionally opt-in (no preset enables it): a plain\n * `fragments govern scan` never flags raw dimensions. Only callers that supply\n * a `style.rawDimensions.forbid` record (e.g. the conform tool) activate it.\n */\n\nimport type { FactId, FactIndex, TokenDefinitionFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceStyleValueFix } from \"./types.js\";\nimport {\n emitFix,\n indexComponentByNodeId,\n parseLengthValue,\n readUsageNode,\n type FixEmission,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-dimensions\";\nexport const RULE_VERSION = \"1\";\n\ninterface DimensionFixMatch {\n tokens: TokenDefinitionFact[];\n fixValue: string;\n suggestedToken: string;\n}\n\n/**\n * How a raw dimension resolves against the tenant's tokens:\n * - `exact` — value-preserving token swap (deterministic, auto-applicable fix)\n * - `nearest` — closest same-unit token, surfaced as a `suggestedToken` hint with\n * NO fix object: snapping changes the rendered value, and the conform engine\n * auto-applies any token-backed `replaceStyleValue` fix, so attaching one would\n * silently rewrite the value. The suggestion rides on the message + attribute.\n * - `raw` — flagged, but no token to suggest (no fix)\n */\ntype DimensionResolution =\n | { kind: \"exact\"; tokens: TokenDefinitionFact[]; fixValue: string; suggestedToken: string }\n | { kind: \"nearest\"; token: TokenDefinitionFact; suggestedToken: string }\n | { kind: \"raw\" };\n\nexport function ruleStylesNoRawDimensions(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawDimensionPolicy();\n if (!policy) return [];\n\n const appliesTo = new Set(policy.appliesTo);\n const spacingTokens = ix.tokens.byCategory(\"spacing\");\n const radiusTokens = ix.tokens.byCategory(\"radius\");\n const preferLabel = policy.prefer === \"token\" ? \"design token\" : \"CSS variable\";\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n const property = toKebabCase(decl.property);\n if (!appliesTo.has(property)) continue;\n\n const tokens = tokensForProperty(property, spacingTokens, radiusTokens);\n const resolution = resolveDimension(decl.value, tokens);\n if (!resolution) continue;\n const tokenIds = resolutionTokenIds(resolution);\n const evidenceIds = tokenIds.length ? [decl.id, policy.id, ...tokenIds] : [decl.id, policy.id];\n const fixEmission = dimensionFix(decl.property, resolution, ix);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: dimensionMessage(decl.value, decl.property, preferLabel, resolution, false),\n location: decl.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n source: \"css\",\n suggestedToken: resolutionSuggestedToken(resolution),\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n if (inline.valueKind === \"css-variable\") continue;\n const property = toKebabCase(inline.property);\n if (!appliesTo.has(property)) continue;\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const tokens = tokensForProperty(property, spacingTokens, radiusTokens);\n const resolution = resolveDimension(inline.value, tokens);\n if (!resolution) continue;\n const baseEvidence = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id]\n : [node.id, inline.id, policy.id];\n const tokenIds = resolutionTokenIds(resolution);\n const evidenceIds = tokenIds.length ? [...baseEvidence, ...tokenIds] : baseEvidence;\n const fixEmission = dimensionFix(inline.property, resolution, ix);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: dimensionMessage(inline.value, inline.property, preferLabel, resolution, true),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n source: \"jsx\",\n suggestedToken: resolutionSuggestedToken(resolution),\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\n/** Normalize a JSX camelCase style key (`paddingTop`) to CSS kebab (`padding-top`). */\nfunction toKebabCase(property: string): string {\n return property.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\nfunction tokensForProperty(\n property: string,\n spacingTokens: readonly TokenDefinitionFact[],\n radiusTokens: readonly TokenDefinitionFact[]\n): readonly TokenDefinitionFact[] {\n return property.includes(\"radius\") ? radiusTokens : spacingTokens;\n}\n\n/**\n * Resolve a raw dimension against the candidate tokens, preferring an exact\n * (value-preserving) match, then a nearest same-unit snap, then no token.\n * Returns `null` when the value is neither a token match nor a raw dimension —\n * i.e. nothing to flag.\n */\nfunction resolveDimension(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): DimensionResolution | null {\n const exact = findDimensionFixMatch(raw, tokens);\n if (exact) {\n return {\n kind: \"exact\",\n tokens: exact.tokens,\n fixValue: exact.fixValue,\n suggestedToken: exact.suggestedToken,\n };\n }\n if (!isRawDimensionValue(raw)) return null;\n\n const nearest = findNearestDimensionToken(raw, tokens);\n if (nearest) return { kind: \"nearest\", ...nearest };\n return { kind: \"raw\" };\n}\n\nfunction resolutionTokenIds(resolution: DimensionResolution): FactId[] {\n if (resolution.kind === \"exact\") return resolution.tokens.map((token) => token.id);\n if (resolution.kind === \"nearest\") return [resolution.token.id];\n return [];\n}\n\nfunction resolutionSuggestedToken(resolution: DimensionResolution): string | undefined {\n if (resolution.kind === \"exact\") return resolution.suggestedToken;\n if (resolution.kind === \"nearest\") return resolution.suggestedToken;\n return undefined;\n}\n\nfunction dimensionMessage(\n rawValue: string,\n property: string,\n preferLabel: string,\n resolution: DimensionResolution,\n inline: boolean\n): string {\n const where = inline ? `inline \\`${property}\\`` : `\\`${property}\\``;\n if (resolution.kind === \"nearest\") {\n return `Raw dimension ${rawValue} on ${where}. Closest token is \\`${resolution.suggestedToken}\\` (${resolution.token.value}); use a ${preferLabel} instead.`;\n }\n return `Raw dimension ${rawValue} on ${where}. Use a ${preferLabel} instead.`;\n}\n\nfunction dimensionFix(\n property: string,\n resolution: DimensionResolution,\n ix: FactIndex\n): FixEmission<FindingReplaceStyleValueFix> | undefined {\n if (resolution.kind === \"exact\") {\n return emitFix(\n {\n kind: \"replaceStyleValue\",\n title: `Replace ${property} with ${resolution.fixValue}`,\n property,\n value: resolution.fixValue,\n deterministic: true,\n },\n {\n symbols: resolution.tokens.map((token) => token.name),\n editKind: \"replaceStyleValue\",\n valuePreserving: true,\n },\n ix\n );\n }\n // `nearest` deliberately emits NO fix — a value-changing snap must stay a\n // suggestion (see DimensionResolution); only the exact, value-preserving swap\n // is safe to auto-apply.\n return undefined;\n}\n\n/**\n * Find a dimension token whose value matches the raw literal exactly, compared\n * in canonical px. No fuzzy/nearest matching — only value-preserving swaps earn\n * an exact match.\n */\nfunction findDimensionMatch(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): TokenDefinitionFact | null {\n const target = normalizeDimension(raw);\n if (target === null) return null;\n for (const token of tokens) {\n if (normalizeDimension(token.value) === target) return token;\n }\n return null;\n}\n\nfunction findDimensionFixMatch(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): DimensionFixMatch | null {\n const single = findDimensionMatch(raw, tokens);\n if (single) {\n return {\n tokens: [single],\n fixValue: tokenVar(single),\n suggestedToken: single.name,\n };\n }\n\n const parts = raw.trim().split(/\\s+/);\n if (parts.length < 2 || parts.length > 4) return null;\n\n const matches: TokenDefinitionFact[] = [];\n for (const part of parts) {\n const match = findDimensionMatch(part, tokens);\n if (!match) return null;\n matches.push(match);\n }\n\n return {\n tokens: matches,\n fixValue: matches.map(tokenVar).join(\" \"),\n suggestedToken: matches.map((token) => token.name).join(\" \"),\n };\n}\n\n/**\n * For an off-scale SINGLE dimension value, find the nearest token of the SAME\n * unit. Same-unit only keeps the suggestion value-safe: matching a `px` value\n * to a `rem` token would assume a root font size we cannot guarantee. A non-zero\n * value never snaps to a `0` token (that silently removes the dimension), and a\n * multi-value shorthand returns null (no single nearest target).\n */\nfunction findNearestDimensionToken(\n raw: string,\n tokens: readonly TokenDefinitionFact[]\n): { token: TokenDefinitionFact; suggestedToken: string } | null {\n const parsed = parseLengthValue(raw);\n if (!parsed) return null;\n const rawUnit = parsed.unit ?? \"px\";\n\n let best: { token: TokenDefinitionFact; value: number } | null = null;\n for (const token of tokens) {\n const tokenLength = parseLengthValue(token.value);\n if (!tokenLength) continue;\n const tokenUnit = tokenLength.unit ?? \"px\";\n if (tokenUnit !== rawUnit) continue;\n if (tokenLength.value === parsed.value) continue; // exact handled elsewhere\n if (tokenLength.value === 0 && parsed.value !== 0) continue; // never snap to 0\n if (best === null) {\n best = { token, value: tokenLength.value };\n continue;\n }\n const delta = Math.abs(parsed.value - tokenLength.value);\n const bestDelta = Math.abs(parsed.value - best.value);\n // Ties break toward the smaller token value, then first-seen, for stability.\n if (delta < bestDelta || (delta === bestDelta && tokenLength.value < best.value)) {\n best = { token, value: tokenLength.value };\n }\n }\n\n if (!best) return null;\n return {\n token: best.token,\n suggestedToken: best.token.name,\n };\n}\n\nfunction isRawDimensionValue(raw: string): boolean {\n if (normalizeDimension(raw) !== null) return true;\n const parts = raw.trim().split(/\\s+/);\n return (\n parts.length >= 2 &&\n parts.length <= 4 &&\n parts.every((part) => normalizeDimension(part) !== null)\n );\n}\n\n/**\n * Canonical match key `${amount}${unit}` (unitless treated as px, for React\n * inline numerics and `0`). Units are intentionally NOT cross-converted:\n * matching `1rem` to a `16px` token would assume a 16px root font size we\n * cannot guarantee, so a unit mismatch never matches. This keeps every emitted\n * fix value-preserving.\n */\nfunction normalizeDimension(value: string): string | null {\n const parsed = parseLengthValue(value);\n if (!parsed) return null;\n return `${parsed.value}${parsed.unit ?? \"px\"}`;\n}\n\nfunction tokenVar(token: TokenDefinitionFact): string {\n if (token.name.startsWith(\"$\")) return token.name;\n const cssVarName = token.name.startsWith(\"--\")\n ? token.name\n : `--${token.name.replace(/\\./g, \"-\")}`;\n return `var(${cssVarName})`;\n}\n","import type { TokenDefinitionFact } from \"../facts/index.js\";\n\nimport {\n matchesScale,\n nearestSignedScaleValue,\n normalizeLengthForScale,\n parseLengthValue,\n tokenReference,\n type ParsedLengthValue,\n} from \"./utils.js\";\n\nexport interface SpacingResolutionScale {\n name: string;\n unit: \"px\" | \"rem\";\n rootFontSizePx?: number;\n emBasePx?: number;\n}\n\n/** Spacing tokens keyed by their value normalized into a given scale's unit. */\nexport type SpacingTokenLookup = Map<number, TokenDefinitionFact>;\n\nexport interface CheckedSpacingValue {\n normalizedValue: number;\n /** Best-effort suggestion for display, even when no fix is emitted. */\n suggestedValue?: string;\n /** Token name backing suggestedValue, when the canonical token vocabulary has one. */\n suggestedToken?: string;\n /** Whether a fix object should be attached (suggestion reliable enough). */\n fixEmittable: boolean;\n deterministicFix: boolean;\n /** Dominant reason for the finding — drives message wording. */\n reason: \"off-scale\" | \"token-equivalent\";\n /** Token name when the violation is a raw literal that equals a token. */\n matchedToken?: string;\n assumedRootFontSizePx?: number;\n assumedEmBasePx?: number;\n}\n\nexport function buildSpacingTokenLookup(\n tokens: readonly TokenDefinitionFact[],\n scale: SpacingResolutionScale\n): SpacingTokenLookup {\n const out: SpacingTokenLookup = new Map();\n for (const token of tokens) {\n const parsed = parseLengthValue(token.value);\n if (!parsed) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) continue;\n const key = Math.abs(normalized.value);\n // First token wins so the suggestion is stable across runs.\n if (!out.has(key)) out.set(key, token);\n }\n return out;\n}\n\nexport function resolveSpacingValue(input: {\n raw: string;\n allowed: readonly number[];\n scale: SpacingResolutionScale;\n tokens: SpacingTokenLookup;\n bareNumberFix?: boolean;\n}): CheckedSpacingValue | null {\n const parts = parseLengthParts(input.raw);\n if (!parts) return null;\n\n let firstViolation: CheckedSpacingValue | null = null;\n const suggestedParts: string[] = [];\n let anyViolation = false;\n let anyOffScale = false;\n let canFixAll = true;\n // A snap is only reliable enough to *offer* when the value normalization was\n // exact — an assumed em/rem base makes the px guess unreliable, so report the\n // suggestion but attach no deterministic fix.\n let reliableSuggestion = true;\n // Deterministic only when every violating part is a value-preserving,\n // verbatim-resolvable token swap.\n let allValuePreserving = true;\n\n for (const part of parts) {\n const normalized = normalizeLengthForScale(part.parsed, input.scale);\n if (normalized === null) return null;\n const magnitude = Math.abs(normalized.value);\n const onScale = matchesScale(normalized.value, input.allowed);\n const exactToken = input.tokens.get(magnitude);\n\n if (onScale) {\n if (!exactToken) {\n // On-grid value with no named token (e.g. `0`) — not a violation.\n suggestedParts.push(part.raw);\n continue;\n }\n // On-grid literal that equals a token: value-preserving swap.\n anyViolation = true;\n const reference = tokenReference(exactToken.name);\n if (!normalized.deterministicFix) allValuePreserving = false;\n suggestedParts.push(reference);\n if (!firstViolation) {\n firstViolation = {\n normalizedValue: normalized.value,\n suggestedValue: reference,\n suggestedToken: exactToken.name,\n fixEmittable: true,\n deterministicFix: normalized.deterministicFix,\n reason: \"token-equivalent\",\n matchedToken: exactToken.name,\n assumedRootFontSizePx: normalized.assumedRootFontSizePx,\n assumedEmBasePx: normalized.assumedEmBasePx,\n };\n }\n continue;\n }\n\n // Off the scale — flag, suggest the nearest scale value as its token when\n // one exists. Snapping changes rendered value, so this is not deterministic.\n anyViolation = true;\n anyOffScale = true;\n allValuePreserving = false;\n\n const nearest = nearestSignedScaleValue(normalized.value, input.allowed);\n const snapsToZero = nearest === 0 && normalized.value !== 0;\n let suggestedPart: string | undefined;\n let suggestedToken: string | undefined;\n if (nearest === null || snapsToZero) {\n suggestedPart = undefined;\n canFixAll = false;\n suggestedParts.push(part.raw);\n } else {\n const nearestToken = input.tokens.get(Math.abs(nearest));\n suggestedToken = nearestToken?.name;\n suggestedPart = nearestToken\n ? tokenReference(nearestToken.name)\n : input.bareNumberFix\n ? `${nearest}`\n : `${nearest}${input.scale.unit}`;\n suggestedParts.push(suggestedPart);\n if (!normalized.deterministicFix) reliableSuggestion = false;\n }\n\n if (!firstViolation) {\n firstViolation = {\n normalizedValue: normalized.value,\n suggestedValue: suggestedPart,\n suggestedToken,\n fixEmittable: false,\n deterministicFix: false,\n reason: \"off-scale\",\n assumedRootFontSizePx: normalized.assumedRootFontSizePx,\n assumedEmBasePx: normalized.assumedEmBasePx,\n };\n }\n }\n\n if (!firstViolation || !anyViolation) return null;\n\n const joined = suggestedParts.join(\" \");\n const changes = joined !== input.raw.trim().replace(/\\s+/g, \" \");\n const fixEmittable = canFixAll && reliableSuggestion && changes;\n const deterministic = fixEmittable && !anyOffScale && allValuePreserving;\n\n return {\n ...firstViolation,\n reason: anyOffScale ? \"off-scale\" : \"token-equivalent\",\n fixEmittable,\n deterministicFix: deterministic,\n suggestedValue: canFixAll ? joined : firstViolation.suggestedValue,\n };\n}\n\nfunction parseLengthParts(raw: string): Array<{ raw: string; parsed: ParsedLengthValue }> | null {\n const trimmed = raw.trim();\n if (!trimmed || /var\\(|calc\\(|min\\(|max\\(|clamp\\(|,/i.test(trimmed)) return null;\n const parts = trimmed.split(/\\s+/);\n if (parts.length < 1 || parts.length > 4) return null;\n\n const parsed = parts.map((part) => {\n const length = parseLengthValue(part);\n return length ? { raw: part, parsed: length } : null;\n });\n if (parsed.some((part) => part === null)) return null;\n return parsed as Array<{ raw: string; parsed: ParsedLengthValue }>;\n}\n","/**\n * `styles/no-raw-spacing` — fires when a length-bearing CSS declaration or\n * JSX inline style on a scaled property uses a raw spacing literal instead of\n * a design token.\n *\n * The rule needs both a `style.property.scale` policy (which property is\n * scaled, and which scale name backs it) and a matching set of `scale_value`\n * facts (the allowed numbers). If either is missing the rule is silent for\n * that property.\n *\n * Two violation shapes, mirroring `styles/no-raw-color`:\n *\n * - **off the scale** — `padding: 13px` on a [0,4,8,12,16] scale. Flagged; the\n * suggested fix snaps to the nearest scale value (as the matching token when\n * one exists, else the raw grid value). Because snapping *changes* the\n * rendered value, the fix is a suggestion (non-deterministic) — never applied\n * silently.\n * - **on the scale but a raw literal that equals a token** — `padding: 16px`\n * where `--space-md` is `16px`. Flagged; the fix swaps in `var(--space-md)`.\n * This is value-preserving, so it is a deterministic, auto-applicable fix.\n * (Only fires when a matching spacing token exists — a pure-grid value with no\n * named token, like `0`, stays silent.)\n *\n * `padding: var(--space-3)` → silent (token reference). `padding: 1.5rem` on a\n * px scale → normalized through the configured root font size before matching.\n */\n\nimport type {\n FactId,\n FactIndex,\n ScaleFact,\n StyleDeclarationFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n} from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport {\n buildSpacingTokenLookup,\n resolveSpacingValue,\n type CheckedSpacingValue,\n type SpacingTokenLookup,\n} from \"./spacing-resolution.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n emitFix,\n indexComponentByNodeId,\n readUsageNode,\n tokenSymbolsInText,\n type FixEmission,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-spacing\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleStylesNoRawSpacing(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n\n // Token lookups are scale-relative (token values normalize to the scale's\n // unit), so cache one per scale name to avoid rebuilding per declaration.\n const lookupCache = new Map<string, SpacingTokenLookup>();\n const lookupFor = (scale: ScaleFact): SpacingTokenLookup => {\n let lookup = lookupCache.get(scale.name);\n if (!lookup) {\n lookup = buildSpacingTokenLookup(ix.tokens.byCategory(\"spacing\"), scale);\n lookupCache.set(scale.name, lookup);\n }\n return lookup;\n };\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n const finding = checkDeclaration(ix, decl, lookupFor);\n if (finding) findings.push(finding);\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n const finding = checkInlineStyle(ix, inline, componentByNode, lookupFor);\n if (finding) findings.push(finding);\n }\n\n return findings;\n}\n\n/**\n * Inline style property names arrive camelCase (`marginTop`); the policy keys\n * spacing scales by CSS property (`margin-top`). Normalize so longhand inline\n * props resolve their scale the same way the CSS file path does.\n */\nfunction cssPropertyName(property: string): string {\n return property.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\n}\n\nfunction checkDeclaration(\n ix: FactIndex,\n decl: StyleDeclarationFact,\n lookupFor: (scale: ScaleFact) => SpacingTokenLookup\n): Finding | null {\n const policy = ix.policy.propertyScale(decl.property);\n if (!policy) return null;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return null;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return null;\n\n const checked = resolveSpacingValue({\n raw: decl.value,\n allowed,\n scale,\n tokens: lookupFor(scale),\n });\n if (!checked) return null;\n const fixEmission = buildSpacingFix(decl.property, checked, ix);\n\n return makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: spacingMessage(decl.property, decl.value, allowed, scale.unit, checked),\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id, scale.id]),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n suggestedToken: checked.suggestedToken,\n reason: checked.reason,\n normalizedValue: checked.normalizedValue,\n normalizedUnit: scale.unit,\n assumedRootFontSizePx: checked.assumedRootFontSizePx,\n assumedEmBasePx: checked.assumedEmBasePx,\n source: \"css\",\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n });\n}\n\nfunction checkInlineStyle(\n ix: FactIndex,\n inline: UsageInlineStyleFact,\n componentByNode: Map<FactId, UsageComponentFact>,\n lookupFor: (scale: ScaleFact) => SpacingTokenLookup\n): Finding | null {\n const policy = ix.policy.propertyScale(cssPropertyName(inline.property));\n if (!policy) return null;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return null;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return null;\n\n if (inline.valueKind === \"css-variable\") return null;\n\n const checked = resolveSpacingValue({\n raw: inline.value,\n allowed,\n scale,\n tokens: lookupFor(scale),\n bareNumberFix: inline.valueKind === \"number\",\n });\n if (!checked) return null;\n const fixEmission = buildSpacingFix(inline.property, checked, ix);\n\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) return null;\n\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const evidenceIds = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id, scale.id]\n : [node.id, inline.id, policy.id, scale.id];\n\n return makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: spacingMessage(inline.property, inline.value, allowed, scale.unit, checked),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n suggestedToken: checked.suggestedToken,\n reason: checked.reason,\n normalizedValue: checked.normalizedValue,\n normalizedUnit: scale.unit,\n assumedRootFontSizePx: checked.assumedRootFontSizePx,\n assumedEmBasePx: checked.assumedEmBasePx,\n source: \"jsx\",\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n });\n}\n\nfunction buildSpacingFix(\n property: string,\n checked: CheckedSpacingValue,\n ix: FactIndex\n): FixEmission | undefined {\n if (!checked.fixEmittable || checked.suggestedValue === undefined) return undefined;\n return emitFix(\n {\n kind: \"replaceStyleValue\" as const,\n title: `Replace ${property} with ${checked.suggestedValue}`,\n property,\n value: checked.suggestedValue,\n deterministic: true,\n },\n {\n symbols: tokenSymbolsInText(checked.suggestedValue),\n editKind: \"replaceStyleValue\",\n valuePreserving: checked.deterministicFix,\n },\n ix\n );\n}\n\nfunction spacingMessage(\n property: string,\n value: string,\n allowed: number[],\n unit: \"px\" | \"rem\",\n checked: CheckedSpacingValue\n): string {\n if (checked.reason === \"token-equivalent\" && checked.matchedToken) {\n return `\\`${property}: ${value}\\` is a raw literal that matches token \\`${checked.matchedToken}\\`. Reference the token instead.`;\n }\n const sample = allowed\n .slice()\n .sort((a, b) => a - b)\n .slice(0, 6);\n const suffix = `${sample.join(unit + \", \")}${unit}`;\n const ellipsis = allowed.length > sample.length ? \", …\" : \"\";\n return `\\`${property}: ${value}\\` is not on the spacing scale. Allowed: ${suffix}${ellipsis}.`;\n}\n","/**\n * `styles/no-raw-typography` — fires when a `font-size` declaration or JSX\n * inline `fontSize` uses a raw length literal instead of a typography token.\n *\n * Consumes the `style.fontSize.mustMatchScale` policy (a `style_font_size_scale`\n * fact) plus a backing scale. Without both it is silent — typography is only\n * enforced once a project actually has a font-size scale (derived from its\n * detected typography tokens). This closes the teach-vs-enforce gap where the\n * agent context advertises typography tokens but nothing flags off-scale text.\n *\n * Behaviour mirrors `styles/no-raw-spacing`:\n * - off the scale (`font-size: 13px` on [12,14,16]) → suggestion, never applied\n * silently (snapping changes rendered size);\n * - on the scale but a raw literal equal to a token (`font-size: 16px` where\n * `--font-size-md` is `16px`) → deterministic, value-preserving token swap.\n */\n\nimport type {\n FactId,\n FactIndex,\n ScaleFact,\n StyleDeclarationFact,\n TokenDefinitionFact,\n UsageComponentFact,\n UsageInlineStyleFact,\n} from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexComponentByNodeId,\n emitFix,\n matchesScale,\n nearestSignedScaleValue,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n tokenReference,\n tokenSymbolsInText,\n type FixEmission,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"styles/no-raw-typography\";\nexport const RULE_VERSION = \"1\";\n\nconst FONT_SIZE_PROPERTIES = new Set([\"font-size\", \"fontsize\"]);\n\nexport function ruleStylesNoRawTypography(ix: FactIndex): Finding[] {\n const policy = ix.policy.fontSizeScale();\n if (!policy) return [];\n const scale = ix.policy.scale(policy.scale);\n if (!scale) return [];\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) return [];\n\n const tokens = buildTypographyTokenLookup(ix, scale);\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (decl.property.toLowerCase() !== \"font-size\") continue;\n const checked = checkFontSize(decl.value, allowed, scale, tokens);\n if (!checked) continue;\n const fixEmission = buildFix(decl.property, checked, ix);\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: typographyMessage(decl.property, decl.value, allowed, scale.unit, checked),\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id, scale.id]),\n fingerprintIdentity: {\n source: \"style_declaration\",\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n value: decl.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n source: \"css\",\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n const componentByNode = indexComponentByNodeId(ix);\n for (const inline of ix.byKind(\"usage_inline_style\")) {\n if (inline.valueKind === \"css-variable\") continue;\n if (!FONT_SIZE_PROPERTIES.has(inline.property.toLowerCase())) continue;\n const checked = checkFontSize(\n inline.value,\n allowed,\n scale,\n tokens,\n inline.valueKind === \"number\"\n );\n if (!checked) continue;\n const fixEmission = buildFix(inline.property, checked, ix);\n const node = readUsageNode(ix, inline.nodeId);\n if (!node) continue;\n const componentEvidenceId = componentByNode.get(node.id)?.id;\n const evidenceIds = componentEvidenceId\n ? [node.id, componentEvidenceId, inline.id, policy.id, scale.id]\n : [node.id, inline.id, policy.id, scale.id];\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: typographyMessage(inline.property, inline.value, allowed, scale.unit, checked),\n location: node.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"usage_inline_style\",\n file: node.file,\n nodePath: node.nodePath,\n element: node.element,\n property: inline.property,\n value: inline.value,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: inline.property,\n rawValue: inline.value,\n scale: scale.name,\n allowed,\n suggestedValue: checked.suggestedValue,\n matchedToken: checked.matchedToken,\n source: \"jsx\",\n ...(fixEmission?.downgradeReason ? { downgradeReason: fixEmission.downgradeReason } : {}),\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction buildTypographyTokenLookup(\n ix: FactIndex,\n scale: ScaleFact\n): Map<number, TokenDefinitionFact> {\n const out = new Map<number, TokenDefinitionFact>();\n for (const token of ix.tokens.byCategory(\"typography\")) {\n const parsed = parseLengthValue(token.value);\n if (!parsed || parsed.unit === null) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) continue;\n const key = Math.abs(normalized.value);\n if (!out.has(key)) out.set(key, token);\n }\n return out;\n}\n\ninterface CheckedFontSize {\n suggestedValue?: string;\n fixEmittable: boolean;\n deterministicFix: boolean;\n reason: \"off-scale\" | \"token-equivalent\";\n matchedToken?: string;\n}\n\nfunction checkFontSize(\n raw: string,\n allowed: number[],\n scale: ScaleFact,\n tokens: Map<number, TokenDefinitionFact>,\n bareNumberFix = false\n): CheckedFontSize | null {\n const trimmed = raw.trim();\n if (!trimmed || /var\\(|calc\\(|clamp\\(|min\\(|max\\(|,|\\s/.test(trimmed)) return null;\n const parsed = parseLengthValue(trimmed);\n if (!parsed) return null;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (normalized === null) return null;\n const magnitude = Math.abs(normalized.value);\n const exactToken = tokens.get(magnitude);\n\n if (matchesScale(normalized.value, allowed)) {\n if (!exactToken) return null;\n return {\n suggestedValue: tokenReference(exactToken.name),\n fixEmittable: true,\n deterministicFix: normalized.deterministicFix,\n reason: \"token-equivalent\",\n matchedToken: exactToken.name,\n };\n }\n\n const nearest = nearestSignedScaleValue(normalized.value, allowed);\n if (nearest === null || (nearest === 0 && normalized.value !== 0)) {\n return { fixEmittable: false, deterministicFix: false, reason: \"off-scale\" };\n }\n const nearestToken = tokens.get(Math.abs(nearest));\n const suggestedValue = nearestToken\n ? tokenReference(nearestToken.name)\n : bareNumberFix\n ? `${nearest}`\n : `${nearest}${scale.unit}`;\n // Off-scale snaps change rendered size → suggestion only; and an assumed\n // root base makes the px guess unreliable, so attach no fix then.\n return {\n suggestedValue,\n fixEmittable: normalized.deterministicFix,\n deterministicFix: false,\n reason: \"off-scale\",\n };\n}\n\nfunction buildFix(\n property: string,\n checked: CheckedFontSize,\n ix: FactIndex\n): FixEmission | undefined {\n if (!checked.fixEmittable || checked.suggestedValue === undefined) return undefined;\n return emitFix(\n {\n kind: \"replaceStyleValue\" as const,\n title: `Replace ${property} with ${checked.suggestedValue}`,\n property,\n value: checked.suggestedValue,\n deterministic: true,\n },\n {\n symbols: tokenSymbolsInText(checked.suggestedValue),\n editKind: \"replaceStyleValue\",\n valuePreserving: checked.deterministicFix,\n },\n ix\n );\n}\n\nfunction typographyMessage(\n property: string,\n value: string,\n allowed: number[],\n unit: \"px\" | \"rem\",\n checked: CheckedFontSize\n): string {\n if (checked.reason === \"token-equivalent\" && checked.matchedToken) {\n return `\\`${property}: ${value}\\` is a raw literal that matches token \\`${checked.matchedToken}\\`. Reference the token instead.`;\n }\n const sample = allowed\n .slice()\n .sort((a, b) => a - b)\n .slice(0, 6);\n const suffix = `${sample.join(unit + \", \")}${unit}`;\n const ellipsis = allowed.length > sample.length ? \", …\" : \"\";\n return `\\`${property}: ${value}\\` is not on the typography scale. Allowed: ${suffix}${ellipsis}.`;\n}\n","import type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\n\nexport const RULE_ID = \"theme/no-theme-coupled-literal\";\nexport const RULE_VERSION = \"1\";\n\nconst COLOR_LITERAL_GLOBAL =\n /#[0-9a-fA-F]{3,8}\\b|\\b(?:rgba?|hsla?|oklab|oklch|lab|lch)\\(\\s*[\\d.%\\s,\\/]+\\s*\\)/g;\nconst WHITE_RGBA = /^rgba?\\(\\s*255\\s*,\\s*255\\s*,\\s*255/i;\nconst BLACK_RGBA = /^rgba?\\(\\s*0\\s*,\\s*0\\s*,\\s*0/i;\nconst COLOR_MIX_OPEN = \"color-mix(\";\nconst BOX_SHADOW_PROP = /^(?:-webkit-|-moz-)?box-shadow$/i;\nconst NEUTRAL_SHADOW = /^(?:none|inherit|initial|unset|revert|revert-layer)\\s*$/i;\n\nexport function ruleThemeNoThemeCoupledLiteral(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const findings: Finding[] = [];\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (isTokenFile(decl.file)) continue;\n const hit = findThemeCoupledLiteral(decl.property, decl.value);\n if (!hit) continue;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: hit.message,\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n rawValue: hit.rawValue,\n reason: hit.reason,\n },\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n color: hit.rawValue,\n suggestion: hit.suggestion,\n source: \"css\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction findThemeCoupledLiteral(\n property: string,\n value: string,\n): { rawValue: string; reason: string; message: string; suggestion: string } | null {\n COLOR_LITERAL_GLOBAL.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = COLOR_LITERAL_GLOBAL.exec(value)) !== null) {\n const raw = match[0];\n if (insideLightDark(value, match.index)) continue;\n\n if (insideColorMix(value, match.index)) {\n return {\n rawValue: raw,\n reason: \"color-mix\",\n message: `color-mix() argument ${raw} is theme-coupled. Use a semantic token or wrap the declaration in light-dark(...).`,\n suggestion: `Replace ${raw} with a semantic token or light-dark(...)`,\n };\n }\n\n if (BOX_SHADOW_PROP.test(property) && !NEUTRAL_SHADOW.test(value.trim())) {\n return {\n rawValue: raw,\n reason: \"box-shadow\",\n message: `Custom box-shadow with literal color ${raw} is theme-coupled. Use a shadow/elevation token or light-dark(...).`,\n suggestion: \"Use a shadow/elevation token or light-dark(...)\",\n };\n }\n\n if (WHITE_RGBA.test(raw) || BLACK_RGBA.test(raw)) {\n return {\n rawValue: raw,\n reason: \"white-black-rgba\",\n message: `Raw ${raw} assumes one theme. Wrap it in light-dark(...) or use a semantic token.`,\n suggestion: WHITE_RGBA.test(raw)\n ? `light-dark(/* TODO light-theme equivalent */, ${raw})`\n : `light-dark(${raw}, /* TODO dark-theme equivalent */)`,\n };\n }\n }\n\n return null;\n}\n\nfunction insideLightDark(value: string, index: number): boolean {\n return enclosingFunctionName(value, index) === \"light-dark\";\n}\n\nfunction insideColorMix(value: string, index: number): boolean {\n return enclosingFunctionName(value, index) === \"color-mix\";\n}\n\nfunction enclosingFunctionName(value: string, index: number): string | null {\n let depth = 0;\n for (let i = index - 1; i >= 0; i--) {\n const ch = value[i];\n if (ch === \")\") {\n depth++;\n continue;\n }\n if (ch !== \"(\") continue;\n if (depth > 0) {\n depth--;\n continue;\n }\n const before = value.slice(0, i).match(/([a-z-]+)\\s*$/i);\n return before?.[1]?.toLowerCase() ?? null;\n }\n return null;\n}\n\nfunction isTokenFile(filePath: string): boolean {\n const normalized = filePath.replace(/\\\\/g, \"/\");\n const base = normalized.slice(normalized.lastIndexOf(\"/\") + 1);\n if (base === \"_tokens.scss\" || base === \"tokens.scss\") return true;\n return base.startsWith(\"_\") && /(^|\\/)tokens\\//.test(normalized);\n}\n","/**\n * `tailwind/arbitrary-color` — flags color-bearing Tailwind utilities with\n * arbitrary raw color values, e.g. `bg-[#abc123]` or\n * `text-[rgb(10,20,30)]`.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { detectRawColor, isExemptColor, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/arbitrary-color\";\nexport const RULE_VERSION = \"1\";\n\nconst COLOR_UTILITIES = new Set([\n \"accent\",\n \"bg\",\n \"border\",\n \"border-b\",\n \"border-e\",\n \"border-l\",\n \"border-r\",\n \"border-s\",\n \"border-t\",\n \"border-x\",\n \"border-y\",\n \"caret\",\n \"decoration\",\n \"divide\",\n \"fill\",\n \"from\",\n \"outline\",\n \"placeholder\",\n \"ring\",\n \"ring-offset\",\n \"shadow\",\n \"stroke\",\n \"text\",\n \"to\",\n \"via\",\n]);\n\nexport function ruleTailwindArbitraryColor(ix: FactIndex): Finding[] {\n const policy = ix.policy.rawColorPolicy();\n if (!policy) return [];\n\n const findings: Finding[] = [];\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"arbitrary\") continue;\n if (!COLOR_UTILITIES.has(klass.utility)) continue;\n\n const color = detectRawColor(klass.value.raw);\n if (!color) continue;\n if (isExemptColor(color, policy.except)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node ? [node.id, klass.id, policy.id] : [klass.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` uses arbitrary raw color ${color}. Use a ${policy.prefer === \"token\" ? \"design token\" : \"CSS variable\"} instead.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: fingerprintIdentity(klass, color),\n attributes: {\n rawClass: klass.raw,\n rawValue: klass.value.raw,\n color,\n utility: klass.utility,\n source: \"tailwind\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction fingerprintIdentity(klass: TailwindClassFact, color: string): Record<string, unknown> {\n return {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n value: color,\n };\n}\n","/**\n * `tailwind/arbitrary-spacing` — flags arbitrary Tailwind spacing utilities\n * that cannot be proven to sit on the configured spacing scale.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n matchesScale,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/arbitrary-spacing\";\nexport const RULE_VERSION = \"1\";\n\nconst SPACING_UTILITY_TO_PROPERTY: ReadonlyMap<string, string> = new Map([\n [\"m\", \"margin\"],\n [\"mt\", \"margin\"],\n [\"mr\", \"margin\"],\n [\"mb\", \"margin\"],\n [\"ml\", \"margin\"],\n [\"ms\", \"margin\"],\n [\"me\", \"margin\"],\n [\"mx\", \"margin\"],\n [\"my\", \"margin\"],\n [\"p\", \"padding\"],\n [\"pt\", \"padding\"],\n [\"pr\", \"padding\"],\n [\"pb\", \"padding\"],\n [\"pl\", \"padding\"],\n [\"ps\", \"padding\"],\n [\"pe\", \"padding\"],\n [\"px\", \"padding\"],\n [\"py\", \"padding\"],\n [\"gap\", \"gap\"],\n [\"gap-x\", \"gap\"],\n [\"gap-y\", \"gap\"],\n [\"space-x\", \"gap\"],\n [\"space-y\", \"gap\"],\n] as const);\n\nexport function ruleTailwindArbitrarySpacing(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"arbitrary\") continue;\n\n const property = SPACING_UTILITY_TO_PROPERTY.get(klass.utility);\n if (!property) continue;\n\n const policy = ix.policy.propertyScale(property);\n if (!policy) continue;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) continue;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) continue;\n\n const parsed = parseLengthValue(klass.value.raw);\n const normalized = parsed ? normalizeLengthForScale(parsed, scale) : null;\n if (normalized && matchesScale(normalized.value, allowed)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, policy.id, scale.id]\n : [klass.id, policy.id, scale.id];\n\n const fix = buildFix(klass);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` is an arbitrary spacing value not on the project's spacing scale.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n value: klass.value.raw,\n },\n fix,\n attributes: {\n rawClass: klass.raw,\n rawValue: klass.value.raw,\n utility: klass.utility,\n property,\n scale: scale.name,\n allowed,\n normalizedValue: normalized?.value,\n normalizedUnit: normalized ? scale.unit : undefined,\n assumedRootFontSizePx: normalized?.assumedRootFontSizePx,\n assumedEmBasePx: normalized?.assumedEmBasePx,\n source: \"tailwind\",\n },\n }),\n );\n }\n\n return findings;\n}\n\nfunction buildFix(klass: TailwindClassFact): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${klass.raw}`,\n from: klass.raw,\n to: null,\n utility: klass.utility,\n deterministic: false,\n };\n}\n","import type { FactIndex, TailwindClassFact, TailwindTokenResolvedFact } from \"../facts/index.js\";\n\nexport const TAILWIND_COLOR_UTILITIES = new Set([\n \"accent\",\n \"bg\",\n \"border\",\n \"border-b\",\n \"border-e\",\n \"border-l\",\n \"border-r\",\n \"border-s\",\n \"border-t\",\n \"border-x\",\n \"border-y\",\n \"caret\",\n \"decoration\",\n \"divide\",\n \"fill\",\n \"from\",\n \"outline\",\n \"placeholder\",\n \"ring\",\n \"ring-offset\",\n \"shadow\",\n \"stroke\",\n \"text\",\n \"to\",\n \"via\",\n]);\n\n/**\n * Tailwind color *keywords* that are not palette families and carry no\n * satisfiable \"use a named family\" remedy. `bg-white`, `text-black`,\n * `border-transparent`, `ring-current`, `divide-inherit` are stock utilities a\n * project ships with regardless of its configured palette, so the palette\n * allow/deny policy must never flag them (doing so produces an unfixable\n * warning and double-reports against `raw-color-via-token`).\n */\nexport const UNIVERSAL_TAILWIND_COLOR_TOKENS = new Set([\n \"white\",\n \"black\",\n \"transparent\",\n \"current\",\n \"inherit\",\n \"none\",\n]);\n\nexport const TAILWIND_SPACING_UTILITY_TO_PROPERTY: ReadonlyMap<string, string> = new Map([\n [\"m\", \"margin\"],\n [\"mt\", \"margin\"],\n [\"mr\", \"margin\"],\n [\"mb\", \"margin\"],\n [\"ml\", \"margin\"],\n [\"ms\", \"margin\"],\n [\"me\", \"margin\"],\n [\"mx\", \"margin\"],\n [\"my\", \"margin\"],\n [\"p\", \"padding\"],\n [\"pt\", \"padding\"],\n [\"pr\", \"padding\"],\n [\"pb\", \"padding\"],\n [\"pl\", \"padding\"],\n [\"ps\", \"padding\"],\n [\"pe\", \"padding\"],\n [\"px\", \"padding\"],\n [\"py\", \"padding\"],\n [\"gap\", \"gap\"],\n [\"gap-x\", \"gap\"],\n [\"gap-y\", \"gap\"],\n [\"space-x\", \"gap\"],\n [\"space-y\", \"gap\"],\n] as const);\n\nexport function indexResolvedTailwindTokens(\n ix: FactIndex\n): Map<string, TailwindTokenResolvedFact> {\n const out = new Map<string, TailwindTokenResolvedFact>();\n for (const fact of ix.byKind(\"tailwind_token_resolved\")) {\n out.set(resolvedKey(fact.utility, fact.token), fact);\n }\n return out;\n}\n\nexport function resolvedForClass(\n resolvedByKey: ReadonlyMap<string, TailwindTokenResolvedFact>,\n klass: TailwindClassFact\n): TailwindTokenResolvedFact | undefined {\n if (klass.value.kind !== \"token\") return undefined;\n return resolvedByKey.get(resolvedKey(klass.utility, klass.value.token));\n}\n\nexport function resolvedKey(utility: string, token: string): string {\n return `${utility}\\0${token}`;\n}\n\nexport function matchPattern(value: string, patterns: readonly string[]): string | null {\n for (const pattern of patterns) {\n if (matchesTokenGlob(value, pattern)) return pattern;\n }\n return null;\n}\n\nfunction matchesTokenGlob(value: string, pattern: string): boolean {\n const escaped = pattern.replace(/[.+^${}()|[\\]\\\\]/g, \"\\\\$&\").replace(/\\*/g, \".*\");\n return new RegExp(`^${escaped}$`).test(value);\n}\n","/**\n * `tailwind/forbidden-palette` — enforces Tailwind palette allow/deny policy\n * against resolved token-form color utilities.\n */\n\nimport type { FactIndex, TailwindClassFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n matchPattern,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n UNIVERSAL_TAILWIND_COLOR_TOKENS,\n} from \"./tailwind-rule-utils.js\";\nimport { readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/forbidden-palette\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindForbiddenPalette(ix: FactIndex): Finding[] {\n const deny = ix.policy.tailwindPaletteDeny();\n const allow = ix.policy.tailwindPaletteAllow();\n if (!deny && !allow) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n const token = klass.value.token;\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n if (UNIVERSAL_TAILWIND_COLOR_TOKENS.has(token)) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"color\") continue;\n if (resolved.resolved.source === \"theme-css\") continue;\n\n const deniedPattern = deny ? matchPattern(token, deny.patterns) : null;\n const allowedPattern = allow ? matchPattern(token, allow.patterns) : null;\n const allowViolation = allow && !allowedPattern;\n if (!deniedPattern && !allowViolation) continue;\n\n const policy = deniedPattern ? deny! : allow!;\n const matchedPattern = deniedPattern ?? allowedPattern ?? null;\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id]\n : [klass.id, resolved.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: messageFor(klass, token, deniedPattern, allow?.patterns ?? []),\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token,\n matchedPattern,\n },\n fix: buildFix(klass),\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token,\n matchedPattern,\n allowedPatterns: allow?.patterns,\n source: resolved.resolved.source,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction messageFor(\n klass: TailwindClassFact,\n token: string,\n deniedPattern: string | null,\n allowedPatterns: readonly string[]\n): string {\n if (deniedPattern) {\n return `\\`${klass.raw}\\` uses the \\`${token}\\` palette token, which is forbidden by policy \\`deny: ${deniedPattern}\\`.`;\n }\n return `\\`${klass.raw}\\` uses the \\`${token}\\` palette token, which is outside the allowed Tailwind palette patterns [${allowedPatterns.join(\", \")}].`;\n}\n\nfunction buildFix(klass: TailwindClassFact): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${klass.raw}`,\n from: klass.raw,\n to: null,\n utility: klass.utility,\n deterministic: false,\n };\n}\n","/**\n * `tailwind/off-scale-spacing-token` — checks resolved Tailwind spacing\n * tokens against the same project spacing scale used for CSS declarations.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding, FindingReplaceClassTokenFix } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n resolvedForClass,\n TAILWIND_SPACING_UTILITY_TO_PROPERTY,\n} from \"./tailwind-rule-utils.js\";\nimport {\n matchesScale,\n normalizeLengthForScale,\n parseLengthValue,\n readUsageNode,\n} from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/off-scale-spacing-token\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindOffScaleSpacingToken(ix: FactIndex): Finding[] {\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n const property = TAILWIND_SPACING_UTILITY_TO_PROPERTY.get(klass.utility);\n if (!property) continue;\n\n const policy = ix.policy.propertyScale(property);\n if (!policy) continue;\n const scale = ix.policy.scale(policy.scale);\n if (!scale) continue;\n const allowed = ix.policy.scaleValues(policy.scale).map((v) => v.value);\n if (allowed.length === 0) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"length\") continue;\n\n const parsed = parseLengthValue(resolved.resolved.value);\n if (!parsed) continue;\n const normalized = normalizeLengthForScale(parsed, scale);\n if (!normalized) continue;\n const signedValue = klass.negative ? -normalized.value : normalized.value;\n if (matchesScale(signedValue, allowed)) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id, scale.id]\n : [klass.id, resolved.id, policy.id, scale.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` resolves to ${formatResolvedValue(signedValue, scale.unit)}, which is not on the project's spacing scale [${allowed.join(\", \")}].`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: signedValue,\n scale: scale.name,\n },\n fix: buildFix(klass.raw, klass.utility),\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n property,\n scale: scale.name,\n allowed,\n resolvedValue: resolved.resolved.value,\n resolvedPx: scale.unit === \"px\" ? signedValue : undefined,\n resolvedUnit: scale.unit,\n source: resolved.resolved.source,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction formatResolvedValue(value: number, unit: string): string {\n return unit === \"px\" ? `${value}px` : `${value}${unit}`;\n}\n\nfunction buildFix(raw: string, utility: string): FindingReplaceClassTokenFix {\n return {\n kind: \"replaceClassToken\",\n title: `Review ${raw}`,\n from: raw,\n to: null,\n utility,\n deterministic: false,\n };\n}\n","/**\n * `tailwind/raw-color-via-token` — flags Tailwind color tokens that resolve\n * to literal colors when policy requires named palette families.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n matchPattern,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n UNIVERSAL_TAILWIND_COLOR_TOKENS,\n} from \"./tailwind-rule-utils.js\";\nimport { detectRawColor, readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/raw-color-via-token\";\nexport const RULE_VERSION = \"1\";\n\nexport function ruleTailwindRawColorViaToken(ix: FactIndex): Finding[] {\n const allow = ix.policy.tailwindPaletteAllow();\n if (!allow || allow.patterns.length === 0) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.value.kind !== \"token\") continue;\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n if (UNIVERSAL_TAILWIND_COLOR_TOKENS.has(klass.value.token)) continue;\n if (matchPattern(klass.value.token, allow.patterns)) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"color\") continue;\n if (resolved.resolved.source === \"theme-css\") continue;\n\n const color = detectRawColor(resolved.resolved.value);\n if (!color) continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, allow.id]\n : [klass.id, resolved.id, allow.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: allow.severity,\n message: `\\`${klass.raw}\\` resolves to raw color \\`${color}\\` (${sourceLabel(resolved.resolved.source)}). Project policy requires \\`${allow.patterns.join(\"`, `\")}\\` palette tokens.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: color,\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n resolvedValue: color,\n source: resolved.resolved.source,\n allowedPatterns: allow.patterns,\n },\n })\n );\n }\n\n return findings;\n}\n\nfunction sourceLabel(source: \"theme-css\" | \"default\"): string {\n return source === \"default\" ? \"Tailwind default\" : source;\n}\n","/**\n * `tailwind/unknown-class` — opt-in strict-mode diagnostics for classes that\n * either fail parser utility recognition or fail token resolution.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport {\n indexResolvedTailwindTokens,\n resolvedForClass,\n TAILWIND_COLOR_UTILITIES,\n} from \"./tailwind-rule-utils.js\";\nimport { readUsageNode } from \"./utils.js\";\n\nexport const RULE_ID = \"tailwind/unknown-class\";\nexport const RULE_VERSION = \"1\";\n\n/** Color keywords valid in any palette — never a \"did not resolve\" miss. */\nconst UNIVERSAL_COLOR_KEYWORDS = new Set([\n \"white\",\n \"black\",\n \"transparent\",\n \"current\",\n \"currentcolor\",\n \"inherit\",\n \"none\",\n]);\n\nexport function ruleTailwindUnknownClass(ix: FactIndex): Finding[] {\n const policy = ix.policy.tailwindUnknownClassEnabled();\n if (!policy) return [];\n\n const resolvedByKey = indexResolvedTailwindTokens(ix);\n const findings: Finding[] = [];\n\n for (const klass of ix.byKind(\"tailwind_class\")) {\n if (klass.utility === \"unknown\") {\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node ? [node.id, klass.id, policy.id] : [klass.id, policy.id];\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` could not be parsed as a known Tailwind utility.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n reason: \"parse-failure\",\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n reason: \"parse-failure\",\n },\n })\n );\n continue;\n }\n\n if (klass.value.kind !== \"token\") continue;\n\n // The resolution-miss diagnostic is about PALETTE tokens only. Don't flag\n // non-color utilities (font-medium, items-center, border-2 width), bare\n // numeric tokens (sizes/widths, not colors), or universal color keywords\n // (white/black/transparent) as \"did not resolve to a palette token\".\n if (!TAILWIND_COLOR_UTILITIES.has(klass.utility)) continue;\n // `shadow` is dual-purpose: `shadow-{size}` (sm/lg/xl/...) is box-shadow,\n // not a color. The resolution-miss check can't distinguish a size keyword\n // from a misspelled color, so it would flag every `shadow-lg`. Skip it —\n // shadow *color* misuse is rare and not worth the false positives.\n if (klass.utility === \"shadow\") continue;\n const token = klass.value.token;\n if (/^\\d/.test(token)) continue;\n if (UNIVERSAL_COLOR_KEYWORDS.has(token.toLowerCase())) continue;\n\n const resolved = resolvedForClass(resolvedByKey, klass);\n if (!resolved || resolved.resolved.kind !== \"unknown\") continue;\n\n const node = readUsageNode(ix, klass.nodeId);\n const evidenceIds = node\n ? [node.id, klass.id, resolved.id, policy.id]\n : [klass.id, resolved.id, policy.id];\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `\\`${klass.raw}\\` did not resolve to any known palette token.`,\n location: klass.location,\n evidence: ix.evidence(evidenceIds),\n fingerprintIdentity: {\n source: \"tailwind_class\",\n file: klass.file,\n nodeId: klass.nodeId,\n originPath: klass.originPath,\n raw: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n reason: \"resolution-miss\",\n },\n attributes: {\n rawClass: klass.raw,\n utility: klass.utility,\n token: klass.value.token,\n reason: \"resolution-miss\",\n },\n })\n );\n }\n\n return findings;\n}\n","import type { FactIndex, TokenDefinitionFact } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { emitFix } from \"./utils.js\";\n\nexport const RULE_ID = \"tokens/require-dual-fallback\";\nexport const RULE_VERSION = \"1\";\n\nconst CSS_VAR_WITH_OPTIONAL_FALLBACK = /var\\(\\s*(--[A-Za-z0-9_-]+)(\\s*,\\s*[^)]*)?\\)/g;\n\n/**\n * The dual-fallback convention — `var(--token, $token)` — is only meaningful in\n * a Sass pipeline, where the `$token` half resolves at build time. In plain CSS\n * (`.css`/`.module.css`), inline styles, or CSS-in-JS, a `$token` literal is\n * invalid and would silently break the declaration, so the rule (and its\n * autofix) must never touch those files.\n */\nconst SASS_FILE = /\\.(scss|sass)$/i;\n\nexport function ruleTokensRequireDualFallback(ix: FactIndex): Finding[] {\n const policy = ix.policy.ruleConfig(RULE_ID);\n if (!policy?.enabled) return [];\n\n const tokensByCssVariable = indexTokensByCssVariable(ix.tokens.list());\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n if (!SASS_FILE.test(decl.file)) continue;\n CSS_VAR_WITH_OPTIONAL_FALLBACK.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = CSS_VAR_WITH_OPTIONAL_FALLBACK.exec(decl.value)) !== null) {\n const tokenName = match[1];\n const hasFallback = match[2] !== undefined;\n if (hasFallback) continue;\n const token = tokensByCssVariable.get(tokenName);\n if (!token) continue;\n\n const rawValue = match[0];\n const scssVar = tokenName.replace(/^--/, \"$\");\n const hasScssVariable = token.referenceFormat === \"scss-var\";\n const nextValue = hasScssVariable\n ? decl.value.replace(rawValue, `var(${tokenName}, ${scssVar})`)\n : undefined;\n const fixEmission = nextValue\n ? emitFix(\n {\n kind: \"replaceStyleValue\",\n title: `Add fallback for ${tokenName}`,\n property: decl.property,\n value: nextValue,\n deterministic: true,\n },\n {\n symbols: [tokenName, scssVar],\n editKind: \"replaceStyleValue\",\n valuePreserving: true,\n },\n ix\n )\n : undefined;\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity ?? \"warn\",\n message: hasScssVariable\n ? `var(${tokenName}) is missing an SCSS fallback. Use var(${tokenName}, ${scssVar}).`\n : `var(${tokenName}) is missing a fallback. No matching SCSS variable was found in the token source; add a fallback manually or define ${scssVar}.`,\n location: decl.location,\n evidence: ix.evidence([decl.id, token.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n tokenName,\n },\n fix: fixEmission?.fix,\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n tokenName,\n ...(nextValue ? { suggestedValue: nextValue } : {}),\n ...(fixEmission?.downgradeReason\n ? { downgradeReason: fixEmission.downgradeReason }\n : {}),\n source: \"css\",\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction indexTokensByCssVariable(\n tokens: readonly TokenDefinitionFact[]\n): Map<string, TokenDefinitionFact> {\n const indexed = new Map<string, TokenDefinitionFact>();\n for (const token of tokens) {\n const cssVariable = token.name.startsWith(\"--\")\n ? token.name\n : token.name.startsWith(\"$\")\n ? `--${token.name.slice(1)}`\n : `--${token.name}`;\n const existing = indexed.get(cssVariable);\n if (!existing || token.referenceFormat === \"scss-var\") {\n indexed.set(cssVariable, token);\n }\n }\n return indexed;\n}\n","import type { FactIndex } from \"../facts/index.js\";\n\nimport { makeFinding } from \"./finding.js\";\nimport type { Finding } from \"./types.js\";\nimport { contractPrefixFamilies } from \"./utils.js\";\n\nexport const RULE_ID = \"tokens/css-vars-must-be-defined\";\nexport const RULE_VERSION = \"1\";\n\n// The leading `var(--name` of a reference. The `var(` keyword is matched\n// case-insensitively (CSS function names are case-insensitive per spec, so\n// `VAR(`/`Var(` must be caught — #33) but the captured custom-property name stays\n// case-preserving (custom-property names ARE case-sensitive; vocabulary.has must\n// stay exact). We judge ONLY the PRIMARY var() position — everything in fallback\n// position (a nested `var()`, a `$`/literal fallback) is ignored uniformly (#17):\n// after each match we skip past this var()'s matching close-paren so an inner\n// fallback var() is never re-scanned as a fresh primary.\nconst CSS_VAR_REFERENCE = /var\\(\\s*(--[A-Za-z0-9_-]+)/gi;\n\n/**\n * Off-contract token drift (FUI2015).\n *\n * Activation is gated entirely on the `style.cssVars.mustBeDefined` policy fact,\n * which is declared ONLY when a project has authored token source files (the\n * cloud appends it when `tokenSourceFiles` is non-empty). No fact → no-op, so\n * the `fragments` preset alone never activates this rule.\n *\n * When active, a `var(--x)` is drift iff `--x` is shaped like a contract token\n * but is NOT in the vocabulary. \"Shaped like a contract token\" means one of:\n * 1. it shares a prefix family of the authored vocabulary (e.g. `--fui-`); OR\n * 2. it is single-segment (no hyphen after `--`, e.g. `--accent`) AND the\n * vocabulary itself contains at least one single-segment token.\n * Clause 2 keeps the rule live for FLAT token systems (`--accent`, `--bg`, which\n * yield no prefix family — #22/#25/#31/#36) and enforces the flat half of a MIXED\n * `--fui-*` + `--accent` vocabulary symmetrically with the namespaced half (#18),\n * order-independently. Genuinely foreign custom properties (`--swiper-*`,\n * `--radix-*`, layout/animation vars) are multi-segment with no shared family, so\n * they remain ignored — the rule neither floods on unrelated `var()`s nor fires\n * for projects without a contract. Hardcoded values are handled by the unchanged\n * `styles/no-raw-color` rule; this rule only judges custom-property references.\n */\nexport function ruleTokensCssVarsMustBeDefined(ix: FactIndex): Finding[] {\n const policy = ix.policy.cssVarsMustBeDefined();\n if (!policy) return [];\n\n // The contract vocabulary travels on its OWN fact channel (contract_token),\n // injected by the CLI from the user's token source files — kept separate from\n // the local `token_definition` facts the raw-* rules + scale detection read.\n const vocabulary = new Set(ix.byKind(\"contract_token\").map((token) => token.name));\n // The truly-unauthored case (no contract token facts) is the only hard return —\n // it preserves the §11 inert-without-contract regression lock.\n if (vocabulary.size === 0) return [];\n\n // A flat/single-segment vocabulary (`--accent`, `--bg`) yields no prefix family,\n // but the rule must STILL enforce it (#22/#25/#31/#36) — we no longer hard-return\n // on an empty family set. `hasFlatTokens` lets single-segment refs through the\n // shaped gate whenever the vocabulary itself declares single-segment tokens,\n // which also enforces the flat half of a mixed vocabulary symmetrically (#18).\n const prefixes = contractPrefixFamilies(vocabulary);\n const hasFlatTokens = [...vocabulary].some(isSingleSegmentVarName);\n const locallyDefinedCustomProperties = new Set(\n ix\n .byKind(\"style_declaration\")\n .filter((decl) => decl.property.startsWith(\"--\"))\n .map((decl) => decl.property)\n );\n\n const findings: Finding[] = [];\n\n for (const decl of ix.byKind(\"style_declaration\")) {\n // Dedupe token names WITHIN one declaration so a value referencing the SAME\n // off-contract var twice yields ONE finding (#11) — otherwise the two share an\n // identical fingerprintIdentity and silently collapse to one at ingest. Scoped\n // per-declaration: the same var in two DIFFERENT declarations still yields two.\n const seen = new Set<string>();\n CSS_VAR_REFERENCE.lastIndex = 0;\n let match: RegExpExecArray | null;\n while ((match = CSS_VAR_REFERENCE.exec(decl.value)) !== null) {\n const tokenName = match[1];\n // Advance past this var()'s matching close-paren so an inner fallback var()\n // is never re-scanned as a fresh primary — only the PRIMARY position is\n // judged (#17). `var(` starts at match.index, so the `(` is at +3.\n CSS_VAR_REFERENCE.lastIndex = skipToCloseParen(decl.value, match.index + 3);\n\n if (vocabulary.has(tokenName)) continue;\n const shaped =\n sharesContractPrefix(tokenName, prefixes) ||\n (hasFlatTokens && isSingleSegmentVarName(tokenName)) ||\n locallyDefinedCustomProperties.has(tokenName);\n if (!shaped) continue;\n if (seen.has(tokenName)) continue;\n seen.add(tokenName);\n\n findings.push(\n makeFinding({\n ruleId: RULE_ID,\n ruleVersion: RULE_VERSION,\n severity: policy.severity,\n message: `var(${tokenName}) is not in the contract token vocabulary. Use a token defined in your contract's token source files.`,\n location: decl.location,\n evidence: ix.evidence([decl.id, policy.id]),\n fingerprintIdentity: {\n file: decl.file,\n selector: decl.selector,\n declarationPath: decl.declarationPath,\n property: decl.property,\n tokenName,\n },\n attributes: {\n property: decl.property,\n rawValue: decl.value,\n tokenName,\n source: \"css\",\n },\n })\n );\n }\n }\n\n return findings;\n}\n\nfunction sharesContractPrefix(name: string, prefixes: ReadonlySet<string>): boolean {\n for (const prefix of prefixes) {\n if (name.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/**\n * Whether a `--name` is single-segment (no hyphen after the leading `--`), e.g.\n * `--accent` (true) vs `--fui-color-accent` / `--swiper-theme-color` (false).\n * Mirrors `contractPrefixFamilies`' index-of(`-`, 2) so the two stay consistent.\n */\nfunction isSingleSegmentVarName(name: string): boolean {\n return name.indexOf(\"-\", 2) === -1;\n}\n\n/**\n * Index just past the `)` that closes the open paren AT `openParenIndex`\n * (a balanced-paren scan, so a nested fallback `var(--a, var(--b))` is skipped as\n * one unit). Returns the string length if the value is unbalanced (no close),\n * which safely ends the scan.\n */\nfunction skipToCloseParen(value: string, openParenIndex: number): number {\n let depth = 0;\n for (let i = openParenIndex; i < value.length; i++) {\n const ch = value[i];\n if (ch === \"(\") depth++;\n else if (ch === \")\") {\n depth--;\n if (depth === 0) return i + 1;\n }\n }\n return value.length;\n}\n","/**\n * The blocking deny-set — the SINGLE source of truth for \"which findings may\n * hard-deny a UI write\" across every altitude of the contract: the CLI\n * pre-write hook (Node) AND the Contract Mode emit gate (a browser-safe\n * serverless route). Lifted out of `packages/cli/src/hook/check.ts`\n * (Contract Mode Phase 0) so the two cannot fork — a deny here must imply a CI\n * failure, and that invariant only holds if both read the same criteria.\n *\n * Pure and browser-safe: it reads only a `Finding`'s `ruleId` / `severity` /\n * `fix` shape — no Node APIs, no config off disk, no clock. The CLI hook\n * re-exports `isDenyEligible` from here.\n */\nimport { canBlock } from \"../evidence.js\";\nimport { severityLevel } from \"../severity.js\";\nimport type { Finding } from \"./types.js\";\n\n/**\n * The ONLY rules whose findings may hard-deny a write: deterministic,\n * single-file-decidable, high-confidence classes (architecture Open Q2). A rule\n * is added here DELIBERATELY — new rules gain no blocking power by default, so a\n * future heuristic rule can't silently start denying writes. Heuristic/INFERRED\n * classes (`composition/*`, `tailwind/*arbitrary*`) are absent on purpose: at\n * most advisory, never a block.\n */\nexport const BLOCKING_RULE_ALLOWLIST: ReadonlySet<string> = new Set([\n \"styles/no-raw-color\", // raw hex/rgb/hsl color literal\n \"styles/no-raw-spacing\", // off-scale / untokenized spacing literal\n \"tailwind/off-scale-spacing-token\", // off-scale Tailwind spacing utility\n \"components/prefer-library\", // raw element bypasses a canonical component\n \"components/preferred-component\", // imported component bypasses its canonical\n]);\n\n/**\n * A finding gates CI only when its evidence is source-backed or stronger, it is\n * not explicitly advisory, and its severity is configured to gate. Missing\n * grades are treated as source-backed for compatibility with older reports.\n */\nexport function gatesCi(finding: Finding, failOnWarnings: boolean): boolean {\n if (!canBlock(finding.evidenceGrade ?? \"source_backed\")) return false;\n if (finding.attributes?.advisory === true) return false;\n const level = severityLevel(finding.severity);\n return level === \"error\" || (failOnWarnings && level === \"warn\");\n}\n\n/** A finding may deny iff it is allowlisted, gates CI, and is not heuristic. */\nexport function isDenyEligible(finding: Finding, failOnWarnings: boolean): boolean {\n if (!BLOCKING_RULE_ALLOWLIST.has(finding.ruleId)) return false;\n // Advisory findings — the low-confidence precision tiers a rule flags with\n // `attributes.advisory` (prefer-library's role-reimpl / interactive-div /\n // html-advisory / icon-only tiers, and the reimplements-primitive className\n // heuristic) — are surfaced but NEVER block a write, even if a project raises\n // their severity or sets failOnWarnings. Same \"only deny when the engine is\n // confident\" principle as the non-deterministic-fix guard below.\n if (finding.attributes?.advisory === true) return false;\n if (!gatesCi(finding, failOnWarnings)) return false;\n // Most explicitly non-deterministic fixes are the engine's own low-confidence\n // signal (for example, several tokens share a value). A prefer-library\n // finding may still be an exact policy violation, but hard-denying it is only\n // DX-safe when the configured mapping proves that every observed prop can be\n // preserved. The conform AST preflight independently checks the source and\n // binding before any edit is applied.\n if (finding.fix?.deterministic === false) {\n if (\n finding.ruleId !== \"components/prefer-library\" ||\n finding.attributes?.propCompatibility !== \"observed-complete\"\n ) {\n return false;\n }\n }\n return true;\n}\n","/**\n * Rule taxonomy — the single source of truth for tier classification.\n *\n * Every governance rule is either:\n * - **Tier A (contract vocabulary)** — measures drift from a vocabulary the\n * team *declared* (the two-choice contract: canonical components + token\n * source files). Headline-eligible; on by default but *inert until a\n * contract is authored* (each Tier-A rule self-gates on its contract facts).\n * - **Tier B (generic hygiene)** — generic best-practice opinions (raw values,\n * a11y, theme literals, Tailwind). Never the headline; off by default for\n * customers, opt-in per rule.\n *\n * This map is consumed by the core customer-default preset (`./presets.ts`), the\n * cloud policy composer, and the UI rules editor. There is exactly one copy —\n * importers derive their defaults from it rather than re-listing rules (DRY).\n *\n * Identifiers are stable: this introduces no new rule ids, it only attaches a\n * tier label to existing ones.\n */\n\nexport type RuleTier = \"contract\" | \"hygiene\";\n\n/**\n * Tier of every rule in `RULES`. Tier A is exactly the two-choice-contract\n * rules; everything else is hygiene. A coverage test asserts this map and\n * `RULES` stay in lock-step (every rule id classified, no strays).\n */\nexport const RULE_TIER: Readonly<Record<string, RuleTier>> = {\n // ---- Tier A — contract vocabulary -------------------------------------\n \"components/prefer-library\": \"contract\", // canonical-component bypass (FUI1004)\n \"tokens/css-vars-must-be-defined\": \"contract\", // token drift (FUI2015)\n\n // ---- Tier B — generic hygiene -----------------------------------------\n \"components/unknown-prop\": \"hygiene\",\n \"components/forbidden-prop-value\": \"hygiene\",\n \"props/invalid-value\": \"hygiene\",\n \"imports/preferred-path\": \"hygiene\",\n \"components/preferred-component\": \"hygiene\",\n \"styles/no-raw-color\": \"hygiene\",\n \"styles/no-raw-dimensions\": \"hygiene\",\n \"styles/no-raw-spacing\": \"hygiene\",\n \"styles/no-raw-typography\": \"hygiene\",\n \"tailwind/arbitrary-color\": \"hygiene\",\n \"tailwind/arbitrary-spacing\": \"hygiene\",\n \"tailwind/forbidden-palette\": \"hygiene\",\n \"tailwind/off-scale-spacing-token\": \"hygiene\",\n \"tailwind/raw-color-via-token\": \"hygiene\",\n \"tailwind/unknown-class\": \"hygiene\",\n \"tokens/require-dual-fallback\": \"hygiene\",\n \"theme/no-theme-coupled-literal\": \"hygiene\",\n \"a11y/required-accessible-name\": \"hygiene\",\n // Composition constraints are authored contracts, but not part of the\n // two-choice headline contract; they self-activate when patterns are declared\n // (the compiler injects their configs), so off-by-default here is harmless.\n \"composition/cardinality\": \"hygiene\",\n \"composition/co-occurrence\": \"hygiene\",\n};\n\n/**\n * Rules removed from the customer default preset *entirely* — Fragments-internal\n * conventions that are meaningless on a customer repo. They remain available\n * under the full `fragments` preset for Fragments' own dogfooding; they are\n * never even an opt-in toggle in the customer default.\n *\n * `tokens/require-dual-fallback` — the `var(--x, $x)` SCSS micro-convention —\n * was ~51% of the dogfood flood and is the canonical example.\n */\nexport const FRAGMENTS_INTERNAL_RULE_IDS: ReadonlySet<string> = new Set([\n \"tokens/require-dual-fallback\",\n]);\n\n/** Tier of a rule id. Unknown ids fail safe to `hygiene` (off by default). */\nexport function tierFor(ruleId: string): RuleTier {\n return RULE_TIER[ruleId] ?? \"hygiene\";\n}\n\n/** True when the rule measures declared-contract drift (headline-eligible). */\nexport function isContractTierRule(ruleId: string): boolean {\n return tierFor(ruleId) === \"contract\";\n}\n\n/** All Tier-A (contract vocabulary) rule ids, in declaration order. */\nexport function contractTierRuleIds(): string[] {\n return Object.keys(RULE_TIER).filter(isContractTierRule);\n}\n\n/** All Tier-B (generic hygiene) rule ids, in declaration order. */\nexport function hygieneTierRuleIds(): string[] {\n return Object.keys(RULE_TIER).filter((id) => !isContractTierRule(id));\n}\n\n/**\n * Vocabulary-first headline order: canonical-component bypass ranks above token\n * drift, both above any hygiene. This is the SSOT the dashboard headline (brief\n * 05) consumes so \"vocabulary-first\" is defined once, not re-encoded per surface.\n */\nconst VOCABULARY_ORDER: readonly string[] = [\n \"components/prefer-library\",\n \"tokens/css-vars-must-be-defined\",\n];\n\n/** Headline rank of a rule id (lower = higher in the vocabulary-first list). */\nexport function vocabularyRank(ruleId: string): number {\n const index = VOCABULARY_ORDER.indexOf(ruleId);\n return index >= 0 ? index : VOCABULARY_ORDER.length;\n}\n\n/** Comparator ordering rule ids vocabulary-first (Tier A before hygiene). */\nexport function compareByVocabularyRank(a: string, b: string): number {\n return vocabularyRank(a) - vocabularyRank(b);\n}\n","/**\n * Rule presets — the customer default vs the full `fragments` dogfood preset.\n *\n * Both are derived from the tier SSOT (`./tiers.ts`); neither re-lists rules.\n *\n * - **customer default** — Tier A on (inert until a contract is authored),\n * Tier B off, Fragments-internal rules excluded entirely. This is the\n * vocabulary-first, no-flood default a customer repo gets.\n * - **`fragments`** — every rule on, for Fragments' own internal scans.\n *\n * These produce the rule-config half of a `GovernanceConfig`. The hygiene\n * *policy facts* (e.g. `style.rawColors.forbid`, spacing scales) are a separate\n * config axis the customer default simply omits — so a Tier-B rule that gates on\n * a policy fact (raw-color/spacing/typography) stays inert regardless of its\n * config flag, and the customer default produces zero findings without a\n * contract.\n */\n\nimport {\n FRAGMENTS_INTERNAL_RULE_IDS,\n RULE_TIER,\n isContractTierRule,\n} from \"./tiers.js\";\n\nexport interface PresetRuleState {\n enabled: boolean;\n severity?: \"error\" | \"warn\" | \"info\";\n}\n\n/**\n * Customer default rule states: Tier A enabled (self-gating on contract facts),\n * Tier B disabled, Fragments-internal rules omitted entirely. Feed directly to\n * `compileGlobalGovernanceFacts({ rules })` (with no hygiene `styles` config).\n */\nexport function customerDefaultRuleStates(): Record<string, PresetRuleState> {\n const states: Record<string, PresetRuleState> = {};\n for (const ruleId of Object.keys(RULE_TIER)) {\n if (FRAGMENTS_INTERNAL_RULE_IDS.has(ruleId)) continue;\n states[ruleId] = isContractTierRule(ruleId)\n ? { enabled: true, severity: \"warn\" }\n : { enabled: false };\n }\n return states;\n}\n\n/**\n * Full `fragments` preset rule states: every rule on. Includes the\n * Fragments-internal rules (e.g. `tokens/require-dual-fallback`) the customer\n * default excludes.\n */\nexport function fragmentsPresetRuleStates(): Record<string, PresetRuleState> {\n const states: Record<string, PresetRuleState> = {};\n for (const ruleId of Object.keys(RULE_TIER)) {\n states[ruleId] = { enabled: true, severity: \"warn\" };\n }\n return states;\n}\n","/**\n * Rules — pure functions over `FactIndex` that return `Finding[]`.\n *\n * Phase 5 ships five generic rules. They are content-addressed: scanning the\n * same source twice produces the same fingerprints, so Cloud can dedupe and\n * preserve event history. Rules never reach into raw fact arrays — every\n * lookup goes through `FactIndex`.\n */\n\nimport type { FactIndex } from \"../facts/index.js\";\n\nimport { ruleA11yRequiredAccessibleName } from \"./a11y-required-accessible-name.js\";\nimport { ruleComponentsPreferLibrary } from \"./components-prefer-library.js\";\nimport { ruleComponentsForbiddenPropValue } from \"./components-forbidden-prop-value.js\";\nimport { ruleComponentsUnknownProp } from \"./components-unknown-prop.js\";\nimport { ruleCompositionCardinality, ruleCompositionCoOccurrence } from \"./composition-pattern.js\";\nimport { ruleJsxPreferredComponent } from \"./jsx-preferred-component.js\";\nimport { ruleJsxPreferredImportPath } from \"./jsx-preferred-import-path.js\";\nimport { rulePropsInvalidValue } from \"./props-invalid-value.js\";\nimport { ruleStylesNoRawColor } from \"./styles-no-raw-color.js\";\nimport { ruleStylesNoRawDimensions } from \"./styles-no-raw-dimensions.js\";\nimport { ruleStylesNoRawSpacing } from \"./styles-no-raw-spacing.js\";\nimport { ruleStylesNoRawTypography } from \"./styles-no-raw-typography.js\";\nimport { ruleThemeNoThemeCoupledLiteral } from \"./theme-no-theme-coupled-literal.js\";\nimport { ruleTailwindArbitraryColor } from \"./tailwind-arbitrary-color.js\";\nimport { ruleTailwindArbitrarySpacing } from \"./tailwind-arbitrary-spacing.js\";\nimport { ruleTailwindForbiddenPalette } from \"./tailwind-forbidden-palette.js\";\nimport { ruleTailwindOffScaleSpacingToken } from \"./tailwind-off-scale-spacing-token.js\";\nimport { ruleTailwindRawColorViaToken } from \"./tailwind-raw-color-via-token.js\";\nimport { ruleTailwindUnknownClass } from \"./tailwind-unknown-class.js\";\nimport { ruleTokensRequireDualFallback } from \"./tokens-require-dual-fallback.js\";\nimport { ruleTokensCssVarsMustBeDefined } from \"./tokens-css-vars-must-be-defined.js\";\nimport type { Finding } from \"./types.js\";\n\nexport type RuleFn = (ix: FactIndex) => Finding[];\n\nexport interface Rule {\n id: string;\n version: string;\n run: RuleFn;\n}\n\nexport const RULES: readonly Rule[] = [\n {\n id: \"components/unknown-prop\",\n version: \"1\",\n run: ruleComponentsUnknownProp,\n },\n {\n id: \"components/forbidden-prop-value\",\n version: \"1\",\n run: ruleComponentsForbiddenPropValue,\n },\n {\n id: \"props/invalid-value\",\n version: \"1\",\n run: rulePropsInvalidValue,\n },\n {\n id: \"imports/preferred-path\",\n version: \"1\",\n run: ruleJsxPreferredImportPath,\n },\n {\n id: \"components/preferred-component\",\n version: \"1\",\n run: ruleJsxPreferredComponent,\n },\n {\n id: \"components/prefer-library\",\n version: \"1\",\n run: ruleComponentsPreferLibrary,\n },\n {\n id: \"styles/no-raw-color\",\n version: \"1\",\n run: ruleStylesNoRawColor,\n },\n {\n id: \"styles/no-raw-dimensions\",\n version: \"1\",\n run: ruleStylesNoRawDimensions,\n },\n {\n id: \"styles/no-raw-spacing\",\n version: \"1\",\n run: ruleStylesNoRawSpacing,\n },\n {\n id: \"styles/no-raw-typography\",\n version: \"1\",\n run: ruleStylesNoRawTypography,\n },\n {\n id: \"tailwind/arbitrary-color\",\n version: \"1\",\n run: ruleTailwindArbitraryColor,\n },\n {\n id: \"tailwind/arbitrary-spacing\",\n version: \"1\",\n run: ruleTailwindArbitrarySpacing,\n },\n {\n id: \"tailwind/forbidden-palette\",\n version: \"1\",\n run: ruleTailwindForbiddenPalette,\n },\n {\n id: \"tailwind/off-scale-spacing-token\",\n version: \"1\",\n run: ruleTailwindOffScaleSpacingToken,\n },\n {\n id: \"tailwind/raw-color-via-token\",\n version: \"1\",\n run: ruleTailwindRawColorViaToken,\n },\n {\n id: \"tailwind/unknown-class\",\n version: \"1\",\n run: ruleTailwindUnknownClass,\n },\n {\n id: \"tokens/require-dual-fallback\",\n version: \"1\",\n run: ruleTokensRequireDualFallback,\n },\n {\n id: \"tokens/css-vars-must-be-defined\",\n version: \"1\",\n run: ruleTokensCssVarsMustBeDefined,\n },\n {\n id: \"theme/no-theme-coupled-literal\",\n version: \"1\",\n run: ruleThemeNoThemeCoupledLiteral,\n },\n {\n id: \"a11y/required-accessible-name\",\n version: \"1\",\n run: ruleA11yRequiredAccessibleName,\n },\n {\n id: \"composition/cardinality\",\n version: \"1\",\n run: ruleCompositionCardinality,\n },\n {\n id: \"composition/co-occurrence\",\n version: \"1\",\n run: ruleCompositionCoOccurrence,\n },\n];\n\n/**\n * Run every Phase 5 rule and return findings sorted by `(file, line, column,\n * fingerprint)` so output is stable across runs.\n */\nexport function runRules(ix: FactIndex): Finding[] {\n const findings: Finding[] = [];\n for (const rule of RULES) findings.push(...rule.run(ix));\n return sortFindings(findings);\n}\n\nfunction sortFindings(findings: Finding[]): Finding[] {\n return findings.slice().sort((a, b) => {\n const fileCmp = a.location.file.localeCompare(b.location.file);\n if (fileCmp !== 0) return fileCmp;\n if (a.location.line !== b.location.line) return a.location.line - b.location.line;\n if (a.location.column !== b.location.column) return a.location.column - b.location.column;\n return a.fingerprint.localeCompare(b.fingerprint);\n });\n}\n\nexport type {\n Finding,\n FindingFix,\n FindingReplaceComponentFix,\n FindingReplaceImportFix,\n FindingReplacePropValueFix,\n FindingReplaceStyleValueFix,\n FindingReplaceClassTokenFix,\n} from \"./types.js\";\nexport { makeFinding } from \"./finding.js\";\n// Blocking deny-set (Contract Mode Phase 0): the shared \"may this finding\n// hard-deny a write\" criteria, used by the CLI pre-write hook and the emit gate.\nexport { BLOCKING_RULE_ALLOWLIST, gatesCi, isDenyEligible } from \"./emit-gate.js\";\nexport { ruleComponentsUnknownProp } from \"./components-unknown-prop.js\";\nexport { ruleComponentsForbiddenPropValue } from \"./components-forbidden-prop-value.js\";\nexport { ruleComponentsPreferLibrary } from \"./components-prefer-library.js\";\nexport { rulePropsInvalidValue } from \"./props-invalid-value.js\";\nexport { ruleJsxPreferredImportPath } from \"./jsx-preferred-import-path.js\";\nexport { ruleJsxPreferredComponent } from \"./jsx-preferred-component.js\";\nexport { ruleStylesNoRawColor } from \"./styles-no-raw-color.js\";\nexport { ruleStylesNoRawDimensions } from \"./styles-no-raw-dimensions.js\";\nexport { ruleStylesNoRawSpacing } from \"./styles-no-raw-spacing.js\";\nexport { ruleStylesNoRawTypography } from \"./styles-no-raw-typography.js\";\nexport { ruleTailwindArbitraryColor } from \"./tailwind-arbitrary-color.js\";\nexport { ruleTailwindArbitrarySpacing } from \"./tailwind-arbitrary-spacing.js\";\nexport { ruleTailwindForbiddenPalette } from \"./tailwind-forbidden-palette.js\";\nexport { ruleTailwindOffScaleSpacingToken } from \"./tailwind-off-scale-spacing-token.js\";\nexport { ruleTailwindRawColorViaToken } from \"./tailwind-raw-color-via-token.js\";\nexport { ruleTailwindUnknownClass } from \"./tailwind-unknown-class.js\";\nexport { ruleTokensRequireDualFallback } from \"./tokens-require-dual-fallback.js\";\nexport { ruleTokensCssVarsMustBeDefined } from \"./tokens-css-vars-must-be-defined.js\";\nexport { ruleThemeNoThemeCoupledLiteral } from \"./theme-no-theme-coupled-literal.js\";\nexport { ruleA11yRequiredAccessibleName } from \"./a11y-required-accessible-name.js\";\nexport { ruleCompositionCardinality, ruleCompositionCoOccurrence } from \"./composition-pattern.js\";\nexport {\n RULE_TIER,\n FRAGMENTS_INTERNAL_RULE_IDS,\n tierFor,\n isContractTierRule,\n contractTierRuleIds,\n hygieneTierRuleIds,\n vocabularyRank,\n compareByVocabularyRank,\n} from \"./tiers.js\";\nexport type { RuleTier } from \"./tiers.js\";\nexport { customerDefaultRuleStates, fragmentsPresetRuleStates } from \"./presets.js\";\nexport type { PresetRuleState } from \"./presets.js\";\nexport {\n compositionPatternSchema,\n compositionAuthoringEntrySchema,\n isCompositionPattern,\n lowerCompositionContract,\n} from \"./composition-pattern-schema.js\";\nexport type {\n CompositionPattern,\n CompositionRegionSelector,\n CompositionChildSelector,\n CompositionConstraint,\n CompositionAuthoringEntry,\n} from \"./composition-pattern-schema.js\";\n","/**\n * Governance integrity — a pure verdict over a FULLY-resolved governance policy\n * that answers \"is this governance actually armed, or merely declared?\".\n *\n * The load-bearing distinction is **enabled ≠ armed**. A rule can be `enabled`\n * in the policy yet inert because it has no vocabulary to measure against:\n * `components/prefer-library` with no effective canonical source enforces\n * nothing; `tokens/css-vars-must-be-defined` with an empty token vocabulary\n * enforces nothing. This module derives, per rule *family*, whether the family\n * is armed (has both an enabled rule AND the vocabulary/signal it needs), then\n * rolls those up into a single status.\n *\n * Browser-safe and filesystem-free: it never reads the repo. All file-derived\n * signals (token vocabulary size, whether the css-vars rule is active) are\n * supplied by the caller, which is also responsible for fully resolving the\n * policy (merging presets / localCanonical / designSystem / enrichment) BEFORE\n * calling in.\n */\n\nimport type { CanonicalSource, GovernanceConfig, GovernanceSeverity } from \"./governance.js\";\nimport { compileGlobalGovernanceFacts } from \"./facts/index.js\";\nimport { FRAGMENTS_INTERNAL_RULE_IDS, RULE_TIER } from \"./rules/tiers.js\";\nimport { BLOCKING_RULE_ALLOWLIST } from \"./rules/emit-gate.js\";\n\nexport type GovernanceIntegrityStatus = \"healthy\" | \"degraded\" | \"inert\";\n\nexport type GovernanceIntegrityFamilyId =\n | \"policy\"\n | \"components\"\n | \"tokens\"\n | \"hygiene\"\n | \"blocking-deny\";\n\nexport interface GovernanceIntegrityFamily {\n id: GovernanceIntegrityFamilyId;\n armed: boolean;\n rules: string[];\n reason?: string;\n remediation?: string;\n}\n\nexport interface GovernanceIntegrityInput {\n /**\n * FULLY resolved policy — the caller merges presets / localCanonical /\n * designSystem / enrichment first. `undefined` means no policy at all.\n */\n policy: GovernanceConfig | undefined;\n policySource: \"config\" | \"preset\" | \"fallback\" | \"none\";\n /** Any governance intent signal present (caller computes). */\n declared: boolean;\n /** Size of the contract token vocabulary; core cannot read files. */\n tokenVocabularySize?: number;\n /** Whether `tokens/css-vars-must-be-defined` is activated (caller supplies). */\n cssVarsActive?: boolean;\n mode?: \"scan\" | \"ci\" | \"hook\" | \"doctor\" | \"setup\";\n}\n\nexport interface GovernanceIntegrityVerdict {\n status: GovernanceIntegrityStatus;\n declared: boolean;\n fatalForCi: boolean;\n blockingCapable: boolean;\n families: GovernanceIntegrityFamily[];\n armed: GovernanceIntegrityFamilyId[];\n summary: string;\n remediations: string[];\n}\n\ninterface EffectiveRuleConfig {\n enabled: boolean;\n severity?: GovernanceSeverity;\n options?: Record<string, unknown>;\n}\n\n/**\n * Whether a canonical source contributes an effective component vocabulary.\n *\n * Mirrors `sourceIncludesComponent` in `./rules/components-prefer-library.ts`\n * (a follow-up refactor will make that rule import this): a `directory` source\n * with no `include` is a wildcard (armed); an explicit `include` must be\n * non-empty; a package-like `npm`/`registry` source with no `include` is NOT an\n * effective vocabulary, because it has no export inventory to enumerate.\n */\nexport function isEffectiveCanonicalSource(source: CanonicalSource): boolean {\n return source.include !== undefined ? source.include.length > 0 : source.kind === \"directory\";\n}\n\n/**\n * Whether `components/prefer-library`'s effective options carry a real component\n * vocabulary: at least one canonical mapping, or at least one effective\n * canonical source. Accepts the raw fact `options` bag (values are `unknown`).\n */\nexport function hasEffectiveComponentVocabulary(\n options: Record<string, unknown> | undefined\n): boolean {\n const mappings = options?.[\"canonicalMappings\"];\n if (Array.isArray(mappings) && mappings.length > 0) return true;\n const sources = options?.[\"canonicalSources\"];\n return (\n Array.isArray(sources) &&\n sources.some((source) => isEffectiveCanonicalSource(source as CanonicalSource))\n );\n}\n\n/**\n * Compile the policy to effective per-rule configs, keyed by rule id. Reuses the\n * fact compiler so the effective enabled/severity/options match exactly what the\n * scan engine sees (including the canonicalSources → prefer-library injection).\n */\nfunction effectiveRuleConfigs(\n policy: GovernanceConfig | undefined\n): Map<string, EffectiveRuleConfig> {\n const configs = new Map<string, EffectiveRuleConfig>();\n for (const fact of compileGlobalGovernanceFacts(policy)) {\n if (fact.kind !== \"governance_rule_config\") continue;\n configs.set(fact.ruleId, {\n enabled: fact.enabled,\n severity: fact.severity,\n options: fact.options,\n });\n }\n return configs;\n}\n\n/** Whether the policy declares the css-vars-must-be-defined style rule. */\nfunction policyDeclaresCssVars(policy: GovernanceConfig | undefined): boolean {\n return Boolean(policy?.styles?.some((style) => style.kind === \"style.cssVars.mustBeDefined\"));\n}\n\nfunction dedupe(values: string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction summarize(\n status: GovernanceIntegrityStatus,\n flags: { componentsArmed: boolean; tokensArmed: boolean; blockingArmed: boolean }\n): string {\n if (status === \"inert\") {\n return \"Governance inert — no enforceable rule family is armed\";\n }\n if (status === \"degraded\") {\n return \"Governance degraded — hygiene rules armed but no contract vocabulary is declared\";\n }\n const contract: string[] = [];\n if (flags.componentsArmed) contract.push(\"components\");\n if (flags.tokensArmed) contract.push(\"tokens\");\n const suffix = flags.blockingArmed ? \", blocking-capable\" : \"\";\n return `Governance healthy — contract vocabulary armed (${contract.join(\" + \")})${suffix}`;\n}\n\nexport function evaluateGovernanceIntegrity(\n input: GovernanceIntegrityInput\n): GovernanceIntegrityVerdict {\n const configs = effectiveRuleConfigs(input.policy);\n\n // --- policy family --------------------------------------------------------\n const policyArmed = input.policy !== undefined && input.policySource !== \"none\";\n const policyFamily: GovernanceIntegrityFamily = {\n id: \"policy\",\n armed: policyArmed,\n rules: [],\n };\n if (!policyArmed) {\n policyFamily.reason = \"no governance policy resolved\";\n }\n\n // --- components family ----------------------------------------------------\n const componentsConfig = configs.get(\"components/prefer-library\");\n const componentsArmed =\n componentsConfig?.enabled === true && hasEffectiveComponentVocabulary(componentsConfig.options);\n const componentsFamily: GovernanceIntegrityFamily = {\n id: \"components\",\n armed: componentsArmed,\n rules: [\"components/prefer-library\"],\n };\n if (!componentsArmed) {\n if (componentsConfig?.enabled === true) {\n componentsFamily.reason =\n \"components/prefer-library enabled but no effective canonical source\";\n componentsFamily.remediation =\n \"add govern.canonicalSources (a directory source, or npm/registry with a non-empty include) or designSystem.path/packageName\";\n } else {\n componentsFamily.reason = \"components/prefer-library not enabled\";\n componentsFamily.remediation =\n \"add govern.canonicalSources (a directory source, or npm/registry with a non-empty include) or designSystem.path/packageName\";\n }\n }\n\n // --- tokens family --------------------------------------------------------\n const cssVarsActive = input.cssVarsActive ?? policyDeclaresCssVars(input.policy);\n const tokenVocabularySize = input.tokenVocabularySize ?? 0;\n const tokensArmed = cssVarsActive === true && tokenVocabularySize > 0;\n const tokensFamily: GovernanceIntegrityFamily = {\n id: \"tokens\",\n armed: tokensArmed,\n rules: [\"tokens/css-vars-must-be-defined\"],\n };\n if (!tokensArmed) {\n if (!cssVarsActive) {\n tokensFamily.reason = \"tokens/css-vars-must-be-defined not active\";\n tokensFamily.remediation =\n \"activate the css-vars rule (govern.styles: style.cssVars.mustBeDefined)\";\n } else {\n tokensFamily.reason = \"no token vocabulary\";\n tokensFamily.remediation =\n \"declare token source files so the contract token vocabulary is non-empty\";\n }\n }\n\n // --- hygiene family -------------------------------------------------------\n const hygieneRules: string[] = [];\n for (const [ruleId, config] of configs) {\n if (config.enabled !== true) continue;\n if (RULE_TIER[ruleId] !== \"hygiene\") continue;\n if (FRAGMENTS_INTERNAL_RULE_IDS.has(ruleId)) continue;\n hygieneRules.push(ruleId);\n }\n hygieneRules.sort();\n const hygieneArmed = hygieneRules.length > 0;\n const hygieneFamily: GovernanceIntegrityFamily = {\n id: \"hygiene\",\n armed: hygieneArmed,\n rules: hygieneRules,\n };\n if (!hygieneArmed) {\n hygieneFamily.reason = \"no hygiene-tier rule enabled\";\n }\n\n // --- blocking-deny family -------------------------------------------------\n const failOnWarnings = input.policy?.ci?.failOnWarnings === true;\n const blockingRules: string[] = [];\n for (const ruleId of BLOCKING_RULE_ALLOWLIST) {\n const config = configs.get(ruleId);\n if (config?.enabled !== true) continue;\n const familyArmed = ruleId === \"components/prefer-library\" ? componentsArmed : hygieneArmed;\n if (!familyArmed) continue;\n if (config.severity !== \"error\" && !failOnWarnings) continue;\n blockingRules.push(ruleId);\n }\n blockingRules.sort();\n const blockingArmed = blockingRules.length > 0;\n const blockingFamily: GovernanceIntegrityFamily = {\n id: \"blocking-deny\",\n armed: blockingArmed,\n rules: blockingRules,\n };\n if (!blockingArmed) {\n blockingFamily.reason = \"no blocking-capable rule (armed rules are warn-severity only)\";\n blockingFamily.remediation =\n 'raise a blocking-eligible rule to severity \"error\", or set ci.failOnWarnings: true';\n }\n\n // --- roll-up --------------------------------------------------------------\n const contractArmed = componentsArmed || tokensArmed;\n const enforceableArmed = componentsArmed || tokensArmed || hygieneArmed;\n const status: GovernanceIntegrityStatus = !enforceableArmed\n ? \"inert\"\n : contractArmed\n ? \"healthy\"\n : \"degraded\";\n const fatalForCi = input.declared && status === \"inert\";\n\n const families: GovernanceIntegrityFamily[] = [\n policyFamily,\n componentsFamily,\n tokensFamily,\n hygieneFamily,\n blockingFamily,\n ];\n const armed = families.filter((family) => family.armed).map((family) => family.id);\n const remediations = dedupe(\n families\n .map((family) => family.remediation)\n .filter((remediation): remediation is string => remediation !== undefined)\n );\n const summary = summarize(status, { componentsArmed, tokensArmed, blockingArmed });\n\n return {\n status,\n declared: input.declared,\n fatalForCi,\n blockingCapable: blockingArmed,\n families,\n armed,\n summary,\n remediations,\n };\n}\n","/**\n * Frontend Contract preimage — the projection that defines what the contract IS.\n *\n * The FCID used to be a hash of the raw `code-contracts` artifact payload. That\n * conflated identity with display: a copy-edit to a component description moved\n * the hash, and tokens / canonical mappings / policy — the things gates actually\n * enforce — were not part of identity at all. This module widens the preimage to\n * the full enforcement surface as ONE shared projection, imported by both Cloud\n * (mint) and the CLI (reportedHash). Neither side may reimplement it: parity is\n * a property of the shared import, not a test you can fail.\n *\n * Enforced-only is implemented structurally: {@link projectContractPreimage}\n * copies an explicit pick-list of fields per domain. Anything an adapter passes\n * beyond that list (descriptions, docs URLs, timestamps, heuristic signals)\n * never reaches the hash. Proposed canonical mappings are excluded for the same\n * reason — they cannot block, so they are not identity; confirmation is the\n * moment a mapping enters the contract.\n *\n * The preimage itself is the record of four domain sub-hashes, so\n * `contractHash(preimage)` is the fcid and a domain diff is a four-string\n * compare — no deep structural diffing. Determinism (key sorting, undefined\n * dropping, number normalization) is inherited from `canonicalPreimage`; this\n * module adds element-level sorting for the arrays it owns and nothing else.\n *\n * Runtime-portable by construction: no Node APIs, no Convex imports, no React.\n */\nimport type { GovernanceConfig } from \"../governance.js\";\nimport { projectV1OwnedComponentId, projectV1OwnedImportIdentity } from \"../package-identity.js\";\nimport { canonicalPreimage, contractHash } from \"./hash.js\";\n\n// ---------------------------------------------------------------------------\n// Domains\n// ---------------------------------------------------------------------------\n\n/**\n * The fixed domain enum. Adding a domain is a spine change (update\n * `01-architecture.md` first); never rename — deprecate and alias.\n */\nexport const CONTRACT_DOMAINS = [\"components\", \"tokens\", \"canonicalMap\", \"policy\"] as const;\n\nexport type ContractDomain = (typeof CONTRACT_DOMAINS)[number];\n\n// ---------------------------------------------------------------------------\n// Catalog input — the neutral shape adapters assemble\n// ---------------------------------------------------------------------------\n\n/**\n * One component's enforcement identity. Props are the *name* membership surface\n * (what unknown-prop checks today); prop types/defaults are not enforced by the\n * rules engine, so they are not identity — enforced-only cuts both ways.\n */\nexport interface ContractComponentInput {\n name: string;\n /** Parent component name when this is a subcomponent (compound identity). */\n parentName?: string;\n /** Prop names the component accepts. */\n props?: readonly string[];\n /**\n * The per-component enforcement contract as authored (bans, a11y rules,\n * required compound children). Passed through whole — it is enforcement data\n * by definition.\n */\n contract?: unknown;\n /** Required compound-children names, when the structure is declared. */\n compoundChildren?: readonly string[];\n}\n\nexport interface ContractTokenInput {\n name: string;\n value: string | number;\n type?: string;\n}\n\nexport type CanonicalMappingStatus = \"confirmed\" | \"proposed\" | \"unknown\";\n\nexport interface ContractPropMappingInput {\n rawProp: string;\n canonicalProp: string;\n valueMap?: Readonly<Record<string, string>>;\n}\n\nexport interface ContractCanonicalMappingInput {\n /** The raw/source component the mapping covers. */\n component: string;\n /** The canonical component it maps to. */\n canonical: string;\n status: CanonicalMappingStatus;\n /** Local/offline canonical import target, when the mapping is config-authored. */\n importPath?: string;\n /** Explicit raw element or semantic resolutions covered by a local declaration. */\n resolves?: readonly {\n tag: string;\n role?: string;\n inputType?: string;\n }[];\n propMapping?: readonly ContractPropMappingInput[];\n}\n\n/**\n * An authored waiver record. Hashed as data — including `expiresOn` as a plain\n * date string. Expiry *evaluation* happens at enforcement time and must never\n * change the fcid (no time-dependent hashing).\n */\nexport interface ContractWaiverInput {\n id: string;\n /** The diagnostic code or rule the waiver suppresses. */\n target: string;\n reason: string;\n /** YYYY-MM-DD, treated as opaque data. */\n expiresOn?: string;\n}\n\n/**\n * Active policy: everything that changes what a gate would allow or deny.\n * Waivers live here (spine open question 1, resolved): a waiver changes what\n * blocks, so it is enforcement-relevant.\n */\nexport interface ContractPolicyInput {\n rules?: Readonly<Record<string, unknown>>;\n codes?: Readonly<Record<string, unknown>>;\n compositionPatterns?: readonly unknown[];\n waivers?: readonly ContractWaiverInput[];\n}\n\n/**\n * The neutral catalog shape both adapters (Cloud mint, CLI scan) assemble.\n * Adapters gather data; the projection owns all normalization — element order,\n * optional fields, and display-data stripping never reach the hash.\n */\nexport interface ContractCatalogInput {\n components?: readonly ContractComponentInput[];\n tokens?: readonly ContractTokenInput[];\n canonicalMappings?: readonly ContractCanonicalMappingInput[];\n policy?: ContractPolicyInput | null;\n}\n\n// ---------------------------------------------------------------------------\n// Preimage\n// ---------------------------------------------------------------------------\n\nexport const CONTRACT_PREIMAGE_SCHEMA = \"fcid-preimage:v1\" as const;\n/** Request header used by clients that can verify and consume this preimage. */\nexport const CONTRACT_PREIMAGE_CAPABILITY_HEADER = \"X-Fragments-Contract-Preimage\" as const;\n\n/**\n * The hashed identity record: four domain sub-hashes plus the projection schema\n * version (so an intentional projection change mints a new fcid). The fcid is\n * `contractHash(preimage)` — hash of the domain hashes, per the spine pipeline.\n */\nexport interface ContractPreimage {\n schema: typeof CONTRACT_PREIMAGE_SCHEMA;\n domains: Record<ContractDomain, string>;\n}\n\n/**\n * Wire-compatible identity pin carried by Cloud policy responses. Older\n * contract rows may omit the schema/domains, so every field except the FCID is\n * intentionally nullable at this boundary.\n */\nexport interface ContractIdentityPin {\n contractHash: string;\n preimageSchema?: string | null;\n domainHashes?: Readonly<Record<string, string>> | null;\n}\n\nconst SHA256_HEX_PATTERN = /^[0-9a-f]{64}$/u;\n\n/**\n * Reconstruct and verify the canonical preimage behind a published FCID.\n *\n * This is the only supported bridge from the additive ledger/wire shape\n * (`preimageSchema` + `domainHashes`) back to the hash input. Consumers must\n * not trust `enforcedIdentityComparable` on its own: a malformed, partial, or\n * internally inconsistent pin returns `null` and therefore fails closed.\n */\nexport function verifiedContractPreimageFromPin(pin: ContractIdentityPin): ContractPreimage | null {\n if (\n pin.preimageSchema !== CONTRACT_PREIMAGE_SCHEMA ||\n !SHA256_HEX_PATTERN.test(pin.contractHash) ||\n !pin.domainHashes ||\n typeof pin.domainHashes !== \"object\"\n ) {\n return null;\n }\n\n const keys = Object.keys(pin.domainHashes).sort();\n const expectedKeys = [...CONTRACT_DOMAINS].sort();\n if (\n keys.length !== expectedKeys.length ||\n keys.some((key, index) => key !== expectedKeys[index])\n ) {\n return null;\n }\n\n const domains = Object.fromEntries(\n CONTRACT_DOMAINS.map((domain) => [domain, pin.domainHashes?.[domain]])\n ) as Record<ContractDomain, string | undefined>;\n if (CONTRACT_DOMAINS.some((domain) => !SHA256_HEX_PATTERN.test(domains[domain] ?? \"\"))) {\n return null;\n }\n\n const preimage: ContractPreimage = {\n schema: CONTRACT_PREIMAGE_SCHEMA,\n domains: domains as Record<ContractDomain, string>,\n };\n return contractHash(preimage) === pin.contractHash ? preimage : null;\n}\n\n/**\n * Sort projected elements by their canonical serialization: total, deterministic,\n * and independent of adapter iteration order, without per-type comparators.\n */\nfunction sortCanonical<T>(items: readonly T[]): T[] {\n return items\n .map((item) => ({ item, key: canonicalPreimage(item) }))\n .sort((a, b) => (a.key < b.key ? -1 : a.key > b.key ? 1 : 0))\n .map(({ item }) => item);\n}\n\nfunction projectComponents(components: readonly ContractComponentInput[] | undefined): unknown {\n return sortCanonical(\n (components ?? []).map((component) => ({\n name: component.name,\n parentName: component.parentName,\n props: component.props ? [...component.props].sort() : undefined,\n contract: component.contract,\n compoundChildren: component.compoundChildren\n ? [...component.compoundChildren].sort()\n : undefined,\n }))\n );\n}\n\nfunction projectTokens(tokens: readonly ContractTokenInput[] | undefined): unknown {\n return sortCanonical(\n (tokens ?? []).map((token) => ({\n name: token.name,\n value: token.value,\n type: token.type,\n }))\n );\n}\n\nfunction projectCanonicalMap(\n mappings: readonly ContractCanonicalMappingInput[] | undefined\n): unknown {\n return sortCanonical(\n (mappings ?? [])\n .filter((mapping) => mapping.status === \"confirmed\")\n .map((mapping) => ({\n component: mapping.component,\n canonical: mapping.canonical,\n importPath: mapping.importPath\n ? projectV1OwnedImportIdentity(mapping.importPath)\n : undefined,\n resolves: mapping.resolves ? sortCanonical(mapping.resolves) : undefined,\n propMapping: mapping.propMapping\n ? sortCanonical(\n mapping.propMapping.map((entry) => ({\n rawProp: entry.rawProp,\n canonicalProp: entry.canonicalProp,\n valueMap: entry.valueMap,\n }))\n )\n : undefined,\n }))\n );\n}\n\n/**\n * Project only structured npm-identity fields inside policy material. This is\n * deliberately key- and record-aware: arbitrary strings, repository names,\n * provenance, product markers, and third-party package values retain their\n * original bytes.\n */\nfunction projectV1PolicyMaterial(value: unknown, key?: string): unknown {\n if (typeof value === \"string\") {\n if (key === \"specifier\" || key === \"importPath\") {\n return projectV1OwnedImportIdentity(value);\n }\n if (key === \"componentId\") {\n return projectV1OwnedComponentId(value);\n }\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((entry) => projectV1PolicyMaterial(entry));\n }\n if (!value || typeof value !== \"object\") return value;\n\n const record = value as Readonly<Record<string, unknown>>;\n const isImportPathRule = record.kind === \"jsx.importPath.prefer\";\n return Object.fromEntries(\n Object.entries(record).map(([field, fieldValue]) => {\n if (\n isImportPathRule &&\n (field === \"from\" || field === \"to\") &&\n typeof fieldValue === \"string\"\n ) {\n return [field, projectV1OwnedImportIdentity(fieldValue)];\n }\n return [field, projectV1PolicyMaterial(fieldValue, field)];\n })\n );\n}\n\nfunction projectPolicy(policy: ContractPolicyInput | null | undefined): unknown {\n if (!policy) return null;\n return {\n rules: projectV1PolicyMaterial(policy.rules),\n codes: policy.codes,\n compositionPatterns: policy.compositionPatterns\n ? sortCanonical(policy.compositionPatterns)\n : undefined,\n waivers: policy.waivers\n ? sortCanonical(\n policy.waivers.map((waiver) => ({\n id: waiver.id,\n target: waiver.target,\n reason: waiver.reason,\n expiresOn: waiver.expiresOn,\n }))\n )\n : undefined,\n };\n}\n\n/**\n * Project a catalog onto the contract preimage: four enforced-only domain\n * bodies, each hashed independently. `contractHash(projectContractPreimage(x))`\n * is the fcid.\n */\nexport function projectContractPreimage(catalog: ContractCatalogInput): ContractPreimage {\n return {\n schema: CONTRACT_PREIMAGE_SCHEMA,\n domains: {\n components: contractHash(projectComponents(catalog.components)),\n tokens: contractHash(projectTokens(catalog.tokens)),\n canonicalMap: contractHash(projectCanonicalMap(catalog.canonicalMappings)),\n policy: contractHash(projectPolicy(catalog.policy)),\n },\n };\n}\n\n/**\n * Name the domains whose identity differs between two preimages — a four-string\n * compare, no structural diffing. Returned in fixed {@link CONTRACT_DOMAINS}\n * order. Staleness checks compare these, never whole fcids.\n */\nexport function diffContractDomains(a: ContractPreimage, b: ContractPreimage): ContractDomain[] {\n return CONTRACT_DOMAINS.filter((domain) => a.domains[domain] !== b.domains[domain]);\n}\n\n/**\n * Map defineFragment-shaped records — the `code-contracts` payload's\n * `fragments` array (Cloud mint) or the CLI's loaded fragment definitions —\n * onto their enforcement identity. The one shared mapping is what keeps the\n * two adapters from drifting into a second \"catalog → preimage\"\n * implementation: both sides gather fragments however they like, then this\n * picks the identity fields. Records without a string `meta.name` are skipped\n * (no identity to hash).\n */\n/**\n * The enforced-only slice of a resolved CLI governance config — the fields\n * that change what a scan allows or denies. CI gate options, agent repair\n * order, and runner config change how/when gates run, not what they enforce,\n * so they are not identity. This pick-list lives here, beside the projection,\n * so adapters cannot drift into private enforced-only boundaries: a new\n * enforcement field on {@link GovernanceConfig} is added to the contract in\n * exactly one place.\n */\nexport function contractPolicyFromGovernanceConfig(\n config: GovernanceConfig | null | undefined\n): ContractPolicyInput | null {\n if (!config) return null;\n return {\n rules: {\n severity: config.severity,\n rules: config.rules,\n scales: config.scales,\n styles: config.styles,\n jsx: config.jsx,\n tailwind: config.tailwind,\n components: config.components,\n overrides: config.overrides,\n },\n codes: config.codes as Readonly<Record<string, unknown>> | undefined,\n compositionPatterns: config.compositionPatterns as readonly unknown[] | undefined,\n };\n}\n\nexport function contractComponentsFromFragments(\n fragments: readonly unknown[]\n): ContractComponentInput[] {\n const components: ContractComponentInput[] = [];\n for (const candidate of fragments) {\n const fragment = candidate as {\n meta?: { name?: unknown; parentComponentName?: unknown };\n props?: Record<string, unknown>;\n contract?: unknown;\n structure?: { compoundChildren?: unknown };\n } | null;\n const name = fragment?.meta?.name;\n if (typeof name !== \"string\" || !name) continue;\n const parentName = fragment?.meta?.parentComponentName;\n const rawChildren = fragment?.structure?.compoundChildren;\n const compoundChildren = Array.isArray(rawChildren)\n ? rawChildren\n .map((child) => (child as { name?: unknown } | null)?.name)\n .filter((childName): childName is string => typeof childName === \"string\")\n : undefined;\n components.push({\n name,\n parentName: typeof parentName === \"string\" ? parentName : undefined,\n props: Object.keys(fragment?.props ?? {}),\n contract: fragment?.contract,\n compoundChildren,\n });\n }\n return components;\n}\n","/**\n * The shared contract pin formatter. Every surface that shows a human the\n * contract identity — MCP metadata, agent context files, hook output, CI check\n * text, PR comments — interpolates the string this\n * function returns; no surface reformats it. One formatter is what makes\n * \"compare the hashes yourself\" a falsifiable claim instead of three surfaces\n * rendering the pin three ways.\n *\n * Display convention (spine \"Identifiers\"): never a bare hash without the\n * version, never a version without the hash.\n */\n\nimport { CONTRACT_DOMAINS, type ContractDomain } from \"./preimage.js\";\n\n/** The committed agent context file every gate reads for local contract stamps. */\nexport const AGENT_CONTEXT_RELATIVE_PATH = \".fragments/agent-context.md\";\n\n/** Length of the abbreviated fcid in the display form. */\nconst SHORT_FCID_LENGTH = 7;\n\nexport interface ContractStampPin {\n /** Monotonic, human-facing version from the ledger. */\n contractVersion: number;\n /** The 64-hex FCID; abbreviated for display. */\n fcid: string;\n}\n\nexport interface ContractStampRecord extends ContractStampPin {\n /** Full 64-hex domain sub-hashes, when known. */\n domains?: Record<ContractDomain, string>;\n}\n\n/**\n * The bare `v12 · a3f9e21` form, for surfaces where \"contract\" is already said\n * by the surrounding copy (e.g. the hook staleness line's `local v11 · 9c01b22`).\n * {@link formatStampPin} delegates here so the two forms can never drift.\n */\nexport function formatStampVersionHash(pin: ContractStampPin): string {\n return `v${pin.contractVersion} · ${pin.fcid.slice(0, SHORT_FCID_LENGTH)}`;\n}\n\n/**\n * Render the canonical pin: `contract v12 · a3f9e21`.\n */\nexport function formatStampPin(pin: ContractStampPin): string {\n return `contract ${formatStampVersionHash(pin)}`;\n}\n\n/** The context-file header form: `fragments contract v12 · a3f9e21`. */\nexport function formatStampHeader(pin: ContractStampPin): string {\n return `fragments ${formatStampPin(pin)}`;\n}\n\n/**\n * Serialize pin + full fcid (+ domain hashes when known) as plain header lines —\n * no markdown syntax, so the block is safe inside YAML-ish frontmatter and\n * inside HTML-comment blocks. The first line carries the literal\n * {@link formatStampHeader} output; surfaces grep for that substring, so the\n * header form and the serialized form may never diverge.\n */\nexport function serializeContractStamp(record: ContractStampRecord): string {\n const lines = [`contract: ${formatStampHeader(record)}`, `contract-fcid: ${record.fcid}`];\n if (record.domains) {\n const domains = record.domains;\n lines.push(\n `contract-domains: ${CONTRACT_DOMAINS.map((domain) => `${domain}=${domains[domain]}`).join(\" \")}`\n );\n }\n return lines.join(\"\\n\");\n}\n\n// Line-anchored so the stamp is found anywhere in a file — frontmatter, an\n// HTML-comment block, or a marker-merged region — without parsing the host\n// format.\nconst STAMP_HEADER_LINE = /^contract:\\s*fragments contract v(\\d+) · ([0-9a-f]+)\\s*$/mu;\nconst STAMP_FCID_LINE = /^contract-fcid:\\s*([0-9a-f]{64})\\s*$/mu;\nconst STAMP_DOMAINS_LINE = /^contract-domains:\\s*(\\S.*?)\\s*$/mu;\n\n/**\n * Parse a stamp record back out of arbitrary file text. Requires the\n * `contract:` + `contract-fcid:` lines and an abbreviated fcid that prefixes\n * the full one; `contract-domains` is optional. Returns null when absent or\n * malformed — never throws.\n */\nexport function parseContractStamp(text: string): ContractStampRecord | null {\n const header = STAMP_HEADER_LINE.exec(text);\n const fcidLine = STAMP_FCID_LINE.exec(text);\n if (!header || !fcidLine) return null;\n const contractVersion = Number(header[1]);\n if (!Number.isSafeInteger(contractVersion)) return null;\n const fcid = fcidLine[1];\n if (!fcid.startsWith(header[2])) return null;\n\n const domainsLine = STAMP_DOMAINS_LINE.exec(text);\n if (!domainsLine) return { contractVersion, fcid };\n\n const domains = {} as Record<ContractDomain, string>;\n for (const pair of domainsLine[1].split(/\\s+/u)) {\n const match = /^([a-zA-Z]+)=([0-9a-f]{64})$/u.exec(pair);\n if (!match || !(CONTRACT_DOMAINS as readonly string[]).includes(match[1])) return null;\n domains[match[1] as ContractDomain] = match[2];\n }\n if (CONTRACT_DOMAINS.some((domain) => !domains[domain])) return null;\n return { contractVersion, fcid, domains };\n}\n","/**\n * `catalog-fixture-a` — the committed reference catalog shared by the contract\n * acceptance cases (contract-identity ACCEPTANCE §1–§4) and the Cloud-side\n * parity test. Small but full-surface: components with props, tokens, one\n * confirmed + one proposed canonical mapping, a policy with rules, a\n * composition pattern, and one authored waiver.\n *\n * `CATALOG_FIXTURE_A_FCID` is the golden value for\n * `contractHash(projectContractPreimage(catalogFixtureA))`. Cloud's Convex\n * parity test imports BOTH from here, so an intentional projection change is\n * updated in exactly one place and every runtime follows (ACCEPTANCE §1).\n */\nimport type { ContractCatalogInput } from \"./preimage.js\";\n\nexport const catalogFixtureA: ContractCatalogInput = {\n components: [\n {\n name: \"Button\",\n props: [\"variant\", \"size\", \"disabled\"],\n contract: { bans: [{ prop: \"style\", reason: \"token-governed surface\" }] },\n },\n {\n name: \"Card\",\n props: [\"padding\"],\n compoundChildren: [\"Card.Header\", \"Card.Body\"],\n },\n {\n name: \"Card.Header\",\n parentName: \"Card\",\n props: [\"title\"],\n },\n ],\n tokens: [\n { name: \"--fui-color-accent\", value: \"#3366ff\", type: \"color\" },\n { name: \"--fui-space-2\", value: \"8px\", type: \"dimension\" },\n { name: \"--fui-radius-md\", value: \"6px\", type: \"dimension\" },\n ],\n canonicalMappings: [\n {\n component: \"LegacyButton\",\n canonical: \"Button\",\n status: \"confirmed\",\n propMapping: [{ rawProp: \"kind\", canonicalProp: \"variant\" }],\n },\n {\n component: \"AppCard\",\n canonical: \"Card\",\n status: \"proposed\",\n },\n ],\n policy: {\n rules: {\n tokens_hardcoded_values: { enabled: true, severity: \"error\" },\n components_prefer_library: { enabled: true, severity: \"warning\" },\n },\n compositionPatterns: [\n { id: \"card-structure\", region: \"Card\", require: [\"Card.Header\"], severity: \"warning\" },\n ],\n waivers: [\n {\n id: \"waiver-001\",\n target: \"FUI4001\",\n reason: \"legacy promo banner, replacement tracked in #482\",\n expiresOn: \"2026-09-30\",\n },\n ],\n },\n};\n\n/**\n * Golden fcid for {@link catalogFixtureA}. Regenerate only on an intentional\n * projection change: `contractHash(projectContractPreimage(catalogFixtureA))`.\n */\nexport const CATALOG_FIXTURE_A_FCID =\n \"41ae847b36618f25a9aa73bda47851f6467e30ce4bcfb5a5aa25d27fee3fee54\";\n\n/**\n * The same fixture expressed as Cloud-shaped mint materials: the\n * `code-contracts` payload body and the DTCG token document that assemble to\n * exactly {@link catalogFixtureA} through the adapters. Kept here so a fixture\n * edit happens in one file — the core §1 test guards the payload↔components\n * equivalence, and Cloud's parity test asserts the golden fcid end to end.\n */\nexport const catalogFixtureAContractPayload = {\n fragments: [\n {\n meta: { name: \"Button\" },\n props: { variant: {}, size: {}, disabled: {} },\n contract: { bans: [{ prop: \"style\", reason: \"token-governed surface\" }] },\n },\n {\n meta: { name: \"Card\" },\n props: { padding: {} },\n structure: {\n compoundChildren: [{ name: \"Card.Header\" }, { name: \"Card.Body\" }],\n },\n },\n {\n meta: { name: \"Card.Header\", parentComponentName: \"Card\" },\n props: { title: {} },\n },\n ],\n};\n\n/** DTCG form of {@link catalogFixtureA}'s tokens (flattened Cloud-side). */\nexport const catalogFixtureATokensDtcg = {\n \"--fui-color-accent\": { $value: \"#3366ff\", $type: \"color\" },\n \"--fui-space-2\": { $value: \"8px\", $type: \"dimension\" },\n \"--fui-radius-md\": { $value: \"6px\", $type: \"dimension\" },\n};\n","import type { ContractCanonicalMappingInput } from \"./contract/index.js\";\nimport type { GovernanceConfig } from \"./governance.js\";\n\nexport interface LocalCanonicalResolveRule {\n tag: string;\n role?: string;\n inputType?: string;\n}\n\nexport interface LocalCanonicalDeclaration {\n importPath: string;\n resolves: readonly LocalCanonicalResolveRule[];\n}\n\nexport interface InspectConfig {\n localCanonical?: Readonly<Record<string, LocalCanonicalDeclaration>>;\n}\n\ninterface PreferLibraryRuleConfig {\n enabled?: boolean;\n severity?: \"error\" | \"warn\" | \"info\";\n options?: {\n canonicalMappings?: unknown[];\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\n\nexport function localCanonicalContractMappings(\n inspect: InspectConfig | null | undefined\n): ContractCanonicalMappingInput[] {\n return localCanonicalRuleMappings(inspect).map((mapping) => ({\n component: mapping.htmlEquivalent,\n canonical: mapping.name,\n status: \"confirmed\",\n importPath: mapping.importPath,\n resolves: [\n {\n tag: mapping.htmlEquivalent,\n ...(mapping.ariaRole ? { role: mapping.ariaRole } : {}),\n ...(mapping.htmlType ? { inputType: mapping.htmlType } : {}),\n },\n ],\n }));\n}\n\nexport function governanceConfigWithLocalCanonical(\n config: GovernanceConfig | undefined,\n inspect: InspectConfig | null | undefined\n): GovernanceConfig | undefined {\n const localMappings = localCanonicalRuleMappings(inspect);\n if (localMappings.length === 0) return config;\n\n const existingRule = readPreferLibraryRule(config);\n const existingOptions = existingRule.options ?? {};\n return {\n ...(config ?? {}),\n rules: {\n ...(config?.rules ?? {}),\n \"components/prefer-library\": {\n ...existingRule,\n enabled: existingRule.enabled ?? true,\n severity: existingRule.severity ?? \"error\",\n options: {\n ...existingOptions,\n canonicalMappings: [\n ...(Array.isArray(existingOptions.canonicalMappings)\n ? existingOptions.canonicalMappings\n : []),\n ...localMappings,\n ],\n },\n },\n },\n };\n}\n\nfunction localCanonicalRuleMappings(inspect: InspectConfig | null | undefined) {\n return Object.entries(inspect?.localCanonical ?? {}).flatMap(([name, declaration]) =>\n declaration.resolves.map((rule) => ({\n name,\n canonical: name,\n htmlEquivalent: rule.tag,\n ...(rule.role ? { ariaRole: rule.role } : {}),\n ...(rule.inputType ? { htmlType: rule.inputType } : {}),\n importPath: declaration.importPath,\n confidence: 1,\n // Provenance: the user explicitly declared this tag → component mapping\n // (not an inferred htmlEquivalent), so prefer-library may enforce a\n // specific interactive tag against this exact (possibly non-Fragments)\n // component name. See isEnforceableHtmlEquivalent(explicit).\n declaredHtmlEquivalent: true,\n }))\n );\n}\n\nfunction readPreferLibraryRule(config: GovernanceConfig | undefined): PreferLibraryRuleConfig {\n const raw = config?.rules?.[\"components/prefer-library\"];\n return raw && typeof raw === \"object\" && !Array.isArray(raw)\n ? (raw as PreferLibraryRuleConfig)\n : {};\n}\n"],"mappings":"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","names":["coverageEvaluated","z","g","z","figma","z","z","z","category","name","rawValue","g","z","z","children","RULE_ID","RULE_VERSION","suggestedComponent","suggestedImport","precisionTier","componentId","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_VERSION","componentId","RULE_ID","RULE_VERSION","componentId","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","formatValue","buildMessage","g","RULE_ID","RULE_VERSION","node","componentEvidenceId","evidenceIds","normalizeColor","g","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","buildFix","RULE_ID","RULE_VERSION","sourceLabel","RULE_ID","RULE_VERSION","node","evidenceIds","RULE_ID","RULE_VERSION","RULE_ID","RULE_VERSION"]}