@mikulgohil/ai-kit 1.2.1 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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"],"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';\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.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.2.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' | 'sitecore-jss' | 'none';\n sitecorejssVersion?: 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 if (contentSdk || jssNextjs) {\n const version = (contentSdk || 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 techStack.push(\n scan.cms === 'sitecore-xmc'\n ? `Sitecore XM Cloud${scan.sitecorejssVersion ? ` (JSS ${scan.sitecorejssVersion})` : ''}`\n : '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(scan.cms === 'sitecore-xmc' ? 'Sitecore XM Cloud' : 'Sitecore JSS');\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 // --- 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 '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 '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];\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\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'\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"],"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"]}
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"],"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';\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.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.3.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 // --- 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"],"mappings":";;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,qBAAqB;AAC9B,OAAO,UAAU;AAEjB,IAAM,aAAa,cAAc,YAAY,GAAG;AAChD,IAAM,YAAY,KAAK,QAAQ,UAAU;AAElC,IAAM,eAAe,KAAK,QAAQ,WAAW,IAAI;AACjD,IAAM,gBAAgB,KAAK,KAAK,cAAc,WAAW;AACzD,IAAM,eAAe,KAAK,KAAK,cAAc,UAAU;AACvD,IAAM,aAAa,KAAK,KAAK,cAAc,QAAQ;AACnD,IAAM,qBAAqB,KAAK,KAAK,cAAc,gBAAgB;AACnE,IAAM,aAAa,KAAK,KAAK,cAAc,QAAQ;AACnD,IAAM,eAAe,KAAK,KAAK,cAAc,UAAU;AAEvD,IAAM,UAAU;AAGhB,IAAM,qBAAqB;AAE3B,IAAM,kBAAkB;AAAA,EAC7B,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc;AAChB;AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACzCA,OAAOA,YAAU;AACjB,OAAOC,SAAQ;AACf,SAAS,QAAQ,eAAsB;AACvC,OAAO,SAAS;;;ACHhB,OAAOC,YAAU;;;ACAjB,OAAO,QAAQ;AAEf,OAAO,WAAW;AAEX,SAAS,aACd,UACU;AACV,MAAI;AACF,WAAO,GAAG,aAAa,QAAQ;AAAA,EACjC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,WAAW,UAA2B;AACpD,SAAO,GAAG,WAAW,QAAQ;AAC/B;AAEO,SAAS,UAAU,SAA0B;AAClD,MAAI;AACF,WAAO,GAAG,SAAS,OAAO,EAAE,YAAY;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,aAAa,UAAiC;AAC5D,MAAI;AACF,WAAO,GAAG,aAAa,UAAU,OAAO;AAAA,EAC1C,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMO,SAAS,WAAW,SAAuB;AAChD,UAAQ,IAAI,MAAM,MAAM,QAAG,IAAI,MAAM,OAAO;AAC9C;AAEO,SAAS,WAAW,SAAuB;AAChD,UAAQ,IAAI,MAAM,OAAO,QAAG,IAAI,MAAM,OAAO;AAC/C;AAEO,SAAS,SAAS,SAAuB;AAC9C,UAAQ,IAAI,MAAM,IAAI,QAAG,IAAI,MAAM,OAAO;AAC5C;AAEO,SAAS,QAAQ,SAAuB;AAC7C,UAAQ,IAAI,MAAM,KAAK,QAAG,IAAI,MAAM,OAAO;AAC7C;AAEO,SAAS,WAAW,OAAqB;AAC9C,UAAQ,IAAI,OAAO,MAAM,KAAK,UAAU,KAAK,CAAC;AAChD;AAMA,IAAM,eAAe;AACrB,IAAM,aAAa;AAEZ,SAAS,iBACd,iBACA,cACQ;AACR,QAAM,WAAW,gBAAgB,QAAQ,YAAY;AACrD,QAAM,SAAS,gBAAgB,QAAQ,UAAU;AAEjD,MAAI,aAAa,MAAM,WAAW,IAAI;AAGpC,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,gBAAgB,UAAU,GAAG,QAAQ;AACpD,QAAM,QAAQ,gBAAgB,UAAU,SAAS,WAAW,MAAM;AAElE,SAAO,GAAG,MAAM,GAAG,YAAY,GAAG,KAAK;AACzC;;;AClFA,OAAOC,WAAU;AASV,SAAS,aACd,aACA,KACc;AACd,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,MAAI,CAAC,KAAK,MAAM;AACd,QAAI,KAAK,MAAO,QAAO,EAAE,WAAW,QAAQ;AAC5C,WAAO,EAAE,WAAW,UAAU;AAAA,EAChC;AAEA,QAAM,gBAAgB,KAAK,KAAK,QAAQ,aAAa,EAAE;AAEvD,QAAM,YACJ,UAAUC,MAAK,KAAK,aAAa,KAAK,CAAC,KACvC,UAAUA,MAAK,KAAK,aAAa,OAAO,KAAK,CAAC;AAEhD,QAAM,cACJ,UAAUA,MAAK,KAAK,aAAa,OAAO,CAAC,KACzC,UAAUA,MAAK,KAAK,aAAa,OAAO,OAAO,CAAC;AAElD,MAAI;AACJ,MAAI,aAAa,YAAa,cAAa;AAAA,WAClC,UAAW,cAAa;AAAA,WACxB,YAAa,cAAa;AAEnC,SAAO,EAAE,WAAW,UAAU,eAAe,WAAW;AAC1D;;;ACjCO,SAAS,eAAe,KAA8C;AAC3E,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,QAAM,YAAY,KAAK,mCAAmC;AAC1D,QAAM,WAAW,KAAK,kCAAkC;AACxD,QAAM,aAAa,KAAK,8BAA8B;AAGtD,MAAI,YAAY;AACd,UAAM,UAAU,WAAW,QAAQ,aAAa,EAAE;AAClD,WAAO;AAAA,MACL,KAAK;AAAA,MACL,2BAA2B,WAAW;AAAA,IACxC;AAAA,EACF;AAGA,MAAI,WAAW;AACb,UAAM,UAAU,UAAU,QAAQ,aAAa,EAAE;AACjD,WAAO,EAAE,KAAK,gBAAgB,oBAAoB,WAAW,OAAU;AAAA,EACzE;AAEA,MAAI,UAAU;AACZ,UAAM,UAAU,SAAS,QAAQ,aAAa,EAAE;AAChD,WAAO,EAAE,KAAK,gBAAgB,oBAAoB,WAAW,OAAU;AAAA,EACzE;AAEA,SAAO,EAAE,KAAK,OAAO;AACvB;;;ACrCA,OAAOC,WAAU;AAUV,SAAS,cACd,aACA,KACe;AACf,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,QAAM,UAAyB,CAAC;AAChC,MAAI;AAEJ,MAAI,KAAK,eAAe,KAAK,sBAAsB,GAAG;AACpD,YAAQ,KAAK,UAAU;AACvB,uBAAmB,KAAK,eAAe,KAAK,sBAAsB,KAAK,IACpE,QAAQ,aAAa,EAAE;AAAA,EAC5B;AAEA,QAAM,oBACJ,WAAWC,MAAK,KAAK,aAAa,oBAAoB,CAAC,KACvD,WAAWA,MAAK,KAAK,aAAa,oBAAoB,CAAC,KACvD,WAAWA,MAAK,KAAK,aAAa,qBAAqB,CAAC;AAE1D,MAAI,qBAAqB,CAAC,QAAQ,SAAS,UAAU,GAAG;AACtD,YAAQ,KAAK,UAAU;AAAA,EACzB;AAEA,MAAI,KAAK,mBAAmB,EAAG,SAAQ,KAAK,mBAAmB;AAC/D,MAAI,KAAK,QAAQ,KAAK,WAAW,EAAG,SAAQ,KAAK,MAAM;AAEvD,SAAO;AAAA,IACL;AAAA,IACA,iBAAiB,mBAAmB;AAAA,EACtC;AACF;;;AC5CA,OAAOC,WAAU;AAQV,SAAS,iBAAiB,aAAuC;AACtE,QAAM,eAAeC,MAAK,KAAK,aAAa,eAAe;AAE3D,MAAI,CAAC,WAAW,YAAY,GAAG;AAC7B,WAAO,EAAE,YAAY,MAAM;AAAA,EAC7B;AAEA,QAAM,WAAW,aAEd,YAAY;AAEf,SAAO;AAAA,IACL,YAAY;AAAA,IACZ,kBAAkB,UAAU,iBAAiB,UAAU;AAAA,EACzD;AACF;;;ACvBA,OAAOC,WAAU;AAUV,SAAS,eACd,aACA,KACgB;AAChB,MAAI,WAAWC,MAAK,KAAK,aAAa,YAAY,CAAC,GAAG;AACpD,WAAO,EAAE,UAAU,MAAM,cAAc,YAAY;AAAA,EACrD;AAEA,MAAI,WAAWA,MAAK,KAAK,aAAa,SAAS,CAAC,GAAG;AACjD,WAAO,EAAE,UAAU,MAAM,cAAc,KAAK;AAAA,EAC9C;AAEA,MAAI,WAAWA,MAAK,KAAK,aAAa,YAAY,CAAC,GAAG;AACpD,WAAO,EAAE,UAAU,MAAM,cAAc,QAAQ;AAAA,EACjD;AAEA,MAAI,WAAWA,MAAK,KAAK,aAAa,qBAAqB,CAAC,GAAG;AAC7D,WAAO,EAAE,UAAU,MAAM,cAAc,kBAAkB;AAAA,EAC3D;AAEA,MAAI,IAAI,YAAY;AAClB,WAAO,EAAE,UAAU,KAAK;AAAA,EAC1B;AAEA,SAAO,EAAE,UAAU,MAAM;AAC3B;;;ACnCA,OAAOC,WAAU;AAKV,SAAS,qBAAqB,aAAqC;AACxE,QAAM,MAAM;AAAA,IACVC,MAAK,KAAK,aAAa,cAAc;AAAA,EACvC;AAEA,MAAI,KAAK,gBAAgB;AACvB,QAAI,IAAI,eAAe,WAAW,MAAM,EAAG,QAAO;AAClD,QAAI,IAAI,eAAe,WAAW,MAAM,EAAG,QAAO;AAClD,QAAI,IAAI,eAAe,WAAW,KAAK,EAAG,QAAO;AACjD,WAAO;AAAA,EACT;AAEA,MAAI,WAAWA,MAAK,KAAK,aAAa,gBAAgB,CAAC,EAAG,QAAO;AACjE,MAAI,WAAWA,MAAK,KAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAC5D,MAAI,WAAWA,MAAK,KAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAC5D,MAAI,WAAWA,MAAK,KAAK,aAAa,UAAU,CAAC,EAAG,QAAO;AAE3D,SAAO;AACT;;;ACvBA,OAAOC,WAAU;AAWV,SAAS,YACd,aACA,KACgB;AAChB,SAAO;AAAA,IACL,UAAU,eAAe,WAAW;AAAA,IACpC,cAAc,mBAAmB,GAAG;AAAA,IACpC,cAAc,mBAAmB,WAAW;AAAA,IAC5C,aAAa,kBAAkB,WAAW;AAAA,IAC1C,aAAa,kBAAkB,aAAa,GAAG;AAAA,EACjD;AACF;AAEA,SAAS,eAAe,aAA8B;AAEpD,QAAM,gBAAgB;AAAA,IACpBC,MAAK,KAAK,aAAa,WAAW,eAAe;AAAA,IACjDA,MAAK,KAAK,aAAa,WAAW,qBAAqB;AAAA,IACvDA,MAAK,KAAK,aAAa,WAAW;AAAA,EACpC;AAEA,aAAW,gBAAgB,eAAe;AACxC,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,WAAW,QAAQ,YAAY,EAAE,SAAS,OAAO,GAAG;AACtD,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAuC;AACjE,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,SAAO,OAAO,KAAK,IAAI,EAAE;AAAA,IACvB,CAAC,QAAQ,IAAI,WAAW,cAAc,KAAK,QAAQ;AAAA,EACrD;AACF;AAEA,SAAS,mBAAmB,aAA8B;AACxD,QAAM,aAAa;AAAA,IACjBA,MAAK,KAAK,aAAa,aAAa;AAAA,IACpCA,MAAK,KAAK,aAAa,QAAQ;AAAA,IAC/BA,MAAK,KAAK,aAAa,oBAAoB;AAAA,IAC3CA,MAAK,KAAK,aAAa,OAAO,QAAQ;AAAA,EACxC;AAEA,aAAW,aAAa,YAAY;AAClC,QAAI,WAAW,SAAS,EAAG,QAAO;AAAA,EACpC;AAGA,QAAM,aAAa;AAAA,IACjBA,MAAK,KAAK,aAAa,OAAO,OAAO,aAAa;AAAA,EACpD;AACA,MAAI,cAAc,WAAW,SAAS,QAAQ,EAAG,QAAO;AAExD,SAAO;AACT;AAEA,SAAS,kBACP,aAC+B;AAE/B,QAAM,aAAa;AAAA,IACjBA,MAAK,KAAK,aAAa,OAAO,OAAO,aAAa;AAAA,EACpD;AACA,MAAI,cAAc,WAAW,SAAS,QAAQ,EAAG,QAAO;AAGxD,QAAM,gBAAgB;AAAA,IACpBA,MAAK,KAAK,aAAa,oBAAoB;AAAA,IAC3CA,MAAK,KAAK,aAAa,oBAAoB;AAAA,EAC7C;AAEA,aAAW,UAAU,eAAe;AAClC,UAAM,UAAU,aAAa,MAAM;AACnC,QAAI,WAAW,QAAQ,SAAS,OAAO,EAAG,QAAO;AAAA,EACnD;AAGA,MAAI,cAAc,WAAW,SAAS,IAAI,EAAG,QAAO;AAEpD,SAAO;AACT;AAEA,SAAS,kBACP,aACA,KACS;AACT,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,QAAM,gBAAgB,sBAAsB,QAAQ,gBAAgB;AACpE,QAAM,sBACJ,WAAWA,MAAK,KAAK,aAAa,sBAAsB,CAAC,KACzD,WAAWA,MAAK,KAAK,aAAa,sBAAsB,CAAC;AAE3D,SAAO,iBAAiB;AAC1B;;;ACnHA,OAAOC,WAAU;AAeV,SAAS,YACd,aACA,KACgB;AAChB,QAAM,OAAO;AAAA,IACX,GAAI,IAAI;AAAA,IACR,GAAI,IAAI;AAAA,EACV;AAEA,SAAO;AAAA,IACL,YAAY,iBAAiB,aAAa,IAAI;AAAA,IAC9C,WAAW,gBAAgB,aAAa,IAAI;AAAA,IAC5C,QAAQ,aAAa,aAAa,IAAI;AAAA,IACtC,UAAU,eAAe,aAAa,IAAI;AAAA,IAC1C,OAAO,YAAY,aAAa,IAAI;AAAA,IACpC,SAAS,cAAc,IAAI;AAAA,IAC3B,MAAM,WAAW,aAAa,IAAI;AAAA,IAClC,MAAM,WAAW,aAAa,IAAI;AAAA,IAClC,gBAAgB,qBAAqB,IAAI;AAAA,EAC3C;AACF;AAEA,SAAS,iBACP,aACA,MACS;AACT,MAAI,sBAAsB,KAAM,QAAO;AACvC,MAAI,WAAWC,MAAK,KAAK,aAAa,sBAAsB,CAAC,EAAG,QAAO;AACvE,MAAI,WAAWA,MAAK,KAAK,aAAa,sBAAsB,CAAC,EAAG,QAAO;AACvE,SAAO;AACT;AAEA,SAAS,gBACP,aACA,MACS;AACT,MAAI,sBAAsB,KAAM,QAAO;AACvC,MAAI,UAAUA,MAAK,KAAK,aAAa,YAAY,CAAC,EAAG,QAAO;AAC5D,SAAO;AACT;AAEA,SAAS,aACP,aACA,MACS;AACT,MAAI,YAAY,KAAM,QAAO;AAC7B,QAAM,gBAAgB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,UAAU,eAAe;AAClC,QAAI,WAAWA,MAAK,KAAK,aAAa,MAAM,CAAC,EAAG,QAAO;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,eACP,aACA,MACS;AACT,MAAI,cAAc,KAAM,QAAO;AAC/B,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,UAAU,iBAAiB;AACpC,QAAI,WAAWA,MAAK,KAAK,aAAa,MAAM,CAAC,EAAG,QAAO;AAAA,EACzD;AACA,SAAO;AACT;AAEA,SAAS,YACP,aACA,MACS;AACT,MAAI,oBAAoB,KAAM,QAAO;AACrC,MAAI,WAAWA,MAAK,KAAK,aAAa,YAAY,CAAC,EAAG,QAAO;AAC7D,MAAI,WAAWA,MAAK,KAAK,aAAa,aAAa,CAAC,EAAG,QAAO;AAC9D,SAAO;AACT;AAEA,SAAS,cAAc,MAAuC;AAC5D,SAAO,0BAA0B,QAAQ,cAAc;AACzD;AAEA,SAAS,WACP,aACA,MACS;AACT,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,WAAWA,MAAK,KAAK,aAAa,OAAO,CAAC,EAAG,QAAO;AACxD,SAAO;AACT;AAEA,SAAS,WACP,aACA,MACS;AACT,MAAI,UAAU,KAAM,QAAO;AAC3B,MAAI,WAAWA,MAAK,KAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AAC5D,MAAI,WAAWA,MAAK,KAAK,aAAa,gBAAgB,CAAC,EAAG,QAAO;AACjE,SAAO;AACT;AAEA,SAAS,qBAAqB,MAAuC;AACnE,SAAO,2BAA2B;AACpC;;;ACzIA,OAAOC,WAAU;AAWV,SAAS,iBAAiB,aAAmC;AAClE,QAAM,gBAAgB;AAAA,IACpBC,MAAK,KAAK,aAAa,WAAW,eAAe;AAAA,IACjDA,MAAK,KAAK,aAAa,WAAW,qBAAqB;AAAA,IACvDA,MAAK,KAAK,aAAa,WAAW;AAAA,EACpC;AAGA,MAAI,WAAW;AACf,aAAW,gBAAgB,eAAe;AACxC,UAAM,UAAU,aAAa,YAAY;AACzC,QAAI,SAAS;AACX,kBAAY,QAAQ,YAAY,IAAI;AAAA,IACtC;AAAA,EACF;AAEA,SAAO;AAAA,IACL,YAAY,SAAS,SAAS,YAAY;AAAA,IAC1C,OAAO,SAAS,SAAS,OAAO;AAAA,IAChC,QAAQ,SAAS,SAAS,QAAQ;AAAA,IAClC,UAAU,SAAS,SAAS,UAAU;AAAA,IACtC,YAAY,SAAS,SAAS,YAAY;AAAA,EAC5C;AACF;;;AVrBA,eAAsB,YAAY,aAA2C;AAC3E,QAAM,UAAUC,OAAK,KAAK,aAAa,cAAc;AACrD,QAAM,MAAM,aAAsC,OAAO,KAAK,CAAC;AAE/D,QAAM,UAAW,IAAI,WAAsC,CAAC;AAC5D,QAAM,cACH,IAAI,QAAmBA,OAAK,SAAS,WAAW;AAEnD,QAAM,eAAe,aAAa,aAAa,GAAG;AAClD,QAAM,iBAAiB,eAAe,GAAG;AACzC,QAAM,gBAAgB,cAAc,aAAa,GAAG;AACpD,QAAM,WAAW,iBAAiB,WAAW;AAC7C,QAAM,iBAAiB,eAAe,aAAa,GAAG;AACtD,QAAM,iBAAiB,qBAAqB,WAAW;AACvD,QAAM,cAAc,YAAY,aAAa,GAAG;AAChD,QAAM,cAAc,YAAY,aAAa,GAAG;AAChD,QAAM,YAAY,iBAAiB,WAAW;AAE9C,QAAM,gBACJ,YAAY,YACZ,YAAY,gBACZ,YAAY;AAEd,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,OAAO;AAAA,MACL,UAAU;AAAA,MACV,GAAG;AAAA,IACL;AAAA,IACA,OAAO;AAAA,IACP,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AWrDA,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAIR,SAAS,aAAa,cAA8B;AACzD,QAAM,WAAWC,OAAK,KAAK,eAAe,YAAY;AACtD,QAAM,UAAU,aAAa,QAAQ;AACrC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE;AAAA,EACvD;AACA,SAAO,QAAQ,KAAK;AACtB;AAEO,SAAS,oBAAoB,aAA+B;AACjE,QAAM,YAAYA,OAAK,KAAK,aAAa,WAAW,WAAW;AAC/D,MAAI,CAACC,IAAG,WAAW,SAAS,EAAG,QAAO,CAAC;AAEvC,MAAI;AACF,UAAM,QAAQA,IAAG,YAAY,SAAS,EAAE,OAAO,CAAC,MAAc,EAAE,SAAS,KAAK,CAAC;AAC/E,WAAO,MAAM,IAAI,CAAC,MAAc;AAC9B,YAAM,UAAUA,IAAG,aAAaD,OAAK,KAAK,WAAW,CAAC,GAAG,OAAO;AAChE,aAAO,QAAQ,KAAK;AAAA,IACtB,CAAC,EAAE,OAAO,OAAO;AAAA,EACnB,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEO,SAAS,iBACd,WACA,WACA,WACA,SACQ;AACR,QAAM,iBAAiB,6BAA6B,OAAO;AAC3D,QAAM,SAAS,aAAa,WAAW;AACvC,QAAM,OAAO,UACV,IAAI,CAAC,SAAS,aAAa,GAAG,SAAS,IAAI,IAAI,KAAK,CAAC,EACrD,KAAK,aAAa;AAGrB,QAAM,iBAAiB,SAAS,cAAc,QAAQ,eAAe,aACjE;AAAA;AAAA;AAAA;AAAA,wBAAoC,QAAQ,UAAU;AAAA,IAAS,yBAAyB,QAAQ,UAAU,CAAC,KAC3G;AAGJ,QAAM,gBAAgB,SAAS,iBAAiB,SAC5C,gBAAgB,QAAQ,gBAAgB,KAAK,aAAa,IAC1D;AAEJ,QAAM,OAAO,GAAG,cAAc;AAAA,EAAK,MAAM;AAAA;AAAA;AAAA;AAAA,EAAc,IAAI,GAAG,cAAc,GAAG,aAAa;AAC5F,QAAM,WAAW,oBAAoB,MAAM,SAAS;AACpD,SAAO;AAAA,EAA0B,QAAQ;AAAA;AAC3C;AAEA,SAAS,yBAAyB,OAAuB;AACvD,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,oBACd,SACA,WACQ;AACR,MAAI,SAAS;AACb,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,aAAS,OAAO,WAAW,KAAK,GAAG,MAAM,KAAK;AAAA,EAChD;AACA,SAAO;AACT;;;ACzEO,SAAS,gBAAgB,MAA6B;AAC3D,QAAM,YAAsB,CAAC,MAAM;AAEnC,MAAI,KAAK,cAAc,UAAU;AAC/B,QAAI,KAAK,eAAe,SAAS,KAAK,eAAe,UAAU;AAC7D,gBAAU,KAAK,mBAAmB;AAAA,IACpC;AACA,QAAI,KAAK,eAAe,WAAW,KAAK,eAAe,UAAU;AAC/D,gBAAU,KAAK,qBAAqB;AAAA,IACtC;AAAA,EACF;AAEA,MAAI,KAAK,QAAQ,QAAQ;AACvB,cAAU,KAAK,cAAc;AAAA,EAC/B;AAEA,MAAI,KAAK,QAAQ,SAAS,UAAU,GAAG;AACrC,cAAU,KAAK,UAAU;AAAA,EAC3B;AAEA,MAAI,KAAK,YAAY;AACnB,cAAU,KAAK,YAAY;AAAA,EAC7B;AAEA,MAAI,KAAK,UAAU;AACjB,cAAU,KAAK,UAAU;AAAA,EAC3B;AAEA,MAAI,KAAK,OAAO,UAAU;AACxB,cAAU,KAAK,OAAO;AAAA,EACxB;AAEA,SAAO;AACT;AAEO,SAAS,iBACd,MACA,SACQ;AACR,QAAM,YAAY,gBAAgB,IAAI;AACtC,QAAM,YAAY,eAAe,IAAI;AACrC,SAAO,iBAAiB,aAAa,WAAW,WAAW;AAAA,IACzD,iBAAiB,SAAS;AAAA,IAC1B,YAAY,SAAS;AAAA,EACvB,CAAC;AACH;AAEA,SAAS,eAAe,MAA2C;AACjE,QAAM,YAAsB,CAAC;AAE7B,MAAI,KAAK,cAAc,UAAU;AAC/B,cAAU,KAAK,WAAW,KAAK,iBAAiB,EAAE,EAAE;AAAA,EACtD;AACA,MAAI,KAAK,QAAQ,QAAQ;AACvB,QAAI,KAAK,QAAQ,mBAAmB;AAClC,gBAAU;AAAA,QACR,oBAAoB,KAAK,4BAA4B,iBAAiB,KAAK,yBAAyB,MAAM,mBAAmB;AAAA,MAC/H;AAAA,IACF,WAAW,KAAK,QAAQ,gBAAgB;AACtC,gBAAU;AAAA,QACR,oBAAoB,KAAK,qBAAqB,SAAS,KAAK,kBAAkB,MAAM,EAAE;AAAA,MACxF;AAAA,IACF,OAAO;AACL,gBAAU,KAAK,cAAc;AAAA,IAC/B;AAAA,EACF;AACA,MAAI,KAAK,WAAY,WAAU,KAAK,YAAY;AAChD,MAAI,KAAK,QAAQ,SAAS,UAAU;AAClC,cAAU,KAAK,gBAAgB,KAAK,mBAAmB,EAAE,EAAE;AAC7D,MAAI,KAAK,QAAQ,SAAS,MAAM,EAAG,WAAU,KAAK,MAAM;AACxD,MAAI,KAAK,QAAQ,SAAS,mBAAmB;AAC3C,cAAU,KAAK,mBAAmB;AACpC,MAAI,KAAK,YAAY,KAAK;AACxB,cAAU,KAAK,KAAK,YAAY;AAElC,QAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,EACxC;AAAA,IAAO,CAAC,CAAC,GAAG,MACX,CAAC,OAAO,SAAS,SAAS,QAAQ,QAAQ,cAAc,WAAW,EAAE,SAAS,GAAG;AAAA,EACnF,EACC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,GAAG,eAAU,KAAK,IAAI,EAC9E,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,WAAW,UAAU,KAAK,QAAK;AAAA,IAC/B,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK,cAAc;AAAA,IAC/B,SAAS,WAAW;AAAA,IACpB,WAAW,KAAK;AAAA,EAClB;AACF;;;ACzFO,SAAS,oBACd,MACA,SACQ;AACR,QAAM,YAAY,gBAAgB,IAAI;AACtC,QAAM,YAAY,qBAAqB,IAAI;AAC3C,SAAO,iBAAiB,eAAe,WAAW,WAAW;AAAA,IAC3D,iBAAiB,SAAS;AAAA,IAC1B,YAAY,SAAS;AAAA,EACvB,CAAC;AACH;AAEO,SAAS,qBAAqB,MAA2C;AAC9E,QAAM,YAAsB,CAAC;AAE7B,MAAI,KAAK,cAAc,UAAU;AAC/B,cAAU,KAAK,WAAW,KAAK,iBAAiB,EAAE,EAAE;AAAA,EACtD;AACA,MAAI,KAAK,QAAQ,QAAQ;AACvB,cAAU;AAAA,MACR,KAAK,QAAQ,qBAAqB,KAAK,QAAQ,iBAC3C,sBACA;AAAA,IACN;AAAA,EACF;AACA,MAAI,KAAK,WAAY,WAAU,KAAK,YAAY;AAChD,MAAI,KAAK,QAAQ,SAAS,UAAU,EAAG,WAAU,KAAK,cAAc;AACpE,MAAI,KAAK,YAAY,KAAK,aAAc,WAAU,KAAK,KAAK,YAAY;AAExE,QAAM,UAAU,OAAO,QAAQ,KAAK,OAAO,EACxC;AAAA,IAAO,CAAC,CAAC,GAAG,MACX,CAAC,OAAO,SAAS,SAAS,QAAQ,QAAQ,cAAc,WAAW,EAAE,SAAS,GAAG;AAAA,EACnF,EACC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,OAAO,KAAK,cAAc,QAAQ,GAAG,eAAU,KAAK,IAAI,EAC9E,KAAK,IAAI;AAEZ,SAAO;AAAA,IACL,aAAa,KAAK;AAAA,IAClB,WAAW,UAAU,KAAK,QAAK;AAAA,IAC/B,gBAAgB,KAAK;AAAA,IACrB,YAAY,KAAK,cAAc;AAAA,IAC/B,SAAS,WAAW;AAAA,IACpB,WAAW,KAAK;AAAA,EAClB;AACF;;;ACrCA,IAAM,aAAqE;AAAA,EACzE,MAAM;AAAA,IACJ,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,qBAAqB;AAAA,IACnB,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,uBAAuB;AAAA,IACrB,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,gBAAgB;AAAA,IACd,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,YAAY;AAAA,IACV,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,UAAU;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA,IACL,aAAa;AAAA,IACb,OAAO;AAAA,EACT;AACF;AAEO,SAAS,iBAAiB,MAA8B;AAC7D,QAAM,YAAY,gBAAgB,IAAI;AACtC,QAAM,YAAY,qBAAqB,IAAI;AAE3C,SAAO,UAAU,IAAI,CAAC,aAAa;AACjC,UAAM,SAAS,WAAW,QAAQ,KAAK;AAAA,MACrC,aAAa;AAAA,MACb,OAAO;AAAA,IACT;AACA,UAAM,OAAO,aAAa,eAAe,QAAQ,KAAK;AACtD,UAAM,WAAW,oBAAoB,MAAM,SAAS;AAEpD,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,gBAAgB,OAAO,WAAW;AAAA,MAClC,UAAU,OAAO,KAAK;AAAA,MACtB;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAEX,WAAO;AAAA,MACL,UAAU,GAAG,QAAQ;AAAA,MACrB,SAAS,GAAG,WAAW;AAAA;AAAA,4BAAiC,OAAO;AAAA;AAAA,EAAW,QAAQ;AAAA,IACpF;AAAA,EACF,CAAC;AACH;;;ACpEO,SAAS,eACd,MACA,WACA,UACA,QACA,SAQa;AACb,SAAO;AAAA,IACL,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,SAAS,UAAU,CAAC;AAAA,IAC5B,UAAU,SAAS,YAAY,CAAC;AAAA,IAChC,OAAO,SAAS,SAAS;AAAA,IACzB,aAAa,SAAS,eAAe;AAAA,IACrC,YAAY,SAAS,cAAc;AAAA,IACnC,iBAAiB,SAAS,mBAAmB,CAAC;AAAA,EAChD;AACF;;;AC7BO,SAAS,cACd,MACA,UAAuB,YACV;AACb,QAAM,QAAqB,CAAC;AAE5B,QAAM,aAA+B,CAAC;AACtC,QAAM,cAAgC,CAAC;AACvC,QAAM,OAAyB,CAAC;AAKhC,aAAW,KAAK;AAAA,IACd,SAAS;AAAA,IACT,OAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,SACE;AAAA,MACJ;AAAA,IACF;AAAA,EACF,CAAC;AAKD,MAAI,KAAK,MAAM,OAAO;AACpB,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,WAAW,KAAK,MAAM,UAAU;AAC9B,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,cAAc,YAAY,WAAW;AAC5C,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,KAAK,MAAM,UAAU,YAAY,UAAU;AAC7C,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,YAAY,WAAW;AACzB,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAIA,MAAI,YAAY,WAAW;AACzB,gBAAY,KAAK;AAAA,MACf,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,KAAK,IAAI;AAAA,QACb;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAKA,MAAI,YAAY,UAAU;AACxB,SAAK,KAAK;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,QACL;AAAA,UACE,MAAM;AAAA,UACN,SACE;AAAA,QACJ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,WAAW,SAAS,EAAG,OAAM,aAAa;AAC9C,MAAI,YAAY,SAAS,EAAG,OAAM,cAAc;AAChD,MAAI,KAAK,SAAS,EAAG,OAAM,OAAO;AAElC,SAAO;AACT;AAEO,SAAS,sBACd,MACA,UAAuB,YACE;AACzB,QAAM,QAAQ,cAAc,MAAM,OAAO;AAEzC,SAAO;AAAA,IACL;AAAA,EACF;AACF;;;AC7KA,OAAOE,YAAU;AACjB,OAAOC,SAAQ;AAGf,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,qBAA6C;AAAA,EACjD,eAAe;AAAA,EACf,UAAU;AAAA,EACV,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,WAAW;AAAA,EACX,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,cAAc;AAAA;AAAA,EAEd,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,WAAW;AAAA,EACX,iBAAiB;AAAA;AAAA,EAEjB,gBAAgB;AAAA,EAChB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,eAAe;AAAA,EACf,gBAAgB;AAAA,EAChB,iBAAiB;AACnB;AAEA,eAAsB,WAAW,WAAsC;AACrE,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,kBAAkB;AACpC,UAAM,MAAMC,OAAK,KAAK,cAAc,GAAG,KAAK,KAAK;AACjD,QAAI,CAAE,MAAMC,IAAG,WAAW,GAAG,EAAI;AAEjC,UAAM,UAAU,MAAMA,IAAG,SAAS,KAAK,OAAO;AAC9C,UAAM,cAAc,mBAAmB,KAAK,KAAK;AAGjD,UAAM,iBAAiBD,OAAK,KAAK,WAAW,WAAW,UAAU,KAAK;AACtE,UAAMC,IAAG,UAAU,cAAc;AACjC,UAAMA,IAAG;AAAA,MACPD,OAAK,KAAK,gBAAgB,UAAU;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAGA,UAAM,iBAAiBA,OAAK,KAAK,WAAW,WAAW,UAAU,KAAK;AACtE,UAAMC,IAAG,UAAU,cAAc;AACjC,UAAMA,IAAG;AAAA,MACPD,OAAK,KAAK,gBAAgB,UAAU;AAAA,MACpC;AAAA,MACA;AAAA,IACF;AAGA,UAAM,YAAYA,OAAK,KAAK,WAAW,WAAW,UAAU;AAC5D,UAAMC,IAAG,UAAU,SAAS;AAC5B,UAAMA,IAAG,KAAK,KAAKD,OAAK,KAAK,WAAW,GAAG,KAAK,KAAK,GAAG,EAAE,WAAW,KAAK,CAAC;AAE3E,WAAO,KAAK,KAAK;AAAA,EACnB;AAEA,SAAO;AACT;;;AC1IA,OAAOE,YAAU;AACjB,OAAOC,SAAQ;AAGf,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,eAAsB,WAAW,WAAsC;AACrE,QAAM,eAAeC,OAAK,KAAK,WAAW,UAAU,QAAQ;AAC5D,QAAMC,IAAG,UAAU,YAAY;AAE/B,QAAM,SAAmB,CAAC;AAE1B,aAAW,SAAS,kBAAkB;AACpC,UAAM,MAAMD,OAAK,KAAK,YAAY,GAAG,KAAK,KAAK;AAC/C,UAAM,OAAOA,OAAK,KAAK,cAAc,GAAG,KAAK,KAAK;AAElD,QAAI,MAAMC,IAAG,WAAW,GAAG,GAAG;AAC5B,YAAMA,IAAG,KAAK,KAAK,MAAM,EAAE,WAAW,KAAK,CAAC;AAC5C,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;;;AC9BA,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAGf,IAAM,gBAAgB,CAAC,gBAAgB,iBAAiB,UAAU;AAElE,eAAsB,aAAa,WAAsC;AACvE,QAAM,aAAaC,OAAK,KAAK,WAAW,MAAM;AAC9C,QAAMC,IAAG,UAAU,UAAU;AAE7B,QAAM,UAAoB,CAAC;AAE3B,aAAW,OAAO,eAAe;AAC/B,UAAM,MAAMD,OAAK,KAAK,oBAAoB,GAAG,GAAG,KAAK;AACrD,UAAM,OAAOA,OAAK,KAAK,YAAY,GAAG,GAAG,KAAK;AAE9C,QAAK,MAAMC,IAAG,WAAW,IAAI,GAAI;AAC/B;AAAA,IACF;AAEA,QAAI,MAAMA,IAAG,WAAW,GAAG,GAAG;AAC5B,YAAMA,IAAG,KAAK,KAAK,IAAI;AACvB,cAAQ,KAAK,GAAG;AAAA,IAClB;AAAA,EACF;AAEA,SAAO;AACT;;;AC3BA,OAAOC,YAAU;AACjB,OAAOC,SAAQ;AAIf,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,qBAAoF;AAAA,EACxF;AAAA,IACE,MAAM;AAAA,IACN,WAAW,CAAC,SAAS,KAAK,MAAM;AAAA,EAClC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW,CAAC,SAAS,KAAK,QAAQ;AAAA,EACpC;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,WAAW,CAAC,SAAS,KAAK,MAAM,cAAc,CAAC,CAAC,KAAK,QAAQ,MAAM;AAAA,EACrE;AACF;AAEA,eAAsB,WACpB,WACA,MACmB;AACnB,QAAM,eAAeC,OAAK,KAAK,WAAW,WAAW,QAAQ;AAC7D,QAAMC,IAAG,UAAU,YAAY;AAE/B,QAAM,SAAmB,CAAC;AAG1B,aAAW,SAAS,kBAAkB;AACpC,UAAM,MAAMD,OAAK,KAAK,YAAY,GAAG,KAAK,KAAK;AAC/C,QAAI,CAAE,MAAMC,IAAG,WAAW,GAAG,EAAI;AAEjC,UAAMA,IAAG,KAAK,KAAKD,OAAK,KAAK,cAAc,GAAG,KAAK,KAAK,GAAG;AAAA,MACzD,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK,KAAK;AAAA,EACnB;AAGA,aAAW,EAAE,MAAM,UAAU,KAAK,oBAAoB;AACpD,QAAI,CAAC,UAAU,IAAI,EAAG;AAEtB,UAAM,MAAMA,OAAK,KAAK,YAAY,GAAG,IAAI,KAAK;AAC9C,QAAI,CAAE,MAAMC,IAAG,WAAW,GAAG,EAAI;AAEjC,UAAMA,IAAG,KAAK,KAAKD,OAAK,KAAK,cAAc,GAAG,IAAI,KAAK,GAAG;AAAA,MACxD,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK,IAAI;AAAA,EAClB;AAEA,SAAO;AACT;;;AChEA,OAAOE,YAAU;AACjB,OAAOC,SAAQ;AAGf,IAAM,qBAAqB,CAAC,OAAO,UAAU,UAAU;AAEvD,eAAsB,aAAa,WAAsC;AACvE,QAAM,iBAAiBC,OAAK,KAAK,WAAW,WAAW,UAAU;AACjE,QAAMC,IAAG,UAAU,cAAc;AAEjC,QAAM,SAAmB,CAAC;AAE1B,aAAW,WAAW,oBAAoB;AACxC,UAAM,MAAMD,OAAK,KAAK,cAAc,GAAG,OAAO,KAAK;AACnD,QAAI,CAAE,MAAMC,IAAG,WAAW,GAAG,EAAI;AAEjC,UAAMA,IAAG,KAAK,KAAKD,OAAK,KAAK,gBAAgB,GAAG,OAAO,KAAK,GAAG;AAAA,MAC7D,WAAW;AAAA,IACb,CAAC;AACD,WAAO,KAAK,OAAO;AAAA,EACrB;AAEA,SAAO;AACT;;;AtBIA,eAAsB,YAAY,YAAoC;AACpE,QAAM,aAAaE,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAE3D,aAAW,6BAAwB;AACnC,UAAQ,aAAa,UAAU,EAAE;AAGjC,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAC3D,MAAI,WAAW,UAAU,GAAG;AAC1B,UAAM,YAAY,MAAM,QAAQ;AAAA,MAC9B,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AACD,QAAI,CAAC,WAAW;AACd,cAAQ,oDAAoD;AAC5D;AAAA,IACF;AAAA,EACF;AAGA,QAAM,UAAU,IAAI,qBAAqB,EAAE,MAAM;AACjD,MAAI;AACJ,MAAI;AACF,WAAO,MAAM,YAAY,UAAU;AACnC,YAAQ,QAAQ,iBAAiB;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,aAAS,OAAO,GAAG,CAAC;AACpB;AAAA,EACF;AAGA,aAAW,gBAAgB;AAC3B,UAAQ,cAAc,gBAAgB,IAAI,CAAC,EAAE;AAC7C,UAAQ,QAAQ,KAAK,QAAQ,SAAS,SAAS,KAAK,GAAG,EAAE;AACzD,UAAQ,YAAY,KAAK,QAAQ,KAAK,IAAI,KAAK,eAAe,EAAE;AAChE,UAAQ,eAAe,KAAK,aAAa,QAAQ,IAAI,EAAE;AACvD,UAAQ,aAAa,KAAK,WAAW,QAAQ,KAAK,YAAY,MAAM,IAAI,EAAE;AAC1E,UAAQ,oBAAoB,KAAK,cAAc,EAAE;AACjD,UAAQ,cAAc,KAAK,MAAM,QAAQ,UAAU,KAAK,MAAM,WAAW,aAAa,eAAe,EAAE;AAGvG,QAAM,iBAAiB,MAAM,kBAAkB,IAAI;AACnD,SAAO,oBAAoB,MAAM,cAAc;AAG/C,QAAM,QAAQ,MAAM,YAAY;AAGhC,QAAM,aAAa,MAAM,iBAAiB;AAG1C,QAAM,cAAc,MAAM,kBAAkB;AAG5C,QAAM,kBAAkB,oBAAoB,UAAU;AAGtD,QAAM,WAAW,MAAM,uBAAuB,UAAU;AAGxD,aAAW,kBAAkB;AAC7B,QAAM,UAAU,MAAM,SAAS,YAAY,MAAM,OAAO,UAAU;AAAA,IAChE;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,aAAW,gBAAgB;AAC3B,MAAI,QAAQ,SAAU,YAAW,qBAAqB;AACtD,MAAI,QAAQ,YAAa,YAAW,wBAAwB;AAC5D,MAAI,QAAQ,iBAAiB;AAC3B,eAAW,GAAG,QAAQ,cAAc,sCAAsC;AAC5E,MAAI,QAAQ,SAAS,SAAS;AAC5B,eAAW,GAAG,QAAQ,SAAS,MAAM,uDAAuD;AAC9F,MAAI,QAAQ,OAAO,SAAS;AAC1B,eAAW,GAAG,QAAQ,OAAO,MAAM,qCAAqC;AAC1E,MAAI,QAAQ,SAAS,SAAS;AAC5B,eAAW,GAAG,QAAQ,SAAS,MAAM,8CAA8C;AACrF,MAAI,QAAQ;AACV,eAAW,kEAA6D,WAAW,EAAE;AACvF,MAAI,QAAQ,OAAO,SAAS;AAC1B,eAAW,GAAG,QAAQ,OAAO,MAAM,iCAAiC;AACtE,MAAI,QAAQ,KAAK,SAAS;AACxB,eAAW,GAAG,QAAQ,KAAK,MAAM,iCAAiC;AAGpE,sBAAoB,IAAI;AAExB,UAAQ,IAAI,EAAE;AACd,UAAQ,uEAAuE;AAC/E,UAAQ,iEAAiE;AACzE,UAAQ,wDAAwD;AAClE;AAEA,SAAS,gBAAgB,MAA2B;AAClD,MAAI,KAAK,cAAc,UAAU;AAC/B,UAAM,UAAU,KAAK,gBAAgB,IAAI,KAAK,aAAa,KAAK;AAChE,UAAM,SAAS,KAAK,aAAa,KAAK,KAAK,UAAU,aAAa;AAClE,WAAO,UAAU,OAAO,GAAG,MAAM;AAAA,EACnC;AACA,SAAO,KAAK;AACd;AAEA,eAAe,kBAAkB,MAAiD;AAChF,QAAM,UAA+B,CAAC;AAGtC,MAAI,KAAK,cAAc,YAAY,CAAC,KAAK,YAAY;AACnD,YAAQ,aAAa,MAAM,OAAO;AAAA,MAChC,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,+BAA+B,OAAO,MAAe;AAAA,QAC7D,EAAE,MAAM,mCAAmC,OAAO,QAAiB;AAAA,QACnE,EAAE,MAAM,iBAAiB,OAAO,SAAkB;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,oBACP,MACA,gBACa;AACb,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAI,eAAe,cAAc,EAAE,YAAY,eAAe,WAAW;AAAA,IACzE,GAAI,eAAe,OAAO,EAAE,KAAK,eAAe,IAAI;AAAA,EACtD;AACF;AAEA,eAAe,cAA6D;AAC1E,QAAM,OAAO,MAAM,OAAO;AAAA,IACxB,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,6BAA6B,OAAO,OAAO;AAAA,MACnD,EAAE,MAAM,oBAAoB,OAAO,SAAS;AAAA,MAC5C,EAAE,MAAM,eAAe,OAAO,SAAS;AAAA,IACzC;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AAED,SAAO;AAAA,IACL,QAAQ,SAAS,UAAU,SAAS;AAAA,IACpC,QAAQ,SAAS,UAAU,SAAS;AAAA,EACtC;AACF;AAEA,eAAe,mBAA6C;AAC1D,SAAO,OAAO;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,wEAAmE,OAAO,WAAoB;AAAA,MACtG,EAAE,MAAM,mEAA8D,OAAO,SAAkB;AAAA,MAC/F,EAAE,MAAM,kEAA6D,OAAO,UAAmB;AAAA,IACjG;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,eAAe,oBAA0C;AACvD,SAAO,OAAO;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAEA,eAAe,uBACb,YAC6B;AAC7B,QAAM,cACJ,WAAWA,OAAK,KAAK,YAAY,gBAAgB,QAAQ,CAAC,KAC1D,WAAWA,OAAK,KAAK,YAAY,gBAAgB,WAAW,CAAC;AAE/D,MAAI,CAAC,YAAa,QAAO;AAEzB,SAAO,OAAO;AAAA,IACZ,SAAS;AAAA,IACT,SAAS;AAAA,MACP;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,SAAS;AAAA,EACX,CAAC;AACH;AAcA,eAAe,SACb,YACA,MACA,OACA,UACA,MAKyB;AACzB,QAAM,SAAyB;AAAA,IAC7B,UAAU;AAAA,IACV,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,UAAU,CAAC;AAAA,IACX,QAAQ,CAAC;AAAA,IACT,UAAU,CAAC;AAAA,IACX,OAAO;AAAA,IACP,QAAQ,CAAC;AAAA,IACT,MAAM,CAAC;AAAA,EACT;AAGA,MAAI,MAAM,QAAQ;AAChB,UAAM,eAAeA,OAAK,KAAK,YAAY,gBAAgB,QAAQ;AACnE,QAAI,aAAa,eAAe,CAAC,WAAW,YAAY,GAAG;AACzD,YAAM,UAAU,iBAAiB,MAAM,EAAE,YAAY,MAAM,YAAY,iBAAiB,MAAM,gBAAgB,CAAC;AAC/G,YAAMC,IAAG,UAAU,cAAc,SAAS,OAAO;AACjD,aAAO,WAAW;AAAA,IACpB,OAAO;AACL,iBAAW,4BAA4B;AAAA,IACzC;AAGA,WAAO,WAAW,MAAM,WAAW,UAAU;AAG7C,WAAO,SAAS,MAAM,WAAW,YAAY,IAAI;AAGjD,WAAO,WAAW,MAAM,aAAa,UAAU;AAG/C,UAAM,cAAc,MAAM,eAAe;AACzC,UAAM,oBAAoBD,OAAK,KAAK,YAAY,gBAAgB,mBAAmB;AACnF,UAAM,gBAAgB,sBAAsB,MAAM,WAAW;AAC7D,UAAMC,IAAG,UAAUD,OAAK,QAAQ,iBAAiB,CAAC;AAClD,UAAMC,IAAG,UAAU,mBAAmB,eAAe,EAAE,QAAQ,EAAE,CAAC;AAClE,WAAO,QAAQ;AAAA,EACjB;AAGA,MAAI,MAAM,QAAQ;AAChB,UAAM,aAAaD,OAAK,KAAK,YAAY,gBAAgB,WAAW;AACpE,QAAI,aAAa,eAAe,CAAC,WAAW,UAAU,GAAG;AACvD,YAAM,UAAU,oBAAoB,MAAM,EAAE,YAAY,MAAM,YAAY,iBAAiB,MAAM,gBAAgB,CAAC;AAClH,YAAMC,IAAG,UAAU,YAAY,SAAS,OAAO;AAC/C,aAAO,cAAc;AAAA,IACvB,OAAO;AACL,iBAAW,+BAA+B;AAAA,IAC5C;AAGA,UAAM,SAASD,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACjE,UAAMC,IAAG,UAAU,MAAM;AACzB,UAAM,WAAW,iBAAiB,IAAI;AACtC,eAAW,OAAO,UAAU;AAC1B,YAAMA,IAAG,UAAUD,OAAK,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,OAAO;AAAA,IAC1E;AACA,WAAO,iBAAiB,SAAS;AAAA,EACnC;AAGA,SAAO,SAAS,MAAM,WAAW,UAAU;AAG3C,SAAO,OAAO,MAAM,aAAa,UAAU;AAG3C,QAAM,YAAY,CAAC;AACnB,MAAI,OAAO,SAAU,WAAU,KAAK,WAAW;AAC/C,MAAI,OAAO,YAAa,WAAU,KAAK,cAAc;AAErD,QAAM,SAAS,eAAe,MAAM,WAAW,OAAO,UAAU,OAAO,QAAQ;AAAA,IAC7E,YAAY,MAAM;AAAA,IAClB,iBAAiB,MAAM;AAAA,IACvB,QAAQ,OAAO;AAAA,IACf,UAAU,OAAO;AAAA,IACjB,OAAO,OAAO;AAAA,IACd,aAAa,MAAM;AAAA,EACrB,CAAC;AACD,QAAMC,IAAG;AAAA,IACPD,OAAK,KAAK,YAAY,kBAAkB;AAAA,IACxC;AAAA,IACA,EAAE,QAAQ,EAAE;AAAA,EACd;AAEA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAyB;AACpD,QAAM,WAA8D;AAAA,IAClE;AAAA,MACE,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,MAAM,YAAY,KAAK,MAAM;AAAA,MACzC,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,MAAM;AAAA,MAClB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,UAA6D;AAAA,IACjE;AAAA,MACE,OAAO,KAAK,WAAW;AAAA,MACvB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,WAAW;AAAA,MACvB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,WAAW;AAAA,MACvB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA;AAAA,MACE,OAAO,KAAK,WAAW;AAAA,MACvB,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAEA,QAAM,eAAe,SAAS,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;AACpD,QAAM,cAAc,QAAQ,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK;AAElD,MAAI,aAAa,WAAW,KAAK,YAAY,WAAW,EAAG;AAE3D,aAAW,mBAAmB;AAE9B,aAAW,OAAO,cAAc;AAC9B,YAAQ,IAAI,KAAK;AACjB,YAAQ,IAAI,IAAI;AAAA,EAClB;AAEA,aAAW,OAAO,aAAa;AAC7B,YAAQ,IAAI,KAAK;AACjB,YAAQ,IAAI,IAAI;AAAA,EAClB;AACF;;;AuBtaA,OAAOE,YAAU;AACjB,OAAOC,SAAQ;AACf,OAAOC,UAAS;AAChB,SAAS,WAAAC,gBAAe;AA0BxB,eAAsB,cAAc,YAAoC;AACtE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAE3D,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,aAAS,uDAAuD;AAChE;AAAA,EACF;AAEA,QAAM,iBAAiB,aAA0B,UAAU;AAC3D,MAAI,CAAC,gBAAgB;AACnB,aAAS,wEAAwE;AACjF;AAAA,EACF;AAGA,QAAM,gBAAgB,SAAS,eAAe,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACvE,QAAM,eAAe,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACvD,MAAI,kBAAkB,cAAc;AAClC;AAAA,MACE,qCAAqC,eAAe,OAAO,yBAAyB,OAAO;AAAA,IAC7F;AAAA,EACF;AAEA,QAAM,UAAU,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,QAAS;AAEd,QAAM,UAAUC,KAAI,wBAAwB,EAAE,MAAM;AACpD,QAAM,OAAO,MAAM,YAAY,UAAU;AACzC,UAAQ,QAAQ,oBAAoB;AAEpC,aAAW,gBAAgB;AAE3B,QAAM,aAAa,eAAe,cAAc;AAChD,QAAM,cAAc,eAAe,eAAe;AAClD,QAAM,kBAAkB,oBAAoB,UAAU;AACtD,QAAM,UAAU,EAAE,YAAY,gBAAgB;AAE9C,QAAM,YAAsB,CAAC;AAG7B,MACE,eAAe,UAAU,SAAS,WAAW,KAC7C,WAAWF,OAAK,KAAK,YAAY,gBAAgB,QAAQ,CAAC,GAC1D;AACA,UAAM,eAAeA,OAAK,KAAK,YAAY,gBAAgB,QAAQ;AACnE,UAAM,aAAa,iBAAiB,MAAM,OAAO;AACjD,UAAM,WAAW,aAAa,YAAY;AAC1C,QAAI,UAAU;AACZ,YAAMG,IAAG,UAAU,cAAc,iBAAiB,UAAU,UAAU,GAAG,OAAO;AAAA,IAClF,OAAO;AACL,YAAMA,IAAG,UAAU,cAAc,YAAY,OAAO;AAAA,IACtD;AACA,cAAU,KAAK,WAAW;AAC1B,eAAW,mBAAmB;AAAA,EAChC;AAGA,MACE,eAAe,UAAU,SAAS,cAAc,KAChD,WAAWH,OAAK,KAAK,YAAY,gBAAgB,WAAW,CAAC,GAC7D;AACA,UAAM,kBAAkBA,OAAK,KAAK,YAAY,gBAAgB,WAAW;AACzE,UAAM,aAAa,oBAAoB,MAAM,OAAO;AACpD,UAAM,WAAW,aAAa,eAAe;AAC7C,QAAI,UAAU;AACZ,YAAMG,IAAG,UAAU,iBAAiB,iBAAiB,UAAU,UAAU,GAAG,OAAO;AAAA,IACrF,OAAO;AACL,YAAMA,IAAG,UAAU,iBAAiB,YAAY,OAAO;AAAA,IACzD;AACA,cAAU,KAAK,cAAc;AAC7B,eAAW,sBAAsB;AAGjC,UAAM,SAASH,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACjE,UAAMG,IAAG,UAAU,MAAM;AACzB,UAAM,WAAW,iBAAiB,IAAI;AACtC,eAAW,OAAO,UAAU;AAC1B,YAAMA,IAAG,UAAUH,OAAK,KAAK,QAAQ,IAAI,QAAQ,GAAG,IAAI,SAAS,OAAO;AAAA,IAC1E;AACA,eAAW,GAAG,SAAS,MAAM,oCAAoC;AAAA,EACnE;AAGA,QAAM,WAAW,MAAM,WAAW,UAAU;AAC5C,aAAW,GAAG,SAAS,MAAM,qDAAqD;AAGlF,QAAM,SAAS,MAAM,WAAW,YAAY,IAAI;AAChD,aAAW,GAAG,OAAO,MAAM,mCAAmC;AAG9D,QAAM,WAAW,MAAM,aAAa,UAAU;AAC9C,aAAW,GAAG,SAAS,MAAM,4CAA4C;AAGzE,MAAI,eAAe,UAAU,OAAO;AAClC,UAAM,oBAAoBA,OAAK,KAAK,YAAY,gBAAgB,mBAAmB;AACnF,UAAM,gBAAgB,sBAAsB,MAAM,WAAW;AAC7D,UAAMG,IAAG,UAAUH,OAAK,QAAQ,iBAAiB,CAAC;AAClD,UAAMG,IAAG,UAAU,mBAAmB,eAAe,EAAE,QAAQ,EAAE,CAAC;AAClE,eAAW,2BAA2B,WAAW,GAAG;AAAA,EACtD;AAGA,QAAM,SAAS,MAAM,WAAW,UAAU;AAC1C,aAAW,GAAG,OAAO,MAAM,iBAAiB;AAG5C,QAAM,SAAS,eAAe,MAAM,WAAW,UAAU,QAAQ;AAAA,IAC/D,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,OAAO,eAAe,UAAU;AAAA,IAChC;AAAA,EACF,CAAC;AACD,QAAMA,IAAG,UAAU,YAAY,QAAQ,EAAE,QAAQ,EAAE,CAAC;AACpD,aAAW,4BAA4B;AAEvC,UAAQ,IAAI,EAAE;AACd,UAAQ,oDAAoD;AAC9D;;;AC1JA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf,SAAS,WAAAC,gBAAe;AAIxB,eAAsB,aAAa,YAAoC;AACrE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAE3D,aAAW,qBAAgB;AAC3B,aAAW,8CAA8C;AACzD,UAAQ,OAAO,gBAAgB,QAAQ,EAAE;AACzC,UAAQ,OAAO,gBAAgB,WAAW,EAAE;AAC5C,UAAQ,OAAO,gBAAgB,YAAY,GAAG;AAC9C,UAAQ,OAAO,gBAAgB,cAAc,GAAG;AAChD,UAAQ,OAAO,gBAAgB,YAAY,GAAG;AAC9C,UAAQ,OAAO,gBAAgB,YAAY,GAAG;AAC9C,UAAQ,aAAa;AACrB,UAAQ,OAAO,kBAAkB,EAAE;AACnC,UAAQ,IAAI,EAAE;AAEd,QAAM,UAAU,MAAMC,SAAQ;AAAA,IAC5B,SAAS;AAAA,IACT,SAAS;AAAA,EACX,CAAC;AAED,MAAI,CAAC,SAAS;AACZ,YAAQ,YAAY;AACpB;AAAA,EACF;AAEA,QAAM,UAAoB,CAAC;AAG3B,QAAM,eAAeD,OAAK,KAAK,YAAY,gBAAgB,QAAQ;AACnE,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAME,KAAG,OAAO,YAAY;AAC5B,YAAQ,KAAK,gBAAgB,QAAQ;AAAA,EACvC;AAGA,QAAM,aAAaF,OAAK,KAAK,YAAY,gBAAgB,WAAW;AACpE,MAAI,WAAW,UAAU,GAAG;AAC1B,UAAME,KAAG,OAAO,UAAU;AAC1B,YAAQ,KAAK,gBAAgB,WAAW;AAAA,EAC1C;AAGA,QAAM,eAAeF,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACvE,MAAI,WAAW,YAAY,GAAG;AAC5B,UAAME,KAAG,OAAO,YAAY;AAC5B,YAAQ,KAAK,gBAAgB,YAAY;AAAA,EAC3C;AAGA,QAAM,cAAcF,OAAK,KAAK,YAAY,gBAAgB,cAAc;AACxE,MAAI,WAAW,WAAW,GAAG;AAC3B,UAAME,KAAG,OAAO,WAAW;AAC3B,YAAQ,KAAK,gBAAgB,cAAc;AAAA,EAC7C;AAGA,QAAM,kBAAkBF,OAAK,KAAK,YAAY,gBAAgB,YAAY;AAC1E,MAAI,WAAW,eAAe,GAAG;AAC/B,UAAME,KAAG,OAAO,eAAe;AAC/B,YAAQ,KAAK,gBAAgB,YAAY;AAAA,EAC3C;AAGA,QAAM,kBAAkBF,OAAK,KAAK,YAAY,gBAAgB,YAAY;AAC1E,MAAI,WAAW,eAAe,GAAG;AAC/B,UAAME,KAAG,OAAO,eAAe;AAC/B,YAAQ,KAAK,gBAAgB,YAAY;AAAA,EAC3C;AAGA,QAAM,WAAWF,OAAK,KAAK,YAAY,QAAQ;AAC/C,MAAI,WAAW,QAAQ,GAAG;AACxB,UAAME,KAAG,OAAO,QAAQ;AACxB,YAAQ,KAAK,SAAS;AAAA,EACxB;AAGA,QAAM,aAAaF,OAAK,KAAK,YAAY,kBAAkB;AAC3D,MAAI,WAAW,UAAU,GAAG;AAC1B,UAAME,KAAG,OAAO,UAAU;AAC1B,YAAQ,KAAK,kBAAkB;AAAA,EACjC;AAEA,aAAW,gBAAgB;AAC3B,MAAI,QAAQ,SAAS,GAAG;AACtB,YAAQ,QAAQ,CAAC,MAAM,WAAW,WAAW,CAAC,EAAE,CAAC;AAAA,EACnD,OAAO;AACL,YAAQ,kCAAkC;AAAA,EAC5C;AACF;;;AC/FA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAChB,OAAO,QAAQ;AAKf,IAAM,UAAU;AAAA,EACd,QAAQ,EAAE,OAAO,GAAG,QAAQ,IAAI,WAAW,IAAI;AAAA,EAC/C,MAAM,EAAE,OAAO,IAAI,QAAQ,IAAI,WAAW,IAAI;AAChD;AAEA,IAAM,cAAc;AAwCpB,SAAS,mBAA6B;AACpC,QAAM,YAAYC,OAAK,KAAK,GAAG,QAAQ,GAAG,WAAW,UAAU;AAC/D,MAAI,CAACC,KAAG,WAAW,SAAS,EAAG,QAAO,CAAC;AAEvC,QAAM,QAAkB,CAAC;AAEzB,WAAS,QAAQ,KAAmB;AAClC,QAAI;AACF,YAAM,UAAUA,KAAG,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAC3D,iBAAW,SAAS,SAAS;AAC3B,cAAM,OAAOD,OAAK,KAAK,KAAK,MAAM,IAAI;AACtC,YAAI,MAAM,YAAY,GAAG;AACvB,kBAAQ,IAAI;AAAA,QACd,WAAW,MAAM,KAAK,SAAS,QAAQ,GAAG;AACxC,gBAAM,KAAK,IAAI;AAAA,QACjB;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,UAAQ,SAAS;AACjB,SAAO;AACT;AAEA,SAAS,iBAAiB,UAAyC;AACjE,MAAI;AACF,UAAM,UAAUC,KAAG,aAAa,UAAU,OAAO;AACjD,UAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AAExD,UAAM,QAAoB;AAAA,MACxB,aAAa;AAAA,MACb,cAAc;AAAA,MACd,iBAAiB;AAAA,MACjB,qBAAqB;AAAA,IACvB;AAEA,QAAI,QAAQ;AACZ,QAAI,eAAe;AACnB,QAAI,cAAc;AAElB,eAAW,QAAQ,OAAO;AACxB,UAAI;AACF,cAAM,MAAM,KAAK,MAAM,IAAI;AAG3B,YAAI,IAAI,aAAa,CAAC,aAAa;AACjC,wBAAc,IAAI,KAAK,IAAI,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,QACjE;AAGA,YAAI,IAAI,OAAO;AACb,gBAAM,IAAI,OAAO,IAAI,KAAK,EAAE,YAAY;AACxC,cAAI,EAAE,SAAS,MAAM,EAAG,SAAQ;AAAA,cAC3B,SAAQ;AAAA,QACf;AAGA,YAAI,IAAI,SAAS,eAAe,IAAI,SAAS,aAAa;AACxD;AAAA,QACF;AAGA,cAAM,IACJ,IAAI,SACJ,IAAI,SAAS,SACb,IAAI,YACJ,IAAI,QAAQ,SACZ;AAEF,YAAI,GAAG;AACL,gBAAM,eAAe,EAAE,gBAAgB,EAAE,eAAe;AACxD,gBAAM,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB;AAC3D,gBAAM,mBACJ,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,cAAc;AACpE,gBAAM,uBACJ,EAAE,+BACF,EAAE,uBACF,EAAE,kBACF;AAAA,QACJ;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AAGA,QAAI,MAAM,gBAAgB,KAAK,MAAM,iBAAiB,EAAG,QAAO;AAGhE,QAAI,CAAC,aAAa;AAChB,YAAM,OAAOA,KAAG,SAAS,QAAQ;AACjC,oBAAc,KAAK,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,IACpD;AAEA,UAAM,YAAYD,OAAK,SAAS,UAAU,QAAQ;AAClD,UAAM,cAAcA,OAAK,SAASA,OAAK,QAAQ,QAAQ,CAAC;AAExD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,OAAmB,QAAgB,UAAkB;AAC1E,QAAM,QAAQ,UAAU,SAAS,QAAQ,OAAO,QAAQ;AACxD,QAAM,YAAa,MAAM,cAAc,MAAa,MAAM;AAC1D,QAAM,aAAc,MAAM,eAAe,MAAa,MAAM;AAC5D,QAAM,YAAa,MAAM,kBAAkB,MAAa,MAAM;AAC9D,SAAO,YAAY,aAAa;AAClC;AAGA,SAAS,gBAAgB,UAA4C;AACnE,QAAM,MAAM,oBAAI,IAAuE;AAEvF,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,IAAI,IAAI,EAAE,IAAI,KAAK;AAAA,MAClC,UAAU;AAAA,MACV,OAAO,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,qBAAqB,EAAE;AAAA,MACrF,QAAQ,CAAC;AAAA,IACX;AAEA,aAAS;AACT,aAAS,MAAM,eAAe,EAAE,MAAM;AACtC,aAAS,MAAM,gBAAgB,EAAE,MAAM;AACvC,aAAS,MAAM,mBAAmB,EAAE,MAAM;AAC1C,aAAS,MAAM,uBAAuB,EAAE,MAAM;AAC9C,aAAS,OAAO,KAAK,EAAE,KAAK;AAE5B,QAAI,IAAI,EAAE,MAAM,QAAQ;AAAA,EAC1B;AAEA,SAAO,MAAM,KAAK,IAAI,QAAQ,CAAC,EAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,OAAO;AAAA,IACtB;AAAA,IACA,UAAU,KAAK;AAAA,IACf,OAAO,KAAK;AAAA,IACZ,MAAM,cAAc,KAAK,OAAO,KAAK,OAAO,SAAS,MAAM,IAAI,SAAS,QAAQ;AAAA,EAClF,EAAE,EACD,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAChD;AAEA,SAAS,gBACP,UACA,WACA,SACkB;AAClB,SAAO,SAAS,OAAO,CAAC,MAAM,EAAE,QAAQ,aAAa,EAAE,QAAQ,OAAO;AACxE;AAEA,SAAS,SAAS,UAAwC;AACxD,SAAO,SAAS;AAAA,IACd,CAAC,KAAK,OAAO;AAAA,MACX,aAAa,IAAI,cAAc,EAAE,MAAM;AAAA,MACvC,cAAc,IAAI,eAAe,EAAE,MAAM;AAAA,MACzC,iBAAiB,IAAI,kBAAkB,EAAE,MAAM;AAAA,MAC/C,qBAAqB,IAAI,sBAAsB,EAAE,MAAM;AAAA,IACzD;AAAA,IACA,EAAE,aAAa,GAAG,cAAc,GAAG,iBAAiB,GAAG,qBAAqB,EAAE;AAAA,EAChF;AACF;AAEA,SAAS,QAAQ,UAAoC;AACnD,SAAO,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,cAAc,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC;AAC7E;AAGA,SAAS,IAAI,GAAmB;AAC9B,SAAO,EAAE,eAAe,OAAO;AACjC;AAEA,SAAS,QAAQ,GAAmB;AAClC,SAAO,IAAI,EAAE,QAAQ,CAAC,CAAC;AACzB;AAEA,SAAS,YAAY,SAAiB,QAAgB,IAAY;AAChE,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,KAAK;AACjD,QAAM,QAAQ,QAAQ;AACtB,QAAM,MAAME,OAAM,MAAM,SAAS,OAAO,MAAM,CAAC,IAAIA,OAAM,KAAK,SAAS,OAAO,KAAK,CAAC;AACpF,SAAO;AACT;AAEA,SAAS,mBACP,OACA,UACM;AACN,QAAM,QAAQ,SAAS,QAAQ;AAC/B,QAAM,OAAO,QAAQ,QAAQ;AAE7B,UAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,KAAK,CAAC,EAAE;AACpC,UAAQ,IAAI,eAAeA,OAAM,KAAK,OAAO,SAAS,MAAM,CAAC,CAAC,EAAE;AAChE,UAAQ,IAAI,oBAAoBA,OAAM,MAAM,IAAI,MAAM,WAAW,CAAC,CAAC,EAAE;AACrE,UAAQ,IAAI,oBAAoBA,OAAM,MAAM,IAAI,MAAM,YAAY,CAAC,CAAC,EAAE;AACtE,UAAQ,IAAI,oBAAoBA,OAAM,MAAM,IAAI,MAAM,eAAe,CAAC,CAAC,EAAE;AACzE,UAAQ,IAAI,qBAAqBA,OAAM,OAAO,MAAM,QAAQ,IAAI,CAAC,CAAC,EAAE;AACtE;AAGA,SAAS,sBAAsB,UAAkC;AAC/D,QAAM,aAAa,oBAAI,IAAgD;AAEvE,aAAW,KAAK,UAAU;AACxB,UAAM,WAAW,WAAW,IAAI,EAAE,WAAW,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE;AACzE,aAAS;AACT,aAAS,QAAQ,cAAc,EAAE,OAAO,EAAE,KAAK;AAC/C,eAAW,IAAI,EAAE,aAAa,QAAQ;AAAA,EACxC;AAEA,QAAM,SAAS,MAAM,KAAK,WAAW,QAAQ,CAAC,EAC3C,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI;AAEvC,UAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,uBAAuB,CAAC,EAAE;AACtD,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,MAAM,GAAG,EAAE,GAAG;AAC9C,UAAM,MAAM,YAAa,KAAK,OAAO,QAAQ,QAAQ,IAAK,KAAK,EAAE;AACjE,YAAQ,IAAI,KAAK,GAAG,IAAIA,OAAM,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,IAAIA,OAAM,IAAI,IAAI,KAAK,QAAQ,YAAY,CAAC,IAAI,IAAI,EAAE;AAAA,EAChH;AACF;AAGA,SAAS,mBAAmB,UAAkC;AAC5D,QAAM,QAAQ,oBAAI,KAAK;AAGvB,QAAM,gBAAgB,IAAI,KAAK,KAAK;AACpC,gBAAc,QAAQ,MAAM,QAAQ,IAAI,MAAM,OAAO,KAAK,MAAM,OAAO,MAAM,IAAI,KAAK,EAAE;AACxF,QAAM,cAAc,cAAc,YAAY,EAAE,MAAM,GAAG,EAAE;AAG3D,QAAM,gBAAgB,IAAI,KAAK,aAAa;AAC5C,gBAAc,QAAQ,cAAc,QAAQ,IAAI,CAAC;AACjD,QAAM,cAAc,IAAI,KAAK,aAAa;AAC1C,cAAY,QAAQ,YAAY,QAAQ,IAAI,CAAC;AAC7C,QAAM,mBAAmB,cAAc,YAAY,EAAE,MAAM,GAAG,EAAE;AAChE,QAAM,iBAAiB,YAAY,YAAY,EAAE,MAAM,GAAG,EAAE;AAE5D,QAAM,WAAW,MAAM,YAAY,EAAE,MAAM,GAAG,EAAE;AAChD,QAAM,mBAAmB,gBAAgB,UAAU,aAAa,QAAQ;AACxE,QAAM,mBAAmB,gBAAgB,UAAU,kBAAkB,cAAc;AAEnF,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,eAAe,QAAQ,gBAAgB;AAE7C,MAAI,eAAe,GAAG;AACpB,UAAM,UAAW,eAAe,gBAAgB,eAAgB;AAChE,UAAM,QAAQ,SAAS,IAAIA,OAAM,IAAI,QAAQ,IAAI,SAAS,IAAIA,OAAM,MAAM,QAAQ,IAAIA,OAAM,IAAI,QAAQ;AACxG,UAAM,YAAY,SAAS,IAAI,IAAI,OAAO,QAAQ,CAAC,CAAC,MAAM,GAAG,OAAO,QAAQ,CAAC,CAAC;AAE9E,YAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,sBAAsB,CAAC,EAAE;AACrD,YAAQ,IAAI,gBAAgBA,OAAM,OAAO,QAAQ,YAAY,CAAC,CAAC,KAAK,iBAAiB,MAAM,YAAY;AACvG,YAAQ,IAAI,gBAAgBA,OAAM,OAAO,QAAQ,YAAY,CAAC,CAAC,KAAK,iBAAiB,MAAM,YAAY;AACvG,YAAQ,IAAI,aAAa,KAAK,IAAI,SAAS,EAAE;AAAA,EAC/C;AACF;AAGA,SAAS,iBAAiB,UAA4B,WAAyB;AAE7E,QAAM,gCAAgC;AACtC,QAAM,wBAAwB;AAE9B,QAAM,gBAAgB,SAAS;AAC/B,QAAM,eAAe,gBAAgB;AACrC,QAAM,aAAa,eAAe;AAClC,QAAM,aAAa,aAAa;AAChC,QAAM,MAAM,YAAY,KAAM,aAAa,aAAa,YAAa,MAAM;AAE3E,UAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,cAAc,CAAC,IAAIA,OAAM,IAAI,sCAAsC,CAAC,EAAE;AAClG,UAAQ,IAAI,0BAA0BA,OAAM,KAAK,OAAO,aAAa,CAAC,CAAC,EAAE;AACzE,UAAQ,IAAI,2BAA2BA,OAAM,KAAK,GAAG,WAAW,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,YAAY,OAAO;AAC3G,UAAQ,IAAI,4BAA4BA,OAAM,MAAM,QAAQ,UAAU,CAAC,CAAC,SAAS,qBAAqB,MAAM;AAC5G,UAAQ,IAAI,cAAcA,OAAM,OAAO,QAAQ,SAAS,CAAC,CAAC,EAAE;AAC5D,MAAI,MAAM,GAAG;AACX,YAAQ,IAAI,UAAUA,OAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE;AAAA,EAC3D;AACF;AAGA,eAAsB,cAAc,UAAgE,CAAC,GAAkB;AACrH,aAAW,2BAA2B;AAEtC,QAAM,SAAS,QAAQ,UAAU;AAEjC,QAAM,UAAUC,KAAI,sCAAsC,EAAE,MAAM;AAElE,QAAM,eAAe,iBAAiB;AACtC,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,KAAK,mCAAmC;AAChD,YAAQ,gDAAgD;AACxD,YAAQ,kDAAkD;AAC1D;AAAA,EACF;AAEA,QAAM,WAA6B,CAAC;AACpC,aAAW,QAAQ,cAAc;AAC/B,UAAM,IAAI,iBAAiB,IAAI;AAC/B,QAAI,EAAG,UAAS,KAAK,CAAC;AAAA,EACxB;AAEA,UAAQ,QAAQ,UAAU,SAAS,MAAM,kBAAkB,aAAa,MAAM,YAAY;AAE1F,MAAI,SAAS,WAAW,GAAG;AACzB,eAAW,4CAA4C;AACvD;AAAA,EACF;AAGA,QAAM,SAAQ,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAElD,QAAM,aAAY,oBAAI,KAAK,GAAE,OAAO;AACpC,QAAM,eAAe,cAAc,IAAI,IAAI,YAAY;AACvD,QAAM,YAAY,oBAAI,KAAK;AAC3B,YAAU,QAAQ,UAAU,QAAQ,IAAI,YAAY;AACpD,QAAM,eAAe,UAAU,YAAY,EAAE,MAAM,GAAG,EAAE;AAExD,QAAM,aAAa,MAAM,MAAM,GAAG,CAAC,IAAI;AAEvC,QAAM,gBAAgB,gBAAgB,UAAU,OAAO,KAAK;AAC5D,QAAM,eAAe,gBAAgB,UAAU,cAAc,KAAK;AAClE,QAAM,gBAAgB,gBAAgB,UAAU,YAAY,KAAK;AAGjE,qBAAmB,UAAU,KAAK,KAAK,aAAa;AACpD,qBAAmB,aAAa,YAAY;AAC5C,qBAAmB,cAAc,aAAa;AAG9C,QAAM,YAAY,QAAQ,aAAa;AACvC,QAAM,gBAAgB,KAAK,IAAK,YAAY,SAAU,KAAK,GAAG;AAC9D,QAAM,cAAc,IAAI;AAAA,KACtB,oBAAI,KAAK,GAAE,YAAY;AAAA,KACvB,oBAAI,KAAK,GAAE,SAAS,IAAI;AAAA,IACxB;AAAA,EACF,EAAE,QAAQ;AACV,QAAM,cAAa,oBAAI,KAAK,GAAE,QAAQ;AACtC,QAAM,gBAAgB,cAAc;AACpC,QAAM,WAAW,aAAa,IAAI,YAAY,aAAa;AAC3D,QAAM,oBACJ,WAAW,IAAI,KAAK,OAAO,SAAS,aAAa,QAAQ,IAAI;AAE/D,UAAQ,IAAI;AAAA,EAAKD,OAAM,KAAK,IAAI,MAAM,cAAc,CAAC,EAAE;AACvD,UAAQ;AAAA,IACN,KAAK,YAAY,aAAa,CAAC,IAAI,KAAK,MAAM,aAAa,CAAC,YAAY,QAAQ,SAAS,CAAC,OAAO,QAAQ,MAAM,CAAC;AAAA,EAClH;AACA,UAAQ;AAAA,IACN,4CAA4CA,OAAM,KAAK,OAAO,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAAC,CAAC;AAAA,EAChG;AACA,UAAQ,IAAI,oBAAoBA,OAAM,OAAO,QAAQ,QAAQ,CAAC,CAAC,EAAE;AAGjE,MAAI,iBAAiB,IAAI;AACvB,YAAQ,IAAIA,OAAM,IAAI,KAAK,oDAAoD,CAAC;AAAA,EAClF,WAAW,iBAAiB,IAAI;AAC9B,YAAQ,IAAIA,OAAM,OAAO,sDAAsD,CAAC;AAAA,EAClF,WAAW,iBAAiB,IAAI;AAC9B,YAAQ,IAAIA,OAAM,KAAK,mDAAmD,CAAC;AAAA,EAC7E;AAGA,QAAM,eAAe,cAAc,OAAO,OAAK,EAAE,UAAU,MAAM;AACjE,QAAM,iBAAiB,cAAc,OAAO,OAAK,EAAE,UAAU,QAAQ;AACrE,QAAM,WAAW,QAAQ,YAAY;AACrC,QAAM,aAAa,QAAQ,cAAc;AAEzC,MAAI,WAAW,aAAa,KAAK,aAAa,SAAS,GAAG;AACxD,YAAQ,IAAI;AAAA,EAAKA,OAAM,KAAK,sBAAsB,CAAC,EAAE;AACrD,YAAQ,IAAI,iBAAiBA,OAAM,OAAO,QAAQ,QAAQ,CAAC,CAAC,KAAK,aAAa,MAAM,YAAY;AAChG,YAAQ,IAAI,mBAAmBA,OAAM,OAAO,QAAQ,UAAU,CAAC,CAAC,KAAK,eAAe,MAAM,YAAY;AACtG,YAAQ,IAAIA,OAAM,IAAI,kHAAkH,CAAC;AAAA,EAC3I;AAGA,wBAAsB,aAAa;AAGnC,qBAAmB,QAAQ;AAG3B,mBAAiB,eAAe,SAAS;AAGzC,UAAQ;AAAA,IACN;AAAA,EAAKA,OAAM,IAAI,8DAA8D,CAAC;AAAA,EAChF;AACA,UAAQ;AAAA,IACNA,OAAM,IAAI,yDAAyD;AAAA,EACrE;AACA,UAAQ,IAAI,EAAE;AAGd,MAAI,QAAQ,KAAK;AACf,UAAM,UAAUF,OAAK,KAAK,QAAQ,IAAI,GAAG,iBAAiB;AAC1D,UAAM,YAAY;AAClB,UAAM,QAAQ,gBAAgB,QAAQ;AACtC,UAAM,UAAU,MAAM;AAAA,MAAI,OACxB,GAAG,EAAE,IAAI,IAAI,EAAE,QAAQ,IAAI,EAAE,MAAM,WAAW,IAAI,EAAE,MAAM,YAAY,IAAI,EAAE,MAAM,eAAe,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;AAAA,IACxH,EAAE,KAAK,IAAI;AACX,UAAMC,KAAG,UAAU,SAAS,YAAY,SAAS,OAAO;AACxD,eAAW,mBAAmB,OAAO,EAAE;AAAA,EACzC;AAGA,MAAI,QAAQ,QAAQ;AAClB,UAAM,gBAAgB,UAAU,eAAe,cAAc,aAAa;AAAA,EAC5E;AACF;AAGA,eAAe,gBACb,aACA,eACA,cACA,eACe;AACf,QAAM,UAAUE,KAAI,yBAAyB,EAAE,MAAM;AAErD,QAAM,aAAyB;AAAA,IAC7B,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,YAAY;AAAA,IACZ,OAAO,gBAAgB,WAAW;AAAA,IAClC,UAAU,YACP,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC,EAC3C,MAAM,GAAG,EAAE,EACX,IAAI,CAAC,OAAO;AAAA,MACX,GAAG;AAAA,MACH,UAAU,EAAE;AAAA;AAAA,IACd,EAAE;AAAA,IACJ,QAAQ;AAAA,MACN,OAAO;AAAA,QACL,OAAO,SAAS,aAAa;AAAA,QAC7B,MAAM,QAAQ,aAAa;AAAA,QAC3B,UAAU,cAAc;AAAA,MAC1B;AAAA,MACA,UAAU;AAAA,QACR,OAAO,SAAS,YAAY;AAAA,QAC5B,MAAM,QAAQ,YAAY;AAAA,QAC1B,UAAU,aAAa;AAAA,MACzB;AAAA,MACA,WAAW;AAAA,QACT,OAAO,SAAS,aAAa;AAAA,QAC7B,MAAM,QAAQ,aAAa;AAAA,QAC3B,UAAU,cAAc;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,QAAQ,IAAI;AAC9B,QAAM,WAAWH,OAAK,KAAK,WAAW,iBAAiB;AACvD,QAAM,eAAeA,OAAK,KAAK,cAAc,aAAa,sBAAsB;AAChF,QAAM,gBAAgBA,OAAK,KAAK,WAAW,sBAAsB;AAEjE,QAAMC,KAAG,UAAU,UAAU,YAAY,EAAE,QAAQ,EAAE,CAAC;AACtD,UAAQ,yBAAyB,QAAQ,EAAE;AAE3C,MAAI,MAAMA,KAAG,WAAW,YAAY,GAAG;AACrC,UAAMA,KAAG,KAAK,cAAc,eAAe,EAAE,WAAW,KAAK,CAAC;AAC9D,YAAQ,uBAAuB,aAAa,EAAE;AAAA,EAChD,OAAO;AACL,eAAW,qDAAqD;AAAA,EAClE;AAEA,UAAQ,QAAQ,oBAAoB;AAGpC,MAAI;AACF,UAAM,EAAE,KAAK,IAAI,MAAM,OAAO,eAAe;AAC7C,UAAM,UACJ,QAAQ,aAAa,WACjB,SACA,QAAQ,aAAa,UACnB,UACA;AACR,SAAK,GAAG,OAAO,KAAK,aAAa,GAAG;AACpC,YAAQ,iCAAiC;AAAA,EAC3C,QAAQ;AACN,YAAQ,QAAQ,aAAa,yCAAyC;AAAA,EACxE;AACF;;;AC5hBA,OAAOG,YAAU;AACjB,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAgBhB,eAAsB,cAAc,YAAoC;AACtE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAE3D,MAAI,SAAS;AACb,MAAI,WAAW;AACf,MAAI,SAAS;AAEb,aAAW,sBAAiB;AAC5B,UAAQ,IAAI,EAAE;AAGd,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,aAAS,wDAAwD;AACjE;AACA,gBAAY,QAAQ,UAAU,MAAM;AACpC;AAAA,EACF;AAEA,QAAM,SAAS,aAA0B,UAAU;AACnD,MAAI,CAAC,QAAQ;AACX,aAAS,oFAAoF;AAC7F;AACA,gBAAY,QAAQ,UAAU,MAAM;AACpC;AAAA,EACF;AAEA,aAAW,8BAA8B,OAAO,OAAO,GAAG;AAC1D;AAGA,MAAI,OAAO,YAAY,SAAS;AAC9B;AAAA,MACE,6CAAwC,OAAO,OAAO,aAAa,OAAO;AAAA,IAC5E;AACA;AAAA,EACF,OAAO;AACL,eAAW,yBAAyB,OAAO,GAAG;AAC9C;AAAA,EACF;AAGA,aAAW,YAAY,OAAO,WAAW;AACvC,UAAM,eACJ,aAAa,cACT,gBAAgB,WAChB,aAAa,iBACX,gBAAgB,cAChB;AACR,UAAM,eAAeA,OAAK,KAAK,YAAY,YAAY;AAEvD,QAAI,WAAW,YAAY,GAAG;AAC5B,iBAAW,GAAG,QAAQ,qBAAqB;AAC3C;AAAA,IACF,OAAO;AACL,eAAS,GAAG,QAAQ,4CAA4C;AAChE;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAA0B,CAAC;AACjC,aAAW,SAAS,OAAO,UAAU;AACnC,UAAM,kBAAkBA,OAAK,KAAK,YAAY,gBAAgB,cAAc,KAAK;AACjF,UAAM,kBAAkBA,OAAK,KAAK,YAAY,gBAAgB,cAAc,KAAK;AAEjF,QAAI,CAAC,WAAW,eAAe,KAAK,CAAC,WAAW,eAAe,GAAG;AAChE,oBAAc,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,eAAW,GAAG,OAAO,SAAS,MAAM,IAAI,OAAO,SAAS,MAAM,iBAAiB;AAC/E;AAAA,EACF,OAAO;AACL;AAAA,MACE,GAAG,OAAO,SAAS,SAAS,cAAc,MAAM,IAAI,OAAO,SAAS,MAAM,mCAA8B,cAAc,KAAK,IAAI,CAAC;AAAA,IAClI;AACA;AAAA,EACF;AAGA,QAAM,YAAYA,OAAK,KAAK,YAAY,UAAU,QAAQ;AAC1D,QAAM,gBAA0B,CAAC;AACjC,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,YAAYA,OAAK,KAAK,WAAW,KAAK;AAC5C,QAAI,CAAC,WAAW,SAAS,GAAG;AAC1B,oBAAc,KAAK,KAAK;AAAA,IAC1B;AAAA,EACF;AAEA,MAAI,cAAc,WAAW,GAAG;AAC9B,eAAW,GAAG,OAAO,OAAO,MAAM,IAAI,OAAO,OAAO,MAAM,iBAAiB;AAC3E;AAAA,EACF,OAAO;AACL;AAAA,MACE,GAAG,OAAO,OAAO,SAAS,cAAc,MAAM,IAAI,OAAO,OAAO,MAAM,mCAA8B,cAAc,KAAK,IAAI,CAAC;AAAA,IAC9H;AACA;AAAA,EACF;AAGA,QAAM,UAAUC,KAAI,+BAA+B,EAAE,MAAM;AAC3D,MAAI;AACJ,MAAI;AACF,gBAAY,MAAM,YAAY,UAAU;AACxC,YAAQ,QAAQ,oBAAoB;AAAA,EACtC,SAAS,KAAK;AACZ,YAAQ,KAAK,wBAAwB;AACrC,eAAW,kCAAkC,OAAO,GAAG,CAAC,EAAE;AAC1D;AACA,gBAAY,OAAO;AAAA,EACrB;AAEA,QAAM,oBAAoB,mBAAmB,OAAO,YAAY,SAAS;AACzE,MAAI,kBAAkB,WAAW,GAAG;AAClC,eAAW,yCAAyC;AACpD;AAAA,EACF,OAAO;AACL,eAAW,WAAW,mBAAmB;AACvC,iBAAW,OAAO;AAClB;AAAA,IACF;AAAA,EACF;AAGA,QAAM,YAAwE;AAAA,IAC5E,EAAE,MAAM,kBAAkB,KAAK,aAAa;AAAA,IAC5C,EAAE,MAAM,gBAAgB,KAAK,WAAW;AAAA,IACxC,EAAE,MAAM,cAAc,KAAK,SAAS;AAAA,IACpC,EAAE,MAAM,kBAAkB,KAAK,aAAa;AAAA,IAC5C,EAAE,MAAM,aAAa,KAAK,QAAQ;AAAA,EACpC;AAEA,aAAW,OAAO,WAAW;AAC3B,QAAI,UAAU,WAAW,IAAI,GAAG,GAAG;AACjC,iBAAW,GAAG,IAAI,IAAI,aAAa;AACnC;AAAA,IACF,OAAO;AACL,iBAAW,GAAG,IAAI,IAAI,iBAAiB;AACvC;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAkF;AAAA,IACtF,EAAE,MAAM,cAAc,KAAK,cAAc,MAAM,kCAAkC;AAAA,IACjF,EAAE,MAAM,UAAU,KAAK,UAAU,MAAM,wBAAwB;AAAA,IAC/D,EAAE,MAAM,YAAY,KAAK,YAAY,MAAM,0BAA0B;AAAA,IACrE,EAAE,MAAM,YAAY,KAAK,WAAW,MAAM,sCAAsC;AAAA,IAChF,EAAE,MAAM,QAAQ,KAAK,QAAQ,MAAM,sBAAsB;AAAA,IACzD,EAAE,MAAM,mBAAmB,KAAK,kBAAkB,MAAM,uCAAuC;AAAA,EACjG;AAEA,aAAW,QAAQ,YAAY;AAC7B,QAAI,UAAU,MAAM,KAAK,GAAG,GAAG;AAC7B,iBAAW,GAAG,KAAK,IAAI,WAAW;AAClC;AAAA,IACF,OAAO;AACL,eAAS,GAAG,KAAK,IAAI,2CAAsC,KAAK,IAAI,EAAE;AACtE;AAAA,IACF;AAAA,EACF;AAGA,UAAQ,IAAI,EAAE;AACd,cAAY,QAAQ,UAAU,MAAM;AACtC;AAEA,SAAS,YAAY,QAAgB,UAAkB,QAAsB;AAC3E,QAAM,QAAkB,CAAC;AACzB,QAAM,KAAKC,OAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAC1C,MAAI,WAAW,EAAG,OAAM,KAAKA,OAAM,OAAO,GAAG,QAAQ,WAAW,CAAC;AACjE,MAAI,SAAS,EAAG,OAAM,KAAKA,OAAM,IAAI,GAAG,MAAM,SAAS,CAAC;AAExD,UAAQ,IAAIA,OAAM,KAAK,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE,CAAC;AACxD;AAEA,SAAS,mBACP,UACA,SACU;AACV,QAAM,WAAqB,CAAC;AAG5B,MAAI,SAAS,cAAc,QAAQ,WAAW;AAC5C,aAAS;AAAA,MACP,+CAA0C,SAAS,SAAS,SAAS,QAAQ,SAAS;AAAA,IACxF;AAAA,EACF;AAGA,MAAI,SAAS,iBAAiB,QAAQ,iBAAiB,SAAS,kBAAkB,QAAQ,eAAe;AACvG,aAAS;AAAA,MACP,4BAA4B,SAAS,aAAa,WAAM,QAAQ,aAAa;AAAA,IAC/E;AAAA,EACF;AAGA,MAAI,SAAS,cAAc,QAAQ,cAAc,SAAS,eAAe,QAAQ,YAAY;AAC3F,aAAS;AAAA,MACP,wBAAwB,SAAS,UAAU,WAAM,QAAQ,UAAU;AAAA,IACrE;AAAA,EACF;AAGA,QAAM,aAAa,IAAI,IAAI,SAAS,OAAO;AAC3C,QAAM,aAAa,IAAI,IAAI,QAAQ,OAAO;AAC1C,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,WAAW,IAAI,KAAK,GAAG;AAC1B,eAAS,KAAK,uDAAkD,KAAK,EAAE;AAAA,IACzE;AAAA,EACF;AACA,aAAW,SAAS,YAAY;AAC9B,QAAI,CAAC,WAAW,IAAI,KAAK,GAAG;AAC1B,eAAS,KAAK,kDAA6C,KAAK,EAAE;AAAA,IACpE;AAAA,EACF;AAGA,MAAI,SAAS,eAAe,QAAQ,YAAY;AAC9C,aAAS;AAAA,MACP,cAAc,QAAQ,aAAa,8BAA8B,oBAAoB;AAAA,IACvF;AAAA,EACF;AAGA,MAAI,SAAS,aAAa,QAAQ,UAAU;AAC1C,aAAS;AAAA,MACP,YAAY,QAAQ,WAAW,8BAA8B,oBAAoB;AAAA,IACnF;AAAA,EACF;AAGA,MAAI,SAAS,mBAAmB,QAAQ,gBAAgB;AACtD,aAAS;AAAA,MACP,4BAA4B,SAAS,cAAc,WAAM,QAAQ,cAAc;AAAA,IACjF;AAAA,EACF;AAGA,QAAM,WAAW,OAAO,KAAK,QAAQ,KAAK;AAC1C,aAAW,OAAO,UAAU;AAC1B,QAAI,QAAQ,MAAM,GAAG,KAAK,CAAC,SAAS,MAAM,GAAG,GAAG;AAC9C,eAAS,KAAK,oDAA+C,GAAG,EAAE;AAAA,IACpE;AACA,QAAI,CAAC,QAAQ,MAAM,GAAG,KAAK,SAAS,MAAM,GAAG,GAAG;AAC9C,eAAS,KAAK,+CAA0C,GAAG,EAAE;AAAA,IAC/D;AAAA,EACF;AAGA,MAAI,SAAS,QAAQ,QAAQ,KAAK;AAChC,aAAS,KAAK,gBAAgB,SAAS,GAAG,WAAM,QAAQ,GAAG,EAAE;AAAA,EAC/D;AAEA,SAAO;AACT;;;ACnRA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf,OAAOC,YAAW;AAClB,OAAOC,UAAS;AAgBhB,eAAsB,YAAY,YAAoC;AACpE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAE3D,UAAQ,IAAIC,OAAM,KAAK,gCAA2B,CAAC;AAGnD,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,aAAS,uDAAuD;AAChE;AAAA,EACF;AAEA,QAAM,iBAAiB,aAA0B,UAAU;AAC3D,MAAI,CAAC,gBAAgB;AACnB,aAAS,wEAAwE;AACjF;AAAA,EACF;AAGA,QAAM,gBAAgB,SAAS,eAAe,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACvE,QAAM,eAAe,SAAS,QAAQ,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AACvD,MAAI,kBAAkB,cAAc;AAClC;AAAA,MACE,qCAAqC,eAAe,OAAO,yBAAyB,OAAO;AAAA,IAC7F;AAAA,EACF;AAGA,QAAM,UAAUC,KAAI,qBAAqB,EAAE,MAAM;AACjD,QAAM,UAAU,MAAM,YAAY,UAAU;AAC5C,UAAQ,QAAQ,iBAAiB;AAEjC,QAAM,UAAU,eAAe;AAG/B,aAAW,eAAe;AAC1B,QAAM,eAAe,UAAU,SAAS,OAAO;AAC/C,MAAI,aAAa,WAAW,GAAG;AAC7B,YAAQ,IAAID,OAAM,IAAI,6BAA6B,CAAC;AAAA,EACtD,OAAO;AACL,eAAW,UAAU,cAAc;AACjC,UAAI,OAAO,SAAS,SAAS;AAC3B,gBAAQ,IAAIA,OAAM,MAAM,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,MAChD,WAAW,OAAO,SAAS,YAAY;AACrC,gBAAQ,IAAIA,OAAM,OAAO,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,MACjD,OAAO;AACL,gBAAQ,IAAIA,OAAM,IAAI,OAAO,OAAO,KAAK,EAAE,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAGA,aAAW,cAAc;AAEzB,QAAM,eAAe,gBAAgB,OAAO;AAC5C,QAAM,eAAe,gBAAgB,OAAO;AAE5C,MAAI,WAAW;AACf,MAAI,QAAQ;AACZ,MAAI,YAAY;AAGhB,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,MAAM,iBAAiB,OAAO;AAAA,IAC9B;AAAA,IACA;AAAA,EACF;AACA,gBAAc,cAAc;AAC5B,MAAI,eAAe,WAAW,WAAY;AAAA,WACjC,eAAe,WAAW,QAAS;AAAA,MACvC;AAGL,QAAM,oBAAoB;AAAA,IACxB;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,MAAM,oBAAoB,OAAO;AAAA,IACjC;AAAA,IACA;AAAA,EACF;AACA,gBAAc,iBAAiB;AAC/B,MAAI,kBAAkB,WAAW,WAAY;AAAA,WACpC,kBAAkB,WAAW,QAAS;AAAA,MAC1C;AAGL,QAAM,YAAYD,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACpE,QAAM,aAAa,gBAAgB,SAAS;AAC5C,UAAQ,IAAIC,OAAM,IAAI,eAAe,gBAAgB,YAAY,MAAM,UAAU,UAAU,CAAC;AAC5F;AAGA,QAAM,YAAYD,OAAK,KAAK,YAAY,oBAAoB,QAAQ;AACpE,QAAM,aAAa,eAAe,QAAQ,UAAU;AACpD,UAAQ,IAAIC,OAAM,IAAI,+BAA+B,UAAU,UAAU,CAAC;AAC1E;AAGA,UAAQ,IAAI,EAAE;AACd,QAAM,QAAkB,CAAC;AACzB,MAAI,WAAW,EAAG,OAAM,KAAK,GAAG,QAAQ,0BAA0B;AAClE,MAAI,QAAQ,EAAG,OAAM,KAAK,GAAG,KAAK,QAAQ;AAC1C,QAAM,UAAU;AAChB,QAAM,KAAK,GAAG,OAAO,UAAU;AAE/B,UAAQ,YAAY,MAAM,KAAK,IAAI,CAAC,EAAE;AACtC,UAAQ,6CAA6C;AACvD;AAEA,IAAM,qBAAqB;AAO3B,SAAS,UAAU,SAAsB,SAAqC;AAC5E,QAAM,UAAyB,CAAC;AAGhC,MAAI,QAAQ,cAAc,QAAQ,aAAa,QAAQ,cAAc,UAAU;AAC7E,QAAI,QAAQ,kBAAkB,QAAQ,eAAe;AACnD,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,OAAO,oBAAoB,QAAQ,iBAAiB,SAAS,WAAM,QAAQ,iBAAiB,SAAS;AAAA,MACvG,CAAC;AAAA,IACH;AAAA,EACF,WAAW,QAAQ,cAAc,QAAQ,WAAW;AAClD,QAAI,QAAQ,cAAc,WAAW;AACnC,cAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,GAAG,QAAQ,SAAS,sBAAsB,CAAC;AAAA,IACpF;AACA,QAAI,QAAQ,cAAc,WAAW;AACnC,cAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,QAAQ,SAAS,YAAY,CAAC;AAAA,IACxE;AAAA,EACF;AAGA,MAAI,QAAQ,eAAe,QAAQ,cAAc,QAAQ,cAAc,UAAU;AAC/E,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,gBAAgB,QAAQ,cAAc,SAAS,WAAM,QAAQ,cAAc,SAAS;AAAA,IAC7F,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,QAAQ,cAAc,QAAQ,YAAY;AAC7C,YAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,sBAAsB,CAAC;AAAA,EAC9D,WAAW,QAAQ,cAAc,CAAC,QAAQ,YAAY;AACpD,YAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,gCAAgC,CAAC;AAAA,EAC1E;AAGA,QAAM,YAAY,IAAI,IAAI,QAAQ,OAAO;AACzC,QAAM,YAAY,IAAI,IAAI,QAAQ,OAAO;AACzC,aAAW,SAAS,WAAW;AAC7B,QAAI,CAAC,UAAU,IAAI,KAAK,GAAG;AACzB,cAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACtE;AAAA,EACF;AACA,aAAW,SAAS,WAAW;AAC7B,QAAI,CAAC,UAAU,IAAI,KAAK,GAAG;AACzB,cAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACxE;AAAA,EACF;AAGA,MACE,QAAQ,QAAQ,SAAS,UAAU,KACnC,QAAQ,QAAQ,SAAS,UAAU,KACnC,QAAQ,oBAAoB,QAAQ,iBACpC;AACA,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,qBAAqB,QAAQ,mBAAmB,SAAS,WAAM,QAAQ,mBAAmB,SAAS;AAAA,IAC5G,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,QAAQ,YAAY,QAAQ,UAAU;AACzC,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,oBAAoB,QAAQ,eAAe,KAAK,QAAQ,YAAY,MAAM,EAAE;AAAA,IACrF,CAAC;AAAA,EACH,WAAW,QAAQ,YAAY,CAAC,QAAQ,UAAU;AAChD,YAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,8BAA8B,CAAC;AAAA,EACxE,WAAW,QAAQ,iBAAiB,QAAQ,gBAAgB,QAAQ,UAAU;AAC5E,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,kBAAkB,QAAQ,gBAAgB,SAAS,WAAM,QAAQ,gBAAgB,SAAS;AAAA,IACnG,CAAC;AAAA,EACH;AAGA,MAAI,QAAQ,QAAQ,QAAQ,KAAK;AAC/B,QAAI,QAAQ,QAAQ,QAAQ;AAC1B,cAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,GAAG,QAAQ,GAAG,sBAAsB,CAAC;AAAA,IAC9E;AACA,QAAI,QAAQ,QAAQ,QAAQ;AAC1B,cAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAAA,IACxE;AAAA,EACF;AAGA,MAAI,QAAQ,mBAAmB,QAAQ,gBAAgB;AACrD,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,OAAO,oBAAoB,QAAQ,cAAc,WAAM,QAAQ,cAAc;AAAA,IAC/E,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,QAAQ,OAAO,YAAY,QAAQ,OAAO,UAAU;AACvD,YAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,6BAA6B,CAAC;AAAA,EACrE,WAAW,QAAQ,OAAO,YAAY,CAAC,QAAQ,OAAO,UAAU;AAC9D,YAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,uCAAuC,CAAC;AAAA,EACjF;AAGA,MAAI,QAAQ,SAAS,QAAQ,OAAO;AAClC,UAAM,YAAY,OAAO,KAAK,QAAQ,KAAK;AAC3C,eAAW,QAAQ,WAAW;AAC5B,UAAI,CAAC,QAAQ,MAAM,IAAI,KAAK,QAAQ,MAAM,IAAI,GAAG;AAC/C,gBAAQ,KAAK,EAAE,MAAM,SAAS,OAAO,GAAG,IAAI,sBAAsB,CAAC;AAAA,MACrE;AAAA,IACF;AACA,UAAM,eAAe,OAAO,KAAK,QAAQ,KAAK;AAC9C,eAAW,QAAQ,cAAc;AAC/B,UAAI,QAAQ,MAAM,IAAI,KAAK,CAAC,QAAQ,MAAM,IAAI,GAAG;AAC/C,gBAAQ,KAAK,EAAE,MAAM,WAAW,OAAO,GAAG,IAAI,sBAAsB,CAAC;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAQA,SAAS,kBACP,YACA,UACA,QACAE,WACA,cACA,cACkB;AAClB,QAAM,WAAWH,OAAK,KAAK,YAAY,QAAQ;AAC/C,QAAM,iBAAiB,aAAa,QAAQ;AAC5C,QAAM,aAAaG,UAAS;AAG5B,MAAI,CAAC,gBAAgB;AACnB,QAAI,OAAO,UAAU,SAAS,QAAQ,GAAG;AACvC,aAAO,EAAE,UAAU,QAAQ,SAAS,QAAQ,iCAAiC;AAAA,IAC/E;AACA,WAAO,EAAE,UAAU,QAAQ,aAAa,QAAQ,iBAAiB;AAAA,EACnE;AAGA,MAAI,eAAe,KAAK,MAAM,WAAW,KAAK,GAAG;AAC/C,WAAO,EAAE,UAAU,QAAQ,YAAY;AAAA,EACzC;AAGA,QAAM,iBAAiB,aAAa,OAAO,CAAC,MAAM,CAAC,aAAa,SAAS,CAAC,CAAC;AAC3E,QAAM,mBAAmB,aAAa,OAAO,CAAC,MAAM,CAAC,aAAa,SAAS,CAAC,CAAC;AAE7E,QAAM,kBAA4B,CAAC;AACnC,MAAI,eAAe,SAAS,GAAG;AAC7B,oBAAgB,KAAK,IAAI,eAAe,KAAK,KAAK,CAAC,EAAE;AAAA,EACvD;AACA,MAAI,iBAAiB,SAAS,GAAG;AAC/B,oBAAgB,KAAK,IAAI,iBAAiB,KAAK,KAAK,CAAC,EAAE;AAAA,EACzD;AAEA,QAAM,SACJ,gBAAgB,SAAS,IACrB,+BAA+B,gBAAgB,KAAK,IAAI,CAAC,KACzD;AAEN,SAAO,EAAE,UAAU,QAAQ,YAAY,OAAO;AAChD;AAEA,SAAS,cAAc,QAAgC;AACrD,MAAI,OAAO,WAAW,SAAS;AAC7B,YAAQ,IAAIF,OAAM,MAAM,eAAe,OAAO,QAAQ,EAAE,KAAK,OAAO,SAASA,OAAM,IAAI,KAAK,OAAO,MAAM,GAAG,IAAI,GAAG;AAAA,EACrH,WAAW,OAAO,WAAW,YAAY;AACvC,YAAQ;AAAA,MACNA,OAAM,OAAO,eAAe,OAAO,QAAQ,EAAE,KAAK,OAAO,SAASA,OAAM,IAAI,KAAK,OAAO,MAAM,GAAG,IAAI;AAAA,IACvG;AAAA,EACF,OAAO;AACL,YAAQ,IAAIA,OAAM,IAAI,eAAe,OAAO,QAAQ,EAAE,CAAC;AAAA,EACzD;AACF;AAEA,SAAS,gBAAgB,SAAyB;AAChD,MAAI;AACF,QAAI,CAACG,KAAG,WAAW,OAAO,EAAG,QAAO;AACpC,UAAM,UAAUA,KAAG,YAAY,OAAO;AACtC,WAAO,QAAQ,OAAO,CAAC,MAAc,CAAC,EAAE,WAAW,GAAG,CAAC,EAAE;AAAA,EAC3D,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AC1UA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AAEf,OAAOC,UAAS;AAChB,SAAS,UAAAC,eAAc;AAgBvB,IAAM,iBAAiB;AAAA,EACrB,UAAU,EAAE,MAAM,kBAAkB,OAAO,WAAW;AAAA,EACtD,OAAO,EAAE,MAAM,mBAAmB,OAAO,QAAQ;AAAA,EACjD,OAAO,EAAE,MAAM,eAAe,OAAO,QAAQ;AAC/C;AAEA,SAAS,aAAa,SAAyB;AAC7C,SAAO,QACJ,QAAQ,2BAA2B,EAAE,EACrC,QAAQ,yBAAyB,EAAE,EACnC,QAAQ,2CAA2C,EAAE;AAC1D;AAEA,SAAS,WAAW,SAAyB;AAC3C,QAAM,WAAW,aAAa,OAAO;AACrC,SAAO;AAAA;AAAA;AAAA,EAAyD,QAAQ;AAC1E;AAEA,SAAS,QAAQ,SAAyB;AACxC,QAAM,WAAW,aAAa,OAAO;AAErC,QAAM,WAAW,SACd,MAAM,IAAI,EACV,IAAI,CAAC,SAAU,KAAK,SAAS,IAAI,KAAK,IAAI,KAAK,EAAG,EAClD,KAAK,IAAI;AACZ,SAAO;AAAA;AAAA;AAAA;AAAA,EAA8E,QAAQ;AAAA;AAC/F;AAEA,SAAS,QAAQ,SAAyB;AACxC,QAAM,WAAW,aAAa,OAAO;AACrC,SAAO;AAAA;AAAA;AAAA,EAAsD,QAAQ;AACvE;AAEA,eAAsB,cACpB,YACA,SACe;AACf,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAC3D,QAAM,eAAeA,OAAK,KAAK,YAAY,gBAAgB,QAAQ;AAEnE,aAAW,sBAAiB;AAG5B,MAAI,CAAC,WAAW,UAAU,KAAK,CAAC,WAAW,YAAY,GAAG;AACxD,aAAS,oEAAoE;AAC7E;AAAA,EACF;AAGA,QAAM,gBAAgB,aAAa,YAAY;AAC/C,MAAI,CAAC,eAAe;AAClB,aAAS,uEAAuE;AAChF;AAAA,EACF;AAGA,MAAI;AAEJ,MAAI,SAAS,QAAQ;AACnB,UAAM,IAAI,QAAQ,OAAO,YAAY;AACrC,QAAI,MAAM,cAAc,MAAM,WAAW,MAAM,WAAW,MAAM,OAAO;AACrE,eAAS;AAAA,IACX,OAAO;AACL,eAAS,mBAAmB,QAAQ,MAAM,yCAAyC;AACnF;AAAA,IACF;AAAA,EACF,OAAO;AACL,aAAS,MAAMC,QAAqB;AAAA,MAClC,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,6BAA6B,OAAO,WAAW;AAAA,QACvD,EAAE,MAAM,2BAA2B,OAAO,QAAQ;AAAA,QAClD,EAAE,MAAM,uBAAuB,OAAO,QAAQ;AAAA,QAC9C,EAAE,MAAM,oBAAoB,OAAO,MAAM;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,UACJ,WAAW,QAAQ,CAAC,YAAY,SAAS,OAAO,IAAI,CAAC,MAAM;AAE7D,QAAM,UAAUC,KAAI,sCAAsC,EAAE,MAAM;AAElE,QAAM,eAAiF;AAAA,IACrF,UAAU;AAAA,IACV,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAEA,MAAI,WAAW;AAEf,aAAWC,QAAO,SAAS;AACzB,UAAM,SAAS,eAAeA,IAAG;AACjC,UAAM,cAAc,aAAaA,IAAG;AACpC,UAAM,aAAaH,OAAK,KAAK,YAAY,OAAO,IAAI;AACpD,UAAM,cAAc,YAAY,aAAa;AAE7C,UAAMI,KAAG,UAAU,YAAY,aAAa,OAAO;AACnD;AAAA,EACF;AAEA,UAAQ,QAAQ,iBAAiB;AACjC,UAAQ,IAAI,EAAE;AAEd,aAAWD,QAAO,SAAS;AACzB,UAAM,SAAS,eAAeA,IAAG;AACjC,eAAW,GAAG,OAAO,IAAI,eAAe,OAAO,KAAK,GAAG;AAAA,EACzD;AAEA,UAAQ,IAAI,EAAE;AACd;AAAA,IACE,GAAG,QAAQ,QAAQ,aAAa,IAAI,MAAM,EAAE;AAAA,EAC9C;AACF;;;ACtIA,OAAOE,YAAU;AAEjB,OAAOC,YAAW;AAclB,IAAM,mBAA6C;AAAA,EACjD,mBAAmB,CAAC,eAAe,YAAY;AAAA,EAC/C,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,oBAAoB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,eAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAY,CAAC,WAAW,cAAc,YAAY,YAAY;AAChE;AAGA,SAAS,mBAAmB,OAAuB;AACjD,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,EAAG,QAAO;AACvB,MAAI,SAAS,EAAG,QAAO;AACvB,SAAO;AACT;AAEA,SAAS,oBAAoB,QAG3B;AACA,QAAM,OAAO,OAAO;AACpB,MAAI,QAAQ;AACZ,QAAM,QAA8C,CAAC;AAGrD,QAAM,eAAe,KAAK,cAAc;AACxC,MAAI,aAAc,UAAS;AAC3B,QAAM,iBACJ,KAAK,cAAc,WACf,WAAW,KAAK,iBAAiB,EAAE,KAAK,KAAK,eAAe,QAAQ,eAAe,KAAK,eAAe,UAAU,iBAAiB,QAAQ,MAC1I,KAAK,cAAc,UACjB,UACA;AACR,QAAM,KAAK,EAAE,OAAO,eAAe,KAAK,GAAG,QAAQ,aAAa,CAAC;AAGjE,QAAM,SAAS,KAAK,QAAQ;AAC5B,MAAI,OAAQ,UAAS;AACrB,QAAM,WACJ,KAAK,QAAQ,oBACT,uCACA,KAAK,QAAQ,iBACX,sBACA,KAAK,QAAQ,iBACX,iBACA;AACV,QAAM,KAAK,EAAE,OAAO,UAAU,QAAQ,OAAO,CAAC;AAG9C,MAAI,KAAK,WAAY,UAAS;AAC9B,QAAM,KAAK;AAAA,IACT,OAAO,aAAa,KAAK,mBAAmB,cAAc,EAAE;AAAA,IAC5D,QAAQ,KAAK;AAAA,EACf,CAAC;AAGD,aAAW,SAAS,KAAK,SAAS;AAChC,aAAS;AACT,UAAM,aACJ,UAAU,aACN,eAAe,KAAK,kBAAkB,KAAK,KAAK,eAAe,KAAK,EAAE,KACtE,UAAU,gBACR,gBACA,UAAU,sBACR,sBACA,UAAU,SACR,SACA;AACZ,UAAM,KAAK,EAAE,OAAO,YAAY,QAAQ,KAAK,CAAC;AAAA,EAChD;AAGA,QAAM,KAAK;AAAA,IACT,OAAO,KAAK,WACR,aAAa,KAAK,gBAAgB,UAAU,MAC5C;AAAA,IACJ,QAAQ,KAAK;AAAA,EACf,CAAC;AACD,MAAI,KAAK,SAAU,UAAS;AAG5B,QAAM,KAAK,EAAE,OAAO,SAAS,QAAQ,KAAK,MAAM,SAAS,CAAC;AAC1D,MAAI,KAAK,MAAM,SAAU,UAAS;AAElC,SAAO,EAAE,OAAO,MAAM;AACxB;AAEA,SAAS,iBAAiB,QAA4C;AACpE,QAAM,SAAmC,CAAC;AAC1C,QAAM,cAAc,oBAAI,IAAY;AAEpC,aAAW,CAAC,UAAU,cAAc,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACzE,UAAM,UAAU,OAAO,OAAO,CAAC,MAAM,eAAe,SAAS,CAAC,CAAC;AAC/D,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO,QAAQ,IAAI;AACnB,cAAQ,QAAQ,CAAC,MAAM,YAAY,IAAI,CAAC,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,QAAM,gBAAgB,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;AAC9D,MAAI,cAAc,SAAS,GAAG;AAC5B,WAAO,OAAO,IAAI;AAAA,EACpB;AAEA,SAAO;AACT;AAGA,IAAM,qBAA6C;AAAA,EACjD,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,gBAAgB;AAClB;AAEA,IAAM,oBAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,YAAY;AACd;AAGA,eAAsB,aAAa,YAAoC;AACrE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAE3D,aAAW,6BAA6B;AACxC,UAAQ,IAAI,EAAE;AAGd,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B;AAAA,MACE;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,SAAS,aAA0B,UAAU;AACnD,MAAI,CAAC,QAAQ;AACX;AAAA,MACE;AAAA,IACF;AACA;AAAA,EACF;AAEA,QAAM,OAAO,OAAO;AAGpB,UAAQ,IAAI,sBAAsBC,OAAM,KAAK,KAAK,WAAW,CAAC,EAAE;AAChE,UAAQ,IAAI,8BAA8B,OAAO,OAAO,EAAE;AAC1D,UAAQ,IAAI,sBAAsB,OAAO,WAAW,EAAE;AACtD,UAAQ,IAAI,sBAAsB,KAAK,cAAc,EAAE;AACvD,UAAQ,IAAI,EAAE;AAGd,QAAM,EAAE,OAAO,MAAM,IAAI,oBAAoB,MAAM;AACnD,QAAM,QAAQ,mBAAmB,KAAK;AACtC,QAAM,WAAW;AAEjB,UAAQ;AAAA,IACN,KAAKA,OAAM,KAAK,mBAAmB,CAAC,IAAI,KAAK,IAAI,QAAQ,KAAK,KAAK;AAAA,EACrE;AAEA,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,QAAQ;AACf,cAAQ,IAAI,OAAOA,OAAM,MAAM,QAAQ,CAAC,IAAI,KAAK,KAAK,EAAE;AAAA,IAC1D,OAAO;AACL,cAAQ,IAAI,OAAOA,OAAM,KAAK,QAAQ,CAAC,IAAIA,OAAM,KAAK,KAAK,KAAK,CAAC,EAAE;AAAA,IACrE;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AAGd,QAAM,mBAAmB,OAAO,aAAa,CAAC,GAAG;AAAA,IAAO,CAAC,MACtD,mBAAyC,SAAS,CAAC;AAAA,EACtD;AACA,QAAM,gBAAgB,gBAAgB;AAEtC,UAAQ;AAAA,IACN,KAAKA,OAAM,KAAK,eAAe,CAAC,IAAI,aAAa,qBAAqB,kBAAkB,IAAI,MAAM,EAAE;AAAA,EACtG;AACA,MAAI,gBAAgB,GAAG;AACrB,YAAQ,IAAI,OAAO,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,EACjD;AACA,UAAQ,IAAI,EAAE;AAGd,QAAM,SAAS,OAAO,YAAY,CAAC;AACnC,QAAM,cAAc,OAAO;AAC3B,QAAM,cAAc,iBAAiB,MAAM;AAE3C,UAAQ,IAAI,KAAKA,OAAM,KAAK,SAAS,CAAC,IAAI,WAAW,QAAQ;AAC7D,aAAW,CAAC,UAAU,cAAc,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpE,YAAQ,IAAI,OAAO,QAAQ,KAAK,eAAe,MAAM,EAAE;AAAA,EACzD;AACA,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,KAAKA,OAAM,KAAK,QAAQ,CAAC,EAAE;AACvC,QAAM,cAAc,OAAO,QAAQ,KAAK,KAAK;AAC7C,QAAM,gBAA0B,CAAC;AACjC,QAAM,eAAyB,CAAC;AAEhC,aAAW,CAAC,KAAK,QAAQ,KAAK,aAAa;AACzC,UAAM,cAAc,mBAAmB,GAAG,KAAK;AAC/C,QAAI,UAAU;AACZ,oBAAc,KAAK,GAAGA,OAAM,MAAM,QAAQ,CAAC,IAAI,WAAW,EAAE;AAAA,IAC9D,OAAO;AACL,mBAAa,KAAK,GAAGA,OAAM,OAAO,QAAQ,CAAC,IAAI,WAAW,EAAE;AAAA,IAC9D;AAAA,EACF;AAGA,QAAM,eAAe,CAAC,GAAG,eAAe,GAAG,YAAY;AACvD,WAAS,IAAI,GAAG,IAAI,aAAa,QAAQ,KAAK,GAAG;AAC/C,UAAM,MAAM,aACT,MAAM,GAAG,IAAI,CAAC,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC,EAC7B,KAAK,EAAE;AACV,YAAQ,IAAI,OAAO,GAAG,EAAE;AAAA,EAC1B;AACA,UAAQ,IAAI,EAAE;AAGd,UAAQ,IAAI,KAAKA,OAAM,KAAK,cAAc,CAAC,EAAE;AAC7C,QAAM,aAAa,OAAO,QAAQ,KAAK,UAAU;AACjD,QAAM,iBAA2B,CAAC;AAClC,QAAM,cAAwB,CAAC;AAE/B,aAAW,CAAC,KAAK,UAAU,KAAK,YAAY;AAC1C,UAAM,cAAc,kBAAkB,GAAG,KAAK;AAC9C,QAAI,YAAY;AACd,qBAAe,KAAK,GAAGA,OAAM,MAAM,QAAQ,CAAC,IAAI,WAAW,EAAE;AAAA,IAC/D,OAAO;AACL,kBAAY,KAAK,GAAGA,OAAM,OAAO,QAAQ,CAAC,IAAI,WAAW,EAAE;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,GAAG,gBAAgB,GAAG,WAAW;AACtD,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK,GAAG;AAC9C,UAAM,MAAM,YACT,MAAM,GAAG,IAAI,CAAC,EACd,IAAI,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC,EAC7B,KAAK,EAAE;AACV,YAAQ,IAAI,OAAO,GAAG,EAAE;AAAA,EAC1B;AACA,UAAQ,IAAI,EAAE;AAChB;;;ACrSA,OAAOC,YAAU;AACjB,OAAOC,UAAQ;AACf,OAAOC,YAAW;AAoBlB,eAAsB,aAAa,YAAoC;AACrE,QAAM,aAAaC,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAE3D,aAAW,8CAAyC;AACpD,UAAQ,aAAa,UAAU,EAAE;AAEjC,QAAM,SAAuB,CAAC;AAG9B,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAC3D,MAAI,WAAW,UAAU,GAAG;AAC1B,WAAO,KAAK,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,2BAA2B,CAAC;AAAA,EAC1F,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,sDAAiD,CAAC;AAAA,EAChH;AAGA,QAAM,eAAeA,OAAK,KAAK,YAAY,gBAAgB,QAAQ;AACnE,QAAM,WAAW,aAAa,YAAY;AAC1C,MAAI,UAAU;AACZ,QAAI,SAAS,SAAS,cAAc,KAAK,SAAS,SAAS,YAAY,GAAG;AACxE,aAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,SAAS,+BAA+B,CAAC;AAAA,IAC5F,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,SAAS,8EAAyE,CAAC;AAAA,IACtI;AAAA,EACF,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,SAAS,sBAAsB,CAAC;AAAA,EACnF;AAGA,MAAI,UAAU;AACZ,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,aAAa,eAAe,KAAK,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC;AAC9D,QAAI,YAAY;AACd,aAAO,KAAK,EAAE,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,oEAA+D,CAAC;AAAA,IACvI,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,wBAAwB,QAAQ,QAAQ,SAAS,sBAAsB,CAAC;AAAA,IAC9F;AAAA,EACF;AAGA,QAAM,oBAAoBA,OAAK,KAAK,YAAY,gBAAgB,mBAAmB;AACnF,MAAI,WAAW,iBAAiB,GAAG;AACjC,UAAMC,YAAW,aAAsC,iBAAiB;AACxE,QAAIA,WAAU,OAAO;AACnB,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,SAAS,0CAA0C,CAAC;AAAA,IACnG,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,SAAS,kDAAkD,CAAC;AAAA,IAC3G;AAAA,EACF,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,SAAS,2DAAsD,CAAC;AAAA,EAC/G;AAGA,QAAM,YAAYD,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACpE,MAAI,MAAME,KAAG,WAAW,SAAS,GAAG;AAClC,UAAM,cAAc,MAAMA,KAAG,QAAQ,SAAS,GAAG,OAAO,CAAC,MAAc,EAAE,SAAS,KAAK,CAAC;AACxF,QAAI,WAAW,SAAS,GAAG;AACzB,aAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,GAAG,WAAW,MAAM,uBAAuB,CAAC;AAGnG,UAAI,gBAAgB;AACpB,iBAAW,QAAQ,YAAY;AAC7B,cAAM,UAAU,aAAaF,OAAK,KAAK,WAAW,IAAI,CAAC;AACvD,YAAI,WAAW,CAAC,QAAQ,WAAW,KAAK,GAAG;AACzC;AAAA,QACF;AAAA,MACF;AACA,UAAI,gBAAgB,GAAG;AACrB,eAAO,KAAK,EAAE,MAAM,qBAAqB,QAAQ,QAAQ,SAAS,GAAG,aAAa,qCAAqC,CAAC;AAAA,MAC1H;AAAA,IACF,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,yBAAyB,CAAC;AAAA,IACnF;AAAA,EACF,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,2DAAsD,CAAC;AAAA,EAChH;AAGA,QAAM,cAAcA,OAAK,KAAK,YAAY,gBAAgB,cAAc;AACxE,MAAI,MAAME,KAAG,WAAW,WAAW,GAAG;AACpC,UAAM,gBAAgB,MAAMA,KAAG,QAAQ,WAAW,GAAG,OAAO,CAAC,MAAc,EAAE,SAAS,KAAK,CAAC;AAC5F,WAAO,KAAK,EAAE,MAAM,YAAY,QAAQ,aAAa,SAAS,IAAI,SAAS,QAAQ,SAAS,GAAG,aAAa,MAAM,6BAA6B,CAAC;AAAA,EAClJ,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,YAAY,QAAQ,QAAQ,SAAS,wBAAwB,CAAC;AAAA,EACpF;AAGA,QAAM,YAAYF,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACpE,MAAI,MAAME,KAAG,WAAW,SAAS,GAAG;AAClC,UAAM,aAAa,MAAMA,KAAG,QAAQ,SAAS,GAAG,OAAO,OAAO,MAAc;AAC1E,UAAI;AACF,gBAAQ,MAAMA,KAAG,KAAKF,OAAK,KAAK,WAAW,CAAC,CAAC,GAAG,YAAY;AAAA,MAC9D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,GAAG,UAAU,MAAM,sBAAsB,CAAC;AAAA,EACnG,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,SAAS,sBAAsB,CAAC;AAAA,EAChF;AAGA,QAAM,gBAAgBA,OAAK,KAAK,YAAY,YAAY;AACxD,QAAM,YAAY,aAAa,aAAa;AAC5C,MAAI,WAAW;AACb,UAAM,aAAa,UAAU,SAAS,MAAM,KAAK,UAAU,SAAS,YAAY;AAChF,QAAI,YAAY;AACd,aAAO,KAAK,EAAE,MAAM,kBAAkB,QAAQ,QAAQ,SAAS,4BAA4B,CAAC;AAAA,IAC9F,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,kBAAkB,QAAQ,QAAQ,SAAS,qEAAgE,CAAC;AAAA,IAClI;AAAA,EACF;AAGA,MAAI,WAAW;AACb,UAAM,kBAAkB,UAAU,SAAS,qBAAqB;AAChE,QAAI,CAAC,iBAAiB;AACpB,aAAO,KAAK,EAAE,MAAM,sBAAsB,QAAQ,QAAQ,SAAS,qEAAgE,CAAC;AAAA,IACtI;AAAA,EACF;AAGA,QAAM,eAAeA,OAAK,KAAK,YAAY,WAAW,eAAe;AACrE,QAAM,WAAW,aAAa,YAAY;AAC1C,MAAI,UAAU;AACZ,UAAM,uBAAuB,0DAA0D,KAAK,QAAQ;AACpG,QAAI,sBAAsB;AACxB,aAAO,KAAK,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,sFAAiF,CAAC;AAAA,IAChJ,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,eAAe,QAAQ,QAAQ,SAAS,mCAAmC,CAAC;AAAA,IAClG;AAAA,EACF;AAGA,aAAW,eAAe;AAE1B,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACvD,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AACvD,QAAM,SAAS,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAEvD,aAAW,SAAS,QAAQ;AAC1B,UAAM,OACJ,MAAM,WAAW,SACbG,OAAM,MAAM,QAAG,IACf,MAAM,WAAW,SACfA,OAAM,OAAO,QAAG,IAChBA,OAAM,IAAI,QAAG;AACrB,YAAQ,IAAI,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,MAAM,OAAO,EAAE;AAAA,EACzD;AAGA,QAAM,QAAQ,OAAO;AACrB,QAAM,QAAQ,KAAK,OAAQ,OAAO,SAAS,OAAO,SAAS,OAAO,QAAS,GAAG;AAC9E,QAAM,QACJ,SAAS,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,MAAM;AAElF,UAAQ,IAAI,EAAE;AACd,aAAW,OAAO;AAClB,QAAMC,cAAa,SAAS,MAAMD,OAAM,QAAQ,SAAS,MAAMA,OAAM,SAASA,OAAM;AACpF,UAAQ,IAAI,KAAKC,YAAW,KAAK,KAAK,CAAC,KAAK,KAAK,OAAO;AACxD,UAAQ,IAAI,KAAKD,OAAM,MAAM,OAAO,OAAO,MAAM,CAAC,CAAC,gBAAaA,OAAM,OAAO,OAAO,OAAO,MAAM,CAAC,CAAC,kBAAeA,OAAM,IAAI,OAAO,OAAO,MAAM,CAAC,CAAC,WAAW;AAE7J,MAAI,OAAO,SAAS,GAAG;AACrB,YAAQ,IAAI,EAAE;AACd,aAAS,2CAA2C;AAAA,EACtD;AACF;;;ACnMA,OAAOE,YAAU;AACjB,OAAOC,UAAQ;AACf,OAAOC,YAAW;AAClB,OAAOC,UAAS;AA6BhB,SAAS,eAAe,OAAuB;AAC7C,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,MAAI,SAAS,GAAI,QAAO;AACxB,SAAO;AACT;AAEA,SAAS,WAAW,OAAmC;AACrD,MAAI,SAAS,IAAK,QAAOC,OAAM;AAC/B,MAAI,SAAS,IAAK,QAAOA,OAAM;AAC/B,SAAOA,OAAM;AACf;AAEA,SAAS,WAAW,QAA0C;AAC5D,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAOA,OAAM,MAAM,QAAG;AAAA,IACxB,KAAK;AACH,aAAOA,OAAM,OAAO,QAAG;AAAA,IACzB,KAAK;AACH,aAAOA,OAAM,IAAI,QAAG;AAAA,EACxB;AACF;AAEA,SAASC,aAAY,SAAiB,QAAgB,IAAY;AAChE,QAAM,SAAS,KAAK,MAAO,UAAU,MAAO,KAAK;AACjD,QAAM,QAAQ,QAAQ;AACtB,SAAOD,OAAM,MAAM,SAAI,OAAO,MAAM,CAAC,IAAIA,OAAM,KAAK,SAAI,OAAO,KAAK,CAAC;AACvE;AAGA,SAAS,WACP,YACA,QACe;AACf,QAAM,SAAwB,CAAC;AAG/B,MAAI,OAAO,YAAY,SAAS;AAC9B,WAAO,KAAK,EAAE,MAAM,WAAW,QAAQ,QAAQ,QAAQ,IAAI,OAAO,GAAG,CAAC;AAAA,EACxE,OAAO;AACL,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,WAAW,OAAO,OAAO,gBAAW,OAAO;AAAA,IACrD,CAAC;AAAA,EACH;AAGA,QAAM,WAAW,aAAaE,OAAK,KAAK,YAAY,gBAAgB,QAAQ,CAAC;AAC7E,MAAI,YAAY,SAAS,SAAS,cAAc,GAAG;AACjD,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,QAAQ,uBAAuB,CAAC;AAAA,EACnF,WAAW,UAAU;AACnB,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,QAAQ,yBAAyB,CAAC;AAAA,EACrF,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,QAAQ,YAAY,CAAC;AAAA,EACxE;AAGA,MAAI,WAAWA,OAAK,KAAK,YAAY,gBAAgB,WAAW,CAAC,GAAG;AAClE,WAAO,KAAK,EAAE,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ,UAAU,CAAC;AAAA,EACzE,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,gBAAgB,QAAQ,QAAQ,QAAQ,gBAAgB,CAAC;AAAA,EAC/E;AAGA,QAAM,YAAYA,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACpE,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,QAAQ,OAAO,SAAS;AAC9B,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,GAAG,KAAK,aAAa,CAAC;AAAA,EAC9E,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,sBAAsB,CAAC;AAAA,EAC/E;AAGA,QAAM,YAAYA,OAAK,KAAK,YAAY,gBAAgB,YAAY;AACpE,MAAI,UAAU,SAAS,GAAG;AACxB,QAAI;AACF,YAAM,aAAaC,KAAG,YAAY,SAAS,EAAE,OAAO,CAAC,MAAc,EAAE,SAAS,KAAK,CAAC;AACpF,aAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,GAAG,WAAW,MAAM,cAAc,CAAC;AAAA,IAC3F,QAAQ;AACN,aAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,wBAAwB,CAAC;AAAA,IACjF;AAAA,EACF,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,UAAU,QAAQ,QAAQ,QAAQ,iBAAiB,CAAC;AAAA,EAC1E;AAGA,QAAM,gBAAgB,aAAaD,OAAK,KAAK,YAAY,gBAAgB,mBAAmB,CAAC;AAC7F,MAAI,iBAAiB,cAAc,SAAS,SAAS,GAAG;AACtD,WAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,QAAQ,aAAa,CAAC;AAAA,EACrE,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,SAAS,QAAQ,QAAQ,QAAQ,iBAAiB,CAAC;AAAA,EACzE;AAEA,SAAO,EAAE,OAAO,mBAAmB,OAAO;AAC5C;AAGA,SAAS,cAAc,YAAmC;AACxD,QAAM,SAAwB,CAAC;AAG/B,QAAM,WAAW,aAAaA,OAAK,KAAK,YAAY,gBAAgB,QAAQ,CAAC;AAC7E,MAAI,UAAU;AACZ,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAa,eAAe,KAAK,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC;AAC9D,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,aAAa,SAAS;AAAA,MAC9B,QAAQ,aAAa,yDAAoD;AAAA,IAC3E,CAAC;AAAA,EACH;AAGA,QAAM,YAAY,aAAaA,OAAK,KAAK,YAAY,YAAY,CAAC;AAClE,MAAI,WAAW;AACb,UAAM,aAAa,UAAU,SAAS,MAAM,KAAK,UAAU,SAAS,YAAY;AAChF,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,aAAa,SAAS;AAAA,MAC9B,QAAQ,aAAa,cAAc;AAAA,IACrC,CAAC;AAAA,EACH;AAGA,QAAM,eAAe,aAAaA,OAAK,KAAK,YAAY,WAAW,eAAe,CAAC;AACnF,MAAI,cAAc;AAChB,UAAM,eAAe,0DAA0D,KAAK,YAAY;AAChG,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ,eAAe,SAAS;AAAA,MAChC,QAAQ,eAAe,uCAAuC;AAAA,IAChE,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,YAAY,OAAO;AACrC;AAGA,SAAS,WAAW,QAAoC;AACtD,QAAM,SAAwB,CAAC;AAC/B,QAAM,OAAO,OAAO;AAGpB,MAAI,KAAK,cAAc,WAAW;AAChC,UAAM,QACJ,KAAK,cAAc,WACf,WAAW,KAAK,iBAAiB,EAAE,KAAK,KAAK,eAAe,QAAQ,eAAe,KAAK,eAAe,UAAU,iBAAiB,QAAQ,MAC1I,KAAK;AACX,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,QAAQ,MAAM,KAAK,EAAE,CAAC;AAAA,EACzE,OAAO;AACL,WAAO,KAAK,EAAE,MAAM,aAAa,QAAQ,QAAQ,QAAQ,eAAe,CAAC;AAAA,EAC3E;AAGA,MAAI,KAAK,QAAQ,QAAQ;AACvB,UAAM,QACJ,KAAK,QAAQ,oBACT,uCACA,KAAK,QAAQ,iBACX,sBACA,KAAK;AACb,WAAO,KAAK,EAAE,MAAM,OAAO,QAAQ,QAAQ,QAAQ,MAAM,CAAC;AAAA,EAC5D;AAGA,SAAO,KAAK;AAAA,IACV,MAAM;AAAA,IACN,QAAQ,KAAK,aAAa,SAAS;AAAA,IACnC,QAAQ,KAAK,aACT,UAAU,KAAK,mBAAmB,cAAc,EAAE,KAClD;AAAA,EACN,CAAC;AAGD,MAAI,KAAK,QAAQ,SAAS,GAAG;AAC3B,WAAO,KAAK,EAAE,MAAM,WAAW,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,KAAK,IAAI,EAAE,CAAC;AAAA,EAClF;AAGA,MAAI,KAAK,UAAU;AACjB,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ,KAAK,gBAAgB;AAAA,IAC/B,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,mBAAmB,OAAO;AAC5C;AAGA,SAAS,WAAW,MAAkC;AACpD,QAAM,SAAwB,CAAC;AAE/B,QAAM,UAA0E;AAAA,IAC9E,YAAY,EAAE,KAAK,cAAc,MAAM,4BAA4B;AAAA,IACnE,QAAQ,EAAE,KAAK,UAAU,MAAM,kBAAkB;AAAA,IACjD,UAAU,EAAE,KAAK,YAAY,MAAM,oBAAoB;AAAA,IACvD,YAAY,EAAE,KAAK,WAAW,MAAM,gCAAgC;AAAA,IACpE,MAAM,EAAE,KAAK,QAAQ,MAAM,gBAAgB;AAAA,IAC3C,mBAAmB,EAAE,KAAK,kBAAkB,MAAM,iCAAiC;AAAA,IACnF,WAAW,EAAE,KAAK,aAAa,MAAM,4BAA4B;AAAA,EACnE;AAEA,aAAW,CAAC,MAAM,EAAE,KAAK,KAAK,CAAC,KAAK,OAAO,QAAQ,OAAO,GAAG;AAC3D,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ,KAAK,MAAM,GAAG,IAAI,SAAS;AAAA,MACnC,QAAQ,KAAK,MAAM,GAAG,IAAI,aAAa,kBAAa,IAAI;AAAA,IAC1D,CAAC;AAAA,EACH;AAGA,QAAM,SAAuD;AAAA,IAC3D,cAAc;AAAA,IACd,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAEA,aAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAChD,WAAO,KAAK;AAAA,MACV;AAAA,MACA,QAAQ,KAAK,WAAW,GAAG,IAAI,SAAS;AAAA,MACxC,QAAQ,KAAK,WAAW,GAAG,IAAI,eAAe;AAAA,IAChD,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,OAAO,eAAe,OAAO;AACxC;AAGA,SAAS,UAAU,YAAmC;AACpD,QAAM,SAAwB,CAAC;AAE/B,QAAM,cAAc;AAAA,IAClB,EAAE,MAAM,gBAAgB,MAAM,uBAAuB;AAAA,IACrD,EAAE,MAAM,iBAAiB,MAAM,wBAAwB;AAAA,IACvD,EAAE,MAAM,YAAY,MAAM,mBAAmB;AAAA,EAC/C;AAEA,aAAW,OAAO,aAAa;AAC7B,UAAM,UAAU,aAAaA,OAAK,KAAK,YAAY,IAAI,IAAI,CAAC;AAC5D,QAAI,SAAS;AAEX,YAAM,aAAa,QAAQ,SAAS,OAAO,KAAK,QAAQ,MAAM,KAAK,EAAE,SAAS;AAC9E,aAAO,KAAK;AAAA,QACV,MAAM,IAAI;AAAA,QACV,QAAQ,aAAa,SAAS;AAAA,QAC9B,QAAQ,aAAa,gBAAgB;AAAA,MACvC,CAAC;AAAA,IACH,OAAO;AACL,aAAO,KAAK,EAAE,MAAM,IAAI,MAAM,QAAQ,QAAQ,QAAQ,YAAY,CAAC;AAAA,IACrE;AAAA,EACF;AAEA,SAAO,EAAE,OAAO,iBAAiB,OAAO;AAC1C;AAGA,eAAsB,cAAc,YAAoC;AACtE,QAAM,aAAaA,OAAK,QAAQ,cAAc,QAAQ,IAAI,CAAC;AAC3D,QAAM,aAAaA,OAAK,KAAK,YAAY,kBAAkB;AAE3D,UAAQ,IAAI,EAAE;AACd,aAAW,8BAAyB;AACpC,UAAQ,IAAIF,OAAM,IAAI,KAAK,UAAU,EAAE,CAAC;AACxC,UAAQ,IAAI,EAAE;AAGd,MAAI,CAAC,WAAW,UAAU,GAAG;AAC3B,aAAS,wDAAwD;AACjE;AAAA,EACF;AAEA,QAAM,SAAS,aAA0B,UAAU;AACnD,MAAI,CAAC,QAAQ;AACX,aAAS,sEAAsE;AAC/E;AAAA,EACF;AAGA,QAAM,UAAUI,KAAI,qBAAqB,EAAE,MAAM;AACjD,MAAI;AACJ,MAAI;AACF,gBAAY,MAAM,YAAY,UAAU;AACxC,YAAQ,QAAQ,iBAAiB;AAAA,EACnC,QAAQ;AACN,YAAQ,KAAK,sCAAiC;AAC9C,gBAAY,OAAO;AAAA,EACrB;AAGA,QAAM,WAA4B;AAAA,IAChC,WAAW,YAAY,MAAM;AAAA,IAC7B,cAAc,UAAU;AAAA,IACxB,WAAW,MAAM;AAAA,IACjB,WAAW,SAAS;AAAA,IACpB,UAAU,UAAU;AAAA,EACtB;AAGA,MAAI,cAAc;AAClB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAElB,aAAW,WAAW,UAAU;AAC9B,YAAQ,IAAI;AAAA,IAAOJ,OAAM,KAAK,QAAQ,KAAK,CAAC,EAAE;AAE9C,eAAW,SAAS,QAAQ,QAAQ;AAClC,YAAM,OAAO,WAAW,MAAM,MAAM;AACpC,cAAQ,IAAI,OAAO,IAAI,IAAIA,OAAM,MAAM,MAAM,IAAI,CAAC,KAAKA,OAAM,IAAI,MAAM,MAAM,CAAC,EAAE;AAEhF,cAAQ,MAAM,QAAQ;AAAA,QACpB,KAAK;AACH;AACA;AAAA,QACF,KAAK;AACH;AACA;AAAA,QACF,KAAK;AACH;AACA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAGA,QAAM,QAAQ,cAAc,gBAAgB;AAC5C,QAAM,QAAQ,QAAQ,IAClB,KAAK,OAAQ,cAAc,gBAAgB,OAAO,QAAS,GAAG,IAC9D;AACJ,QAAM,QAAQ,eAAe,KAAK;AAClC,QAAM,UAAU,WAAW,KAAK;AAEhC,UAAQ,IAAI,EAAE;AACd,UAAQ;AAAA,IACN,KAAKA,OAAM,KAAK,UAAU,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,IAAIA,OAAM,IAAI,IAAI,KAAK,OAAO,CAAC;AAAA,EACnF;AACA,UAAQ;AAAA,IACN,KAAKC,aAAY,KAAK,CAAC,IAAID,OAAM,MAAM,OAAO,WAAW,CAAC,CAAC,gBAAaA,OAAM,OAAO,OAAO,aAAa,CAAC,CAAC,kBAAeA,OAAM,IAAI,OAAO,WAAW,CAAC,CAAC;AAAA,EAC1J;AAGA,MAAI,cAAc,KAAK,gBAAgB,GAAG;AACxC,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAIA,OAAM,KAAK,oBAAoB,CAAC;AAE5C,QAAI,cAAc,GAAG;AACnB,YAAM,WAAW,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,CAAC;AACpF,iBAAW,KAAK,SAAS,MAAM,GAAG,CAAC,GAAG;AACpC,gBAAQ,IAAI,OAAOA,OAAM,IAAI,QAAG,CAAC,SAAS,EAAE,IAAI,WAAM,EAAE,MAAM,EAAE;AAAA,MAClE;AAAA,IACF;AAEA,UAAM,WAAW,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAO,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM,CAAC;AACpF,eAAW,KAAK,SAAS,MAAM,GAAG,CAAC,GAAG;AACpC,cAAQ,IAAI,OAAOA,OAAM,OAAO,QAAG,CAAC,aAAa,EAAE,IAAI,WAAM,EAAE,MAAM,EAAE;AAAA,IACzE;AAAA,EACF;AAGA,QAAM,OAAO,OAAO;AACpB,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAIA,OAAM,IAAI,MAAM,OAAO,OAAO,SAAM,KAAK,WAAW,SAAM,OAAO,SAAS,MAAM,gBAAa,OAAO,OAAO,MAAM,0BAAuB,OAAO,WAAW,EAAE,CAAC;AACzK,UAAQ,IAAI,EAAE;AAChB;;;AjCzYA,IAAM,UAAU,IAAI,QAAQ;AAE5B,QACG,KAAK,QAAQ,EACb;AAAA,EACC;AACF,EACC,QAAQ,OAAO;AAElB,QACG,QAAQ,MAAM,EACd,YAAY,2CAA2C,EACvD,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,YAAY,UAAU;AAAA,EAC9B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,cAAc,UAAU;AAAA,EAChC,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,mCAAmC,EAC/C,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,aAAa,UAAU;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,6CAA6C,EACzD,OAAO,YAAY,qCAAqC,EACxD,OAAO,SAAS,gCAAgC,EAChD,OAAO,qBAAqB,wCAAwC,UAAU,EAC9E,OAAO,OAAO,SAA+D;AAC5E,MAAI;AACF,UAAM,cAAc,IAAI;AAAA,EAC1B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,4CAA4C,EACxD,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,cAAc,UAAU;AAAA,EAChC,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,MAAM,EACd,YAAY,4CAA4C,EACxD,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,YAAY,UAAU;AAAA,EAC9B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,yDAAyD,EACrE,SAAS,UAAU,mDAAmD,EACtE,OAAO,qBAAqB,+CAA+C,EAC3E,OAAO,OAAO,YAAqB,SAA+B;AACjE,MAAI;AACF,UAAM,cAAc,YAAY,IAAI;AAAA,EACtC,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,8CAA8C,EAC1D,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,aAAa,UAAU;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,OAAO,EACf,YAAY,qDAAqD,EACjE,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,aAAa,UAAU;AAAA,EAC/B,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QACG,QAAQ,QAAQ,EAChB,YAAY,0EAAqE,EACjF,SAAS,UAAU,mDAAmD,EACtE,OAAO,OAAO,eAAwB;AACrC,MAAI;AACF,UAAM,cAAc,UAAU;AAAA,EAChC,SAAS,KAAK;AACZ,QAAK,IAAc,SAAS,mBAAmB;AAC7C,cAAQ,KAAK,CAAC;AAAA,IAChB;AACA,YAAQ,MAAM,GAAG;AACjB,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF,CAAC;AAEH,QAAQ,MAAM;","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"]}