@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
package/dist/bin.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/bin.ts","../src/commands/validate.ts","../src/commands/build.ts","../src/commands/context.ts","../src/commands/list.ts","../src/commands/reset.ts","../src/commands/dev.ts","../src/setup.ts","../src/migrate/migrate.ts","../src/migrate/parser.ts","../src/migrate/converter.ts","../src/migrate/detect.ts","../src/commands/compare.ts","../src/commands/verify.ts","../src/shared/dev-server-client.ts","../src/shared/command-wrapper.ts","../src/commands/audit.ts","../src/commands/a11y.ts","../src/commands/storygen.ts","../src/commands/metrics.ts","../src/commands/baseline.ts","../src/commands/add.ts","../src/commands/link/figma.ts","../src/commands/link/storybook.ts","../src/commands/enhance.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * fragments CLI - Design system documentation and compliance tool\n *\n * This file registers all commands with Commander. Command implementations\n * are in the commands/ directory.\n */\n\nimport { Command } from 'commander';\nimport pc from 'picocolors';\nimport { BRAND } from './core/index.js';\nimport { loadConfig } from './core/node.js';\n\n// Import command implementations\nimport { validate } from './commands/validate.js';\nimport { build } from './commands/build.js';\nimport { context } from './commands/context.js';\nimport { list } from './commands/list.js';\nimport { reset } from './commands/reset.js';\nimport { dev } from './commands/dev.js';\nimport { compare } from './commands/compare.js';\nimport { verify } from './commands/verify.js';\nimport { audit } from './commands/audit.js';\nimport { a11y } from './commands/a11y.js';\nimport { storygen } from './commands/storygen.js';\nimport { metrics } from './commands/metrics.js';\nimport { baseline } from './commands/baseline.js';\nimport { add } from './commands/add.js';\nimport { linkFigma, linkStorybook } from './commands/link/index.js';\nimport { enhance } from './commands/enhance.js';\nimport { scan } from './commands/scan.js';\n\n// Import existing commands that were already extracted\nimport { runScreenshotCommand } from './screenshot.js';\nimport { runDiffCommand } from './diff.js';\nimport { runAnalyzeCommand } from './analyze.js';\n\nconst program = new Command();\n\nprogram\n .name(BRAND.cliCommand)\n .description(`${BRAND.name} - Design system documentation and compliance tool`)\n .version('0.1.0');\n\n// ============================================================================\n// VALIDATE COMMAND\n// ============================================================================\nprogram\n .command('validate')\n .description('Validate fragment files')\n .option('-c, --config <path>', 'Path to config file')\n .option('--schema', 'Validate fragment schema only')\n .option('--coverage', 'Validate coverage only')\n .action(async (options) => {\n try {\n const result = await validate(options);\n if (!result.valid) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// BUILD COMMAND\n// ============================================================================\nprogram\n .command('build')\n .description(`Build compiled ${BRAND.outFile} and ${BRAND.dataDir}/ directory`)\n .option('-c, --config <path>', 'Path to config file')\n .option('-o, --output <path>', 'Output file path')\n .option('--registry', `Also generate ${BRAND.dataDir}/${BRAND.registryFile} and ${BRAND.contextFile}`)\n .option('--registry-only', `Only generate ${BRAND.dataDir}/ directory (skip ${BRAND.outFile})`)\n .option('--from-source', 'Build from source code (zero-config, no fragment files needed)')\n .option('--skip-usage', 'Skip usage analysis when building from source')\n .option('--skip-storybook', 'Skip Storybook parsing when building from source')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options) => {\n try {\n const result = await build({\n config: options.config,\n output: options.output,\n registry: options.registry,\n registryOnly: options.registryOnly,\n fromSource: options.fromSource,\n skipUsage: options.skipUsage,\n skipStorybook: options.skipStorybook,\n verbose: options.verbose,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// CONTEXT COMMAND\n// ============================================================================\nprogram\n .command('context')\n .description('Generate AI-ready context for your design system')\n .option('-c, --config <path>', 'Path to config file')\n .option('-i, --input <path>', `Path to ${BRAND.outFile} (builds if not provided)`)\n .option('-f, --format <format>', 'Output format (markdown/json)', 'markdown')\n .option('--compact', 'Minimal output for token efficiency')\n .option('--code', 'Include code examples')\n .option('--relations', 'Include component relationships')\n .option('--tokens', 'Only output token estimate')\n .action(async (options) => {\n try {\n const result = await context({\n config: options.config,\n input: options.input,\n format: options.format,\n compact: options.compact,\n includeCode: options.code,\n includeRelations: options.relations,\n tokensOnly: options.tokens,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// AI COMMAND (for Claude Desktop integration)\n// ============================================================================\nprogram\n .command('ai')\n .description('Generate context optimized for AI assistants (Claude Desktop)')\n .option('-c, --config <path>', 'Path to config file')\n .option('--live', 'Connect to running dev server for live data')\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (options) => {\n try {\n // If live mode, fetch from dev server\n if (options.live) {\n const baseUrl = `http://localhost:${options.port}`;\n const response = await fetch(`${baseUrl}/${BRAND.nameLower}/context?format=markdown`);\n if (!response.ok) {\n throw new Error('Failed to fetch context. Make sure dev server is running.');\n }\n const contextContent = await response.text();\n console.log(contextContent);\n } else {\n // Build and generate context\n const result = await context({\n config: options.config,\n format: 'markdown',\n compact: false,\n includeCode: true,\n includeRelations: true,\n });\n if (!result.success) {\n process.exit(1);\n }\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// LIST COMMAND\n// ============================================================================\nprogram\n .command('list')\n .description('List all discovered fragment files')\n .option('-c, --config <path>', 'Path to config file')\n .action(async (options) => {\n try {\n await list(options);\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// RESET COMMAND\n// ============================================================================\nprogram\n .command('reset')\n .description('Reset to initial state (delete all generated files)')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--dry-run', 'Show what would be deleted without deleting')\n .action(async (options) => {\n try {\n await reset(options);\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// LINK COMMAND (parent for subcommands)\n// ============================================================================\nconst linkCommand = program\n .command('link')\n .description('Link external resources (Figma designs, Storybook stories) to fragments');\n\n// Link Figma subcommand\nlinkCommand\n .command('figma')\n .argument('[figma-url]', 'Figma file URL to link components from')\n .description('Interactive wizard to link Figma components to code')\n .option('-c, --config <path>', 'Path to config file')\n .option('--auto', 'Auto-link matching components without prompts')\n .option('--dry-run', 'Show matches without updating files')\n .option('--no-variants', 'Skip linking individual variants to their Figma frames')\n .action(async (figmaUrl, options) => {\n try {\n await linkFigma(figmaUrl, {\n config: options.config,\n auto: options.auto,\n dryRun: options.dryRun,\n variants: options.variants,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Link Storybook subcommand\nlinkCommand\n .command('storybook')\n .description('Bootstrap fragments from existing Storybook stories')\n .option('-c, --config <path>', 'Path to .storybook/main.* config')\n .option('-o, --out <dir>', 'Output directory for fragment files')\n .option('--yes', 'Skip confirmation prompts')\n .option('--dry-run', 'Preview what would be generated without writing files')\n .option('--include <glob>', 'Only process stories matching glob')\n .option('--exclude <glob>', 'Skip stories matching glob')\n .action(async (options) => {\n try {\n await linkStorybook({\n config: options.config,\n out: options.out,\n yes: options.yes,\n dryRun: options.dryRun,\n include: options.include,\n exclude: options.exclude,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// DEV COMMAND\n// ============================================================================\nprogram\n .command('dev')\n .description('Start the development server with live component rendering')\n .option('-p, --port <port>', 'Port to run on', '6006')\n .option('--no-open', 'Do not open browser')\n .option('--skip-setup', 'Skip auto-setup (Storybook import, build, Figma link)')\n .option('--skip-storybook', 'Skip auto-importing from Storybook')\n .option('--skip-figma', 'Skip Figma link check')\n .option('--skip-build', `Skip auto-building ${BRAND.outFile}`)\n .action(async (options) => {\n try {\n await dev({\n port: options.port,\n open: options.open,\n skipSetup: options.skipSetup,\n skipStorybook: options.skipStorybook,\n skipFigma: options.skipFigma,\n skipBuild: options.skipBuild,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n if (error instanceof Error && error.stack) {\n console.error(pc.dim(error.stack));\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// SCREENSHOT COMMAND\n// ============================================================================\nprogram\n .command('screenshot')\n .description('Capture screenshots of component variants')\n .option('-c, --config <path>', 'Path to config file')\n .option('--component <name>', 'Capture specific component only')\n .option('--variant <name>', 'Capture specific variant only')\n .option('--theme <theme>', 'Theme to capture (light/dark)', 'light')\n .option('--update', 'Update existing baselines')\n .option('--width <pixels>', 'Viewport width', parseInt)\n .option('--height <pixels>', 'Viewport height', parseInt)\n .option('--ci', 'CI mode - no interactive prompts')\n .action(async (options) => {\n try {\n const { config, configDir } = await loadConfig(options.config);\n const result = await runScreenshotCommand(config, configDir, {\n component: options.component,\n variant: options.variant,\n theme: options.theme,\n update: options.update,\n ci: options.ci,\n width: options.width,\n height: options.height,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// DIFF COMMAND\n// ============================================================================\nprogram\n .command('diff')\n .argument('[component]', 'Component name to diff (optional)')\n .description('Compare current renders against baselines')\n .option('-c, --config <path>', 'Path to config file')\n .option('--variant <name>', 'Compare specific variant only')\n .option('--theme <theme>', 'Theme to compare (light/dark)', 'light')\n .option('--threshold <percent>', 'Diff threshold percentage', parseFloat)\n .option('--ci', 'CI mode - exit 1 on differences')\n .option('--open', 'Open diff images')\n .action(async (component, options) => {\n try {\n const { config, configDir } = await loadConfig(options.config);\n const result = await runDiffCommand(config, configDir, {\n component,\n variant: options.variant,\n theme: options.theme,\n threshold: options.threshold,\n ci: options.ci,\n open: options.open,\n });\n if (!result.success && options.ci) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// COMPARE COMMAND\n// ============================================================================\nprogram\n .command('compare')\n .argument('[component]', 'Component name to compare')\n .description('Compare component renders against Figma designs')\n .option('-c, --config <path>', 'Path to config file')\n .option('--variant <name>', 'Compare specific variant')\n .option('--figma <url>', 'Figma frame URL (uses fragment figma link if not provided)')\n .option('--threshold <percent>', 'Diff threshold percentage', parseFloat, 1.0)\n .option('--all', 'Compare all components with Figma links')\n .option('--output <dir>', 'Save diff images to directory')\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (component, options) => {\n try {\n const result = await compare(component, {\n config: options.config,\n variant: options.variant,\n figma: options.figma,\n threshold: options.threshold,\n all: options.all,\n output: options.output,\n port: options.port,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n console.log(pc.dim(`\\nMake sure the dev server is running: ${BRAND.cliCommand} dev`));\n process.exit(1);\n }\n });\n\n// ============================================================================\n// ANALYZE COMMAND\n// ============================================================================\nprogram\n .command('analyze')\n .description('Analyze design system and generate report')\n .option('-c, --config <path>', 'Path to config file')\n .option('-f, --format <format>', 'Output format (html/json/console)', 'html')\n .option('-o, --output <path>', 'Output file path')\n .option('--open', 'Open report in browser after generation')\n .option('--ci', 'CI mode - exit with code based on score')\n .option('--min-score <score>', 'Minimum score to pass in CI mode', parseFloat)\n .action(async (options) => {\n try {\n const { config, configDir } = await loadConfig(options.config);\n const result = await runAnalyzeCommand(config, configDir, {\n format: options.format,\n output: options.output,\n open: options.open,\n ci: options.ci,\n minScore: options.minScore,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// VERIFY COMMAND\n// ============================================================================\nprogram\n .command('verify')\n .argument('[component]', 'Component name to verify (optional, verifies all if omitted)')\n .description('Verify component compliance for CI pipelines')\n .option('-c, --config <path>', 'Path to config file')\n .option('--ci', 'CI mode - output JSON and exit non-zero on failure')\n .option('--min-compliance <percent>', 'Minimum compliance percentage (default: 80)', parseFloat, 80)\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (component, options) => {\n try {\n const summary = await verify(component, {\n config: options.config,\n ci: options.ci,\n minCompliance: options.minCompliance,\n port: options.port,\n });\n if (!summary.passed && options.ci) {\n process.exit(1);\n }\n } catch (error) {\n if (options.ci) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : 'Verification failed' }));\n } else {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// AUDIT COMMAND\n// ============================================================================\nprogram\n .command('audit')\n .description('Scan all fragments and show compliance metrics across the design system')\n .option('-c, --config <path>', 'Path to config file')\n .option('--json', 'Output machine-readable JSON format')\n .option('--sort <field>', 'Sort by field: compliance, name, hardcoded (default: compliance)', 'compliance')\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (options) => {\n try {\n await audit({\n config: options.config,\n json: options.json,\n sort: options.sort,\n port: options.port,\n });\n } catch (error) {\n if (options.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : 'Audit failed' }));\n } else {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// A11Y COMMAND\n// ============================================================================\nprogram\n .command('a11y')\n .description('Run accessibility checks on all component variants')\n .option('-c, --config <path>', 'Path to config file')\n .option('--json', 'Output results as JSON')\n .option('--ci', 'CI mode (exit code 1 if any critical/serious violations)')\n .option('--component <name>', 'Check specific component only')\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (options) => {\n try {\n await a11y({\n config: options.config,\n json: options.json,\n ci: options.ci,\n component: options.component,\n port: options.port,\n });\n } catch (error) {\n if (options.json) {\n console.log(JSON.stringify({ error: error instanceof Error ? error.message : 'A11y check failed' }));\n } else {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// ENHANCE COMMAND\n// ============================================================================\nprogram\n .command('enhance')\n .description('AI-powered documentation generation from codebase analysis')\n .option('-c, --config <path>', 'Path to config file')\n .option('--component <name>', 'Enhance specific component (or \"all\")')\n .option('--yes', 'Skip confirmation prompts')\n .option('--dry-run', 'Only analyze, do not modify files')\n .option('--format <format>', 'Output format: interactive, json, quiet, context', 'interactive')\n .option('--provider <provider>', 'AI provider: anthropic, openai (auto-detected from API key)')\n .option('--api-key <key>', 'API key (or use ANTHROPIC_API_KEY/OPENAI_API_KEY env)')\n .option('--model <model>', 'AI model to use (default: claude-sonnet-4 for anthropic, gpt-4o for openai)')\n .option('--root <dir>', 'Root directory to scan', process.cwd())\n .option('--context-only', 'Output context for IDE AI (Cursor, Copilot) without calling API')\n .action(async (options) => {\n try {\n await enhance({\n config: options.config,\n component: options.component,\n yes: options.yes,\n dryRun: options.dryRun,\n format: options.format,\n provider: options.provider,\n apiKey: options.apiKey,\n model: options.model,\n root: options.root,\n contextOnly: options.contextOnly,\n });\n } catch (error) {\n if (options.format === 'json') {\n console.log(JSON.stringify({ success: false, error: error instanceof Error ? error.message : 'Enhance failed' }));\n } else {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// SCAN COMMAND\n// ============================================================================\nprogram\n .command('scan')\n .description(`Zero-config ${BRAND.outFile} generation from source code`)\n .option('-c, --config <path>', 'Path to config file')\n .option('-o, --output <path>', 'Output file path', BRAND.outFile)\n .option('--patterns <patterns...>', 'Component file patterns to scan')\n .option('--barrel <files...>', 'Barrel export files to parse')\n .option('--usage-dir <dir>', 'Directory to scan for usage patterns')\n .option('--skip-usage', 'Skip usage pattern analysis')\n .option('--skip-storybook', 'Skip Storybook story parsing')\n .option('-v, --verbose', 'Verbose output')\n .action(async (options) => {\n try {\n const result = await scan({\n config: options.config,\n output: options.output,\n componentPatterns: options.patterns,\n barrelFiles: options.barrel,\n usageDir: options.usageDir,\n skipUsage: options.skipUsage,\n skipStorybook: options.skipStorybook,\n verbose: options.verbose,\n });\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// STORYGEN COMMAND\n// ============================================================================\nprogram\n .command('storygen')\n .description('Generate Storybook stories from fragment definitions')\n .option('-c, --config <path>', 'Path to config file')\n .option('-o, --output <dir>', 'Output directory', '.storybook/generated')\n .option('--watch', 'Watch for segment changes and regenerate')\n .option('--format <format>', 'Story format (csf3)', 'csf3')\n .action(async (options) => {\n try {\n await storygen({\n config: options.config,\n output: options.output,\n watch: options.watch,\n format: options.format,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// METRICS COMMAND\n// ============================================================================\nprogram\n .command('metrics')\n .argument('[component]', 'Component name (optional, shows system-wide if omitted)')\n .description('View compliance trends over time')\n .option('-c, --config <path>', 'Path to config file')\n .option('--days <number>', 'Number of days to look back', parseInt, 30)\n .option('--json', 'Output JSON format')\n .action(async (component, options) => {\n try {\n await metrics(component, {\n config: options.config,\n days: options.days,\n json: options.json,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// BASELINE COMMAND\n// ============================================================================\nprogram\n .command('baseline')\n .description('Manage visual regression baselines')\n .argument('<action>', 'Action to perform: update, list, delete')\n .argument('[component]', 'Component name (optional for update/delete)')\n .option('-c, --config <path>', 'Path to config file')\n .option('--variant <name>', 'Specific variant to update')\n .option('--all', 'Update/delete all baselines')\n .option('--theme <theme>', 'Theme for baseline (light/dark)', 'light')\n .option('-p, --port <port>', 'Dev server port', '6006')\n .action(async (action, component, options) => {\n try {\n await baseline(action, component, {\n config: options.config,\n variant: options.variant,\n all: options.all,\n theme: options.theme as 'light' | 'dark' | undefined,\n port: options.port,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n if (action === 'update') {\n console.log(pc.dim(`\\nMake sure the dev server is running: ${BRAND.cliCommand} dev`));\n }\n process.exit(1);\n }\n });\n\n// ============================================================================\n// VIEW COMMAND\n// ============================================================================\nprogram\n .command('view')\n .description(`Generate a static HTML viewer for ${BRAND.outFile}`)\n .option('-i, --input <path>', `Path to ${BRAND.outFile}`, BRAND.outFile)\n .option('-o, --output <path>', 'Output HTML file path', BRAND.viewerHtmlFile)\n .option('--open', 'Open in browser after generation')\n .action(async (options) => {\n try {\n const { generateViewerFromJson } = await import('./static-viewer.js');\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n\n const inputPath = path.resolve(process.cwd(), options.input);\n const outputPath = path.resolve(process.cwd(), options.output);\n\n console.log(pc.cyan(`\\n${BRAND.name} Viewer Generator\\n`));\n\n try {\n await fs.access(inputPath);\n } catch {\n console.log(pc.red(`Error: ${options.input} not found.`));\n console.log(pc.dim(`\\nRun ${pc.cyan(`${BRAND.cliCommand} build`)} first to generate ${BRAND.outFile}\\n`));\n process.exit(1);\n }\n\n console.log(pc.dim(`Reading: ${options.input}`));\n const html = await generateViewerFromJson(inputPath);\n\n await fs.writeFile(outputPath, html);\n console.log(pc.green(`\\n✓ Generated: ${options.output}\\n`));\n\n if (options.open) {\n const { exec } = await import('node:child_process');\n const openCmd = process.platform === 'darwin' ? 'open' :\n process.platform === 'win32' ? 'start' : 'xdg-open';\n exec(`${openCmd} \"${outputPath}\"`);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// ADD COMMAND\n// ============================================================================\nprogram\n .command('add')\n .argument('[name]', 'Component name (e.g., \"Button\", \"TextField\")')\n .description('Scaffold a new component with fragment file')\n .option('-c, --category <category>', 'Component category')\n .option('-d, --dir <directory>', 'Output directory')\n .option('-t, --template <template>', 'Template to use (action, form-input, layout, display)')\n .option('--no-component', 'Only generate fragment file, skip component stub')\n .action(async (name, options) => {\n try {\n await add(name, {\n category: options.category,\n dir: options.dir,\n template: options.template,\n component: options.component,\n });\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// INIT COMMAND\n// ============================================================================\nprogram\n .command('init')\n .description('Initialize fragments in a project (interactive by default)')\n .option('--force', 'Overwrite existing config')\n .option('-y, --yes', 'Non-interactive mode - auto-detect and use defaults')\n .action(async (options) => {\n try {\n const { init } = await import('./commands/init.js');\n const result = await init({\n projectRoot: process.cwd(),\n force: options.force,\n yes: options.yes,\n });\n\n if (!result.success) {\n console.error(pc.red('\\nInit failed with errors:'));\n for (const error of result.errors) {\n console.error(pc.red(` - ${error}`));\n }\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// TOKENS COMMAND\n// ============================================================================\nprogram\n .command('tokens')\n .description('Discover and list design tokens from CSS/SCSS files')\n .option('-c, --config <path>', 'Path to config file')\n .option('--json', 'Output as JSON')\n .option('--categories', 'Group tokens by category')\n .option('--theme <theme>', 'Filter by theme name')\n .option('--category <category>', 'Filter by category (color, spacing, typography, etc.)')\n .option('--verbose', 'Show all tokens (no truncation)')\n .action(async (options) => {\n try {\n const { tokens } = await import('./commands/tokens.js');\n const result = await tokens({\n config: options.config,\n json: options.json,\n categories: options.categories,\n theme: options.theme,\n category: options.category,\n verbose: options.verbose,\n });\n\n if (!result.success) {\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// GENERATE COMMAND\n// ============================================================================\nprogram\n .command('generate')\n .description('Generate fragment files from component source code')\n .argument('[component]', 'Specific component name to generate (optional)')\n .option('--force', 'Overwrite existing fragment files')\n .option('--pattern <glob>', 'Pattern for component files', 'src/components/**/*.tsx')\n .action(async (component, options) => {\n try {\n const { generate } = await import('./commands/generate.js');\n const result = await generate({\n projectRoot: process.cwd(),\n component,\n force: options.force,\n componentPattern: options.pattern,\n });\n\n if (!result.success) {\n console.error(pc.red('\\nGenerate completed with errors'));\n process.exit(1);\n }\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// ============================================================================\n// TEST COMMAND\n// ============================================================================\nprogram\n .command('test')\n .description('Run interaction tests for fragments with play functions')\n .option('-c, --config <path>', 'Path to config file')\n // Discovery options\n .option('--component <name>', 'Filter by component name')\n .option('--tags <tags>', 'Filter by tags (comma-separated)')\n .option('--grep <pattern>', 'Filter by variant name pattern')\n .option('--exclude <pattern>', 'Exclude tests matching pattern')\n // Execution options\n .option('--parallel <count>', 'Number of parallel browser contexts', parseInt, 4)\n .option('--timeout <ms>', 'Timeout per test in milliseconds', parseInt, 30000)\n .option('--retries <count>', 'Number of retries for failed tests', parseInt, 0)\n .option('--bail', 'Stop on first failure')\n .option('--browser <name>', 'Browser to use (chromium, firefox, webkit)', 'chromium')\n .option('--headed', 'Run in headed mode (show browser)')\n // Feature flags\n .option('--a11y', 'Run accessibility checks with axe-core')\n .option('--visual', 'Capture screenshots for visual regression')\n .option('--update-snapshots', 'Update visual snapshots')\n .option('--watch', 'Watch mode - re-run on file changes')\n // Output options\n .option('--reporters <names>', 'Reporters to use (console, junit, json)', 'console')\n .option('-o, --output <dir>', 'Output directory for results', './test-results')\n // Server options\n .option('--server-url <url>', 'URL of running dev server (skips starting server)')\n .option('-p, --port <port>', 'Port for dev server', parseInt, 6006)\n // CI mode\n .option('--ci', 'CI mode - non-interactive, exit with code 1 on failure')\n // List only\n .option('--list', 'List available tests without running them')\n .action(async (options) => {\n try {\n const { config, configDir } = await loadConfig(options.config);\n\n // Import test module\n const { runTestCommand, listTests } = await import('./test/index.js');\n\n // List mode\n if (options.list) {\n await listTests(config, configDir, {\n component: options.component,\n tags: options.tags,\n grep: options.grep,\n exclude: options.exclude,\n });\n return;\n }\n\n // Run tests\n const exitCode = await runTestCommand(config, configDir, {\n component: options.component,\n tags: options.tags,\n grep: options.grep,\n exclude: options.exclude,\n parallel: options.parallel,\n timeout: options.timeout,\n retries: options.retries,\n bail: options.bail,\n browser: options.browser as 'chromium' | 'firefox' | 'webkit',\n headless: !options.headed,\n a11y: options.a11y,\n visual: options.visual,\n updateSnapshots: options.updateSnapshots,\n watch: options.watch,\n reporters: options.reporters,\n output: options.output,\n serverUrl: options.serverUrl,\n port: options.port,\n ci: options.ci,\n });\n\n process.exit(exitCode);\n } catch (error) {\n console.error(pc.red('Error:'), error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\n// Parse command line arguments\nprogram.parse();\n","/**\n * fragments validate - Validate segment files\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { validateSchema, validateCoverage, validateAll } from '../validators.js';\n\n/**\n * Options for validate command\n */\nexport interface ValidateOptions {\n /** Path to config file */\n config?: string;\n /** Validate segment schema only */\n schema?: boolean;\n /** Validate coverage only */\n coverage?: boolean;\n}\n\n/**\n * Result of validate command\n */\nexport interface ValidateResult {\n valid: boolean;\n errors: Array<{\n file: string;\n message: string;\n details?: string;\n }>;\n warnings: Array<{\n file: string;\n message: string;\n }>;\n}\n\n/**\n * Run the validate command\n */\nexport async function validate(options: ValidateOptions = {}): Promise<ValidateResult> {\n const { config, configDir } = await loadConfig(options.config);\n\n console.log(pc.cyan(`\\n${BRAND.name} Validator\\n`));\n\n let result: ValidateResult;\n if (options.schema) {\n console.log(pc.dim('Running schema validation...\\n'));\n result = await validateSchema(config, configDir);\n } else if (options.coverage) {\n console.log(pc.dim('Running coverage validation...\\n'));\n result = await validateCoverage(config, configDir);\n } else {\n console.log(pc.dim('Running all validations...\\n'));\n result = await validateAll(config, configDir);\n }\n\n // Print errors\n if (result.errors.length > 0) {\n console.log(pc.red(pc.bold('Errors:')));\n for (const error of result.errors) {\n console.log(` ${pc.red('✗')} ${pc.bold(error.file)}`);\n console.log(` ${error.message}`);\n if (error.details) {\n console.log(pc.dim(` ${error.details}`));\n }\n }\n console.log();\n }\n\n // Print warnings\n if (result.warnings.length > 0) {\n console.log(pc.yellow(pc.bold('Warnings:')));\n for (const warning of result.warnings) {\n console.log(` ${pc.yellow('⚠')} ${pc.bold(warning.file)}`);\n console.log(` ${warning.message}`);\n }\n console.log();\n }\n\n // Summary\n if (result.valid && result.warnings.length === 0) {\n console.log(pc.green('✓ All validations passed\\n'));\n } else if (result.valid) {\n console.log(\n pc.yellow(`⚠ Passed with ${result.warnings.length} warning(s)\\n`)\n );\n } else {\n console.log(pc.red(`✗ Failed with ${result.errors.length} error(s)\\n`));\n }\n\n return result;\n}\n","/**\n * fragments build - Build compiled fragments.json and .fragments/ directory\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { buildSegments, buildFragmentsDir } from '../build.js';\nimport { scan } from './scan.js';\n\n/**\n * Options for build command\n */\nexport interface BuildOptions {\n /** Path to config file */\n config?: string;\n /** Output file path */\n output?: string;\n /** Also generate .fragments/registry.json and context.md */\n registry?: boolean;\n /** Only generate .fragments/ directory (skip fragments.json) */\n registryOnly?: boolean;\n /** Build from source code (zero-config, no fragment files needed) */\n fromSource?: boolean;\n /** Skip usage analysis when building from source */\n skipUsage?: boolean;\n /** Skip Storybook parsing when building from source */\n skipStorybook?: boolean;\n /** Verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of build command\n */\nexport interface BuildResult {\n success: boolean;\n segmentCount?: number;\n outputPath?: string;\n componentCount?: number;\n registryPath?: string;\n contextPath?: string;\n errors: Array<{\n file: string;\n error: string;\n }>;\n}\n\n/**\n * Run the build command\n */\nexport async function build(options: BuildOptions = {}): Promise<BuildResult> {\n // If building from source, use the scan pipeline\n if (options.fromSource) {\n console.log(pc.cyan(`\\n${BRAND.name} Build (from source)\\n`));\n console.log(pc.dim('Using zero-config source extraction pipeline\\n'));\n\n const scanResult = await scan({\n config: options.config,\n output: options.output,\n skipUsage: options.skipUsage,\n skipStorybook: options.skipStorybook,\n verbose: options.verbose,\n });\n\n return {\n success: scanResult.success,\n segmentCount: scanResult.componentCount,\n outputPath: scanResult.outputPath,\n errors: scanResult.errors.map((e) => ({ file: e.component, error: e.error })),\n };\n }\n\n const { config, configDir } = await loadConfig(options.config);\n\n if (options.output) {\n config.outFile = options.output;\n }\n\n console.log(pc.cyan(`\\n${BRAND.name} Build\\n`));\n\n const errors: Array<{ file: string; error: string }> = [];\n let segmentCount: number | undefined;\n let outputPath: string | undefined;\n let componentCount: number | undefined;\n let registryPath: string | undefined;\n let contextPath: string | undefined;\n\n // Build fragments.json unless --registry-only\n if (!options.registryOnly) {\n console.log(pc.dim('Compiling fragments...\\n'));\n\n const result = await buildSegments(config, configDir);\n\n if (result.errors.length > 0) {\n console.log(pc.yellow('Build completed with errors:\\n'));\n for (const error of result.errors) {\n console.log(` ${pc.red('✗')} ${error.file}: ${error.error}`);\n errors.push(error);\n }\n console.log();\n }\n\n segmentCount = result.segmentCount;\n outputPath = result.outputPath;\n\n console.log(pc.green(`✓ Built ${result.segmentCount} fragment(s)`));\n console.log(pc.dim(` Output: ${result.outputPath}\\n`));\n }\n\n // Build .fragments/ directory if --registry or --registry-only\n if (options.registry || options.registryOnly) {\n console.log(pc.dim('Generating registry and context...\\n'));\n\n const fragmentsResult = await buildFragmentsDir(config, configDir);\n\n if (fragmentsResult.errors.length > 0) {\n console.log(pc.yellow('Registry build completed with errors:\\n'));\n for (const error of fragmentsResult.errors) {\n console.log(` ${pc.red('✗')} ${error.file}: ${error.error}`);\n errors.push(error);\n }\n console.log();\n }\n\n componentCount = fragmentsResult.componentCount;\n registryPath = fragmentsResult.registryPath;\n contextPath = fragmentsResult.contextPath;\n\n console.log(pc.green(`✓ Generated registry with ${fragmentsResult.componentCount} component(s)`));\n console.log(pc.dim(` Registry: ${fragmentsResult.registryPath}`));\n console.log(pc.dim(` Context: ${fragmentsResult.contextPath}\\n`));\n }\n\n return {\n success: errors.length === 0,\n segmentCount,\n outputPath,\n componentCount,\n registryPath,\n contextPath,\n errors,\n };\n}\n","/**\n * fragments context - Generate AI-ready context for your design system\n */\n\nimport { readFile } from 'node:fs/promises';\nimport { resolve } from 'node:path';\nimport pc from 'picocolors';\nimport { generateContext } from '../core/index.js';\nimport type { CompiledSegment, CompiledSegmentsFile } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { buildSegments } from '../build.js';\n\n/**\n * Options for context command\n */\nexport interface ContextOptions {\n /** Path to config file */\n config?: string;\n /** Path to segments.json (builds if not provided) */\n input?: string;\n /** Output format (markdown/json) */\n format?: 'markdown' | 'json';\n /** Minimal output for token efficiency */\n compact?: boolean;\n /** Include code examples */\n includeCode?: boolean;\n /** Include component relationships */\n includeRelations?: boolean;\n /** Only output token estimate */\n tokensOnly?: boolean;\n}\n\n/**\n * Result of context command\n */\nexport interface ContextResult {\n success: boolean;\n content?: string;\n tokenEstimate: number;\n}\n\n/**\n * Run the context command\n */\nexport async function context(options: ContextOptions = {}): Promise<ContextResult> {\n const {\n format = 'markdown',\n compact = false,\n includeCode = false,\n includeRelations = false,\n tokensOnly = false,\n } = options;\n\n let segments: CompiledSegment[];\n\n if (options.input) {\n // Read from existing segments.json\n const inputPath = resolve(process.cwd(), options.input);\n const content = await readFile(inputPath, 'utf-8');\n const data: CompiledSegmentsFile = JSON.parse(content);\n segments = Object.values(data.segments);\n } else {\n // Build segments on the fly\n const { config, configDir } = await loadConfig(options.config);\n const result = await buildSegments(config, configDir);\n\n if (result.errors.length > 0 && result.segmentCount === 0) {\n console.error(pc.red('Error: No segments found. Run `segments build` first or fix errors.'));\n return { success: false, tokenEstimate: 0 };\n }\n\n // Read the generated file\n const content = await readFile(result.outputPath, 'utf-8');\n const data: CompiledSegmentsFile = JSON.parse(content);\n segments = Object.values(data.segments);\n }\n\n if (segments.length === 0) {\n console.error(pc.red('No segments found.'));\n return { success: false, tokenEstimate: 0 };\n }\n\n const { content, tokenEstimate } = generateContext(segments, {\n format,\n compact,\n include: {\n code: includeCode,\n relations: includeRelations,\n },\n });\n\n if (tokensOnly) {\n console.log(`Estimated tokens: ${tokenEstimate}`);\n } else {\n // Output to stdout (pipeable to file)\n console.log(content);\n\n // Print token estimate to stderr so it doesn't interfere with piped output\n console.error(pc.dim(`\\n[${tokenEstimate} tokens estimated]`));\n }\n\n return {\n success: true,\n content,\n tokenEstimate,\n };\n}\n","/**\n * fragments list - List all discovered fragment files\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig, discoverSegmentFiles } from '../core/node.js';\n\n/**\n * Options for list command\n */\nexport interface ListOptions {\n /** Path to config file */\n config?: string;\n}\n\n/**\n * Result of list command\n */\nexport interface ListResult {\n success: boolean;\n files: Array<{\n absolutePath: string;\n relativePath: string;\n }>;\n}\n\n/**\n * Run the list command\n */\nexport async function list(options: ListOptions = {}): Promise<ListResult> {\n const { config, configDir } = await loadConfig(options.config);\n const files = await discoverSegmentFiles(config, configDir);\n\n console.log(pc.cyan(`\\n${BRAND.name} - Discovered Fragments\\n`));\n\n if (files.length === 0) {\n console.log(pc.yellow('No fragment files found.\\n'));\n console.log(pc.dim(`Looking for: ${config.include.join(', ')}`));\n return { success: true, files: [] };\n }\n\n for (const file of files) {\n console.log(` ${pc.dim('•')} ${file.relativePath}`);\n }\n console.log(pc.dim(`\\n ${files.length} fragment(s) found\\n`));\n\n return { success: true, files };\n}\n","/**\n * fragments reset - Reset to initial state (delete all generated files)\n */\n\nimport { stat, rm, unlink, readdir } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport pc from 'picocolors';\nimport fg from 'fast-glob';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\n\n/**\n * Options for reset command\n */\nexport interface ResetOptions {\n /** Skip confirmation prompt */\n yes?: boolean;\n /** Show what would be deleted without deleting */\n dryRun?: boolean;\n}\n\n/**\n * Result of reset command\n */\nexport interface ResetResult {\n success: boolean;\n deletedFiles: number;\n deletedDirs: number;\n}\n\n/**\n * Run the reset command\n */\nexport async function reset(options: ResetOptions = {}): Promise<ResetResult> {\n const { yes = false, dryRun = false } = options;\n\n console.log(pc.cyan(`\\n${BRAND.name} Reset\\n`));\n\n const projectRoot = process.cwd();\n\n // Items to delete\n const filesToDelete: string[] = [];\n const dirsToDelete: string[] = [];\n\n // Check data directory (.segments/)\n const dataDir = join(projectRoot, BRAND.dataDir);\n try {\n const dataDirStat = await stat(dataDir);\n if (dataDirStat.isDirectory()) {\n dirsToDelete.push(dataDir);\n }\n } catch {\n // Directory doesn't exist\n }\n\n // Check for segments.json (default output file)\n const defaultOutFile = join(projectRoot, 'segments.json');\n try {\n const fileStat = await stat(defaultOutFile);\n if (fileStat.isFile()) {\n filesToDelete.push(defaultOutFile);\n }\n } catch {\n // File doesn't exist\n }\n\n // Try to load config for custom outFile and include patterns\n let segmentPatterns = [`**/*${BRAND.fileExtension}`];\n try {\n const { config } = await loadConfig();\n if (config.outFile && config.outFile !== 'segments.json') {\n const customOutFile = join(projectRoot, config.outFile);\n try {\n const fileStat = await stat(customOutFile);\n if (fileStat.isFile()) {\n filesToDelete.push(customOutFile);\n }\n } catch {\n // Custom outfile doesn't exist\n }\n }\n // Use config include patterns if available\n if (config.include && config.include.length > 0) {\n segmentPatterns = config.include;\n }\n } catch {\n // No config file, use defaults\n }\n\n // Find all segment files (*.segment.tsx)\n console.log(pc.dim('Scanning for generated files...\\n'));\n for (const pattern of segmentPatterns) {\n const matches = await fg(pattern, {\n cwd: projectRoot,\n ignore: ['**/node_modules/**'],\n absolute: true,\n });\n for (const match of matches) {\n if (!filesToDelete.includes(match)) {\n filesToDelete.push(match);\n }\n }\n }\n\n // Find all Documentation.mdx files (generated by link storybook)\n const mdxFiles = await fg('**/Documentation.mdx', {\n cwd: projectRoot,\n ignore: ['**/node_modules/**'],\n absolute: true,\n });\n for (const mdxFile of mdxFiles) {\n if (!filesToDelete.includes(mdxFile)) {\n filesToDelete.push(mdxFile);\n }\n }\n\n // Check if nothing to delete\n if (filesToDelete.length === 0 && dirsToDelete.length === 0) {\n console.log(pc.yellow('Nothing to reset. No generated files found.\\n'));\n return { success: true, deletedFiles: 0, deletedDirs: 0 };\n }\n\n // Show summary\n console.log(pc.dim('The following will be deleted:\\n'));\n\n // Show directories\n for (const dir of dirsToDelete) {\n const relativePath = relative(projectRoot, dir);\n console.log(` 📁 ${relativePath}/`);\n }\n\n // Group files by type for cleaner output\n const segmentFiles = filesToDelete.filter((f) => f.endsWith(BRAND.fileExtension));\n const mdxFilesFound = filesToDelete.filter((f) => f.endsWith('.mdx'));\n const otherFiles = filesToDelete.filter(\n (f) => !f.endsWith(BRAND.fileExtension) && !f.endsWith('.mdx')\n );\n\n if (segmentFiles.length > 0) {\n console.log(` 📄 ${segmentFiles.length} segment file(s) (*${BRAND.fileExtension})`);\n if (segmentFiles.length <= 5) {\n for (const f of segmentFiles) {\n console.log(pc.dim(` ${relative(projectRoot, f)}`));\n }\n } else {\n for (const f of segmentFiles.slice(0, 3)) {\n console.log(pc.dim(` ${relative(projectRoot, f)}`));\n }\n console.log(pc.dim(` ... and ${segmentFiles.length - 3} more`));\n }\n }\n\n if (mdxFilesFound.length > 0) {\n console.log(` 📄 ${mdxFilesFound.length} documentation file(s) (*.mdx)`);\n if (mdxFilesFound.length <= 5) {\n for (const f of mdxFilesFound) {\n console.log(pc.dim(` ${relative(projectRoot, f)}`));\n }\n } else {\n for (const f of mdxFilesFound.slice(0, 3)) {\n console.log(pc.dim(` ${relative(projectRoot, f)}`));\n }\n console.log(pc.dim(` ... and ${mdxFilesFound.length - 3} more`));\n }\n }\n\n for (const f of otherFiles) {\n console.log(` 📄 ${relative(projectRoot, f)}`);\n }\n\n const totalCount = filesToDelete.length + dirsToDelete.length;\n console.log(pc.dim(`\\n Total: ${totalCount} item(s)\\n`));\n\n // Dry run exits here\n if (dryRun) {\n console.log(pc.yellow('[Dry run - no files were deleted]\\n'));\n return { success: true, deletedFiles: 0, deletedDirs: 0 };\n }\n\n // Confirm unless --yes\n let proceed = yes;\n if (!proceed) {\n const { confirm } = await import('@inquirer/prompts');\n try {\n proceed = await confirm({\n message: `Delete ${totalCount} item(s)?`,\n default: false,\n });\n } catch {\n // User cancelled (Ctrl+C)\n proceed = false;\n }\n }\n\n if (!proceed) {\n console.log(pc.dim('\\nNo changes made.\\n'));\n return { success: true, deletedFiles: 0, deletedDirs: 0 };\n }\n\n // Delete directories first\n console.log();\n let deletedDirs = 0;\n for (const dir of dirsToDelete) {\n try {\n const relativePath = relative(projectRoot, dir);\n await rm(dir, { recursive: true, force: true });\n console.log(` ${pc.green('✓')} Deleted ${relativePath}/`);\n deletedDirs++;\n } catch {\n console.log(` ${pc.red('✗')} Failed: ${relative(projectRoot, dir)}`);\n }\n }\n\n // Delete files\n let deletedCount = 0;\n let failedCount = 0;\n for (const file of filesToDelete) {\n try {\n await unlink(file);\n deletedCount++;\n } catch {\n failedCount++;\n }\n }\n\n if (deletedCount > 0) {\n console.log(` ${pc.green('✓')} Deleted ${deletedCount} file(s)`);\n }\n if (failedCount > 0) {\n console.log(` ${pc.red('✗')} Failed to delete ${failedCount} file(s)`);\n }\n\n console.log(pc.green(`\\n✓ Reset complete\\n`));\n console.log(pc.dim(`Config file retained: ${BRAND.configFile}`));\n console.log(pc.dim(`Run ${pc.cyan(`${BRAND.cliCommand} init`)} to start fresh\\n`));\n\n return {\n success: true,\n deletedFiles: deletedCount,\n deletedDirs,\n };\n}\n","/**\n * fragments dev - Start the development server with live component rendering\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { runSetup } from '../setup.js';\n\n/**\n * Options for dev command\n */\nexport interface DevOptions {\n /** Port to run on */\n port?: number | string;\n /** Do not open browser */\n open?: boolean;\n /** Skip auto-setup (Storybook import, build, Figma link) */\n skipSetup?: boolean;\n /** Skip auto-importing from Storybook */\n skipStorybook?: boolean;\n /** Skip Figma link check */\n skipFigma?: boolean;\n /** Skip auto-building fragments.json */\n skipBuild?: boolean;\n}\n\n/**\n * Result of dev command\n */\nexport interface DevResult {\n success: boolean;\n port?: number;\n}\n\n/**\n * Run the dev command\n */\nexport async function dev(options: DevOptions = {}): Promise<DevResult> {\n const {\n port = 6006,\n open = true,\n skipSetup = false,\n skipStorybook = false,\n skipFigma = false,\n skipBuild = false,\n } = options;\n\n console.log(pc.cyan(`\\n${BRAND.name} Dev Server\\n`));\n\n // Run auto-setup unless skipped\n if (!skipSetup) {\n const setupResult = await runSetup({\n skipStorybook,\n skipFigma,\n skipBuild,\n });\n\n // Show errors if any\n if (setupResult.errors.length > 0) {\n console.log(pc.yellow('\\n Setup completed with warnings:'));\n for (const error of setupResult.errors) {\n console.log(pc.dim(` ${error}`));\n }\n }\n }\n\n // Import viewer directly (it's a dependency of CLI)\n const { createDevServer } = await import('../viewer/index.js');\n\n console.log(pc.dim('\\nStarting dev server...'));\n\n const parsedPort = typeof port === 'string' ? parseInt(port, 10) : port;\n\n try {\n const server = await createDevServer({\n port: parsedPort,\n open,\n projectRoot: process.cwd(),\n });\n\n const address = server.httpServer?.address();\n const actualPort =\n typeof address === 'object' && address ? address.port : parsedPort;\n\n console.log(pc.green(`\\n Viewer running at http://localhost:${actualPort}/fragments/\\n`));\n console.log(pc.dim('Press Ctrl+C to stop\\n'));\n\n return {\n success: true,\n port: typeof actualPort === 'number' ? actualPort : parseInt(String(actualPort), 10),\n };\n } catch (error) {\n const errMsg = error instanceof Error ? error.message : String(error);\n\n if (errMsg.includes('EADDRINUSE') || errMsg.includes('address already in use')) {\n console.error(pc.red(`\\n Port ${parsedPort} is already in use.`));\n console.error(pc.dim(` Try a different port: ${BRAND.cliCommand} dev --port ${parsedPort + 1}\\n`));\n } else if (errMsg.includes('EACCES')) {\n console.error(pc.red(`\\n Permission denied for port ${parsedPort}.`));\n console.error(pc.dim(` Try a port above 1024: ${BRAND.cliCommand} dev --port 6006\\n`));\n } else {\n console.error(pc.red(`\\n Failed to start dev server: ${errMsg}\\n`));\n }\n\n return { success: false };\n }\n}\n","import pc from 'picocolors';\nimport { BRAND } from './core/index.js';\nimport { loadConfig, discoverSegmentFiles } from './core/node.js';\nimport { buildSegments } from './build.js';\nimport {\n detectStorybookConfig,\n discoverStoryFiles as discoverStorybookFiles,\n parseStoryFile,\n convertToSegment,\n} from './migrate/index.js';\n\nexport interface SetupOptions {\n skipStorybook?: boolean;\n skipFigma?: boolean;\n skipBuild?: boolean;\n silent?: boolean;\n configPath?: string;\n}\n\nexport interface SetupResult {\n segmentFilesCreated: number;\n segmentsBuilt: number;\n figmaLinked: number;\n errors: string[];\n}\n\ninterface SegmentInfo {\n name: string;\n filePath: string;\n hasFigma: boolean;\n}\n\n/**\n * Check if segments.json exists and is newer than all segment files.\n */\nasync function isSegmentsJsonStale(configDir: string, outFile: string): Promise<{ stale: boolean; missing: boolean }> {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n const fg = await import('fast-glob');\n\n const segmentsJsonPath = path.join(configDir, outFile);\n\n try {\n const segmentsJsonStat = await fs.stat(segmentsJsonPath);\n\n // Find all segment files\n const segmentFiles = await fg.default(`**/*${BRAND.fileExtension}`, {\n cwd: configDir,\n ignore: ['**/node_modules/**'],\n absolute: true,\n });\n\n // Check if any segment file is newer than segments.json\n for (const file of segmentFiles) {\n const stat = await fs.stat(file);\n if (stat.mtimeMs > segmentsJsonStat.mtimeMs) {\n return { stale: true, missing: false };\n }\n }\n\n return { stale: false, missing: false };\n } catch {\n // segments.json doesn't exist\n return { stale: false, missing: true };\n }\n}\n\n/**\n * Load segment files and check which ones have Figma links.\n */\nasync function loadSegmentInfo(segmentFiles: Array<{ absolutePath: string; relativePath: string }>): Promise<SegmentInfo[]> {\n const fs = await import('node:fs/promises');\n const segments: SegmentInfo[] = [];\n\n for (const file of segmentFiles) {\n try {\n const content = await fs.readFile(file.absolutePath, 'utf-8');\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n const hasFigma = /meta:\\s*\\{[^}]*figma:\\s*['\"]https?:/.test(content);\n\n if (nameMatch) {\n segments.push({\n name: nameMatch[1],\n filePath: file.absolutePath,\n hasFigma,\n });\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n return segments;\n}\n\n/**\n * Run auto-setup for segments dev server.\n *\n * This function:\n * 1. Checks for segment files, imports from Storybook if none found\n * 2. Builds segments.json if missing or stale\n * 3. Links Figma if configured but no segments are linked\n */\nexport async function runSetup(options: SetupOptions = {}): Promise<SetupResult> {\n const fs = await import('node:fs/promises');\n const path = await import('node:path');\n\n const result: SetupResult = {\n segmentFilesCreated: 0,\n segmentsBuilt: 0,\n figmaLinked: 0,\n errors: [],\n };\n\n const log = (msg: string) => {\n if (!options.silent) console.log(msg);\n };\n\n try {\n // Load config\n const { config, configDir } = await loadConfig(options.configPath);\n\n // Step 1: Check for segment files\n log(pc.dim('Checking for fragment files...'));\n let segmentFiles = await discoverSegmentFiles(config, configDir);\n\n if (segmentFiles.length === 0 && !options.skipStorybook) {\n // No fragment files - check for Storybook\n log(pc.yellow('\\n No fragment files found'));\n\n const sbConfig = await detectStorybookConfig(configDir);\n if (sbConfig) {\n log(pc.dim(` Found Storybook at ${sbConfig.configPath}`));\n log(pc.dim(' Converting stories to fragments...\\n'));\n\n // Discover and convert stories\n const storyFiles = await discoverStorybookFiles(configDir, sbConfig.storyPatterns);\n\n if (storyFiles.length > 0) {\n let converted = 0;\n for (const storyFile of storyFiles) {\n try {\n const parsed = await parseStoryFile(storyFile);\n const segmentResult = convertToSegment(parsed);\n\n // Create directory and write file\n await fs.mkdir(path.dirname(segmentResult.outputFile), { recursive: true });\n await fs.writeFile(segmentResult.outputFile, segmentResult.code);\n converted++;\n } catch {\n // Skip files that can't be converted\n }\n }\n\n result.segmentFilesCreated = converted;\n log(pc.green(` Generated ${converted} fragment file(s)`));\n\n // Refresh segment files list\n segmentFiles = await discoverSegmentFiles(config, configDir);\n }\n } else {\n log(pc.dim(' No Storybook config found'));\n log(pc.dim(` Run ${pc.cyan(`${BRAND.cliCommand} add <ComponentName>`)} to create your first fragment`));\n }\n } else if (segmentFiles.length > 0) {\n log(pc.green(` Found ${segmentFiles.length} fragment file(s)`));\n }\n\n // Step 2: Build fragments.json if needed\n if (segmentFiles.length > 0 && !options.skipBuild) {\n const outFile = config.outFile || BRAND.outFile;\n const { stale, missing } = await isSegmentsJsonStale(configDir, outFile);\n\n if (missing || stale) {\n const reason = missing ? 'Building' : 'Rebuilding';\n log(pc.dim(`\\n${reason} ${BRAND.outFile}...`));\n\n try {\n const buildResult = await buildSegments(config, configDir);\n result.segmentsBuilt = buildResult.segmentCount;\n\n if (buildResult.errors.length > 0) {\n for (const err of buildResult.errors) {\n result.errors.push(`${err.file}: ${err.error}`);\n }\n }\n\n log(pc.green(` Built ${buildResult.segmentCount} fragment(s)`));\n } catch (error) {\n result.errors.push(`Build failed: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n } else {\n log(pc.dim(`\\n ${BRAND.outFile} is up to date`));\n }\n }\n\n // Step 3: Link Figma if configured\n if (!options.skipFigma && config.figmaFile && process.env.FIGMA_ACCESS_TOKEN) {\n const segments = await loadSegmentInfo(segmentFiles);\n const linkedCount = segments.filter((s) => s.hasFigma).length;\n\n if (linkedCount === 0 && segments.length > 0) {\n log(pc.dim('\\n Figma configured but no fragments linked'));\n log(pc.dim(` Run ${pc.cyan(`${BRAND.cliCommand} link figma --auto`)} to auto-link components`));\n // Note: We don't auto-link here because it requires API calls and user may want control\n // But we inform them about the option\n } else if (linkedCount > 0) {\n log(pc.dim(`\\n ${linkedCount}/${segments.length} fragment(s) linked to Figma`));\n }\n } else if (!options.skipFigma && config.figmaFile && !process.env.FIGMA_ACCESS_TOKEN) {\n log(pc.dim('\\n Figma file configured but FIGMA_ACCESS_TOKEN not set'));\n }\n\n } catch (error) {\n result.errors.push(error instanceof Error ? error.message : 'Unknown error');\n }\n\n return result;\n}\n\n/**\n * Print setup summary with user-friendly output.\n */\nexport function printSetupSummary(result: SetupResult): void {\n console.log();\n\n if (result.segmentFilesCreated > 0) {\n console.log(pc.green(` Imported ${result.segmentFilesCreated} segments from Storybook`));\n }\n\n if (result.segmentsBuilt > 0) {\n console.log(pc.green(` Built ${result.segmentsBuilt} segments`));\n }\n\n if (result.errors.length > 0) {\n console.log(pc.yellow('\\n Warnings:'));\n for (const error of result.errors) {\n console.log(pc.dim(` ${error}`));\n }\n }\n}\n","/**\n * Migration Engine\n *\n * Orchestrates the full migration pipeline:\n * 1. Discover Storybook files\n * 2. Parse CSF format\n * 3. Convert to Segments\n * 4. Write output files\n * 5. Generate report\n */\n\nimport { readdir, writeFile, mkdir, access, stat } from \"node:fs/promises\";\nimport { join, dirname, relative } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type {\n MigrateOptions,\n MigrationReport,\n ConversionResult,\n} from \"./types.js\";\nimport { parseStoryFile } from \"./parser.js\";\nimport { convertToSegment } from \"./converter.js\";\nimport { generateMigrationReport } from \"./report.js\";\n\n/**\n * Run the migration process.\n */\nexport async function migrate(options: MigrateOptions): Promise<MigrationReport> {\n const startTime = Date.now();\n\n // Discover story files\n const storyFiles = await discoverStoryFiles(options.from);\n\n const results: ConversionResult[] = [];\n const categories = new Set<string>();\n let totalTodos = 0;\n let totalVariants = 0;\n\n // Process each story file\n for (const storyFile of storyFiles) {\n try {\n // Parse\n const parsed = await parseStoryFile(storyFile);\n\n // Convert\n const result = convertToSegment(parsed);\n\n // Determine output path\n const outputDir = options.to ?? dirname(storyFile);\n const outputFile = join(outputDir, relative(dirname(storyFile), result.outputFile));\n result.outputFile = outputFile;\n\n // Check if file exists\n if (!options.overwrite) {\n try {\n await access(outputFile);\n result.warnings.push(`Output file already exists: ${outputFile}`);\n if (!options.dryRun) {\n result.success = false;\n results.push(result);\n continue;\n }\n } catch {\n // File doesn't exist, proceed\n }\n }\n\n // Write file (unless dry run)\n if (!options.dryRun) {\n await mkdir(dirname(outputFile), { recursive: true });\n await writeFile(outputFile, result.code);\n }\n\n // Track stats\n categories.add(result.category);\n totalTodos += result.todos.length;\n totalVariants += result.variantCount;\n\n results.push(result);\n } catch (error) {\n results.push({\n sourceFile: storyFile,\n outputFile: \"\",\n code: \"\",\n componentName: \"\",\n category: \"\",\n variantCount: 0,\n propCount: 0,\n confidence: 0,\n todos: [],\n warnings: [error instanceof Error ? error.message : String(error)],\n success: false,\n });\n }\n }\n\n // Calculate stats\n const successfulConversions = results.filter((r) => r.success).length;\n const failedConversions = results.filter((r) => !r.success).length;\n\n // Build report\n const report: MigrationReport = {\n timestamp: new Date(),\n sourceDir: options.from,\n outputDir: options.to ?? options.from,\n totalStoryFiles: storyFiles.length,\n successfulConversions,\n failedConversions,\n totalVariants,\n totalTodos,\n results,\n categories: Array.from(categories).sort(),\n };\n\n // Generate HTML report if requested\n if (options.report) {\n const reportHtml = generateMigrationReport(report);\n const reportPath = options.reportPath ?? join(options.from, \"migration-report.html\");\n await mkdir(dirname(reportPath), { recursive: true });\n await writeFile(reportPath, reportHtml);\n }\n\n return report;\n}\n\n/**\n * Discover Storybook story files in a directory.\n */\nasync function discoverStoryFiles(fromPath: string): Promise<string[]> {\n // Support both file and directory paths\n const stats = await stat(fromPath);\n\n if (stats.isFile()) {\n // Single file\n if (isStoryFile(fromPath)) {\n return [fromPath];\n }\n return [];\n }\n\n // Directory - find all story files\n const patterns = [\n \"**/*.stories.tsx\",\n \"**/*.stories.ts\",\n \"**/*.stories.jsx\",\n \"**/*.stories.js\",\n ];\n\n const files = await fg(patterns, {\n cwd: fromPath,\n ignore: [\"**/node_modules/**\", \"**/.storybook/**\"],\n absolute: false,\n });\n\n // Return absolute paths, sorted\n return files.map((f) => join(fromPath, f)).sort();\n}\n\n/**\n * Check if a file is a Storybook story file.\n */\nfunction isStoryFile(filePath: string): boolean {\n return /\\.stories\\.(tsx?|jsx?)$/.test(filePath);\n}\n","/**\n * Storybook CSF Parser\n *\n * Parses Storybook Component Story Format (CSF) files and extracts\n * structured data that can be converted to Segments.\n *\n * Supports CSF 2.0 and 3.0 formats.\n */\n\nimport { readFile } from \"node:fs/promises\";\nimport type {\n ParsedStoryFile,\n ParsedMeta,\n ParsedArgType,\n ParsedStory,\n} from \"./types.js\";\n\n/**\n * Parse a Storybook story file into structured data.\n */\nexport async function parseStoryFile(filePath: string): Promise<ParsedStoryFile> {\n const content = await readFile(filePath, \"utf-8\");\n return parseStoryContent(content, filePath);\n}\n\n/**\n * Parse story content directly (useful for testing).\n */\nexport function parseStoryContent(content: string, filePath: string): ParsedStoryFile {\n const warnings: string[] = [];\n\n // Parse meta/default export\n const meta = parseMeta(content, filePath, warnings);\n\n // Parse argTypes\n const argTypes = parseArgTypes(content, warnings);\n\n // Extract top-level const declarations for spread resolution\n const constDeclarations = extractConstDeclarations(content);\n\n // Parse individual stories (pass const declarations for spread resolution)\n const stories = parseStories(content, meta.componentName, warnings, constDeclarations);\n\n // Calculate confidence score based on extraction quality\n const confidence = calculateConfidence(meta, argTypes, stories, warnings);\n\n return {\n filePath,\n meta,\n argTypes,\n stories,\n warnings,\n confidence,\n };\n}\n\n/**\n * Calculate confidence score based on parsing quality.\n * Higher score = more reliable extraction.\n */\nfunction calculateConfidence(\n meta: ParsedMeta,\n argTypes: Record<string, ParsedArgType>,\n stories: ParsedStory[],\n warnings: string[]\n): number {\n let score = 1.0;\n\n // Penalize for warnings\n score -= warnings.length * 0.1;\n\n // Penalize if component name is unknown\n if (meta.componentName === \"Unknown\") {\n score -= 0.3;\n }\n\n // Penalize if no component import found\n if (!meta.componentImport) {\n score -= 0.1;\n }\n\n // Penalize if no argTypes found (less prop info)\n if (Object.keys(argTypes).length === 0) {\n score -= 0.1;\n }\n\n // Penalize if no stories found\n if (stories.length === 0) {\n score -= 0.3;\n }\n\n // Penalize for stories with custom renders (can't auto-migrate)\n const customRenderCount = stories.filter((s) => s.hasCustomRender).length;\n if (customRenderCount > 0) {\n score -= (customRenderCount / Math.max(stories.length, 1)) * 0.2;\n }\n\n // Clamp to [0, 1]\n return Math.max(0, Math.min(1, score));\n}\n\n/**\n * Extract top-level const declarations that can be used for spread resolution.\n * Looks for patterns like: const defaultArgs = { ... }\n * Returns a map of variable name -> parsed object value.\n */\nfunction extractConstDeclarations(content: string): Map<string, Record<string, unknown>> {\n const declarations = new Map<string, Record<string, unknown>>();\n\n // Pattern: const variableName = { ... } or const variableName: Type = { ... }\n // We need to find each const declaration and extract its object value\n const constPattern = /const\\s+(\\w+)(?:\\s*:\\s*[^=]+)?\\s*=\\s*\\{/g;\n\n let match;\n while ((match = constPattern.exec(content)) !== null) {\n const varName = match[1];\n\n // Skip common non-args patterns\n if (varName === \"meta\" || varName === \"default\" || varName === \"Template\") {\n continue;\n }\n\n // Find the opening brace position\n const braceStart = match.index + match[0].length - 1;\n\n // Find matching closing brace\n const braceEnd = findMatchingBraceInContent(content, braceStart, \"{\", \"}\");\n if (braceEnd === -1) {\n continue;\n }\n\n // Extract the object content\n const objectContent = content.slice(braceStart + 1, braceEnd);\n\n // Parse it (without spread resolution to avoid infinite loops)\n const parsed = parseArgsSimple(objectContent);\n\n // Only store if we got something useful\n if (Object.keys(parsed).length > 0) {\n declarations.set(varName, parsed);\n }\n }\n\n return declarations;\n}\n\n/**\n * Simple args parser that doesn't do spread resolution.\n * Used for extracting const declarations to avoid infinite recursion.\n */\nfunction parseArgsSimple(content: string): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n const pairs = splitAtTopLevelCommas(content);\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (!trimmed) continue;\n\n // Skip spreads in simple parsing\n if (trimmed.startsWith(\"...\")) {\n continue;\n }\n\n // Handle shorthand property\n if (/^\\w+$/.test(trimmed)) {\n args[trimmed] = `__REF__${trimmed}`;\n continue;\n }\n\n // Pattern: key: value\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n const key = trimmed.slice(0, colonIndex).trim();\n const valueStr = trimmed.slice(colonIndex + 1).trim();\n\n if (/^\\w+$/.test(key)) {\n args[key] = parseArgValue(valueStr);\n }\n }\n }\n\n return args;\n}\n\n/**\n * Parse the default export (meta) from a story file.\n */\nfunction parseMeta(\n content: string,\n filePath: string,\n warnings: string[]\n): ParsedMeta {\n const result: ParsedMeta = {\n title: \"\",\n componentName: \"\",\n };\n\n // Try to extract title\n // Pattern: title: 'Components/Forms/Input' or title: \"Components/Forms/Input\"\n // We need to be careful here - there might be multiple `title:` properties in the file\n // (e.g., in translations objects). Storybook meta titles typically contain `/`.\n const titleRegex = /title:\\s*['\"`]([^'\"`]+)['\"`]/g;\n const titleMatches: string[] = [];\n let match;\n while ((match = titleRegex.exec(content)) !== null) {\n titleMatches.push(match[1]);\n }\n\n // Prefer titles with \"/\" as they're Storybook component paths\n // e.g., \"Components/Forms/Button\" vs \"No recent searches\"\n const componentPathTitle = titleMatches.find((t) => t.includes(\"/\"));\n const selectedTitle = componentPathTitle ?? titleMatches[0];\n\n if (selectedTitle) {\n result.title = selectedTitle;\n // Extract component name from title (last segment)\n const segments = result.title.split(\"/\");\n result.componentName = segments[segments.length - 1];\n }\n\n // Try to extract component reference\n // Pattern: component: Button or component: MyComponent\n const componentMatch = content.match(/component:\\s*(\\w+)/);\n if (componentMatch) {\n // Use component name from component field if title didn't provide one\n if (!result.componentName) {\n result.componentName = componentMatch[1];\n }\n // Try to find the import for this component\n const importMatch = content.match(\n new RegExp(\n `import\\\\s*{[^}]*\\\\b${componentMatch[1]}\\\\b[^}]*}\\\\s*from\\\\s*['\"\\`]([^'\"\\`]+)['\"\\`]`\n )\n );\n if (importMatch) {\n result.componentImport = importMatch[1];\n } else {\n // Try default import\n const defaultImportMatch = content.match(\n new RegExp(\n `import\\\\s+${componentMatch[1]}\\\\s+from\\\\s*['\"\\`]([^'\"\\`]+)['\"\\`]`\n )\n );\n if (defaultImportMatch) {\n result.componentImport = defaultImportMatch[1];\n }\n }\n }\n\n // Extract tags\n // Pattern: tags: ['autodocs', 'stable']\n const tagsMatch = content.match(/tags:\\s*\\[([^\\]]+)\\]/);\n if (tagsMatch) {\n const tagsContent = tagsMatch[1];\n result.tags = tagsContent\n .split(\",\")\n .map((t) => t.trim().replace(/['\"`]/g, \"\"))\n .filter(Boolean);\n }\n\n // Extract description from parameters.docs\n // Pattern: description: { component: '...' }\n const descMatch = content.match(\n /description:\\s*\\{[^}]*component:\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (descMatch) {\n result.description = descMatch[1];\n }\n\n // Fallback: infer component name from file path\n if (!result.componentName) {\n const match = filePath.match(/([^/\\\\]+)\\.stories\\.(tsx?|jsx?|mdx)$/);\n if (match) {\n result.componentName = match[1];\n } else {\n result.componentName = \"Unknown\";\n warnings.push(\"Could not determine component name\");\n }\n }\n\n // Fallback: generate title from component name\n if (!result.title) {\n result.title = `Components/${result.componentName}`;\n warnings.push(`No title found, using default: ${result.title}`);\n }\n\n return result;\n}\n\n/**\n * Parse argTypes from the meta export.\n */\nfunction parseArgTypes(\n content: string,\n warnings: string[]\n): Record<string, ParsedArgType> {\n const result: Record<string, ParsedArgType> = {};\n\n // Find argTypes block - match until we find the closing brace at the right level\n const argTypesStart = content.indexOf(\"argTypes:\");\n if (argTypesStart === -1) {\n return result;\n }\n\n // Find the opening brace\n const braceStart = content.indexOf(\"{\", argTypesStart);\n if (braceStart === -1) {\n return result;\n }\n\n // Find matching closing brace by counting nesting\n let depth = 1;\n let braceEnd = braceStart + 1;\n while (depth > 0 && braceEnd < content.length) {\n if (content[braceEnd] === \"{\") depth++;\n if (content[braceEnd] === \"}\") depth--;\n braceEnd++;\n }\n\n const argTypesContent = content.slice(braceStart + 1, braceEnd - 1);\n\n // Parse individual argType entries by looking for property patterns\n // Match property: { ... } at the top level of argTypes\n let pos = 0;\n while (pos < argTypesContent.length) {\n // Skip whitespace and commas\n while (pos < argTypesContent.length && /[\\s,]/.test(argTypesContent[pos])) {\n pos++;\n }\n\n // Find property name\n const nameMatch = argTypesContent.slice(pos).match(/^(\\w+)\\s*:\\s*\\{/);\n if (!nameMatch) break;\n\n const propName = nameMatch[1];\n pos += nameMatch[0].length - 1; // Position at opening brace\n\n // Find matching closing brace\n let propDepth = 1;\n const propStart = pos + 1;\n pos++;\n while (propDepth > 0 && pos < argTypesContent.length) {\n if (argTypesContent[pos] === \"{\") propDepth++;\n if (argTypesContent[pos] === \"}\") propDepth--;\n pos++;\n }\n\n const propContent = argTypesContent.slice(propStart, pos - 1);\n result[propName] = parseArgTypeContent(propContent, warnings);\n }\n\n return result;\n}\n\n/**\n * Parse the content of a single argType definition.\n */\nfunction parseArgTypeContent(content: string, warnings: string[]): ParsedArgType {\n const result: ParsedArgType = {};\n\n // Extract control type\n // Pattern: control: 'select' or control: { type: 'select' }\n const controlMatch = content.match(/control:\\s*['\"`](\\w+)['\"`]/);\n if (controlMatch) {\n result.control = controlMatch[1];\n } else {\n const controlTypeMatch = content.match(/control:\\s*\\{[^}]*type:\\s*['\"`](\\w+)['\"`]/);\n if (controlTypeMatch) {\n result.control = controlTypeMatch[1];\n }\n }\n\n // Extract options\n // Pattern: options: ['a', 'b', 'c']\n const optionsMatch = content.match(/options:\\s*\\[([^\\]]+)\\]/);\n if (optionsMatch) {\n result.options = optionsMatch[1]\n .split(\",\")\n .map((o) => o.trim().replace(/['\"`]/g, \"\"))\n .filter(Boolean);\n }\n\n // Extract description\n // Pattern: description: '...'\n const descMatch = content.match(/description:\\s*['\"`]([^'\"`]+)['\"`]/);\n if (descMatch) {\n result.description = descMatch[1];\n }\n\n // Extract default value\n // Pattern: defaultValue: { summary: '...' } or defaultValue: '...'\n const defaultMatch = content.match(/defaultValue:\\s*\\{[^}]*summary:\\s*['\"`]([^'\"`]+)['\"`]/);\n if (defaultMatch) {\n result.defaultValue = defaultMatch[1];\n } else {\n const simpleDefaultMatch = content.match(/defaultValue:\\s*['\"`]?([^,\\s'\"`]+)['\"`]?/);\n if (simpleDefaultMatch && simpleDefaultMatch[1] !== \"{\") {\n result.defaultValue = simpleDefaultMatch[1];\n }\n }\n\n return result;\n}\n\n/**\n * Parse individual story exports.\n *\n * Supports both CSF 2.0 and CSF 3.0 formats:\n * - CSF 3.0: export const Story = { args: {...} }\n * - CSF 2.0: export const Story = Template.bind({}) + Story.args = {...}\n */\nfunction parseStories(\n content: string,\n componentName: string,\n warnings: string[],\n constDeclarations: Map<string, Record<string, unknown>>\n): ParsedStory[] {\n const stories: ParsedStory[] = [];\n const storyNames = new Set<string>();\n\n // CSF 3.0: export const StoryName: Story = { ... }\n const csf3Pattern = /export\\s+const\\s+(\\w+)(?::\\s*\\w+)?\\s*=\\s*\\{([^;]*(?:\\{[^}]*\\}[^;]*)*)\\}/g;\n\n let match;\n while ((match = csf3Pattern.exec(content)) !== null) {\n const storyName = match[1];\n const storyContent = match[2];\n\n // Skip if it's the meta export\n if (storyName === \"default\" || storyName === \"meta\") {\n continue;\n }\n\n // Skip if it looks like a type definition\n if (storyContent.includes(\"typeof\")) {\n continue;\n }\n\n const story = parseStoryContent2(storyName, storyContent, componentName, warnings, constDeclarations);\n if (story) {\n stories.push(story);\n storyNames.add(storyName);\n }\n }\n\n // CSF 2.0: export const StoryName = Template.bind({})\n // Followed by StoryName.args = { ... }\n const csf2Pattern = /export\\s+const\\s+(\\w+)\\s*=\\s*(\\w+)\\.bind\\s*\\(\\s*\\{\\s*\\}\\s*\\)/g;\n\n while ((match = csf2Pattern.exec(content)) !== null) {\n const storyName = match[1];\n const templateName = match[2];\n\n // Skip if already found via CSF 3.0 pattern\n if (storyNames.has(storyName)) {\n continue;\n }\n\n // Skip meta-like names\n if (storyName === \"default\" || storyName === \"meta\") {\n continue;\n }\n\n // Look for StoryName.args = { ... } using proper brace matching\n const argsContent = extractArgsContent(content, storyName);\n\n const story: ParsedStory = {\n name: storyName,\n args: argsContent ? parseArgs(argsContent, constDeclarations) : {},\n hasCustomRender: isCustomTemplate(content, templateName),\n };\n\n // Look for StoryName.parameters.docs.description.story\n const descPattern = new RegExp(\n `${storyName}\\\\.parameters\\\\s*=\\\\s*\\\\{[^}]*docs:\\\\s*\\\\{[^}]*description:\\\\s*\\\\{[^}]*story:\\\\s*['\"\\`]([^'\"\\`]+)['\"\\`]`\n );\n const descMatch = content.match(descPattern);\n if (descMatch) {\n story.description = descMatch[1];\n }\n\n stories.push(story);\n storyNames.add(storyName);\n }\n\n return stories;\n}\n\n/**\n * Extract the content inside StoryName.args = { ... } using proper brace matching.\n */\nfunction extractArgsContent(content: string, storyName: string): string | null {\n // Find the position of StoryName.args =\n const argsAssignPattern = new RegExp(`${storyName}\\\\.args\\\\s*=\\\\s*\\\\{`);\n const argsMatch = content.match(argsAssignPattern);\n\n if (!argsMatch || argsMatch.index === undefined) {\n return null;\n }\n\n // Find the opening brace position\n const startPos = argsMatch.index + argsMatch[0].length - 1; // Position of {\n\n // Find the matching closing brace\n const closingIndex = findMatchingBraceInContent(content, startPos, \"{\", \"}\");\n\n if (closingIndex === -1) {\n return null;\n }\n\n // Return the content between the braces\n return content.slice(startPos + 1, closingIndex);\n}\n\n/**\n * Find matching brace in content string, respecting strings and nesting.\n */\nfunction findMatchingBraceInContent(\n content: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): number {\n let depth = 0;\n let inString: string | null = null;\n\n for (let i = startIndex; i < content.length; i++) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n // Handle string boundaries (but not escaped quotes)\n if ((char === '\"' || char === \"'\" || char === \"`\") && prevChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (inString === null) {\n inString = char;\n }\n }\n\n if (inString === null) {\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Check if a template has custom rendering logic beyond simple args spreading.\n *\n * Simple templates look like: (args) => <Component {...args} />\n * Custom templates have hooks, state, or complex logic.\n */\nfunction isCustomTemplate(content: string, templateName: string): boolean {\n // Look for the template definition\n const templatePattern = new RegExp(\n `const\\\\s+${templateName}[^=]*=\\\\s*\\\\([^)]*\\\\)\\\\s*=>\\\\s*([\\\\s\\\\S]*?)(?=\\\\n(?:export|const\\\\s+\\\\w+\\\\s*=)|$)`,\n \"m\"\n );\n const match = content.match(templatePattern);\n\n if (!match) {\n return false;\n }\n\n const templateBody = match[1].trim();\n\n // Simple template patterns:\n // (args) => <Component {...args} />\n // (args) => <Component {...args}>text</Component>\n // (args) => (<Component {...args} />)\n const simplePatterns = [\n /^<\\w+\\s+\\{\\.\\.\\.args\\}\\s*\\/?>/, // <Comp {...args} /> or <Comp {...args}>\n /^\\(\\s*<\\w+\\s+\\{\\.\\.\\.args\\}\\s*\\/?>\\s*\\)/, // (<Comp {...args} />)\n ];\n\n for (const pattern of simplePatterns) {\n if (pattern.test(templateBody)) {\n return false; // It's a simple template\n }\n }\n\n // Check for hooks or complex patterns that indicate custom logic\n const customIndicators = [\n \"useState\",\n \"useEffect\",\n \"useRef\",\n \"useCallback\",\n \"useMemo\",\n \"useContext\",\n \"return (\", // Multi-line return with logic\n ];\n\n for (const indicator of customIndicators) {\n if (templateBody.includes(indicator)) {\n return true;\n }\n }\n\n // Check for variable declarations inside template (indicates logic)\n // But exclude the template itself\n const bodyWithoutFirstLine = templateBody.split(\"\\n\").slice(1).join(\"\\n\");\n if (/const\\s+\\w+\\s*=/.test(bodyWithoutFirstLine)) {\n return true;\n }\n\n // If the template body is a single JSX element with {...args}, it's simple\n // Otherwise assume it might have complexity we can't detect\n if (templateBody.includes(\"{...args}\") && !templateBody.includes(\"return\")) {\n return false;\n }\n\n // Default: if we're not sure, treat as simple to get the args\n return false;\n}\n\n/**\n * Parse a single story's content.\n */\nfunction parseStoryContent2(\n name: string,\n content: string,\n componentName: string,\n warnings: string[],\n constDeclarations: Map<string, Record<string, unknown>>\n): ParsedStory | null {\n const result: ParsedStory = {\n name,\n args: {},\n };\n\n // Extract args\n // Pattern: args: { ... }\n const argsMatch = content.match(/args:\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/);\n if (argsMatch) {\n result.args = parseArgs(argsMatch[1], constDeclarations);\n }\n\n // Check for custom render function\n // Note: We only mark hasCustomRender=true, we don't try to extract the render code.\n // Regex-based extraction fails on complex JSX with nested braces.\n // Stories with custom renders should be migrated manually or loaded directly via viewer.\n if (content.includes(\"render:\") || content.includes(\"render(\")) {\n result.hasCustomRender = true;\n }\n\n // Extract story description if present\n const descMatch = content.match(/parameters:\\s*\\{[^}]*docs:\\s*\\{[^}]*description:\\s*\\{[^}]*story:\\s*['\"`]([^'\"`]+)['\"`]/);\n if (descMatch) {\n result.description = descMatch[1];\n }\n\n return result;\n}\n\n/**\n * Parse args object content into a Record.\n *\n * Handles nested objects, arrays, and various value types.\n * Uses brace/bracket matching to correctly split at top-level commas.\n *\n * @param content - The string content inside the args object\n * @param constDeclarations - Optional map of const variable names to their parsed values,\n * used to resolve spread syntax like ...defaultArgs\n */\nfunction parseArgs(\n content: string,\n constDeclarations?: Map<string, Record<string, unknown>>\n): Record<string, unknown> {\n const args: Record<string, unknown> = {};\n\n // Split into key-value pairs at top-level commas only\n const pairs = splitAtTopLevelCommas(content);\n\n for (const pair of pairs) {\n const trimmed = pair.trim();\n if (!trimmed) continue;\n\n // Handle spread syntax: ...variable or ...variable.property\n if (trimmed.startsWith(\"...\")) {\n const spreadValue = trimmed.slice(3).trim();\n\n // Try to resolve the spread from const declarations\n if (constDeclarations && /^\\w+$/.test(spreadValue)) {\n const resolved = constDeclarations.get(spreadValue);\n if (resolved) {\n // Inline all properties from the resolved object\n for (const [key, value] of Object.entries(resolved)) {\n // Don't overwrite existing properties (spread comes first, explicit props override)\n if (!(key in args)) {\n args[key] = value;\n }\n }\n continue;\n }\n }\n\n // Couldn't resolve - mark as unresolvable reference\n args[\"__SPREAD__\"] = `__REF__${spreadValue}`;\n continue;\n }\n\n // Handle shorthand property: just `varName` instead of `varName: varName`\n if (/^\\w+$/.test(trimmed)) {\n // Variable reference shorthand - mark as unresolved reference\n args[trimmed] = `__REF__${trimmed}`;\n continue;\n }\n\n // Pattern: key: value\n const colonIndex = trimmed.indexOf(\":\");\n if (colonIndex > 0) {\n const key = trimmed.slice(0, colonIndex).trim();\n const valueStr = trimmed.slice(colonIndex + 1).trim();\n\n // Only parse if key is a valid identifier\n if (/^\\w+$/.test(key)) {\n args[key] = parseArgValue(valueStr, constDeclarations);\n }\n }\n }\n\n return args;\n}\n\n/**\n * Split a string at top-level commas, respecting nested braces/brackets/parens.\n */\nfunction splitAtTopLevelCommas(content: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let depth = 0;\n let inString: string | null = null;\n\n for (let i = 0; i < content.length; i++) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n // Handle string boundaries\n if ((char === '\"' || char === \"'\" || char === \"`\") && prevChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (inString === null) {\n inString = char;\n }\n }\n\n // Track nesting depth (only when not in a string)\n if (inString === null) {\n if (char === \"{\" || char === \"[\" || char === \"(\") {\n depth++;\n } else if (char === \"}\" || char === \"]\" || char === \")\") {\n depth--;\n } else if (char === \",\" && depth === 0) {\n parts.push(current);\n current = \"\";\n continue;\n }\n }\n\n current += char;\n }\n\n if (current.trim()) {\n parts.push(current);\n }\n\n return parts;\n}\n\n/**\n * Resolve JavaScript escape sequences in a string.\n * Converts \\n, \\t, \\\\, \\\", \\', etc. to their actual characters.\n */\nfunction resolveEscapeSequences(str: string): string {\n let result = \"\";\n let i = 0;\n\n while (i < str.length) {\n if (str[i] === \"\\\\\" && i + 1 < str.length) {\n const next = str[i + 1];\n switch (next) {\n case \"n\": result += \"\\n\"; i += 2; break;\n case \"t\": result += \"\\t\"; i += 2; break;\n case \"r\": result += \"\\r\"; i += 2; break;\n case \"\\\\\": result += \"\\\\\"; i += 2; break;\n case '\"': result += '\"'; i += 2; break;\n case \"'\": result += \"'\"; i += 2; break;\n case \"`\": result += \"`\"; i += 2; break;\n default:\n // Keep unrecognized escape sequences as-is\n result += str[i];\n i += 1;\n }\n } else {\n result += str[i];\n i += 1;\n }\n }\n\n return result;\n}\n\n/**\n * Try to parse and resolve string concatenation.\n * Returns the joined string if the value is string concatenation, null otherwise.\n *\n * Examples:\n * \"text1\" + \"text2\" -> \"text1text2\"\n * 'text1' + 'text2' -> \"text1text2\"\n */\nfunction tryParseStringConcatenation(value: string): string | null {\n // Quick check: must contain a + operator with quotes on both sides\n if (!value.includes(\"+\")) {\n return null;\n }\n\n // Pattern for string concatenation: strings joined by +\n // Split by + but respect string boundaries\n const parts: string[] = [];\n let current = \"\";\n let inString: string | null = null;\n\n for (let i = 0; i < value.length; i++) {\n const char = value[i];\n const prevChar = i > 0 ? value[i - 1] : \"\";\n\n // Handle string boundaries\n if ((char === '\"' || char === \"'\" || char === \"`\") && prevChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (inString === null) {\n inString = char;\n }\n }\n\n // Split at + when not in a string\n if (char === \"+\" && inString === null) {\n const trimmed = current.trim();\n if (trimmed) {\n parts.push(trimmed);\n }\n current = \"\";\n continue;\n }\n\n current += char;\n }\n\n // Don't forget the last part\n const lastTrimmed = current.trim();\n if (lastTrimmed) {\n parts.push(lastTrimmed);\n }\n\n // Need at least 2 parts for concatenation\n if (parts.length < 2) {\n return null;\n }\n\n // All parts must be string literals\n const stringParts: string[] = [];\n for (const part of parts) {\n // Check if it's a quoted string\n if ((part.startsWith('\"') && part.endsWith('\"')) ||\n (part.startsWith(\"'\") && part.endsWith(\"'\"))) {\n // Resolve escape sequences like \\\" \\' \\\\ \\n etc.\n stringParts.push(resolveEscapeSequences(part.slice(1, -1)));\n } else if (part.startsWith(\"`\") && part.endsWith(\"`\")) {\n // Template literal without interpolation\n if (!part.includes(\"${\")) {\n stringParts.push(resolveEscapeSequences(part.slice(1, -1)));\n } else {\n return null; // Has interpolation, can't resolve statically\n }\n } else {\n // Not a string literal, can't resolve statically\n return null;\n }\n }\n\n // Join all string parts\n return stringParts.join(\"\");\n}\n\n/**\n * Parse a single arg value, handling nested structures.\n *\n * @param value - The string value to parse\n * @param constDeclarations - Optional map of const variable names to their parsed values\n */\nfunction parseArgValue(\n value: string,\n constDeclarations?: Map<string, Record<string, unknown>>\n): unknown {\n value = value.trim();\n\n // Remove trailing comma if present\n value = value.replace(/,\\s*$/, \"\");\n\n if (!value) return undefined;\n\n // Handle string concatenation: \"text1\" + \"text2\" + \"text3\"\n // This is common in Storybook for long strings\n const concatenationResult = tryParseStringConcatenation(value);\n if (concatenationResult !== null) {\n return concatenationResult;\n }\n\n // Handle TypeScript \"as const\" assertions - treat as the underlying value\n // \"left\" as const -> \"left\"\n const asConstMatch = value.match(/^(['\"`])(.+?)\\1\\s+as\\s+const$/);\n if (asConstMatch) {\n return resolveEscapeSequences(asConstMatch[2]); // Return just the string content\n }\n\n // String (single or double quoted)\n if ((value.startsWith(\"'\") && value.endsWith(\"'\")) ||\n (value.startsWith('\"') && value.endsWith('\"'))) {\n return resolveEscapeSequences(value.slice(1, -1));\n }\n\n // Template literal - just extract the content\n if (value.startsWith(\"`\") && value.endsWith(\"`\")) {\n return resolveEscapeSequences(value.slice(1, -1));\n }\n\n // Boolean\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n\n // Number\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) {\n return parseFloat(value);\n }\n\n // null/undefined\n if (value === \"null\") return null;\n if (value === \"undefined\") return undefined;\n\n // Nested object: { ... } - find matching braces\n if (value.startsWith(\"{\")) {\n const closingIndex = findMatchingBrace(value, 0, \"{\", \"}\");\n if (closingIndex !== -1) {\n const inner = value.slice(1, closingIndex).trim();\n if (inner) {\n return parseArgs(inner, constDeclarations);\n }\n return {};\n }\n }\n\n // Array: [ ... ] - find matching brackets\n if (value.startsWith(\"[\")) {\n const closingIndex = findMatchingBrace(value, 0, \"[\", \"]\");\n if (closingIndex !== -1) {\n const inner = value.slice(1, closingIndex).trim();\n if (!inner) return [];\n\n const items = splitAtTopLevelCommas(inner);\n return items.map((item) => parseArgValue(item.trim(), constDeclarations)).filter((v) => v !== undefined);\n }\n }\n\n // JSX element: <Component ... /> or <Component>...</Component>\n if (value.startsWith(\"<\")) {\n const trimmed = value.trimEnd();\n if (trimmed.endsWith(\"/>\") || trimmed.endsWith(\">\")) {\n return `__JSX__`;\n }\n }\n\n // Function call or complex expression\n if (value.includes(\"(\") || value.includes(\"=>\")) {\n return `__EXPR__`;\n }\n\n // TypeScript `as` type assertions (not `as const` which we handled above)\n // e.g., `someVar as SomeType` or `obj as Type<T>[\"prop\"]`\n // These are expressions we can't safely convert to static JSX\n if (/\\s+as\\s+[A-Z]/.test(value)) {\n return `__EXPR__`;\n }\n\n // Variable reference (identifier) - try to resolve from constDeclarations\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value)) {\n // Check if we can resolve this variable from const declarations\n if (constDeclarations) {\n const resolved = constDeclarations.get(value);\n if (resolved !== undefined) {\n return resolved;\n }\n }\n return `__REF__${value}`;\n }\n\n // Property access like obj.prop or obj?.prop - try to resolve from constDeclarations\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*(\\??\\.[a-zA-Z_$][a-zA-Z0-9_$]*)+$/.test(value)) {\n // Try to resolve the base variable and access the property\n if (constDeclarations) {\n const parts = value.replace(/\\?/g, '').split('.');\n const baseVar = parts[0];\n const resolved = constDeclarations.get(baseVar);\n if (resolved !== undefined) {\n // Navigate through the property path\n let current: unknown = resolved;\n for (let i = 1; i < parts.length && current !== undefined; i++) {\n if (typeof current === 'object' && current !== null) {\n current = (current as Record<string, unknown>)[parts[i]];\n } else {\n current = undefined;\n }\n }\n if (current !== undefined) {\n return current;\n }\n }\n }\n return `__REF__${value}`;\n }\n\n // Array index access with optional property chain and non-null assertions\n // Examples: arr[0], arr[0]!, obj.arr[0], mockOptions[0]!.label\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*(\\??\\.[a-zA-Z_$][a-zA-Z0-9_$]*)*\\[\\d+\\]!?(\\??\\.[a-zA-Z_$][a-zA-Z0-9_$]*)*$/.test(value)) {\n return `__REF__${value}`;\n }\n\n // TypeScript non-null assertion on variable: variable!\n if (/^[a-zA-Z_$][a-zA-Z0-9_$]*!$/.test(value)) {\n return `__REF__${value}`;\n }\n\n // Return as-is for other values\n return value;\n}\n\n/**\n * Find the index of the matching closing brace/bracket.\n * Returns the index of the closing char, or -1 if not found.\n */\nfunction findMatchingBrace(\n content: string,\n startIndex: number,\n openChar: string,\n closeChar: string\n): number {\n let depth = 0;\n let inString: string | null = null;\n\n for (let i = startIndex; i < content.length; i++) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n // Handle string boundaries\n if ((char === '\"' || char === \"'\" || char === \"`\") && prevChar !== \"\\\\\") {\n if (inString === char) {\n inString = null;\n } else if (inString === null) {\n inString = char;\n }\n }\n\n if (inString === null) {\n if (char === openChar) {\n depth++;\n } else if (char === closeChar) {\n depth--;\n if (depth === 0) {\n return i;\n }\n }\n }\n }\n\n return -1;\n}\n\n/**\n * Convert PascalCase to Title Case with spaces.\n */\nexport function storyNameToTitle(name: string): string {\n // Handle common patterns\n // PrimaryButton -> Primary Button\n // DisabledState -> Disabled State\n return name\n .replace(/([A-Z])/g, \" $1\")\n .trim()\n .replace(/\\s+/g, \" \");\n}\n\n/**\n * Extract category from Storybook title path.\n */\nexport function extractCategory(title: string): string {\n const segments = title.split(\"/\");\n\n // If we have at least 2 segments, use the second-to-last as category\n // \"Components/Forms/Input\" -> \"forms\"\n // \"Actions/Button\" -> \"actions\"\n if (segments.length >= 2) {\n const category = segments[segments.length - 2];\n return category.toLowerCase();\n }\n\n // Default to \"components\" if no category in path\n return \"components\";\n}\n\n// Export internal functions for testing\nexport const __testing = {\n parseMeta,\n parseArgTypes,\n parseArgTypeContent,\n parseStories,\n parseStoryContent2,\n parseArgs,\n parseArgsSimple,\n parseArgValue,\n extractConstDeclarations,\n extractArgsContent,\n findMatchingBrace,\n findMatchingBraceInContent,\n splitAtTopLevelCommas,\n resolveEscapeSequences,\n tryParseStringConcatenation,\n isCustomTemplate,\n calculateConfidence,\n};\n","/**\n * Storybook to Segments Converter\n *\n * Transforms parsed Storybook data into Segment definitions.\n */\n\nimport type { ParsedStoryFile, ParsedArgType, ConversionResult } from \"./types.js\";\nimport { storyNameToTitle, extractCategory } from \"./parser.js\";\n\n/**\n * Sanitize a component name to be a valid JavaScript identifier.\n * \"No recent searches\" -> \"NoRecentSearches\"\n * \"My-Component\" -> \"MyComponent\"\n */\nfunction sanitizeComponentName(name: string): string {\n // Convert to PascalCase: remove spaces/hyphens, capitalize each word\n return name\n .split(/[\\s-_]+/)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\")\n .replace(/[^a-zA-Z0-9]/g, \"\"); // Remove any remaining invalid chars\n}\n\n/**\n * Convert a parsed story file into a segment definition.\n */\nexport function convertToSegment(parsed: ParsedStoryFile): ConversionResult {\n const warnings: string[] = [...parsed.warnings];\n const todos: string[] = [];\n\n // Extract category and name from title\n const category = extractCategory(parsed.meta.title);\n const componentName = sanitizeComponentName(parsed.meta.componentName);\n\n // Check if we have a valid component import path\n // If not, the story likely defines the component locally or uses a pattern we can't parse\n if (!parsed.meta.componentImport) {\n warnings.push(`No importable component found - story may define component locally`);\n\n // Determine output file path for the error result\n const outputFile = parsed.filePath\n .replace(/\\.stories\\.(tsx?|jsx?|mdx)$/, \".segment.tsx\");\n\n return {\n sourceFile: parsed.filePath,\n outputFile,\n code: \"\",\n componentName,\n category,\n variantCount: 0,\n propCount: 0,\n confidence: 0,\n todos: [],\n warnings,\n success: false,\n };\n }\n\n // Convert argTypes to props\n const props = convertArgTypesToProps(parsed.argTypes);\n\n // Convert stories to variants\n const variants = convertStoriesToVariants(parsed, componentName);\n\n // Track what's missing (needs human input)\n todos.push(\"Add usage.when - scenarios where this component is appropriate\");\n todos.push(\"Add usage.whenNot - scenarios where alternatives should be used\");\n todos.push(\"Add usage.guidelines - best practices\");\n todos.push(\"Add relations - related components\");\n\n if (Object.keys(props).length > 0) {\n const propsWithoutConstraints = Object.entries(props)\n .filter(([, p]) => !p.constraints?.length)\n .map(([name]) => name);\n\n if (propsWithoutConstraints.length > 0) {\n todos.push(`Add constraints for props: ${propsWithoutConstraints.slice(0, 3).join(\", \")}${propsWithoutConstraints.length > 3 ? \"...\" : \"\"}`);\n }\n }\n\n // Extract skipped variants info\n const skippedVariants = variants\n .filter(v => v.needsManualReview && v.skipReason)\n .map(v => ({ name: v.name, reason: v.skipReason! }));\n\n // Generate the segment code with _generated metadata\n const code = generateSegmentCode({\n componentName,\n componentImport: parsed.meta.componentImport,\n description: parsed.meta.description,\n category,\n tags: parsed.meta.tags,\n props,\n variants,\n todos,\n generated: {\n source: \"storybook\",\n sourceFile: parsed.filePath,\n confidence: parsed.confidence,\n timestamp: new Date().toISOString(),\n skippedVariants: skippedVariants.length > 0 ? skippedVariants : undefined,\n },\n });\n\n // Determine output file path\n const outputFile = parsed.filePath\n .replace(/\\.stories\\.(tsx?|jsx?|mdx)$/, \".segment.tsx\");\n\n return {\n sourceFile: parsed.filePath,\n outputFile,\n code,\n componentName,\n category,\n variantCount: variants.length,\n propCount: Object.keys(props).length,\n confidence: parsed.confidence,\n todos,\n warnings,\n success: true,\n };\n}\n\n/**\n * Convert Storybook argTypes to Segments props.\n */\nfunction convertArgTypesToProps(\n argTypes: Record<string, ParsedArgType>\n): Record<string, PropDef> {\n const props: Record<string, PropDef> = {};\n\n for (const [name, argType] of Object.entries(argTypes)) {\n props[name] = convertArgType(name, argType);\n }\n\n return props;\n}\n\ninterface PropDef {\n type: string;\n description?: string;\n default?: unknown;\n required?: boolean;\n values?: string[];\n constraints?: string[];\n}\n\n/**\n * Convert a single argType to a prop definition.\n */\nfunction convertArgType(name: string, argType: ParsedArgType): PropDef {\n const prop: PropDef = {\n type: inferPropType(argType),\n };\n\n if (argType.description) {\n prop.description = argType.description;\n }\n\n if (argType.defaultValue !== undefined) {\n prop.default = argType.defaultValue;\n }\n\n if (argType.required) {\n prop.required = true;\n }\n\n // Add enum values if present\n if (argType.options && argType.options.length > 0) {\n prop.type = \"enum\";\n prop.values = argType.options;\n }\n\n return prop;\n}\n\n/**\n * Infer prop type from Storybook control type.\n */\nfunction inferPropType(argType: ParsedArgType): string {\n // If explicit type is provided\n if (argType.type) {\n const typeMap: Record<string, string> = {\n string: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n object: \"object\",\n array: \"array\",\n function: \"function\",\n };\n return typeMap[argType.type.toLowerCase()] ?? \"custom\";\n }\n\n // Infer from control type\n if (argType.control) {\n const controlMap: Record<string, string> = {\n text: \"string\",\n number: \"number\",\n boolean: \"boolean\",\n select: \"enum\",\n radio: \"enum\",\n \"inline-radio\": \"enum\",\n check: \"boolean\",\n \"inline-check\": \"boolean\",\n range: \"number\",\n object: \"object\",\n array: \"array\",\n date: \"string\",\n color: \"string\",\n };\n return controlMap[argType.control] ?? \"custom\";\n }\n\n // If has options, it's an enum\n if (argType.options && argType.options.length > 0) {\n return \"enum\";\n }\n\n return \"custom\";\n}\n\ninterface VariantDef {\n name: string;\n description: string;\n renderCode: string;\n needsManualReview: boolean;\n skipReason?: string;\n}\n\n/**\n * Convert stories to variant definitions.\n *\n * Stories with custom render functions or unrenderable args are marked\n * as needing manual review since we can't reliably extract complex JSX.\n * For these, use the viewer's native story support instead of migration.\n */\nfunction convertStoriesToVariants(\n parsed: ParsedStoryFile,\n componentName: string\n): VariantDef[] {\n return parsed.stories.map((story) => {\n // Check if story has custom render or args we can't statically render\n const hasCustomRender = story.hasCustomRender === true;\n const unrenderableReason = getUnrenderableReason(story.args);\n const needsManualReview = hasCustomRender || unrenderableReason !== null;\n\n // Determine skip reason\n let skipReason: string | undefined;\n if (hasCustomRender) {\n skipReason = \"uses custom render function\";\n } else if (unrenderableReason) {\n skipReason = unrenderableReason;\n }\n\n // Generate render code - will include comments for unrenderable values\n const renderCode = hasCustomRender\n ? `<${componentName} />` // Placeholder for custom render\n : generateRenderCode(componentName, story.args);\n\n const description = story.description ??\n `${storyNameToTitle(story.name)} variant`;\n\n return {\n name: storyNameToTitle(story.name),\n description,\n renderCode,\n needsManualReview,\n skipReason,\n };\n });\n}\n\n/**\n * Check if args contain values that can't be statically rendered.\n * Returns the reason string if unrenderable, null if renderable.\n */\nfunction getUnrenderableReason(args: Record<string, unknown>, path: string = \"\"): string | null {\n for (const [key, value] of Object.entries(args)) {\n const currentPath = path ? `${path}.${key}` : key;\n if (typeof value === \"string\") {\n // JSX, expressions, and variable references can't be rendered statically\n if (value === \"__JSX__\") {\n return `JSX element in prop \"${currentPath}\"`;\n }\n if (value === \"__EXPR__\") {\n return `expression in prop \"${currentPath}\"`;\n }\n if (value.startsWith(\"__REF__\")) {\n const ref = value.slice(7);\n return `variable reference \"${ref}\" in prop \"${currentPath}\"`;\n }\n if (value === \"__SPREAD__\" || key === \"__SPREAD__\") {\n return `spread syntax in args`;\n }\n }\n if (typeof value === \"object\" && value !== null) {\n const nestedReason = getUnrenderableReason(value as Record<string, unknown>, currentPath);\n if (nestedReason) {\n return nestedReason;\n }\n }\n }\n return null;\n}\n\n// Backward compatibility wrapper\nfunction hasUnrenderableArgs(args: Record<string, unknown>): boolean {\n return getUnrenderableReason(args) !== null;\n}\n\n/**\n * Generate render code from component name and args.\n */\nfunction generateRenderCode(\n componentName: string,\n args: Record<string, unknown>\n): string {\n const entries = Object.entries(args);\n\n if (entries.length === 0) {\n return `<${componentName} />`;\n }\n\n // Check for children\n const children = args.children;\n const otherArgs = Object.entries(args).filter(([k]) => k !== \"children\");\n\n // Build props string\n const propsString = otherArgs\n .map(([key, value]) => formatPropValue(key, value))\n .filter(Boolean)\n .join(\" \");\n\n if (children !== undefined) {\n const childrenStr = formatChildrenValue(children);\n return propsString\n ? `<${componentName} ${propsString}>${childrenStr}</${componentName}>`\n : `<${componentName}>${childrenStr}</${componentName}>`;\n }\n\n return propsString\n ? `<${componentName} ${propsString} />`\n : `<${componentName} />`;\n}\n\n/**\n * Format children value for JSX.\n */\nfunction formatChildrenValue(value: unknown): string {\n if (typeof value === \"string\") {\n // Handle special markers\n if (value === \"__JSX__\") return \"{null /* JSX children */}\";\n if (value === \"__EXPR__\") return \"{null /* expression */}\";\n if (value.startsWith(\"__REF__\")) return `{${value.slice(7)}}`;\n return value;\n }\n return String(value);\n}\n\n/**\n * Format a prop value for JSX.\n */\nfunction formatPropValue(key: string, value: unknown): string {\n if (value === undefined || value === null) {\n return \"\";\n }\n\n if (typeof value === \"string\") {\n // Handle special markers from parser\n if (value === \"__JSX__\") {\n // Use undefined as placeholder - JSX comments can't be prop values\n return `${key}={undefined /* JSX */}`;\n }\n if (value === \"__EXPR__\") {\n return `${key}={undefined /* expression */}`;\n }\n if (value.startsWith(\"__REF__\")) {\n // Variable reference - output as expression\n return `${key}={${value.slice(7)}}`;\n }\n // For strings with special characters (quotes, backslashes, newlines),\n // use JSX expression syntax {\"\"} instead of attribute syntax \"\"\n // This ensures proper JavaScript string escaping\n if (value.includes('\"') || value.includes(\"\\\\\") || value.includes(\"\\n\")) {\n return `${key}={\"${escapeString(value)}\"}`;\n }\n return `${key}=\"${value}\"`;\n }\n\n if (typeof value === \"boolean\") {\n return value ? key : `${key}={false}`;\n }\n\n if (typeof value === \"number\") {\n return `${key}={${value}}`;\n }\n\n if (Array.isArray(value)) {\n // Format array value\n const formatted = formatArrayValue(value);\n return `${key}={${formatted}}`;\n }\n\n if (typeof value === \"object\" && value !== null) {\n // Format nested object\n const formatted = formatObjectValue(value as Record<string, unknown>);\n return `${key}={${formatted}}`;\n }\n\n // For other complex values, use JSON\n return `${key}={${JSON.stringify(value)}}`;\n}\n\n/**\n * Format a nested object value for JSX.\n */\nfunction formatObjectValue(obj: Record<string, unknown>): string {\n const entries = Object.entries(obj);\n if (entries.length === 0) return \"{}\";\n\n const props = entries\n .map(([k, v]) => {\n const formatted = formatValueForObject(v);\n return `${k}: ${formatted}`;\n })\n .join(\", \");\n\n return `{ ${props} }`;\n}\n\n/**\n * Format an array value for JSX.\n */\nfunction formatArrayValue(arr: unknown[]): string {\n if (arr.length === 0) return \"[]\";\n\n const items = arr.map((item) => formatValueForObject(item));\n return `[${items.join(\", \")}]`;\n}\n\n/**\n * Format a value for use inside an object/array literal.\n */\nfunction formatValueForObject(value: unknown): string {\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n\n if (typeof value === \"string\") {\n // Handle special markers - use valid JS values with comments\n if (value === \"__JSX__\") return \"undefined /* JSX */\";\n if (value === \"__EXPR__\") return \"undefined /* expression */\";\n if (value.startsWith(\"__REF__\")) return value.slice(7);\n return `\"${escapeString(value)}\"`;\n }\n\n if (typeof value === \"boolean\" || typeof value === \"number\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n return formatArrayValue(value);\n }\n\n if (typeof value === \"object\") {\n return formatObjectValue(value as Record<string, unknown>);\n }\n\n return JSON.stringify(value);\n}\n\ninterface SkippedVariant {\n name: string;\n reason: string;\n}\n\ninterface GeneratedMetadata {\n source: \"storybook\" | \"manual\" | \"ai\";\n sourceFile: string;\n confidence: number;\n timestamp: string;\n skippedVariants?: SkippedVariant[];\n}\n\ninterface GenerateOptions {\n componentName: string;\n componentImport: string;\n description?: string;\n category: string;\n tags?: string[];\n props: Record<string, PropDef>;\n variants: VariantDef[];\n todos: string[];\n generated?: GeneratedMetadata;\n}\n\n/**\n * Generate the full segment file code.\n *\n * Note: We use a placeholder component instead of importing the real component.\n * This allows the segment build to work without needing all component dependencies.\n * The viewer will load the actual component at runtime.\n */\nfunction generateSegmentCode(options: GenerateOptions): string {\n const {\n componentName,\n componentImport,\n description,\n category,\n tags,\n props,\n variants,\n todos,\n generated,\n } = options;\n\n // Format props\n const propsCode = formatPropsCode(props);\n\n // Format variants - stories with custom renders get TODO comments\n const variantsCode = formatVariantsCode(componentName, variants);\n\n // Format tags\n const tagsCode = tags && tags.length > 0\n ? `tags: [${tags.map((t) => `\"${t}\"`).join(\", \")}],`\n : \"\";\n\n // Format TODOs as comments\n const todosComments = todos.length > 0\n ? todos.map((t) => ` // TODO: ${t}`).join(\"\\n\") + \"\\n\"\n : \"\";\n\n // Format _generated metadata\n let generatedCode = \"\";\n if (generated) {\n const skippedCode = generated.skippedVariants && generated.skippedVariants.length > 0\n ? `\n skippedVariants: [\n${generated.skippedVariants.map(sv => ` { name: \"${escapeString(sv.name)}\", reason: \"${escapeString(sv.reason)}\" },`).join(\"\\n\")}\n ],`\n : \"\";\n\n generatedCode = `\n _generated: {\n source: \"${generated.source}\",\n sourceFile: \"${escapeString(generated.sourceFile)}\",\n confidence: ${generated.confidence.toFixed(2)},\n timestamp: \"${generated.timestamp}\",${skippedCode}\n },\n`;\n }\n\n // Import the actual component - this makes the segment immediately usable\n return `import { defineSegment } from \"@fragments/core\";\nimport { ${componentName} } from \"${componentImport}\";\n\nexport default defineSegment({\n component: ${componentName},\n\n meta: {\n name: \"${componentName}\",\n description: \"${escapeString(description ?? `${componentName} component`)}\",\n category: \"${category}\",\n ${tagsCode}\n // status: undefined, // TODO: Set to stable/beta/deprecated/experimental\n },\n\n usage: {\n // TODO: Add specific use cases - when should developers use this component?\n when: [\n${todosComments} ],\n // TODO: Add anti-patterns - when should developers NOT use this component?\n whenNot: [],\n },\n\n${propsCode}\n\n relations: [\n // TODO: Add related components\n ],\n\n${variantsCode}\n${generatedCode}});\n`;\n}\n\n/**\n * Format props object for code generation.\n */\nfunction formatPropsCode(props: Record<string, PropDef>): string {\n if (Object.keys(props).length === 0) {\n return \" props: {},\";\n }\n\n const entries = Object.entries(props).map(([name, prop]) => {\n const lines: string[] = [];\n lines.push(` ${name}: {`);\n lines.push(` type: \"${prop.type}\",`);\n\n if (prop.values && prop.values.length > 0) {\n lines.push(` values: [${prop.values.map((v) => `\"${v}\"`).join(\", \")}],`);\n }\n\n if (prop.default !== undefined) {\n const defaultVal = typeof prop.default === \"string\"\n ? `\"${prop.default}\"`\n : String(prop.default);\n lines.push(` default: ${defaultVal},`);\n }\n\n if (prop.required) {\n lines.push(` required: true,`);\n }\n\n if (prop.description) {\n lines.push(` description: \"${escapeString(prop.description)}\",`);\n }\n\n lines.push(` },`);\n return lines.join(\"\\n\");\n });\n\n return ` props: {\\n${entries.join(\"\\n\")}\\n },`;\n}\n\n/**\n * Format variants array for code generation.\n *\n * Variants needing manual review get a placeholder render that won't crash.\n * This makes the segment file a starting point that humans can enhance.\n */\nfunction formatVariantsCode(componentName: string, variants: VariantDef[]): string {\n // Filter out variants that can't be rendered - they would cause runtime errors\n const renderableVariants = variants.filter((v) => !v.needsManualReview);\n\n if (renderableVariants.length === 0) {\n return \" variants: [],\";\n }\n\n const entries = renderableVariants.map((variant) => {\n return ` {\n name: \"${variant.name}\",\n description: \"${escapeString(variant.description)}\",\n render: () => ${variant.renderCode},\n },`;\n });\n\n return ` variants: [\\n${entries.join(\"\\n\")}\\n ],`;\n}\n\n/**\n * Escape special characters in strings for code generation.\n */\nfunction escapeString(str: string): string {\n return str\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/\"/g, '\\\\\"')\n .replace(/\\n/g, \"\\\\n\");\n}\n","/**\n * Storybook Configuration Detection\n *\n * Auto-detects Storybook configuration files and extracts\n * story patterns for migration.\n */\n\nimport { existsSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport { join, dirname } from \"node:path\";\nimport fg from \"fast-glob\";\nimport type { StorybookConfig } from \"./types.js\";\n\n/**\n * Common Storybook config file names in order of preference\n */\nconst CONFIG_FILES = [\n \".storybook/main.ts\",\n \".storybook/main.mts\",\n \".storybook/main.js\",\n \".storybook/main.mjs\",\n \".storybook/main.cjs\",\n];\n\n/**\n * Default story patterns if none found in config\n */\nconst DEFAULT_PATTERNS = [\n \"**/*.stories.@(ts|tsx|js|jsx|mdx)\",\n \"**/*.story.@(ts|tsx|js|jsx|mdx)\",\n];\n\n/**\n * Detect Storybook configuration in a project directory.\n */\nexport async function detectStorybookConfig(\n projectRoot: string\n): Promise<StorybookConfig | null> {\n // Try each config file\n for (const configFile of CONFIG_FILES) {\n const configPath = join(projectRoot, configFile);\n if (existsSync(configPath)) {\n return parseStorybookConfig(configPath);\n }\n }\n\n return null;\n}\n\n/**\n * Parse a Storybook configuration file.\n */\nasync function parseStorybookConfig(\n configPath: string\n): Promise<StorybookConfig> {\n const errors: string[] = [];\n let storyPatterns: string[] = [];\n let framework: string | undefined;\n let builder: string | undefined;\n\n try {\n const content = await readFile(configPath, \"utf-8\");\n\n // Extract stories array/patterns\n // Pattern: stories: ['../src/**/*.stories.@(ts|tsx)']\n const storiesMatch = content.match(\n /stories:\\s*\\[([^\\]]+)\\]/s\n );\n\n if (storiesMatch) {\n // Parse the array content\n const storiesContent = storiesMatch[1];\n const patterns = storiesContent\n .split(\",\")\n .map((p) => p.trim())\n .map((p) => {\n // Remove quotes and template literals\n const cleaned = p.replace(/^['\"`]|['\"`]$/g, \"\").trim();\n return cleaned;\n })\n .filter((p) => p && !p.startsWith(\"//\") && !p.startsWith(\"{\"));\n\n if (patterns.length > 0) {\n storyPatterns = patterns;\n }\n }\n\n // Extract framework\n // Pattern: framework: '@storybook/react-vite' or framework: { name: '...' }\n const frameworkMatch = content.match(\n /framework:\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (frameworkMatch) {\n framework = frameworkMatch[1];\n } else {\n const frameworkNameMatch = content.match(\n /framework:\\s*\\{[^}]*name:\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (frameworkNameMatch) {\n framework = frameworkNameMatch[1];\n }\n }\n\n // Extract builder if specified\n // Pattern: builder: 'vite' or core: { builder: 'vite' }\n const builderMatch = content.match(\n /builder:\\s*['\"`]([^'\"`]+)['\"`]/\n );\n if (builderMatch) {\n builder = builderMatch[1];\n }\n } catch (error) {\n errors.push(\n `Failed to parse config: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n // Use defaults if no patterns found\n if (storyPatterns.length === 0) {\n storyPatterns = DEFAULT_PATTERNS;\n errors.push(\"No story patterns found in config, using defaults\");\n }\n\n return {\n configPath,\n storyPatterns,\n framework,\n builder,\n valid: errors.length === 0 || storyPatterns.length > 0,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n\n/**\n * Discover story files using detected or provided patterns.\n */\nexport async function discoverStoryFiles(\n projectRoot: string,\n patterns?: string[]\n): Promise<string[]> {\n // If no patterns provided, try to detect from config\n if (!patterns || patterns.length === 0) {\n const config = await detectStorybookConfig(projectRoot);\n patterns = config?.storyPatterns ?? DEFAULT_PATTERNS;\n }\n\n // Resolve patterns relative to project root\n const configDir = join(projectRoot, \".storybook\");\n const resolvedPatterns = patterns.map((p) => {\n // If pattern starts with ../, resolve from .storybook dir\n if (p.startsWith(\"../\")) {\n return join(configDir, p);\n }\n // Otherwise resolve from project root\n return join(projectRoot, p);\n });\n\n // Find matching files\n const files = await fg(resolvedPatterns, {\n cwd: projectRoot,\n absolute: true,\n ignore: [\n \"**/node_modules/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/.storybook/**\",\n ],\n });\n\n return files.sort();\n}\n\n/**\n * Get a summary of detected Storybook setup.\n */\nexport async function getStorybookSummary(\n projectRoot: string\n): Promise<{\n detected: boolean;\n config?: StorybookConfig;\n storyCount: number;\n storyFiles: string[];\n}> {\n const config = await detectStorybookConfig(projectRoot);\n const storyFiles = await discoverStoryFiles(\n projectRoot,\n config?.storyPatterns\n );\n\n return {\n detected: config !== null,\n config: config ?? undefined,\n storyCount: storyFiles.length,\n storyFiles,\n };\n}\n","/**\n * fragments compare - Compare component renders against Figma designs\n */\n\nimport pc from 'picocolors';\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { resolve, join } from 'node:path';\nimport { BRAND } from '../core/index.js';\n\n/**\n * Options for compare command\n */\nexport interface CompareOptions {\n /** Path to config file */\n config?: string;\n /** Compare specific variant */\n variant?: string;\n /** Figma frame URL (uses segment figma link if not provided) */\n figma?: string;\n /** Diff threshold percentage */\n threshold?: number;\n /** Compare all components with Figma links */\n all?: boolean;\n /** Save diff images to directory */\n output?: string;\n /** Dev server port */\n port?: number | string;\n}\n\n/**\n * Compare result from server\n */\ninterface CompareResult {\n match?: boolean;\n diffPercentage?: number;\n threshold?: number;\n figmaUrl?: string;\n rendered?: string;\n figma?: string;\n diff?: string;\n changedRegions?: Array<{ x: number; y: number; width: number; height: number }>;\n error?: string;\n suggestion?: string;\n}\n\n/**\n * Result of compare command\n */\nexport interface CompareCommandResult {\n success: boolean;\n passed: number;\n failed: number;\n skipped: number;\n}\n\n/**\n * Run the compare command\n */\nexport async function compare(\n component: string | undefined,\n options: CompareOptions = {}\n): Promise<CompareCommandResult> {\n const {\n variant,\n figma: figmaUrl,\n threshold = 1.0,\n all = false,\n output,\n port = 6006,\n } = options;\n\n // Check for Figma access token\n if (!process.env.FIGMA_ACCESS_TOKEN) {\n console.error(pc.red('\\nFIGMA_ACCESS_TOKEN environment variable required.'));\n console.log(pc.dim('Generate at: https://www.figma.com/developers/api#access-tokens'));\n console.log(pc.dim(' export FIGMA_ACCESS_TOKEN=figd_xxx'));\n process.exit(1);\n }\n\n const baseUrl = `http://localhost:${port}`;\n\n console.log(pc.cyan(`\\n${BRAND.name} Design Verification\\n`));\n\n if (all) {\n // Compare all components with Figma links\n return compareAll(baseUrl, threshold, output);\n }\n\n // Compare single or selected components\n let componentsToCompare: string[] = [];\n\n if (component) {\n componentsToCompare = [component];\n } else {\n // No component specified - show interactive selection\n componentsToCompare = await selectComponents(baseUrl);\n }\n\n if (componentsToCompare.length === 0) {\n console.log(pc.dim('\\nNo components selected.'));\n return { success: true, passed: 0, failed: 0, skipped: 0 };\n }\n\n // Compare selected components\n if (componentsToCompare.length === 1) {\n console.log(pc.dim(`Comparing ${componentsToCompare[0]} to Figma design...\\n`));\n } else {\n console.log(pc.dim(`Comparing ${componentsToCompare.length} components to Figma designs...\\n`));\n }\n\n let passed = 0;\n let failed = 0;\n\n for (const comp of componentsToCompare) {\n const response = await fetch(`${baseUrl}/segments/compare`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: comp,\n variant,\n figmaUrl,\n threshold,\n figmaToken: process.env.FIGMA_ACCESS_TOKEN,\n }),\n });\n\n const result = await response.json() as CompareResult;\n\n if (result.error) {\n failed++;\n console.log(`${pc.red('✗')} ${pc.bold(comp)} - ${result.error}`);\n continue;\n }\n\n if (result.match) {\n passed++;\n console.log(`${pc.green('✓')} ${pc.bold(comp)} ${pc.dim(`${result.diffPercentage}%`)}`);\n } else {\n failed++;\n console.log(`${pc.red('✗')} ${pc.bold(comp)} ${pc.yellow(`${result.diffPercentage}%`)} ${pc.dim(`(threshold: ${threshold}%)`)}`);\n }\n\n // Save images if output dir specified\n if (output && result.rendered && result.figma && result.diff) {\n await saveImages(output, comp, result);\n }\n }\n\n // Summary for multiple components\n if (componentsToCompare.length > 1) {\n console.log();\n console.log(pc.dim('───────────────────────────────────────'));\n console.log(`\\n${pc.green(`${passed} passed`)}, ${pc.red(`${failed} failed`)}\\n`);\n } else {\n console.log();\n }\n\n if (output && componentsToCompare.length > 0) {\n console.log(pc.dim(`Images saved to: ${output}/\\n`));\n }\n\n return {\n success: failed === 0,\n passed,\n failed,\n skipped: 0,\n };\n}\n\n/**\n * Compare all components with Figma links\n */\nasync function compareAll(\n baseUrl: string,\n threshold: number,\n output?: string\n): Promise<CompareCommandResult> {\n console.log(pc.dim('Comparing all components with Figma links...\\n'));\n\n // Fetch the context to get all segments\n const contextResp = await fetch(`${baseUrl}/segments/context?format=json`);\n if (!contextResp.ok) {\n throw new Error('Failed to fetch segments. Make sure dev server is running.');\n }\n\n const contextText = await contextResp.text();\n let segments: Array<{ name: string; figma?: string }> = [];\n try {\n const contextData = JSON.parse(contextText);\n segments = contextData.components || [];\n } catch {\n segments = [];\n }\n\n if (segments.length === 0) {\n console.log(pc.yellow('No components found with Figma links.'));\n console.log(pc.dim('Add figma field to your segment definitions:'));\n console.log(pc.dim(' meta: { figma: \"https://figma.com/file/...\" }'));\n return { success: true, passed: 0, failed: 0, skipped: 0 };\n }\n\n let passed = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const seg of segments) {\n // Skip components without figma links\n if (!seg.figma) {\n skipped++;\n console.log(`${pc.dim('⏭️')} ${pc.dim(seg.name)} ${pc.dim('(no figma link)')}`);\n continue;\n }\n\n try {\n const response = await fetch(`${baseUrl}/segments/compare`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n component: seg.name,\n threshold,\n figmaToken: process.env.FIGMA_ACCESS_TOKEN,\n }),\n });\n\n const result = await response.json() as CompareResult;\n\n if (result.error) {\n failed++;\n console.log(`${pc.red('✗')} ${pc.bold(seg.name)} - ${result.error}`);\n } else if (result.match) {\n passed++;\n console.log(`${pc.green('✓')} ${pc.bold(seg.name)} ${pc.dim(`${result.diffPercentage}%`)}`);\n } else {\n failed++;\n console.log(`${pc.red('✗')} ${pc.bold(seg.name)} ${pc.yellow(`${result.diffPercentage}%`)} ${pc.dim(`(threshold: ${threshold}%)`)}`);\n }\n\n // Save images if output dir specified\n if (output && result.rendered && result.figma && result.diff) {\n await saveImages(output, seg.name, result);\n }\n } catch (error) {\n failed++;\n console.log(`${pc.red('✗')} ${pc.bold(seg.name)} - ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n console.log();\n console.log(pc.dim('───────────────────────────────────────'));\n console.log(`\\n${pc.green(`${passed} passed`)}, ${pc.red(`${failed} failed`)}, ${pc.dim(`${skipped} skipped`)}\\n`);\n\n if (output) {\n console.log(pc.dim(`Images saved to: ${output}/\\n`));\n }\n\n return {\n success: failed === 0,\n passed,\n failed,\n skipped,\n };\n}\n\n/**\n * Show interactive selection for components with Figma links\n */\nasync function selectComponents(baseUrl: string): Promise<string[]> {\n console.log(pc.dim('Fetching components with Figma links...\\n'));\n\n const contextResp = await fetch(`${baseUrl}/segments/context?format=json`);\n if (!contextResp.ok) {\n throw new Error('Failed to fetch segments. Make sure dev server is running.');\n }\n\n const contextText = await contextResp.text();\n let segments: Array<{ name: string; figma?: string }> = [];\n try {\n const contextData = JSON.parse(contextText);\n segments = (contextData.components || []).filter((s: { figma?: string }) => s.figma);\n } catch {\n segments = [];\n }\n\n if (segments.length === 0) {\n console.log(pc.yellow('No components found with Figma links.'));\n console.log(pc.dim('Add figma field to your segment definitions:'));\n console.log(pc.dim(' meta: { figma: \"https://figma.com/file/...\" }'));\n return [];\n }\n\n const { checkbox } = await import('@inquirer/prompts');\n\n try {\n const choices = segments.map((seg) => ({\n name: seg.name,\n value: seg.name,\n checked: true,\n }));\n\n return await checkbox({\n message: 'Select components to compare:',\n choices,\n pageSize: 15,\n });\n } catch {\n // User cancelled (Ctrl+C)\n console.log(pc.dim('\\nNo changes made.'));\n return [];\n }\n}\n\n/**\n * Save comparison images to output directory\n */\nasync function saveImages(\n outputDir: string,\n component: string,\n result: CompareResult\n): Promise<void> {\n const dir = resolve(process.cwd(), outputDir);\n await mkdir(dir, { recursive: true });\n\n const saveImage = async (data: string, filename: string) => {\n const base64 = data.replace('data:image/png;base64,', '');\n await writeFile(join(dir, filename), Buffer.from(base64, 'base64'));\n };\n\n if (result.rendered) {\n await saveImage(result.rendered, `${component}-rendered.png`);\n }\n if (result.figma) {\n await saveImage(result.figma, `${component}-figma.png`);\n }\n if (result.diff) {\n await saveImage(result.diff, `${component}-diff.png`);\n }\n}\n","/**\n * fragments verify - Verify component compliance for CI pipelines\n *\n * Uses the /segments/compliance endpoint to get real token compliance data\n * based on computed styles compared against the design token registry.\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport {\n createDevServerClient,\n DevServerConnectionError,\n type ComplianceResult,\n type ViolationItem,\n type SegmentInfo,\n} from '../shared/index.js';\n\n/**\n * Options for verify command\n */\nexport interface VerifyOptions {\n /** Path to config file */\n config?: string;\n /** CI mode - output JSON and exit non-zero on failure */\n ci?: boolean;\n /** Minimum compliance percentage (default: 80) */\n minCompliance?: number;\n /** Dev server port */\n port?: number | string;\n}\n\n/**\n * Result item from verification\n */\nexport interface VerifyResultItem {\n component: string;\n compliance: number;\n passed: boolean;\n violations: ViolationItem[];\n totalProperties: number;\n hardcoded: number;\n usingTokens: number;\n}\n\n/**\n * Summary of verification results\n */\nexport interface VerifySummary {\n passed: boolean;\n compliance: number;\n threshold: number;\n totalComponents: number;\n passedComponents: number;\n failedComponents: number;\n results: VerifyResultItem[];\n violations: Array<{\n component: string;\n property: string;\n issue: string;\n severity: 'error' | 'warning';\n suggestion?: string;\n }>;\n}\n\n/**\n * Run the verify command\n */\nexport async function verify(\n component: string | undefined,\n options: VerifyOptions = {}\n): Promise<VerifySummary> {\n const { config: configPath, ci = false, port = 6006 } = options;\n\n // Load config to get threshold\n const { config } = await loadConfig(configPath);\n const minCompliance = options.minCompliance ?? config.ci?.minCompliance ?? 80;\n\n const client = createDevServerClient(port);\n const results: VerifyResultItem[] = [];\n let totalCompliance = 0;\n let componentCount = 0;\n\n if (!ci) {\n console.log(pc.cyan(`\\n${BRAND.name} Compliance Verification\\n`));\n console.log(pc.dim(`Minimum compliance: ${minCompliance}%\\n`));\n }\n\n // Check if dev server is reachable\n const isReachable = await client.ping();\n if (!isReachable) {\n throw new DevServerConnectionError(\n `Cannot connect to dev server at http://localhost:${port}`,\n `http://localhost:${port}`\n );\n }\n\n // Fetch all segments\n let segments = await client.getSegments();\n\n // Filter by component if specified\n if (component) {\n segments = segments.filter(\n s => s.name.toLowerCase() === component.toLowerCase()\n );\n\n if (segments.length === 0) {\n const error = { error: `Component \"${component}\" not found` };\n if (ci) {\n console.log(JSON.stringify(error));\n } else {\n console.log(pc.red(error.error));\n }\n process.exit(1);\n }\n }\n\n // Check compliance for each segment\n for (const seg of segments) {\n try {\n // Get real compliance from the server\n const complianceResult = await client.getCompliance({\n component: seg.name,\n });\n\n const passed = complianceResult.compliance >= minCompliance;\n\n results.push({\n component: seg.name,\n compliance: complianceResult.compliance,\n passed,\n violations: complianceResult.violations,\n totalProperties: complianceResult.totalProperties,\n hardcoded: complianceResult.hardcoded,\n usingTokens: complianceResult.usingTokens,\n });\n\n totalCompliance += complianceResult.compliance;\n componentCount++;\n\n if (!ci) {\n const icon = passed ? pc.green('✓') : pc.red('✗');\n const complianceStr = passed\n ? pc.green(`${complianceResult.compliance}%`)\n : pc.red(`${complianceResult.compliance}%`);\n console.log(` ${icon} ${seg.name} ${complianceStr}`);\n\n // Show violations in interactive mode\n if (!passed && complianceResult.violations.length > 0) {\n const violationsToShow = complianceResult.violations.slice(0, 3);\n for (const v of violationsToShow) {\n console.log(pc.dim(` - ${v.property}: ${v.issue}`));\n if (v.suggestion) {\n console.log(pc.dim(` ${pc.cyan('→')} ${v.suggestion}`));\n }\n }\n if (complianceResult.violations.length > 3) {\n console.log(pc.dim(` ... and ${complianceResult.violations.length - 3} more`));\n }\n }\n }\n } catch (error) {\n // Handle individual component errors\n results.push({\n component: seg.name,\n compliance: 0,\n passed: false,\n violations: [{\n property: 'unknown',\n issue: error instanceof Error ? error.message : 'Unknown error',\n severity: 'error',\n }],\n totalProperties: 0,\n hardcoded: 0,\n usingTokens: 0,\n });\n\n if (!ci) {\n console.log(` ${pc.red('✗')} ${seg.name} ${pc.red('error')}`);\n }\n }\n }\n\n const averageCompliance = componentCount > 0 ? totalCompliance / componentCount : 100;\n const allPassed = results.every(r => r.passed);\n\n const summary: VerifySummary = {\n passed: allPassed,\n compliance: Math.round(averageCompliance * 100) / 100,\n threshold: minCompliance,\n totalComponents: componentCount,\n passedComponents: results.filter(r => r.passed).length,\n failedComponents: results.filter(r => !r.passed).length,\n results,\n violations: results.flatMap(r => r.violations.map(v => ({\n component: r.component,\n ...v,\n }))),\n };\n\n if (ci) {\n console.log(JSON.stringify(summary, null, 2));\n } else {\n console.log();\n if (allPassed) {\n console.log(pc.green(`✓ All ${componentCount} component(s) meet ${minCompliance}% compliance threshold`));\n } else {\n const failedCount = results.filter(r => !r.passed).length;\n console.log(pc.red(`✗ ${failedCount} component(s) below ${minCompliance}% compliance threshold`));\n }\n console.log(pc.dim(` Average compliance: ${summary.compliance}%\\n`));\n }\n\n return summary;\n}\n","/**\n * Dev Server Client\n *\n * HTTP client for communicating with the fragments dev server.\n * Provides typed methods for all server endpoints.\n */\n\nimport type {\n ComplianceResult,\n SegmentInfo,\n ContextData,\n ViolationItem,\n A11yResult,\n} from './types.js';\n\nexport interface DevServerClientOptions {\n /** Base URL of the dev server */\n baseUrl: string;\n /** Request timeout in milliseconds */\n timeout?: number;\n}\n\n/**\n * Request body for compliance endpoint\n */\nexport interface ComplianceRequest {\n /** Component name */\n component: string;\n /** Variant name (optional) */\n variant?: string;\n /** Theme to use (default: \"default\") */\n theme?: string;\n}\n\n/**\n * Client for interacting with the fragments dev server\n */\nexport class DevServerClient {\n private baseUrl: string;\n private timeout: number;\n\n constructor(options: DevServerClientOptions) {\n this.baseUrl = options.baseUrl.replace(/\\/$/, ''); // Remove trailing slash\n this.timeout = options.timeout ?? 30000;\n }\n\n /**\n * Check if the dev server is reachable\n */\n async ping(): Promise<boolean> {\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 5000);\n\n const response = await fetch(`${this.baseUrl}/segments/context?format=json`, {\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n return response.ok;\n } catch {\n return false;\n }\n }\n\n /**\n * Get all segments from the context endpoint\n */\n async getSegments(): Promise<SegmentInfo[]> {\n const response = await this.fetch('/segments/context?format=json');\n const data = await response.json() as {\n components: Record<string, { category?: string; description?: string; status?: string; figma?: string }>;\n };\n\n // Transform object to array of SegmentInfo\n const components = data.components || {};\n return Object.entries(components).map(([name, info]) => ({\n name,\n category: info.category || 'components',\n description: info.description,\n status: info.status,\n figma: info.figma,\n }));\n }\n\n /**\n * Get compliance data for a component\n */\n async getCompliance(request: ComplianceRequest): Promise<ComplianceResult> {\n const response = await this.fetch('/segments/compliance', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(request),\n });\n\n const data = await response.json() as ComplianceResult;\n return data;\n }\n\n /**\n * Get accessibility results for a component\n */\n async getA11y(component: string, variant?: string): Promise<A11yResult> {\n const response = await this.fetch('/fragments/a11y', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ component, variant }),\n });\n\n const data = await response.json() as A11yResult;\n return data;\n }\n\n /**\n * Internal fetch wrapper with error handling\n */\n private async fetch(path: string, options?: RequestInit): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n\n try {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), this.timeout);\n\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n\n clearTimeout(timeoutId);\n\n if (!response.ok) {\n const errorBody = await response.text().catch(() => '');\n throw new DevServerError(\n `Server returned ${response.status}: ${response.statusText}`,\n response.status,\n errorBody\n );\n }\n\n return response;\n } catch (error) {\n if (error instanceof DevServerError) {\n throw error;\n }\n\n // Handle connection errors\n const errMsg = error instanceof Error && error.cause\n ? String((error.cause as { code?: string }).code || error.message)\n : error instanceof Error\n ? error.message\n : 'Unknown error';\n\n if (errMsg.includes('ECONNREFUSED') || errMsg.includes('fetch failed')) {\n throw new DevServerConnectionError(\n `Cannot connect to dev server at ${this.baseUrl}`,\n this.baseUrl\n );\n }\n\n throw error;\n }\n }\n}\n\n/**\n * Error thrown when the dev server returns an error response\n */\nexport class DevServerError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly body?: string\n ) {\n super(message);\n this.name = 'DevServerError';\n }\n}\n\n/**\n * Error thrown when we can't connect to the dev server\n */\nexport class DevServerConnectionError extends Error {\n constructor(\n message: string,\n public readonly serverUrl: string\n ) {\n super(message);\n this.name = 'DevServerConnectionError';\n }\n}\n\n/**\n * Create a dev server client with default options\n */\nexport function createDevServerClient(port: number | string = 6006): DevServerClient {\n return new DevServerClient({\n baseUrl: `http://localhost:${port}`,\n });\n}\n","/**\n * Command Wrapper\n *\n * Provides error handling and common patterns for CLI commands.\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { DevServerConnectionError, DevServerError } from './dev-server-client.js';\n\n/**\n * Options for command execution\n */\nexport interface CommandOptions {\n /** CI mode - output JSON and exit non-zero on failure */\n ci?: boolean;\n /** Port for dev server */\n port?: number | string;\n}\n\n/**\n * Format and print a dev server connection error with helpful suggestions\n */\nexport function formatConnectionError(error: DevServerConnectionError, port: number | string): string {\n return (\n `Cannot connect to dev server at ${error.serverUrl}\\n\\n` +\n `The command requires the dev server to be running.\\n` +\n `Start it with: ${pc.cyan(`${BRAND.cliCommand} dev`)}\\n\\n` +\n `Alternatively, run with a different port:\\n` +\n ` ${pc.cyan(`${BRAND.cliCommand} <command> --port ${port}`)}`\n );\n}\n\n/**\n * Handle errors in a command, formatting appropriately for CI vs interactive mode\n */\nexport function handleCommandError(\n error: unknown,\n options: CommandOptions = {}\n): never {\n const { ci = false, port = 6006 } = options;\n\n if (error instanceof DevServerConnectionError) {\n if (ci) {\n console.log(JSON.stringify({ error: `Cannot connect to dev server at ${error.serverUrl}` }));\n } else {\n console.error(pc.red('Error:'), formatConnectionError(error, port));\n }\n } else if (error instanceof DevServerError) {\n if (ci) {\n console.log(JSON.stringify({ error: error.message }));\n } else {\n console.error(pc.red('Error:'), error.message);\n }\n } else {\n const message = error instanceof Error ? error.message : 'Unknown error';\n if (ci) {\n console.log(JSON.stringify({ error: message }));\n } else {\n console.error(pc.red('Error:'), message);\n }\n }\n\n process.exit(1);\n}\n\n/**\n * Wrap a command function with standard error handling\n */\nexport function withErrorHandling<T extends unknown[], R>(\n fn: (...args: T) => Promise<R>,\n options: CommandOptions = {}\n): (...args: T) => Promise<R> {\n return async (...args: T): Promise<R> => {\n try {\n return await fn(...args);\n } catch (error) {\n handleCommandError(error, options);\n }\n };\n}\n","/**\n * fragments audit - Scan all fragments and show compliance metrics\n *\n * Uses the /fragments/compliance endpoint to get real token compliance data\n * for all components in the design system.\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport {\n createDevServerClient,\n DevServerConnectionError,\n type AuditResult,\n} from '../shared/index.js';\n\n/**\n * Options for audit command\n */\nexport interface AuditOptions {\n /** Path to config file */\n config?: string;\n /** Output JSON format */\n json?: boolean;\n /** Sort field: compliance, name, hardcoded */\n sort?: 'compliance' | 'name' | 'hardcoded';\n /** Dev server port */\n port?: number | string;\n}\n\n/**\n * Summary of audit results\n */\nexport interface AuditSummary {\n totalComponents: number;\n averageCompliance: number;\n worstOffenders: AuditResult[];\n components: AuditResult[];\n stats: {\n totalHardcoded: number;\n totalTokenMismatches: number;\n totalProperties: number;\n };\n}\n\n/**\n * Run the audit command\n */\nexport async function audit(options: AuditOptions = {}): Promise<AuditSummary> {\n const { config: configPath, json = false, sort = 'compliance', port = 6006 } = options;\n\n // Load config\n await loadConfig(configPath);\n\n const client = createDevServerClient(port);\n const audits: AuditResult[] = [];\n\n if (!json) {\n console.log(pc.cyan(`\\n${BRAND.name} Design System Audit\\n`));\n }\n\n // Check if dev server is reachable\n const isReachable = await client.ping();\n if (!isReachable) {\n throw new DevServerConnectionError(\n `Cannot connect to dev server at http://localhost:${port}`,\n `http://localhost:${port}`\n );\n }\n\n // Fetch all fragments\n const segments = await client.getSegments();\n\n if (segments.length === 0) {\n if (json) {\n console.log(JSON.stringify({ error: 'No fragments found', components: [] }));\n } else {\n console.log(pc.yellow('No fragments found.\\n'));\n }\n return {\n totalComponents: 0,\n averageCompliance: 100,\n worstOffenders: [],\n components: [],\n stats: {\n totalHardcoded: 0,\n totalTokenMismatches: 0,\n totalProperties: 0,\n },\n };\n }\n\n if (!json) {\n console.log(pc.dim(`Auditing ${segments.length} component(s)...\\n`));\n }\n\n // Audit each fragment\n for (const seg of segments) {\n try {\n // Get real compliance from the server\n const complianceResult = await client.getCompliance({\n component: seg.name,\n });\n\n audits.push({\n name: seg.name,\n category: seg.category || 'uncategorized',\n compliance: complianceResult.compliance,\n hardcoded: complianceResult.hardcoded,\n tokenMismatches: complianceResult.violations.filter(\n v => v.issue.includes('mismatch')\n ).length,\n totalProperties: complianceResult.totalProperties,\n });\n } catch (error) {\n // Handle individual component errors\n audits.push({\n name: seg.name,\n category: seg.category || 'uncategorized',\n compliance: 0,\n hardcoded: 0,\n tokenMismatches: 0,\n totalProperties: 0,\n });\n }\n }\n\n // Sort results\n audits.sort((a, b) => {\n switch (sort) {\n case 'name':\n return a.name.localeCompare(b.name);\n case 'hardcoded':\n return b.hardcoded - a.hardcoded; // Most hardcoded first\n case 'compliance':\n default:\n return a.compliance - b.compliance; // Worst first\n }\n });\n\n const summary: AuditSummary = {\n totalComponents: audits.length,\n averageCompliance: audits.length > 0\n ? Math.round(audits.reduce((sum, a) => sum + a.compliance, 0) / audits.length * 100) / 100\n : 100,\n worstOffenders: audits.slice(0, 5),\n components: audits,\n stats: {\n totalHardcoded: audits.reduce((sum, a) => sum + a.hardcoded, 0),\n totalTokenMismatches: audits.reduce((sum, a) => sum + a.tokenMismatches, 0),\n totalProperties: audits.reduce((sum, a) => sum + a.totalProperties, 0),\n },\n };\n\n if (json) {\n // JSON output for CI/automation\n console.log(JSON.stringify(summary, null, 2));\n } else {\n // Table output for humans\n console.log(pc.bold('Component'.padEnd(30) + 'Compliance'.padEnd(12) + 'Hardcoded'.padEnd(12) + 'Properties'));\n console.log(pc.dim('─'.repeat(66)));\n\n for (const auditItem of audits) {\n const complianceColor = auditItem.compliance >= 90\n ? pc.green\n : auditItem.compliance >= 70\n ? pc.yellow\n : pc.red;\n\n console.log(\n auditItem.name.padEnd(30) +\n complianceColor(`${auditItem.compliance}%`.padEnd(12)) +\n String(auditItem.hardcoded).padEnd(12) +\n String(auditItem.totalProperties)\n );\n }\n\n console.log(pc.dim('─'.repeat(66)));\n\n console.log();\n console.log(pc.bold('Summary:'));\n console.log(` Total components: ${audits.length}`);\n console.log(` Average compliance: ${summary.averageCompliance}%`);\n console.log(` Total hardcoded values: ${summary.stats.totalHardcoded}`);\n console.log(` Total properties checked: ${summary.stats.totalProperties}`);\n\n if (audits.some(a => a.compliance < 100)) {\n console.log();\n console.log(pc.dim(`Run ${pc.cyan(`${BRAND.cliCommand} verify <component>`)} for detailed compliance info.`));\n }\n console.log();\n }\n\n return summary;\n}\n","/**\n * fragments a11y - Run accessibility checks on all component variants\n *\n * Uses the /fragments/a11y endpoint to get axe-core accessibility results\n * for all components in the design system.\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport {\n createDevServerClient,\n DevServerConnectionError,\n} from '../shared/index.js';\n\n/**\n * Options for a11y command\n */\nexport interface A11yOptions {\n /** Path to config file */\n config?: string;\n /** Output JSON format */\n json?: boolean;\n /** CI mode - exit code 1 if any critical/serious violations */\n ci?: boolean;\n /** Check specific component only */\n component?: string;\n /** Dev server port */\n port?: number | string;\n}\n\n/**\n * A11y result for a single variant\n */\nexport interface A11yVariantResult {\n /** Variant name */\n variant: string;\n /** Number of violations */\n violations: number;\n /** Number of passes */\n passes: number;\n /** Number of incomplete checks */\n incomplete: number;\n /** Violation summary by severity */\n summary: {\n total: number;\n critical: number;\n serious: number;\n moderate: number;\n minor: number;\n };\n}\n\n/**\n * A11y result for a component\n */\nexport interface A11yComponentResult {\n /** Component name */\n component: string;\n /** Results for each variant */\n results: A11yVariantResult[];\n /** Overall status */\n status: 'PASS' | 'WARN' | 'FAIL';\n /** Total violations across all variants */\n totalViolations: number;\n /** Total critical violations */\n totalCritical: number;\n /** Total serious violations */\n totalSerious: number;\n}\n\n/**\n * Summary of a11y results\n */\nexport interface A11ySummary {\n /** Total number of components */\n totalComponents: number;\n /** Number of accessible components (no critical/serious) */\n accessibleComponents: number;\n /** Percentage of accessible components */\n accessiblePercent: number;\n /** All component results */\n components: A11yComponentResult[];\n /** Total violations across all components */\n totalViolations: number;\n /** Total critical violations */\n totalCritical: number;\n /** Total serious violations */\n totalSerious: number;\n /** Total moderate violations */\n totalModerate: number;\n /** Total minor violations */\n totalMinor: number;\n /** Whether CI check passed (no critical/serious) */\n passed: boolean;\n}\n\n/**\n * Run the a11y command\n */\nexport async function a11y(options: A11yOptions = {}): Promise<A11ySummary> {\n const { config: configPath, json = false, ci = false, component, port = 6006 } = options;\n\n // Load config\n await loadConfig(configPath);\n\n const client = createDevServerClient(port);\n const componentResults: A11yComponentResult[] = [];\n\n if (!json) {\n console.log(pc.cyan(`\\n${BRAND.name} Accessibility Report\\n`));\n }\n\n // Check if dev server is reachable\n const isReachable = await client.ping();\n if (!isReachable) {\n throw new DevServerConnectionError(\n `Cannot connect to dev server at http://localhost:${port}`,\n `http://localhost:${port}`\n );\n }\n\n // Fetch all segments\n const segments = await client.getSegments();\n\n if (segments.length === 0) {\n if (json) {\n console.log(JSON.stringify({ error: 'No fragments found', components: [] }));\n } else {\n console.log(pc.yellow('No fragments found.\\n'));\n }\n return {\n totalComponents: 0,\n accessibleComponents: 0,\n accessiblePercent: 100,\n components: [],\n totalViolations: 0,\n totalCritical: 0,\n totalSerious: 0,\n totalModerate: 0,\n totalMinor: 0,\n passed: true,\n };\n }\n\n // Filter to specific component if requested\n const componentsToCheck = component\n ? segments.filter(s => s.name.toLowerCase() === component.toLowerCase())\n : segments;\n\n if (component && componentsToCheck.length === 0) {\n const error = `Component '${component}' not found. Available: ${segments.map(s => s.name).join(', ')}`;\n if (json) {\n console.log(JSON.stringify({ error }));\n } else {\n console.log(pc.red(error));\n }\n throw new Error(error);\n }\n\n if (!json) {\n console.log(pc.dim(`Checking ${componentsToCheck.length} component(s) for accessibility issues...\\n`));\n }\n\n // Check each component\n for (const seg of componentsToCheck) {\n try {\n // Get a11y results from the server\n const a11yResult = await client.getA11y(seg.name);\n\n let totalViolations = 0;\n let totalCritical = 0;\n let totalSerious = 0;\n\n for (const result of a11yResult.results) {\n totalViolations += result.summary.total;\n totalCritical += result.summary.critical;\n totalSerious += result.summary.serious;\n }\n\n // Determine status\n let status: 'PASS' | 'WARN' | 'FAIL' = 'PASS';\n if (totalCritical > 0 || totalSerious > 0) {\n status = 'FAIL';\n } else if (totalViolations > 0) {\n status = 'WARN';\n }\n\n componentResults.push({\n component: seg.name,\n results: a11yResult.results,\n status,\n totalViolations,\n totalCritical,\n totalSerious,\n });\n } catch (error) {\n // Handle individual component errors\n componentResults.push({\n component: seg.name,\n results: [],\n status: 'FAIL',\n totalViolations: 0,\n totalCritical: 0,\n totalSerious: 0,\n });\n }\n }\n\n // Calculate summary\n const accessibleComponents = componentResults.filter(c => c.status !== 'FAIL').length;\n const totalViolations = componentResults.reduce((sum, c) => sum + c.totalViolations, 0);\n const totalCritical = componentResults.reduce((sum, c) => sum + c.totalCritical, 0);\n const totalSerious = componentResults.reduce((sum, c) => sum + c.totalSerious, 0);\n\n // Calculate moderate and minor from all results\n let totalModerate = 0;\n let totalMinor = 0;\n for (const comp of componentResults) {\n for (const result of comp.results) {\n totalModerate += result.summary.moderate;\n totalMinor += result.summary.minor;\n }\n }\n\n const summary: A11ySummary = {\n totalComponents: componentResults.length,\n accessibleComponents,\n accessiblePercent: componentResults.length > 0\n ? Math.round((accessibleComponents / componentResults.length) * 100)\n : 100,\n components: componentResults,\n totalViolations,\n totalCritical,\n totalSerious,\n totalModerate,\n totalMinor,\n passed: totalCritical === 0 && totalSerious === 0,\n };\n\n if (json) {\n // JSON output for CI/automation\n console.log(JSON.stringify(summary, null, 2));\n } else {\n // Table output for humans\n console.log(pc.bold(\n 'Component'.padEnd(20) +\n 'Variants'.padEnd(10) +\n 'Violations'.padEnd(12) +\n 'Critical'.padEnd(10) +\n 'Serious'.padEnd(10) +\n 'Status'\n ));\n console.log(pc.dim('─'.repeat(72)));\n\n for (const result of componentResults) {\n const statusColor = result.status === 'PASS'\n ? pc.green\n : result.status === 'WARN'\n ? pc.yellow\n : pc.red;\n\n const variantCount = result.results.length || 1;\n\n console.log(\n result.component.padEnd(20) +\n String(variantCount).padEnd(10) +\n String(result.totalViolations).padEnd(12) +\n String(result.totalCritical).padEnd(10) +\n String(result.totalSerious).padEnd(10) +\n statusColor(result.status)\n );\n }\n\n console.log(pc.dim('─'.repeat(72)));\n\n console.log();\n console.log(pc.bold('Summary:'));\n console.log(` ${accessibleComponents}/${componentResults.length} components accessible (${summary.accessiblePercent}%)`);\n console.log(` Total violations: ${totalViolations} (${totalCritical} critical, ${totalSerious} serious, ${totalModerate} moderate, ${totalMinor} minor)`);\n\n if (!summary.passed) {\n console.log();\n console.log(pc.red('✗ Accessibility check failed - critical/serious violations found'));\n } else if (totalViolations > 0) {\n console.log();\n console.log(pc.yellow('⚠ Minor/moderate violations found - consider fixing for better accessibility'));\n } else {\n console.log();\n console.log(pc.green('✓ All components pass accessibility checks'));\n }\n\n console.log();\n }\n\n // In CI mode, throw if there are critical/serious violations\n if (ci && !summary.passed) {\n throw new Error(`Accessibility check failed: ${totalCritical} critical, ${totalSerious} serious violations found`);\n }\n\n return summary;\n}\n","/**\n * fragments storygen - Generate Storybook stories from segment definitions\n */\n\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { resolve, join, relative } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport type { SegmentDefinition } from '../core/index.js';\nimport { loadConfig, discoverSegmentFiles, loadSegmentFile } from '../core/node.js';\n\n/**\n * Options for storygen command\n */\nexport interface StorygenOptions {\n /** Path to config file */\n config?: string;\n /** Output directory */\n output?: string;\n /** Watch for segment changes and regenerate */\n watch?: boolean;\n /** Story format (csf3) */\n format?: string;\n}\n\n/**\n * Result of storygen command\n */\nexport interface StorygenResult {\n success: boolean;\n generated: number;\n outputDir: string;\n}\n\n/**\n * Run the storygen command\n */\nexport async function storygen(options: StorygenOptions = {}): Promise<StorygenResult> {\n const { config: configPath, output = '.storybook/generated', watch = false } = options;\n\n const { config, configDir } = await loadConfig(configPath);\n\n console.log(pc.cyan(`\\n${BRAND.name} Story Generator\\n`));\n\n // Discover segment files\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n\n if (segmentFiles.length === 0) {\n console.log(pc.yellow('No segment files found.\\n'));\n return { success: true, generated: 0, outputDir: output };\n }\n\n const outputDir = resolve(configDir, output);\n await mkdir(outputDir, { recursive: true });\n\n let generated = 0;\n\n // Generate function for a single segment\n const generateStory = async (file: { absolutePath: string; relativePath: string }) => {\n try {\n const segment = await loadSegmentFile(file.absolutePath);\n if (!segment) return false;\n\n const storyContent = generateCSF3Story(segment, file.relativePath);\n const storyName = `${segment.meta.name}.stories.tsx`;\n const storyPath = join(outputDir, storyName);\n\n await writeFile(storyPath, storyContent);\n console.log(`${pc.green('✓')} Generated ${storyName}`);\n return true;\n } catch (error) {\n console.log(`${pc.red('✗')} Failed: ${file.relativePath} - ${error instanceof Error ? error.message : error}`);\n return false;\n }\n };\n\n // Initial generation\n console.log(pc.dim(`Generating stories to ${relative(process.cwd(), outputDir)}/\\n`));\n\n for (const file of segmentFiles) {\n if (await generateStory(file)) {\n generated++;\n }\n }\n\n console.log();\n console.log(pc.green(`✓ Generated ${generated} story file(s)\\n`));\n\n // Watch mode\n if (watch) {\n console.log(pc.dim('Watching for segment changes... (Ctrl+C to stop)\\n'));\n\n const chokidar = await import('chokidar');\n const patterns = segmentFiles.map(f => f.absolutePath);\n\n const watcher = chokidar.watch(patterns, {\n ignoreInitial: true,\n awaitWriteFinish: { stabilityThreshold: 100 },\n });\n\n watcher.on('change', async (changedPath: string) => {\n const file = segmentFiles.find(f => f.absolutePath === changedPath);\n if (file) {\n console.log(pc.dim(`\\nChanged: ${relative(process.cwd(), changedPath)}`));\n await generateStory(file);\n }\n });\n\n watcher.on('add', async (addedPath: string) => {\n console.log(pc.dim(`\\nAdded: ${relative(process.cwd(), addedPath)}`));\n // Re-discover to get the new file's relative path\n const newFiles = await discoverSegmentFiles(config, configDir);\n const file = newFiles.find(f => f.absolutePath === addedPath);\n if (file) {\n segmentFiles.push(file);\n await generateStory(file);\n }\n });\n\n // Keep process alive\n await new Promise(() => {});\n }\n\n return { success: true, generated, outputDir };\n}\n\n/**\n * Generate a CSF3 story file from a segment definition\n */\nfunction generateCSF3Story(segment: SegmentDefinition, relativePath: string): string {\n const { meta, variants, props, usage } = segment;\n const componentName = meta.name;\n\n // Build argTypes from props\n const argTypes: string[] = [];\n if (props) {\n for (const [propName, propDef] of Object.entries(props)) {\n let controlType = 'text';\n let controlOptions = '';\n\n if (propDef.type === 'enum' && propDef.values) {\n controlType = 'select';\n controlOptions = `,\\n options: ${JSON.stringify(propDef.values)}`;\n } else if (propDef.type === 'boolean') {\n controlType = 'boolean';\n } else if (propDef.type === 'number') {\n controlType = 'number';\n }\n\n argTypes.push(` ${propName}: {\n control: '${controlType}'${controlOptions},\n description: ${JSON.stringify(propDef.description || '')},\n ${propDef.default !== undefined ? `defaultValue: ${JSON.stringify(propDef.default)},` : ''}\n }`);\n }\n }\n\n // Build story exports from variants\n const storyExports: string[] = [];\n for (const variant of variants) {\n const storyName = variant.name.replace(/[^a-zA-Z0-9]/g, '');\n storyExports.push(`\nexport const ${storyName}: Story = {\n name: ${JSON.stringify(variant.name)},\n ${variant.description ? `parameters: { docs: { description: { story: ${JSON.stringify(variant.description)} } } },` : ''}\n};`);\n }\n\n // Build usage description\n const usageDoc = usage\n ? `When to use:\n${usage.when?.map(w => `- ${w}`).join('\\n') || ''}\n\nWhen not to use:\n${usage.whenNot?.map(w => `- ${w}`).join('\\n') || ''}`\n : '';\n\n return `/**\n * Auto-generated Storybook stories from ${relativePath}\n *\n * DO NOT EDIT - regenerate with: segments storygen\n */\n\nimport type { Meta, StoryObj } from '@storybook/react';\nimport { ${componentName} } from '${relativePath.replace(/\\.segment\\.tsx$/, '/index.js')}';\n\nconst meta: Meta<typeof ${componentName}> = {\n title: '${meta.category ? `${meta.category.charAt(0).toUpperCase() + meta.category.slice(1)}/` : ''}${componentName}',\n component: ${componentName},\n tags: ['autodocs'],\n parameters: {\n docs: {\n description: {\n component: ${JSON.stringify(meta.description || '')},\n },\n },\n },\n argTypes: {\n${argTypes.join(',\\n')}\n },\n};\n\nexport default meta;\ntype Story = StoryObj<typeof meta>;\n${storyExports.join('\\n')}\n`;\n}\n","/**\n * fragments metrics - View compliance trends over time\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { createMetricsStore } from '../service/index.js';\n\n/**\n * Options for metrics command\n */\nexport interface MetricsOptions {\n /** Path to config file */\n config?: string;\n /** Number of days to look back */\n days?: number;\n /** Output JSON format */\n json?: boolean;\n}\n\n/**\n * Trend data point\n */\nexport interface TrendDataPoint {\n date: string;\n compliance: number;\n violations: number;\n}\n\n/**\n * Trend result\n */\nexport interface TrendResult {\n dataPoints: TrendDataPoint[];\n averageCompliance: number;\n trend: 'improving' | 'declining' | 'stable';\n}\n\n/**\n * Result of metrics command\n */\nexport interface MetricsResult {\n success: boolean;\n trend?: TrendResult;\n}\n\n/**\n * Run the metrics command\n */\nexport async function metrics(\n component: string | undefined,\n options: MetricsOptions = {}\n): Promise<MetricsResult> {\n const { config: configPath, days = 30, json = false } = options;\n\n const { configDir } = await loadConfig(configPath);\n const store = createMetricsStore(configDir);\n\n console.log(pc.cyan(`\\n${BRAND.name} Compliance Metrics\\n`));\n\n const trend = await store.getTrend(component || 'all', {\n days,\n groupBy: days > 14 ? 'week' : 'day',\n });\n\n if (json) {\n console.log(JSON.stringify(trend, null, 2));\n return { success: true, trend };\n }\n\n // Header\n const title = component ? `Component: ${component}` : 'System-wide';\n console.log(pc.bold(title));\n console.log(pc.dim(`Last ${days} days\\n`));\n\n // Check if we have data\n if (trend.dataPoints.length === 0) {\n console.log(pc.yellow('No metrics data found.\\n'));\n console.log(pc.dim('Metrics are recorded automatically when running verification commands.'));\n console.log(pc.dim(`Try running: ${pc.cyan(`${BRAND.cliCommand} verify --ci`)}\\n`));\n return { success: true, trend };\n }\n\n // Sparkline\n const sparkline = store.generateSparkline(trend.dataPoints);\n console.log(pc.bold('Trend: ') + sparkline);\n console.log();\n\n // Stats\n const trendColor = trend.trend === 'improving' ? pc.green :\n trend.trend === 'declining' ? pc.red : pc.dim;\n const trendIcon = trend.trend === 'improving' ? '↑' :\n trend.trend === 'declining' ? '↓' : '→';\n\n console.log(` Average compliance: ${pc.bold(`${trend.averageCompliance}%`)}`);\n console.log(` Direction: ${trendColor(`${trendIcon} ${trend.trend}`)}`);\n console.log(` Data points: ${trend.dataPoints.length}`);\n console.log();\n\n // Recent data points\n const recent = trend.dataPoints.slice(-5);\n if (recent.length > 0) {\n console.log(pc.dim('Recent data:'));\n for (const point of recent) {\n const complianceColor = point.compliance >= 90 ? pc.green :\n point.compliance >= 70 ? pc.yellow : pc.red;\n console.log(` ${pc.dim(point.date)} ${complianceColor(`${point.compliance}%`)} ${pc.dim(`(${point.violations} violations)`)}`);\n }\n console.log();\n }\n\n return { success: true, trend };\n}\n","/**\n * fragments baseline - Manage visual regression baselines\n */\n\nimport { readdir, rm, mkdir } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND, type Theme } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { runScreenshotCommand } from '../screenshot.js';\nimport { StorageManager } from '../service/index.js';\n\n/**\n * Options for baseline command\n */\nexport interface BaselineOptions {\n /** Path to config file */\n config?: string;\n /** Specific variant to update */\n variant?: string;\n /** Update/delete all baselines */\n all?: boolean;\n /** Theme for baseline (light/dark) */\n theme?: Theme;\n /** Dev server port */\n port?: number | string;\n}\n\n/**\n * Result of baseline command\n */\nexport interface BaselineResult {\n success: boolean;\n action: 'update' | 'list' | 'delete';\n count?: number;\n}\n\n/**\n * Run the baseline command\n */\nexport async function baseline(\n action: string,\n component: string | undefined,\n options: BaselineOptions = {}\n): Promise<BaselineResult> {\n const { config: configPath, variant, all = false, theme = 'light', port = 6006 } = options;\n\n const { config, configDir } = await loadConfig(configPath);\n\n // Initialize storage manager\n const storage = new StorageManager({\n projectRoot: configDir,\n viewport: config.screenshots?.viewport,\n });\n await storage.initialize();\n\n console.log(pc.cyan(`\\n${BRAND.name} Baseline Manager\\n`));\n\n const baseUrl = `http://localhost:${port}`;\n\n switch (action) {\n case 'update':\n return updateBaseline(component, options, config, configDir, baseUrl);\n\n case 'list':\n return listBaselines(configDir);\n\n case 'delete':\n return deleteBaseline(component, options, configDir);\n\n default:\n console.log(pc.red(`Unknown action: ${action}`));\n console.log(pc.dim('Available actions: update, list, delete\\n'));\n process.exit(1);\n }\n}\n\n/**\n * Update baselines\n */\nasync function updateBaseline(\n component: string | undefined,\n options: BaselineOptions,\n config: any,\n configDir: string,\n baseUrl: string\n): Promise<BaselineResult> {\n const { variant, all = false, theme = 'light' as const } = options;\n\n if (!component && !all) {\n // Interactive mode - prompt for component selection\n const { select } = await import('@inquirer/prompts');\n\n // Fetch available components\n const contextResp = await fetch(`${baseUrl}/fragments/context?format=json`);\n if (!contextResp.ok) {\n throw new Error('Failed to fetch fragments. Make sure dev server is running.');\n }\n\n const contextData = JSON.parse(await contextResp.text());\n const segments = contextData.components || [];\n\n if (segments.length === 0) {\n console.log(pc.yellow('No components found.\\n'));\n return { success: true, action: 'update', count: 0 };\n }\n\n component = await select({\n message: 'Select component to update:',\n choices: segments.map((s: { name: string }) => ({\n name: s.name,\n value: s.name,\n })),\n });\n }\n\n if (all) {\n // Update all baselines\n console.log(pc.dim('Updating all baselines...\\n'));\n\n await runScreenshotCommand(config, configDir, {\n theme,\n });\n\n console.log(pc.green('\\n✓ All baselines updated\\n'));\n } else if (component) {\n // Update specific component\n console.log(pc.dim(`Updating baselines for ${component}...\\n`));\n\n await runScreenshotCommand(config, configDir, {\n component,\n variant,\n theme,\n });\n\n console.log(pc.green(`\\n✓ Baselines updated for ${component}\\n`));\n }\n\n // Show file paths\n const baselinesDir = join(configDir, BRAND.dataDir, 'baselines');\n console.log(pc.dim(`Baselines directory: ${relative(process.cwd(), baselinesDir)}\\n`));\n\n return { success: true, action: 'update' };\n}\n\n/**\n * List all baselines\n */\nasync function listBaselines(configDir: string): Promise<BaselineResult> {\n const baselinesDir = join(configDir, BRAND.dataDir, 'baselines');\n\n try {\n const files = await readdir(baselinesDir, { recursive: true });\n const pngFiles = (files as string[]).filter((f) => f.endsWith('.png'));\n\n if (pngFiles.length === 0) {\n console.log(pc.yellow('No baselines found.\\n'));\n console.log(pc.dim(`Run ${pc.cyan(`${BRAND.cliCommand} screenshot`)} to capture baselines.\\n`));\n return { success: true, action: 'list', count: 0 };\n }\n\n console.log(pc.bold('Baselines:\\n'));\n for (const file of pngFiles) {\n console.log(` ${file}`);\n }\n console.log();\n console.log(pc.dim(`Total: ${pngFiles.length} baseline(s)\\n`));\n\n return { success: true, action: 'list', count: pngFiles.length };\n } catch {\n console.log(pc.yellow('No baselines directory found.\\n'));\n console.log(pc.dim(`Run ${pc.cyan(`${BRAND.cliCommand} screenshot`)} to capture baselines.\\n`));\n return { success: true, action: 'list', count: 0 };\n }\n}\n\n/**\n * Delete baselines\n */\nasync function deleteBaseline(\n component: string | undefined,\n options: BaselineOptions,\n configDir: string\n): Promise<BaselineResult> {\n const { all = false } = options;\n const baselinesDir = join(configDir, BRAND.dataDir, 'baselines');\n\n if (all) {\n // Delete all baselines\n const { confirm } = await import('@inquirer/prompts');\n\n const confirmed = await confirm({\n message: 'Delete ALL baselines? This cannot be undone.',\n default: false,\n });\n\n if (!confirmed) {\n console.log(pc.dim('\\nNo changes made.\\n'));\n return { success: true, action: 'delete', count: 0 };\n }\n\n await rm(baselinesDir, { recursive: true, force: true });\n console.log(pc.green('\\n✓ All baselines deleted\\n'));\n return { success: true, action: 'delete' };\n } else if (component) {\n // Delete specific component baselines\n const componentDir = join(baselinesDir, component);\n\n try {\n await rm(componentDir, { recursive: true, force: true });\n console.log(pc.green(`✓ Baselines deleted for ${component}\\n`));\n return { success: true, action: 'delete' };\n } catch {\n console.log(pc.yellow(`No baselines found for ${component}.\\n`));\n return { success: true, action: 'delete', count: 0 };\n }\n } else {\n console.log(pc.yellow('Specify a component name or use --all flag.\\n'));\n return { success: false, action: 'delete' };\n }\n}\n","/**\n * fragments add - Scaffold a new component with fragment file\n */\n\nimport { writeFile, mkdir, access } from 'node:fs/promises';\nimport { resolve, join, relative } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\n\n/**\n * Options for add command\n */\nexport interface AddOptions {\n /** Component category */\n category?: string;\n /** Output directory */\n dir?: string;\n /** Template to use (action, form-input, layout, display) */\n template?: string;\n /** Only generate fragment file, skip component stub */\n component?: boolean;\n}\n\n/**\n * Result of add command\n */\nexport interface AddResult {\n success: boolean;\n componentPath?: string;\n segmentPath: string;\n indexPath?: string;\n}\n\n/**\n * Run the add command\n */\nexport async function add(\n name: string | undefined,\n options: AddOptions = {}\n): Promise<AddResult> {\n console.log(pc.cyan(`\\n${BRAND.name} Component Scaffold\\n`));\n\n let componentName = name;\n let category = options.category;\n let template = options.template;\n let dir = options.dir;\n const generateComponent = options.component !== false;\n\n // If any required values are missing, go interactive\n if (!componentName || !category || !template || !dir) {\n const { input, select } = await import('@inquirer/prompts');\n\n try {\n // Component name\n if (!componentName) {\n componentName = await input({\n message: 'Component name:',\n validate: (value) => {\n if (!value.trim()) return 'Component name is required';\n if (!/^[A-Za-z][A-Za-z0-9]*$/.test(value)) return 'Use PascalCase (e.g., Button, TextField)';\n return true;\n },\n });\n }\n\n // Template type\n if (!template) {\n template = await select({\n message: 'What type of component is this?',\n choices: [\n { name: 'Display - Shows information or status', value: 'display' },\n { name: 'Action - Triggers an action (button, link)', value: 'action' },\n { name: 'Form Input - Accepts user input', value: 'form-input' },\n { name: 'Layout - Organizes content structure', value: 'layout' },\n ],\n default: 'display',\n });\n }\n\n // Category\n if (!category) {\n category = await input({\n message: 'Category:',\n default: template === 'form-input' ? 'forms' : template === 'layout' ? 'layout' : 'components',\n });\n }\n\n // Output directory\n if (!dir) {\n dir = await input({\n message: 'Output directory:',\n default: 'src/components',\n });\n }\n } catch {\n // User cancelled (Ctrl+C)\n console.log(pc.dim('\\nNo changes made.'));\n process.exit(0);\n }\n }\n\n // Normalize component name (PascalCase)\n componentName = componentName.charAt(0).toUpperCase() + componentName.slice(1);\n\n // Apply defaults for non-interactive values\n category = category || 'components';\n template = template || 'display';\n dir = dir || 'src/components';\n\n // Determine output paths\n const componentDir = resolve(process.cwd(), dir, componentName);\n const componentFile = join(componentDir, `${componentName}.tsx`);\n const segmentFile = join(componentDir, `${componentName}${BRAND.fileExtension}`);\n const indexFile = join(componentDir, 'index.ts');\n\n // Check if directory already exists\n try {\n await access(componentDir);\n console.log(pc.yellow(`Directory already exists: ${relative(process.cwd(), componentDir)}`));\n console.log(pc.dim('Use a different name or remove the existing directory.'));\n process.exit(1);\n } catch {\n // Directory doesn't exist, proceed\n }\n\n // Create directory\n await mkdir(componentDir, { recursive: true });\n\n // Generate component stub (unless --no-component)\n if (generateComponent) {\n const componentCode = generateComponentStub(componentName, template);\n await writeFile(componentFile, componentCode);\n console.log(`${pc.green('✓')} Created ${relative(process.cwd(), componentFile)}`);\n }\n\n // Generate segment file\n const segmentCode = generateSegmentStub(componentName, category, template);\n await writeFile(segmentFile, segmentCode);\n console.log(`${pc.green('✓')} Created ${relative(process.cwd(), segmentFile)}`);\n\n // Generate index.ts\n const indexCode = `export { ${componentName} } from './${componentName}.js';\\n`;\n await writeFile(indexFile, indexCode);\n console.log(`${pc.green('✓')} Created ${relative(process.cwd(), indexFile)}`);\n\n console.log(pc.green(`\\n✓ Scaffolded ${componentName}\\n`));\n\n // Next steps\n console.log(pc.dim('───────────────────────────────────────'));\n console.log(pc.bold('\\nNext steps:'));\n if (generateComponent) {\n console.log(` 1. Implement ${componentName}.tsx`);\n }\n console.log(` 2. Fill in usage.when and usage.whenNot in the fragment file`);\n console.log(` 3. Add variants with different prop combinations`);\n console.log(` 4. Run ${pc.cyan(`${BRAND.cliCommand} dev`)} to preview`);\n console.log();\n\n return {\n success: true,\n componentPath: generateComponent ? componentFile : undefined,\n segmentPath: segmentFile,\n indexPath: indexFile,\n };\n}\n\n/**\n * Generate a React component stub based on template type.\n */\nfunction generateComponentStub(name: string, _template: string): string {\n const propsInterface = `export interface ${name}Props {\n /** Content to display */\n children?: React.ReactNode;\n /** Additional CSS classes */\n className?: string;\n}`;\n\n return `import React from 'react';\n\n${propsInterface}\n\n/**\n * ${name} component\n *\n * TODO: Implement this component\n */\nexport function ${name}({ children, className }: ${name}Props) {\n return (\n <div className={className}>\n {children}\n </div>\n );\n}\n`;\n}\n\n/**\n * Generate a segment stub based on template type.\n */\nfunction generateSegmentStub(name: string, category: string, template: string): string {\n // Template-specific usage hints\n const usageHints: Record<string, { when: string[]; whenNot: string[] }> = {\n action: {\n when: ['User needs to trigger an action', 'Form submission is required'],\n whenNot: ['Navigation is needed (use Link)', 'Action is destructive without confirmation'],\n },\n 'form-input': {\n when: ['User needs to enter data', 'Form field is required'],\n whenNot: ['Display-only data is shown', 'Rich text editing is needed'],\n },\n layout: {\n when: ['Content needs to be organized', 'Responsive layout is required'],\n whenNot: ['Simple inline content is displayed', 'Scroll container is needed'],\n },\n display: {\n when: ['Information needs to be presented', 'Status or feedback is shown'],\n whenNot: ['User interaction is required', 'Data input is needed'],\n },\n };\n\n const hints = usageHints[template] || usageHints.display;\n\n // Template-specific scenario tags\n const scenarioTagHints: Record<string, string[]> = {\n action: ['action.primary', 'action.secondary', 'form.submit'],\n 'form-input': ['form.input', 'form.field', 'form.text'],\n layout: ['layout.container', 'layout.section', 'content.group'],\n display: ['display.info', 'display.status', 'content.text'],\n };\n\n const scenarioTags = scenarioTagHints[template] || scenarioTagHints.display;\n\n return `import React from 'react';\nimport { defineSegment } from '@fragments/core';\nimport { ${name} } from './index.js';\n\nexport default defineSegment({\n component: ${name},\n\n meta: {\n name: '${name}',\n description: 'TODO: Add description',\n category: '${category}',\n status: 'experimental',\n tags: ['${category}'],\n },\n\n usage: {\n when: [\n '${hints.when[0]}',\n '${hints.when[1]}',\n ],\n whenNot: [\n '${hints.whenNot[0]}',\n '${hints.whenNot[1]}',\n ],\n guidelines: [\n // TODO: Add best practices\n ],\n accessibility: [\n // TODO: Add accessibility guidelines\n ],\n },\n\n props: {\n children: {\n type: 'node',\n description: 'Content to display',\n },\n className: {\n type: 'string',\n description: 'Additional CSS classes',\n },\n // TODO: Add more props\n },\n\n relations: [\n // TODO: Add related components\n // { component: 'RelatedComponent', relationship: 'alternative', note: 'Use for...' },\n ],\n\n contract: {\n propsSummary: [\n 'children: ReactNode - content to display',\n 'className: string - additional CSS classes',\n // TODO: Add prop summaries\n ],\n scenarioTags: [\n '${scenarioTags[0]}',\n '${scenarioTags[1]}',\n // TODO: Add scenario tags for AI agent queries\n ],\n a11yRules: [\n // TODO: Add accessibility rule IDs\n ],\n },\n\n variants: [\n {\n name: 'Default',\n description: 'Default ${name} appearance',\n render: () => <${name}>Example content</${name}>,\n },\n // TODO: Add more variants\n // {\n // name: 'WithProps',\n // description: '${name} with additional props',\n // render: () => <${name} someProp=\"value\">Content</${name}>,\n // },\n ],\n});\n`;\n}\n","/**\n * fragments link figma - Link Figma components to segments\n */\n\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { relative } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND } from '../../core/index.js';\nimport { loadConfig, discoverSegmentFiles } from '../../core/node.js';\nimport { FigmaClient } from '../../service/index.js';\n\n/**\n * Options for link figma command\n */\nexport interface LinkFigmaOptions {\n /** Path to config file */\n config?: string;\n /** Auto-link matching components without prompts */\n auto?: boolean;\n /** Show matches without updating files */\n dryRun?: boolean;\n /** Link individual variants to their Figma frames */\n variants?: boolean;\n}\n\n/**\n * Result of link figma command\n */\nexport interface LinkFigmaResult {\n success: boolean;\n updated: number;\n variantUpdates: number;\n}\n\n/**\n * Segment variant info\n */\ninterface SegmentVariantInfo {\n name: string;\n hasFigma: boolean;\n}\n\n/**\n * Segment info\n */\ninterface SegmentInfo {\n name: string;\n filePath: string;\n relativePath: string;\n hasFigma: boolean;\n variants: SegmentVariantInfo[];\n}\n\n/**\n * Match result\n */\ninterface Match {\n segment: SegmentInfo;\n figmaComponent: {\n name: string;\n description: string;\n key: string;\n file_key: string;\n node_id: string;\n };\n score: number;\n alreadyLinked?: boolean;\n}\n\n/**\n * Run the link figma command\n */\nexport async function linkFigma(\n figmaUrl: string | undefined,\n options: LinkFigmaOptions = {}\n): Promise<LinkFigmaResult> {\n const { config: configPath, auto = false, dryRun = false, variants = true } = options;\n\n // Check for Figma access token\n if (!process.env.FIGMA_ACCESS_TOKEN) {\n console.error(pc.red('\\nFIGMA_ACCESS_TOKEN environment variable required.'));\n console.log(pc.dim('Generate at: https://www.figma.com/developers/api#access-tokens'));\n console.log(pc.dim(' export FIGMA_ACCESS_TOKEN=figd_xxx'));\n process.exit(1);\n }\n\n console.log(pc.cyan(`\\n${BRAND.name} Link Wizard\\n`));\n\n // Load config to check for figmaFile\n const { config, configDir } = await loadConfig(configPath);\n\n // Get Figma URL: CLI arg > config > interactive prompt\n let fileUrl = figmaUrl || config.figmaFile;\n\n if (!fileUrl) {\n const { input } = await import('@inquirer/prompts');\n\n console.log(pc.dim('Tip: Add `figmaFile` to fragments.config.ts to skip this prompt\\n'));\n\n try {\n fileUrl = await input({\n message: 'Enter Figma file URL:',\n validate: (value) => {\n if (!value.trim()) return 'URL is required';\n if (!value.includes('figma.com')) return 'Please enter a valid Figma URL';\n return true;\n },\n });\n } catch {\n // User cancelled (Ctrl+C)\n console.log(pc.dim('\\nNo changes made.'));\n process.exit(0);\n }\n } else if (config.figmaFile && !figmaUrl) {\n console.log(pc.dim(`Using Figma file from config: ${config.figmaFile}\\n`));\n }\n\n // Import FigmaClient\n const figmaClient = new FigmaClient({ accessToken: process.env.FIGMA_ACCESS_TOKEN });\n\n // Parse the URL to get file key\n console.log(pc.dim('Parsing Figma URL...'));\n const { fileKey } = figmaClient.parseFileUrl(fileUrl);\n\n // Fetch components from Figma\n console.log(pc.dim('Fetching components from Figma...'));\n const figmaData = await figmaClient.getFileComponents(fileKey);\n\n // Use component sets (main components) preferentially\n const allFigmaComponents = figmaData.componentSets.length > 0\n ? figmaData.componentSets\n : figmaData.components;\n\n if (allFigmaComponents.length === 0) {\n console.log(pc.yellow('\\nNo components found in Figma file.'));\n console.log(pc.dim('Make sure the file contains published components.'));\n process.exit(0);\n }\n\n const componentType = figmaData.componentSets.length > 0 ? 'component set' : 'component';\n console.log(pc.green(`✓ Found ${allFigmaComponents.length} Figma ${componentType}(s) in \"${figmaData.fileName}\"`));\n if (figmaData.components.length > 0 && figmaData.componentSets.length > 0) {\n console.log(pc.dim(` (${figmaData.components.length} individual components also available)\\n`));\n } else {\n console.log();\n }\n\n // Discover local segments\n const segmentFiles = await discoverSegmentFiles(config, configDir);\n\n if (segmentFiles.length === 0) {\n console.log(pc.yellow('No segment files found in codebase.'));\n console.log(pc.dim(`Looking for: ${config.include.join(', ')}`));\n process.exit(0);\n }\n\n console.log(pc.dim(`Found ${segmentFiles.length} segment file(s)\\n`));\n\n // Load segments to get names\n const segments: SegmentInfo[] = [];\n for (const file of segmentFiles) {\n try {\n const content = await readFile(file.absolutePath, 'utf-8');\n // Extract name from meta.name in the file\n const nameMatch = content.match(/name:\\s*['\"]([^'\"]+)['\"]/);\n // Check if figma is already set in meta\n const hasFigma = /meta:\\s*\\{[^}]*figma:\\s*['\"]https?:/.test(content);\n\n // Extract variant names and their figma status\n const segmentVariants = extractVariants(content, nameMatch?.[1]);\n\n if (nameMatch) {\n segments.push({\n name: nameMatch[1],\n filePath: file.absolutePath,\n relativePath: file.relativePath,\n hasFigma,\n variants: segmentVariants,\n });\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Find matches\n const matches: Match[] = [];\n const unmatchedSegments: SegmentInfo[] = [];\n\n for (const segment of segments) {\n // Find best matching Figma component\n let bestMatch: typeof allFigmaComponents[0] | null = null;\n let bestScore = 0;\n\n for (const figmaComp of allFigmaComponents) {\n const score = calculateMatchScore(segment.name, figmaComp.name);\n\n if (score > bestScore) {\n bestMatch = figmaComp;\n bestScore = score;\n\n // Perfect match, no need to continue\n if (score === 100) break;\n }\n }\n\n // Accept matches with 65%+ score\n if (bestMatch && bestScore >= 65) {\n const alreadyLinked = segment.hasFigma;\n if (alreadyLinked && !auto) {\n console.log(pc.dim(`⏭️ ${segment.name} (already linked)`));\n }\n matches.push({ segment, figmaComponent: bestMatch, score: bestScore, alreadyLinked });\n } else {\n unmatchedSegments.push(segment);\n }\n }\n\n if (unmatchedSegments.length > 0) {\n console.log(pc.dim('Unmatched segments:'));\n for (const seg of unmatchedSegments) {\n console.log(` ${pc.dim('•')} ${seg.name}`);\n }\n console.log();\n }\n\n // Split matches into new and already-linked\n const newMatches = matches.filter((m) => !m.alreadyLinked);\n const alreadyLinkedMatches = matches.filter((m) => m.alreadyLinked);\n\n if (matches.length === 0) {\n console.log(pc.yellow('\\nNo automatic matches found.'));\n console.log(pc.dim('You can manually add figma URLs to your segment definitions.'));\n process.exit(0);\n }\n\n // Dry run - just show what would be done\n if (dryRun) {\n if (newMatches.length > 0) {\n console.log(pc.bold('\\nMatched Components:\\n'));\n for (const match of newMatches) {\n const scoreColor = match.score === 100 ? pc.green : pc.yellow;\n console.log(\n ` ${pc.green('✓')} ${pc.bold(match.segment.name)} → ${match.figmaComponent.name} ${scoreColor(`(${Math.round(match.score)}%)`)}`\n );\n }\n }\n console.log(pc.yellow('\\n[Dry run - no files were updated]'));\n return { success: true, updated: 0, variantUpdates: 0 };\n }\n\n // Interactive selection or auto mode (only for new components)\n let selectedMatches: Match[] = newMatches;\n\n if (newMatches.length > 0) {\n if (auto) {\n // Auto mode - show matches and proceed\n console.log(pc.bold('\\nMatched Components:\\n'));\n for (const match of newMatches) {\n const scoreColor = match.score === 100 ? pc.green : pc.yellow;\n console.log(\n ` ${pc.green('✓')} ${pc.bold(match.segment.name)} → ${match.figmaComponent.name} ${scoreColor(`(${Math.round(match.score)}%)`)}`\n );\n }\n } else {\n // Interactive selection with checkbox\n const { checkbox } = await import('@inquirer/prompts');\n\n console.log(pc.bold('\\nMatched Components:\\n'));\n console.log(pc.dim('Use ↑/↓ to navigate, Space to toggle, Enter to confirm\\n'));\n\n const choices = newMatches.map((match) => {\n const scoreColor = match.score === 100 ? pc.green : pc.yellow;\n return {\n name: `${pc.bold(match.segment.name)} → ${match.figmaComponent.name} ${scoreColor(`(${Math.round(match.score)}%)`)}`,\n value: match,\n checked: true,\n };\n });\n\n try {\n selectedMatches = await checkbox({\n message: 'Select components to link:',\n choices,\n pageSize: 20,\n });\n } catch {\n // User cancelled (Ctrl+C)\n console.log(pc.dim('\\nNo changes made.'));\n return { success: true, updated: 0, variantUpdates: 0 };\n }\n }\n }\n\n // Include already-linked matches for variant linking\n const allSelectedMatches = [...selectedMatches, ...alreadyLinkedMatches];\n\n // Update segment files (only for new matches, not already-linked)\n let updated = 0;\n for (const match of selectedMatches) {\n if (match.alreadyLinked) continue;\n\n try {\n let content = await readFile(match.segment.filePath, 'utf-8');\n const figmaUrlToInsert = figmaClient.buildNodeUrl(\n match.figmaComponent.file_key,\n match.figmaComponent.node_id,\n figmaData.fileName\n );\n\n // Check if figma field already exists in meta\n if (/meta:\\s*\\{[^}]*figma:/.test(content)) {\n // Replace existing figma URL\n content = content.replace(\n /(meta:\\s*\\{[^}]*figma:\\s*['\"])([^'\"]*)['\"]/,\n `$1${figmaUrlToInsert}'`\n );\n } else {\n // Add figma field after category in meta\n content = content.replace(\n /(meta:\\s*\\{[^}]*category:\\s*['\"][^'\"]*['\"],?)/,\n `$1\\n figma: '${figmaUrlToInsert}',`\n );\n }\n\n await writeFile(match.segment.filePath, content);\n updated++;\n console.log(` ${pc.green('✓')} Updated ${match.segment.relativePath}`);\n } catch (error) {\n console.log(` ${pc.red('✗')} Failed to update ${match.segment.relativePath}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n if (updated > 0) {\n console.log(pc.green(`\\n✓ Updated ${updated} segment file(s)\\n`));\n }\n\n // Variant linking\n let variantUpdates = 0;\n if (variants && figmaData.componentSets.length > 0) {\n variantUpdates = await linkVariants(\n allSelectedMatches,\n figmaData,\n figmaClient,\n fileKey\n );\n }\n\n // Next steps\n console.log(pc.dim('───────────────────────────────────────'));\n console.log(pc.bold('\\nNext steps:'));\n console.log(` 1. Run ${pc.cyan(`${BRAND.cliCommand} compare --all`)} to verify designs`);\n console.log(` 2. Add figmaProps mappings for prop-level linking`);\n console.log();\n\n return { success: true, updated, variantUpdates };\n}\n\n/**\n * Extract variants from segment file content\n */\nfunction extractVariants(content: string, componentName?: string): SegmentVariantInfo[] {\n const variants: SegmentVariantInfo[] = [];\n\n // Find variants: [ ... ] section\n const variantsArrayMatch = content.match(/variants:\\s*\\[/);\n if (variantsArrayMatch && variantsArrayMatch.index !== undefined) {\n const variantsStart = variantsArrayMatch.index + variantsArrayMatch[0].length;\n // Find matching closing bracket\n let bracketCount = 1;\n let variantsEnd = variantsStart;\n while (bracketCount > 0 && variantsEnd < content.length) {\n if (content[variantsEnd] === '[') bracketCount++;\n if (content[variantsEnd] === ']') bracketCount--;\n variantsEnd++;\n }\n const variantsSection = content.slice(variantsStart, variantsEnd - 1);\n\n // Find all variant objects within the variants array\n const variantNameRegex = /\\{\\s*\\n?\\s*name:\\s*['\"]([^'\"]+)['\"]/g;\n let variantMatch;\n while ((variantMatch = variantNameRegex.exec(variantsSection)) !== null) {\n const variantName = variantMatch[1];\n // Skip if this matches the component name\n if (componentName && variantName === componentName) continue;\n\n // Find the extent of this variant object\n const objectStart = variantMatch.index;\n let braceCount = 1;\n let objectEnd = objectStart + 1;\n while (braceCount > 0 && objectEnd < variantsSection.length) {\n if (variantsSection[objectEnd] === '{') braceCount++;\n if (variantsSection[objectEnd] === '}') braceCount--;\n objectEnd++;\n }\n const objectContent = variantsSection.slice(objectStart, objectEnd);\n\n // Check if this variant has a figma URL\n const variantHasFigma = /figma:\\s*['\"]https?:/.test(objectContent);\n\n variants.push({\n name: variantName,\n hasFigma: variantHasFigma,\n });\n }\n }\n\n return variants;\n}\n\n/**\n * Calculate match score between two names\n */\nfunction calculateMatchScore(segmentName: string, figmaName: string): number {\n const normalizeForMatch = (s: string) =>\n s.toLowerCase().replace(/[^a-z0-9]/g, '');\n\n const normalizedSegment = normalizeForMatch(segmentName);\n const normalizedFigma = normalizeForMatch(figmaName);\n\n // Exact match after normalization\n if (normalizedSegment === normalizedFigma) {\n return 100;\n }\n\n // Check if segment name appears at the START of figma name\n if (normalizedFigma.startsWith(normalizedSegment)) {\n const coverage = normalizedSegment.length / normalizedFigma.length;\n return Math.max(85, coverage * 100);\n }\n\n // Check if figma name appears at the START of segment name\n if (normalizedSegment.startsWith(normalizedFigma)) {\n const coverage = normalizedFigma.length / normalizedSegment.length;\n return Math.max(80, coverage * 100);\n }\n\n // Word-based matching\n const getWords = (s: string): string[] => {\n return s\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[^a-zA-Z0-9]+/g, ' ')\n .toLowerCase()\n .split(/\\s+/)\n .filter((w) => w.length > 0);\n };\n\n const segmentWords = getWords(segmentName);\n const figmaWords = getWords(figmaName);\n\n // Check if all segment words appear in figma words\n const allSegmentWordsInFigma = segmentWords.every((sw) =>\n figmaWords.some((fw) => fw === sw || fw.startsWith(sw) || sw.startsWith(fw))\n );\n\n if (allSegmentWordsInFigma && segmentWords.length > 0) {\n const wordOverlap = segmentWords.length / Math.max(segmentWords.length, figmaWords.length);\n return Math.max(75, wordOverlap * 95);\n }\n\n // Partial containment\n if (normalizedFigma.includes(normalizedSegment)) {\n return 70;\n }\n if (normalizedSegment.includes(normalizedFigma)) {\n return 65;\n }\n\n return 0;\n}\n\n/**\n * Link variants to Figma frames\n */\nasync function linkVariants(\n matches: Match[],\n figmaData: any,\n figmaClient: FigmaClient,\n fileKey: string\n): Promise<number> {\n console.log(pc.bold('\\nLinking variants...\\n'));\n\n // Fetch variants for matched component sets\n const matchedComponentSets = matches\n .map((m) => m.figmaComponent)\n .filter((c) => figmaData.componentSets.some((cs: any) => cs.key === c.key));\n\n if (matchedComponentSets.length === 0) {\n return 0;\n }\n\n console.log(pc.dim('Fetching Figma variants...'));\n const componentSetVariants = await figmaClient.getComponentSetVariants(fileKey, matchedComponentSets);\n\n let variantUpdates = 0;\n const { select } = await import('@inquirer/prompts');\n\n const normalizeForMatch = (s: string) =>\n s.toLowerCase().replace(/[^a-z0-9]/g, '');\n\n const escapeRegExp = (s: string) =>\n s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n for (const match of matches) {\n const csWithVariants = componentSetVariants.find(\n (cs) => cs.componentSet.key === match.figmaComponent.key\n );\n\n if (!csWithVariants || csWithVariants.variants.length === 0) {\n continue;\n }\n\n // Match segment variants to Figma variants\n const segmentVariants = match.segment.variants.filter((v) => !v.hasFigma);\n if (segmentVariants.length === 0) {\n console.log(pc.dim(` ⏭️ ${match.segment.name}: all variants already linked`));\n continue;\n }\n\n console.log(pc.dim(` ${match.segment.name}: ${csWithVariants.variants.length} Figma variants`));\n\n for (const segmentVariant of segmentVariants) {\n // Find matching Figma variants by score\n const variantMatches: Array<{\n figmaVariant: typeof csWithVariants.variants[0];\n score: number;\n }> = [];\n\n for (const fv of csWithVariants.variants) {\n // Check if any property value matches the segment variant name\n const normalizedSegment = normalizeForMatch(segmentVariant.name);\n\n for (const value of fv.values) {\n const normalizedValue = normalizeForMatch(value);\n\n if (normalizedSegment === normalizedValue) {\n variantMatches.push({ figmaVariant: fv, score: 100 });\n break;\n } else if (normalizedValue.includes(normalizedSegment)) {\n variantMatches.push({ figmaVariant: fv, score: 85 });\n } else if (normalizedSegment.includes(normalizedValue)) {\n variantMatches.push({ figmaVariant: fv, score: 75 });\n }\n }\n }\n\n // Sort by score\n variantMatches.sort((a, b) => b.score - a.score);\n\n // If perfect match, use it automatically\n if (variantMatches.length > 0 && variantMatches[0].score === 100) {\n const bestMatch = variantMatches[0];\n const variantUrl = figmaClient.buildNodeUrl(\n match.figmaComponent.file_key,\n bestMatch.figmaVariant.node_id,\n figmaData.fileName\n );\n\n try {\n let content = await readFile(match.segment.filePath, 'utf-8');\n\n // Add figma URL after the variant's name field\n const namePattern = new RegExp(\n `(name:\\\\s*['\"]${escapeRegExp(segmentVariant.name)}['\"],?)`,\n 'g'\n );\n\n let replaced = false;\n content = content.replace(namePattern, (matchedStr) => {\n if (replaced) return matchedStr;\n replaced = true;\n return `${matchedStr}\\n figma: '${variantUrl}',`;\n });\n\n await writeFile(match.segment.filePath, content);\n variantUpdates++;\n console.log(\n ` ${pc.green('✓')} ${segmentVariant.name} → ${bestMatch.figmaVariant.name}`\n );\n } catch (error) {\n console.log(\n ` ${pc.red('✗')} ${segmentVariant.name}: ${error instanceof Error ? error.message : 'Unknown error'}`\n );\n }\n } else if (variantMatches.length > 0) {\n // Multiple possible matches - ask user\n const choices = [\n ...variantMatches.slice(0, 4).map((m) => ({\n name: `${m.figmaVariant.name} (${m.score}%)`,\n value: m.figmaVariant,\n })),\n { name: 'Skip this variant', value: null },\n ];\n\n try {\n const selectedVariant = await select({\n message: ` Match for \"${segmentVariant.name}\":`,\n choices,\n });\n\n if (selectedVariant) {\n const variantUrl = figmaClient.buildNodeUrl(\n match.figmaComponent.file_key,\n selectedVariant.node_id,\n figmaData.fileName\n );\n\n let content = await readFile(match.segment.filePath, 'utf-8');\n const namePattern = new RegExp(\n `(name:\\\\s*['\"]${escapeRegExp(segmentVariant.name)}['\"],?)`,\n 'g'\n );\n\n let replaced = false;\n content = content.replace(namePattern, (matchedStr) => {\n if (replaced) return matchedStr;\n replaced = true;\n return `${matchedStr}\\n figma: '${variantUrl}',`;\n });\n\n await writeFile(match.segment.filePath, content);\n variantUpdates++;\n console.log(\n ` ${pc.green('✓')} ${segmentVariant.name} → ${selectedVariant.name}`\n );\n } else {\n console.log(` ${pc.dim('⏭️')} ${segmentVariant.name} (skipped)`);\n }\n } catch {\n console.log(` ${pc.dim('⏭️')} ${segmentVariant.name} (cancelled)`);\n }\n } else {\n console.log(` ${pc.yellow('?')} ${segmentVariant.name}: no matching Figma variant`);\n }\n }\n }\n\n if (variantUpdates > 0) {\n console.log(pc.green(`\\n✓ Linked ${variantUpdates} variant(s)\\n`));\n } else {\n console.log(pc.dim('\\nNo variant updates made.\\n'));\n }\n\n return variantUpdates;\n}\n","/**\n * fragments link storybook - Bootstrap segments from Storybook stories\n */\n\nimport { writeFile, mkdir } from 'node:fs/promises';\nimport { join, dirname, relative } from 'node:path';\nimport pc from 'picocolors';\nimport { BRAND } from '../../core/index.js';\nimport {\n detectStorybookConfig,\n discoverStoryFiles as discoverStorybookFiles,\n parseStoryFile,\n convertToSegment,\n} from '../../migrate/index.js';\n\n/**\n * Options for link storybook command\n */\nexport interface LinkStorybookOptions {\n /** Path to .storybook/main.* config */\n config?: string;\n /** Output directory for segment files */\n out?: string;\n /** Skip confirmation prompts */\n yes?: boolean;\n /** Preview what would be generated without writing files */\n dryRun?: boolean;\n /** Only process stories matching glob */\n include?: string;\n /** Skip stories matching glob */\n exclude?: string;\n /** Show verbose output */\n verbose?: boolean;\n}\n\n/**\n * Result of link storybook command\n */\nexport interface LinkStorybookResult {\n success: boolean;\n generated: number;\n}\n\n/**\n * Preview item for stories\n */\ninterface PreviewItem {\n componentName: string;\n sourceFile: string;\n outputFile: string;\n variantCount: number;\n propCount: number;\n confidence: number;\n warnings: string[];\n}\n\n/**\n * Run the link storybook command\n */\nexport async function linkStorybook(\n options: LinkStorybookOptions = {}\n): Promise<LinkStorybookResult> {\n const { out, yes = false, dryRun = false, verbose = false } = options;\n\n console.log(pc.cyan(`\\n${BRAND.name} Storybook Link\\n`));\n\n // Detect Storybook config\n const projectRoot = process.cwd();\n console.log(pc.dim('Detecting Storybook configuration...'));\n\n const sbConfig = await detectStorybookConfig(projectRoot);\n if (!sbConfig) {\n console.log(pc.yellow('\\nNo Storybook configuration found.'));\n console.log(pc.dim('Looking for: .storybook/main.ts, .storybook/main.js, etc.'));\n console.log(pc.dim('\\nUse --config to specify a custom path.'));\n process.exit(1);\n }\n\n console.log(pc.green(`✓ Found: ${sbConfig.configPath}`));\n if (sbConfig.framework) {\n console.log(pc.dim(` Framework: ${sbConfig.framework}`));\n }\n if (sbConfig.errors?.length) {\n for (const err of sbConfig.errors) {\n console.log(pc.yellow(` Warning: ${err}`));\n }\n }\n\n // Discover story files\n console.log(pc.dim('\\nDiscovering story files...'));\n const storyFiles = await discoverStorybookFiles(projectRoot, sbConfig.storyPatterns);\n\n if (storyFiles.length === 0) {\n console.log(pc.yellow('\\nNo story files found.'));\n console.log(pc.dim(`Patterns: ${sbConfig.storyPatterns.join(', ')}`));\n process.exit(1);\n }\n\n console.log(pc.green(`✓ Found ${storyFiles.length} story file(s)\\n`));\n\n // Parse and convert each story\n const previews: PreviewItem[] = [];\n let parseErrors = 0;\n const total = storyFiles.length;\n\n console.log(pc.dim(`Analyzing ${total} stories...\\n`));\n\n for (let i = 0; i < storyFiles.length; i++) {\n const storyFile = storyFiles[i];\n const relativePath = relative(projectRoot, storyFile);\n\n // Show progress\n process.stdout.write(`\\r ${pc.dim(`[${i + 1}/${total}]`)} ${relativePath.slice(0, 60).padEnd(60)}`);\n\n try {\n const parsed = await parseStoryFile(storyFile);\n const result = convertToSegment(parsed);\n\n // Determine output path\n const outputFile = out\n ? join(out, relativePath.replace(/\\.stories\\.(tsx?|jsx?)$/, BRAND.fileExtension))\n : result.outputFile;\n\n previews.push({\n componentName: result.componentName,\n sourceFile: relativePath,\n outputFile: relative(projectRoot, outputFile),\n variantCount: result.variantCount,\n propCount: result.propCount,\n confidence: result.confidence,\n warnings: result.warnings,\n });\n } catch (error) {\n parseErrors++;\n if (verbose) {\n process.stdout.write('\\n');\n console.log(pc.red(`✗ ${relativePath}: ${error instanceof Error ? error.message : 'Parse error'}`));\n }\n }\n }\n\n // Clear progress line\n process.stdout.write('\\r' + ' '.repeat(80) + '\\r');\n\n // Display preview table\n console.log(pc.bold('Preview:\\n'));\n console.log(pc.dim('┌─────────────────────────────────────────────────────────────────┐'));\n console.log(pc.dim('│') + ' Component'.padEnd(20) + pc.dim('│') + ' Stories'.padEnd(10) + pc.dim('│') + ' Props'.padEnd(8) + pc.dim('│') + ' Confidence'.padEnd(13) + pc.dim('│'));\n console.log(pc.dim('├─────────────────────────────────────────────────────────────────┤'));\n\n for (const item of previews) {\n const confColor = item.confidence >= 0.8 ? pc.green : item.confidence >= 0.5 ? pc.yellow : pc.red;\n const confLabel = item.confidence >= 0.8 ? 'high' : item.confidence >= 0.5 ? 'medium' : 'low';\n console.log(\n pc.dim('│') +\n ` ${item.componentName}`.padEnd(20).slice(0, 20) +\n pc.dim('│') +\n ` ${item.variantCount}`.padEnd(10) +\n pc.dim('│') +\n ` ${item.propCount}`.padEnd(8) +\n pc.dim('│') +\n ` ${confColor(confLabel)}`.padEnd(13 + (confColor === pc.green ? 10 : confColor === pc.yellow ? 11 : 9)) +\n pc.dim('│')\n );\n }\n\n console.log(pc.dim('└─────────────────────────────────────────────────────────────────┘'));\n\n if (parseErrors > 0) {\n console.log(pc.yellow(`\\n${parseErrors} file(s) could not be parsed (use --verbose for details)`));\n }\n\n if (previews.length === 0) {\n console.log(pc.yellow('\\nNo stories could be parsed successfully.'));\n return { success: true, generated: 0 };\n }\n\n // Dry run stops here\n if (dryRun) {\n console.log(pc.dim(`\\n${previews.length} segment file(s) would be created`));\n console.log(pc.yellow('\\n[Dry run - no files were written]'));\n return { success: true, generated: 0 };\n }\n\n // Interactive selection or auto mode (--yes)\n let selectedPreviews = previews;\n\n if (yes) {\n console.log(pc.dim(`\\n${previews.length} segment file(s) will be created`));\n } else {\n const { checkbox } = await import('@inquirer/prompts');\n\n console.log(pc.dim('\\nUse ↑/↓ to navigate, Space to toggle, Enter to confirm\\n'));\n\n const choices = previews.map((item) => {\n const confColor = item.confidence >= 0.8 ? pc.green : item.confidence >= 0.5 ? pc.yellow : pc.red;\n const confLabel = item.confidence >= 0.8 ? 'high' : item.confidence >= 0.5 ? 'medium' : 'low';\n return {\n name: `${pc.bold(item.componentName)} ${pc.dim(`(${item.variantCount} stories, ${confLabel} confidence)`)}`,\n value: item,\n checked: true,\n };\n });\n\n try {\n selectedPreviews = await checkbox({\n message: 'Select stories to convert:',\n choices,\n pageSize: 15,\n });\n } catch {\n // User cancelled (Ctrl+C)\n console.log(pc.dim('\\nNo changes made.'));\n return { success: true, generated: 0 };\n }\n\n if (selectedPreviews.length === 0) {\n console.log(pc.dim('\\nNo stories selected. No changes made.'));\n return { success: true, generated: 0 };\n }\n }\n\n // Generate files\n const genTotal = selectedPreviews.length;\n console.log(pc.dim(`\\nGenerating ${genTotal} segment file(s)...\\n`));\n\n let generated = 0;\n let genErrors = 0;\n for (let i = 0; i < selectedPreviews.length; i++) {\n const preview = selectedPreviews[i];\n const storyFile = join(projectRoot, preview.sourceFile);\n try {\n const parsed = await parseStoryFile(storyFile);\n const result = convertToSegment(parsed);\n\n // Determine output path\n const outputFile = out\n ? join(projectRoot, out, preview.sourceFile.replace(/\\.stories\\.(tsx?|jsx?)$/, BRAND.fileExtension))\n : result.outputFile;\n\n // Create directory if needed\n await mkdir(dirname(outputFile), { recursive: true });\n\n // Write file\n await writeFile(outputFile, result.code);\n generated++;\n\n console.log(`${pc.dim(`[${i + 1}/${genTotal}]`)} ${pc.green('✓')} ${result.componentName}`);\n } catch (error) {\n genErrors++;\n console.log(`${pc.dim(`[${i + 1}/${genTotal}]`)} ${pc.red('✗')} ${preview.componentName}`);\n }\n }\n\n console.log(pc.green(`\\n✓ Generated ${generated} segment file(s)\\n`));\n\n // Next steps\n console.log(pc.dim('───────────────────────────────────────'));\n console.log(pc.bold('\\nNext steps:'));\n console.log(` 1. Review generated ${BRAND.fileExtension} files`);\n console.log(` 2. Fill in usage.when and usage.whenNot fields`);\n console.log(` 3. Run ${pc.cyan(`${BRAND.cliCommand} build`)} to compile`);\n console.log(` 4. Run ${pc.cyan(`${BRAND.cliCommand} dev`)} to view your design system`);\n console.log();\n\n return { success: true, generated };\n}\n","/**\n * fragments enhance - AI-powered documentation generation\n *\n * Analyzes codebase for component usage patterns and generates\n * when/whenNot documentation using AI.\n *\n * Supports:\n * - Anthropic (Claude) API\n * - OpenAI (GPT) API\n * - Context-only mode for IDE AI (Cursor, Copilot, etc.)\n */\n\nimport pc from 'picocolors';\nimport { BRAND } from '../core/index.js';\nimport { loadConfig } from '../core/node.js';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { resolve, relative, join } from 'node:path';\nimport {\n scanCodebase,\n parseAllStories,\n generateComponentContext,\n generateSystemPrompt,\n generateUserPrompt,\n generatePromptContext,\n getScanStats,\n extractPropsFromFile,\n renderAllComponentVariants,\n checkStorybookRunning,\n shutdownSharedPool,\n type ScanProgress,\n type ComponentContext,\n type UsageAnalysis,\n type ParsedStoryFile,\n type PropsExtractionResult,\n type RenderedVariant,\n} from '../service/index.js';\n\n/**\n * Supported AI providers\n */\nexport type AIProvider = 'anthropic' | 'openai' | 'none';\n\n/**\n * Options for enhance command\n */\nexport interface EnhanceOptions {\n /** Path to config file */\n config?: string;\n /** Component name to enhance (or 'all') */\n component?: string;\n /** Skip confirmation prompts */\n yes?: boolean;\n /** Only analyze, don't modify files */\n dryRun?: boolean;\n /** Output format: interactive, json, quiet, context */\n format?: 'interactive' | 'json' | 'quiet' | 'context';\n /** AI provider: anthropic, openai, or none */\n provider?: AIProvider;\n /** API key (or use ANTHROPIC_API_KEY/OPENAI_API_KEY env) */\n apiKey?: string;\n /** Model to use */\n model?: string;\n /** Root directory to scan */\n root?: string;\n /** Output context only (for use with IDE AI like Cursor) */\n contextOnly?: boolean;\n /** Render variants from running Storybook (captures complex stories that fail static extraction) */\n renderVariants?: boolean;\n /** Storybook URL for variant rendering (default: http://localhost:6006) */\n storybookUrl?: string;\n}\n\n/**\n * Enhanced segment data\n */\nexport interface EnhancedSegment {\n componentName: string;\n added: {\n when: string[];\n whenNot: string[];\n };\n confidence: number;\n tokensUsed: number;\n skipped: boolean;\n reason?: string;\n}\n\n/**\n * Result of enhance command\n */\nexport interface EnhanceResult {\n success: boolean;\n enhanced: EnhancedSegment[];\n totalTokens: number;\n estimatedCost: number;\n /** Context output for IDE AI mode */\n context?: string;\n}\n\n/**\n * Default models for each provider\n */\nconst DEFAULT_MODELS: Record<AIProvider, string> = {\n anthropic: 'claude-sonnet-4-20250514',\n openai: 'gpt-4o',\n none: '',\n};\n\n/**\n * Run the enhance command\n */\nexport async function enhance(options: EnhanceOptions = {}): Promise<EnhanceResult> {\n const {\n config: configPath,\n component,\n yes = false,\n dryRun = false,\n format = 'interactive',\n provider = detectProvider(options),\n apiKey = getApiKey(provider, options.apiKey),\n model = options.model || DEFAULT_MODELS[provider],\n root = process.cwd(),\n contextOnly = false,\n renderVariants = false,\n storybookUrl = 'http://localhost:6006',\n } = options;\n\n const isInteractive = format === 'interactive';\n const isQuiet = format === 'quiet';\n const isContextMode = contextOnly || format === 'context' || provider === 'none';\n\n // Load config\n const config = await loadConfig(configPath);\n const rootDir = resolve(root);\n\n if (isInteractive) {\n console.log(pc.cyan(`\\n${BRAND.name} AI Enhancement\\n`));\n if (isContextMode) {\n console.log(pc.dim('Running in context-only mode (for use with IDE AI like Cursor)\\n'));\n } else {\n console.log(pc.dim(`Using ${provider} API with model: ${model}\\n`));\n }\n }\n\n // Check for API key (unless context-only mode)\n if (!isContextMode && !apiKey) {\n const envVar = provider === 'openai' ? 'OPENAI_API_KEY' : 'ANTHROPIC_API_KEY';\n const error = `API key required. Set ${envVar} or use --api-key, or use --context-only for IDE AI mode`;\n if (format === 'json') {\n console.log(JSON.stringify({ success: false, error }));\n } else if (!isQuiet) {\n console.error(pc.red('Error:'), error);\n console.log(pc.dim('\\nTip: Use --context-only to generate prompts for Cursor/Copilot/etc.'));\n }\n return { success: false, enhanced: [], totalTokens: 0, estimatedCost: 0 };\n }\n\n // Phase 1: Scan codebase for usage patterns\n if (isInteractive) {\n console.log(pc.dim('Phase 1: Scanning codebase for usage patterns...'));\n }\n\n let usageAnalysis: UsageAnalysis;\n try {\n usageAnalysis = await scanCodebase({\n rootDir,\n useCache: true,\n onProgress: (progress: ScanProgress) => {\n if (isInteractive && progress.phase === 'scanning') {\n const pct = Math.round((progress.current / progress.total) * 100);\n process.stdout.write(`\\r Scanning: ${pct}% (${progress.current}/${progress.total})`);\n }\n },\n });\n if (isInteractive) {\n process.stdout.write('\\r' + ' '.repeat(60) + '\\r');\n const stats = getScanStats(usageAnalysis);\n console.log(pc.green(` Found ${stats.totalUsages} usages across ${stats.totalFiles} files`));\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (format === 'json') {\n console.log(JSON.stringify({ success: false, error: `Scan failed: ${msg}` }));\n } else if (!isQuiet) {\n console.error(pc.red('Scan failed:'), msg);\n }\n return { success: false, enhanced: [], totalTokens: 0, estimatedCost: 0 };\n }\n\n // Phase 2: Parse Storybook stories\n if (isInteractive) {\n console.log(pc.dim('Phase 2: Parsing Storybook stories...'));\n }\n\n let storyFiles: Map<string, ParsedStoryFile>;\n try {\n storyFiles = await parseAllStories(rootDir);\n if (isInteractive) {\n console.log(pc.green(` Found ${storyFiles.size} story files`));\n }\n } catch {\n storyFiles = new Map();\n if (isInteractive) {\n console.log(pc.yellow(' No Storybook stories found'));\n }\n }\n\n // Phase 3: Load fragment files\n if (isInteractive) {\n console.log(pc.dim('Phase 3: Loading fragment files...'));\n }\n\n // Search entire root dir, not just src/\n const segmentFiles = await findSegmentFiles(rootDir);\n\n if (segmentFiles.length === 0) {\n const msg = 'No fragment files found';\n if (format === 'json') {\n console.log(JSON.stringify({ success: false, error: msg }));\n } else if (!isQuiet) {\n console.log(pc.yellow(msg));\n }\n return { success: false, enhanced: [], totalTokens: 0, estimatedCost: 0 };\n }\n\n if (isInteractive) {\n console.log(pc.green(` Found ${segmentFiles.length} fragment files`));\n }\n\n // Filter components if specified\n let componentsToEnhance: string[];\n if (component && component !== 'all') {\n componentsToEnhance = [component];\n } else {\n componentsToEnhance = segmentFiles.map(f => extractComponentName(f));\n }\n\n // Phase 4: Extract props from TypeScript source files\n if (isInteractive) {\n console.log(pc.dim('Phase 4: Extracting props from TypeScript interfaces...'));\n }\n\n const propsExtractions = new Map<string, PropsExtractionResult>();\n for (const compName of componentsToEnhance) {\n const segmentFile = segmentFiles.find(f => extractComponentName(f) === compName);\n if (!segmentFile) continue;\n\n // Try to find the component source file relative to the segment file\n const segmentDir = segmentFile.replace(/\\.segment\\.(tsx?|jsx?)$/, '');\n const possiblePaths = [\n `${segmentDir}.tsx`,\n `${segmentDir}.ts`,\n `${segmentDir}/index.tsx`,\n `${segmentDir}/index.ts`,\n join(rootDir, 'src', 'components', `${compName}.tsx`),\n join(rootDir, 'src', 'components', compName, `${compName}.tsx`),\n join(rootDir, 'src', 'components', compName, 'index.tsx'),\n ];\n\n for (const srcPath of possiblePaths) {\n try {\n const fs = await import('node:fs');\n if (fs.existsSync(srcPath)) {\n const extraction = await extractPropsFromFile(srcPath, {\n propsTypeName: `${compName}Props`,\n });\n if (extraction.success) {\n propsExtractions.set(compName, extraction);\n break;\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n }\n\n if (isInteractive) {\n const propsCount = Array.from(propsExtractions.values())\n .reduce((sum, ext) => sum + ext.props.length, 0);\n console.log(pc.green(` Extracted ${propsCount} props from ${propsExtractions.size} component files`));\n }\n\n // Phase 5 (optional): Render variants from Storybook\n const renderedVariants = new Map<string, RenderedVariant[]>();\n\n if (renderVariants) {\n if (isInteractive) {\n console.log(pc.dim('Phase 5: Rendering variants from Storybook...'));\n }\n\n // Check if Storybook is running\n const storybookRunning = await checkStorybookRunning(storybookUrl);\n\n if (!storybookRunning) {\n if (isInteractive) {\n console.log(pc.yellow(` Storybook not running at ${storybookUrl}. Skipping variant rendering.`));\n console.log(pc.dim(` Start Storybook with: npm run storybook (or yarn storybook)`));\n }\n } else {\n // Render variants for each component\n let totalVariants = 0;\n let failedVariants = 0;\n\n for (const compName of componentsToEnhance) {\n try {\n const result = await renderAllComponentVariants(storybookUrl, compName);\n if (result.variants.length > 0) {\n renderedVariants.set(compName, result.variants);\n totalVariants += result.variants.length;\n }\n failedVariants += result.failed.length;\n } catch (err) {\n if (isInteractive) {\n console.log(pc.dim(` ${compName}: Failed to render (${(err as Error).message})`));\n }\n }\n }\n\n if (isInteractive) {\n if (totalVariants > 0) {\n console.log(pc.green(` Rendered ${totalVariants} variants from ${renderedVariants.size} components`));\n }\n if (failedVariants > 0) {\n console.log(pc.yellow(` ${failedVariants} variant(s) failed to render`));\n }\n }\n\n // Shutdown browser pool\n await shutdownSharedPool();\n }\n }\n\n // Build contexts for all components\n const contexts: Array<{ name: string; context: ComponentContext; segmentFile: string }> = [];\n for (const compName of componentsToEnhance) {\n const analysis = usageAnalysis.components[compName];\n const stories = storyFiles.get(compName);\n const segmentFile = segmentFiles.find(f => extractComponentName(f) === compName);\n const propsExtraction = propsExtractions.get(compName);\n\n if (!segmentFile) continue;\n\n const context = generateComponentContext(\n compName,\n analysis,\n undefined,\n stories,\n propsExtraction\n );\n contexts.push({ name: compName, context, segmentFile });\n }\n\n // Context-only mode: output prompts for IDE AI\n if (isContextMode) {\n return handleContextOnlyMode(contexts, format, isInteractive);\n }\n\n // Phase 6: Generate AI enhancements\n if (isInteractive) {\n console.log(pc.dim(`\\nPhase 6: Generating AI enhancements for ${componentsToEnhance.length} component(s)...\\n`));\n }\n\n const enhanced: EnhancedSegment[] = [];\n let totalTokens = 0;\n\n // Initialize AI client\n const aiClient = await createAIClient(provider, apiKey!);\n\n for (const { name: compName, context, segmentFile } of contexts) {\n // Check if we have enough data\n if (!context.usageAnalysis || context.usageAnalysis.totalUsages < 2) {\n enhanced.push({\n componentName: compName,\n added: { when: [], whenNot: [] },\n confidence: 0,\n tokensUsed: 0,\n skipped: true,\n reason: context.usageAnalysis?.totalUsages === 1 ? 'Only 1 usage found' : 'No usage data found',\n });\n if (isInteractive) {\n console.log(pc.dim(` ${compName}: Skipped (insufficient data)`));\n }\n continue;\n }\n\n if (isInteractive) {\n process.stdout.write(` ${compName}: Generating...`);\n }\n\n try {\n const result = await generateEnhancement(aiClient, provider, model, context);\n\n enhanced.push({\n componentName: compName,\n added: result.suggestions,\n confidence: result.confidence,\n tokensUsed: result.tokensUsed,\n skipped: false,\n });\n\n totalTokens += result.tokensUsed;\n\n if (isInteractive) {\n process.stdout.write(`\\r ${compName}: ${pc.green('Done')} (${result.suggestions.when.length} when, ${result.suggestions.whenNot.length} whenNot)\\n`);\n }\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n enhanced.push({\n componentName: compName,\n added: { when: [], whenNot: [] },\n confidence: 0,\n tokensUsed: 0,\n skipped: true,\n reason: `AI error: ${msg}`,\n });\n if (isInteractive) {\n process.stdout.write(`\\r ${compName}: ${pc.red('Failed')} - ${msg}\\n`);\n }\n }\n }\n\n // Calculate cost\n const estimatedCost = calculateCost(provider, totalTokens);\n\n // Phase 7: Apply changes\n if (!dryRun) {\n if (isInteractive) {\n console.log(pc.dim('\\nPhase 7: Updating segment files...'));\n }\n\n for (const result of enhanced) {\n if (result.skipped || (result.added.when.length === 0 && result.added.whenNot.length === 0)) {\n continue;\n }\n\n const segmentFile = segmentFiles.find(f => extractComponentName(f) === result.componentName);\n if (!segmentFile) continue;\n\n try {\n await updateSegmentFile(segmentFile, result.added);\n if (isInteractive) {\n console.log(pc.green(` Updated: ${relative(rootDir, segmentFile)}`));\n }\n } catch {\n if (isInteractive) {\n console.log(pc.red(` Failed to update: ${relative(rootDir, segmentFile)}`));\n }\n }\n }\n }\n\n // Output results\n const successCount = enhanced.filter(e => !e.skipped).length;\n\n if (format === 'json') {\n console.log(JSON.stringify({\n success: true,\n enhanced,\n totalTokens,\n estimatedCost,\n }, null, 2));\n } else if (isInteractive) {\n console.log();\n console.log(pc.bold('Summary:'));\n console.log(` Components processed: ${componentsToEnhance.length}`);\n console.log(` Successfully enhanced: ${successCount}`);\n console.log(` Skipped: ${enhanced.filter(e => e.skipped).length}`);\n console.log(` Total tokens used: ${totalTokens}`);\n console.log(` Estimated cost: $${estimatedCost.toFixed(4)}`);\n\n if (dryRun) {\n console.log();\n console.log(pc.yellow('Dry run - no files were modified'));\n }\n console.log();\n }\n\n return {\n success: true,\n enhanced,\n totalTokens,\n estimatedCost,\n };\n}\n\n/**\n * Handle context-only mode for IDE AI\n */\nfunction handleContextOnlyMode(\n contexts: Array<{ name: string; context: ComponentContext; segmentFile: string }>,\n format: string,\n isInteractive: boolean\n): EnhanceResult {\n const systemPrompt = generateSystemPrompt();\n const componentContexts: string[] = [];\n\n for (const { name, context } of contexts) {\n if (!context.usageAnalysis || context.usageAnalysis.totalUsages < 2) {\n continue;\n }\n componentContexts.push(generatePromptContext(context));\n }\n\n if (componentContexts.length === 0) {\n if (format === 'json') {\n console.log(JSON.stringify({ success: false, error: 'No components with sufficient usage data' }));\n } else if (isInteractive) {\n console.log(pc.yellow('\\nNo components with sufficient usage data to analyze.'));\n }\n return { success: false, enhanced: [], totalTokens: 0, estimatedCost: 0 };\n }\n\n const fullContext = `${systemPrompt}\n\n---\n\n${componentContexts.join('\\n\\n---\\n\\n')}\n\n---\n\nBased on the usage analysis above, generate \"when\" and \"whenNot\" documentation for each component.\n\nFor each component, provide your response in JSON format:\n\\`\\`\\`json\n{\n \"componentName\": \"...\",\n \"when\": [\"scenario 1\", \"scenario 2\", ...],\n \"whenNot\": [\"anti-pattern 1\", ...]\n}\n\\`\\`\\``;\n\n if (format === 'json') {\n console.log(JSON.stringify({\n success: true,\n context: fullContext,\n instructions: 'Copy this prompt into your IDE AI (Cursor, Copilot, etc.) to generate suggestions',\n }, null, 2));\n } else {\n console.log(pc.bold('\\n📋 AI Context Generated\\n'));\n console.log(pc.dim('Copy the following prompt into your IDE AI (Cursor, Copilot, etc.):\\n'));\n console.log(pc.dim('─'.repeat(60)));\n console.log(fullContext);\n console.log(pc.dim('─'.repeat(60)));\n console.log();\n console.log(pc.green('Tip: In Cursor, press Cmd+L to open chat and paste this prompt.'));\n console.log(pc.dim('After getting suggestions, manually update your segment files.'));\n console.log();\n }\n\n return {\n success: true,\n enhanced: [],\n totalTokens: 0,\n estimatedCost: 0,\n context: fullContext,\n };\n}\n\n/**\n * Detect which AI provider to use based on available API keys\n */\nfunction detectProvider(options: EnhanceOptions): AIProvider {\n if (options.contextOnly) return 'none';\n if (options.provider) return options.provider;\n if (options.apiKey) {\n // Try to guess from key format\n if (options.apiKey.startsWith('sk-ant-')) return 'anthropic';\n if (options.apiKey.startsWith('sk-')) return 'openai';\n }\n // Check environment variables\n if (process.env.ANTHROPIC_API_KEY) return 'anthropic';\n if (process.env.OPENAI_API_KEY) return 'openai';\n return 'none';\n}\n\n/**\n * Get API key for the provider\n */\nfunction getApiKey(provider: AIProvider, explicitKey?: string): string | undefined {\n if (explicitKey) return explicitKey;\n if (provider === 'anthropic') return process.env.ANTHROPIC_API_KEY;\n if (provider === 'openai') return process.env.OPENAI_API_KEY;\n return undefined;\n}\n\n/**\n * Create AI client for the provider\n */\nasync function createAIClient(provider: AIProvider, apiKey: string): Promise<unknown> {\n if (provider === 'anthropic') {\n const Anthropic = (await import('@anthropic-ai/sdk')).default;\n return new Anthropic({ apiKey });\n }\n if (provider === 'openai') {\n const OpenAI = (await import('openai')).default;\n return new OpenAI({ apiKey });\n }\n throw new Error(`Unknown provider: ${provider}`);\n}\n\n/**\n * Generate enhancement using the appropriate AI provider\n */\nasync function generateEnhancement(\n client: unknown,\n provider: AIProvider,\n model: string,\n context: ComponentContext\n): Promise<{\n suggestions: { when: string[]; whenNot: string[] };\n confidence: number;\n tokensUsed: number;\n}> {\n const systemPrompt = generateSystemPrompt();\n const userPrompt = generateUserPrompt(context);\n\n if (provider === 'anthropic') {\n return generateWithAnthropic(client, model, systemPrompt, userPrompt, context);\n }\n if (provider === 'openai') {\n return generateWithOpenAI(client, model, systemPrompt, userPrompt, context);\n }\n throw new Error(`Unknown provider: ${provider}`);\n}\n\n/**\n * Generate with Anthropic API\n */\nasync function generateWithAnthropic(\n client: unknown,\n model: string,\n systemPrompt: string,\n userPrompt: string,\n context: ComponentContext\n): Promise<{\n suggestions: { when: string[]; whenNot: string[] };\n confidence: number;\n tokensUsed: number;\n}> {\n const anthropic = client as import('@anthropic-ai/sdk').default;\n const response = await anthropic.messages.create({\n model,\n max_tokens: 1024,\n system: systemPrompt,\n messages: [{ role: 'user', content: userPrompt }],\n });\n\n const content = response.content[0];\n if (content.type !== 'text') {\n throw new Error('Unexpected response type');\n }\n\n const suggestions = parseAIResponse(content.text);\n const tokensUsed = (response.usage?.input_tokens || 0) + (response.usage?.output_tokens || 0);\n\n return {\n suggestions,\n confidence: calculateConfidence(context, suggestions),\n tokensUsed,\n };\n}\n\n/**\n * Generate with OpenAI API\n */\nasync function generateWithOpenAI(\n client: unknown,\n model: string,\n systemPrompt: string,\n userPrompt: string,\n context: ComponentContext\n): Promise<{\n suggestions: { when: string[]; whenNot: string[] };\n confidence: number;\n tokensUsed: number;\n}> {\n const openai = client as import('openai').default;\n const response = await openai.chat.completions.create({\n model,\n max_tokens: 1024,\n messages: [\n { role: 'system', content: systemPrompt },\n { role: 'user', content: userPrompt },\n ],\n });\n\n const content = response.choices[0]?.message?.content;\n if (!content) {\n throw new Error('No response from OpenAI');\n }\n\n const suggestions = parseAIResponse(content);\n const tokensUsed = (response.usage?.prompt_tokens || 0) + (response.usage?.completion_tokens || 0);\n\n return {\n suggestions,\n confidence: calculateConfidence(context, suggestions),\n tokensUsed,\n };\n}\n\n/**\n * Parse AI response to extract suggestions\n */\nfunction parseAIResponse(text: string): { when: string[]; whenNot: string[] } {\n try {\n // Extract JSON from response (may be wrapped in markdown code block)\n const jsonMatch = text.match(/```json\\n?([\\s\\S]*?)\\n?```/) || text.match(/\\{[\\s\\S]*\\}/);\n const jsonStr = jsonMatch ? (jsonMatch[1] || jsonMatch[0]) : text;\n const parsed = JSON.parse(jsonStr);\n return {\n when: Array.isArray(parsed.when) ? parsed.when : [],\n whenNot: Array.isArray(parsed.whenNot) ? parsed.whenNot : [],\n };\n } catch {\n return extractSuggestionsFromText(text);\n }\n}\n\n/**\n * Extract suggestions from unstructured AI text response\n */\nfunction extractSuggestionsFromText(text: string): { when: string[]; whenNot: string[] } {\n const when: string[] = [];\n const whenNot: string[] = [];\n\n const lines = text.split('\\n');\n let currentSection: 'when' | 'whenNot' | null = null;\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (/^(when|use when|when to use)/i.test(trimmed)) {\n currentSection = 'when';\n continue;\n }\n if (/^(when not|do not use|avoid|whenNot)/i.test(trimmed)) {\n currentSection = 'whenNot';\n continue;\n }\n\n if (currentSection && /^[-*]\\s+/.test(trimmed)) {\n const item = trimmed.replace(/^[-*]\\s+/, '').trim();\n if (item && item.length > 10) {\n if (currentSection === 'when') {\n when.push(item);\n } else {\n whenNot.push(item);\n }\n }\n }\n }\n\n return { when, whenNot };\n}\n\n/**\n * Calculate confidence based on data quality and response\n */\nfunction calculateConfidence(\n context: ComponentContext,\n suggestions: { when: string[]; whenNot: string[] }\n): number {\n let confidence = 50;\n if (context.usageAnalysis.totalUsages > 10) confidence += 20;\n if (context.storybook && context.storybook.stories.length > 0) confidence += 15;\n if (suggestions.when.length >= 2) confidence += 10;\n if (suggestions.whenNot.length >= 1) confidence += 5;\n return Math.min(confidence, 100);\n}\n\n/**\n * Calculate cost based on provider and tokens\n */\nfunction calculateCost(provider: AIProvider, tokens: number): number {\n // Approximate costs per 1M tokens\n const costsPer1M: Record<AIProvider, number> = {\n anthropic: 3, // Claude Sonnet\n openai: 5, // GPT-4o\n none: 0,\n };\n return (tokens / 1_000_000) * costsPer1M[provider];\n}\n\n/**\n * Find all segment files in a directory\n */\nasync function findSegmentFiles(dir: string): Promise<string[]> {\n const fg = await import('fast-glob');\n return fg.default(['**/*.segment.tsx', '**/*.segment.ts'], {\n cwd: dir,\n absolute: true,\n ignore: ['**/node_modules/**', '**/dist/**'],\n });\n}\n\n/**\n * Extract component name from segment file path\n */\nfunction extractComponentName(filePath: string): string {\n const match = filePath.match(/([^/\\\\]+)\\.segment\\.(tsx?|jsx?)$/);\n return match ? match[1] : '';\n}\n\n/**\n * Update a segment file with new when/whenNot suggestions\n */\nasync function updateSegmentFile(\n filePath: string,\n suggestions: { when: string[]; whenNot: string[] }\n): Promise<void> {\n const content = await readFile(filePath, 'utf-8');\n let updated = content;\n\n // Add 'when' items\n if (suggestions.when.length > 0) {\n const whenItems = suggestions.when.map(s => ` \"${s}\"`).join(',\\n');\n const whenMatch = updated.match(/when:\\s*\\[\\s*([^\\]]*)\\]/);\n if (whenMatch) {\n const existingContent = whenMatch[1].trim();\n if (existingContent) {\n updated = updated.replace(\n /when:\\s*\\[\\s*([^\\]]*)\\]/,\n `when: [\\n${existingContent},\\n${whenItems}\\n ]`\n );\n } else {\n updated = updated.replace(\n /when:\\s*\\[\\s*\\]/,\n `when: [\\n${whenItems}\\n ]`\n );\n }\n }\n }\n\n // Add 'whenNot' items\n if (suggestions.whenNot.length > 0) {\n const whenNotItems = suggestions.whenNot.map(s => ` \"${s}\"`).join(',\\n');\n const whenNotMatch = updated.match(/whenNot:\\s*\\[\\s*([^\\]]*)\\]/);\n if (whenNotMatch) {\n const existingContent = whenNotMatch[1].trim();\n if (existingContent) {\n updated = updated.replace(\n /whenNot:\\s*\\[\\s*([^\\]]*)\\]/,\n `whenNot: [\\n${existingContent},\\n${whenNotItems}\\n ]`\n );\n } else {\n updated = updated.replace(\n /whenNot:\\s*\\[\\s*\\]/,\n `whenNot: [\\n${whenNotItems}\\n ]`\n );\n }\n }\n }\n\n if (updated !== content) {\n await writeFile(filePath, updated, 'utf-8');\n }\n}\n"],"mappings":"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","names":["pc","pc","pc","pc","content","pc","pc","pc","pc","pc","pc","pc","stat","join","relative","fg","readFile","match","outputFile","readFile","join","fg","fg","stat","pc","pc","pc","writeFile","mkdir","resolve","join","pc","resolve","mkdir","writeFile","join","pc","pc","pc","pc","pc","pc","pc","totalViolations","totalCritical","totalSerious","writeFile","mkdir","resolve","join","relative","pc","pc","resolve","mkdir","join","writeFile","relative","pc","pc","readdir","rm","join","relative","pc","pc","join","relative","readdir","rm","writeFile","mkdir","access","resolve","join","relative","pc","pc","resolve","join","access","relative","mkdir","writeFile","readFile","writeFile","pc","pc","readFile","writeFile","writeFile","mkdir","join","dirname","relative","pc","pc","relative","join","mkdir","dirname","writeFile","pc","readFile","writeFile","resolve","relative","join","resolve","pc","join","context","relative","calculateConfidence","fg","readFile","writeFile","pc"]}
|