@fragments-sdk/cli 0.15.0 → 0.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/{ai-client-I6MDWNYA.js → ai-client-LSLQGOMM.js} +1 -2
  2. package/dist/bin.js +565 -548
  3. package/dist/bin.js.map +1 -1
  4. package/dist/chunk-5JF26E55.js +1255 -0
  5. package/dist/chunk-5JF26E55.js.map +1 -0
  6. package/dist/{chunk-XJQ5BIWI.js → chunk-6SQPP47U.js} +30 -314
  7. package/dist/chunk-6SQPP47U.js.map +1 -0
  8. package/dist/{chunk-65WSVDV5.js → chunk-HQ6A6DTV.js} +1386 -1097
  9. package/dist/chunk-HQ6A6DTV.js.map +1 -0
  10. package/dist/chunk-MHIBEEW4.js +511 -0
  11. package/dist/chunk-MHIBEEW4.js.map +1 -0
  12. package/dist/{chunk-CZD3AD4Q.js → chunk-ONUP6Z4W.js} +17 -6
  13. package/dist/chunk-ONUP6Z4W.js.map +1 -0
  14. package/dist/{codebase-scanner-VOTPXRYW.js → codebase-scanner-MQHUZC2G.js} +1 -2
  15. package/dist/{converter-JLINP7CJ.js → converter-7XM3Y6NJ.js} +1 -2
  16. package/dist/{converter-JLINP7CJ.js.map → converter-7XM3Y6NJ.js.map} +1 -1
  17. package/dist/core/index.js +0 -1
  18. package/dist/create-JVAU3YKN.js +852 -0
  19. package/dist/create-JVAU3YKN.js.map +1 -0
  20. package/dist/doctor-BDPMYYE6.js +385 -0
  21. package/dist/doctor-BDPMYYE6.js.map +1 -0
  22. package/dist/{generate-A4FP5426.js → generate-PVOLUAAC.js} +3 -4
  23. package/dist/{generate-A4FP5426.js.map → generate-PVOLUAAC.js.map} +1 -1
  24. package/dist/{govern-scan-UCBZR6D6.js → govern-scan-OYFZYOQW.js} +142 -9
  25. package/dist/govern-scan-OYFZYOQW.js.map +1 -0
  26. package/dist/index.d.ts +2 -22
  27. package/dist/index.js +8 -7
  28. package/dist/index.js.map +1 -1
  29. package/dist/{init-HGSM35XA.js → init-SSGUSP7Z.js} +3 -4
  30. package/dist/{init-HGSM35XA.js.map → init-SSGUSP7Z.js.map} +1 -1
  31. package/dist/{init-cloud-MQ6GRJAZ.js → init-cloud-3DNKPWFB.js} +29 -4
  32. package/dist/{init-cloud-MQ6GRJAZ.js.map → init-cloud-3DNKPWFB.js.map} +1 -1
  33. package/dist/mcp-bin.js +1 -2
  34. package/dist/mcp-bin.js.map +1 -1
  35. package/dist/node-37AUE74M.js +65 -0
  36. package/dist/push-contracts-WY32TFP6.js +84 -0
  37. package/dist/push-contracts-WY32TFP6.js.map +1 -0
  38. package/dist/{scan-VNNKACG2.js → scan-PKSYSTRR.js} +5 -5
  39. package/dist/{scan-generate-TWRHNU5M.js → scan-generate-VY27PIOX.js} +8 -9
  40. package/dist/scan-generate-VY27PIOX.js.map +1 -0
  41. package/dist/{scanner-7LAZYPWZ.js → scanner-4KZNOXAK.js} +1 -2
  42. package/dist/{service-FHQU7YS7.js → service-QJGWUIVL.js} +16 -9
  43. package/dist/{snapshot-KQEQ6XHL.js → snapshot-WIJMEIFT.js} +1 -2
  44. package/dist/{snapshot-KQEQ6XHL.js.map → snapshot-WIJMEIFT.js.map} +1 -1
  45. package/dist/{static-viewer-63PG6FWY.js → static-viewer-7QIBQZRC.js} +1 -2
  46. package/dist/{test-UQYUCZIS.js → test-64Z5BKBA.js} +2 -3
  47. package/dist/{test-UQYUCZIS.js.map → test-64Z5BKBA.js.map} +1 -1
  48. package/dist/token-normalizer-TEPOVBPV.js +312 -0
  49. package/dist/token-normalizer-TEPOVBPV.js.map +1 -0
  50. package/dist/token-parser-32KOIOFN.js +22 -0
  51. package/dist/token-parser-32KOIOFN.js.map +1 -0
  52. package/dist/{tokens-6GYKDV6U.js → tokens-NZWFQIAB.js} +7 -7
  53. package/dist/{tokens-generate-VTZV5EEW.js → tokens-generate-5JQSJ27E.js} +1 -2
  54. package/dist/{tokens-generate-VTZV5EEW.js.map → tokens-generate-5JQSJ27E.js.map} +1 -1
  55. package/dist/tokens-push-HY3KO36V.js +148 -0
  56. package/dist/tokens-push-HY3KO36V.js.map +1 -0
  57. package/package.json +18 -16
  58. package/src/bin.ts +94 -1
  59. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/label.contract.json +1 -1
  60. package/src/commands/__fixtures__/shadcn-label-wrapper/src/components/ui/primitive.contract.json +1 -1
  61. package/src/commands/__tests__/build-freshness.test.ts +231 -0
  62. package/src/commands/__tests__/create.test.ts +71 -0
  63. package/src/commands/__tests__/drift-sync.test.ts +1 -1
  64. package/src/commands/__tests__/govern.test.ts +258 -0
  65. package/src/commands/__tests__/init.test.ts +9 -1
  66. package/src/commands/__tests__/scan-generate.test.ts +1 -1
  67. package/src/commands/build.ts +54 -1
  68. package/src/commands/context.ts +1 -1
  69. package/src/commands/create.ts +590 -0
  70. package/src/commands/doctor.ts +3 -2
  71. package/src/commands/govern-scan.ts +187 -8
  72. package/src/commands/govern.ts +65 -2
  73. package/src/commands/init-cloud.ts +32 -4
  74. package/src/commands/push-contracts.ts +112 -0
  75. package/src/commands/scan-generate.ts +1 -1
  76. package/src/commands/scan.ts +13 -0
  77. package/src/commands/sync.ts +2 -2
  78. package/src/commands/tokens-push.ts +199 -0
  79. package/src/core/__tests__/token-resolver.test.ts +1 -1
  80. package/src/core/component-extractor.test.ts +1 -1
  81. package/src/core/drift-verifier.ts +1 -1
  82. package/src/core/extractor-adapter.ts +1 -1
  83. package/src/index.ts +3 -3
  84. package/src/migrate/fragment-to-contract.ts +2 -2
  85. package/src/service/index.ts +8 -0
  86. package/src/service/tailwind-v4-parser.ts +314 -0
  87. package/src/service/token-parser.ts +56 -0
  88. package/src/setup.ts +10 -39
  89. package/src/theme/__tests__/component-contrast.test.ts +2 -2
  90. package/src/theme/__tests__/serializer.test.ts +1 -1
  91. package/src/theme/generator.ts +30 -1
  92. package/src/theme/schema.ts +8 -0
  93. package/src/theme/serializer.ts +13 -9
  94. package/src/theme/types.ts +8 -0
  95. package/src/validators.ts +1 -2
  96. package/dist/chunk-65WSVDV5.js.map +0 -1
  97. package/dist/chunk-7WHVW72L.js +0 -2664
  98. package/dist/chunk-7WHVW72L.js.map +0 -1
  99. package/dist/chunk-CZD3AD4Q.js.map +0 -1
  100. package/dist/chunk-MN3TJ3D5.js +0 -695
  101. package/dist/chunk-MN3TJ3D5.js.map +0 -1
  102. package/dist/chunk-XJQ5BIWI.js.map +0 -1
  103. package/dist/chunk-Z7EY4VHE.js +0 -50
  104. package/dist/govern-scan-UCBZR6D6.js.map +0 -1
  105. package/dist/sass.node-4XJK6YBF.js +0 -130708
  106. package/dist/sass.node-4XJK6YBF.js.map +0 -1
  107. package/dist/scan-generate-TWRHNU5M.js.map +0 -1
  108. package/src/build.ts +0 -736
  109. package/src/core/auto-props.ts +0 -464
  110. package/src/core/component-extractor.ts +0 -1121
  111. package/src/core/token-resolver.ts +0 -155
  112. package/src/viewer/preview-adapter.ts +0 -116
  113. /package/dist/{ai-client-I6MDWNYA.js.map → ai-client-LSLQGOMM.js.map} +0 -0
  114. /package/dist/{chunk-Z7EY4VHE.js.map → codebase-scanner-MQHUZC2G.js.map} +0 -0
  115. /package/dist/{codebase-scanner-VOTPXRYW.js.map → node-37AUE74M.js.map} +0 -0
  116. /package/dist/{scan-VNNKACG2.js.map → scan-PKSYSTRR.js.map} +0 -0
  117. /package/dist/{scanner-7LAZYPWZ.js.map → scanner-4KZNOXAK.js.map} +0 -0
  118. /package/dist/{service-FHQU7YS7.js.map → service-QJGWUIVL.js.map} +0 -0
  119. /package/dist/{static-viewer-63PG6FWY.js.map → static-viewer-7QIBQZRC.js.map} +0 -0
  120. /package/dist/{tokens-6GYKDV6U.js.map → tokens-NZWFQIAB.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/service/snippet-validation.ts","../src/validators.ts","../src/screenshot.ts","../src/diff.ts","../src/analyze.ts"],"sourcesContent":["import ts from 'typescript';\nimport { readFile } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { FragmentsConfig, SnippetPolicyConfig } from '../core/index.js';\nimport { BRAND } from '../core/index.js';\nimport {\n discoverBlockFiles,\n discoverFragmentFiles,\n extractComponentName,\n type DiscoveredFile,\n} from '../core/node.js';\n\nexport interface SnippetValidationOptions {\n mode?: 'warn' | 'error';\n scope?: 'snippet' | 'snippet+render';\n requireFullSnippet?: boolean;\n allowedExternalModules?: string[];\n componentStart?: string;\n componentLimit?: number;\n}\n\nexport interface SnippetValidationResult {\n errors: Array<{ file: string; message: string }>;\n warnings: Array<{ file: string; message: string }>;\n}\n\ninterface EffectiveSnippetPolicy {\n mode: 'warn' | 'error';\n scope: 'snippet' | 'snippet+render';\n requireFullSnippet: boolean;\n allowedExternalModules: Set<string>;\n componentStart?: string;\n componentLimit?: number;\n}\n\ninterface SourceContext {\n imports: Map<string, string>;\n localComponents: Set<string>;\n}\n\ninterface FileIssue {\n file: string;\n message: string;\n}\n\nconst INTRINSIC_TAGS = new Set([\n 'div',\n 'span',\n 'p',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'main',\n 'section',\n 'article',\n 'aside',\n 'nav',\n 'header',\n 'footer',\n 'ul',\n 'ol',\n 'li',\n 'button',\n 'input',\n 'textarea',\n 'label',\n 'svg',\n 'path',\n]);\n\nconst JSX_TAG_PATTERN = /<\\s*([A-Za-z][A-Za-z0-9.]*)\\b/g;\nconst STYLE_PATTERN = /\\bstyle\\s*=\\s*\\{/;\nconst TRANSPILED_PATTERN = /jsxDEV|_jsx|@__PURE__|\\bfileName\\s*:|\\blineNumber\\s*:|\\bcolumnNumber\\s*:/;\nconst ALIAS_DRIFT_PATTERN = /<\\s*[A-Z][A-Za-z0-9]*(?:Root|2)\\b/;\nconst HAS_IMPORT_PATTERN = /\\bimport\\s+[^;]+\\s+from\\s+['\"][^'\"]+['\"]/;\nconst HAS_JSX_PATTERN = /<\\s*[A-Za-z][A-Za-z0-9.]*\\b/;\n\nconst DEFAULT_POLICY: EffectiveSnippetPolicy = {\n mode: 'warn',\n scope: 'snippet+render',\n requireFullSnippet: true,\n allowedExternalModules: new Set([\n '@phosphor-icons/react',\n 'recharts',\n 'react-day-picker',\n ]),\n};\n\nfunction normalizePolicy(\n configured: SnippetPolicyConfig | undefined,\n overrides: SnippetValidationOptions\n): EffectiveSnippetPolicy {\n const fromConfig: EffectiveSnippetPolicy = {\n mode: configured?.mode ?? DEFAULT_POLICY.mode,\n scope: configured?.scope ?? DEFAULT_POLICY.scope,\n requireFullSnippet: configured?.requireFullSnippet ?? DEFAULT_POLICY.requireFullSnippet,\n allowedExternalModules: new Set(configured?.allowedExternalModules ?? [...DEFAULT_POLICY.allowedExternalModules]),\n componentStart: overrides.componentStart,\n componentLimit: overrides.componentLimit,\n };\n\n if (overrides.mode) fromConfig.mode = overrides.mode;\n if (overrides.scope) fromConfig.scope = overrides.scope;\n if (typeof overrides.requireFullSnippet === 'boolean') {\n fromConfig.requireFullSnippet = overrides.requireFullSnippet;\n }\n if (overrides.allowedExternalModules && overrides.allowedExternalModules.length > 0) {\n fromConfig.allowedExternalModules = new Set(overrides.allowedExternalModules);\n }\n\n return fromConfig;\n}\n\nfunction isFragmentsModule(modulePath: string): boolean {\n return (\n modulePath === '@fragments-sdk/ui'\n || modulePath === '.'\n || modulePath === '..'\n || modulePath.startsWith('@/components/')\n || modulePath.startsWith('@components/')\n || modulePath.startsWith('./')\n || modulePath.startsWith('../')\n );\n}\n\nfunction collectSourceContext(sourceFile: ts.SourceFile): SourceContext {\n const imports = new Map<string, string>();\n const localComponents = new Set<string>();\n\n function markLocal(name: string | undefined): void {\n if (!name) return;\n if (/^[A-Z]/.test(name)) {\n localComponents.add(name);\n }\n }\n\n function visit(node: ts.Node): void {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {\n const modulePath = node.moduleSpecifier.text;\n const clause = node.importClause;\n\n if (clause?.name) {\n imports.set(clause.name.text, modulePath);\n }\n\n if (clause?.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const item of clause.namedBindings.elements) {\n imports.set(item.name.text, modulePath);\n }\n }\n }\n\n if (ts.isFunctionDeclaration(node)) {\n markLocal(node.name?.text);\n }\n\n if (ts.isClassDeclaration(node)) {\n markLocal(node.name?.text);\n }\n\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name)) {\n markLocal(node.name.text);\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return { imports, localComponents };\n}\n\nfunction getJsxTags(code: string): string[] {\n const tags: string[] = [];\n JSX_TAG_PATTERN.lastIndex = 0;\n\n let match: RegExpExecArray | null;\n while ((match = JSX_TAG_PATTERN.exec(code)) !== null) {\n tags.push(match[1]);\n }\n\n return tags;\n}\n\nfunction rootTagName(tag: string): string {\n return tag.split('.')[0];\n}\n\nfunction parseSnippetImports(snippet: string): Map<string, string> {\n const sourceFile = ts.createSourceFile(\n 'snippet.tsx',\n snippet,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TSX,\n );\n return collectSourceContext(sourceFile).imports;\n}\n\nfunction findDefineCall(sourceFile: ts.SourceFile, name: 'defineFragment' | 'defineBlock'): ts.CallExpression | null {\n let result: ts.CallExpression | null = null;\n\n function visit(node: ts.Node): void {\n if (result) return;\n\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === name) {\n result = node;\n return;\n }\n\n ts.forEachChild(node, visit);\n }\n\n visit(sourceFile);\n return result;\n}\n\nfunction findProperty(obj: ts.ObjectLiteralExpression, propertyName: string): ts.Expression | null {\n for (const prop of obj.properties) {\n if (!ts.isPropertyAssignment(prop)) continue;\n if (!ts.isIdentifier(prop.name)) continue;\n if (prop.name.text === propertyName) {\n return prop.initializer;\n }\n }\n\n return null;\n}\n\nfunction readStaticString(expr: ts.Expression | null): string | null {\n if (!expr) return null;\n if (ts.isStringLiteral(expr) || ts.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.text;\n }\n return null;\n}\n\nfunction readRenderBody(renderExpr: ts.Expression, sourceFile: ts.SourceFile): string | null {\n if (!ts.isArrowFunction(renderExpr) && !ts.isFunctionExpression(renderExpr)) {\n return null;\n }\n\n const body = renderExpr.body;\n const start = body.getStart(sourceFile);\n const end = body.getEnd();\n return sourceFile.text.slice(start, end).trim();\n}\n\nfunction report(issues: FileIssue[], file: string, message: string): void {\n issues.push({ file, message });\n}\n\nfunction validateRawRules(\n issues: FileIssue[],\n file: string,\n label: string,\n code: string,\n): void {\n if (STYLE_PATTERN.test(code)) {\n report(issues, file, `${label}: inline style usage is not allowed; use Box/Stack/Text props.`);\n }\n\n if (TRANSPILED_PATTERN.test(code)) {\n report(issues, file, `${label}: transpiler output detected (jsxDEV/_jsx/@__PURE__). Use authored snippet source.`);\n }\n\n if (ALIAS_DRIFT_PATTERN.test(code)) {\n report(issues, file, `${label}: alias drift tag detected (*Root/*2). Use canonical component names.`);\n }\n\n const tags = getJsxTags(code);\n const intrinsic = tags\n .map((tag) => rootTagName(tag))\n .filter((tag) => /^[a-z]/.test(tag))\n .map((tag) => tag.toLowerCase())\n .filter((tag) => INTRINSIC_TAGS.has(tag));\n\n if (intrinsic.length > 0) {\n const names = [...new Set(intrinsic)].sort().join(', ');\n report(issues, file, `${label}: raw HTML tags are not allowed (${names}). Use Fragments primitives.`);\n }\n}\n\nfunction validateComponentAllowlist(\n issues: FileIssue[],\n file: string,\n label: string,\n code: string,\n imports: Map<string, string>,\n localComponents: Set<string>,\n policy: EffectiveSnippetPolicy,\n): void {\n const tags = getJsxTags(code);\n const seen = new Set<string>();\n\n for (const tag of tags) {\n const root = rootTagName(tag);\n\n if (seen.has(root)) continue;\n seen.add(root);\n\n if (!/^[A-Z]/.test(root)) {\n continue;\n }\n\n const modulePath = imports.get(root);\n\n if (modulePath) {\n if (isFragmentsModule(modulePath)) {\n continue;\n }\n if (policy.allowedExternalModules.has(modulePath)) {\n continue;\n }\n\n report(\n issues,\n file,\n `${label}: component \"${root}\" comes from \"${modulePath}\" and is not in snippets.allowedExternalModules.`,\n );\n continue;\n }\n\n if (localComponents.has(root)) {\n report(\n issues,\n file,\n `${label}: locally defined JSX component \"${root}\" is not allowed in snippets/renders. Import approved components instead.`,\n );\n continue;\n }\n\n report(\n issues,\n file,\n `${label}: component \"${root}\" is used without an import and is not allowed.`,\n );\n }\n}\n\nfunction validateSnippetString(\n issues: FileIssue[],\n file: string,\n label: string,\n snippet: string,\n policy: EffectiveSnippetPolicy,\n): void {\n validateRawRules(issues, file, label, snippet);\n\n if (policy.requireFullSnippet) {\n if (!HAS_IMPORT_PATTERN.test(snippet)) {\n report(issues, file, `${label}: full snippet required (missing import statement).`);\n }\n\n if (!HAS_JSX_PATTERN.test(snippet)) {\n report(issues, file, `${label}: full snippet required (missing JSX usage).`);\n }\n }\n\n const imports = parseSnippetImports(snippet);\n validateComponentAllowlist(issues, file, label, snippet, imports, new Set(), policy);\n}\n\nfunction validateFragmentSource(\n sourceFile: ts.SourceFile,\n file: string,\n policy: EffectiveSnippetPolicy,\n issues: FileIssue[],\n): void {\n const context = collectSourceContext(sourceFile);\n\n const defineCall = findDefineCall(sourceFile, 'defineFragment');\n if (!defineCall) {\n return;\n }\n\n const arg = defineCall.arguments[0];\n if (!arg || !ts.isObjectLiteralExpression(arg)) {\n return;\n }\n\n const variantsExpr = findProperty(arg, 'variants');\n if (!variantsExpr || !ts.isArrayLiteralExpression(variantsExpr)) {\n return;\n }\n\n for (const variantExpr of variantsExpr.elements) {\n if (!ts.isObjectLiteralExpression(variantExpr)) continue;\n\n const name = readStaticString(findProperty(variantExpr, 'name')) ?? 'Unknown';\n const labelPrefix = `variant \"${name}\"`;\n\n const codeExpr = findProperty(variantExpr, 'code');\n const snippet = readStaticString(codeExpr);\n if (snippet) {\n validateSnippetString(issues, file, `${labelPrefix} snippet`, snippet, policy);\n } else {\n report(issues, file, `${labelPrefix}: missing explicit code snippet (variant.code).`);\n }\n\n if (policy.scope === 'snippet+render') {\n const renderExpr = findProperty(variantExpr, 'render');\n if (renderExpr) {\n const renderBody = readRenderBody(renderExpr, sourceFile);\n if (!renderBody) {\n report(issues, file, `${labelPrefix} render: expected a static render function.`);\n continue;\n }\n\n validateRawRules(issues, file, `${labelPrefix} render`, renderBody);\n validateComponentAllowlist(\n issues,\n file,\n `${labelPrefix} render`,\n renderBody,\n context.imports,\n context.localComponents,\n policy,\n );\n }\n }\n }\n}\n\nfunction validateBlockSource(\n sourceFile: ts.SourceFile,\n file: string,\n policy: EffectiveSnippetPolicy,\n issues: FileIssue[],\n): void {\n const defineCall = findDefineCall(sourceFile, 'defineBlock');\n if (!defineCall) {\n return;\n }\n\n const arg = defineCall.arguments[0];\n if (!arg || !ts.isObjectLiteralExpression(arg)) {\n return;\n }\n\n const codeExpr = findProperty(arg, 'code');\n const snippet = readStaticString(codeExpr);\n if (!snippet) {\n report(issues, file, 'block snippet: missing static code string.');\n return;\n }\n\n validateSnippetString(issues, file, 'block snippet', snippet, policy);\n}\n\nfunction validateBlockPreviewExamples(\n sourceFile: ts.SourceFile,\n file: string,\n policy: EffectiveSnippetPolicy,\n issues: FileIssue[],\n): void {\n if (policy.scope !== 'snippet+render') {\n return;\n }\n\n const code = sourceFile.text;\n const context = collectSourceContext(sourceFile);\n\n validateRawRules(issues, file, 'block preview render', code);\n validateComponentAllowlist(\n issues,\n file,\n 'block preview render',\n code,\n context.imports,\n context.localComponents,\n policy,\n );\n}\n\nfunction sourceFileFromText(filePath: string, content: string): ts.SourceFile {\n return ts.createSourceFile(\n filePath,\n content,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TSX,\n );\n}\n\nfunction sortAndFilterBatch(\n files: DiscoveredFile[],\n componentStart?: string,\n componentLimit?: number,\n): { selected: DiscoveredFile[]; warning?: string } {\n const getComponentName = (relativePath: string): string => {\n const normalized = relativePath.replace(/\\\\/g, '/');\n const fileName = normalized.split('/').pop() ?? normalized;\n // Handle both V2 (.contract.json) and legacy (.fragment.tsx/.fragment.ts)\n for (const ext of [BRAND.fileExtension, '.fragment.tsx', '.fragment.ts']) {\n if (fileName.endsWith(ext)) {\n return fileName.slice(0, -ext.length);\n }\n }\n return extractComponentName(relativePath);\n };\n\n const sorted = [...files].sort((a, b) => {\n const nameA = getComponentName(a.relativePath).toLowerCase();\n const nameB = getComponentName(b.relativePath).toLowerCase();\n return nameA.localeCompare(nameB);\n });\n\n if (!componentStart && !componentLimit) {\n return { selected: sorted };\n }\n\n const startName = componentStart?.toLowerCase();\n let startIndex = 0;\n\n if (startName) {\n const foundIndex = sorted.findIndex((file) => getComponentName(file.relativePath).toLowerCase() === startName);\n if (foundIndex === -1) {\n return {\n selected: [],\n warning: `Component start \"${componentStart}\" not found for snippet validation batch.`,\n };\n }\n startIndex = foundIndex;\n }\n\n const limit = componentLimit && componentLimit > 0 ? componentLimit : sorted.length;\n return {\n selected: sorted.slice(startIndex, startIndex + limit),\n };\n}\n\nasync function findBlockPreviewExamplesFile(configDir: string): Promise<string | null> {\n const candidates = [\n join(configDir, 'apps/docs/src/app/(docs)/blocks/examples/index.tsx'),\n join(configDir, '../apps/docs/src/app/(docs)/blocks/examples/index.tsx'),\n join(configDir, '../../apps/docs/src/app/(docs)/blocks/examples/index.tsx'),\n ];\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n return null;\n}\n\nfunction toValidationResult(policy: EffectiveSnippetPolicy, issues: FileIssue[]): SnippetValidationResult {\n if (policy.mode === 'error') {\n return {\n errors: issues,\n warnings: [],\n };\n }\n\n return {\n errors: [],\n warnings: issues,\n };\n}\n\n/**\n * Validate snippet and render policy for fragments, blocks, and docs block previews.\n */\nexport async function validateSnippetPolicy(\n config: FragmentsConfig,\n configDir: string,\n options: SnippetValidationOptions = {},\n): Promise<SnippetValidationResult> {\n const policy = normalizePolicy(config.snippets, options);\n const issues: FileIssue[] = [];\n\n const discovered = await discoverFragmentFiles(config, configDir);\n // Snippet validation applies to TSX fragment files (not .contract.json which has no render code)\n const fragmentFiles = discovered.filter((file) =>\n file.relativePath.endsWith('.fragment.tsx') || file.relativePath.endsWith('.fragment.ts')\n );\n\n const batchResult = sortAndFilterBatch(fragmentFiles, policy.componentStart, policy.componentLimit);\n if (batchResult.warning) {\n issues.push({ file: 'snippets', message: batchResult.warning });\n }\n\n for (const file of batchResult.selected) {\n try {\n const content = await readFile(file.absolutePath, 'utf-8');\n const sourceFile = sourceFileFromText(file.relativePath, content);\n validateFragmentSource(sourceFile, file.relativePath, policy, issues);\n } catch (error) {\n issues.push({\n file: file.relativePath,\n message: `Failed to validate fragment snippets: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n\n const isBatchOnly = Boolean(policy.componentStart || policy.componentLimit);\n if (!isBatchOnly) {\n try {\n const blockFiles = await discoverBlockFiles(configDir, config.exclude);\n for (const file of blockFiles) {\n try {\n const content = await readFile(file.absolutePath, 'utf-8');\n const sourceFile = sourceFileFromText(file.relativePath, content);\n validateBlockSource(sourceFile, file.relativePath, policy, issues);\n } catch (error) {\n issues.push({\n file: file.relativePath,\n message: `Failed to validate block snippets: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n } catch (error) {\n issues.push({\n file: 'blocks',\n message: `Failed to discover block files: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n const blockPreviewFile = await findBlockPreviewExamplesFile(configDir);\n if (blockPreviewFile) {\n try {\n const content = await readFile(blockPreviewFile, 'utf-8');\n const sourceFile = sourceFileFromText(blockPreviewFile, content);\n validateBlockPreviewExamples(sourceFile, blockPreviewFile, policy, issues);\n } catch (error) {\n issues.push({\n file: blockPreviewFile,\n message: `Failed to validate block preview examples: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n }\n\n return toValidationResult(policy, issues);\n}\n","import { fragmentDefinitionSchema, BRAND, type FragmentsConfig } from './core/index.js';\nimport {\n discoverFragmentFiles,\n discoverComponentFiles,\n extractComponentName,\n loadFragmentFile,\n} from './core/node.js';\nimport { validateSnippetPolicy, type SnippetValidationOptions } from './service/snippet-validation.js';\nimport { createComponentExtractor, type ComponentMeta, type PropMeta, resolveComponentSourcePath } from '@fragments-sdk/extract';\nimport { parseFragmentFile } from './core/parser.js';\nimport { readFile } from 'node:fs/promises';\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationWarning[];\n}\n\nexport interface ValidationError {\n file: string;\n message: string;\n details?: string;\n}\n\nexport interface ValidationWarning {\n file: string;\n message: string;\n}\n\nexport interface ValidationRunOptions {\n snippets?: boolean;\n snippetMode?: 'warn' | 'error';\n componentStart?: string;\n componentLimit?: number;\n}\n\n/**\n * Validate fragment file schema\n */\nexport async function validateSchema(\n config: FragmentsConfig,\n configDir: string\n): Promise<ValidationResult> {\n const files = await discoverFragmentFiles(config, configDir);\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n for (const file of files) {\n try {\n const fragment = await loadFragmentFile(file.absolutePath);\n\n if (!fragment) {\n errors.push({\n file: file.relativePath,\n message: 'No default export found',\n details: `Fragment files must have a default export from defineFragment()`,\n });\n continue;\n }\n\n const result = fragmentDefinitionSchema.safeParse(fragment);\n\n if (!result.success) {\n const details = result.error.errors\n .map((e) => `${e.path.join('.')}: ${e.message}`)\n .join('; ');\n\n errors.push({\n file: file.relativePath,\n message: 'Invalid fragment schema',\n details,\n });\n }\n } catch (error) {\n errors.push({\n file: file.relativePath,\n message: 'Failed to load fragment file',\n details: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate coverage - ensure all components have fragments\n */\nexport async function validateCoverage(\n config: FragmentsConfig,\n configDir: string\n): Promise<ValidationResult> {\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n const componentFiles = await discoverComponentFiles(config, configDir);\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Build set of documented component names\n const documentedComponents = new Set<string>();\n\n for (const file of fragmentFiles) {\n try {\n const fragment = await loadFragmentFile(file.absolutePath);\n\n if (fragment?.meta?.name) {\n documentedComponents.add(fragment.meta.name);\n }\n } catch {\n // Skip files that fail to load - schema validation will catch these\n }\n }\n\n // Check each component file\n for (const file of componentFiles) {\n const componentName = extractComponentName(file.relativePath);\n\n // Check if there's a corresponding fragment file\n const fragmentPath = file.relativePath.replace(\n /\\.(tsx?|jsx?)$/,\n BRAND.fileExtension\n );\n const hasFragmentFile = fragmentFiles.some(\n (s) => s.relativePath === fragmentPath\n );\n\n if (!hasFragmentFile && !documentedComponents.has(componentName)) {\n warnings.push({\n file: file.relativePath,\n message: `Component \"${componentName}\" has no fragment documentation`,\n });\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Run all validations\n */\nexport async function validateAll(\n config: FragmentsConfig,\n configDir: string,\n options: ValidationRunOptions = {}\n): Promise<ValidationResult> {\n const [schemaResult, coverageResult] = await Promise.all([\n validateSchema(config, configDir),\n validateCoverage(config, configDir),\n ]);\n\n if (options.snippets === false) {\n return {\n valid: schemaResult.valid && coverageResult.valid,\n errors: [...schemaResult.errors, ...coverageResult.errors],\n warnings: [...schemaResult.warnings, ...coverageResult.warnings],\n };\n }\n\n const snippetOptions: SnippetValidationOptions = {\n ...(options.snippetMode && { mode: options.snippetMode }),\n ...(options.componentStart && { componentStart: options.componentStart }),\n ...(typeof options.componentLimit === 'number'\n ? { componentLimit: options.componentLimit }\n : {}),\n };\n const snippetResult = await validateSnippetPolicy(config, configDir, snippetOptions);\n\n return {\n valid: schemaResult.valid && coverageResult.valid && snippetResult.errors.length === 0,\n errors: [...schemaResult.errors, ...coverageResult.errors, ...snippetResult.errors],\n warnings: [...schemaResult.warnings, ...coverageResult.warnings, ...snippetResult.warnings],\n };\n}\n\n/**\n * Validate snippet/render policy only.\n */\nexport async function validateSnippets(\n config: FragmentsConfig,\n configDir: string,\n options: ValidationRunOptions = {}\n): Promise<ValidationResult> {\n const snippetResult = await validateSnippetPolicy(config, configDir, {\n ...(options.snippetMode && { mode: options.snippetMode }),\n ...(options.componentStart && { componentStart: options.componentStart }),\n ...(typeof options.componentLimit === 'number'\n ? { componentLimit: options.componentLimit }\n : {}),\n });\n\n return {\n valid: snippetResult.errors.length === 0,\n errors: snippetResult.errors,\n warnings: snippetResult.warnings,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Drift Detection\n// ---------------------------------------------------------------------------\n\n/** A single prop drift finding */\nexport interface DriftItem {\n prop: string;\n kind: 'added' | 'removed' | 'type_changed' | 'required_changed' | 'values_changed' | 'default_changed';\n source: string;\n fragment: string;\n}\n\n/** Drift result for a single component */\nexport interface DriftReport {\n component: string;\n file: string;\n drifts: DriftItem[];\n compositionDrift: string | null;\n}\n\n/** Full drift validation result */\nexport interface DriftValidationResult extends ValidationResult {\n reports: DriftReport[];\n}\n\n/**\n * Validate drift — detect metadata discrepancies between component source and fragment files.\n *\n * Compares auto-extracted props/composition from the component source against what's\n * documented in the fragment file. Reports:\n * - Props in source but missing from fragment (added)\n * - Props in fragment but removed from source (removed)\n * - Type/required/values/default changes\n * - Composition pattern changes\n */\nexport async function validateDrift(\n config: FragmentsConfig,\n configDir: string,\n options: { tsconfig?: string } = {}\n): Promise<DriftValidationResult> {\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n const reports: DriftReport[] = [];\n\n if (fragmentFiles.length === 0) {\n return { valid: true, errors, warnings, reports };\n }\n\n const extractor = createComponentExtractor(options.tsconfig);\n\n try {\n for (const file of fragmentFiles) {\n try {\n // Load the fragment to get documented props\n const fragment = await loadFragmentFile(file.absolutePath);\n if (!fragment?.meta?.name) continue;\n\n // Parse the fragment file to find the component import path\n const fileContent = await readFile(file.absolutePath, 'utf-8');\n const parsed = parseFragmentFile(fileContent, file.absolutePath);\n if (!parsed.componentImport) continue;\n\n // Resolve the component source path\n const sourcePath = resolveComponentSourcePath(file.absolutePath, parsed.componentImport);\n if (!sourcePath) continue;\n\n // Extract current state from source\n const meta = extractor.extract(sourcePath, fragment.meta.name);\n if (!meta) continue;\n\n // Compare props\n const drifts = diffProps(fragment.props, meta.props);\n\n // Compare composition\n let compositionDrift: string | null = null;\n const fragmentAi = fragment.ai;\n if (meta.composition && !fragmentAi?.compositionPattern) {\n compositionDrift = `Source has \"${meta.composition.pattern}\" composition but fragment has no ai.compositionPattern`;\n } else if (!meta.composition && fragmentAi?.compositionPattern) {\n compositionDrift = `Fragment declares \"${fragmentAi.compositionPattern}\" but source has no compound pattern`;\n } else if (meta.composition && fragmentAi?.compositionPattern &&\n meta.composition.pattern !== fragmentAi.compositionPattern) {\n compositionDrift = `Composition pattern changed: fragment=\"${fragmentAi.compositionPattern}\" source=\"${meta.composition.pattern}\"`;\n }\n\n if (drifts.length > 0 || compositionDrift) {\n const report: DriftReport = {\n component: fragment.meta.name,\n file: file.relativePath,\n drifts,\n compositionDrift,\n };\n reports.push(report);\n\n // Classify drift items as errors (removed props) or warnings (added/changed props)\n for (const drift of drifts) {\n if (drift.kind === 'removed') {\n errors.push({\n file: file.relativePath,\n message: `Prop \"${drift.prop}\" documented in fragment but removed from source`,\n details: `Fragment: ${drift.fragment} | Source: (not found)`,\n });\n } else if (drift.kind === 'added') {\n warnings.push({\n file: file.relativePath,\n message: `Prop \"${drift.prop}\" exists in source but not documented in fragment`,\n });\n } else {\n warnings.push({\n file: file.relativePath,\n message: `Prop \"${drift.prop}\" ${drift.kind.replace('_', ' ')}: fragment=${drift.fragment} source=${drift.source}`,\n });\n }\n }\n\n if (compositionDrift) {\n warnings.push({\n file: file.relativePath,\n message: compositionDrift,\n });\n }\n }\n } catch {\n // Skip fragments that can't be analyzed — schema/coverage validators handle those\n }\n }\n } finally {\n extractor.dispose();\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n reports,\n };\n}\n\n/**\n * Compare documented props (from fragment) against extracted props (from source).\n * Only compares local (non-inherited) props from the source.\n */\nexport function diffProps(\n fragmentProps: Record<string, { type?: string; required?: boolean; values?: readonly string[]; default?: unknown }>,\n sourceProps: Record<string, PropMeta>\n): DriftItem[] {\n const drifts: DriftItem[] = [];\n\n // Filter source to local props only\n const localSourceProps = Object.fromEntries(\n Object.entries(sourceProps).filter(([_, p]) => p.source === 'local')\n );\n\n // Check for props in source but not in fragment\n for (const [name, sourceProp] of Object.entries(localSourceProps)) {\n if (!(name in fragmentProps)) {\n drifts.push({\n prop: name,\n kind: 'added',\n source: sourceProp.type,\n fragment: '(not documented)',\n });\n }\n }\n\n // Check for props in fragment but not in source\n for (const [name, fragProp] of Object.entries(fragmentProps)) {\n if (!(name in localSourceProps)) {\n drifts.push({\n prop: name,\n kind: 'removed',\n source: '(not found)',\n fragment: String(fragProp.type ?? 'unknown'),\n });\n continue;\n }\n\n const sourceProp = localSourceProps[name];\n\n // Type changed\n if (fragProp.type && fragProp.type !== sourceProp.typeKind) {\n drifts.push({\n prop: name,\n kind: 'type_changed',\n source: sourceProp.typeKind,\n fragment: String(fragProp.type),\n });\n }\n\n // Required changed\n if (fragProp.required !== undefined && fragProp.required !== sourceProp.required) {\n drifts.push({\n prop: name,\n kind: 'required_changed',\n source: String(sourceProp.required),\n fragment: String(fragProp.required),\n });\n }\n\n // Enum values changed\n if (fragProp.values && sourceProp.values) {\n const fragSet = new Set(fragProp.values);\n const srcSet = new Set(sourceProp.values);\n const added = sourceProp.values.filter(v => !fragSet.has(v));\n const removed = Array.from(fragProp.values).filter(v => !srcSet.has(v));\n if (added.length > 0 || removed.length > 0) {\n drifts.push({\n prop: name,\n kind: 'values_changed',\n source: sourceProp.values.join(', '),\n fragment: Array.from(fragProp.values).join(', '),\n });\n }\n }\n\n // Default changed\n if (fragProp.default !== undefined && sourceProp.default !== undefined) {\n if (String(fragProp.default) !== sourceProp.default) {\n drifts.push({\n prop: name,\n kind: 'default_changed',\n source: sourceProp.default,\n fragment: String(fragProp.default),\n });\n }\n }\n }\n\n return drifts;\n}\n","import pc from 'picocolors';\nimport {\n BRAND,\n DEFAULTS,\n type FragmentsConfig,\n type FragmentDefinition,\n type Theme,\n} from './core/index.js';\nimport { discoverFragmentFiles, loadFragmentFile } from './core/node.js';\nimport {\n BrowserPool,\n CaptureEngine,\n StorageManager,\n formatMs,\n type CaptureOptions,\n} from './service/index.js';\n\n/**\n * Options for the screenshot command\n */\nexport interface ScreenshotCommandOptions {\n /** Specific component to capture */\n component?: string;\n\n /** Specific variant to capture */\n variant?: string;\n\n /** Theme to capture */\n theme?: Theme;\n\n /** Update existing baselines */\n update?: boolean;\n\n /** CI mode - no interactive prompts */\n ci?: boolean;\n\n /** Viewport width */\n width?: number;\n\n /** Viewport height */\n height?: number;\n}\n\n/**\n * Result of the screenshot command\n */\nexport interface ScreenshotResult {\n success: boolean;\n captured: number;\n skipped: number;\n errors: Array<{ component: string; variant: string; error: string }>;\n totalTimeMs: number;\n}\n\n/**\n * Execute the screenshot command\n */\nexport async function runScreenshotCommand(\n config: FragmentsConfig,\n configDir: string,\n options: ScreenshotCommandOptions = {}\n): Promise<ScreenshotResult> {\n const startTime = Date.now();\n const errors: ScreenshotResult['errors'] = [];\n\n // Initialize storage\n const storage = new StorageManager({\n projectRoot: configDir,\n viewport: options.width && options.height\n ? { width: options.width, height: options.height }\n : config.screenshots?.viewport,\n });\n await storage.initialize();\n\n // Discover fragments\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n\n if (fragmentFiles.length === 0) {\n console.log(pc.yellow('No fragment files found.'));\n return {\n success: true,\n captured: 0,\n skipped: 0,\n errors: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Load all fragments\n const fragments: Array<{ path: string; fragment: FragmentDefinition }> = [];\n\n for (const file of fragmentFiles) {\n try {\n const fragment = await loadFragmentFile(file.absolutePath);\n if (fragment) {\n fragments.push({ path: file.relativePath, fragment });\n }\n } catch (error) {\n errors.push({\n component: file.relativePath,\n variant: '',\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Filter by component if specified\n const filteredFragments = options.component\n ? fragments.filter((s) => s.fragment.meta.name === options.component)\n : fragments;\n\n if (options.component && filteredFragments.length === 0) {\n console.log(pc.yellow(`Component \"${options.component}\" not found.`));\n return {\n success: false,\n captured: 0,\n skipped: 0,\n errors: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Build list of variants to capture\n const variantsToCapture: Array<{\n component: string;\n variant: string;\n render: () => unknown;\n }> = [];\n\n for (const { fragment } of filteredFragments) {\n const variants = options.variant\n ? fragment.variants.filter((v) => v.name === options.variant)\n : fragment.variants;\n\n for (const variant of variants) {\n variantsToCapture.push({\n component: fragment.meta.name,\n variant: variant.name,\n render: variant.render,\n });\n }\n }\n\n if (variantsToCapture.length === 0) {\n console.log(pc.yellow('No variants to capture.'));\n return {\n success: true,\n captured: 0,\n skipped: 0,\n errors: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Determine theme\n const theme: Theme = options.theme ?? DEFAULTS.theme;\n const viewport = {\n width: options.width ?? config.screenshots?.viewport?.width ?? DEFAULTS.viewport.width,\n height: options.height ?? config.screenshots?.viewport?.height ?? DEFAULTS.viewport.height,\n };\n\n console.log(pc.cyan(`\\n${BRAND.name} Screenshot\\n`));\n console.log(pc.dim(`Capturing variants (theme: ${theme}, viewport: ${viewport.width}x${viewport.height}):\\n`));\n\n // Initialize browser pool\n const pool = new BrowserPool({\n viewport,\n });\n\n // Create capture engine - use the viewer URL\n const viewerPort = DEFAULTS.port;\n const baseUrl = `http://localhost:${viewerPort}`;\n const captureEngine = new CaptureEngine(pool, baseUrl);\n\n let captured = 0;\n let skipped = 0;\n\n const captureOptions: CaptureOptions = {\n theme,\n viewport,\n delay: config.screenshots?.delay ?? DEFAULTS.captureDelayMs,\n };\n\n try {\n // Warm up the pool\n console.log(pc.dim('Starting browser...'));\n await pool.warmup();\n console.log(pc.dim('Browser ready.\\n'));\n\n // Capture each variant\n for (const { component, variant } of variantsToCapture) {\n const hasExisting = storage.hasBaseline(component, variant, theme);\n\n // Skip if exists and not updating\n if (hasExisting && !options.update) {\n console.log(` ${pc.dim('○')} ${component}/${variant} ${pc.dim('(skipped)')}`);\n skipped++;\n continue;\n }\n\n try {\n const screenshot = await captureEngine.captureVariant(\n component,\n variant,\n captureOptions\n );\n\n await storage.saveBaseline(screenshot);\n\n const totalTime = screenshot.metadata.renderTimeMs + screenshot.metadata.captureTimeMs;\n console.log(\n ` ${pc.green('✓')} ${component}/${variant} ${pc.dim(formatMs(totalTime))}`\n );\n captured++;\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.log(` ${pc.red('✗')} ${component}/${variant} ${pc.dim(errorMsg)}`);\n errors.push({ component, variant, error: errorMsg });\n }\n }\n } finally {\n // Shutdown browser pool\n await pool.shutdown();\n }\n\n const totalTimeMs = Date.now() - startTime;\n\n // Print summary\n console.log();\n if (errors.length === 0) {\n console.log(pc.green(`✓ Captured ${captured} screenshot(s) in ${formatMs(totalTimeMs)}`));\n } else {\n console.log(pc.yellow(`⚠ Captured ${captured} screenshot(s) with ${errors.length} error(s)`));\n }\n\n if (skipped > 0) {\n console.log(pc.dim(` ${skipped} skipped (use --update to recapture)`));\n }\n\n console.log(pc.dim(` Stored in ${storage.screenshotsDirPath}\\n`));\n\n return {\n success: errors.length === 0,\n captured,\n skipped,\n errors,\n totalTimeMs,\n };\n}\n","import pc from 'picocolors';\nimport {\n BRAND,\n DEFAULTS,\n type FragmentsConfig,\n type FragmentDefinition,\n type Theme,\n} from './core/index.js';\nimport { discoverFragmentFiles, loadFragmentFile } from './core/node.js';\nimport {\n BrowserPool,\n CaptureEngine,\n StorageManager,\n DiffEngine,\n formatMs,\n type CaptureOptions,\n type DiffResult,\n} from './service/index.js';\n\n/**\n * Options for the diff command\n */\nexport interface DiffCommandOptions {\n /** Specific component to diff */\n component?: string;\n\n /** Specific variant to diff */\n variant?: string;\n\n /** Theme to compare */\n theme?: Theme;\n\n /** CI mode - exit 1 on differences */\n ci?: boolean;\n\n /** Diff threshold percentage */\n threshold?: number;\n\n /** Open diff images */\n open?: boolean;\n}\n\n/**\n * Single diff result with metadata\n */\nexport interface VariantDiffResult {\n component: string;\n variant: string;\n theme: Theme;\n result: DiffResult;\n diffImagePath?: string;\n}\n\n/**\n * Result of the diff command\n */\nexport interface DiffCommandResult {\n success: boolean;\n total: number;\n passed: number;\n failed: number;\n missing: number;\n results: VariantDiffResult[];\n totalTimeMs: number;\n}\n\n/**\n * Execute the diff command\n */\nexport async function runDiffCommand(\n config: FragmentsConfig,\n configDir: string,\n options: DiffCommandOptions = {}\n): Promise<DiffCommandResult> {\n const startTime = Date.now();\n const results: VariantDiffResult[] = [];\n\n // Initialize storage\n const storage = new StorageManager({\n projectRoot: configDir,\n viewport: config.screenshots?.viewport,\n });\n await storage.initialize();\n\n // Initialize diff engine\n const threshold = options.threshold ?? config.screenshots?.threshold ?? DEFAULTS.diffThreshold;\n const diffEngine = new DiffEngine(threshold);\n\n // Discover fragments\n const fragmentFiles = await discoverFragmentFiles(config, configDir);\n\n if (fragmentFiles.length === 0) {\n console.log(pc.yellow('No fragment files found.'));\n return {\n success: true,\n total: 0,\n passed: 0,\n failed: 0,\n missing: 0,\n results: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Load all fragments\n const fragments: Array<{ path: string; fragment: FragmentDefinition }> = [];\n\n for (const file of fragmentFiles) {\n try {\n const fragment = await loadFragmentFile(file.absolutePath);\n if (fragment) {\n fragments.push({ path: file.relativePath, fragment });\n }\n } catch {\n // Skip failed loads\n }\n }\n\n // Filter by component if specified\n const filteredFragments = options.component\n ? fragments.filter((s) => s.fragment.meta.name === options.component)\n : fragments;\n\n if (options.component && filteredFragments.length === 0) {\n console.log(pc.yellow(`Component \"${options.component}\" not found.`));\n return {\n success: false,\n total: 0,\n passed: 0,\n failed: 0,\n missing: 0,\n results: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Build list of variants to diff\n const variantsToDiff: Array<{\n component: string;\n variant: string;\n }> = [];\n\n for (const { fragment } of filteredFragments) {\n const variants = options.variant\n ? fragment.variants.filter((v) => v.name === options.variant)\n : fragment.variants;\n\n for (const variant of variants) {\n variantsToDiff.push({\n component: fragment.meta.name,\n variant: variant.name,\n });\n }\n }\n\n if (variantsToDiff.length === 0) {\n console.log(pc.yellow('No variants to compare.'));\n return {\n success: true,\n total: 0,\n passed: 0,\n failed: 0,\n missing: 0,\n results: [],\n totalTimeMs: Date.now() - startTime,\n };\n }\n\n // Determine theme\n const theme: Theme = options.theme ?? DEFAULTS.theme;\n const viewport = config.screenshots?.viewport ?? DEFAULTS.viewport;\n\n console.log(pc.cyan(`\\n${BRAND.name} Diff\\n`));\n console.log(pc.dim(`Comparing against baselines (theme: ${theme}, threshold: ${threshold}%):\\n`));\n\n // Initialize browser pool\n const pool = new BrowserPool({\n viewport,\n });\n\n // Create capture engine\n const viewerPort = DEFAULTS.port;\n const baseUrl = `http://localhost:${viewerPort}`;\n const captureEngine = new CaptureEngine(pool, baseUrl);\n\n let passed = 0;\n let failed = 0;\n let missing = 0;\n\n const captureOptions: CaptureOptions = {\n theme,\n viewport,\n delay: config.screenshots?.delay ?? DEFAULTS.captureDelayMs,\n };\n\n try {\n // Warm up the pool\n await pool.warmup();\n\n // Compare each variant\n for (const { component, variant } of variantsToDiff) {\n // Load baseline\n const baseline = await storage.loadBaseline(component, variant, theme);\n\n if (!baseline) {\n console.log(\n ` ${pc.yellow('?')} ${component}/${variant} ${pc.dim('(no baseline)')}`\n );\n missing++;\n continue;\n }\n\n try {\n // Capture current\n const current = await captureEngine.captureVariant(\n component,\n variant,\n captureOptions\n );\n\n // Quick hash check\n if (diffEngine.areIdentical(current, baseline)) {\n console.log(` ${pc.green('✓')} ${component}/${variant} ${pc.dim('0.0%')}`);\n results.push({\n component,\n variant,\n theme,\n result: {\n matches: true,\n diffPercentage: 0,\n diffPixelCount: 0,\n totalPixels: current.viewport.width * current.viewport.height,\n changedRegions: [],\n diffTimeMs: 0,\n },\n });\n passed++;\n continue;\n }\n\n // Full diff\n const diffResult = diffEngine.compare(current, baseline, { threshold });\n\n if (diffResult.matches) {\n console.log(\n ` ${pc.green('✓')} ${component}/${variant} ${pc.dim(`${diffResult.diffPercentage}%`)}`\n );\n passed++;\n } else {\n // Save diff image\n let diffImagePath: string | undefined;\n if (diffResult.diffImage) {\n diffImagePath = await storage.saveDiff(\n component,\n variant,\n theme,\n diffResult.diffImage\n );\n }\n\n console.log(\n ` ${pc.red('✗')} ${component}/${variant} ${pc.yellow(`${diffResult.diffPercentage}%`)}` +\n (diffImagePath ? pc.dim(` → ${diffImagePath}`) : '')\n );\n failed++;\n\n results.push({\n component,\n variant,\n theme,\n result: diffResult,\n diffImagePath,\n });\n continue;\n }\n\n results.push({\n component,\n variant,\n theme,\n result: diffResult,\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : String(error);\n console.log(` ${pc.red('!')} ${component}/${variant} ${pc.dim(errorMsg)}`);\n failed++;\n }\n }\n } finally {\n // Shutdown browser pool\n await pool.shutdown();\n }\n\n const totalTimeMs = Date.now() - startTime;\n const total = passed + failed + missing;\n\n // Print summary\n console.log();\n if (failed === 0 && missing === 0) {\n console.log(pc.green(`✓ All ${passed} variant(s) match baselines`));\n } else if (failed > 0) {\n console.log(pc.red(`✗ ${failed} variant(s) differ from baselines`));\n }\n\n if (missing > 0) {\n console.log(pc.yellow(` ${missing} variant(s) have no baseline (run \\`${BRAND.cliCommand} screenshot\\`)`));\n }\n\n console.log(pc.dim(` Completed in ${formatMs(totalTimeMs)}\\n`));\n\n // In CI mode, exit with error if any failed\n const success = failed === 0;\n\n return {\n success,\n total,\n passed,\n failed,\n missing,\n results,\n totalTimeMs,\n };\n}\n","/**\n * CLI command: fragments analyze\n *\n * Analyzes the design system and generates an HTML report with:\n * - Component inventory\n * - Documentation coverage\n * - Quality insights\n * - Actionable recommendations\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport pc from \"picocolors\";\nimport type { FragmentsConfig, CompiledFragmentsFile } from \"./core/index.js\";\nimport { BRAND, DEFAULTS } from \"./core/index.js\";\nimport {\n analyzeDesignSystem,\n generateHtmlReport,\n getGrade,\n getScoreColor,\n type DesignSystemAnalytics,\n} from \"./service/index.js\";\n\nexport interface AnalyzeOptions {\n /** Output format */\n format?: \"html\" | \"json\" | \"console\";\n /** Output file path (default: fragments-report.html) */\n output?: string;\n /** Open report in browser after generation */\n open?: boolean;\n /** CI mode - exit with appropriate code */\n ci?: boolean;\n /** Minimum score to pass in CI mode */\n minScore?: number;\n}\n\nexport interface AnalyzeResult {\n success: boolean;\n analytics: DesignSystemAnalytics;\n outputPath?: string;\n}\n\n/**\n * Run the analyze command\n */\nexport async function runAnalyzeCommand(\n config: FragmentsConfig,\n configDir: string,\n options: AnalyzeOptions = {}\n): Promise<AnalyzeResult> {\n const format = options.format ?? \"html\";\n const minScore = options.minScore ?? 0;\n\n console.log(pc.cyan(`\\n${BRAND.name} Analyzer\\n`));\n\n // Load compiled fragments\n const fragmentsPath = join(configDir, config.outFile ?? \"fragments.json\");\n\n if (!existsSync(fragmentsPath)) {\n console.log(pc.red(`✗ No fragments.json found. Run \\`${BRAND.cliCommand} build\\` first.\\n`));\n return {\n success: false,\n analytics: createEmptyAnalytics(),\n };\n }\n\n console.log(pc.dim(\"Analyzing design system...\\n\"));\n\n const content = await readFile(fragmentsPath, \"utf-8\");\n const data: CompiledFragmentsFile = JSON.parse(content);\n\n // Run analysis\n const analytics = analyzeDesignSystem(data);\n\n // Print summary to console\n printConsoleSummary(analytics);\n\n // Generate output based on format\n let outputPath: string | undefined;\n\n if (format === \"html\" || format === \"json\") {\n outputPath = options.output ?? getDefaultOutputPath(format, configDir);\n\n // Ensure output directory exists\n await mkdir(dirname(outputPath), { recursive: true });\n\n if (format === \"html\") {\n const html = generateHtmlReport(analytics);\n await writeFile(outputPath, html);\n console.log(pc.green(`✓ Report generated: ${outputPath}\\n`));\n } else {\n await writeFile(outputPath, JSON.stringify(analytics, null, 2));\n console.log(pc.green(`✓ JSON report generated: ${outputPath}\\n`));\n }\n\n // Open in browser if requested\n if (options.open && format === \"html\") {\n await openInBrowser(outputPath);\n }\n }\n\n // CI mode - check score\n const passedCi = analytics.summary.overallScore >= minScore;\n\n if (options.ci) {\n if (passedCi) {\n console.log(\n pc.green(`✓ Score ${analytics.summary.overallScore} meets minimum threshold ${minScore}\\n`)\n );\n } else {\n console.log(\n pc.red(\n `✗ Score ${analytics.summary.overallScore} below minimum threshold ${minScore}\\n`\n )\n );\n }\n }\n\n return {\n success: !options.ci || passedCi,\n analytics,\n outputPath,\n };\n}\n\n/**\n * Print a summary to the console\n */\nfunction printConsoleSummary(analytics: DesignSystemAnalytics): void {\n const { summary, coverage, recommendations } = analytics;\n const grade = getGrade(summary.overallScore);\n\n // Score header\n console.log(\n pc.bold(\n `Overall Score: ${colorizeScore(summary.overallScore)} (${grade})\\n`\n )\n );\n\n // Summary stats\n console.log(pc.dim(\"Summary\"));\n console.log(` Components: ${pc.white(summary.totalComponents.toString())}`);\n console.log(` Variants: ${pc.white(summary.totalVariants.toString())}`);\n console.log(` Props: ${pc.white(summary.totalProps.toString())}`);\n console.log(` Categories: ${pc.white(summary.categories.join(\", \"))}`);\n console.log();\n\n // Coverage\n console.log(pc.dim(\"Coverage\"));\n console.log(` Description: ${formatCoverage(coverage.fields.description)}`);\n console.log(` Usage when: ${formatCoverage(coverage.fields.usageWhen)}`);\n console.log(` Usage whenNot:${formatCoverage(coverage.fields.usageWhenNot)}`);\n console.log(` Guidelines: ${formatCoverage(coverage.fields.guidelines)}`);\n console.log(` Relations: ${formatCoverage(coverage.fields.relations)}`);\n console.log();\n\n // Top recommendations\n if (recommendations.length > 0) {\n console.log(pc.dim(\"Top Recommendations\"));\n for (const rec of recommendations.slice(0, 3)) {\n const priority = rec.priority === \"high\"\n ? pc.red(`[${rec.priority}]`)\n : rec.priority === \"medium\"\n ? pc.yellow(`[${rec.priority}]`)\n : pc.dim(`[${rec.priority}]`);\n console.log(` ${priority} ${rec.title}`);\n }\n console.log();\n }\n}\n\n/**\n * Format coverage percentage with color\n */\nfunction formatCoverage(field: { percentage: number; covered: number; total: number }): string {\n const pct = colorizeScore(field.percentage);\n return `${pct} (${field.covered}/${field.total})`;\n}\n\n/**\n * Colorize a score\n */\nfunction colorizeScore(score: number): string {\n if (score >= 80) return pc.green(`${score}%`);\n if (score >= 60) return pc.yellow(`${score}%`);\n return pc.red(`${score}%`);\n}\n\n/**\n * Get default output path\n */\nfunction getDefaultOutputPath(format: \"html\" | \"json\", configDir: string): string {\n const filename = format === \"html\" ? \"fragments-report.html\" : \"fragments-report.json\";\n return join(configDir, filename);\n}\n\n/**\n * Open file in default browser\n */\nasync function openInBrowser(path: string): Promise<void> {\n const { platform } = await import(\"node:os\");\n const { exec } = await import(\"node:child_process\");\n\n const os = platform();\n const cmd = os === \"darwin\"\n ? `open \"${path}\"`\n : os === \"win32\"\n ? `start \"\" \"${path}\"`\n : `xdg-open \"${path}\"`;\n\n exec(cmd);\n}\n\n/**\n * Create empty analytics for error cases\n */\nfunction createEmptyAnalytics(): DesignSystemAnalytics {\n return {\n analyzedAt: new Date(),\n summary: {\n totalComponents: 0,\n totalVariants: 0,\n totalProps: 0,\n categories: [],\n overallScore: 0,\n },\n inventory: {\n byCategory: {},\n byStatus: {},\n byVariantCount: [],\n byPropCount: [],\n },\n coverage: {\n overall: 0,\n fields: {\n description: { covered: 0, total: 0, percentage: 0 },\n usageWhen: { covered: 0, total: 0, percentage: 0 },\n usageWhenNot: { covered: 0, total: 0, percentage: 0 },\n guidelines: { covered: 0, total: 0, percentage: 0 },\n accessibility: { covered: 0, total: 0, percentage: 0 },\n relations: { covered: 0, total: 0, percentage: 0 },\n propDescriptions: { covered: 0, total: 0, percentage: 0 },\n propConstraints: { covered: 0, total: 0, percentage: 0 },\n },\n incomplete: [],\n },\n quality: {\n missingWhenNot: [],\n isolated: [],\n deprecated: [],\n fewVariants: [],\n undocumentedProps: [],\n unconstrainedProps: [],\n },\n distribution: {\n variantsPerComponent: [],\n propsPerComponent: [],\n componentsPerCategory: [],\n statusDistribution: [],\n tagFrequency: [],\n },\n recommendations: [],\n };\n}\n"],"mappings":"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","names":["readFile","report","pc","pc","existsSync","readFile","join","pc","pc","join","existsSync","readFile"]}