@fragments-sdk/cli 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin.js +529 -285
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-F7ITZPDJ.js → chunk-32VIEOQY.js} +18 -18
- package/dist/chunk-32VIEOQY.js.map +1 -0
- package/dist/{chunk-SSLQXHNX.js → chunk-5ITIP3ES.js} +27 -27
- package/dist/chunk-5ITIP3ES.js.map +1 -0
- package/dist/{chunk-RVRTRESS.js → chunk-DQHWLAUV.js} +29 -29
- package/dist/chunk-DQHWLAUV.js.map +1 -0
- package/dist/{chunk-Q7GOHVOK.js → chunk-GCZMFLDI.js} +67 -32
- package/dist/chunk-GCZMFLDI.js.map +1 -0
- package/dist/{chunk-6JBGU74P.js → chunk-GHYYFAQN.js} +23 -23
- package/dist/chunk-GHYYFAQN.js.map +1 -0
- package/dist/{chunk-NWQ4CJOQ.js → chunk-GKX2HPZ6.js} +40 -40
- package/dist/chunk-GKX2HPZ6.js.map +1 -0
- package/dist/{chunk-D35RGPAG.js → chunk-U6VTHBNI.js} +499 -83
- package/dist/chunk-U6VTHBNI.js.map +1 -0
- package/dist/{core-SKRPJQZG.js → core-SFHPYR5H.js} +24 -26
- package/dist/{generate-7AF7WRVK.js → generate-54GJAWUY.js} +5 -5
- package/dist/generate-54GJAWUY.js.map +1 -0
- package/dist/index.d.ts +23 -27
- package/dist/index.js +10 -10
- package/dist/{init-WKGDPYI4.js → init-EIM5WNMP.js} +5 -5
- package/dist/{init-WKGDPYI4.js.map → init-EIM5WNMP.js.map} +1 -1
- package/dist/mcp-bin.js +73 -73
- package/dist/mcp-bin.js.map +1 -1
- package/dist/scan-KQBKUS64.js +12 -0
- package/dist/{service-F3E4JJM7.js → service-ED2LNCTU.js} +6 -6
- package/dist/{static-viewer-4LQZ5AGA.js → static-viewer-Q4F4QP5M.js} +4 -4
- package/dist/{test-CJDNJTPZ.js → test-6VN2DA3S.js} +19 -19
- package/dist/test-6VN2DA3S.js.map +1 -0
- package/dist/{tokens-JAJABYXP.js → tokens-P2B7ZAM3.js} +5 -5
- package/dist/{viewer-R3Q6WAMJ.js → viewer-GM7IQPPB.js} +199 -199
- package/dist/viewer-GM7IQPPB.js.map +1 -0
- package/package.json +2 -2
- package/src/ai.ts +5 -5
- package/src/analyze.ts +11 -11
- package/src/bin.ts +24 -1
- package/src/build.ts +64 -21
- package/src/commands/a11y.ts +6 -6
- package/src/commands/add.ts +11 -11
- package/src/commands/audit.ts +4 -4
- package/src/commands/baseline.ts +3 -3
- package/src/commands/build.ts +8 -8
- package/src/commands/compare.ts +20 -20
- package/src/commands/context.ts +16 -16
- package/src/commands/enhance.ts +36 -36
- package/src/commands/generate.ts +1 -1
- package/src/commands/graph.ts +274 -0
- package/src/commands/init.ts +1 -1
- package/src/commands/link/figma.ts +82 -82
- package/src/commands/link/index.ts +3 -3
- package/src/commands/link/storybook.ts +9 -9
- package/src/commands/list.ts +2 -2
- package/src/commands/reset.ts +15 -15
- package/src/commands/scan.ts +27 -27
- package/src/commands/storygen.ts +24 -24
- package/src/commands/validate.ts +2 -2
- package/src/commands/verify.ts +8 -8
- package/src/core/auto-props.ts +4 -4
- package/src/core/composition.test.ts +36 -36
- package/src/core/composition.ts +83 -20
- package/src/core/config.ts +6 -6
- package/src/core/{defineSegment.ts → defineFragment.ts} +16 -22
- package/src/core/discovery.ts +6 -6
- package/src/core/figma.ts +2 -2
- package/src/core/graph-extractor.test.ts +542 -0
- package/src/core/graph-extractor.ts +601 -0
- package/src/core/importAnalyzer.ts +6 -1
- package/src/core/index.ts +22 -23
- package/src/core/loader.ts +22 -22
- package/src/core/node.ts +5 -5
- package/src/core/parser.ts +31 -31
- package/src/core/previewLoader.ts +1 -1
- package/src/core/schema.ts +16 -16
- package/src/core/storyAdapter.test.ts +87 -87
- package/src/core/storyAdapter.ts +16 -16
- package/src/core/types.ts +21 -26
- package/src/diff.ts +22 -22
- package/src/index.ts +2 -2
- package/src/mcp/server.ts +80 -80
- package/src/migrate/__tests__/utils/utils.test.ts +3 -3
- package/src/migrate/bin.ts +4 -4
- package/src/migrate/converter.ts +16 -16
- package/src/migrate/index.ts +3 -3
- package/src/migrate/migrate.ts +3 -3
- package/src/migrate/parser.ts +8 -8
- package/src/migrate/report.ts +2 -2
- package/src/migrate/types.ts +4 -4
- package/src/screenshot.ts +22 -22
- package/src/service/__tests__/props-extractor.test.ts +15 -15
- package/src/service/analytics.ts +39 -39
- package/src/service/enhance/codebase-scanner.ts +1 -1
- package/src/service/enhance/index.ts +1 -1
- package/src/service/enhance/props-extractor.ts +2 -2
- package/src/service/enhance/types.ts +2 -2
- package/src/service/index.ts +2 -2
- package/src/service/metrics-store.ts +1 -1
- package/src/service/patch-generator.ts +1 -1
- package/src/setup.ts +52 -52
- package/src/shared/dev-server-client.ts +7 -7
- package/src/shared/fragment-loader.ts +59 -0
- package/src/shared/index.ts +1 -1
- package/src/shared/types.ts +4 -4
- package/src/static-viewer.ts +35 -35
- package/src/test/discovery.ts +6 -6
- package/src/test/index.ts +5 -5
- package/src/test/reporters/console.ts +1 -1
- package/src/test/reporters/junit.ts +1 -1
- package/src/test/runner.ts +7 -7
- package/src/test/types.ts +3 -3
- package/src/test/watch.ts +9 -9
- package/src/validators.ts +26 -26
- package/src/viewer/__tests__/render-utils.test.ts +28 -28
- package/src/viewer/__tests__/viewer-integration.test.ts +4 -4
- package/src/viewer/cli/health.ts +26 -26
- package/src/viewer/components/App.tsx +201 -103
- package/src/viewer/components/BottomPanel.tsx +17 -17
- package/src/viewer/components/CodePanel.tsx +3 -3
- package/src/viewer/components/CommandPalette.tsx +11 -11
- package/src/viewer/components/ComponentGraph.tsx +28 -28
- package/src/viewer/components/ComponentHeader.tsx +2 -2
- package/src/viewer/components/ContractPanel.tsx +6 -6
- package/src/viewer/components/FigmaEmbed.tsx +9 -9
- package/src/viewer/components/HealthDashboard.tsx +17 -17
- package/src/viewer/components/Icons.tsx +53 -1
- package/src/viewer/components/InteractionsPanel.tsx +2 -2
- package/src/viewer/components/IsolatedPreviewFrame.tsx +6 -6
- package/src/viewer/components/IsolatedRender.tsx +10 -10
- package/src/viewer/components/Layout.tsx +7 -3
- package/src/viewer/components/LeftSidebar.tsx +92 -114
- package/src/viewer/components/MultiViewportPreview.tsx +14 -14
- package/src/viewer/components/PreviewArea.tsx +11 -11
- package/src/viewer/components/PreviewFrameHost.tsx +77 -48
- package/src/viewer/components/PreviewToolbar.tsx +57 -10
- package/src/viewer/components/RightSidebar.tsx +9 -9
- package/src/viewer/components/Sidebar.tsx +17 -17
- package/src/viewer/components/StoryRenderer.tsx +2 -2
- package/src/viewer/components/TokenStylePanel.tsx +1 -1
- package/src/viewer/components/UsageSection.tsx +2 -2
- package/src/viewer/components/VariantMatrix.tsx +11 -11
- package/src/viewer/components/VariantRenderer.tsx +3 -3
- package/src/viewer/components/VariantTabs.tsx +2 -2
- package/src/viewer/components/ViewportSelector.tsx +56 -45
- package/src/viewer/components/_future/CreatePage.tsx +6 -6
- package/src/viewer/composition-renderer.ts +11 -11
- package/src/viewer/constants/ui.ts +4 -4
- package/src/viewer/entry.tsx +40 -40
- package/src/viewer/hooks/useFigmaIntegration.ts +1 -1
- package/src/viewer/hooks/usePreviewBridge.ts +5 -5
- package/src/viewer/hooks/useUrlState.ts +6 -6
- package/src/viewer/index.ts +2 -2
- package/src/viewer/intelligence/healthReport.ts +17 -17
- package/src/viewer/intelligence/styleDrift.ts +1 -1
- package/src/viewer/intelligence/usageScanner.ts +1 -1
- package/src/viewer/preview-frame.html +22 -13
- package/src/viewer/render-template.html +1 -1
- package/src/viewer/render-utils.ts +21 -21
- package/src/viewer/server.ts +18 -18
- package/src/viewer/styles/globals.css +42 -81
- package/src/viewer/utils/detectRelationships.ts +22 -22
- package/src/viewer/vite-plugin.ts +213 -213
- package/dist/chunk-6JBGU74P.js.map +0 -1
- package/dist/chunk-D35RGPAG.js.map +0 -1
- package/dist/chunk-F7ITZPDJ.js.map +0 -1
- package/dist/chunk-NWQ4CJOQ.js.map +0 -1
- package/dist/chunk-Q7GOHVOK.js.map +0 -1
- package/dist/chunk-RVRTRESS.js.map +0 -1
- package/dist/chunk-SSLQXHNX.js.map +0 -1
- package/dist/generate-7AF7WRVK.js.map +0 -1
- package/dist/scan-K6JNMCGM.js +0 -12
- package/dist/test-CJDNJTPZ.js.map +0 -1
- package/dist/viewer-R3Q6WAMJ.js.map +0 -1
- package/src/shared/segment-loader.ts +0 -59
- /package/dist/{core-SKRPJQZG.js.map → core-SFHPYR5H.js.map} +0 -0
- /package/dist/{scan-K6JNMCGM.js.map → scan-KQBKUS64.js.map} +0 -0
- /package/dist/{service-F3E4JJM7.js.map → service-ED2LNCTU.js.map} +0 -0
- /package/dist/{static-viewer-4LQZ5AGA.js.map → static-viewer-Q4F4QP5M.js.map} +0 -0
- /package/dist/{tokens-JAJABYXP.js.map → tokens-P2B7ZAM3.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/constants.ts","../src/core/schema.ts"],"sourcesContent":["/**\n * Brand constants for easy rebranding if domain availability requires it.\n * All naming throughout the codebase should reference these constants.\n */\nexport const BRAND = {\n /** Display name (e.g., \"Fragments\") */\n name: \"Fragments\",\n\n /** Lowercase name for file paths and CLI (e.g., \"fragments\") */\n nameLower: \"fragments\",\n\n /** File extension for fragment definition files (e.g., \".fragment.tsx\") */\n fileExtension: \".fragment.tsx\",\n\n /** Legacy file extension for segments (still supported for migration) */\n legacyFileExtension: \".segment.tsx\",\n\n /** JSON file extension for compiled output */\n jsonExtension: \".fragment.json\",\n\n /** Default output file name (e.g., \"fragments.json\") */\n outFile: \"fragments.json\",\n\n /** Config file name (e.g., \"fragments.config.ts\") */\n configFile: \"fragments.config.ts\",\n\n /** Legacy config file name (still supported for migration) */\n legacyConfigFile: \"segments.config.ts\",\n\n /** CLI command name (e.g., \"fragments\") */\n cliCommand: \"fragments\",\n\n /** Package scope (e.g., \"@fragments\") */\n packageScope: \"@fragments\",\n\n /** Directory for storing fragments, registry, and cache */\n dataDir: \".fragments\",\n\n /** Components subdirectory within .fragments/ */\n componentsDir: \"components\",\n\n /** Registry file name */\n registryFile: \"registry.json\",\n\n /** Context file name (AI-ready markdown) */\n contextFile: \"context.md\",\n\n /** Screenshots subdirectory */\n screenshotsDir: \"screenshots\",\n\n /** Cache subdirectory (gitignored) */\n cacheDir: \"cache\",\n\n /** Diff output subdirectory (gitignored) */\n diffDir: \"diff\",\n\n /** Manifest filename */\n manifestFile: \"manifest.json\",\n\n /** Prefix for localStorage keys (e.g., \"fragments-\") */\n storagePrefix: \"fragments-\",\n\n /** Static viewer HTML file name */\n viewerHtmlFile: \"fragments-viewer.html\",\n\n /** MCP tool name prefix (e.g., \"fragments_\") */\n mcpToolPrefix: \"fragments_\",\n\n /** File extension for block definition files */\n blockFileExtension: \".block.ts\",\n\n /** @deprecated Use blockFileExtension instead */\n recipeFileExtension: \".recipe.ts\",\n\n /** Vite plugin namespace */\n vitePluginNamespace: \"fragments-core-shim\",\n} as const;\n\nexport type Brand = typeof BRAND;\n\n/**\n * Default configuration values for the service.\n * These can be overridden in fragments.config.ts\n */\nexport const DEFAULTS = {\n /** Default viewport dimensions */\n viewport: {\n width: 1280,\n height: 800,\n },\n\n /** Default diff threshold (percentage) */\n diffThreshold: 5,\n\n /** Browser pool size */\n poolSize: 3,\n\n /** Idle timeout before browser shutdown (ms) - 5 minutes */\n idleTimeoutMs: 5 * 60 * 1000,\n\n /** Delay after render before capture (ms) */\n captureDelayMs: 100,\n\n /** Font loading timeout (ms) */\n fontTimeoutMs: 3000,\n\n /** Default theme */\n theme: \"light\" as const,\n\n /** Dev server port */\n port: 6006,\n} as const;\n\nexport type Defaults = typeof DEFAULTS;\n","import { z } from 'zod';\n\n/**\n * Zod schemas for runtime validation of segment definitions\n */\n\n// Figma property mapping schemas\nconst figmaStringMappingSchema = z.object({\n __type: z.literal('figma-string'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaBooleanMappingSchema = z.object({\n __type: z.literal('figma-boolean'),\n figmaProperty: z.string().min(1),\n valueMapping: z.object({ true: z.unknown(), false: z.unknown() }).optional(),\n});\n\nconst figmaEnumMappingSchema = z.object({\n __type: z.literal('figma-enum'),\n figmaProperty: z.string().min(1),\n valueMapping: z.record(z.unknown()),\n});\n\nconst figmaInstanceMappingSchema = z.object({\n __type: z.literal('figma-instance'),\n figmaProperty: z.string().min(1),\n});\n\nconst figmaChildrenMappingSchema = z.object({\n __type: z.literal('figma-children'),\n layers: z.array(z.string().min(1)),\n});\n\nconst figmaTextContentMappingSchema = z.object({\n __type: z.literal('figma-text-content'),\n layer: z.string().min(1),\n});\n\nexport const figmaPropMappingSchema = z.discriminatedUnion('__type', [\n figmaStringMappingSchema,\n figmaBooleanMappingSchema,\n figmaEnumMappingSchema,\n figmaInstanceMappingSchema,\n figmaChildrenMappingSchema,\n figmaTextContentMappingSchema,\n]);\n\nexport const segmentMetaSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n tags: z.array(z.string()).optional(),\n status: z.enum(['stable', 'beta', 'deprecated', 'experimental']).optional(),\n since: z.string().optional(),\n figma: z.string().url().optional(),\n figmaProps: z.record(figmaPropMappingSchema).optional(),\n});\n\nexport const segmentUsageSchema = z.object({\n when: z.array(z.string()).min(1),\n whenNot: z.array(z.string()).min(1),\n guidelines: z.array(z.string()).optional(),\n accessibility: z.array(z.string()).optional(),\n});\n\nexport const propTypeSchema: z.ZodType<string> = z.enum([\n 'string',\n 'number',\n 'boolean',\n 'enum',\n 'function',\n 'node',\n 'element',\n 'object',\n 'array',\n 'union',\n 'custom',\n]);\n\nexport const propDefinitionSchema = z.object({\n type: propTypeSchema,\n values: z.array(z.string()).readonly().optional(),\n default: z.unknown().optional(),\n description: z.string().optional(),\n required: z.boolean().optional(),\n constraints: z.array(z.string()).optional(),\n typeDetails: z.record(z.unknown()).optional(),\n});\n\nexport const relationshipTypeSchema = z.enum([\n 'alternative',\n 'sibling',\n 'parent',\n 'child',\n 'composition',\n 'complementary',\n 'used-by',\n]);\n\nexport const componentRelationSchema = z.object({\n component: z.string().min(1),\n relationship: relationshipTypeSchema,\n note: z.string().min(1),\n});\n\nexport const segmentVariantSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n render: z.function().returns(z.unknown()),\n code: z.string().optional(),\n figma: z.string().url().optional(),\n});\n\n/**\n * Schema for banned patterns in codebase\n */\nexport const segmentBanSchema = z.object({\n pattern: z.string().min(1),\n message: z.string().min(1),\n});\n\n/**\n * Schema for agent-optimized contract metadata\n */\nexport const segmentContractSchema = z.object({\n propsSummary: z.array(z.string()).optional(),\n a11yRules: z.array(z.string()).optional(),\n bans: z.array(segmentBanSchema).optional(),\n scenarioTags: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for provenance tracking of generated segments\n */\nexport const segmentGeneratedSchema = z.object({\n source: z.enum(['storybook', 'manual', 'ai']),\n sourceFile: z.string().optional(),\n confidence: z.number().min(0).max(1).optional(),\n timestamp: z.string().datetime().optional(),\n});\n\n/**\n * Schema for AI-specific metadata for playground context generation\n */\nexport const aiMetadataSchema = z.object({\n compositionPattern: z.enum(['compound', 'simple', 'controlled']).optional(),\n subComponents: z.array(z.string()).optional(),\n requiredChildren: z.array(z.string()).optional(),\n commonPatterns: z.array(z.string()).optional(),\n});\n\n/**\n * Schema for block definitions\n */\nexport const blockDefinitionSchema = z.object({\n name: z.string().min(1),\n description: z.string().min(1),\n category: z.string().min(1),\n components: z.array(z.string().min(1)).min(1),\n code: z.string().min(1),\n tags: z.array(z.string()).optional(),\n});\n\nexport const segmentDefinitionSchema = z.object({\n component: z.any(), // Allow any component type (function, class, forwardRef, etc.)\n meta: segmentMetaSchema,\n usage: segmentUsageSchema,\n props: z.record(propDefinitionSchema),\n relations: z.array(componentRelationSchema).optional(),\n variants: z.array(segmentVariantSchema), // Allow empty variants array\n contract: segmentContractSchema.optional(),\n ai: aiMetadataSchema.optional(),\n _generated: segmentGeneratedSchema.optional(),\n});\n\n/**\n * Config schema - validates required fields, passes through optional config objects.\n * Type definitions are in types.ts - schema just ensures basic structure.\n */\nexport const segmentsConfigSchema = z.object({\n include: z.array(z.string()).min(1),\n exclude: z.array(z.string()).optional(),\n components: z.array(z.string()).optional(),\n outFile: z.string().optional(),\n framework: z.enum(['react', 'vue', 'svelte']).optional(),\n figmaFile: z.string().url().optional(),\n figmaToken: z.string().optional(),\n screenshots: z.object({}).passthrough().optional(),\n service: z.object({}).passthrough().optional(),\n registry: z.object({}).passthrough().optional(),\n tokens: z.object({\n include: z.array(z.string()).min(1),\n }).passthrough().optional(),\n});\n\n/**\n * @deprecated Use blockDefinitionSchema instead\n */\nexport const recipeDefinitionSchema = blockDefinitionSchema;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/validators.ts","../src/build.ts","../src/core/auto-props.ts","../src/screenshot.ts","../src/diff.ts","../src/analyze.ts"],"sourcesContent":["import { segmentDefinitionSchema, BRAND, type SegmentsConfig } from './core/index.js';\nimport {\n discoverSegmentFiles,\n discoverComponentFiles,\n extractComponentName,\n loadSegmentFile,\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 segment file schema\n */\nexport async function validateSchema(\n config: SegmentsConfig,\n configDir: string\n): Promise<ValidationResult> {\n const files = await discoverSegmentFiles(config, configDir);\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n for (const file of files) {\n try {\n const segment = await loadSegmentFile(file.absolutePath);\n\n if (!segment) {\n errors.push({\n file: file.relativePath,\n message: 'No default export found',\n details: `Segment files must have a default export from defineSegment()`,\n });\n continue;\n }\n\n const result = segmentDefinitionSchema.safeParse(segment);\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 segment schema',\n details,\n });\n }\n } catch (error) {\n errors.push({\n file: file.relativePath,\n message: 'Failed to load segment 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 segments\n */\nexport async function validateCoverage(\n config: SegmentsConfig,\n configDir: string\n): Promise<ValidationResult> {\n const segmentFiles = await discoverSegmentFiles(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 segmentFiles) {\n try {\n const segment = await loadSegmentFile(file.absolutePath);\n\n if (segment?.meta?.name) {\n documentedComponents.add(segment.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 segment file\n const segmentPath = file.relativePath.replace(\n /\\.(tsx?|jsx?)$/,\n BRAND.fileExtension\n );\n const hasSegmentFile = segmentFiles.some(\n (s) => s.relativePath === segmentPath\n );\n\n if (!hasSegmentFile && !documentedComponents.has(componentName)) {\n warnings.push({\n file: file.relativePath,\n message: `Component \"${componentName}\" has no segment 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: SegmentsConfig,\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 SegmentsConfig,\n CompiledSegmentsFile,\n CompiledSegment,\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 discoverSegmentFiles,\n discoverBlockFiles,\n discoverTokenFiles,\n parseSegmentFile,\n loadSegmentFile,\n generateRegistry,\n generateContextMd,\n} from \"./core/node.js\";\nimport {\n extractCustomPropsFromComponentFile,\n resolveComponentSourcePath,\n type AutoDetectedPropDefinition,\n} from \"./core/auto-props.js\";\n\ntype CompiledProp = CompiledSegment[\"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 segmentCount: 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 buildSegments(\n config: SegmentsConfig,\n configDir: string\n): Promise<BuildResult> {\n const files = await discoverSegmentFiles(config, configDir);\n const errors: Array<{ file: string; error: string }> = [];\n const warnings: Array<{ file: string; warning: string }> = [];\n const segments: CompiledSegmentsFile[\"segments\"] = {};\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 = parseSegmentFile(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: CompiledSegment = {\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 };\n\n segments[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 // loadSegmentFile uses esbuild to bundle+evaluate, returns default export\n // CJS/ESM interop may double-wrap the default export\n let raw = await loadSegmentFile(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; 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, 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 const output: CompiledSegmentsFile = {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n ...(packageName && { packageName }),\n segments,\n ...(Object.keys(blocks).length > 0 && { blocks }),\n ...(tokens && { tokens }),\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 segmentCount: Object.keys(segments).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: SegmentsConfig,\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 segment file path + component import path.\n * Supports relative imports like \".\", \"./Button\", \"../components/Button\".\n */\nexport function resolveComponentSourcePath(\n segmentFileAbsolutePath: string,\n componentImportPath: string | null\n): string | null {\n if (!componentImportPath) return null;\n if (!componentImportPath.startsWith(\".\")) return null;\n\n const segmentDir = dirname(segmentFileAbsolutePath);\n const basePath = resolve(segmentDir, 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","import pc from 'picocolors';\nimport {\n BRAND,\n DEFAULTS,\n type SegmentsConfig,\n type SegmentDefinition,\n type Theme,\n} from './core/index.js';\nimport { discoverSegmentFiles, loadSegmentFile } 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: SegmentsConfig,\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 segments\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n\n if (segmentFiles.length === 0) {\n console.log(pc.yellow('No segment 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 segments\n const segments: Array<{ path: string; segment: SegmentDefinition }> = [];\n\n for (const file of segmentFiles) {\n try {\n const segment = await loadSegmentFile(file.absolutePath);\n if (segment) {\n segments.push({ path: file.relativePath, segment });\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 filteredSegments = options.component\n ? segments.filter((s) => s.segment.meta.name === options.component)\n : segments;\n\n if (options.component && filteredSegments.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 { segment } of filteredSegments) {\n const variants = options.variant\n ? segment.variants.filter((v) => v.name === options.variant)\n : segment.variants;\n\n for (const variant of variants) {\n variantsToCapture.push({\n component: segment.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 SegmentsConfig,\n type SegmentDefinition,\n type Theme,\n} from './core/index.js';\nimport { discoverSegmentFiles, loadSegmentFile } 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: SegmentsConfig,\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 segments\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n\n if (segmentFiles.length === 0) {\n console.log(pc.yellow('No segment 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 segments\n const segments: Array<{ path: string; segment: SegmentDefinition }> = [];\n\n for (const file of segmentFiles) {\n try {\n const segment = await loadSegmentFile(file.absolutePath);\n if (segment) {\n segments.push({ path: file.relativePath, segment });\n }\n } catch {\n // Skip failed loads\n }\n }\n\n // Filter by component if specified\n const filteredSegments = options.component\n ? segments.filter((s) => s.segment.meta.name === options.component)\n : segments;\n\n if (options.component && filteredSegments.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 { segment } of filteredSegments) {\n const variants = options.variant\n ? segment.variants.filter((v) => v.name === options.variant)\n : segment.variants;\n\n for (const variant of variants) {\n variantsToDiff.push({\n component: segment.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: segments 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 { SegmentsConfig, CompiledSegmentsFile } 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: segments-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: SegmentsConfig,\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 segments\n const segmentsPath = join(configDir, config.outFile ?? \"segments.json\");\n\n if (!existsSync(segmentsPath)) {\n console.log(pc.red(`✗ No segments.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(segmentsPath, \"utf-8\");\n const data: CompiledSegmentsFile = 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\" ? \"segments-report.html\" : \"segments-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","resolve","existsSync","join","pc","pc","existsSync","readFile","writeFile","mkdir","join","dirname","pc","pc","join","existsSync","readFile","mkdir","dirname","writeFile"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/scan.ts"],"sourcesContent":["/**\n * fragments scan - Zero-config segments.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 segments.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 CompiledSegmentsFile,\n type CompiledSegment,\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 convertToSegmentProps,\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: segments.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 segments.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 || \"segments.json\";\n componentPatterns = options.componentPatterns || loaded.config.components;\n } catch {\n // No config file, use defaults\n configDir = process.cwd();\n outputFile = options.output || \"segments.json\";\n componentPatterns = options.componentPatterns;\n }\n\n console.log(pc.cyan(`\\n${BRAND.name} Scan\\n`));\n console.log(pc.dim(\"Zero-config segments.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 convertToSegmentProps>>();\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, convertToSegmentProps(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 segments\n console.log(pc.dim(\"\\nPhase 5: Generating segments...\"));\n const segments: Record<string, CompiledSegment> = {};\n\n for (const comp of components) {\n try {\n const segment = generateSegmentFromData(\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 segments[comp.name] = segment;\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: CompiledSegmentsFile = {\n version: \"1.0.0\",\n generatedAt: new Date().toISOString(),\n segments,\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 segments.json in ${elapsed}s`));\n console.log(pc.dim(` Output: ${relative(process.cwd(), outputPath)}`));\n console.log(pc.dim(` Components: ${Object.keys(segments).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(segments).length,\n propsExtracted,\n usagesFound,\n relationsInferred: allRelations.size,\n storiesParsed,\n errors,\n warnings,\n };\n}\n\n/**\n * Generate a CompiledSegment from extracted data\n */\nfunction generateSegmentFromData(\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): CompiledSegment {\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: CompiledSegment[\"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: CompiledSegment[\"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":[]}
|