@mikulgohil/ai-kit 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/commands/init.ts","../src/scanner/index.ts","../src/utils.ts","../src/scanner/nextjs.ts","../src/scanner/sitecore.ts","../src/scanner/styling.ts","../src/scanner/typescript.ts","../src/scanner/monorepo.ts","../src/scanner/package-manager.ts","../src/scanner/figma.ts","../src/scanner/tools.ts","../src/scanner/mcp.ts","../src/generator/assembler.ts","../src/generator/claude-md.ts","../src/generator/cursorrules.ts","../src/generator/cursor-mdc.ts","../src/generator/config.ts","../src/generator/hooks.ts","../src/copier/skills.ts","../src/copier/guides.ts","../src/copier/docs.ts","../src/copier/agents.ts","../src/copier/contexts.ts","../src/commands/update.ts","../src/commands/reset.ts","../src/commands/tokens.ts","../src/commands/doctor.ts","../src/commands/diff.ts","../src/commands/export.ts","../src/commands/stats.ts","../src/commands/audit.ts","../src/commands/health.ts","../src/commands/patterns.ts","../src/commands/dead-code.ts","../src/scanner/components.ts","../src/commands/drift.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { VERSION } from './constants.js';\nimport { initCommand } from './commands/init.js';\nimport { updateCommand } from './commands/update.js';\nimport { resetCommand } from './commands/reset.js';\nimport { tokensCommand } from './commands/tokens.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { diffCommand } from './commands/diff.js';\nimport { exportCommand } from './commands/export.js';\nimport { statsCommand } from './commands/stats.js';\nimport { auditCommand } from './commands/audit.js';\nimport { healthCommand } from './commands/health.js';\nimport { patternsCommand } from './commands/patterns.js';\nimport { deadCodeCommand } from './commands/dead-code.js';\nimport { driftCommand } from './commands/drift.js';\n\nconst program = new Command();\n\nprogram\n .name('ai-kit')\n .description(\n 'AI-powered project setup — generates CLAUDE.md, .cursorrules, slash commands, and guides tailored to your stack.',\n )\n .version(VERSION);\n\nprogram\n .command('init')\n .description('Scan your project and generate AI configs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await initCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('update')\n .description('Re-scan and update all generated AI configs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await updateCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('reset')\n .description('Remove all AI Kit generated files')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await resetCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('tokens')\n .description('Show token usage summary and cost estimates')\n .option('--export', 'Export data and open HTML dashboard')\n .option('--csv', 'Export daily usage to CSV file')\n .option('--budget <amount>', 'Monthly budget in USD (default: $20)', parseFloat)\n .action(async (opts: { export?: boolean; csv?: boolean; budget?: number }) => {\n try {\n await tokensCommand(opts);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose AI Kit setup and check for issues')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await doctorCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('diff')\n .description('Show what would change on update (dry run)')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await diffCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('export')\n .description('Export rules to other AI tools (Windsurf, Aider, Cline)')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .option('--format <format>', 'Export format: windsurf, aider, cline, or all')\n .action(async (targetPath?: string, opts?: { format?: string }) => {\n try {\n await exportCommand(targetPath, opts);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('stats')\n .description('Show project setup statistics and complexity')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await statsCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('audit')\n .description('Security and configuration audit for AI agent setup')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await auditCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('health')\n .description('One-glance project health — setup, security, stack, tools, and docs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await healthCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('patterns')\n .description('Generate a pattern library from recurring code patterns')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await patternsCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('dead-code')\n .description('Find unused components and dead code')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await deadCodeCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('drift')\n .description('Detect drift between component code and .ai.md documentation')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await driftCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { fileURLToPath } from 'url';\nimport path from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const PACKAGE_ROOT = path.resolve(__dirname, '..');\nexport const TEMPLATES_DIR = path.join(PACKAGE_ROOT, 'templates');\nexport const COMMANDS_DIR = path.join(PACKAGE_ROOT, 'commands');\nexport const GUIDES_DIR = path.join(PACKAGE_ROOT, 'guides');\nexport const DOCS_SCAFFOLDS_DIR = path.join(PACKAGE_ROOT, 'docs-scaffolds');\nexport const AGENTS_DIR = path.join(PACKAGE_ROOT, 'agents');\nexport const CONTEXTS_DIR = path.join(PACKAGE_ROOT, 'contexts');\n\nexport const VERSION = '1.4.0';\n\nexport const AI_KIT_FOLDER = 'ai-kit';\nexport const AI_KIT_CONFIG_FILE = 'ai-kit.config.json';\n\nexport const GENERATED_FILES = {\n claudeMd: 'CLAUDE.md',\n cursorRules: '.cursorrules',\n cursorMdcDir: '.cursor/rules',\n claudeSettings: '.claude/settings.json',\n claudeSettingsLocal: '.claude/settings.local.json',\n claudeCommands: '.claude/commands',\n claudeSkills: '.claude/skills',\n claudeAgents: '.claude/agents',\n claudeContexts: '.claude/contexts',\n cursorSkills: '.cursor/skills',\n} as const;\n\nexport const TEMPLATE_FRAGMENTS = [\n 'base',\n 'nextjs-app-router',\n 'nextjs-pages-router',\n 'sitecore-xmc',\n 'tailwind',\n 'typescript',\n 'monorepo',\n 'figma',\n] as const;\n\nexport type TemplateFragment = (typeof TEMPLATE_FRAGMENTS)[number];\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { generateMdcFiles } from '../generator/cursor-mdc.js';\nimport { generateConfig } from '../generator/config.js';\nimport { generateSettingsLocal } from '../generator/hooks.js';\nimport { copySkills } from '../copier/skills.js';\nimport { copyGuides } from '../copier/guides.js';\nimport { scaffoldDocs } from '../copier/docs.js';\nimport { copyAgents } from '../copier/agents.js';\nimport { copyContexts } from '../copier/contexts.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n} from '../utils.js';\nimport { loadCustomFragments } from '../generator/assembler.js';\nimport type { ProjectScan, ConflictResolution, ClarificationAnswer, StrictnessLevel, HookProfile } from '../types.js';\n\nexport async function initCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Project Setup');\n logInfo(`Scanning: ${projectDir}`);\n\n // Check for existing config\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n if (fileExists(configPath)) {\n const overwrite = await confirm({\n message: 'AI Kit is already configured in this project. Re-initialize?',\n default: false,\n });\n if (!overwrite) {\n logInfo('Cancelled. Use `ai-kit update` to refresh configs.');\n return;\n }\n }\n\n // Scan the project\n const spinner = ora('Scanning project...').start();\n let scan: ProjectScan;\n try {\n scan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n } catch (err) {\n spinner.fail('Failed to scan project');\n logError(String(err));\n return;\n }\n\n // Show detected stack\n logSection('Detected Stack');\n logInfo(`Framework: ${formatFramework(scan)}`);\n logInfo(`CMS: ${scan.cms === 'none' ? 'None' : scan.cms}`);\n logInfo(`Styling: ${scan.styling.join(', ') || 'None detected'}`);\n logInfo(`TypeScript: ${scan.typescript ? 'Yes' : 'No'}`);\n logInfo(`Monorepo: ${scan.monorepo ? `Yes (${scan.monorepoTool})` : 'No'}`);\n logInfo(`Package Manager: ${scan.packageManager}`);\n logInfo(`Formatter: ${scan.tools.biome ? 'Biome' : scan.tools.prettier ? 'Prettier' : 'None detected'}`);\n\n // Clarification questions for ambiguous detections\n const clarifications = await askClarifications(scan);\n scan = applyClarifications(scan, clarifications);\n\n // Ask what to generate\n const tools = await selectTools();\n\n // Ask strictness level\n const strictness = await selectStrictness();\n\n // Ask hook profile\n const hookProfile = await selectHookProfile();\n\n // Load custom fragments\n const customFragments = loadCustomFragments(projectDir);\n\n // Ask conflict resolution strategy\n const conflict = await selectConflictStrategy(projectDir);\n\n // Generate files\n logSection('Generating Files');\n const results = await generate(projectDir, scan, tools, conflict, {\n strictness,\n customFragments,\n hookProfile,\n });\n\n // Summary\n logSection('Setup Complete');\n if (results.claudeMd) logSuccess(`CLAUDE.md generated`);\n if (results.cursorRules) logSuccess(`.cursorrules generated`);\n if (results.cursorMdcFiles > 0)\n logSuccess(`${results.cursorMdcFiles} .cursor/rules/*.mdc files generated`);\n if (results.commands.length > 0)\n logSuccess(`${results.commands.length} skills generated (.claude/skills/ + .cursor/skills/)`);\n if (results.agents.length > 0)\n logSuccess(`${results.agents.length} agents generated (.claude/agents/)`);\n if (results.contexts.length > 0)\n logSuccess(`${results.contexts.length} context modes generated (.claude/contexts/)`);\n if (results.hooks)\n logSuccess(`Hooks configured (.claude/settings.local.json) — profile: ${hookProfile}`);\n if (results.guides.length > 0)\n logSuccess(`${results.guides.length} guides added to ai-kit/guides/`);\n if (results.docs.length > 0)\n logSuccess(`${results.docs.length} doc scaffolds created in docs/`);\n\n // Recommended tools & MCP servers\n showRecommendations(scan);\n\n console.log('');\n logInfo('Run `ai-kit update` anytime to refresh configs after project changes.');\n logInfo('Run `ai-kit audit` to check your AI agent configuration health.');\n logInfo('Check ai-kit/guides/getting-started.md to get started.');\n}\n\nfunction formatFramework(scan: ProjectScan): string {\n if (scan.framework === 'nextjs') {\n const version = scan.nextjsVersion ? ` ${scan.nextjsVersion}` : '';\n const router = scan.routerType ? ` (${scan.routerType} router)` : '';\n return `Next.js${version}${router}`;\n }\n return scan.framework;\n}\n\nasync function askClarifications(scan: ProjectScan): Promise<ClarificationAnswer> {\n const answers: ClarificationAnswer = {};\n\n // If Next.js detected but router type unclear\n if (scan.framework === 'nextjs' && !scan.routerType) {\n answers.routerType = await select({\n message: 'Which Next.js router does this project use?',\n choices: [\n { name: 'App Router (app/ directory)', value: 'app' as const },\n { name: 'Pages Router (pages/ directory)', value: 'pages' as const },\n { name: 'Both (hybrid)', value: 'hybrid' as const },\n ],\n });\n }\n\n return answers;\n}\n\nfunction applyClarifications(\n scan: ProjectScan,\n clarifications: ClarificationAnswer,\n): ProjectScan {\n return {\n ...scan,\n ...(clarifications.routerType && { routerType: clarifications.routerType }),\n ...(clarifications.cms && { cms: clarifications.cms }),\n };\n}\n\nasync function selectTools(): Promise<{ claude: boolean; cursor: boolean }> {\n const tool = await select({\n message: 'Which AI tools does this project use?',\n choices: [\n { name: 'Both Claude Code & Cursor', value: 'both' },\n { name: 'Claude Code only', value: 'claude' },\n { name: 'Cursor only', value: 'cursor' },\n ],\n default: 'both',\n });\n\n return {\n claude: tool === 'both' || tool === 'claude',\n cursor: tool === 'both' || tool === 'cursor',\n };\n}\n\nasync function selectStrictness(): Promise<StrictnessLevel> {\n return select({\n message: 'How strictly should AI enforce these rules?',\n choices: [\n { name: 'Standard — follow rules by default, use judgment for edge cases', value: 'standard' as const },\n { name: 'Strict — enforce all rules, no exceptions without approval', value: 'strict' as const },\n { name: 'Relaxed — rules are guidelines, prioritize shipping speed', value: 'relaxed' as const },\n ],\n default: 'standard',\n });\n}\n\nasync function selectHookProfile(): Promise<HookProfile> {\n return select({\n message: 'Hook automation profile (runs checks automatically as you code):',\n choices: [\n {\n name: 'Standard — auto-format + typecheck + console.log warnings',\n value: 'standard' as const,\n },\n {\n name: 'Strict — all standard hooks + ESLint + stop checks',\n value: 'strict' as const,\n },\n {\n name: 'Minimal — auto-format + git push safety only',\n value: 'minimal' as const,\n },\n ],\n default: 'standard',\n });\n}\n\nasync function selectConflictStrategy(\n projectDir: string,\n): Promise<ConflictResolution> {\n const hasExisting =\n fileExists(path.join(projectDir, GENERATED_FILES.claudeMd)) ||\n fileExists(path.join(projectDir, GENERATED_FILES.cursorRules));\n\n if (!hasExisting) return 'overwrite';\n\n return select({\n message: 'Existing AI config files detected. How should we handle conflicts?',\n choices: [\n {\n name: 'Overwrite — replace with fresh generated files',\n value: 'overwrite' as const,\n },\n {\n name: 'Skip — keep existing files, only add missing ones',\n value: 'skip' as const,\n },\n ],\n default: 'overwrite',\n });\n}\n\ninterface GenerateResult {\n claudeMd: boolean;\n cursorRules: boolean;\n cursorMdcFiles: number;\n commands: string[];\n agents: string[];\n contexts: string[];\n hooks: boolean;\n guides: string[];\n docs: string[];\n}\n\nasync function generate(\n projectDir: string,\n scan: ProjectScan,\n tools: { claude: boolean; cursor: boolean },\n conflict: ConflictResolution,\n opts?: {\n strictness?: StrictnessLevel;\n customFragments?: string[];\n hookProfile?: HookProfile;\n },\n): Promise<GenerateResult> {\n const result: GenerateResult = {\n claudeMd: false,\n cursorRules: false,\n cursorMdcFiles: 0,\n commands: [],\n agents: [],\n contexts: [],\n hooks: false,\n guides: [],\n docs: [],\n };\n\n // Generate CLAUDE.md\n if (tools.claude) {\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n if (conflict === 'overwrite' || !fileExists(claudeMdPath)) {\n const content = generateClaudeMd(scan, { strictness: opts?.strictness, customFragments: opts?.customFragments });\n await fs.writeFile(claudeMdPath, content, 'utf-8');\n result.claudeMd = true;\n } else {\n logWarning('CLAUDE.md exists, skipping');\n }\n\n // Copy skills (also generates legacy .claude/commands/)\n result.commands = await copySkills(projectDir);\n\n // Copy agents (scan-aware — conditional agents based on detected stack)\n result.agents = await copyAgents(projectDir, scan);\n\n // Copy context modes\n result.contexts = await copyContexts(projectDir);\n\n // Generate hooks in .claude/settings.local.json\n const hookProfile = opts?.hookProfile || 'standard';\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n const settingsLocal = generateSettingsLocal(scan, hookProfile);\n await fs.ensureDir(path.dirname(settingsLocalPath));\n await fs.writeJson(settingsLocalPath, settingsLocal, { spaces: 2 });\n result.hooks = true;\n }\n\n // Generate .cursorrules\n if (tools.cursor) {\n const cursorPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n if (conflict === 'overwrite' || !fileExists(cursorPath)) {\n const content = generateCursorRules(scan, { strictness: opts?.strictness, customFragments: opts?.customFragments });\n await fs.writeFile(cursorPath, content, 'utf-8');\n result.cursorRules = true;\n } else {\n logWarning('.cursorrules exists, skipping');\n }\n\n // Generate .cursor/rules/*.mdc files\n const mdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n await fs.ensureDir(mdcDir);\n const mdcFiles = generateMdcFiles(scan);\n for (const mdc of mdcFiles) {\n await fs.writeFile(path.join(mdcDir, mdc.filename), mdc.content, 'utf-8');\n }\n result.cursorMdcFiles = mdcFiles.length;\n }\n\n // Copy guides\n result.guides = await copyGuides(projectDir);\n\n // Scaffold docs\n result.docs = await scaffoldDocs(projectDir);\n\n // Write ai-kit config\n const templates = [];\n if (result.claudeMd) templates.push('CLAUDE.md');\n if (result.cursorRules) templates.push('.cursorrules');\n\n const config = generateConfig(scan, templates, result.commands, result.guides, {\n strictness: opts?.strictness,\n customFragments: opts?.customFragments,\n agents: result.agents,\n contexts: result.contexts,\n hooks: result.hooks,\n hookProfile: opts?.hookProfile,\n });\n await fs.writeJson(\n path.join(projectDir, AI_KIT_CONFIG_FILE),\n config,\n { spaces: 2 },\n );\n\n return result;\n}\n\nfunction showRecommendations(scan: ProjectScan): void {\n const toolRecs: { check: boolean; label: string; hint: string }[] = [\n {\n check: scan.tools.playwright,\n label: 'Playwright not detected — install for E2E testing:',\n hint: ' npm install -D @playwright/test && npx playwright install',\n },\n {\n check: scan.tools.eslint,\n label: 'ESLint not detected — install for code quality:',\n hint: ' npm install -D eslint @typescript-eslint/eslint-plugin',\n },\n {\n check: scan.tools.prettier || scan.tools.biome,\n label: 'No formatter detected — install Prettier or Biome for auto-formatting hooks:',\n hint: ' npm install -D prettier (or) npm install -D @biomejs/biome',\n },\n {\n check: scan.tools.axeCore,\n label: 'axe-core not detected — install for accessibility testing:',\n hint: ' npm install -D @axe-core/playwright',\n },\n {\n check: scan.tools.knip,\n label: 'Knip not detected — install to find unused code:',\n hint: ' npm install -D knip',\n },\n {\n check: scan.tools.bundleAnalyzer,\n label: 'Bundle analyzer not detected — install for bundle insights:',\n hint: ' npm install -D @next/bundle-analyzer',\n },\n ];\n\n const mcpRecs: { check: boolean; label: string; hint: string }[] = [\n {\n check: scan.mcpServers.context7,\n label: 'Context7 MCP not configured — enables up-to-date library docs:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.playwright,\n label: 'Playwright MCP not configured — enables browser automation:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.github,\n label: 'GitHub MCP not configured — enables PR/issue management:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.perplexity,\n label: 'Perplexity MCP not configured — enables web research:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n ];\n\n const missingTools = toolRecs.filter((r) => !r.check);\n const missingMcps = mcpRecs.filter((r) => !r.check);\n\n if (missingTools.length === 0 && missingMcps.length === 0) return;\n\n logSection('Recommended Setup');\n\n for (const rec of missingTools) {\n logInfo(rec.label);\n logInfo(rec.hint);\n }\n\n for (const rec of missingMcps) {\n logInfo(rec.label);\n logInfo(rec.hint);\n }\n}\n","import path from 'path';\nimport { readJsonSafe } from '../utils.js';\nimport { detectNextjs } from './nextjs.js';\nimport { detectSitecore } from './sitecore.js';\nimport { detectStyling } from './styling.js';\nimport { detectTypescript } from './typescript.js';\nimport { detectMonorepo } from './monorepo.js';\nimport { detectPackageManager } from './package-manager.js';\nimport { detectFigma } from './figma.js';\nimport { detectTools } from './tools.js';\nimport { detectMcpServers } from './mcp.js';\nimport type { ProjectScan } from '../types.js';\n\nexport async function scanProject(projectPath: string): Promise<ProjectScan> {\n const pkgPath = path.join(projectPath, 'package.json');\n const pkg = readJsonSafe<Record<string, unknown>>(pkgPath) || {};\n\n const scripts = (pkg.scripts as Record<string, string>) || {};\n const projectName =\n (pkg.name as string) || path.basename(projectPath);\n\n const nextjsResult = detectNextjs(projectPath, pkg);\n const sitecoreResult = detectSitecore(pkg);\n const stylingResult = detectStyling(projectPath, pkg);\n const tsResult = detectTypescript(projectPath);\n const monorepoResult = detectMonorepo(projectPath, pkg);\n const packageManager = detectPackageManager(projectPath);\n const figmaResult = detectFigma(projectPath, pkg);\n const toolsResult = detectTools(projectPath, pkg);\n const mcpResult = detectMcpServers(projectPath);\n\n const figmaDetected =\n figmaResult.figmaMcp ||\n figmaResult.figmaCodeCli ||\n figmaResult.designTokens;\n\n return {\n ...nextjsResult,\n ...sitecoreResult,\n ...stylingResult,\n ...tsResult,\n ...monorepoResult,\n figma: {\n detected: figmaDetected,\n ...figmaResult,\n },\n tools: toolsResult,\n mcpServers: mcpResult,\n packageManager,\n projectName,\n projectPath,\n scripts,\n };\n}\n\nexport {\n detectNextjs,\n detectSitecore,\n detectStyling,\n detectTypescript,\n detectMonorepo,\n detectPackageManager,\n detectFigma,\n detectTools,\n detectMcpServers,\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\n\nexport function readJsonSafe<T = Record<string, unknown>>(\n filePath: string,\n): T | null {\n try {\n return fs.readJsonSync(filePath) as T;\n } catch {\n return null;\n }\n}\n\nexport function fileExists(filePath: string): boolean {\n return fs.existsSync(filePath);\n}\n\nexport function dirExists(dirPath: string): boolean {\n try {\n return fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function readFileSafe(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function logSuccess(message: string): void {\n console.log(chalk.green('✓') + ' ' + message);\n}\n\nexport function logWarning(message: string): void {\n console.log(chalk.yellow('⚠') + ' ' + message);\n}\n\nexport function logError(message: string): void {\n console.log(chalk.red('✗') + ' ' + message);\n}\n\nexport function logInfo(message: string): void {\n console.log(chalk.blue('ℹ') + ' ' + message);\n}\n\nexport function logSection(title: string): void {\n console.log('\\n' + chalk.bold.underline(title));\n}\n\nexport function getRelativePath(from: string, to: string): string {\n return path.relative(from, to);\n}\n\nconst AI_KIT_START = '<!-- AI-KIT:START -->';\nconst AI_KIT_END = '<!-- AI-KIT:END -->';\n\nexport function mergeWithMarkers(\n existingContent: string,\n newGenerated: string,\n): string {\n const startIdx = existingContent.indexOf(AI_KIT_START);\n const endIdx = existingContent.indexOf(AI_KIT_END);\n\n if (startIdx === -1 || endIdx === -1) {\n // No markers found — file was generated before markers existed.\n // Replace entirely with new content (which includes markers).\n return newGenerated;\n }\n\n const before = existingContent.substring(0, startIdx);\n const after = existingContent.substring(endIdx + AI_KIT_END.length);\n\n return `${before}${newGenerated}${after}`;\n}\n","import path from 'path';\nimport { dirExists, readJsonSafe } from '../utils.js';\n\ninterface NextjsResult {\n framework: 'nextjs' | 'react' | 'unknown';\n nextjsVersion?: string;\n routerType?: 'app' | 'pages' | 'hybrid';\n}\n\nexport function detectNextjs(\n projectPath: string,\n pkg: Record<string, unknown>,\n): NextjsResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n if (!deps.next) {\n if (deps.react) return { framework: 'react' };\n return { framework: 'unknown' };\n }\n\n const nextjsVersion = deps.next.replace(/[\\^~>=<]/g, '');\n\n const hasAppDir =\n dirExists(path.join(projectPath, 'app')) ||\n dirExists(path.join(projectPath, 'src', 'app'));\n\n const hasPagesDir =\n dirExists(path.join(projectPath, 'pages')) ||\n dirExists(path.join(projectPath, 'src', 'pages'));\n\n let routerType: 'app' | 'pages' | 'hybrid' | undefined;\n if (hasAppDir && hasPagesDir) routerType = 'hybrid';\n else if (hasAppDir) routerType = 'app';\n else if (hasPagesDir) routerType = 'pages';\n\n return { framework: 'nextjs', nextjsVersion, routerType };\n}\n","interface SitecoreResult {\n cms: 'sitecore-xmc-v2' | 'sitecore-xmc' | 'sitecore-jss' | 'none';\n sitecorejssVersion?: string;\n sitecoreContentSdkVersion?: string;\n}\n\nexport function detectSitecore(pkg: Record<string, unknown>): SitecoreResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const jssNextjs = deps['@sitecore-jss/sitecore-jss-nextjs'];\n const jssReact = deps['@sitecore-jss/sitecore-jss-react'];\n const contentSdk = deps['@sitecore-content-sdk/nextjs'];\n\n // Content SDK v2.x — newer XM Cloud projects\n if (contentSdk) {\n const version = contentSdk.replace(/[\\^~>=<]/g, '');\n return {\n cms: 'sitecore-xmc-v2',\n sitecoreContentSdkVersion: version || undefined,\n };\n }\n\n // JSS-based XM Cloud projects\n if (jssNextjs) {\n const version = jssNextjs.replace(/[\\^~>=<]/g, '');\n return { cms: 'sitecore-xmc', sitecorejssVersion: version || undefined };\n }\n\n if (jssReact) {\n const version = jssReact.replace(/[\\^~>=<]/g, '');\n return { cms: 'sitecore-jss', sitecorejssVersion: version || undefined };\n }\n\n return { cms: 'none' };\n}\n","import path from 'path';\nimport { fileExists } from '../utils.js';\n\ntype StylingTool = 'tailwind' | 'css-modules' | 'styled-components' | 'scss';\n\ninterface StylingResult {\n styling: StylingTool[];\n tailwindVersion?: string;\n}\n\nexport function detectStyling(\n projectPath: string,\n pkg: Record<string, unknown>,\n): StylingResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const styling: StylingTool[] = [];\n let tailwindVersion: string | undefined;\n\n if (deps.tailwindcss || deps['@tailwindcss/postcss']) {\n styling.push('tailwind');\n tailwindVersion = (deps.tailwindcss || deps['@tailwindcss/postcss'] || '')\n .replace(/[\\^~>=<]/g, '');\n }\n\n const hasTailwindConfig =\n fileExists(path.join(projectPath, 'tailwind.config.js')) ||\n fileExists(path.join(projectPath, 'tailwind.config.ts')) ||\n fileExists(path.join(projectPath, 'tailwind.config.mjs'));\n\n if (hasTailwindConfig && !styling.includes('tailwind')) {\n styling.push('tailwind');\n }\n\n if (deps['styled-components']) styling.push('styled-components');\n if (deps.sass || deps['node-sass']) styling.push('scss');\n\n return {\n styling,\n tailwindVersion: tailwindVersion || undefined,\n };\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe } from '../utils.js';\n\ninterface TypescriptResult {\n typescript: boolean;\n typescriptStrict?: boolean;\n}\n\nexport function detectTypescript(projectPath: string): TypescriptResult {\n const tsconfigPath = path.join(projectPath, 'tsconfig.json');\n\n if (!fileExists(tsconfigPath)) {\n return { typescript: false };\n }\n\n const tsconfig = readJsonSafe<{\n compilerOptions?: { strict?: boolean };\n }>(tsconfigPath);\n\n return {\n typescript: true,\n typescriptStrict: tsconfig?.compilerOptions?.strict ?? false,\n };\n}\n","import path from 'path';\nimport { fileExists } from '../utils.js';\n\ntype MonorepoTool = 'turborepo' | 'nx' | 'lerna' | 'pnpm-workspaces';\n\ninterface MonorepoResult {\n monorepo: boolean;\n monorepoTool?: MonorepoTool;\n}\n\nexport function detectMonorepo(\n projectPath: string,\n pkg: Record<string, unknown>,\n): MonorepoResult {\n if (fileExists(path.join(projectPath, 'turbo.json'))) {\n return { monorepo: true, monorepoTool: 'turborepo' };\n }\n\n if (fileExists(path.join(projectPath, 'nx.json'))) {\n return { monorepo: true, monorepoTool: 'nx' };\n }\n\n if (fileExists(path.join(projectPath, 'lerna.json'))) {\n return { monorepo: true, monorepoTool: 'lerna' };\n }\n\n if (fileExists(path.join(projectPath, 'pnpm-workspace.yaml'))) {\n return { monorepo: true, monorepoTool: 'pnpm-workspaces' };\n }\n\n if (pkg.workspaces) {\n return { monorepo: true };\n }\n\n return { monorepo: false };\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe } from '../utils.js';\n\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport function detectPackageManager(projectPath: string): PackageManager {\n const pkg = readJsonSafe<{ packageManager?: string }>(\n path.join(projectPath, 'package.json'),\n );\n\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n return 'npm';\n }\n\n if (fileExists(path.join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fileExists(path.join(projectPath, 'yarn.lock'))) return 'yarn';\n if (fileExists(path.join(projectPath, 'bun.lockb'))) return 'bun';\n if (fileExists(path.join(projectPath, 'bun.lock'))) return 'bun';\n\n return 'npm';\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe, readFileSafe } from '../utils.js';\n\nexport interface FigmaDetection {\n figmaMcp: boolean;\n figmaCodeCli: boolean;\n designTokens: boolean;\n tokenFormat: 'tailwind-v4' | 'tailwind-v3' | 'css-variables' | 'none';\n visualTests: boolean;\n}\n\nexport function detectFigma(\n projectPath: string,\n pkg: Record<string, unknown>,\n): FigmaDetection {\n return {\n figmaMcp: detectFigmaMcp(projectPath),\n figmaCodeCli: detectFigmaCodeCli(pkg),\n designTokens: detectDesignTokens(projectPath),\n tokenFormat: detectTokenFormat(projectPath),\n visualTests: detectVisualTests(projectPath, pkg),\n };\n}\n\nfunction detectFigmaMcp(projectPath: string): boolean {\n // Check .claude/settings.json or .claude/settings.local.json for Figma MCP\n const settingsPaths = [\n path.join(projectPath, '.claude', 'settings.json'),\n path.join(projectPath, '.claude', 'settings.local.json'),\n path.join(projectPath, '.mcp.json'),\n ];\n\n for (const settingsPath of settingsPaths) {\n const content = readFileSafe(settingsPath);\n if (content && content.toLowerCase().includes('figma')) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction detectFigmaCodeCli(pkg: Record<string, unknown>): boolean {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n return Object.keys(deps).some(\n (dep) => dep.startsWith('@figma-code/') || dep === 'figma-code-cli',\n );\n}\n\nfunction detectDesignTokens(projectPath: string): boolean {\n const tokenPaths = [\n path.join(projectPath, 'tokens.json'),\n path.join(projectPath, 'tokens'),\n path.join(projectPath, 'design-tokens.json'),\n path.join(projectPath, 'src', 'tokens'),\n ];\n\n for (const tokenPath of tokenPaths) {\n if (fileExists(tokenPath)) return true;\n }\n\n // Check for @theme inline in globals.css\n const globalsCss = readFileSafe(\n path.join(projectPath, 'src', 'app', 'globals.css'),\n );\n if (globalsCss && globalsCss.includes('@theme')) return true;\n\n return false;\n}\n\nfunction detectTokenFormat(\n projectPath: string,\n): FigmaDetection['tokenFormat'] {\n // Check for Tailwind v4 @theme inline\n const globalsCss = readFileSafe(\n path.join(projectPath, 'src', 'app', 'globals.css'),\n );\n if (globalsCss && globalsCss.includes('@theme')) return 'tailwind-v4';\n\n // Check for Tailwind v3 config with custom theme\n const twConfigPaths = [\n path.join(projectPath, 'tailwind.config.ts'),\n path.join(projectPath, 'tailwind.config.js'),\n ];\n\n for (const twPath of twConfigPaths) {\n const content = readFileSafe(twPath);\n if (content && content.includes('theme')) return 'tailwind-v3';\n }\n\n // Check for raw CSS variables\n if (globalsCss && globalsCss.includes('--')) return 'css-variables';\n\n return 'none';\n}\n\nfunction detectVisualTests(\n projectPath: string,\n pkg: Record<string, unknown>,\n): boolean {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const hasPlaywright = '@playwright/test' in deps || 'playwright' in deps;\n const hasPlaywrightConfig =\n fileExists(path.join(projectPath, 'playwright.config.ts')) ||\n fileExists(path.join(projectPath, 'playwright.config.js'));\n\n return hasPlaywright || hasPlaywrightConfig;\n}\n","import path from 'path';\nimport { fileExists, dirExists } from '../utils.js';\n\nexport interface ToolsDetection {\n playwright: boolean;\n storybook: boolean;\n eslint: boolean;\n prettier: boolean;\n biome: boolean;\n axeCore: boolean;\n snyk: boolean;\n knip: boolean;\n bundleAnalyzer: boolean;\n}\n\nexport function detectTools(\n projectPath: string,\n pkg: Record<string, unknown>,\n): ToolsDetection {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n return {\n playwright: detectPlaywright(projectPath, deps),\n storybook: detectStorybook(projectPath, deps),\n eslint: detectEslint(projectPath, deps),\n prettier: detectPrettier(projectPath, deps),\n biome: detectBiome(projectPath, deps),\n axeCore: detectAxeCore(deps),\n snyk: detectSnyk(projectPath, deps),\n knip: detectKnip(projectPath, deps),\n bundleAnalyzer: detectBundleAnalyzer(deps),\n };\n}\n\nfunction detectPlaywright(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@playwright/test' in deps) return true;\n if (fileExists(path.join(projectPath, 'playwright.config.ts'))) return true;\n if (fileExists(path.join(projectPath, 'playwright.config.js'))) return true;\n return false;\n}\n\nfunction detectStorybook(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@storybook/react' in deps) return true;\n if (dirExists(path.join(projectPath, '.storybook'))) return true;\n return false;\n}\n\nfunction detectEslint(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('eslint' in deps) return true;\n const eslintConfigs = [\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n ];\n for (const config of eslintConfigs) {\n if (fileExists(path.join(projectPath, config))) return true;\n }\n return false;\n}\n\nfunction detectPrettier(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('prettier' in deps) return true;\n const prettierConfigs = [\n '.prettierrc',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettierrc.json',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n '.prettierrc.toml',\n 'prettier.config.js',\n 'prettier.config.cjs',\n 'prettier.config.ts',\n ];\n for (const config of prettierConfigs) {\n if (fileExists(path.join(projectPath, config))) return true;\n }\n return false;\n}\n\nfunction detectBiome(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@biomejs/biome' in deps) return true;\n if (fileExists(path.join(projectPath, 'biome.json'))) return true;\n if (fileExists(path.join(projectPath, 'biome.jsonc'))) return true;\n return false;\n}\n\nfunction detectAxeCore(deps: Record<string, string>): boolean {\n return '@axe-core/playwright' in deps || 'axe-core' in deps;\n}\n\nfunction detectSnyk(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('snyk' in deps) return true;\n if (fileExists(path.join(projectPath, '.snyk'))) return true;\n return false;\n}\n\nfunction detectKnip(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('knip' in deps) return true;\n if (fileExists(path.join(projectPath, 'knip.json'))) return true;\n if (fileExists(path.join(projectPath, 'knip.config.ts'))) return true;\n return false;\n}\n\nfunction detectBundleAnalyzer(deps: Record<string, string>): boolean {\n return '@next/bundle-analyzer' in deps;\n}\n","import path from 'path';\nimport { readFileSafe } from '../utils.js';\n\nexport interface McpDetection {\n playwright: boolean;\n figma: boolean;\n github: boolean;\n context7: boolean;\n perplexity: boolean;\n}\n\nexport function detectMcpServers(projectPath: string): McpDetection {\n const settingsPaths = [\n path.join(projectPath, '.claude', 'settings.json'),\n path.join(projectPath, '.claude', 'settings.local.json'),\n path.join(projectPath, '.mcp.json'),\n ];\n\n // Combine all MCP config file contents for searching\n let combined = '';\n for (const settingsPath of settingsPaths) {\n const content = readFileSafe(settingsPath);\n if (content) {\n combined += content.toLowerCase() + '\\n';\n }\n }\n\n return {\n playwright: combined.includes('playwright'),\n figma: combined.includes('figma'),\n github: combined.includes('github'),\n context7: combined.includes('context7'),\n perplexity: combined.includes('perplexity'),\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { TEMPLATES_DIR, VERSION } from '../constants.js';\nimport { readFileSafe } from '../utils.js';\n\nexport function readTemplate(relativePath: string): string {\n const fullPath = path.join(TEMPLATES_DIR, relativePath);\n const content = readFileSafe(fullPath);\n if (!content) {\n throw new Error(`Template not found: ${relativePath}`);\n }\n return content.trim();\n}\n\nexport function loadCustomFragments(projectPath: string): string[] {\n const customDir = path.join(projectPath, '.ai-kit', 'fragments');\n if (!fs.existsSync(customDir)) return [];\n\n try {\n const files = fs.readdirSync(customDir).filter((f: string) => f.endsWith('.md'));\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(customDir, f), 'utf-8');\n return content.trim();\n }).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function assembleTemplate(\n subfolder: 'claude-md' | 'cursorrules',\n fragments: string[],\n variables: Record<string, string>,\n options?: { customFragments?: string[]; strictness?: string },\n): string {\n const versionComment = `<!-- Generated by ai-kit v${VERSION} -->`;\n const header = readTemplate('header.md');\n const body = fragments\n .map((name) => readTemplate(`${subfolder}/${name}.md`))\n .join('\\n\\n---\\n\\n');\n\n // Append strictness note\n const strictnessNote = options?.strictness && options.strictness !== 'standard'\n ? `\\n\\n---\\n\\n> **Strictness Level: ${options.strictness}**\\n> ${getStrictnessDescription(options.strictness)}`\n : '';\n\n // Append custom fragments\n const customSection = options?.customFragments?.length\n ? '\\n\\n---\\n\\n' + options.customFragments.join('\\n\\n---\\n\\n')\n : '';\n\n const full = `${versionComment}\\n${header}\\n\\n---\\n\\n${body}${strictnessNote}${customSection}`;\n const replaced = replacePlaceholders(full, variables);\n return `<!-- AI-KIT:START -->\\n${replaced}\\n<!-- AI-KIT:END -->`;\n}\n\nfunction getStrictnessDescription(level: string): string {\n switch (level) {\n case 'strict':\n return 'Enforce all rules strictly. No exceptions without explicit approval. All PRs must pass every check. Zero tolerance for `any` types, missing tests, or accessibility gaps.';\n case 'relaxed':\n return 'Rules are guidelines, not hard requirements. Prioritize shipping speed over perfection. Skip non-critical checks when under time pressure. Use best judgment.';\n default:\n return 'Standard enforcement. Follow rules by default, use judgment for edge cases.';\n }\n}\n\nexport function replacePlaceholders(\n content: string,\n variables: Record<string, string>,\n): string {\n let result = content;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, value);\n }\n return result;\n}\n","import type { ProjectScan, StrictnessLevel } from '../types.js';\nimport { assembleTemplate } from './assembler.js';\n\nexport function selectFragments(scan: ProjectScan): string[] {\n const fragments: string[] = ['base'];\n\n if (scan.framework === 'nextjs') {\n if (scan.routerType === 'app' || scan.routerType === 'hybrid') {\n fragments.push('nextjs-app-router');\n }\n if (scan.routerType === 'pages' || scan.routerType === 'hybrid') {\n fragments.push('nextjs-pages-router');\n }\n }\n\n if (scan.cms !== 'none') {\n fragments.push('sitecore-xmc');\n }\n\n if (scan.styling.includes('tailwind')) {\n fragments.push('tailwind');\n }\n\n if (scan.typescript) {\n fragments.push('typescript');\n }\n\n if (scan.monorepo) {\n fragments.push('monorepo');\n }\n\n if (scan.figma?.detected) {\n fragments.push('figma');\n }\n\n return fragments;\n}\n\nexport function generateClaudeMd(\n scan: ProjectScan,\n options?: { strictness?: StrictnessLevel; customFragments?: string[] },\n): string {\n const fragments = selectFragments(scan);\n const variables = buildVariables(scan);\n return assembleTemplate('claude-md', fragments, variables, {\n customFragments: options?.customFragments,\n strictness: options?.strictness,\n });\n}\n\nfunction buildVariables(scan: ProjectScan): Record<string, string> {\n const techStack: string[] = [];\n\n if (scan.framework === 'nextjs') {\n techStack.push(`Next.js ${scan.nextjsVersion || ''}`);\n }\n if (scan.cms !== 'none') {\n if (scan.cms === 'sitecore-xmc-v2') {\n techStack.push(\n `Sitecore XM Cloud${scan.sitecoreContentSdkVersion ? ` (Content SDK ${scan.sitecoreContentSdkVersion})` : ' (Content SDK v2)'}`,\n );\n } else if (scan.cms === 'sitecore-xmc') {\n techStack.push(\n `Sitecore XM Cloud${scan.sitecorejssVersion ? ` (JSS ${scan.sitecorejssVersion})` : ''}`,\n );\n } else {\n techStack.push('Sitecore JSS');\n }\n }\n if (scan.typescript) techStack.push('TypeScript');\n if (scan.styling.includes('tailwind'))\n techStack.push(`Tailwind CSS ${scan.tailwindVersion || ''}`);\n if (scan.styling.includes('scss')) techStack.push('SCSS');\n if (scan.styling.includes('styled-components'))\n techStack.push('styled-components');\n if (scan.monorepo && scan.monorepoTool)\n techStack.push(scan.monorepoTool);\n\n const scripts = Object.entries(scan.scripts)\n .filter(([key]) =>\n ['dev', 'build', 'start', 'lint', 'test', 'type-check', 'typecheck'].includes(key),\n )\n .map(([key, value]) => `- \\`${scan.packageManager} run ${key}\\` → \\`${value}\\``)\n .join('\\n');\n\n return {\n projectName: scan.projectName,\n techStack: techStack.join(' · '),\n packageManager: scan.packageManager,\n routerType: scan.routerType || 'unknown',\n scripts: scripts || '- No scripts detected',\n framework: scan.framework,\n };\n}\n","import type { ProjectScan, StrictnessLevel } from '../types.js';\nimport { assembleTemplate } from './assembler.js';\nimport { selectFragments } from './claude-md.js';\n\nexport function generateCursorRules(\n scan: ProjectScan,\n options?: { strictness?: StrictnessLevel; customFragments?: string[] },\n): string {\n const fragments = selectFragments(scan);\n const variables = buildCursorVariables(scan);\n return assembleTemplate('cursorrules', fragments, variables, {\n customFragments: options?.customFragments,\n strictness: options?.strictness,\n });\n}\n\nexport function buildCursorVariables(scan: ProjectScan): Record<string, string> {\n const techStack: string[] = [];\n\n if (scan.framework === 'nextjs') {\n techStack.push(`Next.js ${scan.nextjsVersion || ''}`);\n }\n if (scan.cms !== 'none') {\n techStack.push(\n scan.cms === 'sitecore-xmc-v2' || scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : 'Sitecore JSS',\n );\n }\n if (scan.typescript) techStack.push('TypeScript');\n if (scan.styling.includes('tailwind')) techStack.push('Tailwind CSS');\n if (scan.monorepo && scan.monorepoTool) techStack.push(scan.monorepoTool);\n\n const scripts = Object.entries(scan.scripts)\n .filter(([key]) =>\n ['dev', 'build', 'start', 'lint', 'test', 'type-check', 'typecheck'].includes(key),\n )\n .map(([key, value]) => `- \\`${scan.packageManager} run ${key}\\` → \\`${value}\\``)\n .join('\\n');\n\n return {\n projectName: scan.projectName,\n techStack: techStack.join(' · '),\n packageManager: scan.packageManager,\n routerType: scan.routerType || 'unknown',\n scripts: scripts || '- No scripts detected',\n framework: scan.framework,\n };\n}\n","import type { ProjectScan } from '../types.js';\nimport { selectFragments } from './claude-md.js';\nimport { readTemplate, replacePlaceholders } from './assembler.js';\nimport { buildCursorVariables } from './cursorrules.js';\nimport { VERSION } from '../constants.js';\n\nexport interface MdcFile {\n filename: string;\n content: string;\n}\n\nconst MDC_CONFIG: Record<string, { description: string; globs: string }> = {\n base: {\n description: 'Project coding standards and conventions',\n globs: '**/*',\n },\n 'nextjs-app-router': {\n description: 'Next.js App Router patterns and best practices',\n globs: 'app/**/*.{ts,tsx}, src/app/**/*.{ts,tsx}',\n },\n 'nextjs-pages-router': {\n description: 'Next.js Pages Router patterns and best practices',\n globs: 'pages/**/*.{ts,tsx}, src/pages/**/*.{ts,tsx}',\n },\n 'sitecore-xmc': {\n description: 'Sitecore XM Cloud component patterns and field helpers',\n globs: 'src/components/**/*.{ts,tsx}',\n },\n tailwind: {\n description: 'Tailwind CSS conventions and utility patterns',\n globs: '**/*.{tsx,jsx,css}',\n },\n typescript: {\n description: 'TypeScript strict typing conventions',\n globs: '**/*.{ts,tsx}',\n },\n monorepo: {\n description: 'Monorepo workspace conventions',\n globs: '**/*',\n },\n figma: {\n description: 'Figma-to-code workflow and design token rules',\n globs: 'src/components/**/*.{ts,tsx}, tokens/**/*',\n },\n};\n\nexport function generateMdcFiles(scan: ProjectScan): MdcFile[] {\n const fragments = selectFragments(scan);\n const variables = buildCursorVariables(scan);\n\n return fragments.map((fragment) => {\n const config = MDC_CONFIG[fragment] || {\n description: fragment,\n globs: '**/*',\n };\n const body = readTemplate(`cursorrules/${fragment}.md`);\n const replaced = replacePlaceholders(body, variables);\n\n const frontmatter = [\n '---',\n `description: ${config.description}`,\n `globs: ${config.globs}`,\n 'alwaysApply: true',\n '---',\n ].join('\\n');\n\n return {\n filename: `${fragment}.mdc`,\n content: `${frontmatter}\\n\\n<!-- Generated by ai-kit v${VERSION} -->\\n\\n${replaced}`,\n };\n });\n}\n","import type { AiKitConfig, ProjectScan, StrictnessLevel, HookProfile } from '../types.js';\nimport { VERSION } from '../constants.js';\n\nexport function generateConfig(\n scan: ProjectScan,\n templates: string[],\n commands: string[],\n guides: string[],\n options?: {\n strictness?: StrictnessLevel;\n customFragments?: string[];\n agents?: string[];\n contexts?: string[];\n hooks?: boolean;\n hookProfile?: HookProfile;\n },\n): AiKitConfig {\n return {\n version: VERSION,\n scanResult: scan,\n generatedAt: new Date().toISOString(),\n templates,\n commands,\n guides,\n agents: options?.agents || [],\n contexts: options?.contexts || [],\n hooks: options?.hooks || false,\n hookProfile: options?.hookProfile || 'standard',\n strictness: options?.strictness || 'standard',\n customFragments: options?.customFragments || [],\n };\n}\n","import type { ProjectScan, HooksConfig, HookDefinition, HookProfile } from '../types.js';\n\nexport function generateHooks(\n scan: ProjectScan,\n profile: HookProfile = 'standard',\n): HooksConfig {\n const hooks: HooksConfig = {};\n\n const preToolUse: HookDefinition[] = [];\n const postToolUse: HookDefinition[] = [];\n const stop: HookDefinition[] = [];\n\n // --- PreToolUse hooks ---\n\n // Git push safety reminder (all profiles)\n preToolUse.push({\n matcher: 'Bash(git push*)',\n hooks: [\n {\n type: 'command',\n command:\n 'echo \"⚠️ Review your changes before pushing. Run tests and type-check first.\"',\n },\n ],\n });\n\n // --- PostToolUse hooks ---\n\n // Auto-format on file edit\n if (scan.tools.biome) {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: `npx @biomejs/biome check --write --unsafe \"$CLAUDE_FILE_PATH\" 2>/dev/null || true`,\n },\n ],\n });\n } else if (scan.tools.prettier) {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: `npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true`,\n },\n ],\n });\n }\n\n // TypeScript type-check after edits (standard + strict)\n if (scan.typescript && profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx) npx tsc --noEmit --pretty 2>&1 | head -20 ;; esac',\n },\n ],\n });\n }\n\n // ESLint check after edits (strict only)\n if (scan.tools.eslint && profile === 'strict') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx|*.js|*.jsx) npx eslint \"$CLAUDE_FILE_PATH\" --max-warnings 0 2>&1 | head -15 ;; esac',\n },\n ],\n });\n }\n\n // Console.log warning (standard + strict)\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx|*.js|*.jsx) grep -n \"console\\\\.log\" \"$CLAUDE_FILE_PATH\" && echo \"⚠️ console.log detected — remove before committing\" || true ;; esac',\n },\n ],\n });\n }\n\n // --- Bundle Impact Warning ---\n // Warns when new dependencies are added (standard + strict)\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: [\n 'case \"$CLAUDE_FILE_PATH\" in',\n ' */package.json)',\n ' ADDED=$(git diff --no-index /dev/null \"$CLAUDE_FILE_PATH\" 2>/dev/null | grep \"^+\" | grep -E \\'\"dependencies\"|\"devDependencies\"\\' | head -1)',\n ' if [ -n \"$ADDED\" ]; then',\n ' NEW_DEPS=$(git diff \"$CLAUDE_FILE_PATH\" 2>/dev/null | grep \"^+\" | grep -v \"^+++\" | grep -E \\'\"[^\"]+\": \"[^\"]+\"\\' | sed \\'s/.*\"\\\\([^\"]*\\\\)\".*/\\\\1/\\' | head -5)',\n ' if [ -n \"$NEW_DEPS\" ]; then',\n ' echo \"📦 New dependencies detected:\"',\n ' echo \"$NEW_DEPS\" | while read dep; do echo \" → $dep\"; done',\n ' echo \"⚠️ Check bundle impact before committing. Run: npx bundlesize or npm run build\"',\n ' fi',\n ' fi',\n ' ;;',\n 'esac',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Pre-Commit Review Hook ---\n // Lightweight review of staged changes before git commit (strict only)\n if (profile === 'strict') {\n preToolUse.push({\n matcher: 'Bash(git commit*)',\n hooks: [\n {\n type: 'command',\n command: [\n 'STAGED=$(git diff --cached --name-only 2>/dev/null | grep -E \"\\\\.(ts|tsx|js|jsx)$\")',\n 'if [ -n \"$STAGED\" ]; then',\n ' ISSUES=\"\"',\n ' for f in $STAGED; do',\n ' if [ -f \"$f\" ]; then',\n ' # Check for any types',\n ' ANY_COUNT=$(grep -c \": any\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$ANY_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $ANY_COUNT \\\\`any\\\\` type(s) found\"',\n ' fi',\n ' # Check for console.log',\n ' LOG_COUNT=$(grep -c \"console\\\\.log\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$LOG_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $LOG_COUNT console.log(s) found\"',\n ' fi',\n ' # Check for TODO without ticket',\n ' TODO_COUNT=$(grep -c \"// TODO[^(]\\\\|// TODO$\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$TODO_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $TODO_COUNT TODO(s) without ticket reference\"',\n ' fi',\n ' fi',\n ' done',\n ' if [ -n \"$ISSUES\" ]; then',\n ' echo \"🔍 Pre-commit review found issues:\"',\n ' printf \"$ISSUES\\\\n\"',\n ' echo \"Fix these before committing, or proceed if intentional.\"',\n ' fi',\n 'fi',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Mistakes Auto-Capture Hook ---\n // Captures build/lint/typecheck failures into docs/mistakes-log.md\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Bash',\n hooks: [\n {\n type: 'command',\n command: [\n 'if [ \"$CLAUDE_TOOL_EXIT_CODE\" != \"0\" ] && [ -n \"$CLAUDE_TOOL_EXIT_CODE\" ]; then',\n ' OUTPUT=\"$CLAUDE_TOOL_OUTPUT\"',\n ' IS_BUILD_ERROR=false',\n ' case \"$OUTPUT\" in',\n ' *\"error TS\"*|*\"tsc\"*) IS_BUILD_ERROR=true ;;',\n ' *\"ESLint\"*|*\"eslint\"*|*\"Lint error\"*) IS_BUILD_ERROR=true ;;',\n ' *\"Build error\"*|*\"build failed\"*|*\"ELIFECYCLE\"*) IS_BUILD_ERROR=true ;;',\n ' *\"Module not found\"*|*\"Cannot find module\"*) IS_BUILD_ERROR=true ;;',\n ' *\"SyntaxError\"*|*\"TypeError\"*) IS_BUILD_ERROR=true ;;',\n ' esac',\n ' if [ \"$IS_BUILD_ERROR\" = \"true\" ]; then',\n ' LOG_FILE=\"docs/mistakes-log.md\"',\n ' if [ -f \"$LOG_FILE\" ]; then',\n ' DATE=$(date +\"%Y-%m-%d %H:%M\")',\n ' ERROR_PREVIEW=$(echo \"$OUTPUT\" | grep -i \"error\" | head -3 | sed \"s/^/ /\")',\n ' {',\n ' echo \"\"',\n ' echo \"### $DATE — Build/lint failure (auto-captured)\"',\n ' echo \"- **What happened**: Command exited with code $CLAUDE_TOOL_EXIT_CODE\"',\n ' echo \"- **Error preview**:\"',\n ' echo \"\\\\`\\\\`\\\\`\"',\n ' echo \"$ERROR_PREVIEW\"',\n ' echo \"\\\\`\\\\`\\\\`\"',\n ' echo \"- **Root cause**: <!-- TODO: Fill in after investigating -->\"',\n ' echo \"- **Fix**: <!-- TODO: How was it resolved? -->\"',\n ' echo \"- **Lesson**: <!-- TODO: What to do differently -->\"',\n ' echo \"\"',\n ' echo \"---\"',\n ' } >> \"$LOG_FILE\"',\n ' echo \"📝 Mistake auto-logged to docs/mistakes-log.md\"',\n ' fi',\n ' fi',\n 'fi',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Stop hooks ---\n\n // Console.log check in all modified files (strict only)\n if (profile === 'strict') {\n stop.push({\n matcher: '',\n hooks: [\n {\n type: 'command',\n command:\n 'git diff --name-only --diff-filter=M 2>/dev/null | grep -E \"\\\\.(ts|tsx|js|jsx)$\" | xargs grep -l \"console\\\\.log\" 2>/dev/null && echo \"⚠️ console.log found in modified files\" || true',\n },\n ],\n });\n }\n\n if (preToolUse.length > 0) hooks.PreToolUse = preToolUse;\n if (postToolUse.length > 0) hooks.PostToolUse = postToolUse;\n if (stop.length > 0) hooks.Stop = stop;\n\n return hooks;\n}\n\nexport function generateSettingsLocal(\n scan: ProjectScan,\n profile: HookProfile = 'standard',\n): Record<string, unknown> {\n const hooks = generateHooks(scan, profile);\n\n return {\n hooks,\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { COMMANDS_DIR } from '../constants.js';\n\nconst AVAILABLE_SKILLS = [\n 'prompt-help',\n 'review',\n 'fix-bug',\n 'new-component',\n 'new-page',\n 'understand',\n 'test',\n 'optimize',\n 'figma-to-code',\n 'design-tokens',\n 'accessibility-audit',\n 'security-check',\n 'refactor',\n 'api-route',\n 'pre-pr',\n 'migrate',\n 'error-boundary',\n 'type-fix',\n 'extract-hook',\n 'dep-check',\n 'env-setup',\n 'commit-msg',\n 'sitecore-debug',\n 'responsive-check',\n 'document',\n 'token-tips',\n // New skills (v1.1.0)\n 'perf-audit',\n 'bundle-check',\n 'i18n-check',\n 'schema-gen',\n 'changelog',\n 'release',\n 'storybook-gen',\n // New skills (v1.2.0) — hooks, agents, sessions, orchestration\n 'search-first',\n 'quality-gate-check',\n 'server-action',\n 'middleware',\n 'save-session',\n 'resume-session',\n 'checkpoint',\n 'orchestrate',\n 'quality-gate',\n 'harness-audit',\n];\n\n// Short descriptions for auto-discovery — AI reads these to decide when to apply\nconst SKILL_DESCRIPTIONS: Record<string, string> = {\n 'prompt-help': 'Help developers write effective AI prompts with structured context',\n 'review': 'Deep code review following project coding standards',\n 'fix-bug': 'Systematic debugging workflow with root cause analysis and regression testing',\n 'new-component': 'Scaffold new React components with types, tests, and documentation',\n 'new-page': 'Scaffold new Next.js pages/routes with proper file structure',\n 'understand': 'Explain code architecture, data flow, and design decisions',\n 'test': 'Generate unit and integration tests with React Testing Library',\n 'optimize': 'Analyze and fix performance issues in components and pages',\n 'figma-to-code': 'Implement Figma designs using project design tokens',\n 'design-tokens': 'Audit and manage design token systems',\n 'accessibility-audit': 'WCAG 2.1 AA accessibility compliance audit',\n 'security-check': 'Scan for XSS, injection, secrets, and OWASP Top 10 vulnerabilities',\n 'refactor': 'Restructure code to improve readability without changing behavior',\n 'api-route': 'Scaffold Next.js API routes with validation, typing, and error handling',\n 'pre-pr': 'Pre-pull-request checklist covering types, a11y, security, tests, and more',\n 'migrate': 'Guide framework and library migrations step by step',\n 'error-boundary': 'Generate error boundaries, loading states, and fallback UI',\n 'type-fix': 'Fix TypeScript issues — replace any types, add null checks, tighten types',\n 'extract-hook': 'Extract component logic into reusable custom React hooks',\n 'dep-check': 'Audit dependencies for unused, outdated, vulnerable, and bloated packages',\n 'env-setup': 'Generate .env.example, validate environment variables, check for leaked secrets',\n 'commit-msg': 'Generate conventional commit messages from staged git changes',\n 'sitecore-debug': 'Debug Sitecore XM Cloud integration issues',\n 'responsive-check': 'Audit responsive design — breakpoints, touch targets, overflow',\n 'document': 'Generate documentation for existing components and utilities',\n 'token-tips': 'Token usage optimization strategies for AI coding assistants',\n // New skills (v1.1.0)\n 'perf-audit': 'Lighthouse-style performance audit covering Core Web Vitals, resource loading, and caching',\n 'bundle-check': 'Analyze bundle size, find heavy imports, suggest tree-shaking and code splitting',\n 'i18n-check': 'Find hardcoded strings, missing translation keys, and internationalization gaps',\n 'schema-gen': 'Generate TypeScript types and Zod schemas from API responses, JSON, or GraphQL',\n 'changelog': 'Generate formatted changelogs from git history following Keep a Changelog format',\n 'release': 'Guided release workflow with versioning, changelog, tagging, and release notes',\n 'storybook-gen': 'Generate Storybook stories with controls, play functions, and visual tests',\n // New skills (v1.2.0) — hooks, agents, sessions, orchestration\n 'search-first': 'Research-before-coding — search docs, existing patterns, and APIs before writing code',\n 'quality-gate-check': 'Post-implementation quality checklist — type safety, a11y, security, performance, Sitecore',\n 'server-action': 'Scaffold Next.js Server Actions with Zod validation, error handling, and revalidation',\n 'middleware': 'Create or update Next.js middleware for auth, redirects, i18n, or Sitecore preview mode',\n 'save-session': 'Persist current session context, decisions, and pending work for later resumption',\n 'resume-session': 'Restore context from a previous session and continue where you left off',\n 'checkpoint': 'Create a verification snapshot — run all quality checks and record pass/fail status',\n 'orchestrate': 'Multi-agent orchestration — break complex tasks into subtasks and delegate to agents',\n 'quality-gate': 'Run comprehensive quality checks: types, lint, format, tests, bundle, a11y, security',\n 'harness-audit': 'Audit AI agent configuration — check CLAUDE.md, hooks, agents, skills, MCP servers',\n};\n\nexport async function copySkills(targetDir: string): Promise<string[]> {\n const copied: string[] = [];\n\n for (const skill of AVAILABLE_SKILLS) {\n const src = path.join(COMMANDS_DIR, `${skill}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n const content = await fs.readFile(src, 'utf-8');\n const description = SKILL_DESCRIPTIONS[skill] || skill;\n\n // Generate for Claude Code: .claude/skills/[name]/SKILL.md\n const claudeSkillDir = path.join(targetDir, '.claude', 'skills', skill);\n await fs.ensureDir(claudeSkillDir);\n await fs.writeFile(\n path.join(claudeSkillDir, 'SKILL.md'),\n content,\n 'utf-8',\n );\n\n // Generate for Cursor: .cursor/skills/[name]/SKILL.md\n const cursorSkillDir = path.join(targetDir, '.cursor', 'skills', skill);\n await fs.ensureDir(cursorSkillDir);\n await fs.writeFile(\n path.join(cursorSkillDir, 'SKILL.md'),\n content,\n 'utf-8',\n );\n\n // Legacy: also copy to .claude/commands/ for older Claude Code versions\n const legacyDir = path.join(targetDir, '.claude', 'commands');\n await fs.ensureDir(legacyDir);\n await fs.copy(src, path.join(legacyDir, `${skill}.md`), { overwrite: true });\n\n copied.push(skill);\n }\n\n return copied;\n}\n\n// Keep the old function name as an alias for backward compatibility\nexport const copyCommands = copySkills;\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { GUIDES_DIR } from '../constants.js';\n\nconst AVAILABLE_GUIDES = [\n 'getting-started',\n 'prompt-playbook',\n 'when-to-use-ai',\n 'token-saving-tips',\n 'figma-workflow',\n 'hooks-and-agents',\n];\n\nexport async function copyGuides(targetDir: string): Promise<string[]> {\n const guidesTarget = path.join(targetDir, 'ai-kit', 'guides');\n await fs.ensureDir(guidesTarget);\n\n const copied: string[] = [];\n\n for (const guide of AVAILABLE_GUIDES) {\n const src = path.join(GUIDES_DIR, `${guide}.md`);\n const dest = path.join(guidesTarget, `${guide}.md`);\n\n if (await fs.pathExists(src)) {\n await fs.copy(src, dest, { overwrite: true });\n copied.push(guide);\n }\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { DOCS_SCAFFOLDS_DIR } from '../constants.js';\n\nconst DOC_SCAFFOLDS = ['mistakes-log', 'decisions-log', 'time-log'];\n\nexport async function scaffoldDocs(targetDir: string): Promise<string[]> {\n const docsTarget = path.join(targetDir, 'docs');\n await fs.ensureDir(docsTarget);\n\n const created: string[] = [];\n\n for (const doc of DOC_SCAFFOLDS) {\n const src = path.join(DOCS_SCAFFOLDS_DIR, `${doc}.md`);\n const dest = path.join(docsTarget, `${doc}.md`);\n\n if ((await fs.pathExists(dest))) {\n continue; // Don't overwrite existing docs\n }\n\n if (await fs.pathExists(src)) {\n await fs.copy(src, dest);\n created.push(doc);\n }\n }\n\n return created;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { AGENTS_DIR } from '../constants.js';\nimport type { ProjectScan } from '../types.js';\n\nconst UNIVERSAL_AGENTS = [\n 'planner',\n 'code-reviewer',\n 'security-reviewer',\n 'build-resolver',\n 'doc-updater',\n 'refactor-cleaner',\n 'architect',\n];\n\nconst CONDITIONAL_AGENTS: { name: string; condition: (scan: ProjectScan) => boolean }[] = [\n {\n name: 'e2e-runner',\n condition: (scan) => scan.tools.playwright,\n },\n {\n name: 'sitecore-specialist',\n condition: (scan) => scan.cms !== 'none',\n },\n {\n name: 'tdd-guide',\n condition: (scan) => scan.tools.playwright || !!scan.scripts['test'],\n },\n];\n\nexport async function copyAgents(\n targetDir: string,\n scan: ProjectScan,\n): Promise<string[]> {\n const agentsTarget = path.join(targetDir, '.claude', 'agents');\n await fs.ensureDir(agentsTarget);\n\n const copied: string[] = [];\n\n // Copy universal agents\n for (const agent of UNIVERSAL_AGENTS) {\n const src = path.join(AGENTS_DIR, `${agent}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(agentsTarget, `${agent}.md`), {\n overwrite: true,\n });\n copied.push(agent);\n }\n\n // Copy conditional agents based on scan results\n for (const { name, condition } of CONDITIONAL_AGENTS) {\n if (!condition(scan)) continue;\n\n const src = path.join(AGENTS_DIR, `${name}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(agentsTarget, `${name}.md`), {\n overwrite: true,\n });\n copied.push(name);\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { CONTEXTS_DIR } from '../constants.js';\n\nconst AVAILABLE_CONTEXTS = ['dev', 'review', 'research'];\n\nexport async function copyContexts(targetDir: string): Promise<string[]> {\n const contextsTarget = path.join(targetDir, '.claude', 'contexts');\n await fs.ensureDir(contextsTarget);\n\n const copied: string[] = [];\n\n for (const context of AVAILABLE_CONTEXTS) {\n const src = path.join(CONTEXTS_DIR, `${context}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(contextsTarget, `${context}.md`), {\n overwrite: true,\n });\n copied.push(context);\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport { confirm } from '@inquirer/prompts';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { generateMdcFiles } from '../generator/cursor-mdc.js';\nimport { generateConfig } from '../generator/config.js';\nimport { generateSettingsLocal } from '../generator/hooks.js';\nimport { copySkills } from '../copier/skills.js';\nimport { copyGuides } from '../copier/guides.js';\nimport { copyAgents } from '../copier/agents.js';\nimport { copyContexts } from '../copier/contexts.js';\nimport { loadCustomFragments } from '../generator/assembler.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSuccess,\n logError,\n logInfo,\n logWarning,\n logSection,\n fileExists,\n readJsonSafe,\n readFileSafe,\n mergeWithMarkers,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\nexport async function updateCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n if (!fileExists(configPath)) {\n logError('No ai-kit.config.json found. Run `ai-kit init` first.');\n return;\n }\n\n const existingConfig = readJsonSafe<AiKitConfig>(configPath);\n if (!existingConfig) {\n logError('Could not read ai-kit.config.json. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Warn if major version mismatch\n const existingMajor = parseInt(existingConfig.version.split('.')[0], 10);\n const currentMajor = parseInt(VERSION.split('.')[0], 10);\n if (existingMajor !== currentMajor) {\n logWarning(\n `Config was generated with ai-kit v${existingConfig.version}, but you're running v${VERSION}. Consider running \\`ai-kit init\\` to re-initialize.`,\n );\n }\n\n const proceed = await confirm({\n message: 'Re-scan project and update all generated files?',\n default: true,\n });\n\n if (!proceed) return;\n\n const spinner = ora('Re-scanning project...').start();\n const scan = await scanProject(projectDir);\n spinner.succeed('Project re-scanned');\n\n logSection('Updating Files');\n\n const strictness = existingConfig.strictness || 'standard';\n const hookProfile = existingConfig.hookProfile || 'standard';\n const customFragments = loadCustomFragments(projectDir);\n const genOpts = { strictness, customFragments };\n\n const templates: string[] = [];\n\n // Update CLAUDE.md if it was previously generated\n if (\n existingConfig.templates.includes('CLAUDE.md') ||\n fileExists(path.join(projectDir, GENERATED_FILES.claudeMd))\n ) {\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n const newContent = generateClaudeMd(scan, genOpts);\n const existing = readFileSafe(claudeMdPath);\n if (existing) {\n await fs.writeFile(claudeMdPath, mergeWithMarkers(existing, newContent), 'utf-8');\n } else {\n await fs.writeFile(claudeMdPath, newContent, 'utf-8');\n }\n templates.push('CLAUDE.md');\n logSuccess('CLAUDE.md updated');\n }\n\n // Update .cursorrules if it was previously generated\n if (\n existingConfig.templates.includes('.cursorrules') ||\n fileExists(path.join(projectDir, GENERATED_FILES.cursorRules))\n ) {\n const cursorRulesPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n const newContent = generateCursorRules(scan, genOpts);\n const existing = readFileSafe(cursorRulesPath);\n if (existing) {\n await fs.writeFile(cursorRulesPath, mergeWithMarkers(existing, newContent), 'utf-8');\n } else {\n await fs.writeFile(cursorRulesPath, newContent, 'utf-8');\n }\n templates.push('.cursorrules');\n logSuccess('.cursorrules updated');\n\n // Update .cursor/rules/*.mdc files\n const mdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n await fs.ensureDir(mdcDir);\n const mdcFiles = generateMdcFiles(scan);\n for (const mdc of mdcFiles) {\n await fs.writeFile(path.join(mdcDir, mdc.filename), mdc.content, 'utf-8');\n }\n logSuccess(`${mdcFiles.length} .cursor/rules/*.mdc files updated`);\n }\n\n // Update skills\n const commands = await copySkills(projectDir);\n logSuccess(`${commands.length} skills updated (.claude/skills/ + .cursor/skills/)`);\n\n // Update agents\n const agents = await copyAgents(projectDir, scan);\n logSuccess(`${agents.length} agents updated (.claude/agents/)`);\n\n // Update contexts\n const contexts = await copyContexts(projectDir);\n logSuccess(`${contexts.length} context modes updated (.claude/contexts/)`);\n\n // Update hooks\n if (existingConfig.hooks !== false) {\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n const settingsLocal = generateSettingsLocal(scan, hookProfile);\n await fs.ensureDir(path.dirname(settingsLocalPath));\n await fs.writeJson(settingsLocalPath, settingsLocal, { spaces: 2 });\n logSuccess(`Hooks updated (profile: ${hookProfile})`);\n }\n\n // Update guides\n const guides = await copyGuides(projectDir);\n logSuccess(`${guides.length} guides updated`);\n\n // Update config\n const config = generateConfig(scan, templates, commands, guides, {\n ...genOpts,\n agents,\n contexts,\n hooks: existingConfig.hooks !== false,\n hookProfile,\n });\n await fs.writeJson(configPath, config, { spaces: 2 });\n logSuccess('ai-kit.config.json updated');\n\n console.log('');\n logInfo('All AI configs refreshed with latest project scan.');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { confirm } from '@inquirer/prompts';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport { logSuccess, logWarning, logInfo, logSection, fileExists } from '../utils.js';\n\nexport async function resetCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Reset');\n logWarning('This will remove all AI Kit generated files:');\n logInfo(` - ${GENERATED_FILES.claudeMd}`);\n logInfo(` - ${GENERATED_FILES.cursorRules}`);\n logInfo(` - ${GENERATED_FILES.cursorMdcDir}/`);\n logInfo(` - ${GENERATED_FILES.claudeCommands}/`);\n logInfo(` - ${GENERATED_FILES.claudeSkills}/`);\n logInfo(` - ${GENERATED_FILES.cursorSkills}/`);\n logInfo(` - ai-kit/`);\n logInfo(` - ${AI_KIT_CONFIG_FILE}`);\n console.log('');\n\n const proceed = await confirm({\n message: 'Are you sure? This cannot be undone.',\n default: false,\n });\n\n if (!proceed) {\n logInfo('Cancelled.');\n return;\n }\n\n const removed: string[] = [];\n\n // Remove CLAUDE.md\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n if (fileExists(claudeMdPath)) {\n await fs.remove(claudeMdPath);\n removed.push(GENERATED_FILES.claudeMd);\n }\n\n // Remove .cursorrules\n const cursorPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n if (fileExists(cursorPath)) {\n await fs.remove(cursorPath);\n removed.push(GENERATED_FILES.cursorRules);\n }\n\n // Remove .cursor/rules/ (mdc files)\n const cursorMdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n if (fileExists(cursorMdcDir)) {\n await fs.remove(cursorMdcDir);\n removed.push(GENERATED_FILES.cursorMdcDir);\n }\n\n // Remove .claude/commands/ (legacy)\n const commandsDir = path.join(projectDir, GENERATED_FILES.claudeCommands);\n if (fileExists(commandsDir)) {\n await fs.remove(commandsDir);\n removed.push(GENERATED_FILES.claudeCommands);\n }\n\n // Remove .claude/skills/\n const claudeSkillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (fileExists(claudeSkillsDir)) {\n await fs.remove(claudeSkillsDir);\n removed.push(GENERATED_FILES.claudeSkills);\n }\n\n // Remove .cursor/skills/\n const cursorSkillsDir = path.join(projectDir, GENERATED_FILES.cursorSkills);\n if (fileExists(cursorSkillsDir)) {\n await fs.remove(cursorSkillsDir);\n removed.push(GENERATED_FILES.cursorSkills);\n }\n\n // Remove ai-kit/ folder\n const aiKitDir = path.join(projectDir, 'ai-kit');\n if (fileExists(aiKitDir)) {\n await fs.remove(aiKitDir);\n removed.push('ai-kit/');\n }\n\n // Remove config\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n if (fileExists(configPath)) {\n await fs.remove(configPath);\n removed.push(AI_KIT_CONFIG_FILE);\n }\n\n logSection('Reset Complete');\n if (removed.length > 0) {\n removed.forEach((f) => logSuccess(`Removed ${f}`));\n } else {\n logInfo('No AI Kit files found to remove.');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport os from 'os';\nimport { logSection, logInfo, logSuccess, logWarning } from '../utils.js';\nimport { PACKAGE_ROOT } from '../constants.js';\n\n// ─── Pricing (per 1M tokens) ──────────────────────────────────────────\nconst PRICING = {\n sonnet: { input: 3, output: 15, cacheRead: 0.3 },\n opus: { input: 15, output: 75, cacheRead: 0.3 },\n} as const;\n\nconst PLAN_BUDGET = 20; // $20 monthly plan\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n}\n\ninterface SessionSummary {\n sessionId: string;\n filePath: string;\n date: string; // YYYY-MM-DD\n usage: TokenUsage;\n model: string;\n messageCount: number;\n projectName: string; // extracted from parent directory name\n}\n\ninterface DailySummary {\n date: string;\n sessions: number;\n usage: TokenUsage;\n cost: number;\n}\n\ninterface ExportData {\n generatedAt: string;\n planBudget: number;\n daily: DailySummary[];\n sessions: SessionSummary[];\n totals: {\n thisWeek: { usage: TokenUsage; cost: number; sessions: number };\n thisMonth: { usage: TokenUsage; cost: number; sessions: number };\n today: { usage: TokenUsage; cost: number; sessions: number };\n };\n}\n\n// ─── JSONL Parsing ─────────────────────────────────────────────────────\nfunction findSessionFiles(): string[] {\n const claudeDir = path.join(os.homedir(), '.claude', 'projects');\n if (!fs.existsSync(claudeDir)) return [];\n\n const files: string[] = [];\n\n function walkDir(dir: string): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(full);\n } else if (entry.name.endsWith('.jsonl')) {\n files.push(full);\n }\n }\n } catch {\n // skip unreadable dirs\n }\n }\n\n walkDir(claudeDir);\n return files;\n}\n\nfunction parseSessionFile(filePath: string): SessionSummary | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim());\n\n const usage: TokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n };\n\n let model = 'sonnet';\n let messageCount = 0;\n let sessionDate = '';\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line);\n\n // Extract timestamp for date grouping\n if (obj.timestamp && !sessionDate) {\n sessionDate = new Date(obj.timestamp).toISOString().slice(0, 10);\n }\n\n // Detect model from message content\n if (obj.model) {\n const m = String(obj.model).toLowerCase();\n if (m.includes('opus')) model = 'opus';\n else model = 'sonnet';\n }\n\n // Count assistant messages\n if (obj.type === 'assistant' || obj.role === 'assistant') {\n messageCount++;\n }\n\n // Extract usage data — Claude Code logs usage in various shapes\n const u =\n obj.usage ||\n obj.message?.usage ||\n obj.costInfo ||\n obj.result?.usage ||\n null;\n\n if (u) {\n usage.inputTokens += u.input_tokens || u.inputTokens || 0;\n usage.outputTokens += u.output_tokens || u.outputTokens || 0;\n usage.cacheReadTokens +=\n u.cache_read_input_tokens || u.cacheReadTokens || u.cache_read || 0;\n usage.cacheCreationTokens +=\n u.cache_creation_input_tokens ||\n u.cacheCreationTokens ||\n u.cache_creation ||\n 0;\n }\n } catch {\n // skip malformed lines\n }\n }\n\n // Skip empty sessions\n if (usage.inputTokens === 0 && usage.outputTokens === 0) return null;\n\n // Fallback date from file stat\n if (!sessionDate) {\n const stat = fs.statSync(filePath);\n sessionDate = stat.mtime.toISOString().slice(0, 10);\n }\n\n const sessionId = path.basename(filePath, '.jsonl');\n const projectName = path.basename(path.dirname(filePath));\n\n return {\n sessionId,\n filePath,\n date: sessionDate,\n usage,\n model,\n messageCount,\n projectName,\n };\n } catch {\n return null;\n }\n}\n\nfunction calculateCost(usage: TokenUsage, model: string = 'sonnet'): number {\n const rates = model === 'opus' ? PRICING.opus : PRICING.sonnet;\n const inputCost = (usage.inputTokens / 1_000_000) * rates.input;\n const outputCost = (usage.outputTokens / 1_000_000) * rates.output;\n const cacheCost = (usage.cacheReadTokens / 1_000_000) * rates.cacheRead;\n return inputCost + outputCost + cacheCost;\n}\n\n// ─── Aggregation ───────────────────────────────────────────────────────\nfunction aggregateByDate(sessions: SessionSummary[]): DailySummary[] {\n const map = new Map<string, { sessions: number; usage: TokenUsage; models: string[] }>();\n\n for (const s of sessions) {\n const existing = map.get(s.date) || {\n sessions: 0,\n usage: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },\n models: [],\n };\n\n existing.sessions++;\n existing.usage.inputTokens += s.usage.inputTokens;\n existing.usage.outputTokens += s.usage.outputTokens;\n existing.usage.cacheReadTokens += s.usage.cacheReadTokens;\n existing.usage.cacheCreationTokens += s.usage.cacheCreationTokens;\n existing.models.push(s.model);\n\n map.set(s.date, existing);\n }\n\n return Array.from(map.entries())\n .map(([date, data]) => ({\n date,\n sessions: data.sessions,\n usage: data.usage,\n cost: calculateCost(data.usage, data.models.includes('opus') ? 'opus' : 'sonnet'),\n }))\n .sort((a, b) => b.date.localeCompare(a.date));\n}\n\nfunction filterDateRange(\n sessions: SessionSummary[],\n startDate: string,\n endDate: string,\n): SessionSummary[] {\n return sessions.filter((s) => s.date >= startDate && s.date <= endDate);\n}\n\nfunction sumUsage(sessions: SessionSummary[]): TokenUsage {\n return sessions.reduce(\n (acc, s) => ({\n inputTokens: acc.inputTokens + s.usage.inputTokens,\n outputTokens: acc.outputTokens + s.usage.outputTokens,\n cacheReadTokens: acc.cacheReadTokens + s.usage.cacheReadTokens,\n cacheCreationTokens: acc.cacheCreationTokens + s.usage.cacheCreationTokens,\n }),\n { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },\n );\n}\n\nfunction sumCost(sessions: SessionSummary[]): number {\n return sessions.reduce((acc, s) => acc + calculateCost(s.usage, s.model), 0);\n}\n\n// ─── Formatting ────────────────────────────────────────────────────────\nfunction fmt(n: number): string {\n return n.toLocaleString('en-US');\n}\n\nfunction fmtCost(n: number): string {\n return `$${n.toFixed(2)}`;\n}\n\nfunction progressBar(percent: number, width: number = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar = chalk.green('\\u2588'.repeat(filled)) + chalk.gray('\\u2591'.repeat(empty));\n return bar;\n}\n\nfunction printPeriodSummary(\n label: string,\n sessions: SessionSummary[],\n): void {\n const usage = sumUsage(sessions);\n const cost = sumCost(sessions);\n\n console.log(`\\n${chalk.bold(label)}`);\n console.log(` Sessions: ${chalk.cyan(String(sessions.length))}`);\n console.log(` Input tokens: ${chalk.white(fmt(usage.inputTokens))}`);\n console.log(` Output tokens: ${chalk.white(fmt(usage.outputTokens))}`);\n console.log(` Cache read: ${chalk.white(fmt(usage.cacheReadTokens))}`);\n console.log(` Estimated cost: ${chalk.yellow('~' + fmtCost(cost))}`);\n}\n\n// ─── Project Breakdown ──────────────────────────────────────────────────\nfunction printProjectBreakdown(sessions: SessionSummary[]): void {\n const projectMap = new Map<string, { sessions: number; cost: number }>();\n\n for (const s of sessions) {\n const existing = projectMap.get(s.projectName) || { sessions: 0, cost: 0 };\n existing.sessions++;\n existing.cost += calculateCost(s.usage, s.model);\n projectMap.set(s.projectName, existing);\n }\n\n const sorted = Array.from(projectMap.entries())\n .sort((a, b) => b[1].cost - a[1].cost);\n\n console.log(`\\n${chalk.bold('Per-Project Breakdown')}`);\n for (const [name, data] of sorted.slice(0, 10)) {\n const bar = progressBar((data.cost / sumCost(sessions)) * 100, 15);\n console.log(` ${bar} ${chalk.yellow(fmtCost(data.cost))} ${chalk.dim(`(${data.sessions} sessions)`)} ${name}`);\n }\n}\n\n// ─── Trend Analysis ─────────────────────────────────────────────────────\nfunction printTrendAnalysis(sessions: SessionSummary[]): void {\n const today = new Date();\n\n // This week\n const thisWeekStart = new Date(today);\n thisWeekStart.setDate(today.getDate() - today.getDay() + (today.getDay() === 0 ? -6 : 1));\n const thisWeekStr = thisWeekStart.toISOString().slice(0, 10);\n\n // Last week\n const lastWeekStart = new Date(thisWeekStart);\n lastWeekStart.setDate(lastWeekStart.getDate() - 7);\n const lastWeekEnd = new Date(thisWeekStart);\n lastWeekEnd.setDate(lastWeekEnd.getDate() - 1);\n const lastWeekStartStr = lastWeekStart.toISOString().slice(0, 10);\n const lastWeekEndStr = lastWeekEnd.toISOString().slice(0, 10);\n\n const todayStr = today.toISOString().slice(0, 10);\n const thisWeekSessions = filterDateRange(sessions, thisWeekStr, todayStr);\n const lastWeekSessions = filterDateRange(sessions, lastWeekStartStr, lastWeekEndStr);\n\n const thisWeekCost = sumCost(thisWeekSessions);\n const lastWeekCost = sumCost(lastWeekSessions);\n\n if (lastWeekCost > 0) {\n const change = ((thisWeekCost - lastWeekCost) / lastWeekCost) * 100;\n const arrow = change > 0 ? chalk.red('\\u2191') : change < 0 ? chalk.green('\\u2193') : chalk.dim('\\u2192');\n const changeStr = change > 0 ? `+${change.toFixed(0)}%` : `${change.toFixed(0)}%`;\n\n console.log(`\\n${chalk.bold('Week-over-Week Trend')}`);\n console.log(` Last week: ${chalk.yellow(fmtCost(lastWeekCost))} (${lastWeekSessions.length} sessions)`);\n console.log(` This week: ${chalk.yellow(fmtCost(thisWeekCost))} (${thisWeekSessions.length} sessions)`);\n console.log(` Change: ${arrow} ${changeStr}`);\n }\n}\n\n// ─── ROI Estimate ───────────────────────────────────────────────────────\nfunction printRoiEstimate(sessions: SessionSummary[], monthCost: number): void {\n // Estimate: each AI session saves ~15 minutes of developer time on average\n const AVG_MINUTES_SAVED_PER_SESSION = 15;\n const DEVELOPER_HOURLY_RATE = 75; // USD estimate\n\n const totalSessions = sessions.length;\n const minutesSaved = totalSessions * AVG_MINUTES_SAVED_PER_SESSION;\n const hoursSaved = minutesSaved / 60;\n const valueSaved = hoursSaved * DEVELOPER_HOURLY_RATE;\n const roi = monthCost > 0 ? ((valueSaved - monthCost) / monthCost) * 100 : 0;\n\n console.log(`\\n${chalk.bold('ROI Estimate')} ${chalk.dim('(based on ~15 min saved per session)')}`);\n console.log(` Sessions this month: ${chalk.cyan(String(totalSessions))}`);\n console.log(` Estimated time saved: ${chalk.cyan(`${hoursSaved.toFixed(1)} hours`)} (${minutesSaved} min)`);\n console.log(` Estimated value saved: ${chalk.green(fmtCost(valueSaved))} (at $${DEVELOPER_HOURLY_RATE}/hr)`);\n console.log(` AI cost: ${chalk.yellow(fmtCost(monthCost))}`);\n if (roi > 0) {\n console.log(` ROI: ${chalk.green(`${roi.toFixed(0)}%`)}`);\n }\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function tokensCommand(options: { export?: boolean; csv?: boolean; budget?: number } = {}): Promise<void> {\n logSection('AI Kit \\u2014 Token Usage');\n\n const budget = options.budget || PLAN_BUDGET;\n\n const spinner = ora('Scanning Claude Code session logs...').start();\n\n const sessionFiles = findSessionFiles();\n if (sessionFiles.length === 0) {\n spinner.fail('No Claude Code session logs found');\n logInfo('Session logs are stored in ~/.claude/projects/');\n logInfo('Use Claude Code to generate some activity first.');\n return;\n }\n\n const sessions: SessionSummary[] = [];\n for (const file of sessionFiles) {\n const s = parseSessionFile(file);\n if (s) sessions.push(s);\n }\n\n spinner.succeed(`Parsed ${sessions.length} sessions from ${sessionFiles.length} log files`);\n\n if (sessions.length === 0) {\n logWarning('No token usage data found in session logs.');\n return;\n }\n\n // Date ranges\n const today = new Date().toISOString().slice(0, 10);\n\n const dayOfWeek = new Date().getDay();\n const mondayOffset = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const weekStart = new Date();\n weekStart.setDate(weekStart.getDate() - mondayOffset);\n const weekStartStr = weekStart.toISOString().slice(0, 10);\n\n const monthStart = today.slice(0, 7) + '-01';\n\n const todaySessions = filterDateRange(sessions, today, today);\n const weekSessions = filterDateRange(sessions, weekStartStr, today);\n const monthSessions = filterDateRange(sessions, monthStart, today);\n\n // Print summaries\n printPeriodSummary(`Today (${today})`, todaySessions);\n printPeriodSummary('This Week', weekSessions);\n printPeriodSummary('This Month', monthSessions);\n\n // Budget progress\n const monthCost = sumCost(monthSessions);\n const budgetPercent = Math.min((monthCost / budget) * 100, 100);\n const daysInMonth = new Date(\n new Date().getFullYear(),\n new Date().getMonth() + 1,\n 0,\n ).getDate();\n const dayOfMonth = new Date().getDate();\n const daysRemaining = daysInMonth - dayOfMonth;\n const dailyAvg = dayOfMonth > 0 ? monthCost / dayOfMonth : 0;\n const estimatedDaysLeft =\n dailyAvg > 0 ? Math.floor((budget - monthCost) / dailyAvg) : daysRemaining;\n\n console.log(`\\n${chalk.bold(`$${budget} Plan Budget`)}`);\n console.log(\n ` ${progressBar(budgetPercent)} ${Math.round(budgetPercent)}% used (~${fmtCost(monthCost)} of ${fmtCost(budget)})`,\n );\n console.log(\n ` Estimated days remaining at this rate: ${chalk.cyan(String(Math.max(estimatedDaysLeft, 0)))} days`,\n );\n console.log(` Daily average: ${chalk.yellow(fmtCost(dailyAvg))}`);\n\n // Budget alerts\n if (budgetPercent >= 90) {\n console.log(chalk.red.bold('\\n \\u26a0 ALERT: Over 90% of monthly budget used!'));\n } else if (budgetPercent >= 75) {\n console.log(chalk.yellow('\\n \\u26a0 Warning: Over 75% of monthly budget used.'));\n } else if (budgetPercent >= 50) {\n console.log(chalk.blue('\\n \\u2139 Note: Over 50% of monthly budget used.'));\n }\n\n // Model recommendations\n const opusSessions = monthSessions.filter(s => s.model === 'opus');\n const sonnetSessions = monthSessions.filter(s => s.model === 'sonnet');\n const opusCost = sumCost(opusSessions);\n const sonnetCost = sumCost(sonnetSessions);\n\n if (opusCost > sonnetCost * 2 && opusSessions.length > 5) {\n console.log(`\\n${chalk.bold('Model Recommendation')}`);\n console.log(` Opus usage: ${chalk.yellow(fmtCost(opusCost))} (${opusSessions.length} sessions)`);\n console.log(` Sonnet usage: ${chalk.yellow(fmtCost(sonnetCost))} (${sonnetSessions.length} sessions)`);\n console.log(chalk.dim(' Tip: Use Sonnet for routine tasks (reviews, tests, docs) and Opus for complex tasks (architecture, debugging).'));\n }\n\n // Per-project breakdown\n printProjectBreakdown(monthSessions);\n\n // Trend analysis\n printTrendAnalysis(sessions);\n\n // ROI estimate\n printRoiEstimate(monthSessions, monthCost);\n\n // Tip\n console.log(\n `\\n${chalk.dim('Tip: Use /understand before modifying unfamiliar code \\u2014')}`,\n );\n console.log(\n chalk.dim(\" it's cheaper than a failed implementation attempt.\"),\n );\n console.log('');\n\n // CSV export\n if (options.csv) {\n const csvPath = path.join(process.cwd(), 'token-usage.csv');\n const csvHeader = 'Date,Sessions,Input Tokens,Output Tokens,Cache Tokens,Cost\\n';\n const daily = aggregateByDate(sessions);\n const csvRows = daily.map(d =>\n `${d.date},${d.sessions},${d.usage.inputTokens},${d.usage.outputTokens},${d.usage.cacheReadTokens},${d.cost.toFixed(2)}`\n ).join('\\n');\n await fs.writeFile(csvPath, csvHeader + csvRows, 'utf-8');\n logSuccess(`CSV exported to ${csvPath}`);\n }\n\n // Export mode\n if (options.export) {\n await exportDashboard(sessions, todaySessions, weekSessions, monthSessions);\n }\n}\n\n// ─── Export ────────────────────────────────────────────────────────────\nasync function exportDashboard(\n allSessions: SessionSummary[],\n todaySessions: SessionSummary[],\n weekSessions: SessionSummary[],\n monthSessions: SessionSummary[],\n): Promise<void> {\n const spinner = ora('Generating dashboard...').start();\n\n const exportData: ExportData = {\n generatedAt: new Date().toISOString(),\n planBudget: PLAN_BUDGET,\n daily: aggregateByDate(allSessions),\n sessions: allSessions\n .sort((a, b) => b.date.localeCompare(a.date))\n .slice(0, 50)\n .map((s) => ({\n ...s,\n filePath: s.filePath, // keep for reference\n })),\n totals: {\n today: {\n usage: sumUsage(todaySessions),\n cost: sumCost(todaySessions),\n sessions: todaySessions.length,\n },\n thisWeek: {\n usage: sumUsage(weekSessions),\n cost: sumCost(weekSessions),\n sessions: weekSessions.length,\n },\n thisMonth: {\n usage: sumUsage(monthSessions),\n cost: sumCost(monthSessions),\n sessions: monthSessions.length,\n },\n },\n };\n\n const outputDir = process.cwd();\n const dataPath = path.join(outputDir, 'token-data.json');\n const dashboardSrc = path.join(PACKAGE_ROOT, 'templates', 'token-dashboard.html');\n const dashboardDest = path.join(outputDir, 'token-dashboard.html');\n\n await fs.writeJson(dataPath, exportData, { spaces: 2 });\n logInfo(`Token data written to ${dataPath}`);\n\n if (await fs.pathExists(dashboardSrc)) {\n await fs.copy(dashboardSrc, dashboardDest, { overwrite: true });\n logInfo(`Dashboard copied to ${dashboardDest}`);\n } else {\n logWarning('Dashboard template not found. Skipping HTML export.');\n }\n\n spinner.succeed('Dashboard exported');\n\n // Try to open in browser\n try {\n const { exec } = await import('child_process');\n const openCmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n exec(`${openCmd} \"${dashboardDest}\"`);\n logInfo('Opening dashboard in browser...');\n } catch {\n logInfo(`Open ${dashboardDest} in your browser to view the dashboard.`);\n }\n}\n","import path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n dirExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\nexport async function doctorCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n let passed = 0;\n let warnings = 0;\n let issues = 0;\n\n logSection('AI Kit — Doctor');\n console.log('');\n\n // 1. Check ai-kit.config.json exists\n if (!fileExists(configPath)) {\n logError('ai-kit.config.json not found. Run `ai-kit init` first.');\n issues++;\n showSummary(passed, warnings, issues);\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logError('ai-kit.config.json is corrupted or unreadable. Run `ai-kit init` to re-initialize.');\n issues++;\n showSummary(passed, warnings, issues);\n return;\n }\n\n logSuccess(`ai-kit.config.json found (v${config.version})`);\n passed++;\n\n // 2. Version check\n if (config.version !== VERSION) {\n logWarning(\n `Config version mismatch — config is v${config.version}, CLI is v${VERSION}. Run \\`ai-kit update\\` to sync.`,\n );\n warnings++;\n } else {\n logSuccess(`Version matches CLI (v${VERSION})`);\n passed++;\n }\n\n // 3. File integrity — check templates exist\n for (const template of config.templates) {\n const templateFile =\n template === 'CLAUDE.md'\n ? GENERATED_FILES.claudeMd\n : template === '.cursorrules'\n ? GENERATED_FILES.cursorRules\n : template;\n const templatePath = path.join(projectDir, templateFile);\n\n if (fileExists(templatePath)) {\n logSuccess(`${template} exists and in sync`);\n passed++;\n } else {\n logError(`${template} is listed in config but missing from disk`);\n issues++;\n }\n }\n\n // 4. Skills check — verify all skills from config.commands exist\n const missingSkills: string[] = [];\n for (const skill of config.commands) {\n const claudeSkillPath = path.join(projectDir, GENERATED_FILES.claudeSkills, skill);\n const cursorSkillPath = path.join(projectDir, GENERATED_FILES.cursorSkills, skill);\n\n if (!fileExists(claudeSkillPath) && !fileExists(cursorSkillPath)) {\n missingSkills.push(skill);\n }\n }\n\n if (missingSkills.length === 0) {\n logSuccess(`${config.commands.length}/${config.commands.length} skills present`);\n passed++;\n } else {\n logError(\n `${config.commands.length - missingSkills.length}/${config.commands.length} skills present — missing: ${missingSkills.join(', ')}`,\n );\n issues++;\n }\n\n // 5. Guides check — verify all guides from config.guides exist\n const guidesDir = path.join(projectDir, 'ai-kit', 'guides');\n const missingGuides: string[] = [];\n for (const guide of config.guides) {\n const guidePath = path.join(guidesDir, guide);\n if (!fileExists(guidePath)) {\n missingGuides.push(guide);\n }\n }\n\n if (missingGuides.length === 0) {\n logSuccess(`${config.guides.length}/${config.guides.length} guides present`);\n passed++;\n } else {\n logError(\n `${config.guides.length - missingGuides.length}/${config.guides.length} guides present — missing: ${missingGuides.join(', ')}`,\n );\n issues++;\n }\n\n // 6. Staleness check — compare config.scanResult with fresh scan\n const spinner = ora('Running fresh project scan...').start();\n let freshScan: ProjectScan;\n try {\n freshScan = await scanProject(projectDir);\n spinner.succeed('Project re-scanned');\n } catch (err) {\n spinner.fail('Failed to scan project');\n logWarning(`Could not run staleness check: ${String(err)}`);\n warnings++;\n freshScan = config.scanResult;\n }\n\n const stalenessWarnings = compareScanResults(config.scanResult, freshScan);\n if (stalenessWarnings.length === 0) {\n logSuccess('Config is up to date with project state');\n passed++;\n } else {\n for (const warning of stalenessWarnings) {\n logWarning(warning);\n warnings++;\n }\n }\n\n // 7. MCP server health\n const mcpChecks: { name: string; key: keyof typeof freshScan.mcpServers }[] = [\n { name: 'Playwright MCP', key: 'playwright' },\n { name: 'Context7 MCP', key: 'context7' },\n { name: 'GitHub MCP', key: 'github' },\n { name: 'Perplexity MCP', key: 'perplexity' },\n { name: 'Figma MCP', key: 'figma' },\n ];\n\n for (const mcp of mcpChecks) {\n if (freshScan.mcpServers[mcp.key]) {\n logSuccess(`${mcp.name} configured`);\n passed++;\n } else {\n logWarning(`${mcp.name} not configured`);\n warnings++;\n }\n }\n\n // 8. Missing recommended tools\n const toolChecks: { name: string; key: keyof typeof freshScan.tools; hint: string }[] = [\n { name: 'Playwright', key: 'playwright', hint: 'npm install -D @playwright/test' },\n { name: 'ESLint', key: 'eslint', hint: 'npm install -D eslint' },\n { name: 'Prettier', key: 'prettier', hint: 'npm install -D prettier' },\n { name: 'axe-core', key: 'axeCore', hint: 'npm install -D @axe-core/playwright' },\n { name: 'Knip', key: 'knip', hint: 'npm install -D knip' },\n { name: 'Bundle Analyzer', key: 'bundleAnalyzer', hint: 'npm install -D @next/bundle-analyzer' },\n ];\n\n for (const tool of toolChecks) {\n if (freshScan.tools[tool.key]) {\n logSuccess(`${tool.name} detected`);\n passed++;\n } else {\n logError(`${tool.name} not found — recommend installing: ${tool.hint}`);\n issues++;\n }\n }\n\n // 9. Summary\n console.log('');\n showSummary(passed, warnings, issues);\n}\n\nfunction showSummary(passed: number, warnings: number, issues: number): void {\n const parts: string[] = [];\n parts.push(chalk.green(`${passed} passed`));\n if (warnings > 0) parts.push(chalk.yellow(`${warnings} warnings`));\n if (issues > 0) parts.push(chalk.red(`${issues} issues`));\n\n console.log(chalk.bold(`Summary: ${parts.join(', ')}`));\n}\n\nfunction compareScanResults(\n previous: ProjectScan,\n current: ProjectScan,\n): string[] {\n const warnings: string[] = [];\n\n // Framework change\n if (previous.framework !== current.framework) {\n warnings.push(\n `Stack may have changed — framework was ${previous.framework}, now ${current.framework}`,\n );\n }\n\n // Next.js version change\n if (previous.nextjsVersion && current.nextjsVersion && previous.nextjsVersion !== current.nextjsVersion) {\n warnings.push(\n `Next.js version changed: ${previous.nextjsVersion} → ${current.nextjsVersion}`,\n );\n }\n\n // Router type change\n if (previous.routerType && current.routerType && previous.routerType !== current.routerType) {\n warnings.push(\n `Router type changed: ${previous.routerType} → ${current.routerType}`,\n );\n }\n\n // Styling changes\n const prevStyles = new Set(previous.styling);\n const currStyles = new Set(current.styling);\n for (const style of currStyles) {\n if (!prevStyles.has(style)) {\n warnings.push(`Stack may have changed — detected new styling: ${style}`);\n }\n }\n for (const style of prevStyles) {\n if (!currStyles.has(style)) {\n warnings.push(`Stack may have changed — styling removed: ${style}`);\n }\n }\n\n // TypeScript change\n if (previous.typescript !== current.typescript) {\n warnings.push(\n `TypeScript ${current.typescript ? 'detected (was not before)' : 'no longer detected'}`,\n );\n }\n\n // Monorepo change\n if (previous.monorepo !== current.monorepo) {\n warnings.push(\n `Monorepo ${current.monorepo ? 'detected (was not before)' : 'no longer detected'}`,\n );\n }\n\n // Package manager change\n if (previous.packageManager !== current.packageManager) {\n warnings.push(\n `Package manager changed: ${previous.packageManager} → ${current.packageManager}`,\n );\n }\n\n // Tool changes — check for newly detected tools\n const toolKeys = Object.keys(current.tools) as (keyof typeof current.tools)[];\n for (const key of toolKeys) {\n if (current.tools[key] && !previous.tools[key]) {\n warnings.push(`Stack may have changed — detected new tool: ${key}`);\n }\n if (!current.tools[key] && previous.tools[key]) {\n warnings.push(`Stack may have changed — tool removed: ${key}`);\n }\n }\n\n // CMS change\n if (previous.cms !== current.cms) {\n warnings.push(`CMS changed: ${previous.cms} → ${current.cms}`);\n }\n\n return warnings;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd, selectFragments } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logWarning,\n logError,\n fileExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\nexport async function diffCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log(chalk.bold('AI Kit — Diff (dry run)\\n'));\n\n // 1. Read existing config\n if (!fileExists(configPath)) {\n logError('No ai-kit.config.json found. Run `ai-kit init` first.');\n return;\n }\n\n const existingConfig = readJsonSafe<AiKitConfig>(configPath);\n if (!existingConfig) {\n logError('Could not read ai-kit.config.json. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Warn if major version mismatch\n const existingMajor = parseInt(existingConfig.version.split('.')[0], 10);\n const currentMajor = parseInt(VERSION.split('.')[0], 10);\n if (existingMajor !== currentMajor) {\n logWarning(\n `Config was generated with ai-kit v${existingConfig.version}, but you're running v${VERSION}. Consider running \\`ai-kit init\\` to re-initialize.`,\n );\n }\n\n // 2. Re-scan the project\n const spinner = ora('Scanning project...').start();\n const newScan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n\n const oldScan = existingConfig.scanResult;\n\n // 3. Show stack changes\n logSection('Stack Changes');\n const stackChanges = diffStack(oldScan, newScan);\n if (stackChanges.length === 0) {\n console.log(chalk.dim(' No stack changes detected'));\n } else {\n for (const change of stackChanges) {\n if (change.type === 'added') {\n console.log(chalk.green(` + ${change.label}`));\n } else if (change.type === 'modified') {\n console.log(chalk.yellow(` ~ ${change.label}`));\n } else {\n console.log(chalk.red(` - ${change.label}`));\n }\n }\n }\n\n // 4. Compare generated file contents\n logSection('File Changes');\n\n const oldFragments = selectFragments(oldScan);\n const newFragments = selectFragments(newScan);\n\n let modified = 0;\n let added = 0;\n let unchanged = 0;\n\n // CLAUDE.md\n const claudeMdStatus = diffGeneratedFile(\n projectDir,\n GENERATED_FILES.claudeMd,\n existingConfig,\n () => generateClaudeMd(newScan),\n oldFragments,\n newFragments,\n );\n logFileChange(claudeMdStatus);\n if (claudeMdStatus.status === 'modified') modified++;\n else if (claudeMdStatus.status === 'added') added++;\n else unchanged++;\n\n // .cursorrules\n const cursorRulesStatus = diffGeneratedFile(\n projectDir,\n GENERATED_FILES.cursorRules,\n existingConfig,\n () => generateCursorRules(newScan),\n oldFragments,\n newFragments,\n );\n logFileChange(cursorRulesStatus);\n if (cursorRulesStatus.status === 'modified') modified++;\n else if (cursorRulesStatus.status === 'added') added++;\n else unchanged++;\n\n // Skills\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n const skillCount = countFilesInDir(skillsDir);\n console.log(chalk.dim(` unchanged ${GENERATED_FILES.claudeSkills}/ (${skillCount} skills)`));\n unchanged++;\n\n // Guides\n const guidesDir = path.join(projectDir, AI_KIT_FOLDER_NAME, 'guides');\n const guideCount = existingConfig.guides?.length || 0;\n console.log(chalk.dim(` unchanged ai-kit/guides/ (${guideCount} guides)`));\n unchanged++;\n\n // 5. Summary\n console.log('');\n const parts: string[] = [];\n if (modified > 0) parts.push(`${modified} files would be modified`);\n if (added > 0) parts.push(`${added} added`);\n const removed = 0;\n parts.push(`${removed} removed`);\n\n logInfo(`Summary: ${parts.join(', ')}`);\n logInfo('Run `ai-kit update` to apply these changes.');\n}\n\nconst AI_KIT_FOLDER_NAME = 'ai-kit';\n\ninterface StackChange {\n type: 'added' | 'removed' | 'modified';\n label: string;\n}\n\nfunction diffStack(oldScan: ProjectScan, newScan: ProjectScan): StackChange[] {\n const changes: StackChange[] = [];\n\n // Framework version\n if (oldScan.framework === newScan.framework && newScan.framework === 'nextjs') {\n if (oldScan.nextjsVersion !== newScan.nextjsVersion) {\n changes.push({\n type: 'modified',\n label: `Next.js version: ${oldScan.nextjsVersion || 'unknown'} → ${newScan.nextjsVersion || 'unknown'}`,\n });\n }\n } else if (oldScan.framework !== newScan.framework) {\n if (oldScan.framework !== 'unknown') {\n changes.push({ type: 'removed', label: `${oldScan.framework} no longer detected` });\n }\n if (newScan.framework !== 'unknown') {\n changes.push({ type: 'added', label: `${newScan.framework} detected` });\n }\n }\n\n // Router type\n if (oldScan.routerType !== newScan.routerType && newScan.framework === 'nextjs') {\n changes.push({\n type: 'modified',\n label: `Router type: ${oldScan.routerType || 'unknown'} → ${newScan.routerType || 'unknown'}`,\n });\n }\n\n // TypeScript\n if (!oldScan.typescript && newScan.typescript) {\n changes.push({ type: 'added', label: 'TypeScript detected' });\n } else if (oldScan.typescript && !newScan.typescript) {\n changes.push({ type: 'removed', label: 'TypeScript no longer detected' });\n }\n\n // Styling changes\n const oldStyles = new Set(oldScan.styling);\n const newStyles = new Set(newScan.styling);\n for (const style of newStyles) {\n if (!oldStyles.has(style)) {\n changes.push({ type: 'added', label: `${style} detected (styling)` });\n }\n }\n for (const style of oldStyles) {\n if (!newStyles.has(style)) {\n changes.push({ type: 'removed', label: `${style} no longer detected` });\n }\n }\n\n // Tailwind version\n if (\n oldScan.styling.includes('tailwind') &&\n newScan.styling.includes('tailwind') &&\n oldScan.tailwindVersion !== newScan.tailwindVersion\n ) {\n changes.push({\n type: 'modified',\n label: `Tailwind version: ${oldScan.tailwindVersion || 'unknown'} → ${newScan.tailwindVersion || 'unknown'}`,\n });\n }\n\n // Monorepo\n if (!oldScan.monorepo && newScan.monorepo) {\n changes.push({\n type: 'added',\n label: `monorepo detected${newScan.monorepoTool ? ` (${newScan.monorepoTool})` : ''}`,\n });\n } else if (oldScan.monorepo && !newScan.monorepo) {\n changes.push({ type: 'removed', label: 'monorepo no longer detected' });\n } else if (oldScan.monorepoTool !== newScan.monorepoTool && newScan.monorepo) {\n changes.push({\n type: 'modified',\n label: `monorepo tool: ${oldScan.monorepoTool || 'unknown'} → ${newScan.monorepoTool || 'unknown'}`,\n });\n }\n\n // CMS\n if (oldScan.cms !== newScan.cms) {\n if (oldScan.cms !== 'none') {\n changes.push({ type: 'removed', label: `${oldScan.cms} no longer detected` });\n }\n if (newScan.cms !== 'none') {\n changes.push({ type: 'added', label: `${newScan.cms} detected (CMS)` });\n }\n }\n\n // Package manager\n if (oldScan.packageManager !== newScan.packageManager) {\n changes.push({\n type: 'modified',\n label: `Package manager: ${oldScan.packageManager} → ${newScan.packageManager}`,\n });\n }\n\n // Figma\n if (!oldScan.figma?.detected && newScan.figma?.detected) {\n changes.push({ type: 'added', label: 'Figma integration detected' });\n } else if (oldScan.figma?.detected && !newScan.figma?.detected) {\n changes.push({ type: 'removed', label: 'Figma integration no longer detected' });\n }\n\n // Tools changes\n if (oldScan.tools && newScan.tools) {\n const toolNames = Object.keys(newScan.tools) as (keyof typeof newScan.tools)[];\n for (const tool of toolNames) {\n if (!oldScan.tools[tool] && newScan.tools[tool]) {\n changes.push({ type: 'added', label: `${tool} detected (tooling)` });\n }\n }\n const oldToolNames = Object.keys(oldScan.tools) as (keyof typeof oldScan.tools)[];\n for (const tool of oldToolNames) {\n if (oldScan.tools[tool] && !newScan.tools[tool]) {\n changes.push({ type: 'removed', label: `${tool} no longer detected` });\n }\n }\n }\n\n return changes;\n}\n\ninterface FileChangeResult {\n filename: string;\n status: 'added' | 'modified' | 'unchanged';\n detail?: string;\n}\n\nfunction diffGeneratedFile(\n projectDir: string,\n filename: string,\n config: AiKitConfig,\n generate: () => string,\n oldFragments: string[],\n newFragments: string[],\n): FileChangeResult {\n const filePath = path.join(projectDir, filename);\n const currentContent = readFileSafe(filePath);\n const newContent = generate();\n\n // File does not exist yet but would be generated\n if (!currentContent) {\n if (config.templates.includes(filename)) {\n return { filename, status: 'added', detail: 'file missing, would be created' };\n }\n return { filename, status: 'unchanged', detail: 'not configured' };\n }\n\n // Compare contents\n if (currentContent.trim() === newContent.trim()) {\n return { filename, status: 'unchanged' };\n }\n\n // Determine which fragments changed\n const addedFragments = newFragments.filter((f) => !oldFragments.includes(f));\n const removedFragments = oldFragments.filter((f) => !newFragments.includes(f));\n\n const fragmentDetails: string[] = [];\n if (addedFragments.length > 0) {\n fragmentDetails.push(`+${addedFragments.join(', +')}`);\n }\n if (removedFragments.length > 0) {\n fragmentDetails.push(`-${removedFragments.join(', -')}`);\n }\n\n const detail =\n fragmentDetails.length > 0\n ? `template fragments changed: ${fragmentDetails.join(', ')}`\n : 'content changed';\n\n return { filename, status: 'modified', detail };\n}\n\nfunction logFileChange(result: FileChangeResult): void {\n if (result.status === 'added') {\n console.log(chalk.green(` added ${result.filename}`) + (result.detail ? chalk.dim(` (${result.detail})`) : ''));\n } else if (result.status === 'modified') {\n console.log(\n chalk.yellow(` modified ${result.filename}`) + (result.detail ? chalk.dim(` (${result.detail})`) : ''),\n );\n } else {\n console.log(chalk.dim(` unchanged ${result.filename}`));\n }\n}\n\nfunction countFilesInDir(dirPath: string): number {\n try {\n if (!fs.existsSync(dirPath)) return 0;\n const entries = fs.readdirSync(dirPath) as string[];\n return entries.filter((e: string) => !e.startsWith('.')).length;\n } catch {\n return 0;\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select } from '@inquirer/prompts';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logSuccess,\n logWarning,\n logError,\n fileExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\ntype ExportFormat = 'windsurf' | 'aider' | 'cline' | 'all';\n\nconst EXPORT_TARGETS = {\n windsurf: { file: '.windsurfrules', label: 'Windsurf' },\n aider: { file: '.aider.conf.yml', label: 'Aider' },\n cline: { file: '.clinerules', label: 'Cline' },\n} as const;\n\nfunction stripMarkers(content: string): string {\n return content\n .replace('<!-- AI-KIT:START -->\\n', '')\n .replace('\\n<!-- AI-KIT:END -->', '')\n .replace(/<!-- Generated by ai-kit v[\\d.]+ -->\\n?/, '');\n}\n\nfunction toWindsurf(content: string): string {\n const stripped = stripMarkers(content);\n return `# Windsurf Rules\\n# Exported from ai-kit CLAUDE.md\\n\\n${stripped}`;\n}\n\nfunction toAider(content: string): string {\n const stripped = stripMarkers(content);\n // Indent each line for YAML multiline block scalar\n const indented = stripped\n .split('\\n')\n .map((line) => (line.length > 0 ? ` ${line}` : ''))\n .join('\\n');\n return `# Aider configuration\\n# Exported from ai-kit CLAUDE.md\\n\\nconventions: |\\n${indented}\\n`;\n}\n\nfunction toCline(content: string): string {\n const stripped = stripMarkers(content);\n return `# Cline Rules\\n# Exported from ai-kit CLAUDE.md\\n\\n${stripped}`;\n}\n\nexport async function exportCommand(\n targetPath?: string,\n options?: { format?: string },\n): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n\n logSection('AI Kit — Export');\n\n // Check that ai-kit has been initialized\n if (!fileExists(configPath) && !fileExists(claudeMdPath)) {\n logError('No ai-kit.config.json or CLAUDE.md found. Run `ai-kit init` first.');\n return;\n }\n\n // Read CLAUDE.md content\n const claudeContent = readFileSafe(claudeMdPath);\n if (!claudeContent) {\n logError('Could not read CLAUDE.md. Run `ai-kit init` or `ai-kit update` first.');\n return;\n }\n\n // Determine format\n let format: ExportFormat;\n\n if (options?.format) {\n const f = options.format.toLowerCase();\n if (f === 'windsurf' || f === 'aider' || f === 'cline' || f === 'all') {\n format = f;\n } else {\n logError(`Unknown format \"${options.format}\". Use: windsurf, aider, cline, or all.`);\n return;\n }\n } else {\n format = await select<ExportFormat>({\n message: 'Which format do you want to export to?',\n choices: [\n { name: 'Windsurf (.windsurfrules)', value: 'windsurf' },\n { name: 'Aider (.aider.conf.yml)', value: 'aider' },\n { name: 'Cline (.clinerules)', value: 'cline' },\n { name: 'All of the above', value: 'all' },\n ],\n });\n }\n\n const formats: (keyof typeof EXPORT_TARGETS)[] =\n format === 'all' ? ['windsurf', 'aider', 'cline'] : [format];\n\n const spinner = ora('Exporting rules to other AI tools...').start();\n\n const transformers: Record<keyof typeof EXPORT_TARGETS, (content: string) => string> = {\n windsurf: toWindsurf,\n aider: toAider,\n cline: toCline,\n };\n\n let exported = 0;\n\n for (const fmt of formats) {\n const target = EXPORT_TARGETS[fmt];\n const transformer = transformers[fmt];\n const outputPath = path.join(projectDir, target.file);\n const transformed = transformer(claudeContent);\n\n await fs.writeFile(outputPath, transformed, 'utf-8');\n exported++;\n }\n\n spinner.succeed('Export complete');\n console.log('');\n\n for (const fmt of formats) {\n const target = EXPORT_TARGETS[fmt];\n logSuccess(`${target.file} generated (${target.label})`);\n }\n\n console.log('');\n logInfo(\n `${exported} file${exported !== 1 ? 's' : ''} exported. These contain the same rules as your CLAUDE.md.`,\n );\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport { AI_KIT_CONFIG_FILE, VERSION, TEMPLATE_FRAGMENTS } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logSuccess,\n logWarning,\n fileExists,\n dirExists,\n readJsonSafe,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\n// ─── Skill Categories ───────────────────────────────────────────────────\nconst SKILL_CATEGORIES: Record<string, string[]> = {\n 'Getting Started': ['prompt-help', 'understand'],\n 'Building': [\n 'new-component',\n 'new-page',\n 'api-route',\n 'error-boundary',\n 'extract-hook',\n 'figma-to-code',\n 'design-tokens',\n ],\n 'Quality & Review': [\n 'review',\n 'test',\n 'accessibility-audit',\n 'security-check',\n 'responsive-check',\n 'type-fix',\n 'pre-pr',\n ],\n 'Maintenance': [\n 'optimize',\n 'refactor',\n 'dep-check',\n 'bundle-check',\n 'migrate',\n 'env-setup',\n ],\n 'Workflow': ['fix-bug', 'commit-msg', 'document', 'token-tips'],\n};\n\n// ─── Helpers ────────────────────────────────────────────────────────────\nfunction getComplexityLabel(score: number): string {\n if (score >= 10) return 'Enterprise';\n if (score >= 7) return 'Complex';\n if (score >= 4) return 'Moderate';\n return 'Simple';\n}\n\nfunction calculateComplexity(config: AiKitConfig): {\n score: number;\n items: { label: string; active: boolean }[];\n} {\n const scan = config.scanResult;\n let score = 0;\n const items: { label: string; active: boolean }[] = [];\n\n // Framework: +1\n const hasFramework = scan.framework !== 'unknown';\n if (hasFramework) score += 1;\n const frameworkLabel =\n scan.framework === 'nextjs'\n ? `Next.js ${scan.nextjsVersion || ''} (${scan.routerType === 'app' ? 'App Router' : scan.routerType === 'pages' ? 'Pages Router' : 'Hybrid'})`\n : scan.framework === 'react'\n ? 'React'\n : 'Unknown';\n items.push({ label: frameworkLabel.trim(), active: hasFramework });\n\n // CMS: +2\n const hasCms = scan.cms !== 'none';\n if (hasCms) score += 2;\n const cmsLabel =\n scan.cms === 'sitecore-xmc-v2'\n ? 'Sitecore XM Cloud (Content SDK v2)'\n : scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : scan.cms === 'sitecore-jss'\n ? 'Sitecore JSS'\n : 'CMS';\n items.push({ label: cmsLabel, active: hasCms });\n\n // TypeScript: +1\n if (scan.typescript) score += 1;\n items.push({\n label: `TypeScript${scan.typescriptStrict ? ' (strict)' : ''}`,\n active: scan.typescript,\n });\n\n // Each styling solution: +1\n for (const style of scan.styling) {\n score += 1;\n const styleLabel =\n style === 'tailwind'\n ? `Tailwind CSS${scan.tailwindVersion ? ` v${scan.tailwindVersion}` : ''}`\n : style === 'css-modules'\n ? 'CSS Modules'\n : style === 'styled-components'\n ? 'Styled Components'\n : style === 'scss'\n ? 'SCSS'\n : style;\n items.push({ label: styleLabel, active: true });\n }\n\n // Monorepo: +2\n items.push({\n label: scan.monorepo\n ? `Monorepo (${scan.monorepoTool || 'detected'})`\n : 'Monorepo',\n active: scan.monorepo,\n });\n if (scan.monorepo) score += 2;\n\n // Figma: +1\n items.push({ label: 'Figma', active: scan.figma.detected });\n if (scan.figma.detected) score += 1;\n\n return { score, items };\n}\n\nfunction categorizeSkills(skills: string[]): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n const categorized = new Set<string>();\n\n for (const [category, categorySkills] of Object.entries(SKILL_CATEGORIES)) {\n const matched = skills.filter((s) => categorySkills.includes(s));\n if (matched.length > 0) {\n result[category] = matched;\n matched.forEach((s) => categorized.add(s));\n }\n }\n\n // Any skills not in a known category\n const uncategorized = skills.filter((s) => !categorized.has(s));\n if (uncategorized.length > 0) {\n result['Other'] = uncategorized;\n }\n\n return result;\n}\n\n// ─── Tool & MCP Display Names ───────────────────────────────────────────\nconst TOOL_DISPLAY_NAMES: Record<string, string> = {\n playwright: 'Playwright',\n storybook: 'Storybook',\n eslint: 'ESLint',\n prettier: 'Prettier',\n axeCore: 'axe-core',\n snyk: 'Snyk',\n knip: 'Knip',\n bundleAnalyzer: 'Bundle Analyzer',\n};\n\nconst MCP_DISPLAY_NAMES: Record<string, string> = {\n playwright: 'Playwright',\n figma: 'Figma',\n github: 'GitHub',\n context7: 'Context7',\n perplexity: 'Perplexity',\n};\n\n// ─── Main Command ───────────────────────────────────────────────────────\nexport async function statsCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n logSection('AI Kit \\u2014 Project Stats');\n console.log('');\n\n // 1. Read config\n if (!fileExists(configPath)) {\n logWarning(\n 'ai-kit.config.json not found. Run `ai-kit init` first.',\n );\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logWarning(\n 'ai-kit.config.json is corrupted or unreadable. Run `ai-kit init` to re-initialize.',\n );\n return;\n }\n\n const scan = config.scanResult;\n\n // 2. Project Overview\n console.log(` Project: ${chalk.bold(scan.projectName)}`);\n console.log(` Version: ai-kit v${config.version}`);\n console.log(` Generated: ${config.generatedAt}`);\n console.log(` Package Manager: ${scan.packageManager}`);\n console.log('');\n\n // 3. Stack Complexity\n const { score, items } = calculateComplexity(config);\n const label = getComplexityLabel(score);\n const maxScore = 10;\n\n console.log(\n ` ${chalk.bold('Stack Complexity:')} ${score}/${maxScore} (${label})`,\n );\n\n for (const item of items) {\n if (item.active) {\n console.log(` ${chalk.green('\\u2713')} ${item.label}`);\n } else {\n console.log(` ${chalk.gray('\\u2717')} ${chalk.gray(item.label)}`);\n }\n }\n console.log('');\n\n // 4. Active Rules (template fragments)\n const activeFragments = (config.templates || []).filter((t) =>\n (TEMPLATE_FRAGMENTS as readonly string[]).includes(t),\n );\n const fragmentCount = activeFragments.length;\n\n console.log(\n ` ${chalk.bold('Active Rules:')} ${fragmentCount} template fragment${fragmentCount !== 1 ? 's' : ''}`,\n );\n if (fragmentCount > 0) {\n console.log(` ${activeFragments.join(', ')}`);\n }\n console.log('');\n\n // 5. Skills Overview\n const skills = config.commands || [];\n const totalSkills = skills.length;\n const categorized = categorizeSkills(skills);\n\n console.log(` ${chalk.bold('Skills:')} ${totalSkills} total`);\n for (const [category, categorySkills] of Object.entries(categorized)) {\n console.log(` ${category}: ${categorySkills.length}`);\n }\n console.log('');\n\n // 6. Tools Status\n console.log(` ${chalk.bold('Tools:')}`);\n const toolEntries = Object.entries(scan.tools) as [string, boolean][];\n const detectedTools: string[] = [];\n const missingTools: string[] = [];\n\n for (const [key, detected] of toolEntries) {\n const displayName = TOOL_DISPLAY_NAMES[key] || key;\n if (detected) {\n detectedTools.push(`${chalk.green('\\u2713')} ${displayName}`);\n } else {\n missingTools.push(`${chalk.yellow('\\u2717')} ${displayName}`);\n }\n }\n\n // Print tools in rows of 3\n const allToolItems = [...detectedTools, ...missingTools];\n for (let i = 0; i < allToolItems.length; i += 3) {\n const row = allToolItems\n .slice(i, i + 3)\n .map((item) => item.padEnd(22))\n .join('');\n console.log(` ${row}`);\n }\n console.log('');\n\n // 7. MCP Servers Status\n console.log(` ${chalk.bold('MCP Servers:')}`);\n const mcpEntries = Object.entries(scan.mcpServers) as [string, boolean][];\n const configuredMcps: string[] = [];\n const missingMcps: string[] = [];\n\n for (const [key, configured] of mcpEntries) {\n const displayName = MCP_DISPLAY_NAMES[key] || key;\n if (configured) {\n configuredMcps.push(`${chalk.green('\\u2713')} ${displayName}`);\n } else {\n missingMcps.push(`${chalk.yellow('\\u2717')} ${displayName}`);\n }\n }\n\n const allMcpItems = [...configuredMcps, ...missingMcps];\n for (let i = 0; i < allMcpItems.length; i += 3) {\n const row = allMcpItems\n .slice(i, i + 3)\n .map((item) => item.padEnd(22))\n .join('');\n console.log(` ${row}`);\n }\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n readFileSafe,\n readJsonSafe,\n} from '../utils.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport type { AiKitConfig } from '../types.js';\n\ninterface AuditCheck {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n}\n\nexport async function auditCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Security & Configuration Audit');\n logInfo(`Auditing: ${projectDir}`);\n\n const checks: AuditCheck[] = [];\n\n // 1. Check ai-kit.config.json exists\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n if (fileExists(configPath)) {\n checks.push({ name: 'Config file', status: 'pass', message: 'ai-kit.config.json found' });\n } else {\n checks.push({ name: 'Config file', status: 'fail', message: 'ai-kit.config.json missing — run `ai-kit init`' });\n }\n\n // 2. Check CLAUDE.md exists and has AI-KIT markers\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n const claudeMd = readFileSafe(claudeMdPath);\n if (claudeMd) {\n if (claudeMd.includes('AI-KIT:START') && claudeMd.includes('AI-KIT:END')) {\n checks.push({ name: 'CLAUDE.md', status: 'pass', message: 'CLAUDE.md has AI-KIT markers' });\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'warn', message: 'CLAUDE.md exists but missing AI-KIT markers — may not update correctly' });\n }\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'warn', message: 'CLAUDE.md not found' });\n }\n\n // 3. Check for secrets in CLAUDE.md\n if (claudeMd) {\n const secretPatterns = [\n /(?:api[_-]?key|secret|token|password|credential)\\s*[:=]\\s*['\"][^'\"]+['\"]/i,\n /(?:sk|pk|rk)[-_][a-zA-Z0-9]{20,}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /xox[bpoas]-[a-zA-Z0-9-]+/,\n ];\n\n const hasSecrets = secretPatterns.some((p) => p.test(claudeMd));\n if (hasSecrets) {\n checks.push({ name: 'Secrets in CLAUDE.md', status: 'fail', message: 'Potential secrets detected in CLAUDE.md — remove immediately' });\n } else {\n checks.push({ name: 'Secrets in CLAUDE.md', status: 'pass', message: 'No secrets detected' });\n }\n }\n\n // 4. Check hooks configuration\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n if (fileExists(settingsLocalPath)) {\n const settings = readJsonSafe<Record<string, unknown>>(settingsLocalPath);\n if (settings?.hooks) {\n checks.push({ name: 'Hooks', status: 'pass', message: 'Hooks configured in settings.local.json' });\n } else {\n checks.push({ name: 'Hooks', status: 'warn', message: 'settings.local.json exists but no hooks defined' });\n }\n } else {\n checks.push({ name: 'Hooks', status: 'warn', message: 'No hooks configured — run `ai-kit init` to generate' });\n }\n\n // 5. Check agents directory\n const agentsDir = path.join(projectDir, GENERATED_FILES.claudeAgents);\n if (await fs.pathExists(agentsDir)) {\n const agentFiles = (await fs.readdir(agentsDir)).filter((f: string) => f.endsWith('.md'));\n if (agentFiles.length > 0) {\n checks.push({ name: 'Agents', status: 'pass', message: `${agentFiles.length} agent(s) configured` });\n\n // Validate agent frontmatter\n let invalidAgents = 0;\n for (const file of agentFiles) {\n const content = readFileSafe(path.join(agentsDir, file));\n if (content && !content.startsWith('---')) {\n invalidAgents++;\n }\n }\n if (invalidAgents > 0) {\n checks.push({ name: 'Agent frontmatter', status: 'warn', message: `${invalidAgents} agent(s) missing YAML frontmatter` });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', message: 'Agents directory empty' });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', message: 'No agents directory — run `ai-kit init` to generate' });\n }\n\n // 6. Check contexts directory\n const contextsDir = path.join(projectDir, GENERATED_FILES.claudeContexts);\n if (await fs.pathExists(contextsDir)) {\n const contextFiles = (await fs.readdir(contextsDir)).filter((f: string) => f.endsWith('.md'));\n checks.push({ name: 'Contexts', status: contextFiles.length > 0 ? 'pass' : 'warn', message: `${contextFiles.length} context mode(s) available` });\n } else {\n checks.push({ name: 'Contexts', status: 'warn', message: 'No contexts directory' });\n }\n\n // 7. Check skills directory\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (await fs.pathExists(skillsDir)) {\n const skillDirs = (await fs.readdir(skillsDir)).filter(async (f: string) => {\n try {\n return (await fs.stat(path.join(skillsDir, f))).isDirectory();\n } catch {\n return false;\n }\n });\n checks.push({ name: 'Skills', status: 'pass', message: `${skillDirs.length} skill(s) installed` });\n } else {\n checks.push({ name: 'Skills', status: 'warn', message: 'No skills directory' });\n }\n\n // 8. Check .env files are gitignored\n const gitignorePath = path.join(projectDir, '.gitignore');\n const gitignore = readFileSafe(gitignorePath);\n if (gitignore) {\n const envIgnored = gitignore.includes('.env') || gitignore.includes('.env.local');\n if (envIgnored) {\n checks.push({ name: '.env gitignore', status: 'pass', message: '.env files are gitignored' });\n } else {\n checks.push({ name: '.env gitignore', status: 'fail', message: '.env files are NOT gitignored — add to .gitignore immediately' });\n }\n }\n\n // 9. Check settings.local.json is gitignored\n if (gitignore) {\n const settingsIgnored = gitignore.includes('settings.local.json');\n if (!settingsIgnored) {\n checks.push({ name: 'Settings gitignore', status: 'warn', message: 'settings.local.json not in .gitignore — may leak local config' });\n }\n }\n\n // 10. Check for MCP server security\n const settingsPath = path.join(projectDir, '.claude', 'settings.json');\n const settings = readFileSafe(settingsPath);\n if (settings) {\n const hasEnvVarsInSettings = /(?:api[_-]?key|token|secret|password)\\s*[:=]\\s*\"[^\"]+\"/i.test(settings);\n if (hasEnvVarsInSettings) {\n checks.push({ name: 'MCP secrets', status: 'fail', message: 'Potential secrets in .claude/settings.json — use environment variables instead' });\n } else {\n checks.push({ name: 'MCP secrets', status: 'pass', message: 'No hardcoded secrets in settings' });\n }\n }\n\n // Output results\n logSection('Audit Results');\n\n const passed = checks.filter((c) => c.status === 'pass');\n const warned = checks.filter((c) => c.status === 'warn');\n const failed = checks.filter((c) => c.status === 'fail');\n\n for (const check of checks) {\n const icon =\n check.status === 'pass'\n ? chalk.green('✓')\n : check.status === 'warn'\n ? chalk.yellow('⚠')\n : chalk.red('✗');\n console.log(` ${icon} ${check.name}: ${check.message}`);\n }\n\n // Score\n const total = checks.length;\n const score = Math.round(((passed.length + warned.length * 0.5) / total) * 100);\n const grade =\n score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : score >= 60 ? 'D' : 'F';\n\n console.log('');\n logSection('Score');\n const gradeColor = grade <= 'B' ? chalk.green : grade <= 'C' ? chalk.yellow : chalk.red;\n console.log(` ${gradeColor.bold(grade)} (${score}/100)`);\n console.log(` ${chalk.green(String(passed.length))} passed · ${chalk.yellow(String(warned.length))} warnings · ${chalk.red(String(failed.length))} failures`);\n\n if (failed.length > 0) {\n console.log('');\n logError('Fix the failures above before proceeding.');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n dirExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface HealthCheck {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n}\n\ninterface HealthSection {\n title: string;\n checks: HealthCheck[];\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────\nfunction gradeFromScore(score: number): string {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n}\n\nfunction gradeColor(grade: string): typeof chalk.green {\n if (grade <= 'B') return chalk.green;\n if (grade <= 'C') return chalk.yellow;\n return chalk.red;\n}\n\nfunction statusIcon(status: 'pass' | 'warn' | 'fail'): string {\n switch (status) {\n case 'pass':\n return chalk.green('✓');\n case 'warn':\n return chalk.yellow('⚠');\n case 'fail':\n return chalk.red('✗');\n }\n}\n\nfunction progressBar(percent: number, width: number = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n return chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n}\n\n// ─── Section: Setup Integrity (from doctor) ────────────────────────────\nfunction checkSetup(\n projectDir: string,\n config: AiKitConfig,\n): HealthSection {\n const checks: HealthCheck[] = [];\n\n // Version check\n if (config.version === VERSION) {\n checks.push({ name: 'Version', status: 'pass', detail: `v${VERSION}` });\n } else {\n checks.push({\n name: 'Version',\n status: 'warn',\n detail: `config v${config.version} ≠ CLI v${VERSION} — run \\`ai-kit update\\``,\n });\n }\n\n // CLAUDE.md\n const claudeMd = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeMd));\n if (claudeMd && claudeMd.includes('AI-KIT:START')) {\n checks.push({ name: 'CLAUDE.md', status: 'pass', detail: 'Present with markers' });\n } else if (claudeMd) {\n checks.push({ name: 'CLAUDE.md', status: 'warn', detail: 'Missing AI-KIT markers' });\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'fail', detail: 'Not found' });\n }\n\n // .cursorrules\n if (fileExists(path.join(projectDir, GENERATED_FILES.cursorRules))) {\n checks.push({ name: '.cursorrules', status: 'pass', detail: 'Present' });\n } else {\n checks.push({ name: '.cursorrules', status: 'warn', detail: 'Not generated' });\n }\n\n // Skills count\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (dirExists(skillsDir)) {\n const count = config.commands.length;\n checks.push({ name: 'Skills', status: 'pass', detail: `${count} installed` });\n } else {\n checks.push({ name: 'Skills', status: 'warn', detail: 'No skills directory' });\n }\n\n // Agents\n const agentsDir = path.join(projectDir, GENERATED_FILES.claudeAgents);\n if (dirExists(agentsDir)) {\n try {\n const agentFiles = fs.readdirSync(agentsDir).filter((f: string) => f.endsWith('.md'));\n checks.push({ name: 'Agents', status: 'pass', detail: `${agentFiles.length} configured` });\n } catch {\n checks.push({ name: 'Agents', status: 'warn', detail: 'Could not read agents' });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', detail: 'Not configured' });\n }\n\n // Hooks\n const settingsLocal = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeSettingsLocal));\n if (settingsLocal && settingsLocal.includes('\"hooks\"')) {\n checks.push({ name: 'Hooks', status: 'pass', detail: 'Configured' });\n } else {\n checks.push({ name: 'Hooks', status: 'warn', detail: 'Not configured' });\n }\n\n return { title: 'Setup Integrity', checks };\n}\n\n// ─── Section: Security (from audit) ────────────────────────────────────\nfunction checkSecurity(projectDir: string): HealthSection {\n const checks: HealthCheck[] = [];\n\n // Secrets in CLAUDE.md\n const claudeMd = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeMd));\n if (claudeMd) {\n const secretPatterns = [\n /(?:api[_-]?key|secret|token|password|credential)\\s*[:=]\\s*['\"][^'\"]+['\"]/i,\n /(?:sk|pk|rk)[-_][a-zA-Z0-9]{20,}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /xox[bpoas]-[a-zA-Z0-9-]+/,\n ];\n const hasSecrets = secretPatterns.some((p) => p.test(claudeMd));\n checks.push({\n name: 'Secrets in CLAUDE.md',\n status: hasSecrets ? 'fail' : 'pass',\n detail: hasSecrets ? 'Potential secrets detected — remove immediately' : 'Clean',\n });\n }\n\n // .env gitignored\n const gitignore = readFileSafe(path.join(projectDir, '.gitignore'));\n if (gitignore) {\n const envIgnored = gitignore.includes('.env') || gitignore.includes('.env.local');\n checks.push({\n name: '.env gitignore',\n status: envIgnored ? 'pass' : 'fail',\n detail: envIgnored ? 'Protected' : 'NOT gitignored — add .env to .gitignore',\n });\n }\n\n // MCP secrets check\n const settingsJson = readFileSafe(path.join(projectDir, '.claude', 'settings.json'));\n if (settingsJson) {\n const hasHardcoded = /(?:api[_-]?key|token|secret|password)\\s*[:=]\\s*\"[^\"]+\"/i.test(settingsJson);\n checks.push({\n name: 'MCP config',\n status: hasHardcoded ? 'fail' : 'pass',\n detail: hasHardcoded ? 'Hardcoded secrets in settings.json' : 'No hardcoded secrets',\n });\n }\n\n return { title: 'Security', checks };\n}\n\n// ─── Section: Stack (from stats) ───────────────────────────────────────\nfunction checkStack(config: AiKitConfig): HealthSection {\n const checks: HealthCheck[] = [];\n const scan = config.scanResult;\n\n // Framework\n if (scan.framework !== 'unknown') {\n const label =\n scan.framework === 'nextjs'\n ? `Next.js ${scan.nextjsVersion || ''} (${scan.routerType === 'app' ? 'App Router' : scan.routerType === 'pages' ? 'Pages Router' : 'Hybrid'})`\n : scan.framework;\n checks.push({ name: 'Framework', status: 'pass', detail: label.trim() });\n } else {\n checks.push({ name: 'Framework', status: 'warn', detail: 'Not detected' });\n }\n\n // CMS\n if (scan.cms !== 'none') {\n const label =\n scan.cms === 'sitecore-xmc-v2'\n ? 'Sitecore XM Cloud (Content SDK v2)'\n : scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : scan.cms;\n checks.push({ name: 'CMS', status: 'pass', detail: label });\n }\n\n // TypeScript\n checks.push({\n name: 'TypeScript',\n status: scan.typescript ? 'pass' : 'warn',\n detail: scan.typescript\n ? `Enabled${scan.typescriptStrict ? ' (strict)' : ''}`\n : 'Not detected',\n });\n\n // Styling\n if (scan.styling.length > 0) {\n checks.push({ name: 'Styling', status: 'pass', detail: scan.styling.join(', ') });\n }\n\n // Monorepo\n if (scan.monorepo) {\n checks.push({\n name: 'Monorepo',\n status: 'pass',\n detail: scan.monorepoTool || 'Detected',\n });\n }\n\n return { title: 'Stack Detection', checks };\n}\n\n// ─── Section: Tools (from stats + doctor) ──────────────────────────────\nfunction checkTools(scan: ProjectScan): HealthSection {\n const checks: HealthCheck[] = [];\n\n const toolMap: Record<string, { key: keyof typeof scan.tools; hint: string }> = {\n Playwright: { key: 'playwright', hint: 'npm i -D @playwright/test' },\n ESLint: { key: 'eslint', hint: 'npm i -D eslint' },\n Prettier: { key: 'prettier', hint: 'npm i -D prettier' },\n 'axe-core': { key: 'axeCore', hint: 'npm i -D @axe-core/playwright' },\n Knip: { key: 'knip', hint: 'npm i -D knip' },\n 'Bundle Analyzer': { key: 'bundleAnalyzer', hint: 'npm i -D @next/bundle-analyzer' },\n Storybook: { key: 'storybook', hint: 'npx storybook@latest init' },\n };\n\n for (const [name, { key, hint }] of Object.entries(toolMap)) {\n checks.push({\n name,\n status: scan.tools[key] ? 'pass' : 'warn',\n detail: scan.tools[key] ? 'Detected' : `Missing — ${hint}`,\n });\n }\n\n // MCP servers\n const mcpMap: Record<string, keyof typeof scan.mcpServers> = {\n 'GitHub MCP': 'github',\n 'Figma MCP': 'figma',\n 'Context7 MCP': 'context7',\n 'Perplexity MCP': 'perplexity',\n };\n\n for (const [name, key] of Object.entries(mcpMap)) {\n checks.push({\n name,\n status: scan.mcpServers[key] ? 'pass' : 'warn',\n detail: scan.mcpServers[key] ? 'Configured' : 'Not configured',\n });\n }\n\n return { title: 'Tools & MCP', checks };\n}\n\n// ─── Section: Docs Health ──────────────────────────────────────────────\nfunction checkDocs(projectDir: string): HealthSection {\n const checks: HealthCheck[] = [];\n\n const docsToCheck = [\n { name: 'Mistakes Log', path: 'docs/mistakes-log.md' },\n { name: 'Decisions Log', path: 'docs/decisions-log.md' },\n { name: 'Time Log', path: 'docs/time-log.md' },\n ];\n\n for (const doc of docsToCheck) {\n const content = readFileSafe(path.join(projectDir, doc.path));\n if (content) {\n // Check if it has any entries beyond the template\n const hasEntries = content.includes('## 20') || content.split('---').length > 2;\n checks.push({\n name: doc.name,\n status: hasEntries ? 'pass' : 'warn',\n detail: hasEntries ? 'Has entries' : 'Scaffolded but empty',\n });\n } else {\n checks.push({ name: doc.name, status: 'warn', detail: 'Not found' });\n }\n }\n\n return { title: 'Documentation', checks };\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function healthCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Project Health');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logError('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logError('ai-kit.config.json is corrupted. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Fresh scan for tools/MCP accuracy\n const spinner = ora('Scanning project...').start();\n let freshScan: ProjectScan;\n try {\n freshScan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n } catch {\n spinner.fail('Scan failed — using cached data');\n freshScan = config.scanResult;\n }\n\n // Run all sections\n const sections: HealthSection[] = [\n checkSetup(projectDir, config),\n checkSecurity(projectDir),\n checkStack(config),\n checkTools(freshScan),\n checkDocs(projectDir),\n ];\n\n // Print sections\n let totalPassed = 0;\n let totalWarnings = 0;\n let totalFailed = 0;\n\n for (const section of sections) {\n console.log(`\\n ${chalk.bold(section.title)}`);\n\n for (const check of section.checks) {\n const icon = statusIcon(check.status);\n console.log(` ${icon} ${chalk.white(check.name)}: ${chalk.dim(check.detail)}`);\n\n switch (check.status) {\n case 'pass':\n totalPassed++;\n break;\n case 'warn':\n totalWarnings++;\n break;\n case 'fail':\n totalFailed++;\n break;\n }\n }\n }\n\n // Overall score\n const total = totalPassed + totalWarnings + totalFailed;\n const score = total > 0\n ? Math.round(((totalPassed + totalWarnings * 0.5) / total) * 100)\n : 0;\n const grade = gradeFromScore(score);\n const colorFn = gradeColor(grade);\n\n console.log('');\n console.log(\n ` ${chalk.bold('Overall:')} ${colorFn.bold(grade)} ${chalk.dim(`(${score}/100)`)}`,\n );\n console.log(\n ` ${progressBar(score)} ${chalk.green(String(totalPassed))} passed · ${chalk.yellow(String(totalWarnings))} warnings · ${chalk.red(String(totalFailed))} failures`,\n );\n\n // Quick recommendations\n if (totalFailed > 0 || totalWarnings > 2) {\n console.log('');\n console.log(chalk.bold(' Recommendations:'));\n\n if (totalFailed > 0) {\n const failures = sections.flatMap((s) => s.checks.filter((c) => c.status === 'fail'));\n for (const f of failures.slice(0, 3)) {\n console.log(` ${chalk.red('→')} Fix: ${f.name} — ${f.detail}`);\n }\n }\n\n const warnings = sections.flatMap((s) => s.checks.filter((c) => c.status === 'warn'));\n for (const w of warnings.slice(0, 3)) {\n console.log(` ${chalk.yellow('→')} Improve: ${w.name} — ${w.detail}`);\n }\n }\n\n // Project summary line\n const scan = config.scanResult;\n console.log('');\n console.log(chalk.dim(` v${config.version} · ${scan.projectName} · ${config.commands.length} skills · ${config.guides.length} guides · Generated ${config.generatedAt}`));\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n dirExists,\n readFileSafe,\n readJsonSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface PatternMatch {\n pattern: string;\n file: string;\n line: number;\n}\n\ninterface PatternCategory {\n name: string;\n patterns: {\n label: string;\n regex: RegExp;\n matches: PatternMatch[];\n }[];\n}\n\n// ─── Pattern Definitions ────────────────────────────────────────────────\nfunction buildPatternCategories(): PatternCategory[] {\n return [\n {\n name: 'Data Fetching',\n patterns: [\n { label: 'fetch()', regex: /\\bfetch\\s*\\(/, matches: [] },\n { label: 'axios', regex: /\\baxios\\b/, matches: [] },\n { label: 'useSWR', regex: /\\buseSWR\\b/, matches: [] },\n { label: 'useQuery (React Query)', regex: /\\buseQuery\\b/, matches: [] },\n { label: 'useMutation', regex: /\\buseMutation\\b/, matches: [] },\n { label: 'getServerSideProps', regex: /\\bgetServerSideProps\\b/, matches: [] },\n { label: 'getStaticProps', regex: /\\bgetStaticProps\\b/, matches: [] },\n { label: 'Server Actions (use server)', regex: /['\"]use server['\"]/, matches: [] },\n ],\n },\n {\n name: 'Error Handling',\n patterns: [\n { label: 'try/catch', regex: /\\btry\\s*\\{/, matches: [] },\n { label: 'Error Boundary', regex: /\\bErrorBoundary\\b/, matches: [] },\n { label: 'error.tsx (App Router)', regex: /export\\s+default.*error/i, matches: [] },\n { label: '.catch()', regex: /\\.catch\\s*\\(/, matches: [] },\n { label: 'onError callback', regex: /\\bonError\\b/, matches: [] },\n ],\n },\n {\n name: 'Form Handling',\n patterns: [\n { label: 'useState (controlled)', regex: /\\buseState\\b.*(?:onChange|handleChange)/, matches: [] },\n { label: 'useRef (uncontrolled)', regex: /\\buseRef\\b/, matches: [] },\n { label: 'react-hook-form', regex: /\\buseForm\\b/, matches: [] },\n { label: 'Formik', regex: /\\buseFormik\\b|\\bFormik\\b/, matches: [] },\n { label: 'Zod validation', regex: /\\bz\\.\\w+\\(|zod/, matches: [] },\n { label: 'Yup validation', regex: /\\byup\\.\\w+\\(|\\bYup\\b/, matches: [] },\n ],\n },\n {\n name: 'Auth Patterns',\n patterns: [\n { label: 'NextAuth / Auth.js', regex: /\\buseSession\\b|\\bgetServerSession\\b|\\bnext-auth\\b/, matches: [] },\n { label: 'JWT handling', regex: /\\bjwt\\b|\\bjsonwebtoken\\b/, matches: [] },\n { label: 'Auth middleware', regex: /\\bmiddleware\\b.*auth|auth.*\\bmiddleware\\b/i, matches: [] },\n { label: 'Protected route', regex: /\\bProtectedRoute\\b|\\bwithAuth\\b|\\brequireAuth\\b/, matches: [] },\n ],\n },\n {\n name: 'State Management',\n patterns: [\n { label: 'useState', regex: /\\buseState\\b/, matches: [] },\n { label: 'useReducer', regex: /\\buseReducer\\b/, matches: [] },\n { label: 'useContext', regex: /\\buseContext\\b/, matches: [] },\n { label: 'Zustand', regex: /\\bcreate\\b.*\\bset\\b.*\\bget\\b|\\bzustand\\b/, matches: [] },\n { label: 'Redux', regex: /\\buseSelector\\b|\\buseDispatch\\b|\\bcreateSlice\\b/, matches: [] },\n { label: 'Jotai', regex: /\\buseAtom\\b|\\batom\\(/, matches: [] },\n { label: 'Recoil', regex: /\\buseRecoilState\\b|\\brecoil\\b/i, matches: [] },\n ],\n },\n {\n name: 'API Route Patterns',\n patterns: [\n { label: 'NextRequest/NextResponse', regex: /\\bNextRequest\\b|\\bNextResponse\\b/, matches: [] },\n { label: 'Route handler (GET/POST)', regex: /export\\s+(?:async\\s+)?function\\s+(?:GET|POST|PUT|DELETE|PATCH)\\b/, matches: [] },\n { label: 'API route (pages)', regex: /\\bNextApiRequest\\b|\\bNextApiResponse\\b/, matches: [] },\n { label: 'tRPC', regex: /\\btrpc\\b|\\bcreateRouter\\b.*\\bprocedure\\b/i, matches: [] },\n ],\n },\n ];\n}\n\n// ─── File Walker ────────────────────────────────────────────────────────\nconst IGNORE_DIRS = [\n 'node_modules', '.next', '.git', 'dist', 'build', '.turbo',\n '.storybook', 'coverage', '.cache',\n];\n\nfunction walkTsFiles(dir: string, files: string[]): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (IGNORE_DIRS.includes(entry.name)) continue;\n walkTsFiles(full, files);\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n files.push(full);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function patternsCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Pattern Library');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Discover files\n const spinner = ora('Scanning for code patterns...').start();\n\n const files: string[] = [];\n const srcDir = path.join(projectDir, 'src');\n if (dirExists(srcDir)) {\n walkTsFiles(srcDir, files);\n } else {\n walkTsFiles(projectDir, files);\n }\n\n if (files.length === 0) {\n spinner.fail('No TypeScript/JavaScript files found.');\n return;\n }\n\n spinner.text = `Analyzing ${files.length} files for patterns...`;\n\n // Build categories and scan\n const categories = buildPatternCategories();\n\n for (const file of files) {\n const content = readFileSafe(file);\n if (!content) continue;\n\n const lines = content.split('\\n');\n\n for (const category of categories) {\n for (const pattern of category.patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (pattern.regex.test(lines[i])) {\n pattern.matches.push({\n pattern: pattern.label,\n file: path.relative(projectDir, file),\n line: i + 1,\n });\n }\n }\n }\n }\n }\n\n spinner.succeed(`Scanned ${files.length} files`);\n\n // Display results\n let totalPatterns = 0;\n\n for (const category of categories) {\n const activePatterns = category.patterns.filter((p) => p.matches.length > 0);\n if (activePatterns.length === 0) continue;\n\n console.log(`\\n ${chalk.bold(category.name)}`);\n\n for (const pattern of activePatterns) {\n const count = pattern.matches.length;\n totalPatterns += count;\n const uniqueFiles = new Set(pattern.matches.map((m) => m.file)).size;\n console.log(\n ` ${chalk.green('✓')} ${chalk.white(pattern.label)}: ${chalk.cyan(String(count))} occurrences in ${chalk.cyan(String(uniqueFiles))} files`,\n );\n }\n }\n\n if (totalPatterns === 0) {\n logInfo('No recognizable patterns found.');\n return;\n }\n\n // Write output file\n const outputDir = path.join(projectDir, 'ai-kit');\n fs.ensureDirSync(outputDir);\n const outputPath = path.join(outputDir, 'patterns.md');\n\n const lines: string[] = [\n '# Code Patterns',\n '',\n `> Auto-generated by ai-kit on ${new Date().toISOString().split('T')[0]}`,\n `> Scanned ${files.length} files`,\n '',\n ];\n\n for (const category of categories) {\n const activePatterns = category.patterns.filter((p) => p.matches.length > 0);\n if (activePatterns.length === 0) continue;\n\n lines.push(`## ${category.name}`, '');\n lines.push('| Pattern | Occurrences | Files |');\n lines.push('| ------- | ----------: | ----: |');\n\n for (const pattern of activePatterns) {\n const uniqueFiles = new Set(pattern.matches.map((m) => m.file)).size;\n lines.push(`| ${pattern.label} | ${pattern.matches.length} | ${uniqueFiles} |`);\n }\n\n lines.push('');\n\n // List top files per pattern\n for (const pattern of activePatterns) {\n if (pattern.matches.length <= 3) continue;\n const fileCounts = new Map<string, number>();\n for (const m of pattern.matches) {\n fileCounts.set(m.file, (fileCounts.get(m.file) || 0) + 1);\n }\n const topFiles = Array.from(fileCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n lines.push(`### ${pattern.label} — top files`, '');\n for (const [file, count] of topFiles) {\n lines.push(`- \\`${file}\\` (${count})`);\n }\n lines.push('');\n }\n }\n\n fs.writeFileSync(outputPath, lines.join('\\n'), 'utf-8');\n\n console.log('');\n logSuccess(`Pattern library written to ${chalk.cyan('ai-kit/patterns.md')}`);\n logInfo(`Total: ${chalk.bold(String(totalPatterns))} pattern occurrences across ${chalk.bold(String(files.length))} files`);\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport { scanComponents } from '../scanner/components.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n readFileSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface DeadCodeEntry {\n name: string;\n filePath: string;\n importCount: number;\n testOnly: boolean;\n status: 'used' | 'unused' | 'test-only';\n}\n\n// ─── File Walker ────────────────────────────────────────────────────────\nconst IGNORE_DIRS = [\n 'node_modules', '.next', '.git', 'dist', 'build', '.turbo',\n '.storybook', 'coverage', '.cache',\n];\n\nfunction collectAllFiles(dir: string, files: string[]): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (IGNORE_DIRS.includes(entry.name)) continue;\n collectAllFiles(full, files);\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n files.push(full);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\nfunction isTestOrStoryFile(filePath: string): boolean {\n const name = path.basename(filePath).toLowerCase();\n return (\n name.includes('.test.') ||\n name.includes('.spec.') ||\n name.includes('.stories.') ||\n name.includes('__tests__') ||\n name.includes('__mocks__')\n );\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function deadCodeCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Dead Code Report');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Scan components\n const spinner = ora('Scanning components...').start();\n const scanResult = scanComponents(projectDir);\n\n if (scanResult.components.length === 0) {\n spinner.fail('No components found.');\n return;\n }\n\n spinner.text = `Found ${scanResult.components.length} components. Checking imports...`;\n\n // Collect all project files for import search\n const allFiles: string[] = [];\n const srcDir = path.join(projectDir, 'src');\n if (fs.existsSync(srcDir)) {\n collectAllFiles(srcDir, allFiles);\n } else {\n collectAllFiles(projectDir, allFiles);\n }\n\n // Read all file contents once for efficiency\n const fileContents = new Map<string, string>();\n for (const file of allFiles) {\n const content = readFileSafe(file);\n if (content) {\n fileContents.set(file, content);\n }\n }\n\n spinner.text = 'Analyzing import references...';\n\n // For each component, search for imports across the project\n const entries: DeadCodeEntry[] = [];\n\n for (const component of scanResult.components) {\n const componentFile = component.filePath;\n let importCount = 0;\n let testOnlyImports = 0;\n let productionImports = 0;\n\n // Build regex patterns to find imports of this component\n // Match: import ... from '...ComponentName' or import ... from '...ComponentName/...'\n const namePattern = new RegExp(\n `(?:import|from)\\\\s+.*['\"][^'\"]*(?:/|\\\\b)${escapeRegex(component.name)}(?:[/'\"]|\\\\b)`,\n );\n\n for (const [file, content] of fileContents) {\n // Skip the component's own file\n if (path.resolve(file) === path.resolve(componentFile)) continue;\n\n if (namePattern.test(content)) {\n importCount++;\n if (isTestOrStoryFile(file)) {\n testOnlyImports++;\n } else {\n productionImports++;\n }\n }\n }\n\n let status: DeadCodeEntry['status'];\n if (importCount === 0) {\n status = 'unused';\n } else if (productionImports === 0 && testOnlyImports > 0) {\n status = 'test-only';\n } else {\n status = 'used';\n }\n\n entries.push({\n name: component.name,\n filePath: component.relativePath,\n importCount,\n testOnly: status === 'test-only',\n status,\n });\n }\n\n spinner.succeed(`Analyzed ${scanResult.components.length} components across ${allFiles.length} files`);\n\n // Sort: unused first, then test-only, then used\n const statusOrder: Record<string, number> = { unused: 0, 'test-only': 1, used: 2 };\n entries.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n // Count summaries\n const unused = entries.filter((e) => e.status === 'unused');\n const testOnly = entries.filter((e) => e.status === 'test-only');\n const used = entries.filter((e) => e.status === 'used');\n\n // Display table\n console.log('');\n const nameWidth = 30;\n const pathWidth = 45;\n const countWidth = 8;\n const statusWidth = 12;\n\n // Header\n console.log(\n ` ${chalk.bold('Component'.padEnd(nameWidth))} ${chalk.bold('Path'.padEnd(pathWidth))} ${chalk.bold('Imports'.padStart(countWidth))} ${chalk.bold('Status'.padEnd(statusWidth))}`,\n );\n console.log(\n ` ${'─'.repeat(nameWidth)} ${'─'.repeat(pathWidth)} ${'─'.repeat(countWidth)} ${'─'.repeat(statusWidth)}`,\n );\n\n for (const entry of entries) {\n const name = entry.name.length > nameWidth - 1\n ? entry.name.substring(0, nameWidth - 3) + '...'\n : entry.name.padEnd(nameWidth);\n\n const filePath = entry.filePath.length > pathWidth - 1\n ? '...' + entry.filePath.substring(entry.filePath.length - pathWidth + 4)\n : entry.filePath.padEnd(pathWidth);\n\n const count = String(entry.importCount).padStart(countWidth);\n\n let statusLabel: string;\n switch (entry.status) {\n case 'unused':\n statusLabel = chalk.red('unused');\n break;\n case 'test-only':\n statusLabel = chalk.yellow('test-only');\n break;\n case 'used':\n statusLabel = chalk.green('used');\n break;\n }\n\n console.log(` ${name} ${chalk.dim(filePath)} ${count} ${statusLabel}`);\n }\n\n // Summary\n console.log('');\n console.log(\n ` ${chalk.bold('Summary:')} ${chalk.red(String(unused.length))} unused · ${chalk.yellow(String(testOnly.length))} test-only · ${chalk.green(String(used.length))} actively used`,\n );\n\n if (unused.length > 0) {\n console.log('');\n logWarning('Unused components may be dead code. Consider removing them or verify they are entry points.');\n }\n\n if (testOnly.length > 0) {\n logInfo('Test-only components are only imported in test/story files.');\n }\n\n console.log('');\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { readFileSafe, dirExists } from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\nexport interface ComponentProp {\n name: string;\n type: string;\n required: boolean;\n defaultValue?: string;\n}\n\nexport interface SitecoreComponentMeta {\n usesContext: boolean;\n datasourceFields: string[];\n renderingParams: string[];\n placeholders: string[];\n graphqlQueries: string[];\n}\n\nexport interface ComponentInfo {\n name: string;\n filePath: string;\n relativePath: string;\n category: string;\n props: ComponentProp[];\n sitecore: SitecoreComponentMeta;\n dependencies: string[];\n hasTests: boolean;\n hasStory: boolean;\n hasAiDoc: boolean;\n exportType: 'default' | 'named' | 'both';\n}\n\nexport interface ComponentScanResult {\n components: ComponentInfo[];\n totalFiles: number;\n directories: string[];\n}\n\n// ─── File Discovery ────────────────────────────────────────────────────\nconst COMPONENT_DIRS = [\n 'src/components',\n 'src/Components',\n 'components',\n 'Components',\n 'src/rendering/src/components',\n 'src/rendering/src/Components',\n 'headapps',\n 'app',\n];\n\nconst IGNORE_PATTERNS = [\n 'node_modules',\n '.next',\n '.storybook',\n '__tests__',\n '__mocks__',\n 'dist',\n 'build',\n '.git',\n];\n\nconst TEST_SUFFIXES = ['.test.tsx', '.test.ts', '.spec.tsx', '.spec.ts'];\nconst STORY_SUFFIXES = ['.stories.tsx', '.stories.ts', '.stories.mdx'];\n\nfunction findComponentFiles(projectPath: string): { files: string[]; directories: string[] } {\n const files: string[] = [];\n const directories = new Set<string>();\n\n for (const dir of COMPONENT_DIRS) {\n const fullDir = path.join(projectPath, dir);\n if (dirExists(fullDir)) {\n walkForComponents(fullDir, files, directories);\n }\n }\n\n return { files, directories: Array.from(directories) };\n}\n\nfunction walkForComponents(\n dir: string,\n files: string[],\n directories: Set<string>,\n): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (IGNORE_PATTERNS.includes(entry.name)) continue;\n walkForComponents(full, files, directories);\n continue;\n }\n\n if (!entry.name.endsWith('.tsx')) continue;\n\n // Skip test and story files\n const isTest = TEST_SUFFIXES.some((s) => entry.name.endsWith(s));\n const isStory = STORY_SUFFIXES.some((s) => entry.name.endsWith(s));\n if (isTest || isStory) continue;\n\n // Skip index-only re-exports (very small files)\n const content = readFileSafe(full);\n if (!content || content.length < 50) continue;\n\n // Must export a React component (function or const with JSX return)\n if (isReactComponent(content)) {\n files.push(full);\n directories.add(dir);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\nfunction isReactComponent(content: string): boolean {\n // Check for common React component patterns\n const patterns = [\n /export\\s+(?:default\\s+)?function\\s+\\w+/,\n /export\\s+(?:default\\s+)?const\\s+\\w+\\s*[:=]\\s*(?:React\\.)?(?:FC|FunctionComponent|memo|forwardRef)/,\n /export\\s+(?:default\\s+)?const\\s+\\w+\\s*=\\s*\\([^)]*\\)\\s*(?::\\s*\\w+)?\\s*=>/,\n /export\\s+default\\s+\\w+/,\n ];\n\n const hasExport = patterns.some((p) => p.test(content));\n const hasJsx = /<[\\w.]+[\\s/>]/.test(content) || /return\\s*\\(/.test(content);\n\n return hasExport && hasJsx;\n}\n\n// ─── Metadata Extraction ───────────────────────────────────────────────\nfunction extractComponentName(filePath: string, content: string): string {\n // Try to extract from export statement\n const defaultExport = content.match(\n /export\\s+default\\s+function\\s+(\\w+)/,\n );\n if (defaultExport) return defaultExport[1];\n\n const namedExport = content.match(\n /export\\s+(?:const|function)\\s+(\\w+)/,\n );\n if (namedExport) return namedExport[1];\n\n // Fallback to filename\n return path.basename(filePath, '.tsx');\n}\n\nfunction extractExportType(content: string): 'default' | 'named' | 'both' {\n const hasDefault = /export\\s+default\\s/.test(content);\n const hasNamed = /export\\s+(?:const|function|class)\\s+\\w+/.test(content);\n\n if (hasDefault && hasNamed) return 'both';\n if (hasDefault) return 'default';\n return 'named';\n}\n\nfunction extractProps(content: string): ComponentProp[] {\n const props: ComponentProp[] = [];\n\n // Match interface/type props definitions\n // Pattern: interface XxxProps { ... }\n const propsInterface = content.match(\n /(?:interface|type)\\s+\\w*Props\\w*\\s*(?:=\\s*)?{([^}]*)}/s,\n );\n\n if (!propsInterface) return props;\n\n const body = propsInterface[1];\n const lines = body.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) continue;\n\n // Match: propName: Type or propName?: Type\n const propMatch = trimmed.match(/^(\\w+)(\\?)?:\\s*(.+?)(?:;|$)/);\n if (propMatch) {\n props.push({\n name: propMatch[1],\n type: propMatch[3].trim().replace(/;$/, ''),\n required: !propMatch[2],\n });\n }\n }\n\n return props;\n}\n\nfunction extractSitecoreMeta(content: string): SitecoreComponentMeta {\n const meta: SitecoreComponentMeta = {\n usesContext: false,\n datasourceFields: [],\n renderingParams: [],\n placeholders: [],\n graphqlQueries: [],\n };\n\n // Detect useSitecoreContext\n meta.usesContext = /useSitecoreContext/.test(content);\n\n // Detect datasource field access patterns\n // fields.fieldName or fields?.fieldName or props.fields.fieldName\n const fieldAccess = content.matchAll(\n /fields[?.]\\.(\\w+)/g,\n );\n for (const match of fieldAccess) {\n if (!meta.datasourceFields.includes(match[1])) {\n meta.datasourceFields.push(match[1]);\n }\n }\n\n // Also check for Field component usage: <Text field={fields.title} />\n const fieldComponents = content.matchAll(\n /field=\\{(?:fields|props\\.fields)[?.]\\.(\\w+)\\}/g,\n );\n for (const match of fieldComponents) {\n if (!meta.datasourceFields.includes(match[1])) {\n meta.datasourceFields.push(match[1]);\n }\n }\n\n // Detect rendering params\n // params.paramName or params?.paramName\n const paramAccess = content.matchAll(\n /params[?.]\\.(\\w+)/g,\n );\n for (const match of paramAccess) {\n const name = match[1];\n if (name !== 'styles' && !meta.renderingParams.includes(name)) {\n meta.renderingParams.push(name);\n }\n }\n\n // Detect Placeholder usage\n const placeholders = content.matchAll(\n /(?:<Placeholder|Placeholder)\\s[^>]*name=[\"'{]([^\"'}]+)[\"'}]/g,\n );\n for (const match of placeholders) {\n if (!meta.placeholders.includes(match[1])) {\n meta.placeholders.push(match[1]);\n }\n }\n\n // Detect GraphQL queries\n const gqlQueries = content.matchAll(\n /(?:gql|graphql)`\\s*(query\\s+(\\w+))/g,\n );\n for (const match of gqlQueries) {\n meta.graphqlQueries.push(match[2] || match[1]);\n }\n\n return meta;\n}\n\nfunction extractDependencies(content: string): string[] {\n const deps: string[] = [];\n const imports = content.matchAll(\n /import\\s+(?:{[^}]+}|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n );\n\n for (const match of imports) {\n const importPath = match[1];\n // Only track local component imports (relative paths)\n if (importPath.startsWith('.') || importPath.startsWith('..')) {\n const basename = path.basename(importPath).replace(/\\.\\w+$/, '');\n // Likely a component if PascalCase\n if (/^[A-Z]/.test(basename)) {\n deps.push(basename);\n }\n }\n }\n\n return deps;\n}\n\nfunction checkForTests(componentPath: string, componentName: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n for (const suffix of TEST_SUFFIXES) {\n if (fs.existsSync(path.join(dir, base + suffix))) return true;\n }\n\n // Check __tests__ subdirectory\n const testsDir = path.join(dir, '__tests__');\n if (dirExists(testsDir)) {\n for (const suffix of TEST_SUFFIXES) {\n if (fs.existsSync(path.join(testsDir, base + suffix))) return true;\n if (fs.existsSync(path.join(testsDir, componentName + suffix))) return true;\n }\n }\n\n return false;\n}\n\nfunction checkForStory(componentPath: string, componentName: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n for (const suffix of STORY_SUFFIXES) {\n if (fs.existsSync(path.join(dir, base + suffix))) return true;\n if (fs.existsSync(path.join(dir, componentName + suffix))) return true;\n }\n\n return false;\n}\n\nfunction checkForAiDoc(componentPath: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n return (\n fs.existsSync(path.join(dir, `${base}.ai.md`)) ||\n fs.existsSync(path.join(dir, 'component.ai.md'))\n );\n}\n\nfunction categorizeComponent(relativePath: string): string {\n const lower = relativePath.toLowerCase();\n\n if (lower.includes('layout')) return 'layout';\n if (lower.includes('page') || lower.includes('route')) return 'page';\n if (lower.includes('form')) return 'form';\n if (lower.includes('nav') || lower.includes('header') || lower.includes('footer')) return 'navigation';\n if (lower.includes('ui') || lower.includes('common') || lower.includes('shared')) return 'ui';\n if (lower.includes('feature')) return 'feature';\n if (lower.includes('marketing') || lower.includes('hero') || lower.includes('banner')) return 'marketing';\n if (lower.includes('card') || lower.includes('list') || lower.includes('grid')) return 'content';\n\n return 'general';\n}\n\n// ─── Main Scanner ──────────────────────────────────────────────────────\nfunction parseComponent(\n filePath: string,\n projectPath: string,\n): ComponentInfo | null {\n const content = readFileSafe(filePath);\n if (!content) return null;\n\n const name = extractComponentName(filePath, content);\n const relativePath = path.relative(projectPath, filePath);\n\n return {\n name,\n filePath,\n relativePath,\n category: categorizeComponent(relativePath),\n props: extractProps(content),\n sitecore: extractSitecoreMeta(content),\n dependencies: extractDependencies(content),\n hasTests: checkForTests(filePath, name),\n hasStory: checkForStory(filePath, name),\n hasAiDoc: checkForAiDoc(filePath),\n exportType: extractExportType(content),\n };\n}\n\nexport function scanComponents(projectPath: string): ComponentScanResult {\n const { files, directories } = findComponentFiles(projectPath);\n\n const components: ComponentInfo[] = [];\n\n for (const file of files) {\n const info = parseComponent(file, projectPath);\n if (info) {\n components.push(info);\n }\n }\n\n // Sort by name for consistent output\n components.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n components,\n totalFiles: files.length,\n directories,\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport { scanComponents } from '../scanner/components.js';\nimport type { ComponentInfo } from '../scanner/components.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n readFileSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface DriftEntry {\n name: string;\n filePath: string;\n documentedProps: string[];\n actualProps: string[];\n documentedFields: string[];\n actualFields: string[];\n missingFromDoc: string[];\n extraInDoc: string[];\n fieldMissingFromDoc: string[];\n fieldExtraInDoc: string[];\n status: 'in-sync' | 'drifted' | 'outdated';\n}\n\n// ─── AI Doc Parsing ─────────────────────────────────────────────────────\nfunction parseAiDocFrontmatter(content: string): {\n props: string[];\n fields: string[];\n} {\n const props: string[] = [];\n const fields: string[] = [];\n\n // Extract YAML frontmatter between --- markers\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) return { props, fields };\n\n const frontmatter = frontmatterMatch[1];\n const lines = frontmatter.split('\\n');\n\n let currentSection: 'none' | 'props' | 'fields' = 'none';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Detect section headers\n if (/^props\\s*:/i.test(trimmed)) {\n currentSection = 'props';\n continue;\n }\n if (/^(?:fields|sitecore[-_]?fields|datasource[-_]?fields)\\s*:/i.test(trimmed)) {\n currentSection = 'fields';\n continue;\n }\n\n // Any other top-level key resets\n if (/^\\w+\\s*:/.test(trimmed) && !trimmed.startsWith('-')) {\n currentSection = 'none';\n continue;\n }\n\n // Collect list items\n if (currentSection !== 'none' && trimmed.startsWith('-')) {\n const value = trimmed\n .replace(/^-\\s*/, '')\n .replace(/\\s*[:#].*$/, '') // Strip trailing comments/types\n .trim();\n\n if (value) {\n if (currentSection === 'props') props.push(value);\n if (currentSection === 'fields') fields.push(value);\n }\n }\n }\n\n return { props, fields };\n}\n\nfunction findAiDocPath(componentPath: string): string | null {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n const candidates = [\n path.join(dir, `${base}.ai.md`),\n path.join(dir, 'component.ai.md'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n// ─── Drift Analysis ─────────────────────────────────────────────────────\nfunction analyzeDrift(component: ComponentInfo, projectDir: string): DriftEntry | null {\n const aiDocPath = findAiDocPath(component.filePath);\n if (!aiDocPath) return null;\n\n const aiDocContent = readFileSafe(aiDocPath);\n if (!aiDocContent) return null;\n\n const { props: documentedProps, fields: documentedFields } = parseAiDocFrontmatter(aiDocContent);\n const actualProps = component.props.map((p) => p.name);\n const actualFields = component.sitecore.datasourceFields;\n\n // Calculate drift for props\n const missingFromDoc = actualProps.filter((p) => !documentedProps.includes(p));\n const extraInDoc = documentedProps.filter((p) => !actualProps.includes(p));\n\n // Calculate drift for Sitecore fields\n const fieldMissingFromDoc = actualFields.filter((f) => !documentedFields.includes(f));\n const fieldExtraInDoc = documentedFields.filter((f) => !actualFields.includes(f));\n\n const hasPropDrift = missingFromDoc.length > 0 || extraInDoc.length > 0;\n const hasFieldDrift = fieldMissingFromDoc.length > 0 || fieldExtraInDoc.length > 0;\n\n let status: DriftEntry['status'];\n if (!hasPropDrift && !hasFieldDrift) {\n status = 'in-sync';\n } else if (extraInDoc.length > 0 || fieldExtraInDoc.length > 0) {\n // Doc mentions things that no longer exist in code\n status = 'outdated';\n } else {\n status = 'drifted';\n }\n\n return {\n name: component.name,\n filePath: component.relativePath,\n documentedProps,\n actualProps,\n documentedFields,\n actualFields,\n missingFromDoc,\n extraInDoc,\n fieldMissingFromDoc,\n fieldExtraInDoc,\n status,\n };\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function driftCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Component Drift Detector');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Scan components\n const spinner = ora('Scanning components...').start();\n const scanResult = scanComponents(projectDir);\n\n if (scanResult.components.length === 0) {\n spinner.fail('No components found.');\n return;\n }\n\n // Filter to components with .ai.md files\n const componentsWithDocs = scanResult.components.filter((c) => c.hasAiDoc);\n\n if (componentsWithDocs.length === 0) {\n spinner.warn('No components have .ai.md documentation files.');\n logInfo('Run `ai-kit generate` to create component documentation.');\n console.log('');\n return;\n }\n\n spinner.text = `Analyzing drift for ${componentsWithDocs.length} documented components...`;\n\n // Analyze each component\n const entries: DriftEntry[] = [];\n\n for (const component of componentsWithDocs) {\n const entry = analyzeDrift(component, projectDir);\n if (entry) {\n entries.push(entry);\n }\n }\n\n spinner.succeed(`Analyzed ${entries.length} components with .ai.md docs`);\n\n // Sort: drifted/outdated first, then in-sync\n const statusOrder: Record<string, number> = { outdated: 0, drifted: 1, 'in-sync': 2 };\n entries.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n // Count summaries\n const inSync = entries.filter((e) => e.status === 'in-sync');\n const drifted = entries.filter((e) => e.status === 'drifted');\n const outdated = entries.filter((e) => e.status === 'outdated');\n\n // Display table\n console.log('');\n const nameWidth = 28;\n const docPropsWidth = 12;\n const actPropsWidth = 12;\n const statusWidth = 12;\n\n // Header\n console.log(\n ` ${chalk.bold('Component'.padEnd(nameWidth))} ${chalk.bold('Doc Props'.padStart(docPropsWidth))} ${chalk.bold('Act Props'.padStart(actPropsWidth))} ${chalk.bold('Status'.padEnd(statusWidth))}`,\n );\n console.log(\n ` ${'─'.repeat(nameWidth)} ${'─'.repeat(docPropsWidth)} ${'─'.repeat(actPropsWidth)} ${'─'.repeat(statusWidth)}`,\n );\n\n for (const entry of entries) {\n const name = entry.name.length > nameWidth - 1\n ? entry.name.substring(0, nameWidth - 3) + '...'\n : entry.name.padEnd(nameWidth);\n\n const docProps = String(entry.documentedProps.length).padStart(docPropsWidth);\n const actProps = String(entry.actualProps.length).padStart(actPropsWidth);\n\n let statusLabel: string;\n switch (entry.status) {\n case 'in-sync':\n statusLabel = chalk.green('in-sync');\n break;\n case 'drifted':\n statusLabel = chalk.yellow('drifted');\n break;\n case 'outdated':\n statusLabel = chalk.red('outdated');\n break;\n }\n\n console.log(` ${name} ${docProps} ${actProps} ${statusLabel}`);\n\n // Show details for drifted/outdated\n if (entry.status !== 'in-sync') {\n if (entry.missingFromDoc.length > 0) {\n console.log(\n chalk.dim(` + undocumented props: ${entry.missingFromDoc.join(', ')}`),\n );\n }\n if (entry.extraInDoc.length > 0) {\n console.log(\n chalk.dim(` - removed props (still in doc): ${entry.extraInDoc.join(', ')}`),\n );\n }\n if (entry.fieldMissingFromDoc.length > 0) {\n console.log(\n chalk.dim(` + undocumented fields: ${entry.fieldMissingFromDoc.join(', ')}`),\n );\n }\n if (entry.fieldExtraInDoc.length > 0) {\n console.log(\n chalk.dim(` - removed fields (still in doc): ${entry.fieldExtraInDoc.join(', ')}`),\n );\n }\n }\n }\n\n // Summary\n console.log('');\n console.log(\n ` ${chalk.bold('Summary:')} ${chalk.green(String(inSync.length))} in-sync · ${chalk.yellow(String(drifted.length))} drifted · ${chalk.red(String(outdated.length))} outdated`,\n );\n console.log(\n chalk.dim(` ${scanResult.components.length} total components, ${componentsWithDocs.length} with .ai.md, ${scanResult.components.length - componentsWithDocs.length} undocumented`),\n );\n\n if (drifted.length > 0 || outdated.length > 0) {\n console.log('');\n logWarning('Run `ai-kit generate` to update .ai.md files for drifted components.');\n }\n\n console.log('');\n}\n"],"mappings":"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","names":["path","fs","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","ora","confirm","path","confirm","ora","fs","path","fs","confirm","path","confirm","fs","path","fs","chalk","ora","path","fs","chalk","ora","path","chalk","ora","path","ora","chalk","path","fs","chalk","ora","path","chalk","ora","generate","fs","path","fs","ora","select","path","select","ora","fmt","fs","path","chalk","path","chalk","path","fs","chalk","path","settings","fs","chalk","gradeColor","path","fs","chalk","ora","chalk","progressBar","path","fs","ora","path","fs","chalk","ora","fs","path","chalk","ora","lines","path","fs","chalk","ora","path","fs","path","fs","IGNORE_DIRS","fs","path","chalk","ora","path","fs","chalk","ora","path","fs","chalk","ora"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/commands/init.ts","../src/scanner/index.ts","../src/utils.ts","../src/scanner/nextjs.ts","../src/scanner/sitecore.ts","../src/scanner/styling.ts","../src/scanner/typescript.ts","../src/scanner/monorepo.ts","../src/scanner/package-manager.ts","../src/scanner/figma.ts","../src/scanner/tools.ts","../src/scanner/mcp.ts","../src/scanner/design-tokens.ts","../src/scanner/static-site.ts","../src/scanner/aiignore.ts","../src/generator/assembler.ts","../src/generator/claude-md.ts","../src/generator/cursorrules.ts","../src/generator/cursor-mdc.ts","../src/generator/config.ts","../src/generator/hooks.ts","../src/copier/skills.ts","../src/copier/guides.ts","../src/copier/docs.ts","../src/copier/agents.ts","../src/copier/contexts.ts","../src/commands/update.ts","../src/commands/reset.ts","../src/commands/tokens.ts","../src/commands/doctor.ts","../src/commands/diff.ts","../src/commands/export.ts","../src/commands/stats.ts","../src/commands/audit.ts","../src/commands/health.ts","../src/commands/patterns.ts","../src/commands/dead-code.ts","../src/scanner/components.ts","../src/commands/drift.ts","../src/commands/component-registry.ts","../src/generator/component-docs.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { VERSION } from './constants.js';\nimport { initCommand } from './commands/init.js';\nimport { updateCommand } from './commands/update.js';\nimport { resetCommand } from './commands/reset.js';\nimport { tokensCommand } from './commands/tokens.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { diffCommand } from './commands/diff.js';\nimport { exportCommand } from './commands/export.js';\nimport { statsCommand } from './commands/stats.js';\nimport { auditCommand } from './commands/audit.js';\nimport { healthCommand } from './commands/health.js';\nimport { patternsCommand } from './commands/patterns.js';\nimport { deadCodeCommand } from './commands/dead-code.js';\nimport { driftCommand } from './commands/drift.js';\nimport { componentRegistryCommand } from './commands/component-registry.js';\n\nconst program = new Command();\n\nprogram\n .name('ai-kit')\n .description(\n 'AI-powered project setup — generates CLAUDE.md, .cursorrules, slash commands, and guides tailored to your stack.',\n )\n .version(VERSION);\n\nprogram\n .command('init')\n .description('Scan your project and generate AI configs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await initCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('update')\n .description('Re-scan and update all generated AI configs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await updateCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('reset')\n .description('Remove all AI Kit generated files')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await resetCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('tokens')\n .description('Show token usage summary and cost estimates')\n .option('--export', 'Export data and open HTML dashboard')\n .option('--csv', 'Export daily usage to CSV file')\n .option('--budget <amount>', 'Monthly budget in USD (default: $20)', parseFloat)\n .action(async (opts: { export?: boolean; csv?: boolean; budget?: number }) => {\n try {\n await tokensCommand(opts);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('doctor')\n .description('Diagnose AI Kit setup and check for issues')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await doctorCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('diff')\n .description('Show what would change on update (dry run)')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await diffCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('export')\n .description('Export rules to other AI tools (Windsurf, Aider, Cline)')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .option('--format <format>', 'Export format: windsurf, aider, cline, or all')\n .action(async (targetPath?: string, opts?: { format?: string }) => {\n try {\n await exportCommand(targetPath, opts);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('stats')\n .description('Show project setup statistics and complexity')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await statsCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('audit')\n .description('Security and configuration audit for AI agent setup')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await auditCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('health')\n .description('One-glance project health — setup, security, stack, tools, and docs')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await healthCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('patterns')\n .description('Generate a pattern library from recurring code patterns')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await patternsCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('dead-code')\n .description('Find unused components and dead code')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await deadCodeCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('drift')\n .description('Detect drift between component code and .ai.md documentation')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await driftCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram\n .command('component-registry')\n .description('Generate a component registry for AI agent discovery')\n .argument('[path]', 'Project directory (defaults to current directory)')\n .action(async (targetPath?: string) => {\n try {\n await componentRegistryCommand(targetPath);\n } catch (err) {\n if ((err as Error).name === 'ExitPromptError') {\n process.exit(0);\n }\n console.error(err);\n process.exit(1);\n }\n });\n\nprogram.parse();\n","import { fileURLToPath } from 'url';\nimport path from 'path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nexport const PACKAGE_ROOT = path.resolve(__dirname, '..');\nexport const TEMPLATES_DIR = path.join(PACKAGE_ROOT, 'templates');\nexport const COMMANDS_DIR = path.join(PACKAGE_ROOT, 'commands');\nexport const GUIDES_DIR = path.join(PACKAGE_ROOT, 'guides');\nexport const DOCS_SCAFFOLDS_DIR = path.join(PACKAGE_ROOT, 'docs-scaffolds');\nexport const AGENTS_DIR = path.join(PACKAGE_ROOT, 'agents');\nexport const CONTEXTS_DIR = path.join(PACKAGE_ROOT, 'contexts');\n\nexport const VERSION = '1.5.0';\n\nexport const AI_KIT_FOLDER = 'ai-kit';\nexport const AI_KIT_CONFIG_FILE = 'ai-kit.config.json';\n\nexport const GENERATED_FILES = {\n claudeMd: 'CLAUDE.md',\n cursorRules: '.cursorrules',\n cursorMdcDir: '.cursor/rules',\n claudeSettings: '.claude/settings.json',\n claudeSettingsLocal: '.claude/settings.local.json',\n claudeCommands: '.claude/commands',\n claudeSkills: '.claude/skills',\n claudeAgents: '.claude/agents',\n claudeContexts: '.claude/contexts',\n cursorSkills: '.cursor/skills',\n} as const;\n\nexport const TEMPLATE_FRAGMENTS = [\n 'base',\n 'nextjs-app-router',\n 'nextjs-pages-router',\n 'sitecore-xmc',\n 'tailwind',\n 'typescript',\n 'monorepo',\n 'figma',\n 'static-site',\n] as const;\n\nexport type TemplateFragment = (typeof TEMPLATE_FRAGMENTS)[number];\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { select, confirm, input } from '@inquirer/prompts';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { generateMdcFiles } from '../generator/cursor-mdc.js';\nimport { generateConfig } from '../generator/config.js';\nimport { generateSettingsLocal } from '../generator/hooks.js';\nimport { copySkills } from '../copier/skills.js';\nimport { copyGuides } from '../copier/guides.js';\nimport { scaffoldDocs } from '../copier/docs.js';\nimport { copyAgents } from '../copier/agents.js';\nimport { copyContexts } from '../copier/contexts.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n readJsonSafe,\n} from '../utils.js';\nimport { loadCustomFragments } from '../generator/assembler.js';\nimport type { ProjectScan, ConflictResolution, ClarificationAnswer, StrictnessLevel, HookProfile, AiKitConfig, ToolsSelection } from '../types.js';\n\nexport async function initCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Project Setup');\n logInfo(`Scanning: ${projectDir}`);\n\n // Check for existing config — offer to reuse saved choices\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n let savedConfig: AiKitConfig | null = null;\n let reuseMode = false;\n\n if (fileExists(configPath)) {\n savedConfig = readJsonSafe<AiKitConfig>(configPath);\n\n if (savedConfig) {\n logSection('Existing Profile Found');\n logInfo(`Tools: ${formatToolsLabel(savedConfig.tools)}`);\n logInfo(`Strictness: ${savedConfig.strictness}`);\n logInfo(`Hook Profile: ${savedConfig.hookProfile}`);\n logInfo(`Generated: ${savedConfig.generatedAt}`);\n logInfo(`Version: v${savedConfig.version}`);\n console.log('');\n\n const action = await select({\n message: 'What would you like to do?',\n choices: [\n { name: 'Update — re-scan project, keep saved settings', value: 'reuse' as const },\n { name: 'Re-configure — change settings from scratch', value: 'fresh' as const },\n { name: 'Cancel', value: 'cancel' as const },\n ],\n default: 'reuse',\n });\n\n if (action === 'cancel') {\n logInfo('Cancelled.');\n return;\n }\n\n reuseMode = action === 'reuse';\n }\n }\n\n // Scan the project\n const spinner = ora('Scanning project...').start();\n let scan: ProjectScan;\n try {\n scan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n } catch (err) {\n spinner.fail('Failed to scan project');\n logError(String(err));\n return;\n }\n\n // Show detected stack\n logSection('Detected Stack');\n logInfo(`Framework: ${formatFramework(scan)}`);\n logInfo(`CMS: ${scan.cms === 'none' ? 'None' : scan.cms}`);\n logInfo(`Styling: ${scan.styling.join(', ') || 'None detected'}`);\n logInfo(`TypeScript: ${scan.typescript ? 'Yes' : 'No'}`);\n logInfo(`Monorepo: ${scan.monorepo ? `Yes (${scan.monorepoTool})` : 'No'}`);\n logInfo(`Package Manager: ${scan.packageManager}`);\n logInfo(`Formatter: ${scan.tools.biome ? 'Biome' : scan.tools.prettier ? 'Prettier' : 'None detected'}`);\n if (scan.staticSite?.isStatic) {\n logInfo(`Static Site: Yes (${scan.staticSite.outputMode})`);\n }\n if (scan.designTokens?.detected) {\n logInfo(`Design Tokens: ${scan.designTokens.colors.length} colors, ${scan.designTokens.fonts.length} fonts (${scan.designTokens.source})`);\n }\n if (scan.aiIgnorePatterns.length > 0) {\n logInfo(`.aiignore: ${scan.aiIgnorePatterns.length} patterns loaded`);\n }\n\n // Clarification questions for ambiguous detections (skip in reuse mode)\n if (!reuseMode) {\n const clarifications = await askClarifications(scan);\n scan = applyClarifications(scan, clarifications);\n }\n\n // Use saved choices or ask new ones\n const tools: ToolsSelection = reuseMode && savedConfig?.tools\n ? savedConfig.tools\n : await selectTools();\n\n const strictness: StrictnessLevel = reuseMode && savedConfig?.strictness\n ? savedConfig.strictness\n : await selectStrictness();\n\n const hookProfile: HookProfile = reuseMode && savedConfig?.hookProfile\n ? savedConfig.hookProfile\n : await selectHookProfile();\n\n // Load custom fragments\n const customFragments = loadCustomFragments(projectDir);\n\n // Conflict strategy — overwrite when reusing, ask otherwise\n const conflict: ConflictResolution = reuseMode\n ? 'overwrite'\n : await selectConflictStrategy(projectDir);\n\n // Generate files\n logSection('Generating Files');\n const results = await generate(projectDir, scan, tools, conflict, {\n strictness,\n customFragments,\n hookProfile,\n });\n\n // Summary\n logSection('Setup Complete');\n if (results.claudeMd) logSuccess(`CLAUDE.md generated`);\n if (results.cursorRules) logSuccess(`.cursorrules generated`);\n if (results.cursorMdcFiles > 0)\n logSuccess(`${results.cursorMdcFiles} .cursor/rules/*.mdc files generated`);\n if (results.commands.length > 0)\n logSuccess(`${results.commands.length} skills generated (.claude/skills/ + .cursor/skills/)`);\n if (results.agents.length > 0)\n logSuccess(`${results.agents.length} agents generated (.claude/agents/)`);\n if (results.contexts.length > 0)\n logSuccess(`${results.contexts.length} context modes generated (.claude/contexts/)`);\n if (results.hooks)\n logSuccess(`Hooks configured (.claude/settings.local.json) — profile: ${hookProfile}`);\n if (results.guides.length > 0)\n logSuccess(`${results.guides.length} guides added to ai-kit/guides/`);\n if (results.docs.length > 0)\n logSuccess(`${results.docs.length} doc scaffolds created in docs/`);\n\n // Recommended tools & MCP servers\n showRecommendations(scan);\n\n console.log('');\n logInfo('Run `ai-kit update` anytime to refresh configs after project changes.');\n logInfo('Run `ai-kit audit` to check your AI agent configuration health.');\n logInfo('Check ai-kit/guides/getting-started.md to get started.');\n}\n\nfunction formatToolsLabel(tools?: ToolsSelection): string {\n if (!tools) return 'Unknown';\n if (tools.claude && tools.cursor) return 'Claude Code + Cursor';\n if (tools.claude) return 'Claude Code only';\n if (tools.cursor) return 'Cursor only';\n return 'None';\n}\n\nfunction formatFramework(scan: ProjectScan): string {\n if (scan.framework === 'nextjs') {\n const version = scan.nextjsVersion ? ` ${scan.nextjsVersion}` : '';\n const router = scan.routerType ? ` (${scan.routerType} router)` : '';\n return `Next.js${version}${router}`;\n }\n return scan.framework;\n}\n\nasync function askClarifications(scan: ProjectScan): Promise<ClarificationAnswer> {\n const answers: ClarificationAnswer = {};\n\n // If Next.js detected but router type unclear\n if (scan.framework === 'nextjs' && !scan.routerType) {\n answers.routerType = await select({\n message: 'Which Next.js router does this project use?',\n choices: [\n { name: 'App Router (app/ directory)', value: 'app' as const },\n { name: 'Pages Router (pages/ directory)', value: 'pages' as const },\n { name: 'Both (hybrid)', value: 'hybrid' as const },\n ],\n });\n }\n\n return answers;\n}\n\nfunction applyClarifications(\n scan: ProjectScan,\n clarifications: ClarificationAnswer,\n): ProjectScan {\n return {\n ...scan,\n ...(clarifications.routerType && { routerType: clarifications.routerType }),\n ...(clarifications.cms && { cms: clarifications.cms }),\n };\n}\n\nasync function selectTools(): Promise<ToolsSelection> {\n const tool = await select({\n message: 'Which AI tools does this project use?',\n choices: [\n { name: 'Both Claude Code & Cursor', value: 'both' },\n { name: 'Claude Code only', value: 'claude' },\n { name: 'Cursor only', value: 'cursor' },\n ],\n default: 'both',\n });\n\n return {\n claude: tool === 'both' || tool === 'claude',\n cursor: tool === 'both' || tool === 'cursor',\n };\n}\n\nasync function selectStrictness(): Promise<StrictnessLevel> {\n return select({\n message: 'How strictly should AI enforce these rules?',\n choices: [\n { name: 'Standard — follow rules by default, use judgment for edge cases', value: 'standard' as const },\n { name: 'Strict — enforce all rules, no exceptions without approval', value: 'strict' as const },\n { name: 'Relaxed — rules are guidelines, prioritize shipping speed', value: 'relaxed' as const },\n ],\n default: 'standard',\n });\n}\n\nasync function selectHookProfile(): Promise<HookProfile> {\n return select({\n message: 'Hook automation profile (runs checks automatically as you code):',\n choices: [\n {\n name: 'Standard — auto-format + typecheck + console.log warnings',\n value: 'standard' as const,\n },\n {\n name: 'Strict — all standard hooks + ESLint + stop checks',\n value: 'strict' as const,\n },\n {\n name: 'Minimal — auto-format + git push safety only',\n value: 'minimal' as const,\n },\n ],\n default: 'standard',\n });\n}\n\nasync function selectConflictStrategy(\n projectDir: string,\n): Promise<ConflictResolution> {\n const hasExisting =\n fileExists(path.join(projectDir, GENERATED_FILES.claudeMd)) ||\n fileExists(path.join(projectDir, GENERATED_FILES.cursorRules));\n\n if (!hasExisting) return 'overwrite';\n\n return select({\n message: 'Existing AI config files detected. How should we handle conflicts?',\n choices: [\n {\n name: 'Overwrite — replace with fresh generated files',\n value: 'overwrite' as const,\n },\n {\n name: 'Skip — keep existing files, only add missing ones',\n value: 'skip' as const,\n },\n ],\n default: 'overwrite',\n });\n}\n\ninterface GenerateResult {\n claudeMd: boolean;\n cursorRules: boolean;\n cursorMdcFiles: number;\n commands: string[];\n agents: string[];\n contexts: string[];\n hooks: boolean;\n guides: string[];\n docs: string[];\n}\n\nasync function generate(\n projectDir: string,\n scan: ProjectScan,\n tools: ToolsSelection,\n conflict: ConflictResolution,\n opts?: {\n strictness?: StrictnessLevel;\n customFragments?: string[];\n hookProfile?: HookProfile;\n },\n): Promise<GenerateResult> {\n const result: GenerateResult = {\n claudeMd: false,\n cursorRules: false,\n cursorMdcFiles: 0,\n commands: [],\n agents: [],\n contexts: [],\n hooks: false,\n guides: [],\n docs: [],\n };\n\n // Generate CLAUDE.md\n if (tools.claude) {\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n if (conflict === 'overwrite' || !fileExists(claudeMdPath)) {\n const content = generateClaudeMd(scan, { strictness: opts?.strictness, customFragments: opts?.customFragments });\n await fs.writeFile(claudeMdPath, content, 'utf-8');\n result.claudeMd = true;\n } else {\n logWarning('CLAUDE.md exists, skipping');\n }\n\n // Copy skills (also generates legacy .claude/commands/)\n result.commands = await copySkills(projectDir);\n\n // Copy agents (scan-aware — conditional agents based on detected stack)\n result.agents = await copyAgents(projectDir, scan);\n\n // Copy context modes\n result.contexts = await copyContexts(projectDir);\n\n // Generate hooks in .claude/settings.local.json\n const hookProfile = opts?.hookProfile || 'standard';\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n const settingsLocal = generateSettingsLocal(scan, hookProfile);\n await fs.ensureDir(path.dirname(settingsLocalPath));\n await fs.writeJson(settingsLocalPath, settingsLocal, { spaces: 2 });\n result.hooks = true;\n }\n\n // Generate .cursorrules\n if (tools.cursor) {\n const cursorPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n if (conflict === 'overwrite' || !fileExists(cursorPath)) {\n const content = generateCursorRules(scan, { strictness: opts?.strictness, customFragments: opts?.customFragments });\n await fs.writeFile(cursorPath, content, 'utf-8');\n result.cursorRules = true;\n } else {\n logWarning('.cursorrules exists, skipping');\n }\n\n // Generate .cursor/rules/*.mdc files\n const mdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n await fs.ensureDir(mdcDir);\n const mdcFiles = generateMdcFiles(scan);\n for (const mdc of mdcFiles) {\n await fs.writeFile(path.join(mdcDir, mdc.filename), mdc.content, 'utf-8');\n }\n result.cursorMdcFiles = mdcFiles.length;\n }\n\n // Copy guides\n result.guides = await copyGuides(projectDir);\n\n // Scaffold docs\n result.docs = await scaffoldDocs(projectDir);\n\n // Write ai-kit config\n const templates = [];\n if (result.claudeMd) templates.push('CLAUDE.md');\n if (result.cursorRules) templates.push('.cursorrules');\n\n const config = generateConfig(scan, templates, result.commands, result.guides, {\n strictness: opts?.strictness,\n customFragments: opts?.customFragments,\n agents: result.agents,\n contexts: result.contexts,\n hooks: result.hooks,\n hookProfile: opts?.hookProfile,\n tools,\n });\n await fs.writeJson(\n path.join(projectDir, AI_KIT_CONFIG_FILE),\n config,\n { spaces: 2 },\n );\n\n return result;\n}\n\nfunction showRecommendations(scan: ProjectScan): void {\n const toolRecs: { check: boolean; label: string; hint: string }[] = [\n {\n check: scan.tools.playwright,\n label: 'Playwright not detected — install for E2E testing:',\n hint: ' npm install -D @playwright/test && npx playwright install',\n },\n {\n check: scan.tools.eslint,\n label: 'ESLint not detected — install for code quality:',\n hint: ' npm install -D eslint @typescript-eslint/eslint-plugin',\n },\n {\n check: scan.tools.prettier || scan.tools.biome,\n label: 'No formatter detected — install Prettier or Biome for auto-formatting hooks:',\n hint: ' npm install -D prettier (or) npm install -D @biomejs/biome',\n },\n {\n check: scan.tools.axeCore,\n label: 'axe-core not detected — install for accessibility testing:',\n hint: ' npm install -D @axe-core/playwright',\n },\n {\n check: scan.tools.knip,\n label: 'Knip not detected — install to find unused code:',\n hint: ' npm install -D knip',\n },\n {\n check: scan.tools.bundleAnalyzer,\n label: 'Bundle analyzer not detected — install for bundle insights:',\n hint: ' npm install -D @next/bundle-analyzer',\n },\n ];\n\n const mcpRecs: { check: boolean; label: string; hint: string }[] = [\n {\n check: scan.mcpServers.context7,\n label: 'Context7 MCP not configured — enables up-to-date library docs:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.playwright,\n label: 'Playwright MCP not configured — enables browser automation:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.github,\n label: 'GitHub MCP not configured — enables PR/issue management:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n {\n check: scan.mcpServers.perplexity,\n label: 'Perplexity MCP not configured — enables web research:',\n hint: ' Add to .claude/settings.json mcpServers',\n },\n ];\n\n const missingTools = toolRecs.filter((r) => !r.check);\n const missingMcps = mcpRecs.filter((r) => !r.check);\n\n if (missingTools.length === 0 && missingMcps.length === 0) return;\n\n logSection('Recommended Setup');\n\n for (const rec of missingTools) {\n logInfo(rec.label);\n logInfo(rec.hint);\n }\n\n for (const rec of missingMcps) {\n logInfo(rec.label);\n logInfo(rec.hint);\n }\n}\n","import path from 'path';\nimport { readJsonSafe } from '../utils.js';\nimport { detectNextjs } from './nextjs.js';\nimport { detectSitecore } from './sitecore.js';\nimport { detectStyling } from './styling.js';\nimport { detectTypescript } from './typescript.js';\nimport { detectMonorepo } from './monorepo.js';\nimport { detectPackageManager } from './package-manager.js';\nimport { detectFigma } from './figma.js';\nimport { detectTools } from './tools.js';\nimport { detectMcpServers } from './mcp.js';\nimport { detectDesignTokens } from './design-tokens.js';\nimport { detectStaticSite } from './static-site.js';\nimport { loadAiIgnorePatterns } from './aiignore.js';\nimport type { ProjectScan } from '../types.js';\n\nexport async function scanProject(projectPath: string): Promise<ProjectScan> {\n const pkgPath = path.join(projectPath, 'package.json');\n const pkg = readJsonSafe<Record<string, unknown>>(pkgPath) || {};\n\n const scripts = (pkg.scripts as Record<string, string>) || {};\n const projectName =\n (pkg.name as string) || path.basename(projectPath);\n\n const nextjsResult = detectNextjs(projectPath, pkg);\n const sitecoreResult = detectSitecore(pkg);\n const stylingResult = detectStyling(projectPath, pkg);\n const tsResult = detectTypescript(projectPath);\n const monorepoResult = detectMonorepo(projectPath, pkg);\n const packageManager = detectPackageManager(projectPath);\n const figmaResult = detectFigma(projectPath, pkg);\n const toolsResult = detectTools(projectPath, pkg);\n const mcpResult = detectMcpServers(projectPath);\n const designTokensResult = detectDesignTokens(projectPath);\n const staticSiteResult = detectStaticSite(projectPath, pkg);\n const aiIgnorePatterns = loadAiIgnorePatterns(projectPath);\n\n const figmaDetected =\n figmaResult.figmaMcp ||\n figmaResult.figmaCodeCli ||\n figmaResult.designTokens;\n\n return {\n ...nextjsResult,\n ...sitecoreResult,\n ...stylingResult,\n ...tsResult,\n ...monorepoResult,\n figma: {\n detected: figmaDetected,\n ...figmaResult,\n },\n designTokens: designTokensResult,\n staticSite: staticSiteResult,\n aiIgnorePatterns,\n tools: toolsResult,\n mcpServers: mcpResult,\n packageManager,\n projectName,\n projectPath,\n scripts,\n };\n}\n\nexport {\n detectNextjs,\n detectSitecore,\n detectStyling,\n detectTypescript,\n detectMonorepo,\n detectPackageManager,\n detectFigma,\n detectTools,\n detectMcpServers,\n detectDesignTokens,\n detectStaticSite,\n loadAiIgnorePatterns,\n};\n","import fs from 'fs-extra';\nimport path from 'path';\nimport chalk from 'chalk';\n\nexport function readJsonSafe<T = Record<string, unknown>>(\n filePath: string,\n): T | null {\n try {\n return fs.readJsonSync(filePath) as T;\n } catch {\n return null;\n }\n}\n\nexport function fileExists(filePath: string): boolean {\n return fs.existsSync(filePath);\n}\n\nexport function dirExists(dirPath: string): boolean {\n try {\n return fs.statSync(dirPath).isDirectory();\n } catch {\n return false;\n }\n}\n\nexport function readFileSafe(filePath: string): string | null {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport function log(message: string): void {\n console.log(message);\n}\n\nexport function logSuccess(message: string): void {\n console.log(chalk.green('✓') + ' ' + message);\n}\n\nexport function logWarning(message: string): void {\n console.log(chalk.yellow('⚠') + ' ' + message);\n}\n\nexport function logError(message: string): void {\n console.log(chalk.red('✗') + ' ' + message);\n}\n\nexport function logInfo(message: string): void {\n console.log(chalk.blue('ℹ') + ' ' + message);\n}\n\nexport function logSection(title: string): void {\n console.log('\\n' + chalk.bold.underline(title));\n}\n\nexport function getRelativePath(from: string, to: string): string {\n return path.relative(from, to);\n}\n\nconst AI_KIT_START = '<!-- AI-KIT:START -->';\nconst AI_KIT_END = '<!-- AI-KIT:END -->';\n\nexport function mergeWithMarkers(\n existingContent: string,\n newGenerated: string,\n): string {\n const startIdx = existingContent.indexOf(AI_KIT_START);\n const endIdx = existingContent.indexOf(AI_KIT_END);\n\n if (startIdx === -1 || endIdx === -1) {\n // No markers found — file was generated before markers existed.\n // Replace entirely with new content (which includes markers).\n return newGenerated;\n }\n\n const before = existingContent.substring(0, startIdx);\n const after = existingContent.substring(endIdx + AI_KIT_END.length);\n\n return `${before}${newGenerated}${after}`;\n}\n","import path from 'path';\nimport { dirExists, readJsonSafe } from '../utils.js';\n\ninterface NextjsResult {\n framework: 'nextjs' | 'react' | 'unknown';\n nextjsVersion?: string;\n routerType?: 'app' | 'pages' | 'hybrid';\n}\n\nexport function detectNextjs(\n projectPath: string,\n pkg: Record<string, unknown>,\n): NextjsResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n if (!deps.next) {\n if (deps.react) return { framework: 'react' };\n return { framework: 'unknown' };\n }\n\n const nextjsVersion = deps.next.replace(/[\\^~>=<]/g, '');\n\n const hasAppDir =\n dirExists(path.join(projectPath, 'app')) ||\n dirExists(path.join(projectPath, 'src', 'app'));\n\n const hasPagesDir =\n dirExists(path.join(projectPath, 'pages')) ||\n dirExists(path.join(projectPath, 'src', 'pages'));\n\n let routerType: 'app' | 'pages' | 'hybrid' | undefined;\n if (hasAppDir && hasPagesDir) routerType = 'hybrid';\n else if (hasAppDir) routerType = 'app';\n else if (hasPagesDir) routerType = 'pages';\n\n return { framework: 'nextjs', nextjsVersion, routerType };\n}\n","interface SitecoreResult {\n cms: 'sitecore-xmc-v2' | 'sitecore-xmc' | 'sitecore-jss' | 'none';\n sitecorejssVersion?: string;\n sitecoreContentSdkVersion?: string;\n}\n\nexport function detectSitecore(pkg: Record<string, unknown>): SitecoreResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const jssNextjs = deps['@sitecore-jss/sitecore-jss-nextjs'];\n const jssReact = deps['@sitecore-jss/sitecore-jss-react'];\n const contentSdk = deps['@sitecore-content-sdk/nextjs'];\n\n // Content SDK v2.x — newer XM Cloud projects\n if (contentSdk) {\n const version = contentSdk.replace(/[\\^~>=<]/g, '');\n return {\n cms: 'sitecore-xmc-v2',\n sitecoreContentSdkVersion: version || undefined,\n };\n }\n\n // JSS-based XM Cloud projects\n if (jssNextjs) {\n const version = jssNextjs.replace(/[\\^~>=<]/g, '');\n return { cms: 'sitecore-xmc', sitecorejssVersion: version || undefined };\n }\n\n if (jssReact) {\n const version = jssReact.replace(/[\\^~>=<]/g, '');\n return { cms: 'sitecore-jss', sitecorejssVersion: version || undefined };\n }\n\n return { cms: 'none' };\n}\n","import path from 'path';\nimport { fileExists } from '../utils.js';\n\ntype StylingTool = 'tailwind' | 'css-modules' | 'styled-components' | 'scss';\n\ninterface StylingResult {\n styling: StylingTool[];\n tailwindVersion?: string;\n}\n\nexport function detectStyling(\n projectPath: string,\n pkg: Record<string, unknown>,\n): StylingResult {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const styling: StylingTool[] = [];\n let tailwindVersion: string | undefined;\n\n if (deps.tailwindcss || deps['@tailwindcss/postcss']) {\n styling.push('tailwind');\n tailwindVersion = (deps.tailwindcss || deps['@tailwindcss/postcss'] || '')\n .replace(/[\\^~>=<]/g, '');\n }\n\n const hasTailwindConfig =\n fileExists(path.join(projectPath, 'tailwind.config.js')) ||\n fileExists(path.join(projectPath, 'tailwind.config.ts')) ||\n fileExists(path.join(projectPath, 'tailwind.config.mjs'));\n\n if (hasTailwindConfig && !styling.includes('tailwind')) {\n styling.push('tailwind');\n }\n\n if (deps['styled-components']) styling.push('styled-components');\n if (deps.sass || deps['node-sass']) styling.push('scss');\n\n return {\n styling,\n tailwindVersion: tailwindVersion || undefined,\n };\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe } from '../utils.js';\n\ninterface TypescriptResult {\n typescript: boolean;\n typescriptStrict?: boolean;\n}\n\nexport function detectTypescript(projectPath: string): TypescriptResult {\n const tsconfigPath = path.join(projectPath, 'tsconfig.json');\n\n if (!fileExists(tsconfigPath)) {\n return { typescript: false };\n }\n\n const tsconfig = readJsonSafe<{\n compilerOptions?: { strict?: boolean };\n }>(tsconfigPath);\n\n return {\n typescript: true,\n typescriptStrict: tsconfig?.compilerOptions?.strict ?? false,\n };\n}\n","import path from 'path';\nimport { fileExists } from '../utils.js';\n\ntype MonorepoTool = 'turborepo' | 'nx' | 'lerna' | 'pnpm-workspaces';\n\ninterface MonorepoResult {\n monorepo: boolean;\n monorepoTool?: MonorepoTool;\n}\n\nexport function detectMonorepo(\n projectPath: string,\n pkg: Record<string, unknown>,\n): MonorepoResult {\n if (fileExists(path.join(projectPath, 'turbo.json'))) {\n return { monorepo: true, monorepoTool: 'turborepo' };\n }\n\n if (fileExists(path.join(projectPath, 'nx.json'))) {\n return { monorepo: true, monorepoTool: 'nx' };\n }\n\n if (fileExists(path.join(projectPath, 'lerna.json'))) {\n return { monorepo: true, monorepoTool: 'lerna' };\n }\n\n if (fileExists(path.join(projectPath, 'pnpm-workspace.yaml'))) {\n return { monorepo: true, monorepoTool: 'pnpm-workspaces' };\n }\n\n if (pkg.workspaces) {\n return { monorepo: true };\n }\n\n return { monorepo: false };\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe } from '../utils.js';\n\ntype PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport function detectPackageManager(projectPath: string): PackageManager {\n const pkg = readJsonSafe<{ packageManager?: string }>(\n path.join(projectPath, 'package.json'),\n );\n\n if (pkg?.packageManager) {\n if (pkg.packageManager.startsWith('pnpm')) return 'pnpm';\n if (pkg.packageManager.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager.startsWith('bun')) return 'bun';\n return 'npm';\n }\n\n if (fileExists(path.join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (fileExists(path.join(projectPath, 'yarn.lock'))) return 'yarn';\n if (fileExists(path.join(projectPath, 'bun.lockb'))) return 'bun';\n if (fileExists(path.join(projectPath, 'bun.lock'))) return 'bun';\n\n return 'npm';\n}\n","import path from 'path';\nimport { fileExists, readJsonSafe, readFileSafe } from '../utils.js';\n\nexport interface FigmaDetection {\n figmaMcp: boolean;\n figmaCodeCli: boolean;\n designTokens: boolean;\n tokenFormat: 'tailwind-v4' | 'tailwind-v3' | 'css-variables' | 'none';\n visualTests: boolean;\n}\n\nexport function detectFigma(\n projectPath: string,\n pkg: Record<string, unknown>,\n): FigmaDetection {\n return {\n figmaMcp: detectFigmaMcp(projectPath),\n figmaCodeCli: detectFigmaCodeCli(pkg),\n designTokens: detectDesignTokens(projectPath),\n tokenFormat: detectTokenFormat(projectPath),\n visualTests: detectVisualTests(projectPath, pkg),\n };\n}\n\nfunction detectFigmaMcp(projectPath: string): boolean {\n // Check .claude/settings.json or .claude/settings.local.json for Figma MCP\n const settingsPaths = [\n path.join(projectPath, '.claude', 'settings.json'),\n path.join(projectPath, '.claude', 'settings.local.json'),\n path.join(projectPath, '.mcp.json'),\n ];\n\n for (const settingsPath of settingsPaths) {\n const content = readFileSafe(settingsPath);\n if (content && content.toLowerCase().includes('figma')) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction detectFigmaCodeCli(pkg: Record<string, unknown>): boolean {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n return Object.keys(deps).some(\n (dep) => dep.startsWith('@figma-code/') || dep === 'figma-code-cli',\n );\n}\n\nfunction detectDesignTokens(projectPath: string): boolean {\n const tokenPaths = [\n path.join(projectPath, 'tokens.json'),\n path.join(projectPath, 'tokens'),\n path.join(projectPath, 'design-tokens.json'),\n path.join(projectPath, 'src', 'tokens'),\n ];\n\n for (const tokenPath of tokenPaths) {\n if (fileExists(tokenPath)) return true;\n }\n\n // Check for @theme inline in globals.css\n const globalsCss = readFileSafe(\n path.join(projectPath, 'src', 'app', 'globals.css'),\n );\n if (globalsCss && globalsCss.includes('@theme')) return true;\n\n return false;\n}\n\nfunction detectTokenFormat(\n projectPath: string,\n): FigmaDetection['tokenFormat'] {\n // Check for Tailwind v4 @theme inline\n const globalsCss = readFileSafe(\n path.join(projectPath, 'src', 'app', 'globals.css'),\n );\n if (globalsCss && globalsCss.includes('@theme')) return 'tailwind-v4';\n\n // Check for Tailwind v3 config with custom theme\n const twConfigPaths = [\n path.join(projectPath, 'tailwind.config.ts'),\n path.join(projectPath, 'tailwind.config.js'),\n ];\n\n for (const twPath of twConfigPaths) {\n const content = readFileSafe(twPath);\n if (content && content.includes('theme')) return 'tailwind-v3';\n }\n\n // Check for raw CSS variables\n if (globalsCss && globalsCss.includes('--')) return 'css-variables';\n\n return 'none';\n}\n\nfunction detectVisualTests(\n projectPath: string,\n pkg: Record<string, unknown>,\n): boolean {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n const hasPlaywright = '@playwright/test' in deps || 'playwright' in deps;\n const hasPlaywrightConfig =\n fileExists(path.join(projectPath, 'playwright.config.ts')) ||\n fileExists(path.join(projectPath, 'playwright.config.js'));\n\n return hasPlaywright || hasPlaywrightConfig;\n}\n","import path from 'path';\nimport { fileExists, dirExists } from '../utils.js';\n\nexport interface ToolsDetection {\n playwright: boolean;\n storybook: boolean;\n eslint: boolean;\n prettier: boolean;\n biome: boolean;\n axeCore: boolean;\n snyk: boolean;\n knip: boolean;\n bundleAnalyzer: boolean;\n}\n\nexport function detectTools(\n projectPath: string,\n pkg: Record<string, unknown>,\n): ToolsDetection {\n const deps = {\n ...(pkg.dependencies as Record<string, string> | undefined),\n ...(pkg.devDependencies as Record<string, string> | undefined),\n };\n\n return {\n playwright: detectPlaywright(projectPath, deps),\n storybook: detectStorybook(projectPath, deps),\n eslint: detectEslint(projectPath, deps),\n prettier: detectPrettier(projectPath, deps),\n biome: detectBiome(projectPath, deps),\n axeCore: detectAxeCore(deps),\n snyk: detectSnyk(projectPath, deps),\n knip: detectKnip(projectPath, deps),\n bundleAnalyzer: detectBundleAnalyzer(deps),\n };\n}\n\nfunction detectPlaywright(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@playwright/test' in deps) return true;\n if (fileExists(path.join(projectPath, 'playwright.config.ts'))) return true;\n if (fileExists(path.join(projectPath, 'playwright.config.js'))) return true;\n return false;\n}\n\nfunction detectStorybook(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@storybook/react' in deps) return true;\n if (dirExists(path.join(projectPath, '.storybook'))) return true;\n return false;\n}\n\nfunction detectEslint(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('eslint' in deps) return true;\n const eslintConfigs = [\n '.eslintrc',\n '.eslintrc.js',\n '.eslintrc.cjs',\n '.eslintrc.json',\n '.eslintrc.yml',\n '.eslintrc.yaml',\n 'eslint.config.js',\n 'eslint.config.mjs',\n 'eslint.config.cjs',\n 'eslint.config.ts',\n ];\n for (const config of eslintConfigs) {\n if (fileExists(path.join(projectPath, config))) return true;\n }\n return false;\n}\n\nfunction detectPrettier(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('prettier' in deps) return true;\n const prettierConfigs = [\n '.prettierrc',\n '.prettierrc.js',\n '.prettierrc.cjs',\n '.prettierrc.json',\n '.prettierrc.yml',\n '.prettierrc.yaml',\n '.prettierrc.toml',\n 'prettier.config.js',\n 'prettier.config.cjs',\n 'prettier.config.ts',\n ];\n for (const config of prettierConfigs) {\n if (fileExists(path.join(projectPath, config))) return true;\n }\n return false;\n}\n\nfunction detectBiome(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('@biomejs/biome' in deps) return true;\n if (fileExists(path.join(projectPath, 'biome.json'))) return true;\n if (fileExists(path.join(projectPath, 'biome.jsonc'))) return true;\n return false;\n}\n\nfunction detectAxeCore(deps: Record<string, string>): boolean {\n return '@axe-core/playwright' in deps || 'axe-core' in deps;\n}\n\nfunction detectSnyk(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('snyk' in deps) return true;\n if (fileExists(path.join(projectPath, '.snyk'))) return true;\n return false;\n}\n\nfunction detectKnip(\n projectPath: string,\n deps: Record<string, string>,\n): boolean {\n if ('knip' in deps) return true;\n if (fileExists(path.join(projectPath, 'knip.json'))) return true;\n if (fileExists(path.join(projectPath, 'knip.config.ts'))) return true;\n return false;\n}\n\nfunction detectBundleAnalyzer(deps: Record<string, string>): boolean {\n return '@next/bundle-analyzer' in deps;\n}\n","import path from 'path';\nimport { readFileSafe } from '../utils.js';\n\nexport interface McpDetection {\n playwright: boolean;\n figma: boolean;\n github: boolean;\n context7: boolean;\n perplexity: boolean;\n}\n\nexport function detectMcpServers(projectPath: string): McpDetection {\n const settingsPaths = [\n path.join(projectPath, '.claude', 'settings.json'),\n path.join(projectPath, '.claude', 'settings.local.json'),\n path.join(projectPath, '.mcp.json'),\n ];\n\n // Combine all MCP config file contents for searching\n let combined = '';\n for (const settingsPath of settingsPaths) {\n const content = readFileSafe(settingsPath);\n if (content) {\n combined += content.toLowerCase() + '\\n';\n }\n }\n\n return {\n playwright: combined.includes('playwright'),\n figma: combined.includes('figma'),\n github: combined.includes('github'),\n context7: combined.includes('context7'),\n perplexity: combined.includes('perplexity'),\n };\n}\n","import path from 'path';\nimport { readFileSafe } from '../utils.js';\nimport type { DesignTokensScan } from '../types.js';\n\nexport function detectDesignTokens(\n projectPath: string,\n): DesignTokensScan {\n // Try Tailwind v4 @theme inline first\n const globalsCss = readFileSafe(\n path.join(projectPath, 'src', 'app', 'globals.css'),\n );\n\n if (globalsCss && globalsCss.includes('@theme')) {\n return parseThemeInline(globalsCss);\n }\n\n // Try Tailwind v3/v4 config files\n const twConfigPaths = [\n path.join(projectPath, 'tailwind.config.ts'),\n path.join(projectPath, 'tailwind.config.js'),\n path.join(projectPath, 'tailwind.config.mjs'),\n ];\n\n for (const twPath of twConfigPaths) {\n const content = readFileSafe(twPath);\n if (content) {\n return parseTailwindConfig(content);\n }\n }\n\n // Try CSS custom properties in globals\n if (globalsCss) {\n return parseCssVariables(globalsCss);\n }\n\n return {\n detected: false,\n colors: [],\n spacing: [],\n fonts: [],\n breakpoints: [],\n source: 'none',\n };\n}\n\nfunction parseThemeInline(css: string): DesignTokensScan {\n const colors: string[] = [];\n const spacing: string[] = [];\n const fonts: string[] = [];\n const breakpoints: string[] = [];\n\n // Extract @theme { ... } block\n const themeMatch = css.match(/@theme\\s*\\{([\\s\\S]*?)\\}/);\n if (!themeMatch) {\n return { detected: false, colors: [], spacing: [], fonts: [], breakpoints: [], source: 'none' };\n }\n\n const themeBody = themeMatch[1];\n const lines = themeBody.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('/*')) continue;\n\n // --color-* tokens\n const colorMatch = trimmed.match(/^--color-([^:]+):/);\n if (colorMatch) {\n colors.push(colorMatch[1].trim());\n continue;\n }\n\n // --spacing-* tokens\n const spacingMatch = trimmed.match(/^--spacing-([^:]+):/);\n if (spacingMatch) {\n spacing.push(spacingMatch[1].trim());\n continue;\n }\n\n // --font-* tokens\n const fontMatch = trimmed.match(/^--font-([^:]+):/);\n if (fontMatch) {\n fonts.push(fontMatch[1].trim());\n continue;\n }\n\n // --breakpoint-* tokens\n const bpMatch = trimmed.match(/^--breakpoint-([^:]+):/);\n if (bpMatch) {\n breakpoints.push(bpMatch[1].trim());\n continue;\n }\n }\n\n return {\n detected: colors.length > 0 || fonts.length > 0,\n colors,\n spacing,\n fonts,\n breakpoints,\n source: 'theme-inline',\n };\n}\n\nfunction parseTailwindConfig(content: string): DesignTokensScan {\n const colors: string[] = [];\n const spacing: string[] = [];\n const fonts: string[] = [];\n const breakpoints: string[] = [];\n\n // Extract color keys from theme.extend.colors or theme.colors\n // Pattern: colors: { primary: ..., secondary: ... }\n const colorBlock = content.match(/colors\\s*:\\s*\\{([^}]*(?:\\{[^}]*\\}[^}]*)*)\\}/);\n if (colorBlock) {\n const colorKeys = colorBlock[1].matchAll(/['\"]?(\\w[\\w-]*)['\"]?\\s*:/g);\n for (const match of colorKeys) {\n if (!['DEFAULT', 'transparent', 'current', 'inherit'].includes(match[1])) {\n colors.push(match[1]);\n }\n }\n }\n\n // Extract font family keys\n const fontBlock = content.match(/fontFamily\\s*:\\s*\\{([^}]*)\\}/);\n if (fontBlock) {\n const fontKeys = fontBlock[1].matchAll(/['\"]?(\\w[\\w-]*)['\"]?\\s*:/g);\n for (const match of fontKeys) {\n fonts.push(match[1]);\n }\n }\n\n // Extract spacing keys\n const spacingBlock = content.match(/spacing\\s*:\\s*\\{([^}]*)\\}/);\n if (spacingBlock) {\n const spacingKeys = spacingBlock[1].matchAll(/['\"]?(\\w[\\w-]*)['\"]?\\s*:/g);\n for (const match of spacingKeys) {\n spacing.push(match[1]);\n }\n }\n\n // Extract breakpoint keys\n const screensBlock = content.match(/screens\\s*:\\s*\\{([^}]*)\\}/);\n if (screensBlock) {\n const bpKeys = screensBlock[1].matchAll(/['\"]?(\\w[\\w-]*)['\"]?\\s*:/g);\n for (const match of bpKeys) {\n breakpoints.push(match[1]);\n }\n }\n\n return {\n detected: colors.length > 0 || fonts.length > 0,\n colors: [...new Set(colors)],\n spacing: [...new Set(spacing)],\n fonts: [...new Set(fonts)],\n breakpoints: [...new Set(breakpoints)],\n source: 'tailwind-config',\n };\n}\n\nfunction parseCssVariables(css: string): DesignTokensScan {\n const colors: string[] = [];\n const spacing: string[] = [];\n const fonts: string[] = [];\n\n const varMatches = css.matchAll(/--([^:]+)\\s*:/g);\n\n for (const match of varMatches) {\n const name = match[1].trim();\n\n if (name.startsWith('color-') || name.includes('primary') || name.includes('secondary') ||\n name.includes('accent') || name.includes('background') || name.includes('foreground')) {\n colors.push(name);\n } else if (name.startsWith('spacing-') || name.startsWith('space-') || name.includes('gap')) {\n spacing.push(name);\n } else if (name.startsWith('font-') || name.includes('family') || name.includes('text-')) {\n fonts.push(name);\n }\n }\n\n return {\n detected: colors.length > 0,\n colors: [...new Set(colors)],\n spacing: [...new Set(spacing)],\n fonts: [...new Set(fonts)],\n breakpoints: [],\n source: colors.length > 0 ? 'css-variables' : 'none',\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { readFileSafe, dirExists } from '../utils.js';\nimport type { StaticSiteScan } from '../types.js';\n\nexport function detectStaticSite(\n projectPath: string,\n pkg: Record<string, unknown>,\n): StaticSiteScan {\n const hasStaticExport = checkStaticExport(projectPath);\n const hasGenerateStaticParams = checkGenerateStaticParams(projectPath);\n const hasRevalidate = checkRevalidatePatterns(projectPath);\n const hasServerActions = checkServerActions(projectPath);\n const hasApiRoutes = checkApiRoutes(projectPath);\n\n // Determine output mode\n let outputMode: StaticSiteScan['outputMode'];\n\n if (hasStaticExport) {\n outputMode = 'export';\n } else if (hasGenerateStaticParams && !hasServerActions && !hasApiRoutes) {\n outputMode = hasRevalidate ? 'isr' : 'export';\n } else if (hasServerActions || hasApiRoutes) {\n outputMode = hasGenerateStaticParams ? 'hybrid' : 'ssr';\n } else {\n outputMode = 'ssr';\n }\n\n const isStatic = outputMode === 'export' || outputMode === 'isr';\n\n return {\n isStatic,\n outputMode,\n hasGenerateStaticParams,\n hasRevalidate,\n hasStaticExport,\n };\n}\n\nfunction checkStaticExport(projectPath: string): boolean {\n // Check next.config.js/ts/mjs for output: 'export'\n const configPaths = [\n path.join(projectPath, 'next.config.js'),\n path.join(projectPath, 'next.config.ts'),\n path.join(projectPath, 'next.config.mjs'),\n ];\n\n for (const configPath of configPaths) {\n const content = readFileSafe(configPath);\n if (content && /output\\s*:\\s*['\"]export['\"]/.test(content)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction checkGenerateStaticParams(projectPath: string): boolean {\n // Check for generateStaticParams in app/ directory\n const appDirs = [\n path.join(projectPath, 'app'),\n path.join(projectPath, 'src', 'app'),\n ];\n\n for (const appDir of appDirs) {\n if (dirExists(appDir) && hasPatternInDir(appDir, /generateStaticParams/)) {\n return true;\n }\n }\n\n // Check for getStaticPaths in pages/ directory\n const pagesDirs = [\n path.join(projectPath, 'pages'),\n path.join(projectPath, 'src', 'pages'),\n ];\n\n for (const pagesDir of pagesDirs) {\n if (dirExists(pagesDir) && hasPatternInDir(pagesDir, /getStaticPaths/)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction checkRevalidatePatterns(projectPath: string): boolean {\n const appDirs = [\n path.join(projectPath, 'app'),\n path.join(projectPath, 'src', 'app'),\n ];\n\n for (const appDir of appDirs) {\n if (dirExists(appDir) && hasPatternInDir(appDir, /revalidate\\s*[:=]/)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction checkServerActions(projectPath: string): boolean {\n const srcDirs = [\n path.join(projectPath, 'app'),\n path.join(projectPath, 'src'),\n ];\n\n for (const srcDir of srcDirs) {\n if (dirExists(srcDir) && hasPatternInDir(srcDir, /['\"]use server['\"]/)) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction checkApiRoutes(projectPath: string): boolean {\n // App Router API routes\n const appApiDirs = [\n path.join(projectPath, 'app', 'api'),\n path.join(projectPath, 'src', 'app', 'api'),\n ];\n\n for (const apiDir of appApiDirs) {\n if (dirExists(apiDir)) return true;\n }\n\n // Pages Router API routes\n const pagesApiDirs = [\n path.join(projectPath, 'pages', 'api'),\n path.join(projectPath, 'src', 'pages', 'api'),\n ];\n\n for (const apiDir of pagesApiDirs) {\n if (dirExists(apiDir)) return true;\n }\n\n return false;\n}\n\nconst SCAN_IGNORE = ['node_modules', '.next', '.git', 'dist', 'build', '.turbo'];\n\nfunction hasPatternInDir(dir: string, pattern: RegExp, depth: number = 0): boolean {\n if (depth > 5) return false;\n\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n if (SCAN_IGNORE.includes(entry.name)) continue;\n\n const full = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (hasPatternInDir(full, pattern, depth + 1)) return true;\n } else if (/\\.(tsx?|jsx?|mjs)$/.test(entry.name)) {\n const content = readFileSafe(full);\n if (content && pattern.test(content)) return true;\n }\n }\n } catch {\n // Skip unreadable directories\n }\n\n return false;\n}\n","import path from 'path';\nimport { readFileSafe } from '../utils.js';\n\n/**\n * Parse .aiignore file (gitignore-like syntax) and return patterns.\n * These patterns tell AI agents and scanners to skip certain files/directories.\n */\nexport function loadAiIgnorePatterns(projectPath: string): string[] {\n const content = readFileSafe(path.join(projectPath, '.aiignore'));\n if (!content) return [];\n\n return content\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith('#'));\n}\n\n/**\n * Check if a file path should be ignored based on .aiignore patterns.\n * Supports simple glob-like matching:\n * - `*.generated.ts` — matches any file ending with .generated.ts\n * - `legacy/` — matches any path containing /legacy/\n * - `src/generated` — matches exact directory prefix\n */\nexport function shouldIgnore(\n filePath: string,\n patterns: string[],\n): boolean {\n if (patterns.length === 0) return false;\n\n const normalized = filePath.replace(/\\\\/g, '/');\n\n for (const pattern of patterns) {\n // Directory pattern (ends with /)\n if (pattern.endsWith('/')) {\n const dir = pattern.slice(0, -1);\n if (normalized.includes(`/${dir}/`) || normalized.startsWith(`${dir}/`)) {\n return true;\n }\n continue;\n }\n\n // Wildcard pattern (starts with *)\n if (pattern.startsWith('*')) {\n const suffix = pattern.slice(1);\n if (normalized.endsWith(suffix)) {\n return true;\n }\n continue;\n }\n\n // Wildcard pattern (contains *)\n if (pattern.includes('*')) {\n const parts = pattern.split('*');\n let remaining = normalized;\n let allMatched = true;\n\n for (const part of parts) {\n if (part === '') continue;\n const idx = remaining.indexOf(part);\n if (idx === -1) {\n allMatched = false;\n break;\n }\n remaining = remaining.slice(idx + part.length);\n }\n\n if (allMatched) return true;\n continue;\n }\n\n // Exact or prefix match\n if (normalized === pattern || normalized.includes(`/${pattern}`) || normalized.startsWith(pattern)) {\n return true;\n }\n }\n\n return false;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { TEMPLATES_DIR, VERSION } from '../constants.js';\nimport { readFileSafe } from '../utils.js';\n\nexport function readTemplate(relativePath: string): string {\n const fullPath = path.join(TEMPLATES_DIR, relativePath);\n const content = readFileSafe(fullPath);\n if (!content) {\n throw new Error(`Template not found: ${relativePath}`);\n }\n return content.trim();\n}\n\nexport function loadCustomFragments(projectPath: string): string[] {\n const customDir = path.join(projectPath, '.ai-kit', 'fragments');\n if (!fs.existsSync(customDir)) return [];\n\n try {\n const files = fs.readdirSync(customDir).filter((f: string) => f.endsWith('.md'));\n return files.map((f: string) => {\n const content = fs.readFileSync(path.join(customDir, f), 'utf-8');\n return content.trim();\n }).filter(Boolean);\n } catch {\n return [];\n }\n}\n\nexport function assembleTemplate(\n subfolder: 'claude-md' | 'cursorrules',\n fragments: string[],\n variables: Record<string, string>,\n options?: { customFragments?: string[]; strictness?: string },\n): string {\n const versionComment = `<!-- Generated by ai-kit v${VERSION} -->`;\n const header = readTemplate('header.md');\n const body = fragments\n .map((name) => readTemplate(`${subfolder}/${name}.md`))\n .join('\\n\\n---\\n\\n');\n\n // Append strictness note\n const strictnessNote = options?.strictness && options.strictness !== 'standard'\n ? `\\n\\n---\\n\\n> **Strictness Level: ${options.strictness}**\\n> ${getStrictnessDescription(options.strictness)}`\n : '';\n\n // Append custom fragments\n const customSection = options?.customFragments?.length\n ? '\\n\\n---\\n\\n' + options.customFragments.join('\\n\\n---\\n\\n')\n : '';\n\n const full = `${versionComment}\\n${header}\\n\\n---\\n\\n${body}${strictnessNote}${customSection}`;\n const replaced = replacePlaceholders(full, variables);\n return `<!-- AI-KIT:START -->\\n${replaced}\\n<!-- AI-KIT:END -->`;\n}\n\nfunction getStrictnessDescription(level: string): string {\n switch (level) {\n case 'strict':\n return 'Enforce all rules strictly. No exceptions without explicit approval. All PRs must pass every check. Zero tolerance for `any` types, missing tests, or accessibility gaps.';\n case 'relaxed':\n return 'Rules are guidelines, not hard requirements. Prioritize shipping speed over perfection. Skip non-critical checks when under time pressure. Use best judgment.';\n default:\n return 'Standard enforcement. Follow rules by default, use judgment for edge cases.';\n }\n}\n\nexport function replacePlaceholders(\n content: string,\n variables: Record<string, string>,\n): string {\n let result = content;\n for (const [key, value] of Object.entries(variables)) {\n result = result.replaceAll(`{{${key}}}`, value);\n }\n return result;\n}\n","import type { ProjectScan, StrictnessLevel } from '../types.js';\nimport { assembleTemplate } from './assembler.js';\n\nexport function selectFragments(scan: ProjectScan): string[] {\n const fragments: string[] = ['base'];\n\n if (scan.framework === 'nextjs') {\n if (scan.routerType === 'app' || scan.routerType === 'hybrid') {\n fragments.push('nextjs-app-router');\n }\n if (scan.routerType === 'pages' || scan.routerType === 'hybrid') {\n fragments.push('nextjs-pages-router');\n }\n }\n\n if (scan.cms !== 'none') {\n fragments.push('sitecore-xmc');\n }\n\n if (scan.styling.includes('tailwind')) {\n fragments.push('tailwind');\n }\n\n if (scan.typescript) {\n fragments.push('typescript');\n }\n\n if (scan.monorepo) {\n fragments.push('monorepo');\n }\n\n if (scan.figma?.detected) {\n fragments.push('figma');\n }\n\n if (scan.staticSite?.isStatic) {\n fragments.push('static-site');\n }\n\n return fragments;\n}\n\nexport function generateClaudeMd(\n scan: ProjectScan,\n options?: { strictness?: StrictnessLevel; customFragments?: string[] },\n): string {\n const fragments = selectFragments(scan);\n const variables = buildVariables(scan);\n return assembleTemplate('claude-md', fragments, variables, {\n customFragments: options?.customFragments,\n strictness: options?.strictness,\n });\n}\n\nfunction buildVariables(scan: ProjectScan): Record<string, string> {\n const techStack: string[] = [];\n\n if (scan.framework === 'nextjs') {\n techStack.push(`Next.js ${scan.nextjsVersion || ''}`);\n }\n if (scan.cms !== 'none') {\n if (scan.cms === 'sitecore-xmc-v2') {\n techStack.push(\n `Sitecore XM Cloud${scan.sitecoreContentSdkVersion ? ` (Content SDK ${scan.sitecoreContentSdkVersion})` : ' (Content SDK v2)'}`,\n );\n } else if (scan.cms === 'sitecore-xmc') {\n techStack.push(\n `Sitecore XM Cloud${scan.sitecorejssVersion ? ` (JSS ${scan.sitecorejssVersion})` : ''}`,\n );\n } else {\n techStack.push('Sitecore JSS');\n }\n }\n if (scan.typescript) techStack.push('TypeScript');\n if (scan.styling.includes('tailwind'))\n techStack.push(`Tailwind CSS ${scan.tailwindVersion || ''}`);\n if (scan.styling.includes('scss')) techStack.push('SCSS');\n if (scan.styling.includes('styled-components'))\n techStack.push('styled-components');\n if (scan.monorepo && scan.monorepoTool)\n techStack.push(scan.monorepoTool);\n\n const scripts = Object.entries(scan.scripts)\n .filter(([key]) =>\n ['dev', 'build', 'start', 'lint', 'test', 'type-check', 'typecheck'].includes(key),\n )\n .map(([key, value]) => `- \\`${scan.packageManager} run ${key}\\` → \\`${value}\\``)\n .join('\\n');\n\n // Design token summary for templates\n let designTokenSummary = '';\n if (scan.designTokens?.detected) {\n const parts: string[] = [];\n if (scan.designTokens.colors.length > 0) {\n parts.push(`Colors: ${scan.designTokens.colors.slice(0, 15).join(', ')}${scan.designTokens.colors.length > 15 ? ` (+${scan.designTokens.colors.length - 15} more)` : ''}`);\n }\n if (scan.designTokens.fonts.length > 0) {\n parts.push(`Fonts: ${scan.designTokens.fonts.join(', ')}`);\n }\n if (scan.designTokens.spacing.length > 0) {\n parts.push(`Spacing: ${scan.designTokens.spacing.slice(0, 10).join(', ')}${scan.designTokens.spacing.length > 10 ? ` (+${scan.designTokens.spacing.length - 10} more)` : ''}`);\n }\n if (scan.designTokens.breakpoints.length > 0) {\n parts.push(`Breakpoints: ${scan.designTokens.breakpoints.join(', ')}`);\n }\n designTokenSummary = parts.map((p) => `- ${p}`).join('\\n');\n }\n\n // .aiignore summary\n const aiIgnoreSummary = scan.aiIgnorePatterns.length > 0\n ? scan.aiIgnorePatterns.map((p) => `- \\`${p}\\``).join('\\n')\n : '';\n\n return {\n projectName: scan.projectName,\n techStack: techStack.join(' · '),\n packageManager: scan.packageManager,\n routerType: scan.routerType || 'unknown',\n scripts: scripts || '- No scripts detected',\n framework: scan.framework,\n designTokens: designTokenSummary || '- No design tokens detected',\n aiIgnorePatterns: aiIgnoreSummary || '- No .aiignore file',\n outputMode: scan.staticSite?.outputMode || 'ssr',\n };\n}\n","import type { ProjectScan, StrictnessLevel } from '../types.js';\nimport { assembleTemplate } from './assembler.js';\nimport { selectFragments } from './claude-md.js';\n\nexport function generateCursorRules(\n scan: ProjectScan,\n options?: { strictness?: StrictnessLevel; customFragments?: string[] },\n): string {\n const fragments = selectFragments(scan);\n const variables = buildCursorVariables(scan);\n return assembleTemplate('cursorrules', fragments, variables, {\n customFragments: options?.customFragments,\n strictness: options?.strictness,\n });\n}\n\nexport function buildCursorVariables(scan: ProjectScan): Record<string, string> {\n const techStack: string[] = [];\n\n if (scan.framework === 'nextjs') {\n techStack.push(`Next.js ${scan.nextjsVersion || ''}`);\n }\n if (scan.cms !== 'none') {\n techStack.push(\n scan.cms === 'sitecore-xmc-v2' || scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : 'Sitecore JSS',\n );\n }\n if (scan.typescript) techStack.push('TypeScript');\n if (scan.styling.includes('tailwind')) techStack.push('Tailwind CSS');\n if (scan.monorepo && scan.monorepoTool) techStack.push(scan.monorepoTool);\n\n const scripts = Object.entries(scan.scripts)\n .filter(([key]) =>\n ['dev', 'build', 'start', 'lint', 'test', 'type-check', 'typecheck'].includes(key),\n )\n .map(([key, value]) => `- \\`${scan.packageManager} run ${key}\\` → \\`${value}\\``)\n .join('\\n');\n\n return {\n projectName: scan.projectName,\n techStack: techStack.join(' · '),\n packageManager: scan.packageManager,\n routerType: scan.routerType || 'unknown',\n scripts: scripts || '- No scripts detected',\n framework: scan.framework,\n };\n}\n","import type { ProjectScan } from '../types.js';\nimport { selectFragments } from './claude-md.js';\nimport { readTemplate, replacePlaceholders } from './assembler.js';\nimport { buildCursorVariables } from './cursorrules.js';\nimport { VERSION } from '../constants.js';\n\nexport interface MdcFile {\n filename: string;\n content: string;\n}\n\nconst MDC_CONFIG: Record<string, { description: string; globs: string }> = {\n base: {\n description: 'Project coding standards and conventions',\n globs: '**/*',\n },\n 'nextjs-app-router': {\n description: 'Next.js App Router patterns and best practices',\n globs: 'app/**/*.{ts,tsx}, src/app/**/*.{ts,tsx}',\n },\n 'nextjs-pages-router': {\n description: 'Next.js Pages Router patterns and best practices',\n globs: 'pages/**/*.{ts,tsx}, src/pages/**/*.{ts,tsx}',\n },\n 'sitecore-xmc': {\n description: 'Sitecore XM Cloud component patterns and field helpers',\n globs: 'src/components/**/*.{ts,tsx}',\n },\n tailwind: {\n description: 'Tailwind CSS conventions and utility patterns',\n globs: '**/*.{tsx,jsx,css}',\n },\n typescript: {\n description: 'TypeScript strict typing conventions',\n globs: '**/*.{ts,tsx}',\n },\n monorepo: {\n description: 'Monorepo workspace conventions',\n globs: '**/*',\n },\n figma: {\n description: 'Figma-to-code workflow and design token rules',\n globs: 'src/components/**/*.{ts,tsx}, tokens/**/*',\n },\n 'static-site': {\n description: 'Static site generation (SSG/ISR) rules and patterns',\n globs: 'app/**/*.{ts,tsx}, src/app/**/*.{ts,tsx}, next.config.*',\n },\n};\n\nexport function generateMdcFiles(scan: ProjectScan): MdcFile[] {\n const fragments = selectFragments(scan);\n const variables = buildCursorVariables(scan);\n\n return fragments.map((fragment) => {\n const config = MDC_CONFIG[fragment] || {\n description: fragment,\n globs: '**/*',\n };\n const body = readTemplate(`cursorrules/${fragment}.md`);\n const replaced = replacePlaceholders(body, variables);\n\n const frontmatter = [\n '---',\n `description: ${config.description}`,\n `globs: ${config.globs}`,\n 'alwaysApply: true',\n '---',\n ].join('\\n');\n\n return {\n filename: `${fragment}.mdc`,\n content: `${frontmatter}\\n\\n<!-- Generated by ai-kit v${VERSION} -->\\n\\n${replaced}`,\n };\n });\n}\n","import type { AiKitConfig, ProjectScan, StrictnessLevel, HookProfile, ToolsSelection } from '../types.js';\nimport { VERSION } from '../constants.js';\n\nexport function generateConfig(\n scan: ProjectScan,\n templates: string[],\n commands: string[],\n guides: string[],\n options?: {\n strictness?: StrictnessLevel;\n customFragments?: string[];\n agents?: string[];\n contexts?: string[];\n hooks?: boolean;\n hookProfile?: HookProfile;\n tools?: ToolsSelection;\n },\n): AiKitConfig {\n return {\n version: VERSION,\n scanResult: scan,\n generatedAt: new Date().toISOString(),\n templates,\n commands,\n guides,\n agents: options?.agents || [],\n contexts: options?.contexts || [],\n hooks: options?.hooks || false,\n hookProfile: options?.hookProfile || 'standard',\n strictness: options?.strictness || 'standard',\n customFragments: options?.customFragments || [],\n tools: options?.tools || { claude: true, cursor: true },\n };\n}\n","import type { ProjectScan, HooksConfig, HookDefinition, HookProfile } from '../types.js';\n\nexport function generateHooks(\n scan: ProjectScan,\n profile: HookProfile = 'standard',\n): HooksConfig {\n const hooks: HooksConfig = {};\n\n const preToolUse: HookDefinition[] = [];\n const postToolUse: HookDefinition[] = [];\n const stop: HookDefinition[] = [];\n\n // --- PreToolUse hooks ---\n\n // Git push safety reminder (all profiles)\n preToolUse.push({\n matcher: 'Bash(git push*)',\n hooks: [\n {\n type: 'command',\n command:\n 'echo \"⚠️ Review your changes before pushing. Run tests and type-check first.\"',\n },\n ],\n });\n\n // --- PostToolUse hooks ---\n\n // Auto-format on file edit\n if (scan.tools.biome) {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: `npx @biomejs/biome check --write --unsafe \"$CLAUDE_FILE_PATH\" 2>/dev/null || true`,\n },\n ],\n });\n } else if (scan.tools.prettier) {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: `npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true`,\n },\n ],\n });\n }\n\n // TypeScript type-check after edits (standard + strict)\n if (scan.typescript && profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx) npx tsc --noEmit --pretty 2>&1 | head -20 ;; esac',\n },\n ],\n });\n }\n\n // ESLint check after edits (strict only)\n if (scan.tools.eslint && profile === 'strict') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx|*.js|*.jsx) npx eslint \"$CLAUDE_FILE_PATH\" --max-warnings 0 2>&1 | head -15 ;; esac',\n },\n ],\n });\n }\n\n // Console.log warning (standard + strict)\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command:\n 'case \"$CLAUDE_FILE_PATH\" in *.ts|*.tsx|*.js|*.jsx) grep -n \"console\\\\.log\" \"$CLAUDE_FILE_PATH\" && echo \"⚠️ console.log detected — remove before committing\" || true ;; esac',\n },\n ],\n });\n }\n\n // --- Bundle Impact Warning ---\n // Warns when new dependencies are added (standard + strict)\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Edit|Write',\n hooks: [\n {\n type: 'command',\n command: [\n 'case \"$CLAUDE_FILE_PATH\" in',\n ' */package.json)',\n ' ADDED=$(git diff --no-index /dev/null \"$CLAUDE_FILE_PATH\" 2>/dev/null | grep \"^+\" | grep -E \\'\"dependencies\"|\"devDependencies\"\\' | head -1)',\n ' if [ -n \"$ADDED\" ]; then',\n ' NEW_DEPS=$(git diff \"$CLAUDE_FILE_PATH\" 2>/dev/null | grep \"^+\" | grep -v \"^+++\" | grep -E \\'\"[^\"]+\": \"[^\"]+\"\\' | sed \\'s/.*\"\\\\([^\"]*\\\\)\".*/\\\\1/\\' | head -5)',\n ' if [ -n \"$NEW_DEPS\" ]; then',\n ' echo \"📦 New dependencies detected:\"',\n ' echo \"$NEW_DEPS\" | while read dep; do echo \" → $dep\"; done',\n ' echo \"⚠️ Check bundle impact before committing. Run: npx bundlesize or npm run build\"',\n ' fi',\n ' fi',\n ' ;;',\n 'esac',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Pre-Commit Review Hook ---\n // Lightweight review of staged changes before git commit (strict only)\n if (profile === 'strict') {\n preToolUse.push({\n matcher: 'Bash(git commit*)',\n hooks: [\n {\n type: 'command',\n command: [\n 'STAGED=$(git diff --cached --name-only 2>/dev/null | grep -E \"\\\\.(ts|tsx|js|jsx)$\")',\n 'if [ -n \"$STAGED\" ]; then',\n ' ISSUES=\"\"',\n ' for f in $STAGED; do',\n ' if [ -f \"$f\" ]; then',\n ' # Check for any types',\n ' ANY_COUNT=$(grep -c \": any\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$ANY_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $ANY_COUNT \\\\`any\\\\` type(s) found\"',\n ' fi',\n ' # Check for console.log',\n ' LOG_COUNT=$(grep -c \"console\\\\.log\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$LOG_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $LOG_COUNT console.log(s) found\"',\n ' fi',\n ' # Check for TODO without ticket',\n ' TODO_COUNT=$(grep -c \"// TODO[^(]\\\\|// TODO$\" \"$f\" 2>/dev/null || echo 0)',\n ' if [ \"$TODO_COUNT\" -gt 0 ]; then',\n ' ISSUES=\"$ISSUES\\\\n ⚠️ $f: $TODO_COUNT TODO(s) without ticket reference\"',\n ' fi',\n ' fi',\n ' done',\n ' if [ -n \"$ISSUES\" ]; then',\n ' echo \"🔍 Pre-commit review found issues:\"',\n ' printf \"$ISSUES\\\\n\"',\n ' echo \"Fix these before committing, or proceed if intentional.\"',\n ' fi',\n 'fi',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Mistakes Auto-Capture Hook ---\n // Captures build/lint/typecheck failures into docs/mistakes-log.md\n if (profile !== 'minimal') {\n postToolUse.push({\n matcher: 'Bash',\n hooks: [\n {\n type: 'command',\n command: [\n 'if [ \"$CLAUDE_TOOL_EXIT_CODE\" != \"0\" ] && [ -n \"$CLAUDE_TOOL_EXIT_CODE\" ]; then',\n ' OUTPUT=\"$CLAUDE_TOOL_OUTPUT\"',\n ' IS_BUILD_ERROR=false',\n ' case \"$OUTPUT\" in',\n ' *\"error TS\"*|*\"tsc\"*) IS_BUILD_ERROR=true ;;',\n ' *\"ESLint\"*|*\"eslint\"*|*\"Lint error\"*) IS_BUILD_ERROR=true ;;',\n ' *\"Build error\"*|*\"build failed\"*|*\"ELIFECYCLE\"*) IS_BUILD_ERROR=true ;;',\n ' *\"Module not found\"*|*\"Cannot find module\"*) IS_BUILD_ERROR=true ;;',\n ' *\"SyntaxError\"*|*\"TypeError\"*) IS_BUILD_ERROR=true ;;',\n ' esac',\n ' if [ \"$IS_BUILD_ERROR\" = \"true\" ]; then',\n ' LOG_FILE=\"docs/mistakes-log.md\"',\n ' if [ -f \"$LOG_FILE\" ]; then',\n ' DATE=$(date +\"%Y-%m-%d %H:%M\")',\n ' ERROR_PREVIEW=$(echo \"$OUTPUT\" | grep -i \"error\" | head -3 | sed \"s/^/ /\")',\n ' {',\n ' echo \"\"',\n ' echo \"### $DATE — Build/lint failure (auto-captured)\"',\n ' echo \"- **What happened**: Command exited with code $CLAUDE_TOOL_EXIT_CODE\"',\n ' echo \"- **Error preview**:\"',\n ' echo \"\\\\`\\\\`\\\\`\"',\n ' echo \"$ERROR_PREVIEW\"',\n ' echo \"\\\\`\\\\`\\\\`\"',\n ' echo \"- **Root cause**: <!-- TODO: Fill in after investigating -->\"',\n ' echo \"- **Fix**: <!-- TODO: How was it resolved? -->\"',\n ' echo \"- **Lesson**: <!-- TODO: What to do differently -->\"',\n ' echo \"\"',\n ' echo \"---\"',\n ' } >> \"$LOG_FILE\"',\n ' echo \"📝 Mistake auto-logged to docs/mistakes-log.md\"',\n ' fi',\n ' fi',\n 'fi',\n ].join('\\n'),\n },\n ],\n });\n }\n\n // --- Stop hooks ---\n\n // Console.log check in all modified files (strict only)\n if (profile === 'strict') {\n stop.push({\n matcher: '',\n hooks: [\n {\n type: 'command',\n command:\n 'git diff --name-only --diff-filter=M 2>/dev/null | grep -E \"\\\\.(ts|tsx|js|jsx)$\" | xargs grep -l \"console\\\\.log\" 2>/dev/null && echo \"⚠️ console.log found in modified files\" || true',\n },\n ],\n });\n }\n\n if (preToolUse.length > 0) hooks.PreToolUse = preToolUse;\n if (postToolUse.length > 0) hooks.PostToolUse = postToolUse;\n if (stop.length > 0) hooks.Stop = stop;\n\n return hooks;\n}\n\nexport function generateSettingsLocal(\n scan: ProjectScan,\n profile: HookProfile = 'standard',\n): Record<string, unknown> {\n const hooks = generateHooks(scan, profile);\n\n return {\n hooks,\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { COMMANDS_DIR } from '../constants.js';\n\nconst AVAILABLE_SKILLS = [\n 'prompt-help',\n 'review',\n 'fix-bug',\n 'new-component',\n 'new-page',\n 'understand',\n 'test',\n 'optimize',\n 'figma-to-code',\n 'design-tokens',\n 'accessibility-audit',\n 'security-check',\n 'refactor',\n 'api-route',\n 'pre-pr',\n 'migrate',\n 'error-boundary',\n 'type-fix',\n 'extract-hook',\n 'dep-check',\n 'env-setup',\n 'commit-msg',\n 'sitecore-debug',\n 'responsive-check',\n 'document',\n 'token-tips',\n // New skills (v1.1.0)\n 'perf-audit',\n 'bundle-check',\n 'i18n-check',\n 'schema-gen',\n 'changelog',\n 'release',\n 'storybook-gen',\n // New skills (v1.2.0) — hooks, agents, sessions, orchestration\n 'search-first',\n 'quality-gate-check',\n 'server-action',\n 'middleware',\n 'save-session',\n 'resume-session',\n 'checkpoint',\n 'orchestrate',\n 'quality-gate',\n 'harness-audit',\n];\n\n// Short descriptions for auto-discovery — AI reads these to decide when to apply\nconst SKILL_DESCRIPTIONS: Record<string, string> = {\n 'prompt-help': 'Help developers write effective AI prompts with structured context',\n 'review': 'Deep code review following project coding standards',\n 'fix-bug': 'Systematic debugging workflow with root cause analysis and regression testing',\n 'new-component': 'Scaffold new React components with types, tests, and documentation',\n 'new-page': 'Scaffold new Next.js pages/routes with proper file structure',\n 'understand': 'Explain code architecture, data flow, and design decisions',\n 'test': 'Generate unit and integration tests with React Testing Library',\n 'optimize': 'Analyze and fix performance issues in components and pages',\n 'figma-to-code': 'Implement Figma designs using project design tokens',\n 'design-tokens': 'Audit and manage design token systems',\n 'accessibility-audit': 'WCAG 2.1 AA accessibility compliance audit',\n 'security-check': 'Scan for XSS, injection, secrets, and OWASP Top 10 vulnerabilities',\n 'refactor': 'Restructure code to improve readability without changing behavior',\n 'api-route': 'Scaffold Next.js API routes with validation, typing, and error handling',\n 'pre-pr': 'Pre-pull-request checklist covering types, a11y, security, tests, and more',\n 'migrate': 'Guide framework and library migrations step by step',\n 'error-boundary': 'Generate error boundaries, loading states, and fallback UI',\n 'type-fix': 'Fix TypeScript issues — replace any types, add null checks, tighten types',\n 'extract-hook': 'Extract component logic into reusable custom React hooks',\n 'dep-check': 'Audit dependencies for unused, outdated, vulnerable, and bloated packages',\n 'env-setup': 'Generate .env.example, validate environment variables, check for leaked secrets',\n 'commit-msg': 'Generate conventional commit messages from staged git changes',\n 'sitecore-debug': 'Debug Sitecore XM Cloud integration issues',\n 'responsive-check': 'Audit responsive design — breakpoints, touch targets, overflow',\n 'document': 'Generate documentation for existing components and utilities',\n 'token-tips': 'Token usage optimization strategies for AI coding assistants',\n // New skills (v1.1.0)\n 'perf-audit': 'Lighthouse-style performance audit covering Core Web Vitals, resource loading, and caching',\n 'bundle-check': 'Analyze bundle size, find heavy imports, suggest tree-shaking and code splitting',\n 'i18n-check': 'Find hardcoded strings, missing translation keys, and internationalization gaps',\n 'schema-gen': 'Generate TypeScript types and Zod schemas from API responses, JSON, or GraphQL',\n 'changelog': 'Generate formatted changelogs from git history following Keep a Changelog format',\n 'release': 'Guided release workflow with versioning, changelog, tagging, and release notes',\n 'storybook-gen': 'Generate Storybook stories with controls, play functions, and visual tests',\n // New skills (v1.2.0) — hooks, agents, sessions, orchestration\n 'search-first': 'Research-before-coding — search docs, existing patterns, and APIs before writing code',\n 'quality-gate-check': 'Post-implementation quality checklist — type safety, a11y, security, performance, Sitecore',\n 'server-action': 'Scaffold Next.js Server Actions with Zod validation, error handling, and revalidation',\n 'middleware': 'Create or update Next.js middleware for auth, redirects, i18n, or Sitecore preview mode',\n 'save-session': 'Persist current session context, decisions, and pending work for later resumption',\n 'resume-session': 'Restore context from a previous session and continue where you left off',\n 'checkpoint': 'Create a verification snapshot — run all quality checks and record pass/fail status',\n 'orchestrate': 'Multi-agent orchestration — break complex tasks into subtasks and delegate to agents',\n 'quality-gate': 'Run comprehensive quality checks: types, lint, format, tests, bundle, a11y, security',\n 'harness-audit': 'Audit AI agent configuration — check CLAUDE.md, hooks, agents, skills, MCP servers',\n};\n\nexport async function copySkills(targetDir: string): Promise<string[]> {\n const copied: string[] = [];\n\n for (const skill of AVAILABLE_SKILLS) {\n const src = path.join(COMMANDS_DIR, `${skill}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n const content = await fs.readFile(src, 'utf-8');\n const description = SKILL_DESCRIPTIONS[skill] || skill;\n\n // Generate for Claude Code: .claude/skills/[name]/SKILL.md\n const claudeSkillDir = path.join(targetDir, '.claude', 'skills', skill);\n await fs.ensureDir(claudeSkillDir);\n await fs.writeFile(\n path.join(claudeSkillDir, 'SKILL.md'),\n content,\n 'utf-8',\n );\n\n // Generate for Cursor: .cursor/skills/[name]/SKILL.md\n const cursorSkillDir = path.join(targetDir, '.cursor', 'skills', skill);\n await fs.ensureDir(cursorSkillDir);\n await fs.writeFile(\n path.join(cursorSkillDir, 'SKILL.md'),\n content,\n 'utf-8',\n );\n\n // Legacy: also copy to .claude/commands/ for older Claude Code versions\n const legacyDir = path.join(targetDir, '.claude', 'commands');\n await fs.ensureDir(legacyDir);\n await fs.copy(src, path.join(legacyDir, `${skill}.md`), { overwrite: true });\n\n copied.push(skill);\n }\n\n return copied;\n}\n\n// Keep the old function name as an alias for backward compatibility\nexport const copyCommands = copySkills;\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { GUIDES_DIR } from '../constants.js';\n\nconst AVAILABLE_GUIDES = [\n 'getting-started',\n 'prompt-playbook',\n 'when-to-use-ai',\n 'token-saving-tips',\n 'figma-workflow',\n 'hooks-and-agents',\n];\n\nexport async function copyGuides(targetDir: string): Promise<string[]> {\n const guidesTarget = path.join(targetDir, 'ai-kit', 'guides');\n await fs.ensureDir(guidesTarget);\n\n const copied: string[] = [];\n\n for (const guide of AVAILABLE_GUIDES) {\n const src = path.join(GUIDES_DIR, `${guide}.md`);\n const dest = path.join(guidesTarget, `${guide}.md`);\n\n if (await fs.pathExists(src)) {\n await fs.copy(src, dest, { overwrite: true });\n copied.push(guide);\n }\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { DOCS_SCAFFOLDS_DIR } from '../constants.js';\n\nconst DOC_SCAFFOLDS = ['mistakes-log', 'decisions-log', 'time-log'];\n\nexport async function scaffoldDocs(targetDir: string): Promise<string[]> {\n const docsTarget = path.join(targetDir, 'docs');\n await fs.ensureDir(docsTarget);\n\n const created: string[] = [];\n\n for (const doc of DOC_SCAFFOLDS) {\n const src = path.join(DOCS_SCAFFOLDS_DIR, `${doc}.md`);\n const dest = path.join(docsTarget, `${doc}.md`);\n\n if ((await fs.pathExists(dest))) {\n continue; // Don't overwrite existing docs\n }\n\n if (await fs.pathExists(src)) {\n await fs.copy(src, dest);\n created.push(doc);\n }\n }\n\n return created;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { AGENTS_DIR } from '../constants.js';\nimport type { ProjectScan } from '../types.js';\n\nconst UNIVERSAL_AGENTS = [\n 'planner',\n 'code-reviewer',\n 'security-reviewer',\n 'build-resolver',\n 'doc-updater',\n 'refactor-cleaner',\n 'architect',\n];\n\nconst CONDITIONAL_AGENTS: { name: string; condition: (scan: ProjectScan) => boolean }[] = [\n {\n name: 'e2e-runner',\n condition: (scan) => scan.tools.playwright,\n },\n {\n name: 'sitecore-specialist',\n condition: (scan) => scan.cms !== 'none',\n },\n {\n name: 'tdd-guide',\n condition: (scan) => scan.tools.playwright || !!scan.scripts['test'],\n },\n];\n\nexport async function copyAgents(\n targetDir: string,\n scan: ProjectScan,\n): Promise<string[]> {\n const agentsTarget = path.join(targetDir, '.claude', 'agents');\n await fs.ensureDir(agentsTarget);\n\n const copied: string[] = [];\n\n // Copy universal agents\n for (const agent of UNIVERSAL_AGENTS) {\n const src = path.join(AGENTS_DIR, `${agent}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(agentsTarget, `${agent}.md`), {\n overwrite: true,\n });\n copied.push(agent);\n }\n\n // Copy conditional agents based on scan results\n for (const { name, condition } of CONDITIONAL_AGENTS) {\n if (!condition(scan)) continue;\n\n const src = path.join(AGENTS_DIR, `${name}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(agentsTarget, `${name}.md`), {\n overwrite: true,\n });\n copied.push(name);\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { CONTEXTS_DIR } from '../constants.js';\n\nconst AVAILABLE_CONTEXTS = ['dev', 'review', 'research'];\n\nexport async function copyContexts(targetDir: string): Promise<string[]> {\n const contextsTarget = path.join(targetDir, '.claude', 'contexts');\n await fs.ensureDir(contextsTarget);\n\n const copied: string[] = [];\n\n for (const context of AVAILABLE_CONTEXTS) {\n const src = path.join(CONTEXTS_DIR, `${context}.md`);\n if (!(await fs.pathExists(src))) continue;\n\n await fs.copy(src, path.join(contextsTarget, `${context}.md`), {\n overwrite: true,\n });\n copied.push(context);\n }\n\n return copied;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport ora from 'ora';\nimport { confirm } from '@inquirer/prompts';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { generateMdcFiles } from '../generator/cursor-mdc.js';\nimport { generateConfig } from '../generator/config.js';\nimport { generateSettingsLocal } from '../generator/hooks.js';\nimport { copySkills } from '../copier/skills.js';\nimport { copyGuides } from '../copier/guides.js';\nimport { copyAgents } from '../copier/agents.js';\nimport { copyContexts } from '../copier/contexts.js';\nimport { loadCustomFragments } from '../generator/assembler.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSuccess,\n logError,\n logInfo,\n logWarning,\n logSection,\n fileExists,\n readJsonSafe,\n readFileSafe,\n mergeWithMarkers,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\nexport async function updateCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n if (!fileExists(configPath)) {\n logError('No ai-kit.config.json found. Run `ai-kit init` first.');\n return;\n }\n\n const existingConfig = readJsonSafe<AiKitConfig>(configPath);\n if (!existingConfig) {\n logError('Could not read ai-kit.config.json. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Warn if major version mismatch\n const existingMajor = parseInt(existingConfig.version.split('.')[0], 10);\n const currentMajor = parseInt(VERSION.split('.')[0], 10);\n if (existingMajor !== currentMajor) {\n logWarning(\n `Config was generated with ai-kit v${existingConfig.version}, but you're running v${VERSION}. Consider running \\`ai-kit init\\` to re-initialize.`,\n );\n }\n\n const proceed = await confirm({\n message: 'Re-scan project and update all generated files?',\n default: true,\n });\n\n if (!proceed) return;\n\n const spinner = ora('Re-scanning project...').start();\n const scan = await scanProject(projectDir);\n spinner.succeed('Project re-scanned');\n\n logSection('Updating Files');\n\n const strictness = existingConfig.strictness || 'standard';\n const hookProfile = existingConfig.hookProfile || 'standard';\n const tools = existingConfig.tools || { claude: true, cursor: true };\n const customFragments = loadCustomFragments(projectDir);\n const genOpts = { strictness, customFragments };\n\n logInfo(`Using saved profile — Tools: ${tools.claude && tools.cursor ? 'Claude Code + Cursor' : tools.claude ? 'Claude Code' : 'Cursor'} · Strictness: ${strictness} · Hooks: ${hookProfile}`);\n\n const templates: string[] = [];\n\n // Update CLAUDE.md if it was previously generated or tools.claude is enabled\n if (\n tools.claude &&\n (existingConfig.templates.includes('CLAUDE.md') ||\n fileExists(path.join(projectDir, GENERATED_FILES.claudeMd)))\n ) {\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n const newContent = generateClaudeMd(scan, genOpts);\n const existing = readFileSafe(claudeMdPath);\n if (existing) {\n await fs.writeFile(claudeMdPath, mergeWithMarkers(existing, newContent), 'utf-8');\n } else {\n await fs.writeFile(claudeMdPath, newContent, 'utf-8');\n }\n templates.push('CLAUDE.md');\n logSuccess('CLAUDE.md updated');\n }\n\n // Update .cursorrules if it was previously generated or tools.cursor is enabled\n if (\n tools.cursor &&\n (existingConfig.templates.includes('.cursorrules') ||\n fileExists(path.join(projectDir, GENERATED_FILES.cursorRules)))\n ) {\n const cursorRulesPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n const newContent = generateCursorRules(scan, genOpts);\n const existing = readFileSafe(cursorRulesPath);\n if (existing) {\n await fs.writeFile(cursorRulesPath, mergeWithMarkers(existing, newContent), 'utf-8');\n } else {\n await fs.writeFile(cursorRulesPath, newContent, 'utf-8');\n }\n templates.push('.cursorrules');\n logSuccess('.cursorrules updated');\n\n // Update .cursor/rules/*.mdc files\n const mdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n await fs.ensureDir(mdcDir);\n const mdcFiles = generateMdcFiles(scan);\n for (const mdc of mdcFiles) {\n await fs.writeFile(path.join(mdcDir, mdc.filename), mdc.content, 'utf-8');\n }\n logSuccess(`${mdcFiles.length} .cursor/rules/*.mdc files updated`);\n }\n\n // Update skills\n const commands = await copySkills(projectDir);\n logSuccess(`${commands.length} skills updated (.claude/skills/ + .cursor/skills/)`);\n\n // Update agents\n const agents = await copyAgents(projectDir, scan);\n logSuccess(`${agents.length} agents updated (.claude/agents/)`);\n\n // Update contexts\n const contexts = await copyContexts(projectDir);\n logSuccess(`${contexts.length} context modes updated (.claude/contexts/)`);\n\n // Update hooks\n if (existingConfig.hooks !== false) {\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n const settingsLocal = generateSettingsLocal(scan, hookProfile);\n await fs.ensureDir(path.dirname(settingsLocalPath));\n await fs.writeJson(settingsLocalPath, settingsLocal, { spaces: 2 });\n logSuccess(`Hooks updated (profile: ${hookProfile})`);\n }\n\n // Update guides\n const guides = await copyGuides(projectDir);\n logSuccess(`${guides.length} guides updated`);\n\n // Update config — preserve saved tools selection\n const config = generateConfig(scan, templates, commands, guides, {\n ...genOpts,\n agents,\n contexts,\n hooks: existingConfig.hooks !== false,\n hookProfile,\n tools,\n });\n await fs.writeJson(configPath, config, { spaces: 2 });\n logSuccess('ai-kit.config.json updated');\n\n console.log('');\n logInfo('All AI configs refreshed with latest project scan.');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { confirm } from '@inquirer/prompts';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport { logSuccess, logWarning, logInfo, logSection, fileExists } from '../utils.js';\n\nexport async function resetCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Reset');\n logWarning('This will remove all AI Kit generated files:');\n logInfo(` - ${GENERATED_FILES.claudeMd}`);\n logInfo(` - ${GENERATED_FILES.cursorRules}`);\n logInfo(` - ${GENERATED_FILES.cursorMdcDir}/`);\n logInfo(` - ${GENERATED_FILES.claudeCommands}/`);\n logInfo(` - ${GENERATED_FILES.claudeSkills}/`);\n logInfo(` - ${GENERATED_FILES.cursorSkills}/`);\n logInfo(` - ai-kit/ (includes component-registry, patterns, guides)`);\n logInfo(` - ${AI_KIT_CONFIG_FILE}`);\n console.log('');\n\n const proceed = await confirm({\n message: 'Are you sure? This cannot be undone.',\n default: false,\n });\n\n if (!proceed) {\n logInfo('Cancelled.');\n return;\n }\n\n const removed: string[] = [];\n\n // Remove CLAUDE.md\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n if (fileExists(claudeMdPath)) {\n await fs.remove(claudeMdPath);\n removed.push(GENERATED_FILES.claudeMd);\n }\n\n // Remove .cursorrules\n const cursorPath = path.join(projectDir, GENERATED_FILES.cursorRules);\n if (fileExists(cursorPath)) {\n await fs.remove(cursorPath);\n removed.push(GENERATED_FILES.cursorRules);\n }\n\n // Remove .cursor/rules/ (mdc files)\n const cursorMdcDir = path.join(projectDir, GENERATED_FILES.cursorMdcDir);\n if (fileExists(cursorMdcDir)) {\n await fs.remove(cursorMdcDir);\n removed.push(GENERATED_FILES.cursorMdcDir);\n }\n\n // Remove .claude/commands/ (legacy)\n const commandsDir = path.join(projectDir, GENERATED_FILES.claudeCommands);\n if (fileExists(commandsDir)) {\n await fs.remove(commandsDir);\n removed.push(GENERATED_FILES.claudeCommands);\n }\n\n // Remove .claude/skills/\n const claudeSkillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (fileExists(claudeSkillsDir)) {\n await fs.remove(claudeSkillsDir);\n removed.push(GENERATED_FILES.claudeSkills);\n }\n\n // Remove .cursor/skills/\n const cursorSkillsDir = path.join(projectDir, GENERATED_FILES.cursorSkills);\n if (fileExists(cursorSkillsDir)) {\n await fs.remove(cursorSkillsDir);\n removed.push(GENERATED_FILES.cursorSkills);\n }\n\n // Remove ai-kit/ folder\n const aiKitDir = path.join(projectDir, 'ai-kit');\n if (fileExists(aiKitDir)) {\n await fs.remove(aiKitDir);\n removed.push('ai-kit/');\n }\n\n // Remove config\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n if (fileExists(configPath)) {\n await fs.remove(configPath);\n removed.push(AI_KIT_CONFIG_FILE);\n }\n\n logSection('Reset Complete');\n if (removed.length > 0) {\n removed.forEach((f) => logSuccess(`Removed ${f}`));\n } else {\n logInfo('No AI Kit files found to remove.');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport os from 'os';\nimport { logSection, logInfo, logSuccess, logWarning } from '../utils.js';\nimport { PACKAGE_ROOT } from '../constants.js';\n\n// ─── Pricing (per 1M tokens) ──────────────────────────────────────────\nconst PRICING = {\n sonnet: { input: 3, output: 15, cacheRead: 0.3 },\n opus: { input: 15, output: 75, cacheRead: 0.3 },\n} as const;\n\nconst PLAN_BUDGET = 20; // $20 monthly plan\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface TokenUsage {\n inputTokens: number;\n outputTokens: number;\n cacheReadTokens: number;\n cacheCreationTokens: number;\n}\n\ninterface SessionSummary {\n sessionId: string;\n filePath: string;\n date: string; // YYYY-MM-DD\n usage: TokenUsage;\n model: string;\n messageCount: number;\n projectName: string; // extracted from parent directory name\n}\n\ninterface DailySummary {\n date: string;\n sessions: number;\n usage: TokenUsage;\n cost: number;\n}\n\ninterface ExportData {\n generatedAt: string;\n planBudget: number;\n daily: DailySummary[];\n sessions: SessionSummary[];\n totals: {\n thisWeek: { usage: TokenUsage; cost: number; sessions: number };\n thisMonth: { usage: TokenUsage; cost: number; sessions: number };\n today: { usage: TokenUsage; cost: number; sessions: number };\n };\n}\n\n// ─── JSONL Parsing ─────────────────────────────────────────────────────\nfunction findSessionFiles(): string[] {\n const claudeDir = path.join(os.homedir(), '.claude', 'projects');\n if (!fs.existsSync(claudeDir)) return [];\n\n const files: string[] = [];\n\n function walkDir(dir: string): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(full);\n } else if (entry.name.endsWith('.jsonl')) {\n files.push(full);\n }\n }\n } catch {\n // skip unreadable dirs\n }\n }\n\n walkDir(claudeDir);\n return files;\n}\n\nfunction parseSessionFile(filePath: string): SessionSummary | null {\n try {\n const content = fs.readFileSync(filePath, 'utf-8');\n const lines = content.split('\\n').filter((l) => l.trim());\n\n const usage: TokenUsage = {\n inputTokens: 0,\n outputTokens: 0,\n cacheReadTokens: 0,\n cacheCreationTokens: 0,\n };\n\n let model = 'sonnet';\n let messageCount = 0;\n let sessionDate = '';\n\n for (const line of lines) {\n try {\n const obj = JSON.parse(line);\n\n // Extract timestamp for date grouping\n if (obj.timestamp && !sessionDate) {\n sessionDate = new Date(obj.timestamp).toISOString().slice(0, 10);\n }\n\n // Detect model from message content\n if (obj.model) {\n const m = String(obj.model).toLowerCase();\n if (m.includes('opus')) model = 'opus';\n else model = 'sonnet';\n }\n\n // Count assistant messages\n if (obj.type === 'assistant' || obj.role === 'assistant') {\n messageCount++;\n }\n\n // Extract usage data — Claude Code logs usage in various shapes\n const u =\n obj.usage ||\n obj.message?.usage ||\n obj.costInfo ||\n obj.result?.usage ||\n null;\n\n if (u) {\n usage.inputTokens += u.input_tokens || u.inputTokens || 0;\n usage.outputTokens += u.output_tokens || u.outputTokens || 0;\n usage.cacheReadTokens +=\n u.cache_read_input_tokens || u.cacheReadTokens || u.cache_read || 0;\n usage.cacheCreationTokens +=\n u.cache_creation_input_tokens ||\n u.cacheCreationTokens ||\n u.cache_creation ||\n 0;\n }\n } catch {\n // skip malformed lines\n }\n }\n\n // Skip empty sessions\n if (usage.inputTokens === 0 && usage.outputTokens === 0) return null;\n\n // Fallback date from file stat\n if (!sessionDate) {\n const stat = fs.statSync(filePath);\n sessionDate = stat.mtime.toISOString().slice(0, 10);\n }\n\n const sessionId = path.basename(filePath, '.jsonl');\n const projectName = path.basename(path.dirname(filePath));\n\n return {\n sessionId,\n filePath,\n date: sessionDate,\n usage,\n model,\n messageCount,\n projectName,\n };\n } catch {\n return null;\n }\n}\n\nfunction calculateCost(usage: TokenUsage, model: string = 'sonnet'): number {\n const rates = model === 'opus' ? PRICING.opus : PRICING.sonnet;\n const inputCost = (usage.inputTokens / 1_000_000) * rates.input;\n const outputCost = (usage.outputTokens / 1_000_000) * rates.output;\n const cacheCost = (usage.cacheReadTokens / 1_000_000) * rates.cacheRead;\n return inputCost + outputCost + cacheCost;\n}\n\n// ─── Aggregation ───────────────────────────────────────────────────────\nfunction aggregateByDate(sessions: SessionSummary[]): DailySummary[] {\n const map = new Map<string, { sessions: number; usage: TokenUsage; models: string[] }>();\n\n for (const s of sessions) {\n const existing = map.get(s.date) || {\n sessions: 0,\n usage: { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },\n models: [],\n };\n\n existing.sessions++;\n existing.usage.inputTokens += s.usage.inputTokens;\n existing.usage.outputTokens += s.usage.outputTokens;\n existing.usage.cacheReadTokens += s.usage.cacheReadTokens;\n existing.usage.cacheCreationTokens += s.usage.cacheCreationTokens;\n existing.models.push(s.model);\n\n map.set(s.date, existing);\n }\n\n return Array.from(map.entries())\n .map(([date, data]) => ({\n date,\n sessions: data.sessions,\n usage: data.usage,\n cost: calculateCost(data.usage, data.models.includes('opus') ? 'opus' : 'sonnet'),\n }))\n .sort((a, b) => b.date.localeCompare(a.date));\n}\n\nfunction filterDateRange(\n sessions: SessionSummary[],\n startDate: string,\n endDate: string,\n): SessionSummary[] {\n return sessions.filter((s) => s.date >= startDate && s.date <= endDate);\n}\n\nfunction sumUsage(sessions: SessionSummary[]): TokenUsage {\n return sessions.reduce(\n (acc, s) => ({\n inputTokens: acc.inputTokens + s.usage.inputTokens,\n outputTokens: acc.outputTokens + s.usage.outputTokens,\n cacheReadTokens: acc.cacheReadTokens + s.usage.cacheReadTokens,\n cacheCreationTokens: acc.cacheCreationTokens + s.usage.cacheCreationTokens,\n }),\n { inputTokens: 0, outputTokens: 0, cacheReadTokens: 0, cacheCreationTokens: 0 },\n );\n}\n\nfunction sumCost(sessions: SessionSummary[]): number {\n return sessions.reduce((acc, s) => acc + calculateCost(s.usage, s.model), 0);\n}\n\n// ─── Formatting ────────────────────────────────────────────────────────\nfunction fmt(n: number): string {\n return n.toLocaleString('en-US');\n}\n\nfunction fmtCost(n: number): string {\n return `$${n.toFixed(2)}`;\n}\n\nfunction progressBar(percent: number, width: number = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n const bar = chalk.green('\\u2588'.repeat(filled)) + chalk.gray('\\u2591'.repeat(empty));\n return bar;\n}\n\nfunction printPeriodSummary(\n label: string,\n sessions: SessionSummary[],\n): void {\n const usage = sumUsage(sessions);\n const cost = sumCost(sessions);\n\n console.log(`\\n${chalk.bold(label)}`);\n console.log(` Sessions: ${chalk.cyan(String(sessions.length))}`);\n console.log(` Input tokens: ${chalk.white(fmt(usage.inputTokens))}`);\n console.log(` Output tokens: ${chalk.white(fmt(usage.outputTokens))}`);\n console.log(` Cache read: ${chalk.white(fmt(usage.cacheReadTokens))}`);\n console.log(` Estimated cost: ${chalk.yellow('~' + fmtCost(cost))}`);\n}\n\n// ─── Project Breakdown ──────────────────────────────────────────────────\nfunction printProjectBreakdown(sessions: SessionSummary[]): void {\n const projectMap = new Map<string, { sessions: number; cost: number }>();\n\n for (const s of sessions) {\n const existing = projectMap.get(s.projectName) || { sessions: 0, cost: 0 };\n existing.sessions++;\n existing.cost += calculateCost(s.usage, s.model);\n projectMap.set(s.projectName, existing);\n }\n\n const sorted = Array.from(projectMap.entries())\n .sort((a, b) => b[1].cost - a[1].cost);\n\n console.log(`\\n${chalk.bold('Per-Project Breakdown')}`);\n for (const [name, data] of sorted.slice(0, 10)) {\n const bar = progressBar((data.cost / sumCost(sessions)) * 100, 15);\n console.log(` ${bar} ${chalk.yellow(fmtCost(data.cost))} ${chalk.dim(`(${data.sessions} sessions)`)} ${name}`);\n }\n}\n\n// ─── Trend Analysis ─────────────────────────────────────────────────────\nfunction printTrendAnalysis(sessions: SessionSummary[]): void {\n const today = new Date();\n\n // This week\n const thisWeekStart = new Date(today);\n thisWeekStart.setDate(today.getDate() - today.getDay() + (today.getDay() === 0 ? -6 : 1));\n const thisWeekStr = thisWeekStart.toISOString().slice(0, 10);\n\n // Last week\n const lastWeekStart = new Date(thisWeekStart);\n lastWeekStart.setDate(lastWeekStart.getDate() - 7);\n const lastWeekEnd = new Date(thisWeekStart);\n lastWeekEnd.setDate(lastWeekEnd.getDate() - 1);\n const lastWeekStartStr = lastWeekStart.toISOString().slice(0, 10);\n const lastWeekEndStr = lastWeekEnd.toISOString().slice(0, 10);\n\n const todayStr = today.toISOString().slice(0, 10);\n const thisWeekSessions = filterDateRange(sessions, thisWeekStr, todayStr);\n const lastWeekSessions = filterDateRange(sessions, lastWeekStartStr, lastWeekEndStr);\n\n const thisWeekCost = sumCost(thisWeekSessions);\n const lastWeekCost = sumCost(lastWeekSessions);\n\n if (lastWeekCost > 0) {\n const change = ((thisWeekCost - lastWeekCost) / lastWeekCost) * 100;\n const arrow = change > 0 ? chalk.red('\\u2191') : change < 0 ? chalk.green('\\u2193') : chalk.dim('\\u2192');\n const changeStr = change > 0 ? `+${change.toFixed(0)}%` : `${change.toFixed(0)}%`;\n\n console.log(`\\n${chalk.bold('Week-over-Week Trend')}`);\n console.log(` Last week: ${chalk.yellow(fmtCost(lastWeekCost))} (${lastWeekSessions.length} sessions)`);\n console.log(` This week: ${chalk.yellow(fmtCost(thisWeekCost))} (${thisWeekSessions.length} sessions)`);\n console.log(` Change: ${arrow} ${changeStr}`);\n }\n}\n\n// ─── ROI Estimate ───────────────────────────────────────────────────────\nfunction printRoiEstimate(sessions: SessionSummary[], monthCost: number): void {\n // Estimate: each AI session saves ~15 minutes of developer time on average\n const AVG_MINUTES_SAVED_PER_SESSION = 15;\n const DEVELOPER_HOURLY_RATE = 75; // USD estimate\n\n const totalSessions = sessions.length;\n const minutesSaved = totalSessions * AVG_MINUTES_SAVED_PER_SESSION;\n const hoursSaved = minutesSaved / 60;\n const valueSaved = hoursSaved * DEVELOPER_HOURLY_RATE;\n const roi = monthCost > 0 ? ((valueSaved - monthCost) / monthCost) * 100 : 0;\n\n console.log(`\\n${chalk.bold('ROI Estimate')} ${chalk.dim('(based on ~15 min saved per session)')}`);\n console.log(` Sessions this month: ${chalk.cyan(String(totalSessions))}`);\n console.log(` Estimated time saved: ${chalk.cyan(`${hoursSaved.toFixed(1)} hours`)} (${minutesSaved} min)`);\n console.log(` Estimated value saved: ${chalk.green(fmtCost(valueSaved))} (at $${DEVELOPER_HOURLY_RATE}/hr)`);\n console.log(` AI cost: ${chalk.yellow(fmtCost(monthCost))}`);\n if (roi > 0) {\n console.log(` ROI: ${chalk.green(`${roi.toFixed(0)}%`)}`);\n }\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function tokensCommand(options: { export?: boolean; csv?: boolean; budget?: number } = {}): Promise<void> {\n logSection('AI Kit \\u2014 Token Usage');\n\n const budget = options.budget || PLAN_BUDGET;\n\n const spinner = ora('Scanning Claude Code session logs...').start();\n\n const sessionFiles = findSessionFiles();\n if (sessionFiles.length === 0) {\n spinner.fail('No Claude Code session logs found');\n logInfo('Session logs are stored in ~/.claude/projects/');\n logInfo('Use Claude Code to generate some activity first.');\n return;\n }\n\n const sessions: SessionSummary[] = [];\n for (const file of sessionFiles) {\n const s = parseSessionFile(file);\n if (s) sessions.push(s);\n }\n\n spinner.succeed(`Parsed ${sessions.length} sessions from ${sessionFiles.length} log files`);\n\n if (sessions.length === 0) {\n logWarning('No token usage data found in session logs.');\n return;\n }\n\n // Date ranges\n const today = new Date().toISOString().slice(0, 10);\n\n const dayOfWeek = new Date().getDay();\n const mondayOffset = dayOfWeek === 0 ? 6 : dayOfWeek - 1;\n const weekStart = new Date();\n weekStart.setDate(weekStart.getDate() - mondayOffset);\n const weekStartStr = weekStart.toISOString().slice(0, 10);\n\n const monthStart = today.slice(0, 7) + '-01';\n\n const todaySessions = filterDateRange(sessions, today, today);\n const weekSessions = filterDateRange(sessions, weekStartStr, today);\n const monthSessions = filterDateRange(sessions, monthStart, today);\n\n // Print summaries\n printPeriodSummary(`Today (${today})`, todaySessions);\n printPeriodSummary('This Week', weekSessions);\n printPeriodSummary('This Month', monthSessions);\n\n // Budget progress\n const monthCost = sumCost(monthSessions);\n const budgetPercent = Math.min((monthCost / budget) * 100, 100);\n const daysInMonth = new Date(\n new Date().getFullYear(),\n new Date().getMonth() + 1,\n 0,\n ).getDate();\n const dayOfMonth = new Date().getDate();\n const daysRemaining = daysInMonth - dayOfMonth;\n const dailyAvg = dayOfMonth > 0 ? monthCost / dayOfMonth : 0;\n const estimatedDaysLeft =\n dailyAvg > 0 ? Math.floor((budget - monthCost) / dailyAvg) : daysRemaining;\n\n console.log(`\\n${chalk.bold(`$${budget} Plan Budget`)}`);\n console.log(\n ` ${progressBar(budgetPercent)} ${Math.round(budgetPercent)}% used (~${fmtCost(monthCost)} of ${fmtCost(budget)})`,\n );\n console.log(\n ` Estimated days remaining at this rate: ${chalk.cyan(String(Math.max(estimatedDaysLeft, 0)))} days`,\n );\n console.log(` Daily average: ${chalk.yellow(fmtCost(dailyAvg))}`);\n\n // Budget alerts\n if (budgetPercent >= 90) {\n console.log(chalk.red.bold('\\n \\u26a0 ALERT: Over 90% of monthly budget used!'));\n } else if (budgetPercent >= 75) {\n console.log(chalk.yellow('\\n \\u26a0 Warning: Over 75% of monthly budget used.'));\n } else if (budgetPercent >= 50) {\n console.log(chalk.blue('\\n \\u2139 Note: Over 50% of monthly budget used.'));\n }\n\n // Model recommendations\n const opusSessions = monthSessions.filter(s => s.model === 'opus');\n const sonnetSessions = monthSessions.filter(s => s.model === 'sonnet');\n const opusCost = sumCost(opusSessions);\n const sonnetCost = sumCost(sonnetSessions);\n\n if (opusCost > sonnetCost * 2 && opusSessions.length > 5) {\n console.log(`\\n${chalk.bold('Model Recommendation')}`);\n console.log(` Opus usage: ${chalk.yellow(fmtCost(opusCost))} (${opusSessions.length} sessions)`);\n console.log(` Sonnet usage: ${chalk.yellow(fmtCost(sonnetCost))} (${sonnetSessions.length} sessions)`);\n console.log(chalk.dim(' Tip: Use Sonnet for routine tasks (reviews, tests, docs) and Opus for complex tasks (architecture, debugging).'));\n }\n\n // Per-project breakdown\n printProjectBreakdown(monthSessions);\n\n // Trend analysis\n printTrendAnalysis(sessions);\n\n // ROI estimate\n printRoiEstimate(monthSessions, monthCost);\n\n // Tip\n console.log(\n `\\n${chalk.dim('Tip: Use /understand before modifying unfamiliar code \\u2014')}`,\n );\n console.log(\n chalk.dim(\" it's cheaper than a failed implementation attempt.\"),\n );\n console.log('');\n\n // CSV export\n if (options.csv) {\n const csvPath = path.join(process.cwd(), 'token-usage.csv');\n const csvHeader = 'Date,Sessions,Input Tokens,Output Tokens,Cache Tokens,Cost\\n';\n const daily = aggregateByDate(sessions);\n const csvRows = daily.map(d =>\n `${d.date},${d.sessions},${d.usage.inputTokens},${d.usage.outputTokens},${d.usage.cacheReadTokens},${d.cost.toFixed(2)}`\n ).join('\\n');\n await fs.writeFile(csvPath, csvHeader + csvRows, 'utf-8');\n logSuccess(`CSV exported to ${csvPath}`);\n }\n\n // Export mode\n if (options.export) {\n await exportDashboard(sessions, todaySessions, weekSessions, monthSessions);\n }\n}\n\n// ─── Export ────────────────────────────────────────────────────────────\nasync function exportDashboard(\n allSessions: SessionSummary[],\n todaySessions: SessionSummary[],\n weekSessions: SessionSummary[],\n monthSessions: SessionSummary[],\n): Promise<void> {\n const spinner = ora('Generating dashboard...').start();\n\n const exportData: ExportData = {\n generatedAt: new Date().toISOString(),\n planBudget: PLAN_BUDGET,\n daily: aggregateByDate(allSessions),\n sessions: allSessions\n .sort((a, b) => b.date.localeCompare(a.date))\n .slice(0, 50)\n .map((s) => ({\n ...s,\n filePath: s.filePath, // keep for reference\n })),\n totals: {\n today: {\n usage: sumUsage(todaySessions),\n cost: sumCost(todaySessions),\n sessions: todaySessions.length,\n },\n thisWeek: {\n usage: sumUsage(weekSessions),\n cost: sumCost(weekSessions),\n sessions: weekSessions.length,\n },\n thisMonth: {\n usage: sumUsage(monthSessions),\n cost: sumCost(monthSessions),\n sessions: monthSessions.length,\n },\n },\n };\n\n const outputDir = process.cwd();\n const dataPath = path.join(outputDir, 'token-data.json');\n const dashboardSrc = path.join(PACKAGE_ROOT, 'templates', 'token-dashboard.html');\n const dashboardDest = path.join(outputDir, 'token-dashboard.html');\n\n await fs.writeJson(dataPath, exportData, { spaces: 2 });\n logInfo(`Token data written to ${dataPath}`);\n\n if (await fs.pathExists(dashboardSrc)) {\n await fs.copy(dashboardSrc, dashboardDest, { overwrite: true });\n logInfo(`Dashboard copied to ${dashboardDest}`);\n } else {\n logWarning('Dashboard template not found. Skipping HTML export.');\n }\n\n spinner.succeed('Dashboard exported');\n\n // Try to open in browser\n try {\n const { exec } = await import('child_process');\n const openCmd =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open';\n exec(`${openCmd} \"${dashboardDest}\"`);\n logInfo('Opening dashboard in browser...');\n } catch {\n logInfo(`Open ${dashboardDest} in your browser to view the dashboard.`);\n }\n}\n","import path from 'path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n dirExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\nexport async function doctorCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n let passed = 0;\n let warnings = 0;\n let issues = 0;\n\n logSection('AI Kit — Doctor');\n console.log('');\n\n // 1. Check ai-kit.config.json exists\n if (!fileExists(configPath)) {\n logError('ai-kit.config.json not found. Run `ai-kit init` first.');\n issues++;\n showSummary(passed, warnings, issues);\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logError('ai-kit.config.json is corrupted or unreadable. Run `ai-kit init` to re-initialize.');\n issues++;\n showSummary(passed, warnings, issues);\n return;\n }\n\n logSuccess(`ai-kit.config.json found (v${config.version})`);\n passed++;\n\n // 2. Version check\n if (config.version !== VERSION) {\n logWarning(\n `Config version mismatch — config is v${config.version}, CLI is v${VERSION}. Run \\`ai-kit update\\` to sync.`,\n );\n warnings++;\n } else {\n logSuccess(`Version matches CLI (v${VERSION})`);\n passed++;\n }\n\n // 3. File integrity — check templates exist\n for (const template of config.templates) {\n const templateFile =\n template === 'CLAUDE.md'\n ? GENERATED_FILES.claudeMd\n : template === '.cursorrules'\n ? GENERATED_FILES.cursorRules\n : template;\n const templatePath = path.join(projectDir, templateFile);\n\n if (fileExists(templatePath)) {\n logSuccess(`${template} exists and in sync`);\n passed++;\n } else {\n logError(`${template} is listed in config but missing from disk`);\n issues++;\n }\n }\n\n // 4. Skills check — verify all skills from config.commands exist\n const missingSkills: string[] = [];\n for (const skill of config.commands) {\n const claudeSkillPath = path.join(projectDir, GENERATED_FILES.claudeSkills, skill);\n const cursorSkillPath = path.join(projectDir, GENERATED_FILES.cursorSkills, skill);\n\n if (!fileExists(claudeSkillPath) && !fileExists(cursorSkillPath)) {\n missingSkills.push(skill);\n }\n }\n\n if (missingSkills.length === 0) {\n logSuccess(`${config.commands.length}/${config.commands.length} skills present`);\n passed++;\n } else {\n logError(\n `${config.commands.length - missingSkills.length}/${config.commands.length} skills present — missing: ${missingSkills.join(', ')}`,\n );\n issues++;\n }\n\n // 5. Guides check — verify all guides from config.guides exist\n const guidesDir = path.join(projectDir, 'ai-kit', 'guides');\n const missingGuides: string[] = [];\n for (const guide of config.guides) {\n const guidePath = path.join(guidesDir, guide);\n if (!fileExists(guidePath)) {\n missingGuides.push(guide);\n }\n }\n\n if (missingGuides.length === 0) {\n logSuccess(`${config.guides.length}/${config.guides.length} guides present`);\n passed++;\n } else {\n logError(\n `${config.guides.length - missingGuides.length}/${config.guides.length} guides present — missing: ${missingGuides.join(', ')}`,\n );\n issues++;\n }\n\n // 6. Staleness check — compare config.scanResult with fresh scan\n const spinner = ora('Running fresh project scan...').start();\n let freshScan: ProjectScan;\n try {\n freshScan = await scanProject(projectDir);\n spinner.succeed('Project re-scanned');\n } catch (err) {\n spinner.fail('Failed to scan project');\n logWarning(`Could not run staleness check: ${String(err)}`);\n warnings++;\n freshScan = config.scanResult;\n }\n\n const stalenessWarnings = compareScanResults(config.scanResult, freshScan);\n if (stalenessWarnings.length === 0) {\n logSuccess('Config is up to date with project state');\n passed++;\n } else {\n for (const warning of stalenessWarnings) {\n logWarning(warning);\n warnings++;\n }\n }\n\n // 7. MCP server health\n const mcpChecks: { name: string; key: keyof typeof freshScan.mcpServers }[] = [\n { name: 'Playwright MCP', key: 'playwright' },\n { name: 'Context7 MCP', key: 'context7' },\n { name: 'GitHub MCP', key: 'github' },\n { name: 'Perplexity MCP', key: 'perplexity' },\n { name: 'Figma MCP', key: 'figma' },\n ];\n\n for (const mcp of mcpChecks) {\n if (freshScan.mcpServers[mcp.key]) {\n logSuccess(`${mcp.name} configured`);\n passed++;\n } else {\n logWarning(`${mcp.name} not configured`);\n warnings++;\n }\n }\n\n // 8. Missing recommended tools\n const toolChecks: { name: string; key: keyof typeof freshScan.tools; hint: string }[] = [\n { name: 'Playwright', key: 'playwright', hint: 'npm install -D @playwright/test' },\n { name: 'ESLint', key: 'eslint', hint: 'npm install -D eslint' },\n { name: 'Prettier', key: 'prettier', hint: 'npm install -D prettier' },\n { name: 'axe-core', key: 'axeCore', hint: 'npm install -D @axe-core/playwright' },\n { name: 'Knip', key: 'knip', hint: 'npm install -D knip' },\n { name: 'Bundle Analyzer', key: 'bundleAnalyzer', hint: 'npm install -D @next/bundle-analyzer' },\n ];\n\n for (const tool of toolChecks) {\n if (freshScan.tools[tool.key]) {\n logSuccess(`${tool.name} detected`);\n passed++;\n } else {\n logError(`${tool.name} not found — recommend installing: ${tool.hint}`);\n issues++;\n }\n }\n\n // 9. Summary\n console.log('');\n showSummary(passed, warnings, issues);\n}\n\nfunction showSummary(passed: number, warnings: number, issues: number): void {\n const parts: string[] = [];\n parts.push(chalk.green(`${passed} passed`));\n if (warnings > 0) parts.push(chalk.yellow(`${warnings} warnings`));\n if (issues > 0) parts.push(chalk.red(`${issues} issues`));\n\n console.log(chalk.bold(`Summary: ${parts.join(', ')}`));\n}\n\nfunction compareScanResults(\n previous: ProjectScan,\n current: ProjectScan,\n): string[] {\n const warnings: string[] = [];\n\n // Framework change\n if (previous.framework !== current.framework) {\n warnings.push(\n `Stack may have changed — framework was ${previous.framework}, now ${current.framework}`,\n );\n }\n\n // Next.js version change\n if (previous.nextjsVersion && current.nextjsVersion && previous.nextjsVersion !== current.nextjsVersion) {\n warnings.push(\n `Next.js version changed: ${previous.nextjsVersion} → ${current.nextjsVersion}`,\n );\n }\n\n // Router type change\n if (previous.routerType && current.routerType && previous.routerType !== current.routerType) {\n warnings.push(\n `Router type changed: ${previous.routerType} → ${current.routerType}`,\n );\n }\n\n // Styling changes\n const prevStyles = new Set(previous.styling);\n const currStyles = new Set(current.styling);\n for (const style of currStyles) {\n if (!prevStyles.has(style)) {\n warnings.push(`Stack may have changed — detected new styling: ${style}`);\n }\n }\n for (const style of prevStyles) {\n if (!currStyles.has(style)) {\n warnings.push(`Stack may have changed — styling removed: ${style}`);\n }\n }\n\n // TypeScript change\n if (previous.typescript !== current.typescript) {\n warnings.push(\n `TypeScript ${current.typescript ? 'detected (was not before)' : 'no longer detected'}`,\n );\n }\n\n // Monorepo change\n if (previous.monorepo !== current.monorepo) {\n warnings.push(\n `Monorepo ${current.monorepo ? 'detected (was not before)' : 'no longer detected'}`,\n );\n }\n\n // Package manager change\n if (previous.packageManager !== current.packageManager) {\n warnings.push(\n `Package manager changed: ${previous.packageManager} → ${current.packageManager}`,\n );\n }\n\n // Tool changes — check for newly detected tools\n const toolKeys = Object.keys(current.tools) as (keyof typeof current.tools)[];\n for (const key of toolKeys) {\n if (current.tools[key] && !previous.tools[key]) {\n warnings.push(`Stack may have changed — detected new tool: ${key}`);\n }\n if (!current.tools[key] && previous.tools[key]) {\n warnings.push(`Stack may have changed — tool removed: ${key}`);\n }\n }\n\n // CMS change\n if (previous.cms !== current.cms) {\n warnings.push(`CMS changed: ${previous.cms} → ${current.cms}`);\n }\n\n return warnings;\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { generateClaudeMd, selectFragments } from '../generator/claude-md.js';\nimport { generateCursorRules } from '../generator/cursorrules.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logWarning,\n logError,\n fileExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\nexport async function diffCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log(chalk.bold('AI Kit — Diff (dry run)\\n'));\n\n // 1. Read existing config\n if (!fileExists(configPath)) {\n logError('No ai-kit.config.json found. Run `ai-kit init` first.');\n return;\n }\n\n const existingConfig = readJsonSafe<AiKitConfig>(configPath);\n if (!existingConfig) {\n logError('Could not read ai-kit.config.json. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Warn if major version mismatch\n const existingMajor = parseInt(existingConfig.version.split('.')[0], 10);\n const currentMajor = parseInt(VERSION.split('.')[0], 10);\n if (existingMajor !== currentMajor) {\n logWarning(\n `Config was generated with ai-kit v${existingConfig.version}, but you're running v${VERSION}. Consider running \\`ai-kit init\\` to re-initialize.`,\n );\n }\n\n // 2. Re-scan the project\n const spinner = ora('Scanning project...').start();\n const newScan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n\n const oldScan = existingConfig.scanResult;\n\n // 3. Show stack changes\n logSection('Stack Changes');\n const stackChanges = diffStack(oldScan, newScan);\n if (stackChanges.length === 0) {\n console.log(chalk.dim(' No stack changes detected'));\n } else {\n for (const change of stackChanges) {\n if (change.type === 'added') {\n console.log(chalk.green(` + ${change.label}`));\n } else if (change.type === 'modified') {\n console.log(chalk.yellow(` ~ ${change.label}`));\n } else {\n console.log(chalk.red(` - ${change.label}`));\n }\n }\n }\n\n // 4. Compare generated file contents\n logSection('File Changes');\n\n const oldFragments = selectFragments(oldScan);\n const newFragments = selectFragments(newScan);\n\n let modified = 0;\n let added = 0;\n let unchanged = 0;\n\n // CLAUDE.md\n const claudeMdStatus = diffGeneratedFile(\n projectDir,\n GENERATED_FILES.claudeMd,\n existingConfig,\n () => generateClaudeMd(newScan),\n oldFragments,\n newFragments,\n );\n logFileChange(claudeMdStatus);\n if (claudeMdStatus.status === 'modified') modified++;\n else if (claudeMdStatus.status === 'added') added++;\n else unchanged++;\n\n // .cursorrules\n const cursorRulesStatus = diffGeneratedFile(\n projectDir,\n GENERATED_FILES.cursorRules,\n existingConfig,\n () => generateCursorRules(newScan),\n oldFragments,\n newFragments,\n );\n logFileChange(cursorRulesStatus);\n if (cursorRulesStatus.status === 'modified') modified++;\n else if (cursorRulesStatus.status === 'added') added++;\n else unchanged++;\n\n // Skills\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n const skillCount = countFilesInDir(skillsDir);\n console.log(chalk.dim(` unchanged ${GENERATED_FILES.claudeSkills}/ (${skillCount} skills)`));\n unchanged++;\n\n // Guides\n const guidesDir = path.join(projectDir, AI_KIT_FOLDER_NAME, 'guides');\n const guideCount = existingConfig.guides?.length || 0;\n console.log(chalk.dim(` unchanged ai-kit/guides/ (${guideCount} guides)`));\n unchanged++;\n\n // 5. Summary\n console.log('');\n const parts: string[] = [];\n if (modified > 0) parts.push(`${modified} files would be modified`);\n if (added > 0) parts.push(`${added} added`);\n const removed = 0;\n parts.push(`${removed} removed`);\n\n logInfo(`Summary: ${parts.join(', ')}`);\n logInfo('Run `ai-kit update` to apply these changes.');\n}\n\nconst AI_KIT_FOLDER_NAME = 'ai-kit';\n\ninterface StackChange {\n type: 'added' | 'removed' | 'modified';\n label: string;\n}\n\nfunction diffStack(oldScan: ProjectScan, newScan: ProjectScan): StackChange[] {\n const changes: StackChange[] = [];\n\n // Framework version\n if (oldScan.framework === newScan.framework && newScan.framework === 'nextjs') {\n if (oldScan.nextjsVersion !== newScan.nextjsVersion) {\n changes.push({\n type: 'modified',\n label: `Next.js version: ${oldScan.nextjsVersion || 'unknown'} → ${newScan.nextjsVersion || 'unknown'}`,\n });\n }\n } else if (oldScan.framework !== newScan.framework) {\n if (oldScan.framework !== 'unknown') {\n changes.push({ type: 'removed', label: `${oldScan.framework} no longer detected` });\n }\n if (newScan.framework !== 'unknown') {\n changes.push({ type: 'added', label: `${newScan.framework} detected` });\n }\n }\n\n // Router type\n if (oldScan.routerType !== newScan.routerType && newScan.framework === 'nextjs') {\n changes.push({\n type: 'modified',\n label: `Router type: ${oldScan.routerType || 'unknown'} → ${newScan.routerType || 'unknown'}`,\n });\n }\n\n // TypeScript\n if (!oldScan.typescript && newScan.typescript) {\n changes.push({ type: 'added', label: 'TypeScript detected' });\n } else if (oldScan.typescript && !newScan.typescript) {\n changes.push({ type: 'removed', label: 'TypeScript no longer detected' });\n }\n\n // Styling changes\n const oldStyles = new Set(oldScan.styling);\n const newStyles = new Set(newScan.styling);\n for (const style of newStyles) {\n if (!oldStyles.has(style)) {\n changes.push({ type: 'added', label: `${style} detected (styling)` });\n }\n }\n for (const style of oldStyles) {\n if (!newStyles.has(style)) {\n changes.push({ type: 'removed', label: `${style} no longer detected` });\n }\n }\n\n // Tailwind version\n if (\n oldScan.styling.includes('tailwind') &&\n newScan.styling.includes('tailwind') &&\n oldScan.tailwindVersion !== newScan.tailwindVersion\n ) {\n changes.push({\n type: 'modified',\n label: `Tailwind version: ${oldScan.tailwindVersion || 'unknown'} → ${newScan.tailwindVersion || 'unknown'}`,\n });\n }\n\n // Monorepo\n if (!oldScan.monorepo && newScan.monorepo) {\n changes.push({\n type: 'added',\n label: `monorepo detected${newScan.monorepoTool ? ` (${newScan.monorepoTool})` : ''}`,\n });\n } else if (oldScan.monorepo && !newScan.monorepo) {\n changes.push({ type: 'removed', label: 'monorepo no longer detected' });\n } else if (oldScan.monorepoTool !== newScan.monorepoTool && newScan.monorepo) {\n changes.push({\n type: 'modified',\n label: `monorepo tool: ${oldScan.monorepoTool || 'unknown'} → ${newScan.monorepoTool || 'unknown'}`,\n });\n }\n\n // CMS\n if (oldScan.cms !== newScan.cms) {\n if (oldScan.cms !== 'none') {\n changes.push({ type: 'removed', label: `${oldScan.cms} no longer detected` });\n }\n if (newScan.cms !== 'none') {\n changes.push({ type: 'added', label: `${newScan.cms} detected (CMS)` });\n }\n }\n\n // Package manager\n if (oldScan.packageManager !== newScan.packageManager) {\n changes.push({\n type: 'modified',\n label: `Package manager: ${oldScan.packageManager} → ${newScan.packageManager}`,\n });\n }\n\n // Figma\n if (!oldScan.figma?.detected && newScan.figma?.detected) {\n changes.push({ type: 'added', label: 'Figma integration detected' });\n } else if (oldScan.figma?.detected && !newScan.figma?.detected) {\n changes.push({ type: 'removed', label: 'Figma integration no longer detected' });\n }\n\n // Tools changes\n if (oldScan.tools && newScan.tools) {\n const toolNames = Object.keys(newScan.tools) as (keyof typeof newScan.tools)[];\n for (const tool of toolNames) {\n if (!oldScan.tools[tool] && newScan.tools[tool]) {\n changes.push({ type: 'added', label: `${tool} detected (tooling)` });\n }\n }\n const oldToolNames = Object.keys(oldScan.tools) as (keyof typeof oldScan.tools)[];\n for (const tool of oldToolNames) {\n if (oldScan.tools[tool] && !newScan.tools[tool]) {\n changes.push({ type: 'removed', label: `${tool} no longer detected` });\n }\n }\n }\n\n return changes;\n}\n\ninterface FileChangeResult {\n filename: string;\n status: 'added' | 'modified' | 'unchanged';\n detail?: string;\n}\n\nfunction diffGeneratedFile(\n projectDir: string,\n filename: string,\n config: AiKitConfig,\n generate: () => string,\n oldFragments: string[],\n newFragments: string[],\n): FileChangeResult {\n const filePath = path.join(projectDir, filename);\n const currentContent = readFileSafe(filePath);\n const newContent = generate();\n\n // File does not exist yet but would be generated\n if (!currentContent) {\n if (config.templates.includes(filename)) {\n return { filename, status: 'added', detail: 'file missing, would be created' };\n }\n return { filename, status: 'unchanged', detail: 'not configured' };\n }\n\n // Compare contents\n if (currentContent.trim() === newContent.trim()) {\n return { filename, status: 'unchanged' };\n }\n\n // Determine which fragments changed\n const addedFragments = newFragments.filter((f) => !oldFragments.includes(f));\n const removedFragments = oldFragments.filter((f) => !newFragments.includes(f));\n\n const fragmentDetails: string[] = [];\n if (addedFragments.length > 0) {\n fragmentDetails.push(`+${addedFragments.join(', +')}`);\n }\n if (removedFragments.length > 0) {\n fragmentDetails.push(`-${removedFragments.join(', -')}`);\n }\n\n const detail =\n fragmentDetails.length > 0\n ? `template fragments changed: ${fragmentDetails.join(', ')}`\n : 'content changed';\n\n return { filename, status: 'modified', detail };\n}\n\nfunction logFileChange(result: FileChangeResult): void {\n if (result.status === 'added') {\n console.log(chalk.green(` added ${result.filename}`) + (result.detail ? chalk.dim(` (${result.detail})`) : ''));\n } else if (result.status === 'modified') {\n console.log(\n chalk.yellow(` modified ${result.filename}`) + (result.detail ? chalk.dim(` (${result.detail})`) : ''),\n );\n } else {\n console.log(chalk.dim(` unchanged ${result.filename}`));\n }\n}\n\nfunction countFilesInDir(dirPath: string): number {\n try {\n if (!fs.existsSync(dirPath)) return 0;\n const entries = fs.readdirSync(dirPath) as string[];\n return entries.filter((e: string) => !e.startsWith('.')).length;\n } catch {\n return 0;\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { select } from '@inquirer/prompts';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logSuccess,\n logWarning,\n logError,\n fileExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\ntype ExportFormat = 'windsurf' | 'aider' | 'cline' | 'all';\n\nconst EXPORT_TARGETS = {\n windsurf: { file: '.windsurfrules', label: 'Windsurf' },\n aider: { file: '.aider.conf.yml', label: 'Aider' },\n cline: { file: '.clinerules', label: 'Cline' },\n} as const;\n\nfunction stripMarkers(content: string): string {\n return content\n .replace('<!-- AI-KIT:START -->\\n', '')\n .replace('\\n<!-- AI-KIT:END -->', '')\n .replace(/<!-- Generated by ai-kit v[\\d.]+ -->\\n?/, '');\n}\n\nfunction toWindsurf(content: string): string {\n const stripped = stripMarkers(content);\n return `# Windsurf Rules\\n# Exported from ai-kit CLAUDE.md\\n\\n${stripped}`;\n}\n\nfunction toAider(content: string): string {\n const stripped = stripMarkers(content);\n // Indent each line for YAML multiline block scalar\n const indented = stripped\n .split('\\n')\n .map((line) => (line.length > 0 ? ` ${line}` : ''))\n .join('\\n');\n return `# Aider configuration\\n# Exported from ai-kit CLAUDE.md\\n\\nconventions: |\\n${indented}\\n`;\n}\n\nfunction toCline(content: string): string {\n const stripped = stripMarkers(content);\n return `# Cline Rules\\n# Exported from ai-kit CLAUDE.md\\n\\n${stripped}`;\n}\n\nexport async function exportCommand(\n targetPath?: string,\n options?: { format?: string },\n): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n\n logSection('AI Kit — Export');\n\n // Check that ai-kit has been initialized\n if (!fileExists(configPath) && !fileExists(claudeMdPath)) {\n logError('No ai-kit.config.json or CLAUDE.md found. Run `ai-kit init` first.');\n return;\n }\n\n // Read CLAUDE.md content\n const claudeContent = readFileSafe(claudeMdPath);\n if (!claudeContent) {\n logError('Could not read CLAUDE.md. Run `ai-kit init` or `ai-kit update` first.');\n return;\n }\n\n // Determine format\n let format: ExportFormat;\n\n if (options?.format) {\n const f = options.format.toLowerCase();\n if (f === 'windsurf' || f === 'aider' || f === 'cline' || f === 'all') {\n format = f;\n } else {\n logError(`Unknown format \"${options.format}\". Use: windsurf, aider, cline, or all.`);\n return;\n }\n } else {\n format = await select<ExportFormat>({\n message: 'Which format do you want to export to?',\n choices: [\n { name: 'Windsurf (.windsurfrules)', value: 'windsurf' },\n { name: 'Aider (.aider.conf.yml)', value: 'aider' },\n { name: 'Cline (.clinerules)', value: 'cline' },\n { name: 'All of the above', value: 'all' },\n ],\n });\n }\n\n const formats: (keyof typeof EXPORT_TARGETS)[] =\n format === 'all' ? ['windsurf', 'aider', 'cline'] : [format];\n\n const spinner = ora('Exporting rules to other AI tools...').start();\n\n const transformers: Record<keyof typeof EXPORT_TARGETS, (content: string) => string> = {\n windsurf: toWindsurf,\n aider: toAider,\n cline: toCline,\n };\n\n let exported = 0;\n\n for (const fmt of formats) {\n const target = EXPORT_TARGETS[fmt];\n const transformer = transformers[fmt];\n const outputPath = path.join(projectDir, target.file);\n const transformed = transformer(claudeContent);\n\n await fs.writeFile(outputPath, transformed, 'utf-8');\n exported++;\n }\n\n spinner.succeed('Export complete');\n console.log('');\n\n for (const fmt of formats) {\n const target = EXPORT_TARGETS[fmt];\n logSuccess(`${target.file} generated (${target.label})`);\n }\n\n console.log('');\n logInfo(\n `${exported} file${exported !== 1 ? 's' : ''} exported. These contain the same rules as your CLAUDE.md.`,\n );\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport { AI_KIT_CONFIG_FILE, VERSION, TEMPLATE_FRAGMENTS } from '../constants.js';\nimport {\n logSection,\n logInfo,\n logSuccess,\n logWarning,\n fileExists,\n dirExists,\n readJsonSafe,\n} from '../utils.js';\nimport type { AiKitConfig } from '../types.js';\n\n// ─── Skill Categories ───────────────────────────────────────────────────\nconst SKILL_CATEGORIES: Record<string, string[]> = {\n 'Getting Started': ['prompt-help', 'understand'],\n 'Building': [\n 'new-component',\n 'new-page',\n 'api-route',\n 'error-boundary',\n 'extract-hook',\n 'figma-to-code',\n 'design-tokens',\n ],\n 'Quality & Review': [\n 'review',\n 'test',\n 'accessibility-audit',\n 'security-check',\n 'responsive-check',\n 'type-fix',\n 'pre-pr',\n ],\n 'Maintenance': [\n 'optimize',\n 'refactor',\n 'dep-check',\n 'bundle-check',\n 'migrate',\n 'env-setup',\n ],\n 'Workflow': ['fix-bug', 'commit-msg', 'document', 'token-tips'],\n};\n\n// ─── Helpers ────────────────────────────────────────────────────────────\nfunction getComplexityLabel(score: number): string {\n if (score >= 10) return 'Enterprise';\n if (score >= 7) return 'Complex';\n if (score >= 4) return 'Moderate';\n return 'Simple';\n}\n\nfunction calculateComplexity(config: AiKitConfig): {\n score: number;\n items: { label: string; active: boolean }[];\n} {\n const scan = config.scanResult;\n let score = 0;\n const items: { label: string; active: boolean }[] = [];\n\n // Framework: +1\n const hasFramework = scan.framework !== 'unknown';\n if (hasFramework) score += 1;\n const frameworkLabel =\n scan.framework === 'nextjs'\n ? `Next.js ${scan.nextjsVersion || ''} (${scan.routerType === 'app' ? 'App Router' : scan.routerType === 'pages' ? 'Pages Router' : 'Hybrid'})`\n : scan.framework === 'react'\n ? 'React'\n : 'Unknown';\n items.push({ label: frameworkLabel.trim(), active: hasFramework });\n\n // CMS: +2\n const hasCms = scan.cms !== 'none';\n if (hasCms) score += 2;\n const cmsLabel =\n scan.cms === 'sitecore-xmc-v2'\n ? 'Sitecore XM Cloud (Content SDK v2)'\n : scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : scan.cms === 'sitecore-jss'\n ? 'Sitecore JSS'\n : 'CMS';\n items.push({ label: cmsLabel, active: hasCms });\n\n // TypeScript: +1\n if (scan.typescript) score += 1;\n items.push({\n label: `TypeScript${scan.typescriptStrict ? ' (strict)' : ''}`,\n active: scan.typescript,\n });\n\n // Each styling solution: +1\n for (const style of scan.styling) {\n score += 1;\n const styleLabel =\n style === 'tailwind'\n ? `Tailwind CSS${scan.tailwindVersion ? ` v${scan.tailwindVersion}` : ''}`\n : style === 'css-modules'\n ? 'CSS Modules'\n : style === 'styled-components'\n ? 'Styled Components'\n : style === 'scss'\n ? 'SCSS'\n : style;\n items.push({ label: styleLabel, active: true });\n }\n\n // Monorepo: +2\n items.push({\n label: scan.monorepo\n ? `Monorepo (${scan.monorepoTool || 'detected'})`\n : 'Monorepo',\n active: scan.monorepo,\n });\n if (scan.monorepo) score += 2;\n\n // Figma: +1\n items.push({ label: 'Figma', active: scan.figma.detected });\n if (scan.figma.detected) score += 1;\n\n return { score, items };\n}\n\nfunction categorizeSkills(skills: string[]): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n const categorized = new Set<string>();\n\n for (const [category, categorySkills] of Object.entries(SKILL_CATEGORIES)) {\n const matched = skills.filter((s) => categorySkills.includes(s));\n if (matched.length > 0) {\n result[category] = matched;\n matched.forEach((s) => categorized.add(s));\n }\n }\n\n // Any skills not in a known category\n const uncategorized = skills.filter((s) => !categorized.has(s));\n if (uncategorized.length > 0) {\n result['Other'] = uncategorized;\n }\n\n return result;\n}\n\n// ─── Tool & MCP Display Names ───────────────────────────────────────────\nconst TOOL_DISPLAY_NAMES: Record<string, string> = {\n playwright: 'Playwright',\n storybook: 'Storybook',\n eslint: 'ESLint',\n prettier: 'Prettier',\n axeCore: 'axe-core',\n snyk: 'Snyk',\n knip: 'Knip',\n bundleAnalyzer: 'Bundle Analyzer',\n};\n\nconst MCP_DISPLAY_NAMES: Record<string, string> = {\n playwright: 'Playwright',\n figma: 'Figma',\n github: 'GitHub',\n context7: 'Context7',\n perplexity: 'Perplexity',\n};\n\n// ─── Main Command ───────────────────────────────────────────────────────\nexport async function statsCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n logSection('AI Kit \\u2014 Project Stats');\n console.log('');\n\n // 1. Read config\n if (!fileExists(configPath)) {\n logWarning(\n 'ai-kit.config.json not found. Run `ai-kit init` first.',\n );\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logWarning(\n 'ai-kit.config.json is corrupted or unreadable. Run `ai-kit init` to re-initialize.',\n );\n return;\n }\n\n const scan = config.scanResult;\n\n // 2. Project Overview\n console.log(` Project: ${chalk.bold(scan.projectName)}`);\n console.log(` Version: ai-kit v${config.version}`);\n console.log(` Generated: ${config.generatedAt}`);\n console.log(` Package Manager: ${scan.packageManager}`);\n console.log('');\n\n // 3. Stack Complexity\n const { score, items } = calculateComplexity(config);\n const label = getComplexityLabel(score);\n const maxScore = 10;\n\n console.log(\n ` ${chalk.bold('Stack Complexity:')} ${score}/${maxScore} (${label})`,\n );\n\n for (const item of items) {\n if (item.active) {\n console.log(` ${chalk.green('\\u2713')} ${item.label}`);\n } else {\n console.log(` ${chalk.gray('\\u2717')} ${chalk.gray(item.label)}`);\n }\n }\n console.log('');\n\n // 4. Active Rules (template fragments)\n const activeFragments = (config.templates || []).filter((t) =>\n (TEMPLATE_FRAGMENTS as readonly string[]).includes(t),\n );\n const fragmentCount = activeFragments.length;\n\n console.log(\n ` ${chalk.bold('Active Rules:')} ${fragmentCount} template fragment${fragmentCount !== 1 ? 's' : ''}`,\n );\n if (fragmentCount > 0) {\n console.log(` ${activeFragments.join(', ')}`);\n }\n console.log('');\n\n // 5. Skills Overview\n const skills = config.commands || [];\n const totalSkills = skills.length;\n const categorized = categorizeSkills(skills);\n\n console.log(` ${chalk.bold('Skills:')} ${totalSkills} total`);\n for (const [category, categorySkills] of Object.entries(categorized)) {\n console.log(` ${category}: ${categorySkills.length}`);\n }\n console.log('');\n\n // 6. Tools Status\n console.log(` ${chalk.bold('Tools:')}`);\n const toolEntries = Object.entries(scan.tools) as [string, boolean][];\n const detectedTools: string[] = [];\n const missingTools: string[] = [];\n\n for (const [key, detected] of toolEntries) {\n const displayName = TOOL_DISPLAY_NAMES[key] || key;\n if (detected) {\n detectedTools.push(`${chalk.green('\\u2713')} ${displayName}`);\n } else {\n missingTools.push(`${chalk.yellow('\\u2717')} ${displayName}`);\n }\n }\n\n // Print tools in rows of 3\n const allToolItems = [...detectedTools, ...missingTools];\n for (let i = 0; i < allToolItems.length; i += 3) {\n const row = allToolItems\n .slice(i, i + 3)\n .map((item) => item.padEnd(22))\n .join('');\n console.log(` ${row}`);\n }\n console.log('');\n\n // 7. MCP Servers Status\n console.log(` ${chalk.bold('MCP Servers:')}`);\n const mcpEntries = Object.entries(scan.mcpServers) as [string, boolean][];\n const configuredMcps: string[] = [];\n const missingMcps: string[] = [];\n\n for (const [key, configured] of mcpEntries) {\n const displayName = MCP_DISPLAY_NAMES[key] || key;\n if (configured) {\n configuredMcps.push(`${chalk.green('\\u2713')} ${displayName}`);\n } else {\n missingMcps.push(`${chalk.yellow('\\u2717')} ${displayName}`);\n }\n }\n\n const allMcpItems = [...configuredMcps, ...missingMcps];\n for (let i = 0; i < allMcpItems.length; i += 3) {\n const row = allMcpItems\n .slice(i, i + 3)\n .map((item) => item.padEnd(22))\n .join('');\n console.log(` ${row}`);\n }\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport {\n logSuccess,\n logWarning,\n logError,\n logInfo,\n logSection,\n fileExists,\n readFileSafe,\n readJsonSafe,\n} from '../utils.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES } from '../constants.js';\nimport type { AiKitConfig } from '../types.js';\n\ninterface AuditCheck {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n message: string;\n}\n\nexport async function auditCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n logSection('AI Kit — Security & Configuration Audit');\n logInfo(`Auditing: ${projectDir}`);\n\n const checks: AuditCheck[] = [];\n\n // 1. Check ai-kit.config.json exists\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n if (fileExists(configPath)) {\n checks.push({ name: 'Config file', status: 'pass', message: 'ai-kit.config.json found' });\n } else {\n checks.push({ name: 'Config file', status: 'fail', message: 'ai-kit.config.json missing — run `ai-kit init`' });\n }\n\n // 2. Check CLAUDE.md exists and has AI-KIT markers\n const claudeMdPath = path.join(projectDir, GENERATED_FILES.claudeMd);\n const claudeMd = readFileSafe(claudeMdPath);\n if (claudeMd) {\n if (claudeMd.includes('AI-KIT:START') && claudeMd.includes('AI-KIT:END')) {\n checks.push({ name: 'CLAUDE.md', status: 'pass', message: 'CLAUDE.md has AI-KIT markers' });\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'warn', message: 'CLAUDE.md exists but missing AI-KIT markers — may not update correctly' });\n }\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'warn', message: 'CLAUDE.md not found' });\n }\n\n // 3. Check for secrets in CLAUDE.md\n if (claudeMd) {\n const secretPatterns = [\n /(?:api[_-]?key|secret|token|password|credential)\\s*[:=]\\s*['\"][^'\"]+['\"]/i,\n /(?:sk|pk|rk)[-_][a-zA-Z0-9]{20,}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /xox[bpoas]-[a-zA-Z0-9-]+/,\n ];\n\n const hasSecrets = secretPatterns.some((p) => p.test(claudeMd));\n if (hasSecrets) {\n checks.push({ name: 'Secrets in CLAUDE.md', status: 'fail', message: 'Potential secrets detected in CLAUDE.md — remove immediately' });\n } else {\n checks.push({ name: 'Secrets in CLAUDE.md', status: 'pass', message: 'No secrets detected' });\n }\n }\n\n // 4. Check hooks configuration\n const settingsLocalPath = path.join(projectDir, GENERATED_FILES.claudeSettingsLocal);\n if (fileExists(settingsLocalPath)) {\n const settings = readJsonSafe<Record<string, unknown>>(settingsLocalPath);\n if (settings?.hooks) {\n checks.push({ name: 'Hooks', status: 'pass', message: 'Hooks configured in settings.local.json' });\n } else {\n checks.push({ name: 'Hooks', status: 'warn', message: 'settings.local.json exists but no hooks defined' });\n }\n } else {\n checks.push({ name: 'Hooks', status: 'warn', message: 'No hooks configured — run `ai-kit init` to generate' });\n }\n\n // 5. Check agents directory\n const agentsDir = path.join(projectDir, GENERATED_FILES.claudeAgents);\n if (await fs.pathExists(agentsDir)) {\n const agentFiles = (await fs.readdir(agentsDir)).filter((f: string) => f.endsWith('.md'));\n if (agentFiles.length > 0) {\n checks.push({ name: 'Agents', status: 'pass', message: `${agentFiles.length} agent(s) configured` });\n\n // Validate agent frontmatter\n let invalidAgents = 0;\n for (const file of agentFiles) {\n const content = readFileSafe(path.join(agentsDir, file));\n if (content && !content.startsWith('---')) {\n invalidAgents++;\n }\n }\n if (invalidAgents > 0) {\n checks.push({ name: 'Agent frontmatter', status: 'warn', message: `${invalidAgents} agent(s) missing YAML frontmatter` });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', message: 'Agents directory empty' });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', message: 'No agents directory — run `ai-kit init` to generate' });\n }\n\n // 6. Check contexts directory\n const contextsDir = path.join(projectDir, GENERATED_FILES.claudeContexts);\n if (await fs.pathExists(contextsDir)) {\n const contextFiles = (await fs.readdir(contextsDir)).filter((f: string) => f.endsWith('.md'));\n checks.push({ name: 'Contexts', status: contextFiles.length > 0 ? 'pass' : 'warn', message: `${contextFiles.length} context mode(s) available` });\n } else {\n checks.push({ name: 'Contexts', status: 'warn', message: 'No contexts directory' });\n }\n\n // 7. Check skills directory\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (await fs.pathExists(skillsDir)) {\n const skillDirs = (await fs.readdir(skillsDir)).filter(async (f: string) => {\n try {\n return (await fs.stat(path.join(skillsDir, f))).isDirectory();\n } catch {\n return false;\n }\n });\n checks.push({ name: 'Skills', status: 'pass', message: `${skillDirs.length} skill(s) installed` });\n } else {\n checks.push({ name: 'Skills', status: 'warn', message: 'No skills directory' });\n }\n\n // 8. Check .env files are gitignored\n const gitignorePath = path.join(projectDir, '.gitignore');\n const gitignore = readFileSafe(gitignorePath);\n if (gitignore) {\n const envIgnored = gitignore.includes('.env') || gitignore.includes('.env.local');\n if (envIgnored) {\n checks.push({ name: '.env gitignore', status: 'pass', message: '.env files are gitignored' });\n } else {\n checks.push({ name: '.env gitignore', status: 'fail', message: '.env files are NOT gitignored — add to .gitignore immediately' });\n }\n }\n\n // 9. Check settings.local.json is gitignored\n if (gitignore) {\n const settingsIgnored = gitignore.includes('settings.local.json');\n if (!settingsIgnored) {\n checks.push({ name: 'Settings gitignore', status: 'warn', message: 'settings.local.json not in .gitignore — may leak local config' });\n }\n }\n\n // 10. Check for MCP server security\n const settingsPath = path.join(projectDir, '.claude', 'settings.json');\n const settings = readFileSafe(settingsPath);\n if (settings) {\n const hasEnvVarsInSettings = /(?:api[_-]?key|token|secret|password)\\s*[:=]\\s*\"[^\"]+\"/i.test(settings);\n if (hasEnvVarsInSettings) {\n checks.push({ name: 'MCP secrets', status: 'fail', message: 'Potential secrets in .claude/settings.json — use environment variables instead' });\n } else {\n checks.push({ name: 'MCP secrets', status: 'pass', message: 'No hardcoded secrets in settings' });\n }\n }\n\n // Output results\n logSection('Audit Results');\n\n const passed = checks.filter((c) => c.status === 'pass');\n const warned = checks.filter((c) => c.status === 'warn');\n const failed = checks.filter((c) => c.status === 'fail');\n\n for (const check of checks) {\n const icon =\n check.status === 'pass'\n ? chalk.green('✓')\n : check.status === 'warn'\n ? chalk.yellow('⚠')\n : chalk.red('✗');\n console.log(` ${icon} ${check.name}: ${check.message}`);\n }\n\n // Score\n const total = checks.length;\n const score = Math.round(((passed.length + warned.length * 0.5) / total) * 100);\n const grade =\n score >= 90 ? 'A' : score >= 80 ? 'B' : score >= 70 ? 'C' : score >= 60 ? 'D' : 'F';\n\n console.log('');\n logSection('Score');\n const gradeColor = grade <= 'B' ? chalk.green : grade <= 'C' ? chalk.yellow : chalk.red;\n console.log(` ${gradeColor.bold(grade)} (${score}/100)`);\n console.log(` ${chalk.green(String(passed.length))} passed · ${chalk.yellow(String(warned.length))} warnings · ${chalk.red(String(failed.length))} failures`);\n\n if (failed.length > 0) {\n console.log('');\n logError('Fix the failures above before proceeding.');\n }\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { scanProject } from '../scanner/index.js';\nimport { AI_KIT_CONFIG_FILE, GENERATED_FILES, VERSION } from '../constants.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n dirExists,\n readJsonSafe,\n readFileSafe,\n} from '../utils.js';\nimport type { AiKitConfig, ProjectScan } from '../types.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface HealthCheck {\n name: string;\n status: 'pass' | 'warn' | 'fail';\n detail: string;\n}\n\ninterface HealthSection {\n title: string;\n checks: HealthCheck[];\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────\nfunction gradeFromScore(score: number): string {\n if (score >= 90) return 'A';\n if (score >= 80) return 'B';\n if (score >= 70) return 'C';\n if (score >= 60) return 'D';\n return 'F';\n}\n\nfunction gradeColor(grade: string): typeof chalk.green {\n if (grade <= 'B') return chalk.green;\n if (grade <= 'C') return chalk.yellow;\n return chalk.red;\n}\n\nfunction statusIcon(status: 'pass' | 'warn' | 'fail'): string {\n switch (status) {\n case 'pass':\n return chalk.green('✓');\n case 'warn':\n return chalk.yellow('⚠');\n case 'fail':\n return chalk.red('✗');\n }\n}\n\nfunction progressBar(percent: number, width: number = 20): string {\n const filled = Math.round((percent / 100) * width);\n const empty = width - filled;\n return chalk.green('█'.repeat(filled)) + chalk.gray('░'.repeat(empty));\n}\n\n// ─── Section: Setup Integrity (from doctor) ────────────────────────────\nfunction checkSetup(\n projectDir: string,\n config: AiKitConfig,\n): HealthSection {\n const checks: HealthCheck[] = [];\n\n // Version check\n if (config.version === VERSION) {\n checks.push({ name: 'Version', status: 'pass', detail: `v${VERSION}` });\n } else {\n checks.push({\n name: 'Version',\n status: 'warn',\n detail: `config v${config.version} ≠ CLI v${VERSION} — run \\`ai-kit update\\``,\n });\n }\n\n // CLAUDE.md\n const claudeMd = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeMd));\n if (claudeMd && claudeMd.includes('AI-KIT:START')) {\n checks.push({ name: 'CLAUDE.md', status: 'pass', detail: 'Present with markers' });\n } else if (claudeMd) {\n checks.push({ name: 'CLAUDE.md', status: 'warn', detail: 'Missing AI-KIT markers' });\n } else {\n checks.push({ name: 'CLAUDE.md', status: 'fail', detail: 'Not found' });\n }\n\n // .cursorrules\n if (fileExists(path.join(projectDir, GENERATED_FILES.cursorRules))) {\n checks.push({ name: '.cursorrules', status: 'pass', detail: 'Present' });\n } else {\n checks.push({ name: '.cursorrules', status: 'warn', detail: 'Not generated' });\n }\n\n // Skills count\n const skillsDir = path.join(projectDir, GENERATED_FILES.claudeSkills);\n if (dirExists(skillsDir)) {\n const count = config.commands.length;\n checks.push({ name: 'Skills', status: 'pass', detail: `${count} installed` });\n } else {\n checks.push({ name: 'Skills', status: 'warn', detail: 'No skills directory' });\n }\n\n // Agents\n const agentsDir = path.join(projectDir, GENERATED_FILES.claudeAgents);\n if (dirExists(agentsDir)) {\n try {\n const agentFiles = fs.readdirSync(agentsDir).filter((f: string) => f.endsWith('.md'));\n checks.push({ name: 'Agents', status: 'pass', detail: `${agentFiles.length} configured` });\n } catch {\n checks.push({ name: 'Agents', status: 'warn', detail: 'Could not read agents' });\n }\n } else {\n checks.push({ name: 'Agents', status: 'warn', detail: 'Not configured' });\n }\n\n // Hooks\n const settingsLocal = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeSettingsLocal));\n if (settingsLocal && settingsLocal.includes('\"hooks\"')) {\n checks.push({ name: 'Hooks', status: 'pass', detail: 'Configured' });\n } else {\n checks.push({ name: 'Hooks', status: 'warn', detail: 'Not configured' });\n }\n\n return { title: 'Setup Integrity', checks };\n}\n\n// ─── Section: Security (from audit) ────────────────────────────────────\nfunction checkSecurity(projectDir: string): HealthSection {\n const checks: HealthCheck[] = [];\n\n // Secrets in CLAUDE.md\n const claudeMd = readFileSafe(path.join(projectDir, GENERATED_FILES.claudeMd));\n if (claudeMd) {\n const secretPatterns = [\n /(?:api[_-]?key|secret|token|password|credential)\\s*[:=]\\s*['\"][^'\"]+['\"]/i,\n /(?:sk|pk|rk)[-_][a-zA-Z0-9]{20,}/,\n /ghp_[a-zA-Z0-9]{36}/,\n /xox[bpoas]-[a-zA-Z0-9-]+/,\n ];\n const hasSecrets = secretPatterns.some((p) => p.test(claudeMd));\n checks.push({\n name: 'Secrets in CLAUDE.md',\n status: hasSecrets ? 'fail' : 'pass',\n detail: hasSecrets ? 'Potential secrets detected — remove immediately' : 'Clean',\n });\n }\n\n // .env gitignored\n const gitignore = readFileSafe(path.join(projectDir, '.gitignore'));\n if (gitignore) {\n const envIgnored = gitignore.includes('.env') || gitignore.includes('.env.local');\n checks.push({\n name: '.env gitignore',\n status: envIgnored ? 'pass' : 'fail',\n detail: envIgnored ? 'Protected' : 'NOT gitignored — add .env to .gitignore',\n });\n }\n\n // MCP secrets check\n const settingsJson = readFileSafe(path.join(projectDir, '.claude', 'settings.json'));\n if (settingsJson) {\n const hasHardcoded = /(?:api[_-]?key|token|secret|password)\\s*[:=]\\s*\"[^\"]+\"/i.test(settingsJson);\n checks.push({\n name: 'MCP config',\n status: hasHardcoded ? 'fail' : 'pass',\n detail: hasHardcoded ? 'Hardcoded secrets in settings.json' : 'No hardcoded secrets',\n });\n }\n\n return { title: 'Security', checks };\n}\n\n// ─── Section: Stack (from stats) ───────────────────────────────────────\nfunction checkStack(config: AiKitConfig): HealthSection {\n const checks: HealthCheck[] = [];\n const scan = config.scanResult;\n\n // Framework\n if (scan.framework !== 'unknown') {\n const label =\n scan.framework === 'nextjs'\n ? `Next.js ${scan.nextjsVersion || ''} (${scan.routerType === 'app' ? 'App Router' : scan.routerType === 'pages' ? 'Pages Router' : 'Hybrid'})`\n : scan.framework;\n checks.push({ name: 'Framework', status: 'pass', detail: label.trim() });\n } else {\n checks.push({ name: 'Framework', status: 'warn', detail: 'Not detected' });\n }\n\n // CMS\n if (scan.cms !== 'none') {\n const label =\n scan.cms === 'sitecore-xmc-v2'\n ? 'Sitecore XM Cloud (Content SDK v2)'\n : scan.cms === 'sitecore-xmc'\n ? 'Sitecore XM Cloud'\n : scan.cms;\n checks.push({ name: 'CMS', status: 'pass', detail: label });\n }\n\n // TypeScript\n checks.push({\n name: 'TypeScript',\n status: scan.typescript ? 'pass' : 'warn',\n detail: scan.typescript\n ? `Enabled${scan.typescriptStrict ? ' (strict)' : ''}`\n : 'Not detected',\n });\n\n // Styling\n if (scan.styling.length > 0) {\n checks.push({ name: 'Styling', status: 'pass', detail: scan.styling.join(', ') });\n }\n\n // Monorepo\n if (scan.monorepo) {\n checks.push({\n name: 'Monorepo',\n status: 'pass',\n detail: scan.monorepoTool || 'Detected',\n });\n }\n\n // Static site\n if (scan.staticSite?.isStatic) {\n checks.push({\n name: 'Static Site',\n status: 'pass',\n detail: `${scan.staticSite.outputMode} mode`,\n });\n }\n\n // Design tokens\n if (scan.designTokens?.detected) {\n checks.push({\n name: 'Design Tokens',\n status: 'pass',\n detail: `${scan.designTokens.colors.length} colors, ${scan.designTokens.fonts.length} fonts (${scan.designTokens.source})`,\n });\n } else if (scan.styling.includes('tailwind')) {\n checks.push({\n name: 'Design Tokens',\n status: 'warn',\n detail: 'Tailwind detected but no custom tokens found — AI may use arbitrary values',\n });\n }\n\n // .aiignore\n if (scan.aiIgnorePatterns?.length > 0) {\n checks.push({\n name: '.aiignore',\n status: 'pass',\n detail: `${scan.aiIgnorePatterns.length} patterns loaded`,\n });\n }\n\n return { title: 'Stack Detection', checks };\n}\n\n// ─── Section: Tools (from stats + doctor) ──────────────────────────────\nfunction checkTools(scan: ProjectScan): HealthSection {\n const checks: HealthCheck[] = [];\n\n const toolMap: Record<string, { key: keyof typeof scan.tools; hint: string }> = {\n Playwright: { key: 'playwright', hint: 'npm i -D @playwright/test' },\n ESLint: { key: 'eslint', hint: 'npm i -D eslint' },\n Prettier: { key: 'prettier', hint: 'npm i -D prettier' },\n 'axe-core': { key: 'axeCore', hint: 'npm i -D @axe-core/playwright' },\n Knip: { key: 'knip', hint: 'npm i -D knip' },\n 'Bundle Analyzer': { key: 'bundleAnalyzer', hint: 'npm i -D @next/bundle-analyzer' },\n Storybook: { key: 'storybook', hint: 'npx storybook@latest init' },\n };\n\n for (const [name, { key, hint }] of Object.entries(toolMap)) {\n checks.push({\n name,\n status: scan.tools[key] ? 'pass' : 'warn',\n detail: scan.tools[key] ? 'Detected' : `Missing — ${hint}`,\n });\n }\n\n // MCP servers\n const mcpMap: Record<string, keyof typeof scan.mcpServers> = {\n 'GitHub MCP': 'github',\n 'Figma MCP': 'figma',\n 'Context7 MCP': 'context7',\n 'Perplexity MCP': 'perplexity',\n };\n\n for (const [name, key] of Object.entries(mcpMap)) {\n checks.push({\n name,\n status: scan.mcpServers[key] ? 'pass' : 'warn',\n detail: scan.mcpServers[key] ? 'Configured' : 'Not configured',\n });\n }\n\n return { title: 'Tools & MCP', checks };\n}\n\n// ─── Section: Docs Health ──────────────────────────────────────────────\nfunction checkDocs(projectDir: string): HealthSection {\n const checks: HealthCheck[] = [];\n\n const docsToCheck = [\n { name: 'Mistakes Log', path: 'docs/mistakes-log.md' },\n { name: 'Decisions Log', path: 'docs/decisions-log.md' },\n { name: 'Time Log', path: 'docs/time-log.md' },\n ];\n\n for (const doc of docsToCheck) {\n const content = readFileSafe(path.join(projectDir, doc.path));\n if (content) {\n // Check if it has any entries beyond the template\n const hasEntries = content.includes('## 20') || content.split('---').length > 2;\n checks.push({\n name: doc.name,\n status: hasEntries ? 'pass' : 'warn',\n detail: hasEntries ? 'Has entries' : 'Scaffolded but empty',\n });\n } else {\n checks.push({ name: doc.name, status: 'warn', detail: 'Not found' });\n }\n }\n\n return { title: 'Documentation', checks };\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function healthCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Project Health');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logError('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n const config = readJsonSafe<AiKitConfig>(configPath);\n if (!config) {\n logError('ai-kit.config.json is corrupted. Run `ai-kit init` to re-initialize.');\n return;\n }\n\n // Fresh scan for tools/MCP accuracy\n const spinner = ora('Scanning project...').start();\n let freshScan: ProjectScan;\n try {\n freshScan = await scanProject(projectDir);\n spinner.succeed('Project scanned');\n } catch {\n spinner.fail('Scan failed — using cached data');\n freshScan = config.scanResult;\n }\n\n // Run all sections\n const sections: HealthSection[] = [\n checkSetup(projectDir, config),\n checkSecurity(projectDir),\n checkStack(config),\n checkTools(freshScan),\n checkDocs(projectDir),\n ];\n\n // Print sections\n let totalPassed = 0;\n let totalWarnings = 0;\n let totalFailed = 0;\n\n for (const section of sections) {\n console.log(`\\n ${chalk.bold(section.title)}`);\n\n for (const check of section.checks) {\n const icon = statusIcon(check.status);\n console.log(` ${icon} ${chalk.white(check.name)}: ${chalk.dim(check.detail)}`);\n\n switch (check.status) {\n case 'pass':\n totalPassed++;\n break;\n case 'warn':\n totalWarnings++;\n break;\n case 'fail':\n totalFailed++;\n break;\n }\n }\n }\n\n // Overall score\n const total = totalPassed + totalWarnings + totalFailed;\n const score = total > 0\n ? Math.round(((totalPassed + totalWarnings * 0.5) / total) * 100)\n : 0;\n const grade = gradeFromScore(score);\n const colorFn = gradeColor(grade);\n\n console.log('');\n console.log(\n ` ${chalk.bold('Overall:')} ${colorFn.bold(grade)} ${chalk.dim(`(${score}/100)`)}`,\n );\n console.log(\n ` ${progressBar(score)} ${chalk.green(String(totalPassed))} passed · ${chalk.yellow(String(totalWarnings))} warnings · ${chalk.red(String(totalFailed))} failures`,\n );\n\n // Quick recommendations\n if (totalFailed > 0 || totalWarnings > 2) {\n console.log('');\n console.log(chalk.bold(' Recommendations:'));\n\n if (totalFailed > 0) {\n const failures = sections.flatMap((s) => s.checks.filter((c) => c.status === 'fail'));\n for (const f of failures.slice(0, 3)) {\n console.log(` ${chalk.red('→')} Fix: ${f.name} — ${f.detail}`);\n }\n }\n\n const warnings = sections.flatMap((s) => s.checks.filter((c) => c.status === 'warn'));\n for (const w of warnings.slice(0, 3)) {\n console.log(` ${chalk.yellow('→')} Improve: ${w.name} — ${w.detail}`);\n }\n }\n\n // Project summary line\n const scan = config.scanResult;\n console.log('');\n console.log(chalk.dim(` v${config.version} · ${scan.projectName} · ${config.commands.length} skills · ${config.guides.length} guides · Generated ${config.generatedAt}`));\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n dirExists,\n readFileSafe,\n readJsonSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface PatternMatch {\n pattern: string;\n file: string;\n line: number;\n}\n\ninterface PatternCategory {\n name: string;\n patterns: {\n label: string;\n regex: RegExp;\n matches: PatternMatch[];\n }[];\n}\n\n// ─── Pattern Definitions ────────────────────────────────────────────────\nfunction buildPatternCategories(): PatternCategory[] {\n return [\n {\n name: 'Data Fetching',\n patterns: [\n { label: 'fetch()', regex: /\\bfetch\\s*\\(/, matches: [] },\n { label: 'axios', regex: /\\baxios\\b/, matches: [] },\n { label: 'useSWR', regex: /\\buseSWR\\b/, matches: [] },\n { label: 'useQuery (React Query)', regex: /\\buseQuery\\b/, matches: [] },\n { label: 'useMutation', regex: /\\buseMutation\\b/, matches: [] },\n { label: 'getServerSideProps', regex: /\\bgetServerSideProps\\b/, matches: [] },\n { label: 'getStaticProps', regex: /\\bgetStaticProps\\b/, matches: [] },\n { label: 'Server Actions (use server)', regex: /['\"]use server['\"]/, matches: [] },\n ],\n },\n {\n name: 'Error Handling',\n patterns: [\n { label: 'try/catch', regex: /\\btry\\s*\\{/, matches: [] },\n { label: 'Error Boundary', regex: /\\bErrorBoundary\\b/, matches: [] },\n { label: 'error.tsx (App Router)', regex: /export\\s+default.*error/i, matches: [] },\n { label: '.catch()', regex: /\\.catch\\s*\\(/, matches: [] },\n { label: 'onError callback', regex: /\\bonError\\b/, matches: [] },\n ],\n },\n {\n name: 'Form Handling',\n patterns: [\n { label: 'useState (controlled)', regex: /\\buseState\\b.*(?:onChange|handleChange)/, matches: [] },\n { label: 'useRef (uncontrolled)', regex: /\\buseRef\\b/, matches: [] },\n { label: 'react-hook-form', regex: /\\buseForm\\b/, matches: [] },\n { label: 'Formik', regex: /\\buseFormik\\b|\\bFormik\\b/, matches: [] },\n { label: 'Zod validation', regex: /\\bz\\.\\w+\\(|zod/, matches: [] },\n { label: 'Yup validation', regex: /\\byup\\.\\w+\\(|\\bYup\\b/, matches: [] },\n ],\n },\n {\n name: 'Auth Patterns',\n patterns: [\n { label: 'NextAuth / Auth.js', regex: /\\buseSession\\b|\\bgetServerSession\\b|\\bnext-auth\\b/, matches: [] },\n { label: 'JWT handling', regex: /\\bjwt\\b|\\bjsonwebtoken\\b/, matches: [] },\n { label: 'Auth middleware', regex: /\\bmiddleware\\b.*auth|auth.*\\bmiddleware\\b/i, matches: [] },\n { label: 'Protected route', regex: /\\bProtectedRoute\\b|\\bwithAuth\\b|\\brequireAuth\\b/, matches: [] },\n ],\n },\n {\n name: 'State Management',\n patterns: [\n { label: 'useState', regex: /\\buseState\\b/, matches: [] },\n { label: 'useReducer', regex: /\\buseReducer\\b/, matches: [] },\n { label: 'useContext', regex: /\\buseContext\\b/, matches: [] },\n { label: 'Zustand', regex: /\\bcreate\\b.*\\bset\\b.*\\bget\\b|\\bzustand\\b/, matches: [] },\n { label: 'Redux', regex: /\\buseSelector\\b|\\buseDispatch\\b|\\bcreateSlice\\b/, matches: [] },\n { label: 'Jotai', regex: /\\buseAtom\\b|\\batom\\(/, matches: [] },\n { label: 'Recoil', regex: /\\buseRecoilState\\b|\\brecoil\\b/i, matches: [] },\n ],\n },\n {\n name: 'API Route Patterns',\n patterns: [\n { label: 'NextRequest/NextResponse', regex: /\\bNextRequest\\b|\\bNextResponse\\b/, matches: [] },\n { label: 'Route handler (GET/POST)', regex: /export\\s+(?:async\\s+)?function\\s+(?:GET|POST|PUT|DELETE|PATCH)\\b/, matches: [] },\n { label: 'API route (pages)', regex: /\\bNextApiRequest\\b|\\bNextApiResponse\\b/, matches: [] },\n { label: 'tRPC', regex: /\\btrpc\\b|\\bcreateRouter\\b.*\\bprocedure\\b/i, matches: [] },\n ],\n },\n ];\n}\n\n// ─── File Walker ────────────────────────────────────────────────────────\nconst IGNORE_DIRS = [\n 'node_modules', '.next', '.git', 'dist', 'build', '.turbo',\n '.storybook', 'coverage', '.cache',\n];\n\nfunction walkTsFiles(dir: string, files: string[]): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (IGNORE_DIRS.includes(entry.name)) continue;\n walkTsFiles(full, files);\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n files.push(full);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function patternsCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Pattern Library');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Discover files\n const spinner = ora('Scanning for code patterns...').start();\n\n const files: string[] = [];\n const srcDir = path.join(projectDir, 'src');\n if (dirExists(srcDir)) {\n walkTsFiles(srcDir, files);\n } else {\n walkTsFiles(projectDir, files);\n }\n\n if (files.length === 0) {\n spinner.fail('No TypeScript/JavaScript files found.');\n return;\n }\n\n spinner.text = `Analyzing ${files.length} files for patterns...`;\n\n // Build categories and scan\n const categories = buildPatternCategories();\n\n for (const file of files) {\n const content = readFileSafe(file);\n if (!content) continue;\n\n const lines = content.split('\\n');\n\n for (const category of categories) {\n for (const pattern of category.patterns) {\n for (let i = 0; i < lines.length; i++) {\n if (pattern.regex.test(lines[i])) {\n pattern.matches.push({\n pattern: pattern.label,\n file: path.relative(projectDir, file),\n line: i + 1,\n });\n }\n }\n }\n }\n }\n\n spinner.succeed(`Scanned ${files.length} files`);\n\n // Display results\n let totalPatterns = 0;\n\n for (const category of categories) {\n const activePatterns = category.patterns.filter((p) => p.matches.length > 0);\n if (activePatterns.length === 0) continue;\n\n console.log(`\\n ${chalk.bold(category.name)}`);\n\n for (const pattern of activePatterns) {\n const count = pattern.matches.length;\n totalPatterns += count;\n const uniqueFiles = new Set(pattern.matches.map((m) => m.file)).size;\n console.log(\n ` ${chalk.green('✓')} ${chalk.white(pattern.label)}: ${chalk.cyan(String(count))} occurrences in ${chalk.cyan(String(uniqueFiles))} files`,\n );\n }\n }\n\n if (totalPatterns === 0) {\n logInfo('No recognizable patterns found.');\n return;\n }\n\n // Write output file\n const outputDir = path.join(projectDir, 'ai-kit');\n fs.ensureDirSync(outputDir);\n const outputPath = path.join(outputDir, 'patterns.md');\n\n const lines: string[] = [\n '# Code Patterns',\n '',\n `> Auto-generated by ai-kit on ${new Date().toISOString().split('T')[0]}`,\n `> Scanned ${files.length} files`,\n '',\n ];\n\n for (const category of categories) {\n const activePatterns = category.patterns.filter((p) => p.matches.length > 0);\n if (activePatterns.length === 0) continue;\n\n lines.push(`## ${category.name}`, '');\n lines.push('| Pattern | Occurrences | Files |');\n lines.push('| ------- | ----------: | ----: |');\n\n for (const pattern of activePatterns) {\n const uniqueFiles = new Set(pattern.matches.map((m) => m.file)).size;\n lines.push(`| ${pattern.label} | ${pattern.matches.length} | ${uniqueFiles} |`);\n }\n\n lines.push('');\n\n // List top files per pattern\n for (const pattern of activePatterns) {\n if (pattern.matches.length <= 3) continue;\n const fileCounts = new Map<string, number>();\n for (const m of pattern.matches) {\n fileCounts.set(m.file, (fileCounts.get(m.file) || 0) + 1);\n }\n const topFiles = Array.from(fileCounts.entries())\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n lines.push(`### ${pattern.label} — top files`, '');\n for (const [file, count] of topFiles) {\n lines.push(`- \\`${file}\\` (${count})`);\n }\n lines.push('');\n }\n }\n\n fs.writeFileSync(outputPath, lines.join('\\n'), 'utf-8');\n\n console.log('');\n logSuccess(`Pattern library written to ${chalk.cyan('ai-kit/patterns.md')}`);\n logInfo(`Total: ${chalk.bold(String(totalPatterns))} pattern occurrences across ${chalk.bold(String(files.length))} files`);\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport { scanComponents } from '../scanner/components.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n readFileSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface DeadCodeEntry {\n name: string;\n filePath: string;\n importCount: number;\n testOnly: boolean;\n status: 'used' | 'unused' | 'test-only';\n}\n\n// ─── File Walker ────────────────────────────────────────────────────────\nconst IGNORE_DIRS = [\n 'node_modules', '.next', '.git', 'dist', 'build', '.turbo',\n '.storybook', 'coverage', '.cache',\n];\n\nfunction collectAllFiles(dir: string, files: string[]): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (IGNORE_DIRS.includes(entry.name)) continue;\n collectAllFiles(full, files);\n } else if (/\\.(tsx?|jsx?)$/.test(entry.name)) {\n files.push(full);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\nfunction isTestOrStoryFile(filePath: string): boolean {\n const name = path.basename(filePath).toLowerCase();\n return (\n name.includes('.test.') ||\n name.includes('.spec.') ||\n name.includes('.stories.') ||\n name.includes('__tests__') ||\n name.includes('__mocks__')\n );\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function deadCodeCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Dead Code Report');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Scan components\n const spinner = ora('Scanning components...').start();\n const scanResult = scanComponents(projectDir);\n\n if (scanResult.components.length === 0) {\n spinner.fail('No components found.');\n return;\n }\n\n spinner.text = `Found ${scanResult.components.length} components. Checking imports...`;\n\n // Collect all project files for import search\n const allFiles: string[] = [];\n const srcDir = path.join(projectDir, 'src');\n if (fs.existsSync(srcDir)) {\n collectAllFiles(srcDir, allFiles);\n } else {\n collectAllFiles(projectDir, allFiles);\n }\n\n // Read all file contents once for efficiency\n const fileContents = new Map<string, string>();\n for (const file of allFiles) {\n const content = readFileSafe(file);\n if (content) {\n fileContents.set(file, content);\n }\n }\n\n spinner.text = 'Analyzing import references...';\n\n // For each component, search for imports across the project\n const entries: DeadCodeEntry[] = [];\n\n for (const component of scanResult.components) {\n const componentFile = component.filePath;\n let importCount = 0;\n let testOnlyImports = 0;\n let productionImports = 0;\n\n // Build regex patterns to find imports of this component\n // Match: import ... from '...ComponentName' or import ... from '...ComponentName/...'\n const namePattern = new RegExp(\n `(?:import|from)\\\\s+.*['\"][^'\"]*(?:/|\\\\b)${escapeRegex(component.name)}(?:[/'\"]|\\\\b)`,\n );\n\n for (const [file, content] of fileContents) {\n // Skip the component's own file\n if (path.resolve(file) === path.resolve(componentFile)) continue;\n\n if (namePattern.test(content)) {\n importCount++;\n if (isTestOrStoryFile(file)) {\n testOnlyImports++;\n } else {\n productionImports++;\n }\n }\n }\n\n let status: DeadCodeEntry['status'];\n if (importCount === 0) {\n status = 'unused';\n } else if (productionImports === 0 && testOnlyImports > 0) {\n status = 'test-only';\n } else {\n status = 'used';\n }\n\n entries.push({\n name: component.name,\n filePath: component.relativePath,\n importCount,\n testOnly: status === 'test-only',\n status,\n });\n }\n\n spinner.succeed(`Analyzed ${scanResult.components.length} components across ${allFiles.length} files`);\n\n // Sort: unused first, then test-only, then used\n const statusOrder: Record<string, number> = { unused: 0, 'test-only': 1, used: 2 };\n entries.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n // Count summaries\n const unused = entries.filter((e) => e.status === 'unused');\n const testOnly = entries.filter((e) => e.status === 'test-only');\n const used = entries.filter((e) => e.status === 'used');\n\n // Display table\n console.log('');\n const nameWidth = 30;\n const pathWidth = 45;\n const countWidth = 8;\n const statusWidth = 12;\n\n // Header\n console.log(\n ` ${chalk.bold('Component'.padEnd(nameWidth))} ${chalk.bold('Path'.padEnd(pathWidth))} ${chalk.bold('Imports'.padStart(countWidth))} ${chalk.bold('Status'.padEnd(statusWidth))}`,\n );\n console.log(\n ` ${'─'.repeat(nameWidth)} ${'─'.repeat(pathWidth)} ${'─'.repeat(countWidth)} ${'─'.repeat(statusWidth)}`,\n );\n\n for (const entry of entries) {\n const name = entry.name.length > nameWidth - 1\n ? entry.name.substring(0, nameWidth - 3) + '...'\n : entry.name.padEnd(nameWidth);\n\n const filePath = entry.filePath.length > pathWidth - 1\n ? '...' + entry.filePath.substring(entry.filePath.length - pathWidth + 4)\n : entry.filePath.padEnd(pathWidth);\n\n const count = String(entry.importCount).padStart(countWidth);\n\n let statusLabel: string;\n switch (entry.status) {\n case 'unused':\n statusLabel = chalk.red('unused');\n break;\n case 'test-only':\n statusLabel = chalk.yellow('test-only');\n break;\n case 'used':\n statusLabel = chalk.green('used');\n break;\n }\n\n console.log(` ${name} ${chalk.dim(filePath)} ${count} ${statusLabel}`);\n }\n\n // Summary\n console.log('');\n console.log(\n ` ${chalk.bold('Summary:')} ${chalk.red(String(unused.length))} unused · ${chalk.yellow(String(testOnly.length))} test-only · ${chalk.green(String(used.length))} actively used`,\n );\n\n if (unused.length > 0) {\n console.log('');\n logWarning('Unused components may be dead code. Consider removing them or verify they are entry points.');\n }\n\n if (testOnly.length > 0) {\n logInfo('Test-only components are only imported in test/story files.');\n }\n\n console.log('');\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────\nfunction escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport { readFileSafe, dirExists } from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\nexport interface ComponentProp {\n name: string;\n type: string;\n required: boolean;\n defaultValue?: string;\n}\n\nexport interface SitecoreComponentMeta {\n usesContext: boolean;\n datasourceFields: string[];\n renderingParams: string[];\n placeholders: string[];\n graphqlQueries: string[];\n}\n\nexport interface ComponentInfo {\n name: string;\n filePath: string;\n relativePath: string;\n category: string;\n props: ComponentProp[];\n sitecore: SitecoreComponentMeta;\n dependencies: string[];\n hasTests: boolean;\n hasStory: boolean;\n hasAiDoc: boolean;\n exportType: 'default' | 'named' | 'both';\n}\n\nexport interface ComponentScanResult {\n components: ComponentInfo[];\n totalFiles: number;\n directories: string[];\n}\n\n// ─── File Discovery ────────────────────────────────────────────────────\nconst COMPONENT_DIRS = [\n 'src/components',\n 'src/Components',\n 'components',\n 'Components',\n 'src/rendering/src/components',\n 'src/rendering/src/Components',\n 'headapps',\n 'app',\n];\n\nconst IGNORE_PATTERNS = [\n 'node_modules',\n '.next',\n '.storybook',\n '__tests__',\n '__mocks__',\n 'dist',\n 'build',\n '.git',\n];\n\nconst TEST_SUFFIXES = ['.test.tsx', '.test.ts', '.spec.tsx', '.spec.ts'];\nconst STORY_SUFFIXES = ['.stories.tsx', '.stories.ts', '.stories.mdx'];\n\nfunction findComponentFiles(projectPath: string): { files: string[]; directories: string[] } {\n const files: string[] = [];\n const directories = new Set<string>();\n\n for (const dir of COMPONENT_DIRS) {\n const fullDir = path.join(projectPath, dir);\n if (dirExists(fullDir)) {\n walkForComponents(fullDir, files, directories);\n }\n }\n\n return { files, directories: Array.from(directories) };\n}\n\nfunction walkForComponents(\n dir: string,\n files: string[],\n directories: Set<string>,\n): void {\n try {\n const entries = fs.readdirSync(dir, { withFileTypes: true });\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (IGNORE_PATTERNS.includes(entry.name)) continue;\n walkForComponents(full, files, directories);\n continue;\n }\n\n if (!entry.name.endsWith('.tsx')) continue;\n\n // Skip test and story files\n const isTest = TEST_SUFFIXES.some((s) => entry.name.endsWith(s));\n const isStory = STORY_SUFFIXES.some((s) => entry.name.endsWith(s));\n if (isTest || isStory) continue;\n\n // Skip index-only re-exports (very small files)\n const content = readFileSafe(full);\n if (!content || content.length < 50) continue;\n\n // Must export a React component (function or const with JSX return)\n if (isReactComponent(content)) {\n files.push(full);\n directories.add(dir);\n }\n }\n } catch {\n // Skip unreadable directories\n }\n}\n\nfunction isReactComponent(content: string): boolean {\n // Check for common React component patterns\n const patterns = [\n /export\\s+(?:default\\s+)?function\\s+\\w+/,\n /export\\s+(?:default\\s+)?const\\s+\\w+\\s*[:=]\\s*(?:React\\.)?(?:FC|FunctionComponent|memo|forwardRef)/,\n /export\\s+(?:default\\s+)?const\\s+\\w+\\s*=\\s*\\([^)]*\\)\\s*(?::\\s*\\w+)?\\s*=>/,\n /export\\s+default\\s+\\w+/,\n ];\n\n const hasExport = patterns.some((p) => p.test(content));\n const hasJsx = /<[\\w.]+[\\s/>]/.test(content) || /return\\s*\\(/.test(content);\n\n return hasExport && hasJsx;\n}\n\n// ─── Metadata Extraction ───────────────────────────────────────────────\nfunction extractComponentName(filePath: string, content: string): string {\n // Try to extract from export statement\n const defaultExport = content.match(\n /export\\s+default\\s+function\\s+(\\w+)/,\n );\n if (defaultExport) return defaultExport[1];\n\n const namedExport = content.match(\n /export\\s+(?:const|function)\\s+(\\w+)/,\n );\n if (namedExport) return namedExport[1];\n\n // Fallback to filename\n return path.basename(filePath, '.tsx');\n}\n\nfunction extractExportType(content: string): 'default' | 'named' | 'both' {\n const hasDefault = /export\\s+default\\s/.test(content);\n const hasNamed = /export\\s+(?:const|function|class)\\s+\\w+/.test(content);\n\n if (hasDefault && hasNamed) return 'both';\n if (hasDefault) return 'default';\n return 'named';\n}\n\nfunction extractProps(content: string): ComponentProp[] {\n const props: ComponentProp[] = [];\n\n // Match interface/type props definitions\n // Pattern: interface XxxProps { ... }\n const propsInterface = content.match(\n /(?:interface|type)\\s+\\w*Props\\w*\\s*(?:=\\s*)?{([^}]*)}/s,\n );\n\n if (!propsInterface) return props;\n\n const body = propsInterface[1];\n const lines = body.split('\\n');\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith('//') || trimmed.startsWith('/*')) continue;\n\n // Match: propName: Type or propName?: Type\n const propMatch = trimmed.match(/^(\\w+)(\\?)?:\\s*(.+?)(?:;|$)/);\n if (propMatch) {\n props.push({\n name: propMatch[1],\n type: propMatch[3].trim().replace(/;$/, ''),\n required: !propMatch[2],\n });\n }\n }\n\n return props;\n}\n\nfunction extractSitecoreMeta(content: string): SitecoreComponentMeta {\n const meta: SitecoreComponentMeta = {\n usesContext: false,\n datasourceFields: [],\n renderingParams: [],\n placeholders: [],\n graphqlQueries: [],\n };\n\n // Detect useSitecoreContext\n meta.usesContext = /useSitecoreContext/.test(content);\n\n // Detect datasource field access patterns\n // fields.fieldName or fields?.fieldName or props.fields.fieldName\n const fieldAccess = content.matchAll(\n /fields[?.]\\.(\\w+)/g,\n );\n for (const match of fieldAccess) {\n if (!meta.datasourceFields.includes(match[1])) {\n meta.datasourceFields.push(match[1]);\n }\n }\n\n // Also check for Field component usage: <Text field={fields.title} />\n const fieldComponents = content.matchAll(\n /field=\\{(?:fields|props\\.fields)[?.]\\.(\\w+)\\}/g,\n );\n for (const match of fieldComponents) {\n if (!meta.datasourceFields.includes(match[1])) {\n meta.datasourceFields.push(match[1]);\n }\n }\n\n // Detect rendering params\n // params.paramName or params?.paramName\n const paramAccess = content.matchAll(\n /params[?.]\\.(\\w+)/g,\n );\n for (const match of paramAccess) {\n const name = match[1];\n if (name !== 'styles' && !meta.renderingParams.includes(name)) {\n meta.renderingParams.push(name);\n }\n }\n\n // Detect Placeholder usage\n const placeholders = content.matchAll(\n /(?:<Placeholder|Placeholder)\\s[^>]*name=[\"'{]([^\"'}]+)[\"'}]/g,\n );\n for (const match of placeholders) {\n if (!meta.placeholders.includes(match[1])) {\n meta.placeholders.push(match[1]);\n }\n }\n\n // Detect GraphQL queries\n const gqlQueries = content.matchAll(\n /(?:gql|graphql)`\\s*(query\\s+(\\w+))/g,\n );\n for (const match of gqlQueries) {\n meta.graphqlQueries.push(match[2] || match[1]);\n }\n\n return meta;\n}\n\nfunction extractDependencies(content: string): string[] {\n const deps: string[] = [];\n const imports = content.matchAll(\n /import\\s+(?:{[^}]+}|\\w+)\\s+from\\s+['\"]([^'\"]+)['\"]/g,\n );\n\n for (const match of imports) {\n const importPath = match[1];\n // Only track local component imports (relative paths)\n if (importPath.startsWith('.') || importPath.startsWith('..')) {\n const basename = path.basename(importPath).replace(/\\.\\w+$/, '');\n // Likely a component if PascalCase\n if (/^[A-Z]/.test(basename)) {\n deps.push(basename);\n }\n }\n }\n\n return deps;\n}\n\nfunction checkForTests(componentPath: string, componentName: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n for (const suffix of TEST_SUFFIXES) {\n if (fs.existsSync(path.join(dir, base + suffix))) return true;\n }\n\n // Check __tests__ subdirectory\n const testsDir = path.join(dir, '__tests__');\n if (dirExists(testsDir)) {\n for (const suffix of TEST_SUFFIXES) {\n if (fs.existsSync(path.join(testsDir, base + suffix))) return true;\n if (fs.existsSync(path.join(testsDir, componentName + suffix))) return true;\n }\n }\n\n return false;\n}\n\nfunction checkForStory(componentPath: string, componentName: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n for (const suffix of STORY_SUFFIXES) {\n if (fs.existsSync(path.join(dir, base + suffix))) return true;\n if (fs.existsSync(path.join(dir, componentName + suffix))) return true;\n }\n\n return false;\n}\n\nfunction checkForAiDoc(componentPath: string): boolean {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n return (\n fs.existsSync(path.join(dir, `${base}.ai.md`)) ||\n fs.existsSync(path.join(dir, 'component.ai.md'))\n );\n}\n\nfunction categorizeComponent(relativePath: string): string {\n const lower = relativePath.toLowerCase();\n\n if (lower.includes('layout')) return 'layout';\n if (lower.includes('page') || lower.includes('route')) return 'page';\n if (lower.includes('form')) return 'form';\n if (lower.includes('nav') || lower.includes('header') || lower.includes('footer')) return 'navigation';\n if (lower.includes('ui') || lower.includes('common') || lower.includes('shared')) return 'ui';\n if (lower.includes('feature')) return 'feature';\n if (lower.includes('marketing') || lower.includes('hero') || lower.includes('banner')) return 'marketing';\n if (lower.includes('card') || lower.includes('list') || lower.includes('grid')) return 'content';\n\n return 'general';\n}\n\n// ─── Main Scanner ──────────────────────────────────────────────────────\nfunction parseComponent(\n filePath: string,\n projectPath: string,\n): ComponentInfo | null {\n const content = readFileSafe(filePath);\n if (!content) return null;\n\n const name = extractComponentName(filePath, content);\n const relativePath = path.relative(projectPath, filePath);\n\n return {\n name,\n filePath,\n relativePath,\n category: categorizeComponent(relativePath),\n props: extractProps(content),\n sitecore: extractSitecoreMeta(content),\n dependencies: extractDependencies(content),\n hasTests: checkForTests(filePath, name),\n hasStory: checkForStory(filePath, name),\n hasAiDoc: checkForAiDoc(filePath),\n exportType: extractExportType(content),\n };\n}\n\nexport function scanComponents(projectPath: string): ComponentScanResult {\n const { files, directories } = findComponentFiles(projectPath);\n\n const components: ComponentInfo[] = [];\n\n for (const file of files) {\n const info = parseComponent(file, projectPath);\n if (info) {\n components.push(info);\n }\n }\n\n // Sort by name for consistent output\n components.sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n components,\n totalFiles: files.length,\n directories,\n };\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport { scanComponents } from '../scanner/components.js';\nimport type { ComponentInfo } from '../scanner/components.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logError,\n logInfo,\n fileExists,\n readFileSafe,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface DriftEntry {\n name: string;\n filePath: string;\n documentedProps: string[];\n actualProps: string[];\n documentedFields: string[];\n actualFields: string[];\n missingFromDoc: string[];\n extraInDoc: string[];\n fieldMissingFromDoc: string[];\n fieldExtraInDoc: string[];\n status: 'in-sync' | 'drifted' | 'outdated';\n}\n\n// ─── AI Doc Parsing ─────────────────────────────────────────────────────\nfunction parseAiDocFrontmatter(content: string): {\n props: string[];\n fields: string[];\n} {\n const props: string[] = [];\n const fields: string[] = [];\n\n // Extract YAML frontmatter between --- markers\n const frontmatterMatch = content.match(/^---\\s*\\n([\\s\\S]*?)\\n---/);\n if (!frontmatterMatch) return { props, fields };\n\n const frontmatter = frontmatterMatch[1];\n const lines = frontmatter.split('\\n');\n\n let currentSection: 'none' | 'props' | 'fields' = 'none';\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Detect section headers\n if (/^props\\s*:/i.test(trimmed)) {\n currentSection = 'props';\n continue;\n }\n if (/^(?:fields|sitecore[-_]?fields|datasource[-_]?fields)\\s*:/i.test(trimmed)) {\n currentSection = 'fields';\n continue;\n }\n\n // Any other top-level key resets\n if (/^\\w+\\s*:/.test(trimmed) && !trimmed.startsWith('-')) {\n currentSection = 'none';\n continue;\n }\n\n // Collect list items\n if (currentSection !== 'none' && trimmed.startsWith('-')) {\n const value = trimmed\n .replace(/^-\\s*/, '')\n .replace(/\\s*[:#].*$/, '') // Strip trailing comments/types\n .trim();\n\n if (value) {\n if (currentSection === 'props') props.push(value);\n if (currentSection === 'fields') fields.push(value);\n }\n }\n }\n\n return { props, fields };\n}\n\nfunction findAiDocPath(componentPath: string): string | null {\n const dir = path.dirname(componentPath);\n const base = path.basename(componentPath, '.tsx');\n\n const candidates = [\n path.join(dir, `${base}.ai.md`),\n path.join(dir, 'component.ai.md'),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) return candidate;\n }\n\n return null;\n}\n\n// ─── Drift Analysis ─────────────────────────────────────────────────────\nfunction analyzeDrift(component: ComponentInfo, projectDir: string): DriftEntry | null {\n const aiDocPath = findAiDocPath(component.filePath);\n if (!aiDocPath) return null;\n\n const aiDocContent = readFileSafe(aiDocPath);\n if (!aiDocContent) return null;\n\n const { props: documentedProps, fields: documentedFields } = parseAiDocFrontmatter(aiDocContent);\n const actualProps = component.props.map((p) => p.name);\n const actualFields = component.sitecore.datasourceFields;\n\n // Calculate drift for props\n const missingFromDoc = actualProps.filter((p) => !documentedProps.includes(p));\n const extraInDoc = documentedProps.filter((p) => !actualProps.includes(p));\n\n // Calculate drift for Sitecore fields\n const fieldMissingFromDoc = actualFields.filter((f) => !documentedFields.includes(f));\n const fieldExtraInDoc = documentedFields.filter((f) => !actualFields.includes(f));\n\n const hasPropDrift = missingFromDoc.length > 0 || extraInDoc.length > 0;\n const hasFieldDrift = fieldMissingFromDoc.length > 0 || fieldExtraInDoc.length > 0;\n\n let status: DriftEntry['status'];\n if (!hasPropDrift && !hasFieldDrift) {\n status = 'in-sync';\n } else if (extraInDoc.length > 0 || fieldExtraInDoc.length > 0) {\n // Doc mentions things that no longer exist in code\n status = 'outdated';\n } else {\n status = 'drifted';\n }\n\n return {\n name: component.name,\n filePath: component.relativePath,\n documentedProps,\n actualProps,\n documentedFields,\n actualFields,\n missingFromDoc,\n extraInDoc,\n fieldMissingFromDoc,\n fieldExtraInDoc,\n status,\n };\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function driftCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n const configPath = path.join(projectDir, AI_KIT_CONFIG_FILE);\n\n console.log('');\n logSection('AI Kit — Component Drift Detector');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check: config must exist\n if (!fileExists(configPath)) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Scan components\n const spinner = ora('Scanning components...').start();\n const scanResult = scanComponents(projectDir);\n\n if (scanResult.components.length === 0) {\n spinner.fail('No components found.');\n return;\n }\n\n // Filter to components with .ai.md files\n const componentsWithDocs = scanResult.components.filter((c) => c.hasAiDoc);\n\n if (componentsWithDocs.length === 0) {\n spinner.warn('No components have .ai.md documentation files.');\n logInfo('Run `ai-kit generate` to create component documentation.');\n console.log('');\n return;\n }\n\n spinner.text = `Analyzing drift for ${componentsWithDocs.length} documented components...`;\n\n // Analyze each component\n const entries: DriftEntry[] = [];\n\n for (const component of componentsWithDocs) {\n const entry = analyzeDrift(component, projectDir);\n if (entry) {\n entries.push(entry);\n }\n }\n\n spinner.succeed(`Analyzed ${entries.length} components with .ai.md docs`);\n\n // Sort: drifted/outdated first, then in-sync\n const statusOrder: Record<string, number> = { outdated: 0, drifted: 1, 'in-sync': 2 };\n entries.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);\n\n // Count summaries\n const inSync = entries.filter((e) => e.status === 'in-sync');\n const drifted = entries.filter((e) => e.status === 'drifted');\n const outdated = entries.filter((e) => e.status === 'outdated');\n\n // Display table\n console.log('');\n const nameWidth = 28;\n const docPropsWidth = 12;\n const actPropsWidth = 12;\n const statusWidth = 12;\n\n // Header\n console.log(\n ` ${chalk.bold('Component'.padEnd(nameWidth))} ${chalk.bold('Doc Props'.padStart(docPropsWidth))} ${chalk.bold('Act Props'.padStart(actPropsWidth))} ${chalk.bold('Status'.padEnd(statusWidth))}`,\n );\n console.log(\n ` ${'─'.repeat(nameWidth)} ${'─'.repeat(docPropsWidth)} ${'─'.repeat(actPropsWidth)} ${'─'.repeat(statusWidth)}`,\n );\n\n for (const entry of entries) {\n const name = entry.name.length > nameWidth - 1\n ? entry.name.substring(0, nameWidth - 3) + '...'\n : entry.name.padEnd(nameWidth);\n\n const docProps = String(entry.documentedProps.length).padStart(docPropsWidth);\n const actProps = String(entry.actualProps.length).padStart(actPropsWidth);\n\n let statusLabel: string;\n switch (entry.status) {\n case 'in-sync':\n statusLabel = chalk.green('in-sync');\n break;\n case 'drifted':\n statusLabel = chalk.yellow('drifted');\n break;\n case 'outdated':\n statusLabel = chalk.red('outdated');\n break;\n }\n\n console.log(` ${name} ${docProps} ${actProps} ${statusLabel}`);\n\n // Show details for drifted/outdated\n if (entry.status !== 'in-sync') {\n if (entry.missingFromDoc.length > 0) {\n console.log(\n chalk.dim(` + undocumented props: ${entry.missingFromDoc.join(', ')}`),\n );\n }\n if (entry.extraInDoc.length > 0) {\n console.log(\n chalk.dim(` - removed props (still in doc): ${entry.extraInDoc.join(', ')}`),\n );\n }\n if (entry.fieldMissingFromDoc.length > 0) {\n console.log(\n chalk.dim(` + undocumented fields: ${entry.fieldMissingFromDoc.join(', ')}`),\n );\n }\n if (entry.fieldExtraInDoc.length > 0) {\n console.log(\n chalk.dim(` - removed fields (still in doc): ${entry.fieldExtraInDoc.join(', ')}`),\n );\n }\n }\n }\n\n // Summary\n console.log('');\n console.log(\n ` ${chalk.bold('Summary:')} ${chalk.green(String(inSync.length))} in-sync · ${chalk.yellow(String(drifted.length))} drifted · ${chalk.red(String(outdated.length))} outdated`,\n );\n console.log(\n chalk.dim(` ${scanResult.components.length} total components, ${componentsWithDocs.length} with .ai.md, ${scanResult.components.length - componentsWithDocs.length} undocumented`),\n );\n\n if (drifted.length > 0 || outdated.length > 0) {\n console.log('');\n logWarning('Run `ai-kit generate` to update .ai.md files for drifted components.');\n }\n\n console.log('');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { AI_KIT_CONFIG_FILE } from '../constants.js';\nimport { scanComponents } from '../scanner/components.js';\nimport { calculateHealthScore } from '../generator/component-docs.js';\nimport {\n logSection,\n logSuccess,\n logWarning,\n logInfo,\n fileExists,\n} from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\ninterface RegistryEntry {\n name: string;\n path: string;\n category: string;\n props: { name: string; type: string; required: boolean }[];\n exportType: 'default' | 'named' | 'both';\n dependencies: string[];\n sitecore: {\n datasourceFields: string[];\n renderingParams: string[];\n placeholders: string[];\n };\n health: {\n score: number;\n hasTests: boolean;\n hasStory: boolean;\n hasAiDoc: boolean;\n };\n}\n\ninterface ComponentRegistry {\n version: string;\n generatedAt: string;\n projectName: string;\n totalComponents: number;\n categories: Record<string, number>;\n components: RegistryEntry[];\n}\n\n// ─── Main Command ──────────────────────────────────────────────────────\nexport async function componentRegistryCommand(targetPath?: string): Promise<void> {\n const projectDir = path.resolve(targetPath || process.cwd());\n\n console.log('');\n logSection('AI Kit — Component Registry');\n console.log(chalk.dim(` ${projectDir}`));\n console.log('');\n\n // Pre-check\n if (!fileExists(path.join(projectDir, AI_KIT_CONFIG_FILE))) {\n logWarning('ai-kit.config.json not found. Run `ai-kit init` first.');\n return;\n }\n\n // Scan components\n const spinner = ora('Scanning components...').start();\n const scanResult = scanComponents(projectDir);\n\n if (scanResult.components.length === 0) {\n spinner.fail('No components found.');\n return;\n }\n\n spinner.succeed(`Found ${scanResult.components.length} components in ${scanResult.directories.length} directories`);\n\n // Build registry\n const entries: RegistryEntry[] = scanResult.components.map((c) => ({\n name: c.name,\n path: c.relativePath,\n category: c.category,\n props: c.props,\n exportType: c.exportType,\n dependencies: c.dependencies,\n sitecore: {\n datasourceFields: c.sitecore.datasourceFields,\n renderingParams: c.sitecore.renderingParams,\n placeholders: c.sitecore.placeholders,\n },\n health: {\n score: calculateHealthScore(c),\n hasTests: c.hasTests,\n hasStory: c.hasStory,\n hasAiDoc: c.hasAiDoc,\n },\n }));\n\n // Calculate category counts\n const categories: Record<string, number> = {};\n for (const entry of entries) {\n categories[entry.category] = (categories[entry.category] || 0) + 1;\n }\n\n const pkgPath = path.join(projectDir, 'package.json');\n const pkg = fs.readJsonSync(pkgPath, { throws: false }) || {};\n\n const registry: ComponentRegistry = {\n version: '1.0.0',\n generatedAt: new Date().toISOString(),\n projectName: (pkg.name as string) || path.basename(projectDir),\n totalComponents: entries.length,\n categories,\n components: entries,\n };\n\n // Write registry\n const outputPath = path.join(projectDir, 'ai-kit', 'component-registry.json');\n await fs.ensureDir(path.dirname(outputPath));\n await fs.writeJson(outputPath, registry, { spaces: 2 });\n\n // Also generate a markdown summary for AI context\n const mdPath = path.join(projectDir, 'ai-kit', 'component-registry.md');\n const md = generateRegistryMarkdown(registry);\n await fs.writeFile(mdPath, md, 'utf-8');\n\n // Display summary\n console.log('');\n console.log(` ${chalk.bold('Categories:')}`);\n for (const [cat, count] of Object.entries(categories).sort((a, b) => b[1] - a[1])) {\n console.log(` ${chalk.cyan(String(count).padStart(3))} ${cat}`);\n }\n\n // Health summary\n const avgHealth = Math.round(entries.reduce((sum, e) => sum + e.health.score, 0) / entries.length);\n const withTests = entries.filter((e) => e.health.hasTests).length;\n const withStories = entries.filter((e) => e.health.hasStory).length;\n const withDocs = entries.filter((e) => e.health.hasAiDoc).length;\n\n console.log('');\n console.log(` ${chalk.bold('Health:')}`);\n console.log(` Average score: ${chalk.cyan(String(avgHealth))}/100`);\n console.log(` With tests: ${chalk.cyan(String(withTests))}/${entries.length}`);\n console.log(` With stories: ${chalk.cyan(String(withStories))}/${entries.length}`);\n console.log(` With .ai.md docs: ${chalk.cyan(String(withDocs))}/${entries.length}`);\n\n console.log('');\n logSuccess(`Registry written to ${chalk.cyan('ai-kit/component-registry.json')}`);\n logSuccess(`Summary written to ${chalk.cyan('ai-kit/component-registry.md')}`);\n logInfo('AI agents can use this registry to discover existing components before creating new ones.');\n console.log('');\n}\n\n// ─── Markdown Generation ────────────────────────────────────────────────\nfunction generateRegistryMarkdown(registry: ComponentRegistry): string {\n const lines: string[] = [\n '# Component Registry',\n '',\n `> Auto-generated by ai-kit on ${registry.generatedAt.split('T')[0]}`,\n `> ${registry.totalComponents} components in ${registry.projectName}`,\n '',\n '## How to Use',\n '',\n 'Before creating a new component, check this registry to see if one already exists.',\n 'AI agents should reference this file to avoid duplicating components.',\n '',\n ];\n\n // Group by category\n const grouped = new Map<string, typeof registry.components>();\n for (const comp of registry.components) {\n const list = grouped.get(comp.category) || [];\n list.push(comp);\n grouped.set(comp.category, list);\n }\n\n for (const [category, components] of grouped) {\n lines.push(`## ${category.charAt(0).toUpperCase() + category.slice(1)} (${components.length})`);\n lines.push('');\n lines.push('| Component | Path | Props | Tests | Story | Health |');\n lines.push('|-----------|------|-------|-------|-------|--------|');\n\n for (const comp of components) {\n const propsCount = comp.props.length;\n const tests = comp.health.hasTests ? 'Yes' : 'No';\n const story = comp.health.hasStory ? 'Yes' : 'No';\n const health = `${comp.health.score}/100`;\n lines.push(`| ${comp.name} | \\`${comp.path}\\` | ${propsCount} | ${tests} | ${story} | ${health} |`);\n }\n\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n","import path from 'path';\nimport fs from 'fs-extra';\nimport type { ComponentInfo, ComponentScanResult } from '../scanner/components.js';\nimport { readFileSafe } from '../utils.js';\n\n// ─── Types ─────────────────────────────────────────────────────────────\nexport interface ComponentDocOptions {\n confluenceBaseUrl?: string;\n overwrite?: boolean;\n}\n\n// ─── Health Score ──────────────────────────────────────────────────────\nfunction calculateHealthScore(component: ComponentInfo): number {\n let score = 0;\n const max = 100;\n\n // Has props documented (auto-extracted) — 15 points\n if (component.props.length > 0) score += 15;\n\n // Has tests — 25 points\n if (component.hasTests) score += 25;\n\n // Has Storybook story — 20 points\n if (component.hasStory) score += 20;\n\n // Has existing AI doc — 15 points\n if (component.hasAiDoc) score += 15;\n\n // Has Sitecore integration documented — 10 points\n const sc = component.sitecore;\n if (sc.datasourceFields.length > 0 || sc.renderingParams.length > 0 || sc.placeholders.length > 0) {\n score += 10;\n }\n\n // Has dependencies mapped — 5 points\n if (component.dependencies.length > 0) score += 5;\n\n // Has clear export — 10 points\n if (component.exportType === 'default' || component.exportType === 'both') score += 10;\n\n return Math.min(score, max);\n}\n\n// ─── Frontmatter Generation ───────────────────────────────────────────\nfunction generateFrontmatter(component: ComponentInfo): string {\n const health = calculateHealthScore(component);\n const today = new Date().toISOString().slice(0, 10);\n\n let yaml = '---\\n';\n yaml += `name: ${component.name}\\n`;\n yaml += `category: ${component.category}\\n`;\n yaml += `path: ${component.relativePath}\\n`;\n yaml += 'confluence_spec: \"\"\\n';\n\n // Sitecore section (only if Sitecore-related)\n const sc = component.sitecore;\n const hasSitecore = sc.usesContext || sc.datasourceFields.length > 0 ||\n sc.renderingParams.length > 0 || sc.placeholders.length > 0;\n\n if (hasSitecore) {\n yaml += 'sitecore:\\n';\n if (sc.datasourceFields.length > 0) {\n yaml += ` datasource_fields: [${sc.datasourceFields.join(', ')}]\\n`;\n }\n if (sc.renderingParams.length > 0) {\n yaml += ` rendering_params: [${sc.renderingParams.join(', ')}]\\n`;\n }\n if (sc.placeholders.length > 0) {\n yaml += ` placeholders: [${sc.placeholders.join(', ')}]\\n`;\n }\n if (sc.graphqlQueries.length > 0) {\n yaml += ` graphql_queries: [${sc.graphqlQueries.join(', ')}]\\n`;\n }\n yaml += ` uses_context: ${sc.usesContext}\\n`;\n }\n\n // Health section\n yaml += 'health:\\n';\n yaml += ` has_tests: ${component.hasTests}\\n`;\n yaml += ` has_story: ${component.hasStory}\\n`;\n yaml += ` has_spec: false\\n`;\n yaml += ` score: ${health}\\n`;\n\n yaml += `last_modified: ${today}\\n`;\n yaml += '---';\n\n return yaml;\n}\n\n// ─── Props Table ──────────────────────────────────────────────────────\nfunction generatePropsTable(component: ComponentInfo): string {\n if (component.props.length === 0) {\n return '| Prop | Type | Required | Description |\\n|------|------|----------|-------------|\\n| — | — | — | No props detected. Add props interface to component. |';\n }\n\n let table = '| Prop | Type | Required | Description |\\n';\n table += '|------|------|----------|-------------|\\n';\n\n for (const prop of component.props) {\n const required = prop.required ? 'Yes' : 'No';\n table += `| ${prop.name} | \\`${prop.type}\\` | ${required} | <!-- TODO: Add description --> |\\n`;\n }\n\n return table;\n}\n\n// ─── Sitecore Section ─────────────────────────────────────────────────\nfunction generateSitecoreSection(component: ComponentInfo): string {\n const sc = component.sitecore;\n const hasSitecore = sc.usesContext || sc.datasourceFields.length > 0 ||\n sc.renderingParams.length > 0 || sc.placeholders.length > 0;\n\n if (!hasSitecore) return '';\n\n let section = '\\n## Sitecore Integration\\n\\n';\n\n if (sc.datasourceFields.length > 0) {\n section += '**Datasource Fields:**\\n';\n for (const field of sc.datasourceFields) {\n section += `- \\`${field}\\` — <!-- TODO: Field type (Single-Line Text, Rich Text, Image, etc.) -->\\n`;\n }\n section += '\\n';\n }\n\n if (sc.renderingParams.length > 0) {\n section += '**Rendering Parameters:**\\n';\n for (const param of sc.renderingParams) {\n section += `- \\`${param}\\` — <!-- TODO: Parameter type and allowed values -->\\n`;\n }\n section += '\\n';\n }\n\n if (sc.placeholders.length > 0) {\n section += '**Placeholders:**\\n';\n for (const ph of sc.placeholders) {\n section += `- \\`${ph}\\` — <!-- TODO: Allowed renderings -->\\n`;\n }\n section += '\\n';\n }\n\n if (sc.graphqlQueries.length > 0) {\n section += '**GraphQL Queries:**\\n';\n for (const query of sc.graphqlQueries) {\n section += `- \\`${query}\\`\\n`;\n }\n section += '\\n';\n }\n\n if (sc.usesContext) {\n section += '> Uses `useSitecoreContext` — this component accesses page-level Sitecore context.\\n\\n';\n }\n\n return section;\n}\n\n// ─── Dependencies Section ─────────────────────────────────────────────\nfunction generateDependenciesSection(component: ComponentInfo): string {\n if (component.dependencies.length === 0) return '';\n\n let section = '\\n## Dependencies\\n\\n';\n section += '**Uses these components:**\\n';\n for (const dep of component.dependencies) {\n section += `- \\`${dep}\\`\\n`;\n }\n section += '\\n';\n\n return section;\n}\n\n// ─── Full Document ────────────────────────────────────────────────────\nexport function generateComponentDoc(component: ComponentInfo): string {\n const today = new Date().toISOString().slice(0, 10);\n\n let doc = generateFrontmatter(component);\n doc += '\\n\\n';\n doc += `# ${component.name}\\n\\n`;\n doc += '> <!-- TODO: Brief description of what this component does and when to use it. -->\\n\\n';\n\n // Props\n doc += '## Props\\n\\n';\n doc += generatePropsTable(component);\n doc += '\\n';\n\n // Usage\n doc += '\\n## Usage\\n\\n';\n doc += '```tsx\\n';\n if (component.exportType === 'default') {\n doc += `import ${component.name} from './${component.name}';\\n`;\n } else {\n doc += `import { ${component.name} } from './${component.name}';\\n`;\n }\n doc += '\\n';\n doc += `<${component.name} />\\n`;\n doc += '```\\n';\n\n // Sitecore\n doc += generateSitecoreSection(component);\n\n // Dependencies\n doc += generateDependenciesSection(component);\n\n // States\n doc += '\\n## States\\n\\n';\n doc += '- **Loading**: <!-- How does it look while data is loading? -->\\n';\n doc += '- **Error**: <!-- What does the user see on failure? -->\\n';\n doc += '- **Empty**: <!-- What if there\\'s no data? -->\\n';\n\n // Confluence spec notes\n doc += '\\n## Confluence Spec Notes\\n\\n';\n doc += '> Link the functional spec in the `confluence_spec` frontmatter field above.\\n';\n doc += '> Then add key requirements, accepted variants, and deferred items here.\\n\\n';\n doc += '- <!-- TODO: Key requirement from spec -->\\n';\n\n // Design decisions\n doc += '\\n## Design Decisions\\n\\n';\n doc += '- <!-- TODO: Why was this built this way? Note any trade-offs. -->\\n';\n\n // Edge cases\n doc += '\\n## Edge Cases\\n\\n';\n doc += '- <!-- TODO: List known edge cases and how they\\'re handled. -->\\n';\n\n // Change log\n doc += '\\n## Change Log\\n\\n';\n doc += `- ${today}: AI doc generated by ai-kit scan-components\\n`;\n\n return doc;\n}\n\n// ─── Merge Logic ──────────────────────────────────────────────────────\nconst AI_DOC_MARKER_START = '<!-- AI-KIT:COMPONENT-START -->';\nconst AI_DOC_MARKER_END = '<!-- AI-KIT:COMPONENT-END -->';\n\nfunction mergeExistingDoc(existing: string, component: ComponentInfo): string {\n // If the existing doc has our markers, update only the auto-generated section\n if (existing.includes(AI_DOC_MARKER_START) && existing.includes(AI_DOC_MARKER_END)) {\n const beforeStart = existing.indexOf(AI_DOC_MARKER_START);\n const afterEnd = existing.indexOf(AI_DOC_MARKER_END) + AI_DOC_MARKER_END.length;\n\n const before = existing.substring(0, beforeStart);\n const after = existing.substring(afterEnd);\n\n const autoSection = generateAutoSection(component);\n return `${before}${AI_DOC_MARKER_START}\\n${autoSection}\\n${AI_DOC_MARKER_END}${after}`;\n }\n\n // If no markers, preserve the entire existing document — don't overwrite manual work\n return existing;\n}\n\nfunction generateAutoSection(component: ComponentInfo): string {\n const today = new Date().toISOString().slice(0, 10);\n let section = `<!-- Auto-updated by ai-kit on ${today} -->\\n`;\n\n // Update frontmatter-style metadata as comments\n section += `<!-- health_score: ${calculateHealthScore(component)} -->\\n`;\n section += `<!-- has_tests: ${component.hasTests} -->\\n`;\n section += `<!-- has_story: ${component.hasStory} -->\\n`;\n section += `<!-- props_count: ${component.props.length} -->\\n`;\n\n if (component.sitecore.datasourceFields.length > 0) {\n section += `<!-- sitecore_fields: ${component.sitecore.datasourceFields.join(', ')} -->\\n`;\n }\n if (component.sitecore.renderingParams.length > 0) {\n section += `<!-- sitecore_params: ${component.sitecore.renderingParams.join(', ')} -->\\n`;\n }\n\n return section;\n}\n\n// ─── Write Component Docs ─────────────────────────────────────────────\nexport async function writeComponentDocs(\n projectPath: string,\n scanResult: ComponentScanResult,\n options: ComponentDocOptions = {},\n): Promise<{ created: string[]; updated: string[]; skipped: string[] }> {\n const created: string[] = [];\n const updated: string[] = [];\n const skipped: string[] = [];\n\n for (const component of scanResult.components) {\n const dir = path.dirname(component.filePath);\n const docFileName = `${component.name}.ai.md`;\n const docPath = path.join(dir, docFileName);\n\n const existing = readFileSafe(docPath);\n\n if (existing) {\n if (options.overwrite) {\n // Full overwrite\n const content = generateComponentDoc(component);\n await fs.writeFile(docPath, content, 'utf-8');\n updated.push(component.name);\n } else {\n // Smart merge — update auto-generated parts, preserve manual edits\n const merged = mergeExistingDoc(existing, component);\n if (merged !== existing) {\n await fs.writeFile(docPath, merged, 'utf-8');\n updated.push(component.name);\n } else {\n skipped.push(component.name);\n }\n }\n } else {\n // Create new doc\n const content = generateComponentDoc(component);\n await fs.writeFile(docPath, content, 'utf-8');\n created.push(component.name);\n }\n }\n\n return { created, updated, skipped };\n}\n\n// ─── Export health calculator for registry ─────────────────────────────\nexport { calculateHealthScore };\n"],"mappings":"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","names":["path","fs","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","path","detectDesignTokens","path","path","fs","path","fs","path","path","path","detectDesignTokens","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","path","fs","ora","confirm","path","confirm","ora","fs","path","fs","confirm","path","confirm","fs","path","fs","chalk","ora","path","fs","chalk","ora","path","chalk","ora","path","ora","chalk","path","fs","chalk","ora","path","chalk","ora","generate","fs","path","fs","ora","select","path","select","ora","fmt","fs","path","chalk","path","chalk","path","fs","chalk","path","settings","fs","chalk","gradeColor","path","fs","chalk","ora","chalk","progressBar","path","fs","ora","path","fs","chalk","ora","fs","path","chalk","ora","lines","path","fs","chalk","ora","path","fs","path","fs","IGNORE_DIRS","fs","path","chalk","ora","path","fs","chalk","ora","path","fs","chalk","ora","path","fs","chalk","ora","fs","path","chalk","ora","fs"]}