@fragments-sdk/cli 0.2.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.
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/bin.d.ts +1 -0
- package/dist/bin.js +4783 -0
- package/dist/bin.js.map +1 -0
- package/dist/chunk-4FDQSGKX.js +786 -0
- package/dist/chunk-4FDQSGKX.js.map +1 -0
- package/dist/chunk-7H2MMGYG.js +369 -0
- package/dist/chunk-7H2MMGYG.js.map +1 -0
- package/dist/chunk-BSCG3IP7.js +619 -0
- package/dist/chunk-BSCG3IP7.js.map +1 -0
- package/dist/chunk-LY2CFFPY.js +898 -0
- package/dist/chunk-LY2CFFPY.js.map +1 -0
- package/dist/chunk-MUZ6CM66.js +6636 -0
- package/dist/chunk-MUZ6CM66.js.map +1 -0
- package/dist/chunk-OAENNG3G.js +1489 -0
- package/dist/chunk-OAENNG3G.js.map +1 -0
- package/dist/chunk-XHNKNI6J.js +235 -0
- package/dist/chunk-XHNKNI6J.js.map +1 -0
- package/dist/core-DWKLGY4N.js +68 -0
- package/dist/core-DWKLGY4N.js.map +1 -0
- package/dist/generate-4LQNJ7SX.js +249 -0
- package/dist/generate-4LQNJ7SX.js.map +1 -0
- package/dist/index.d.ts +775 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/init-EMVI47QG.js +416 -0
- package/dist/init-EMVI47QG.js.map +1 -0
- package/dist/mcp-bin.d.ts +1 -0
- package/dist/mcp-bin.js +1117 -0
- package/dist/mcp-bin.js.map +1 -0
- package/dist/scan-4YPRF7FV.js +12 -0
- package/dist/scan-4YPRF7FV.js.map +1 -0
- package/dist/service-QSZMZJBJ.js +208 -0
- package/dist/service-QSZMZJBJ.js.map +1 -0
- package/dist/static-viewer-MIPGZ4Z7.js +12 -0
- package/dist/static-viewer-MIPGZ4Z7.js.map +1 -0
- package/dist/test-SQ5ZHXWU.js +1067 -0
- package/dist/test-SQ5ZHXWU.js.map +1 -0
- package/dist/tokens-HSGMYK64.js +173 -0
- package/dist/tokens-HSGMYK64.js.map +1 -0
- package/dist/viewer-YRF4SQE4.js +11101 -0
- package/dist/viewer-YRF4SQE4.js.map +1 -0
- package/package.json +107 -0
- package/src/ai.ts +266 -0
- package/src/analyze.ts +265 -0
- package/src/bin.ts +916 -0
- package/src/build.ts +248 -0
- package/src/commands/a11y.ts +302 -0
- package/src/commands/add.ts +313 -0
- package/src/commands/audit.ts +195 -0
- package/src/commands/baseline.ts +221 -0
- package/src/commands/build.ts +144 -0
- package/src/commands/compare.ts +337 -0
- package/src/commands/context.ts +107 -0
- package/src/commands/dev.ts +107 -0
- package/src/commands/enhance.ts +858 -0
- package/src/commands/generate.ts +391 -0
- package/src/commands/init.ts +531 -0
- package/src/commands/link/figma.ts +645 -0
- package/src/commands/link/index.ts +10 -0
- package/src/commands/link/storybook.ts +267 -0
- package/src/commands/list.ts +49 -0
- package/src/commands/metrics.ts +114 -0
- package/src/commands/reset.ts +242 -0
- package/src/commands/scan.ts +537 -0
- package/src/commands/storygen.ts +207 -0
- package/src/commands/tokens.ts +251 -0
- package/src/commands/validate.ts +93 -0
- package/src/commands/verify.ts +215 -0
- package/src/core/composition.test.ts +262 -0
- package/src/core/composition.ts +255 -0
- package/src/core/config.ts +84 -0
- package/src/core/constants.ts +111 -0
- package/src/core/context.ts +380 -0
- package/src/core/defineSegment.ts +137 -0
- package/src/core/discovery.ts +337 -0
- package/src/core/figma.ts +263 -0
- package/src/core/fragment-types.ts +214 -0
- package/src/core/generators/context.ts +389 -0
- package/src/core/generators/index.ts +23 -0
- package/src/core/generators/registry.ts +364 -0
- package/src/core/generators/typescript-extractor.ts +374 -0
- package/src/core/importAnalyzer.ts +217 -0
- package/src/core/index.ts +149 -0
- package/src/core/loader.ts +155 -0
- package/src/core/node.ts +63 -0
- package/src/core/parser.ts +551 -0
- package/src/core/previewLoader.ts +172 -0
- package/src/core/schema/fragment.schema.json +189 -0
- package/src/core/schema/registry.schema.json +137 -0
- package/src/core/schema.ts +182 -0
- package/src/core/storyAdapter.test.ts +571 -0
- package/src/core/storyAdapter.ts +761 -0
- package/src/core/token-types.ts +287 -0
- package/src/core/types.ts +754 -0
- package/src/diff.ts +323 -0
- package/src/index.ts +43 -0
- package/src/mcp/__tests__/projectFields.test.ts +130 -0
- package/src/mcp/bin.ts +36 -0
- package/src/mcp/index.ts +8 -0
- package/src/mcp/server.ts +1310 -0
- package/src/mcp/utils.ts +54 -0
- package/src/mcp-bin.ts +36 -0
- package/src/migrate/__tests__/argTypes/argTypes.test.ts +189 -0
- package/src/migrate/__tests__/args/args.test.ts +452 -0
- package/src/migrate/__tests__/meta/meta.test.ts +198 -0
- package/src/migrate/__tests__/stories/stories.test.ts +278 -0
- package/src/migrate/__tests__/utils/utils.test.ts +371 -0
- package/src/migrate/__tests__/values/values.test.ts +303 -0
- package/src/migrate/bin.ts +108 -0
- package/src/migrate/converter.ts +658 -0
- package/src/migrate/detect.ts +196 -0
- package/src/migrate/index.ts +45 -0
- package/src/migrate/migrate.ts +163 -0
- package/src/migrate/parser.ts +1136 -0
- package/src/migrate/report.ts +624 -0
- package/src/migrate/types.ts +169 -0
- package/src/screenshot.ts +249 -0
- package/src/service/__tests__/ast-utils.test.ts +426 -0
- package/src/service/__tests__/enhance-scanner.test.ts +200 -0
- package/src/service/__tests__/figma/figma.test.ts +652 -0
- package/src/service/__tests__/metrics-store.test.ts +409 -0
- package/src/service/__tests__/patch-generator.test.ts +186 -0
- package/src/service/__tests__/props-extractor.test.ts +365 -0
- package/src/service/__tests__/token-registry.test.ts +267 -0
- package/src/service/analytics.ts +659 -0
- package/src/service/ast-utils.ts +444 -0
- package/src/service/browser-pool.ts +339 -0
- package/src/service/capture.ts +267 -0
- package/src/service/diff.ts +279 -0
- package/src/service/enhance/aggregator.ts +489 -0
- package/src/service/enhance/cache.ts +275 -0
- package/src/service/enhance/codebase-scanner.ts +357 -0
- package/src/service/enhance/context-generator.ts +529 -0
- package/src/service/enhance/doc-extractor.ts +523 -0
- package/src/service/enhance/index.ts +131 -0
- package/src/service/enhance/props-extractor.ts +665 -0
- package/src/service/enhance/scanner.ts +445 -0
- package/src/service/enhance/storybook-parser.ts +552 -0
- package/src/service/enhance/types.ts +346 -0
- package/src/service/enhance/variant-renderer.ts +479 -0
- package/src/service/figma.ts +1008 -0
- package/src/service/index.ts +249 -0
- package/src/service/metrics-store.ts +333 -0
- package/src/service/patch-generator.ts +349 -0
- package/src/service/report.ts +854 -0
- package/src/service/storage.ts +401 -0
- package/src/service/token-fixes.ts +281 -0
- package/src/service/token-parser.ts +504 -0
- package/src/service/token-registry.ts +721 -0
- package/src/service/utils.ts +172 -0
- package/src/setup.ts +241 -0
- package/src/shared/command-wrapper.ts +81 -0
- package/src/shared/dev-server-client.ts +199 -0
- package/src/shared/index.ts +8 -0
- package/src/shared/segment-loader.ts +59 -0
- package/src/shared/types.ts +147 -0
- package/src/static-viewer.ts +715 -0
- package/src/test/discovery.ts +172 -0
- package/src/test/index.ts +281 -0
- package/src/test/reporters/console.ts +194 -0
- package/src/test/reporters/json.ts +190 -0
- package/src/test/reporters/junit.ts +186 -0
- package/src/test/runner.ts +598 -0
- package/src/test/types.ts +245 -0
- package/src/test/watch.ts +200 -0
- package/src/validators.ts +152 -0
- package/src/viewer/__tests__/jsx-parser.test.ts +502 -0
- package/src/viewer/__tests__/render-utils.test.ts +232 -0
- package/src/viewer/__tests__/style-utils.test.ts +404 -0
- package/src/viewer/bin.ts +86 -0
- package/src/viewer/cli/health.ts +256 -0
- package/src/viewer/cli/index.ts +33 -0
- package/src/viewer/cli/scan.ts +124 -0
- package/src/viewer/cli/utils.ts +174 -0
- package/src/viewer/components/AccessibilityPanel.tsx +1404 -0
- package/src/viewer/components/ActionCapture.tsx +172 -0
- package/src/viewer/components/ActionsPanel.tsx +371 -0
- package/src/viewer/components/App.tsx +638 -0
- package/src/viewer/components/BottomPanel.tsx +224 -0
- package/src/viewer/components/CodePanel.tsx +589 -0
- package/src/viewer/components/CommandPalette.tsx +336 -0
- package/src/viewer/components/ComponentGraph.tsx +394 -0
- package/src/viewer/components/ComponentHeader.tsx +85 -0
- package/src/viewer/components/ContractPanel.tsx +234 -0
- package/src/viewer/components/ErrorBoundary.tsx +85 -0
- package/src/viewer/components/FigmaEmbed.tsx +231 -0
- package/src/viewer/components/FragmentEditor.tsx +485 -0
- package/src/viewer/components/HealthDashboard.tsx +452 -0
- package/src/viewer/components/HmrStatusIndicator.tsx +71 -0
- package/src/viewer/components/Icons.tsx +417 -0
- package/src/viewer/components/InteractionsPanel.tsx +720 -0
- package/src/viewer/components/IsolatedPreviewFrame.tsx +321 -0
- package/src/viewer/components/IsolatedRender.tsx +111 -0
- package/src/viewer/components/KeyboardShortcutsHelp.tsx +89 -0
- package/src/viewer/components/LandingPage.tsx +441 -0
- package/src/viewer/components/Layout.tsx +22 -0
- package/src/viewer/components/LeftSidebar.tsx +391 -0
- package/src/viewer/components/MultiViewportPreview.tsx +429 -0
- package/src/viewer/components/PreviewArea.tsx +404 -0
- package/src/viewer/components/PreviewFrameHost.tsx +310 -0
- package/src/viewer/components/PreviewPane.tsx +150 -0
- package/src/viewer/components/PreviewToolbar.tsx +176 -0
- package/src/viewer/components/PropsEditor.tsx +512 -0
- package/src/viewer/components/PropsTable.tsx +98 -0
- package/src/viewer/components/RelationsSection.tsx +57 -0
- package/src/viewer/components/ResizablePanel.tsx +328 -0
- package/src/viewer/components/RightSidebar.tsx +118 -0
- package/src/viewer/components/ScreenshotButton.tsx +90 -0
- package/src/viewer/components/Sidebar.tsx +169 -0
- package/src/viewer/components/SkeletonLoader.tsx +156 -0
- package/src/viewer/components/StoryRenderer.tsx +128 -0
- package/src/viewer/components/ThemeProvider.tsx +96 -0
- package/src/viewer/components/Toast.tsx +67 -0
- package/src/viewer/components/TokenStylePanel.tsx +708 -0
- package/src/viewer/components/UsageSection.tsx +95 -0
- package/src/viewer/components/VariantMatrix.tsx +350 -0
- package/src/viewer/components/VariantRenderer.tsx +131 -0
- package/src/viewer/components/VariantTabs.tsx +84 -0
- package/src/viewer/components/ViewportSelector.tsx +165 -0
- package/src/viewer/components/_future/CreatePage.tsx +836 -0
- package/src/viewer/composition-renderer.ts +381 -0
- package/src/viewer/constants/index.ts +1 -0
- package/src/viewer/constants/ui.ts +185 -0
- package/src/viewer/entry.tsx +299 -0
- package/src/viewer/hooks/index.ts +2 -0
- package/src/viewer/hooks/useA11yCache.ts +383 -0
- package/src/viewer/hooks/useA11yService.ts +498 -0
- package/src/viewer/hooks/useActions.ts +138 -0
- package/src/viewer/hooks/useAppState.ts +124 -0
- package/src/viewer/hooks/useFigmaIntegration.ts +132 -0
- package/src/viewer/hooks/useHmrStatus.ts +109 -0
- package/src/viewer/hooks/useKeyboardShortcuts.ts +222 -0
- package/src/viewer/hooks/usePreviewBridge.ts +347 -0
- package/src/viewer/hooks/useScrollSpy.ts +78 -0
- package/src/viewer/hooks/useUrlState.ts +330 -0
- package/src/viewer/hooks/useViewSettings.ts +125 -0
- package/src/viewer/index.html +28 -0
- package/src/viewer/index.ts +14 -0
- package/src/viewer/intelligence/healthReport.ts +505 -0
- package/src/viewer/intelligence/styleDrift.ts +340 -0
- package/src/viewer/intelligence/usageScanner.ts +309 -0
- package/src/viewer/jsx-parser.ts +485 -0
- package/src/viewer/postcss.config.js +6 -0
- package/src/viewer/preview-frame-entry.tsx +25 -0
- package/src/viewer/preview-frame.html +109 -0
- package/src/viewer/render-template.html +68 -0
- package/src/viewer/render-utils.ts +170 -0
- package/src/viewer/server.ts +276 -0
- package/src/viewer/style-utils.ts +414 -0
- package/src/viewer/styles/globals.css +355 -0
- package/src/viewer/tailwind.config.js +37 -0
- package/src/viewer/types/a11y.ts +197 -0
- package/src/viewer/utils/a11y-fixes.ts +471 -0
- package/src/viewer/utils/actionExport.ts +372 -0
- package/src/viewer/utils/colorSchemes.ts +201 -0
- package/src/viewer/utils/detectRelationships.ts +256 -0
- package/src/viewer/vite-plugin.ts +2143 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/service/browser-pool.ts","../src/service/utils.ts","../src/service/capture.ts","../src/service/storage.ts","../src/service/diff.ts","../src/service/figma.ts","../src/service/analytics.ts","../src/service/report.ts","../src/service/token-parser.ts","../src/service/token-registry.ts","../src/service/token-fixes.ts","../src/service/patch-generator.ts","../src/service/ast-utils.ts","../src/service/metrics-store.ts","../src/service/enhance/scanner.ts","../src/service/enhance/aggregator.ts","../src/service/enhance/cache.ts","../src/service/enhance/codebase-scanner.ts","../src/service/enhance/doc-extractor.ts","../src/service/enhance/storybook-parser.ts","../src/service/enhance/context-generator.ts","../src/service/enhance/props-extractor.ts","../src/service/enhance/variant-renderer.ts"],"sourcesContent":["import { chromium, type Browser, type BrowserContext } from \"playwright\";\nimport { BRAND, DEFAULTS, type Viewport } from \"../core/index.js\";\n\n/**\n * Browser pool configuration\n */\nexport interface BrowserPoolConfig {\n /** Number of browser contexts to keep warm */\n poolSize?: number;\n\n /** Idle timeout before shutdown (ms) */\n idleTimeoutMs?: number;\n\n /** Default viewport for contexts */\n viewport?: Viewport;\n\n /** Enable headless mode (default: true) */\n headless?: boolean;\n}\n\n/**\n * Manages a pool of warm browser contexts for fast screenshot capture.\n *\n * Key features:\n * - Lazy initialization (browser starts on first request)\n * - Pre-warmed contexts for instant capture\n * - Auto-shutdown after idle period\n * - Graceful degradation\n */\nexport class BrowserPool {\n private browser: Browser | null = null;\n private contexts: BrowserContext[] = [];\n private available: BrowserContext[] = [];\n private waitingQueue: Array<(ctx: BrowserContext) => void> = [];\n private idleTimeout: NodeJS.Timeout | null = null;\n private initPromise: Promise<void> | null = null;\n private isShuttingDown = false;\n\n private readonly poolSize: number;\n private readonly idleTimeoutMs: number;\n private readonly viewport: Viewport;\n private readonly headless: boolean;\n\n constructor(config: BrowserPoolConfig = {}) {\n this.poolSize = config.poolSize ?? DEFAULTS.poolSize;\n this.idleTimeoutMs = config.idleTimeoutMs ?? DEFAULTS.idleTimeoutMs;\n this.viewport = config.viewport ?? DEFAULTS.viewport;\n this.headless = config.headless ?? true;\n }\n\n /**\n * Check if the pool is initialized and ready\n */\n get isReady(): boolean {\n return this.browser !== null && !this.isShuttingDown;\n }\n\n /**\n * Get the current pool size\n */\n get size(): number {\n return this.poolSize;\n }\n\n /**\n * Get number of available contexts\n */\n get availableCount(): number {\n return this.available.length;\n }\n\n /**\n * Acquire a browser context from the pool.\n * Will initialize the pool on first call.\n * If all contexts are busy, will wait for one to become available.\n */\n async acquire(): Promise<BrowserContext> {\n if (this.isShuttingDown) {\n throw new BrowserPoolError(\n \"Cannot acquire context while pool is shutting down\",\n \"POOL_SHUTTING_DOWN\"\n );\n }\n\n // Lazy initialization\n if (!this.browser) {\n await this.initialize();\n }\n\n // Reset idle timer\n this.resetIdleTimer();\n\n // Return available context if one exists\n if (this.available.length > 0) {\n return this.available.pop()!;\n }\n\n // All contexts busy - wait for one to free up\n return this.waitForAvailable();\n }\n\n /**\n * Release a context back to the pool after use.\n * Clears context state for next user.\n */\n async release(context: BrowserContext): Promise<void> {\n if (this.isShuttingDown) {\n return;\n }\n\n // Clear context state (cookies, local storage, etc.)\n await this.clearContext(context);\n\n // If someone is waiting, give them this context directly\n if (this.waitingQueue.length > 0) {\n const resolve = this.waitingQueue.shift()!;\n resolve(context);\n return;\n }\n\n // Otherwise, return to available pool\n this.available.push(context);\n }\n\n /**\n * Pre-warm the browser pool.\n * Call this during dev server startup for instant captures.\n */\n async warmup(): Promise<void> {\n if (this.browser) {\n return; // Already initialized\n }\n await this.initialize();\n }\n\n /**\n * Gracefully shut down the pool, closing all contexts and browser.\n */\n async shutdown(): Promise<void> {\n if (this.isShuttingDown || !this.browser) {\n return;\n }\n\n this.isShuttingDown = true;\n\n // Clear idle timer\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n this.idleTimeout = null;\n }\n\n // Reject any waiting requests\n for (const resolve of this.waitingQueue) {\n // We can't reject directly since we're using resolve, so we'll just let them timeout\n }\n this.waitingQueue = [];\n\n // Close all contexts\n for (const context of this.contexts) {\n try {\n await context.close();\n } catch {\n // Ignore errors during shutdown\n }\n }\n\n // Close browser\n try {\n await this.browser.close();\n } catch {\n // Ignore errors during shutdown\n }\n\n // Reset state\n this.browser = null;\n this.contexts = [];\n this.available = [];\n this.initPromise = null;\n this.isShuttingDown = false;\n }\n\n /**\n * Initialize the browser and create the context pool.\n */\n private async initialize(): Promise<void> {\n // Prevent multiple concurrent initializations\n if (this.initPromise) {\n return this.initPromise;\n }\n\n this.initPromise = this.doInitialize();\n return this.initPromise;\n }\n\n private async doInitialize(): Promise<void> {\n this.browser = await chromium.launch({\n headless: this.headless,\n args: [\n \"--disable-gpu\",\n \"--disable-dev-shm-usage\",\n \"--disable-extensions\",\n \"--no-sandbox\",\n \"--disable-setuid-sandbox\",\n ],\n });\n\n // Pre-create contexts\n const contextPromises = Array.from({ length: this.poolSize }, () =>\n this.createContext()\n );\n\n const contexts = await Promise.all(contextPromises);\n this.contexts = contexts;\n this.available = [...contexts];\n\n // Start idle timer\n this.resetIdleTimer();\n }\n\n /**\n * Create a new browser context with default settings.\n */\n private async createContext(): Promise<BrowserContext> {\n if (!this.browser) {\n throw new BrowserPoolError(\n \"Browser not initialized\",\n \"BROWSER_NOT_INITIALIZED\"\n );\n }\n\n return this.browser.newContext({\n viewport: this.viewport,\n deviceScaleFactor: this.viewport.deviceScaleFactor ?? 1,\n // Disable animations for consistent screenshots\n reducedMotion: \"reduce\",\n });\n }\n\n /**\n * Clear context state between uses.\n */\n private async clearContext(context: BrowserContext): Promise<void> {\n try {\n // Clear cookies\n await context.clearCookies();\n\n // Close all pages except one (keep one warm)\n const pages = context.pages();\n for (let i = 1; i < pages.length; i++) {\n await pages[i].close();\n }\n\n // Navigate first page to blank if it exists\n if (pages.length > 0) {\n await pages[0].goto(\"about:blank\");\n }\n } catch {\n // Ignore errors during cleanup\n }\n }\n\n /**\n * Wait for an available context.\n */\n private waitForAvailable(): Promise<BrowserContext> {\n return new Promise((resolve, reject) => {\n // Add timeout to prevent indefinite waiting\n const timeout = setTimeout(() => {\n const index = this.waitingQueue.indexOf(resolve);\n if (index > -1) {\n this.waitingQueue.splice(index, 1);\n }\n reject(\n new BrowserPoolError(\n \"Timeout waiting for available browser context\",\n \"ACQUIRE_TIMEOUT\"\n )\n );\n }, 30000); // 30 second timeout\n\n // Wrap resolve to clear timeout\n const wrappedResolve = (ctx: BrowserContext) => {\n clearTimeout(timeout);\n resolve(ctx);\n };\n\n this.waitingQueue.push(wrappedResolve);\n });\n }\n\n /**\n * Reset the idle shutdown timer.\n */\n private resetIdleTimer(): void {\n if (this.idleTimeout) {\n clearTimeout(this.idleTimeout);\n }\n\n this.idleTimeout = setTimeout(() => {\n this.shutdown();\n }, this.idleTimeoutMs);\n }\n}\n\n/**\n * Error class for browser pool errors\n */\nexport class BrowserPoolError extends Error {\n constructor(message: string, public readonly code: string) {\n super(message);\n this.name = `${BRAND.name}BrowserPoolError`;\n }\n}\n\n/**\n * Singleton instance for shared browser pool\n */\nlet sharedPool: BrowserPool | null = null;\n\n/**\n * Get the shared browser pool instance.\n * Creates one if it doesn't exist.\n */\nexport function getSharedPool(config?: BrowserPoolConfig): BrowserPool {\n if (!sharedPool) {\n sharedPool = new BrowserPool(config);\n }\n return sharedPool;\n}\n\n/**\n * Shutdown and clear the shared pool instance.\n */\nexport async function shutdownSharedPool(): Promise<void> {\n if (sharedPool) {\n await sharedPool.shutdown();\n sharedPool = null;\n }\n}\n","import { createHash } from \"node:crypto\";\nimport { BRAND } from \"../core/index.js\";\n\n/**\n * Base error class for all service errors.\n * Includes error code and optional suggestion for resolution.\n */\nexport class ServiceError extends Error {\n constructor(\n message: string,\n public readonly code: string,\n public readonly suggestion?: string\n ) {\n super(message);\n this.name = `${BRAND.name}Error`;\n }\n\n /**\n * Format error for CLI output\n */\n toCliString(): string {\n let str = `Error: ${this.message}`;\n if (this.suggestion) {\n str += `\\n Suggestion: ${this.suggestion}`;\n }\n return str;\n }\n}\n\n/**\n * Compute SHA-256 hash of a buffer\n */\nexport function computeHash(data: Buffer): string {\n return `sha256:${createHash(\"sha256\").update(data).digest(\"hex\")}`;\n}\n\n/**\n * Simple timer utility for measuring operations\n */\nexport class Timer {\n private startTime: number;\n\n constructor() {\n this.startTime = performance.now();\n }\n\n /**\n * Get elapsed time in milliseconds\n */\n elapsed(): number {\n return Math.round(performance.now() - this.startTime);\n }\n\n /**\n * Reset timer and return elapsed time\n */\n reset(): number {\n const elapsed = this.elapsed();\n this.startTime = performance.now();\n return elapsed;\n }\n}\n\n/**\n * Create a deferred promise with external resolve/reject\n */\nexport function createDeferred<T>(): {\n promise: Promise<T>;\n resolve: (value: T) => void;\n reject: (error: Error) => void;\n} {\n let resolve!: (value: T) => void;\n let reject!: (error: Error) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return { promise, resolve, reject };\n}\n\n/**\n * Sleep for a given number of milliseconds\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Convert buffer to base64 data URL\n */\nexport function bufferToBase64Url(\n buffer: Buffer,\n mimeType = \"image/png\"\n): string {\n return `data:${mimeType};base64,${buffer.toString(\"base64\")}`;\n}\n\n/**\n * Convert base64 data URL to buffer\n */\nexport function base64UrlToBuffer(dataUrl: string): Buffer {\n const base64 = dataUrl.replace(/^data:[^;]+;base64,/, \"\");\n return Buffer.from(base64, \"base64\");\n}\n\n/**\n * Sanitize a string for use as a filename\n */\nexport function sanitizeFilename(name: string): string {\n return name\n .replace(/[/\\\\?%*:|\"<>]/g, \"-\")\n .replace(/\\s+/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\n/**\n * Build path for screenshot file\n */\nexport function buildScreenshotPath(\n component: string,\n variant: string,\n theme: string\n): string {\n const safeComponent = sanitizeFilename(component);\n const safeVariant = sanitizeFilename(variant);\n return `${theme}/${safeComponent}/${safeVariant}.png`;\n}\n\n/**\n * Format milliseconds for display\n */\nexport function formatMs(ms: number): string {\n if (ms < 1000) {\n return `${ms}ms`;\n }\n return `${(ms / 1000).toFixed(1)}s`;\n}\n\n/**\n * Retry an async operation with exponential backoff\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: {\n maxAttempts?: number;\n initialDelayMs?: number;\n maxDelayMs?: number;\n } = {}\n): Promise<T> {\n const { maxAttempts = 3, initialDelayMs = 100, maxDelayMs = 1000 } = options;\n\n let lastError: Error | undefined;\n let delay = initialDelayMs;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error instanceof Error ? error : new Error(String(error));\n\n if (attempt < maxAttempts) {\n await sleep(delay);\n delay = Math.min(delay * 2, maxDelayMs);\n }\n }\n }\n\n throw lastError;\n}\n","import type { Page } from 'playwright';\nimport {\n BRAND,\n DEFAULTS,\n type Screenshot,\n type ScreenshotMetadata,\n type Viewport,\n type Theme,\n} from '../core/index.js';\nimport { BrowserPool, BrowserPoolError } from './browser-pool.js';\nimport { ServiceError, Timer, computeHash, sleep } from './utils.js';\n\n/**\n * Options for capturing a screenshot\n */\nexport interface CaptureOptions {\n /** Override default viewport */\n viewport?: Viewport;\n\n /** Theme to capture */\n theme?: Theme;\n\n /** Wait for specific selector before capture */\n waitForSelector?: string;\n\n /** Additional delay after render (ms) */\n delay?: number;\n\n /** Timeout for font loading (ms) */\n fontTimeout?: number;\n\n /** Whether to disable animations (default: true) */\n disableAnimations?: boolean;\n\n /** Clip capture to specific element */\n clipSelector?: string;\n}\n\n/**\n * CSS to inject for disabling animations\n */\nconst DISABLE_ANIMATIONS_CSS = `\n*, *::before, *::after {\n animation-duration: 0s !important;\n animation-delay: 0s !important;\n transition-duration: 0s !important;\n transition-delay: 0s !important;\n}\n`;\n\n/**\n * Capture engine for taking screenshots of component variants.\n */\nexport class CaptureEngine {\n constructor(\n private readonly pool: BrowserPool,\n private readonly baseUrl: string\n ) {}\n\n /**\n * Capture a single variant screenshot\n */\n async captureVariant(\n component: string,\n variant: string,\n options: CaptureOptions = {}\n ): Promise<Screenshot> {\n const timer = new Timer();\n const context = await this.pool.acquire();\n\n try {\n const page = await context.newPage();\n\n try {\n // Build the URL for isolated variant rendering\n const url = this.buildVariantUrl(component, variant, options.theme);\n\n // Navigate and capture\n const { renderTimeMs, data, captureTimeMs } = await this.navigateAndCapture(\n page,\n url,\n options\n );\n\n // Build screenshot object\n const screenshot: Screenshot = {\n data,\n hash: computeHash(data),\n viewport: options.viewport ?? DEFAULTS.viewport,\n capturedAt: new Date(),\n metadata: {\n component,\n variant,\n theme: options.theme ?? DEFAULTS.theme,\n renderTimeMs,\n captureTimeMs,\n },\n };\n\n return screenshot;\n } finally {\n await page.close();\n }\n } finally {\n await this.pool.release(context);\n }\n }\n\n /**\n * Capture all variants for a component\n */\n async captureComponent(\n component: string,\n variants: string[],\n options: CaptureOptions = {}\n ): Promise<Screenshot[]> {\n const results: Screenshot[] = [];\n\n // Capture in parallel up to pool size\n const batchSize = this.pool.size;\n\n for (let i = 0; i < variants.length; i += batchSize) {\n const batch = variants.slice(i, i + batchSize);\n const batchPromises = batch.map((variant) =>\n this.captureVariant(component, variant, options)\n );\n const batchResults = await Promise.all(batchPromises);\n results.push(...batchResults);\n }\n\n return results;\n }\n\n /**\n * Build the URL for a variant\n */\n private buildVariantUrl(\n component: string,\n variant: string,\n theme?: Theme\n ): string {\n const params = new URLSearchParams({\n component,\n variant,\n isolated: 'true',\n });\n\n if (theme) {\n params.set('theme', theme);\n }\n\n return `${this.baseUrl}?${params.toString()}`;\n }\n\n /**\n * Navigate to URL and capture screenshot\n */\n private async navigateAndCapture(\n page: Page,\n url: string,\n options: CaptureOptions\n ): Promise<{ renderTimeMs: number; data: Buffer; captureTimeMs: number }> {\n const renderTimer = new Timer();\n\n // Inject animation disabling CSS if needed\n if (options.disableAnimations !== false) {\n await page.addStyleTag({ content: DISABLE_ANIMATIONS_CSS });\n }\n\n // Navigate to the page\n await page.goto(url, {\n waitUntil: 'domcontentloaded',\n timeout: 30000,\n });\n\n // Wait for network to be idle (all resources loaded)\n await page.waitForLoadState('networkidle', { timeout: 10000 }).catch(() => {\n // Ignore timeout, continue with capture\n });\n\n // Wait for fonts to load\n await this.waitForFonts(page, options.fontTimeout ?? DEFAULTS.fontTimeoutMs);\n\n // Wait for specific selector if provided\n if (options.waitForSelector) {\n await page.waitForSelector(options.waitForSelector, { timeout: 5000 });\n }\n\n // Additional delay if specified\n if (options.delay ?? DEFAULTS.captureDelayMs) {\n await sleep(options.delay ?? DEFAULTS.captureDelayMs);\n }\n\n const renderTimeMs = renderTimer.elapsed();\n\n // Capture screenshot\n const captureTimer = new Timer();\n const data = await this.takeScreenshot(page, options);\n const captureTimeMs = captureTimer.elapsed();\n\n return { renderTimeMs, data: Buffer.from(data), captureTimeMs };\n }\n\n /**\n * Wait for fonts to be loaded\n */\n private async waitForFonts(page: Page, timeout: number): Promise<void> {\n try {\n await page.evaluate(async (timeoutMs) => {\n // Wait for document.fonts.ready\n await Promise.race([\n document.fonts.ready,\n new Promise((resolve) => setTimeout(resolve, timeoutMs)),\n ]);\n }, timeout);\n } catch {\n // Ignore errors, continue with capture\n }\n }\n\n /**\n * Take the actual screenshot\n */\n private async takeScreenshot(\n page: Page,\n options: CaptureOptions\n ): Promise<Uint8Array> {\n // If clip selector is provided, clip to that element\n if (options.clipSelector) {\n const element = page.locator(options.clipSelector);\n const boundingBox = await element.boundingBox();\n\n if (boundingBox) {\n return page.screenshot({\n type: 'png',\n clip: boundingBox,\n });\n }\n }\n\n // Full page screenshot\n return page.screenshot({\n type: 'png',\n fullPage: false,\n });\n }\n}\n\n/**\n * Error class for capture errors\n */\nexport class CaptureError extends ServiceError {\n constructor(message: string, code: string, suggestion?: string) {\n super(message, code, suggestion);\n this.name = `${BRAND.name}CaptureError`;\n }\n}\n\n/**\n * Create a capture engine with the shared browser pool\n */\nexport function createCaptureEngine(\n pool: BrowserPool,\n baseUrl: string\n): CaptureEngine {\n return new CaptureEngine(pool, baseUrl);\n}\n","import { mkdir, readFile, writeFile, stat, readdir, rm } from 'node:fs/promises';\nimport { dirname, join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport {\n BRAND,\n DEFAULTS,\n type Screenshot,\n type BaselineInfo,\n type Manifest,\n type Viewport,\n type Theme,\n} from '../core/index.js';\nimport { ServiceError, buildScreenshotPath, computeHash } from './utils.js';\n\n/**\n * Storage manager configuration\n */\nexport interface StorageConfig {\n /** Root directory for project (default: process.cwd()) */\n projectRoot?: string;\n\n /** Default viewport */\n viewport?: Viewport;\n\n /** Default diff threshold */\n threshold?: number;\n\n /** Capture delay */\n captureDelay?: number;\n}\n\n/**\n * Manages baseline screenshot storage and manifest.\n */\nexport class StorageManager {\n private readonly projectRoot: string;\n private readonly dataDir: string;\n private readonly screenshotsDir: string;\n private readonly manifestPath: string;\n private readonly config: Required<Omit<StorageConfig, 'projectRoot'>>;\n\n private manifest: Manifest | null = null;\n\n constructor(config: StorageConfig = {}) {\n this.projectRoot = config.projectRoot ?? process.cwd();\n this.dataDir = join(this.projectRoot, BRAND.dataDir);\n this.screenshotsDir = join(this.dataDir, BRAND.screenshotsDir);\n this.manifestPath = join(this.dataDir, BRAND.manifestFile);\n\n this.config = {\n viewport: config.viewport ?? DEFAULTS.viewport,\n threshold: config.threshold ?? DEFAULTS.diffThreshold,\n captureDelay: config.captureDelay ?? DEFAULTS.captureDelayMs,\n };\n }\n\n /**\n * Get the data directory path\n */\n get dataDirPath(): string {\n return this.dataDir;\n }\n\n /**\n * Get the screenshots directory path\n */\n get screenshotsDirPath(): string {\n return this.screenshotsDir;\n }\n\n /**\n * Initialize the storage directory structure\n */\n async initialize(): Promise<void> {\n // Create directories\n await mkdir(this.screenshotsDir, { recursive: true });\n await mkdir(join(this.dataDir, BRAND.cacheDir), { recursive: true });\n await mkdir(join(this.dataDir, BRAND.diffDir), { recursive: true });\n\n // Load or create manifest\n if (existsSync(this.manifestPath)) {\n await this.loadManifest();\n } else {\n this.manifest = this.createEmptyManifest();\n await this.saveManifest();\n }\n }\n\n /**\n * Save a screenshot as a baseline\n */\n async saveBaseline(screenshot: Screenshot): Promise<BaselineInfo> {\n await this.ensureInitialized();\n\n const { component, variant, theme } = screenshot.metadata;\n const relativePath = buildScreenshotPath(component, variant, theme);\n const absolutePath = join(this.screenshotsDir, relativePath);\n\n // Ensure directory exists\n await mkdir(dirname(absolutePath), { recursive: true });\n\n // Write the image\n await writeFile(absolutePath, screenshot.data);\n\n // Get file size\n const stats = await stat(absolutePath);\n\n // Create baseline info\n const baselineInfo: BaselineInfo = {\n component,\n variant,\n theme,\n path: relativePath,\n hash: screenshot.hash,\n viewport: screenshot.viewport,\n capturedAt: screenshot.capturedAt.toISOString(),\n fileSize: stats.size,\n };\n\n // Update manifest\n this.updateManifestBaseline(baselineInfo);\n await this.saveManifest();\n\n return baselineInfo;\n }\n\n /**\n * Load a baseline screenshot\n */\n async loadBaseline(\n component: string,\n variant: string,\n theme: Theme = DEFAULTS.theme\n ): Promise<Screenshot | null> {\n await this.ensureInitialized();\n\n const info = this.getBaselineInfo(component, variant, theme);\n if (!info) {\n return null;\n }\n\n const absolutePath = join(this.screenshotsDir, info.path);\n\n if (!existsSync(absolutePath)) {\n return null;\n }\n\n const data = await readFile(absolutePath);\n\n return {\n data,\n hash: info.hash,\n viewport: info.viewport,\n capturedAt: new Date(info.capturedAt),\n metadata: {\n component: info.component,\n variant: info.variant,\n theme: info.theme,\n renderTimeMs: 0, // Not available for loaded baselines\n captureTimeMs: 0,\n },\n };\n }\n\n /**\n * Get baseline info from manifest\n */\n getBaselineInfo(\n component: string,\n variant: string,\n theme: Theme = DEFAULTS.theme\n ): BaselineInfo | null {\n if (!this.manifest) {\n return null;\n }\n\n const key = this.buildBaselineKey(component, variant, theme);\n const componentBaselines = this.manifest.baselines[component];\n\n if (!componentBaselines) {\n return null;\n }\n\n return componentBaselines[key] ?? null;\n }\n\n /**\n * Check if a baseline exists\n */\n hasBaseline(\n component: string,\n variant: string,\n theme: Theme = DEFAULTS.theme\n ): boolean {\n return this.getBaselineInfo(component, variant, theme) !== null;\n }\n\n /**\n * List all baselines\n */\n listBaselines(): BaselineInfo[] {\n if (!this.manifest) {\n return [];\n }\n\n const baselines: BaselineInfo[] = [];\n\n for (const componentBaselines of Object.values(this.manifest.baselines)) {\n for (const baseline of Object.values(componentBaselines)) {\n baselines.push(baseline);\n }\n }\n\n return baselines;\n }\n\n /**\n * List baselines for a specific component\n */\n listComponentBaselines(component: string): BaselineInfo[] {\n if (!this.manifest) {\n return [];\n }\n\n const componentBaselines = this.manifest.baselines[component];\n if (!componentBaselines) {\n return [];\n }\n\n return Object.values(componentBaselines);\n }\n\n /**\n * Delete a baseline\n */\n async deleteBaseline(\n component: string,\n variant: string,\n theme: Theme = DEFAULTS.theme\n ): Promise<boolean> {\n await this.ensureInitialized();\n\n const info = this.getBaselineInfo(component, variant, theme);\n if (!info) {\n return false;\n }\n\n // Delete the file\n const absolutePath = join(this.screenshotsDir, info.path);\n if (existsSync(absolutePath)) {\n await rm(absolutePath);\n }\n\n // Remove from manifest\n const key = this.buildBaselineKey(component, variant, theme);\n if (this.manifest?.baselines[component]) {\n delete this.manifest.baselines[component][key];\n\n // Clean up empty component entry\n if (Object.keys(this.manifest.baselines[component]).length === 0) {\n delete this.manifest.baselines[component];\n }\n }\n\n await this.saveManifest();\n return true;\n }\n\n /**\n * Save a diff image\n */\n async saveDiff(\n component: string,\n variant: string,\n theme: Theme,\n diffImage: Buffer\n ): Promise<string> {\n const relativePath = buildScreenshotPath(component, variant, theme).replace(\n '.png',\n '-diff.png'\n );\n const absolutePath = join(this.dataDir, BRAND.diffDir, relativePath);\n\n await mkdir(dirname(absolutePath), { recursive: true });\n await writeFile(absolutePath, diffImage);\n\n return absolutePath;\n }\n\n /**\n * Get the manifest\n */\n getManifest(): Manifest | null {\n return this.manifest;\n }\n\n /**\n * Reload manifest from disk\n */\n async reloadManifest(): Promise<void> {\n await this.loadManifest();\n }\n\n /**\n * Build a unique key for baseline lookup\n */\n private buildBaselineKey(\n component: string,\n variant: string,\n theme: Theme\n ): string {\n return `${variant}:${theme}`;\n }\n\n /**\n * Update manifest with a baseline\n */\n private updateManifestBaseline(info: BaselineInfo): void {\n if (!this.manifest) {\n this.manifest = this.createEmptyManifest();\n }\n\n if (!this.manifest.baselines[info.component]) {\n this.manifest.baselines[info.component] = {};\n }\n\n const key = this.buildBaselineKey(info.component, info.variant, info.theme);\n this.manifest.baselines[info.component][key] = info;\n this.manifest.generatedAt = new Date().toISOString();\n }\n\n /**\n * Create an empty manifest\n */\n private createEmptyManifest(): Manifest {\n return {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n config: {\n defaultViewport: this.config.viewport,\n defaultThreshold: this.config.threshold,\n captureDelay: this.config.captureDelay,\n },\n baselines: {},\n };\n }\n\n /**\n * Load manifest from disk\n */\n private async loadManifest(): Promise<void> {\n try {\n const content = await readFile(this.manifestPath, 'utf-8');\n this.manifest = JSON.parse(content) as Manifest;\n } catch {\n this.manifest = this.createEmptyManifest();\n }\n }\n\n /**\n * Save manifest to disk\n */\n private async saveManifest(): Promise<void> {\n if (!this.manifest) {\n return;\n }\n\n await mkdir(dirname(this.manifestPath), { recursive: true });\n await writeFile(\n this.manifestPath,\n JSON.stringify(this.manifest, null, 2),\n 'utf-8'\n );\n }\n\n /**\n * Ensure storage is initialized\n */\n private async ensureInitialized(): Promise<void> {\n if (!this.manifest) {\n await this.initialize();\n }\n }\n}\n\n/**\n * Error class for storage errors\n */\nexport class StorageError extends ServiceError {\n constructor(message: string, code: string, suggestion?: string) {\n super(message, code, suggestion);\n this.name = `${BRAND.name}StorageError`;\n }\n}\n\n/**\n * Create a storage manager\n */\nexport function createStorageManager(config?: StorageConfig): StorageManager {\n return new StorageManager(config);\n}\n","import pixelmatch from 'pixelmatch';\nimport { PNG } from 'pngjs';\nimport {\n BRAND,\n DEFAULTS,\n type Screenshot,\n type DiffResult,\n type BoundingBox,\n} from '../core/index.js';\nimport { ServiceError, Timer } from './utils.js';\n\n/**\n * Options for diff comparison\n */\nexport interface DiffOptions {\n /** Percentage threshold for matching (0-100). Default: 5 */\n threshold?: number;\n\n /** Color difference sensitivity (0-1). Lower = more sensitive. Default: 0.1 */\n colorThreshold?: number;\n\n /** Include anti-aliased pixels in comparison. Default: false */\n includeAA?: boolean;\n}\n\n/**\n * Diff engine for comparing screenshots.\n */\nexport class DiffEngine {\n private readonly defaultThreshold: number;\n\n constructor(defaultThreshold: number = DEFAULTS.diffThreshold) {\n this.defaultThreshold = defaultThreshold;\n }\n\n /**\n * Compare two screenshots and return diff result\n */\n compare(\n current: Screenshot,\n baseline: Screenshot,\n options: DiffOptions = {}\n ): DiffResult {\n const timer = new Timer();\n\n // Parse PNG images\n const img1 = PNG.sync.read(current.data);\n const img2 = PNG.sync.read(baseline.data);\n\n // Validate dimensions match\n if (img1.width !== img2.width || img1.height !== img2.height) {\n throw new DiffError(\n `Dimension mismatch: current is ${img1.width}x${img1.height}, baseline is ${img2.width}x${img2.height}`,\n 'DIMENSION_MISMATCH',\n 'Ensure both screenshots use the same viewport size'\n );\n }\n\n const { width, height } = img1;\n const totalPixels = width * height;\n\n // Create diff image\n const diffPng = new PNG({ width, height });\n\n // Run pixelmatch comparison\n const diffPixelCount = pixelmatch(\n img1.data,\n img2.data,\n diffPng.data,\n width,\n height,\n {\n threshold: options.colorThreshold ?? 0.1,\n includeAA: options.includeAA ?? false,\n alpha: 0.1,\n diffColor: [255, 0, 0], // Red for differences\n diffColorAlt: [0, 255, 0], // Green for anti-aliased\n }\n );\n\n // Calculate diff percentage\n const diffPercentage = (diffPixelCount / totalPixels) * 100;\n const threshold = options.threshold ?? this.defaultThreshold;\n\n // Find changed regions\n const changedRegions = this.findChangedRegions(diffPng);\n\n // Only include diff image if there are differences\n const diffImage = diffPixelCount > 0 ? PNG.sync.write(diffPng) : undefined;\n\n return {\n matches: diffPercentage <= threshold,\n diffPercentage: Math.round(diffPercentage * 100) / 100,\n diffPixelCount,\n totalPixels,\n diffImage: diffImage ? Buffer.from(diffImage) : undefined,\n changedRegions,\n diffTimeMs: timer.elapsed(),\n };\n }\n\n /**\n * Quick check if two screenshots are identical (by hash)\n */\n areIdentical(current: Screenshot, baseline: Screenshot): boolean {\n return current.hash === baseline.hash;\n }\n\n /**\n * Find bounding boxes of changed regions in the diff image\n */\n private findChangedRegions(diffPng: PNG): BoundingBox[] {\n const { width, height, data } = diffPng;\n const regions: BoundingBox[] = [];\n const visited = new Set<number>();\n\n // Scan for red pixels (differences)\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const idx = (y * width + x) * 4;\n const pixelKey = y * width + x;\n\n // Check if this is a diff pixel (red channel > 200) and not visited\n if (data[idx] > 200 && !visited.has(pixelKey)) {\n // Flood fill to find region bounds\n const region = this.floodFillBounds(diffPng, x, y, visited);\n if (region) {\n regions.push(region);\n }\n }\n }\n }\n\n // Merge overlapping regions\n return this.mergeOverlappingRegions(regions);\n }\n\n /**\n * Flood fill to find bounds of a contiguous changed region\n */\n private floodFillBounds(\n diffPng: PNG,\n startX: number,\n startY: number,\n visited: Set<number>\n ): BoundingBox | null {\n const { width, height, data } = diffPng;\n const stack: Array<[number, number]> = [[startX, startY]];\n\n let minX = startX;\n let maxX = startX;\n let minY = startY;\n let maxY = startY;\n let pixelCount = 0;\n\n while (stack.length > 0) {\n const [x, y] = stack.pop()!;\n const pixelKey = y * width + x;\n\n if (\n x < 0 ||\n x >= width ||\n y < 0 ||\n y >= height ||\n visited.has(pixelKey)\n ) {\n continue;\n }\n\n const idx = (y * width + x) * 4;\n\n // Check if this is a diff pixel\n if (data[idx] <= 200) {\n continue;\n }\n\n visited.add(pixelKey);\n pixelCount++;\n\n // Update bounds\n minX = Math.min(minX, x);\n maxX = Math.max(maxX, x);\n minY = Math.min(minY, y);\n maxY = Math.max(maxY, y);\n\n // Add neighbors (4-connectivity)\n stack.push([x + 1, y], [x - 1, y], [x, y + 1], [x, y - 1]);\n }\n\n // Filter out tiny regions (noise)\n if (pixelCount < 10) {\n return null;\n }\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX + 1,\n height: maxY - minY + 1,\n };\n }\n\n /**\n * Merge overlapping bounding boxes\n */\n private mergeOverlappingRegions(regions: BoundingBox[]): BoundingBox[] {\n if (regions.length <= 1) {\n return regions;\n }\n\n // Sort by x coordinate\n const sorted = [...regions].sort((a, b) => a.x - b.x);\n const merged: BoundingBox[] = [];\n\n let current = sorted[0];\n\n for (let i = 1; i < sorted.length; i++) {\n const next = sorted[i];\n\n // Check if regions overlap or are adjacent (with 10px margin)\n if (this.regionsOverlap(current, next, 10)) {\n // Merge into current\n current = this.mergeBoxes(current, next);\n } else {\n merged.push(current);\n current = next;\n }\n }\n\n merged.push(current);\n return merged;\n }\n\n /**\n * Check if two bounding boxes overlap (with margin)\n */\n private regionsOverlap(a: BoundingBox, b: BoundingBox, margin: number): boolean {\n return !(\n a.x + a.width + margin < b.x ||\n b.x + b.width + margin < a.x ||\n a.y + a.height + margin < b.y ||\n b.y + b.height + margin < a.y\n );\n }\n\n /**\n * Merge two bounding boxes\n */\n private mergeBoxes(a: BoundingBox, b: BoundingBox): BoundingBox {\n const minX = Math.min(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxX = Math.max(a.x + a.width, b.x + b.width);\n const maxY = Math.max(a.y + a.height, b.y + b.height);\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n };\n }\n}\n\n/**\n * Error class for diff errors\n */\nexport class DiffError extends ServiceError {\n constructor(message: string, code: string, suggestion?: string) {\n super(message, code, suggestion);\n this.name = `${BRAND.name}DiffError`;\n }\n}\n\n/**\n * Create a diff engine\n */\nexport function createDiffEngine(defaultThreshold?: number): DiffEngine {\n return new DiffEngine(defaultThreshold);\n}\n","/**\n * Figma API client for fetching design frames.\n * Includes caching for performance during iteration loops.\n *\n * Uses official types from @figma/rest-api-spec for type safety.\n */\n\nimport { BRAND } from '../core/index.js';\nimport { ServiceError } from './utils.js';\nimport type {\n GetFileResponse,\n GetFileNodesResponse,\n Node as FigmaAPINode,\n} from '@figma/rest-api-spec';\n\n/**\n * Configuration for FigmaClient\n */\nexport interface FigmaClientConfig {\n /** Figma Personal Access Token */\n accessToken: string;\n\n /** Cache TTL in milliseconds (default: 5 minutes) */\n cacheTtlMs?: number;\n}\n\n/**\n * Result of fetching a Figma image\n */\nexport interface FigmaImageResult {\n /** PNG image buffer */\n data: Buffer;\n\n /** Original CDN URL (expires after ~30 days) */\n cdnUrl: string;\n\n /** Whether this result was served from cache */\n fromCache: boolean;\n}\n\n/**\n * Parsed Figma URL components\n */\nexport interface FigmaUrlParts {\n /** File key from URL */\n fileKey: string;\n\n /** Node ID from URL */\n nodeId: string;\n}\n\n/**\n * Extended Figma component metadata.\n * Compatible with both Component and ComponentSet from @figma/rest-api-spec.\n */\nexport interface FigmaComponent {\n /** Component key */\n key: string;\n\n /** Component name */\n name: string;\n\n /** Description */\n description: string;\n\n /** File key (added by us - not in API response directly) */\n file_key: string;\n\n /** Node ID within the file (from response object keys) */\n node_id: string;\n\n /** Component set ID if component belongs to one */\n componentSetId?: string;\n\n /** Documentation links (optional for compatibility with ComponentSet) */\n documentationLinks?: Array<{ uri: string }>;\n\n /** Whether this is a remote component */\n remote?: boolean;\n}\n\n/**\n * Result of fetching file components\n */\nexport interface FigmaFileComponents {\n /** All components in the file */\n components: FigmaComponent[];\n\n /** Component sets (variants) */\n componentSets: FigmaComponent[];\n\n /** File name */\n fileName: string;\n}\n\n/**\n * A variant within a component set\n */\nexport interface FigmaVariant {\n /** Node ID of the variant */\n node_id: string;\n\n /** Full variant name (e.g., \"State=Primary, Size=Medium\") */\n name: string;\n\n /** Parsed properties from the name */\n properties: Record<string, string>;\n\n /** Individual property values for matching */\n values: string[];\n}\n\n/**\n * Component set with its variants\n */\nexport interface FigmaComponentSetWithVariants {\n /** The component set */\n componentSet: FigmaComponent;\n\n /** All variants within this component set */\n variants: FigmaVariant[];\n}\n\n// ============================================================================\n// Design Property Types (for CSS comparison)\n// ============================================================================\n\n/**\n * RGBA color in Figma format (0-1 range)\n */\nexport interface FigmaColor {\n r: number;\n g: number;\n b: number;\n a: number;\n}\n\n/**\n * Figma fill/paint object\n */\nexport interface FigmaFill {\n type: 'SOLID' | 'GRADIENT_LINEAR' | 'GRADIENT_RADIAL' | 'GRADIENT_ANGULAR' | 'GRADIENT_DIAMOND' | 'IMAGE' | 'EMOJI';\n color?: FigmaColor;\n opacity?: number;\n visible?: boolean;\n}\n\n/**\n * Figma stroke object\n */\nexport interface FigmaStroke {\n type: 'SOLID' | 'GRADIENT_LINEAR' | 'GRADIENT_RADIAL' | 'GRADIENT_ANGULAR' | 'GRADIENT_DIAMOND';\n color?: FigmaColor;\n opacity?: number;\n visible?: boolean;\n}\n\n/**\n * Figma effect (shadow, blur, etc.)\n */\nexport interface FigmaEffect {\n type: 'DROP_SHADOW' | 'INNER_SHADOW' | 'LAYER_BLUR' | 'BACKGROUND_BLUR';\n visible?: boolean;\n color?: FigmaColor;\n offset?: { x: number; y: number };\n radius?: number;\n spread?: number;\n}\n\n/**\n * Figma typography properties\n */\nexport interface FigmaTypography {\n fontFamily: string;\n fontStyle: string;\n fontSize: number;\n fontWeight?: number;\n lineHeight?: { value: number; unit: 'PIXELS' | 'PERCENT' | 'AUTO' };\n letterSpacing?: number;\n textAlignHorizontal?: 'LEFT' | 'CENTER' | 'RIGHT' | 'JUSTIFIED';\n}\n\n/**\n * Extracted design properties from a Figma node\n */\nexport interface FigmaDesignProperties {\n /** Node ID */\n nodeId: string;\n\n /** Node name */\n name: string;\n\n /** Node type */\n type: string;\n\n /** Dimensions */\n width?: number;\n height?: number;\n\n /** Fill colors */\n fills?: FigmaFill[];\n\n /** Stroke/border */\n strokes?: FigmaStroke[];\n strokeWeight?: number;\n strokeAlign?: 'INSIDE' | 'CENTER' | 'OUTSIDE';\n\n /** Corner radius */\n cornerRadius?: number;\n topLeftRadius?: number;\n topRightRadius?: number;\n bottomLeftRadius?: number;\n bottomRightRadius?: number;\n\n /** Effects (shadows, blur) */\n effects?: FigmaEffect[];\n\n /** Typography (for text nodes) */\n typography?: FigmaTypography;\n\n /** Auto-layout properties */\n padding?: {\n top?: number;\n right?: number;\n bottom?: number;\n left?: number;\n };\n itemSpacing?: number;\n\n /** Opacity */\n opacity?: number;\n}\n\n/**\n * CSS-formatted design properties for comparison\n */\nexport interface CSSDesignProperties {\n /** Background color */\n backgroundColor?: string;\n\n /** Border */\n borderColor?: string;\n borderWidth?: string;\n borderRadius?: string;\n\n /** Typography */\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n lineHeight?: string;\n letterSpacing?: string;\n textAlign?: string;\n\n /** Shadow */\n boxShadow?: string;\n\n /** Spacing */\n padding?: string;\n gap?: string;\n\n /** Opacity */\n opacity?: string;\n\n /** Dimensions */\n width?: string;\n height?: string;\n}\n\n/**\n * Style comparison result\n */\nexport interface StyleDiffResult {\n /** Property name */\n property: string;\n\n /** Expected value from Figma */\n figma: string;\n\n /** Actual value from rendered component */\n rendered: string;\n\n /** Whether values match (within tolerance) */\n match: boolean;\n}\n\ninterface CacheEntry {\n data: Buffer;\n cdnUrl: string;\n timestamp: number;\n}\n\n/**\n * Figma API client with caching.\n * Fetches design frames as PNG images for comparison.\n */\nexport class FigmaClient {\n private readonly accessToken: string;\n private readonly cacheTtlMs: number;\n private readonly cache = new Map<string, CacheEntry>();\n\n constructor(config: FigmaClientConfig) {\n this.accessToken = config.accessToken;\n this.cacheTtlMs = config.cacheTtlMs ?? 5 * 60 * 1000; // 5 minutes default\n }\n\n /**\n * Parse a Figma URL to extract file key and node ID.\n *\n * Supported formats:\n * - https://figma.com/file/abc123/name?node-id=1-2\n * - https://figma.com/design/abc123/name?node-id=1-2\n * - https://www.figma.com/file/abc123/name?node-id=1%3A2 (URL-encoded)\n */\n parseUrl(url: string): FigmaUrlParts {\n // Match both /file/ and /design/ paths\n const urlPattern = /figma\\.com\\/(?:file|design)\\/([^\\/]+)\\/[^?]*\\?.*node-id=([^&]+)/i;\n const match = url.match(urlPattern);\n\n if (!match) {\n throw new FigmaError(\n `Invalid Figma URL format: ${url}`,\n 'INVALID_URL',\n 'Expected format: https://figma.com/file/{fileKey}/name?node-id={nodeId}'\n );\n }\n\n const fileKey = match[1];\n // Decode URL-encoded node IDs (1%3A2 -> 1:2, 1%2D2 -> 1-2)\n const nodeId = decodeURIComponent(match[2]);\n\n return { fileKey, nodeId };\n }\n\n /**\n * Fetch an image from Figma by URL.\n * Uses cache if available and not expired.\n */\n async getImageFromUrl(\n url: string,\n options: { scale?: number; format?: 'png' | 'jpg' } = {}\n ): Promise<FigmaImageResult> {\n const { fileKey, nodeId } = this.parseUrl(url);\n return this.getNodeImage(fileKey, nodeId, options);\n }\n\n /**\n * Fetch an image for a specific node.\n */\n async getNodeImage(\n fileKey: string,\n nodeId: string,\n options: { scale?: number; format?: 'png' | 'jpg' } = {}\n ): Promise<FigmaImageResult> {\n const { scale = 2, format = 'png' } = options;\n\n // Check cache first\n const cacheKey = `${fileKey}:${nodeId}:${scale}:${format}`;\n const cached = this.cache.get(cacheKey);\n\n if (cached && Date.now() - cached.timestamp < this.cacheTtlMs) {\n return {\n data: cached.data,\n cdnUrl: cached.cdnUrl,\n fromCache: true,\n };\n }\n\n // Fetch from Figma API\n const cdnUrl = await this.fetchImageUrl(fileKey, nodeId, scale, format);\n const data = await this.downloadImage(cdnUrl);\n\n // Update cache\n this.cache.set(cacheKey, {\n data,\n cdnUrl,\n timestamp: Date.now(),\n });\n\n return {\n data,\n cdnUrl,\n fromCache: false,\n };\n }\n\n /**\n * Clear the cache (useful for forcing fresh fetches)\n */\n clearCache(): void {\n this.cache.clear();\n }\n\n /**\n * Get cache stats for debugging\n */\n getCacheStats(): { size: number; oldestMs: number } {\n let oldest = Date.now();\n for (const entry of this.cache.values()) {\n oldest = Math.min(oldest, entry.timestamp);\n }\n return {\n size: this.cache.size,\n oldestMs: this.cache.size > 0 ? Date.now() - oldest : 0,\n };\n }\n\n /**\n * Parse a Figma file URL to extract the file key.\n * Works with URLs that may or may not have a node-id.\n */\n parseFileUrl(url: string): { fileKey: string; nodeId?: string } {\n // Match both /file/ and /design/ paths\n const urlPattern = /figma\\.com\\/(?:file|design)\\/([^\\/]+)/i;\n const match = url.match(urlPattern);\n\n if (!match) {\n throw new FigmaError(\n `Invalid Figma URL format: ${url}`,\n 'INVALID_URL',\n 'Expected format: https://figma.com/file/{fileKey}/...'\n );\n }\n\n const fileKey = match[1];\n\n // Try to extract node-id if present\n const nodeMatch = url.match(/node-id=([^&]+)/i);\n const nodeId = nodeMatch ? decodeURIComponent(nodeMatch[1]) : undefined;\n\n return { fileKey, nodeId };\n }\n\n /**\n * Fetch all components from a Figma file.\n * Uses the /v1/files/:key endpoint to get component metadata.\n */\n async getFileComponents(fileKey: string): Promise<FigmaFileComponents> {\n const apiUrl = `https://api.figma.com/v1/files/${fileKey}`;\n\n const response = await fetch(apiUrl, {\n headers: {\n 'X-Figma-Token': this.accessToken,\n },\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => 'Unknown error');\n\n if (response.status === 403) {\n throw new FigmaError(\n 'Figma access denied',\n 'ACCESS_DENIED',\n 'Check your access token and ensure the file is shared with you'\n );\n }\n\n if (response.status === 404) {\n throw new FigmaError(\n `Figma file not found: ${fileKey}`,\n 'NOT_FOUND',\n 'Verify the file key is correct'\n );\n }\n\n throw new FigmaError(\n `Figma API error (${response.status}): ${errorBody}`,\n 'API_ERROR'\n );\n }\n\n // Use official GetFileResponse type\n const data = (await response.json()) as GetFileResponse;\n\n // Convert the component maps to arrays with extended info\n const components: FigmaComponent[] = Object.entries(data.components || {}).map(\n ([nodeId, comp]) => ({\n key: comp.key,\n name: comp.name,\n description: comp.description,\n file_key: fileKey,\n node_id: nodeId,\n componentSetId: comp.componentSetId,\n documentationLinks: comp.documentationLinks,\n remote: comp.remote,\n })\n );\n\n const componentSets: FigmaComponent[] = Object.entries(data.componentSets || {}).map(\n ([nodeId, comp]) => ({\n key: comp.key,\n name: comp.name,\n description: comp.description,\n file_key: fileKey,\n node_id: nodeId,\n documentationLinks: comp.documentationLinks,\n remote: comp.remote,\n })\n );\n\n return {\n components,\n componentSets,\n fileName: data.name,\n };\n }\n\n /**\n * Fetch variants for specific component sets.\n * Uses the /v1/files/:key/nodes endpoint to get children of component sets.\n */\n async getComponentSetVariants(\n fileKey: string,\n componentSets: FigmaComponent[]\n ): Promise<FigmaComponentSetWithVariants[]> {\n if (componentSets.length === 0) {\n return [];\n }\n\n // Fetch nodes for all component sets\n const nodeIds = componentSets.map((cs) => cs.node_id).join(',');\n const apiUrl = `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${nodeIds}`;\n\n const response = await fetch(apiUrl, {\n headers: {\n 'X-Figma-Token': this.accessToken,\n },\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => 'Unknown error');\n throw new FigmaError(\n `Figma API error (${response.status}): ${errorBody}`,\n 'API_ERROR'\n );\n }\n\n // Use official GetFileNodesResponse type\n const data = (await response.json()) as GetFileNodesResponse;\n\n const results: FigmaComponentSetWithVariants[] = [];\n\n for (const componentSet of componentSets) {\n const nodeData = data.nodes[componentSet.node_id];\n if (!nodeData?.document) {\n continue;\n }\n\n // Type guard: check if document has children (ComponentSetNode does)\n const doc = nodeData.document as FigmaAPINode & { children?: FigmaAPINode[] };\n if (!doc.children) {\n continue;\n }\n\n const variants: FigmaVariant[] = [];\n\n for (const child of doc.children) {\n // Only process COMPONENT type nodes (the variants)\n if (child.type !== 'COMPONENT') {\n continue;\n }\n\n // Parse the variant name (e.g., \"State=Primary, Size=Medium\")\n const properties = this.parseVariantName(child.name);\n const values = Object.values(properties);\n\n variants.push({\n node_id: child.id,\n name: child.name,\n properties,\n values,\n });\n }\n\n results.push({\n componentSet,\n variants,\n });\n }\n\n return results;\n }\n\n /**\n * Parse a Figma variant name into properties.\n * \"State=Primary, Size=Medium\" → { State: \"Primary\", Size: \"Medium\" }\n */\n parseVariantName(name: string): Record<string, string> {\n const properties: Record<string, string> = {};\n\n // Split by comma and parse each property\n const parts = name.split(',').map((p) => p.trim());\n\n for (const part of parts) {\n const eqIndex = part.indexOf('=');\n if (eqIndex > 0) {\n const key = part.slice(0, eqIndex).trim();\n const value = part.slice(eqIndex + 1).trim();\n properties[key] = value;\n }\n }\n\n return properties;\n }\n\n /**\n * Build a Figma URL for a specific node in a file.\n */\n buildNodeUrl(fileKey: string, nodeId: string, fileName?: string): string {\n // URL-encode the node ID (: -> %3A, - is fine)\n const encodedNodeId = encodeURIComponent(nodeId);\n const name = fileName ? encodeURIComponent(fileName.replace(/\\s+/g, '-')) : 'Design';\n return `https://www.figma.com/design/${fileKey}/${name}?node-id=${encodedNodeId}`;\n }\n\n /**\n * Fetch design properties from a Figma node.\n * Extracts colors, typography, spacing, borders, shadows, etc.\n */\n async getNodeProperties(\n fileKey: string,\n nodeId: string\n ): Promise<FigmaDesignProperties> {\n const apiNodeId = nodeId.replace(/-/g, ':');\n const apiUrl = `https://api.figma.com/v1/files/${fileKey}/nodes?ids=${apiNodeId}`;\n\n const response = await fetch(apiUrl, {\n headers: {\n 'X-Figma-Token': this.accessToken,\n },\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => 'Unknown error');\n throw new FigmaError(\n `Figma API error (${response.status}): ${errorBody}`,\n 'API_ERROR'\n );\n }\n\n const data = (await response.json()) as GetFileNodesResponse;\n const nodeData = data.nodes[apiNodeId];\n\n if (!nodeData?.document) {\n throw new FigmaError(\n `Node not found: ${nodeId}`,\n 'NOT_FOUND',\n 'Verify the node ID is correct'\n );\n }\n\n const node = nodeData.document as FigmaAPINode & Record<string, unknown>;\n\n // Extract design properties from the node\n const properties: FigmaDesignProperties = {\n nodeId: node.id,\n name: node.name,\n type: node.type,\n };\n\n // Dimensions\n if ('absoluteBoundingBox' in node) {\n const bbox = node.absoluteBoundingBox as { width?: number; height?: number };\n properties.width = bbox?.width;\n properties.height = bbox?.height;\n }\n\n // Fills (background colors)\n if ('fills' in node && Array.isArray(node.fills)) {\n properties.fills = (node.fills as FigmaFill[]).filter((f) => f.visible !== false);\n }\n\n // Strokes (borders)\n if ('strokes' in node && Array.isArray(node.strokes)) {\n properties.strokes = (node.strokes as FigmaStroke[]).filter((s) => s.visible !== false);\n }\n if ('strokeWeight' in node) {\n properties.strokeWeight = node.strokeWeight as number;\n }\n if ('strokeAlign' in node) {\n properties.strokeAlign = node.strokeAlign as 'INSIDE' | 'CENTER' | 'OUTSIDE';\n }\n\n // Corner radius\n if ('cornerRadius' in node) {\n properties.cornerRadius = node.cornerRadius as number;\n }\n if ('topLeftRadius' in node) {\n properties.topLeftRadius = node.topLeftRadius as number;\n }\n if ('topRightRadius' in node) {\n properties.topRightRadius = node.topRightRadius as number;\n }\n if ('bottomLeftRadius' in node) {\n properties.bottomLeftRadius = node.bottomLeftRadius as number;\n }\n if ('bottomRightRadius' in node) {\n properties.bottomRightRadius = node.bottomRightRadius as number;\n }\n\n // Effects (shadows, blur)\n if ('effects' in node && Array.isArray(node.effects)) {\n properties.effects = (node.effects as FigmaEffect[]).filter((e) => e.visible !== false);\n }\n\n // Typography (for text nodes)\n if (node.type === 'TEXT') {\n const fontName = node.fontName as { family?: string; style?: string } | undefined;\n const fontSize = node.fontSize as number | undefined;\n const lineHeight = node.lineHeight as { value?: number; unit?: 'PIXELS' | 'PERCENT' | 'AUTO' } | undefined;\n const letterSpacing = node.letterSpacing as number | undefined;\n const textAlignHorizontal = node.textAlignHorizontal as 'LEFT' | 'CENTER' | 'RIGHT' | 'JUSTIFIED' | undefined;\n\n if (fontName && fontSize) {\n properties.typography = {\n fontFamily: fontName.family || 'sans-serif',\n fontStyle: fontName.style || 'Regular',\n fontSize,\n lineHeight: lineHeight ? { value: lineHeight.value || 0, unit: lineHeight.unit || 'AUTO' } : undefined,\n letterSpacing,\n textAlignHorizontal,\n };\n }\n }\n\n // Auto-layout padding\n if ('paddingTop' in node || 'paddingRight' in node || 'paddingBottom' in node || 'paddingLeft' in node) {\n properties.padding = {\n top: node.paddingTop as number | undefined,\n right: node.paddingRight as number | undefined,\n bottom: node.paddingBottom as number | undefined,\n left: node.paddingLeft as number | undefined,\n };\n }\n if ('itemSpacing' in node) {\n properties.itemSpacing = node.itemSpacing as number;\n }\n\n // Opacity\n if ('opacity' in node) {\n properties.opacity = node.opacity as number;\n }\n\n return properties;\n }\n\n /**\n * Convert Figma design properties to CSS-formatted values.\n */\n convertToCSS(props: FigmaDesignProperties): CSSDesignProperties {\n const css: CSSDesignProperties = {};\n\n // Background color (first visible solid fill)\n if (props.fills && props.fills.length > 0) {\n const solidFill = props.fills.find(\n (f) => f.type === 'SOLID' && f.color && f.visible !== false\n );\n if (solidFill?.color) {\n css.backgroundColor = this.colorToCSS(solidFill.color, solidFill.opacity);\n }\n }\n\n // Border color (first visible solid stroke)\n if (props.strokes && props.strokes.length > 0) {\n const solidStroke = props.strokes.find(\n (s) => s.type === 'SOLID' && s.color && s.visible !== false\n );\n if (solidStroke?.color) {\n css.borderColor = this.colorToCSS(solidStroke.color, solidStroke.opacity);\n }\n }\n\n // Border width\n if (props.strokeWeight !== undefined) {\n css.borderWidth = `${props.strokeWeight}px`;\n }\n\n // Border radius\n if (props.cornerRadius !== undefined) {\n css.borderRadius = `${props.cornerRadius}px`;\n } else if (\n props.topLeftRadius !== undefined ||\n props.topRightRadius !== undefined ||\n props.bottomRightRadius !== undefined ||\n props.bottomLeftRadius !== undefined\n ) {\n css.borderRadius = `${props.topLeftRadius || 0}px ${props.topRightRadius || 0}px ${props.bottomRightRadius || 0}px ${props.bottomLeftRadius || 0}px`;\n }\n\n // Box shadow (visible drop shadows only)\n if (props.effects && props.effects.length > 0) {\n const shadows = props.effects\n .filter(\n (e) =>\n e.type === 'DROP_SHADOW' &&\n e.color &&\n e.offset &&\n e.visible !== false\n )\n .map((e) => {\n const color = this.colorToCSS(e.color!, 1);\n const x = e.offset?.x || 0;\n const y = e.offset?.y || 0;\n const blur = e.radius || 0;\n const spread = e.spread || 0;\n return `${x}px ${y}px ${blur}px ${spread}px ${color}`;\n });\n\n if (shadows.length > 0) {\n css.boxShadow = shadows.join(', ');\n }\n }\n\n // Typography\n if (props.typography) {\n css.fontFamily = props.typography.fontFamily;\n css.fontSize = `${props.typography.fontSize}px`;\n\n // Map font style to weight\n const styleToWeight: Record<string, string> = {\n Thin: '100',\n ExtraLight: '200',\n Light: '300',\n Regular: '400',\n Medium: '500',\n SemiBold: '600',\n Bold: '700',\n ExtraBold: '800',\n Black: '900',\n };\n css.fontWeight = styleToWeight[props.typography.fontStyle] || '400';\n\n if (props.typography.lineHeight) {\n if (props.typography.lineHeight.unit === 'PIXELS') {\n css.lineHeight = `${props.typography.lineHeight.value}px`;\n } else if (props.typography.lineHeight.unit === 'PERCENT') {\n css.lineHeight = `${props.typography.lineHeight.value}%`;\n }\n }\n\n if (props.typography.letterSpacing !== undefined) {\n css.letterSpacing = `${props.typography.letterSpacing}px`;\n }\n\n if (props.typography.textAlignHorizontal) {\n css.textAlign = props.typography.textAlignHorizontal.toLowerCase();\n }\n }\n\n // Padding\n if (props.padding) {\n const { top = 0, right = 0, bottom = 0, left = 0 } = props.padding;\n if (top === right && right === bottom && bottom === left) {\n css.padding = `${top}px`;\n } else if (top === bottom && left === right) {\n css.padding = `${top}px ${right}px`;\n } else {\n css.padding = `${top}px ${right}px ${bottom}px ${left}px`;\n }\n }\n\n // Gap\n if (props.itemSpacing !== undefined) {\n css.gap = `${props.itemSpacing}px`;\n }\n\n // Opacity\n if (props.opacity !== undefined && props.opacity !== 1) {\n css.opacity = props.opacity.toFixed(2);\n }\n\n // Dimensions\n if (props.width !== undefined) {\n css.width = `${Math.round(props.width)}px`;\n }\n if (props.height !== undefined) {\n css.height = `${Math.round(props.height)}px`;\n }\n\n return css;\n }\n\n /**\n * Convert Figma RGBA color (0-1 range) to CSS rgba() string.\n */\n colorToCSS(color: FigmaColor, opacity?: number): string {\n const r = Math.round(color.r * 255);\n const g = Math.round(color.g * 255);\n const b = Math.round(color.b * 255);\n const a = opacity !== undefined ? opacity * color.a : color.a;\n\n if (a === 1) {\n // Use hex for fully opaque colors\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n }\n\n return `rgba(${r}, ${g}, ${b}, ${a.toFixed(2)})`;\n }\n\n /**\n * Fetch image URL from Figma API\n */\n private async fetchImageUrl(\n fileKey: string,\n nodeId: string,\n scale: number,\n format: string\n ): Promise<string> {\n // Figma API expects node IDs with colons, but URLs may use dashes\n // Both formats should work, but let's normalize to what Figma expects\n const apiNodeId = nodeId.replace(/-/g, ':');\n\n const apiUrl = new URL(`https://api.figma.com/v1/images/${fileKey}`);\n apiUrl.searchParams.set('ids', apiNodeId);\n apiUrl.searchParams.set('scale', scale.toString());\n apiUrl.searchParams.set('format', format);\n\n const response = await fetch(apiUrl.toString(), {\n headers: {\n 'X-Figma-Token': this.accessToken,\n },\n });\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => 'Unknown error');\n\n if (response.status === 403) {\n throw new FigmaError(\n 'Figma access denied',\n 'ACCESS_DENIED',\n 'Check your access token and ensure the file is shared with you'\n );\n }\n\n if (response.status === 404) {\n throw new FigmaError(\n `Figma file or node not found: ${fileKey}/${nodeId}`,\n 'NOT_FOUND',\n 'Verify the file key and node ID are correct'\n );\n }\n\n throw new FigmaError(\n `Figma API error (${response.status}): ${errorBody}`,\n 'API_ERROR'\n );\n }\n\n const data = await response.json() as {\n images: Record<string, string | null>;\n err?: string;\n };\n\n if (data.err) {\n throw new FigmaError(\n `Figma API error: ${data.err}`,\n 'API_ERROR'\n );\n }\n\n // The images object uses the node ID as key\n const imageUrl = data.images[apiNodeId];\n\n if (!imageUrl) {\n throw new FigmaError(\n `No image returned for node ${nodeId}`,\n 'NO_IMAGE',\n 'The node may not be exportable or may be empty'\n );\n }\n\n return imageUrl;\n }\n\n /**\n * Download image from CDN URL\n */\n private async downloadImage(url: string): Promise<Buffer> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new FigmaError(\n `Failed to download Figma image: ${response.status}`,\n 'DOWNLOAD_ERROR',\n 'The CDN URL may have expired. Try again.'\n );\n }\n\n const arrayBuffer = await response.arrayBuffer();\n return Buffer.from(arrayBuffer);\n }\n}\n\n/**\n * Error class for Figma-related errors\n */\nexport class FigmaError extends ServiceError {\n constructor(message: string, code: string, suggestion?: string) {\n super(message, code, suggestion);\n this.name = `${BRAND.name}FigmaError`;\n }\n}\n\n/**\n * Create a FigmaClient instance\n */\nexport function createFigmaClient(accessToken: string): FigmaClient {\n return new FigmaClient({ accessToken });\n}\n","/**\n * Analytics engine for design system insights.\n *\n * Analyzes compiled segments to provide:\n * - Component inventory stats\n * - Documentation coverage\n * - Usage pattern insights\n * - Quality scores\n */\n\nimport type { CompiledSegmentsFile, CompiledSegment } from \"../core/index.js\";\n\n/**\n * Overall design system analytics\n */\nexport interface DesignSystemAnalytics {\n /** When the analysis was performed */\n analyzedAt: Date;\n\n /** Summary metrics */\n summary: {\n totalComponents: number;\n totalVariants: number;\n totalProps: number;\n categories: string[];\n overallScore: number; // 0-100\n };\n\n /** Component inventory */\n inventory: ComponentInventory;\n\n /** Documentation coverage */\n coverage: CoverageAnalytics;\n\n /** Quality insights */\n quality: QualityAnalytics;\n\n /** Distribution charts data */\n distribution: DistributionAnalytics;\n\n /** Recommendations for improvement */\n recommendations: Recommendation[];\n}\n\n/**\n * Component inventory breakdown\n */\nexport interface ComponentInventory {\n /** Components by category */\n byCategory: Record<string, ComponentSummary[]>;\n\n /** Components by status */\n byStatus: Record<string, ComponentSummary[]>;\n\n /** Components sorted by variant count (most to least) */\n byVariantCount: ComponentSummary[];\n\n /** Components sorted by prop count */\n byPropCount: ComponentSummary[];\n}\n\n/**\n * Summary info for a single component\n */\nexport interface ComponentSummary {\n name: string;\n category: string;\n status: string;\n variantCount: number;\n propCount: number;\n hasUsageWhen: boolean;\n hasUsageWhenNot: boolean;\n hasGuidelines: boolean;\n hasRelations: boolean;\n documentationScore: number; // 0-100\n}\n\n/**\n * Documentation coverage analytics\n */\nexport interface CoverageAnalytics {\n /** Overall coverage percentage */\n overall: number;\n\n /** Coverage by field */\n fields: {\n description: { covered: number; total: number; percentage: number };\n usageWhen: { covered: number; total: number; percentage: number };\n usageWhenNot: { covered: number; total: number; percentage: number };\n guidelines: { covered: number; total: number; percentage: number };\n accessibility: { covered: number; total: number; percentage: number };\n relations: { covered: number; total: number; percentage: number };\n propDescriptions: { covered: number; total: number; percentage: number };\n propConstraints: { covered: number; total: number; percentage: number };\n };\n\n /** Components with incomplete documentation */\n incomplete: Array<{\n component: string;\n missing: string[];\n }>;\n}\n\n/**\n * Quality insights\n */\nexport interface QualityAnalytics {\n /** Components with no whenNot guidance (anti-patterns) */\n missingWhenNot: string[];\n\n /** Components with no relations defined */\n isolated: string[];\n\n /** Deprecated components still in use */\n deprecated: string[];\n\n /** Components with very few variants (might need more examples) */\n fewVariants: string[];\n\n /** Props without descriptions */\n undocumentedProps: Array<{ component: string; prop: string }>;\n\n /** Props without constraints (might need validation rules) */\n unconstrainedProps: Array<{ component: string; prop: string }>;\n}\n\n/**\n * Distribution data for charts\n */\nexport interface DistributionAnalytics {\n /** Variants per component distribution */\n variantsPerComponent: Array<{ name: string; count: number }>;\n\n /** Props per component distribution */\n propsPerComponent: Array<{ name: string; count: number }>;\n\n /** Components per category */\n componentsPerCategory: Array<{ category: string; count: number }>;\n\n /** Status distribution */\n statusDistribution: Array<{ status: string; count: number }>;\n\n /** Tag frequency */\n tagFrequency: Array<{ tag: string; count: number }>;\n}\n\n/**\n * Actionable recommendation\n */\nexport interface Recommendation {\n priority: \"high\" | \"medium\" | \"low\";\n category: \"documentation\" | \"coverage\" | \"quality\" | \"organization\";\n title: string;\n description: string;\n components?: string[];\n impact: string;\n}\n\n/**\n * Analyze a compiled segments file and produce analytics\n */\nexport function analyzeDesignSystem(\n data: CompiledSegmentsFile\n): DesignSystemAnalytics {\n const segments = Object.values(data.segments);\n const analyzedAt = new Date();\n\n // Build component summaries\n const summaries = segments.map((s) => buildComponentSummary(s));\n\n // Calculate coverage\n const coverage = calculateCoverage(segments, summaries);\n\n // Calculate quality insights\n const quality = calculateQuality(segments, summaries);\n\n // Build distribution data\n const distribution = buildDistribution(segments, summaries);\n\n // Build inventory\n const inventory = buildInventory(summaries);\n\n // Generate recommendations\n const recommendations = generateRecommendations(coverage, quality, summaries);\n\n // Calculate overall score\n const overallScore = calculateOverallScore(coverage, quality, summaries);\n\n // Collect all categories\n const categories = [...new Set(segments.map((s) => s.meta.category))].sort();\n\n return {\n analyzedAt,\n summary: {\n totalComponents: segments.length,\n totalVariants: segments.reduce((sum, s) => sum + s.variants.length, 0),\n totalProps: segments.reduce(\n (sum, s) => sum + Object.keys(s.props ?? {}).length,\n 0\n ),\n categories,\n overallScore,\n },\n inventory,\n coverage,\n quality,\n distribution,\n recommendations,\n };\n}\n\n/**\n * Build summary for a single component\n */\nfunction buildComponentSummary(segment: CompiledSegment): ComponentSummary {\n const propCount = Object.keys(segment.props ?? {}).length;\n const hasUsageWhen = (segment.usage?.when?.length ?? 0) > 0;\n const hasUsageWhenNot = (segment.usage?.whenNot?.length ?? 0) > 0;\n const hasGuidelines = (segment.usage?.guidelines?.length ?? 0) > 0;\n const hasRelations = (segment.relations?.length ?? 0) > 0;\n\n // Calculate documentation score\n let docScore = 0;\n let docTotal = 0;\n\n // Description (20 points)\n docTotal += 20;\n if (segment.meta.description && segment.meta.description.length > 20) {\n docScore += 20;\n }\n\n // Usage when (20 points)\n docTotal += 20;\n if (hasUsageWhen) docScore += 20;\n\n // Usage whenNot (20 points) - key differentiator\n docTotal += 20;\n if (hasUsageWhenNot) docScore += 20;\n\n // Guidelines (15 points)\n docTotal += 15;\n if (hasGuidelines) docScore += 15;\n\n // Relations (10 points)\n docTotal += 10;\n if (hasRelations) docScore += 10;\n\n // Props documented (15 points)\n docTotal += 15;\n if (propCount > 0) {\n const documentedProps = Object.values(segment.props ?? {}).filter(\n (p) => p.description && p.description.length > 5\n ).length;\n docScore += Math.round((documentedProps / propCount) * 15);\n } else {\n docScore += 15; // No props = full score for this section\n }\n\n return {\n name: segment.meta.name,\n category: segment.meta.category,\n status: segment.meta.status ?? \"stable\",\n variantCount: segment.variants.length,\n propCount,\n hasUsageWhen,\n hasUsageWhenNot,\n hasGuidelines,\n hasRelations,\n documentationScore: Math.round((docScore / docTotal) * 100),\n };\n}\n\n/**\n * Calculate coverage analytics\n */\nfunction calculateCoverage(\n segments: CompiledSegment[],\n summaries: ComponentSummary[]\n): CoverageAnalytics {\n const total = segments.length;\n\n const fields = {\n description: {\n covered: segments.filter(\n (s) => s.meta.description && s.meta.description.length > 10\n ).length,\n total,\n percentage: 0,\n },\n usageWhen: {\n covered: summaries.filter((s) => s.hasUsageWhen).length,\n total,\n percentage: 0,\n },\n usageWhenNot: {\n covered: summaries.filter((s) => s.hasUsageWhenNot).length,\n total,\n percentage: 0,\n },\n guidelines: {\n covered: summaries.filter((s) => s.hasGuidelines).length,\n total,\n percentage: 0,\n },\n accessibility: {\n covered: segments.filter((s) => (s.usage?.accessibility?.length ?? 0) > 0)\n .length,\n total,\n percentage: 0,\n },\n relations: {\n covered: summaries.filter((s) => s.hasRelations).length,\n total,\n percentage: 0,\n },\n propDescriptions: {\n covered: 0,\n total: 0,\n percentage: 0,\n },\n propConstraints: {\n covered: 0,\n total: 0,\n percentage: 0,\n },\n };\n\n // Calculate prop coverage\n for (const segment of segments) {\n const props = Object.values(segment.props ?? {});\n fields.propDescriptions.total += props.length;\n fields.propConstraints.total += props.length;\n\n fields.propDescriptions.covered += props.filter(\n (p) => p.description && p.description.length > 5\n ).length;\n fields.propConstraints.covered += props.filter(\n (p) => (p.constraints?.length ?? 0) > 0\n ).length;\n }\n\n // Calculate percentages\n for (const field of Object.values(fields)) {\n field.percentage =\n field.total > 0 ? Math.round((field.covered / field.total) * 100) : 100;\n }\n\n // Find incomplete components\n const incomplete: CoverageAnalytics[\"incomplete\"] = [];\n for (const summary of summaries) {\n const missing: string[] = [];\n if (!summary.hasUsageWhen) missing.push(\"usage.when\");\n if (!summary.hasUsageWhenNot) missing.push(\"usage.whenNot\");\n if (!summary.hasGuidelines) missing.push(\"usage.guidelines\");\n if (!summary.hasRelations) missing.push(\"relations\");\n\n if (missing.length > 0) {\n incomplete.push({ component: summary.name, missing });\n }\n }\n\n // Overall coverage (weighted average)\n const overall = Math.round(\n fields.description.percentage * 0.1 +\n fields.usageWhen.percentage * 0.2 +\n fields.usageWhenNot.percentage * 0.25 +\n fields.guidelines.percentage * 0.15 +\n fields.relations.percentage * 0.1 +\n fields.propDescriptions.percentage * 0.15 +\n fields.propConstraints.percentage * 0.05\n );\n\n return { overall, fields, incomplete };\n}\n\n/**\n * Calculate quality analytics\n */\nfunction calculateQuality(\n segments: CompiledSegment[],\n summaries: ComponentSummary[]\n): QualityAnalytics {\n const missingWhenNot = summaries\n .filter((s) => !s.hasUsageWhenNot)\n .map((s) => s.name);\n\n const isolated = summaries\n .filter((s) => !s.hasRelations)\n .map((s) => s.name);\n\n const deprecated = summaries\n .filter((s) => s.status === \"deprecated\")\n .map((s) => s.name);\n\n const fewVariants = summaries\n .filter((s) => s.variantCount < 2)\n .map((s) => s.name);\n\n const undocumentedProps: QualityAnalytics[\"undocumentedProps\"] = [];\n const unconstrainedProps: QualityAnalytics[\"unconstrainedProps\"] = [];\n\n for (const segment of segments) {\n for (const [propName, prop] of Object.entries(segment.props ?? {})) {\n if (!prop.description || prop.description.length < 5) {\n undocumentedProps.push({ component: segment.meta.name, prop: propName });\n }\n if (\n (prop.constraints?.length ?? 0) === 0 &&\n prop.type !== \"boolean\" &&\n prop.type !== \"function\"\n ) {\n unconstrainedProps.push({\n component: segment.meta.name,\n prop: propName,\n });\n }\n }\n }\n\n return {\n missingWhenNot,\n isolated,\n deprecated,\n fewVariants,\n undocumentedProps,\n unconstrainedProps,\n };\n}\n\n/**\n * Build distribution data for charts\n */\nfunction buildDistribution(\n segments: CompiledSegment[],\n summaries: ComponentSummary[]\n): DistributionAnalytics {\n // Variants per component\n const variantsPerComponent = summaries\n .map((s) => ({ name: s.name, count: s.variantCount }))\n .sort((a, b) => b.count - a.count);\n\n // Props per component\n const propsPerComponent = summaries\n .map((s) => ({ name: s.name, count: s.propCount }))\n .sort((a, b) => b.count - a.count);\n\n // Components per category\n const categoryMap = new Map<string, number>();\n for (const s of summaries) {\n categoryMap.set(s.category, (categoryMap.get(s.category) ?? 0) + 1);\n }\n const componentsPerCategory = Array.from(categoryMap.entries())\n .map(([category, count]) => ({ category, count }))\n .sort((a, b) => b.count - a.count);\n\n // Status distribution\n const statusMap = new Map<string, number>();\n for (const s of summaries) {\n statusMap.set(s.status, (statusMap.get(s.status) ?? 0) + 1);\n }\n const statusDistribution = Array.from(statusMap.entries())\n .map(([status, count]) => ({ status, count }))\n .sort((a, b) => b.count - a.count);\n\n // Tag frequency\n const tagMap = new Map<string, number>();\n for (const segment of segments) {\n for (const tag of segment.meta.tags ?? []) {\n tagMap.set(tag, (tagMap.get(tag) ?? 0) + 1);\n }\n }\n const tagFrequency = Array.from(tagMap.entries())\n .map(([tag, count]) => ({ tag, count }))\n .sort((a, b) => b.count - a.count);\n\n return {\n variantsPerComponent,\n propsPerComponent,\n componentsPerCategory,\n statusDistribution,\n tagFrequency,\n };\n}\n\n/**\n * Build inventory breakdown\n */\nfunction buildInventory(summaries: ComponentSummary[]): ComponentInventory {\n const byCategory: Record<string, ComponentSummary[]> = {};\n const byStatus: Record<string, ComponentSummary[]> = {};\n\n for (const summary of summaries) {\n if (!byCategory[summary.category]) {\n byCategory[summary.category] = [];\n }\n byCategory[summary.category].push(summary);\n\n if (!byStatus[summary.status]) {\n byStatus[summary.status] = [];\n }\n byStatus[summary.status].push(summary);\n }\n\n // Sort within each group by name\n for (const list of Object.values(byCategory)) {\n list.sort((a, b) => a.name.localeCompare(b.name));\n }\n for (const list of Object.values(byStatus)) {\n list.sort((a, b) => a.name.localeCompare(b.name));\n }\n\n return {\n byCategory,\n byStatus,\n byVariantCount: [...summaries].sort((a, b) => b.variantCount - a.variantCount),\n byPropCount: [...summaries].sort((a, b) => b.propCount - a.propCount),\n };\n}\n\n/**\n * Generate actionable recommendations\n */\nfunction generateRecommendations(\n coverage: CoverageAnalytics,\n quality: QualityAnalytics,\n summaries: ComponentSummary[]\n): Recommendation[] {\n const recommendations: Recommendation[] = [];\n\n // High priority: Missing whenNot guidance\n if (quality.missingWhenNot.length > 0) {\n recommendations.push({\n priority: \"high\",\n category: \"documentation\",\n title: 'Add \"When NOT to use\" guidance',\n description: `${quality.missingWhenNot.length} component(s) lack guidance on when NOT to use them. This is critical for AI agents to make correct component choices.`,\n components: quality.missingWhenNot.slice(0, 5),\n impact: \"Prevents AI from using components incorrectly\",\n });\n }\n\n // High priority: Low overall coverage\n if (coverage.overall < 70) {\n recommendations.push({\n priority: \"high\",\n category: \"coverage\",\n title: \"Improve documentation coverage\",\n description: `Overall documentation coverage is ${coverage.overall}%. Aim for at least 80% for effective AI assistance.`,\n impact: \"Better AI understanding and suggestions\",\n });\n }\n\n // Medium priority: Isolated components\n if (quality.isolated.length > summaries.length * 0.3) {\n recommendations.push({\n priority: \"medium\",\n category: \"organization\",\n title: \"Add component relationships\",\n description: `${quality.isolated.length} component(s) have no relationships defined. Adding relations helps AI understand component ecosystems.`,\n components: quality.isolated.slice(0, 5),\n impact: \"Better alternative suggestions\",\n });\n }\n\n // Medium priority: Few variants\n if (quality.fewVariants.length > 0) {\n recommendations.push({\n priority: \"medium\",\n category: \"coverage\",\n title: \"Add more variant examples\",\n description: `${quality.fewVariants.length} component(s) have fewer than 2 variants. More examples help demonstrate component flexibility.`,\n components: quality.fewVariants.slice(0, 5),\n impact: \"Better visual documentation\",\n });\n }\n\n // Low priority: Undocumented props\n if (quality.undocumentedProps.length > 0) {\n recommendations.push({\n priority: \"low\",\n category: \"documentation\",\n title: \"Document prop descriptions\",\n description: `${quality.undocumentedProps.length} prop(s) lack descriptions. Clear descriptions help AI generate correct code.`,\n impact: \"Clearer API documentation\",\n });\n }\n\n // Low priority: No constraints\n if (quality.unconstrainedProps.length > 5) {\n recommendations.push({\n priority: \"low\",\n category: \"quality\",\n title: \"Add prop constraints\",\n description: `${quality.unconstrainedProps.length} prop(s) could benefit from constraint documentation (validation rules, best practices).`,\n impact: \"Better AI adherence to design rules\",\n });\n }\n\n return recommendations;\n}\n\n/**\n * Calculate overall design system quality score\n */\nfunction calculateOverallScore(\n coverage: CoverageAnalytics,\n quality: QualityAnalytics,\n summaries: ComponentSummary[]\n): number {\n // Base: coverage score (50%)\n let score = coverage.overall * 0.5;\n\n // Component documentation scores (30%)\n const avgDocScore =\n summaries.reduce((sum, s) => sum + s.documentationScore, 0) /\n Math.max(summaries.length, 1);\n score += avgDocScore * 0.3;\n\n // Quality penalties (20%)\n let qualityScore = 100;\n\n // Penalize missing whenNot (most important)\n const missingWhenNotRatio =\n quality.missingWhenNot.length / Math.max(summaries.length, 1);\n qualityScore -= missingWhenNotRatio * 40;\n\n // Penalize isolated components\n const isolatedRatio = quality.isolated.length / Math.max(summaries.length, 1);\n qualityScore -= isolatedRatio * 20;\n\n // Penalize few variants\n const fewVariantsRatio =\n quality.fewVariants.length / Math.max(summaries.length, 1);\n qualityScore -= fewVariantsRatio * 10;\n\n score += Math.max(qualityScore, 0) * 0.2;\n\n return Math.round(Math.max(Math.min(score, 100), 0));\n}\n\n/**\n * Get a letter grade from a numeric score\n */\nexport function getGrade(score: number): string {\n if (score >= 90) return \"A\";\n if (score >= 80) return \"B\";\n if (score >= 70) return \"C\";\n if (score >= 60) return \"D\";\n return \"F\";\n}\n\n/**\n * Get a color for a score (for HTML reports)\n */\nexport function getScoreColor(score: number): string {\n if (score >= 80) return \"#22c55e\"; // green\n if (score >= 60) return \"#eab308\"; // yellow\n return \"#ef4444\"; // red\n}\n","/**\n * HTML Report Generator\n *\n * Generates a beautiful, standalone HTML report from analytics data.\n * No external dependencies - everything is inlined.\n */\n\nimport { BRAND } from \"../core/index.js\";\nimport type {\n DesignSystemAnalytics,\n ComponentSummary,\n Recommendation,\n} from \"./analytics.js\";\nimport { getGrade, getScoreColor } from \"./analytics.js\";\n\n/**\n * Generate a complete HTML report from analytics data\n */\nexport function generateHtmlReport(analytics: DesignSystemAnalytics): string {\n const { summary, coverage, quality, distribution, recommendations, inventory } =\n analytics;\n\n const grade = getGrade(summary.overallScore);\n const gradeColor = getScoreColor(summary.overallScore);\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>${BRAND.name} Design System Report</title>\n <style>\n ${getStyles()}\n </style>\n</head>\n<body>\n <div class=\"container\">\n ${renderHeader(summary, grade, gradeColor, analytics.analyzedAt)}\n ${renderSummaryCards(summary, coverage)}\n ${renderCoverageSection(coverage)}\n ${renderRecommendations(recommendations)}\n ${renderComponentTable(inventory.byCategory)}\n ${renderDistributionCharts(distribution)}\n ${renderQualityIssues(quality)}\n ${renderFooter()}\n </div>\n <script>\n ${getScripts()}\n </script>\n</body>\n</html>`;\n}\n\n/**\n * Get CSS styles\n */\nfunction getStyles(): string {\n return `\n :root {\n --bg: #0a0a0a;\n --bg-card: #141414;\n --bg-hover: #1a1a1a;\n --border: #262626;\n --text: #fafafa;\n --text-secondary: #a1a1aa;\n --text-muted: #71717a;\n --accent: #10b981;\n --accent-light: #34d399;\n --danger: #ef4444;\n --warning: #eab308;\n --success: #22c55e;\n --radius: 12px;\n }\n\n * {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n }\n\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n background: var(--bg);\n color: var(--text);\n line-height: 1.6;\n -webkit-font-smoothing: antialiased;\n }\n\n .container {\n max-width: 1200px;\n margin: 0 auto;\n padding: 48px 24px;\n }\n\n /* Header */\n .header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 48px;\n padding-bottom: 32px;\n border-bottom: 1px solid var(--border);\n }\n\n .header-left h1 {\n font-size: 32px;\n font-weight: 700;\n margin-bottom: 8px;\n background: linear-gradient(135deg, var(--text), var(--accent));\n -webkit-background-clip: text;\n -webkit-text-fill-color: transparent;\n }\n\n .header-left p {\n color: var(--text-secondary);\n font-size: 14px;\n }\n\n .grade-badge {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 24px 32px;\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n }\n\n .grade-letter {\n font-size: 64px;\n font-weight: 800;\n line-height: 1;\n }\n\n .grade-score {\n font-size: 14px;\n color: var(--text-secondary);\n margin-top: 8px;\n }\n\n /* Summary Cards */\n .summary-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n gap: 16px;\n margin-bottom: 48px;\n }\n\n .summary-card {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 24px;\n }\n\n .summary-card-label {\n font-size: 13px;\n color: var(--text-muted);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 8px;\n }\n\n .summary-card-value {\n font-size: 36px;\n font-weight: 700;\n }\n\n .summary-card-sub {\n font-size: 13px;\n color: var(--text-secondary);\n margin-top: 4px;\n }\n\n /* Sections */\n .section {\n margin-bottom: 48px;\n }\n\n .section-title {\n font-size: 20px;\n font-weight: 600;\n margin-bottom: 24px;\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .section-title::before {\n content: '';\n width: 4px;\n height: 24px;\n background: var(--accent);\n border-radius: 2px;\n }\n\n /* Coverage */\n .coverage-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .coverage-item {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n\n .coverage-item-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .coverage-item-name {\n font-size: 14px;\n font-weight: 500;\n }\n\n .coverage-item-value {\n font-size: 14px;\n font-weight: 600;\n }\n\n .coverage-bar {\n height: 8px;\n background: var(--bg);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .coverage-bar-fill {\n height: 100%;\n border-radius: 4px;\n transition: width 0.5s ease;\n }\n\n /* Recommendations */\n .recommendations-list {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .recommendation {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n border-left: 4px solid;\n }\n\n .recommendation.high { border-left-color: var(--danger); }\n .recommendation.medium { border-left-color: var(--warning); }\n .recommendation.low { border-left-color: var(--text-muted); }\n\n .recommendation-header {\n display: flex;\n align-items: center;\n gap: 12px;\n margin-bottom: 8px;\n }\n\n .recommendation-priority {\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .recommendation-priority.high { background: rgba(239, 68, 68, 0.2); color: var(--danger); }\n .recommendation-priority.medium { background: rgba(234, 179, 8, 0.2); color: var(--warning); }\n .recommendation-priority.low { background: rgba(113, 113, 122, 0.2); color: var(--text-muted); }\n\n .recommendation-title {\n font-weight: 600;\n font-size: 15px;\n }\n\n .recommendation-description {\n color: var(--text-secondary);\n font-size: 14px;\n margin-bottom: 12px;\n }\n\n .recommendation-components {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n .component-tag {\n font-size: 12px;\n padding: 4px 10px;\n background: var(--bg);\n border-radius: 6px;\n color: var(--text-secondary);\n }\n\n /* Component Table */\n .category-section {\n margin-bottom: 32px;\n }\n\n .category-header {\n font-size: 14px;\n font-weight: 600;\n color: var(--text-secondary);\n text-transform: uppercase;\n letter-spacing: 0.05em;\n margin-bottom: 12px;\n padding-left: 12px;\n border-left: 2px solid var(--accent);\n }\n\n .component-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));\n gap: 12px;\n }\n\n .component-card {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 16px;\n transition: border-color 0.2s;\n }\n\n .component-card:hover {\n border-color: var(--accent);\n }\n\n .component-card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 8px;\n }\n\n .component-name {\n font-weight: 600;\n font-size: 15px;\n }\n\n .component-score {\n font-size: 13px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 4px;\n }\n\n .component-stats {\n display: flex;\n gap: 16px;\n font-size: 13px;\n color: var(--text-secondary);\n }\n\n .component-badges {\n display: flex;\n gap: 6px;\n margin-top: 8px;\n flex-wrap: wrap;\n }\n\n .badge {\n font-size: 11px;\n padding: 2px 8px;\n border-radius: 4px;\n background: var(--bg);\n }\n\n .badge.success { background: rgba(34, 197, 94, 0.2); color: var(--success); }\n .badge.warning { background: rgba(234, 179, 8, 0.2); color: var(--warning); }\n .badge.error { background: rgba(239, 68, 68, 0.2); color: var(--danger); }\n\n /* Charts */\n .chart-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));\n gap: 24px;\n }\n\n .chart-card {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 24px;\n }\n\n .chart-title {\n font-size: 14px;\n font-weight: 600;\n margin-bottom: 20px;\n }\n\n .bar-chart {\n display: flex;\n flex-direction: column;\n gap: 12px;\n }\n\n .bar-item {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .bar-label {\n width: 100px;\n font-size: 13px;\n color: var(--text-secondary);\n text-align: right;\n flex-shrink: 0;\n }\n\n .bar-track {\n flex: 1;\n height: 24px;\n background: var(--bg);\n border-radius: 6px;\n overflow: hidden;\n position: relative;\n }\n\n .bar-fill {\n height: 100%;\n background: linear-gradient(90deg, var(--accent), var(--accent-light));\n border-radius: 6px;\n display: flex;\n align-items: center;\n justify-content: flex-end;\n padding-right: 8px;\n min-width: fit-content;\n }\n\n .bar-value {\n font-size: 12px;\n font-weight: 600;\n color: white;\n }\n\n /* Quality Issues */\n .issues-grid {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n gap: 16px;\n }\n\n .issue-card {\n background: var(--bg-card);\n border: 1px solid var(--border);\n border-radius: var(--radius);\n padding: 20px;\n }\n\n .issue-card-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 12px;\n }\n\n .issue-title {\n font-size: 14px;\n font-weight: 500;\n }\n\n .issue-count {\n font-size: 13px;\n color: var(--text-secondary);\n }\n\n .issue-list {\n display: flex;\n flex-wrap: wrap;\n gap: 6px;\n }\n\n /* Footer */\n .footer {\n margin-top: 64px;\n padding-top: 32px;\n border-top: 1px solid var(--border);\n text-align: center;\n color: var(--text-muted);\n font-size: 13px;\n }\n\n .footer a {\n color: var(--accent);\n text-decoration: none;\n }\n\n /* Responsive */\n @media (max-width: 768px) {\n .header {\n flex-direction: column;\n gap: 24px;\n }\n\n .grade-badge {\n align-self: flex-start;\n }\n }\n `;\n}\n\n/**\n * Render header section\n */\nfunction renderHeader(\n summary: DesignSystemAnalytics[\"summary\"],\n grade: string,\n gradeColor: string,\n analyzedAt: Date\n): string {\n return `\n <header class=\"header\">\n <div class=\"header-left\">\n <h1>${BRAND.name} Design System Report</h1>\n <p>Generated ${analyzedAt.toLocaleDateString(\"en-US\", {\n weekday: \"long\",\n year: \"numeric\",\n month: \"long\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n })}</p>\n </div>\n <div class=\"grade-badge\">\n <div class=\"grade-letter\" style=\"color: ${gradeColor}\">${grade}</div>\n <div class=\"grade-score\">${summary.overallScore}/100 Overall Score</div>\n </div>\n </header>\n `;\n}\n\n/**\n * Render summary cards\n */\nfunction renderSummaryCards(\n summary: DesignSystemAnalytics[\"summary\"],\n coverage: DesignSystemAnalytics[\"coverage\"]\n): string {\n return `\n <div class=\"summary-grid\">\n <div class=\"summary-card\">\n <div class=\"summary-card-label\">Components</div>\n <div class=\"summary-card-value\">${summary.totalComponents}</div>\n <div class=\"summary-card-sub\">${summary.categories.length} categories</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-card-label\">Variants</div>\n <div class=\"summary-card-value\">${summary.totalVariants}</div>\n <div class=\"summary-card-sub\">~${Math.round(summary.totalVariants / Math.max(summary.totalComponents, 1))} per component</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-card-label\">Props</div>\n <div class=\"summary-card-value\">${summary.totalProps}</div>\n <div class=\"summary-card-sub\">${coverage.fields.propDescriptions.percentage}% documented</div>\n </div>\n <div class=\"summary-card\">\n <div class=\"summary-card-label\">Coverage</div>\n <div class=\"summary-card-value\" style=\"color: ${getScoreColor(coverage.overall)}\">${coverage.overall}%</div>\n <div class=\"summary-card-sub\">Documentation coverage</div>\n </div>\n </div>\n `;\n}\n\n/**\n * Render coverage section\n */\nfunction renderCoverageSection(coverage: DesignSystemAnalytics[\"coverage\"]): string {\n const fields = [\n { name: \"Component Descriptions\", ...coverage.fields.description },\n { name: 'Usage \"When to use\"', ...coverage.fields.usageWhen },\n { name: 'Usage \"When NOT to use\"', ...coverage.fields.usageWhenNot },\n { name: \"Guidelines\", ...coverage.fields.guidelines },\n { name: \"Accessibility Notes\", ...coverage.fields.accessibility },\n { name: \"Component Relations\", ...coverage.fields.relations },\n { name: \"Prop Descriptions\", ...coverage.fields.propDescriptions },\n { name: \"Prop Constraints\", ...coverage.fields.propConstraints },\n ];\n\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Documentation Coverage</h2>\n <div class=\"coverage-grid\">\n ${fields\n .map(\n (field) => `\n <div class=\"coverage-item\">\n <div class=\"coverage-item-header\">\n <span class=\"coverage-item-name\">${field.name}</span>\n <span class=\"coverage-item-value\" style=\"color: ${getScoreColor(field.percentage)}\">${field.covered}/${field.total} (${field.percentage}%)</span>\n </div>\n <div class=\"coverage-bar\">\n <div class=\"coverage-bar-fill\" style=\"width: ${field.percentage}%; background: ${getScoreColor(field.percentage)}\"></div>\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </section>\n `;\n}\n\n/**\n * Render recommendations\n */\nfunction renderRecommendations(recommendations: Recommendation[]): string {\n if (recommendations.length === 0) {\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Recommendations</h2>\n <div class=\"recommendation\" style=\"border-left-color: var(--success)\">\n <div class=\"recommendation-title\">🎉 Great job!</div>\n <div class=\"recommendation-description\">Your design system documentation is in excellent shape. No critical issues found.</div>\n </div>\n </section>\n `;\n }\n\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Recommendations</h2>\n <div class=\"recommendations-list\">\n ${recommendations\n .map(\n (rec) => `\n <div class=\"recommendation ${rec.priority}\">\n <div class=\"recommendation-header\">\n <span class=\"recommendation-priority ${rec.priority}\">${rec.priority}</span>\n <span class=\"recommendation-title\">${rec.title}</span>\n </div>\n <div class=\"recommendation-description\">${rec.description}</div>\n ${\n rec.components && rec.components.length > 0\n ? `\n <div class=\"recommendation-components\">\n ${rec.components.map((c) => `<span class=\"component-tag\">${c}</span>`).join(\"\")}\n ${rec.components.length < (rec.components?.length ?? 0) ? `<span class=\"component-tag\">+${(rec.components?.length ?? 0) - rec.components.length} more</span>` : \"\"}\n </div>\n `\n : \"\"\n }\n </div>\n `\n )\n .join(\"\")}\n </div>\n </section>\n `;\n}\n\n/**\n * Render component table by category\n */\nfunction renderComponentTable(\n byCategory: Record<string, ComponentSummary[]>\n): string {\n const categories = Object.entries(byCategory).sort(([a], [b]) =>\n a.localeCompare(b)\n );\n\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Component Inventory</h2>\n ${categories\n .map(\n ([category, components]) => `\n <div class=\"category-section\">\n <div class=\"category-header\">${category} (${components.length})</div>\n <div class=\"component-grid\">\n ${components\n .map(\n (comp) => `\n <div class=\"component-card\">\n <div class=\"component-card-header\">\n <span class=\"component-name\">${comp.name}</span>\n <span class=\"component-score\" style=\"background: ${getScoreColor(comp.documentationScore)}20; color: ${getScoreColor(comp.documentationScore)}\">${comp.documentationScore}%</span>\n </div>\n <div class=\"component-stats\">\n <span>${comp.variantCount} variants</span>\n <span>${comp.propCount} props</span>\n </div>\n <div class=\"component-badges\">\n ${comp.hasUsageWhen ? '<span class=\"badge success\">✓ when</span>' : '<span class=\"badge error\">✗ when</span>'}\n ${comp.hasUsageWhenNot ? '<span class=\"badge success\">✓ whenNot</span>' : '<span class=\"badge error\">✗ whenNot</span>'}\n ${comp.hasRelations ? '<span class=\"badge success\">✓ relations</span>' : '<span class=\"badge warning\">○ relations</span>'}\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n `\n )\n .join(\"\")}\n </section>\n `;\n}\n\n/**\n * Render distribution charts\n */\nfunction renderDistributionCharts(\n distribution: DesignSystemAnalytics[\"distribution\"]\n): string {\n const maxVariants = Math.max(...distribution.variantsPerComponent.map((d) => d.count), 1);\n const maxCategory = Math.max(...distribution.componentsPerCategory.map((d) => d.count), 1);\n\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Distribution</h2>\n <div class=\"chart-grid\">\n <div class=\"chart-card\">\n <div class=\"chart-title\">Variants per Component</div>\n <div class=\"bar-chart\">\n ${distribution.variantsPerComponent\n .slice(0, 8)\n .map(\n (d) => `\n <div class=\"bar-item\">\n <span class=\"bar-label\">${d.name}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill\" style=\"width: ${(d.count / maxVariants) * 100}%\">\n <span class=\"bar-value\">${d.count}</span>\n </div>\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n <div class=\"chart-card\">\n <div class=\"chart-title\">Components per Category</div>\n <div class=\"bar-chart\">\n ${distribution.componentsPerCategory\n .map(\n (d) => `\n <div class=\"bar-item\">\n <span class=\"bar-label\">${d.category}</span>\n <div class=\"bar-track\">\n <div class=\"bar-fill\" style=\"width: ${(d.count / maxCategory) * 100}%\">\n <span class=\"bar-value\">${d.count}</span>\n </div>\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </div>\n </div>\n </section>\n `;\n}\n\n/**\n * Render quality issues\n */\nfunction renderQualityIssues(quality: DesignSystemAnalytics[\"quality\"]): string {\n const issues = [\n {\n title: \"Missing 'When NOT to use'\",\n items: quality.missingWhenNot,\n severity: \"error\",\n },\n {\n title: \"No Relations Defined\",\n items: quality.isolated,\n severity: \"warning\",\n },\n {\n title: \"Few Variants (<2)\",\n items: quality.fewVariants,\n severity: \"warning\",\n },\n {\n title: \"Deprecated Components\",\n items: quality.deprecated,\n severity: \"error\",\n },\n ].filter((issue) => issue.items.length > 0);\n\n if (issues.length === 0) {\n return \"\";\n }\n\n return `\n <section class=\"section\">\n <h2 class=\"section-title\">Quality Issues</h2>\n <div class=\"issues-grid\">\n ${issues\n .map(\n (issue) => `\n <div class=\"issue-card\">\n <div class=\"issue-card-header\">\n <span class=\"issue-title\">${issue.title}</span>\n <span class=\"issue-count\">${issue.items.length} component(s)</span>\n </div>\n <div class=\"issue-list\">\n ${issue.items\n .slice(0, 10)\n .map((item) => `<span class=\"component-tag\">${item}</span>`)\n .join(\"\")}\n ${issue.items.length > 10 ? `<span class=\"component-tag\">+${issue.items.length - 10} more</span>` : \"\"}\n </div>\n </div>\n `\n )\n .join(\"\")}\n </div>\n </section>\n `;\n}\n\n/**\n * Render footer\n */\nfunction renderFooter(): string {\n return `\n <footer class=\"footer\">\n <p>Generated by <a href=\"#\">${BRAND.name}</a> • AI-first design system documentation</p>\n </footer>\n `;\n}\n\n/**\n * Get JavaScript for interactivity\n */\nfunction getScripts(): string {\n return `\n // Animate bars on load\n document.querySelectorAll('.bar-fill, .coverage-bar-fill').forEach(el => {\n const width = el.style.width;\n el.style.width = '0';\n setTimeout(() => {\n el.style.width = width;\n }, 100);\n });\n `;\n}\n","/**\n * Token Parser\n *\n * Parses CSS/SCSS files to extract CSS custom properties (design tokens).\n * Handles:\n * - CSS custom property declarations (--token-name: value)\n * - Reference resolution (var(--other-token))\n * - Theme detection via selectors\n * - Category inference from naming conventions\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport { resolve, relative } from \"node:path\";\nimport fastGlob from \"fast-glob\";\nimport type {\n DesignToken,\n TokenCategory,\n TokenConfig,\n TokenParseResult,\n TokenParseError,\n} from \"../core/index.js\";\n\n/**\n * Pattern to match CSS custom property declarations\n * Captures: [full match, property name, value]\n * Example: \"--color-primary: var(--color-cobalt-50);\"\n */\nconst TOKEN_DECLARATION_PATTERN =\n /--([a-zA-Z0-9_-]+)\\s*:\\s*([^;]+);/g;\n\n/**\n * Pattern to match var() references\n * Captures: [full match, token name, fallback value?]\n * Example: \"var(--color-cobalt-50)\" or \"var(--color-primary, #fff)\"\n */\nconst VAR_REFERENCE_PATTERN =\n /var\\(\\s*--([a-zA-Z0-9_-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/g;\n\n/**\n * Pattern to match CSS selectors (to detect theme blocks)\n */\nconst SELECTOR_PATTERN = /([^{]+)\\s*\\{/g;\n\n/**\n * Category inference patterns - maps naming conventions to categories\n */\nconst CATEGORY_PATTERNS: Array<{\n pattern: RegExp;\n category: TokenCategory;\n}> = [\n { pattern: /color|bg|background|border-color|fill|stroke/i, category: \"color\" },\n { pattern: /spacing|margin|padding|gap|space|inset/i, category: \"spacing\" },\n { pattern: /font|text|line-height|letter-spacing|typography/i, category: \"typography\" },\n { pattern: /radius|rounded|corner/i, category: \"radius\" },\n { pattern: /shadow|elevation/i, category: \"shadow\" },\n { pattern: /size|width|height|min|max/i, category: \"sizing\" },\n { pattern: /border(?!-color)|stroke-width|outline/i, category: \"border\" },\n { pattern: /animation|transition|duration|timing|delay/i, category: \"animation\" },\n { pattern: /z-index|layer|stack/i, category: \"z-index\" },\n];\n\n/**\n * Parse a single CSS/SCSS file for tokens\n */\nexport async function parseTokenFile(\n filePath: string,\n themeSelectors: Record<string, string> = { \":root\": \"default\" },\n projectRoot?: string\n): Promise<TokenParseResult> {\n const startTime = performance.now();\n const tokens: DesignToken[] = [];\n const errors: TokenParseError[] = [];\n const warnings: string[] = [];\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const relativePath = projectRoot\n ? relative(projectRoot, filePath)\n : filePath;\n\n // Track which tokens we've seen for reference resolution\n const tokensByName = new Map<string, { rawValue: string; line?: number }>();\n\n // First pass: collect all token declarations\n let lineNumber = 1;\n const lines = content.split(\"\\n\");\n\n // Track current selector/theme context\n let currentSelector = \":root\";\n let braceDepth = 0;\n const selectorStack: string[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n lineNumber = i + 1;\n\n // Track brace depth for selector context\n const openBraces = (line.match(/\\{/g) || []).length;\n const closeBraces = (line.match(/\\}/g) || []).length;\n\n // Check for selector at start of line (simple heuristic)\n if (openBraces > closeBraces) {\n // Entering a new block\n const selectorMatch = line.match(/^\\s*([^{]+)\\s*\\{/);\n if (selectorMatch) {\n selectorStack.push(selectorMatch[1].trim());\n currentSelector = selectorStack[selectorStack.length - 1];\n }\n braceDepth += openBraces - closeBraces;\n } else if (closeBraces > openBraces) {\n braceDepth -= closeBraces - openBraces;\n if (braceDepth >= 0 && selectorStack.length > 0) {\n selectorStack.pop();\n currentSelector = selectorStack.length > 0\n ? selectorStack[selectorStack.length - 1]\n : \":root\";\n }\n }\n\n // Find token declarations in this line\n const tokenMatches = [...line.matchAll(TOKEN_DECLARATION_PATTERN)];\n for (const match of tokenMatches) {\n const [, name, rawValue] = match;\n const fullName = `--${name}`;\n tokensByName.set(fullName, { rawValue: rawValue.trim(), line: lineNumber });\n }\n }\n\n // Second pass: resolve references and build token objects\n for (const [name, { rawValue, line }] of tokensByName) {\n // Find the selector context for this token\n // Re-parse to get correct selector (simplified - uses last found)\n const selector = findSelectorForLine(content, line || 1);\n const theme = themeSelectors[selector] || \"default\";\n\n // Resolve the value\n const { resolvedValue, chain, hasCircular, unresolvedRef } = resolveValue(\n rawValue,\n tokensByName\n );\n\n if (hasCircular) {\n warnings.push(\n `Circular reference detected for ${name} at line ${line}`\n );\n }\n\n if (unresolvedRef) {\n warnings.push(\n `Unresolved reference in ${name}: ${unresolvedRef}`\n );\n }\n\n // Infer category from name\n const category = inferCategory(name);\n\n // Infer token level\n const level = inferLevel(name, rawValue, chain);\n\n // Extract description from preceding comment (if any)\n const description = extractDescription(content, line || 1);\n\n tokens.push({\n name,\n rawValue,\n resolvedValue,\n category,\n level,\n referenceChain: chain,\n sourceFile: relativePath,\n lineNumber: line,\n theme,\n selector,\n description,\n });\n }\n } catch (error) {\n errors.push({\n message: error instanceof Error ? error.message : \"Unknown error\",\n file: filePath,\n });\n }\n\n return {\n tokens,\n errors,\n warnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\n/**\n * Parse multiple files based on config\n */\nexport async function parseTokenFiles(\n config: TokenConfig,\n projectRoot: string\n): Promise<TokenParseResult> {\n const startTime = performance.now();\n const allTokens: DesignToken[] = [];\n const allErrors: TokenParseError[] = [];\n const allWarnings: string[] = [];\n\n // Discover files\n const files = await fastGlob(config.include, {\n cwd: projectRoot,\n ignore: config.exclude || [\"**/node_modules/**\"],\n absolute: true,\n });\n\n if (files.length === 0) {\n allWarnings.push(\n `No token files found matching: ${config.include.join(\", \")}`\n );\n }\n\n // Parse each file\n for (const file of files) {\n const result = await parseTokenFile(\n file,\n config.themeSelectors,\n projectRoot\n );\n\n allTokens.push(...result.tokens);\n allErrors.push(...result.errors);\n allWarnings.push(...result.warnings);\n }\n\n return {\n tokens: allTokens,\n errors: allErrors,\n warnings: allWarnings,\n parseTimeMs: performance.now() - startTime,\n };\n}\n\n/**\n * Resolve a token value, following var() references\n */\nfunction resolveValue(\n rawValue: string,\n tokensByName: Map<string, { rawValue: string; line?: number }>,\n visited = new Set<string>()\n): {\n resolvedValue: string;\n chain: string[];\n hasCircular: boolean;\n unresolvedRef?: string;\n} {\n const chain: string[] = [];\n let current = rawValue;\n let hasCircular = false;\n let unresolvedRef: string | undefined;\n\n // Maximum iterations to prevent infinite loops\n const maxIterations = 20;\n let iterations = 0;\n\n while (iterations < maxIterations) {\n iterations++;\n\n // Check for var() reference\n const varMatch = current.match(/var\\(\\s*--([a-zA-Z0-9_-]+)(?:\\s*,\\s*([^)]+))?\\s*\\)/);\n\n if (!varMatch) {\n // No more var() references, we have the resolved value\n break;\n }\n\n const [, refName, fallback] = varMatch;\n const fullRefName = `--${refName}`;\n\n // Check for circular reference\n if (visited.has(fullRefName)) {\n hasCircular = true;\n break;\n }\n\n visited.add(fullRefName);\n chain.push(fullRefName);\n\n // Look up the referenced token\n const refToken = tokensByName.get(fullRefName);\n\n if (refToken) {\n // Replace var() with the referenced value\n current = current.replace(\n varMatch[0],\n refToken.rawValue\n );\n } else if (fallback) {\n // Use fallback value\n current = current.replace(varMatch[0], fallback.trim());\n } else {\n // Unresolved reference\n unresolvedRef = fullRefName;\n break;\n }\n }\n\n return {\n resolvedValue: normalizeValue(current.trim()),\n chain,\n hasCircular,\n unresolvedRef,\n };\n}\n\n/**\n * Normalize a CSS value for consistent comparison\n */\nfunction normalizeValue(value: string): string {\n // Lowercase hex colors\n value = value.replace(/#[0-9a-fA-F]+/g, (match) => match.toLowerCase());\n\n // Normalize whitespace\n value = value.replace(/\\s+/g, \" \").trim();\n\n // Normalize rgb/rgba spacing\n value = value.replace(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/g,\n (_, r, g, b, a) => a !== undefined ? `rgba(${r}, ${g}, ${b}, ${a})` : `rgb(${r}, ${g}, ${b})`\n );\n\n return value;\n}\n\n/**\n * Infer token category from name\n */\nfunction inferCategory(name: string): TokenCategory {\n const lowerName = name.toLowerCase();\n\n for (const { pattern, category } of CATEGORY_PATTERNS) {\n if (pattern.test(lowerName)) {\n return category;\n }\n }\n\n return \"other\";\n}\n\n/**\n * Infer token level (1=base, 2=semantic, 3=component)\n */\nfunction inferLevel(\n name: string,\n rawValue: string,\n referenceChain: string[]\n): 1 | 2 | 3 {\n const lowerName = name.toLowerCase();\n\n // Component-specific tokens (often contain component names)\n if (\n /btn|button|input|card|modal|dialog|menu|nav|header|footer|table|form/i.test(\n lowerName\n )\n ) {\n return 3;\n }\n\n // Semantic tokens (references other tokens)\n if (referenceChain.length > 0) {\n return 2;\n }\n\n // Base tokens (raw values like hex colors, numbers)\n if (\n rawValue.match(/^#[0-9a-fA-F]+$/) ||\n rawValue.match(/^\\d+(\\.\\d+)?(px|rem|em|%|vh|vw)?$/)\n ) {\n return 1;\n }\n\n // Default to semantic if unclear\n return 2;\n}\n\n/**\n * Find the CSS selector that contains a given line\n */\nfunction findSelectorForLine(content: string, targetLine: number): string {\n const lines = content.split(\"\\n\");\n let currentSelector = \":root\";\n let braceDepth = 0;\n\n for (let i = 0; i < Math.min(targetLine, lines.length); i++) {\n const line = lines[i];\n\n // Check for selector at start of block\n const selectorMatch = line.match(/^\\s*([^{]+)\\s*\\{/);\n if (selectorMatch) {\n const selector = selectorMatch[1].trim();\n // Only update if entering a new block\n if ((line.match(/\\{/g) || []).length > (line.match(/\\}/g) || []).length) {\n currentSelector = selector;\n }\n }\n\n // Track brace depth\n braceDepth += (line.match(/\\{/g) || []).length;\n braceDepth -= (line.match(/\\}/g) || []).length;\n\n // If we close all braces, reset to root\n if (braceDepth === 0) {\n currentSelector = \":root\";\n }\n }\n\n return currentSelector;\n}\n\n/**\n * Extract description from comment preceding the token\n */\nfunction extractDescription(content: string, line: number): string | undefined {\n const lines = content.split(\"\\n\");\n\n // Look at the line before\n if (line <= 1) return undefined;\n\n const prevLine = lines[line - 2]?.trim();\n\n // Check for single-line comment\n const singleLineMatch = prevLine?.match(/\\/\\/\\s*(.+)$/);\n if (singleLineMatch) {\n return singleLineMatch[1].trim();\n }\n\n // Check for multi-line comment ending\n const multiLineMatch = prevLine?.match(/\\*\\s*(.+)\\s*\\*\\//);\n if (multiLineMatch) {\n return multiLineMatch[1].trim();\n }\n\n // Check for simple /* comment */\n const inlineMatch = prevLine?.match(/\\/\\*\\s*(.+)\\s*\\*\\//);\n if (inlineMatch) {\n return inlineMatch[1].trim();\n }\n\n return undefined;\n}\n\n/**\n * Convert a hex color to RGB\n */\nexport function hexToRgb(hex: string): { r: number; g: number; b: number } | null {\n const match = hex.match(/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i);\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 16),\n g: parseInt(match[2], 16),\n b: parseInt(match[3], 16),\n };\n}\n\n/**\n * Convert RGB to hex\n */\nexport function rgbToHex(r: number, g: number, b: number): string {\n return `#${[r, g, b]\n .map((x) => Math.round(x).toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n}\n\n/**\n * Parse an RGB/RGBA string\n */\nexport function parseRgb(\n color: string\n): { r: number; g: number; b: number; a?: number } | null {\n const match = color.match(\n /rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*([\\d.]+))?\\s*\\)/\n );\n if (!match) return null;\n\n return {\n r: parseInt(match[1], 10),\n g: parseInt(match[2], 10),\n b: parseInt(match[3], 10),\n a: match[4] ? parseFloat(match[4]) : undefined,\n };\n}\n\n/**\n * Normalize a color value to lowercase hex\n */\nexport function normalizeColor(color: string): string {\n // Already hex\n if (color.startsWith(\"#\")) {\n return color.toLowerCase();\n }\n\n // RGB/RGBA to hex\n const rgb = parseRgb(color);\n if (rgb) {\n return rgbToHex(rgb.r, rgb.g, rgb.b);\n }\n\n return color.toLowerCase();\n}\n","/**\n * Token Registry\n *\n * Manages design tokens in memory with fast lookup capabilities:\n * - By name: O(1) lookup\n * - By value (reverse): O(1) lookup\n * - By theme: O(1) lookup\n * - By category: O(1) lookup\n */\n\nimport type {\n DesignToken,\n TokenRegistry,\n TokenRegistryMeta,\n TokenCategory,\n TokenConfig,\n TokenMatchRequest,\n TokenMatchResult,\n EnhancedStyleDiffItem,\n TokenUsageSummary,\n} from \"../core/index.js\";\nimport { parseTokenFiles, normalizeColor, hexToRgb, parseRgb } from \"./token-parser.js\";\n\n/**\n * Token Registry Manager\n *\n * Singleton-style manager for design tokens with initialization,\n * lookup, and matching capabilities.\n */\nexport class TokenRegistryManager {\n private registry: TokenRegistry | null = null;\n private initPromise: Promise<void> | null = null;\n\n /**\n * Initialize the registry by parsing token files\n */\n async initialize(\n config: TokenConfig,\n projectRoot: string\n ): Promise<TokenRegistry> {\n // If already initializing, wait for that\n if (this.initPromise) {\n await this.initPromise;\n return this.registry!;\n }\n\n // If already initialized, return existing\n if (this.registry) {\n return this.registry;\n }\n\n this.initPromise = this.doInitialize(config, projectRoot);\n await this.initPromise;\n this.initPromise = null;\n\n return this.registry!;\n }\n\n private async doInitialize(\n config: TokenConfig,\n projectRoot: string\n ): Promise<void> {\n const startTime = performance.now();\n\n // Parse all token files\n const result = await parseTokenFiles(config, projectRoot);\n\n // Build the registry\n const byName = new Map<string, DesignToken>();\n const byValue = new Map<string, string[]>();\n const byTheme = new Map<string, DesignToken[]>();\n const byCategory = new Map<TokenCategory, DesignToken[]>();\n\n let circularRefs = 0;\n let unresolvedRefs = 0;\n\n for (const token of result.tokens) {\n // Index by name\n byName.set(token.name, token);\n\n // Index by resolved value (reverse lookup)\n const normalizedValue = this.normalizeForLookup(token.resolvedValue);\n const existingTokens = byValue.get(normalizedValue) || [];\n existingTokens.push(token.name);\n byValue.set(normalizedValue, existingTokens);\n\n // Index by theme\n const themeTokens = byTheme.get(token.theme) || [];\n themeTokens.push(token);\n byTheme.set(token.theme, themeTokens);\n\n // Index by category\n const categoryTokens = byCategory.get(token.category) || [];\n categoryTokens.push(token);\n byCategory.set(token.category, categoryTokens);\n }\n\n // Count issues from warnings\n for (const warning of result.warnings) {\n if (warning.includes(\"Circular\")) circularRefs++;\n if (warning.includes(\"Unresolved\")) unresolvedRefs++;\n }\n\n const meta: TokenRegistryMeta = {\n discoveredAt: new Date(),\n sourceFiles: config.include,\n totalTokens: result.tokens.length,\n parseTimeMs: performance.now() - startTime,\n circularRefs,\n unresolvedRefs,\n };\n\n this.registry = {\n byName,\n byValue,\n byTheme,\n byCategory,\n meta,\n };\n }\n\n /**\n * Get the current registry (throws if not initialized)\n */\n getRegistry(): TokenRegistry {\n if (!this.registry) {\n throw new Error(\"Token registry not initialized. Call initialize() first.\");\n }\n return this.registry;\n }\n\n /**\n * Check if registry is initialized\n */\n isInitialized(): boolean {\n return this.registry !== null;\n }\n\n /**\n * Clear the registry (for re-initialization)\n */\n clear(): void {\n this.registry = null;\n this.initPromise = null;\n }\n\n /**\n * Get a token by name\n */\n getToken(name: string): DesignToken | undefined {\n return this.registry?.byName.get(name);\n }\n\n /**\n * Find tokens by resolved value (reverse lookup)\n *\n * This is the key feature: given a computed value like \"#0051c2\",\n * find which design token(s) resolve to that value.\n */\n findByValue(value: string, theme?: string): string[] {\n if (!this.registry) return [];\n\n const normalizedValue = this.normalizeForLookup(value);\n const tokenNames = this.registry.byValue.get(normalizedValue) || [];\n\n // Filter by theme if specified\n if (theme && tokenNames.length > 0) {\n return tokenNames.filter((name) => {\n const token = this.registry!.byName.get(name);\n return token?.theme === theme || token?.theme === \"default\";\n });\n }\n\n return tokenNames;\n }\n\n /**\n * Match a value to tokens with similarity scoring\n */\n matchValue(request: TokenMatchRequest): TokenMatchResult {\n const { value, propertyType, theme } = request;\n const exactMatches: DesignToken[] = [];\n const closeMatches: Array<{ token: DesignToken; similarity: number }> = [];\n\n if (!this.registry) {\n return { exactMatches, closeMatches, found: false };\n }\n\n const normalizedValue = this.normalizeForLookup(value);\n\n // Find exact matches\n const exactNames = this.registry.byValue.get(normalizedValue) || [];\n for (const name of exactNames) {\n const token = this.registry.byName.get(name);\n if (token) {\n // Filter by theme if specified\n if (!theme || token.theme === theme || token.theme === \"default\") {\n exactMatches.push(token);\n }\n }\n }\n\n // For colors, find close matches\n if (propertyType === \"color\" || this.looksLikeColor(value)) {\n const targetRgb = this.parseColorToRgb(value);\n if (targetRgb) {\n // Get all color tokens\n const colorTokens = this.registry.byCategory.get(\"color\") || [];\n\n for (const token of colorTokens) {\n // Skip if already an exact match\n if (exactMatches.includes(token)) continue;\n\n // Filter by theme\n if (theme && token.theme !== theme && token.theme !== \"default\") {\n continue;\n }\n\n const tokenRgb = this.parseColorToRgb(token.resolvedValue);\n if (tokenRgb) {\n const similarity = this.colorSimilarity(targetRgb, tokenRgb);\n if (similarity > 0.9) {\n // 90% similar\n closeMatches.push({ token, similarity });\n }\n }\n }\n\n // Sort by similarity descending\n closeMatches.sort((a, b) => b.similarity - a.similarity);\n }\n }\n\n return {\n exactMatches,\n closeMatches: closeMatches.slice(0, 5), // Top 5 close matches\n found: exactMatches.length > 0 || closeMatches.length > 0,\n };\n }\n\n /**\n * Get all tokens for a theme\n */\n getTokensByTheme(theme: string): DesignToken[] {\n return this.registry?.byTheme.get(theme) || [];\n }\n\n /**\n * Get all tokens in a category\n */\n getTokensByCategory(category: TokenCategory): DesignToken[] {\n return this.registry?.byCategory.get(category) || [];\n }\n\n /**\n * Get all tokens\n */\n getAllTokens(): DesignToken[] {\n if (!this.registry) return [];\n return Array.from(this.registry.byName.values());\n }\n\n /**\n * Get registry metadata\n */\n getMeta(): TokenRegistryMeta | undefined {\n return this.registry?.meta;\n }\n\n /**\n * Enhance a style diff with token information\n */\n enhanceStyleDiff(\n figmaValue: string,\n renderedValue: string,\n property: string,\n theme = \"default\"\n ): Partial<EnhancedStyleDiffItem> {\n const figmaTokens = this.findByValue(figmaValue, theme);\n const renderedTokens = this.findByValue(renderedValue, theme);\n\n const figmaToken = figmaTokens.length > 0 ? figmaTokens[0] : undefined;\n const renderedToken = renderedTokens.length > 0 ? renderedTokens[0] : undefined;\n\n // Determine if this is a hardcoded value\n // Hardcoded = Figma matches a token, but rendered doesn't use a token\n const isHardcoded = !!figmaToken && !renderedToken;\n\n let suggestedFix: EnhancedStyleDiffItem[\"suggestedFix\"] | undefined;\n\n if (isHardcoded && figmaToken) {\n const token = this.getToken(figmaToken);\n if (token) {\n const cssProperty = this.toCssProperty(property);\n suggestedFix = {\n tokenName: figmaToken,\n tokenValue: token.resolvedValue,\n codeFix: `${cssProperty}: var(${figmaToken});`,\n confidence: 0.9,\n reason: `Figma uses token ${figmaToken} (${token.resolvedValue}). Replace hardcoded value with token for consistency.`,\n };\n }\n }\n\n return {\n figmaToken,\n renderedToken,\n isHardcoded,\n suggestedFix,\n };\n }\n\n /**\n * Calculate token usage summary for a set of style comparisons\n */\n calculateUsageSummary(\n styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }>,\n theme = \"default\"\n ): TokenUsageSummary {\n const hardcodedProperties: EnhancedStyleDiffItem[] = [];\n let usingTokens = 0;\n let hardcoded = 0;\n let implicitMatches = 0;\n\n for (const diff of styleDiffs) {\n const enhanced = this.enhanceStyleDiff(\n diff.figma,\n diff.rendered,\n diff.property,\n theme\n );\n\n if (enhanced.renderedToken) {\n usingTokens++;\n } else if (enhanced.isHardcoded) {\n hardcoded++;\n hardcodedProperties.push({\n ...diff,\n ...enhanced,\n isHardcoded: true,\n } as EnhancedStyleDiffItem);\n } else if (diff.match && enhanced.figmaToken) {\n // Values match and Figma uses a token, but rendered doesn't explicitly use token\n implicitMatches++;\n }\n }\n\n const totalProperties = styleDiffs.length;\n const compliancePercent =\n totalProperties > 0\n ? Math.round(((usingTokens + implicitMatches) / totalProperties) * 100)\n : 100;\n\n return {\n totalProperties,\n usingTokens,\n hardcoded,\n implicitMatches,\n compliancePercent,\n hardcodedProperties,\n };\n }\n\n /**\n * Find closest matching tokens for a value that doesn't match exactly\n *\n * @param value - The value to find close matches for\n * @param category - Optional category to filter by (color, spacing, sizing, etc.)\n * @param options - Matching options\n * @returns Array of close matches sorted by distance with confidence scores\n */\n findClosestToken(\n value: string,\n category?: TokenCategory,\n options: {\n /** Maximum numeric difference for spacing/sizing (default: 4px) */\n numericThreshold?: number;\n /** Maximum color difference using Delta E (default: 5) */\n colorDeltaE?: number;\n /** Maximum results to return (default: 5) */\n limit?: number;\n /** Theme to filter by */\n theme?: string;\n } = {}\n ): Array<{ token: DesignToken; distance: number; confidence: number }> {\n if (!this.registry) return [];\n\n const {\n numericThreshold = 4,\n colorDeltaE = 5,\n limit = 5,\n theme,\n } = options;\n\n const results: Array<{ token: DesignToken; distance: number; confidence: number }> = [];\n\n // Determine value type\n const isColor = this.looksLikeColor(value);\n const numericValue = this.parseNumericValue(value);\n const isNumeric = numericValue !== null;\n\n // Get tokens to search through\n let candidates: DesignToken[];\n if (category) {\n candidates = this.registry.byCategory.get(category) || [];\n } else if (isColor) {\n candidates = this.registry.byCategory.get(\"color\") || [];\n } else if (isNumeric) {\n // Search through spacing, sizing, and radius tokens\n candidates = [\n ...(this.registry.byCategory.get(\"spacing\") || []),\n ...(this.registry.byCategory.get(\"sizing\") || []),\n ...(this.registry.byCategory.get(\"radius\") || []),\n ];\n } else {\n // Search all tokens\n candidates = Array.from(this.registry.byName.values());\n }\n\n // Filter by theme if specified\n if (theme) {\n candidates = candidates.filter(\n (t) => t.theme === theme || t.theme === \"default\"\n );\n }\n\n // Calculate distances\n if (isColor) {\n const targetRgb = this.parseColorToRgb(value);\n if (targetRgb) {\n for (const token of candidates) {\n const tokenRgb = this.parseColorToRgb(token.resolvedValue);\n if (!tokenRgb) continue;\n\n // Calculate Delta E (CIE76 approximation using RGB)\n const deltaE = this.calculateDeltaE(targetRgb, tokenRgb);\n\n if (deltaE <= colorDeltaE) {\n // Confidence inversely proportional to deltaE\n const confidence = Math.max(0, 1 - deltaE / colorDeltaE);\n results.push({ token, distance: deltaE, confidence });\n }\n }\n }\n } else if (isNumeric) {\n for (const token of candidates) {\n const tokenNumeric = this.parseNumericValue(token.resolvedValue);\n if (tokenNumeric === null) continue;\n\n const distance = Math.abs(numericValue - tokenNumeric);\n\n if (distance <= numericThreshold) {\n // Confidence inversely proportional to distance\n const confidence = Math.max(0, 1 - distance / numericThreshold);\n results.push({ token, distance, confidence });\n }\n }\n }\n\n // Sort by distance ascending (closest first)\n results.sort((a, b) => a.distance - b.distance);\n\n return results.slice(0, limit);\n }\n\n /**\n * Serialize registry for JSON export\n */\n toJSON(): {\n tokens: DesignToken[];\n meta: TokenRegistryMeta;\n } {\n if (!this.registry) {\n return { tokens: [], meta: this.createEmptyMeta() };\n }\n\n return {\n tokens: Array.from(this.registry.byName.values()),\n meta: this.registry.meta,\n };\n }\n\n // ----- Private helpers -----\n\n /**\n * Normalize a value for consistent lookup\n */\n private normalizeForLookup(value: string): string {\n // Lowercase\n let normalized = value.toLowerCase().trim();\n\n // Normalize color formats\n if (this.looksLikeColor(normalized)) {\n const rgb = this.parseColorToRgb(value);\n if (rgb) {\n // Convert to lowercase hex for consistent lookup\n normalized = `#${[rgb.r, rgb.g, rgb.b]\n .map((x) => x.toString(16).padStart(2, \"0\"))\n .join(\"\")}`;\n }\n }\n\n // Normalize whitespace\n normalized = normalized.replace(/\\s+/g, \" \");\n\n return normalized;\n }\n\n /**\n * Check if a value looks like a color\n */\n private looksLikeColor(value: string): boolean {\n return (\n value.startsWith(\"#\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"hsl\") ||\n /^(transparent|white|black|red|blue|green|yellow|orange|purple|pink|gray|grey)$/i.test(\n value\n )\n );\n }\n\n /**\n * Parse any color format to RGB\n */\n private parseColorToRgb(\n color: string\n ): { r: number; g: number; b: number } | null {\n // Handle named colors\n const namedColors: Record<string, { r: number; g: number; b: number }> = {\n white: { r: 255, g: 255, b: 255 },\n black: { r: 0, g: 0, b: 0 },\n transparent: { r: 0, g: 0, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n green: { r: 0, g: 128, b: 0 },\n blue: { r: 0, g: 0, b: 255 },\n };\n\n const lower = color.toLowerCase().trim();\n if (namedColors[lower]) {\n return namedColors[lower];\n }\n\n // Handle hex\n if (color.startsWith(\"#\")) {\n return hexToRgb(color);\n }\n\n // Handle rgb/rgba\n if (color.startsWith(\"rgb\")) {\n const parsed = parseRgb(color);\n if (parsed) {\n return { r: parsed.r, g: parsed.g, b: parsed.b };\n }\n }\n\n return null;\n }\n\n /**\n * Calculate color similarity (0-1)\n */\n private colorSimilarity(\n c1: { r: number; g: number; b: number },\n c2: { r: number; g: number; b: number }\n ): number {\n // Use simple Euclidean distance in RGB space\n const maxDist = Math.sqrt(255 ** 2 * 3);\n const dist = Math.sqrt(\n (c1.r - c2.r) ** 2 + (c1.g - c2.g) ** 2 + (c1.b - c2.b) ** 2\n );\n\n return 1 - dist / maxDist;\n }\n\n /**\n * Convert camelCase property to kebab-case CSS property\n */\n private toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n }\n\n /**\n * Create empty metadata\n */\n private createEmptyMeta(): TokenRegistryMeta {\n return {\n discoveredAt: new Date(),\n sourceFiles: [],\n totalTokens: 0,\n parseTimeMs: 0,\n circularRefs: 0,\n unresolvedRefs: 0,\n };\n }\n\n /**\n * Parse a numeric value from a CSS value string\n * Handles px, rem, em, % and bare numbers\n */\n private parseNumericValue(value: string): number | null {\n const trimmed = value.trim().toLowerCase();\n\n // Match numeric values with optional units\n const match = trimmed.match(/^(-?\\d*\\.?\\d+)(px|rem|em|%)?$/);\n if (!match) return null;\n\n const num = parseFloat(match[1]);\n const unit = match[2];\n\n // Convert to px for comparison\n switch (unit) {\n case \"rem\":\n return num * 16; // Assume 16px base\n case \"em\":\n return num * 16; // Approximate\n case \"%\":\n return null; // Percentages are relative, skip\n case \"px\":\n default:\n return num;\n }\n }\n\n /**\n * Calculate Delta E (CIE76) color difference\n * Uses simplified RGB to Lab approximation\n * Lower values = more similar (0 = identical, >5 = noticeably different)\n */\n private calculateDeltaE(\n c1: { r: number; g: number; b: number },\n c2: { r: number; g: number; b: number }\n ): number {\n // Convert RGB to Lab (simplified)\n const lab1 = this.rgbToLab(c1);\n const lab2 = this.rgbToLab(c2);\n\n // CIE76 Delta E formula\n return Math.sqrt(\n Math.pow(lab2.l - lab1.l, 2) +\n Math.pow(lab2.a - lab1.a, 2) +\n Math.pow(lab2.b - lab1.b, 2)\n );\n }\n\n /**\n * Convert RGB to Lab color space (simplified approximation)\n */\n private rgbToLab(rgb: { r: number; g: number; b: number }): { l: number; a: number; b: number } {\n // Normalize RGB values\n let r = rgb.r / 255;\n let g = rgb.g / 255;\n let b = rgb.b / 255;\n\n // Apply gamma correction\n r = r > 0.04045 ? Math.pow((r + 0.055) / 1.055, 2.4) : r / 12.92;\n g = g > 0.04045 ? Math.pow((g + 0.055) / 1.055, 2.4) : g / 12.92;\n b = b > 0.04045 ? Math.pow((b + 0.055) / 1.055, 2.4) : b / 12.92;\n\n // Convert to XYZ\n let x = (r * 0.4124564 + g * 0.3575761 + b * 0.1804375) / 0.95047;\n let y = (r * 0.2126729 + g * 0.7151522 + b * 0.0721750);\n let z = (r * 0.0193339 + g * 0.1191920 + b * 0.9503041) / 1.08883;\n\n // Convert to Lab\n x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + 16/116;\n y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + 16/116;\n z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + 16/116;\n\n return {\n l: (116 * y) - 16,\n a: 500 * (x - y),\n b: 200 * (y - z),\n };\n }\n}\n\n/**\n * Shared singleton instance\n */\nlet sharedRegistry: TokenRegistryManager | null = null;\n\n/**\n * Get or create the shared token registry\n */\nexport function getSharedTokenRegistry(): TokenRegistryManager {\n if (!sharedRegistry) {\n sharedRegistry = new TokenRegistryManager();\n }\n return sharedRegistry;\n}\n\n/**\n * Initialize the shared registry\n */\nexport async function initializeSharedRegistry(\n config: TokenConfig,\n projectRoot: string\n): Promise<TokenRegistry> {\n return getSharedTokenRegistry().initialize(config, projectRoot);\n}\n\n/**\n * Clear the shared registry\n */\nexport function clearSharedRegistry(): void {\n sharedRegistry?.clear();\n sharedRegistry = null;\n}\n\n/**\n * Create a standalone registry (not shared)\n */\nexport function createTokenRegistry(): TokenRegistryManager {\n return new TokenRegistryManager();\n}\n","/**\n * Token Fix Suggestions\n *\n * Generates AI-friendly fix suggestions when hardcoded values\n * should be replaced with design tokens.\n */\n\nimport type {\n DesignToken,\n EnhancedStyleDiffItem,\n TokenFix,\n TokenUsageSummary,\n} from \"../core/index.js\";\nimport { TokenRegistryManager } from \"./token-registry.js\";\n\n/**\n * Context for AI agents to understand and fix token issues\n */\nexport interface TokenFixContext {\n /** Component name */\n componentName: string;\n\n /** Summary of token usage */\n summary: TokenUsageSummary;\n\n /** Detailed fix suggestions for each hardcoded property */\n fixes: TokenFixDetail[];\n\n /** Markdown-formatted context for AI agents */\n markdown: string;\n\n /** JSON-formatted context for programmatic use */\n json: {\n component: string;\n compliancePercent: number;\n totalProperties: number;\n hardcodedCount: number;\n fixes: Array<{\n property: string;\n currentValue: string;\n suggestedToken: string;\n tokenValue: string;\n codeFix: string;\n reason: string;\n }>;\n };\n}\n\n/**\n * Detailed fix for a single property\n */\nexport interface TokenFixDetail {\n /** CSS property name (e.g., \"backgroundColor\") */\n property: string;\n\n /** CSS property name in kebab-case (e.g., \"background-color\") */\n cssProperty: string;\n\n /** Current hardcoded value */\n currentValue: string;\n\n /** Token that should be used */\n suggestedToken: DesignToken;\n\n /** The code fix to apply */\n codeFix: string;\n\n /** Confidence score 0-1 */\n confidence: number;\n\n /** Human-readable explanation */\n reason: string;\n}\n\n/**\n * Generate token fixes for a set of style diffs\n */\nexport function generateTokenFixes(\n componentName: string,\n styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }>,\n registry: TokenRegistryManager,\n theme = \"default\"\n): TokenFixContext {\n // Calculate usage summary\n const summary = registry.calculateUsageSummary(styleDiffs, theme);\n\n // Generate detailed fixes\n const fixes: TokenFixDetail[] = [];\n\n for (const hardcoded of summary.hardcodedProperties) {\n if (!hardcoded.suggestedFix) continue;\n\n const token = registry.getToken(hardcoded.suggestedFix.tokenName);\n if (!token) continue;\n\n const cssProperty = toCssProperty(hardcoded.property);\n\n fixes.push({\n property: hardcoded.property,\n cssProperty,\n currentValue: hardcoded.rendered,\n suggestedToken: token,\n codeFix: hardcoded.suggestedFix.codeFix,\n confidence: hardcoded.suggestedFix.confidence,\n reason: hardcoded.suggestedFix.reason,\n });\n }\n\n // Generate markdown context for AI\n const markdown = generateMarkdownContext(componentName, summary, fixes);\n\n // Generate JSON context\n const json = {\n component: componentName,\n compliancePercent: summary.compliancePercent,\n totalProperties: summary.totalProperties,\n hardcodedCount: summary.hardcoded,\n fixes: fixes.map((f) => ({\n property: f.property,\n currentValue: f.currentValue,\n suggestedToken: f.suggestedToken.name,\n tokenValue: f.suggestedToken.resolvedValue,\n codeFix: f.codeFix,\n reason: f.reason,\n })),\n };\n\n return {\n componentName,\n summary,\n fixes,\n markdown,\n json,\n };\n}\n\n/**\n * Generate markdown context for AI agents\n */\nfunction generateMarkdownContext(\n componentName: string,\n summary: TokenUsageSummary,\n fixes: TokenFixDetail[]\n): string {\n const lines: string[] = [];\n\n // Header\n lines.push(`## Design Token Analysis: ${componentName}`);\n lines.push(\"\");\n\n // Summary\n lines.push(`### Compliance: ${summary.compliancePercent}%`);\n lines.push(\"\");\n lines.push(`| Metric | Count |`);\n lines.push(`|--------|-------|`);\n lines.push(`| Total Properties | ${summary.totalProperties} |`);\n lines.push(`| Using Tokens | ${summary.usingTokens} |`);\n lines.push(`| Hardcoded | ${summary.hardcoded} |`);\n lines.push(`| Implicit Matches | ${summary.implicitMatches} |`);\n lines.push(\"\");\n\n if (fixes.length === 0) {\n lines.push(\"✅ **All styles are using design tokens correctly.**\");\n return lines.join(\"\\n\");\n }\n\n // Issues\n lines.push(`### Issues Found: ${fixes.length} hardcoded value(s)`);\n lines.push(\"\");\n\n for (let i = 0; i < fixes.length; i++) {\n const fix = fixes[i];\n lines.push(`#### ${i + 1}. \\`${fix.cssProperty}\\``);\n lines.push(\"\");\n lines.push(`- **Current Value**: \\`${fix.currentValue}\\``);\n lines.push(`- **Suggested Token**: \\`${fix.suggestedToken.name}\\` (${fix.suggestedToken.resolvedValue})`);\n lines.push(`- **Confidence**: ${Math.round(fix.confidence * 100)}%`);\n lines.push(\"\");\n lines.push(\"**Fix:**\");\n lines.push(\"```css\");\n lines.push(`/* Before */ ${fix.cssProperty}: ${fix.currentValue};`);\n lines.push(`/* After */ ${fix.codeFix}`);\n lines.push(\"```\");\n lines.push(\"\");\n lines.push(`> ${fix.reason}`);\n lines.push(\"\");\n }\n\n // Why use tokens\n lines.push(\"### Why Use Design Tokens?\");\n lines.push(\"\");\n lines.push(\"1. **Consistency**: Ensures visual consistency across the application\");\n lines.push(\"2. **Maintainability**: Change a token value once, update everywhere\");\n lines.push(\"3. **Theming**: Enables dark mode and other theme variations\");\n lines.push(\"4. **Design System Compliance**: Keeps code aligned with design specifications\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate AI context for a single component's token issues\n *\n * This format is optimized for AI agents to understand and fix\n */\nexport function generateAIFixContext(\n componentName: string,\n hardcodedItems: EnhancedStyleDiffItem[],\n registry: TokenRegistryManager\n): string {\n if (hardcodedItems.length === 0) {\n return `Component \"${componentName}\" is fully compliant with design tokens.`;\n }\n\n const lines: string[] = [];\n\n lines.push(`# Design Token Fix Required: ${componentName}`);\n lines.push(\"\");\n lines.push(`Found ${hardcodedItems.length} hardcoded CSS value(s) that should use design tokens.`);\n lines.push(\"\");\n\n for (const item of hardcodedItems) {\n if (!item.suggestedFix) continue;\n\n const token = registry.getToken(item.suggestedFix.tokenName);\n const cssProperty = toCssProperty(item.property);\n\n lines.push(`## Issue: Hardcoded \\`${cssProperty}\\``);\n lines.push(\"\");\n lines.push(\"| | |\");\n lines.push(\"|---|---|\");\n lines.push(`| **Property** | \\`${cssProperty}\\` |`);\n lines.push(`| **Current Value** | \\`${item.rendered}\\` |`);\n lines.push(`| **Expected Token** | \\`${item.suggestedFix.tokenName}\\` |`);\n lines.push(`| **Token Value** | \\`${token?.resolvedValue || item.suggestedFix.tokenValue}\\` |`);\n lines.push(\"\");\n lines.push(\"**Suggested Fix:**\");\n lines.push(\"```css\");\n lines.push(`/* Replace hardcoded value */`);\n lines.push(`${cssProperty}: var(${item.suggestedFix.tokenName});`);\n lines.push(\"```\");\n lines.push(\"\");\n\n if (token) {\n lines.push(\"**Token Details:**\");\n lines.push(`- Category: ${token.category}`);\n lines.push(`- Level: ${token.level === 1 ? \"Base\" : token.level === 2 ? \"Semantic\" : \"Component\"}`);\n lines.push(`- Theme: ${token.theme}`);\n if (token.description) {\n lines.push(`- Description: ${token.description}`);\n }\n lines.push(\"\");\n }\n\n lines.push(\"---\");\n lines.push(\"\");\n }\n\n lines.push(\"## Why This Matters\");\n lines.push(\"\");\n lines.push(\"Using design tokens instead of hardcoded values:\");\n lines.push(\"- Ensures the component matches the Figma design\");\n lines.push(\"- Enables automatic theme switching (light/dark mode)\");\n lines.push(\"- Maintains consistency across the design system\");\n lines.push(\"- Makes future design updates easier\");\n lines.push(\"\");\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n","/**\n * Patch Generator\n *\n * Generates unified diff patches to fix token compliance issues.\n * Takes style comparison results and produces patches that replace\n * hardcoded CSS values with design token references.\n */\n\nimport type { EnhancedStyleDiffItem, TokenUsageSummary } from \"../core/index.js\";\nimport { TokenRegistryManager } from \"./token-registry.js\";\n\n/**\n * A patch represents a file modification in unified diff format\n */\nexport interface Patch {\n /** File path relative to project root */\n file: string;\n\n /** Unified diff content */\n diff: string;\n\n /** Line number where the change starts */\n lineNumber?: number;\n\n /** Type of style syntax being modified */\n styleType: \"inline\" | \"styled-components\" | \"emotion\" | \"css-module\" | \"css\";\n}\n\n/**\n * Result of patch generation for a component\n */\nexport interface PatchGenerationResult {\n /** Generated patches */\n patches: Patch[];\n\n /** Human-readable summary */\n summary: string;\n\n /** Number of hardcoded values that could be fixed */\n fixableCount: number;\n\n /** Number of hardcoded values that couldn't be fixed (no matching token) */\n unfixableCount: number;\n}\n\n/**\n * Options for patch generation\n */\nexport interface PatchGenerationOptions {\n /** Source file path (if known from segment metadata) */\n sourceFile?: string;\n\n /** Style type hint */\n styleType?: Patch[\"styleType\"];\n\n /** Number of context lines to include in diff (default: 3) */\n contextLines?: number;\n\n /** Theme context for token matching */\n theme?: string;\n}\n\n/**\n * Generate token patches for a component's hardcoded styles\n *\n * @param componentName - Name of the component\n * @param styleDiffs - Style comparison results with rendered vs figma values\n * @param registry - Token registry for token lookup\n * @param options - Generation options\n */\nexport function generateTokenPatches(\n componentName: string,\n styleDiffs: Array<{\n property: string;\n figma: string;\n rendered: string;\n match: boolean;\n }>,\n registry: TokenRegistryManager,\n options: PatchGenerationOptions = {}\n): PatchGenerationResult {\n const { theme = \"default\", contextLines = 3 } = options;\n\n // Get token usage summary with hardcoded properties\n const summary = registry.calculateUsageSummary(styleDiffs, theme);\n\n if (summary.hardcodedProperties.length === 0) {\n return {\n patches: [],\n summary: `No hardcoded values found in ${componentName}. Token compliance is at ${summary.compliancePercent}%.`,\n fixableCount: 0,\n unfixableCount: 0,\n };\n }\n\n const patches: Patch[] = [];\n let fixableCount = 0;\n let unfixableCount = 0;\n\n // Group fixes by file (if we have file info)\n const fixesByFile = new Map<string, EnhancedStyleDiffItem[]>();\n\n for (const item of summary.hardcodedProperties) {\n if (!item.suggestedFix) {\n unfixableCount++;\n continue;\n }\n\n fixableCount++;\n\n // For now, group under the source file or a placeholder\n const file = options.sourceFile || `${componentName}.tsx`;\n const existing = fixesByFile.get(file) || [];\n existing.push(item);\n fixesByFile.set(file, existing);\n }\n\n // Generate patches for each file\n for (const [file, fixes] of fixesByFile) {\n const patch = generateUnifiedDiff(file, fixes, options);\n if (patch) {\n patches.push(patch);\n }\n }\n\n // Generate summary\n const summaryLines: string[] = [];\n summaryLines.push(`Token Patch Summary for ${componentName}:`);\n summaryLines.push(`- Compliance: ${summary.compliancePercent}%`);\n summaryLines.push(`- Fixable issues: ${fixableCount}`);\n if (unfixableCount > 0) {\n summaryLines.push(`- Unfixable issues: ${unfixableCount} (no matching token found)`);\n }\n summaryLines.push(`- Patches generated: ${patches.length}`);\n\n return {\n patches,\n summary: summaryLines.join(\"\\n\"),\n fixableCount,\n unfixableCount,\n };\n}\n\n/**\n * Generate a unified diff for a set of fixes in a single file\n */\nfunction generateUnifiedDiff(\n file: string,\n fixes: EnhancedStyleDiffItem[],\n options: PatchGenerationOptions\n): Patch | null {\n if (fixes.length === 0) return null;\n\n const { styleType = detectStyleType(file) } = options;\n const diffLines: string[] = [];\n\n // Diff header\n diffLines.push(`--- a/${file}`);\n diffLines.push(`+++ b/${file}`);\n\n // Generate hunks for each fix\n // In a real implementation, we'd read the actual file and generate proper diffs\n // For now, we generate synthetic diffs showing the transformation\n for (const fix of fixes) {\n if (!fix.suggestedFix) continue;\n\n const cssProperty = toCssProperty(fix.property);\n const hunk = generateHunk(cssProperty, fix.rendered, fix.suggestedFix, styleType);\n diffLines.push(...hunk);\n }\n\n return {\n file,\n diff: diffLines.join(\"\\n\"),\n styleType,\n };\n}\n\n/**\n * Generate a diff hunk for a single property fix\n */\nfunction generateHunk(\n cssProperty: string,\n currentValue: string,\n suggestedFix: NonNullable<EnhancedStyleDiffItem[\"suggestedFix\"]>,\n styleType: Patch[\"styleType\"]\n): string[] {\n const lines: string[] = [];\n\n // The hunk format depends on the style type\n switch (styleType) {\n case \"inline\":\n // React inline style: { backgroundColor: '#0051c2' }\n const camelProp = toCamelCase(cssProperty);\n lines.push(`@@ -1,1 +1,1 @@ inline style`);\n lines.push(`- ${camelProp}: '${currentValue}',`);\n lines.push(`+ ${camelProp}: 'var(${suggestedFix.tokenName})',`);\n break;\n\n case \"styled-components\":\n case \"emotion\":\n // CSS-in-JS: background-color: #0051c2;\n lines.push(`@@ -1,1 +1,1 @@ ${styleType}`);\n lines.push(`- ${cssProperty}: ${currentValue};`);\n lines.push(`+ ${cssProperty}: var(${suggestedFix.tokenName});`);\n break;\n\n case \"css-module\":\n case \"css\":\n default:\n // Plain CSS: background-color: #0051c2;\n lines.push(`@@ -1,1 +1,1 @@ css`);\n lines.push(`- ${cssProperty}: ${currentValue};`);\n lines.push(`+ ${cssProperty}: var(${suggestedFix.tokenName});`);\n break;\n }\n\n return lines;\n}\n\n/**\n * Detect the style type from file extension and name\n */\nfunction detectStyleType(file: string): Patch[\"styleType\"] {\n if (file.endsWith(\".css\")) return \"css\";\n if (file.endsWith(\".module.css\") || file.endsWith(\".module.scss\")) return \"css-module\";\n if (file.includes(\"styled\") || file.includes(\"emotion\")) return \"styled-components\";\n // Default to inline for TSX/JSX files\n if (file.endsWith(\".tsx\") || file.endsWith(\".jsx\")) return \"inline\";\n return \"css\";\n}\n\n/**\n * Convert camelCase to kebab-case\n */\nfunction toCssProperty(prop: string): string {\n return prop.replace(/([A-Z])/g, \"-$1\").toLowerCase();\n}\n\n/**\n * Convert kebab-case to camelCase\n */\nfunction toCamelCase(prop: string): string {\n return prop.replace(/-([a-z])/g, (_, c) => c.toUpperCase());\n}\n\n/**\n * Generate patches for CSS-in-JS patterns\n *\n * Handles common patterns:\n * - styled-components: styled.div`...`\n * - emotion: css`...` or css={{...}}\n * - inline: style={{...}}\n */\nexport function generateCSSInJSPatches(\n sourceCode: string,\n fixes: Array<{\n property: string;\n currentValue: string;\n tokenName: string;\n }>,\n options: { fileName?: string } = {}\n): Patch[] {\n const patches: Patch[] = [];\n const fileName = options.fileName || \"component.tsx\";\n\n for (const fix of fixes) {\n // Find the property in source code\n const cssProperty = toCssProperty(fix.property);\n const camelProperty = toCamelCase(cssProperty);\n\n // Try to find inline style pattern: propertyName: 'value' or propertyName: \"value\"\n const inlinePattern = new RegExp(\n `(${camelProperty}\\\\s*:\\\\s*)(['\"]?)${escapeRegExp(fix.currentValue)}\\\\2`,\n \"g\"\n );\n\n // Try to find CSS pattern: property-name: value;\n const cssPattern = new RegExp(\n `(${cssProperty}\\\\s*:\\\\s*)${escapeRegExp(fix.currentValue)}(\\\\s*;)`,\n \"g\"\n );\n\n let match;\n const lines = sourceCode.split(\"\\n\");\n\n // Check inline style pattern\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n if (inlinePattern.test(line)) {\n const newLine = line.replace(\n inlinePattern,\n `$1'var(${fix.tokenName})'`\n );\n\n patches.push({\n file: fileName,\n diff: generateLineDiff(fileName, i + 1, line, newLine),\n lineNumber: i + 1,\n styleType: \"inline\",\n });\n } else if (cssPattern.test(line)) {\n const newLine = line.replace(\n cssPattern,\n `$1var(${fix.tokenName})$2`\n );\n\n patches.push({\n file: fileName,\n diff: generateLineDiff(fileName, i + 1, line, newLine),\n lineNumber: i + 1,\n styleType: \"css\",\n });\n }\n\n // Reset regex state\n inlinePattern.lastIndex = 0;\n cssPattern.lastIndex = 0;\n }\n }\n\n return patches;\n}\n\n/**\n * Generate a unified diff for a single line change\n */\nfunction generateLineDiff(\n file: string,\n lineNumber: number,\n oldLine: string,\n newLine: string\n): string {\n return [\n `--- a/${file}`,\n `+++ b/${file}`,\n `@@ -${lineNumber},1 +${lineNumber},1 @@`,\n `-${oldLine}`,\n `+${newLine}`,\n ].join(\"\\n\");\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/**\n * AST Utilities\n *\n * Provides AST-based style extraction and patching capabilities using Babel.\n * Used for precisely locating style definitions in source files and generating\n * accurate patches for token replacement.\n */\n\nimport { parse, type ParserOptions } from \"@babel/parser\";\nimport traverse, { type NodePath } from \"@babel/traverse\";\nimport generate from \"@babel/generator\";\nimport * as t from \"@babel/types\";\n\n/**\n * Style location information\n */\nexport interface StyleLocation {\n /** Source file path */\n file: string;\n\n /** Line number (1-indexed) */\n line: number;\n\n /** Column number (0-indexed) */\n column: number;\n\n /** End line number */\n endLine?: number;\n\n /** End column number */\n endColumn?: number;\n\n /** Type of style definition */\n type: \"inline\" | \"styled-components\" | \"emotion\" | \"css-module\" | \"css-prop\";\n\n /** Property name (camelCase for inline, kebab-case for CSS) */\n property: string;\n\n /** Current value at this location */\n value: string;\n\n /** Full text of the style definition for context */\n context?: string;\n}\n\n/**\n * Babel parser options for React/TypeScript files\n */\nconst PARSER_OPTIONS: ParserOptions = {\n sourceType: \"module\",\n plugins: [\n \"jsx\",\n \"typescript\",\n [\"decorators\", { decoratorsBeforeExport: true }],\n \"classProperties\",\n \"classPrivateProperties\",\n \"classPrivateMethods\",\n \"exportDefaultFrom\",\n \"exportNamespaceFrom\",\n \"dynamicImport\",\n \"nullishCoalescingOperator\",\n \"optionalChaining\",\n \"objectRestSpread\",\n ],\n};\n\n/**\n * Extract style locations from a React/TypeScript source file\n *\n * Finds style definitions in:\n * - Inline style={{...}} attributes\n * - styled-components template literals\n * - Emotion css={{...}} or css`...`\n * - CSS module className references (returns the class reference, not styles)\n */\nexport function extractStyleLocations(\n sourceCode: string,\n filePath: string\n): StyleLocation[] {\n const locations: StyleLocation[] = [];\n\n let ast: t.File;\n try {\n ast = parse(sourceCode, PARSER_OPTIONS);\n } catch (error) {\n console.error(`Failed to parse ${filePath}:`, error);\n return locations;\n }\n\n traverse(ast, {\n // Handle inline style={{...}} and Emotion css={{...}}\n JSXAttribute(path) {\n const attrName = t.isJSXIdentifier(path.node.name) ? path.node.name.name : null;\n\n // Handle style={{...}}\n if (attrName === \"style\") {\n const value = path.node.value;\n if (t.isJSXExpressionContainer(value)) {\n const expr = value.expression;\n if (t.isObjectExpression(expr)) {\n extractFromObjectExpression(expr, path, filePath, \"inline\", locations);\n }\n }\n return;\n }\n\n // Handle Emotion css={{...}} prop\n if (attrName === \"css\") {\n const value = path.node.value;\n if (t.isJSXExpressionContainer(value)) {\n const expr = value.expression;\n if (t.isObjectExpression(expr)) {\n extractFromObjectExpression(expr, path, filePath, \"emotion\", locations);\n }\n }\n return;\n }\n },\n\n // Handle styled-components: styled.div`...`\n TaggedTemplateExpression(path) {\n const tag = path.node.tag;\n\n // Check for styled.element or styled(Component)\n const isStyledCall =\n (t.isMemberExpression(tag) &&\n t.isIdentifier(tag.object, { name: \"styled\" })) ||\n (t.isCallExpression(tag) &&\n t.isIdentifier(tag.callee, { name: \"styled\" }));\n\n // Check for css`` from emotion or styled-components\n const isCssCall = t.isIdentifier(tag, { name: \"css\" });\n\n if (isStyledCall || isCssCall) {\n extractFromTemplateLiteral(\n path.node.quasi,\n path,\n filePath,\n \"styled-components\",\n locations\n );\n }\n },\n });\n\n return locations;\n}\n\n/**\n * Extract style properties from an object expression\n */\nfunction extractFromObjectExpression(\n obj: t.ObjectExpression,\n path: NodePath,\n filePath: string,\n type: StyleLocation[\"type\"],\n locations: StyleLocation[]\n): void {\n for (const prop of obj.properties) {\n if (!t.isObjectProperty(prop)) continue;\n\n // Get property name\n let propertyName: string | null = null;\n if (t.isIdentifier(prop.key)) {\n propertyName = prop.key.name;\n } else if (t.isStringLiteral(prop.key)) {\n propertyName = prop.key.value;\n }\n\n if (!propertyName) continue;\n\n // Get property value\n let value: string | null = null;\n if (t.isStringLiteral(prop.value)) {\n value = prop.value.value;\n } else if (t.isNumericLiteral(prop.value)) {\n value = String(prop.value.value);\n } else if (t.isTemplateLiteral(prop.value) && prop.value.quasis.length === 1) {\n value = prop.value.quasis[0].value.raw;\n }\n\n if (!value) continue;\n\n const loc = prop.loc;\n if (!loc) continue;\n\n locations.push({\n file: filePath,\n line: loc.start.line,\n column: loc.start.column,\n endLine: loc.end.line,\n endColumn: loc.end.column,\n type,\n property: propertyName,\n value,\n });\n }\n}\n\n/**\n * Extract style properties from a template literal (styled-components, emotion css``)\n */\nfunction extractFromTemplateLiteral(\n template: t.TemplateLiteral,\n path: NodePath,\n filePath: string,\n type: StyleLocation[\"type\"],\n locations: StyleLocation[]\n): void {\n // Combine all quasis to get the full CSS text\n const cssText = template.quasis.map((q) => q.value.raw).join(\"${...}\");\n\n // Parse CSS properties using regex (simplified parser)\n const propertyPattern = /([a-z-]+)\\s*:\\s*([^;{}]+);/gi;\n let match;\n\n while ((match = propertyPattern.exec(cssText)) !== null) {\n const [, property, value] = match;\n\n // Calculate approximate line number from the template start\n const loc = template.loc;\n if (!loc) continue;\n\n // Count newlines before this match to estimate line\n const beforeMatch = cssText.slice(0, match.index);\n const lineOffset = (beforeMatch.match(/\\n/g) || []).length;\n\n locations.push({\n file: filePath,\n line: loc.start.line + lineOffset,\n column: 0, // Approximate\n type,\n property: property.trim(),\n value: value.trim(),\n context: match[0],\n });\n }\n}\n\n/**\n * Result of applying a patch\n */\nexport interface PatchResult {\n /** Whether the patch was successfully applied */\n success: boolean;\n\n /** Modified source code */\n code?: string;\n\n /** Unified diff of the change */\n diff?: string;\n\n /** Error message if failed */\n error?: string;\n}\n\n/**\n * Apply a patch to replace a style value\n *\n * Uses Babel to parse, modify, and regenerate the code with preserved formatting.\n */\nexport function applyPatch(\n sourceCode: string,\n styleLocation: StyleLocation,\n oldValue: string,\n newValue: string\n): PatchResult {\n let ast: t.File;\n try {\n ast = parse(sourceCode, PARSER_OPTIONS);\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse source: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n\n let modified = false;\n const originalLines = sourceCode.split(\"\\n\");\n\n traverse(ast, {\n // Handle inline style={{...}}\n ObjectProperty(path) {\n if (modified) return;\n\n const loc = path.node.loc;\n if (!loc) return;\n\n // Check if this is at the right location\n if (loc.start.line !== styleLocation.line) return;\n\n // Get property name\n let propertyName: string | null = null;\n if (t.isIdentifier(path.node.key)) {\n propertyName = path.node.key.name;\n } else if (t.isStringLiteral(path.node.key)) {\n propertyName = path.node.key.value;\n }\n\n if (propertyName !== styleLocation.property) return;\n\n // Check and update value\n if (t.isStringLiteral(path.node.value) && path.node.value.value === oldValue) {\n path.node.value = t.stringLiteral(newValue);\n modified = true;\n }\n },\n });\n\n if (!modified) {\n return {\n success: false,\n error: `Could not find style property '${styleLocation.property}' with value '${oldValue}' at line ${styleLocation.line}`,\n };\n }\n\n // Generate modified code\n const result = generate(ast, {\n retainLines: true,\n compact: false,\n });\n\n // Generate unified diff\n const newLines = result.code.split(\"\\n\");\n const diff = generateUnifiedDiff(\n styleLocation.file,\n originalLines,\n newLines,\n styleLocation.line\n );\n\n return {\n success: true,\n code: result.code,\n diff,\n };\n}\n\n/**\n * Generate a unified diff for a file change\n */\nfunction generateUnifiedDiff(\n file: string,\n originalLines: string[],\n newLines: string[],\n changedLine: number\n): string {\n const diffLines: string[] = [];\n\n diffLines.push(`--- a/${file}`);\n diffLines.push(`+++ b/${file}`);\n\n // Find the changed region with context\n const contextSize = 3;\n const start = Math.max(0, changedLine - contextSize - 1);\n const end = Math.min(originalLines.length, changedLine + contextSize);\n\n diffLines.push(`@@ -${start + 1},${end - start} +${start + 1},${end - start} @@`);\n\n for (let i = start; i < end; i++) {\n const origLine = originalLines[i] || \"\";\n const newLine = newLines[i] || \"\";\n\n if (origLine !== newLine) {\n diffLines.push(`-${origLine}`);\n diffLines.push(`+${newLine}`);\n } else {\n diffLines.push(` ${origLine}`);\n }\n }\n\n return diffLines.join(\"\\n\");\n}\n\n/**\n * Find all style property occurrences matching a value\n */\nexport function findStyleOccurrences(\n sourceCode: string,\n filePath: string,\n propertyPattern: string | RegExp,\n valuePattern: string | RegExp\n): StyleLocation[] {\n const locations = extractStyleLocations(sourceCode, filePath);\n\n const propRegex = typeof propertyPattern === \"string\"\n ? new RegExp(`^${propertyPattern}$`, \"i\")\n : propertyPattern;\n\n const valueRegex = typeof valuePattern === \"string\"\n ? new RegExp(`^${escapeRegExp(valuePattern)}$`, \"i\")\n : valuePattern;\n\n return locations.filter((loc) => {\n return propRegex.test(loc.property) && valueRegex.test(loc.value);\n });\n}\n\n/**\n * Escape special regex characters\n */\nfunction escapeRegExp(string: string): string {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * Batch apply multiple patches to a source file\n */\nexport function applyPatches(\n sourceCode: string,\n patches: Array<{\n location: StyleLocation;\n oldValue: string;\n newValue: string;\n }>\n): PatchResult {\n // Sort patches by line number descending to avoid offset issues\n const sortedPatches = [...patches].sort((a, b) => b.location.line - a.location.line);\n\n let currentCode = sourceCode;\n const allDiffs: string[] = [];\n\n for (const patch of sortedPatches) {\n const result = applyPatch(currentCode, patch.location, patch.oldValue, patch.newValue);\n\n if (!result.success) {\n return {\n success: false,\n error: `Failed to apply patch at line ${patch.location.line}: ${result.error}`,\n };\n }\n\n currentCode = result.code!;\n if (result.diff) {\n allDiffs.push(result.diff);\n }\n }\n\n return {\n success: true,\n code: currentCode,\n diff: allDiffs.join(\"\\n\\n\"),\n };\n}\n","/**\n * Metrics Store\n *\n * Persists compliance metrics over time for trend analysis.\n * Stores snapshots in .segments/metrics/ directory.\n */\n\nimport { readFile, writeFile, mkdir, readdir } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport { BRAND } from \"../core/index.js\";\n\n/**\n * A single compliance snapshot for a component\n */\nexport interface ComplianceSnapshot {\n /** ISO timestamp when snapshot was taken */\n timestamp: string;\n\n /** Component name */\n component: string;\n\n /** Compliance percentage (0-100) */\n compliance: number;\n\n /** Number of violations */\n violations: number;\n\n /** Detailed violation info */\n violationDetails?: Array<{\n property: string;\n issue: string;\n severity: \"error\" | \"warning\";\n }>;\n\n /** Git commit hash if available */\n commitHash?: string;\n\n /** Branch name if available */\n branch?: string;\n}\n\n/**\n * Aggregated metrics for trend analysis\n */\nexport interface MetricsTrend {\n /** Component name or 'system' for aggregate */\n component: string;\n\n /** Time period */\n period: \"day\" | \"week\" | \"month\";\n\n /** Data points */\n dataPoints: Array<{\n date: string;\n compliance: number;\n violations: number;\n }>;\n\n /** Trend direction */\n trend: \"improving\" | \"stable\" | \"declining\";\n\n /** Average compliance over period */\n averageCompliance: number;\n}\n\n/**\n * Options for metrics queries\n */\nexport interface MetricsQueryOptions {\n /** Number of days to look back (default: 30) */\n days?: number;\n\n /** Filter by component */\n component?: string;\n\n /** Group by period */\n groupBy?: \"day\" | \"week\" | \"month\";\n}\n\n/**\n * Metrics Store for persisting compliance data\n */\nexport class MetricsStore {\n private readonly projectRoot: string;\n private readonly metricsDir: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.metricsDir = join(projectRoot, BRAND.dataDir, \"metrics\");\n }\n\n /**\n * Save a compliance snapshot\n */\n async saveSnapshot(snapshot: ComplianceSnapshot): Promise<string> {\n // Ensure metrics directory exists\n await mkdir(this.metricsDir, { recursive: true });\n\n // Create filename with timestamp and component\n const date = new Date(snapshot.timestamp);\n const dateStr = date.toISOString().split(\"T\")[0]; // YYYY-MM-DD\n const filename = `${dateStr}_${snapshot.component}.json`;\n const filepath = join(this.metricsDir, filename);\n\n // Append to existing file for the day or create new\n let snapshots: ComplianceSnapshot[] = [];\n try {\n const existing = await readFile(filepath, \"utf-8\");\n snapshots = JSON.parse(existing);\n } catch {\n // File doesn't exist, start fresh\n }\n\n snapshots.push(snapshot);\n\n await writeFile(filepath, JSON.stringify(snapshots, null, 2));\n\n return filepath;\n }\n\n /**\n * Get compliance history for a component\n */\n async getHistory(\n component: string,\n options: MetricsQueryOptions = {}\n ): Promise<ComplianceSnapshot[]> {\n const { days = 30 } = options;\n\n const snapshots: ComplianceSnapshot[] = [];\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - days);\n\n try {\n const files = await readdir(this.metricsDir);\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n // Check if file is within date range\n const dateStr = file.split(\"_\")[0];\n const fileDate = new Date(dateStr);\n if (fileDate < cutoffDate) continue;\n\n // Check if file matches component\n if (component !== \"all\" && !file.includes(`_${component}.json`)) {\n continue;\n }\n\n try {\n const content = await readFile(join(this.metricsDir, file), \"utf-8\");\n const fileSnapshots: ComplianceSnapshot[] = JSON.parse(content);\n\n // Filter to matching component\n const matching = component === \"all\"\n ? fileSnapshots\n : fileSnapshots.filter((s) => s.component === component);\n\n snapshots.push(...matching);\n } catch {\n // Skip malformed files\n }\n }\n } catch {\n // Metrics directory doesn't exist\n return [];\n }\n\n // Sort by timestamp\n snapshots.sort(\n (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()\n );\n\n return snapshots;\n }\n\n /**\n * Get system-wide compliance history\n */\n async getSystemHistory(options: MetricsQueryOptions = {}): Promise<ComplianceSnapshot[]> {\n return this.getHistory(\"all\", options);\n }\n\n /**\n * Calculate compliance trend for a component\n */\n async getTrend(\n component: string,\n options: MetricsQueryOptions = {}\n ): Promise<MetricsTrend> {\n const { days = 30, groupBy = \"day\" } = options;\n\n const snapshots = await this.getHistory(component, { days });\n\n // Group by period\n const groups = new Map<string, ComplianceSnapshot[]>();\n\n for (const snapshot of snapshots) {\n const date = new Date(snapshot.timestamp);\n let key: string;\n\n switch (groupBy) {\n case \"week\":\n // Get ISO week\n const weekStart = new Date(date);\n weekStart.setDate(date.getDate() - date.getDay());\n key = weekStart.toISOString().split(\"T\")[0];\n break;\n case \"month\":\n key = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, \"0\")}`;\n break;\n case \"day\":\n default:\n key = date.toISOString().split(\"T\")[0];\n break;\n }\n\n const existing = groups.get(key) || [];\n existing.push(snapshot);\n groups.set(key, existing);\n }\n\n // Calculate aggregates for each period\n const dataPoints: MetricsTrend[\"dataPoints\"] = [];\n\n for (const [date, periodSnapshots] of groups) {\n const avgCompliance =\n periodSnapshots.reduce((sum, s) => sum + s.compliance, 0) /\n periodSnapshots.length;\n const totalViolations = periodSnapshots.reduce(\n (sum, s) => sum + s.violations,\n 0\n );\n\n dataPoints.push({\n date,\n compliance: Math.round(avgCompliance * 100) / 100,\n violations: totalViolations,\n });\n }\n\n // Sort by date\n dataPoints.sort((a, b) => a.date.localeCompare(b.date));\n\n // Determine trend\n let trend: MetricsTrend[\"trend\"] = \"stable\";\n if (dataPoints.length >= 2) {\n const first = dataPoints.slice(0, Math.ceil(dataPoints.length / 2));\n const second = dataPoints.slice(Math.ceil(dataPoints.length / 2));\n\n const firstAvg =\n first.reduce((sum, d) => sum + d.compliance, 0) / first.length;\n const secondAvg =\n second.reduce((sum, d) => sum + d.compliance, 0) / second.length;\n\n const diff = secondAvg - firstAvg;\n if (diff > 2) trend = \"improving\";\n else if (diff < -2) trend = \"declining\";\n }\n\n const averageCompliance =\n dataPoints.length > 0\n ? dataPoints.reduce((sum, d) => sum + d.compliance, 0) / dataPoints.length\n : 0;\n\n return {\n component,\n period: groupBy,\n dataPoints,\n trend,\n averageCompliance: Math.round(averageCompliance * 100) / 100,\n };\n }\n\n /**\n * Generate an ASCII sparkline for terminal display\n */\n generateSparkline(dataPoints: Array<{ compliance: number }>): string {\n if (dataPoints.length === 0) return \"─\";\n\n const chars = \" ▁▂▃▄▅▆▇█\";\n const values = dataPoints.map((d) => d.compliance);\n const min = Math.min(...values);\n const max = Math.max(...values);\n const range = max - min || 1;\n\n return values\n .map((v) => {\n const normalized = (v - min) / range;\n const index = Math.round(normalized * (chars.length - 1));\n return chars[index];\n })\n .join(\"\");\n }\n\n /**\n * Delete old metrics beyond retention period\n */\n async cleanup(retentionDays: number = 90): Promise<number> {\n const cutoffDate = new Date();\n cutoffDate.setDate(cutoffDate.getDate() - retentionDays);\n\n let deleted = 0;\n\n try {\n const files = await readdir(this.metricsDir);\n const { unlink } = await import(\"node:fs/promises\");\n\n for (const file of files) {\n if (!file.endsWith(\".json\")) continue;\n\n const dateStr = file.split(\"_\")[0];\n const fileDate = new Date(dateStr);\n\n if (fileDate < cutoffDate) {\n await unlink(join(this.metricsDir, file));\n deleted++;\n }\n }\n } catch {\n // Metrics directory doesn't exist\n }\n\n return deleted;\n }\n}\n\n/**\n * Create a metrics store instance\n */\nexport function createMetricsStore(projectRoot: string): MetricsStore {\n return new MetricsStore(projectRoot);\n}\n","/**\n * AST Scanner for Component Usage Analysis\n *\n * Scans TypeScript/TSX files to find:\n * - Component imports (named, default, aliased)\n * - Component usages in JSX with props\n */\n\nimport { parse, type ParserOptions } from \"@babel/parser\";\nimport _traverse from \"@babel/traverse\";\nimport * as t from \"@babel/types\";\n\n// Handle CommonJS/ESM interop\nconst traverse = (_traverse as unknown as { default: typeof _traverse }).default || _traverse;\nimport { readFile } from \"node:fs/promises\";\nimport type {\n ComponentImport,\n ComponentUsage,\n UsageProps,\n} from \"./types.js\";\n\n/**\n * Babel parser options for React/TypeScript files\n */\nconst PARSER_OPTIONS: ParserOptions = {\n sourceType: \"module\",\n plugins: [\n \"jsx\",\n \"typescript\",\n [\"decorators\", { decoratorsBeforeExport: true }],\n \"classProperties\",\n \"classPrivateProperties\",\n \"classPrivateMethods\",\n \"exportDefaultFrom\",\n \"exportNamespaceFrom\",\n \"dynamicImport\",\n \"nullishCoalescingOperator\",\n \"optionalChaining\",\n \"objectRestSpread\",\n ],\n};\n\n/**\n * Scan a file for component imports\n *\n * Handles:\n * - Named imports: import { Button } from './Button'\n * - Default imports: import Button from './Button'\n * - Aliased imports: import { Button as Btn } from './Button'\n * - Namespace imports: import * as Components from './index'\n */\nexport async function scanFileForImports(\n filePath: string\n): Promise<ComponentImport[]> {\n const imports: ComponentImport[] = [];\n\n try {\n const sourceCode = await readFile(filePath, \"utf-8\");\n const ast = parse(sourceCode, PARSER_OPTIONS);\n\n traverse(ast, {\n ImportDeclaration(path) {\n const source = path.node.source.value;\n const line = path.node.loc?.start.line ?? 0;\n\n for (const specifier of path.node.specifiers) {\n if (t.isImportSpecifier(specifier)) {\n // Named import: import { Button } from './Button'\n // or aliased: import { Button as Btn } from './Button'\n const importedName = t.isIdentifier(specifier.imported)\n ? specifier.imported.name\n : specifier.imported.value;\n const localName = specifier.local.name;\n\n // Only track PascalCase names (likely components)\n if (isPascalCase(importedName)) {\n imports.push({\n componentName: importedName,\n localName,\n source,\n isDefault: false,\n filePath,\n line,\n });\n }\n } else if (t.isImportDefaultSpecifier(specifier)) {\n // Default import: import Button from './Button'\n const localName = specifier.local.name;\n\n // Only track PascalCase names (likely components)\n if (isPascalCase(localName)) {\n imports.push({\n componentName: localName,\n localName,\n source,\n isDefault: true,\n filePath,\n line,\n });\n }\n }\n // Skip namespace imports for now (import * as X)\n }\n },\n });\n } catch (error) {\n // Return empty array for files with parse errors\n // Caller can check if empty means \"no imports\" or \"parse error\"\n console.warn(`Failed to parse ${filePath}:`, (error as Error).message);\n return [];\n }\n\n return imports;\n}\n\n/**\n * Scan a file for component usages in JSX\n *\n * @param filePath - File to scan\n * @param componentNames - Map of localName -> componentName for components to track\n */\nexport async function scanFileForUsages(\n filePath: string,\n componentNames: Map<string, string>\n): Promise<ComponentUsage[]> {\n const usages: ComponentUsage[] = [];\n\n try {\n const sourceCode = await readFile(filePath, \"utf-8\");\n const lines = sourceCode.split(\"\\n\");\n const ast = parse(sourceCode, PARSER_OPTIONS);\n\n traverse(ast, {\n JSXOpeningElement(path) {\n const elementName = getJSXElementName(path.node.name);\n if (!elementName) return;\n\n // Check if this is a tracked component (by local name)\n const componentName = componentNames.get(elementName);\n if (!componentName) return;\n\n const loc = path.node.loc;\n if (!loc) return;\n\n // Extract props\n const props = extractProps(path.node.attributes);\n\n // Get surrounding context (3 lines before and after)\n const contextLines = getContextLines(lines, loc.start.line - 1, 3);\n\n // Check if conditionally rendered\n const isConditional = checkIfConditional(path);\n\n // Get parent element name\n const parentElement = getParentElementName(path);\n\n usages.push({\n componentName,\n filePath,\n line: loc.start.line,\n column: loc.start.column,\n props,\n context: contextLines,\n parentElement,\n hasSpreadProps: props.spreads.length > 0,\n isConditional,\n });\n },\n });\n } catch (error) {\n console.warn(`Failed to parse ${filePath}:`, (error as Error).message);\n return [];\n }\n\n return usages;\n}\n\n/**\n * Scan a file for both imports and usages in a single pass\n * More efficient for scanning many files\n */\nexport async function scanFile(\n filePath: string,\n trackedComponents?: Set<string>\n): Promise<{ imports: ComponentImport[]; usages: ComponentUsage[] }> {\n const imports: ComponentImport[] = [];\n const usages: ComponentUsage[] = [];\n\n try {\n const sourceCode = await readFile(filePath, \"utf-8\");\n const lines = sourceCode.split(\"\\n\");\n const ast = parse(sourceCode, PARSER_OPTIONS);\n\n // Track local names to component names mapping within this file\n const localToComponent = new Map<string, string>();\n\n traverse(ast, {\n ImportDeclaration(path) {\n const source = path.node.source.value;\n const line = path.node.loc?.start.line ?? 0;\n\n for (const specifier of path.node.specifiers) {\n if (t.isImportSpecifier(specifier)) {\n const importedName = t.isIdentifier(specifier.imported)\n ? specifier.imported.name\n : specifier.imported.value;\n const localName = specifier.local.name;\n\n if (isPascalCase(importedName)) {\n // If we're tracking specific components, only add those\n if (!trackedComponents || trackedComponents.has(importedName)) {\n imports.push({\n componentName: importedName,\n localName,\n source,\n isDefault: false,\n filePath,\n line,\n });\n localToComponent.set(localName, importedName);\n }\n }\n } else if (t.isImportDefaultSpecifier(specifier)) {\n const localName = specifier.local.name;\n\n if (isPascalCase(localName)) {\n if (!trackedComponents || trackedComponents.has(localName)) {\n imports.push({\n componentName: localName,\n localName,\n source,\n isDefault: true,\n filePath,\n line,\n });\n localToComponent.set(localName, localName);\n }\n }\n }\n }\n },\n\n JSXOpeningElement(path) {\n const elementName = getJSXElementName(path.node.name);\n if (!elementName) return;\n\n // Check if this is a tracked component (by local name)\n const componentName = localToComponent.get(elementName);\n if (!componentName) return;\n\n const loc = path.node.loc;\n if (!loc) return;\n\n const props = extractProps(path.node.attributes);\n const contextLines = getContextLines(lines, loc.start.line - 1, 3);\n const isConditional = checkIfConditional(path);\n const parentElement = getParentElementName(path);\n\n usages.push({\n componentName,\n filePath,\n line: loc.start.line,\n column: loc.start.column,\n props,\n context: contextLines,\n parentElement,\n hasSpreadProps: props.spreads.length > 0,\n isConditional,\n });\n },\n });\n } catch (error) {\n console.warn(`Failed to parse ${filePath}:`, (error as Error).message);\n return { imports: [], usages: [] };\n }\n\n return { imports, usages };\n}\n\n/**\n * Check if a string is PascalCase (likely a component name)\n */\nfunction isPascalCase(str: string): boolean {\n return /^[A-Z][a-zA-Z0-9]*$/.test(str);\n}\n\n/**\n * Get the element name from a JSX element name node\n */\nfunction getJSXElementName(\n name: t.JSXIdentifier | t.JSXMemberExpression | t.JSXNamespacedName\n): string | null {\n if (t.isJSXIdentifier(name)) {\n return name.name;\n }\n if (t.isJSXMemberExpression(name)) {\n // Handle Component.SubComponent - return the full path\n const parts: string[] = [];\n let current: t.JSXMemberExpression | t.JSXIdentifier = name;\n while (t.isJSXMemberExpression(current)) {\n parts.unshift(current.property.name);\n current = current.object as t.JSXMemberExpression | t.JSXIdentifier;\n }\n if (t.isJSXIdentifier(current)) {\n parts.unshift(current.name);\n }\n return parts.join(\".\");\n }\n return null;\n}\n\n/**\n * Extract props from JSX attributes\n */\nfunction extractProps(\n attributes: (t.JSXAttribute | t.JSXSpreadAttribute)[]\n): UsageProps {\n const result: UsageProps = {\n static: {},\n dynamic: [],\n spreads: [],\n };\n\n for (const attr of attributes) {\n if (t.isJSXSpreadAttribute(attr)) {\n // {...props} or {...otherProps}\n if (t.isIdentifier(attr.argument)) {\n result.spreads.push(attr.argument.name);\n } else {\n result.spreads.push(\"(expression)\");\n }\n } else if (t.isJSXAttribute(attr)) {\n const propName = t.isJSXIdentifier(attr.name)\n ? attr.name.name\n : `${attr.name.namespace.name}:${attr.name.name.name}`;\n\n const value = attr.value;\n\n if (value === null) {\n // Boolean shorthand: <Button disabled />\n result.static[propName] = true;\n } else if (t.isStringLiteral(value)) {\n // String literal: <Button variant=\"primary\" />\n result.static[propName] = value.value;\n } else if (t.isJSXExpressionContainer(value)) {\n const expr = value.expression;\n\n if (t.isStringLiteral(expr)) {\n result.static[propName] = expr.value;\n } else if (t.isNumericLiteral(expr)) {\n result.static[propName] = expr.value;\n } else if (t.isBooleanLiteral(expr)) {\n result.static[propName] = expr.value;\n } else if (t.isTemplateLiteral(expr) && expr.expressions.length === 0) {\n // Static template literal: variant={`primary`}\n result.static[propName] = expr.quasis.map((q) => q.value.raw).join(\"\");\n } else {\n // Dynamic expression\n result.dynamic.push(propName);\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Get surrounding context lines\n */\nfunction getContextLines(\n lines: string[],\n centerLine: number,\n radius: number\n): string {\n const start = Math.max(0, centerLine - radius);\n const end = Math.min(lines.length, centerLine + radius + 1);\n return lines.slice(start, end).join(\"\\n\");\n}\n\n/**\n * Check if JSX element is conditionally rendered\n */\nfunction checkIfConditional(path: babel.NodePath<t.JSXOpeningElement>): boolean {\n let current: babel.NodePath | null = path.parentPath;\n\n while (current) {\n // Check for {condition && <Component />}\n if (\n current.isLogicalExpression() &&\n current.node.operator === \"&&\"\n ) {\n return true;\n }\n\n // Check for {condition ? <Component /> : null}\n if (current.isConditionalExpression()) {\n return true;\n }\n\n // Check for ternary in JSX expression container\n if (\n current.isJSXExpressionContainer() &&\n current.parentPath?.isJSXElement()\n ) {\n const expr = current.node.expression;\n if (\n t.isLogicalExpression(expr) ||\n t.isConditionalExpression(expr)\n ) {\n return true;\n }\n }\n\n current = current.parentPath;\n }\n\n return false;\n}\n\n/**\n * Get the parent JSX element name\n */\nfunction getParentElementName(\n path: babel.NodePath<t.JSXOpeningElement>\n): string | undefined {\n let current: babel.NodePath | null = path.parentPath;\n const currentElementName = getJSXElementName(path.node.name);\n\n while (current) {\n if (current.isJSXElement()) {\n const opening = current.node.openingElement;\n const name = getJSXElementName(opening.name);\n if (name && name !== currentElementName) {\n return name;\n }\n }\n current = current.parentPath;\n }\n\n return undefined;\n}\n\n// Type import for babel NodePath\nimport type * as babel from \"@babel/traverse\";\n","/**\n * Usage Pattern Aggregator\n *\n * Aggregates component usages into patterns for AI analysis.\n */\n\nimport type {\n ComponentUsage,\n ComponentImport,\n ComponentAnalysis,\n UsagePattern,\n FileContext,\n UsageAnalysis,\n} from \"./types.js\";\n\n/**\n * Aggregate usages for a single component into patterns\n */\nexport function aggregateComponentUsages(\n componentName: string,\n sourceFile: string,\n usages: ComponentUsage[],\n imports: ComponentImport[]\n): ComponentAnalysis {\n // Count unique files\n const uniqueFiles = new Set(usages.map((u) => u.filePath));\n\n // Group usages by prop pattern\n const patternMap = new Map<string, UsagePattern>();\n\n for (const usage of usages) {\n // Create a key from static props (sorted for consistency)\n const propKey = createPropKey(usage.props.static);\n\n const existing = patternMap.get(propKey);\n if (existing) {\n existing.count++;\n if (!existing.files.includes(usage.filePath)) {\n existing.files.push(usage.filePath);\n }\n if (existing.sampleContexts.length < 3) {\n existing.sampleContexts.push(usage.context);\n }\n } else {\n patternMap.set(propKey, {\n props: { ...usage.props.static },\n count: 1,\n files: [usage.filePath],\n sampleContexts: [usage.context],\n });\n }\n }\n\n // Sort patterns by frequency\n const patterns = Array.from(patternMap.values()).sort(\n (a, b) => b.count - a.count\n );\n\n // Classify file contexts\n const contextMap = new Map<FileContext, { count: number; files: string[] }>();\n\n for (const usage of usages) {\n const context = classifyFileContext(usage.filePath, usage.context);\n const existing = contextMap.get(context);\n if (existing) {\n existing.count++;\n if (!existing.files.includes(usage.filePath)) {\n existing.files.push(usage.filePath);\n }\n } else {\n contextMap.set(context, { count: 1, files: [usage.filePath] });\n }\n }\n\n // Convert to sorted array\n const contexts = Array.from(contextMap.entries())\n .map(([type, data]) => ({ type, ...data }))\n .sort((a, b) => b.count - a.count);\n\n return {\n name: componentName,\n sourceFile,\n totalUsages: usages.length,\n uniqueFiles: uniqueFiles.size,\n patterns,\n contexts,\n usages,\n imports,\n };\n}\n\n/**\n * Aggregate all usages across the codebase\n */\nexport function aggregateAllUsages(\n usages: ComponentUsage[],\n imports: ComponentImport[],\n componentSources: Map<string, string>\n): UsageAnalysis {\n // Group usages by component\n const usagesByComponent = new Map<string, ComponentUsage[]>();\n for (const usage of usages) {\n const existing = usagesByComponent.get(usage.componentName) ?? [];\n existing.push(usage);\n usagesByComponent.set(usage.componentName, existing);\n }\n\n // Group imports by component\n const importsByComponent = new Map<string, ComponentImport[]>();\n for (const imp of imports) {\n const existing = importsByComponent.get(imp.componentName) ?? [];\n existing.push(imp);\n importsByComponent.set(imp.componentName, existing);\n }\n\n // Build component analyses\n const components: Record<string, ComponentAnalysis> = {};\n const allComponentNames = new Set([\n ...usagesByComponent.keys(),\n ...importsByComponent.keys(),\n ]);\n\n for (const componentName of allComponentNames) {\n const componentUsages = usagesByComponent.get(componentName) ?? [];\n const componentImports = importsByComponent.get(componentName) ?? [];\n const sourceFile = componentSources.get(componentName) ?? \"unknown\";\n\n components[componentName] = aggregateComponentUsages(\n componentName,\n sourceFile,\n componentUsages,\n componentImports\n );\n }\n\n // Collect unique files\n const allFiles = new Set<string>();\n for (const usage of usages) {\n allFiles.add(usage.filePath);\n }\n for (const imp of imports) {\n allFiles.add(imp.filePath);\n }\n\n return {\n timestamp: new Date().toISOString(),\n rootDir: \"\", // Will be set by caller\n totalFiles: allFiles.size,\n totalComponents: Object.keys(components).length,\n components,\n errorFiles: [], // Will be populated by scanner\n };\n}\n\n/**\n * Create a stable key from props for pattern grouping\n */\nfunction createPropKey(props: Record<string, string | boolean | number>): string {\n const entries = Object.entries(props).sort(([a], [b]) => a.localeCompare(b));\n return entries.map(([k, v]) => `${k}=${JSON.stringify(v)}`).join(\"|\");\n}\n\n/**\n * Classify file context based on path and content\n */\nfunction classifyFileContext(filePath: string, context: string): FileContext {\n const lowerPath = filePath.toLowerCase();\n const lowerContext = context.toLowerCase();\n\n // Check path patterns first\n if (\n lowerPath.includes(\"/modal\") ||\n lowerPath.includes(\"modal.\") ||\n lowerContext.includes(\"<modal\")\n ) {\n return \"modal\";\n }\n\n if (\n lowerPath.includes(\"/dialog\") ||\n lowerPath.includes(\"dialog.\") ||\n lowerContext.includes(\"<dialog\")\n ) {\n return \"dialog\";\n }\n\n if (\n lowerPath.includes(\"/form\") ||\n lowerPath.includes(\"form.\") ||\n lowerContext.includes(\"<form\") ||\n lowerContext.includes(\"onsubmit\")\n ) {\n return \"form\";\n }\n\n if (\n lowerPath.includes(\"/page\") ||\n lowerPath.includes(\"pages/\") ||\n lowerPath.includes(\"/routes/\")\n ) {\n return \"page\";\n }\n\n if (\n lowerPath.includes(\"/layout\") ||\n lowerPath.includes(\"layout.\") ||\n lowerPath.includes(\"/layouts/\")\n ) {\n return \"layout\";\n }\n\n if (\n lowerPath.includes(\"/card\") ||\n lowerPath.includes(\"card.\") ||\n lowerContext.includes(\"<card\")\n ) {\n return \"card\";\n }\n\n if (\n lowerPath.includes(\"/table\") ||\n lowerPath.includes(\"table.\") ||\n lowerContext.includes(\"<table\") ||\n lowerContext.includes(\"<tr\")\n ) {\n return \"table\";\n }\n\n if (\n lowerPath.includes(\"/list\") ||\n lowerPath.includes(\"list.\") ||\n lowerContext.includes(\"<ul\") ||\n lowerContext.includes(\"<ol\") ||\n lowerContext.includes(\"<li\")\n ) {\n return \"list\";\n }\n\n if (\n lowerPath.includes(\"/nav\") ||\n lowerPath.includes(\"navigation\") ||\n lowerContext.includes(\"<nav\")\n ) {\n return \"navigation\";\n }\n\n if (\n lowerPath.includes(\"/header\") ||\n lowerPath.includes(\"header.\") ||\n lowerContext.includes(\"<header\")\n ) {\n return \"header\";\n }\n\n if (\n lowerPath.includes(\"/footer\") ||\n lowerPath.includes(\"footer.\") ||\n lowerContext.includes(\"<footer\")\n ) {\n return \"footer\";\n }\n\n if (\n lowerPath.includes(\"/sidebar\") ||\n lowerPath.includes(\"sidebar.\") ||\n lowerContext.includes(\"<aside\")\n ) {\n return \"sidebar\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Find common prop combinations across usages\n */\nexport function findCommonPropCombinations(\n usages: ComponentUsage[],\n minOccurrences: number = 3\n): { props: string[]; count: number }[] {\n const combinations = new Map<string, number>();\n\n for (const usage of usages) {\n // Get all prop names (static and dynamic)\n const allProps = [\n ...Object.keys(usage.props.static),\n ...usage.props.dynamic,\n ].sort();\n\n // Generate all combinations of 2+ props\n for (let size = 2; size <= Math.min(allProps.length, 4); size++) {\n for (const combo of combinations_k(allProps, size)) {\n const key = combo.join(\",\");\n combinations.set(key, (combinations.get(key) ?? 0) + 1);\n }\n }\n }\n\n // Filter and sort by frequency\n return Array.from(combinations.entries())\n .filter(([, count]) => count >= minOccurrences)\n .map(([key, count]) => ({ props: key.split(\",\"), count }))\n .sort((a, b) => b.count - a.count);\n}\n\n/**\n * Generate k-combinations of an array\n */\nfunction* combinations_k<T>(arr: T[], k: number): Generator<T[]> {\n if (k === 0) {\n yield [];\n return;\n }\n if (arr.length < k) return;\n\n for (let i = 0; i <= arr.length - k; i++) {\n for (const combo of combinations_k(arr.slice(i + 1), k - 1)) {\n yield [arr[i], ...combo];\n }\n }\n}\n\n/**\n * Component relationship with frequency data\n */\nexport interface ComponentRelation {\n /** Related component name */\n component: string;\n /** Type of relationship */\n relationship: \"parent\" | \"sibling\" | \"child\";\n /** How often this relationship occurs */\n frequency: number;\n /** Sample files where this relationship occurs */\n sampleFiles: string[];\n}\n\n/**\n * Infer component relationships from usage patterns\n *\n * Analyzes parent/sibling relationships from actual usage data:\n * - parent: Components that contain this component (from parentElement)\n * - sibling: Components that appear alongside this component in the same parent\n */\nexport function inferRelations(\n componentName: string,\n analysis: ComponentAnalysis,\n allAnalyses: Record<string, ComponentAnalysis>\n): ComponentRelation[] {\n const relations: ComponentRelation[] = [];\n const parentCounts = new Map<string, { count: number; files: string[] }>();\n const siblingCounts = new Map<string, { count: number; files: string[] }>();\n\n // Count parent relationships\n for (const usage of analysis.usages) {\n if (usage.parentElement && usage.parentElement !== \"div\" && usage.parentElement !== \"span\") {\n const parent = usage.parentElement;\n const existing = parentCounts.get(parent);\n if (existing) {\n existing.count++;\n if (!existing.files.includes(usage.filePath)) {\n existing.files.push(usage.filePath);\n }\n } else {\n parentCounts.set(parent, { count: 1, files: [usage.filePath] });\n }\n }\n }\n\n // Infer sibling relationships: other components used in the same files\n const filesWithThisComponent = new Set(analysis.usages.map((u) => u.filePath));\n\n for (const [otherName, otherAnalysis] of Object.entries(allAnalyses)) {\n if (otherName === componentName) continue;\n\n // Count how many files have both components\n let sharedFiles = 0;\n const sharedFileList: string[] = [];\n\n for (const usage of otherAnalysis.usages) {\n if (filesWithThisComponent.has(usage.filePath)) {\n if (!sharedFileList.includes(usage.filePath)) {\n sharedFiles++;\n sharedFileList.push(usage.filePath);\n }\n }\n }\n\n // Only include if they appear together frequently\n if (sharedFiles >= 3) {\n siblingCounts.set(otherName, {\n count: sharedFiles,\n files: sharedFileList.slice(0, 5),\n });\n }\n }\n\n // Convert to relations array (parents)\n for (const [parent, data] of parentCounts) {\n // Only include meaningful parent relationships (count >= 2)\n if (data.count >= 2) {\n relations.push({\n component: parent,\n relationship: \"parent\",\n frequency: data.count,\n sampleFiles: data.files.slice(0, 3),\n });\n }\n }\n\n // Convert to relations array (siblings)\n for (const [sibling, data] of siblingCounts) {\n relations.push({\n component: sibling,\n relationship: \"sibling\",\n frequency: data.count,\n sampleFiles: data.files.slice(0, 3),\n });\n }\n\n // Sort by frequency\n relations.sort((a, b) => b.frequency - a.frequency);\n\n return relations;\n}\n\n/**\n * Infer relations for all components in the analysis\n */\nexport function inferAllRelations(\n analysis: UsageAnalysis\n): Map<string, ComponentRelation[]> {\n const allRelations = new Map<string, ComponentRelation[]>();\n\n for (const [componentName, componentAnalysis] of Object.entries(analysis.components)) {\n const relations = inferRelations(componentName, componentAnalysis, analysis.components);\n if (relations.length > 0) {\n allRelations.set(componentName, relations);\n }\n }\n\n return allRelations;\n}\n\n/**\n * Summarize patterns for AI prompt\n */\nexport function summarizePatternsForPrompt(\n analysis: ComponentAnalysis,\n maxPatterns: number = 10,\n maxContexts: number = 5\n): string {\n const lines: string[] = [];\n\n lines.push(`## ${analysis.name}`);\n lines.push(`Total usages: ${analysis.totalUsages} across ${analysis.uniqueFiles} files`);\n lines.push(\"\");\n\n // Top patterns\n lines.push(\"### Usage Patterns (by frequency)\");\n const topPatterns = analysis.patterns.slice(0, maxPatterns);\n for (const pattern of topPatterns) {\n const propsStr = Object.entries(pattern.props)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \");\n lines.push(`- ${propsStr || \"(no props)\"}: ${pattern.count} usages in ${pattern.files.length} files`);\n }\n lines.push(\"\");\n\n // File contexts\n lines.push(\"### File Contexts\");\n const topContexts = analysis.contexts.slice(0, maxContexts);\n for (const ctx of topContexts) {\n lines.push(`- ${ctx.type}: ${ctx.count} usages`);\n }\n lines.push(\"\");\n\n // Sample code contexts (one per pattern)\n lines.push(\"### Sample Usages\");\n for (const pattern of topPatterns.slice(0, 3)) {\n if (pattern.sampleContexts[0]) {\n lines.push(\"```tsx\");\n lines.push(pattern.sampleContexts[0].trim());\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n","/**\n * Analysis Cache Layer\n *\n * Caches file analysis results to enable fast incremental updates.\n */\n\nimport { readFile, writeFile, stat } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join, dirname } from \"node:path\";\nimport { mkdir } from \"node:fs/promises\";\nimport type {\n AnalysisCache,\n FileCacheEntry,\n FileChanges,\n ComponentImport,\n ComponentUsage,\n CACHE_VERSION,\n} from \"./types.js\";\n\nconst CURRENT_CACHE_VERSION = 1;\nconst CACHE_FILENAME = \"analysis-cache.json\";\n\n/**\n * Get the cache file path for a project\n */\nexport function getCachePath(rootDir: string): string {\n return join(rootDir, \".fragments\", CACHE_FILENAME);\n}\n\n/**\n * Load cache from disk\n * Returns null if cache doesn't exist or is invalid\n */\nexport async function loadCache(rootDir: string): Promise<AnalysisCache | null> {\n const cachePath = getCachePath(rootDir);\n\n if (!existsSync(cachePath)) {\n return null;\n }\n\n try {\n const content = await readFile(cachePath, \"utf-8\");\n const cache = JSON.parse(content) as AnalysisCache;\n\n // Validate version\n if (cache.version !== CURRENT_CACHE_VERSION) {\n console.warn(\n `Cache version mismatch: expected ${CURRENT_CACHE_VERSION}, got ${cache.version}. Invalidating cache.`\n );\n return null;\n }\n\n // Validate root dir matches\n if (cache.rootDir !== rootDir) {\n console.warn(`Cache root mismatch. Invalidating cache.`);\n return null;\n }\n\n return cache;\n } catch (error) {\n console.warn(`Failed to load cache: ${(error as Error).message}`);\n return null;\n }\n}\n\n/**\n * Save cache to disk\n */\nexport async function saveCache(\n rootDir: string,\n cache: AnalysisCache\n): Promise<void> {\n const cachePath = getCachePath(rootDir);\n const cacheDir = dirname(cachePath);\n\n // Ensure .fragments directory exists\n if (!existsSync(cacheDir)) {\n await mkdir(cacheDir, { recursive: true });\n }\n\n cache.updatedAt = new Date().toISOString();\n await writeFile(cachePath, JSON.stringify(cache, null, 2));\n}\n\n/**\n * Create a new empty cache\n */\nexport function createEmptyCache(rootDir: string): AnalysisCache {\n const now = new Date().toISOString();\n return {\n version: CURRENT_CACHE_VERSION,\n createdAt: now,\n updatedAt: now,\n rootDir,\n files: {},\n };\n}\n\n/**\n * Compute content hash for a file\n */\nexport function computeFileHash(content: string): string {\n return createHash(\"md5\").update(content).digest(\"hex\");\n}\n\n/**\n * Compute file hash from disk\n */\nexport async function computeFileHashFromDisk(\n filePath: string\n): Promise<string> {\n const content = await readFile(filePath, \"utf-8\");\n return computeFileHash(content);\n}\n\n/**\n * Check if a file is cached and unchanged\n */\nexport function isFileCached(\n cache: AnalysisCache,\n filePath: string,\n currentHash: string\n): boolean {\n const entry = cache.files[filePath];\n if (!entry) return false;\n return entry.hash === currentHash;\n}\n\n/**\n * Get cached data for a file\n */\nexport function getCachedFile(\n cache: AnalysisCache,\n filePath: string\n): FileCacheEntry | null {\n return cache.files[filePath] ?? null;\n}\n\n/**\n * Update cache with results for a file\n */\nexport function updateCacheFile(\n cache: AnalysisCache,\n filePath: string,\n hash: string,\n imports: ComponentImport[],\n usages: ComponentUsage[]\n): void {\n cache.files[filePath] = {\n hash,\n timestamp: new Date().toISOString(),\n imports,\n usages,\n };\n}\n\n/**\n * Remove a file from cache\n */\nexport function removeCacheFile(cache: AnalysisCache, filePath: string): void {\n delete cache.files[filePath];\n}\n\n/**\n * Invalidate cache entries for specific files\n */\nexport function invalidateCache(\n cache: AnalysisCache,\n filePaths: string[]\n): void {\n for (const filePath of filePaths) {\n delete cache.files[filePath];\n }\n}\n\n/**\n * Detect file changes by comparing current files to cache\n */\nexport async function detectFileChanges(\n cache: AnalysisCache,\n currentFiles: string[],\n getFileHash: (filePath: string) => Promise<string>\n): Promise<FileChanges> {\n const changes: FileChanges = {\n added: [],\n modified: [],\n deleted: [],\n unchanged: [],\n };\n\n const currentFileSet = new Set(currentFiles);\n const cachedFileSet = new Set(Object.keys(cache.files));\n\n // Check for added and modified files\n for (const filePath of currentFiles) {\n const entry = cache.files[filePath];\n\n if (!entry) {\n changes.added.push(filePath);\n } else {\n const currentHash = await getFileHash(filePath);\n if (currentHash !== entry.hash) {\n changes.modified.push(filePath);\n } else {\n changes.unchanged.push(filePath);\n }\n }\n }\n\n // Check for deleted files\n for (const cachedFile of cachedFileSet) {\n if (!currentFileSet.has(cachedFile)) {\n changes.deleted.push(cachedFile);\n }\n }\n\n return changes;\n}\n\n/**\n * Get all cached imports\n */\nexport function getAllCachedImports(cache: AnalysisCache): ComponentImport[] {\n const imports: ComponentImport[] = [];\n for (const entry of Object.values(cache.files)) {\n imports.push(...entry.imports);\n }\n return imports;\n}\n\n/**\n * Get all cached usages\n */\nexport function getAllCachedUsages(cache: AnalysisCache): ComponentUsage[] {\n const usages: ComponentUsage[] = [];\n for (const entry of Object.values(cache.files)) {\n usages.push(...entry.usages);\n }\n return usages;\n}\n\n/**\n * Get cache statistics\n */\nexport function getCacheStats(cache: AnalysisCache): {\n totalFiles: number;\n totalImports: number;\n totalUsages: number;\n cacheAge: string;\n} {\n let totalImports = 0;\n let totalUsages = 0;\n\n for (const entry of Object.values(cache.files)) {\n totalImports += entry.imports.length;\n totalUsages += entry.usages.length;\n }\n\n const ageMs = Date.now() - new Date(cache.updatedAt).getTime();\n const ageMinutes = Math.round(ageMs / 60000);\n const cacheAge =\n ageMinutes < 60\n ? `${ageMinutes} minutes ago`\n : ageMinutes < 1440\n ? `${Math.round(ageMinutes / 60)} hours ago`\n : `${Math.round(ageMinutes / 1440)} days ago`;\n\n return {\n totalFiles: Object.keys(cache.files).length,\n totalImports,\n totalUsages,\n cacheAge,\n };\n}\n","/**\n * Full Codebase Scanner\n *\n * Scans entire codebase for component usage patterns with caching and progress.\n */\n\nimport fg from \"fast-glob\";\nimport { readFile } from \"node:fs/promises\";\nimport { relative, resolve, dirname, basename } from \"node:path\";\nimport type {\n ScanOptions,\n ScanProgress,\n UsageAnalysis,\n ComponentImport,\n ComponentUsage,\n FileChanges,\n AnalysisCache,\n} from \"./types.js\";\nimport { scanFile } from \"./scanner.js\";\nimport { aggregateAllUsages } from \"./aggregator.js\";\nimport {\n loadCache,\n saveCache,\n createEmptyCache,\n computeFileHash,\n isFileCached,\n updateCacheFile,\n removeCacheFile,\n getCachedFile,\n detectFileChanges,\n getCacheStats,\n} from \"./cache.js\";\n\n/**\n * Default patterns for files to scan\n */\nconst DEFAULT_INCLUDE = [\n \"**/*.tsx\",\n \"**/*.ts\",\n \"**/*.jsx\",\n \"**/*.js\",\n];\n\n/**\n * Default patterns for files to exclude\n */\nconst DEFAULT_EXCLUDE = [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.next/**\",\n \"**/coverage/**\",\n \"**/__tests__/**\",\n \"**/*.test.*\",\n \"**/*.spec.*\",\n \"**/*.stories.*\",\n \"**/*.segment.*\",\n \"**/storybook-static/**\",\n];\n\n/**\n * Scan entire codebase for component usages\n */\nexport async function scanCodebase(\n options: ScanOptions\n): Promise<UsageAnalysis> {\n const {\n rootDir,\n include = DEFAULT_INCLUDE,\n exclude = DEFAULT_EXCLUDE,\n componentNames,\n useCache = true,\n onProgress,\n } = options;\n\n const absoluteRoot = resolve(rootDir);\n\n // Load or create cache\n let cache: AnalysisCache | null = null;\n if (useCache) {\n cache = await loadCache(absoluteRoot);\n }\n if (!cache) {\n cache = createEmptyCache(absoluteRoot);\n }\n\n // Discover all files\n onProgress?.({\n current: 0,\n total: 0,\n currentFile: \"\",\n phase: \"discovering\",\n });\n\n const files = await fg(include, {\n cwd: absoluteRoot,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n\n const totalFiles = files.length;\n\n // Track components to find (if specific ones provided)\n const trackedComponents = componentNames\n ? new Set(componentNames)\n : undefined;\n\n // Collect all imports and usages\n const allImports: ComponentImport[] = [];\n const allUsages: ComponentUsage[] = [];\n const errorFiles: string[] = [];\n const componentSources = new Map<string, string>();\n\n // Process files\n for (let i = 0; i < files.length; i++) {\n const filePath = files[i];\n const relativePath = relative(absoluteRoot, filePath);\n\n onProgress?.({\n current: i + 1,\n total: totalFiles,\n currentFile: relativePath,\n phase: \"scanning\",\n });\n\n try {\n // Read file content for hash\n const content = await readFile(filePath, \"utf-8\");\n const fileHash = computeFileHash(content);\n\n // Check cache\n const cachedEntry = getCachedFile(cache, filePath);\n if (cachedEntry && cachedEntry.hash === fileHash) {\n // Use cached results\n allImports.push(...cachedEntry.imports);\n allUsages.push(...cachedEntry.usages);\n\n // Track component sources from imports\n for (const imp of cachedEntry.imports) {\n if (!componentSources.has(imp.componentName)) {\n const sourceFile = resolveImportSource(filePath, imp.source);\n if (sourceFile) {\n componentSources.set(imp.componentName, sourceFile);\n }\n }\n }\n continue;\n }\n\n // Scan file\n const { imports, usages } = await scanFile(filePath, trackedComponents);\n\n // Update cache\n updateCacheFile(cache, filePath, fileHash, imports, usages);\n\n allImports.push(...imports);\n allUsages.push(...usages);\n\n // Track component sources\n for (const imp of imports) {\n if (!componentSources.has(imp.componentName)) {\n const sourceFile = resolveImportSource(filePath, imp.source);\n if (sourceFile) {\n componentSources.set(imp.componentName, sourceFile);\n }\n }\n }\n } catch (error) {\n errorFiles.push(relativePath);\n console.warn(`Error scanning ${relativePath}:`, (error as Error).message);\n }\n }\n\n // Save cache\n if (useCache) {\n await saveCache(absoluteRoot, cache);\n }\n\n // Aggregate results\n onProgress?.({\n current: totalFiles,\n total: totalFiles,\n currentFile: \"\",\n phase: \"aggregating\",\n });\n\n const analysis = aggregateAllUsages(allUsages, allImports, componentSources);\n analysis.rootDir = absoluteRoot;\n analysis.totalFiles = totalFiles;\n analysis.errorFiles = errorFiles;\n\n return analysis;\n}\n\n/**\n * Perform incremental scan for changed files only\n */\nexport async function incrementalScan(\n rootDir: string,\n changes: FileChanges,\n existingCache: AnalysisCache,\n onProgress?: (progress: ScanProgress) => void\n): Promise<{ analysis: UsageAnalysis; cache: AnalysisCache }> {\n const absoluteRoot = resolve(rootDir);\n const cache = { ...existingCache, files: { ...existingCache.files } };\n\n // Remove deleted files from cache\n for (const filePath of changes.deleted) {\n removeCacheFile(cache, filePath);\n }\n\n // Files to scan (added + modified)\n const filesToScan = [...changes.added, ...changes.modified];\n const totalFiles = filesToScan.length;\n\n const allImports: ComponentImport[] = [];\n const allUsages: ComponentUsage[] = [];\n const errorFiles: string[] = [];\n const componentSources = new Map<string, string>();\n\n // First, collect unchanged file data from cache\n for (const filePath of changes.unchanged) {\n const cachedEntry = getCachedFile(cache, filePath);\n if (cachedEntry) {\n allImports.push(...cachedEntry.imports);\n allUsages.push(...cachedEntry.usages);\n\n for (const imp of cachedEntry.imports) {\n if (!componentSources.has(imp.componentName)) {\n const sourceFile = resolveImportSource(filePath, imp.source);\n if (sourceFile) {\n componentSources.set(imp.componentName, sourceFile);\n }\n }\n }\n }\n }\n\n // Scan changed files\n for (let i = 0; i < filesToScan.length; i++) {\n const filePath = filesToScan[i];\n const relativePath = relative(absoluteRoot, filePath);\n\n onProgress?.({\n current: i + 1,\n total: totalFiles,\n currentFile: relativePath,\n phase: \"scanning\",\n });\n\n try {\n const content = await readFile(filePath, \"utf-8\");\n const fileHash = computeFileHash(content);\n\n const { imports, usages } = await scanFile(filePath);\n\n updateCacheFile(cache, filePath, fileHash, imports, usages);\n\n allImports.push(...imports);\n allUsages.push(...usages);\n\n for (const imp of imports) {\n if (!componentSources.has(imp.componentName)) {\n const sourceFile = resolveImportSource(filePath, imp.source);\n if (sourceFile) {\n componentSources.set(imp.componentName, sourceFile);\n }\n }\n }\n } catch (error) {\n errorFiles.push(relativePath);\n }\n }\n\n // Save updated cache\n await saveCache(absoluteRoot, cache);\n\n // Aggregate\n const analysis = aggregateAllUsages(allUsages, allImports, componentSources);\n analysis.rootDir = absoluteRoot;\n analysis.totalFiles = changes.unchanged.length + filesToScan.length;\n analysis.errorFiles = errorFiles;\n\n return { analysis, cache };\n}\n\n/**\n * Resolve import source to absolute file path\n */\nfunction resolveImportSource(\n importingFile: string,\n source: string\n): string | null {\n // Skip node_modules imports\n if (!source.startsWith(\".\") && !source.startsWith(\"/\")) {\n return null;\n }\n\n const importDir = dirname(importingFile);\n\n // Try common extensions\n const extensions = [\"\", \".tsx\", \".ts\", \".jsx\", \".js\", \"/index.tsx\", \"/index.ts\"];\n for (const ext of extensions) {\n const fullPath = resolve(importDir, source + ext);\n // We don't check if file exists here for performance\n // The source path is mainly for reference\n if (ext === \"\" && source.endsWith(\".tsx\")) {\n return fullPath;\n }\n if (ext) {\n return resolve(importDir, source) + ext;\n }\n }\n\n return resolve(importDir, source);\n}\n\n/**\n * Get scan statistics for display\n */\nexport function getScanStats(analysis: UsageAnalysis): {\n totalFiles: number;\n totalComponents: number;\n totalUsages: number;\n topComponents: { name: string; usages: number }[];\n} {\n const totalUsages = Object.values(analysis.components).reduce(\n (sum, c) => sum + c.totalUsages,\n 0\n );\n\n const topComponents = Object.values(analysis.components)\n .map((c) => ({ name: c.name, usages: c.totalUsages }))\n .sort((a, b) => b.usages - a.usages)\n .slice(0, 10);\n\n return {\n totalFiles: analysis.totalFiles,\n totalComponents: analysis.totalComponents,\n totalUsages,\n topComponents,\n };\n}\n\n/**\n * Export for quick check if cache exists and is valid\n */\nexport async function hasCachedAnalysis(rootDir: string): Promise<boolean> {\n const cache = await loadCache(resolve(rootDir));\n if (!cache) return false;\n const stats = getCacheStats(cache);\n return stats.totalFiles > 0;\n}\n\n// Re-export types and utilities\nexport { loadCache, getCacheStats, detectFileChanges } from \"./cache.js\";\n","/**\n * Documentation Extractor\n *\n * Extracts JSDoc, TSDoc, and TypeScript interface information from component files.\n */\n\nimport { parse } from \"@babel/parser\";\nimport _traverse from \"@babel/traverse\";\nimport * as t from \"@babel/types\";\n\n// Handle CommonJS/ESM interop\nconst traverse = (_traverse as unknown as { default: typeof _traverse }).default || _traverse;\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { basename, dirname, join } from \"node:path\";\nimport type { ExtractedDocs } from \"./types.js\";\n\n/**\n * Extract documentation from a component source file\n */\nexport async function extractComponentDocs(\n filePath: string\n): Promise<ExtractedDocs> {\n const content = await readFile(filePath, \"utf-8\");\n return extractDocsFromSource(content, filePath);\n}\n\n/**\n * Extract documentation from source code\n */\nexport function extractDocsFromSource(\n source: string,\n filePath: string\n): ExtractedDocs {\n const isTypeScript = filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\");\n const isJSX = filePath.endsWith(\".tsx\") || filePath.endsWith(\".jsx\");\n\n const ast = parse(source, {\n sourceType: \"module\",\n plugins: [\n ...(isTypeScript ? ([\"typescript\"] as const) : []),\n ...(isJSX ? ([\"jsx\"] as const) : []),\n \"decorators-legacy\",\n ],\n });\n\n const docs: ExtractedDocs = {\n filePath,\n componentName: inferComponentName(filePath),\n description: \"\",\n props: [],\n examples: [],\n tags: {},\n };\n\n // Track leading comments for the main export\n let mainExportComment: string | undefined;\n\n traverse(ast, {\n // Extract JSDoc from function declarations\n FunctionDeclaration(path) {\n const leadingComments = path.node.leadingComments;\n if (leadingComments) {\n const jsdoc = extractJSDoc(leadingComments);\n if (jsdoc && isExportedComponent(path)) {\n mergeJSDoc(docs, jsdoc);\n }\n }\n },\n\n // Extract JSDoc from arrow function variable declarations\n VariableDeclaration(path) {\n const leadingComments = path.node.leadingComments;\n if (leadingComments && hasExportedArrowFunction(path)) {\n const jsdoc = extractJSDoc(leadingComments);\n if (jsdoc) {\n mergeJSDoc(docs, jsdoc);\n }\n }\n },\n\n // Extract JSDoc from export default\n ExportDefaultDeclaration(path) {\n const leadingComments = path.node.leadingComments;\n if (leadingComments) {\n const jsdoc = extractJSDoc(leadingComments);\n if (jsdoc) {\n mergeJSDoc(docs, jsdoc);\n }\n }\n },\n\n // Extract props from TypeScript interface\n TSInterfaceDeclaration(path) {\n const name = path.node.id.name;\n if (isPropsInterface(name)) {\n const props = extractPropsFromInterface(path.node);\n docs.props.push(...props);\n }\n },\n\n // Extract props from TypeScript type alias\n TSTypeAliasDeclaration(path) {\n const name = path.node.id.name;\n if (isPropsInterface(name)) {\n const props = extractPropsFromTypeAlias(path.node);\n docs.props.push(...props);\n }\n },\n });\n\n // Clean up duplicates\n docs.props = deduplicateProps(docs.props);\n\n return docs;\n}\n\n/**\n * Extract JSDoc information from comments\n */\nfunction extractJSDoc(\n comments: readonly t.Comment[]\n): Partial<ExtractedDocs> | null {\n const blockComments = comments.filter(\n (c) => c.type === \"CommentBlock\" && c.value.startsWith(\"*\")\n );\n\n if (blockComments.length === 0) return null;\n\n const comment = blockComments[blockComments.length - 1];\n const content = comment.value;\n\n const result: Partial<ExtractedDocs> = {\n description: \"\",\n props: [],\n examples: [],\n tags: {},\n };\n\n // Parse JSDoc content\n const lines = content.split(\"\\n\");\n let currentDescription: string[] = [];\n let currentTag: string | null = null;\n let currentTagContent: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.replace(/^\\s*\\*\\s?/, \"\").trim();\n\n // Check for JSDoc tag\n const tagMatch = trimmed.match(/^@(\\w+)(?:\\s+(.*))?$/);\n\n if (tagMatch) {\n // Save previous tag if exists\n if (currentTag) {\n processTag(result, currentTag, currentTagContent.join(\"\\n\").trim());\n } else if (currentDescription.length > 0) {\n result.description = currentDescription.join(\"\\n\").trim();\n }\n\n currentTag = tagMatch[1];\n currentTagContent = tagMatch[2] ? [tagMatch[2]] : [];\n } else if (currentTag) {\n currentTagContent.push(trimmed);\n } else if (trimmed) {\n currentDescription.push(trimmed);\n }\n }\n\n // Process final tag\n if (currentTag) {\n processTag(result, currentTag, currentTagContent.join(\"\\n\").trim());\n } else if (currentDescription.length > 0) {\n result.description = currentDescription.join(\"\\n\").trim();\n }\n\n return result;\n}\n\n/**\n * Process a JSDoc tag\n */\nfunction processTag(\n docs: Partial<ExtractedDocs>,\n tag: string,\n content: string\n): void {\n switch (tag) {\n case \"description\":\n docs.description = content;\n break;\n\n case \"param\":\n case \"prop\": {\n const propMatch = content.match(\n /^\\{([^}]+)\\}\\s+(\\[?\\w+\\]?)\\s*-?\\s*(.*)/\n );\n if (propMatch) {\n const [, type, nameRaw, description] = propMatch;\n const isOptional = nameRaw.startsWith(\"[\");\n const name = nameRaw.replace(/[\\[\\]]/g, \"\");\n docs.props?.push({\n name,\n type,\n description,\n required: !isOptional,\n });\n }\n break;\n }\n\n case \"example\": {\n docs.examples?.push(content);\n break;\n }\n\n case \"deprecated\":\n case \"since\":\n case \"version\":\n case \"see\":\n case \"link\":\n case \"category\":\n docs.tags = docs.tags ?? {};\n docs.tags[tag] = content;\n break;\n\n default:\n // Store other tags generically\n docs.tags = docs.tags ?? {};\n docs.tags[tag] = content;\n }\n}\n\n/**\n * Extract props from TypeScript interface\n */\nfunction extractPropsFromInterface(\n node: t.TSInterfaceDeclaration\n): ExtractedDocs[\"props\"] {\n const props: ExtractedDocs[\"props\"] = [];\n\n for (const member of node.body.body) {\n if (t.isTSPropertySignature(member) && t.isIdentifier(member.key)) {\n const name = member.key.name;\n const type = member.typeAnnotation\n ? typeAnnotationToString(member.typeAnnotation.typeAnnotation)\n : \"unknown\";\n const required = !member.optional;\n\n // Extract description from leading comments\n let description = \"\";\n if (member.leadingComments) {\n const comment = member.leadingComments[member.leadingComments.length - 1];\n if (comment.type === \"CommentBlock\") {\n description = comment.value\n .replace(/^\\s*\\*\\s?/gm, \"\")\n .trim();\n } else if (comment.type === \"CommentLine\") {\n description = comment.value.trim();\n }\n }\n\n props.push({ name, type, description, required });\n }\n }\n\n return props;\n}\n\n/**\n * Extract props from TypeScript type alias\n */\nfunction extractPropsFromTypeAlias(\n node: t.TSTypeAliasDeclaration\n): ExtractedDocs[\"props\"] {\n const props: ExtractedDocs[\"props\"] = [];\n\n if (t.isTSTypeLiteral(node.typeAnnotation)) {\n for (const member of node.typeAnnotation.members) {\n if (t.isTSPropertySignature(member) && t.isIdentifier(member.key)) {\n const name = member.key.name;\n const type = member.typeAnnotation\n ? typeAnnotationToString(member.typeAnnotation.typeAnnotation)\n : \"unknown\";\n const required = !member.optional;\n\n // Extract description from leading comments\n let description = \"\";\n if (member.leadingComments) {\n const comment = member.leadingComments[member.leadingComments.length - 1];\n description = comment.value.replace(/^\\s*\\*\\s?/gm, \"\").trim();\n }\n\n props.push({ name, type, description, required });\n }\n }\n }\n\n return props;\n}\n\n/**\n * Convert TypeScript type annotation to string representation\n */\nfunction typeAnnotationToString(node: t.TSType): string {\n if (t.isTSStringKeyword(node)) return \"string\";\n if (t.isTSNumberKeyword(node)) return \"number\";\n if (t.isTSBooleanKeyword(node)) return \"boolean\";\n if (t.isTSNullKeyword(node)) return \"null\";\n if (t.isTSUndefinedKeyword(node)) return \"undefined\";\n if (t.isTSVoidKeyword(node)) return \"void\";\n if (t.isTSAnyKeyword(node)) return \"any\";\n if (t.isTSNeverKeyword(node)) return \"never\";\n if (t.isTSUnknownKeyword(node)) return \"unknown\";\n\n if (t.isTSLiteralType(node)) {\n if (t.isStringLiteral(node.literal)) return `\"${node.literal.value}\"`;\n if (t.isNumericLiteral(node.literal)) return String(node.literal.value);\n if (t.isBooleanLiteral(node.literal)) return String(node.literal.value);\n return \"literal\";\n }\n\n if (t.isTSTypeReference(node)) {\n if (t.isIdentifier(node.typeName)) {\n const name = node.typeName.name;\n if (node.typeParameters) {\n const params = node.typeParameters.params\n .map(typeAnnotationToString)\n .join(\", \");\n return `${name}<${params}>`;\n }\n return name;\n }\n }\n\n if (t.isTSUnionType(node)) {\n return node.types.map(typeAnnotationToString).join(\" | \");\n }\n\n if (t.isTSIntersectionType(node)) {\n return node.types.map(typeAnnotationToString).join(\" & \");\n }\n\n if (t.isTSArrayType(node)) {\n return `${typeAnnotationToString(node.elementType)}[]`;\n }\n\n if (t.isTSFunctionType(node)) {\n return \"(...args: any[]) => any\";\n }\n\n if (t.isTSTupleType(node)) {\n const elements = node.elementTypes\n .map((el) => {\n // Handle named tuple members: [name: string]\n if (t.isTSNamedTupleMember(el)) {\n return typeAnnotationToString(el.elementType);\n }\n return typeAnnotationToString(el);\n })\n .join(\", \");\n return `[${elements}]`;\n }\n\n if (t.isTSTypeLiteral(node)) {\n return \"object\";\n }\n\n return \"unknown\";\n}\n\n/**\n * Check if interface name looks like props\n */\nfunction isPropsInterface(name: string): boolean {\n return (\n name.endsWith(\"Props\") ||\n name.endsWith(\"Properties\") ||\n name === \"Props\"\n );\n}\n\n/**\n * Check if a function declaration is exported\n */\nfunction isExportedComponent(\n path: babel.NodePath<t.FunctionDeclaration>\n): boolean {\n const parent = path.parent;\n if (t.isExportDefaultDeclaration(parent)) return true;\n if (t.isExportNamedDeclaration(parent)) return true;\n if (t.isProgram(parent) && path.node.id && /^[A-Z]/.test(path.node.id.name)) {\n return true;\n }\n return false;\n}\n\n/**\n * Check if variable declaration has an exported arrow function component\n */\nfunction hasExportedArrowFunction(\n path: babel.NodePath<t.VariableDeclaration>\n): boolean {\n const parent = path.parent;\n if (!t.isExportNamedDeclaration(parent)) return false;\n\n for (const declarator of path.node.declarations) {\n if (\n t.isIdentifier(declarator.id) &&\n /^[A-Z]/.test(declarator.id.name) &&\n (t.isArrowFunctionExpression(declarator.init) ||\n t.isFunctionExpression(declarator.init))\n ) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Infer component name from file path\n */\nfunction inferComponentName(filePath: string): string {\n const fileName = basename(filePath);\n // Remove extension\n let name = fileName.replace(/\\.(tsx?|jsx?)$/, \"\");\n // Handle index files\n if (name === \"index\") {\n name = basename(dirname(filePath));\n }\n return name;\n}\n\n/**\n * Merge JSDoc results into docs\n */\nfunction mergeJSDoc(docs: ExtractedDocs, jsdoc: Partial<ExtractedDocs>): void {\n if (jsdoc.description && !docs.description) {\n docs.description = jsdoc.description;\n }\n if (jsdoc.props) {\n docs.props.push(...jsdoc.props);\n }\n if (jsdoc.examples) {\n docs.examples.push(...jsdoc.examples);\n }\n if (jsdoc.tags) {\n docs.tags = { ...docs.tags, ...jsdoc.tags };\n }\n}\n\n/**\n * Remove duplicate props\n */\nfunction deduplicateProps(\n props: ExtractedDocs[\"props\"]\n): ExtractedDocs[\"props\"] {\n const seen = new Map<string, ExtractedDocs[\"props\"][0]>();\n\n for (const prop of props) {\n const existing = seen.get(prop.name);\n if (!existing || (prop.description && !existing.description)) {\n seen.set(prop.name, prop);\n }\n }\n\n return Array.from(seen.values());\n}\n\n/**\n * Find component source file from various patterns\n */\nexport async function findComponentSource(\n componentName: string,\n searchDirs: string[]\n): Promise<string | null> {\n const patterns = [\n `${componentName}.tsx`,\n `${componentName}.ts`,\n `${componentName}/index.tsx`,\n `${componentName}/index.ts`,\n `${componentName}/${componentName}.tsx`,\n `${componentName}/${componentName}.ts`,\n ];\n\n for (const dir of searchDirs) {\n for (const pattern of patterns) {\n const fullPath = join(dir, pattern);\n if (existsSync(fullPath)) {\n return fullPath;\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract documentation from multiple component files\n */\nexport async function extractAllComponentDocs(\n componentFiles: Map<string, string>\n): Promise<Map<string, ExtractedDocs>> {\n const results = new Map<string, ExtractedDocs>();\n\n for (const [componentName, filePath] of componentFiles) {\n try {\n const docs = await extractComponentDocs(filePath);\n docs.componentName = componentName;\n results.set(componentName, docs);\n } catch (error) {\n console.warn(\n `Failed to extract docs for ${componentName}:`,\n (error as Error).message\n );\n }\n }\n\n return results;\n}\n\n// Type import for babel NodePath\nimport type * as babel from \"@babel/traverse\";\n","/**\n * Storybook Parser\n *\n * Extracts examples and documentation from Storybook story files.\n */\n\nimport { parse } from \"@babel/parser\";\nimport _traverse from \"@babel/traverse\";\nimport * as t from \"@babel/types\";\n\n// Handle CommonJS/ESM interop\nconst traverse = (_traverse as unknown as { default: typeof _traverse }).default || _traverse;\nimport { readFile } from \"node:fs/promises\";\nimport fg from \"fast-glob\";\nimport { basename, dirname, join, relative } from \"node:path\";\n\nexport interface StoryExample {\n name: string;\n displayName: string;\n description?: string;\n args: Record<string, unknown>;\n code: string;\n isDefault: boolean;\n}\n\nexport interface StorybookMeta {\n componentName: string;\n title?: string;\n description?: string;\n argTypes?: Record<string, ArgType>;\n parameters?: Record<string, unknown>;\n}\n\nexport interface ArgType {\n description?: string;\n defaultValue?: unknown;\n control?: string;\n options?: string[];\n table?: {\n category?: string;\n type?: { summary: string };\n };\n}\n\nexport interface ParsedStoryFile {\n filePath: string;\n meta: StorybookMeta;\n stories: StoryExample[];\n}\n\n/**\n * Parse a Storybook story file\n */\nexport async function parseStoryFile(\n filePath: string\n): Promise<ParsedStoryFile> {\n const content = await readFile(filePath, \"utf-8\");\n return parseStorySource(content, filePath);\n}\n\n/**\n * Parse Storybook story source code\n */\nexport function parseStorySource(\n source: string,\n filePath: string\n): ParsedStoryFile {\n const isTypeScript = filePath.endsWith(\".ts\") || filePath.endsWith(\".tsx\");\n const isJSX = filePath.endsWith(\".tsx\") || filePath.endsWith(\".jsx\");\n\n const ast = parse(source, {\n sourceType: \"module\",\n plugins: [\n ...(isTypeScript ? ([\"typescript\"] as const) : []),\n ...(isJSX ? ([\"jsx\"] as const) : []),\n \"decorators-legacy\",\n ],\n });\n\n const result: ParsedStoryFile = {\n filePath,\n meta: {\n componentName: inferComponentFromPath(filePath),\n },\n stories: [],\n };\n\n // Track what's been exported as default (the meta)\n let defaultExportNode: t.Node | null = null;\n\n // First pass: find default export (meta)\n traverse(ast, {\n ExportDefaultDeclaration(path) {\n defaultExportNode = path.node.declaration;\n },\n });\n\n // Parse the meta object\n if (defaultExportNode) {\n const metaObject = extractMetaObject(defaultExportNode, ast);\n if (metaObject) {\n result.meta = parseMetaObject(metaObject, result.meta.componentName);\n }\n }\n\n // Second pass: find named exports (stories)\n traverse(ast, {\n ExportNamedDeclaration(path) {\n const declaration = path.node.declaration;\n\n if (t.isVariableDeclaration(declaration)) {\n for (const declarator of declaration.declarations) {\n if (!t.isIdentifier(declarator.id)) continue;\n\n const storyName = declarator.id.name;\n // Skip non-story exports (usually lowercase)\n if (!/^[A-Z]/.test(storyName)) continue;\n\n const story = parseStoryDeclarator(\n storyName,\n declarator,\n source,\n result.meta.componentName\n );\n if (story) {\n result.stories.push(story);\n }\n }\n }\n },\n });\n\n // Mark Default story\n const defaultStory = result.stories.find(\n (s) => s.name === \"Default\" || s.name === \"Primary\"\n );\n if (defaultStory) {\n defaultStory.isDefault = true;\n }\n\n return result;\n}\n\n/**\n * Extract meta object from default export node\n */\nfunction extractMetaObject(\n node: t.Node,\n ast: ReturnType<typeof parse>\n): t.ObjectExpression | null {\n // Direct object expression: export default { ... }\n if (t.isObjectExpression(node)) {\n return node;\n }\n\n // Reference to variable: export default meta\n if (t.isIdentifier(node)) {\n const metaName = node.name;\n let foundObject: t.ObjectExpression | null = null;\n traverse(ast, {\n VariableDeclarator(path) {\n if (\n t.isIdentifier(path.node.id) &&\n path.node.id.name === metaName &&\n t.isObjectExpression(path.node.init)\n ) {\n foundObject = path.node.init;\n }\n },\n });\n return foundObject;\n }\n\n // Type assertion: export default { ... } as Meta<typeof Button>\n if (t.isTSAsExpression(node) && t.isObjectExpression(node.expression)) {\n return node.expression;\n }\n\n // Satisfies expression: export default { ... } satisfies Meta<typeof Button>\n if (\n t.isTSSatisfiesExpression &&\n t.isTSSatisfiesExpression(node) &&\n t.isObjectExpression(node.expression)\n ) {\n return node.expression;\n }\n\n return null;\n}\n\n/**\n * Parse the meta (default export) object\n */\nfunction parseMetaObject(\n obj: t.ObjectExpression,\n fallbackName: string\n): StorybookMeta {\n const meta: StorybookMeta = {\n componentName: fallbackName,\n };\n\n for (const prop of obj.properties) {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) continue;\n\n const key = prop.key.name;\n\n switch (key) {\n case \"title\":\n if (t.isStringLiteral(prop.value)) {\n meta.title = prop.value.value;\n // Extract component name from title (e.g., \"Components/Button\" -> \"Button\")\n const parts = meta.title.split(\"/\");\n meta.componentName = parts[parts.length - 1];\n }\n break;\n\n case \"component\":\n if (t.isIdentifier(prop.value)) {\n meta.componentName = prop.value.name;\n }\n break;\n\n case \"parameters\":\n if (t.isObjectExpression(prop.value)) {\n meta.parameters = extractObjectLiteral(prop.value);\n // Extract description from parameters.docs.description.component\n const docs = meta.parameters?.docs as Record<string, unknown>;\n if (docs?.description) {\n const desc = docs.description as Record<string, string>;\n if (desc.component) {\n meta.description = desc.component;\n }\n }\n }\n break;\n\n case \"argTypes\":\n if (t.isObjectExpression(prop.value)) {\n meta.argTypes = parseArgTypes(prop.value);\n }\n break;\n }\n }\n\n return meta;\n}\n\n/**\n * Parse argTypes object\n */\nfunction parseArgTypes(obj: t.ObjectExpression): Record<string, ArgType> {\n const argTypes: Record<string, ArgType> = {};\n\n for (const prop of obj.properties) {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) continue;\n\n const propName = prop.key.name;\n const argType: ArgType = {};\n\n if (t.isObjectExpression(prop.value)) {\n for (const inner of prop.value.properties) {\n if (!t.isObjectProperty(inner) || !t.isIdentifier(inner.key)) continue;\n\n const innerKey = inner.key.name;\n\n if (innerKey === \"description\" && t.isStringLiteral(inner.value)) {\n argType.description = inner.value.value;\n }\n\n if (innerKey === \"defaultValue\") {\n argType.defaultValue = extractLiteralValue(inner.value);\n }\n\n if (innerKey === \"control\") {\n if (t.isStringLiteral(inner.value)) {\n argType.control = inner.value.value;\n } else if (t.isObjectExpression(inner.value)) {\n const controlObj = extractObjectLiteral(inner.value);\n argType.control = controlObj?.type as string;\n }\n }\n\n if (innerKey === \"options\" && t.isArrayExpression(inner.value)) {\n argType.options = inner.value.elements\n .filter((el): el is t.StringLiteral => t.isStringLiteral(el))\n .map((el) => el.value);\n }\n }\n }\n\n argTypes[propName] = argType;\n }\n\n return argTypes;\n}\n\n/**\n * Parse a story variable declarator\n */\nfunction parseStoryDeclarator(\n name: string,\n declarator: t.VariableDeclarator,\n source: string,\n componentName: string\n): StoryExample | null {\n const init = declarator.init;\n if (!init) return null;\n\n const story: StoryExample = {\n name,\n displayName: camelToTitle(name),\n args: {},\n code: \"\",\n isDefault: false,\n };\n\n // Handle object-style story: export const Primary = { args: { ... } }\n if (t.isObjectExpression(init)) {\n parseStoryObject(init, story);\n story.code = generateStoryCode(componentName, story.args);\n return story;\n }\n\n // Handle: export const Primary: Story = { ... }\n if (\n t.isTSAsExpression(init) &&\n t.isObjectExpression(init.expression)\n ) {\n parseStoryObject(init.expression, story);\n story.code = generateStoryCode(componentName, story.args);\n return story;\n }\n\n // Handle render function style: export const Primary = () => <Button />\n if (t.isArrowFunctionExpression(init) || t.isFunctionExpression(init)) {\n // Extract the code from source\n if (init.start != null && init.end != null) {\n const fnCode = source.slice(init.start, init.end);\n story.code = fnCode;\n }\n return story;\n }\n\n // Handle satisfies expression: export const Primary = { ... } satisfies Story\n if (t.isTSSatisfiesExpression && t.isTSSatisfiesExpression(init)) {\n if (t.isObjectExpression(init.expression)) {\n parseStoryObject(init.expression, story);\n story.code = generateStoryCode(componentName, story.args);\n return story;\n }\n }\n\n return null;\n}\n\n/**\n * Parse story object properties\n */\nfunction parseStoryObject(obj: t.ObjectExpression, story: StoryExample): void {\n for (const prop of obj.properties) {\n if (!t.isObjectProperty(prop) || !t.isIdentifier(prop.key)) continue;\n\n const key = prop.key.name;\n\n switch (key) {\n case \"name\":\n if (t.isStringLiteral(prop.value)) {\n story.displayName = prop.value.value;\n }\n break;\n\n case \"args\":\n if (t.isObjectExpression(prop.value)) {\n story.args = extractObjectLiteral(prop.value);\n }\n break;\n\n case \"parameters\":\n if (t.isObjectExpression(prop.value)) {\n const params = extractObjectLiteral(prop.value);\n const docs = params?.docs as Record<string, unknown>;\n if (docs?.description) {\n const desc = docs.description as Record<string, string>;\n if (desc.story) {\n story.description = desc.story;\n }\n }\n }\n break;\n }\n }\n}\n\n/**\n * Extract a literal value from an AST node\n */\nfunction extractLiteralValue(node: t.Node): unknown {\n if (t.isStringLiteral(node)) return node.value;\n if (t.isNumericLiteral(node)) return node.value;\n if (t.isBooleanLiteral(node)) return node.value;\n if (t.isNullLiteral(node)) return null;\n if (t.isIdentifier(node) && node.name === \"undefined\") return undefined;\n\n if (t.isArrayExpression(node)) {\n return node.elements\n .filter((el): el is t.Expression => el !== null && t.isExpression(el))\n .map(extractLiteralValue);\n }\n\n if (t.isObjectExpression(node)) {\n return extractObjectLiteral(node);\n }\n\n // Can't extract complex expressions\n return undefined;\n}\n\n/**\n * Extract an object literal into a plain object\n */\nfunction extractObjectLiteral(\n node: t.ObjectExpression\n): Record<string, unknown> {\n const obj: Record<string, unknown> = {};\n\n for (const prop of node.properties) {\n if (t.isSpreadElement(prop)) continue;\n if (!t.isObjectProperty(prop)) continue;\n\n let key: string;\n if (t.isIdentifier(prop.key)) {\n key = prop.key.name;\n } else if (t.isStringLiteral(prop.key)) {\n key = prop.key.value;\n } else {\n continue;\n }\n\n obj[key] = extractLiteralValue(prop.value);\n }\n\n return obj;\n}\n\n/**\n * Generate example code from component name and args\n */\nfunction generateStoryCode(\n componentName: string,\n args: Record<string, unknown>\n): string {\n const props = Object.entries(args)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => {\n if (typeof value === \"string\") {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === \"boolean\" && value) {\n return key;\n }\n return `${key}={${JSON.stringify(value)}}`;\n })\n .join(\" \");\n\n if (props) {\n return `<${componentName} ${props} />`;\n }\n return `<${componentName} />`;\n}\n\n/**\n * Convert camelCase to Title Case\n */\nfunction camelToTitle(str: string): string {\n return str\n .replace(/([A-Z])/g, \" $1\")\n .replace(/^./, (s) => s.toUpperCase())\n .trim();\n}\n\n/**\n * Infer component name from story file path\n */\nfunction inferComponentFromPath(filePath: string): string {\n const fileName = basename(filePath);\n // Remove .stories.tsx etc\n let name = fileName.replace(/\\.stories\\.(tsx?|jsx?|mdx?)$/, \"\");\n // Handle patterns like Button.stories.tsx\n return name;\n}\n\n/**\n * Find all story files in a directory\n */\nexport async function findStoryFiles(\n rootDir: string,\n include: string[] = [\"**/*.stories.{tsx,ts,jsx,js}\"],\n exclude: string[] = [\"**/node_modules/**\", \"**/dist/**\"]\n): Promise<string[]> {\n return fg(include, {\n cwd: rootDir,\n ignore: exclude,\n absolute: true,\n onlyFiles: true,\n });\n}\n\n/**\n * Parse all story files and group by component\n */\nexport async function parseAllStories(\n rootDir: string\n): Promise<Map<string, ParsedStoryFile>> {\n const storyFiles = await findStoryFiles(rootDir);\n const results = new Map<string, ParsedStoryFile>();\n\n for (const filePath of storyFiles) {\n try {\n const parsed = await parseStoryFile(filePath);\n results.set(parsed.meta.componentName, parsed);\n } catch (error) {\n console.warn(\n `Failed to parse story file ${relative(rootDir, filePath)}:`,\n (error as Error).message\n );\n }\n }\n\n return results;\n}\n\n/**\n * Merge Storybook data into extracted docs\n */\nexport function mergeStorybookIntoDoc(\n storyFile: ParsedStoryFile,\n existingExamples: string[] = []\n): string[] {\n const examples = [...existingExamples];\n\n for (const story of storyFile.stories) {\n if (story.code && !examples.includes(story.code)) {\n // Add with story name as comment\n const example = story.description\n ? `// ${story.displayName}: ${story.description}\\n${story.code}`\n : `// ${story.displayName}\\n${story.code}`;\n examples.push(example);\n }\n }\n\n return examples;\n}\n","/**\n * AI Context Generator\n *\n * Packages codebase analysis, documentation, and Storybook examples\n * into structured context for AI-powered documentation generation.\n */\n\nimport type {\n ComponentAnalysis,\n UsageAnalysis,\n ExtractedDocs,\n ComponentEnhancement,\n} from \"./types.js\";\nimport type { ParsedStoryFile, StoryExample } from \"./storybook-parser.js\";\nimport type { PropsExtractionResult, ExtractedProp } from \"./props-extractor.js\";\nimport { summarizePatternsForPrompt, type ComponentRelation } from \"./aggregator.js\";\n\n/**\n * Boilerplate patterns that should be filtered from AI suggestions\n */\nconst BOILERPLATE_PATTERNS = [\n /component is needed/i,\n /alternative.*appropriate/i,\n /use (?:this|the) component when/i,\n /don'?t use (?:this|the) component/i,\n /when you need (?:this|a|the) component/i,\n /TODO:/i,\n /FIXME:/i,\n /TBD/i,\n /placeholder/i,\n /\\[.*\\]/, // Placeholder brackets like [describe when]\n];\n\n/**\n * Check if text matches any boilerplate pattern\n */\nexport function isBoilerplate(text: string): boolean {\n return BOILERPLATE_PATTERNS.some((pattern) => pattern.test(text));\n}\n\n/**\n * Filter out boilerplate suggestions\n */\nexport function filterBoilerplate(suggestions: string[]): string[] {\n return suggestions.filter((s) => !isBoilerplate(s));\n}\n\n/**\n * Enhanced prop data from TypeScript extraction\n */\nexport interface EnhancedProp {\n name: string;\n type: string;\n description: string;\n required: boolean;\n defaultValue?: unknown;\n enumValues?: string[];\n deprecated?: string;\n}\n\n/**\n * Full context for AI enhancement of a single component\n */\nexport interface ComponentContext {\n componentName: string;\n sourceFile: string;\n\n // Existing documentation\n existingDocs: {\n description?: string;\n props: Array<{\n name: string;\n type: string;\n description?: string;\n required: boolean;\n }>;\n examples: string[];\n tags: Record<string, string>;\n };\n\n // Enhanced props from TypeScript extraction\n extractedProps?: EnhancedProp[];\n\n // Component relationships inferred from usage patterns\n relations?: Array<{\n component: string;\n relationship: \"parent\" | \"sibling\" | \"child\";\n frequency: number;\n }>;\n\n // Usage analysis\n usageAnalysis: {\n totalUsages: number;\n uniqueFiles: number;\n topPatterns: Array<{\n props: Record<string, unknown>;\n count: number;\n sampleContext?: string;\n }>;\n contexts: Array<{\n type: string;\n count: number;\n }>;\n };\n\n // Storybook examples\n storybook?: {\n title?: string;\n description?: string;\n stories: Array<{\n name: string;\n displayName: string;\n description?: string;\n args: Record<string, unknown>;\n code: string;\n }>;\n };\n}\n\n/**\n * Full context package for AI enhancement session\n */\nexport interface AIContextPackage {\n projectName: string;\n totalComponents: number;\n components: ComponentContext[];\n globalPatterns: {\n mostUsedComponents: Array<{ name: string; usages: number }>;\n commonPropCombinations: Array<{ props: string[]; count: number }>;\n };\n}\n\n/**\n * Generate full context for a single component\n */\nexport function generateComponentContext(\n componentName: string,\n analysis: ComponentAnalysis | undefined,\n docs: ExtractedDocs | undefined,\n storyFile: ParsedStoryFile | undefined,\n propsExtraction?: PropsExtractionResult,\n relations?: ComponentRelation[]\n): ComponentContext {\n const context: ComponentContext = {\n componentName,\n sourceFile: analysis?.sourceFile || propsExtraction?.filePath || docs?.filePath || \"unknown\",\n existingDocs: {\n description: docs?.description,\n props: docs?.props || [],\n examples: docs?.examples || [],\n tags: docs?.tags || {},\n },\n usageAnalysis: {\n totalUsages: analysis?.totalUsages || 0,\n uniqueFiles: analysis?.uniqueFiles || 0,\n topPatterns: [],\n contexts: [],\n },\n };\n\n // Add enhanced props from TypeScript extraction (preferred source)\n if (propsExtraction?.success && propsExtraction.props.length > 0) {\n context.extractedProps = propsExtraction.props.map((p) => ({\n name: p.name,\n type: p.type,\n description: p.description,\n required: p.required,\n defaultValue: p.defaultValue,\n enumValues: p.enumValues,\n deprecated: p.deprecated,\n }));\n }\n\n // Add inferred relations\n if (relations && relations.length > 0) {\n context.relations = relations.slice(0, 10).map((r) => ({\n component: r.component,\n relationship: r.relationship,\n frequency: r.frequency,\n }));\n }\n\n // Add usage patterns\n if (analysis?.patterns) {\n context.usageAnalysis.topPatterns = analysis.patterns.slice(0, 10).map((p) => ({\n props: p.props,\n count: p.count,\n sampleContext: p.sampleContexts[0],\n }));\n }\n\n // Add context types\n if (analysis?.contexts) {\n context.usageAnalysis.contexts = analysis.contexts.map((c) => ({\n type: c.type,\n count: c.count,\n }));\n }\n\n // Add Storybook data\n if (storyFile) {\n context.storybook = {\n title: storyFile.meta.title,\n description: storyFile.meta.description,\n stories: storyFile.stories.map((s) => ({\n name: s.name,\n displayName: s.displayName,\n description: s.description,\n args: s.args,\n code: s.code,\n })),\n };\n }\n\n return context;\n}\n\n/**\n * Generate full AI context package for all components\n */\nexport function generateAIContextPackage(\n projectName: string,\n usageAnalysis: UsageAnalysis,\n allDocs: Map<string, ExtractedDocs>,\n allStories: Map<string, ParsedStoryFile>\n): AIContextPackage {\n const components: ComponentContext[] = [];\n\n // Get all unique component names\n const allComponentNames = new Set<string>();\n for (const name of Object.keys(usageAnalysis.components)) {\n allComponentNames.add(name);\n }\n for (const name of allDocs.keys()) {\n allComponentNames.add(name);\n }\n for (const name of allStories.keys()) {\n allComponentNames.add(name);\n }\n\n // Generate context for each component\n for (const componentName of allComponentNames) {\n const analysis = usageAnalysis.components[componentName];\n const docs = allDocs.get(componentName);\n const storyFile = allStories.get(componentName);\n\n const context = generateComponentContext(\n componentName,\n analysis,\n docs,\n storyFile\n );\n components.push(context);\n }\n\n // Sort by usage count\n components.sort(\n (a, b) => b.usageAnalysis.totalUsages - a.usageAnalysis.totalUsages\n );\n\n // Calculate global patterns\n const mostUsedComponents = Object.values(usageAnalysis.components)\n .map((c) => ({ name: c.name, usages: c.totalUsages }))\n .sort((a, b) => b.usages - a.usages)\n .slice(0, 20);\n\n return {\n projectName,\n totalComponents: components.length,\n components,\n globalPatterns: {\n mostUsedComponents,\n commonPropCombinations: [], // Would need aggregation across all components\n },\n };\n}\n\n/**\n * Generate a focused prompt context for a single component\n */\nexport function generatePromptContext(context: ComponentContext): string {\n const lines: string[] = [];\n\n lines.push(`# Component: ${context.componentName}`);\n lines.push(`Source: ${context.sourceFile}`);\n lines.push(\"\");\n\n // Existing documentation\n if (context.existingDocs.description) {\n lines.push(\"## Current Description\");\n lines.push(context.existingDocs.description);\n lines.push(\"\");\n }\n\n // Enhanced props from TypeScript extraction (preferred)\n if (context.extractedProps && context.extractedProps.length > 0) {\n lines.push(\"## Props (from TypeScript)\");\n for (const prop of context.extractedProps) {\n const required = prop.required ? \"(required)\" : \"(optional)\";\n const deprecated = prop.deprecated ? \" [DEPRECATED]\" : \"\";\n const defaultVal = prop.defaultValue !== undefined\n ? ` (default: ${JSON.stringify(prop.defaultValue)})`\n : \"\";\n const desc = prop.description || \"\";\n\n lines.push(`- **${prop.name}**: \\`${prop.type}\\` ${required}${deprecated}${defaultVal}`);\n if (desc) {\n lines.push(` ${desc}`);\n }\n if (prop.enumValues && prop.enumValues.length > 0) {\n lines.push(` Values: ${prop.enumValues.map(v => `\"${v}\"`).join(\" | \")}`);\n }\n }\n lines.push(\"\");\n } else if (context.existingDocs.props.length > 0) {\n // Fallback to existing docs props\n lines.push(\"## Props\");\n for (const prop of context.existingDocs.props) {\n const required = prop.required ? \"(required)\" : \"(optional)\";\n const desc = prop.description || \"No description\";\n lines.push(`- **${prop.name}**: \\`${prop.type}\\` ${required} - ${desc}`);\n }\n lines.push(\"\");\n }\n\n // Component relationships\n if (context.relations && context.relations.length > 0) {\n lines.push(\"## Related Components\");\n const parents = context.relations.filter((r) => r.relationship === \"parent\");\n const siblings = context.relations.filter((r) => r.relationship === \"sibling\");\n\n if (parents.length > 0) {\n lines.push(\"### Commonly Used Inside\");\n for (const rel of parents.slice(0, 5)) {\n lines.push(`- **${rel.component}**: ${rel.frequency} times`);\n }\n }\n\n if (siblings.length > 0) {\n lines.push(\"### Often Used With\");\n for (const rel of siblings.slice(0, 5)) {\n lines.push(`- **${rel.component}**: appears together in ${rel.frequency} files`);\n }\n }\n lines.push(\"\");\n }\n\n // Usage patterns\n if (context.usageAnalysis.totalUsages > 0) {\n lines.push(\"## Usage Analysis\");\n lines.push(\n `Found ${context.usageAnalysis.totalUsages} usages across ${context.usageAnalysis.uniqueFiles} files.`\n );\n lines.push(\"\");\n\n if (context.usageAnalysis.topPatterns.length > 0) {\n lines.push(\"### Most Common Patterns\");\n for (const pattern of context.usageAnalysis.topPatterns.slice(0, 5)) {\n const propsStr =\n Object.keys(pattern.props).length > 0\n ? Object.entries(pattern.props)\n .map(([k, v]) => `${k}=${JSON.stringify(v)}`)\n .join(\", \")\n : \"(no props)\";\n lines.push(`- ${propsStr}: ${pattern.count} times`);\n }\n lines.push(\"\");\n }\n\n if (context.usageAnalysis.contexts.length > 0) {\n lines.push(\"### Where It's Used\");\n for (const ctx of context.usageAnalysis.contexts) {\n lines.push(`- ${ctx.type}: ${ctx.count} times`);\n }\n lines.push(\"\");\n }\n\n // Sample code context\n const samplePattern = context.usageAnalysis.topPatterns.find(\n (p) => p.sampleContext\n );\n if (samplePattern?.sampleContext) {\n lines.push(\"### Sample Usage Context\");\n lines.push(\"```tsx\");\n lines.push(samplePattern.sampleContext.trim());\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n // Storybook examples\n if (context.storybook && context.storybook.stories.length > 0) {\n lines.push(\"## Storybook Examples\");\n for (const story of context.storybook.stories.slice(0, 5)) {\n lines.push(`### ${story.displayName}`);\n if (story.description) {\n lines.push(story.description);\n }\n lines.push(\"```tsx\");\n lines.push(story.code);\n lines.push(\"```\");\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generate enhancement suggestions based on context\n */\nexport function generateEnhancementSuggestions(\n context: ComponentContext\n): ComponentEnhancement {\n const suggestions: ComponentEnhancement = {\n componentName: context.componentName,\n suggestions: {\n when: [],\n whenNot: [],\n examples: [],\n },\n confidence: 0,\n reasoning: [],\n };\n\n // Analyze context types to suggest \"when\" scenarios\n if (context.usageAnalysis.contexts.length > 0) {\n for (const ctx of context.usageAnalysis.contexts) {\n if (ctx.count >= 2) {\n suggestions.suggestions.when.push(\n `Use in ${ctx.type} components (found in ${ctx.count} places)`\n );\n suggestions.reasoning.push(\n `Component is commonly used in ${ctx.type} contexts`\n );\n }\n }\n }\n\n // Analyze usage patterns\n const highUsagePatterns = context.usageAnalysis.topPatterns.filter(\n (p) => p.count >= 3\n );\n if (highUsagePatterns.length > 0) {\n for (const pattern of highUsagePatterns.slice(0, 3)) {\n const props = Object.entries(pattern.props);\n if (props.length > 0) {\n const propDesc = props.map(([k, v]) => `${k}=\"${v}\"`).join(\", \");\n suggestions.suggestions.when.push(\n `Use with ${propDesc} (common pattern, ${pattern.count} occurrences)`\n );\n }\n }\n }\n\n // Generate examples from Storybook\n if (context.storybook?.stories) {\n for (const story of context.storybook.stories.slice(0, 3)) {\n if (story.code) {\n suggestions.suggestions.examples.push(story.code);\n }\n }\n }\n\n // Calculate confidence based on available data\n let confidence = 0;\n if (context.usageAnalysis.totalUsages > 10) confidence += 30;\n else if (context.usageAnalysis.totalUsages > 5) confidence += 20;\n else if (context.usageAnalysis.totalUsages > 0) confidence += 10;\n\n if (context.storybook?.stories && context.storybook.stories.length > 0) {\n confidence += 25;\n }\n\n // Enhanced props from TypeScript extraction are more valuable\n if (context.extractedProps && context.extractedProps.length > 0) {\n confidence += 25;\n } else if (context.existingDocs.props.length > 0) {\n confidence += 15;\n }\n\n if (context.usageAnalysis.contexts.length > 0) {\n confidence += 20;\n }\n\n suggestions.confidence = Math.min(confidence, 100);\n\n return suggestions;\n}\n\n/**\n * Generate the system prompt for AI enhancement\n */\nexport function generateSystemPrompt(): string {\n return `You are a technical writer specializing in React component documentation. Your task is to generate clear, actionable \"when to use\" and \"when not to use\" documentation based on actual usage patterns found in a codebase.\n\nGuidelines:\n1. Be specific and actionable - avoid vague statements\n2. Base recommendations on observed usage patterns\n3. Consider the contexts where components are used (forms, modals, tables, etc.)\n4. Include concrete examples when available\n5. Mention prop combinations that are commonly used together\n6. Note any patterns that suggest best practices or anti-patterns\n\nFormat your response as JSON with this structure:\n{\n \"when\": [\"scenario 1\", \"scenario 2\", ...],\n \"whenNot\": [\"anti-pattern 1\", \"anti-pattern 2\", ...],\n \"examples\": [\"<Component prop=\\\\\"value\\\\\" />\", ...]\n}`;\n}\n\n/**\n * Generate the user prompt for a specific component\n */\nexport function generateUserPrompt(context: ComponentContext): string {\n const promptContext = generatePromptContext(context);\n\n return `Based on the following usage analysis, generate \"when\" and \"whenNot\" documentation for this component.\n\n${promptContext}\n\nRequirements:\n1. Generate 2-4 \"when\" scenarios based on the actual usage patterns\n2. Generate 1-3 \"whenNot\" scenarios (anti-patterns or inappropriate use cases)\n3. Include 1-3 example code snippets showing common usage patterns\n\nIf there isn't enough usage data to make confident recommendations, indicate that in your response.`;\n}\n","/**\n * TypeScript Props Extractor\n *\n * Uses TypeScript AST to extract complete prop definitions\n * from component TypeScript interfaces and types.\n *\n * This extracts:\n * - Interface and type alias definitions\n * - Property names, types, and optionality\n * - JSDoc comments and descriptions\n * - Union types (for enum-like values)\n * - Default values from JSDoc tags\n */\n\nimport * as ts from \"typescript\";\nimport { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { basename, dirname, join, resolve } from \"node:path\";\nimport type { PropDefinition, PropType } from \"../../core/index.js\";\n\n/**\n * Extracted prop with full type information\n */\nexport interface ExtractedProp {\n /** Prop name */\n name: string;\n /** Type string for display */\n type: string;\n /** Structured type information */\n propType: PropType;\n /** JSDoc description */\n description: string;\n /** Whether the prop is required */\n required: boolean;\n /** Default value if detected */\n defaultValue?: unknown;\n /** For enum/union types, the specific values */\n enumValues?: string[];\n /** Deprecation notice if present */\n deprecated?: string;\n /** Additional JSDoc tags */\n tags?: Record<string, string>;\n}\n\n/**\n * Result of props extraction from a component file\n */\nexport interface PropsExtractionResult {\n /** Path to the source file */\n filePath: string;\n /** Component name */\n componentName: string;\n /** All extracted props */\n props: ExtractedProp[];\n /** Name of the props interface/type found */\n propsTypeName?: string;\n /** Whether extraction was successful */\n success: boolean;\n /** Any warnings or errors encountered */\n warnings: string[];\n}\n\n/**\n * Options for props extraction\n */\nexport interface PropsExtractionOptions {\n /** Look for a specific props type name (e.g., \"ButtonProps\") */\n propsTypeName?: string;\n /** Include inherited props from extended interfaces */\n includeInherited?: boolean;\n}\n\n/**\n * Extract props from a TypeScript/TSX component file\n */\nexport async function extractPropsFromFile(\n filePath: string,\n options: PropsExtractionOptions = {}\n): Promise<PropsExtractionResult> {\n const absPath = resolve(filePath);\n\n if (!existsSync(absPath)) {\n return {\n filePath: absPath,\n componentName: inferComponentName(absPath),\n props: [],\n success: false,\n warnings: [`File not found: ${absPath}`],\n };\n }\n\n const content = await readFile(absPath, \"utf-8\");\n return extractPropsFromSource(content, absPath, options);\n}\n\n/**\n * Extract props from TypeScript source code\n */\nexport function extractPropsFromSource(\n source: string,\n filePath: string,\n options: PropsExtractionOptions = {}\n): PropsExtractionResult {\n const { propsTypeName } = options;\n\n const componentName = inferComponentName(filePath);\n const result: PropsExtractionResult = {\n filePath,\n componentName,\n props: [],\n success: false,\n warnings: [],\n };\n\n // Create a source file\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.ESNext,\n true,\n filePath.endsWith(\".tsx\") ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n\n // Find all interfaces and type aliases that could be props\n const propsDeclarations: Array<{\n name: string;\n node: ts.InterfaceDeclaration | ts.TypeAliasDeclaration;\n }> = [];\n\n ts.forEachChild(sourceFile, (node) => {\n if (ts.isInterfaceDeclaration(node)) {\n propsDeclarations.push({ name: node.name.text, node });\n }\n if (ts.isTypeAliasDeclaration(node)) {\n propsDeclarations.push({ name: node.name.text, node });\n }\n });\n\n // Find the best matching props type\n const targetName = propsTypeName || `${componentName}Props`;\n let propsDecl = propsDeclarations.find((d) => d.name === targetName);\n\n // Fallback to common names\n if (!propsDecl) {\n const fallbackNames = [\"Props\", `${componentName}Properties`];\n for (const name of fallbackNames) {\n propsDecl = propsDeclarations.find((d) => d.name === name);\n if (propsDecl) break;\n }\n }\n\n // Fallback to any *Props or *Properties\n if (!propsDecl) {\n propsDecl = propsDeclarations.find(\n (d) => d.name.endsWith(\"Props\") || d.name.endsWith(\"Properties\")\n );\n }\n\n if (!propsDecl) {\n result.warnings.push(\n `No props type found for ${componentName}. Looked for: ${targetName}`\n );\n return result;\n }\n\n result.propsTypeName = propsDecl.name;\n\n // Extract props from the declaration\n if (ts.isInterfaceDeclaration(propsDecl.node)) {\n extractPropsFromInterface(propsDecl.node, sourceFile, result);\n } else if (ts.isTypeAliasDeclaration(propsDecl.node)) {\n extractPropsFromTypeAlias(propsDecl.node, sourceFile, result);\n }\n\n result.success = result.props.length > 0;\n return result;\n}\n\n/**\n * Extract props from an interface declaration\n */\nfunction extractPropsFromInterface(\n node: ts.InterfaceDeclaration,\n sourceFile: ts.SourceFile,\n result: PropsExtractionResult\n): void {\n for (const member of node.members) {\n if (ts.isPropertySignature(member)) {\n const prop = extractPropFromSignature(member, sourceFile);\n if (prop) {\n result.props.push(prop);\n }\n }\n }\n}\n\n/**\n * Extract props from a type alias declaration\n */\nfunction extractPropsFromTypeAlias(\n node: ts.TypeAliasDeclaration,\n sourceFile: ts.SourceFile,\n result: PropsExtractionResult\n): void {\n if (ts.isTypeLiteralNode(node.type)) {\n for (const member of node.type.members) {\n if (ts.isPropertySignature(member)) {\n const prop = extractPropFromSignature(member, sourceFile);\n if (prop) {\n result.props.push(prop);\n }\n }\n }\n }\n}\n\n/**\n * Extract a single prop from a property signature\n */\nfunction extractPropFromSignature(\n member: ts.PropertySignature,\n sourceFile: ts.SourceFile\n): ExtractedProp | null {\n // Get prop name\n const name = ts.isIdentifier(member.name)\n ? member.name.text\n : member.name.getText(sourceFile);\n\n // Skip internal props\n if (name.startsWith(\"_\") || name.startsWith(\"$\")) {\n return null;\n }\n\n // Get type\n const typeNode = member.type;\n const typeString = typeNode ? typeNode.getText(sourceFile) : \"unknown\";\n\n // Determine if optional\n const isOptional = member.questionToken !== undefined;\n\n // Get JSDoc information\n const jsDoc = getJSDocInfo(member, sourceFile);\n\n // Parse the type into our PropType structure\n const typeInfo = typeNode\n ? parseTypeNode(typeNode, sourceFile)\n : { propType: { type: \"custom\" as const, typescript: \"unknown\" } };\n\n const prop: ExtractedProp = {\n name,\n type: typeString,\n propType: typeInfo.propType,\n description: jsDoc.description,\n required: !isOptional,\n };\n\n // Add enum values if available\n if (typeInfo.enumValues && typeInfo.enumValues.length > 0) {\n prop.enumValues = typeInfo.enumValues;\n }\n\n // Add default value if detected from JSDoc\n if (jsDoc.defaultValue !== undefined) {\n prop.defaultValue = jsDoc.defaultValue;\n }\n\n // Add deprecation notice\n if (jsDoc.deprecated) {\n prop.deprecated = jsDoc.deprecated;\n }\n\n // Add other tags\n if (Object.keys(jsDoc.tags).length > 0) {\n prop.tags = jsDoc.tags;\n }\n\n return prop;\n}\n\n/**\n * Get JSDoc information from a node\n */\nfunction getJSDocInfo(\n node: ts.Node,\n sourceFile: ts.SourceFile\n): {\n description: string;\n defaultValue?: unknown;\n deprecated?: string;\n tags: Record<string, string>;\n} {\n const result = {\n description: \"\",\n defaultValue: undefined as unknown,\n deprecated: undefined as string | undefined,\n tags: {} as Record<string, string>,\n };\n\n // Get full text including comments\n const fullText = sourceFile.getFullText();\n const nodeStart = node.getFullStart();\n const nodePos = node.getStart(sourceFile);\n const leadingText = fullText.slice(nodeStart, nodePos);\n\n // Find JSDoc comments (/** ... */)\n const jsDocMatch = leadingText.match(/\\/\\*\\*([\\s\\S]*?)\\*\\//);\n if (jsDocMatch) {\n const content = jsDocMatch[1];\n parseJSDocContent(content, result);\n }\n\n // Also check line comment above (// ...)\n const lineCommentMatch = leadingText.match(/\\/\\/\\s*(.+)$/m);\n if (lineCommentMatch && !result.description) {\n result.description = lineCommentMatch[1].trim();\n }\n\n return result;\n}\n\n/**\n * Parse JSDoc content into structured data\n */\nfunction parseJSDocContent(\n content: string,\n result: {\n description: string;\n defaultValue?: unknown;\n deprecated?: string;\n tags: Record<string, string>;\n }\n): void {\n const lines = content.split(\"\\n\");\n let currentDescription: string[] = [];\n let currentTag: string | null = null;\n let currentTagContent: string[] = [];\n\n for (const line of lines) {\n // Remove leading * and whitespace\n const trimmed = line.replace(/^\\s*\\*?\\s?/, \"\").trim();\n\n // Check for JSDoc tag\n const tagMatch = trimmed.match(/^@(\\w+)(?:\\s+(.*))?$/);\n\n if (tagMatch) {\n // Save previous tag if exists\n if (currentTag) {\n processJSDocTag(result, currentTag, currentTagContent.join(\"\\n\").trim());\n } else if (currentDescription.length > 0) {\n result.description = currentDescription.join(\" \").trim();\n }\n\n currentTag = tagMatch[1];\n currentTagContent = tagMatch[2] ? [tagMatch[2]] : [];\n } else if (currentTag) {\n if (trimmed) {\n currentTagContent.push(trimmed);\n }\n } else if (trimmed) {\n currentDescription.push(trimmed);\n }\n }\n\n // Process final tag\n if (currentTag) {\n processJSDocTag(result, currentTag, currentTagContent.join(\"\\n\").trim());\n } else if (currentDescription.length > 0 && !result.description) {\n result.description = currentDescription.join(\" \").trim();\n }\n}\n\n/**\n * Process a single JSDoc tag\n */\nfunction processJSDocTag(\n result: {\n description: string;\n defaultValue?: unknown;\n deprecated?: string;\n tags: Record<string, string>;\n },\n tag: string,\n content: string\n): void {\n switch (tag) {\n case \"default\":\n case \"defaultValue\":\n result.defaultValue = parseDefaultValue(content);\n break;\n case \"deprecated\":\n result.deprecated = content || \"This prop is deprecated\";\n break;\n case \"description\":\n result.description = content;\n break;\n default:\n if (content) {\n result.tags[tag] = content;\n }\n }\n}\n\n/**\n * Parse a default value from JSDoc string\n */\nfunction parseDefaultValue(value: string): unknown {\n const trimmed = value.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n if (trimmed === \"undefined\") return undefined;\n if (/^-?\\d+$/.test(trimmed)) return parseInt(trimmed, 10);\n if (/^-?\\d+\\.\\d+$/.test(trimmed)) return parseFloat(trimmed);\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n return trimmed.slice(1, -1);\n }\n if (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\")) {\n return trimmed.slice(1, -1);\n }\n return trimmed;\n}\n\n/**\n * Parse a type node into our PropType structure\n */\nfunction parseTypeNode(\n node: ts.TypeNode,\n sourceFile: ts.SourceFile\n): { propType: PropType; enumValues?: string[] } {\n // Boolean keyword\n if (node.kind === ts.SyntaxKind.BooleanKeyword) {\n return { propType: { type: \"boolean\" } };\n }\n\n // String keyword\n if (node.kind === ts.SyntaxKind.StringKeyword) {\n return { propType: { type: \"string\" } };\n }\n\n // Number keyword\n if (node.kind === ts.SyntaxKind.NumberKeyword) {\n return { propType: { type: \"number\" } };\n }\n\n // Union type (including string literal unions -> enum)\n if (ts.isUnionTypeNode(node)) {\n const stringLiterals: string[] = [];\n const otherTypes: PropType[] = [];\n\n for (const type of node.types) {\n if (ts.isLiteralTypeNode(type) && ts.isStringLiteral(type.literal)) {\n stringLiterals.push(type.literal.text);\n } else if (\n type.kind !== ts.SyntaxKind.NullKeyword &&\n type.kind !== ts.SyntaxKind.UndefinedKeyword\n ) {\n const parsed = parseTypeNode(type, sourceFile);\n otherTypes.push(parsed.propType);\n }\n }\n\n // If all non-null types are string literals, it's an enum\n if (stringLiterals.length > 0 && otherTypes.length === 0) {\n return {\n propType: { type: \"enum\", values: stringLiterals },\n enumValues: stringLiterals,\n };\n }\n\n // If we have string literals plus other types, still treat as enum for the values\n if (stringLiterals.length > 0) {\n return {\n propType: { type: \"enum\", values: stringLiterals },\n enumValues: stringLiterals,\n };\n }\n\n // Generic union\n if (otherTypes.length > 0) {\n return {\n propType: { type: \"union\", types: otherTypes },\n };\n }\n }\n\n // Array type\n if (ts.isArrayTypeNode(node)) {\n const elementType = parseTypeNode(node.elementType, sourceFile);\n return {\n propType: { type: \"array\", items: elementType.propType },\n };\n }\n\n // Function type\n if (ts.isFunctionTypeNode(node)) {\n const params = node.parameters\n .map((p) => {\n const name = p.name.getText(sourceFile);\n const type = p.type ? p.type.getText(sourceFile) : \"any\";\n return `${name}: ${type}`;\n })\n .join(\", \");\n const returnType = node.type ? node.type.getText(sourceFile) : \"void\";\n return {\n propType: { type: \"function\", signature: `(${params}) => ${returnType}` },\n };\n }\n\n // Type reference (like ReactNode, ReactElement, etc.)\n if (ts.isTypeReferenceNode(node)) {\n const typeName = node.typeName.getText(sourceFile);\n\n // Check for React node types\n if (\n typeName === \"ReactNode\" ||\n typeName === \"React.ReactNode\" ||\n typeName.endsWith(\".ReactNode\")\n ) {\n return { propType: { type: \"node\" } };\n }\n\n if (\n typeName === \"ReactElement\" ||\n typeName === \"React.ReactElement\" ||\n typeName === \"JSX.Element\"\n ) {\n return { propType: { type: \"element\" } };\n }\n\n // Generic type reference\n return {\n propType: { type: \"custom\", typescript: node.getText(sourceFile) },\n };\n }\n\n // Type literal (inline object type)\n if (ts.isTypeLiteralNode(node)) {\n return { propType: { type: \"object\" } };\n }\n\n // Default: custom type\n return {\n propType: { type: \"custom\", typescript: node.getText(sourceFile) },\n };\n}\n\n/**\n * Infer component name from file path\n */\nfunction inferComponentName(filePath: string): string {\n const fileName = basename(filePath);\n // Remove extension\n let name = fileName.replace(/\\.(tsx?|jsx?)$/, \"\");\n // Handle index files\n if (name === \"index\") {\n name = basename(dirname(filePath));\n }\n return name;\n}\n\n/**\n * Convert extracted props to PropDefinition format for segments.json\n */\nexport function convertToSegmentProps(\n props: ExtractedProp[]\n): Record<string, PropDefinition> {\n const result: Record<string, PropDefinition> = {};\n\n for (const prop of props) {\n const definition: PropDefinition = {\n type: prop.propType.type,\n description: prop.description,\n required: prop.required,\n };\n\n // Add values for enum types\n if (prop.enumValues && prop.enumValues.length > 0) {\n definition.values = prop.enumValues;\n }\n\n // Add default value\n if (prop.defaultValue !== undefined) {\n definition.default = prop.defaultValue;\n }\n\n // Add type details for complex types\n if (prop.propType.type === \"object\" && \"shape\" in prop.propType) {\n definition.typeDetails = { shape: prop.propType.shape };\n }\n if (prop.propType.type === \"array\" && \"items\" in prop.propType) {\n definition.typeDetails = { items: prop.propType.items };\n }\n if (prop.propType.type === \"function\" && \"signature\" in prop.propType) {\n definition.typeDetails = { signature: prop.propType.signature };\n }\n if (prop.propType.type === \"union\" && \"types\" in prop.propType) {\n definition.typeDetails = { types: prop.propType.types };\n }\n if (prop.propType.type === \"custom\" && \"typescript\" in prop.propType) {\n definition.typeDetails = { typescript: prop.propType.typescript };\n }\n\n result[prop.name] = definition;\n }\n\n return result;\n}\n\n/**\n * Find component source file and extract props\n */\nexport async function extractPropsForComponent(\n componentName: string,\n searchDirs: string[]\n): Promise<PropsExtractionResult | null> {\n const patterns = [\n `${componentName}.tsx`,\n `${componentName}.ts`,\n `${componentName}/index.tsx`,\n `${componentName}/index.ts`,\n `${componentName}/${componentName}.tsx`,\n `${componentName}/${componentName}.ts`,\n ];\n\n for (const dir of searchDirs) {\n for (const pattern of patterns) {\n const fullPath = join(dir, pattern);\n if (existsSync(fullPath)) {\n return extractPropsFromFile(fullPath, {\n propsTypeName: `${componentName}Props`,\n });\n }\n }\n }\n\n return null;\n}\n\n/**\n * Extract props from multiple component files\n */\nexport async function extractAllComponentProps(\n componentFiles: Map<string, string>\n): Promise<Map<string, PropsExtractionResult>> {\n const results = new Map<string, PropsExtractionResult>();\n\n for (const [componentName, filePath] of componentFiles) {\n try {\n const extraction = await extractPropsFromFile(filePath, {\n propsTypeName: `${componentName}Props`,\n });\n results.set(componentName, extraction);\n } catch (error) {\n results.set(componentName, {\n filePath,\n componentName,\n props: [],\n success: false,\n warnings: [`Extraction failed: ${(error as Error).message}`],\n });\n }\n }\n\n return results;\n}\n","/**\n * Variant Renderer\n *\n * Uses Playwright to render Storybook stories and capture actual JSX/props\n * from rendered components. This solves the problem where static AST extraction\n * fails on complex components with variable references, expressions, or runtime values.\n *\n * How it works:\n * 1. Navigates to a Storybook story URL in the iframe\n * 2. Waits for the component to render\n * 3. Extracts rendered props and component structure from the DOM\n * 4. Generates JSX code representation of the rendered component\n */\n\nimport type { Page, BrowserContext } from \"playwright\";\nimport { getSharedPool, shutdownSharedPool } from \"../browser-pool.js\";\n\n/**\n * Rendered variant with extracted props and code\n */\nexport interface RenderedVariant {\n /** Story name */\n name: string;\n /** Story display name */\n displayName: string;\n /** Description if available */\n description?: string;\n /** Extracted props from rendered component */\n props: Record<string, unknown>;\n /** Generated JSX code representation */\n code: string;\n /** Whether this is the default story */\n isDefault: boolean;\n /** Storybook story ID */\n storyId: string;\n /** Raw DOM element info for debugging */\n domInfo?: {\n tagName: string;\n attributes: Record<string, string>;\n childCount: number;\n };\n}\n\n/**\n * Result of rendering all variants for a component\n */\nexport interface VariantRenderResult {\n /** Component name */\n componentName: string;\n /** Successfully rendered variants */\n variants: RenderedVariant[];\n /** Variants that failed to render with error messages */\n failed: Array<{ storyId: string; error: string }>;\n /** Total time taken to render all variants (ms) */\n totalTimeMs: number;\n}\n\n/**\n * Options for variant rendering\n */\nexport interface VariantRenderOptions {\n /** Storybook base URL (e.g., \"http://localhost:6006\") */\n storybookUrl: string;\n /** Component name */\n componentName: string;\n /** Story IDs to render */\n storyIds: string[];\n /** Timeout for each story render (ms) */\n timeout?: number;\n /** Wait time after navigation for component to render (ms) */\n renderWait?: number;\n /** Selector for the component root (default: \"#storybook-root\") */\n rootSelector?: string;\n}\n\nconst DEFAULT_TIMEOUT = 10000;\nconst DEFAULT_RENDER_WAIT = 1000;\nconst DEFAULT_ROOT_SELECTOR = \"#storybook-root\";\n\n/**\n * Render Storybook variants and extract props/code\n */\nexport async function renderVariants(\n options: VariantRenderOptions\n): Promise<VariantRenderResult> {\n const {\n storybookUrl,\n componentName,\n storyIds,\n timeout = DEFAULT_TIMEOUT,\n renderWait = DEFAULT_RENDER_WAIT,\n rootSelector = DEFAULT_ROOT_SELECTOR,\n } = options;\n\n const startTime = Date.now();\n const result: VariantRenderResult = {\n componentName,\n variants: [],\n failed: [],\n totalTimeMs: 0,\n };\n\n if (storyIds.length === 0) {\n result.totalTimeMs = Date.now() - startTime;\n return result;\n }\n\n // Acquire browser context from pool\n const pool = getSharedPool();\n let context: BrowserContext | null = null;\n let page: Page | null = null;\n\n try {\n context = await pool.acquire();\n page = await context.newPage();\n\n // Process each story\n for (const storyId of storyIds) {\n try {\n const variant = await renderSingleVariant(\n page,\n storybookUrl,\n storyId,\n componentName,\n rootSelector,\n timeout,\n renderWait\n );\n result.variants.push(variant);\n } catch (error) {\n result.failed.push({\n storyId,\n error: (error as Error).message,\n });\n }\n }\n } finally {\n // Clean up\n if (page) {\n try {\n await page.close();\n } catch {\n // Ignore cleanup errors\n }\n }\n if (context) {\n await pool.release(context);\n }\n }\n\n result.totalTimeMs = Date.now() - startTime;\n return result;\n}\n\n/**\n * Render a single story and extract props/code\n */\nasync function renderSingleVariant(\n page: Page,\n storybookUrl: string,\n storyId: string,\n componentName: string,\n rootSelector: string,\n timeout: number,\n renderWait: number\n): Promise<RenderedVariant> {\n // Navigate to the story iframe URL\n const storyUrl = `${storybookUrl}/iframe.html?id=${storyId}&viewMode=story`;\n await page.goto(storyUrl, { timeout, waitUntil: \"domcontentloaded\" });\n\n // Wait for the root element to appear\n await page.waitForSelector(rootSelector, { timeout });\n\n // Wait for component to render\n await page.waitForTimeout(renderWait);\n\n // Extract component information from the DOM\n const extractionResult = await page.evaluate(\n ({ rootSelector, componentName }) => {\n const root = document.querySelector(rootSelector);\n if (!root) {\n throw new Error(`Root element not found: ${rootSelector}`);\n }\n\n // Find the first meaningful child element (skip wrapper divs)\n function findComponentElement(el: Element): Element | null {\n // If this element has the component name in its class or data attribute, use it\n const className = el.className || \"\";\n if (className.toLowerCase().includes(componentName.toLowerCase())) {\n return el;\n }\n\n // Check for data attributes that might indicate component\n if (el.getAttribute(\"data-component\") || el.getAttribute(\"data-testid\")) {\n return el;\n }\n\n // If it's a simple wrapper with one child, go deeper\n const children = Array.from(el.children);\n if (children.length === 1 && el.tagName === \"DIV\") {\n return findComponentElement(children[0]) || children[0];\n }\n\n // Return the first meaningful element\n return el.firstElementChild;\n }\n\n const componentEl = findComponentElement(root) || root.firstElementChild;\n if (!componentEl) {\n throw new Error(\"No component element found in story\");\n }\n\n // Extract attributes as props\n const props: Record<string, unknown> = {};\n const attributes: Record<string, string> = {};\n\n for (const attr of Array.from(componentEl.attributes)) {\n const name = attr.name;\n let value: unknown = attr.value;\n\n // Skip internal React/browser attributes\n if (name.startsWith(\"data-\") && !name.startsWith(\"data-testid\")) {\n continue;\n }\n if (name === \"class\" || name === \"style\") {\n attributes[name] = attr.value;\n continue;\n }\n\n // Try to parse boolean/number values\n if (value === \"true\") value = true;\n else if (value === \"false\") value = false;\n else if (value !== \"\" && !isNaN(Number(value))) value = Number(value);\n\n props[name] = value;\n attributes[name] = attr.value;\n }\n\n // Check for special props through data attributes\n const dataVariant = componentEl.getAttribute(\"data-variant\");\n if (dataVariant) props.variant = dataVariant;\n\n const dataSize = componentEl.getAttribute(\"data-size\");\n if (dataSize) props.size = dataSize;\n\n // Get DOM info for debugging\n const domInfo = {\n tagName: componentEl.tagName.toLowerCase(),\n attributes,\n childCount: componentEl.children.length,\n };\n\n // Get text content for simple components\n const textContent = componentEl.textContent?.trim() || \"\";\n if (textContent && !props.children && componentEl.children.length === 0) {\n props.children = textContent;\n }\n\n return { props, domInfo };\n },\n { rootSelector, componentName }\n );\n\n // Generate JSX code from extracted props\n const code = generateJSXCode(componentName, extractionResult.props);\n\n // Parse story ID to get display name\n const displayName = storyIdToDisplayName(storyId);\n const isDefault =\n storyId.toLowerCase().includes(\"--default\") ||\n storyId.toLowerCase().includes(\"--primary\");\n\n return {\n name: displayName.replace(/\\s+/g, \"\"),\n displayName,\n props: extractionResult.props,\n code,\n isDefault,\n storyId,\n domInfo: extractionResult.domInfo,\n };\n}\n\n/**\n * Generate JSX code from component name and props\n */\nfunction generateJSXCode(\n componentName: string,\n props: Record<string, unknown>\n): string {\n const { children, ...restProps } = props;\n\n const propStrings = Object.entries(restProps)\n .filter(([, value]) => value !== undefined && value !== null)\n .map(([key, value]) => {\n if (typeof value === \"string\") {\n return `${key}=\"${value}\"`;\n }\n if (typeof value === \"boolean\") {\n return value ? key : null;\n }\n return `${key}={${JSON.stringify(value)}}`;\n })\n .filter(Boolean);\n\n const propsString = propStrings.length > 0 ? ` ${propStrings.join(\" \")}` : \"\";\n\n if (children) {\n return `<${componentName}${propsString}>${children}</${componentName}>`;\n }\n return `<${componentName}${propsString} />`;\n}\n\n/**\n * Convert story ID to display name\n * e.g., \"components-button--primary\" -> \"Primary\"\n */\nfunction storyIdToDisplayName(storyId: string): string {\n // Get the part after the last \"--\"\n const parts = storyId.split(\"--\");\n const name = parts[parts.length - 1];\n\n // Convert kebab-case to Title Case\n return name\n .split(\"-\")\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \");\n}\n\n/**\n * Check if Storybook is running at the given URL\n */\nexport async function checkStorybookRunning(\n storybookUrl: string,\n timeout: number = 5000\n): Promise<boolean> {\n const pool = getSharedPool();\n let context: BrowserContext | null = null;\n let page: Page | null = null;\n\n try {\n context = await pool.acquire();\n page = await context.newPage();\n\n await page.goto(storybookUrl, { timeout, waitUntil: \"domcontentloaded\" });\n\n // Check for Storybook-specific elements\n const isStorybook = await page.evaluate(() => {\n // Check for Storybook manager or preview\n return !!(\n document.querySelector(\"#storybook-root\") ||\n document.querySelector(\"#storybook-preview-wrapper\") ||\n document.querySelector(\"[data-is-storybook]\") ||\n // Check for common Storybook title patterns\n document.title.includes(\"Storybook\")\n );\n });\n\n return isStorybook;\n } catch {\n return false;\n } finally {\n if (page) {\n try {\n await page.close();\n } catch {\n // Ignore\n }\n }\n if (context) {\n await pool.release(context);\n }\n }\n}\n\n/**\n * Get all story IDs for a component from Storybook\n */\nexport async function getStorybookStoryIds(\n storybookUrl: string,\n componentName: string,\n timeout: number = 10000\n): Promise<string[]> {\n const pool = getSharedPool();\n let context: BrowserContext | null = null;\n let page: Page | null = null;\n\n try {\n context = await pool.acquire();\n page = await context.newPage();\n\n // Navigate to Storybook index\n await page.goto(`${storybookUrl}/index.json`, {\n timeout,\n waitUntil: \"networkidle\",\n });\n\n // Parse the index.json to get stories\n const content = await page.evaluate(() => {\n const pre = document.querySelector(\"pre\");\n return pre?.textContent || document.body.textContent || \"\";\n });\n\n const data = JSON.parse(content);\n\n // Find stories matching the component name\n const storyIds: string[] = [];\n const componentLower = componentName.toLowerCase();\n\n if (data.entries) {\n // Storybook 7+ format\n for (const [id, entry] of Object.entries(data.entries)) {\n const e = entry as { type?: string; title?: string };\n if (\n e.type === \"story\" &&\n e.title?.toLowerCase().includes(componentLower)\n ) {\n storyIds.push(id);\n }\n }\n } else if (data.stories) {\n // Legacy format\n for (const [id, story] of Object.entries(data.stories)) {\n const s = story as { kind?: string };\n if (s.kind?.toLowerCase().includes(componentLower)) {\n storyIds.push(id);\n }\n }\n }\n\n return storyIds;\n } catch {\n return [];\n } finally {\n if (page) {\n try {\n await page.close();\n } catch {\n // Ignore\n }\n }\n if (context) {\n await pool.release(context);\n }\n }\n}\n\n/**\n * Render all variants for a component from a running Storybook\n */\nexport async function renderAllComponentVariants(\n storybookUrl: string,\n componentName: string,\n options: Partial<VariantRenderOptions> = {}\n): Promise<VariantRenderResult> {\n // Get story IDs for this component\n const storyIds = await getStorybookStoryIds(storybookUrl, componentName);\n\n if (storyIds.length === 0) {\n return {\n componentName,\n variants: [],\n failed: [],\n totalTimeMs: 0,\n };\n }\n\n return renderVariants({\n storybookUrl,\n componentName,\n storyIds,\n ...options,\n });\n}\n\n/**\n * Shutdown the browser pool when done\n */\nexport { shutdownSharedPool };\n"],"mappings":"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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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","names":["resolve","resolve","resolve","readFile","readFile","t","toCssProperty","generateUnifiedDiff","escapeRegExp","readFile","writeFile","mkdir","readdir","join","join","mkdir","readFile","writeFile","readdir","parse","t","readFile","traverse","PARSER_OPTIONS","readFile","writeFile","existsSync","createHash","join","dirname","mkdir","readFile","relative","resolve","dirname","resolve","relative","readFile","dirname","parse","_traverse","t","readFile","existsSync","basename","dirname","join","traverse","parse","_traverse","t","readFile","fg","basename","relative","traverse","readFile","existsSync","basename","dirname","join","resolve","inferComponentName","extractPropsFromInterface","extractPropsFromTypeAlias","rootSelector","componentName"]}
|