@fragments-sdk/cli 0.7.0 → 0.7.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 (173) hide show
  1. package/LICENSE +77 -14
  2. package/dist/bin.js +247 -247
  3. package/dist/bin.js.map +1 -1
  4. package/dist/{chunk-CVXKXVOY.js → chunk-3T6QL7IY.js} +47 -29
  5. package/dist/chunk-3T6QL7IY.js.map +1 -0
  6. package/dist/{chunk-7OPWMLOE.js → chunk-7KUSBMI4.js} +114 -112
  7. package/dist/chunk-7KUSBMI4.js.map +1 -0
  8. package/dist/{chunk-XHUDJNN3.js → chunk-DH4ETVSM.js} +18 -18
  9. package/dist/chunk-DH4ETVSM.js.map +1 -0
  10. package/dist/{chunk-RVRTRESS.js → chunk-DQHWLAUV.js} +29 -29
  11. package/dist/chunk-DQHWLAUV.js.map +1 -0
  12. package/dist/{chunk-6JBGU74P.js → chunk-GHYYFAQN.js} +23 -23
  13. package/dist/chunk-GHYYFAQN.js.map +1 -0
  14. package/dist/{chunk-NWQ4CJOQ.js → chunk-GKX2HPZ6.js} +40 -40
  15. package/dist/chunk-GKX2HPZ6.js.map +1 -0
  16. package/dist/{chunk-TJ34N7C7.js → chunk-OOGTG5FM.js} +34 -33
  17. package/dist/chunk-OOGTG5FM.js.map +1 -0
  18. package/dist/{core-W2HYIQW6.js → core-UQXZTBFZ.js} +24 -26
  19. package/dist/{generate-LMTISDIJ.js → generate-GP6ZLAQB.js} +5 -5
  20. package/dist/generate-GP6ZLAQB.js.map +1 -0
  21. package/dist/index.d.ts +23 -27
  22. package/dist/index.js +10 -10
  23. package/dist/{init-7CHRKQ7P.js → init-W72WBSU2.js} +5 -5
  24. package/dist/{init-7CHRKQ7P.js.map → init-W72WBSU2.js.map} +1 -1
  25. package/dist/mcp-bin.js +73 -73
  26. package/dist/mcp-bin.js.map +1 -1
  27. package/dist/scan-V54HWRDY.js +12 -0
  28. package/dist/{service-T2L7VLTE.js → service-PVGTYUKX.js} +6 -6
  29. package/dist/{static-viewer-GBR7YNF3.js → static-viewer-KILKIVN7.js} +4 -4
  30. package/dist/{test-OJRXNDO2.js → test-3YRYQRGV.js} +19 -19
  31. package/dist/test-3YRYQRGV.js.map +1 -0
  32. package/dist/{tokens-3BWDESVM.js → tokens-IXSQHPQK.js} +5 -5
  33. package/dist/{viewer-SUFOISZM.js → viewer-K42REJU2.js} +199 -199
  34. package/dist/viewer-K42REJU2.js.map +1 -0
  35. package/package.json +13 -2
  36. package/src/ai.ts +5 -5
  37. package/src/analyze.ts +11 -11
  38. package/src/bin.ts +1 -1
  39. package/src/build.ts +37 -35
  40. package/src/commands/a11y.ts +6 -6
  41. package/src/commands/add.ts +11 -11
  42. package/src/commands/audit.ts +4 -4
  43. package/src/commands/baseline.ts +3 -3
  44. package/src/commands/build.ts +8 -8
  45. package/src/commands/compare.ts +20 -20
  46. package/src/commands/context.ts +16 -16
  47. package/src/commands/enhance.ts +36 -36
  48. package/src/commands/generate.ts +1 -1
  49. package/src/commands/graph.ts +5 -5
  50. package/src/commands/init.ts +1 -1
  51. package/src/commands/link/figma.ts +82 -82
  52. package/src/commands/link/index.ts +3 -3
  53. package/src/commands/link/storybook.ts +9 -9
  54. package/src/commands/list.ts +2 -2
  55. package/src/commands/reset.ts +15 -15
  56. package/src/commands/scan.ts +27 -27
  57. package/src/commands/storygen.ts +24 -24
  58. package/src/commands/validate.ts +2 -2
  59. package/src/commands/verify.ts +8 -8
  60. package/src/core/auto-props.ts +4 -4
  61. package/src/core/composition.test.ts +36 -36
  62. package/src/core/composition.ts +19 -19
  63. package/src/core/config.ts +6 -6
  64. package/src/core/{defineSegment.ts → defineFragment.ts} +16 -22
  65. package/src/core/discovery.ts +6 -6
  66. package/src/core/figma.ts +2 -2
  67. package/src/core/graph-extractor.test.ts +77 -77
  68. package/src/core/graph-extractor.ts +32 -32
  69. package/src/core/importAnalyzer.ts +1 -1
  70. package/src/core/index.ts +22 -23
  71. package/src/core/loader.ts +21 -24
  72. package/src/core/node.ts +5 -5
  73. package/src/core/parser.ts +71 -31
  74. package/src/core/previewLoader.ts +1 -1
  75. package/src/core/schema.ts +16 -16
  76. package/src/core/storyAdapter.test.ts +87 -87
  77. package/src/core/storyAdapter.ts +16 -16
  78. package/src/core/token-parser.ts +9 -1
  79. package/src/core/types.ts +21 -26
  80. package/src/diff.ts +22 -22
  81. package/src/index.ts +2 -2
  82. package/src/mcp/server.ts +80 -80
  83. package/src/migrate/__tests__/utils/utils.test.ts +3 -3
  84. package/src/migrate/bin.ts +4 -4
  85. package/src/migrate/converter.ts +16 -16
  86. package/src/migrate/index.ts +3 -3
  87. package/src/migrate/migrate.ts +3 -3
  88. package/src/migrate/parser.ts +8 -8
  89. package/src/migrate/report.ts +2 -2
  90. package/src/migrate/types.ts +4 -4
  91. package/src/screenshot.ts +22 -22
  92. package/src/service/__tests__/props-extractor.test.ts +15 -15
  93. package/src/service/analytics.ts +39 -39
  94. package/src/service/enhance/codebase-scanner.ts +1 -1
  95. package/src/service/enhance/index.ts +1 -1
  96. package/src/service/enhance/props-extractor.ts +2 -2
  97. package/src/service/enhance/types.ts +2 -2
  98. package/src/service/index.ts +2 -2
  99. package/src/service/metrics-store.ts +1 -1
  100. package/src/service/patch-generator.ts +1 -1
  101. package/src/setup.ts +52 -52
  102. package/src/shared/dev-server-client.ts +7 -7
  103. package/src/shared/fragment-loader.ts +59 -0
  104. package/src/shared/index.ts +1 -1
  105. package/src/shared/types.ts +4 -4
  106. package/src/static-viewer.ts +35 -35
  107. package/src/test/discovery.ts +6 -6
  108. package/src/test/index.ts +5 -5
  109. package/src/test/reporters/console.ts +1 -1
  110. package/src/test/reporters/junit.ts +1 -1
  111. package/src/test/runner.ts +7 -7
  112. package/src/test/types.ts +3 -3
  113. package/src/test/watch.ts +9 -9
  114. package/src/validators.ts +26 -26
  115. package/src/viewer/__tests__/render-utils.test.ts +28 -28
  116. package/src/viewer/__tests__/viewer-integration.test.ts +4 -4
  117. package/src/viewer/cli/health.ts +26 -26
  118. package/src/viewer/components/App.tsx +79 -79
  119. package/src/viewer/components/BottomPanel.tsx +17 -17
  120. package/src/viewer/components/CodePanel.tsx +3 -3
  121. package/src/viewer/components/CommandPalette.tsx +11 -11
  122. package/src/viewer/components/ComponentGraph.tsx +28 -28
  123. package/src/viewer/components/ComponentHeader.tsx +2 -2
  124. package/src/viewer/components/ContractPanel.tsx +6 -6
  125. package/src/viewer/components/FigmaEmbed.tsx +9 -9
  126. package/src/viewer/components/HealthDashboard.tsx +17 -17
  127. package/src/viewer/components/InteractionsPanel.tsx +2 -2
  128. package/src/viewer/components/IsolatedPreviewFrame.tsx +6 -6
  129. package/src/viewer/components/IsolatedRender.tsx +10 -10
  130. package/src/viewer/components/LeftSidebar.tsx +28 -28
  131. package/src/viewer/components/MultiViewportPreview.tsx +14 -14
  132. package/src/viewer/components/PreviewArea.tsx +11 -11
  133. package/src/viewer/components/PreviewFrameHost.tsx +51 -51
  134. package/src/viewer/components/RightSidebar.tsx +9 -9
  135. package/src/viewer/components/Sidebar.tsx +17 -17
  136. package/src/viewer/components/StoryRenderer.tsx +2 -2
  137. package/src/viewer/components/TokenStylePanel.tsx +1 -1
  138. package/src/viewer/components/UsageSection.tsx +2 -2
  139. package/src/viewer/components/VariantMatrix.tsx +11 -11
  140. package/src/viewer/components/VariantRenderer.tsx +3 -3
  141. package/src/viewer/components/VariantTabs.tsx +2 -2
  142. package/src/viewer/components/_future/CreatePage.tsx +6 -6
  143. package/src/viewer/composition-renderer.ts +11 -11
  144. package/src/viewer/entry.tsx +40 -40
  145. package/src/viewer/hooks/useFigmaIntegration.ts +1 -1
  146. package/src/viewer/hooks/usePreviewBridge.ts +5 -5
  147. package/src/viewer/hooks/useUrlState.ts +6 -6
  148. package/src/viewer/index.ts +2 -2
  149. package/src/viewer/intelligence/healthReport.ts +17 -17
  150. package/src/viewer/intelligence/styleDrift.ts +1 -1
  151. package/src/viewer/intelligence/usageScanner.ts +1 -1
  152. package/src/viewer/render-template.html +1 -1
  153. package/src/viewer/render-utils.ts +21 -21
  154. package/src/viewer/server.ts +18 -18
  155. package/src/viewer/utils/detectRelationships.ts +22 -22
  156. package/src/viewer/vite-plugin.ts +213 -213
  157. package/dist/chunk-6JBGU74P.js.map +0 -1
  158. package/dist/chunk-7OPWMLOE.js.map +0 -1
  159. package/dist/chunk-CVXKXVOY.js.map +0 -1
  160. package/dist/chunk-NWQ4CJOQ.js.map +0 -1
  161. package/dist/chunk-RVRTRESS.js.map +0 -1
  162. package/dist/chunk-TJ34N7C7.js.map +0 -1
  163. package/dist/chunk-XHUDJNN3.js.map +0 -1
  164. package/dist/generate-LMTISDIJ.js.map +0 -1
  165. package/dist/scan-WY23TJCP.js +0 -12
  166. package/dist/test-OJRXNDO2.js.map +0 -1
  167. package/dist/viewer-SUFOISZM.js.map +0 -1
  168. package/src/shared/segment-loader.ts +0 -59
  169. /package/dist/{core-W2HYIQW6.js.map → core-UQXZTBFZ.js.map} +0 -0
  170. /package/dist/{scan-WY23TJCP.js.map → scan-V54HWRDY.js.map} +0 -0
  171. /package/dist/{service-T2L7VLTE.js.map → service-PVGTYUKX.js.map} +0 -0
  172. /package/dist/{static-viewer-GBR7YNF3.js.map → static-viewer-KILKIVN7.js.map} +0 -0
  173. /package/dist/{tokens-3BWDESVM.js.map → tokens-IXSQHPQK.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/validators.ts","../src/build.ts","../src/core/auto-props.ts","../src/core/graph-extractor.ts","../src/screenshot.ts","../src/diff.ts","../src/analyze.ts"],"sourcesContent":["import { fragmentDefinitionSchema, BRAND, type FragmentsConfig } from './core/index.js';\nimport {\n discoverFragmentFiles,\n discoverComponentFiles,\n extractComponentName,\n loadFragmentFile,\n type DiscoveredFile,\n} from './core/node.js';\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\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): Promise<ValidationResult> {\n const [schemaResult, coverageResult] = await Promise.all([\n validateSchema(config, configDir),\n validateCoverage(config, configDir),\n ]);\n\n return {\n valid: schemaResult.valid && coverageResult.valid,\n errors: [...schemaResult.errors, ...coverageResult.errors],\n warnings: [...schemaResult.warnings, ...coverageResult.warnings],\n };\n}\n","import { readFile, writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve, join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type {\n FragmentsConfig,\n CompiledFragmentsFile,\n CompiledFragment,\n CompiledBlock,\n CompiledTokenData,\n} from \"./core/index.js\";\nimport { BRAND, compileBlock, parseTokenFile } from \"./core/index.js\";\nimport type { BlockDefinition } from \"./core/index.js\";\nimport {\n discoverFragmentFiles,\n discoverBlockFiles,\n discoverTokenFiles,\n parseFragmentFile,\n loadFragmentFile,\n generateRegistry,\n generateContextMd,\n} from \"./core/node.js\";\nimport {\n extractCustomPropsFromComponentFile,\n resolveComponentSourcePath,\n type AutoDetectedPropDefinition,\n} from \"./core/auto-props.js\";\nimport { buildComponentGraph } from \"./core/graph-extractor.js\";\nimport { serializeGraph } from \"@fragments-sdk/context/graph\";\n\ntype CompiledProp = CompiledFragment[\"props\"][string];\n\nfunction normalizeParsedProps(\n parsedProps: Record<string, Partial<CompiledProp>>\n): Record<string, CompiledProp> {\n return Object.fromEntries(\n Object.entries(parsedProps).map(([name, prop]) => [\n name,\n {\n type: prop.type ?? \"custom\",\n description: prop.description ?? \"\",\n default: prop.default,\n required: prop.required,\n values: prop.values,\n constraints: prop.constraints,\n },\n ])\n );\n}\n\nfunction mergeDocumentedAndAutoProps(\n documentedProps: Record<string, CompiledProp>,\n autoProps: Record<string, AutoDetectedPropDefinition>\n): Record<string, CompiledProp> {\n return Object.fromEntries(\n Object.keys(autoProps).map((name) => {\n const documented = documentedProps[name];\n const auto = autoProps[name];\n\n return [\n name,\n {\n type: auto.type,\n description: documented?.description ?? auto.description ?? \"\",\n default: auto.default !== undefined ? auto.default : documented?.default,\n required: auto.required,\n values: auto.values ?? documented?.values,\n constraints: documented?.constraints,\n },\n ];\n })\n );\n}\n\nexport interface BuildResult {\n success: boolean;\n outputPath: string;\n fragmentCount: number;\n errors: Array<{ file: string; error: string }>;\n warnings: Array<{ file: string; warning: string }>;\n}\n\n/**\n * Build compiled fragments.json file for AI consumption.\n *\n * Uses AST parsing to extract metadata WITHOUT executing fragment files.\n * This means the build works without any project dependencies installed.\n */\nexport async function buildFragments(\n config: FragmentsConfig,\n configDir: string\n): Promise<BuildResult> {\n const files = await discoverFragmentFiles(config, configDir);\n const errors: Array<{ file: string; error: string }> = [];\n const warnings: Array<{ file: string; warning: string }> = [];\n const fragments: CompiledFragmentsFile[\"fragments\"] = {};\n\n for (const file of files) {\n try {\n // Read file content as text\n const content = await readFile(file.absolutePath, \"utf-8\");\n\n // Parse using AST (no execution)\n const parsed = parseFragmentFile(content, file.relativePath);\n\n // Collect warnings\n for (const warning of parsed.warnings) {\n warnings.push({ file: file.relativePath, warning });\n }\n\n // Check for required fields\n if (!parsed.meta.name) {\n errors.push({\n file: file.relativePath,\n error: \"Missing meta.name in fragment definition\",\n });\n continue;\n }\n\n const documentedProps = normalizeParsedProps(parsed.props);\n let mergedProps = documentedProps;\n\n const componentExportName = parsed.componentName ?? parsed.meta.name;\n const componentSourcePath = resolveComponentSourcePath(\n file.absolutePath,\n parsed.componentImport\n );\n\n if (componentExportName && componentSourcePath) {\n const autoPropsResult = extractCustomPropsFromComponentFile(\n componentSourcePath,\n componentExportName\n );\n\n for (const warning of autoPropsResult.warnings) {\n warnings.push({ file: file.relativePath, warning });\n }\n\n const hasAutoProps = Object.keys(autoPropsResult.props).length > 0;\n if (autoPropsResult.resolved && hasAutoProps) {\n const removedDocumentedProps = Object.keys(documentedProps).filter(\n (propName) => !(propName in autoPropsResult.props)\n );\n\n if (removedDocumentedProps.length > 0) {\n warnings.push({\n file: file.relativePath,\n warning: `Removed ${removedDocumentedProps.length} documented props not present in source API: ${removedDocumentedProps.join(\", \")}`,\n });\n }\n\n mergedProps = mergeDocumentedAndAutoProps(\n documentedProps,\n autoPropsResult.props\n );\n } else if (autoPropsResult.resolved && !hasAutoProps && Object.keys(documentedProps).length > 0) {\n warnings.push({\n file: file.relativePath,\n warning: \"Auto-props extraction returned no custom props; falling back to documented props\",\n });\n }\n } else if (!componentExportName) {\n warnings.push({\n file: file.relativePath,\n warning: \"Unable to resolve component export name for auto-props extraction\",\n });\n } else if (!componentSourcePath) {\n warnings.push({\n file: file.relativePath,\n warning: `Unable to resolve component source path from import: ${parsed.componentImport ?? \"unknown\"}`,\n });\n }\n\n // Build compiled fragment from parsed metadata\n const compiled: CompiledFragment = {\n filePath: file.relativePath,\n meta: {\n name: parsed.meta.name,\n description: parsed.meta.description ?? \"\",\n category: parsed.meta.category ?? \"Uncategorized\",\n status: parsed.meta.status,\n tags: parsed.meta.tags,\n since: parsed.meta.since,\n figma: parsed.meta.figma,\n },\n usage: {\n when: parsed.usage.when ?? [],\n whenNot: parsed.usage.whenNot ?? [],\n guidelines: parsed.usage.guidelines,\n accessibility: parsed.usage.accessibility,\n },\n props: mergedProps,\n relations: parsed.relations.map((rel) => ({\n component: rel.component,\n relationship: rel.relationship as\n | \"alternative\"\n | \"sibling\"\n | \"parent\"\n | \"child\"\n | \"composition\",\n note: rel.note,\n })),\n variants: parsed.variants.map((v) => ({\n name: v.name,\n description: v.description,\n ...(v.code && { code: v.code }),\n ...(v.figma && { figma: v.figma }),\n ...(v.args && { args: v.args }),\n })),\n // Include AI metadata if present\n ...(parsed.ai && { ai: parsed.ai }),\n // Include contract metadata if present\n ...(parsed.contract && { contract: parsed.contract }),\n };\n\n fragments[parsed.meta.name] = compiled;\n } catch (error) {\n errors.push({\n file: file.relativePath,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n // Discover and compile block files\n const blocks: Record<string, CompiledBlock> = {};\n try {\n const blockFiles = await discoverBlockFiles(configDir, config.exclude);\n for (const file of blockFiles) {\n try {\n // loadFragmentFile uses esbuild to bundle+evaluate, returns default export\n // CJS/ESM interop may double-wrap the default export\n let raw = await loadFragmentFile(file.absolutePath) as unknown as Record<string, unknown> | null;\n // Unwrap double-default from CJS interop\n if (raw && 'default' in raw && typeof raw.default === 'object') {\n raw = raw.default as Record<string, unknown>;\n }\n const def = raw;\n if (def && typeof def === 'object' && 'name' in def && 'code' in def && 'components' in def) {\n const compiled = compileBlock(def as unknown as BlockDefinition, file.relativePath);\n blocks[compiled.name] = compiled;\n }\n } catch (error) {\n warnings.push({\n file: file.relativePath,\n warning: `Failed to load block: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n }\n } catch {\n // Block discovery failure is non-fatal\n }\n\n // Discover and extract design tokens from SCSS/CSS files\n let tokens: CompiledTokenData | undefined;\n try {\n const tokenPatterns = config.tokens?.include;\n const tokenFiles = await discoverTokenFiles(configDir, tokenPatterns, config.exclude);\n if (tokenFiles.length > 0) {\n // Merge tokens from all discovered files\n const mergedCategories: Record<string, Array<{ name: string; value?: string; description?: string }>> = {};\n let prefix = '--';\n let total = 0;\n\n for (const file of tokenFiles) {\n const content = await readFile(file.absolutePath, 'utf-8');\n const parsed = parseTokenFile(content, file.relativePath);\n prefix = parsed.prefix; // Use last file's prefix (usually consistent)\n total += parsed.total;\n for (const [cat, catTokens] of Object.entries(parsed.categories)) {\n if (!mergedCategories[cat]) {\n mergedCategories[cat] = [];\n }\n for (const t of catTokens) {\n // Deduplicate by name\n if (!mergedCategories[cat].some((e) => e.name === t.name)) {\n mergedCategories[cat].push({ name: t.name, ...(t.value && { value: t.value }), description: t.description });\n }\n }\n }\n }\n\n if (total > 0) {\n tokens = { prefix, total, categories: mergedCategories };\n }\n }\n } catch {\n // Token extraction failure is non-fatal\n }\n\n // Read package name for import statements\n let packageName: string | undefined;\n const pkgJsonPath = resolve(configDir, \"package.json\");\n if (existsSync(pkgJsonPath)) {\n try {\n const pkg = JSON.parse(await readFile(pkgJsonPath, \"utf-8\"));\n if (pkg.name) packageName = pkg.name;\n } catch {\n // Non-fatal\n }\n }\n\n // Build component graph for AI structural queries\n // Derive component directory from configDir (typically src/components/)\n const componentDir = resolve(configDir, \"src\", \"components\");\n let graphData: ReturnType<typeof serializeGraph> | undefined;\n try {\n const graphResult = await buildComponentGraph(fragments, blocks, componentDir);\n\n // Auto-enrich fragments with detected metadata\n for (const [name, fragment] of Object.entries(fragments)) {\n const detected = graphResult.autoDetected.get(name);\n if (!detected) continue;\n\n if (!fragment.ai) fragment.ai = {};\n if (!fragment.ai.subComponents && detected.subComponents) {\n fragment.ai.subComponents = detected.subComponents;\n }\n if (!fragment.ai.compositionPattern && detected.compositionPattern) {\n fragment.ai.compositionPattern = detected.compositionPattern;\n }\n if (!fragment.ai.commonPatterns && detected.commonPatterns) {\n fragment.ai.commonPatterns = detected.commonPatterns;\n }\n if (!fragment.ai.requiredChildren && detected.requiredChildren) {\n fragment.ai.requiredChildren = detected.requiredChildren;\n }\n }\n\n // Report drift warnings\n for (const w of graphResult.warnings) {\n warnings.push({ file: \"graph\", warning: w });\n }\n\n graphData = serializeGraph(graphResult.graph);\n } catch (error) {\n warnings.push({\n file: \"graph\",\n warning: `Graph extraction failed: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n\n const output: CompiledFragmentsFile = {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n ...(packageName && { packageName }),\n fragments,\n ...(Object.keys(blocks).length > 0 && { blocks }),\n ...(tokens && { tokens }),\n ...(graphData && { graph: graphData }),\n };\n\n const outputPath = resolve(configDir, config.outFile ?? BRAND.outFile);\n await writeFile(outputPath, JSON.stringify(output));\n\n return {\n success: errors.length === 0,\n outputPath,\n fragmentCount: Object.keys(fragments).length,\n errors,\n warnings,\n };\n}\n\n/**\n * Result of building the .fragments directory\n */\nexport interface FragmentsBuildResult {\n success: boolean;\n indexPath: string;\n registryPath: string;\n contextPath: string;\n componentCount: number;\n errors: Array<{ file: string; error: string }>;\n warnings: Array<{ file: string; warning: string }>;\n}\n\n/**\n * Build the .fragments/ directory with index.json, registry.json, and context.md\n *\n * This generates:\n * - .fragments/index.json - Minimal name → path mapping (tiny, for quick lookups)\n * - .fragments/registry.json - Component index with paths and enrichment references\n * - .fragments/context.md - AI-ready consolidated context file\n */\nexport async function buildFragmentsDir(\n config: FragmentsConfig,\n configDir: string\n): Promise<FragmentsBuildResult> {\n const fragmentsDir = join(configDir, BRAND.dataDir);\n const componentsDir = join(fragmentsDir, BRAND.componentsDir);\n\n // Create directories\n await mkdir(fragmentsDir, { recursive: true });\n await mkdir(componentsDir, { recursive: true });\n\n // Generate registry with config options\n const registryResult = await generateRegistry({\n projectRoot: configDir,\n componentPatterns: config.components || [\"src/**/*.tsx\", \"src/**/*.ts\"],\n storyPatterns: config.include || [\"src/**/*.stories.tsx\"],\n fragmentsDir,\n registryOptions: config.registry || {},\n });\n\n const errors = [...registryResult.errors];\n const warnings = [...registryResult.warnings];\n\n // Write index.json (minimal name → path)\n const indexPath = join(fragmentsDir, \"index.json\");\n await writeFile(indexPath, JSON.stringify(registryResult.index, null, 2));\n\n // Write registry.json (full metadata)\n const registryPath = join(fragmentsDir, BRAND.registryFile);\n await writeFile(registryPath, JSON.stringify(registryResult.registry, null, 2));\n\n // Generate context.md - focus on semantic knowledge, skip props (AI can read source)\n const contextResult = generateContextMd(registryResult.registry, {\n format: \"markdown\",\n compact: false,\n include: {\n props: false, // AI can read TypeScript directly\n relations: true,\n code: false,\n },\n });\n\n // Write context.md\n const contextPath = join(fragmentsDir, BRAND.contextFile);\n await writeFile(contextPath, contextResult.content);\n\n return {\n success: errors.length === 0,\n indexPath,\n registryPath,\n contextPath,\n componentCount: registryResult.registry.componentCount,\n errors,\n warnings,\n };\n}\n","import { existsSync, statSync } from \"node:fs\";\nimport { dirname, extname, join, resolve } from \"node:path\";\nimport ts from \"typescript\";\nimport type { PropDefinition } from \"./types.js\";\n\nexport interface AutoDetectedPropDefinition {\n type: PropDefinition[\"type\"];\n description: string;\n required: boolean;\n default?: unknown;\n values?: readonly string[];\n}\n\nexport interface AutoPropsExtractionResult {\n props: Record<string, AutoDetectedPropDefinition>;\n warnings: string[];\n resolved: boolean;\n}\n\ninterface ResolvedComponentSignature {\n propsTypeNode: ts.TypeNode | null;\n componentNode: ts.FunctionLikeDeclarationBase | null;\n}\n\nfunction toPosixPath(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\nfunction isFile(filePath: string): boolean {\n if (!existsSync(filePath)) return false;\n try {\n return statSync(filePath).isFile();\n } catch {\n return false;\n }\n}\n\nfunction resolveModulePath(basePath: string): string | null {\n const candidates: string[] = [];\n const extension = extname(basePath);\n\n if (extension) {\n candidates.push(basePath);\n } else {\n candidates.push(\n `${basePath}.tsx`,\n `${basePath}.ts`,\n `${basePath}.jsx`,\n `${basePath}.js`,\n join(basePath, \"index.tsx\"),\n join(basePath, \"index.ts\"),\n join(basePath, \"index.jsx\"),\n join(basePath, \"index.js\")\n );\n }\n\n for (const candidate of candidates) {\n if (isFile(candidate)) {\n return resolve(candidate);\n }\n }\n\n return null;\n}\n\n/**\n * Resolve a component source file from the fragment file path + component import path.\n * Supports relative imports like \".\", \"./Button\", \"../components/Button\".\n */\nexport function resolveComponentSourcePath(\n fragmentFileAbsolutePath: string,\n componentImportPath: string | null\n): string | null {\n if (!componentImportPath) return null;\n if (!componentImportPath.startsWith(\".\")) return null;\n\n const fragmentDir = dirname(fragmentFileAbsolutePath);\n const basePath = resolve(fragmentDir, componentImportPath);\n return resolveModulePath(basePath);\n}\n\nfunction collectTopLevelDeclarations(sourceFile: ts.SourceFile): {\n typeDeclarations: Map<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration>;\n functionDeclarations: Map<string, ts.FunctionDeclaration>;\n variableDeclarations: Map<string, ts.VariableDeclaration>;\n} {\n const typeDeclarations = new Map<string, ts.InterfaceDeclaration | ts.TypeAliasDeclaration>();\n const functionDeclarations = new Map<string, ts.FunctionDeclaration>();\n const variableDeclarations = new Map<string, ts.VariableDeclaration>();\n\n for (const node of sourceFile.statements) {\n if (ts.isInterfaceDeclaration(node)) {\n typeDeclarations.set(node.name.text, node);\n continue;\n }\n\n if (ts.isTypeAliasDeclaration(node)) {\n typeDeclarations.set(node.name.text, node);\n continue;\n }\n\n if (ts.isFunctionDeclaration(node) && node.name) {\n functionDeclarations.set(node.name.text, node);\n continue;\n }\n\n if (ts.isVariableStatement(node)) {\n for (const declaration of node.declarationList.declarations) {\n if (ts.isIdentifier(declaration.name)) {\n variableDeclarations.set(declaration.name.text, declaration);\n }\n }\n }\n }\n\n return { typeDeclarations, functionDeclarations, variableDeclarations };\n}\n\nfunction readDefaultValue(expression: ts.Expression): unknown {\n if (ts.isStringLiteral(expression) || ts.isNoSubstitutionTemplateLiteral(expression)) {\n return expression.text;\n }\n\n if (ts.isNumericLiteral(expression)) {\n return Number(expression.text);\n }\n\n if (expression.kind === ts.SyntaxKind.TrueKeyword) return true;\n if (expression.kind === ts.SyntaxKind.FalseKeyword) return false;\n if (expression.kind === ts.SyntaxKind.NullKeyword) return null;\n\n if (\n ts.isPrefixUnaryExpression(expression) &&\n expression.operator === ts.SyntaxKind.MinusToken &&\n ts.isNumericLiteral(expression.operand)\n ) {\n return -Number(expression.operand.text);\n }\n\n return undefined;\n}\n\nfunction extractDefaultValues(\n componentNode: ts.FunctionLikeDeclarationBase | null\n): Record<string, unknown> {\n const defaults: Record<string, unknown> = {};\n if (!componentNode?.parameters?.length) return defaults;\n\n const firstParam = componentNode.parameters[0];\n if (!ts.isObjectBindingPattern(firstParam.name)) return defaults;\n\n for (const element of firstParam.name.elements) {\n let propName: string | null = null;\n\n if (element.propertyName) {\n if (ts.isIdentifier(element.propertyName) || ts.isStringLiteral(element.propertyName)) {\n propName = element.propertyName.text;\n }\n } else if (ts.isIdentifier(element.name)) {\n propName = element.name.text;\n }\n\n if (!propName || !element.initializer) continue;\n\n const value = readDefaultValue(element.initializer);\n if (value !== undefined) {\n defaults[propName] = value;\n }\n }\n\n return defaults;\n}\n\nfunction isNullishType(type: ts.Type): boolean {\n return (\n (type.flags & ts.TypeFlags.Null) !== 0 ||\n (type.flags & ts.TypeFlags.Undefined) !== 0 ||\n (type.flags & ts.TypeFlags.Void) !== 0\n );\n}\n\nfunction isBooleanLikeType(type: ts.Type): boolean {\n return (\n (type.flags & ts.TypeFlags.BooleanLike) !== 0 ||\n type.flags === ts.TypeFlags.BooleanLiteral\n );\n}\n\nfunction inferPropType(\n type: ts.Type,\n checker: ts.TypeChecker\n): Pick<AutoDetectedPropDefinition, \"type\" | \"values\"> {\n const typeText = checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation);\n\n if (typeText.includes(\"ReactNode\")) {\n return { type: \"node\" };\n }\n if (typeText.includes(\"ReactElement\") || typeText.includes(\"JSX.Element\")) {\n return { type: \"element\" };\n }\n\n if (type.getCallSignatures().length > 0) {\n return { type: \"function\" };\n }\n\n if (checker.isArrayType(type) || checker.isTupleType(type)) {\n return { type: \"array\" };\n }\n\n if (type.isUnion()) {\n const nonNullableTypes = type.types.filter((unionType) => !isNullishType(unionType));\n\n if (nonNullableTypes.length === 1) {\n return inferPropType(nonNullableTypes[0], checker);\n }\n\n const stringLiteralValues = nonNullableTypes\n .filter((unionType) => (unionType.flags & ts.TypeFlags.StringLiteral) !== 0)\n .map((unionType) => (unionType as ts.StringLiteralType).value);\n\n if (stringLiteralValues.length > 0 && stringLiteralValues.length === nonNullableTypes.length) {\n return { type: \"enum\", values: stringLiteralValues };\n }\n\n if (nonNullableTypes.every((unionType) => isBooleanLikeType(unionType))) {\n return { type: \"boolean\" };\n }\n\n return { type: \"union\" };\n }\n\n if ((type.flags & ts.TypeFlags.StringLike) !== 0) {\n return { type: \"string\" };\n }\n if ((type.flags & ts.TypeFlags.NumberLike) !== 0) {\n return { type: \"number\" };\n }\n if ((type.flags & ts.TypeFlags.BooleanLike) !== 0) {\n return { type: \"boolean\" };\n }\n\n if ((type.flags & ts.TypeFlags.Object) !== 0) {\n return { type: \"object\" };\n }\n\n return { type: \"custom\" };\n}\n\nfunction resolveComponentSignature(\n exportName: string,\n declarations: ReturnType<typeof collectTopLevelDeclarations>,\n sourceFile: ts.SourceFile\n): ResolvedComponentSignature {\n const visitedNames = new Set<string>();\n\n const typeNodeFromFunction = (\n node: ts.FunctionLikeDeclarationBase\n ): ResolvedComponentSignature => ({\n propsTypeNode: node.parameters[0]?.type ?? null,\n componentNode: node,\n });\n\n const resolveFromExpression = (expression: ts.Expression): ResolvedComponentSignature => {\n if (ts.isParenthesizedExpression(expression)) {\n return resolveFromExpression(expression.expression);\n }\n if (ts.isAsExpression(expression) || ts.isTypeAssertionExpression(expression)) {\n return resolveFromExpression(expression.expression);\n }\n if (ts.isArrowFunction(expression) || ts.isFunctionExpression(expression)) {\n return typeNodeFromFunction(expression);\n }\n if (ts.isIdentifier(expression)) {\n return resolveFromIdentifier(expression.text);\n }\n\n if (ts.isCallExpression(expression)) {\n if (\n ts.isPropertyAccessExpression(expression.expression) &&\n expression.expression.name.text === \"forwardRef\"\n ) {\n const forwardRefPropsType = expression.typeArguments?.[1] ?? null;\n const innerArg = expression.arguments[0];\n const inner = innerArg && (ts.isArrowFunction(innerArg) || ts.isFunctionExpression(innerArg))\n ? typeNodeFromFunction(innerArg)\n : innerArg && ts.isIdentifier(innerArg)\n ? resolveFromIdentifier(innerArg.text)\n : { propsTypeNode: null, componentNode: null };\n\n return {\n propsTypeNode: forwardRefPropsType ?? inner.propsTypeNode,\n componentNode: inner.componentNode,\n };\n }\n\n if (\n ts.isPropertyAccessExpression(expression.expression) &&\n expression.expression.name.text === \"memo\" &&\n expression.arguments[0]\n ) {\n return resolveFromExpression(expression.arguments[0]);\n }\n\n if (\n ts.isPropertyAccessExpression(expression.expression) &&\n expression.expression.expression.getText(sourceFile) === \"Object\" &&\n expression.expression.name.text === \"assign\" &&\n expression.arguments[0]\n ) {\n return resolveFromExpression(expression.arguments[0]);\n }\n }\n\n return { propsTypeNode: null, componentNode: null };\n };\n\n const resolveFromVariable = (declaration: ts.VariableDeclaration): ResolvedComponentSignature => {\n if (\n declaration.type &&\n ts.isTypeReferenceNode(declaration.type) &&\n declaration.type.typeArguments?.length\n ) {\n const typeName = declaration.type.typeName.getText(sourceFile);\n if (typeName.includes(\"FC\") || typeName.includes(\"FunctionComponent\")) {\n const componentNode =\n declaration.initializer &&\n (ts.isArrowFunction(declaration.initializer) || ts.isFunctionExpression(declaration.initializer))\n ? declaration.initializer\n : null;\n\n return {\n propsTypeNode: declaration.type.typeArguments[0] ?? null,\n componentNode,\n };\n }\n }\n\n if (declaration.initializer) {\n return resolveFromExpression(declaration.initializer);\n }\n\n return { propsTypeNode: null, componentNode: null };\n };\n\n const resolveFromIdentifier = (name: string): ResolvedComponentSignature => {\n if (!name || visitedNames.has(name)) {\n return { propsTypeNode: null, componentNode: null };\n }\n visitedNames.add(name);\n\n const functionDeclaration = declarations.functionDeclarations.get(name);\n if (functionDeclaration) {\n return typeNodeFromFunction(functionDeclaration);\n }\n\n const variableDeclaration = declarations.variableDeclarations.get(name);\n if (variableDeclaration) {\n return resolveFromVariable(variableDeclaration);\n }\n\n return { propsTypeNode: null, componentNode: null };\n };\n\n return resolveFromIdentifier(exportName);\n}\n\n/**\n * Extract custom component props from a source file.\n * Custom props are identified as props whose declarations originate from the component's source file.\n */\nexport function extractCustomPropsFromComponentFile(\n componentFilePath: string,\n exportName: string\n): AutoPropsExtractionResult {\n const warnings: string[] = [];\n const resolvedPath = resolve(componentFilePath);\n\n if (!existsSync(resolvedPath)) {\n return {\n props: {},\n warnings: [`Component file not found: ${resolvedPath}`],\n resolved: false,\n };\n }\n\n const compilerOptions: ts.CompilerOptions = {\n target: ts.ScriptTarget.ESNext,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n jsx: ts.JsxEmit.ReactJSX,\n allowSyntheticDefaultImports: true,\n esModuleInterop: true,\n skipLibCheck: true,\n strict: false,\n noEmit: true,\n };\n\n const program = ts.createProgram([resolvedPath], compilerOptions);\n const sourceFile = program.getSourceFile(resolvedPath);\n if (!sourceFile) {\n return {\n props: {},\n warnings: [`Unable to parse component source: ${resolvedPath}`],\n resolved: false,\n };\n }\n\n const checker = program.getTypeChecker();\n const declarations = collectTopLevelDeclarations(sourceFile);\n const signature = resolveComponentSignature(exportName, declarations, sourceFile);\n\n if (!signature.propsTypeNode) {\n return {\n props: {},\n warnings: [`Unable to resolve props type for export: ${exportName}`],\n resolved: false,\n };\n }\n\n const propsType = checker.getTypeFromTypeNode(signature.propsTypeNode);\n const defaultValues = extractDefaultValues(signature.componentNode);\n const sourceFilePath = toPosixPath(sourceFile.fileName);\n\n const extractedProps: Record<string, AutoDetectedPropDefinition> = {};\n for (const symbol of checker.getPropertiesOfType(propsType)) {\n const propName = symbol.getName();\n if (propName.startsWith(\"_\") || propName.startsWith(\"$\")) {\n continue;\n }\n\n const declarationsForSymbol = symbol.getDeclarations() ?? [];\n const localDeclarations = declarationsForSymbol.filter(\n (declaration) => toPosixPath(declaration.getSourceFile().fileName) === sourceFilePath\n );\n\n if (localDeclarations.length === 0) {\n continue;\n }\n\n const referenceNode = localDeclarations[0];\n const inferredType = inferPropType(checker.getTypeOfSymbolAtLocation(symbol, referenceNode), checker);\n const description = ts\n .displayPartsToString(symbol.getDocumentationComment(checker))\n .trim();\n\n extractedProps[propName] = {\n type: inferredType.type,\n description,\n required: (symbol.getFlags() & ts.SymbolFlags.Optional) === 0,\n ...(inferredType.values && { values: inferredType.values }),\n ...(defaultValues[propName] !== undefined && { default: defaultValues[propName] }),\n };\n }\n\n if (Object.keys(extractedProps).length === 0) {\n warnings.push(`Resolved props type for ${exportName}, but no local custom props were found`);\n }\n\n return {\n props: extractedProps,\n warnings,\n resolved: true,\n };\n}\n","/**\n * Graph extraction pipeline — builds the ComponentGraph from source code,\n * fragment metadata, and block definitions.\n *\n * Absorbs and enhances the logic from importAnalyzer.ts:\n * - Import detection (PascalCase component imports)\n * - Hook dependency detection (useX() calls)\n * - Object.assign sub-component detection\n * - JSX usage in variant code\n * - Block co-occurrence\n * - Fragment relation mapping\n * - Auto-detection of requiredChildren and commonPatterns\n */\n\nimport ts from 'typescript';\nimport { readFileSync, existsSync } from 'node:fs';\nimport { resolve, join, basename } from 'node:path';\nimport { readdirSync } from 'node:fs';\nimport type {\n ComponentGraph,\n ComponentNode,\n GraphEdge,\n GraphEdgeType,\n GraphHealth,\n} from '@fragments-sdk/context/graph';\nimport { EDGE_TYPE_WEIGHTS, computeHealthFromData } from '@fragments-sdk/context/graph';\nimport type { CompiledFragment, CompiledBlock } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport interface GraphBuildOptions {\n /** Skip source-code AST analysis (for testing with mock data) */\n skipSourceAnalysis?: boolean;\n}\n\nexport interface GraphBuildResult {\n graph: ComponentGraph;\n /** Auto-detected metadata keyed by component name */\n autoDetected: Map<string, AutoDetectedMetadata>;\n /** Warnings about drift between manual declarations and auto-detected values */\n warnings: string[];\n}\n\nexport interface AutoDetectedMetadata {\n subComponents?: string[];\n compositionPattern?: 'compound' | 'simple' | 'controlled';\n commonPatterns?: string[];\n requiredChildren?: string[];\n}\n\n/**\n * Build the full ComponentGraph from fragments, blocks, and source code.\n */\nexport async function buildComponentGraph(\n fragments: Record<string, CompiledFragment>,\n blocks: Record<string, CompiledBlock>,\n componentDir: string,\n options?: GraphBuildOptions,\n): Promise<GraphBuildResult> {\n const knownComponents = new Set(Object.keys(fragments));\n const allEdges: GraphEdge[] = [];\n const autoDetected = new Map<string, AutoDetectedMetadata>();\n const warnings: string[] = [];\n\n // 1. Extract edges from source code (imports, hooks, sub-components)\n if (!options?.skipSourceAnalysis) {\n const sourceEdges = extractImportAndHookEdges(componentDir, knownComponents);\n allEdges.push(...sourceEdges);\n\n const subComponentResults = extractSubComponents(componentDir, knownComponents);\n for (const [name, subs] of subComponentResults) {\n autoDetected.set(name, {\n ...autoDetected.get(name),\n subComponents: subs,\n compositionPattern: subs.length > 0 ? 'compound' : 'simple',\n });\n }\n }\n\n // 2. Extract JSX usage from variant code\n const jsxEdges = extractJsxUsageEdges(fragments, knownComponents);\n allEdges.push(...jsxEdges);\n\n // 3. Extract block co-occurrence edges\n const blockEdges = extractBlockEdges(blocks);\n allEdges.push(...blockEdges);\n\n // 4. Extract relation edges from fragment metadata\n const relationEdges = extractRelationEdges(fragments);\n allEdges.push(...relationEdges);\n\n // 5. Infer requiredChildren\n const requiredChildrenMap = inferRequiredChildren(fragments, autoDetected);\n for (const [name, children] of requiredChildrenMap) {\n const existing = autoDetected.get(name) ?? {};\n autoDetected.set(name, { ...existing, requiredChildren: children });\n }\n\n // 6. Generate common patterns\n const patternsMap = generateCommonPatterns(fragments, autoDetected);\n for (const [name, patterns] of patternsMap) {\n const existing = autoDetected.get(name) ?? {};\n autoDetected.set(name, { ...existing, commonPatterns: patterns });\n }\n\n // 7. Merge and deduplicate edges\n const mergedEdges = mergeAndDeduplicate(allEdges);\n\n // 8. Build nodes\n const nodes: ComponentNode[] = Object.entries(fragments).map(([name, fragment]) => {\n const detected = autoDetected.get(name);\n return {\n name,\n category: fragment.meta.category,\n status: fragment.meta.status ?? 'stable',\n compositionPattern: fragment.ai?.compositionPattern ?? detected?.compositionPattern,\n subComponents: fragment.ai?.subComponents ?? detected?.subComponents,\n };\n });\n\n // 9. Build block index for health computation\n const blockIndex = new Map<string, string[]>();\n for (const [blockName, block] of Object.entries(blocks)) {\n for (const comp of block.components) {\n const existing = blockIndex.get(comp);\n if (existing) existing.push(blockName);\n else blockIndex.set(comp, [blockName]);\n }\n }\n\n // 10. Compute health\n const health = computeHealthFromData(nodes, mergedEdges, blockIndex);\n\n // 11. Generate drift warnings\n for (const [name, fragment] of Object.entries(fragments)) {\n const detected = autoDetected.get(name);\n if (!detected) continue;\n\n // Sub-components drift\n if (fragment.ai?.subComponents && detected.subComponents) {\n const declared = new Set(fragment.ai.subComponents);\n const found = new Set(detected.subComponents);\n const missing = detected.subComponents.filter(s => !declared.has(s));\n const extra = fragment.ai.subComponents.filter(s => !found.has(s));\n\n if (missing.length > 0) {\n warnings.push(\n `${name}: declares ${declared.size} subComponents but code has ${found.size}. ` +\n `Missing from declaration: ${missing.join(', ')}`\n );\n }\n if (extra.length > 0) {\n warnings.push(\n `${name}: declares subComponents [${extra.join(', ')}] not found in Object.assign`\n );\n }\n }\n }\n\n return {\n graph: { nodes, edges: mergedEdges, health },\n autoDetected,\n warnings,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Extraction functions\n// ---------------------------------------------------------------------------\n\n/**\n * Parse index.tsx files for import declarations and hook calls.\n * Returns import edges and hook-depends edges.\n */\nexport function extractImportAndHookEdges(\n componentDir: string,\n knownComponents: Set<string>,\n): GraphEdge[] {\n const edges: GraphEdge[] = [];\n\n for (const componentName of knownComponents) {\n const indexPath = findComponentIndex(componentDir, componentName);\n if (!indexPath) continue;\n\n let sourceText: string;\n try {\n sourceText = readFileSync(indexPath, 'utf-8');\n } catch {\n continue;\n }\n\n const sourceFile = ts.createSourceFile(\n indexPath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n indexPath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n\n // Walk AST for imports and hook calls\n const visitNode = (node: ts.Node) => {\n // Import declarations\n if (ts.isImportDeclaration(node)) {\n const moduleSpecifier = node.moduleSpecifier;\n if (ts.isStringLiteral(moduleSpecifier)) {\n const importPath = moduleSpecifier.text;\n // Only relative imports\n if (importPath.startsWith('.') || importPath.startsWith('/')) {\n const clause = node.importClause;\n if (clause) {\n // Default import\n if (clause.name && isPascalCase(clause.name.text) && knownComponents.has(clause.name.text)) {\n edges.push({\n source: componentName,\n target: clause.name.text,\n type: 'imports',\n weight: EDGE_TYPE_WEIGHTS['imports'],\n provenance: `source:${componentName}/index.tsx`,\n });\n }\n // Named imports\n if (clause.namedBindings && ts.isNamedImports(clause.namedBindings)) {\n for (const element of clause.namedBindings.elements) {\n const name = element.name.text;\n if (isPascalCase(name) && knownComponents.has(name) && name !== componentName) {\n edges.push({\n source: componentName,\n target: name,\n type: 'imports',\n weight: EDGE_TYPE_WEIGHTS['imports'],\n provenance: `source:${componentName}/index.tsx`,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Hook calls: useX() where X is a known component\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const callName = node.expression.text;\n const hookMatch = callName.match(/^use([A-Z][a-zA-Z]*)$/);\n if (hookMatch) {\n const hookTarget = hookMatch[1];\n if (knownComponents.has(hookTarget) && hookTarget !== componentName) {\n edges.push({\n source: componentName,\n target: hookTarget,\n type: 'hook-depends',\n weight: EDGE_TYPE_WEIGHTS['hook-depends'],\n provenance: `source:${componentName}/index.tsx`,\n });\n }\n }\n }\n\n ts.forEachChild(node, visitNode);\n };\n\n ts.forEachChild(sourceFile, visitNode);\n }\n\n return edges;\n}\n\n/**\n * Detect Object.assign(Root, { Sub1, Sub2 }) patterns in index.tsx files.\n * Returns a map of component name → sub-component names.\n */\nexport function extractSubComponents(\n componentDir: string,\n knownComponents: Set<string>,\n): Map<string, string[]> {\n const result = new Map<string, string[]>();\n\n for (const componentName of knownComponents) {\n const indexPath = findComponentIndex(componentDir, componentName);\n if (!indexPath) continue;\n\n let sourceText: string;\n try {\n sourceText = readFileSync(indexPath, 'utf-8');\n } catch {\n continue;\n }\n\n // Quick regex check first for performance\n if (!sourceText.includes('Object.assign')) continue;\n\n const sourceFile = ts.createSourceFile(\n indexPath,\n sourceText,\n ts.ScriptTarget.Latest,\n true,\n indexPath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS,\n );\n\n const subComponents: string[] = [];\n\n const visitNode = (node: ts.Node) => {\n // Look for Object.assign(X, { A, B, C })\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n ts.isIdentifier(node.expression.expression) &&\n node.expression.expression.text === 'Object' &&\n node.expression.name.text === 'assign' &&\n node.arguments.length >= 2\n ) {\n const propsArg = node.arguments[1];\n if (ts.isObjectLiteralExpression(propsArg)) {\n for (const prop of propsArg.properties) {\n if (ts.isShorthandPropertyAssignment(prop)) {\n subComponents.push(prop.name.text);\n } else if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) {\n subComponents.push(prop.name.text);\n }\n }\n }\n }\n ts.forEachChild(node, visitNode);\n };\n\n ts.forEachChild(sourceFile, visitNode);\n\n if (subComponents.length > 0) {\n result.set(componentName, subComponents);\n }\n }\n\n return result;\n}\n\n/**\n * Scan variant code strings for JSX element names → renders edges.\n */\nexport function extractJsxUsageEdges(\n fragments: Record<string, CompiledFragment>,\n knownComponents: Set<string>,\n): GraphEdge[] {\n const edges: GraphEdge[] = [];\n const jsxTagRegex = /<([A-Z][a-zA-Z]*(?:\\.[A-Z][a-zA-Z]*)?)/g;\n\n for (const [name, fragment] of Object.entries(fragments)) {\n const usedComponents = new Set<string>();\n\n for (const variant of fragment.variants) {\n if (!variant.code) continue;\n\n let match: RegExpExecArray | null;\n jsxTagRegex.lastIndex = 0;\n while ((match = jsxTagRegex.exec(variant.code)) !== null) {\n let tagName = match[1];\n // Handle compound: Header.Nav → Header\n if (tagName.includes('.')) {\n tagName = tagName.split('.')[0];\n }\n if (knownComponents.has(tagName) && tagName !== name) {\n usedComponents.add(tagName);\n }\n }\n }\n\n for (const target of usedComponents) {\n edges.push({\n source: name,\n target,\n type: 'renders',\n weight: EDGE_TYPE_WEIGHTS['renders'],\n provenance: `variant:${name}`,\n });\n }\n }\n\n return edges;\n}\n\n/**\n * Create composes edges from block component lists (pairwise).\n */\nexport function extractBlockEdges(\n blocks: Record<string, CompiledBlock>,\n): GraphEdge[] {\n const edges: GraphEdge[] = [];\n\n for (const [blockName, block] of Object.entries(blocks)) {\n const components = block.components;\n // Create pairwise edges (avoid duplicates by only going i < j)\n for (let i = 0; i < components.length; i++) {\n for (let j = i + 1; j < components.length; j++) {\n edges.push({\n source: components[i],\n target: components[j],\n type: 'composes',\n weight: EDGE_TYPE_WEIGHTS['composes'],\n provenance: `block:${blockName}`,\n });\n }\n }\n }\n\n return edges;\n}\n\n/**\n * Map fragment ComponentRelation[] to typed graph edges.\n */\nexport function extractRelationEdges(\n fragments: Record<string, CompiledFragment>,\n): GraphEdge[] {\n const edges: GraphEdge[] = [];\n\n const relationToEdgeType: Record<string, GraphEdgeType> = {\n parent: 'parent-of',\n child: 'parent-of', // reversed: if A declares child B, edge is A parent-of B\n composition: 'composes',\n alternative: 'alternative-to',\n sibling: 'sibling-of',\n };\n\n for (const [name, fragment] of Object.entries(fragments)) {\n if (!fragment.relations) continue;\n\n for (const rel of fragment.relations) {\n const edgeType = relationToEdgeType[rel.relationship];\n if (!edgeType) continue;\n\n // For 'child' relation, source is the current component (parent)\n // For 'parent' relation, source is the related component\n let source: string;\n let target: string;\n\n if (rel.relationship === 'parent') {\n source = rel.component;\n target = name;\n } else {\n source = name;\n target = rel.component;\n }\n\n edges.push({\n source,\n target,\n type: edgeType,\n weight: EDGE_TYPE_WEIGHTS[edgeType],\n note: rel.note,\n provenance: 'relation',\n });\n }\n }\n\n return edges;\n}\n\n/**\n * Infer requiredChildren: sub-components that appear in ALL variant code strings.\n */\nexport function inferRequiredChildren(\n fragments: Record<string, CompiledFragment>,\n autoDetected: Map<string, AutoDetectedMetadata>,\n): Map<string, string[]> {\n const result = new Map<string, string[]>();\n\n for (const [name, fragment] of Object.entries(fragments)) {\n const detected = autoDetected.get(name);\n const subs = detected?.subComponents ?? fragment.ai?.subComponents;\n if (!subs || subs.length === 0) continue;\n\n const variantsWithCode = fragment.variants.filter(v => v.code);\n if (variantsWithCode.length === 0) continue;\n\n const required: string[] = [];\n for (const sub of subs) {\n // Check if this sub-component appears in ALL variants\n const inAll = variantsWithCode.every(v => {\n // Match <ComponentName.SubName or just <SubName\n const patterns = [\n new RegExp(`<${name}\\\\.${sub}[\\\\s/>]`),\n new RegExp(`<${sub}[\\\\s/>]`),\n ];\n return patterns.some(p => p.test(v.code!));\n });\n if (inAll) required.push(sub);\n }\n\n if (required.length > 0) {\n result.set(name, required);\n }\n }\n\n return result;\n}\n\n/**\n * Generate simplified JSX skeleton patterns from variant code.\n */\nexport function generateCommonPatterns(\n fragments: Record<string, CompiledFragment>,\n autoDetected: Map<string, AutoDetectedMetadata>,\n): Map<string, string[]> {\n const result = new Map<string, string[]>();\n\n for (const [name, fragment] of Object.entries(fragments)) {\n const detected = autoDetected.get(name);\n const subs = detected?.subComponents ?? fragment.ai?.subComponents;\n if (!subs || subs.length === 0) continue;\n\n // Build a simplified pattern from the first variant that has code\n const firstVariant = fragment.variants.find(v => v.code);\n if (!firstVariant?.code) continue;\n\n // Extract used sub-components from the code\n const usedSubs: string[] = [];\n for (const sub of subs) {\n const patterns = [\n new RegExp(`<${name}\\\\.${sub}`),\n new RegExp(`<${sub}[\\\\s/>]`),\n ];\n if (patterns.some(p => p.test(firstVariant.code!))) {\n usedSubs.push(sub);\n }\n }\n\n if (usedSubs.length > 0) {\n const pattern = `<${name}>\\n${usedSubs.map(s => ` <${name}.${s}>...</${name}.${s}>`).join('\\n')}\\n</${name}>`;\n result.set(name, [pattern]);\n }\n }\n\n return result;\n}\n\n/**\n * Merge edges: key by (source, target, type), keep highest weight.\n */\nexport function mergeAndDeduplicate(edges: GraphEdge[]): GraphEdge[] {\n const edgeMap = new Map<string, GraphEdge>();\n\n for (const edge of edges) {\n const key = `${edge.source}→${edge.target}:${edge.type}`;\n const existing = edgeMap.get(key);\n if (!existing || edge.weight > existing.weight) {\n edgeMap.set(key, edge);\n }\n }\n\n return [...edgeMap.values()];\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction isPascalCase(name: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(name);\n}\n\n/**\n * Find the index.tsx file for a component in the component directory.\n */\nfunction findComponentIndex(componentDir: string, componentName: string): string | null {\n // Try direct path: componentDir/ComponentName/index.tsx\n const candidates = [\n join(componentDir, componentName, 'index.tsx'),\n join(componentDir, componentName, 'index.ts'),\n join(componentDir, componentName, `${componentName}.tsx`),\n join(componentDir, componentName, `${componentName}.ts`),\n ];\n\n // Also search within subdirectories matching the component structure\n // e.g., src/components/ComponentName/index.tsx\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate;\n }\n }\n\n // Try scanning componentDir for directories matching the component name\n try {\n const entries = readdirSync(componentDir, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory() && entry.name === componentName) {\n const subCandidates = [\n join(componentDir, entry.name, 'index.tsx'),\n join(componentDir, entry.name, 'index.ts'),\n ];\n for (const sc of subCandidates) {\n if (existsSync(sc)) return sc;\n }\n }\n }\n } catch {\n // Directory might not exist\n }\n\n return null;\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":["resolve","join","existsSync","ts","existsSync","join","resolve","existsSync","join","pc","pc","existsSync","readFile","writeFile","mkdir","join","dirname","pc","pc","join","existsSync","readFile","mkdir","dirname","writeFile"]}
@@ -1,6 +1,6 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
- convertToSegmentProps,
3
+ convertToFragmentProps,
4
4
  extractPropsFromFile,
5
5
  filterBoilerplate,
6
6
  generateComponentContext,
@@ -8,14 +8,14 @@ import {
8
8
  inferAllRelations,
9
9
  parseAllStories,
10
10
  scanCodebase
11
- } from "./chunk-NWQ4CJOQ.js";
11
+ } from "./chunk-GKX2HPZ6.js";
12
12
  import {
13
13
  discoverAllComponents,
14
14
  loadConfig
15
- } from "./chunk-CVXKXVOY.js";
15
+ } from "./chunk-3T6QL7IY.js";
16
16
  import {
17
17
  BRAND
18
- } from "./chunk-6JBGU74P.js";
18
+ } from "./chunk-GHYYFAQN.js";
19
19
 
20
20
  // src/commands/scan.ts
21
21
  import { writeFile, mkdir } from "fs/promises";
@@ -31,17 +31,17 @@ async function scan(options = {}) {
31
31
  try {
32
32
  const loaded = await loadConfig(options.config);
33
33
  configDir = loaded.configDir;
34
- outputFile = options.output || loaded.config.outFile || "segments.json";
34
+ outputFile = options.output || loaded.config.outFile || "fragments.json";
35
35
  componentPatterns = options.componentPatterns || loaded.config.components;
36
36
  } catch {
37
37
  configDir = process.cwd();
38
- outputFile = options.output || "segments.json";
38
+ outputFile = options.output || "fragments.json";
39
39
  componentPatterns = options.componentPatterns;
40
40
  }
41
41
  console.log(pc.cyan(`
42
42
  ${BRAND.name} Scan
43
43
  `));
44
- console.log(pc.dim("Zero-config segments.json generation from source code\n"));
44
+ console.log(pc.dim("Zero-config fragments.json generation from source code\n"));
45
45
  console.log(pc.dim("Phase 1: Discovering components..."));
46
46
  const components = await discoverAllComponents(configDir, {
47
47
  patterns: componentPatterns,
@@ -82,7 +82,7 @@ ${BRAND.name} Scan
82
82
  });
83
83
  propsResults.set(comp.name, extraction);
84
84
  if (extraction.success && extraction.props.length > 0) {
85
- propsMap.set(comp.name, convertToSegmentProps(extraction.props));
85
+ propsMap.set(comp.name, convertToFragmentProps(extraction.props));
86
86
  propsExtracted++;
87
87
  }
88
88
  } catch (e) {
@@ -156,11 +156,11 @@ ${BRAND.name} Scan
156
156
  } else {
157
157
  console.log(pc.dim("\nPhase 4: Skipping Storybook parsing"));
158
158
  }
159
- console.log(pc.dim("\nPhase 5: Generating segments..."));
160
- const segments = {};
159
+ console.log(pc.dim("\nPhase 5: Generating fragments..."));
160
+ const fragments = {};
161
161
  for (const comp of components) {
162
162
  try {
163
- const segment = generateSegmentFromData(
163
+ const fragment = generateFragmentFromData(
164
164
  comp,
165
165
  configDir,
166
166
  propsMap.get(comp.name),
@@ -168,7 +168,7 @@ ${BRAND.name} Scan
168
168
  allRelations.get(comp.name),
169
169
  storiesMap.get(comp.name)
170
170
  );
171
- segments[comp.name] = segment;
171
+ fragments[comp.name] = fragment;
172
172
  } catch (e) {
173
173
  errors.push({
174
174
  component: comp.name,
@@ -181,15 +181,15 @@ ${BRAND.name} Scan
181
181
  const output = {
182
182
  version: "1.0.0",
183
183
  generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
184
- segments
184
+ fragments
185
185
  };
186
186
  await writeFile(outputPath, JSON.stringify(output, null, 2));
187
187
  const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
188
188
  console.log(pc.dim("\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500"));
189
189
  console.log(pc.green(`
190
- \u2713 Generated segments.json in ${elapsed}s`));
190
+ \u2713 Generated fragments.json in ${elapsed}s`));
191
191
  console.log(pc.dim(` Output: ${relative(process.cwd(), outputPath)}`));
192
- console.log(pc.dim(` Components: ${Object.keys(segments).length}`));
192
+ console.log(pc.dim(` Components: ${Object.keys(fragments).length}`));
193
193
  console.log(pc.dim(` Props extracted: ${propsExtracted}`));
194
194
  console.log(pc.dim(` Usages found: ${usagesFound}`));
195
195
  console.log(pc.dim(` Relations inferred: ${allRelations.size}`));
@@ -214,7 +214,7 @@ ${BRAND.name} Scan
214
214
  return {
215
215
  success: errors.length === 0,
216
216
  outputPath,
217
- componentCount: Object.keys(segments).length,
217
+ componentCount: Object.keys(fragments).length,
218
218
  propsExtracted,
219
219
  usagesFound,
220
220
  relationsInferred: allRelations.size,
@@ -223,7 +223,7 @@ ${BRAND.name} Scan
223
223
  warnings
224
224
  };
225
225
  }
226
- function generateSegmentFromData(comp, configDir, props, usageAnalysis, relations, storyFile) {
226
+ function generateFragmentFromData(comp, configDir, props, usageAnalysis, relations, storyFile) {
227
227
  const context = generateComponentContext(
228
228
  comp.name,
229
229
  usageAnalysis,
@@ -366,4 +366,4 @@ function calculateConfidence(props, usageAnalysis, storyFile) {
366
366
  export {
367
367
  scan
368
368
  };
369
- //# sourceMappingURL=chunk-XHUDJNN3.js.map
369
+ //# sourceMappingURL=chunk-DH4ETVSM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commands/scan.ts"],"sourcesContent":["/**\n * fragments scan - Zero-config fragments.json generation from source code\n *\n * Automatically extracts component documentation by:\n * 1. Discovering components from source files and barrel exports\n * 2. Extracting props from TypeScript interfaces\n * 3. Scanning codebase for usage patterns\n * 4. Parsing Storybook stories for examples\n * 5. Inferring component relationships from usage data\n * 6. Generating complete fragments.json without manual documentation\n */\n\nimport { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve, join, dirname, relative } from \"node:path\";\nimport pc from \"picocolors\";\nimport {\n BRAND,\n type CompiledFragmentsFile,\n type CompiledFragment,\n type PropDefinition,\n} from \"../core/index.js\";\nimport {\n loadConfig,\n discoverAllComponents,\n type DiscoveredComponent,\n} from \"../core/node.js\";\nimport {\n scanCodebase,\n extractPropsFromFile,\n parseAllStories,\n inferAllRelations,\n generateComponentContext,\n generateEnhancementSuggestions,\n filterBoilerplate,\n convertToFragmentProps,\n type UsageAnalysis,\n type ComponentRelation,\n type PropsExtractionResult,\n type ParsedStoryFile,\n} from \"../service/index.js\";\n\nexport interface ScanOptions {\n /** Path to config file */\n config?: string;\n /** Output file path (default: fragments.json) */\n output?: string;\n /** Component patterns to scan */\n componentPatterns?: string[];\n /** Barrel export files to parse */\n barrelFiles?: string[];\n /** Directory to scan for usage patterns */\n usageDir?: string;\n /** Skip usage analysis */\n skipUsage?: boolean;\n /** Skip Storybook parsing */\n skipStorybook?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\nexport interface ScanResult {\n success: boolean;\n outputPath: string;\n componentCount: number;\n propsExtracted: number;\n usagesFound: number;\n relationsInferred: number;\n storiesParsed: number;\n errors: Array<{ component: string; error: string }>;\n warnings: Array<{ component: string; warning: string }>;\n}\n\n/**\n * Scan codebase and generate fragments.json directly from source\n */\nexport async function scan(options: ScanOptions = {}): Promise<ScanResult> {\n const startTime = Date.now();\n const errors: Array<{ component: string; error: string }> = [];\n const warnings: Array<{ component: string; warning: string }> = [];\n\n // Load config or use defaults\n let configDir: string;\n let outputFile: string;\n let componentPatterns: string[] | undefined;\n\n try {\n const loaded = await loadConfig(options.config);\n configDir = loaded.configDir;\n outputFile = options.output || loaded.config.outFile || \"fragments.json\";\n componentPatterns = options.componentPatterns || loaded.config.components;\n } catch {\n // No config file, use defaults\n configDir = process.cwd();\n outputFile = options.output || \"fragments.json\";\n componentPatterns = options.componentPatterns;\n }\n\n console.log(pc.cyan(`\\n${BRAND.name} Scan\\n`));\n console.log(pc.dim(\"Zero-config fragments.json generation from source code\\n\"));\n\n // Phase 1: Discover components\n console.log(pc.dim(\"Phase 1: Discovering components...\"));\n const components = await discoverAllComponents(configDir, {\n patterns: componentPatterns,\n exclude: [\"**/*.test.*\", \"**/*.spec.*\", \"**/__tests__/**\"],\n barrelFiles: options.barrelFiles,\n });\n\n if (components.length === 0) {\n console.log(pc.yellow(\"No components found. Check your patterns or config.\"));\n return {\n success: false,\n outputPath: resolve(configDir, outputFile),\n componentCount: 0,\n propsExtracted: 0,\n usagesFound: 0,\n relationsInferred: 0,\n storiesParsed: 0,\n errors: [{ component: \"*\", error: \"No components found\" }],\n warnings: [],\n };\n }\n\n console.log(pc.green(` Found ${components.length} components`));\n if (options.verbose) {\n for (const comp of components.slice(0, 10)) {\n console.log(pc.dim(` - ${comp.name}: ${comp.relativePath}`));\n }\n if (components.length > 10) {\n console.log(pc.dim(` ... and ${components.length - 10} more`));\n }\n }\n\n // Phase 2: Extract props from TypeScript\n console.log(pc.dim(\"\\nPhase 2: Extracting props from TypeScript...\"));\n const propsMap = new Map<string, ReturnType<typeof convertToFragmentProps>>();\n const propsResults = new Map<string, PropsExtractionResult>();\n let propsExtracted = 0;\n\n for (const comp of components) {\n try {\n const extraction = await extractPropsFromFile(comp.sourcePath, {\n propsTypeName: `${comp.name}Props`,\n });\n\n propsResults.set(comp.name, extraction);\n\n if (extraction.success && extraction.props.length > 0) {\n propsMap.set(comp.name, convertToFragmentProps(extraction.props));\n propsExtracted++;\n }\n } catch (e) {\n if (options.verbose) {\n warnings.push({\n component: comp.name,\n warning: `Props extraction failed: ${e instanceof Error ? e.message : String(e)}`,\n });\n }\n }\n }\n\n console.log(pc.green(` Extracted props for ${propsExtracted} components`));\n\n // Phase 3: Scan for usage patterns\n let usageAnalysis: UsageAnalysis | undefined;\n let usagesFound = 0;\n let allRelations = new Map<string, ComponentRelation[]>();\n\n if (!options.skipUsage) {\n console.log(pc.dim(\"\\nPhase 3: Scanning for usage patterns...\"));\n const usageDir = options.usageDir || configDir;\n\n try {\n // Get component names for filtering\n const componentNames = components.map((c) => c.name);\n\n usageAnalysis = await scanCodebase({\n rootDir: usageDir,\n include: [\"**/*.tsx\", \"**/*.ts\", \"**/*.jsx\", \"**/*.js\"],\n exclude: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/*.stories.*\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n ],\n componentNames,\n useCache: true,\n });\n\n // Count total usages across all components\n usagesFound = Object.values(usageAnalysis.components).reduce(\n (sum, comp) => sum + comp.totalUsages,\n 0\n );\n\n // Infer relations\n allRelations = inferAllRelations(usageAnalysis);\n console.log(pc.green(` Found ${usagesFound} usages across ${usageAnalysis.totalFiles} files`));\n console.log(pc.green(` Inferred relations for ${allRelations.size} components`));\n } catch (e) {\n warnings.push({\n component: \"*\",\n warning: `Usage scanning failed: ${e instanceof Error ? e.message : String(e)}`,\n });\n console.log(pc.yellow(` Usage scanning failed: ${e instanceof Error ? e.message : \"unknown error\"}`));\n }\n } else {\n console.log(pc.dim(\"\\nPhase 3: Skipping usage analysis\"));\n }\n\n // Phase 4: Parse Storybook stories\n const storiesMap = new Map<string, ParsedStoryFile>();\n let storiesParsed = 0;\n\n if (!options.skipStorybook) {\n console.log(pc.dim(\"\\nPhase 4: Parsing Storybook stories...\"));\n\n try {\n const allStories = await parseAllStories(configDir);\n\n for (const [name, stories] of Object.entries(allStories)) {\n if (stories && stories.stories.length > 0) {\n storiesMap.set(name, stories);\n storiesParsed++;\n }\n }\n\n console.log(pc.green(` Parsed stories for ${storiesParsed} components`));\n } catch (e) {\n warnings.push({\n component: \"*\",\n warning: `Storybook parsing failed: ${e instanceof Error ? e.message : String(e)}`,\n });\n console.log(pc.yellow(` Storybook parsing failed: ${e instanceof Error ? e.message : \"unknown error\"}`));\n }\n } else {\n console.log(pc.dim(\"\\nPhase 4: Skipping Storybook parsing\"));\n }\n\n // Phase 5: Generate fragments\n console.log(pc.dim(\"\\nPhase 5: Generating fragments...\"));\n const fragments: Record<string, CompiledFragment> = {};\n\n for (const comp of components) {\n try {\n const fragment = generateFragmentFromData(\n comp,\n configDir,\n propsMap.get(comp.name),\n usageAnalysis?.components[comp.name],\n allRelations.get(comp.name),\n storiesMap.get(comp.name)\n );\n\n fragments[comp.name] = fragment;\n } catch (e) {\n errors.push({\n component: comp.name,\n error: e instanceof Error ? e.message : String(e),\n });\n }\n }\n\n // Write output\n const outputPath = resolve(configDir, outputFile);\n await mkdir(dirname(outputPath), { recursive: true });\n\n const output: CompiledFragmentsFile = {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n fragments,\n };\n\n await writeFile(outputPath, JSON.stringify(output, null, 2));\n\n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n\n // Summary\n console.log(pc.dim(\"\\n────────────────────────────────────────\"));\n console.log(pc.green(`\\n✓ Generated fragments.json in ${elapsed}s`));\n console.log(pc.dim(` Output: ${relative(process.cwd(), outputPath)}`));\n console.log(pc.dim(` Components: ${Object.keys(fragments).length}`));\n console.log(pc.dim(` Props extracted: ${propsExtracted}`));\n console.log(pc.dim(` Usages found: ${usagesFound}`));\n console.log(pc.dim(` Relations inferred: ${allRelations.size}`));\n console.log(pc.dim(` Stories parsed: ${storiesParsed}`));\n\n if (warnings.length > 0) {\n console.log(pc.yellow(`\\n ${warnings.length} warning(s)`));\n if (options.verbose) {\n for (const w of warnings) {\n console.log(pc.dim(` ${w.component}: ${w.warning}`));\n }\n }\n }\n\n if (errors.length > 0) {\n console.log(pc.red(`\\n ${errors.length} error(s)`));\n for (const e of errors) {\n console.log(pc.dim(` ${e.component}: ${e.error}`));\n }\n }\n\n console.log();\n\n return {\n success: errors.length === 0,\n outputPath,\n componentCount: Object.keys(fragments).length,\n propsExtracted,\n usagesFound,\n relationsInferred: allRelations.size,\n storiesParsed,\n errors,\n warnings,\n };\n}\n\n/**\n * Generate a CompiledFragment from extracted data\n */\nfunction generateFragmentFromData(\n comp: DiscoveredComponent,\n configDir: string,\n props: Record<string, PropDefinition> | undefined,\n usageAnalysis: UsageAnalysis[\"components\"][string] | undefined,\n relations: ComponentRelation[] | undefined,\n storyFile: ParsedStoryFile | undefined\n): CompiledFragment {\n // Generate context for AI suggestions\n const context = generateComponentContext(\n comp.name,\n usageAnalysis,\n undefined, // No extracted docs yet\n storyFile,\n undefined, // No props extraction result (we have the converted props already)\n relations\n );\n\n // Generate enhancement suggestions from context\n const suggestions = generateEnhancementSuggestions(context);\n\n // Filter boilerplate from suggestions\n const when = filterBoilerplate(suggestions.suggestions.when);\n const whenNot = filterBoilerplate(suggestions.suggestions.whenNot);\n\n // Infer category from path\n const category = inferCategory(comp.relativePath);\n\n // Infer status from path\n const status = inferStatus(comp.relativePath);\n\n // Build variants from stories\n const variants: CompiledFragment[\"variants\"] = [];\n if (storyFile?.stories) {\n for (const story of storyFile.stories) {\n variants.push({\n name: story.name,\n description: story.description || `${story.displayName} variant`,\n code: story.code,\n });\n }\n }\n\n // Build relations\n const compiledRelations: CompiledFragment[\"relations\"] = [];\n if (relations && relations.length > 0) {\n for (const rel of relations.slice(0, 10)) {\n compiledRelations.push({\n component: rel.component,\n relationship: rel.relationship,\n note: `Appears together ${rel.frequency} times`,\n });\n }\n }\n\n // Generate description\n const description = generateDescription(comp.name, props, usageAnalysis);\n\n return {\n filePath: comp.relativePath,\n meta: {\n name: comp.name,\n description,\n category,\n status,\n },\n usage: {\n when: when.length > 0 ? when : [`Use ${comp.name} for its intended purpose`],\n whenNot: whenNot,\n },\n props: props || {},\n relations: compiledRelations.length > 0 ? compiledRelations : undefined,\n variants,\n _generated: {\n source: \"ai\",\n sourceFile: comp.relativePath,\n confidence: calculateConfidence(props, usageAnalysis, storyFile),\n timestamp: new Date().toISOString(),\n },\n };\n}\n\n/**\n * Infer category from file path\n */\nfunction inferCategory(relativePath: string): string {\n const parts = relativePath.toLowerCase().split(\"/\");\n\n // Common category patterns\n const categoryPatterns: Record<string, string[]> = {\n \"Actions\": [\"button\", \"action\", \"cta\"],\n \"Forms\": [\"form\", \"input\", \"select\", \"checkbox\", \"radio\", \"textarea\", \"field\"],\n \"Layout\": [\"layout\", \"container\", \"grid\", \"flex\", \"stack\", \"box\", \"divider\", \"spacer\"],\n \"Navigation\": [\"nav\", \"menu\", \"breadcrumb\", \"tab\", \"link\", \"pagination\"],\n \"Feedback\": [\"alert\", \"toast\", \"notification\", \"message\", \"badge\", \"indicator\", \"progress\", \"spinner\", \"loading\"],\n \"Data Display\": [\"table\", \"list\", \"card\", \"avatar\", \"stat\", \"timeline\", \"tree\"],\n \"Overlays\": [\"modal\", \"dialog\", \"drawer\", \"popover\", \"tooltip\", \"dropdown\"],\n \"Typography\": [\"text\", \"heading\", \"title\", \"label\", \"paragraph\"],\n \"Media\": [\"image\", \"video\", \"icon\", \"avatar\"],\n };\n\n for (const [category, patterns] of Object.entries(categoryPatterns)) {\n for (const pattern of patterns) {\n if (parts.some((part) => part.includes(pattern))) {\n return category;\n }\n }\n }\n\n // Check path structure for category\n const componentIdx = parts.findIndex((p) => p === \"components\");\n if (componentIdx !== -1 && parts.length > componentIdx + 1) {\n const categoryPart = parts[componentIdx + 1];\n return categoryPart.charAt(0).toUpperCase() + categoryPart.slice(1);\n }\n\n return \"Components\";\n}\n\n/**\n * Infer status from file path\n */\nfunction inferStatus(\n relativePath: string\n): \"stable\" | \"beta\" | \"experimental\" | \"deprecated\" {\n const lowerPath = relativePath.toLowerCase();\n\n if (lowerPath.includes(\"/experimental/\") || lowerPath.includes(\"/labs/\")) {\n return \"experimental\";\n }\n if (lowerPath.includes(\"/beta/\")) {\n return \"beta\";\n }\n if (lowerPath.includes(\"/deprecated/\") || lowerPath.includes(\"/legacy/\")) {\n return \"deprecated\";\n }\n\n return \"stable\";\n}\n\n/**\n * Generate component description\n */\nfunction generateDescription(\n name: string,\n props: Record<string, PropDefinition> | undefined,\n usageAnalysis: UsageAnalysis[\"components\"][string] | undefined\n): string {\n // Convert name to readable form\n const words = name\n .replace(/([A-Z])/g, \" $1\")\n .trim()\n .toLowerCase();\n\n // Check props for hints\n const hasOnClick = props && (\"onClick\" in props || \"onPress\" in props);\n const hasValue = props && (\"value\" in props || \"defaultValue\" in props);\n const hasChildren = props && \"children\" in props;\n const hasHref = props && \"href\" in props;\n\n // Check usage contexts\n const topContext = usageAnalysis?.contexts[0]?.type;\n\n if (hasHref) {\n return `Navigational ${words} for linking to other pages or resources`;\n }\n\n if (hasOnClick && !hasValue) {\n return `Interactive ${words} for triggering actions`;\n }\n\n if (hasValue) {\n return `Form ${words} for user input`;\n }\n\n if (topContext && topContext !== \"unknown\") {\n return `${words.charAt(0).toUpperCase() + words.slice(1)} commonly used in ${topContext} contexts`;\n }\n\n if (hasChildren) {\n return `Container ${words} for composing UI`;\n }\n\n return `${words.charAt(0).toUpperCase() + words.slice(1)} component`;\n}\n\n/**\n * Calculate confidence score based on available data\n */\nfunction calculateConfidence(\n props: Record<string, PropDefinition> | undefined,\n usageAnalysis: UsageAnalysis[\"components\"][string] | undefined,\n storyFile: ParsedStoryFile | undefined\n): number {\n let confidence = 0;\n\n // Props give +30 confidence\n if (props && Object.keys(props).length > 0) {\n confidence += 30;\n }\n\n // Usage data gives up to +40 confidence\n if (usageAnalysis) {\n if (usageAnalysis.totalUsages > 10) confidence += 40;\n else if (usageAnalysis.totalUsages > 5) confidence += 30;\n else if (usageAnalysis.totalUsages > 0) confidence += 20;\n }\n\n // Stories give +30 confidence\n if (storyFile && storyFile.stories.length > 0) {\n confidence += 30;\n }\n\n return Math.min(confidence, 100);\n}\n"],"mappings":"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","names":[]}
@@ -1,19 +1,19 @@
1
1
  import { createRequire as __banner_createRequire } from 'module'; const require = __banner_createRequire(import.meta.url);
2
2
  import {
3
3
  BRAND
4
- } from "./chunk-6JBGU74P.js";
4
+ } from "./chunk-GHYYFAQN.js";
5
5
 
6
6
  // src/static-viewer.ts
7
7
  import { readFile } from "fs/promises";
8
8
  function generateStaticViewer(data) {
9
- const segments = Object.values(data.segments);
9
+ const fragments = Object.values(data.fragments);
10
10
  const categories = /* @__PURE__ */ new Map();
11
- for (const segment of segments) {
12
- const category = segment.meta.category ?? "Uncategorized";
11
+ for (const fragment of fragments) {
12
+ const category = fragment.meta.category ?? "Uncategorized";
13
13
  if (!categories.has(category)) {
14
14
  categories.set(category, []);
15
15
  }
16
- categories.get(category).push(segment);
16
+ categories.get(category).push(fragment);
17
17
  }
18
18
  const sortedCategories = Array.from(categories.entries()).sort(
19
19
  (a, b) => a[0].localeCompare(b[0])
@@ -419,11 +419,11 @@ function generateStaticViewer(data) {
419
419
 
420
420
  <div class="sidebar-stats">
421
421
  <div class="stat">
422
- <div class="stat-value">${segments.length}</div>
422
+ <div class="stat-value">${fragments.length}</div>
423
423
  <div class="stat-label">Components</div>
424
424
  </div>
425
425
  <div class="stat">
426
- <div class="stat-value">${segments.reduce(
426
+ <div class="stat-value">${fragments.reduce(
427
427
  (sum, s) => sum + s.variants.length,
428
428
  0
429
429
  )}</div>
@@ -452,35 +452,35 @@ function generateStaticViewer(data) {
452
452
  </aside>
453
453
 
454
454
  <main class="main" id="main">
455
- ${segments.length === 0 ? `
455
+ ${fragments.length === 0 ? `
456
456
  <div class="empty-state">
457
457
  <h2>No Components Found</h2>
458
- <p>Run <code>segments build</code> to compile your segment files.</p>
458
+ <p>Run <code>fragments build</code> to compile your fragment files.</p>
459
459
  </div>
460
- ` : segments.sort((a, b) => a.meta.name.localeCompare(b.meta.name)).map(
461
- (segment) => `
462
- <section class="component-section" id="${segment.meta.name}">
460
+ ` : fragments.sort((a, b) => a.meta.name.localeCompare(b.meta.name)).map(
461
+ (fragment) => `
462
+ <section class="component-section" id="${fragment.meta.name}">
463
463
  <div class="component-header">
464
- <h2 class="component-name">${segment.meta.name}</h2>
465
- <p class="component-description">${segment.meta.description}</p>
464
+ <h2 class="component-name">${fragment.meta.name}</h2>
465
+ <p class="component-description">${fragment.meta.description}</p>
466
466
  <div class="component-meta">
467
- ${segment.meta.status ? `<span class="meta-badge status-${segment.meta.status}">${segment.meta.status}</span>` : ""}
468
- ${segment.meta.category ? `<span class="meta-badge">${segment.meta.category}</span>` : ""}
469
- ${segment.meta.tags?.map((tag) => `<span class="meta-badge">${tag}</span>`).join("") ?? ""}
467
+ ${fragment.meta.status ? `<span class="meta-badge status-${fragment.meta.status}">${fragment.meta.status}</span>` : ""}
468
+ ${fragment.meta.category ? `<span class="meta-badge">${fragment.meta.category}</span>` : ""}
469
+ ${fragment.meta.tags?.map((tag) => `<span class="meta-badge">${tag}</span>`).join("") ?? ""}
470
470
  </div>
471
471
  </div>
472
472
 
473
- ${segment.usage ? `
473
+ ${fragment.usage ? `
474
474
  <div class="section">
475
475
  <h3 class="section-title">Usage Guidelines</h3>
476
- ${segment.usage.when?.length ? `
476
+ ${fragment.usage.when?.length ? `
477
477
  <ul class="usage-list">
478
- ${segment.usage.when.map((item) => `<li class="usage-item when">${item}</li>`).join("")}
478
+ ${fragment.usage.when.map((item) => `<li class="usage-item when">${item}</li>`).join("")}
479
479
  </ul>
480
480
  ` : ""}
481
- ${segment.usage.whenNot?.length ? `
481
+ ${fragment.usage.whenNot?.length ? `
482
482
  <ul class="usage-list" style="margin-top: 12px;">
483
- ${segment.usage.whenNot.map(
483
+ ${fragment.usage.whenNot.map(
484
484
  (item) => `<li class="usage-item when-not">${item}</li>`
485
485
  ).join("")}
486
486
  </ul>
@@ -488,7 +488,7 @@ function generateStaticViewer(data) {
488
488
  </div>
489
489
  ` : ""}
490
490
 
491
- ${segment.props && Object.keys(segment.props).length ? `
491
+ ${fragment.props && Object.keys(fragment.props).length ? `
492
492
  <div class="section">
493
493
  <h3 class="section-title">Props</h3>
494
494
  <table class="props-table">
@@ -501,7 +501,7 @@ function generateStaticViewer(data) {
501
501
  </tr>
502
502
  </thead>
503
503
  <tbody>
504
- ${Object.entries(segment.props).map(
504
+ ${Object.entries(fragment.props).map(
505
505
  ([name, prop]) => `
506
506
  <tr>
507
507
  <td>
@@ -519,11 +519,11 @@ function generateStaticViewer(data) {
519
519
  </div>
520
520
  ` : ""}
521
521
 
522
- ${segment.variants?.length ? `
522
+ ${fragment.variants?.length ? `
523
523
  <div class="section">
524
524
  <h3 class="section-title">Variants</h3>
525
525
  <div class="variants-grid">
526
- ${segment.variants.map(
526
+ ${fragment.variants.map(
527
527
  (variant) => `
528
528
  <div class="variant-card">
529
529
  <div class="variant-name">${variant.name}</div>
@@ -538,11 +538,11 @@ function generateStaticViewer(data) {
538
538
  </div>
539
539
  ` : ""}
540
540
 
541
- ${segment.relations?.length ? `
541
+ ${fragment.relations?.length ? `
542
542
  <div class="section">
543
543
  <h3 class="section-title">Related Components</h3>
544
544
  <div class="relations-list">
545
- ${segment.relations.map(
545
+ ${fragment.relations.map(
546
546
  (rel) => `<a href="#${rel.component}" class="relation-tag" title="${rel.note}">${rel.relationship === "parent" ? "\u2191" : rel.relationship === "child" ? "\u2193" : "\u2194"} ${rel.component}</a>`
547
547
  ).join("")}
548
548
  </div>
@@ -616,4 +616,4 @@ export {
616
616
  generateStaticViewer,
617
617
  generateViewerFromJson
618
618
  };
619
- //# sourceMappingURL=chunk-RVRTRESS.js.map
619
+ //# sourceMappingURL=chunk-DQHWLAUV.js.map