cto-ai-cli 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/index.ts","../../src/utils/constants.ts","../../src/cli/commands/analyze.ts","../../src/core/analyzer.ts","../../src/core/config.ts","../../src/utils/paths.ts","../../src/utils/fs.ts","../../src/core/tiering.ts","../../src/core/tokenizer.ts","../../src/core/ast.ts","../../src/utils/format.ts","../../src/cli/commands/tiers.ts","../../src/cli/commands/generate.ts","../../src/core/generator.ts","../../src/core/security.ts","../../src/cli/commands/show.ts","../../src/cli/commands/apply.ts","../../src/core/session.ts","../../src/cli/commands/revert.ts","../../src/cli/commands/diff.ts","../../src/cli/commands/clean.ts","../../src/core/clean.ts","../../src/cli/commands/init.ts","../../src/core/local-config.ts","../../src/core/gitignore-parser.ts","../../src/cli/commands/prompts.ts","../../src/core/prompts.ts","../../src/cli/commands/config.ts","../../src/cli/commands/deps.ts","../../src/cli/commands/watch.ts","../../src/core/watcher.ts","../../src/cli/commands/session.ts","../../src/core/sessions.ts","../../src/cli/commands/dashboard.ts","../../src/core/dashboard.ts","../../src/cli/commands/report.ts","../../src/core/reports.ts","../../src/cli/commands/doctor.ts","../../src/core/integrity.ts","../../src/core/audit.ts","../../src/cli/commands/audit.ts","../../src/cli/commands/validate.ts","../../src/cli/commands/prune.ts","../../src/core/pruning.ts","../../src/cli/commands/costs.ts","../../src/core/costs.ts","../../src/cli/commands/context.ts","../../src/core/budget.ts","../../src/core/pr-context.ts","../../src/core/git.ts","../../src/cli/commands/multi-gen.ts","../../src/core/prompt-engineer.ts","../../src/core/adapters.ts","../../src/core/routing.ts","../../src/cli/commands/explain.ts","../../src/core/explain.ts","../../src/cli/commands/route.ts","../../src/cli/commands/sdd.ts","../../src/core/sdd.ts","../../src/cli/commands/quickstart.ts","../../src/cli/commands/focus.ts","../../src/core/focus.ts","../../src/cli/commands/todo.ts","../../src/core/todo-scanner.ts"],"sourcesContent":["import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { CTO_VERSION } from '../utils/constants.js';\nimport { analyzeCommand } from './commands/analyze.js';\nimport { tiersCommand } from './commands/tiers.js';\nimport { generateCommand } from './commands/generate.js';\nimport { showCommand } from './commands/show.js';\nimport { applyCommand } from './commands/apply.js';\nimport { revertCommand } from './commands/revert.js';\nimport { diffCommand } from './commands/diff.js';\nimport { cleanCommand } from './commands/clean.js';\nimport { initCommand } from './commands/init.js';\nimport { promptsCommand } from './commands/prompts.js';\nimport { configCommand } from './commands/config.js';\nimport { depsCommand } from './commands/deps.js';\nimport { watchCommand } from './commands/watch.js';\nimport { sessionCommand } from './commands/session.js';\nimport { dashboardCommand } from './commands/dashboard.js';\nimport { reportCommand } from './commands/report.js';\nimport { doctorCommand } from './commands/doctor.js';\nimport { auditCommand } from './commands/audit.js';\nimport { validateCommand } from './commands/validate.js';\nimport { pruneCommand } from './commands/prune.js';\nimport { costsCommand } from './commands/costs.js';\nimport { contextCommand } from './commands/context.js';\nimport { multiGenCommand } from './commands/multi-gen.js';\nimport { explainCommand } from './commands/explain.js';\nimport { routeCommand } from './commands/route.js';\nimport { sddCommand } from './commands/sdd.js';\nimport { quickstartCommand } from './commands/quickstart.js';\nimport { focusCommand } from './commands/focus.js';\nimport { todoCommand } from './commands/todo.js';\nimport { initCTODir } from '../core/config.js';\n\nconst program = new Command();\n\nprogram\n .name('cto')\n .description('Claude Token Optimizer — Optimize token usage with Claude Code')\n .version(CTO_VERSION, '-v, --version')\n .hook('preAction', async () => {\n await initCTODir();\n });\n\nprogram.addCommand(analyzeCommand);\nprogram.addCommand(tiersCommand);\nprogram.addCommand(generateCommand);\nprogram.addCommand(showCommand);\nprogram.addCommand(applyCommand);\nprogram.addCommand(revertCommand);\nprogram.addCommand(diffCommand);\nprogram.addCommand(cleanCommand);\nprogram.addCommand(initCommand);\nprogram.addCommand(promptsCommand);\nprogram.addCommand(configCommand);\nprogram.addCommand(depsCommand);\nprogram.addCommand(watchCommand);\nprogram.addCommand(sessionCommand);\nprogram.addCommand(dashboardCommand);\nprogram.addCommand(reportCommand);\nprogram.addCommand(doctorCommand);\nprogram.addCommand(auditCommand);\nprogram.addCommand(validateCommand);\nprogram.addCommand(pruneCommand);\nprogram.addCommand(costsCommand);\nprogram.addCommand(contextCommand);\nprogram.addCommand(multiGenCommand);\nprogram.addCommand(explainCommand);\nprogram.addCommand(routeCommand);\nprogram.addCommand(sddCommand);\nprogram.addCommand(quickstartCommand);\nprogram.addCommand(focusCommand);\nprogram.addCommand(todoCommand);\n\n// Default action — show help with branding\nprogram.action(() => {\n console.log('');\n console.log(chalk.bold.cyan(' 🔧 CTO — Claude Token Optimizer'));\n console.log(chalk.dim(` v${CTO_VERSION}`));\n console.log('');\n console.log(chalk.dim(' Optimize your token usage with Claude Code'));\n console.log(chalk.dim(' without modifying your projects.'));\n console.log('');\n console.log(chalk.bold(' Quick Start:'));\n console.log(chalk.dim(' cto init Setup CTO'));\n console.log(chalk.dim(' cto analyze Analyze token usage'));\n console.log(chalk.dim(' cto tiers Show file tiers'));\n console.log(chalk.dim(' cto generate Generate artifacts'));\n console.log(chalk.dim(' cto apply claude-md Apply CLAUDE.md'));\n console.log('');\n console.log(chalk.bold(' All Commands:'));\n console.log(chalk.dim(' analyze Analyze project token usage'));\n console.log(chalk.dim(' tiers Show hot/warm/cold file tiers'));\n console.log(chalk.dim(' generate Generate CLAUDE.md & .claudeignore'));\n console.log(chalk.dim(' show Preview a generated artifact'));\n console.log(chalk.dim(' diff Show what would change'));\n console.log(chalk.dim(' apply Apply artifact to project'));\n console.log(chalk.dim(' revert Undo last apply'));\n console.log(chalk.dim(' clean Remove CTO data for a project'));\n console.log(chalk.dim(' init Interactive setup wizard'));\n console.log(chalk.dim(' prompts Optimized prompt templates'));\n console.log(chalk.dim(' config Show current configuration'));\n console.log(chalk.dim(' deps Show dependency graph & hub files'));\n console.log(chalk.dim(' watch Watch for changes & auto-recalculate'));\n console.log(chalk.dim(' session Track Claude Code sessions'));\n console.log(chalk.dim(' dashboard Terminal dashboard with metrics'));\n console.log(chalk.dim(' report Weekly/project reports'));\n console.log(chalk.dim(' doctor Health check & security audit'));\n console.log(chalk.dim(' audit View audit trail'));\n console.log(chalk.dim(' validate CI/CD validation & secret scan'));\n console.log(chalk.dim(' prune Smart context pruning'));\n console.log(chalk.dim(' costs Token cost estimation & savings'));\n console.log(chalk.dim(' context Budget optimizer & PR context'));\n console.log(chalk.dim(' multi-gen Generate for Claude/Cursor/Copilot/Gemini'));\n console.log(chalk.dim(' explain Explain why a file is in a tier'));\n console.log(chalk.dim(' route Smart model routing per task'));\n console.log(chalk.dim(' sdd Specification-Driven Development'));\n console.log(chalk.dim(' quickstart One command: analyze + generate + save'));\n console.log(chalk.dim(' focus Focused context for specific files'));\n console.log(chalk.dim(' todo Scan TODO/FIXME/HACK comments'));\n console.log('');\n console.log(chalk.dim(' Run cto <command> --help for details'));\n console.log('');\n});\n\nprogram.parse();\n","import type { CTOConfig, ExtensionConfig, TierThresholds, PromptTemplate } from '../types/index.js';\n\nexport const CTO_VERSION = '1.3.0';\n\nexport const CTO_DIR = '.config/cto';\nexport const CTO_CONFIG_FILE = 'config.yaml';\nexport const CTO_PROJECTS_DIR = 'projects';\nexport const CTO_BACKUPS_DIR = 'backups';\nexport const CTO_SESSIONS_DIR = 'sessions';\n\nexport const DEFAULT_EXTENSIONS: ExtensionConfig = {\n code: [\n 'ts', 'tsx', 'js', 'jsx', 'py', 'rb', 'go', 'rs', 'java', 'kt',\n 'swift', 'c', 'cpp', 'h', 'hpp', 'cs', 'php', 'vue', 'svelte',\n 'astro', 'lua', 'zig', 'ex', 'exs', 'clj', 'scala', 'dart',\n ],\n config: [\n 'json', 'yaml', 'yml', 'toml', 'ini', 'env', 'cfg',\n 'xml', 'plist', 'properties',\n ],\n docs: ['md', 'mdx', 'txt', 'rst', 'adoc'],\n ignore: [\n 'lock', 'map', 'min.js', 'min.css', 'bundle.js',\n 'chunk.js', 'LICENSE', 'CHANGELOG',\n ],\n};\n\nexport const DEFAULT_TIER_THRESHOLDS: TierThresholds = {\n hotDays: 3,\n warmDays: 14,\n hotTokenLimit: 50000,\n warmTokenLimit: 200000,\n};\n\nexport const DEFAULT_IGNORE_DIRS: string[] = [\n 'node_modules', '.git', 'dist', 'build', 'out', '.next', '.nuxt',\n '.svelte-kit', 'coverage', '__pycache__', '.pytest_cache', 'venv',\n '.venv', 'env', '.env', 'vendor', 'target', 'bin', 'obj',\n '.idea', '.vscode', '.DS_Store', '.turbo', '.vercel', '.output',\n 'public/assets', 'static/assets', '.cache', 'tmp', '.tmp',\n];\n\nexport const DEFAULT_IGNORE_PATTERNS: string[] = [\n '*.min.js', '*.min.css', '*.map', '*.lock', '*.log',\n '*.bundle.js', '*.chunk.js', 'package-lock.json',\n 'yarn.lock', 'pnpm-lock.yaml', 'composer.lock',\n 'Gemfile.lock', 'Cargo.lock', 'poetry.lock',\n];\n\nexport const DEFAULT_CONFIG: CTOConfig = {\n version: CTO_VERSION,\n extensions: DEFAULT_EXTENSIONS,\n tiering: DEFAULT_TIER_THRESHOLDS,\n ignoreDirs: DEFAULT_IGNORE_DIRS,\n ignorePatterns: DEFAULT_IGNORE_PATTERNS,\n model: 'sonnet',\n tokenEstimation: 'chars4',\n};\n\nexport const PROMPT_TEMPLATES: PromptTemplate[] = [\n {\n id: 'task-focused',\n name: 'Focused Task',\n description: 'Optimized prompt for a specific task, includes only hot files',\n category: 'task',\n template: `Project context: {projectName}\nStack: {stack}\n\nMain files (hot tier — read these first):\n{hotFiles}\n\nTask: {taskDescription}\n\nInstructions:\n- Focus ONLY on the files listed above\n- If you need other files, ask before reading them\n- Use /compact if the conversation gets long`,\n },\n {\n id: 'code-review',\n name: 'Code Review',\n description: 'Efficient code review prompt',\n category: 'review',\n template: `Project context: {projectName}\n\nFiles to review:\n{hotFiles}\n\nReview these files focusing on:\n1. Potential bugs\n2. Performance\n3. Security\n4. Best practices\n\nDo NOT read additional files unless strictly necessary.`,\n },\n {\n id: 'debug-minimal',\n name: 'Minimal Debug',\n description: 'Debugging prompt with minimal context',\n category: 'debug',\n template: `Project: {projectName}\nStack: {stack}\n\nError/Problem: {taskDescription}\n\nRelevant files (hot):\n{hotFiles}\n\nDebugging instructions:\n1. Analyze the error with the hot files\n2. If you need more files, ask for them one at a time\n3. Propose a minimal fix\n4. Do NOT refactor unrelated code`,\n },\n {\n id: 'refactor-safe',\n name: 'Safe Refactor',\n description: 'Refactoring prompt with full context',\n category: 'refactor',\n template: `Project: {projectName}\nStack: {stack}\n\nHot files (modify):\n{hotFiles}\n\nWarm files (context only, do not modify unless necessary):\n{warmFiles}\n\nRefactor goal: {taskDescription}\n\nRules:\n- Change only what is necessary\n- Keep the public interface intact\n- Verify you don't break imports`,\n },\n {\n id: 'test-gen',\n name: 'Generate Tests',\n description: 'Test generation prompt',\n category: 'test',\n template: `Project: {projectName}\nStack: {stack}\n\nFiles to test:\n{hotFiles}\n\nGenerate tests for the listed files:\n- Project test framework: {testFramework}\n- Cover happy path and edge cases\n- Do NOT read files you don't need\n- Use mocks for external dependencies`,\n },\n];\n\nexport const CHARS_PER_TOKEN = 4;\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { analyzeProject } from '../../core/analyzer.js';\nimport { getTokenSavings } from '../../core/tiering.js';\nimport { formatTokens, formatBytes, header, tierColor, percentage } from '../../utils/format.js';\n\nexport const analyzeCommand = new Command('analyze')\n .description('Analyze a project\\'s token usage (read-only)')\n .argument('[path]', 'Project path to analyze', '.')\n .option('--json', 'Output as JSON')\n .option('--top <n>', 'Show top N files by token count', '20')\n .action(async (path: string, opts: { json?: boolean; top?: string }) => {\n const projectPath = path;\n\n console.log(chalk.dim('🔍 Analyzing project...'));\n\n try {\n const analysis = await analyzeProject(projectPath);\n const savings = getTokenSavings(analysis.files);\n\n if (opts.json) {\n console.log(JSON.stringify(analysis, null, 2));\n return;\n }\n\n console.log(header(`CTO Analysis — ${analysis.projectName}`));\n console.log('');\n\n // Summary table\n const summaryTable = new Table({\n style: { head: ['cyan'] },\n });\n\n summaryTable.push(\n { 'Total Files': analysis.totalFiles.toString() },\n { 'Total Tokens': `~${formatTokens(analysis.totalTokens)}` },\n { 'Total Size': formatBytes(analysis.totalSize) },\n );\n\n console.log(summaryTable.toString());\n console.log('');\n\n // Tier breakdown\n console.log(chalk.bold('📊 Tier Breakdown'));\n const tierTable = new Table({\n head: ['Tier', 'Files', 'Tokens', '%'],\n style: { head: ['cyan'] },\n colAligns: ['left', 'right', 'right', 'right'],\n });\n\n tierTable.push(\n [tierColor('hot'), analysis.tiers.hot.count, `~${formatTokens(analysis.tiers.hot.totalTokens)}`, `${analysis.tiers.hot.percentage.toFixed(1)}%`],\n [tierColor('warm'), analysis.tiers.warm.count, `~${formatTokens(analysis.tiers.warm.totalTokens)}`, `${analysis.tiers.warm.percentage.toFixed(1)}%`],\n [tierColor('cold'), analysis.tiers.cold.count, `~${formatTokens(analysis.tiers.cold.totalTokens)}`, `${analysis.tiers.cold.percentage.toFixed(1)}%`],\n );\n\n console.log(tierTable.toString());\n console.log('');\n\n // Savings\n console.log(chalk.bold('💰 Token Savings'));\n console.log(` Without CTO: ~${formatTokens(savings.withoutOptimization)} tokens`);\n console.log(` With CTO: ~${formatTokens(savings.withOptimization)} tokens`);\n console.log(` ${chalk.green(`Saved: ~${formatTokens(savings.saved)} tokens (${savings.savingsPercent.toFixed(1)}%)`)}`);\n console.log('');\n\n // Top files\n const topN = parseInt(opts.top ?? '20', 10);\n console.log(chalk.bold(`📄 Top ${topN} Files by Tokens`));\n const filesTable = new Table({\n head: ['File', 'Tokens', 'Size', 'Lines', 'Tier'],\n style: { head: ['cyan'] },\n colAligns: ['left', 'right', 'right', 'right', 'left'],\n });\n\n for (const f of analysis.files.slice(0, topN)) {\n filesTable.push([\n chalk.dim(f.relativePath.length > 50 ? '...' + f.relativePath.slice(-47) : f.relativePath),\n `~${formatTokens(f.tokens)}`,\n formatBytes(f.size),\n f.lines.toString(),\n tierColor(f.tier),\n ]);\n }\n\n console.log(filesTable.toString());\n } catch (err) {\n console.error(chalk.red(`❌ Analysis failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { resolve, basename } from 'node:path';\nimport { readFile } from 'node:fs/promises';\nimport type { CTOConfig, FileInfo, ProjectAnalysis, DependencyGraph } from '../types/index.js';\nimport { loadProjectConfig } from './config.js';\nimport { classifyFile, classifyFileWithAST, buildTierSummary } from './tiering.js';\nimport { walkProject, getAllExtensions } from '../utils/fs.js';\nimport { CHARS_PER_TOKEN } from '../utils/constants.js';\nimport { getProjectAnalysisPath } from '../utils/paths.js';\nimport { writeJSON, readJSON } from '../utils/fs.js';\nimport { estimateTokens as estimateTokensFn, freeEncoder } from './tokenizer.js';\nimport { createProject, buildDependencyGraph, analyzeAllComplexity, enrichFilesWithAST } from './ast.js';\n\nexport function estimateTokens(sizeInBytes: number): number {\n return Math.ceil(sizeInBytes / CHARS_PER_TOKEN);\n}\n\nexport async function analyzeProject(projectPath: string): Promise<ProjectAnalysis> {\n const absPath = resolve(projectPath);\n const config = await loadProjectConfig(absPath);\n const extensions = getAllExtensions(config);\n const useTiktoken = config.tokenEstimation === 'tiktoken';\n\n const entries = await walkProject(absPath, {\n ignoreDirs: config.ignoreDirs,\n ignorePatterns: config.ignorePatterns,\n extensions,\n });\n\n // Token estimation — use tiktoken if configured\n const files: FileInfo[] = [];\n for (const entry of entries) {\n let tokens: number;\n if (useTiktoken) {\n try {\n const content = await readFile(entry.path, 'utf-8');\n tokens = estimateTokensFn(content, entry.size, 'tiktoken');\n } catch {\n tokens = estimateTokens(entry.size);\n }\n } else {\n tokens = estimateTokens(entry.size);\n }\n\n const tier = classifyFile(entry, config.tiering);\n\n files.push({\n path: entry.path,\n relativePath: entry.relativePath,\n size: entry.size,\n tokens,\n extension: entry.extension,\n lastModified: entry.lastModified,\n lastAccessed: entry.lastAccessed,\n tier,\n lines: entry.lines,\n });\n }\n\n // AST analysis — dependency graph, hub detection, complexity\n let dependencyGraph: DependencyGraph | undefined;\n try {\n const project = createProject(absPath, files.map((f) => f.path));\n dependencyGraph = buildDependencyGraph(project, absPath);\n const complexities = analyzeAllComplexity(project, absPath);\n const enriched = enrichFilesWithAST(files, dependencyGraph, complexities);\n\n // Re-classify with AST data (hub boost)\n for (let i = 0; i < enriched.length; i++) {\n files[i] = enriched[i];\n files[i].tier = classifyFileWithAST(enriched[i], config.tiering);\n }\n } catch {\n // AST analysis is best-effort — fallback to basic tiering\n }\n\n if (useTiktoken) freeEncoder();\n\n files.sort((a, b) => b.tokens - a.tokens);\n\n const totalTokens = files.reduce((sum, f) => sum + f.tokens, 0);\n const totalSize = files.reduce((sum, f) => sum + f.size, 0);\n\n const analysis: ProjectAnalysis = {\n projectPath: absPath,\n projectName: basename(absPath),\n totalFiles: files.length,\n totalTokens,\n totalSize,\n files,\n tiers: buildTierSummary(files, totalTokens),\n analyzedAt: new Date(),\n dependencyGraph,\n tokenEstimationMethod: config.tokenEstimation,\n };\n\n await saveAnalysis(absPath, analysis);\n return analysis;\n}\n\nexport async function saveAnalysis(projectPath: string, analysis: ProjectAnalysis): Promise<void> {\n const analysisPath = getProjectAnalysisPath(projectPath);\n await writeJSON(analysisPath, analysis);\n}\n\nexport async function loadAnalysis(projectPath: string): Promise<ProjectAnalysis | null> {\n const absPath = resolve(projectPath);\n const analysisPath = getProjectAnalysisPath(absPath);\n return readJSON<ProjectAnalysis>(analysisPath);\n}\n\nexport function detectStack(files: FileInfo[]): string[] {\n const stack: string[] = [];\n const extensions = new Set(files.map((f) => f.extension));\n const filenames = new Set(files.map((f) => basename(f.path)));\n\n if (extensions.has('ts') || extensions.has('tsx')) stack.push('TypeScript');\n else if (extensions.has('js') || extensions.has('jsx')) stack.push('JavaScript');\n\n if (extensions.has('py')) stack.push('Python');\n if (extensions.has('go')) stack.push('Go');\n if (extensions.has('rs')) stack.push('Rust');\n if (extensions.has('rb')) stack.push('Ruby');\n if (extensions.has('java') || extensions.has('kt')) stack.push('Java/Kotlin');\n if (extensions.has('swift')) stack.push('Swift');\n if (extensions.has('php')) stack.push('PHP');\n if (extensions.has('vue')) stack.push('Vue');\n if (extensions.has('svelte')) stack.push('Svelte');\n\n if (filenames.has('next.config.js') || filenames.has('next.config.mjs') || filenames.has('next.config.ts')) {\n stack.push('Next.js');\n }\n if (filenames.has('nuxt.config.ts') || filenames.has('nuxt.config.js')) stack.push('Nuxt');\n if (filenames.has('astro.config.mjs')) stack.push('Astro');\n if (filenames.has('vite.config.ts') || filenames.has('vite.config.js')) stack.push('Vite');\n if (filenames.has('tailwind.config.js') || filenames.has('tailwind.config.ts')) stack.push('TailwindCSS');\n if (filenames.has('prisma')) stack.push('Prisma');\n if (filenames.has('docker-compose.yml') || filenames.has('Dockerfile')) stack.push('Docker');\n\n return stack;\n}\n\nexport function detectTestFramework(files: FileInfo[]): string {\n const filenames = files.map((f) => basename(f.path));\n const paths = files.map((f) => f.relativePath);\n\n if (filenames.some((f) => f.includes('.test.') || f.includes('.spec.'))) {\n if (paths.some((p) => p.includes('vitest') || p.includes('vite'))) return 'vitest';\n if (paths.some((p) => p.includes('jest'))) return 'jest';\n return 'jest/vitest';\n }\n if (paths.some((p) => p.includes('pytest') || p.includes('test_'))) return 'pytest';\n if (paths.some((p) => p.includes('_test.go'))) return 'go test';\n if (paths.some((p) => p.includes('_test.rs'))) return 'cargo test';\n\n return 'unknown';\n}\n","import { parse, stringify } from 'yaml';\nimport type { CTOConfig, ProjectConfig } from '../types/index.js';\nimport { DEFAULT_CONFIG } from '../utils/constants.js';\nimport { getCTOConfigPath, getProjectConfigPath, getCTORoot } from '../utils/paths.js';\nimport { readText, writeText, fileExists, ensureDir } from '../utils/fs.js';\n\nexport async function initCTODir(): Promise<void> {\n await ensureDir(getCTORoot());\n}\n\nexport async function loadGlobalConfig(): Promise<CTOConfig> {\n const configPath = getCTOConfigPath();\n if (!fileExists(configPath)) {\n return { ...DEFAULT_CONFIG };\n }\n\n const content = await readText(configPath);\n if (!content) return { ...DEFAULT_CONFIG };\n\n try {\n const parsed = parse(content) as Partial<CTOConfig>;\n return mergeConfig(DEFAULT_CONFIG, parsed);\n } catch {\n return { ...DEFAULT_CONFIG };\n }\n}\n\nexport async function saveGlobalConfig(config: CTOConfig): Promise<void> {\n await initCTODir();\n const configPath = getCTOConfigPath();\n await writeText(configPath, stringify(config, { indent: 2 }));\n}\n\nexport async function loadProjectConfig(projectPath: string): Promise<CTOConfig> {\n const globalConfig = await loadGlobalConfig();\n const projectConfigPath = getProjectConfigPath(projectPath);\n\n if (!fileExists(projectConfigPath)) {\n return globalConfig;\n }\n\n const content = await readText(projectConfigPath);\n if (!content) return globalConfig;\n\n try {\n const parsed = parse(content) as Partial<ProjectConfig>;\n return mergeConfig(globalConfig, parsed);\n } catch {\n return globalConfig;\n }\n}\n\nexport async function saveProjectConfig(\n projectPath: string,\n config: Partial<ProjectConfig>,\n): Promise<void> {\n const projectConfigPath = getProjectConfigPath(projectPath);\n const existing = await loadProjectConfig(projectPath);\n const merged = { ...existing, ...config, projectPath };\n await writeText(projectConfigPath, stringify(merged, { indent: 2 }));\n}\n\nfunction mergeConfig(base: CTOConfig, override: Partial<CTOConfig>): CTOConfig {\n return {\n version: override.version ?? base.version,\n extensions: override.extensions\n ? {\n code: override.extensions.code ?? base.extensions.code,\n config: override.extensions.config ?? base.extensions.config,\n docs: override.extensions.docs ?? base.extensions.docs,\n ignore: override.extensions.ignore ?? base.extensions.ignore,\n }\n : base.extensions,\n tiering: override.tiering\n ? { ...base.tiering, ...override.tiering }\n : base.tiering,\n ignoreDirs: override.ignoreDirs ?? base.ignoreDirs,\n ignorePatterns: override.ignorePatterns ?? base.ignorePatterns,\n model: override.model ?? base.model,\n tokenEstimation: override.tokenEstimation ?? base.tokenEstimation,\n };\n}\n\nexport async function hasGlobalConfig(): Promise<boolean> {\n return fileExists(getCTOConfigPath());\n}\n","import { homedir } from 'node:os';\nimport { join, resolve } from 'node:path';\nimport { createHash } from 'node:crypto';\nimport { CTO_DIR, CTO_CONFIG_FILE, CTO_PROJECTS_DIR, CTO_BACKUPS_DIR, CTO_SESSIONS_DIR } from './constants.js';\n\nexport function getCTORoot(): string {\n return join(homedir(), CTO_DIR);\n}\n\nexport function getCTOConfigPath(): string {\n return join(getCTORoot(), CTO_CONFIG_FILE);\n}\n\nexport function getProjectHash(projectPath: string): string {\n const normalized = resolve(projectPath);\n return createHash('sha256').update(normalized).digest('hex').substring(0, 12);\n}\n\nexport function getProjectDir(projectPath: string): string {\n const hash = getProjectHash(projectPath);\n return join(getCTORoot(), CTO_PROJECTS_DIR, hash);\n}\n\nexport function getProjectConfigPath(projectPath: string): string {\n return join(getProjectDir(projectPath), CTO_CONFIG_FILE);\n}\n\nexport function getProjectAnalysisPath(projectPath: string): string {\n return join(getProjectDir(projectPath), 'analysis.json');\n}\n\nexport function getBackupsDir(projectPath: string): string {\n return join(getProjectDir(projectPath), CTO_BACKUPS_DIR);\n}\n\nexport function getSessionsDir(projectPath: string): string {\n return join(getProjectDir(projectPath), CTO_SESSIONS_DIR);\n}\n\nexport function getArtifactsDir(projectPath: string): string {\n return join(getProjectDir(projectPath), 'artifacts');\n}\n","import { readFile, writeFile, mkdir, stat, readdir, copyFile, unlink, rm } from 'node:fs/promises';\nimport { join, extname, relative } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type { CTOConfig } from '../types/index.js';\n\nexport async function ensureDir(dirPath: string): Promise<void> {\n await mkdir(dirPath, { recursive: true });\n}\n\nexport async function readJSON<T>(filePath: string): Promise<T | null> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport async function writeJSON(filePath: string, data: unknown): Promise<void> {\n const dir = join(filePath, '..');\n await ensureDir(dir);\n await writeFile(filePath, JSON.stringify(data, null, 2), 'utf-8');\n}\n\nexport async function readText(filePath: string): Promise<string | null> {\n try {\n return await readFile(filePath, 'utf-8');\n } catch {\n return null;\n }\n}\n\nexport async function writeText(filePath: string, content: string): Promise<void> {\n const dir = join(filePath, '..');\n await ensureDir(dir);\n await writeFile(filePath, content, 'utf-8');\n}\n\nexport function fileExists(filePath: string): boolean {\n return existsSync(filePath);\n}\n\nexport async function getFileStat(filePath: string) {\n try {\n return await stat(filePath);\n } catch {\n return null;\n }\n}\n\nexport async function copyFileWithBackup(src: string, dest: string): Promise<void> {\n await ensureDir(join(dest, '..'));\n await copyFile(src, dest);\n}\n\nexport async function removeFile(filePath: string): Promise<boolean> {\n try {\n await unlink(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function removeDir(dirPath: string): Promise<boolean> {\n try {\n await rm(dirPath, { recursive: true, force: true });\n return true;\n } catch {\n return false;\n }\n}\n\nexport interface WalkOptions {\n ignoreDirs: string[];\n ignorePatterns: string[];\n extensions: string[];\n maxDepth?: number;\n}\n\nexport interface WalkEntry {\n path: string;\n relativePath: string;\n extension: string;\n size: number;\n lastModified: Date;\n lastAccessed: Date;\n lines: number;\n}\n\nfunction matchesPattern(filename: string, patterns: string[]): boolean {\n for (const pattern of patterns) {\n if (pattern.startsWith('*.')) {\n const ext = pattern.slice(1);\n if (filename.endsWith(ext)) return true;\n } else if (filename === pattern) {\n return true;\n }\n }\n return false;\n}\n\nexport async function walkProject(\n rootPath: string,\n options: WalkOptions,\n): Promise<WalkEntry[]> {\n const results: WalkEntry[] = [];\n const { ignoreDirs, ignorePatterns, extensions, maxDepth = 20 } = options;\n const ignoreDirSet = new Set(ignoreDirs);\n\n async function walk(dir: string, depth: number): Promise<void> {\n if (depth > maxDepth) return;\n\n let entries;\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n const promises: Promise<void>[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!ignoreDirSet.has(entry.name) && !entry.name.startsWith('.')) {\n promises.push(walk(fullPath, depth + 1));\n }\n } else if (entry.isFile()) {\n const ext = extname(entry.name).slice(1).toLowerCase();\n if (ext && extensions.includes(ext) && !matchesPattern(entry.name, ignorePatterns)) {\n promises.push(\n (async () => {\n const fileStat = await getFileStat(fullPath);\n if (!fileStat) return;\n\n let lines = 0;\n try {\n const content = await readFile(fullPath, 'utf-8');\n lines = content.split('\\n').length;\n } catch {\n lines = 0;\n }\n\n results.push({\n path: fullPath,\n relativePath: relative(rootPath, fullPath),\n extension: ext,\n size: fileStat.size,\n lastModified: fileStat.mtime,\n lastAccessed: fileStat.atime,\n lines,\n });\n })(),\n );\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n await walk(rootPath, 0);\n return results;\n}\n\nexport function getAllExtensions(config: CTOConfig): string[] {\n return [\n ...config.extensions.code,\n ...config.extensions.config,\n ...config.extensions.docs,\n ];\n}\n","import type { Tier, TierThresholds, FileInfo, TierSummary, TierDetail } from '../types/index.js';\nimport type { WalkEntry } from '../utils/fs.js';\n\nexport function classifyFile(entry: WalkEntry, thresholds: TierThresholds): Tier {\n const now = new Date();\n const diffMs = now.getTime() - entry.lastModified.getTime();\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\n\n if (diffDays <= thresholds.hotDays) {\n return 'hot';\n }\n\n if (diffDays <= thresholds.warmDays) {\n return 'warm';\n }\n\n return 'cold';\n}\n\nexport function classifyFileWithAST(file: FileInfo, thresholds: TierThresholds): Tier {\n const now = new Date();\n const modDate = file.lastModified instanceof Date ? file.lastModified : new Date(file.lastModified);\n const diffMs = now.getTime() - modDate.getTime();\n const diffDays = diffMs / (1000 * 60 * 60 * 24);\n\n let baseTier: Tier;\n if (diffDays <= thresholds.hotDays) {\n baseTier = 'hot';\n } else if (diffDays <= thresholds.warmDays) {\n baseTier = 'warm';\n } else {\n baseTier = 'cold';\n }\n\n // Hub boost: files imported by 3+ others get promoted one tier\n if (file.isHub && (file.importedByCount ?? 0) >= 3) {\n if (baseTier === 'cold') return 'warm';\n if (baseTier === 'warm') return 'hot';\n }\n\n // High-complexity files that are warm get promoted to hot\n if ((file.complexity ?? 0) > 30 && baseTier === 'warm') {\n return 'hot';\n }\n\n return baseTier;\n}\n\nexport function buildTierSummary(files: FileInfo[], totalTokens: number): TierSummary {\n const hot = files.filter((f) => f.tier === 'hot');\n const warm = files.filter((f) => f.tier === 'warm');\n const cold = files.filter((f) => f.tier === 'cold');\n\n return {\n hot: buildTierDetail(hot, totalTokens),\n warm: buildTierDetail(warm, totalTokens),\n cold: buildTierDetail(cold, totalTokens),\n };\n}\n\nfunction buildTierDetail(files: FileInfo[], totalTokens: number): TierDetail {\n const tierTokens = files.reduce((sum, f) => sum + f.tokens, 0);\n const tierSize = files.reduce((sum, f) => sum + f.size, 0);\n\n return {\n files,\n totalTokens: tierTokens,\n totalSize: tierSize,\n count: files.length,\n percentage: totalTokens > 0 ? (tierTokens / totalTokens) * 100 : 0,\n };\n}\n\nexport function getTierFiles(files: FileInfo[], tier: Tier): FileInfo[] {\n return files.filter((f) => f.tier === tier).sort((a, b) => b.tokens - a.tokens);\n}\n\nexport function getTokenSavings(files: FileInfo[]): {\n withOptimization: number;\n withoutOptimization: number;\n saved: number;\n savingsPercent: number;\n} {\n const withoutOptimization = files.reduce((sum, f) => sum + f.tokens, 0);\n const withOptimization = files\n .filter((f) => f.tier === 'hot')\n .reduce((sum, f) => sum + f.tokens, 0);\n\n const saved = withoutOptimization - withOptimization;\n const savingsPercent = withoutOptimization > 0 ? (saved / withoutOptimization) * 100 : 0;\n\n return {\n withOptimization,\n withoutOptimization,\n saved,\n savingsPercent,\n };\n}\n","import { encodingForModel } from 'js-tiktoken';\nimport { readFile } from 'node:fs/promises';\nimport { CHARS_PER_TOKEN } from '../utils/constants.js';\n\nlet encoder: ReturnType<typeof encodingForModel> | null = null;\n\nfunction getEncoder() {\n if (!encoder) {\n encoder = encodingForModel('claude-3-5-sonnet-20241022' as any);\n }\n return encoder;\n}\n\nexport function countTokensTiktoken(text: string): number {\n try {\n const enc = getEncoder();\n const tokens = enc.encode(text);\n return tokens.length;\n } catch {\n return Math.ceil(text.length / CHARS_PER_TOKEN);\n }\n}\n\nexport function countTokensChars4(sizeInBytes: number): number {\n return Math.ceil(sizeInBytes / CHARS_PER_TOKEN);\n}\n\nexport function estimateTokens(\n content: string,\n sizeInBytes: number,\n method: 'chars4' | 'tiktoken' = 'chars4',\n): number {\n if (method === 'tiktoken') {\n return countTokensTiktoken(content);\n }\n return countTokensChars4(sizeInBytes);\n}\n\nexport async function estimateFileTokens(\n filePath: string,\n method: 'chars4' | 'tiktoken' = 'chars4',\n): Promise<number> {\n if (method === 'chars4') {\n const { stat } = await import('node:fs/promises');\n const s = await stat(filePath);\n return countTokensChars4(s.size);\n }\n\n try {\n const content = await readFile(filePath, 'utf-8');\n return countTokensTiktoken(content);\n } catch {\n const { stat } = await import('node:fs/promises');\n const s = await stat(filePath);\n return countTokensChars4(s.size);\n }\n}\n\nexport function freeEncoder(): void {\n encoder = null;\n}\n","import { Project, SyntaxKind, type SourceFile, type Node } from 'ts-morph';\nimport { resolve, relative, dirname, join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport type {\n DependencyGraph,\n DependencyEdge,\n HubFile,\n FileComplexity,\n FunctionComplexity,\n FileInfo,\n ModelPreference,\n} from '../types/index.js';\n\nconst TS_EXTENSIONS = new Set(['ts', 'tsx', 'js', 'jsx', 'mts', 'mjs', 'cts', 'cjs']);\n\nexport function createProject(projectPath: string, filePaths: string[]): Project {\n const tsConfigPath = join(projectPath, 'tsconfig.json');\n const hasTsConfig = existsSync(tsConfigPath);\n\n const project = new Project({\n tsConfigFilePath: hasTsConfig ? tsConfigPath : undefined,\n skipAddingFilesFromTsConfig: true,\n compilerOptions: hasTsConfig\n ? undefined\n : {\n allowJs: true,\n jsx: 4 as any, // JsxEmit.ReactJSX\n esModuleInterop: true,\n moduleResolution: 100 as any, // Bundler\n },\n });\n\n const tsFiles = filePaths.filter((f) => {\n const ext = f.split('.').pop()?.toLowerCase() ?? '';\n return TS_EXTENSIONS.has(ext);\n });\n\n for (const filePath of tsFiles) {\n try {\n project.addSourceFileAtPath(filePath);\n } catch {\n // skip files that can't be parsed\n }\n }\n\n return project;\n}\n\nexport function buildDependencyGraph(\n project: Project,\n projectPath: string,\n): DependencyGraph {\n const absPath = resolve(projectPath);\n const edges: DependencyEdge[] = [];\n const nodeSet = new Set<string>();\n\n for (const sourceFile of project.getSourceFiles()) {\n const fromRel = relative(absPath, sourceFile.getFilePath());\n if (fromRel.startsWith('..') || fromRel.includes('node_modules')) continue;\n nodeSet.add(fromRel);\n\n // Imports\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n const resolved = resolveImport(sourceFile, moduleSpecifier, absPath);\n if (resolved) {\n nodeSet.add(resolved);\n edges.push({ from: fromRel, to: resolved, type: 'import' });\n }\n }\n\n // Re-exports (export { } from './...')\n for (const exp of sourceFile.getExportDeclarations()) {\n const moduleSpecifier = exp.getModuleSpecifierValue();\n if (moduleSpecifier) {\n const resolved = resolveImport(sourceFile, moduleSpecifier, absPath);\n if (resolved) {\n nodeSet.add(resolved);\n edges.push({ from: fromRel, to: resolved, type: 're-export' });\n }\n }\n }\n }\n\n const nodes = Array.from(nodeSet);\n\n // Calculate import counts\n const importedByCount = new Map<string, number>();\n const importCount = new Map<string, number>();\n\n for (const edge of edges) {\n importedByCount.set(edge.to, (importedByCount.get(edge.to) ?? 0) + 1);\n importCount.set(edge.from, (importCount.get(edge.from) ?? 0) + 1);\n }\n\n // Identify hubs (files imported by many others)\n const hubs: HubFile[] = nodes\n .map((node) => ({\n relativePath: node,\n importedByCount: importedByCount.get(node) ?? 0,\n importCount: importCount.get(node) ?? 0,\n score: (importedByCount.get(node) ?? 0) * 2 + (importCount.get(node) ?? 0),\n }))\n .filter((h) => h.importedByCount >= 2 || h.score >= 4)\n .sort((a, b) => b.score - a.score);\n\n // Identify leaves (files that import but are not imported by anyone)\n const leaves = nodes.filter(\n (node) => (importedByCount.get(node) ?? 0) === 0 && (importCount.get(node) ?? 0) > 0,\n );\n\n return { nodes, edges, hubs, leaves };\n}\n\nexport function analyzeFileComplexity(\n project: Project,\n projectPath: string,\n filePath: string,\n): FileComplexity | null {\n const absPath = resolve(projectPath);\n const sourceFile = project.getSourceFile(filePath);\n if (!sourceFile) return null;\n\n const relPath = relative(absPath, sourceFile.getFilePath());\n const functions: FunctionComplexity[] = [];\n\n // Analyze function declarations\n for (const func of sourceFile.getFunctions()) {\n const name = func.getName() ?? '<anonymous>';\n const complexity = calculateCyclomaticComplexity(func);\n functions.push({\n name,\n complexity,\n startLine: func.getStartLineNumber(),\n endLine: func.getEndLineNumber(),\n });\n }\n\n // Analyze method declarations in classes\n for (const cls of sourceFile.getClasses()) {\n for (const method of cls.getMethods()) {\n const name = `${cls.getName() ?? '<class>'}.${method.getName()}`;\n const complexity = calculateCyclomaticComplexity(method);\n functions.push({\n name,\n complexity,\n startLine: method.getStartLineNumber(),\n endLine: method.getEndLineNumber(),\n });\n }\n }\n\n // Analyze arrow functions / variable declarations with function expressions\n for (const varDecl of sourceFile.getVariableDeclarations()) {\n const init = varDecl.getInitializer();\n if (init && (init.getKind() === SyntaxKind.ArrowFunction || init.getKind() === SyntaxKind.FunctionExpression)) {\n const name = varDecl.getName();\n const complexity = calculateCyclomaticComplexity(init);\n functions.push({\n name,\n complexity,\n startLine: varDecl.getStartLineNumber(),\n endLine: varDecl.getEndLineNumber(),\n });\n }\n }\n\n const totalComplexity = functions.length > 0\n ? functions.reduce((sum, f) => sum + f.complexity, 0)\n : 1;\n\n const avgComplexity = functions.length > 0 ? totalComplexity / functions.length : 1;\n\n return {\n relativePath: relPath,\n cyclomaticComplexity: totalComplexity,\n functions: functions.sort((a, b) => b.complexity - a.complexity),\n modelSuggestion: suggestModel(avgComplexity, totalComplexity),\n };\n}\n\nexport function analyzeAllComplexity(\n project: Project,\n projectPath: string,\n): FileComplexity[] {\n const results: FileComplexity[] = [];\n const absPath = resolve(projectPath);\n\n for (const sourceFile of project.getSourceFiles()) {\n const filePath = sourceFile.getFilePath();\n const relPath = relative(absPath, filePath);\n if (relPath.startsWith('..') || relPath.includes('node_modules')) continue;\n\n const result = analyzeFileComplexity(project, projectPath, filePath);\n if (result) results.push(result);\n }\n\n return results.sort((a, b) => b.cyclomaticComplexity - a.cyclomaticComplexity);\n}\n\nexport function enrichFilesWithAST(\n files: FileInfo[],\n graph: DependencyGraph,\n complexities: FileComplexity[],\n): FileInfo[] {\n const importedByMap = new Map<string, string[]>();\n const importsMap = new Map<string, string[]>();\n\n for (const edge of graph.edges) {\n if (!importsMap.has(edge.from)) importsMap.set(edge.from, []);\n importsMap.get(edge.from)!.push(edge.to);\n\n if (!importedByMap.has(edge.to)) importedByMap.set(edge.to, []);\n importedByMap.get(edge.to)!.push(edge.from);\n }\n\n const hubSet = new Set(graph.hubs.map((h) => h.relativePath));\n const complexityMap = new Map(complexities.map((c) => [c.relativePath, c]));\n\n return files.map((file) => {\n const imports = importsMap.get(file.relativePath) ?? [];\n const importedBy = importedByMap.get(file.relativePath) ?? [];\n const comp = complexityMap.get(file.relativePath);\n\n return {\n ...file,\n imports,\n importedBy,\n importCount: imports.length,\n importedByCount: importedBy.length,\n isHub: hubSet.has(file.relativePath),\n complexity: comp?.cyclomaticComplexity ?? 0,\n modelSuggestion: comp?.modelSuggestion ?? 'sonnet',\n };\n });\n}\n\nfunction resolveImport(\n sourceFile: SourceFile,\n moduleSpecifier: string,\n projectRoot: string,\n): string | null {\n // Only resolve relative imports (not node_modules)\n if (!moduleSpecifier.startsWith('.')) return null;\n\n const sourceDir = dirname(sourceFile.getFilePath());\n const basePath = resolve(sourceDir, moduleSpecifier);\n\n // Try common extensions\n const extensions = ['.ts', '.tsx', '.js', '.jsx', '/index.ts', '/index.tsx', '/index.js', '/index.jsx'];\n\n for (const ext of extensions) {\n const candidate = basePath.endsWith(ext) ? basePath : basePath + ext;\n if (existsSync(candidate)) {\n const rel = relative(projectRoot, candidate);\n if (!rel.startsWith('..')) return rel;\n }\n }\n\n // Try .js → .ts resolution\n if (moduleSpecifier.endsWith('.js')) {\n const tsPath = basePath.replace(/\\.js$/, '.ts');\n if (existsSync(tsPath)) {\n const rel = relative(projectRoot, tsPath);\n if (!rel.startsWith('..')) return rel;\n }\n }\n\n return null;\n}\n\nfunction calculateCyclomaticComplexity(node: Node): number {\n let complexity = 1;\n\n node.forEachDescendant((descendant) => {\n switch (descendant.getKind()) {\n case SyntaxKind.IfStatement:\n case SyntaxKind.ConditionalExpression:\n case SyntaxKind.ForStatement:\n case SyntaxKind.ForInStatement:\n case SyntaxKind.ForOfStatement:\n case SyntaxKind.WhileStatement:\n case SyntaxKind.DoStatement:\n case SyntaxKind.CaseClause:\n case SyntaxKind.CatchClause:\n complexity++;\n break;\n case SyntaxKind.BinaryExpression: {\n const text = descendant.getText();\n if (text.includes('&&') || text.includes('||') || text.includes('??')) {\n complexity++;\n }\n break;\n }\n }\n });\n\n return complexity;\n}\n\nfunction suggestModel(avgComplexity: number, totalComplexity: number): ModelPreference {\n if (avgComplexity > 15 || totalComplexity > 50) return 'opus';\n if (avgComplexity > 5 || totalComplexity > 20) return 'sonnet';\n return 'haiku';\n}\n","import chalk from 'chalk';\n\nexport function formatTokens(tokens: number): string {\n if (tokens >= 1_000_000) {\n return `${(tokens / 1_000_000).toFixed(1)}M`;\n }\n if (tokens >= 1_000) {\n return `${(tokens / 1_000).toFixed(1)}K`;\n }\n return tokens.toString();\n}\n\nexport function formatBytes(bytes: number): string {\n if (bytes >= 1_048_576) {\n return `${(bytes / 1_048_576).toFixed(1)} MB`;\n }\n if (bytes >= 1_024) {\n return `${(bytes / 1_024).toFixed(1)} KB`;\n }\n return `${bytes} B`;\n}\n\nexport function formatDate(date: Date): string {\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));\n\n if (diffDays === 0) return 'hoy';\n if (diffDays === 1) return 'ayer';\n if (diffDays < 7) return `hace ${diffDays} días`;\n if (diffDays < 30) return `hace ${Math.floor(diffDays / 7)} semanas`;\n return `hace ${Math.floor(diffDays / 30)} meses`;\n}\n\nexport function tierColor(tier: string): string {\n switch (tier) {\n case 'hot': return chalk.red('🔥 HOT');\n case 'warm': return chalk.yellow('🌡️ WARM');\n case 'cold': return chalk.blue('❄️ COLD');\n default: return tier;\n }\n}\n\nexport function tierBadge(tier: string): string {\n switch (tier) {\n case 'hot': return chalk.bgRed.white(' HOT ');\n case 'warm': return chalk.bgYellow.black(' WARM ');\n case 'cold': return chalk.bgBlue.white(' COLD ');\n default: return tier;\n }\n}\n\nexport function successMsg(msg: string): string {\n return chalk.green(`✅ ${msg}`);\n}\n\nexport function errorMsg(msg: string): string {\n return chalk.red(`❌ ${msg}`);\n}\n\nexport function warnMsg(msg: string): string {\n return chalk.yellow(`⚠️ ${msg}`);\n}\n\nexport function infoMsg(msg: string): string {\n return chalk.cyan(`ℹ️ ${msg}`);\n}\n\nexport function header(title: string): string {\n const line = '━'.repeat(Math.max(title.length + 4, 40));\n return `\\n${chalk.bold.cyan(line)}\\n${chalk.bold.cyan(` ${title}`)}\\n${chalk.bold.cyan(line)}`;\n}\n\nexport function percentage(value: number, total: number): string {\n if (total === 0) return '0%';\n return `${((value / total) * 100).toFixed(1)}%`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { getTierFiles } from '../../core/tiering.js';\nimport { formatTokens, formatBytes, tierColor, tierBadge } from '../../utils/format.js';\nimport type { Tier } from '../../types/index.js';\n\nexport const tiersCommand = new Command('tiers')\n .description('Show file tiers (hot/warm/cold)')\n .argument('[path]', 'Project path', '.')\n .option('--tier <tier>', 'Show only a specific tier (hot, warm, cold)')\n .option('--refresh', 'Force re-analysis before showing tiers')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { tier?: string; refresh?: boolean; json?: boolean }) => {\n try {\n let analysis = opts.refresh ? null : await loadAnalysis(path);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project...'));\n analysis = await analyzeProject(path);\n }\n\n if (opts.json) {\n const data = opts.tier\n ? getTierFiles(analysis.files, opts.tier as Tier)\n : analysis.tiers;\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n const tiers: Tier[] = opts.tier\n ? [opts.tier as Tier]\n : ['hot', 'warm', 'cold'];\n\n for (const tier of tiers) {\n const files = getTierFiles(analysis.files, tier);\n\n console.log('');\n console.log(`${tierBadge(tier)} ${chalk.bold(`${files.length} files`)}`);\n\n if (files.length === 0) {\n console.log(chalk.dim(' (no files in this tier)'));\n continue;\n }\n\n const table = new Table({\n head: ['File', 'Tokens', 'Size', 'Lines', 'Modified'],\n style: { head: ['cyan'] },\n colAligns: ['left', 'right', 'right', 'right', 'left'],\n });\n\n for (const f of files) {\n const modDate = new Date(f.lastModified);\n const daysAgo = Math.floor((Date.now() - modDate.getTime()) / (1000 * 60 * 60 * 24));\n const modStr = daysAgo === 0 ? 'today' : daysAgo === 1 ? 'yesterday' : `${daysAgo}d ago`;\n\n table.push([\n f.relativePath.length > 55 ? '...' + f.relativePath.slice(-52) : f.relativePath,\n `~${formatTokens(f.tokens)}`,\n formatBytes(f.size),\n f.lines.toString(),\n modStr,\n ]);\n }\n\n console.log(table.toString());\n\n const totalTokens = files.reduce((s, f) => s + f.tokens, 0);\n console.log(chalk.dim(` Total: ~${formatTokens(totalTokens)} tokens`));\n }\n } catch (err) {\n console.error(chalk.red(`❌ Failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { generateClaudeMd, generateClaudeignore } from '../../core/generator.js';\nimport { successMsg, infoMsg } from '../../utils/format.js';\n\nexport const generateCommand = new Command('generate')\n .description('Generate CLAUDE.md and/or .claudeignore (saved to ~/.config/cto/)')\n .argument('[path]', 'Project path', '.')\n .option('--claude-md', 'Generate only CLAUDE.md')\n .option('--claudeignore', 'Generate only .claudeignore')\n .option('--refresh', 'Force re-analysis')\n .action(async (path: string, opts: { claudeMd?: boolean; claudeignore?: boolean; refresh?: boolean }) => {\n try {\n let analysis = opts.refresh ? null : await loadAnalysis(path);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project...'));\n analysis = await analyzeProject(path);\n }\n\n const generateBoth = !opts.claudeMd && !opts.claudeignore;\n\n if (generateBoth || opts.claudeMd) {\n const artifact = await generateClaudeMd(analysis);\n console.log(successMsg('CLAUDE.md generated'));\n console.log(infoMsg(`Saved to CTO artifacts dir`));\n console.log(chalk.dim(` Target: ${artifact.targetPath}`));\n console.log(chalk.dim(` Use 'cto show claude-md' to preview`));\n console.log(chalk.dim(` Use 'cto apply claude-md' to apply to project`));\n }\n\n if (generateBoth || opts.claudeignore) {\n const artifact = await generateClaudeignore(analysis);\n console.log(successMsg('.claudeignore generated'));\n console.log(infoMsg(`Saved to CTO artifacts dir`));\n console.log(chalk.dim(` Target: ${artifact.targetPath}`));\n console.log(chalk.dim(` Use 'cto show claudeignore' to preview`));\n console.log(chalk.dim(` Use 'cto apply claudeignore' to apply to project`));\n }\n } catch (err) {\n console.error(chalk.red(`❌ Generation failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { join, basename } from 'node:path';\nimport type { ProjectAnalysis, GeneratedArtifact, FileInfo, CTOConfig } from '../types/index.js';\nimport { detectStack, detectTestFramework } from './analyzer.js';\nimport { loadProjectConfig } from './config.js';\nimport { getArtifactsDir } from '../utils/paths.js';\nimport { writeText, readText } from '../utils/fs.js';\nimport { sanitizeContent } from './security.js';\n\nexport async function generateClaudeMd(analysis: ProjectAnalysis): Promise<GeneratedArtifact> {\n const config = await loadProjectConfig(analysis.projectPath);\n const stack = detectStack(analysis.files);\n const testFramework = detectTestFramework(analysis.files);\n\n const hotFiles = analysis.tiers.hot.files;\n const warmFiles = analysis.tiers.warm.files;\n\n const lines: string[] = [];\n\n lines.push(`# CLAUDE.md — ${analysis.projectName}`);\n lines.push('');\n lines.push('> Auto-generated by CTO (Claude Token Optimizer)');\n lines.push(`> Last updated: ${new Date().toISOString().split('T')[0]}`);\n lines.push('');\n\n // Project overview\n lines.push('## Project Overview');\n lines.push('');\n if (stack.length > 0) {\n lines.push(`**Stack:** ${stack.join(', ')}`);\n }\n lines.push(`**Files:** ${analysis.totalFiles} | **Tokens:** ~${formatNum(analysis.totalTokens)}`);\n if (testFramework !== 'unknown') {\n lines.push(`**Test framework:** ${testFramework}`);\n }\n lines.push('');\n\n // Token budget\n lines.push('## Token Budget');\n lines.push('');\n lines.push(`| Tier | Files | Tokens | % |`);\n lines.push(`|------|-------|--------|---|`);\n lines.push(`| 🔥 Hot | ${analysis.tiers.hot.count} | ~${formatNum(analysis.tiers.hot.totalTokens)} | ${analysis.tiers.hot.percentage.toFixed(1)}% |`);\n lines.push(`| 🌡️ Warm | ${analysis.tiers.warm.count} | ~${formatNum(analysis.tiers.warm.totalTokens)} | ${analysis.tiers.warm.percentage.toFixed(1)}% |`);\n lines.push(`| ❄️ Cold | ${analysis.tiers.cold.count} | ~${formatNum(analysis.tiers.cold.totalTokens)} | ${analysis.tiers.cold.percentage.toFixed(1)}% |`);\n lines.push('');\n\n // Hot files — read these first\n if (hotFiles.length > 0) {\n lines.push('## 🔥 Hot Files (Read First)');\n lines.push('');\n lines.push('These files are actively being worked on:');\n lines.push('');\n for (const f of hotFiles.slice(0, 20)) {\n lines.push(`- \\`${f.relativePath}\\` (~${formatNum(f.tokens)} tokens)`);\n }\n if (hotFiles.length > 20) {\n lines.push(`- ... and ${hotFiles.length - 20} more`);\n }\n lines.push('');\n }\n\n // Warm files — read if needed\n if (warmFiles.length > 0) {\n lines.push('## 🌡️ Warm Files (Read If Needed)');\n lines.push('');\n lines.push('Recently touched but not actively changing:');\n lines.push('');\n for (const f of warmFiles.slice(0, 15)) {\n lines.push(`- \\`${f.relativePath}\\` (~${formatNum(f.tokens)} tokens)`);\n }\n if (warmFiles.length > 15) {\n lines.push(`- ... and ${warmFiles.length - 15} more`);\n }\n lines.push('');\n }\n\n // Guidelines\n lines.push('## Guidelines for Claude');\n lines.push('');\n lines.push('1. **Start with hot files** — they contain the most relevant context');\n lines.push('2. **Ask before reading cold files** — they are likely stale or rarely changed');\n lines.push('3. **Use `/compact` after ~10 exchanges** to free up context window');\n lines.push('4. **Prefer focused edits** — avoid reading entire files when only a function is needed');\n if (config.model === 'sonnet') {\n lines.push('5. **Use Sonnet for most tasks** — switch to Opus only for complex architectural changes');\n }\n lines.push('');\n\n // Structure hints\n const topDirs = getTopDirectories(analysis.files);\n if (topDirs.length > 0) {\n lines.push('## Project Structure');\n lines.push('');\n for (const dir of topDirs) {\n lines.push(`- \\`${dir.name}/\\` — ${dir.fileCount} files, ~${formatNum(dir.tokens)} tokens`);\n }\n lines.push('');\n }\n\n // Sanitize content — strip any secrets that might have leaked into file paths or descriptions\n const content = sanitizeContent(lines.join('\\n'));\n const artifact: GeneratedArtifact = {\n type: 'claude-md',\n content,\n targetPath: join(analysis.projectPath, 'CLAUDE.md'),\n projectPath: analysis.projectPath,\n };\n\n // Save to CTO artifacts dir\n const artifactsDir = getArtifactsDir(analysis.projectPath);\n await writeText(join(artifactsDir, 'CLAUDE.md'), content);\n\n return artifact;\n}\n\nexport async function generateClaudeignore(analysis: ProjectAnalysis): Promise<GeneratedArtifact> {\n const config = await loadProjectConfig(analysis.projectPath);\n const coldFiles = analysis.tiers.cold.files;\n\n const lines: string[] = [];\n\n lines.push('# .claudeignore — Auto-generated by CTO');\n lines.push(`# Last updated: ${new Date().toISOString().split('T')[0]}`);\n lines.push('# Cold-tier files that Claude should skip');\n lines.push('');\n\n // Standard ignores\n lines.push('# Dependencies & build output');\n for (const dir of config.ignoreDirs) {\n lines.push(dir);\n }\n lines.push('');\n\n // Pattern ignores\n lines.push('# Generated files');\n for (const pattern of config.ignorePatterns) {\n lines.push(pattern);\n }\n lines.push('');\n\n // Cold directories (group by directory)\n const coldDirs = getColdDirectories(coldFiles);\n if (coldDirs.length > 0) {\n lines.push('# Cold directories (rarely modified)');\n for (const dir of coldDirs) {\n lines.push(`# ${dir} — cold tier`);\n }\n lines.push('');\n }\n\n // Extension-based ignores\n lines.push('# Ignored extensions');\n for (const ext of config.extensions.ignore) {\n lines.push(`*.${ext}`);\n }\n lines.push('');\n\n const content = lines.join('\\n');\n const artifact: GeneratedArtifact = {\n type: 'claudeignore',\n content,\n targetPath: join(analysis.projectPath, '.claudeignore'),\n projectPath: analysis.projectPath,\n };\n\n const artifactsDir = getArtifactsDir(analysis.projectPath);\n await writeText(join(artifactsDir, '.claudeignore'), content);\n\n return artifact;\n}\n\nexport async function loadGeneratedArtifact(\n projectPath: string,\n type: 'claude-md' | 'claudeignore',\n): Promise<string | null> {\n const artifactsDir = getArtifactsDir(projectPath);\n const filename = type === 'claude-md' ? 'CLAUDE.md' : '.claudeignore';\n return readText(join(artifactsDir, filename));\n}\n\nfunction formatNum(n: number): string {\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;\n if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;\n return n.toString();\n}\n\ninterface DirSummary {\n name: string;\n fileCount: number;\n tokens: number;\n}\n\nfunction getTopDirectories(files: FileInfo[]): DirSummary[] {\n const dirs = new Map<string, { count: number; tokens: number }>();\n\n for (const f of files) {\n const parts = f.relativePath.split('/');\n if (parts.length > 1) {\n const topDir = parts[0];\n const existing = dirs.get(topDir) ?? { count: 0, tokens: 0 };\n existing.count++;\n existing.tokens += f.tokens;\n dirs.set(topDir, existing);\n }\n }\n\n return Array.from(dirs.entries())\n .map(([name, data]) => ({ name, fileCount: data.count, tokens: data.tokens }))\n .sort((a, b) => b.tokens - a.tokens)\n .slice(0, 10);\n}\n\nfunction getColdDirectories(coldFiles: FileInfo[]): string[] {\n const dirs = new Map<string, number>();\n\n for (const f of coldFiles) {\n const parts = f.relativePath.split('/');\n if (parts.length > 1) {\n const dir = parts.slice(0, -1).join('/');\n dirs.set(dir, (dirs.get(dir) ?? 0) + 1);\n }\n }\n\n return Array.from(dirs.entries())\n .filter(([, count]) => count >= 3)\n .sort((a, b) => b[1] - a[1])\n .map(([dir]) => dir)\n .slice(0, 20);\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, relative } from 'node:path';\nimport type { SecretFinding, SecretType, SecurityConfig } from '../types/index.js';\n\nexport const DEFAULT_SECURITY_CONFIG: SecurityConfig = {\n encryptionEnabled: false,\n secretDetection: true,\n auditLogging: true,\n retentionDays: 90,\n securePermissions: true,\n};\n\ninterface SecretPatternDef {\n type: SecretType;\n source: string;\n flags: string;\n severity: SecretFinding['severity'];\n description: string;\n}\n\ninterface SecretPattern {\n type: SecretType;\n pattern: RegExp;\n severity: SecretFinding['severity'];\n description: string;\n}\n\nconst BUILTIN_PATTERN_DEFS: SecretPatternDef[] = [\n // API Keys\n { type: 'api-key', source: '(?:api[_-]?key|apikey)\\\\s*[:=]\\\\s*[\\'\"]?([a-zA-Z0-9_\\\\-]{20,})[\\'\"]?', flags: 'gi', severity: 'critical', description: 'API Key' },\n { type: 'api-key', source: 'sk-[a-zA-Z0-9]{20,}', flags: 'g', severity: 'critical', description: 'OpenAI/Anthropic API Key' },\n { type: 'api-key', source: 'sk-ant-[a-zA-Z0-9\\\\-]{20,}', flags: 'g', severity: 'critical', description: 'Anthropic API Key' },\n\n // AWS\n { type: 'aws-key', source: 'AKIA[0-9A-Z]{16}', flags: 'g', severity: 'critical', description: 'AWS Access Key ID' },\n { type: 'aws-key', source: '(?:aws_secret_access_key|aws_secret)\\\\s*[:=]\\\\s*[\\'\"]?([a-zA-Z0-9/+=]{40})[\\'\"]?', flags: 'gi', severity: 'critical', description: 'AWS Secret Key' },\n\n // Private Keys\n { type: 'private-key', source: '-----BEGIN (?:RSA |EC |DSA )?PRIVATE KEY-----', flags: 'g', severity: 'critical', description: 'Private Key' },\n { type: 'private-key', source: '-----BEGIN OPENSSH PRIVATE KEY-----', flags: 'g', severity: 'critical', description: 'SSH Private Key' },\n\n // Passwords\n { type: 'password', source: '(?:password|passwd|pwd)\\\\s*[:=]\\\\s*[\\'\"]([^\\'\"]{8,})[\\'\"](?!\\\\s*\\\\{)', flags: 'gi', severity: 'high', description: 'Hardcoded Password' },\n { type: 'password', source: '(?:DB_PASSWORD|DATABASE_PASSWORD|MYSQL_PASSWORD|POSTGRES_PASSWORD)\\\\s*[:=]\\\\s*[\\'\"]?([^\\'\"{}\\\\s]{4,})[\\'\"]?', flags: 'gi', severity: 'high', description: 'Database Password' },\n\n // Tokens\n { type: 'token', source: '(?:bearer|token|auth_token|access_token|refresh_token)\\\\s*[:=]\\\\s*[\\'\"]([a-zA-Z0-9_\\\\-.]{20,})[\\'\"](?!\\\\s*\\\\{)', flags: 'gi', severity: 'high', description: 'Auth Token' },\n { type: 'token', source: 'ghp_[a-zA-Z0-9]{36}', flags: 'g', severity: 'critical', description: 'GitHub Personal Access Token' },\n { type: 'token', source: 'gho_[a-zA-Z0-9]{36}', flags: 'g', severity: 'critical', description: 'GitHub OAuth Token' },\n { type: 'token', source: 'glpat-[a-zA-Z0-9\\\\-]{20,}', flags: 'g', severity: 'critical', description: 'GitLab Personal Access Token' },\n { type: 'token', source: 'npm_[a-zA-Z0-9]{36}', flags: 'g', severity: 'high', description: 'npm Token' },\n\n // Connection strings\n { type: 'connection-string', source: '(?:mongodb(?:\\\\+srv)?|postgres(?:ql)?|mysql|redis|amqp):\\\\/\\\\/[^\\\\s\\'\"]+:[^\\\\s\\'\"]+@[^\\\\s\\'\"]+', flags: 'gi', severity: 'critical', description: 'Database Connection String' },\n { type: 'connection-string', source: '(?:DATABASE_URL|REDIS_URL|MONGODB_URI)\\\\s*[:=]\\\\s*[\\'\"]?([^\\\\s\\'\"]{10,})[\\'\"]?', flags: 'gi', severity: 'high', description: 'Database URL' },\n\n // Environment variables with secrets\n { type: 'env-variable', source: '(?:SECRET|PRIVATE|ENCRYPTION)[_-]?(?:KEY|TOKEN|PASS)\\\\s*[:=]\\\\s*[\\'\"]?([^\\\\s\\'\"]{8,})[\\'\"]?', flags: 'gi', severity: 'high', description: 'Secret Environment Variable' },\n];\n\nfunction buildPatterns(customPatterns: string[] = []): SecretPattern[] {\n const patterns: SecretPattern[] = BUILTIN_PATTERN_DEFS.map((def) => ({\n type: def.type,\n pattern: new RegExp(def.source, def.flags),\n severity: def.severity,\n description: def.description,\n }));\n\n for (const custom of customPatterns) {\n try {\n patterns.push({\n type: 'custom',\n pattern: new RegExp(custom, 'gi'),\n severity: 'medium',\n description: `Custom pattern: ${custom}`,\n });\n } catch { /* skip invalid regex */ }\n }\n\n return patterns;\n}\n\nexport function scanContentForSecrets(\n content: string,\n filePath: string,\n customPatterns: string[] = [],\n): SecretFinding[] {\n const findings: SecretFinding[] = [];\n const lines = content.split('\\n');\n\n const allPatterns = buildPatterns(customPatterns);\n\n for (const secretPattern of allPatterns) {\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Reset regex lastIndex for global patterns\n secretPattern.pattern.lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = secretPattern.pattern.exec(line)) !== null) {\n const matchText = match[0];\n // Skip template/placeholder patterns\n if (isTemplateOrPlaceholder(matchText)) continue;\n\n findings.push({\n type: secretPattern.type,\n file: filePath,\n line: i + 1,\n match: matchText,\n redacted: redactSecret(matchText),\n severity: secretPattern.severity,\n });\n }\n }\n }\n\n return deduplicateFindings(findings);\n}\n\nexport async function scanFileForSecrets(\n filePath: string,\n projectPath: string,\n customPatterns: string[] = [],\n): Promise<SecretFinding[]> {\n try {\n const content = await readFile(filePath, 'utf-8');\n const relPath = relative(resolve(projectPath), resolve(filePath));\n return scanContentForSecrets(content, relPath, customPatterns);\n } catch {\n return [];\n }\n}\n\nexport async function scanProjectForSecrets(\n projectPath: string,\n filePaths: string[],\n customPatterns: string[] = [],\n): Promise<SecretFinding[]> {\n const allFindings: SecretFinding[] = [];\n\n for (const fp of filePaths) {\n const findings = await scanFileForSecrets(fp, projectPath, customPatterns);\n allFindings.push(...findings);\n }\n\n return allFindings.sort((a, b) => {\n const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };\n return severityOrder[a.severity] - severityOrder[b.severity];\n });\n}\n\nexport function sanitizeContent(content: string, customPatterns: string[] = []): string {\n let sanitized = content;\n\n const allPatterns = buildPatterns(customPatterns);\n\n for (const secretPattern of allPatterns) {\n sanitized = sanitized.replace(secretPattern.pattern, (match) => {\n if (isTemplateOrPlaceholder(match)) return match;\n return redactSecret(match);\n });\n }\n\n return sanitized;\n}\n\nfunction redactSecret(value: string): string {\n if (value.length <= 8) return '***REDACTED***';\n const prefix = value.substring(0, 4);\n const suffix = value.substring(value.length - 2);\n return `${prefix}${'*'.repeat(Math.min(value.length - 6, 20))}${suffix}`;\n}\n\nfunction isTemplateOrPlaceholder(value: string): boolean {\n const placeholders = [\n /\\$\\{.*\\}/, /\\{\\{.*\\}\\}/, /%[sd]/, /<[A-Z_]+>/, /YOUR_.*_HERE/i,\n /\\bCHANGE_ME\\b/i, /\\bPLACEHOLDER\\b/i, /\\bexample\\b/i, /\\bTODO\\b/i, /xxx+/i,\n /\\breplace.?me\\b/i, /\\bdummy\\b/i, /\\btest_?key\\b/i, /\\bsample\\b/i,\n ];\n return placeholders.some((p) => p.test(value));\n}\n\nfunction deduplicateFindings(findings: SecretFinding[]): SecretFinding[] {\n const seen = new Set<string>();\n return findings.filter((f) => {\n const key = `${f.file}:${f.line}:${f.type}:${f.match}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadGeneratedArtifact } from '../../core/generator.js';\nimport { errorMsg } from '../../utils/format.js';\n\nexport const showCommand = new Command('show')\n .description('Show a generated artifact (claude-md or claudeignore)')\n .argument('<artifact>', 'Artifact type: claude-md | claudeignore')\n .argument('[path]', 'Project path', '.')\n .action(async (artifact: string, path: string) => {\n const projectPath = resolve(path);\n\n const validTypes = ['claude-md', 'claudeignore'];\n if (!validTypes.includes(artifact)) {\n console.error(errorMsg(`Invalid artifact type: ${artifact}. Use: ${validTypes.join(', ')}`));\n process.exit(1);\n }\n\n const type = artifact as 'claude-md' | 'claudeignore';\n const content = await loadGeneratedArtifact(projectPath, type);\n\n if (!content) {\n console.error(errorMsg(`No generated ${artifact} found. Run 'cto generate' first.`));\n process.exit(1);\n }\n\n console.log(content);\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { input } from '@inquirer/prompts';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { generateClaudeMd, generateClaudeignore } from '../../core/generator.js';\nimport { applyArtifact, diffArtifact } from '../../core/session.js';\nimport { successMsg, errorMsg, warnMsg } from '../../utils/format.js';\n\nexport const applyCommand = new Command('apply')\n .description('Apply a generated artifact to the project (with confirmation)')\n .argument('<artifact>', 'Artifact type: claude-md | claudeignore | all')\n .argument('[path]', 'Project path', '.')\n .option('--yes', 'Skip confirmation prompt')\n .option('--refresh', 'Force re-analysis')\n .action(async (artifact: string, path: string, opts: { yes?: boolean; refresh?: boolean }) => {\n const projectPath = resolve(path);\n const validTypes = ['claude-md', 'claudeignore', 'all'];\n\n if (!validTypes.includes(artifact)) {\n console.error(errorMsg(`Invalid artifact type: ${artifact}. Use: ${validTypes.join(', ')}`));\n process.exit(1);\n }\n\n try {\n let analysis = opts.refresh ? null : await loadAnalysis(projectPath);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project...'));\n analysis = await analyzeProject(projectPath);\n }\n\n const artifacts = [];\n\n if (artifact === 'claude-md' || artifact === 'all') {\n artifacts.push(await generateClaudeMd(analysis));\n }\n if (artifact === 'claudeignore' || artifact === 'all') {\n artifacts.push(await generateClaudeignore(analysis));\n }\n\n for (const art of artifacts) {\n const diffResult = await diffArtifact(art);\n\n if (!diffResult.hasChanges) {\n console.log(chalk.dim(` ${art.type}: no changes needed`));\n continue;\n }\n\n console.log('');\n console.log(chalk.bold(`📝 ${art.type === 'claude-md' ? 'CLAUDE.md' : '.claudeignore'}`));\n console.log(chalk.dim(` Target: ${art.targetPath}`));\n\n if (diffResult.currentContent === null) {\n console.log(warnMsg('File does not exist yet — will be created'));\n } else {\n console.log(chalk.dim(' Diff preview:'));\n const diffLines = diffResult.diff.split('\\n').slice(0, 30);\n for (const line of diffLines) {\n if (line.startsWith('+') && !line.startsWith('+++')) {\n console.log(chalk.green(` ${line}`));\n } else if (line.startsWith('-') && !line.startsWith('---')) {\n console.log(chalk.red(` ${line}`));\n } else {\n console.log(chalk.dim(` ${line}`));\n }\n }\n if (diffResult.diff.split('\\n').length > 30) {\n console.log(chalk.dim(' ... (truncated)'));\n }\n }\n\n if (!opts.yes) {\n const answer = await input({\n message: `Apply ${art.type === 'claude-md' ? 'CLAUDE.md' : '.claudeignore'}? (yes/no)`,\n default: 'no',\n });\n\n if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {\n console.log(chalk.dim(' Skipped'));\n continue;\n }\n }\n\n const result = await applyArtifact(art);\n\n if (result.success) {\n console.log(successMsg(`Applied ${art.type === 'claude-md' ? 'CLAUDE.md' : '.claudeignore'}`));\n if (result.backup) {\n console.log(chalk.dim(` Backup: ${result.backup.id}`));\n console.log(chalk.dim(` Revert: cto revert ${art.type}`));\n }\n } else {\n console.error(errorMsg(`Failed: ${result.error}`));\n }\n }\n } catch (err) {\n console.error(chalk.red(`❌ Apply failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { join, basename } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport { createPatch } from 'diff';\nimport type {\n GeneratedArtifact,\n BackupEntry,\n ApplyResult,\n RevertResult,\n DiffResult,\n} from '../types/index.js';\nimport { getBackupsDir } from '../utils/paths.js';\nimport {\n readText,\n writeText,\n readJSON,\n writeJSON,\n fileExists,\n copyFileWithBackup,\n ensureDir,\n removeFile,\n} from '../utils/fs.js';\n\nconst BACKUP_MANIFEST = 'manifest.json';\n\nasync function loadManifest(projectPath: string): Promise<BackupEntry[]> {\n const manifestPath = join(getBackupsDir(projectPath), BACKUP_MANIFEST);\n return (await readJSON<BackupEntry[]>(manifestPath)) ?? [];\n}\n\nasync function saveManifest(projectPath: string, entries: BackupEntry[]): Promise<void> {\n const backupsDir = getBackupsDir(projectPath);\n await ensureDir(backupsDir);\n await writeJSON(join(backupsDir, BACKUP_MANIFEST), entries);\n}\n\nexport async function applyArtifact(artifact: GeneratedArtifact): Promise<ApplyResult> {\n const backupsDir = getBackupsDir(artifact.projectPath);\n await ensureDir(backupsDir);\n\n const hadOriginal = fileExists(artifact.targetPath);\n const backupId = randomUUID().substring(0, 8);\n const timestamp = new Date();\n const backupFilename = `${artifact.type}_${backupId}_${timestamp.getTime()}`;\n const backupPath = join(backupsDir, backupFilename);\n\n // Backup existing file if it exists\n if (hadOriginal) {\n try {\n await copyFileWithBackup(artifact.targetPath, backupPath);\n } catch (err) {\n return {\n success: false,\n artifact,\n error: `Failed to create backup: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n }\n\n // Write the new artifact\n try {\n await writeText(artifact.targetPath, artifact.content);\n } catch (err) {\n return {\n success: false,\n artifact,\n error: `Failed to write artifact: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n const backup: BackupEntry = {\n id: backupId,\n artifactType: artifact.type,\n originalPath: artifact.targetPath,\n backupPath,\n timestamp,\n projectPath: artifact.projectPath,\n hadOriginal,\n };\n\n // Add to manifest\n const manifest = await loadManifest(artifact.projectPath);\n manifest.push(backup);\n await saveManifest(artifact.projectPath, manifest);\n\n return { success: true, artifact, backup };\n}\n\nexport async function revertArtifact(\n projectPath: string,\n artifactType?: 'claude-md' | 'claudeignore',\n): Promise<RevertResult> {\n const manifest = await loadManifest(projectPath);\n\n if (manifest.length === 0) {\n return { success: false, backup: {} as BackupEntry, error: 'No backups found' };\n }\n\n // Find the latest backup matching the type, or the latest overall\n const candidates = artifactType\n ? manifest.filter((b) => b.artifactType === artifactType)\n : manifest;\n\n if (candidates.length === 0) {\n return {\n success: false,\n backup: {} as BackupEntry,\n error: `No backups found for type: ${artifactType}`,\n };\n }\n\n const latest = candidates[candidates.length - 1];\n\n try {\n if (latest.hadOriginal) {\n // Restore from backup\n await copyFileWithBackup(latest.backupPath, latest.originalPath);\n } else {\n // There was no original — remove the applied file\n await removeFile(latest.originalPath);\n }\n\n // Remove this entry from manifest\n const idx = manifest.findIndex((b) => b.id === latest.id);\n if (idx >= 0) manifest.splice(idx, 1);\n await saveManifest(projectPath, manifest);\n\n // Clean up backup file\n await removeFile(latest.backupPath);\n\n return { success: true, backup: latest };\n } catch (err) {\n return {\n success: false,\n backup: latest,\n error: `Failed to revert: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n\nexport async function diffArtifact(artifact: GeneratedArtifact): Promise<DiffResult> {\n const currentContent = fileExists(artifact.targetPath)\n ? await readText(artifact.targetPath)\n : null;\n\n const oldContent = currentContent ?? '';\n const newContent = artifact.content;\n const hasChanges = oldContent !== newContent;\n\n const diff = createPatch(\n basename(artifact.targetPath),\n oldContent,\n newContent,\n 'current',\n 'generated by CTO',\n );\n\n return {\n artifact,\n currentContent,\n diff,\n hasChanges,\n };\n}\n\nexport async function listBackups(projectPath: string): Promise<BackupEntry[]> {\n return loadManifest(projectPath);\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { revertArtifact, listBackups } from '../../core/session.js';\nimport { successMsg, errorMsg, warnMsg } from '../../utils/format.js';\n\nexport const revertCommand = new Command('revert')\n .description('Revert the last applied artifact using backups')\n .argument('[artifact]', 'Artifact type to revert: claude-md | claudeignore (optional, reverts latest)')\n .option('-p, --path <path>', 'Project path', '.')\n .option('--list', 'List available backups')\n .action(async (artifact: string | undefined, opts: { path: string; list?: boolean }) => {\n const projectPath = resolve(opts.path);\n\n try {\n if (opts.list) {\n const backups = await listBackups(projectPath);\n if (backups.length === 0) {\n console.log(chalk.dim('No backups found for this project.'));\n return;\n }\n\n console.log(chalk.bold('📦 Available Backups'));\n for (const b of backups) {\n const date = new Date(b.timestamp).toLocaleString();\n const type = b.artifactType === 'claude-md' ? 'CLAUDE.md' : '.claudeignore';\n const status = b.hadOriginal ? 'replaced' : 'created';\n console.log(` ${chalk.cyan(b.id)} — ${type} (${status}) — ${date}`);\n }\n return;\n }\n\n const artifactType = artifact as 'claude-md' | 'claudeignore' | undefined;\n\n if (artifactType && !['claude-md', 'claudeignore'].includes(artifactType)) {\n console.error(errorMsg(`Invalid artifact type: ${artifact}. Use: claude-md, claudeignore`));\n process.exit(1);\n }\n\n const result = await revertArtifact(projectPath, artifactType);\n\n if (result.success) {\n const type = result.backup.artifactType === 'claude-md' ? 'CLAUDE.md' : '.claudeignore';\n if (result.backup.hadOriginal) {\n console.log(successMsg(`Reverted ${type} to previous version`));\n } else {\n console.log(successMsg(`Removed ${type} (no previous version existed)`));\n }\n } else {\n console.error(errorMsg(result.error ?? 'Revert failed'));\n }\n } catch (err) {\n console.error(chalk.red(`❌ Revert failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { generateClaudeMd, generateClaudeignore } from '../../core/generator.js';\nimport { diffArtifact } from '../../core/session.js';\nimport { errorMsg } from '../../utils/format.js';\n\nexport const diffCommand = new Command('diff')\n .description('Show what would change before applying an artifact')\n .argument('<artifact>', 'Artifact type: claude-md | claudeignore')\n .argument('[path]', 'Project path', '.')\n .option('--refresh', 'Force re-analysis')\n .action(async (artifact: string, path: string, opts: { refresh?: boolean }) => {\n const projectPath = resolve(path);\n const validTypes = ['claude-md', 'claudeignore'];\n\n if (!validTypes.includes(artifact)) {\n console.error(errorMsg(`Invalid artifact type: ${artifact}. Use: ${validTypes.join(', ')}`));\n process.exit(1);\n }\n\n try {\n let analysis = opts.refresh ? null : await loadAnalysis(projectPath);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project...'));\n analysis = await analyzeProject(projectPath);\n }\n\n const type = artifact as 'claude-md' | 'claudeignore';\n const generated = type === 'claude-md'\n ? await generateClaudeMd(analysis)\n : await generateClaudeignore(analysis);\n\n const result = await diffArtifact(generated);\n\n if (!result.hasChanges) {\n console.log(chalk.green('✅ No changes — file is up to date'));\n return;\n }\n\n if (result.currentContent === null) {\n console.log(chalk.yellow('📄 File does not exist yet. Full content will be:'));\n console.log('');\n console.log(result.artifact.content);\n return;\n }\n\n // Print colored diff\n for (const line of result.diff.split('\\n')) {\n if (line.startsWith('+++') || line.startsWith('---')) {\n console.log(chalk.bold(line));\n } else if (line.startsWith('+')) {\n console.log(chalk.green(line));\n } else if (line.startsWith('-')) {\n console.log(chalk.red(line));\n } else if (line.startsWith('@@')) {\n console.log(chalk.cyan(line));\n } else {\n console.log(line);\n }\n }\n } catch (err) {\n console.error(chalk.red(`❌ Diff failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { input } from '@inquirer/prompts';\nimport { cleanProject } from '../../core/clean.js';\nimport { successMsg, errorMsg } from '../../utils/format.js';\n\nexport const cleanCommand = new Command('clean')\n .description('Remove all CTO data for a project (does not touch project files)')\n .argument('[path]', 'Project path', '.')\n .option('--yes', 'Skip confirmation')\n .action(async (path: string, opts: { yes?: boolean }) => {\n const projectPath = resolve(path);\n\n if (!opts.yes) {\n const answer = await input({\n message: `Remove all CTO data for ${projectPath}? This removes analysis, artifacts, and backups. (yes/no)`,\n default: 'no',\n });\n\n if (answer.toLowerCase() !== 'yes' && answer.toLowerCase() !== 'y') {\n console.log(chalk.dim('Cancelled.'));\n return;\n }\n }\n\n const result = await cleanProject(projectPath);\n\n if (result.success) {\n console.log(successMsg(`CTO data removed for ${projectPath}`));\n console.log(chalk.dim(` Removed: ${result.removedDir}`));\n } else {\n console.error(errorMsg(result.error ?? 'Clean failed'));\n }\n });\n","import { resolve } from 'node:path';\nimport { getProjectDir } from '../utils/paths.js';\nimport { removeDir, fileExists } from '../utils/fs.js';\n\nexport interface CleanResult {\n success: boolean;\n projectPath: string;\n removedDir: string;\n error?: string;\n}\n\nexport async function cleanProject(projectPath: string): Promise<CleanResult> {\n const absPath = resolve(projectPath);\n const projectDir = getProjectDir(absPath);\n\n if (!fileExists(projectDir)) {\n return {\n success: false,\n projectPath: absPath,\n removedDir: projectDir,\n error: 'No CTO data found for this project',\n };\n }\n\n try {\n const removed = await removeDir(projectDir);\n return {\n success: removed,\n projectPath: absPath,\n removedDir: projectDir,\n error: removed ? undefined : 'Failed to remove project directory',\n };\n } catch (err) {\n return {\n success: false,\n projectPath: absPath,\n removedDir: projectDir,\n error: `Clean failed: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { select, input, confirm } from '@inquirer/prompts';\nimport { initCTODir, saveGlobalConfig, saveProjectConfig, hasGlobalConfig } from '../../core/config.js';\nimport { initLocalProject, hasLocalConfig } from '../../core/local-config.js';\nimport { DEFAULT_CONFIG } from '../../utils/constants.js';\nimport { successMsg, infoMsg } from '../../utils/format.js';\nimport { parseGitignore, mergeWithDefaults } from '../../core/gitignore-parser.js';\nimport type { ModelPreference, AITarget } from '../../types/index.js';\n\nconst AI_TARGET_CHOICES = [\n { name: '🟠 Claude Code (recommended)', value: 'claude' },\n { name: '🟣 Cursor', value: 'cursor' },\n { name: '🔵 GitHub Copilot', value: 'copilot' },\n { name: '🟢 Google Gemini', value: 'gemini' },\n { name: '🌊 Windsurf (Cascade)', value: 'windsurf' },\n];\n\nfunction getNextSteps(aiTarget: string): string[] {\n const steps = [\n 'cto analyze — Analyze token usage',\n 'cto tiers — View file tiers',\n ];\n\n if (aiTarget === 'claude') {\n steps.push('cto generate — Generate CLAUDE.md & .claudeignore');\n steps.push('cto apply claude-md — Apply to project');\n } else {\n steps.push(`cto multi-gen generate --target ${aiTarget} --save`);\n }\n\n steps.push('cto multi-gen generate --target all --enhanced --save');\n return steps;\n}\n\nfunction getTargetFileName(target: string): string {\n switch (target) {\n case 'claude': return 'CLAUDE.md';\n case 'cursor': return '.cursorrules';\n case 'copilot': return 'copilot-instructions.md';\n case 'gemini': return 'GEMINI.md';\n case 'windsurf': return '.windsurfrules';\n default: return 'CLAUDE.md';\n }\n}\n\nexport const initCommand = new Command('init')\n .description('Initialize CTO configuration (interactive wizard)')\n .argument('[path]', 'Project path', '.')\n .option('--defaults', 'Use default config without wizard')\n .option('--local', 'Create .cto/ in project root (shareable with team via git)')\n .option('--from-gitignore', 'Auto-configure ignore rules from .gitignore')\n .action(async (path: string, opts: { defaults?: boolean; local?: boolean; fromGitignore?: boolean }) => {\n const projectPath = resolve(path);\n\n try {\n await initCTODir();\n\n // Parse .gitignore if requested\n let gitignoreOverrides: { ignoreDirs?: string[]; ignorePatterns?: string[] } = {};\n if (opts.fromGitignore) {\n const parsed = await parseGitignore(projectPath);\n if (parsed) {\n const merged = mergeWithDefaults(parsed, DEFAULT_CONFIG.ignoreDirs, DEFAULT_CONFIG.ignorePatterns);\n gitignoreOverrides = merged;\n const newDirs = parsed.ignoreDirs.filter((d) => !DEFAULT_CONFIG.ignoreDirs.includes(d));\n const newPatterns = parsed.ignorePatterns.filter((p) => !DEFAULT_CONFIG.ignorePatterns.includes(p));\n if (newDirs.length > 0 || newPatterns.length > 0) {\n console.log(chalk.green(' ✓ Imported from .gitignore:'));\n if (newDirs.length > 0) console.log(chalk.dim(` Dirs: ${newDirs.join(', ')}`));\n if (newPatterns.length > 0) console.log(chalk.dim(` Patterns: ${newPatterns.join(', ')}`));\n console.log('');\n } else {\n console.log(chalk.dim(' ℹ .gitignore entries already covered by defaults'));\n console.log('');\n }\n } else {\n console.log(chalk.yellow(' ⚠ No .gitignore found in project'));\n console.log('');\n }\n }\n\n // Local project init\n if (opts.local) {\n const alreadyLocal = await hasLocalConfig(projectPath);\n if (alreadyLocal) {\n console.log(chalk.yellow('⚠ .cto/ already exists in this project'));\n }\n\n if (opts.defaults) {\n const configPath = await initLocalProject(projectPath, { autoRouting: true });\n console.log(successMsg(`Local config created: ${configPath}`));\n console.log(chalk.dim(' .cto/config.yaml is git-trackable (shared with team)'));\n console.log(chalk.dim(' .cto/analysis.json and sessions/ are gitignored'));\n return;\n }\n\n console.log(chalk.bold.cyan('🚀 CTO — Local Project Setup'));\n console.log(chalk.dim(' Creates .cto/ in your project root'));\n console.log(chalk.dim(' Config is shared with team via git'));\n console.log('');\n\n // Step 1: AI target\n const aiTarget = await select({\n message: 'Which AI tool are you using?',\n choices: AI_TARGET_CHOICES,\n default: 'claude',\n });\n\n // Step 2: Model\n const model = await select({\n message: 'Default model (or use auto-routing per task):',\n choices: [\n { name: 'Auto-routing (recommended — picks model per task)', value: 'auto' },\n { name: 'Sonnet (balanced)', value: 'sonnet' },\n { name: 'Opus (complex tasks)', value: 'opus' },\n { name: 'Haiku (simple tasks, cheapest)', value: 'haiku' },\n ],\n default: 'auto',\n });\n\n const autoRouting = model === 'auto';\n const modelChoice = autoRouting ? 'sonnet' : model;\n\n const hotDaysStr = await input({\n message: 'Hot tier: files modified within N days:',\n default: '3',\n });\n const warmDaysStr = await input({\n message: 'Warm tier: files modified within N days:',\n default: '14',\n });\n\n const configPath = await initLocalProject(projectPath, {\n model: modelChoice as ModelPreference,\n autoRouting,\n tiering: {\n hotDays: parseInt(hotDaysStr, 10) || 3,\n warmDays: parseInt(warmDaysStr, 10) || 14,\n },\n ...gitignoreOverrides,\n });\n\n console.log('');\n console.log(successMsg(`Local config created: .cto/config.yaml`));\n console.log(chalk.green(` ✓ AI target: ${aiTarget} → ${getTargetFileName(aiTarget)}`));\n if (autoRouting) {\n console.log(chalk.green(' ✓ Auto model routing enabled'));\n }\n console.log(chalk.dim(' Commit .cto/config.yaml to share with your team'));\n console.log('');\n console.log(infoMsg('Now just run from your project root:'));\n for (const step of getNextSteps(aiTarget)) {\n console.log(chalk.dim(` ${step}`));\n }\n return;\n }\n\n // Global init\n const hasConfig = await hasGlobalConfig();\n\n if (opts.defaults) {\n if (!hasConfig) {\n await saveGlobalConfig(DEFAULT_CONFIG);\n console.log(successMsg('Global config created with defaults'));\n }\n console.log(successMsg('CTO initialized'));\n return;\n }\n\n console.log(chalk.bold.cyan('🚀 CTO — Claude Token Optimizer'));\n console.log(chalk.dim(' Optimize token usage for any AI coding assistant'));\n console.log('');\n\n // Step 1: Which AI tool?\n const aiTarget = await select({\n message: 'Which AI tool are you using?',\n choices: AI_TARGET_CHOICES,\n default: 'claude',\n });\n\n // Step 2: Model preference\n const model = await select({\n message: 'Preferred model tier:',\n choices: [\n { name: 'Sonnet (recommended — fast, cost-effective)', value: 'sonnet' },\n { name: 'Opus (complex tasks, deep reasoning)', value: 'opus' },\n { name: 'Haiku (simple tasks, lowest cost)', value: 'haiku' },\n ],\n default: 'sonnet',\n });\n\n // Step 3: Tiering\n const hotDaysStr = await input({\n message: 'Hot tier: files modified within N days (default: 3):',\n default: '3',\n });\n const hotDays = parseInt(hotDaysStr, 10) || 3;\n\n const warmDaysStr = await input({\n message: 'Warm tier: files modified within N days (default: 14):',\n default: '14',\n });\n const warmDays = parseInt(warmDaysStr, 10) || 14;\n\n // Step 4: Project config?\n const createProjectConfig = await confirm({\n message: `Create project-specific config for ${projectPath}?`,\n default: false,\n });\n\n const config = {\n ...DEFAULT_CONFIG,\n model: model as ModelPreference,\n tiering: {\n ...DEFAULT_CONFIG.tiering,\n hotDays,\n warmDays,\n },\n ...(gitignoreOverrides.ignoreDirs ? { ignoreDirs: gitignoreOverrides.ignoreDirs } : {}),\n ...(gitignoreOverrides.ignorePatterns ? { ignorePatterns: gitignoreOverrides.ignorePatterns } : {}),\n };\n\n if (!hasConfig) {\n await saveGlobalConfig(config);\n console.log(successMsg('Global config saved'));\n }\n\n if (createProjectConfig) {\n await saveProjectConfig(projectPath, {\n projectPath,\n model: model as ModelPreference,\n tiering: config.tiering,\n });\n console.log(successMsg(`Project config saved for ${projectPath}`));\n }\n\n console.log('');\n console.log(chalk.green(` ✓ AI target: ${aiTarget} → ${getTargetFileName(aiTarget)}`));\n console.log('');\n console.log(infoMsg('Next steps:'));\n for (const step of getNextSteps(aiTarget)) {\n console.log(chalk.dim(` ${step}`));\n }\n console.log('');\n console.log(chalk.dim(' 💡 Tip: use --local for project-level .cto/ config'));\n } catch (err) {\n console.error(chalk.red(`❌ Init failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { join, resolve } from 'node:path';\nimport { readFile, writeFile, mkdir, access } from 'node:fs/promises';\nimport { parse, stringify } from 'yaml';\nimport type { LocalProjectConfig, CTOConfig } from '../types/index.js';\nimport { CTO_VERSION } from '../utils/constants.js';\n\nexport const LOCAL_CTO_DIR = '.cto';\nexport const LOCAL_CONFIG_FILE = 'config.yaml';\n\nexport function getLocalCTOPath(projectPath: string): string {\n return join(resolve(projectPath), LOCAL_CTO_DIR);\n}\n\nexport function getLocalConfigPath(projectPath: string): string {\n return join(getLocalCTOPath(projectPath), LOCAL_CONFIG_FILE);\n}\n\nexport async function hasLocalConfig(projectPath: string): Promise<boolean> {\n try {\n await access(getLocalConfigPath(projectPath));\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function initLocalProject(\n projectPath: string,\n config?: Partial<LocalProjectConfig>,\n): Promise<string> {\n const localDir = getLocalCTOPath(projectPath);\n await mkdir(localDir, { recursive: true });\n\n const localConfig: LocalProjectConfig = {\n version: CTO_VERSION,\n autoRouting: true,\n ...config,\n };\n\n const configPath = getLocalConfigPath(projectPath);\n await writeFile(configPath, stringify(localConfig), 'utf-8');\n\n // Create .gitignore inside .cto/ to avoid committing cached data\n const gitignorePath = join(localDir, '.gitignore');\n const gitignoreContent = [\n '# CTO local cache (do not commit)',\n 'analysis.json',\n 'sessions/',\n '',\n '# Config IS committed (shared with team)',\n '!config.yaml',\n '!.gitignore',\n '',\n ].join('\\n');\n await writeFile(gitignorePath, gitignoreContent, 'utf-8');\n\n return configPath;\n}\n\nexport async function loadLocalConfig(projectPath: string): Promise<LocalProjectConfig | null> {\n try {\n const content = await readFile(getLocalConfigPath(projectPath), 'utf-8');\n return parse(content) as LocalProjectConfig;\n } catch {\n return null;\n }\n}\n\nexport async function saveLocalConfig(\n projectPath: string,\n config: LocalProjectConfig,\n): Promise<void> {\n const localDir = getLocalCTOPath(projectPath);\n await mkdir(localDir, { recursive: true });\n await writeFile(getLocalConfigPath(projectPath), stringify(config), 'utf-8');\n}\n\nexport function mergeLocalWithGlobal(\n globalConfig: CTOConfig,\n localConfig: LocalProjectConfig,\n): CTOConfig {\n return {\n ...globalConfig,\n version: localConfig.version ?? globalConfig.version,\n model: localConfig.model ?? globalConfig.model,\n tiering: {\n ...globalConfig.tiering,\n ...localConfig.tiering,\n },\n ignoreDirs: localConfig.ignoreDirs ?? globalConfig.ignoreDirs,\n extensions: {\n ...globalConfig.extensions,\n ...localConfig.extensions,\n },\n };\n}\n\nexport async function detectProjectRoot(startPath: string): Promise<string> {\n let current = resolve(startPath);\n const root = resolve('/');\n\n while (current !== root) {\n if (await hasLocalConfig(current)) {\n return current;\n }\n // Also check for common project markers\n for (const marker of ['package.json', 'Cargo.toml', 'go.mod', 'pyproject.toml', 'pom.xml', '.git']) {\n try {\n await access(join(current, marker));\n return current;\n } catch { /* continue */ }\n }\n current = resolve(current, '..');\n }\n\n return resolve(startPath);\n}\n","import { readFile } from 'node:fs/promises';\nimport { join, resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\n\nexport interface GitignoreResult {\n ignoreDirs: string[];\n ignorePatterns: string[];\n raw: string[];\n}\n\nconst KNOWN_DIRS = new Set([\n 'node_modules', '.git', 'dist', 'build', 'out', '.next', '.nuxt',\n '.svelte-kit', 'coverage', '__pycache__', '.pytest_cache', 'venv',\n '.venv', 'env', '.env', 'vendor', 'target', 'bin', 'obj',\n '.idea', '.vscode', '.DS_Store', '.turbo', '.vercel', '.output',\n '.cache', 'tmp', '.tmp', '.parcel-cache', '.webpack', '.rollup',\n '.sass-cache', 'bower_components', '.gradle', '.mvn',\n]);\n\nexport async function parseGitignore(projectPath: string): Promise<GitignoreResult | null> {\n const absPath = resolve(projectPath);\n const gitignorePath = join(absPath, '.gitignore');\n\n if (!existsSync(gitignorePath)) return null;\n\n const content = await readFile(gitignorePath, 'utf-8');\n const lines = content\n .split('\\n')\n .map((l) => l.trim())\n .filter((l) => l && !l.startsWith('#'));\n\n const ignoreDirs: string[] = [];\n const ignorePatterns: string[] = [];\n const seen = new Set<string>();\n\n for (const line of lines) {\n // Skip negation patterns\n if (line.startsWith('!')) continue;\n\n const cleaned = line.replace(/\\/$/, '').replace(/^\\//, '');\n\n if (seen.has(cleaned)) continue;\n seen.add(cleaned);\n\n // Directory patterns: \"node_modules/\", \"dist\", \"build/\", etc.\n if (isDirPattern(line, cleaned)) {\n ignoreDirs.push(cleaned);\n }\n // File patterns: \"*.log\", \"*.map\", \"*.min.js\", etc.\n else if (isFilePattern(line)) {\n ignorePatterns.push(line);\n }\n }\n\n return { ignoreDirs, ignorePatterns, raw: lines };\n}\n\nfunction isDirPattern(raw: string, cleaned: string): boolean {\n // Explicitly ends with /\n if (raw.endsWith('/')) return true;\n // Known directory names\n if (KNOWN_DIRS.has(cleaned)) return true;\n // No extension and no wildcard → likely a dir\n if (!cleaned.includes('.') && !cleaned.includes('*') && !cleaned.includes('/')) return true;\n // Path with slash but no wildcard (e.g., \"public/assets\")\n if (cleaned.includes('/') && !cleaned.includes('*') && !cleaned.includes('.')) return true;\n return false;\n}\n\nfunction isFilePattern(line: string): boolean {\n // Glob patterns like *.log, *.map\n if (line.startsWith('*.')) return true;\n // Named file patterns like package-lock.json\n if (line.includes('.') && !line.includes('/') && !line.endsWith('/')) return true;\n return false;\n}\n\nexport function mergeWithDefaults(\n gitignoreResult: GitignoreResult,\n defaultDirs: string[],\n defaultPatterns: string[],\n): { ignoreDirs: string[]; ignorePatterns: string[] } {\n const dirSet = new Set([...defaultDirs, ...gitignoreResult.ignoreDirs]);\n const patternSet = new Set([...defaultPatterns, ...gitignoreResult.ignorePatterns]);\n\n return {\n ignoreDirs: Array.from(dirSet).sort(),\n ignorePatterns: Array.from(patternSet).sort(),\n };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { select } from '@inquirer/prompts';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { getPromptTemplates, getPromptById, renderPrompt } from '../../core/prompts.js';\nimport { errorMsg } from '../../utils/format.js';\n\nexport const promptsCommand = new Command('prompts')\n .description('Show or generate optimized prompts for Claude')\n .argument('[path]', 'Project path', '.')\n .option('--id <id>', 'Use a specific prompt template by ID')\n .option('--task <description>', 'Task description to inject into the prompt')\n .option('--list', 'List all available prompt templates')\n .option('--copy', 'Copy prompt to clipboard (macOS/Linux)')\n .action(async (path: string, opts: { id?: string; task?: string; list?: boolean; copy?: boolean }) => {\n try {\n if (opts.list) {\n const templates = getPromptTemplates();\n console.log(chalk.bold('📝 Available Prompt Templates'));\n console.log('');\n for (const t of templates) {\n console.log(` ${chalk.cyan(t.id)} — ${chalk.bold(t.name)}`);\n console.log(` ${chalk.dim(t.description)}`);\n console.log(` Category: ${t.category}`);\n console.log('');\n }\n return;\n }\n\n const projectPath = resolve(path);\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project...'));\n analysis = await analyzeProject(projectPath);\n }\n\n let templateId = opts.id;\n\n if (!templateId) {\n const templates = getPromptTemplates();\n templateId = await select({\n message: 'Select a prompt template:',\n choices: templates.map((t) => ({\n name: `${t.name} — ${t.description}`,\n value: t.id,\n })),\n });\n }\n\n const template = getPromptById(templateId);\n if (!template) {\n console.error(errorMsg(`Template not found: ${templateId}`));\n process.exit(1);\n }\n\n const rendered = renderPrompt(template, analysis, opts.task);\n\n console.log('');\n console.log(chalk.bold(`📋 Prompt: ${template.name}`));\n console.log(chalk.dim('─'.repeat(50)));\n console.log(rendered);\n console.log(chalk.dim('─'.repeat(50)));\n\n if (opts.copy) {\n const { execSync } = await import('node:child_process');\n try {\n const platform = process.platform;\n if (platform === 'darwin') {\n execSync('pbcopy', { input: rendered });\n } else {\n execSync('xclip -selection clipboard', { input: rendered });\n }\n console.log(chalk.green('✅ Copied to clipboard!'));\n } catch {\n console.log(chalk.yellow('⚠️ Could not copy to clipboard. Copy the text above manually.'));\n }\n }\n } catch (err) {\n console.error(chalk.red(`❌ Failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import type { ProjectAnalysis, PromptTemplate } from '../types/index.js';\nimport { PROMPT_TEMPLATES } from '../utils/constants.js';\nimport { detectStack, detectTestFramework } from './analyzer.js';\nimport { formatTokens } from '../utils/format.js';\n\nexport function getPromptTemplates(): PromptTemplate[] {\n return PROMPT_TEMPLATES;\n}\n\nexport function getPromptById(id: string): PromptTemplate | undefined {\n return PROMPT_TEMPLATES.find((t) => t.id === id);\n}\n\nexport function renderPrompt(\n template: PromptTemplate,\n analysis: ProjectAnalysis,\n taskDescription: string = '',\n): string {\n const stack = detectStack(analysis.files);\n const testFramework = detectTestFramework(analysis.files);\n\n const hotFiles = analysis.tiers.hot.files\n .slice(0, 15)\n .map((f) => ` - ${f.relativePath} (~${formatTokens(f.tokens)} tokens)`)\n .join('\\n');\n\n const warmFiles = analysis.tiers.warm.files\n .slice(0, 10)\n .map((f) => ` - ${f.relativePath} (~${formatTokens(f.tokens)} tokens)`)\n .join('\\n');\n\n return template.template\n .replace('{projectName}', analysis.projectName)\n .replace('{stack}', stack.join(', ') || 'Not detected')\n .replace('{hotFiles}', hotFiles || ' (no hot files)')\n .replace('{warmFiles}', warmFiles || ' (no warm files)')\n .replace('{taskDescription}', taskDescription || '[describe your task here]')\n .replace('{testFramework}', testFramework);\n}\n\nexport function listPromptCategories(): string[] {\n return [...new Set(PROMPT_TEMPLATES.map((t) => t.category))];\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadGlobalConfig, loadProjectConfig } from '../../core/config.js';\nimport { getCTOConfigPath, getProjectConfigPath } from '../../utils/paths.js';\nimport { fileExists } from '../../utils/fs.js';\n\nexport const configCommand = new Command('config')\n .description('Show current CTO configuration')\n .argument('[path]', 'Project path (shows project-specific overrides)', '.')\n .option('--global', 'Show only global config')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { global?: boolean; json?: boolean }) => {\n try {\n const globalConfig = await loadGlobalConfig();\n\n if (opts.global) {\n if (opts.json) {\n console.log(JSON.stringify(globalConfig, null, 2));\n } else {\n console.log(chalk.bold('🔧 Global Config'));\n console.log(chalk.dim(` Path: ${getCTOConfigPath()}`));\n console.log(chalk.dim(` Exists: ${fileExists(getCTOConfigPath())}`));\n console.log('');\n console.log(formatConfig(globalConfig));\n }\n return;\n }\n\n const projectPath = resolve(path);\n const projectConfig = await loadProjectConfig(projectPath);\n const projectConfigPath = getProjectConfigPath(projectPath);\n const hasProjectConfig = fileExists(projectConfigPath);\n\n if (opts.json) {\n console.log(JSON.stringify({ global: globalConfig, project: projectConfig, hasProjectOverride: hasProjectConfig }, null, 2));\n return;\n }\n\n console.log(chalk.bold('🔧 Effective Config'));\n console.log(chalk.dim(` Global: ${getCTOConfigPath()}`));\n console.log(chalk.dim(` Project: ${hasProjectConfig ? projectConfigPath : '(none)'}`));\n console.log('');\n console.log(formatConfig(projectConfig));\n } catch (err) {\n console.error(chalk.red(`❌ ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\nfunction formatConfig(config: Record<string, any>): string {\n const lines: string[] = [];\n for (const [key, value] of Object.entries(config)) {\n if (typeof value === 'object' && value !== null) {\n lines.push(` ${chalk.cyan(key)}:`);\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n if (Array.isArray(v)) {\n lines.push(` ${chalk.white(k)}: ${chalk.dim(v.slice(0, 8).join(', '))}${v.length > 8 ? chalk.dim(` +${v.length - 8} more`) : ''}`);\n } else {\n lines.push(` ${chalk.white(k)}: ${chalk.yellow(String(v))}`);\n }\n }\n } else {\n lines.push(` ${chalk.cyan(key)}: ${chalk.yellow(String(value))}`);\n }\n }\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport { resolve } from 'node:path';\nimport { analyzeProject, loadAnalysis } from '../../core/analyzer.js';\nimport { formatTokens, tierColor } from '../../utils/format.js';\n\nexport const depsCommand = new Command('deps')\n .description('Show dependency graph and hub files (AST analysis)')\n .argument('[path]', 'Project path', '.')\n .option('--refresh', 'Force re-analysis')\n .option('--json', 'Output as JSON')\n .option('--hubs', 'Show only hub files')\n .option('--leaves', 'Show only leaf files')\n .option('--file <path>', 'Show dependencies for a specific file')\n .action(async (path: string, opts: { refresh?: boolean; json?: boolean; hubs?: boolean; leaves?: boolean; file?: string }) => {\n try {\n const projectPath = resolve(path);\n let analysis = opts.refresh ? null : await loadAnalysis(projectPath);\n if (!analysis) {\n console.log(chalk.dim('🔍 Analyzing project with AST...'));\n analysis = await analyzeProject(projectPath);\n }\n\n const graph = analysis.dependencyGraph;\n\n if (!graph) {\n console.log(chalk.yellow('⚠️ No dependency graph available. AST analysis may have failed.'));\n console.log(chalk.dim(' This typically happens with non-TypeScript/JavaScript projects.'));\n return;\n }\n\n if (opts.json) {\n console.log(JSON.stringify(graph, null, 2));\n return;\n }\n\n // Show specific file dependencies\n if (opts.file) {\n const fileDeps = graph.edges.filter((e) => e.from === opts.file);\n const fileImporters = graph.edges.filter((e) => e.to === opts.file);\n const fileInfo = analysis.files.find((f) => f.relativePath === opts.file);\n\n console.log('');\n console.log(chalk.bold(`📄 ${opts.file}`));\n if (fileInfo) {\n console.log(chalk.dim(` Tokens: ~${formatTokens(fileInfo.tokens)} | Tier: ${fileInfo.tier} | Complexity: ${fileInfo.complexity ?? 'N/A'}`));\n if (fileInfo.modelSuggestion) {\n console.log(chalk.dim(` Model suggestion: ${fileInfo.modelSuggestion}`));\n }\n }\n\n if (fileDeps.length > 0) {\n console.log('');\n console.log(chalk.bold(' → Imports:'));\n for (const dep of fileDeps) {\n const target = analysis.files.find((f) => f.relativePath === dep.to);\n const tier = target ? tierColor(target.tier) : chalk.dim('?');\n console.log(` ${dep.to} ${tier}`);\n }\n }\n\n if (fileImporters.length > 0) {\n console.log('');\n console.log(chalk.bold(' ← Imported by:'));\n for (const imp of fileImporters) {\n const source = analysis.files.find((f) => f.relativePath === imp.from);\n const tier = source ? tierColor(source.tier) : chalk.dim('?');\n console.log(` ${imp.from} ${tier}`);\n }\n }\n\n if (fileDeps.length === 0 && fileImporters.length === 0) {\n console.log(chalk.dim(' No dependencies found for this file.'));\n }\n return;\n }\n\n // Show hub files\n if (opts.hubs || !opts.leaves) {\n console.log('');\n console.log(chalk.bold(`🔗 Hub Files (imported by many) — ${graph.hubs.length} found`));\n\n if (graph.hubs.length === 0) {\n console.log(chalk.dim(' No hub files detected.'));\n } else {\n const hubTable = new Table({\n head: ['File', 'Imported By', 'Imports', 'Score', 'Tier', 'Model'],\n style: { head: ['cyan'] },\n colAligns: ['left', 'right', 'right', 'right', 'left', 'left'],\n });\n\n for (const hub of graph.hubs.slice(0, 20)) {\n const fileInfo = analysis.files.find((f) => f.relativePath === hub.relativePath);\n hubTable.push([\n hub.relativePath.length > 50 ? '...' + hub.relativePath.slice(-47) : hub.relativePath,\n hub.importedByCount,\n hub.importCount,\n hub.score,\n fileInfo ? tierColor(fileInfo.tier) : '-',\n fileInfo?.modelSuggestion ?? '-',\n ]);\n }\n\n console.log(hubTable.toString());\n }\n }\n\n // Show leaf files\n if (opts.leaves || !opts.hubs) {\n console.log('');\n console.log(chalk.bold(`🍃 Leaf Files (not imported by anyone) — ${graph.leaves.length} found`));\n\n if (graph.leaves.length === 0) {\n console.log(chalk.dim(' No leaf files detected.'));\n } else {\n for (const leaf of graph.leaves.slice(0, 20)) {\n const fileInfo = analysis.files.find((f) => f.relativePath === leaf);\n const tier = fileInfo ? tierColor(fileInfo.tier) : '';\n console.log(` ${leaf} ${tier}`);\n }\n if (graph.leaves.length > 20) {\n console.log(chalk.dim(` ... and ${graph.leaves.length - 20} more`));\n }\n }\n }\n\n // Summary\n console.log('');\n console.log(chalk.bold('📊 Dependency Summary'));\n console.log(` Nodes: ${graph.nodes.length} files`);\n console.log(` Edges: ${graph.edges.length} imports`);\n console.log(` Hubs: ${graph.hubs.length} files`);\n console.log(` Leaves: ${graph.leaves.length} files`);\n\n // Complexity overview\n const complexFiles = analysis.files\n .filter((f) => (f.complexity ?? 0) > 10)\n .sort((a, b) => (b.complexity ?? 0) - (a.complexity ?? 0));\n\n if (complexFiles.length > 0) {\n console.log('');\n console.log(chalk.bold('🧠 High Complexity Files (needs Opus/Sonnet)'));\n const compTable = new Table({\n head: ['File', 'Complexity', 'Tokens', 'Model Suggestion'],\n style: { head: ['cyan'] },\n colAligns: ['left', 'right', 'right', 'left'],\n });\n\n for (const f of complexFiles.slice(0, 10)) {\n const modelColor = f.modelSuggestion === 'opus' ? chalk.red : f.modelSuggestion === 'sonnet' ? chalk.yellow : chalk.green;\n compTable.push([\n f.relativePath.length > 45 ? '...' + f.relativePath.slice(-42) : f.relativePath,\n f.complexity ?? 0,\n `~${formatTokens(f.tokens)}`,\n modelColor(f.modelSuggestion ?? 'sonnet'),\n ]);\n }\n\n console.log(compTable.toString());\n }\n } catch (err) {\n console.error(chalk.red(`❌ Failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { ProjectWatcher } from '../../core/watcher.js';\nimport { formatTokens, tierColor, tierBadge } from '../../utils/format.js';\nimport type { WatchEvent, TierChangeEvent, ProjectAnalysis } from '../../types/index.js';\n\nexport const watchCommand = new Command('watch')\n .description('Watch project for changes and auto-recalculate tiers')\n .argument('[path]', 'Project path', '.')\n .option('--no-regenerate', 'Disable auto-regeneration of artifacts')\n .option('--debounce <ms>', 'Debounce interval in milliseconds', '1000')\n .option('--verbose', 'Show detailed file change events')\n .action(async (path: string, opts: { regenerate?: boolean; debounce?: string; verbose?: boolean }) => {\n const projectPath = resolve(path);\n const debounceMs = parseInt(opts.debounce ?? '1000', 10);\n\n const watcher = new ProjectWatcher(projectPath, {\n debounceMs,\n autoRegenerate: opts.regenerate !== false,\n verbose: opts.verbose ?? false,\n });\n\n console.log(chalk.bold.cyan('👁️ CTO Watch Mode'));\n console.log(chalk.dim(` Project: ${projectPath}`));\n console.log(chalk.dim(` Auto-regenerate: ${opts.regenerate !== false ? 'on' : 'off'}`));\n console.log(chalk.dim(` Debounce: ${debounceMs}ms`));\n console.log('');\n\n watcher.on('status', (msg: string) => {\n console.log(chalk.dim(` ℹ️ ${msg}`));\n });\n\n watcher.on('analysis', (analysis: ProjectAnalysis) => {\n console.log('');\n console.log(chalk.bold(' 📊 Current Status'));\n console.log(` Files: ${analysis.totalFiles} | Tokens: ~${formatTokens(analysis.totalTokens)}`);\n console.log(` 🔥 Hot: ${analysis.tiers.hot.count} | 🌡️ Warm: ${analysis.tiers.warm.count} | ❄️ Cold: ${analysis.tiers.cold.count}`);\n console.log('');\n });\n\n watcher.on('fileChange', (event: WatchEvent) => {\n if (opts.verbose) {\n const icon = event.type === 'add' ? '➕' : event.type === 'change' ? '✏️' : '🗑️';\n console.log(chalk.dim(` ${icon} ${event.type}: ${event.relativePath}`));\n }\n });\n\n watcher.on('tierChange', (event: TierChangeEvent) => {\n const arrow = chalk.bold('→');\n console.log(\n ` 🔄 ${chalk.white(event.relativePath)}: ${tierBadge(event.previousTier)} ${arrow} ${tierBadge(event.newTier)}`,\n );\n console.log(chalk.dim(` ${event.reason}`));\n });\n\n watcher.on('regenerated', () => {\n console.log(chalk.green(' ✅ Artifacts regenerated'));\n });\n\n watcher.on('error', (err: Error) => {\n console.error(chalk.red(` ❌ Error: ${err.message}`));\n });\n\n // Handle graceful shutdown\n const shutdown = async () => {\n console.log('');\n console.log(chalk.dim(' Stopping watcher...'));\n await watcher.stop();\n process.exit(0);\n };\n\n process.on('SIGINT', shutdown);\n process.on('SIGTERM', shutdown);\n\n try {\n await watcher.start();\n console.log(chalk.green(' ✅ Watching for changes. Press Ctrl+C to stop.'));\n console.log('');\n } catch (err) {\n console.error(chalk.red(`❌ Watch failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import chokidar from 'chokidar';\nimport { resolve, relative, extname } from 'node:path';\nimport { EventEmitter } from 'node:events';\nimport type { Tier, WatchEvent, TierChangeEvent, FileInfo, ProjectAnalysis } from '../types/index.js';\nimport { loadProjectConfig } from './config.js';\nimport { analyzeProject } from './analyzer.js';\nimport { generateClaudeMd, generateClaudeignore } from './generator.js';\nimport { getAllExtensions } from '../utils/fs.js';\nimport { classifyFile } from './tiering.js';\nimport { getFileStat } from '../utils/fs.js';\nimport { readFile } from 'node:fs/promises';\n\nexport interface WatcherOptions {\n debounceMs?: number;\n autoRegenerate?: boolean;\n verbose?: boolean;\n}\n\nexport class ProjectWatcher extends EventEmitter {\n private watcher: chokidar.FSWatcher | null = null;\n private projectPath: string;\n private options: Required<WatcherOptions>;\n private currentAnalysis: ProjectAnalysis | null = null;\n private tierCache = new Map<string, Tier>();\n private debounceTimer: ReturnType<typeof setTimeout> | null = null;\n private pendingChanges: WatchEvent[] = [];\n private extensions: Set<string> = new Set();\n private running = false;\n\n constructor(projectPath: string, options: WatcherOptions = {}) {\n super();\n this.projectPath = resolve(projectPath);\n this.options = {\n debounceMs: options.debounceMs ?? 1000,\n autoRegenerate: options.autoRegenerate ?? true,\n verbose: options.verbose ?? false,\n };\n }\n\n async start(): Promise<void> {\n if (this.running) return;\n\n const config = await loadProjectConfig(this.projectPath);\n const allExtensions = getAllExtensions(config);\n this.extensions = new Set(allExtensions);\n\n // Initial analysis\n this.emit('status', 'Performing initial analysis...');\n this.currentAnalysis = await analyzeProject(this.projectPath);\n\n // Cache current tiers\n for (const file of this.currentAnalysis.files) {\n this.tierCache.set(file.relativePath, file.tier);\n }\n\n this.emit('status', `Watching ${this.currentAnalysis.totalFiles} files...`);\n this.emit('analysis', this.currentAnalysis);\n\n // Build glob patterns for extensions\n const globs = allExtensions.map((ext) => `**/*.${ext}`);\n\n this.watcher = chokidar.watch(globs, {\n cwd: this.projectPath,\n ignored: [\n ...config.ignoreDirs.map((d) => `**/${d}/**`),\n ...config.ignorePatterns,\n ],\n persistent: true,\n ignoreInitial: true,\n awaitWriteFinish: {\n stabilityThreshold: 300,\n pollInterval: 100,\n },\n });\n\n this.watcher.on('add', (path) => this.handleEvent('add', path));\n this.watcher.on('change', (path) => this.handleEvent('change', path));\n this.watcher.on('unlink', (path) => this.handleEvent('unlink', path));\n this.watcher.on('error', (error) => this.emit('error', error));\n\n this.running = true;\n }\n\n async stop(): Promise<void> {\n if (!this.running) return;\n\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n this.debounceTimer = null;\n }\n\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = null;\n }\n\n this.running = false;\n this.emit('status', 'Watcher stopped');\n }\n\n isRunning(): boolean {\n return this.running;\n }\n\n getLastAnalysis(): ProjectAnalysis | null {\n return this.currentAnalysis;\n }\n\n private handleEvent(type: WatchEvent['type'], filePath: string): void {\n const ext = extname(filePath).slice(1).toLowerCase();\n if (!this.extensions.has(ext)) return;\n\n const event: WatchEvent = {\n type,\n filePath: resolve(this.projectPath, filePath),\n relativePath: filePath,\n timestamp: new Date(),\n };\n\n this.pendingChanges.push(event);\n this.emit('fileChange', event);\n\n // Debounce re-analysis\n if (this.debounceTimer) {\n clearTimeout(this.debounceTimer);\n }\n\n this.debounceTimer = setTimeout(() => {\n this.processPendingChanges();\n }, this.options.debounceMs);\n }\n\n private async processPendingChanges(): Promise<void> {\n const changes = [...this.pendingChanges];\n this.pendingChanges = [];\n\n if (changes.length === 0) return;\n\n this.emit('status', `Processing ${changes.length} change(s)...`);\n\n // Check for tier changes before re-analysis\n const tierChanges: TierChangeEvent[] = [];\n\n for (const change of changes) {\n if (change.type === 'unlink') {\n const prevTier = this.tierCache.get(change.relativePath);\n if (prevTier) {\n this.tierCache.delete(change.relativePath);\n }\n continue;\n }\n\n const prevTier = this.tierCache.get(change.relativePath);\n if (prevTier) {\n // File was modified, so it becomes hot\n const newTier: Tier = 'hot';\n if (prevTier !== newTier) {\n tierChanges.push({\n relativePath: change.relativePath,\n previousTier: prevTier,\n newTier,\n reason: `File ${change.type === 'add' ? 'created' : 'modified'}`,\n });\n this.tierCache.set(change.relativePath, newTier);\n }\n } else {\n // New file\n this.tierCache.set(change.relativePath, 'hot');\n tierChanges.push({\n relativePath: change.relativePath,\n previousTier: 'cold',\n newTier: 'hot',\n reason: 'New file detected',\n });\n }\n }\n\n // Emit tier change events\n for (const tc of tierChanges) {\n this.emit('tierChange', tc);\n }\n\n // Re-analyze the project\n try {\n this.currentAnalysis = await analyzeProject(this.projectPath);\n this.emit('analysis', this.currentAnalysis);\n\n // Update tier cache\n for (const file of this.currentAnalysis.files) {\n this.tierCache.set(file.relativePath, file.tier);\n }\n\n // Auto-regenerate artifacts if enabled\n if (this.options.autoRegenerate && tierChanges.length > 0) {\n this.emit('status', 'Regenerating artifacts...');\n const claudeMd = await generateClaudeMd(this.currentAnalysis);\n const claudeignore = await generateClaudeignore(this.currentAnalysis);\n this.emit('regenerated', { claudeMd, claudeignore });\n }\n } catch (err) {\n this.emit('error', err);\n }\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { startSession, endSession, getCurrentSession, listSessions, logFileRead } from '../../core/sessions.js';\nimport { loadAnalysis } from '../../core/analyzer.js';\nimport { formatTokens } from '../../utils/format.js';\n\nexport const sessionCommand = new Command('session')\n .description('Track Claude Code sessions');\n\nsessionCommand\n .command('start')\n .description('Start a new session')\n .argument('[path]', 'Project path', '.')\n .option('-d, --description <text>', 'Session description')\n .action(async (path: string, opts: { description?: string }) => {\n const projectPath = resolve(path);\n const existing = await getCurrentSession(projectPath);\n if (existing) {\n console.log(chalk.yellow(`⚠️ Session already active (${existing.id}). End it first with 'cto session end'.`));\n return;\n }\n\n const session = await startSession(projectPath, opts.description);\n console.log(chalk.green(`✅ Session started: ${session.id}`));\n if (opts.description) console.log(chalk.dim(` ${opts.description}`));\n console.log(chalk.dim(` End with: cto session end`));\n });\n\nsessionCommand\n .command('end')\n .description('End the current session')\n .argument('[path]', 'Project path', '.')\n .action(async (path: string) => {\n const projectPath = resolve(path);\n const analysis = await loadAnalysis(projectPath);\n const session = await endSession(projectPath, analysis ?? undefined);\n\n if (!session) {\n console.log(chalk.yellow('⚠️ No active session found.'));\n return;\n }\n\n const duration = session.endedAt\n ? Math.round((new Date(session.endedAt).getTime() - new Date(session.startedAt).getTime()) / 60000)\n : 0;\n\n console.log(chalk.green(`✅ Session ended: ${session.id}`));\n console.log(` Duration: ${duration} minutes`);\n console.log(` Tokens used: ~${formatTokens(session.tokensEstimated)}`);\n console.log(` Files read: ${session.filesRead.length} (🔥${session.hotFilesRead} 🌡️${session.warmFilesRead} ❄️${session.coldFilesRead})`);\n\n if (session.suggestions.length > 0) {\n console.log('');\n console.log(chalk.bold(' 💡 Suggestions:'));\n for (const s of session.suggestions) {\n console.log(` • ${s}`);\n }\n }\n });\n\nsessionCommand\n .command('current')\n .description('Show the current active session')\n .argument('[path]', 'Project path', '.')\n .action(async (path: string) => {\n const projectPath = resolve(path);\n const session = await getCurrentSession(projectPath);\n\n if (!session) {\n console.log(chalk.dim('No active session. Start one with: cto session start'));\n return;\n }\n\n const elapsed = Math.round((Date.now() - new Date(session.startedAt).getTime()) / 60000);\n console.log(chalk.bold(`📋 Active Session: ${session.id}`));\n if (session.description) console.log(` Description: ${session.description}`);\n console.log(` Elapsed: ${elapsed} minutes`);\n console.log(` Tokens: ~${formatTokens(session.tokensEstimated)}`);\n console.log(` Files read: ${session.filesRead.length} (🔥${session.hotFilesRead} 🌡️${session.warmFilesRead} ❄️${session.coldFilesRead})`);\n });\n\nsessionCommand\n .command('list')\n .description('List recent sessions')\n .argument('[path]', 'Project path', '.')\n .option('-n, --limit <n>', 'Number of sessions to show', '10')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { limit?: string; json?: boolean }) => {\n const projectPath = resolve(path);\n const sessions = await listSessions(projectPath, parseInt(opts.limit ?? '10', 10));\n\n if (opts.json) {\n console.log(JSON.stringify(sessions, null, 2));\n return;\n }\n\n if (sessions.length === 0) {\n console.log(chalk.dim('No sessions recorded yet.'));\n return;\n }\n\n console.log(chalk.bold(`📋 Recent Sessions (${sessions.length})`));\n console.log('');\n\n for (const s of sessions) {\n const date = new Date(s.startedAt);\n const dateStr = `${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n const duration = s.endedAt\n ? `${Math.round((new Date(s.endedAt).getTime() - date.getTime()) / 60000)}m`\n : chalk.green('active');\n const desc = s.description ?? `${s.filesRead.length} files`;\n console.log(` ${chalk.cyan(s.id)} ${dateStr} ${duration.toString().padEnd(6)} ~${formatTokens(s.tokensEstimated).padEnd(6)} ${desc}`);\n }\n });\n\nsessionCommand\n .command('log')\n .description('Log a file read to the current session')\n .argument('<file>', 'File path relative to project')\n .argument('[path]', 'Project path', '.')\n .option('--tier <tier>', 'File tier (hot/warm/cold)', 'hot')\n .option('--tokens <n>', 'Estimated tokens', '500')\n .action(async (file: string, path: string, opts: { tier?: string; tokens?: string }) => {\n const projectPath = resolve(path);\n await logFileRead(projectPath, {\n relativePath: file,\n tier: (opts.tier ?? 'hot') as any,\n tokens: parseInt(opts.tokens ?? '500', 10),\n timestamp: new Date(),\n });\n console.log(chalk.dim(` Logged: ${file} (${opts.tier}, ~${opts.tokens} tokens)`));\n });\n","import { resolve, basename } from 'node:path';\nimport { randomUUID } from 'node:crypto';\nimport type {\n SessionInfo,\n SessionFileRead,\n SessionMetrics,\n WastePattern,\n Tier,\n ProjectAnalysis,\n} from '../types/index.js';\nimport { getSessionsDir } from '../utils/paths.js';\nimport { readJSON, writeJSON, ensureDir } from '../utils/fs.js';\nimport { readdir } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nconst CURRENT_SESSION_FILE = 'current.json';\n\nexport async function startSession(\n projectPath: string,\n description?: string,\n): Promise<SessionInfo> {\n const absPath = resolve(projectPath);\n const sessionsDir = getSessionsDir(absPath);\n await ensureDir(sessionsDir);\n\n const session: SessionInfo = {\n id: randomUUID().substring(0, 8),\n projectPath: absPath,\n startedAt: new Date(),\n tokensEstimated: 0,\n filesRead: [],\n description,\n coldFilesRead: 0,\n warmFilesRead: 0,\n hotFilesRead: 0,\n suggestions: [],\n };\n\n await writeJSON(join(sessionsDir, CURRENT_SESSION_FILE), session);\n return session;\n}\n\nexport async function endSession(\n projectPath: string,\n analysis?: ProjectAnalysis,\n): Promise<SessionInfo | null> {\n const absPath = resolve(projectPath);\n const sessionsDir = getSessionsDir(absPath);\n const currentPath = join(sessionsDir, CURRENT_SESSION_FILE);\n const session = await readJSON<SessionInfo>(currentPath);\n\n if (!session) return null;\n\n session.endedAt = new Date();\n\n // Generate suggestions based on the session\n session.suggestions = generateSessionSuggestions(session, analysis);\n\n // Save to archive\n const archiveName = `session_${session.id}_${new Date(session.startedAt).getTime()}.json`;\n await writeJSON(join(sessionsDir, archiveName), session);\n\n // Remove current\n const { unlink } = await import('node:fs/promises');\n try { await unlink(currentPath); } catch { /* ignore */ }\n\n return session;\n}\n\nexport async function getCurrentSession(projectPath: string): Promise<SessionInfo | null> {\n const absPath = resolve(projectPath);\n const sessionsDir = getSessionsDir(absPath);\n return readJSON<SessionInfo>(join(sessionsDir, CURRENT_SESSION_FILE));\n}\n\nexport async function logFileRead(\n projectPath: string,\n fileRead: SessionFileRead,\n): Promise<void> {\n const absPath = resolve(projectPath);\n const sessionsDir = getSessionsDir(absPath);\n const currentPath = join(sessionsDir, CURRENT_SESSION_FILE);\n const session = await readJSON<SessionInfo>(currentPath);\n\n if (!session) return;\n\n session.filesRead.push(fileRead.relativePath);\n session.tokensEstimated += fileRead.tokens;\n\n switch (fileRead.tier) {\n case 'hot': session.hotFilesRead++; break;\n case 'warm': session.warmFilesRead++; break;\n case 'cold': session.coldFilesRead++; break;\n }\n\n await writeJSON(currentPath, session);\n}\n\nexport async function listSessions(\n projectPath: string,\n limit = 20,\n): Promise<SessionInfo[]> {\n const absPath = resolve(projectPath);\n const sessionsDir = getSessionsDir(absPath);\n\n let files: string[];\n try {\n files = await readdir(sessionsDir);\n } catch {\n return [];\n }\n\n const sessionFiles = files\n .filter((f) => f.startsWith('session_') && f.endsWith('.json'))\n .sort()\n .reverse()\n .slice(0, limit);\n\n const sessions: SessionInfo[] = [];\n for (const file of sessionFiles) {\n const s = await readJSON<SessionInfo>(join(sessionsDir, file));\n if (s) sessions.push(s);\n }\n\n return sessions;\n}\n\nexport async function getSessionMetrics(\n projectPath: string,\n analysis?: ProjectAnalysis,\n): Promise<SessionMetrics> {\n const sessions = await listSessions(projectPath, 100);\n const totalTokensInProject = analysis?.totalTokens ?? 0;\n\n const totalTokensConsumed = sessions.reduce((s, ses) => s + ses.tokensEstimated, 0);\n const totalTokensSaved = sessions.length * totalTokensInProject - totalTokensConsumed;\n\n // Most read files\n const fileReadCounts = new Map<string, { count: number; tier: Tier }>();\n for (const ses of sessions) {\n for (const f of ses.filesRead) {\n const existing = fileReadCounts.get(f) ?? { count: 0, tier: 'cold' as Tier };\n existing.count++;\n // Infer tier from analysis if available\n const fileInfo = analysis?.files.find((fi) => fi.relativePath === f);\n if (fileInfo) existing.tier = fileInfo.tier;\n fileReadCounts.set(f, existing);\n }\n }\n\n const mostReadFiles = Array.from(fileReadCounts.entries())\n .map(([relativePath, data]) => ({ relativePath, readCount: data.count, tier: data.tier }))\n .sort((a, b) => b.readCount - a.readCount)\n .slice(0, 10);\n\n // Average session duration\n const durationsMs = sessions\n .filter((s) => s.endedAt)\n .map((s) => new Date(s.endedAt!).getTime() - new Date(s.startedAt).getTime());\n const averageSessionDuration = durationsMs.length > 0\n ? durationsMs.reduce((a, b) => a + b, 0) / durationsMs.length / 60000\n : 0;\n\n // Waste patterns\n const wastePatterns = detectWastePatterns(sessions, analysis);\n\n return {\n totalSessions: sessions.length,\n totalTokensConsumed,\n totalTokensSaved: Math.max(0, totalTokensSaved),\n savingsPercent: totalTokensInProject > 0\n ? Math.max(0, (totalTokensSaved / (sessions.length * totalTokensInProject)) * 100)\n : 0,\n averageSessionDuration,\n mostReadFiles,\n wastePatterns,\n };\n}\n\nfunction detectWastePatterns(\n sessions: SessionInfo[],\n analysis?: ProjectAnalysis,\n): WastePattern[] {\n const patterns: WastePattern[] = [];\n\n // Cold file reads\n const totalCold = sessions.reduce((s, ses) => s + ses.coldFilesRead, 0);\n if (totalCold > 5) {\n patterns.push({\n type: 'cold-reads',\n description: `${totalCold} cold files read across ${sessions.length} sessions`,\n impact: totalCold * 500,\n suggestion: 'Review .claudeignore — cold files are being read frequently',\n });\n }\n\n // Repeated reads of same file\n const allReads = sessions.flatMap((s) => s.filesRead);\n const readCounts = new Map<string, number>();\n for (const f of allReads) {\n readCounts.set(f, (readCounts.get(f) ?? 0) + 1);\n }\n const repeatedFiles = Array.from(readCounts.entries())\n .filter(([, count]) => count >= 5);\n if (repeatedFiles.length > 0) {\n const topRepeated = repeatedFiles.sort((a, b) => b[1] - a[1]).slice(0, 3);\n patterns.push({\n type: 'repeated-reads',\n description: `${repeatedFiles.length} files read 5+ times: ${topRepeated.map(([f, c]) => `${f} (${c}x)`).join(', ')}`,\n impact: repeatedFiles.reduce((s, [, c]) => s + c * 200, 0),\n suggestion: 'Consider moving frequently-read files to hot tier',\n });\n }\n\n // Large context sessions\n const largeSessions = sessions.filter((s) => s.tokensEstimated > 50000);\n if (largeSessions.length > 0) {\n patterns.push({\n type: 'large-context',\n description: `${largeSessions.length} sessions with >50K tokens estimated`,\n impact: largeSessions.reduce((s, ses) => s + ses.tokensEstimated - 50000, 0),\n suggestion: 'Use /compact more aggressively or narrow the file scope',\n });\n }\n\n return patterns;\n}\n\nfunction generateSessionSuggestions(\n session: SessionInfo,\n analysis?: ProjectAnalysis,\n): string[] {\n const suggestions: string[] = [];\n\n if (session.coldFilesRead > 3) {\n suggestions.push(`You read ${session.coldFilesRead} cold files — consider updating .claudeignore`);\n }\n\n if (session.tokensEstimated > 80000) {\n suggestions.push('High token usage — use /compact to free context window');\n }\n\n // Find cold files that were read and suggest promoting them\n if (analysis) {\n const coldFilesRead = session.filesRead.filter((f) => {\n const fileInfo = analysis.files.find((fi) => fi.relativePath === f);\n return fileInfo?.tier === 'cold';\n });\n if (coldFilesRead.length > 0) {\n suggestions.push(`Move to hot tier: ${coldFilesRead.slice(0, 3).join(', ')}`);\n }\n }\n\n return suggestions;\n}\n\nexport async function getTodaySessions(projectPath: string): Promise<SessionInfo[]> {\n const sessions = await listSessions(projectPath, 50);\n const todayStart = new Date();\n todayStart.setHours(0, 0, 0, 0);\n\n return sessions.filter((s) => new Date(s.startedAt) >= todayStart);\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { getDashboardData, renderDashboard } from '../../core/dashboard.js';\n\nexport const dashboardCommand = new Command('dashboard')\n .description('Show terminal dashboard with metrics')\n .argument('[path]', 'Project path', '.')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { json?: boolean }) => {\n const projectPath = resolve(path);\n\n try {\n const data = await getDashboardData(projectPath);\n\n if (opts.json) {\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n console.log(renderDashboard(data));\n } catch (err) {\n console.error(chalk.red(`❌ Dashboard failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { resolve, basename } from 'node:path';\nimport chalk from 'chalk';\nimport Table from 'cli-table3';\nimport type { DashboardData, SessionInfo, TierSummary } from '../types/index.js';\nimport { getTodaySessions, getSessionMetrics, listSessions } from './sessions.js';\nimport { loadAnalysis, analyzeProject } from './analyzer.js';\nimport { getTokenSavings } from './tiering.js';\nimport { formatTokens } from '../utils/format.js';\n\nexport async function getDashboardData(projectPath: string): Promise<DashboardData> {\n const absPath = resolve(projectPath);\n\n let analysis = await loadAnalysis(absPath);\n if (!analysis) {\n analysis = await analyzeProject(absPath);\n }\n\n const todaySessions = await getTodaySessions(absPath);\n const metrics = await getSessionMetrics(absPath, analysis);\n const recentSessions = await listSessions(absPath, 5);\n const savings = getTokenSavings(analysis.files);\n\n const tokensConsumed = todaySessions.reduce((s, ses) => s + ses.tokensEstimated, 0);\n const tokensSaved = todaySessions.length * analysis.totalTokens - tokensConsumed;\n\n return {\n projectName: basename(absPath),\n sessionsToday: todaySessions.length,\n tokensConsumed,\n tokensSaved: Math.max(0, tokensSaved),\n savingsRatio: analysis.totalTokens > 0\n ? Math.max(0, tokensSaved / (todaySessions.length * analysis.totalTokens || 1)) * 100\n : 0,\n mostReadFiles: metrics.mostReadFiles.map(({ relativePath, readCount }) => ({ relativePath, readCount })),\n suggestions: metrics.wastePatterns.map((p) => p.suggestion),\n tiers: analysis.tiers,\n recentSessions,\n };\n}\n\nexport function renderDashboard(data: DashboardData): string {\n const lines: string[] = [];\n const width = 52;\n const border = '─'.repeat(width);\n\n lines.push('');\n lines.push(chalk.bold.cyan(`┌${border}┐`));\n lines.push(chalk.bold.cyan(`│ 📊 CTO Dashboard — ${pad(data.projectName, width - 22)} │`));\n lines.push(chalk.bold.cyan(`├${border}┤`));\n\n // Key metrics\n lines.push(chalk.cyan(`│ ${pad(`Sessions today: ${data.sessionsToday}`, width)} │`));\n lines.push(chalk.cyan(`│ ${pad(`Tokens consumed: ~${formatTokens(data.tokensConsumed)}`, width)} │`));\n lines.push(chalk.cyan(`│ ${pad(`Tokens saved: ~${formatTokens(data.tokensSaved)}`, width)} │`));\n lines.push(chalk.cyan(`│ ${pad(`Savings ratio: ${data.savingsRatio.toFixed(0)}%`, width)} │`));\n lines.push(chalk.cyan(`├${border}┤`));\n\n // Tier breakdown\n lines.push(chalk.cyan(`│ ${pad('Tier Breakdown:', width)} │`));\n lines.push(chalk.cyan(`│ ${pad(` 🔥 Hot: ${data.tiers.hot.count} files (~${formatTokens(data.tiers.hot.totalTokens)} tokens)`, width)} │`));\n lines.push(chalk.cyan(`│ ${pad(` 🌡️ Warm: ${data.tiers.warm.count} files (~${formatTokens(data.tiers.warm.totalTokens)} tokens)`, width)} │`));\n lines.push(chalk.cyan(`│ ${pad(` ❄️ Cold: ${data.tiers.cold.count} files (~${formatTokens(data.tiers.cold.totalTokens)} tokens)`, width)} │`));\n lines.push(chalk.cyan(`├${border}┤`));\n\n // Most read files\n if (data.mostReadFiles.length > 0) {\n lines.push(chalk.cyan(`│ ${pad('Most Read Files:', width)} │`));\n for (const f of data.mostReadFiles.slice(0, 5)) {\n const name = f.relativePath.length > 35\n ? '...' + f.relativePath.slice(-32)\n : f.relativePath;\n lines.push(chalk.cyan(`│ ${pad(` ${f.readCount}x ${name}`, width)} │`));\n }\n lines.push(chalk.cyan(`├${border}┤`));\n }\n\n // Recent sessions\n if (data.recentSessions.length > 0) {\n lines.push(chalk.cyan(`│ ${pad('Recent Sessions:', width)} │`));\n for (const s of data.recentSessions.slice(0, 3)) {\n const date = new Date(s.startedAt);\n const timeStr = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n const desc = s.description ? s.description.slice(0, 25) : `${s.filesRead.length} files`;\n const duration = s.endedAt\n ? `${Math.round((new Date(s.endedAt).getTime() - date.getTime()) / 60000)}m`\n : 'active';\n lines.push(chalk.cyan(`│ ${pad(` ${timeStr} — ${desc} (${duration})`, width)} │`));\n }\n lines.push(chalk.cyan(`├${border}┤`));\n }\n\n // Suggestions\n if (data.suggestions.length > 0) {\n lines.push(chalk.cyan(`│ ${pad('💡 Suggestions:', width)} │`));\n for (const s of data.suggestions.slice(0, 3)) {\n const trimmed = s.length > (width - 4) ? s.slice(0, width - 7) + '...' : s;\n lines.push(chalk.cyan(`│ ${pad(` ${trimmed}`, width)} │`));\n }\n } else {\n lines.push(chalk.cyan(`│ ${pad('✅ No issues detected', width)} │`));\n }\n\n lines.push(chalk.bold.cyan(`└${border}┘`));\n lines.push('');\n\n return lines.join('\\n');\n}\n\nfunction pad(str: string, len: number): string {\n // Strip ANSI for length calculation\n const stripped = str.replace(/\\x1B\\[[0-9;]*m/g, '');\n if (stripped.length >= len) return str;\n return str + ' '.repeat(len - stripped.length);\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { generateWeeklyReport, renderWeeklyReport, generateProjectReport, exportMetrics } from '../../core/reports.js';\n\nexport const reportCommand = new Command('report')\n .description('Generate usage reports');\n\nreportCommand\n .command('weekly')\n .description('Weekly usage report')\n .argument('[path]', 'Project path', '.')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { json?: boolean }) => {\n const projectPath = resolve(path);\n try {\n const report = await generateWeeklyReport(projectPath);\n if (opts.json) {\n console.log(JSON.stringify(report, null, 2));\n } else {\n console.log(renderWeeklyReport(report));\n }\n } catch (err) {\n console.error(chalk.red(`❌ Report failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\nreportCommand\n .command('project')\n .description('Compare metrics across projects')\n .argument('<paths...>', 'Project paths to compare')\n .action(async (paths: string[]) => {\n try {\n const output = await generateProjectReport(paths);\n console.log(output);\n } catch (err) {\n console.error(chalk.red(`❌ Report failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n\nreportCommand\n .command('export')\n .description('Export metrics to JSON or CSV')\n .argument('[path]', 'Project path', '.')\n .option('--format <format>', 'Export format (json or csv)', 'json')\n .option('-o, --output <file>', 'Output file path')\n .action(async (path: string, opts: { format?: string; output?: string }) => {\n const projectPath = resolve(path);\n try {\n const format = (opts.format ?? 'json') as 'json' | 'csv';\n const content = await exportMetrics(projectPath, format);\n\n if (opts.output) {\n const { writeFile } = await import('node:fs/promises');\n await writeFile(opts.output, content, 'utf-8');\n console.log(chalk.green(`✅ Exported to ${opts.output}`));\n } else {\n console.log(content);\n }\n } catch (err) {\n console.error(chalk.red(`❌ Export failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { resolve, basename } from 'node:path';\nimport chalk from 'chalk';\nimport type { WeeklyReport, SessionInfo, ProjectAnalysis } from '../types/index.js';\nimport { listSessions, getSessionMetrics } from './sessions.js';\nimport { loadAnalysis, analyzeProject } from './analyzer.js';\nimport { formatTokens } from '../utils/format.js';\n\nexport async function generateWeeklyReport(projectPath: string): Promise<WeeklyReport> {\n const absPath = resolve(projectPath);\n const now = new Date();\n const weekStart = new Date(now);\n weekStart.setDate(weekStart.getDate() - 7);\n weekStart.setHours(0, 0, 0, 0);\n\n const allSessions = await listSessions(absPath, 200);\n const weekSessions = allSessions.filter(\n (s) => new Date(s.startedAt) >= weekStart,\n );\n\n const prevWeekStart = new Date(weekStart);\n prevWeekStart.setDate(prevWeekStart.getDate() - 7);\n const prevWeekSessions = allSessions.filter(\n (s) => new Date(s.startedAt) >= prevWeekStart && new Date(s.startedAt) < weekStart,\n );\n\n let analysis = await loadAnalysis(absPath);\n if (!analysis) {\n analysis = await analyzeProject(absPath);\n }\n\n const totalTokensConsumed = weekSessions.reduce((s, ses) => s + ses.tokensEstimated, 0);\n const totalTokensSaved = weekSessions.length * analysis.totalTokens - totalTokensConsumed;\n\n const prevTokens = prevWeekSessions.reduce((s, ses) => s + ses.tokensEstimated, 0);\n const trend = prevTokens > 0\n ? ((totalTokensConsumed - prevTokens) / prevTokens) * 100\n : 0;\n\n // Top files\n const fileCounts = new Map<string, number>();\n for (const s of weekSessions) {\n for (const f of s.filesRead) {\n fileCounts.set(f, (fileCounts.get(f) ?? 0) + 1);\n }\n }\n const topFiles = Array.from(fileCounts.entries())\n .map(([relativePath, readCount]) => ({ relativePath, readCount }))\n .sort((a, b) => b.readCount - a.readCount)\n .slice(0, 10);\n\n // Suggestions\n const metrics = await getSessionMetrics(absPath, analysis);\n const suggestions = metrics.wastePatterns.map((p) => p.suggestion);\n\n return {\n projectPath: absPath,\n projectName: basename(absPath),\n weekStart,\n weekEnd: now,\n sessions: weekSessions,\n totalTokensConsumed,\n totalTokensSaved: Math.max(0, totalTokensSaved),\n trend,\n topFiles,\n suggestions,\n };\n}\n\nexport function renderWeeklyReport(report: WeeklyReport): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(chalk.bold.cyan(`📊 Weekly Report — ${report.projectName}`));\n lines.push(chalk.dim(` ${formatDateRange(report.weekStart, report.weekEnd)}`));\n lines.push('');\n\n lines.push(chalk.bold(' Summary'));\n lines.push(` Sessions: ${report.sessions.length}`);\n lines.push(` Tokens consumed: ~${formatTokens(report.totalTokensConsumed)}`);\n lines.push(` Tokens saved: ~${formatTokens(report.totalTokensSaved)}`);\n\n if (report.trend !== 0) {\n const trendStr = report.trend > 0\n ? chalk.red(`+${report.trend.toFixed(1)}% vs last week`)\n : chalk.green(`${report.trend.toFixed(1)}% vs last week`);\n lines.push(` Trend: ${trendStr}`);\n }\n lines.push('');\n\n if (report.topFiles.length > 0) {\n lines.push(chalk.bold(' Most Read Files'));\n for (const f of report.topFiles.slice(0, 5)) {\n lines.push(` ${f.readCount}x ${f.relativePath}`);\n }\n lines.push('');\n }\n\n if (report.sessions.length > 0) {\n lines.push(chalk.bold(' Sessions'));\n for (const s of report.sessions.slice(0, 10)) {\n const date = new Date(s.startedAt);\n const dateStr = `${date.getMonth() + 1}/${date.getDate()}`;\n const desc = s.description ?? `${s.filesRead.length} files`;\n const tokens = `~${formatTokens(s.tokensEstimated)}`;\n lines.push(` ${dateStr} ${tokens.padEnd(8)} ${desc}`);\n }\n if (report.sessions.length > 10) {\n lines.push(chalk.dim(` ... and ${report.sessions.length - 10} more`));\n }\n lines.push('');\n }\n\n if (report.suggestions.length > 0) {\n lines.push(chalk.bold(' 💡 Suggestions'));\n for (const s of report.suggestions) {\n lines.push(` • ${s}`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport async function generateProjectReport(\n projectPaths: string[],\n): Promise<string> {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(chalk.bold.cyan('📊 Project Comparison Report'));\n lines.push('');\n\n for (const p of projectPaths) {\n const absPath = resolve(p);\n let analysis = await loadAnalysis(absPath);\n if (!analysis) {\n try { analysis = await analyzeProject(absPath); } catch { continue; }\n }\n\n const metrics = await getSessionMetrics(absPath, analysis);\n const name = basename(absPath);\n\n lines.push(chalk.bold(` ${name}`));\n lines.push(` Files: ${analysis.totalFiles} | Tokens: ~${formatTokens(analysis.totalTokens)}`);\n lines.push(` Sessions: ${metrics.totalSessions} | Consumed: ~${formatTokens(metrics.totalTokensConsumed)}`);\n lines.push(` Savings: ~${formatTokens(metrics.totalTokensSaved)} (${metrics.savingsPercent.toFixed(0)}%)`);\n if (metrics.wastePatterns.length > 0) {\n lines.push(` ⚠️ ${metrics.wastePatterns.length} waste pattern(s) detected`);\n }\n lines.push('');\n }\n\n return lines.join('\\n');\n}\n\nexport async function exportMetrics(\n projectPath: string,\n format: 'json' | 'csv' = 'json',\n): Promise<string> {\n const absPath = resolve(projectPath);\n const sessions = await listSessions(absPath, 1000);\n let analysis = await loadAnalysis(absPath);\n if (!analysis) analysis = await analyzeProject(absPath);\n const metrics = await getSessionMetrics(absPath, analysis);\n\n if (format === 'json') {\n return JSON.stringify({ metrics, sessions, analysis: { totalFiles: analysis.totalFiles, totalTokens: analysis.totalTokens } }, null, 2);\n }\n\n // CSV\n const header = 'session_id,started_at,ended_at,tokens_estimated,files_read,hot_files,warm_files,cold_files,description';\n const rows = sessions.map((s) =>\n `${s.id},${s.startedAt},${s.endedAt ?? ''},${s.tokensEstimated},${s.filesRead.length},${s.hotFilesRead},${s.warmFilesRead},${s.coldFilesRead},\"${(s.description ?? '').replace(/\"/g, '\"\"')}\"`,\n );\n return [header, ...rows].join('\\n');\n}\n\nfunction formatDateRange(start: Date, end: Date): string {\n const fmt = (d: Date) => `${d.getMonth() + 1}/${d.getDate()}`;\n return `${fmt(start)} — ${fmt(end)}`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { stat } from 'node:fs/promises';\nimport type { DoctorCheck } from '../../types/index.js';\nimport { getCTORoot, getCTOConfigPath, getProjectDir, getArtifactsDir, getSessionsDir, getBackupsDir } from '../../utils/paths.js';\nimport { verifyIntegrity, secureFilePermissions } from '../../core/integrity.js';\nimport { verifyAuditIntegrity } from '../../core/audit.js';\nimport { loadAnalysis } from '../../core/analyzer.js';\nimport { scanProjectForSecrets } from '../../core/security.js';\n\nexport const doctorCommand = new Command('doctor')\n .description('Health check — verify CTO installation, config, and security')\n .argument('[path]', 'Project path', '.')\n .option('--fix', 'Auto-fix permissions and issues where possible')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { fix?: boolean; json?: boolean }) => {\n const projectPath = resolve(path);\n const checks: DoctorCheck[] = [];\n\n // 1. CTO root directory\n const ctoRoot = getCTORoot();\n checks.push({\n name: 'CTO directory',\n status: existsSync(ctoRoot) ? 'pass' : 'fail',\n message: existsSync(ctoRoot) ? `Found at ${ctoRoot}` : `Not found. Run 'cto init' first.`,\n });\n\n // 2. Global config\n const configPath = getCTOConfigPath();\n checks.push({\n name: 'Global config',\n status: existsSync(configPath) ? 'pass' : 'warn',\n message: existsSync(configPath) ? 'config.yaml present' : 'No global config. Using defaults.',\n });\n\n // 3. Project directory\n const projectDir = getProjectDir(projectPath);\n checks.push({\n name: 'Project data',\n status: existsSync(projectDir) ? 'pass' : 'warn',\n message: existsSync(projectDir) ? 'Project data directory exists' : 'No project data yet. Run \\'cto analyze\\' first.',\n });\n\n // 4. Analysis freshness\n const analysis = await loadAnalysis(projectPath);\n if (analysis) {\n const age = Date.now() - new Date(analysis.analyzedAt).getTime();\n const hours = age / (1000 * 60 * 60);\n checks.push({\n name: 'Analysis freshness',\n status: hours < 24 ? 'pass' : hours < 72 ? 'warn' : 'fail',\n message: hours < 24\n ? `Analyzed ${hours.toFixed(1)}h ago`\n : `Analysis is ${hours.toFixed(0)}h old. Consider re-running 'cto analyze'.`,\n });\n }\n\n // 5. File permissions\n if (existsSync(projectDir)) {\n try {\n const dirStat = await stat(projectDir);\n const mode = dirStat.mode & 0o777;\n const secure = mode <= 0o700;\n checks.push({\n name: 'File permissions',\n status: secure ? 'pass' : 'warn',\n message: secure ? `Secure permissions (${mode.toString(8)})` : `Permissions too open (${mode.toString(8)}). Use --fix to secure.`,\n });\n\n if (!secure && opts.fix) {\n const count = await secureFilePermissions(projectPath);\n checks[checks.length - 1] = {\n name: 'File permissions',\n status: 'pass',\n message: `Fixed permissions on ${count} files/directories`,\n };\n }\n } catch {\n checks.push({ name: 'File permissions', status: 'warn', message: 'Could not check permissions' });\n }\n }\n\n // 6. Integrity verification\n if (existsSync(projectDir)) {\n const integrity = await verifyIntegrity(projectPath);\n if (integrity.total > 0) {\n checks.push({\n name: 'Data integrity',\n status: integrity.valid ? 'pass' : 'fail',\n message: integrity.valid\n ? `${integrity.verified}/${integrity.total} files verified`\n : `${integrity.corrupted.length} corrupted, ${integrity.missing.length} missing`,\n });\n } else {\n checks.push({\n name: 'Data integrity',\n status: 'warn',\n message: 'No integrity manifest. Run \\'cto validate\\' to create one.',\n });\n }\n }\n\n // 7. Audit log integrity\n const auditResult = await verifyAuditIntegrity();\n if (auditResult.totalEntries > 0) {\n checks.push({\n name: 'Audit log integrity',\n status: auditResult.invalidEntries.length === 0 ? 'pass' : 'fail',\n message: auditResult.invalidEntries.length === 0\n ? `${auditResult.validEntries}/${auditResult.totalEntries} entries verified`\n : `${auditResult.invalidEntries.length} tampered entries detected!`,\n });\n }\n\n // 8. Secret scan (quick check on artifacts)\n if (analysis) {\n const artifactsDir = getArtifactsDir(projectPath);\n const artifactFiles = [];\n try {\n const { readdir: rd } = await import('node:fs/promises');\n const files = await rd(artifactsDir);\n for (const f of files) artifactFiles.push(resolve(artifactsDir, f));\n } catch { /* no artifacts */ }\n\n if (artifactFiles.length > 0) {\n const secrets = await scanProjectForSecrets(projectPath, artifactFiles);\n checks.push({\n name: 'Secret scan (artifacts)',\n status: secrets.length === 0 ? 'pass' : 'fail',\n message: secrets.length === 0\n ? 'No secrets found in artifacts'\n : `⚠️ ${secrets.length} secret(s) found in artifacts! Run 'cto generate' to regenerate.`,\n });\n }\n }\n\n // 9. Node.js version\n const nodeVersion = process.versions.node;\n const [major] = nodeVersion.split('.').map(Number);\n checks.push({\n name: 'Node.js version',\n status: major >= 18 ? 'pass' : 'fail',\n message: `v${nodeVersion} ${major >= 18 ? '✓' : '(requires >=18)'}`,\n });\n\n // Output\n if (opts.json) {\n console.log(JSON.stringify(checks, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('🩺 CTO Doctor'));\n console.log('');\n\n const icons = { pass: chalk.green('✓'), warn: chalk.yellow('⚠'), fail: chalk.red('✗') };\n\n for (const check of checks) {\n console.log(` ${icons[check.status]} ${chalk.bold(check.name)}`);\n console.log(` ${chalk.dim(check.message)}`);\n }\n\n const fails = checks.filter((c) => c.status === 'fail');\n const warns = checks.filter((c) => c.status === 'warn');\n\n console.log('');\n if (fails.length === 0 && warns.length === 0) {\n console.log(chalk.green(' ✅ All checks passed'));\n } else if (fails.length === 0) {\n console.log(chalk.yellow(` ⚠️ ${warns.length} warning(s)`));\n } else {\n console.log(chalk.red(` ❌ ${fails.length} error(s), ${warns.length} warning(s)`));\n }\n console.log('');\n });\n","import { createHash } from 'node:crypto';\nimport { readFile, readdir, stat, chmod } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport type { IntegrityManifest, IntegrityEntry } from '../types/index.js';\nimport { getProjectDir, getArtifactsDir, getBackupsDir, getSessionsDir } from '../utils/paths.js';\nimport { readJSON, writeJSON, ensureDir } from '../utils/fs.js';\nimport { CTO_VERSION } from '../utils/constants.js';\n\nconst MANIFEST_FILE = 'integrity.json';\n\nexport function hashContent(content: string | Buffer): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport async function hashFile(filePath: string): Promise<string | null> {\n try {\n const content = await readFile(filePath);\n return hashContent(content);\n } catch {\n return null;\n }\n}\n\nexport async function buildIntegrityManifest(projectPath: string): Promise<IntegrityManifest> {\n const projectDir = getProjectDir(projectPath);\n const entries: IntegrityEntry[] = [];\n\n // Hash artifacts\n const artifactsDir = getArtifactsDir(projectPath);\n await hashDirEntries(artifactsDir, entries, 'artifact');\n\n // Hash backups\n const backupsDir = getBackupsDir(projectPath);\n await hashDirEntries(backupsDir, entries, 'backup');\n\n // Hash sessions\n const sessionsDir = getSessionsDir(projectPath);\n await hashDirEntries(sessionsDir, entries, 'session');\n\n // Hash config\n const configFile = join(projectDir, 'config.yaml');\n const configHash = await hashFile(configFile);\n if (configHash) {\n const s = await stat(configFile);\n entries.push({\n filePath: 'config.yaml',\n hash: configHash,\n size: s.size,\n createdAt: s.mtime,\n type: 'config',\n });\n }\n\n const manifest: IntegrityManifest = {\n version: CTO_VERSION,\n createdAt: new Date(),\n entries,\n };\n\n // Save manifest\n const manifestPath = join(projectDir, MANIFEST_FILE);\n await writeJSON(manifestPath, manifest);\n try { await chmod(manifestPath, 0o600); } catch { /* ignore */ }\n\n return manifest;\n}\n\nexport async function verifyIntegrity(projectPath: string): Promise<{\n valid: boolean;\n total: number;\n verified: number;\n corrupted: string[];\n missing: string[];\n}> {\n const projectDir = getProjectDir(projectPath);\n const manifestPath = join(projectDir, MANIFEST_FILE);\n const manifest = await readJSON<IntegrityManifest>(manifestPath);\n\n if (!manifest) {\n return { valid: false, total: 0, verified: 0, corrupted: [], missing: ['integrity.json'] };\n }\n\n const corrupted: string[] = [];\n const missing: string[] = [];\n let verified = 0;\n\n for (const entry of manifest.entries) {\n const fullPath = join(projectDir, getSubDir(entry.type), entry.filePath);\n const currentHash = await hashFile(fullPath);\n\n if (currentHash === null) {\n missing.push(entry.filePath);\n } else if (currentHash !== entry.hash) {\n corrupted.push(entry.filePath);\n } else {\n verified++;\n }\n }\n\n return {\n valid: corrupted.length === 0 && missing.length === 0,\n total: manifest.entries.length,\n verified,\n corrupted,\n missing,\n };\n}\n\nexport async function secureFilePermissions(projectPath: string): Promise<number> {\n const projectDir = getProjectDir(projectPath);\n let count = 0;\n\n async function secureDirRecursive(dir: string): Promise<void> {\n let entries: string[];\n try {\n entries = await readdir(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n try {\n const s = await stat(fullPath);\n if (s.isDirectory()) {\n await chmod(fullPath, 0o700);\n count++;\n await secureDirRecursive(fullPath);\n } else {\n await chmod(fullPath, 0o600);\n count++;\n }\n } catch { /* ignore */ }\n }\n }\n\n try {\n await chmod(projectDir, 0o700);\n count++;\n await secureDirRecursive(projectDir);\n } catch { /* project dir might not exist */ }\n\n return count;\n}\n\nexport async function purgeOldData(\n projectPath: string,\n retentionDays: number,\n): Promise<{ purgedSessions: number; purgedBackups: number }> {\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - retentionDays);\n let purgedSessions = 0;\n let purgedBackups = 0;\n\n // Purge old sessions\n const sessionsDir = getSessionsDir(projectPath);\n purgedSessions = await purgeOldFiles(sessionsDir, cutoff, 'session_');\n\n return { purgedSessions, purgedBackups };\n}\n\nasync function purgeOldFiles(dir: string, cutoff: Date, prefix: string): Promise<number> {\n let count = 0;\n const { unlink } = await import('node:fs/promises');\n\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return 0;\n }\n\n for (const file of files) {\n if (!file.startsWith(prefix)) continue;\n const fullPath = join(dir, file);\n try {\n const s = await stat(fullPath);\n if (s.mtime < cutoff) {\n await unlink(fullPath);\n count++;\n }\n } catch { /* ignore */ }\n }\n\n return count;\n}\n\nasync function hashDirEntries(\n dir: string,\n entries: IntegrityEntry[],\n type: IntegrityEntry['type'],\n): Promise<void> {\n let files: string[];\n try {\n files = await readdir(dir);\n } catch {\n return;\n }\n\n for (const file of files) {\n const fullPath = join(dir, file);\n try {\n const s = await stat(fullPath);\n if (!s.isFile()) continue;\n const hash = await hashFile(fullPath);\n if (hash) {\n entries.push({\n filePath: file,\n hash,\n size: s.size,\n createdAt: s.mtime,\n type,\n });\n }\n } catch { /* ignore */ }\n }\n}\n\nfunction getSubDir(type: IntegrityEntry['type']): string {\n switch (type) {\n case 'artifact': return 'artifacts';\n case 'backup': return 'backups';\n case 'session': return 'sessions';\n case 'config': return '';\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport { createHash } from 'node:crypto';\nimport { readdir, chmod } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { userInfo } from 'node:os';\nimport type { AuditEntry, AuditAction } from '../types/index.js';\nimport { getCTORoot } from '../utils/paths.js';\nimport { ensureDir, readJSON, writeJSON } from '../utils/fs.js';\n\nconst AUDIT_DIR = 'audit';\nconst MAX_ENTRIES_PER_FILE = 500;\n\nfunction getAuditDir(): string {\n return join(getCTORoot(), AUDIT_DIR);\n}\n\nfunction getCurrentAuditFile(): string {\n const date = new Date().toISOString().split('T')[0].replace(/-/g, '');\n return join(getAuditDir(), `audit_${date}.json`);\n}\n\nfunction computeIntegrityHash(entry: Omit<AuditEntry, 'integrityHash'>): string {\n const payload = JSON.stringify({\n id: entry.id,\n timestamp: entry.timestamp,\n action: entry.action,\n user: entry.user,\n projectPath: entry.projectPath,\n details: entry.details,\n });\n return createHash('sha256').update(payload).digest('hex');\n}\n\nexport async function logAudit(\n action: AuditAction,\n projectPath: string,\n details: Record<string, unknown> = {},\n): Promise<AuditEntry> {\n const auditDir = getAuditDir();\n await ensureDir(auditDir);\n\n let currentUser: string;\n try {\n currentUser = userInfo().username;\n } catch {\n currentUser = process.env.USER ?? process.env.USERNAME ?? 'unknown';\n }\n\n const partialEntry = {\n id: randomUUID().substring(0, 12),\n timestamp: new Date(),\n action,\n user: currentUser,\n projectPath,\n details,\n };\n\n const entry: AuditEntry = {\n ...partialEntry,\n integrityHash: computeIntegrityHash(partialEntry),\n };\n\n // Append to today's audit file\n const auditFile = getCurrentAuditFile();\n let entries = await readJSON<AuditEntry[]>(auditFile) ?? [];\n entries.push(entry);\n\n // Rotate if too many entries\n if (entries.length > MAX_ENTRIES_PER_FILE) {\n entries = entries.slice(-MAX_ENTRIES_PER_FILE);\n }\n\n await writeJSON(auditFile, entries);\n\n // Set secure permissions (0600)\n try { await chmod(auditFile, 0o600); } catch { /* ignore on Windows */ }\n\n return entry;\n}\n\nexport async function getAuditEntries(\n options: {\n projectPath?: string;\n action?: AuditAction;\n since?: Date;\n limit?: number;\n } = {},\n): Promise<AuditEntry[]> {\n const auditDir = getAuditDir();\n let files: string[];\n try {\n files = await readdir(auditDir);\n } catch {\n return [];\n }\n\n const auditFiles = files\n .filter((f) => f.startsWith('audit_') && f.endsWith('.json'))\n .sort()\n .reverse();\n\n const allEntries: AuditEntry[] = [];\n const limit = options.limit ?? 100;\n\n for (const file of auditFiles) {\n if (allEntries.length >= limit) break;\n\n const entries = await readJSON<AuditEntry[]>(join(auditDir, file));\n if (!entries) continue;\n\n for (const entry of entries.reverse()) {\n if (allEntries.length >= limit) break;\n\n if (options.projectPath && entry.projectPath !== options.projectPath) continue;\n if (options.action && entry.action !== options.action) continue;\n if (options.since && new Date(entry.timestamp) < options.since) continue;\n\n allEntries.push(entry);\n }\n }\n\n return allEntries;\n}\n\nexport function verifyAuditEntry(entry: AuditEntry): boolean {\n const { integrityHash, ...rest } = entry;\n const expected = computeIntegrityHash(rest as Omit<AuditEntry, 'integrityHash'>);\n return expected === integrityHash;\n}\n\nexport async function verifyAuditIntegrity(): Promise<{\n totalEntries: number;\n validEntries: number;\n invalidEntries: AuditEntry[];\n}> {\n const entries = await getAuditEntries({ limit: 10000 });\n const invalidEntries: AuditEntry[] = [];\n\n for (const entry of entries) {\n if (!verifyAuditEntry(entry)) {\n invalidEntries.push(entry);\n }\n }\n\n return {\n totalEntries: entries.length,\n validEntries: entries.length - invalidEntries.length,\n invalidEntries,\n };\n}\n\nexport async function purgeOldAuditEntries(retentionDays: number): Promise<number> {\n const auditDir = getAuditDir();\n let files: string[];\n try {\n files = await readdir(auditDir);\n } catch {\n return 0;\n }\n\n const cutoff = new Date();\n cutoff.setDate(cutoff.getDate() - retentionDays);\n const cutoffStr = cutoff.toISOString().split('T')[0].replace(/-/g, '');\n\n let purged = 0;\n const { unlink } = await import('node:fs/promises');\n\n for (const file of files) {\n if (!file.startsWith('audit_') || !file.endsWith('.json')) continue;\n const dateStr = file.replace('audit_', '').replace('.json', '');\n if (dateStr < cutoffStr) {\n try {\n await unlink(join(auditDir, file));\n purged++;\n } catch { /* ignore */ }\n }\n }\n\n return purged;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { getAuditEntries, verifyAuditIntegrity, purgeOldAuditEntries } from '../../core/audit.js';\nimport type { AuditAction } from '../../types/index.js';\n\nexport const auditCommand = new Command('audit')\n .description('View and manage the audit trail');\n\nauditCommand\n .command('log')\n .description('View recent audit entries')\n .option('-p, --project <path>', 'Filter by project path')\n .option('-a, --action <action>', 'Filter by action type')\n .option('-n, --limit <n>', 'Number of entries', '20')\n .option('--since <date>', 'Entries since date (YYYY-MM-DD)')\n .option('--json', 'Output as JSON')\n .action(async (opts: { project?: string; action?: string; limit?: string; since?: string; json?: boolean }) => {\n const entries = await getAuditEntries({\n projectPath: opts.project ? resolve(opts.project) : undefined,\n action: opts.action as AuditAction | undefined,\n since: opts.since ? new Date(opts.since) : undefined,\n limit: parseInt(opts.limit ?? '20', 10),\n });\n\n if (opts.json) {\n console.log(JSON.stringify(entries, null, 2));\n return;\n }\n\n if (entries.length === 0) {\n console.log(chalk.dim('No audit entries found.'));\n return;\n }\n\n console.log(chalk.bold(`📋 Audit Trail (${entries.length} entries)`));\n console.log('');\n\n for (const entry of entries) {\n const date = new Date(entry.timestamp);\n const dateStr = `${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getDate().toString().padStart(2, '0')} ${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;\n const actionColor = getActionColor(entry.action);\n\n console.log(` ${chalk.dim(dateStr)} ${actionColor(entry.action.padEnd(16))} ${chalk.dim(entry.user)}`);\n if (Object.keys(entry.details).length > 0) {\n const details = Object.entries(entry.details)\n .map(([k, v]) => `${k}=${typeof v === 'string' ? v : JSON.stringify(v)}`)\n .join(', ');\n console.log(` ${chalk.dim(details.slice(0, 80))}`);\n }\n }\n });\n\nauditCommand\n .command('verify')\n .description('Verify audit log integrity')\n .action(async () => {\n console.log(chalk.dim('Verifying audit log integrity...'));\n const result = await verifyAuditIntegrity();\n\n if (result.totalEntries === 0) {\n console.log(chalk.dim('No audit entries to verify.'));\n return;\n }\n\n if (result.invalidEntries.length === 0) {\n console.log(chalk.green(`✅ All ${result.validEntries} audit entries verified — no tampering detected`));\n } else {\n console.log(chalk.red(`❌ ${result.invalidEntries.length} of ${result.totalEntries} entries have been tampered with!`));\n for (const entry of result.invalidEntries.slice(0, 5)) {\n console.log(chalk.red(` • ${entry.id} (${entry.action} at ${new Date(entry.timestamp).toISOString()})`));\n }\n }\n });\n\nauditCommand\n .command('purge')\n .description('Purge old audit entries')\n .option('--days <n>', 'Retention period in days', '90')\n .action(async (opts: { days?: string }) => {\n const days = parseInt(opts.days ?? '90', 10);\n const purged = await purgeOldAuditEntries(days);\n console.log(chalk.green(`✅ Purged ${purged} audit file(s) older than ${days} days`));\n });\n\nfunction getActionColor(action: string) {\n switch (action) {\n case 'secret-detected': return chalk.red;\n case 'apply': case 'revert': return chalk.yellow;\n case 'analyze': case 'generate': return chalk.cyan;\n case 'session-start': case 'session-end': return chalk.blue;\n default: return chalk.white;\n }\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport type { ValidationResult } from '../../types/index.js';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { loadGeneratedArtifact, generateClaudeMd, generateClaudeignore } from '../../core/generator.js';\nimport { buildIntegrityManifest, verifyIntegrity } from '../../core/integrity.js';\nimport { scanProjectForSecrets } from '../../core/security.js';\nimport { logAudit } from '../../core/audit.js';\n\nexport const validateCommand = new Command('validate')\n .description('Validate artifacts are up-to-date, integrity is intact, and no secrets leaked (CI/CD ready)')\n .argument('[path]', 'Project path', '.')\n .option('--strict', 'Fail on warnings too (for CI)')\n .option('--update-integrity', 'Rebuild integrity manifest after validation')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { strict?: boolean; updateIntegrity?: boolean; json?: boolean }) => {\n const projectPath = resolve(path);\n const errors: string[] = [];\n const warnings: string[] = [];\n\n // 1. Check analysis exists and is recent\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) {\n warnings.push('No analysis found — running fresh analysis');\n analysis = await analyzeProject(projectPath);\n } else {\n const age = Date.now() - new Date(analysis.analyzedAt).getTime();\n const hours = age / (1000 * 60 * 60);\n if (hours > 72) {\n warnings.push(`Analysis is ${hours.toFixed(0)}h old — consider re-running 'cto analyze'`);\n }\n }\n\n // 2. Check artifacts are up-to-date\n let artifactsUpToDate = true;\n const existingMd = await loadGeneratedArtifact(projectPath, 'claude-md');\n const existingIgnore = await loadGeneratedArtifact(projectPath, 'claudeignore');\n\n if (!existingMd) {\n errors.push('CLAUDE.md artifact not generated');\n artifactsUpToDate = false;\n }\n if (!existingIgnore) {\n errors.push('.claudeignore artifact not generated');\n artifactsUpToDate = false;\n }\n\n // Compare with freshly generated versions\n if (existingMd) {\n const fresh = await generateClaudeMd(analysis);\n // Compare normalized (ignore timestamp line)\n const normalize = (s: string) => s.replace(/Last updated: .+/g, '').trim();\n if (normalize(existingMd) !== normalize(fresh.content)) {\n warnings.push('CLAUDE.md is out of date — regenerate with \\'cto generate\\'');\n artifactsUpToDate = false;\n }\n }\n\n // 3. Secret scan on project source files\n let secretsClean = true;\n const filePaths = analysis.files.map((f) => f.path);\n const secrets = await scanProjectForSecrets(projectPath, filePaths);\n\n if (secrets.length > 0) {\n const critical = secrets.filter((s) => s.severity === 'critical');\n const high = secrets.filter((s) => s.severity === 'high');\n\n if (critical.length > 0) {\n errors.push(`${critical.length} CRITICAL secret(s) found in source files`);\n secretsClean = false;\n for (const s of critical.slice(0, 3)) {\n errors.push(` ${s.file}:${s.line} — ${s.type}: ${s.redacted}`);\n }\n }\n if (high.length > 0) {\n warnings.push(`${high.length} high-severity secret(s) found`);\n secretsClean = false;\n }\n\n // Log to audit\n await logAudit('secret-detected', projectPath, {\n count: secrets.length,\n critical: critical.length,\n high: high.length,\n });\n }\n\n // 4. Integrity verification\n let integrityOk = true;\n const integrityResult = await verifyIntegrity(projectPath);\n if (integrityResult.total > 0) {\n if (!integrityResult.valid) {\n if (integrityResult.corrupted.length > 0) {\n errors.push(`${integrityResult.corrupted.length} file(s) have been modified since last validation`);\n integrityOk = false;\n }\n if (integrityResult.missing.length > 0) {\n warnings.push(`${integrityResult.missing.length} file(s) missing from integrity manifest`);\n }\n }\n } else {\n warnings.push('No integrity manifest — will create one');\n }\n\n // 5. Update integrity manifest if requested or first time\n if (opts.updateIntegrity || integrityResult.total === 0) {\n await buildIntegrityManifest(projectPath);\n }\n\n // Log validation to audit\n await logAudit('integrity-check', projectPath, {\n errors: errors.length,\n warnings: warnings.length,\n secretsClean,\n integrityOk,\n artifactsUpToDate,\n });\n\n const result: ValidationResult = {\n valid: errors.length === 0 && (!opts.strict || warnings.length === 0),\n errors,\n warnings,\n artifactsUpToDate,\n integrityOk,\n secretsClean,\n };\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n if (!result.valid) process.exit(1);\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('🔍 CTO Validate'));\n console.log('');\n\n const icon = (ok: boolean) => ok ? chalk.green('✓') : chalk.red('✗');\n\n console.log(` ${icon(artifactsUpToDate)} Artifacts up-to-date`);\n console.log(` ${icon(secretsClean)} No secrets in source`);\n console.log(` ${icon(integrityOk)} Data integrity`);\n console.log('');\n\n if (errors.length > 0) {\n console.log(chalk.red.bold(' Errors:'));\n for (const e of errors) console.log(chalk.red(` ✗ ${e}`));\n console.log('');\n }\n\n if (warnings.length > 0) {\n console.log(chalk.yellow.bold(' Warnings:'));\n for (const w of warnings) console.log(chalk.yellow(` ⚠ ${w}`));\n console.log('');\n }\n\n if (result.valid) {\n console.log(chalk.green(' ✅ Validation passed'));\n } else {\n console.log(chalk.red(' ❌ Validation failed'));\n if (!opts.json) process.exit(1);\n }\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { pruneProject, pruneFile, getPruneLevelForTier } from '../../core/pruning.js';\nimport { formatTokens } from '../../utils/format.js';\nimport type { PruneLevel } from '../../types/index.js';\n\nexport const pruneCommand = new Command('prune')\n .description('Smart context pruning — extract signatures from cold/warm files');\n\npruneCommand\n .command('preview')\n .description('Preview how much pruning would save')\n .argument('[path]', 'Project path', '.')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { json?: boolean }) => {\n const projectPath = resolve(path);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const result = await pruneProject(analysis.files);\n\n if (opts.json) {\n console.log(JSON.stringify({\n totalOriginalTokens: result.totalOriginalTokens,\n totalPrunedTokens: result.totalPrunedTokens,\n totalSavings: result.totalSavings,\n savingsPercent: result.savingsPercent,\n files: result.files.map((f) => ({\n relativePath: f.relativePath,\n originalTokens: f.originalTokens,\n prunedTokens: f.prunedTokens,\n pruneLevel: f.pruneLevel,\n savings: f.savings,\n })),\n }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('✂️ Smart Context Pruning Preview'));\n console.log('');\n\n const hot = result.files.filter((f) => f.pruneLevel === 'full');\n const warm = result.files.filter((f) => f.pruneLevel === 'signatures');\n const cold = result.files.filter((f) => f.pruneLevel === 'skeleton');\n\n console.log(` 🔥 Hot (full): ${hot.length} files — kept as-is`);\n console.log(` 🌡️ Warm (signatures): ${warm.length} files — signatures only`);\n console.log(` ❄️ Cold (skeleton): ${cold.length} files — declarations only`);\n console.log('');\n\n // Show top savings\n const withSavings = result.files\n .filter((f) => f.savings > 0)\n .sort((a, b) => (b.originalTokens - b.prunedTokens) - (a.originalTokens - a.prunedTokens));\n\n if (withSavings.length > 0) {\n console.log(chalk.bold(' Top savings:'));\n for (const f of withSavings.slice(0, 10)) {\n const saved = f.originalTokens - f.prunedTokens;\n const name = f.relativePath.length > 40\n ? '...' + f.relativePath.slice(-37)\n : f.relativePath;\n console.log(` ${f.pruneLevel.padEnd(10)} ${name.padEnd(42)} ~${formatTokens(saved).padEnd(6)} saved (${f.savings.toFixed(0)}%)`);\n }\n console.log('');\n }\n\n console.log(chalk.bold(' Summary:'));\n console.log(` Original: ~${formatTokens(result.totalOriginalTokens)} tokens`);\n console.log(` Pruned: ~${formatTokens(result.totalPrunedTokens)} tokens`);\n console.log(` ${chalk.bold.green(`Saved: ~${formatTokens(result.totalSavings)} tokens (${result.savingsPercent.toFixed(0)}%)`)}`);\n console.log('');\n });\n\npruneCommand\n .command('file')\n .description('Preview pruned content of a specific file')\n .argument('<file>', 'File path relative to project')\n .argument('[path]', 'Project path', '.')\n .option('-l, --level <level>', 'Prune level (full, signatures, skeleton)', 'signatures')\n .action(async (file: string, path: string, opts: { level?: string }) => {\n const projectPath = resolve(path);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const fileInfo = analysis.files.find((f) => f.relativePath === file);\n if (!fileInfo) {\n console.log(chalk.red(`File not found: ${file}`));\n return;\n }\n\n const level = (opts.level ?? 'signatures') as PruneLevel;\n const pruned = await pruneFile(fileInfo, level);\n\n console.log(chalk.dim(`// ${file} — ${level} mode`));\n console.log(chalk.dim(`// Original: ~${formatTokens(pruned.originalTokens)} tokens | Pruned: ~${formatTokens(pruned.prunedTokens)} tokens | Saved: ${pruned.savings.toFixed(0)}%`));\n console.log('');\n console.log(pruned.content);\n });\n","import { readFile } from 'node:fs/promises';\nimport { resolve, extname } from 'node:path';\nimport type { FileInfo, PrunedFile, PruneResult, PruneLevel, Tier } from '../types/index.js';\nimport { countTokensChars4 } from './tokenizer.js';\n\nconst TS_EXTENSIONS = new Set(['ts', 'tsx', 'js', 'jsx', 'mts', 'mjs']);\n\nexport function getPruneLevelForTier(tier: Tier): PruneLevel {\n switch (tier) {\n case 'hot': return 'full';\n case 'warm': return 'signatures';\n case 'cold': return 'skeleton';\n }\n}\n\nexport async function pruneFile(\n file: FileInfo,\n level?: PruneLevel,\n): Promise<PrunedFile> {\n const pruneLevel = level ?? getPruneLevelForTier(file.tier);\n\n if (pruneLevel === 'full' || pruneLevel === 'none') {\n let content = '';\n try { content = await readFile(file.path, 'utf-8'); } catch { /* */ }\n return {\n relativePath: file.relativePath,\n originalTokens: file.tokens,\n prunedTokens: pruneLevel === 'none' ? 0 : file.tokens,\n pruneLevel,\n content: pruneLevel === 'none' ? '' : content,\n savings: pruneLevel === 'none' ? 100 : 0,\n };\n }\n\n let content = '';\n try { content = await readFile(file.path, 'utf-8'); } catch { return emptyPruned(file, pruneLevel); }\n\n const ext = extname(file.relativePath).slice(1).toLowerCase();\n const isTS = TS_EXTENSIONS.has(ext);\n\n let prunedContent: string;\n if (isTS) {\n prunedContent = pruneLevel === 'signatures'\n ? extractSignatures(content)\n : extractSkeleton(content);\n } else {\n // For non-TS files, use generic pruning\n prunedContent = pruneLevel === 'signatures'\n ? extractGenericSignatures(content, ext)\n : extractGenericSkeleton(content);\n }\n\n const prunedTokens = countTokensChars4(Buffer.byteLength(prunedContent, 'utf-8'));\n const savings = file.tokens > 0 ? ((file.tokens - prunedTokens) / file.tokens) * 100 : 0;\n\n return {\n relativePath: file.relativePath,\n originalTokens: file.tokens,\n prunedTokens,\n pruneLevel,\n content: prunedContent,\n savings: Math.max(0, savings),\n };\n}\n\nexport async function pruneProject(files: FileInfo[]): Promise<PruneResult> {\n const prunedFiles: PrunedFile[] = [];\n\n for (const file of files) {\n const pruned = await pruneFile(file);\n prunedFiles.push(pruned);\n }\n\n const totalOriginalTokens = prunedFiles.reduce((s, f) => s + f.originalTokens, 0);\n const totalPrunedTokens = prunedFiles.reduce((s, f) => s + f.prunedTokens, 0);\n const totalSavings = totalOriginalTokens - totalPrunedTokens;\n\n return {\n files: prunedFiles,\n totalOriginalTokens,\n totalPrunedTokens,\n totalSavings,\n savingsPercent: totalOriginalTokens > 0 ? (totalSavings / totalOriginalTokens) * 100 : 0,\n };\n}\n\n// --- TS/JS Signature Extraction ---\n\nfunction extractSignatures(content: string): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n let braceDepth = 0;\n let inFunctionBody = false;\n let skipUntilBraceClose = false;\n let functionBraceStart = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Always keep imports, exports, type definitions, interfaces, comments at top level\n if (braceDepth === 0 || !inFunctionBody) {\n if (isImportOrExport(trimmed) || isTypeDefinition(trimmed) || isComment(trimmed) || trimmed === '') {\n result.push(line);\n updateBraceDepth(trimmed);\n continue;\n }\n }\n\n // Detect function/method start\n if (!inFunctionBody && isFunctionSignature(trimmed)) {\n result.push(line);\n const openBraces = (trimmed.match(/\\{/g) || []).length;\n const closeBraces = (trimmed.match(/\\}/g) || []).length;\n\n if (openBraces > closeBraces) {\n inFunctionBody = true;\n functionBraceStart = braceDepth + openBraces - closeBraces;\n result.push(' // ... implementation omitted');\n }\n braceDepth += openBraces - closeBraces;\n continue;\n }\n\n // Inside function body — skip until matching brace\n if (inFunctionBody) {\n const openBraces = (trimmed.match(/\\{/g) || []).length;\n const closeBraces = (trimmed.match(/\\}/g) || []).length;\n braceDepth += openBraces - closeBraces;\n\n if (braceDepth < functionBraceStart) {\n result.push(line); // closing brace\n inFunctionBody = false;\n }\n continue;\n }\n\n // Keep class/interface declarations and property signatures\n if (isClassOrInterface(trimmed) || isPropertySignature(trimmed)) {\n result.push(line);\n }\n\n updateBraceDepthLine(line);\n }\n\n return result.join('\\n');\n\n function updateBraceDepth(trimmed: string) {\n braceDepth += (trimmed.match(/\\{/g) || []).length;\n braceDepth -= (trimmed.match(/\\}/g) || []).length;\n }\n\n function updateBraceDepthLine(line: string) {\n const t = line.trim();\n braceDepth += (t.match(/\\{/g) || []).length;\n braceDepth -= (t.match(/\\}/g) || []).length;\n }\n}\n\nfunction extractSkeleton(content: string): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n // Keep only: imports, exports, type/interface declarations, class declarations, function signatures\n if (\n isImportOrExport(trimmed) ||\n isTypeDefinition(trimmed) ||\n isClassOrInterface(trimmed) ||\n isFunctionSignature(trimmed) ||\n trimmed.startsWith('//') ||\n trimmed === ''\n ) {\n // For function signatures, strip the body indicator\n if (isFunctionSignature(trimmed) && trimmed.includes('{')) {\n result.push(line.split('{')[0].trimEnd() + ';');\n } else {\n result.push(line);\n }\n }\n }\n\n return result.join('\\n');\n}\n\n// --- Generic (non-TS) extraction ---\n\nfunction extractGenericSignatures(content: string, ext: string): string {\n const lines = content.split('\\n');\n const result: string[] = [];\n\n if (ext === 'py') {\n // Python: keep imports, class defs, function defs with docstrings\n let inBody = false;\n let bodyIndent = 0;\n\n for (const line of lines) {\n const trimmed = line.trim();\n const indent = line.length - line.trimStart().length;\n\n if (trimmed.startsWith('import ') || trimmed.startsWith('from ') || trimmed === '') {\n result.push(line);\n inBody = false;\n continue;\n }\n\n if (trimmed.startsWith('def ') || trimmed.startsWith('class ') || trimmed.startsWith('async def ')) {\n result.push(line);\n inBody = true;\n bodyIndent = indent;\n continue;\n }\n\n if (inBody && trimmed.startsWith('\"\"\"') || trimmed.startsWith(\"'''\")) {\n result.push(line);\n continue;\n }\n\n if (inBody && indent > bodyIndent && result.length > 0) {\n if (!result[result.length - 1].includes('...')) {\n result.push(' '.repeat(bodyIndent + 4) + '...');\n }\n continue;\n }\n\n if (indent <= bodyIndent) {\n inBody = false;\n }\n\n if (trimmed.startsWith('#')) {\n result.push(line);\n }\n }\n } else {\n // Generic: keep first 3 lines + any line that looks like a declaration\n let kept = 0;\n for (const line of lines) {\n const trimmed = line.trim();\n if (kept < 5 || trimmed === '' || trimmed.startsWith('#') || trimmed.startsWith('//') ||\n /^(export|import|function|class|interface|type|const|let|var|def|pub |fn |struct |enum )/i.test(trimmed)) {\n result.push(line);\n kept++;\n }\n }\n }\n\n return result.join('\\n');\n}\n\nfunction extractGenericSkeleton(content: string): string {\n const lines = content.split('\\n');\n return lines\n .filter((line) => {\n const t = line.trim();\n return t === '' || t.startsWith('#') || t.startsWith('//') ||\n /^(export|import|from|function|class|interface|type|const|let|var|def |pub |fn |struct |enum |module )/i.test(t);\n })\n .join('\\n');\n}\n\n// --- Helpers ---\n\nfunction isImportOrExport(line: string): boolean {\n return /^(import |export |export default |export type |export interface )/.test(line);\n}\n\nfunction isTypeDefinition(line: string): boolean {\n return /^(type |interface |enum )/.test(line);\n}\n\nfunction isComment(line: string): boolean {\n return line.startsWith('//') || line.startsWith('/*') || line.startsWith(' *') || line.startsWith('*/');\n}\n\nfunction isFunctionSignature(line: string): boolean {\n return /^(export )?(async )?(function |const \\w+ = (?:async )?\\(|(?:public|private|protected|static|async) )/.test(line) ||\n /^\\w+\\s*\\(.*\\)\\s*[:{]/.test(line);\n}\n\nfunction isClassOrInterface(line: string): boolean {\n return /^(export )?(abstract )?(class |interface )/.test(line);\n}\n\nfunction isPropertySignature(line: string): boolean {\n return /^\\s+(readonly |public |private |protected )?\\w+[\\?:]/.test(line) && !line.includes('{');\n}\n\nfunction emptyPruned(file: FileInfo, level: PruneLevel): PrunedFile {\n return {\n relativePath: file.relativePath,\n originalTokens: file.tokens,\n prunedTokens: 0,\n pruneLevel: level,\n content: '',\n savings: 100,\n };\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { estimateSessionCost, estimateMonthlySavings, getModelPricingTable, MODEL_PRICING } from '../../core/costs.js';\nimport { listSessions } from '../../core/sessions.js';\nimport { estimateWeeklyCost } from '../../core/costs.js';\nimport { formatTokens } from '../../utils/format.js';\nimport type { ModelPreference } from '../../types/index.js';\n\nexport const costsCommand = new Command('costs')\n .description('Estimate token costs and savings in real dollars');\n\ncostsCommand\n .command('estimate')\n .description('Estimate cost savings for a project')\n .argument('[path]', 'Project path', '.')\n .option('-m, --model <model>', 'Model (opus, sonnet, haiku)', 'sonnet')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { model?: string; json?: boolean }) => {\n const projectPath = resolve(path);\n const model = (opts.model ?? 'sonnet') as ModelPreference;\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const estimate = estimateSessionCost(analysis.files, model);\n\n if (opts.json) {\n console.log(JSON.stringify(estimate, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan(`💰 Cost Estimate — ${analysis.projectName}`));\n console.log(chalk.dim(` Model: ${model} | Files: ${analysis.totalFiles}`));\n console.log('');\n console.log(` Without CTO: ~${formatTokens(estimate.withoutCTO.tokens)} tokens → ${chalk.red(estimate.withoutCTO.formatted)}/session`);\n console.log(` With CTO: ~${formatTokens(estimate.withCTO.tokens)} tokens → ${chalk.green(estimate.withCTO.formatted)}/session`);\n console.log(` ${chalk.bold.green(`Saved: ~${formatTokens(estimate.saved.tokens)} tokens → ${estimate.saved.formatted}/session (${estimate.savingsPercent.toFixed(0)}%)`)}`);\n console.log('');\n\n // Monthly projections\n const monthlyTokensSaved = estimate.saved.tokens;\n const projections = estimateMonthlySavings(5, monthlyTokensSaved, model);\n console.log(chalk.bold(' 📈 Projected Savings (5 sessions/day):'));\n console.log(` Daily: ${chalk.green(projections.daily)}`);\n console.log(` Weekly: ${chalk.green(projections.weekly)}`);\n console.log(` Monthly: ${chalk.green(projections.monthly)}`);\n console.log(` Yearly: ${chalk.bold.green(projections.yearly)}`);\n console.log('');\n });\n\ncostsCommand\n .command('history')\n .description('Show actual costs from session history')\n .argument('[path]', 'Project path', '.')\n .option('-m, --model <model>', 'Model (opus, sonnet, haiku)', 'sonnet')\n .action(async (path: string, opts: { model?: string }) => {\n const projectPath = resolve(path);\n const model = (opts.model ?? 'sonnet') as ModelPreference;\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const sessions = await listSessions(projectPath, 100);\n if (sessions.length === 0) {\n console.log(chalk.dim('No sessions recorded. Start tracking with: cto session start'));\n return;\n }\n\n const costs = estimateWeeklyCost(sessions, analysis.totalTokens, model);\n\n console.log('');\n console.log(chalk.bold.cyan('💰 Cost History'));\n console.log(chalk.dim(` Model: ${model} | Sessions: ${costs.sessionsCount}`));\n console.log('');\n console.log(` Total spent: ${costs.totalCost.formatted}`);\n console.log(` Without CTO: ${chalk.red(costs.costWithoutCTO.formatted)}`);\n console.log(` Saved: ${chalk.bold.green(costs.savedCost.formatted)}`);\n console.log(` Avg/session: ${costs.avgCostPerSession}`);\n console.log('');\n });\n\ncostsCommand\n .command('pricing')\n .description('Show current Claude model pricing')\n .action(async () => {\n console.log('');\n console.log(chalk.bold.cyan('💲 Claude Model Pricing'));\n console.log('');\n console.log(getModelPricingTable());\n console.log('');\n console.log(chalk.dim(' Prices as of 2025. CTO uses input pricing for estimates.'));\n console.log('');\n });\n","import type { ModelPreference, ModelPricing, CostEstimate, CostBreakdown, FileInfo, SessionInfo } from '../types/index.js';\n\nexport const MODEL_PRICING: Record<ModelPreference, ModelPricing> = {\n opus: {\n model: 'opus',\n inputPerMillion: 15.00,\n outputPerMillion: 75.00,\n cacheReadPerMillion: 1.50,\n },\n sonnet: {\n model: 'sonnet',\n inputPerMillion: 3.00,\n outputPerMillion: 15.00,\n cacheReadPerMillion: 0.30,\n },\n haiku: {\n model: 'haiku',\n inputPerMillion: 0.25,\n outputPerMillion: 1.25,\n cacheReadPerMillion: 0.03,\n },\n};\n\nexport function estimateCost(\n tokens: number,\n model: ModelPreference = 'sonnet',\n): CostBreakdown {\n const pricing = MODEL_PRICING[model];\n const cost = (tokens / 1_000_000) * pricing.inputPerMillion;\n return {\n tokens,\n cost,\n formatted: formatCurrency(cost),\n };\n}\n\nexport function estimateSessionCost(\n files: FileInfo[],\n model: ModelPreference = 'sonnet',\n): CostEstimate {\n const allTokens = files.reduce((s, f) => s + f.tokens, 0);\n const hotTokens = files.filter((f) => f.tier === 'hot').reduce((s, f) => s + f.tokens, 0);\n\n const withoutCTO = estimateCost(allTokens, model);\n const withCTO = estimateCost(hotTokens, model);\n const savedTokens = allTokens - hotTokens;\n const saved = estimateCost(savedTokens, model);\n\n return {\n model,\n withoutCTO,\n withCTO,\n saved,\n savingsPercent: allTokens > 0 ? (savedTokens / allTokens) * 100 : 0,\n };\n}\n\nexport function estimateWeeklyCost(\n sessions: SessionInfo[],\n totalProjectTokens: number,\n model: ModelPreference = 'sonnet',\n): {\n totalCost: CostBreakdown;\n savedCost: CostBreakdown;\n costWithoutCTO: CostBreakdown;\n sessionsCount: number;\n avgCostPerSession: string;\n} {\n const totalConsumed = sessions.reduce((s, ses) => s + ses.tokensEstimated, 0);\n const totalWithout = sessions.length * totalProjectTokens;\n\n const totalCost = estimateCost(totalConsumed, model);\n const costWithoutCTO = estimateCost(totalWithout, model);\n const savedCost = estimateCost(Math.max(0, totalWithout - totalConsumed), model);\n const avgCostPerSession = sessions.length > 0\n ? formatCurrency(totalCost.cost / sessions.length)\n : '$0.00';\n\n return {\n totalCost,\n savedCost,\n costWithoutCTO,\n sessionsCount: sessions.length,\n avgCostPerSession,\n };\n}\n\nexport function estimateMonthlySavings(\n avgSessionsPerDay: number,\n avgTokensSaved: number,\n model: ModelPreference = 'sonnet',\n): {\n daily: string;\n weekly: string;\n monthly: string;\n yearly: string;\n} {\n const pricing = MODEL_PRICING[model];\n const dailySaved = (avgTokensSaved * avgSessionsPerDay / 1_000_000) * pricing.inputPerMillion;\n\n return {\n daily: formatCurrency(dailySaved),\n weekly: formatCurrency(dailySaved * 7),\n monthly: formatCurrency(dailySaved * 30),\n yearly: formatCurrency(dailySaved * 365),\n };\n}\n\nexport function getModelPricingTable(): string {\n const lines: string[] = [];\n lines.push('| Model | Input/1M | Output/1M | Cache Read/1M |');\n lines.push('|-------|----------|-----------|---------------|');\n\n for (const [, pricing] of Object.entries(MODEL_PRICING)) {\n lines.push(\n `| ${pricing.model.padEnd(7)} | $${pricing.inputPerMillion.toFixed(2).padStart(6)} | $${pricing.outputPerMillion.toFixed(2).padStart(7)} | $${pricing.cacheReadPerMillion.toFixed(2).padStart(11)} |`,\n );\n }\n\n return lines.join('\\n');\n}\n\nfunction formatCurrency(amount: number): string {\n if (amount < 0.01) return `$${amount.toFixed(4)}`;\n if (amount < 1) return `$${amount.toFixed(3)}`;\n if (amount < 100) return `$${amount.toFixed(2)}`;\n return `$${Math.round(amount).toLocaleString()}`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { optimizeBudget } from '../../core/budget.js';\nimport { generatePRContext } from '../../core/pr-context.js';\nimport { formatTokens } from '../../utils/format.js';\nimport { getArtifactsDir } from '../../utils/paths.js';\nimport { writeText } from '../../utils/fs.js';\n\nexport const contextCommand = new Command('context')\n .description('Generate optimized context within a token budget or for a PR');\n\ncontextCommand\n .command('budget')\n .description('Generate optimal context within a token budget')\n .argument('[path]', 'Project path', '.')\n .requiredOption('-b, --budget <tokens>', 'Max token budget')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { budget: string; json?: boolean }) => {\n const projectPath = resolve(path);\n const budget = parseInt(opts.budget, 10);\n\n if (isNaN(budget) || budget <= 0) {\n console.log(chalk.red('Invalid budget. Provide a positive number of tokens.'));\n process.exit(1);\n }\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const result = await optimizeBudget(analysis.files, budget);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan(`🎯 Token Budget Optimizer — ${budget.toLocaleString()} tokens`));\n console.log('');\n console.log(` Included: ${chalk.green(result.includedFiles.length + ' files')} (${formatTokens(result.usedTokens)} tokens)`);\n console.log(` Excluded: ${chalk.dim(result.excludedFiles.length + ' files')}`);\n console.log(` Budget: ${chalk.bold(result.fillPercent.toFixed(0) + '% filled')} (${formatTokens(result.remainingTokens)} remaining)`);\n console.log('');\n\n if (result.includedFiles.length > 0) {\n console.log(chalk.bold(' Included:'));\n for (const f of result.includedFiles) {\n const tierIcon = f.tier === 'hot' ? '🔥' : f.tier === 'warm' ? '🌡️' : '❄️';\n const name = f.relativePath.length > 38 ? '...' + f.relativePath.slice(-35) : f.relativePath;\n console.log(` ${tierIcon} ${name.padEnd(40)} ${f.pruneLevel.padEnd(11)} ${formatTokens(f.tokens).padStart(6)}`);\n }\n console.log('');\n }\n\n if (result.excludedFiles.length > 0 && result.excludedFiles.length <= 20) {\n console.log(chalk.dim(' Excluded:'));\n for (const f of result.excludedFiles.slice(0, 10)) {\n console.log(chalk.dim(` ${f.relativePath} (${formatTokens(f.tokens)})`));\n }\n if (result.excludedFiles.length > 10) {\n console.log(chalk.dim(` ... and ${result.excludedFiles.length - 10} more`));\n }\n console.log('');\n }\n });\n\ncontextCommand\n .command('pr')\n .description('Generate focused context for a PR/branch review')\n .argument('[path]', 'Project path', '.')\n .option('-b, --base <branch>', 'Base branch to diff against', 'main')\n .option('--save', 'Save to artifacts directory')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { base?: string; save?: boolean; json?: boolean }) => {\n const projectPath = resolve(path);\n const baseBranch = opts.base ?? 'main';\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const prContext = await generatePRContext(analysis, baseBranch);\n\n if (opts.json) {\n console.log(JSON.stringify({\n baseBranch: prContext.baseBranch,\n changedFiles: prContext.changedFiles,\n dependencies: prContext.dependencies,\n totalTokens: prContext.totalTokens,\n }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan(`🔀 PR Context — ${analysis.projectName}`));\n console.log(chalk.dim(` Base: ${baseBranch} | Changed: ${prContext.changedFiles.length} files | Deps: ${prContext.dependencies.length}`));\n console.log(chalk.dim(` Total: ~${formatTokens(prContext.totalTokens)} tokens`));\n console.log('');\n\n if (prContext.changedFiles.length === 0) {\n console.log(chalk.dim(' No changes detected against ' + baseBranch));\n return;\n }\n\n console.log(chalk.bold(' Changed files:'));\n for (const f of prContext.changedFiles) {\n const info = prContext.contextFiles.find((c) => c.relativePath === f);\n console.log(` ${chalk.green('+')} ${f}${info ? chalk.dim(` (~${formatTokens(info.tokens)})`) : ''}`);\n }\n\n if (prContext.dependencies.length > 0) {\n console.log('');\n console.log(chalk.bold(' Dependencies (for context):'));\n for (const f of prContext.dependencies.slice(0, 15)) {\n console.log(` ${chalk.dim('→')} ${f}`);\n }\n }\n console.log('');\n\n if (opts.save) {\n const artifactsDir = getArtifactsDir(projectPath);\n await writeText(join(artifactsDir, 'PR-CONTEXT.md'), prContext.generatedContent);\n console.log(chalk.green(` ✓ Saved to artifacts/PR-CONTEXT.md`));\n console.log('');\n }\n });\n","import type { FileInfo, BudgetResult, BudgetFile, PruneLevel } from '../types/index.js';\nimport { pruneFile, getPruneLevelForTier } from './pruning.js';\n\nexport async function optimizeBudget(\n files: FileInfo[],\n budget: number,\n): Promise<BudgetResult> {\n const included: BudgetFile[] = [];\n const excluded: BudgetFile[] = [];\n let usedTokens = 0;\n\n // Sort by priority: hot first (full), then warm (signatures), then cold (skeleton)\n const tierOrder = { hot: 0, warm: 1, cold: 2 };\n const sorted = [...files].sort((a, b) => {\n const tierDiff = tierOrder[a.tier] - tierOrder[b.tier];\n if (tierDiff !== 0) return tierDiff;\n return b.tokens - a.tokens; // within same tier, largest first\n });\n\n for (const file of sorted) {\n const pruneLevel = getPruneLevelForTier(file.tier);\n\n // Try full content first for hot files\n if (file.tier === 'hot') {\n if (usedTokens + file.tokens <= budget) {\n usedTokens += file.tokens;\n included.push(toBudgetFile(file, file.tokens, 'full', true, 'Hot file — included in full'));\n continue;\n }\n // Hot file doesn't fit full — try pruned\n const pruned = await pruneFile(file, 'signatures');\n if (usedTokens + pruned.prunedTokens <= budget) {\n usedTokens += pruned.prunedTokens;\n included.push(toBudgetFile(file, pruned.prunedTokens, 'signatures', true, 'Hot file — pruned to signatures (budget constraint)'));\n continue;\n }\n }\n\n // Warm files: try signatures first\n if (file.tier === 'warm') {\n const pruned = await pruneFile(file, 'signatures');\n if (usedTokens + pruned.prunedTokens <= budget) {\n usedTokens += pruned.prunedTokens;\n included.push(toBudgetFile(file, pruned.prunedTokens, 'signatures', true, 'Warm file — signatures only'));\n continue;\n }\n // Try skeleton\n const skeleton = await pruneFile(file, 'skeleton');\n if (usedTokens + skeleton.prunedTokens <= budget) {\n usedTokens += skeleton.prunedTokens;\n included.push(toBudgetFile(file, skeleton.prunedTokens, 'skeleton', true, 'Warm file — skeleton (budget constraint)'));\n continue;\n }\n }\n\n // Cold files: try skeleton\n if (file.tier === 'cold') {\n const skeleton = await pruneFile(file, 'skeleton');\n if (usedTokens + skeleton.prunedTokens <= budget) {\n usedTokens += skeleton.prunedTokens;\n included.push(toBudgetFile(file, skeleton.prunedTokens, 'skeleton', true, 'Cold file — skeleton only'));\n continue;\n }\n }\n\n // Doesn't fit\n excluded.push(toBudgetFile(file, file.tokens, pruneLevel, false, `Excluded — exceeds budget (${file.tokens} tokens)`));\n }\n\n return {\n budget,\n usedTokens,\n remainingTokens: budget - usedTokens,\n includedFiles: included,\n excludedFiles: excluded,\n fillPercent: budget > 0 ? (usedTokens / budget) * 100 : 0,\n };\n}\n\nfunction toBudgetFile(\n file: FileInfo,\n tokens: number,\n pruneLevel: PruneLevel,\n included: boolean,\n reason: string,\n): BudgetFile {\n return {\n relativePath: file.relativePath,\n tokens,\n tier: file.tier,\n pruneLevel,\n included,\n reason,\n };\n}\n","import { resolve, relative } from 'node:path';\nimport type { FileInfo, PRContext, ProjectAnalysis, DependencyGraph } from '../types/index.js';\nimport { getChangedFiles, isGitRepo } from './git.js';\nimport { execFile } from 'node:child_process';\nimport { promisify } from 'node:util';\n\nconst exec = promisify(execFile);\n\nasync function git(args: string[], cwd: string): Promise<string> {\n try {\n const { stdout } = await exec('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 });\n return stdout.trim();\n } catch {\n return '';\n }\n}\n\nexport async function generatePRContext(\n analysis: ProjectAnalysis,\n baseBranch: string = 'main',\n): Promise<PRContext> {\n const projectPath = resolve(analysis.projectPath);\n\n if (!(await isGitRepo(projectPath))) {\n return emptyPRContext(baseBranch);\n }\n\n // Get files changed between base branch and HEAD\n const diffOutput = await git(['diff', '--name-only', baseBranch, 'HEAD'], projectPath);\n const stagedOutput = await git(['diff', '--name-only', '--cached'], projectPath);\n const untrackedOutput = await git(['diff', '--name-only', 'HEAD'], projectPath);\n\n const changedSet = new Set<string>();\n for (const line of [...diffOutput.split('\\n'), ...stagedOutput.split('\\n'), ...untrackedOutput.split('\\n')]) {\n const f = line.trim();\n if (f) changedSet.add(f);\n }\n\n const changedFiles = Array.from(changedSet);\n\n // Find dependencies of changed files\n const depSet = new Set<string>();\n if (analysis.dependencyGraph) {\n for (const changed of changedFiles) {\n collectDependencies(changed, analysis.dependencyGraph, depSet, 2);\n }\n // Remove the changed files from deps (they're already included)\n for (const f of changedFiles) depSet.delete(f);\n }\n\n const dependencies = Array.from(depSet);\n\n // Collect FileInfo for changed files + dependencies\n const allRelevant = new Set([...changedFiles, ...dependencies]);\n const contextFiles = analysis.files.filter((f) => allRelevant.has(f.relativePath));\n const totalTokens = contextFiles.reduce((s, f) => s + f.tokens, 0);\n\n // Generate context content\n const generatedContent = renderPRContext(analysis, changedFiles, dependencies, contextFiles);\n\n return {\n baseBranch,\n changedFiles,\n dependencies,\n contextFiles,\n totalTokens,\n generatedContent,\n };\n}\n\nfunction collectDependencies(\n file: string,\n graph: DependencyGraph,\n result: Set<string>,\n depth: number,\n): void {\n if (depth <= 0) return;\n\n // Find all files this file imports (edges where from === file)\n const imports = graph.edges\n .filter((e) => e.from === file)\n .map((e) => e.to);\n\n for (const imp of imports) {\n if (!result.has(imp)) {\n result.add(imp);\n collectDependencies(imp, graph, result, depth - 1);\n }\n }\n}\n\nfunction renderPRContext(\n analysis: ProjectAnalysis,\n changedFiles: string[],\n dependencies: string[],\n contextFiles: FileInfo[],\n): string {\n const lines: string[] = [];\n const totalTokens = contextFiles.reduce((s, f) => s + f.tokens, 0);\n\n lines.push(`# PR Context — ${analysis.projectName}`);\n lines.push('');\n lines.push(`> Focused context for code review. ${changedFiles.length} changed files + ${dependencies.length} dependencies.`);\n lines.push('');\n\n lines.push('## Changed Files');\n lines.push('');\n for (const f of changedFiles) {\n const info = contextFiles.find((c) => c.relativePath === f);\n const tokens = info ? `~${Math.round(info.tokens / 1000)}K tokens` : '';\n lines.push(`- \\`${f}\\` ${tokens}`);\n }\n lines.push('');\n\n if (dependencies.length > 0) {\n lines.push('## Dependencies (context)');\n lines.push('');\n for (const f of dependencies) {\n const info = contextFiles.find((c) => c.relativePath === f);\n const tokens = info ? `~${Math.round(info.tokens / 1000)}K tokens` : '';\n lines.push(`- \\`${f}\\` ${tokens}`);\n }\n lines.push('');\n }\n\n lines.push('## Review Guidelines');\n lines.push('');\n lines.push('- Focus on the changed files listed above');\n lines.push('- Dependencies are included for type/interface context only');\n lines.push(`- Total context: ~${Math.round(totalTokens / 1000)}K tokens`);\n\n return lines.join('\\n');\n}\n\nfunction emptyPRContext(baseBranch: string): PRContext {\n return {\n baseBranch,\n changedFiles: [],\n dependencies: [],\n contextFiles: [],\n totalTokens: 0,\n generatedContent: '# No git repository found\\n',\n };\n}\n","import { execFile } from 'node:child_process';\nimport { resolve, relative } from 'node:path';\nimport { promisify } from 'node:util';\nimport type { GitFileInfo, GitContext, Tier, TierThresholds, FileInfo } from '../types/index.js';\n\nconst exec = promisify(execFile);\n\nasync function git(args: string[], cwd: string): Promise<string> {\n try {\n const { stdout } = await exec('git', args, { cwd, maxBuffer: 10 * 1024 * 1024 });\n return stdout.trim();\n } catch {\n return '';\n }\n}\n\nexport async function isGitRepo(projectPath: string): Promise<boolean> {\n const result = await git(['rev-parse', '--is-inside-work-tree'], projectPath);\n return result === 'true';\n}\n\nexport async function getCurrentBranch(projectPath: string): Promise<string> {\n return git(['rev-parse', '--abbrev-ref', 'HEAD'], projectPath);\n}\n\nexport async function getGitContext(\n projectPath: string,\n diffBase?: string,\n): Promise<GitContext> {\n const absPath = resolve(projectPath);\n const isRepo = await isGitRepo(absPath);\n\n if (!isRepo) {\n return {\n branch: '',\n isGitRepo: false,\n changedFiles: [],\n recentCommits: 0,\n activeDevelopers: [],\n };\n }\n\n const branch = await getCurrentBranch(absPath);\n const changedFiles = await getChangedFiles(absPath, diffBase);\n const recentCommits = await getRecentCommitCount(absPath, 14);\n const activeDevelopers = await getActiveDevelopers(absPath, 14);\n\n return {\n branch,\n isGitRepo: true,\n changedFiles,\n recentCommits,\n activeDevelopers,\n };\n}\n\nexport async function getChangedFiles(\n projectPath: string,\n diffBase?: string,\n): Promise<GitFileInfo[]> {\n const absPath = resolve(projectPath);\n const files: GitFileInfo[] = [];\n\n // Uncommitted changes (staged + unstaged)\n const diffOutput = await git(['diff', '--name-only', 'HEAD'], absPath);\n const stagedOutput = await git(['diff', '--name-only', '--cached'], absPath);\n const untrackedOutput = await git(['ls-files', '--others', '--exclude-standard'], absPath);\n\n const changedSet = new Set<string>();\n\n for (const line of [...diffOutput.split('\\n'), ...stagedOutput.split('\\n'), ...untrackedOutput.split('\\n')]) {\n const f = line.trim();\n if (f) changedSet.add(f);\n }\n\n // If diffBase provided, also get changes between base and HEAD\n if (diffBase) {\n const baseOutput = await git(['diff', '--name-only', diffBase, 'HEAD'], absPath);\n for (const line of baseOutput.split('\\n')) {\n const f = line.trim();\n if (f) changedSet.add(f);\n }\n }\n\n for (const relativePath of changedSet) {\n const info = await getFileGitInfo(absPath, relativePath);\n if (info) files.push(info);\n }\n\n return files.sort((a, b) => b.linesChanged - a.linesChanged);\n}\n\nexport async function getFileGitInfo(\n projectPath: string,\n relativePath: string,\n): Promise<GitFileInfo | null> {\n const absPath = resolve(projectPath);\n\n // Last commit date + author\n const logOutput = await git(\n ['log', '-1', '--format=%aI|%an', '--', relativePath],\n absPath,\n );\n\n let lastCommitDate = new Date();\n let lastAuthor = 'unknown';\n if (logOutput) {\n const [date, author] = logOutput.split('|');\n lastCommitDate = new Date(date);\n lastAuthor = author ?? 'unknown';\n }\n\n // Commit count\n const countOutput = await git(\n ['rev-list', '--count', 'HEAD', '--', relativePath],\n absPath,\n );\n const commitCount = parseInt(countOutput, 10) || 0;\n\n // Is new (untracked)?\n const untrackedOutput = await git(['ls-files', '--others', '--exclude-standard', '--', relativePath], absPath);\n const isNewFile = untrackedOutput.trim() === relativePath;\n\n // Lines changed (diff stat)\n const statOutput = await git(['diff', '--numstat', 'HEAD', '--', relativePath], absPath);\n let linesChanged = 0;\n if (statOutput) {\n const parts = statOutput.split('\\t');\n linesChanged = (parseInt(parts[0], 10) || 0) + (parseInt(parts[1], 10) || 0);\n }\n\n // Is in current diff\n const diffCheck = await git(['diff', '--name-only', 'HEAD', '--', relativePath], absPath);\n const isInDiff = diffCheck.trim().length > 0 || isNewFile;\n\n return {\n relativePath,\n lastCommitDate,\n lastAuthor,\n commitCount,\n isInDiff,\n isNewFile,\n linesChanged,\n };\n}\n\nexport async function getRecentCommitCount(projectPath: string, days: number): Promise<number> {\n const since = new Date();\n since.setDate(since.getDate() - days);\n const output = await git(\n ['rev-list', '--count', '--since', since.toISOString(), 'HEAD'],\n resolve(projectPath),\n );\n return parseInt(output, 10) || 0;\n}\n\nexport async function getActiveDevelopers(projectPath: string, days: number): Promise<string[]> {\n const since = new Date();\n since.setDate(since.getDate() - days);\n const output = await git(\n ['log', '--since', since.toISOString(), '--format=%an'],\n resolve(projectPath),\n );\n if (!output) return [];\n const authors = new Set(output.split('\\n').map((a) => a.trim()).filter(Boolean));\n return Array.from(authors);\n}\n\nexport function classifyFileWithGit(\n file: FileInfo,\n gitInfo: GitFileInfo | undefined,\n thresholds: TierThresholds,\n): Tier {\n // If file is in the current diff → always hot\n if (gitInfo?.isInDiff) return 'hot';\n\n // If it's a new untracked file → hot\n if (gitInfo?.isNewFile) return 'hot';\n\n // Use git commit date instead of mtime for more accurate tiering\n const referenceDate = gitInfo?.lastCommitDate ?? file.lastModified;\n const date = referenceDate instanceof Date ? referenceDate : new Date(referenceDate);\n const now = new Date();\n const diffDays = (now.getTime() - date.getTime()) / (1000 * 60 * 60 * 24);\n\n if (diffDays <= thresholds.hotDays) return 'hot';\n if (diffDays <= thresholds.warmDays) return 'warm';\n\n // Files with many commits are more important\n if (gitInfo && gitInfo.commitCount >= 20 && diffDays <= thresholds.warmDays * 2) {\n return 'warm';\n }\n\n return 'cold';\n}\n\nexport async function enrichFilesWithGit(\n files: FileInfo[],\n projectPath: string,\n thresholds: TierThresholds,\n): Promise<FileInfo[]> {\n const isRepo = await isGitRepo(projectPath);\n if (!isRepo) return files;\n\n const gitContext = await getGitContext(projectPath);\n const gitMap = new Map(gitContext.changedFiles.map((f) => [f.relativePath, f]));\n\n return files.map((file) => {\n const gitInfo = gitMap.get(file.relativePath);\n const gitTier = classifyFileWithGit(file, gitInfo, thresholds);\n\n // Git tier can only promote, never demote\n const promotedTier = promoteTier(file.tier, gitTier);\n\n return {\n ...file,\n tier: promotedTier,\n };\n });\n}\n\nfunction promoteTier(current: Tier, candidate: Tier): Tier {\n const order: Record<Tier, number> = { hot: 0, warm: 1, cold: 2 };\n return order[candidate] < order[current] ? candidate : current;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { loadProjectConfig } from '../../core/config.js';\nimport { generateForTarget, generateForAllTargets, ALL_AI_TARGETS } from '../../core/adapters.js';\nimport { sanitizeContent } from '../../core/security.js';\nimport { getArtifactsDir } from '../../utils/paths.js';\nimport { writeText } from '../../utils/fs.js';\nimport type { AITarget, TaskType } from '../../types/index.js';\nimport { ALL_TASK_TYPES } from '../../core/routing.js';\n\nexport const multiGenCommand = new Command('multi-gen')\n .description('Generate context files for multiple AI tools (Claude, Cursor, Copilot, Gemini, Windsurf)');\n\nmultiGenCommand\n .command('generate')\n .description('Generate context for one or all AI targets')\n .argument('[path]', 'Project path', '.')\n .option('-t, --target <target>', 'AI target (claude, cursor, copilot, gemini, windsurf, all)', 'all')\n .option('--save', 'Save to artifacts directory')\n .option('--enhanced', 'Add prompt engineering enhancements (role priming, CoT, constraints)')\n .option('--task <task>', 'Task type for task-specific prompts (debug, review, refactor, test, feature, etc.)')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { target?: string; save?: boolean; enhanced?: boolean; task?: string; json?: boolean }) => {\n const projectPath = resolve(path);\n const config = await loadProjectConfig(projectPath);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const targetArg = opts.target ?? 'all';\n const enhanced = opts.enhanced ?? false;\n const task = opts.task as TaskType | undefined;\n\n if (task && !ALL_TASK_TYPES.includes(task)) {\n console.log(chalk.red(`Unknown task: ${task}. Available: ${ALL_TASK_TYPES.join(', ')}`));\n process.exit(1);\n }\n\n if (targetArg === 'all') {\n const results = generateForAllTargets(analysis, config, { enhanced, task });\n\n if (opts.json) {\n console.log(JSON.stringify(results.map((r) => ({\n target: r.target,\n fileName: r.fileName,\n contentLength: r.content.length,\n })), null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan(`🤖 Multi-AI Generator${enhanced ? ' (Enhanced)' : ''}`));\n if (enhanced) console.log(chalk.dim(` Prompt engineering: role priming, chain-of-thought, constraints${task ? `, task: ${task}` : ''}`));\n console.log('');\n\n for (const r of results) {\n const sanitized = sanitizeContent(r.content);\n const tokens = Math.ceil(sanitized.length / 4);\n console.log(` ${getIcon(r.target)} ${chalk.bold(r.target.padEnd(8))} → ${r.fileName.padEnd(28)} ~${Math.round(tokens / 1000)}K tokens`);\n\n if (opts.save) {\n const artifactsDir = getArtifactsDir(projectPath);\n await writeText(join(artifactsDir, r.fileName), sanitized);\n }\n }\n\n console.log('');\n if (opts.save) {\n console.log(chalk.green(' ✓ All files saved to artifacts/'));\n } else {\n console.log(chalk.dim(' Add --save to write files to artifacts/'));\n }\n console.log('');\n } else {\n if (!ALL_AI_TARGETS.includes(targetArg as AITarget)) {\n console.log(chalk.red(`Unknown target: ${targetArg}. Use: ${ALL_AI_TARGETS.join(', ')}`));\n process.exit(1);\n }\n\n const result = generateForTarget(targetArg as AITarget, analysis, config, { enhanced, task });\n const sanitized = sanitizeContent(result.content);\n\n if (opts.json) {\n console.log(JSON.stringify({ target: targetArg, fileName: result.fileName, content: sanitized }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan(`🤖 ${targetArg} — ${result.fileName}`));\n console.log('');\n console.log(sanitized);\n console.log('');\n\n if (opts.save) {\n const artifactsDir = getArtifactsDir(projectPath);\n await writeText(join(artifactsDir, result.fileName), sanitized);\n console.log(chalk.green(` ✓ Saved to artifacts/${result.fileName}`));\n console.log('');\n }\n }\n });\n\nmultiGenCommand\n .command('list')\n .description('Show available AI targets')\n .action(() => {\n console.log('');\n console.log(chalk.bold.cyan('🤖 Available AI Targets'));\n console.log('');\n console.log(` ${getIcon('claude')} claude → CLAUDE.md (Claude Code / Claude)`);\n console.log(` ${getIcon('cursor')} cursor → .cursorrules (Cursor IDE)`);\n console.log(` ${getIcon('copilot')} copilot → copilot-instructions.md (GitHub Copilot)`);\n console.log(` ${getIcon('gemini')} gemini → GEMINI.md (Google Gemini)`);\n console.log(` ${getIcon('windsurf')} windsurf → .windsurfrules (Windsurf / Cascade)`);\n console.log('');\n });\n\nfunction getIcon(target: AITarget): string {\n switch (target) {\n case 'claude': return '🟠';\n case 'cursor': return '🟣';\n case 'copilot': return '🔵';\n case 'gemini': return '🟢';\n case 'windsurf': return '🌊';\n }\n}\n","import type { ProjectAnalysis, TaskType, AITarget, FileInfo } from '../types/index.js';\nimport { detectStack, detectTestFramework } from './analyzer.js';\n\n// --- Prompt Engineering Techniques ---\n// Based on proven patterns: role priming, chain-of-thought, constraints,\n// structured output, anti-hallucination, and task-specific instructions.\n\nexport interface EnhancedPromptOptions {\n task?: TaskType;\n stack?: string[];\n testFramework?: string | null;\n hotFiles?: FileInfo[];\n totalTokens?: number;\n enableCoT?: boolean; // chain-of-thought\n enableConstraints?: boolean; // safety constraints\n enableAntiHallucination?: boolean;\n locale?: 'en' | 'es';\n}\n\nconst DEFAULT_OPTIONS: Required<Omit<EnhancedPromptOptions, 'task' | 'stack' | 'testFramework' | 'hotFiles' | 'totalTokens' | 'locale'>> = {\n enableCoT: true,\n enableConstraints: true,\n enableAntiHallucination: true,\n};\n\n// ========== ROLE PRIMING ==========\n\nexport function buildRolePriming(stack: string[]): string {\n const stackStr = stack.length > 0 ? stack.join(', ') : 'software';\n return `You are a senior ${stackStr} engineer with deep expertise in clean architecture, testing, and production-quality code. You prioritize correctness, readability, and maintainability.`;\n}\n\n// ========== CHAIN OF THOUGHT ==========\n\nexport function buildChainOfThought(task?: TaskType): string {\n const lines: string[] = [];\n lines.push('## Thinking Process');\n lines.push('');\n lines.push('Before writing any code:');\n\n if (task === 'debug') {\n lines.push('1. **Reproduce** — Understand the exact symptom and when it occurs');\n lines.push('2. **Hypothesize** — List the most likely root causes (max 3)');\n lines.push('3. **Verify** — Check each hypothesis against the code');\n lines.push('4. **Fix** — Apply the minimal fix that addresses the root cause');\n lines.push('5. **Validate** — Explain why the fix works and what edge cases it covers');\n } else if (task === 'review') {\n lines.push('1. **Understand** — Read the code and understand its purpose');\n lines.push('2. **Assess** — Evaluate correctness, readability, performance, security');\n lines.push('3. **Prioritize** — Rank issues by severity (critical > major > minor > nitpick)');\n lines.push('4. **Suggest** — Provide concrete, actionable improvements with code examples');\n } else if (task === 'refactor') {\n lines.push('1. **Analyze** — Identify code smells and structural issues');\n lines.push('2. **Plan** — Define the target structure before changing anything');\n lines.push('3. **Preserve** — Ensure behavior doesn\\'t change (no functional modifications)');\n lines.push('4. **Refactor** — Apply changes incrementally, one pattern at a time');\n lines.push('5. **Verify** — Confirm all existing tests still pass');\n } else if (task === 'test') {\n lines.push('1. **Identify** — What needs testing? (happy path, edge cases, errors)');\n lines.push('2. **Structure** — Use AAA pattern: Arrange, Act, Assert');\n lines.push('3. **Cover** — Test boundaries, null/undefined, async errors, type edges');\n lines.push('4. **Isolate** — Mock external dependencies, test units independently');\n lines.push('5. **Name** — Use descriptive test names: \"should [expected] when [condition]\"');\n } else if (task === 'feature') {\n lines.push('1. **Clarify** — Restate the requirement in your own words');\n lines.push('2. **Design** — Plan the approach before coding (types, interfaces, flow)');\n lines.push('3. **Implement** — Build incrementally, starting with types and interfaces');\n lines.push('4. **Test** — Write tests alongside implementation');\n lines.push('5. **Integrate** — Ensure it works with existing code without regressions');\n } else if (task === 'architecture') {\n lines.push('1. **Context** — Understand current architecture and constraints');\n lines.push('2. **Options** — Present 2-3 viable approaches with trade-offs');\n lines.push('3. **Recommend** — Choose the best option and explain why');\n lines.push('4. **Plan** — Define migration steps if changing existing architecture');\n lines.push('5. **Risks** — Identify risks and mitigation strategies');\n } else {\n lines.push('1. **Understand** — Read the relevant code before making changes');\n lines.push('2. **Plan** — Think about the approach before writing code');\n lines.push('3. **Implement** — Write clean, well-typed code');\n lines.push('4. **Verify** — Check for edge cases and potential issues');\n }\n\n return lines.join('\\n');\n}\n\n// ========== CONSTRAINTS ==========\n\nexport function buildConstraints(stack: string[], testFramework: string | null): string {\n const lines: string[] = [];\n lines.push('## Constraints');\n lines.push('');\n lines.push('- **Do NOT** delete or modify existing tests unless explicitly asked');\n lines.push('- **Do NOT** change function signatures that are part of the public API');\n lines.push('- **Do NOT** introduce new dependencies without mentioning it');\n lines.push('- **Always** handle errors explicitly (no silent catches)');\n lines.push('- **Always** preserve existing code style and conventions');\n lines.push('- **Prefer** minimal changes — smallest diff that solves the problem');\n\n if (stack.includes('TypeScript')) {\n lines.push('- **Always** use strict TypeScript types (no `any` unless unavoidable)');\n lines.push('- **Prefer** `interface` for object shapes, `type` for unions/intersections');\n lines.push('- **Use** named exports over default exports');\n }\n\n if (stack.includes('React') || stack.includes('Next.js')) {\n lines.push('- **Use** functional components with hooks (no class components)');\n lines.push('- **Prefer** composition over prop drilling');\n }\n\n if (stack.includes('Python')) {\n lines.push('- **Follow** PEP 8 and use type hints');\n lines.push('- **Use** f-strings over .format() or % formatting');\n }\n\n if (testFramework) {\n lines.push(`- **Tests** use ${testFramework} — follow existing test patterns`);\n lines.push('- **Run** tests after changes to verify nothing breaks');\n }\n\n return lines.join('\\n');\n}\n\n// ========== ANTI-HALLUCINATION ==========\n\nexport function buildAntiHallucination(): string {\n const lines: string[] = [];\n lines.push('## Important');\n lines.push('');\n lines.push('- If you are unsure about something, **ask before proceeding**');\n lines.push('- Do not invent APIs, functions, or types that don\\'t exist in the codebase');\n lines.push('- If you need to read a file to answer correctly, say so');\n lines.push('- Prefer showing a concrete code snippet over a vague description');\n lines.push('- If a task is ambiguous, state your assumptions explicitly');\n\n return lines.join('\\n');\n}\n\n// ========== OUTPUT FORMAT ==========\n\nexport function buildOutputFormat(task?: TaskType): string {\n const lines: string[] = [];\n lines.push('## Response Format');\n lines.push('');\n\n if (task === 'debug') {\n lines.push('1. **Root cause**: One sentence explaining the bug');\n lines.push('2. **Fix**: The code change with explanation');\n lines.push('3. **Test**: How to verify the fix works');\n } else if (task === 'review') {\n lines.push('For each issue found:');\n lines.push('- **Severity**: critical | major | minor | nitpick');\n lines.push('- **Location**: file:line');\n lines.push('- **Issue**: What\\'s wrong');\n lines.push('- **Fix**: Suggested code change');\n } else if (task === 'refactor') {\n lines.push('1. **Before/After**: Show the structural change clearly');\n lines.push('2. **Why**: Explain the improvement');\n lines.push('3. **Risk**: Any behavior changes to watch for');\n } else {\n lines.push('- Start with a brief summary of what you\\'ll do');\n lines.push('- Show code changes with context (surrounding lines)');\n lines.push('- Explain non-obvious decisions');\n }\n\n return lines.join('\\n');\n}\n\n// ========== FILE PRIORITY ==========\n\nexport function buildFilePriority(hotFiles: FileInfo[]): string {\n if (hotFiles.length === 0) return '';\n\n const lines: string[] = [];\n lines.push('## Priority Files');\n lines.push('');\n lines.push('Read these files first — they are the most active and relevant:');\n lines.push('');\n\n for (const f of hotFiles.slice(0, 20)) {\n const tokens = f.tokens > 1000 ? `~${Math.round(f.tokens / 1000)}K` : `~${f.tokens}`;\n lines.push(`- \\`${f.relativePath}\\` (${tokens} tokens)`);\n }\n\n return lines.join('\\n');\n}\n\n// ========== FULL ENHANCED PROMPT ==========\n\nexport function buildEnhancedPrompt(\n analysis: ProjectAnalysis,\n opts: EnhancedPromptOptions = {},\n): string {\n const options = { ...DEFAULT_OPTIONS, ...opts };\n const stack = opts.stack ?? detectStack(analysis.files);\n const testFramework = opts.testFramework ?? detectTestFramework(analysis.files);\n const hotFiles = opts.hotFiles ?? analysis.files.filter((f) => f.tier === 'hot');\n\n const sections: string[] = [];\n\n // Header\n sections.push(`# ${analysis.projectName} — AI Context`);\n sections.push('');\n sections.push(`> Generated by CTO v1.3.0 with prompt engineering enhancements.`);\n sections.push('');\n\n // Role priming\n sections.push(buildRolePriming(stack));\n sections.push('');\n\n // Project overview\n sections.push('## Project Overview');\n sections.push('');\n sections.push(`| Property | Value |`);\n sections.push(`|----------|-------|`);\n sections.push(`| Stack | ${stack.join(', ') || 'Unknown'} |`);\n if (testFramework) sections.push(`| Tests | ${testFramework} |`);\n sections.push(`| Files | ${analysis.totalFiles} (${hotFiles.length} hot) |`);\n sections.push(`| Tokens | ~${Math.round(analysis.totalTokens / 1000)}K |`);\n sections.push('');\n\n // Priority files\n const filePriority = buildFilePriority(hotFiles);\n if (filePriority) {\n sections.push(filePriority);\n sections.push('');\n }\n\n // Chain of thought\n if (options.enableCoT) {\n sections.push(buildChainOfThought(opts.task));\n sections.push('');\n }\n\n // Constraints\n if (options.enableConstraints) {\n sections.push(buildConstraints(stack, testFramework));\n sections.push('');\n }\n\n // Output format\n if (opts.task) {\n sections.push(buildOutputFormat(opts.task));\n sections.push('');\n }\n\n // Anti-hallucination\n if (options.enableAntiHallucination) {\n sections.push(buildAntiHallucination());\n sections.push('');\n }\n\n return sections.join('\\n');\n}\n\n// ========== TASK-SPECIFIC PROMPT BLOCKS ==========\n\nexport function getTaskPromptBlock(task: TaskType): string {\n const blocks: Record<TaskType, string> = {\n 'debug': [\n '## Debug Instructions',\n '',\n 'You are debugging an issue. Follow this approach:',\n '- Read the error message/symptom carefully',\n '- Trace the data flow from input to the point of failure',\n '- Check for: null/undefined, type mismatches, async race conditions, off-by-one errors',\n '- Fix the ROOT CAUSE, not the symptom',\n '- Add a regression test if possible',\n ].join('\\n'),\n\n 'review': [\n '## Code Review Instructions',\n '',\n 'Review this code with focus on:',\n '- **Correctness**: Does it do what it claims? Edge cases?',\n '- **Security**: Input validation, injection risks, secrets exposure',\n '- **Performance**: N+1 queries, unnecessary iterations, memory leaks',\n '- **Readability**: Clear naming, appropriate abstractions, documentation',\n '- **Testing**: Adequate coverage, meaningful assertions',\n '',\n 'Rate each issue: 🔴 Critical | 🟠 Major | 🟡 Minor | ⚪ Nitpick',\n ].join('\\n'),\n\n 'refactor': [\n '## Refactor Instructions',\n '',\n 'Refactor for better structure WITHOUT changing behavior:',\n '- Extract common logic into reusable functions',\n '- Replace magic numbers/strings with named constants',\n '- Simplify complex conditionals',\n '- Apply SOLID principles where beneficial (don\\'t over-engineer)',\n '- Keep the diff as small as possible',\n '- Verify all tests pass after refactoring',\n ].join('\\n'),\n\n 'test': [\n '## Testing Instructions',\n '',\n 'Write comprehensive tests:',\n '- **Happy path**: Normal expected usage',\n '- **Edge cases**: Empty inputs, boundaries, large data',\n '- **Error cases**: Invalid inputs, network failures, permissions',\n '- **Async**: Race conditions, timeout handling',\n '',\n 'Structure: describe(\"module\") > describe(\"function\") > it(\"should...\")',\n 'Use AAA: Arrange (setup) → Act (execute) → Assert (verify)',\n ].join('\\n'),\n\n 'docs': [\n '## Documentation Instructions',\n '',\n '- Use clear, concise language',\n '- Include code examples for every API/function documented',\n '- Document parameters, return types, and exceptions',\n '- Add a \"Quick Start\" section for new users',\n '- Include troubleshooting for common issues',\n ].join('\\n'),\n\n 'simple-edit': [\n '## Simple Edit',\n '',\n '- Make the minimum change necessary',\n '- Do not refactor surrounding code',\n '- Preserve existing style exactly',\n ].join('\\n'),\n\n 'feature': [\n '## Feature Development Instructions',\n '',\n 'Build this feature following this order:',\n '1. Define types/interfaces first',\n '2. Implement core logic with proper error handling',\n '3. Write tests alongside implementation',\n '4. Integrate with existing modules',\n '5. Update exports and any relevant documentation',\n '',\n 'Ensure backward compatibility — existing tests must still pass.',\n ].join('\\n'),\n\n 'architecture': [\n '## Architecture Decision',\n '',\n 'Analyze the architectural question by providing:',\n '1. **Current state**: How things work now',\n '2. **Options**: At least 2-3 approaches with pros/cons table',\n '3. **Recommendation**: Your pick with justification',\n '4. **Migration path**: Steps to get from current → proposed',\n '5. **Risks**: What could go wrong and how to mitigate',\n '',\n 'Consider: scalability, maintainability, team familiarity, testing impact.',\n ].join('\\n'),\n };\n\n return blocks[task];\n}\n","import type { ProjectAnalysis, CTOConfig, AITarget, AIAdapter, FileInfo, TaskType } from '../types/index.js';\nimport { detectStack, detectTestFramework } from './analyzer.js';\nimport { buildEnhancedPrompt, getTaskPromptBlock } from './prompt-engineer.js';\n\n// --- Claude adapter (existing format) ---\n\nfunction generateClaude(analysis: ProjectAnalysis, config: CTOConfig): string {\n const lines: string[] = [];\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const warm = analysis.files.filter((f) => f.tier === 'warm');\n\n lines.push(`# CLAUDE.md — ${analysis.projectName}`);\n lines.push('');\n lines.push('## Project Overview');\n lines.push('');\n lines.push(`- **Stack:** ${detectStack(analysis.files).join(', ') || 'Unknown'}`);\n lines.push(`- **Files:** ${analysis.totalFiles} (${hot.length} hot, ${warm.length} warm)`);\n lines.push(`- **Tokens:** ~${Math.round(analysis.totalTokens / 1000)}K total`);\n lines.push('');\n lines.push('## Priority Files (read first)');\n lines.push('');\n for (const f of hot.slice(0, 20)) {\n lines.push(`- \\`${f.relativePath}\\` (~${Math.round(f.tokens / 1000)}K tokens)`);\n }\n lines.push('');\n lines.push('## Guidelines');\n lines.push('');\n lines.push('- Read hot-tier files first for full context');\n lines.push('- Warm files can be read on demand');\n lines.push('- Cold files are rarely needed');\n\n return lines.join('\\n');\n}\n\n// --- Cursor adapter (.cursorrules) ---\n\nfunction generateCursor(analysis: ProjectAnalysis, config: CTOConfig): string {\n const lines: string[] = [];\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const stack = detectStack(analysis.files);\n const testFw = detectTestFramework(analysis.files);\n\n lines.push('# Cursor Rules — Generated by CTO');\n lines.push('');\n lines.push('## Project Context');\n lines.push('');\n lines.push(`This is a ${stack.join(', ')} project with ${analysis.totalFiles} files.`);\n if (testFw) lines.push(`Test framework: ${testFw}`);\n lines.push('');\n lines.push('## Key Files');\n lines.push('');\n lines.push('Always reference these files for context:');\n lines.push('');\n for (const f of hot.slice(0, 15)) {\n lines.push(`- ${f.relativePath}`);\n }\n lines.push('');\n lines.push('## Code Style');\n lines.push('');\n if (stack.includes('TypeScript')) {\n lines.push('- Use TypeScript with strict types');\n lines.push('- Prefer interfaces over type aliases for object shapes');\n lines.push('- Use named exports');\n }\n if (stack.includes('React') || stack.includes('Next.js')) {\n lines.push('- Use functional components with hooks');\n lines.push('- Prefer composition over inheritance');\n }\n if (stack.includes('Python')) {\n lines.push('- Follow PEP 8');\n lines.push('- Use type hints');\n }\n lines.push('');\n lines.push('## File Organization');\n lines.push('');\n const dirs = [...new Set(analysis.files.map((f) => f.relativePath.split('/')[0]))].slice(0, 10);\n for (const dir of dirs) {\n const count = analysis.files.filter((f) => f.relativePath.startsWith(dir + '/')).length;\n if (count > 0) lines.push(`- \\`${dir}/\\` — ${count} files`);\n }\n\n return lines.join('\\n');\n}\n\n// --- GitHub Copilot adapter ---\n\nfunction generateCopilot(analysis: ProjectAnalysis, config: CTOConfig): string {\n const lines: string[] = [];\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const stack = detectStack(analysis.files);\n const testFw = detectTestFramework(analysis.files);\n\n lines.push('# Copilot Instructions — Generated by CTO');\n lines.push('');\n lines.push('## Context');\n lines.push('');\n lines.push(`This is a ${stack.join(', ')} project.`);\n lines.push(`Total files: ${analysis.totalFiles}. Focus on the ${hot.length} most active files.`);\n lines.push('');\n lines.push('## Important Files');\n lines.push('');\n for (const f of hot.slice(0, 15)) {\n lines.push(`- \\`${f.relativePath}\\``);\n }\n lines.push('');\n lines.push('## Conventions');\n lines.push('');\n if (stack.includes('TypeScript')) {\n lines.push('- All code must be TypeScript');\n lines.push('- Use ESM imports (import/export)');\n lines.push('- Strict null checks enabled');\n }\n if (testFw) {\n lines.push(`- Tests use ${testFw}`);\n lines.push('- Write tests for all new functions');\n }\n lines.push('');\n lines.push('## Architecture');\n lines.push('');\n const topDirs = [...new Set(analysis.files.map((f) => f.relativePath.split('/')[0]))].slice(0, 8);\n for (const dir of topDirs) {\n const dirFiles = analysis.files.filter((f) => f.relativePath.startsWith(dir + '/'));\n if (dirFiles.length > 0) {\n lines.push(`- \\`${dir}/\\` — ${dirFiles.length} files, ~${Math.round(dirFiles.reduce((s, f) => s + f.tokens, 0) / 1000)}K tokens`);\n }\n }\n\n return lines.join('\\n');\n}\n\n// --- Gemini adapter ---\n\nfunction generateGemini(analysis: ProjectAnalysis, config: CTOConfig): string {\n const lines: string[] = [];\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const warm = analysis.files.filter((f) => f.tier === 'warm');\n const stack = detectStack(analysis.files);\n\n lines.push('# GEMINI.md — Project Context');\n lines.push('');\n lines.push('## Overview');\n lines.push('');\n lines.push(`| Property | Value |`);\n lines.push(`|----------|-------|`);\n lines.push(`| Stack | ${stack.join(', ')} |`);\n lines.push(`| Total Files | ${analysis.totalFiles} |`);\n lines.push(`| Hot Files | ${hot.length} |`);\n lines.push(`| Warm Files | ${warm.length} |`);\n lines.push(`| Total Tokens | ~${Math.round(analysis.totalTokens / 1000)}K |`);\n lines.push('');\n lines.push('## Priority Files');\n lines.push('');\n lines.push('Read these files first for full project understanding:');\n lines.push('');\n for (const f of hot.slice(0, 20)) {\n lines.push(`1. \\`${f.relativePath}\\` — ${f.tier} tier, ~${Math.round(f.tokens / 1000)}K tokens`);\n }\n lines.push('');\n lines.push('## Project Structure');\n lines.push('');\n const topDirs = [...new Set(analysis.files.map((f) => f.relativePath.split('/')[0]))].slice(0, 10);\n for (const dir of topDirs) {\n const count = analysis.files.filter((f) => f.relativePath.startsWith(dir + '/')).length;\n if (count > 0) lines.push(`- **${dir}/** — ${count} files`);\n }\n\n return lines.join('\\n');\n}\n\n// --- Windsurf (Cascade) adapter ---\n\nfunction generateWindsurf(analysis: ProjectAnalysis, config: CTOConfig): string {\n const lines: string[] = [];\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const warm = analysis.files.filter((f) => f.tier === 'warm');\n const stack = detectStack(analysis.files);\n const testFw = detectTestFramework(analysis.files);\n\n lines.push('# Windsurf Rules — Project Context');\n lines.push('');\n lines.push(`You are working on **${analysis.projectName}**, a ${stack.join(', ') || 'software'} project.`);\n lines.push('');\n lines.push('## Project Overview');\n lines.push('');\n lines.push(`| Property | Value |`);\n lines.push(`|----------|-------|`);\n lines.push(`| Stack | ${stack.join(', ')} |`);\n if (testFw) lines.push(`| Tests | ${testFw} |`);\n lines.push(`| Files | ${analysis.totalFiles} (${hot.length} hot, ${warm.length} warm) |`);\n lines.push(`| Tokens | ~${Math.round(analysis.totalTokens / 1000)}K |`);\n lines.push('');\n lines.push('## Priority Files');\n lines.push('');\n lines.push('Read these files first — they are actively being worked on:');\n lines.push('');\n for (const f of hot.slice(0, 20)) {\n lines.push(`- \\`${f.relativePath}\\` (~${Math.round(f.tokens / 1000)}K tokens)`);\n }\n lines.push('');\n lines.push('## Guidelines');\n lines.push('');\n lines.push('- Read hot-tier files first for full context');\n lines.push('- Warm files can be read on demand');\n lines.push('- Cold files are rarely needed — skip unless specifically asked');\n lines.push('- Prefer minimal changes that solve the problem');\n lines.push('- Always preserve existing code style and conventions');\n if (testFw) {\n lines.push(`- Tests use ${testFw} — run tests after changes`);\n }\n lines.push('');\n lines.push('## Architecture');\n lines.push('');\n const topDirs = [...new Set(analysis.files.map((f) => f.relativePath.split('/')[0]))].slice(0, 10);\n for (const dir of topDirs) {\n const dirFiles = analysis.files.filter((f) => f.relativePath.startsWith(dir + '/'));\n if (dirFiles.length > 0) {\n lines.push(`- \\`${dir}/\\` — ${dirFiles.length} files, ~${Math.round(dirFiles.reduce((s, f) => s + f.tokens, 0) / 1000)}K tokens`);\n }\n }\n\n return lines.join('\\n');\n}\n\n// --- Registry ---\n\nexport const AI_ADAPTERS: Record<AITarget, AIAdapter> = {\n claude: { target: 'claude', fileName: 'CLAUDE.md', generate: generateClaude },\n cursor: { target: 'cursor', fileName: '.cursorrules', generate: generateCursor },\n copilot: { target: 'copilot', fileName: 'copilot-instructions.md', generate: generateCopilot },\n gemini: { target: 'gemini', fileName: 'GEMINI.md', generate: generateGemini },\n windsurf: { target: 'windsurf', fileName: '.windsurfrules', generate: generateWindsurf },\n};\n\nexport const ALL_AI_TARGETS: AITarget[] = ['claude', 'cursor', 'copilot', 'gemini', 'windsurf'];\n\nexport function generateForTarget(\n target: AITarget,\n analysis: ProjectAnalysis,\n config: CTOConfig,\n options?: { enhanced?: boolean; task?: TaskType },\n): { fileName: string; content: string } {\n const adapter = AI_ADAPTERS[target];\n let content = adapter.generate(analysis, config);\n\n if (options?.enhanced) {\n const enhanced = buildEnhancedPrompt(analysis, { task: options.task });\n content = enhanced;\n\n // Append task-specific block if task provided\n if (options.task) {\n content += '\\n' + getTaskPromptBlock(options.task) + '\\n';\n }\n }\n\n return {\n fileName: adapter.fileName,\n content,\n };\n}\n\nexport function generateForAllTargets(\n analysis: ProjectAnalysis,\n config: CTOConfig,\n options?: { enhanced?: boolean; task?: TaskType },\n): Array<{ target: AITarget; fileName: string; content: string }> {\n return ALL_AI_TARGETS.map((target) => ({\n target,\n ...generateForTarget(target, analysis, config, options),\n }));\n}\n","import type {\n TaskType, ModelPreference, ModelRecommendation, RoutingRule,\n FileInfo, ProjectAnalysis,\n} from '../types/index.js';\nimport { estimateCost } from './costs.js';\n\nexport const ROUTING_RULES: RoutingRule[] = [\n // Simple tasks → Haiku (cheapest)\n { task: 'simple-edit', maxComplexity: 10, maxFiles: 3, defaultModel: 'haiku' },\n { task: 'docs', maxComplexity: 5, maxFiles: 5, defaultModel: 'haiku' },\n { task: 'test', maxComplexity: 20, maxFiles: 10, defaultModel: 'haiku' },\n\n // Moderate tasks → Sonnet (balanced)\n { task: 'debug', maxComplexity: 30, maxFiles: 10, defaultModel: 'sonnet' },\n { task: 'review', maxComplexity: 40, maxFiles: 20, defaultModel: 'sonnet' },\n { task: 'refactor', maxComplexity: 30, maxFiles: 15, defaultModel: 'sonnet' },\n\n // Complex tasks → Opus (best reasoning)\n { task: 'feature', maxComplexity: 50, maxFiles: 30, defaultModel: 'sonnet' },\n { task: 'architecture', maxComplexity: 100, maxFiles: 50, defaultModel: 'opus' },\n];\n\nexport const ALL_TASK_TYPES: TaskType[] = [\n 'simple-edit', 'docs', 'test', 'debug', 'review', 'refactor', 'feature', 'architecture',\n];\n\nexport function recommendModel(\n task: TaskType,\n analysis: ProjectAnalysis,\n targetFiles?: string[],\n): ModelRecommendation {\n const rule = ROUTING_RULES.find((r) => r.task === task)!;\n\n // Determine affected files\n const relevantFiles = targetFiles\n ? analysis.files.filter((f) => targetFiles.some((t) => f.relativePath.includes(t)))\n : analysis.files.filter((f) => f.tier === 'hot');\n\n // Calculate complexity metrics\n const avgComplexity = getAvgComplexity(relevantFiles);\n const fileCount = relevantFiles.length;\n const totalTokens = relevantFiles.reduce((s, f) => s + f.tokens, 0);\n\n // Determine model based on complexity and file count\n let recommended: ModelPreference = rule.defaultModel;\n\n // Upgrade if complexity exceeds rule threshold\n if (avgComplexity > rule.maxComplexity || fileCount > rule.maxFiles) {\n recommended = upgradeModel(recommended);\n }\n\n // Downgrade if task is simple enough\n if (avgComplexity < rule.maxComplexity * 0.3 && fileCount <= 3) {\n recommended = downgradeModel(recommended);\n }\n\n const cost = estimateCost(totalTokens, recommended);\n\n const alternatives = buildAlternatives(recommended, avgComplexity, fileCount, totalTokens);\n\n return {\n task,\n recommended,\n reason: buildReason(task, recommended, avgComplexity, fileCount),\n estimatedTokens: totalTokens,\n estimatedCost: cost.formatted,\n alternatives,\n };\n}\n\nexport function recommendModelForFiles(\n files: FileInfo[],\n): ModelPreference {\n const avgComplexity = getAvgComplexity(files);\n const totalTokens = files.reduce((s, f) => s + f.tokens, 0);\n\n // Simple heuristic\n if (avgComplexity <= 10 && totalTokens < 5000) return 'haiku';\n if (avgComplexity <= 30 && totalTokens < 50000) return 'sonnet';\n return 'opus';\n}\n\nexport function getTaskDescription(task: TaskType): string {\n const descriptions: Record<TaskType, string> = {\n 'simple-edit': 'Small change — rename, fix typo, update config',\n 'docs': 'Documentation — README, comments, JSDoc, guides',\n 'test': 'Write or fix tests',\n 'debug': 'Find and fix a bug',\n 'review': 'Code review — analyze quality, suggest improvements',\n 'refactor': 'Refactor code — restructure without changing behavior',\n 'feature': 'Build a new feature',\n 'architecture': 'Architecture decisions — design patterns, major restructuring',\n };\n return descriptions[task];\n}\n\nfunction getAvgComplexity(files: FileInfo[]): number {\n const withComplexity = files.filter((f) => f.complexity !== undefined);\n if (withComplexity.length === 0) return 10; // default medium\n return withComplexity.reduce((s, f) => s + (f.complexity ?? 0), 0) / withComplexity.length;\n}\n\nfunction upgradeModel(model: ModelPreference): ModelPreference {\n if (model === 'haiku') return 'sonnet';\n if (model === 'sonnet') return 'opus';\n return 'opus';\n}\n\nfunction downgradeModel(model: ModelPreference): ModelPreference {\n if (model === 'opus') return 'sonnet';\n if (model === 'sonnet') return 'haiku';\n return 'haiku';\n}\n\nfunction buildReason(task: TaskType, model: ModelPreference, complexity: number, files: number): string {\n const taskLabel = getTaskDescription(task);\n const complexityLabel = complexity > 30 ? 'high' : complexity > 10 ? 'moderate' : 'low';\n\n if (model === 'haiku') {\n return `${taskLabel}. Low complexity (${Math.round(complexity)}) and few files (${files}) → Haiku is sufficient and cheapest.`;\n }\n if (model === 'opus') {\n return `${taskLabel}. ${complexityLabel} complexity (${Math.round(complexity)}) across ${files} files → Opus recommended for deep reasoning.`;\n }\n return `${taskLabel}. ${complexityLabel} complexity (${Math.round(complexity)}) across ${files} files → Sonnet balances quality and cost.`;\n}\n\nfunction buildAlternatives(\n recommended: ModelPreference,\n complexity: number,\n files: number,\n tokens: number,\n): Array<{ model: ModelPreference; reason: string }> {\n const alts: Array<{ model: ModelPreference; reason: string }> = [];\n\n if (recommended !== 'haiku') {\n const haikuCost = estimateCost(tokens, 'haiku');\n alts.push({ model: 'haiku', reason: `Cheapest (${haikuCost.formatted}) — use if task is straightforward` });\n }\n if (recommended !== 'sonnet') {\n const sonnetCost = estimateCost(tokens, 'sonnet');\n alts.push({ model: 'sonnet', reason: `Balanced (${sonnetCost.formatted}) — good for most tasks` });\n }\n if (recommended !== 'opus') {\n const opusCost = estimateCost(tokens, 'opus');\n alts.push({ model: 'opus', reason: `Best reasoning (${opusCost.formatted}) — use for complex logic` });\n }\n\n return alts;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { loadProjectConfig } from '../../core/config.js';\nimport { explainTier, formatExplanation } from '../../core/explain.js';\nimport { formatTokens } from '../../utils/format.js';\n\nexport const explainCommand = new Command('explain')\n .description('Explain why a file is in a specific tier')\n .argument('<file>', 'File path relative to project')\n .argument('[path]', 'Project path', '.')\n .option('--json', 'Output as JSON')\n .action(async (file: string, path: string, opts: { json?: boolean }) => {\n const projectPath = resolve(path);\n const config = await loadProjectConfig(projectPath);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const fileInfo = analysis.files.find((f) => f.relativePath === file);\n if (!fileInfo) {\n console.log(chalk.red(`File not found in analysis: ${file}`));\n console.log(chalk.dim('Run \"cto analyze\" first, or check the file path.'));\n process.exit(1);\n }\n\n const explanation = await explainTier(fileInfo, projectPath, config.tiering);\n\n if (opts.json) {\n console.log(JSON.stringify(explanation, null, 2));\n return;\n }\n\n const tierIcon = fileInfo.tier === 'hot' ? '🔥' : fileInfo.tier === 'warm' ? '🌡️' : '❄️';\n\n console.log('');\n console.log(chalk.bold.cyan(`${tierIcon} ${file}`));\n console.log(chalk.dim(` Tier: ${fileInfo.tier} | Tokens: ${formatTokens(fileInfo.tokens)} | Lines: ${fileInfo.lines ?? 'N/A'}`));\n console.log('');\n console.log(formatExplanation(explanation));\n console.log('');\n });\n","import type { FileInfo, TierExplanation, ExplainFactor, Tier, TierThresholds, GitFileInfo } from '../types/index.js';\nimport { getFileGitInfo, isGitRepo } from './git.js';\nimport { estimateCost } from './costs.js';\nimport { resolve } from 'node:path';\n\nexport async function explainTier(\n file: FileInfo,\n projectPath: string,\n thresholds: TierThresholds,\n): Promise<TierExplanation> {\n const factors: ExplainFactor[] = [];\n\n // 1. Recency factor\n const modDate = file.lastModified instanceof Date ? file.lastModified : new Date(file.lastModified);\n const daysSinceModified = (Date.now() - modDate.getTime()) / (1000 * 60 * 60 * 24);\n\n let recencyImpact: ExplainFactor['impact'] = 'neutral';\n if (daysSinceModified <= thresholds.hotDays) recencyImpact = 'promotes';\n else if (daysSinceModified > thresholds.warmDays) recencyImpact = 'demotes';\n\n factors.push({\n name: 'Recency',\n value: `Modified ${Math.round(daysSinceModified)}d ago (hot: ≤${thresholds.hotDays}d, warm: ≤${thresholds.warmDays}d)`,\n impact: recencyImpact,\n weight: 3,\n });\n\n // 2. File size / tokens\n const cost = estimateCost(file.tokens, 'sonnet');\n factors.push({\n name: 'Token Cost',\n value: `${file.tokens.toLocaleString()} tokens (~${cost.formatted}/read)`,\n impact: 'neutral',\n weight: 1,\n });\n\n // 3. Hub file status\n if (file.isHub !== undefined) {\n factors.push({\n name: 'Hub Status',\n value: file.isHub\n ? `Hub file — imported by ${file.importedByCount ?? 0} files`\n : 'Not a hub file',\n impact: file.isHub && (file.importedByCount ?? 0) >= 3 ? 'promotes' : 'neutral',\n weight: file.isHub ? 2 : 0,\n });\n }\n\n // 4. Complexity\n if (file.complexity !== undefined) {\n const complexityLevel = file.complexity > 30 ? 'High' : file.complexity > 10 ? 'Medium' : 'Low';\n factors.push({\n name: 'Complexity',\n value: `Cyclomatic: ${file.complexity} (${complexityLevel})`,\n impact: file.complexity > 30 ? 'promotes' : 'neutral',\n weight: file.complexity > 30 ? 2 : 1,\n });\n }\n\n // 5. Git info\n const absPath = resolve(projectPath);\n if (await isGitRepo(absPath)) {\n const gitInfo = await getFileGitInfo(absPath, file.relativePath);\n if (gitInfo) {\n factors.push({\n name: 'Git Activity',\n value: `${gitInfo.commitCount} commits, last by ${gitInfo.lastAuthor}`,\n impact: gitInfo.isInDiff ? 'promotes' : gitInfo.commitCount >= 20 ? 'promotes' : 'neutral',\n weight: gitInfo.isInDiff ? 3 : 1,\n });\n\n if (gitInfo.isInDiff) {\n factors.push({\n name: 'In Current Diff',\n value: `${gitInfo.linesChanged} lines changed`,\n impact: 'promotes',\n weight: 3,\n });\n }\n\n if (gitInfo.isNewFile) {\n factors.push({\n name: 'New File',\n value: 'Untracked / newly created',\n impact: 'promotes',\n weight: 3,\n });\n }\n }\n }\n\n // 6. Extension relevance\n const coreExts = new Set(['ts', 'tsx', 'js', 'jsx', 'py', 'go', 'rs', 'java']);\n const isCore = coreExts.has(file.extension);\n factors.push({\n name: 'File Type',\n value: `.${file.extension} — ${isCore ? 'Core source file' : 'Supporting file'}`,\n impact: 'neutral',\n weight: isCore ? 1 : 0,\n });\n\n // Build summary\n const promotingFactors = factors.filter((f) => f.impact === 'promotes');\n const demotingFactors = factors.filter((f) => f.impact === 'demotes');\n\n let summary: string;\n if (file.tier === 'hot') {\n const reasons = promotingFactors.map((f) => f.name.toLowerCase()).join(', ') || 'recent modification';\n summary = `🔥 Hot — Read first. Promoted by: ${reasons}.`;\n } else if (file.tier === 'warm') {\n summary = `🌡️ Warm — Read if needed.`;\n if (promotingFactors.length > 0) {\n summary += ` Near hot due to: ${promotingFactors.map((f) => f.name.toLowerCase()).join(', ')}.`;\n }\n if (demotingFactors.length > 0) {\n summary += ` Held back by: ${demotingFactors.map((f) => f.name.toLowerCase()).join(', ')}.`;\n }\n } else {\n const reasons = demotingFactors.map((f) => f.name.toLowerCase()).join(', ') || 'inactivity';\n summary = `❄️ Cold — Skip unless needed. Reason: ${reasons}.`;\n }\n\n return {\n file: file.relativePath,\n tier: file.tier,\n factors,\n summary,\n };\n}\n\nexport function formatExplanation(explanation: TierExplanation): string {\n const lines: string[] = [];\n\n lines.push(`${explanation.summary}`);\n lines.push('');\n lines.push('Factors:');\n\n for (const factor of explanation.factors) {\n const icon = factor.impact === 'promotes' ? '↑' : factor.impact === 'demotes' ? '↓' : '·';\n lines.push(` ${icon} ${factor.name}: ${factor.value}`);\n }\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { recommendModel, ALL_TASK_TYPES, getTaskDescription } from '../../core/routing.js';\nimport { formatTokens } from '../../utils/format.js';\nimport type { TaskType } from '../../types/index.js';\n\nexport const routeCommand = new Command('route')\n .description('Smart model routing — recommend the best model for a task');\n\nrouteCommand\n .command('recommend')\n .description('Get model recommendation for a task type')\n .argument('<task>', `Task type: ${ALL_TASK_TYPES.join(', ')}`)\n .argument('[path]', 'Project path', '.')\n .option('-f, --files <files>', 'Comma-separated target files')\n .option('--json', 'Output as JSON')\n .action(async (task: string, path: string, opts: { files?: string; json?: boolean }) => {\n if (!ALL_TASK_TYPES.includes(task as TaskType)) {\n console.log(chalk.red(`Unknown task type: ${task}`));\n console.log(chalk.dim(`Available: ${ALL_TASK_TYPES.join(', ')}`));\n process.exit(1);\n }\n\n const projectPath = resolve(path);\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const targetFiles = opts.files?.split(',').map((f) => f.trim());\n const rec = recommendModel(task as TaskType, analysis, targetFiles);\n\n if (opts.json) {\n console.log(JSON.stringify(rec, null, 2));\n return;\n }\n\n const modelIcon = rec.recommended === 'opus' ? '🟣' : rec.recommended === 'sonnet' ? '🔵' : '🟢';\n\n console.log('');\n console.log(chalk.bold.cyan(`🧠 Smart Model Routing`));\n console.log('');\n console.log(` Task: ${chalk.bold(task)}`);\n console.log(` ${modelIcon} Model: ${chalk.bold(rec.recommended.toUpperCase())}`);\n console.log(` Tokens: ~${formatTokens(rec.estimatedTokens)}`);\n console.log(` Est. cost: ${chalk.green(rec.estimatedCost)}`);\n console.log('');\n console.log(` ${chalk.dim(rec.reason)}`);\n console.log('');\n\n if (rec.alternatives.length > 0) {\n console.log(chalk.bold(' Alternatives:'));\n for (const alt of rec.alternatives) {\n const icon = alt.model === 'opus' ? '🟣' : alt.model === 'sonnet' ? '🔵' : '🟢';\n console.log(` ${icon} ${alt.model.padEnd(7)} — ${alt.reason}`);\n }\n console.log('');\n }\n });\n\nrouteCommand\n .command('tasks')\n .description('List available task types')\n .action(() => {\n console.log('');\n console.log(chalk.bold.cyan('🧠 Task Types for Model Routing'));\n console.log('');\n for (const task of ALL_TASK_TYPES) {\n const desc = getTaskDescription(task);\n const icon = task === 'architecture' || task === 'feature' ? '🟣'\n : task === 'debug' || task === 'review' || task === 'refactor' ? '🔵'\n : '🟢';\n console.log(` ${icon} ${chalk.bold(task.padEnd(14))} ${desc}`);\n }\n console.log('');\n console.log(chalk.dim(' 🟢 Haiku 🔵 Sonnet 🟣 Opus (default model per task)'));\n console.log('');\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { extractSpecs, generateSpecDocument, validateSpecs } from '../../core/sdd.js';\nimport { getArtifactsDir } from '../../utils/paths.js';\nimport { writeText } from '../../utils/fs.js';\nimport { formatTokens } from '../../utils/format.js';\n\nexport const sddCommand = new Command('sdd')\n .description('Specification-Driven Development — extract specs, generate contract, validate');\n\nsddCommand\n .command('extract')\n .description('Extract all specs (interfaces, types, functions) from the project')\n .argument('[path]', 'Project path', '.')\n .option('--exported', 'Only show exported specs')\n .option('--kind <kind>', 'Filter by kind: interface, type, enum, function, class')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { exported?: boolean; kind?: string; json?: boolean }) => {\n const projectPath = resolve(path);\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const map = extractSpecs(projectPath, analysis.files);\n\n let entries = map.entries;\n if (opts.exported) entries = entries.filter((e) => e.exported);\n if (opts.kind) entries = entries.filter((e) => e.kind === opts.kind);\n\n if (opts.json) {\n console.log(JSON.stringify({ totalSpecs: entries.length, entries }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('📋 SDD — Specification Extract'));\n console.log('');\n\n const kindCounts: Record<string, number> = {};\n for (const e of entries) kindCounts[e.kind] = (kindCounts[e.kind] ?? 0) + 1;\n const summary = Object.entries(kindCounts).map(([k, v]) => `${v} ${k}s`).join(' · ');\n console.log(` Total: ${chalk.bold(String(entries.length))} specs (${summary})`);\n console.log('');\n\n // Group by file\n const byFile: Record<string, typeof entries> = {};\n for (const e of entries) (byFile[e.file] ??= []).push(e);\n\n for (const [file, fileEntries] of Object.entries(byFile)) {\n console.log(chalk.bold(` ${file}`));\n for (const e of fileEntries) {\n const icon = e.kind === 'interface' ? '📐' : e.kind === 'type' ? '🏷️' : e.kind === 'enum' ? '📊' : e.kind === 'function' ? '⚡' : '🏗️';\n const exp = e.exported ? chalk.green('export') : chalk.dim('local');\n console.log(` ${icon} ${exp} ${chalk.bold(e.name)}`);\n }\n console.log('');\n }\n });\n\nsddCommand\n .command('spec')\n .description('Generate a specification document (contract for AI development)')\n .argument('[path]', 'Project path', '.')\n .option('--save', 'Save to artifacts directory as SPEC.md')\n .action(async (path: string, opts: { save?: boolean }) => {\n const projectPath = resolve(path);\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const map = extractSpecs(projectPath, analysis.files);\n const doc = generateSpecDocument(map);\n\n if (opts.save) {\n const artifactsDir = getArtifactsDir(projectPath);\n await writeText(join(artifactsDir, 'SPEC.md'), doc);\n console.log('');\n console.log(chalk.green(` ✓ Saved SPEC.md (${map.totalSpecs} specs)`));\n console.log(chalk.dim(` ${artifactsDir}/SPEC.md`));\n console.log('');\n } else {\n console.log(doc);\n console.log('');\n console.log(chalk.dim(' Add --save to write SPEC.md to artifacts/'));\n }\n });\n\nsddCommand\n .command('validate')\n .description('Validate that implementations conform to SDD best practices')\n .argument('[path]', 'Project path', '.')\n .option('--strict', 'Treat warnings as errors')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { strict?: boolean; json?: boolean }) => {\n const projectPath = resolve(path);\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const result = validateSpecs(projectPath, analysis.files);\n\n if (opts.json) {\n console.log(JSON.stringify(result, null, 2));\n if (!result.valid || (opts.strict && result.warnings.length > 0)) process.exit(1);\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('📋 SDD — Specification Validation'));\n console.log('');\n\n // Stats\n const s = result.stats;\n const retPct = s.totalFunctions > 0 ? Math.round((s.withReturnType / s.totalFunctions) * 100) : 100;\n const docPct = s.totalInterfaces > 0 ? Math.round((s.fullyDocumented / s.totalInterfaces) * 100) : 100;\n\n console.log(` Functions: ${s.totalFunctions} total, ${s.withReturnType} with explicit return type (${retPct}%)`);\n console.log(` Interfaces: ${s.totalInterfaces} total, ${s.fullyDocumented} documented (${docPct}%)`);\n if (s.exportedWithoutJSDoc > 0) {\n console.log(chalk.yellow(` ⚠ ${s.exportedWithoutJSDoc} exported symbols without JSDoc`));\n }\n console.log('');\n\n // Errors\n if (result.errors.length > 0) {\n console.log(chalk.red.bold(` ✗ ${result.errors.length} errors:`));\n for (const err of result.errors.slice(0, 20)) {\n console.log(chalk.red(` ✗ ${err.file}:${err.line} — ${err.message}`));\n }\n if (result.errors.length > 20) console.log(chalk.red(` ... and ${result.errors.length - 20} more`));\n console.log('');\n }\n\n // Warnings\n if (result.warnings.length > 0) {\n console.log(chalk.yellow.bold(` ⚠ ${result.warnings.length} warnings:`));\n for (const warn of result.warnings.slice(0, 15)) {\n console.log(chalk.yellow(` ⚠ ${warn.file}:${warn.line} — ${warn.message}`));\n }\n if (result.warnings.length > 15) console.log(chalk.yellow(` ... and ${result.warnings.length - 15} more`));\n console.log('');\n }\n\n // Result\n const isPass = result.valid && (!opts.strict || result.warnings.length === 0);\n if (isPass) {\n console.log(chalk.green(' ✓ SDD validation passed'));\n } else {\n console.log(chalk.red(' ✗ SDD validation failed'));\n }\n console.log('');\n\n if (!isPass) process.exit(1);\n });\n","import { Project, type SourceFile } from 'ts-morph';\nimport { resolve, relative } from 'node:path';\nimport { createProject } from './ast.js';\nimport type { FileInfo } from '../types/index.js';\n\n// --- Specification-Driven Development (SDD) ---\n//\n// SDD flow: Spec first → Implement → Validate\n//\n// 1. Extract specs from codebase (interfaces, types, function signatures)\n// 2. Generate a spec document that AI uses as the mandatory contract\n// 3. Validate that all implementations conform to their specs\n\nexport interface SpecEntry {\n kind: 'interface' | 'type' | 'enum' | 'function' | 'class';\n name: string;\n file: string;\n line: number;\n exported: boolean;\n signature: string;\n properties?: SpecProperty[];\n extends?: string[];\n jsdoc?: string;\n}\n\nexport interface SpecProperty {\n name: string;\n type: string;\n optional: boolean;\n}\n\nexport interface SpecMap {\n projectName: string;\n extractedAt: Date;\n totalSpecs: number;\n entries: SpecEntry[];\n byFile: Record<string, SpecEntry[]>;\n byKind: Record<string, SpecEntry[]>;\n}\n\nexport interface SpecValidation {\n valid: boolean;\n errors: SpecIssue[];\n warnings: SpecIssue[];\n stats: {\n totalFunctions: number;\n withReturnType: number;\n totalInterfaces: number;\n fullyDocumented: number;\n exportedWithoutJSDoc: number;\n };\n}\n\nexport interface SpecIssue {\n file: string;\n name: string;\n line: number;\n message: string;\n}\n\n// ========== EXTRACT ==========\n\nexport function extractSpecs(projectPath: string, files: FileInfo[]): SpecMap {\n const absPath = resolve(projectPath);\n const tsFiles = files\n .filter((f) => ['ts', 'tsx'].includes(f.extension))\n .map((f) => f.path);\n\n const empty: SpecMap = {\n projectName: projectPath.split('/').pop() ?? 'project',\n extractedAt: new Date(),\n totalSpecs: 0,\n entries: [],\n byFile: {},\n byKind: {},\n };\n\n if (tsFiles.length === 0) return empty;\n\n const project = createProject(projectPath, tsFiles);\n const entries: SpecEntry[] = [];\n\n for (const sf of project.getSourceFiles()) {\n const rel = relative(absPath, sf.getFilePath());\n if (rel.startsWith('..') || rel.includes('node_modules')) continue;\n\n extractInterfaces(sf, rel, entries);\n extractTypeAliases(sf, rel, entries);\n extractEnums(sf, rel, entries);\n extractFunctionSigs(sf, rel, entries);\n extractClassSigs(sf, rel, entries);\n }\n\n const byFile: Record<string, SpecEntry[]> = {};\n const byKind: Record<string, SpecEntry[]> = {};\n\n for (const e of entries) {\n (byFile[e.file] ??= []).push(e);\n (byKind[e.kind] ??= []).push(e);\n }\n\n return {\n projectName: projectPath.split('/').pop() ?? 'project',\n extractedAt: new Date(),\n totalSpecs: entries.length,\n entries,\n byFile,\n byKind,\n };\n}\n\n// ========== GENERATE SPEC DOCUMENT ==========\n\nexport function generateSpecDocument(map: SpecMap): string {\n const lines: string[] = [];\n\n lines.push(`# Specification Document — ${map.projectName}`);\n lines.push('');\n lines.push('> **Specification-Driven Development (SDD)**');\n lines.push('> This document is the single source of truth. All implementations MUST conform to these specs.');\n lines.push(`> Extracted: ${map.extractedAt.toISOString()} | Total specs: ${map.totalSpecs}`);\n lines.push('');\n\n // Summary table\n const kindCounts = Object.entries(map.byKind).map(([k, v]) => `${v.length} ${k}s`);\n lines.push(`**Specs:** ${kindCounts.join(' · ')}`);\n lines.push('');\n\n // --- INTERFACES ---\n const interfaces = (map.byKind['interface'] ?? []).filter((e) => e.exported);\n if (interfaces.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Interfaces');\n lines.push('');\n lines.push('These are the primary contracts. Implementations MUST satisfy every property.');\n lines.push('');\n\n for (const entry of interfaces) {\n lines.push(`### \\`${entry.name}\\``);\n if (entry.jsdoc) lines.push(`> ${entry.jsdoc}`);\n lines.push(`📍 \\`${entry.file}:${entry.line}\\``);\n if (entry.extends && entry.extends.length > 0) {\n lines.push(`↗️ Extends: ${entry.extends.map((e) => `\\`${e}\\``).join(', ')}`);\n }\n lines.push('');\n\n if (entry.properties && entry.properties.length > 0) {\n lines.push('| Property | Type | Required |');\n lines.push('|----------|------|----------|');\n for (const p of entry.properties) {\n lines.push(`| \\`${p.name}\\` | \\`${p.type}\\` | ${p.optional ? 'No' : '**Yes**'} |`);\n }\n lines.push('');\n }\n }\n }\n\n // --- TYPES ---\n const types = (map.byKind['type'] ?? []).filter((e) => e.exported);\n if (types.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Types');\n lines.push('');\n for (const entry of types) {\n lines.push(`- **\\`${entry.name}\\`** — \\`${entry.signature}\\` (\\`${entry.file}:${entry.line}\\`)`);\n }\n lines.push('');\n }\n\n // --- ENUMS ---\n const enums = (map.byKind['enum'] ?? []).filter((e) => e.exported);\n if (enums.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Enums');\n lines.push('');\n for (const entry of enums) {\n lines.push(`- **\\`${entry.name}\\`** — \\`${entry.signature}\\` (\\`${entry.file}:${entry.line}\\`)`);\n }\n lines.push('');\n }\n\n // --- FUNCTIONS ---\n const fns = (map.byKind['function'] ?? []).filter((e) => e.exported);\n if (fns.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Functions (Public API)');\n lines.push('');\n lines.push('These function signatures are the public API. Do NOT change signatures without updating this spec.');\n lines.push('');\n\n // Group by file\n const byFile: Record<string, SpecEntry[]> = {};\n for (const fn of fns) {\n (byFile[fn.file] ??= []).push(fn);\n }\n\n for (const [file, fileFns] of Object.entries(byFile)) {\n lines.push(`#### \\`${file}\\``);\n lines.push('```typescript');\n for (const fn of fileFns) {\n if (fn.jsdoc) lines.push(`// ${fn.jsdoc}`);\n lines.push(`export ${fn.signature};`);\n }\n lines.push('```');\n lines.push('');\n }\n }\n\n // --- CLASSES ---\n const classes = (map.byKind['class'] ?? []).filter((e) => e.exported);\n if (classes.length > 0) {\n lines.push('---');\n lines.push('');\n lines.push('## Classes');\n lines.push('');\n for (const entry of classes) {\n lines.push(`- **\\`${entry.name}\\`** (\\`${entry.file}:${entry.line}\\`)`);\n if (entry.extends) lines.push(` - Extends: ${entry.extends.join(', ')}`);\n lines.push(` - \\`${entry.signature}\\``);\n }\n lines.push('');\n }\n\n // --- SDD RULES ---\n lines.push('---');\n lines.push('');\n lines.push('## SDD Rules');\n lines.push('');\n lines.push('1. **Spec first** — Define or update interfaces/types BEFORE writing implementation');\n lines.push('2. **Contract compliance** — Every function must satisfy its declared return type');\n lines.push('3. **No implicit any** — All parameters and returns must be explicitly typed');\n lines.push('4. **Interface segregation** — Prefer small, focused interfaces over large ones');\n lines.push('5. **Backward compatibility** — Do NOT remove or rename properties from existing interfaces');\n lines.push('6. **Document changes** — Update this spec when adding/modifying public API');\n lines.push('7. **Test against spec** — Tests should verify contract compliance, not implementation details');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// ========== VALIDATE ==========\n\nexport function validateSpecs(projectPath: string, files: FileInfo[]): SpecValidation {\n const absPath = resolve(projectPath);\n const tsFiles = files\n .filter((f) => ['ts', 'tsx'].includes(f.extension))\n .map((f) => f.path);\n\n const errors: SpecIssue[] = [];\n const warnings: SpecIssue[] = [];\n let totalFunctions = 0;\n let withReturnType = 0;\n let totalInterfaces = 0;\n let fullyDocumented = 0;\n let exportedWithoutJSDoc = 0;\n\n if (tsFiles.length === 0) {\n return {\n valid: true,\n errors: [],\n warnings: [],\n stats: { totalFunctions: 0, withReturnType: 0, totalInterfaces: 0, fullyDocumented: 0, exportedWithoutJSDoc: 0 },\n };\n }\n\n const project = createProject(projectPath, tsFiles);\n\n for (const sf of project.getSourceFiles()) {\n const rel = relative(absPath, sf.getFilePath());\n if (rel.startsWith('..') || rel.includes('node_modules')) continue;\n\n // Check exported functions have explicit return types\n for (const fn of sf.getFunctions()) {\n const name = fn.getName();\n if (!name) continue;\n totalFunctions++;\n\n const hasExplicitReturn = fn.getReturnTypeNode() !== undefined;\n if (hasExplicitReturn) withReturnType++;\n\n if (fn.isExported()) {\n if (!hasExplicitReturn) {\n warnings.push({\n file: rel,\n name,\n line: fn.getStartLineNumber(),\n message: `Exported function '${name}' has no explicit return type. SDD requires explicit types for public API.`,\n });\n }\n\n // Check for JSDoc\n const jsDocs = fn.getJsDocs();\n if (jsDocs.length === 0) {\n exportedWithoutJSDoc++;\n warnings.push({\n file: rel,\n name,\n line: fn.getStartLineNumber(),\n message: `Exported function '${name}' has no JSDoc. SDD recommends documenting all public API.`,\n });\n }\n\n // Check parameters have types (not implicit any)\n for (const param of fn.getParameters()) {\n if (!param.getTypeNode()) {\n errors.push({\n file: rel,\n name: `${name}(${param.getName()})`,\n line: fn.getStartLineNumber(),\n message: `Parameter '${param.getName()}' in '${name}' has no explicit type annotation.`,\n });\n }\n }\n }\n }\n\n // Check interfaces\n for (const iface of sf.getInterfaces()) {\n totalInterfaces++;\n const jsDocs = iface.getJsDocs();\n if (jsDocs.length > 0) fullyDocumented++;\n\n if (iface.isExported() && jsDocs.length === 0) {\n exportedWithoutJSDoc++;\n }\n\n // Check for empty interfaces\n if (iface.getProperties().length === 0 && iface.getMethods().length === 0) {\n warnings.push({\n file: rel,\n name: iface.getName(),\n line: iface.getStartLineNumber(),\n message: `Interface '${iface.getName()}' is empty. Consider removing or adding properties.`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n stats: {\n totalFunctions,\n withReturnType,\n totalInterfaces,\n fullyDocumented,\n exportedWithoutJSDoc,\n },\n };\n}\n\n// ========== EXTRACTORS ==========\n\nfunction getJSDoc(node: { getJsDocs(): { getDescription(): string }[] }): string | undefined {\n const docs = node.getJsDocs();\n if (docs.length === 0) return undefined;\n const desc = docs[0].getDescription().trim();\n return desc || undefined;\n}\n\nfunction extractInterfaces(sf: SourceFile, file: string, out: SpecEntry[]): void {\n for (const iface of sf.getInterfaces()) {\n const props: SpecProperty[] = iface.getProperties().map((p) => ({\n name: p.getName(),\n type: p.getType().getText(p),\n optional: p.hasQuestionToken(),\n }));\n\n const ext = iface.getExtends().map((e) => e.getText());\n\n out.push({\n kind: 'interface',\n name: iface.getName(),\n file,\n line: iface.getStartLineNumber(),\n exported: iface.isExported(),\n signature: buildInterfaceSig(iface.getName(), props, ext),\n properties: props,\n extends: ext.length > 0 ? ext : undefined,\n jsdoc: getJSDoc(iface),\n });\n }\n}\n\nfunction extractTypeAliases(sf: SourceFile, file: string, out: SpecEntry[]): void {\n for (const ta of sf.getTypeAliases()) {\n out.push({\n kind: 'type',\n name: ta.getName(),\n file,\n line: ta.getStartLineNumber(),\n exported: ta.isExported(),\n signature: `type ${ta.getName()} = ${ta.getTypeNode()?.getText() ?? ta.getType().getText(ta)}`,\n jsdoc: getJSDoc(ta),\n });\n }\n}\n\nfunction extractEnums(sf: SourceFile, file: string, out: SpecEntry[]): void {\n for (const en of sf.getEnums()) {\n const members = en.getMembers().map((m) => m.getName());\n out.push({\n kind: 'enum',\n name: en.getName(),\n file,\n line: en.getStartLineNumber(),\n exported: en.isExported(),\n signature: `enum ${en.getName()} { ${members.join(', ')} }`,\n jsdoc: getJSDoc(en),\n });\n }\n}\n\nfunction extractFunctionSigs(sf: SourceFile, file: string, out: SpecEntry[]): void {\n for (const fn of sf.getFunctions()) {\n const name = fn.getName();\n if (!name) continue;\n\n const params = fn.getParameters().map((p) => {\n const typeNode = p.getTypeNode();\n return `${p.getName()}: ${typeNode?.getText() ?? p.getType().getText(p)}`;\n });\n const retNode = fn.getReturnTypeNode();\n const retType = retNode?.getText() ?? fn.getReturnType().getText(fn);\n\n out.push({\n kind: 'function',\n name,\n file,\n line: fn.getStartLineNumber(),\n exported: fn.isExported(),\n signature: `function ${name}(${params.join(', ')}): ${retType}`,\n jsdoc: getJSDoc(fn),\n });\n }\n}\n\nfunction extractClassSigs(sf: SourceFile, file: string, out: SpecEntry[]): void {\n for (const cls of sf.getClasses()) {\n const name = cls.getName();\n if (!name) continue;\n\n const methods = cls.getMethods().map((m) => {\n const params = m.getParameters().map((p) => `${p.getName()}: ${p.getType().getText(p)}`);\n const ret = m.getReturnType().getText(m);\n return `${m.getName()}(${params.join(', ')}): ${ret}`;\n });\n\n const ext = cls.getExtends()?.getText();\n const impl = cls.getImplements().map((i) => i.getText());\n\n out.push({\n kind: 'class',\n name,\n file,\n line: cls.getStartLineNumber(),\n exported: cls.isExported(),\n signature: `class ${name}${ext ? ` extends ${ext}` : ''}${impl.length > 0 ? ` implements ${impl.join(', ')}` : ''} { ${methods.join('; ')} }`,\n extends: ext ? [ext, ...impl] : impl.length > 0 ? impl : undefined,\n jsdoc: getJSDoc(cls),\n });\n }\n}\n\nfunction buildInterfaceSig(name: string, props: SpecProperty[], ext: string[]): string {\n const extStr = ext.length > 0 ? ` extends ${ext.join(', ')}` : '';\n const propsStr = props.map((p) => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join('; ');\n return `interface ${name}${extStr} { ${propsStr} }`;\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join } from 'node:path';\nimport { analyzeProject, saveAnalysis } from '../../core/analyzer.js';\nimport { loadProjectConfig } from '../../core/config.js';\nimport { generateForTarget, generateForAllTargets } from '../../core/adapters.js';\nimport { sanitizeContent } from '../../core/security.js';\nimport { getArtifactsDir } from '../../utils/paths.js';\nimport { writeText } from '../../utils/fs.js';\nimport type { AITarget } from '../../types/index.js';\n\nexport const quickstartCommand = new Command('quickstart')\n .description('One command: analyze + generate + save. Zero friction.')\n .argument('[path]', 'Project path', '.')\n .option('-t, --target <target>', 'AI target (claude, cursor, copilot, gemini, windsurf, all)', 'claude')\n .option('--enhanced', 'Add prompt engineering enhancements')\n .action(async (path: string, opts: { target?: string; enhanced?: boolean }) => {\n const projectPath = resolve(path);\n\n try {\n const config = await loadProjectConfig(projectPath);\n const target = (opts.target ?? 'claude') as AITarget | 'all';\n\n console.log('');\n console.log(chalk.bold.cyan('⚡ CTO Quickstart'));\n console.log('');\n\n // Step 1: Analyze\n console.log(chalk.dim(' ⏳ Analyzing project...'));\n const analysis = await analyzeProject(projectPath);\n await saveAnalysis(projectPath, analysis);\n const hot = analysis.files.filter((f) => f.tier === 'hot');\n const warm = analysis.files.filter((f) => f.tier === 'warm');\n const cold = analysis.files.filter((f) => f.tier === 'cold');\n console.log(chalk.green(` ✓ ${analysis.totalFiles} files analyzed — ${hot.length} hot, ${warm.length} warm, ${cold.length} cold`));\n console.log(chalk.green(` ✓ ~${Math.round(analysis.totalTokens / 1000)}K tokens total`));\n\n // Step 2: Generate\n const artifactsDir = getArtifactsDir(projectPath);\n const enhancedOpts = opts.enhanced ? { enhanced: true as const } : undefined;\n\n if (target === 'all') {\n console.log(chalk.dim(' ⏳ Generating for all AI targets...'));\n const results = generateForAllTargets(analysis, config, enhancedOpts);\n for (const r of results) {\n const sanitized = sanitizeContent(r.content);\n await writeText(join(artifactsDir, r.fileName), sanitized);\n console.log(chalk.green(` ✓ ${r.fileName}`));\n }\n } else {\n console.log(chalk.dim(` ⏳ Generating for ${target}...`));\n const result = generateForTarget(target as AITarget, analysis, config, enhancedOpts);\n const sanitized = sanitizeContent(result.content);\n await writeText(join(artifactsDir, result.fileName), sanitized);\n console.log(chalk.green(` ✓ ${result.fileName}`));\n }\n\n // Summary\n console.log('');\n console.log(chalk.bold.green(' ✓ Done! Artifacts saved.'));\n console.log('');\n console.log(chalk.dim(' Next: cto apply claude-md (to copy to project root)'));\n console.log(chalk.dim(' cto tiers (view tier breakdown)'));\n console.log(chalk.dim(' cto costs estimate (token cost analysis)'));\n console.log('');\n } catch (err) {\n console.error(chalk.red(`❌ Quickstart failed: ${err instanceof Error ? err.message : String(err)}`));\n process.exit(1);\n }\n });\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve, join } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { loadProjectConfig } from '../../core/config.js';\nimport { buildFocusContext, formatFocusDocument } from '../../core/focus.js';\nimport { getArtifactsDir } from '../../utils/paths.js';\nimport { writeText } from '../../utils/fs.js';\n\nexport const focusCommand = new Command('focus')\n .description('Generate focused context for specific files + their dependencies')\n .argument('<files>', 'Comma-separated file paths to focus on')\n .argument('[path]', 'Project path', '.')\n .option('-d, --depth <depth>', 'Dependency depth (default: 1)', '1')\n .option('--save', 'Save FOCUS.md to artifacts')\n .option('--json', 'Output as JSON')\n .action(async (filesArg: string, path: string, opts: { depth?: string; save?: boolean; json?: boolean }) => {\n const projectPath = resolve(path);\n const targetFiles = filesArg.split(',').map((f) => f.trim());\n const depth = parseInt(opts.depth ?? '1', 10);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const focus = buildFocusContext(analysis, targetFiles, depth);\n\n if (opts.json) {\n console.log(JSON.stringify({\n targetFiles: focus.targetFiles.map((f) => f.relativePath),\n dependencies: focus.dependencies.map((f) => f.relativePath),\n totalTokens: focus.totalTokens,\n savedTokens: focus.savedTokens,\n savingsPercent: focus.savingsPercent,\n }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('🎯 Focus Mode'));\n console.log('');\n\n if (focus.targetFiles.length === 0) {\n console.log(chalk.yellow(' ⚠ No matching files found. Check your file paths.'));\n console.log(chalk.dim(` Searched for: ${targetFiles.join(', ')}`));\n console.log('');\n return;\n }\n\n console.log(` Target: ${chalk.bold(String(focus.targetFiles.length))} files`);\n console.log(` Dependencies: ${chalk.bold(String(focus.dependencies.length))} files (depth ${depth})`);\n console.log(` Tokens: ~${Math.round(focus.totalTokens / 1000)}K (${chalk.green(`${focus.savingsPercent}% saved`)} vs full context)`);\n console.log('');\n\n console.log(chalk.bold(' Target files:'));\n for (const f of focus.targetFiles) {\n console.log(chalk.green(` → ${f.relativePath} (~${Math.round(f.tokens / 1000)}K)`));\n }\n\n if (focus.dependencies.length > 0) {\n console.log('');\n console.log(chalk.bold(' Dependencies:'));\n for (const f of focus.dependencies.slice(0, 15)) {\n console.log(chalk.dim(` ↳ ${f.relativePath} (~${Math.round(f.tokens / 1000)}K)`));\n }\n if (focus.dependencies.length > 15) {\n console.log(chalk.dim(` ... and ${focus.dependencies.length - 15} more`));\n }\n }\n\n if (opts.save) {\n const doc = formatFocusDocument(analysis, focus);\n const artifactsDir = getArtifactsDir(projectPath);\n await writeText(join(artifactsDir, 'FOCUS.md'), doc);\n console.log('');\n console.log(chalk.green(' ✓ Saved FOCUS.md to artifacts/'));\n }\n\n console.log('');\n });\n","import type { ProjectAnalysis, FileInfo, DependencyGraph } from '../types/index.js';\nimport { buildDependencyGraph, createProject } from './ast.js';\nimport { resolve, relative } from 'node:path';\n\n// --- Focus Mode ---\n// Creates a minimal context with ONLY the files you're working on + their direct dependencies.\n// Dramatically reduces tokens for targeted tasks.\n\nexport interface FocusResult {\n targetFiles: FileInfo[];\n dependencies: FileInfo[];\n allFiles: FileInfo[];\n totalTokens: number;\n savedTokens: number;\n savingsPercent: number;\n}\n\nexport function buildFocusContext(\n analysis: ProjectAnalysis,\n targetPaths: string[],\n depth: number = 1,\n): FocusResult {\n const absProjectPath = resolve(analysis.projectPath);\n\n // Normalize target paths to relative\n const normalizedTargets = targetPaths.map((p) => {\n if (p.startsWith('/')) return relative(absProjectPath, p);\n return p;\n });\n\n // Find target files in analysis\n const targetFiles = analysis.files.filter((f) =>\n normalizedTargets.some((t) => f.relativePath === t || f.relativePath.endsWith(t)),\n );\n\n if (targetFiles.length === 0) {\n return {\n targetFiles: [],\n dependencies: [],\n allFiles: [],\n totalTokens: 0,\n savedTokens: analysis.totalTokens,\n savingsPercent: 100,\n };\n }\n\n // Build dependency graph to find related files\n const depPaths = new Set<string>();\n\n try {\n const tsFiles = analysis.files\n .filter((f) => ['ts', 'tsx', 'js', 'jsx'].includes(f.extension))\n .map((f) => f.path);\n\n if (tsFiles.length > 0) {\n const project = createProject(analysis.projectPath, tsFiles);\n const graph = buildDependencyGraph(project, analysis.projectPath);\n\n // Walk dependencies up to `depth` levels\n const visited = new Set<string>();\n let frontier = targetFiles.map((f) => f.relativePath);\n\n for (let d = 0; d < depth; d++) {\n const nextFrontier: string[] = [];\n for (const file of frontier) {\n if (visited.has(file)) continue;\n visited.add(file);\n\n // Find imports from this file\n for (const edge of graph.edges) {\n if (edge.from === file && !visited.has(edge.to)) {\n depPaths.add(edge.to);\n nextFrontier.push(edge.to);\n }\n // Also find files that import this file (reverse deps)\n if (edge.to === file && !visited.has(edge.from)) {\n depPaths.add(edge.from);\n nextFrontier.push(edge.from);\n }\n }\n }\n frontier = nextFrontier;\n }\n }\n } catch {\n // If AST analysis fails, just use the target files\n }\n\n // Remove targets from deps\n const targetRelPaths = new Set(targetFiles.map((f) => f.relativePath));\n const dependencies = analysis.files.filter(\n (f) => depPaths.has(f.relativePath) && !targetRelPaths.has(f.relativePath),\n );\n\n const allFiles = [...targetFiles, ...dependencies];\n const totalTokens = allFiles.reduce((sum, f) => sum + f.tokens, 0);\n const savedTokens = analysis.totalTokens - totalTokens;\n const savingsPercent = analysis.totalTokens > 0\n ? Math.round((savedTokens / analysis.totalTokens) * 100)\n : 0;\n\n return {\n targetFiles,\n dependencies,\n allFiles,\n totalTokens,\n savedTokens,\n savingsPercent,\n };\n}\n\nexport function formatFocusDocument(\n analysis: ProjectAnalysis,\n focus: FocusResult,\n): string {\n const lines: string[] = [];\n\n lines.push(`# Focus Context — ${analysis.projectName}`);\n lines.push('');\n lines.push('> Focused context for targeted work. Only relevant files included.');\n lines.push('');\n lines.push(`| Property | Value |`);\n lines.push(`|----------|-------|`);\n lines.push(`| Target files | ${focus.targetFiles.length} |`);\n lines.push(`| Dependencies | ${focus.dependencies.length} |`);\n lines.push(`| Total tokens | ~${Math.round(focus.totalTokens / 1000)}K |`);\n lines.push(`| Saved | ~${Math.round(focus.savedTokens / 1000)}K tokens (${focus.savingsPercent}% reduction) |`);\n lines.push('');\n\n lines.push('## Target Files (read these first)');\n lines.push('');\n for (const f of focus.targetFiles) {\n lines.push(`- \\`${f.relativePath}\\` (~${Math.round(f.tokens / 1000)}K tokens)`);\n }\n lines.push('');\n\n if (focus.dependencies.length > 0) {\n lines.push('## Dependencies (read on demand)');\n lines.push('');\n for (const f of focus.dependencies) {\n lines.push(`- \\`${f.relativePath}\\` (~${Math.round(f.tokens / 1000)}K tokens)`);\n }\n lines.push('');\n }\n\n lines.push('## Instructions');\n lines.push('');\n lines.push('- Focus ONLY on the target files listed above');\n lines.push('- Read dependencies only when needed to understand imports');\n lines.push('- Do NOT modify files outside this focus set unless asked');\n lines.push('');\n\n return lines.join('\\n');\n}\n","import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { resolve } from 'node:path';\nimport { loadAnalysis, analyzeProject } from '../../core/analyzer.js';\nimport { scanTodos } from '../../core/todo-scanner.js';\n\nexport const todoCommand = new Command('todo')\n .description('Scan codebase for TODO, FIXME, HACK comments — prioritized by tier')\n .argument('[path]', 'Project path', '.')\n .option('--type <type>', 'Filter by type: TODO, FIXME, HACK, XXX, NOTE')\n .option('--priority <priority>', 'Filter by priority: high, medium, low')\n .option('--json', 'Output as JSON')\n .action(async (path: string, opts: { type?: string; priority?: string; json?: boolean }) => {\n const projectPath = resolve(path);\n\n let analysis = await loadAnalysis(projectPath);\n if (!analysis) analysis = await analyzeProject(projectPath);\n\n const result = await scanTodos(analysis.files);\n\n let items = result.items;\n if (opts.type) items = items.filter((i) => i.type === opts.type!.toUpperCase());\n if (opts.priority) items = items.filter((i) => i.priority === opts.priority);\n\n if (opts.json) {\n console.log(JSON.stringify({ totalCount: items.length, items }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold.cyan('📝 TODO Scanner'));\n console.log('');\n\n if (items.length === 0) {\n console.log(chalk.green(' ✓ No TODO/FIXME/HACK found — clean codebase!'));\n console.log('');\n return;\n }\n\n // Summary\n const high = items.filter((i) => i.priority === 'high').length;\n const medium = items.filter((i) => i.priority === 'medium').length;\n const low = items.filter((i) => i.priority === 'low').length;\n console.log(` Found ${chalk.bold(String(items.length))} items: ${chalk.red(`${high} high`)} · ${chalk.yellow(`${medium} medium`)} · ${chalk.dim(`${low} low`)}`);\n console.log('');\n\n // By type\n const typeCount = Object.entries(result.byType).map(([t, items]) => `${items.length} ${t}`).join(' · ');\n console.log(chalk.dim(` ${typeCount}`));\n console.log('');\n\n // List items\n for (const item of items.slice(0, 30)) {\n const icon = item.priority === 'high' ? chalk.red('●') : item.priority === 'medium' ? chalk.yellow('●') : chalk.dim('●');\n const typeTag = item.type === 'FIXME' ? chalk.red(item.type) : item.type === 'HACK' ? chalk.magenta(item.type) : item.type === 'TODO' ? chalk.yellow(item.type) : chalk.dim(item.type);\n const tierTag = item.tier === 'hot' ? chalk.red('hot') : item.tier === 'warm' ? chalk.yellow('warm') : chalk.dim('cold');\n\n console.log(` ${icon} ${typeTag.padEnd(18)} ${chalk.dim(`[${tierTag}]`)} ${chalk.dim(`${item.file}:${item.line}`)}`);\n console.log(` ${item.text}`);\n }\n\n if (items.length > 30) {\n console.log('');\n console.log(chalk.dim(` ... and ${items.length - 30} more`));\n }\n\n console.log('');\n });\n","import { readFile } from 'node:fs/promises';\nimport type { FileInfo } from '../types/index.js';\n\n// --- TODO Scanner ---\n// Scans codebase for TODO, FIXME, HACK, XXX comments.\n// Prioritizes by tier (hot > warm > cold) and file complexity.\n\nexport interface TodoItem {\n file: string;\n line: number;\n type: 'TODO' | 'FIXME' | 'HACK' | 'XXX' | 'NOTE';\n text: string;\n tier: 'hot' | 'warm' | 'cold';\n priority: 'high' | 'medium' | 'low';\n}\n\nexport interface TodoScanResult {\n items: TodoItem[];\n byType: Record<string, TodoItem[]>;\n byPriority: Record<string, TodoItem[]>;\n totalCount: number;\n}\n\nconst TODO_PATTERNS: Array<{ type: TodoItem['type']; regex: RegExp }> = [\n { type: 'FIXME', regex: /\\/\\/\\s*FIXME[:\\s]*(.*)/i },\n { type: 'TODO', regex: /\\/\\/\\s*TODO[:\\s]*(.*)/i },\n { type: 'HACK', regex: /\\/\\/\\s*HACK[:\\s]*(.*)/i },\n { type: 'XXX', regex: /\\/\\/\\s*XXX[:\\s]*(.*)/i },\n { type: 'NOTE', regex: /\\/\\/\\s*NOTE[:\\s]*(.*)/i },\n // Also match # comments (Python, Ruby, YAML)\n { type: 'FIXME', regex: /#\\s*FIXME[:\\s]*(.*)/i },\n { type: 'TODO', regex: /#\\s*TODO[:\\s]*(.*)/i },\n { type: 'HACK', regex: /#\\s*HACK[:\\s]*(.*)/i },\n];\n\nfunction getPriority(type: TodoItem['type'], tier: TodoItem['tier']): TodoItem['priority'] {\n if (type === 'FIXME' || type === 'HACK') {\n return tier === 'hot' ? 'high' : tier === 'warm' ? 'high' : 'medium';\n }\n if (type === 'TODO') {\n return tier === 'hot' ? 'high' : tier === 'warm' ? 'medium' : 'low';\n }\n if (type === 'XXX') return tier === 'hot' ? 'high' : 'medium';\n return 'low';\n}\n\nexport async function scanTodos(files: FileInfo[]): Promise<TodoScanResult> {\n const items: TodoItem[] = [];\n\n for (const file of files) {\n try {\n const content = await readFile(file.path, 'utf-8');\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n for (const pattern of TODO_PATTERNS) {\n const match = line.match(pattern.regex);\n if (match) {\n const text = match[1]?.trim() || '(no description)';\n items.push({\n file: file.relativePath,\n line: i + 1,\n type: pattern.type,\n text,\n tier: file.tier,\n priority: getPriority(pattern.type, file.tier),\n });\n break; // Only match first pattern per line\n }\n }\n }\n } catch {\n // Skip files that can't be read\n }\n }\n\n // Sort: high priority first, then by tier (hot > warm > cold)\n const tierOrder: Record<string, number> = { hot: 0, warm: 1, cold: 2 };\n const prioOrder: Record<string, number> = { high: 0, medium: 1, low: 2 };\n\n items.sort((a, b) =>\n prioOrder[a.priority] - prioOrder[b.priority] ||\n tierOrder[a.tier] - tierOrder[b.tier],\n );\n\n // Group\n const byType: Record<string, TodoItem[]> = {};\n const byPriority: Record<string, TodoItem[]> = {};\n\n for (const item of items) {\n (byType[item.type] ??= []).push(item);\n (byPriority[item.priority] ??= []).push(item);\n }\n\n return { items, byType, byPriority, totalCount: items.length };\n}\n"],"mappings":"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","names":["Command","chalk","chalk","resolve","readFile","join","readFile","resolve","relative","join","existsSync","estimateTokens","resolve","readFile","chalk","Command","chalk","Table","Command","chalk","Table","Command","chalk","join","readFile","resolve","relative","readFile","relative","resolve","join","Command","chalk","Command","resolve","Command","resolve","Command","chalk","resolve","join","basename","join","basename","Command","resolve","chalk","Command","chalk","resolve","Command","resolve","chalk","Command","chalk","resolve","Command","resolve","chalk","Command","chalk","resolve","input","resolve","resolve","Command","resolve","input","chalk","Command","chalk","resolve","input","join","resolve","readFile","writeFile","mkdir","parse","stringify","join","resolve","mkdir","writeFile","stringify","readFile","join","resolve","existsSync","Command","resolve","chalk","configPath","aiTarget","model","hotDaysStr","input","warmDaysStr","Command","chalk","resolve","select","Command","chalk","resolve","select","Command","chalk","resolve","Command","chalk","resolve","Command","chalk","Table","resolve","Command","resolve","chalk","Table","Command","chalk","resolve","resolve","extname","resolve","extname","prevTier","Command","resolve","chalk","Command","chalk","resolve","resolve","randomUUID","readdir","join","resolve","randomUUID","unlink","Command","resolve","chalk","Command","chalk","resolve","resolve","basename","chalk","resolve","basename","chalk","Command","resolve","chalk","Command","chalk","resolve","resolve","basename","chalk","resolve","basename","chalk","header","Command","resolve","chalk","writeFile","Command","chalk","resolve","existsSync","stat","createHash","readFile","readdir","stat","join","createHash","readFile","join","stat","readdir","readdir","join","stat","randomUUID","createHash","readdir","chmod","join","join","createHash","randomUUID","chmod","readdir","unlink","Command","resolve","existsSync","stat","chalk","Command","chalk","resolve","Command","resolve","chalk","Command","chalk","resolve","Command","resolve","chalk","Command","chalk","resolve","readFile","extname","TS_EXTENSIONS","content","readFile","extname","Command","resolve","chalk","Command","chalk","resolve","Command","resolve","chalk","Command","chalk","resolve","join","resolve","resolve","resolve","execFile","promisify","exec","git","resolve","Command","resolve","chalk","join","Command","chalk","resolve","join","Command","resolve","chalk","join","Command","chalk","resolve","resolve","Command","resolve","chalk","Command","chalk","resolve","Command","chalk","resolve","Command","chalk","resolve","join","resolve","relative","resolve","relative","Command","resolve","chalk","join","Command","chalk","resolve","join","Command","resolve","chalk","join","Command","chalk","resolve","join","resolve","relative","Command","resolve","chalk","join","Command","chalk","resolve","readFile","Command","resolve","chalk","items","Command","chalk"]}