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.
- package/LICENSE +21 -0
- package/README.md +326 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +6331 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/core/index.d.ts +717 -0
- package/dist/core/index.js +4446 -0
- package/dist/core/index.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +15336 -0
- package/dist/mcp/index.js.map +1 -0
- package/package.json +85 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/analyzer.ts","../../src/core/config.ts","../../src/utils/constants.ts","../../src/utils/paths.ts","../../src/utils/fs.ts","../../src/core/tiering.ts","../../src/core/tokenizer.ts","../../src/core/ast.ts","../../src/core/generator.ts","../../src/core/security.ts","../../src/core/session.ts","../../src/core/clean.ts","../../src/utils/format.ts","../../src/core/prompts.ts","../../src/core/watcher.ts","../../src/core/sessions.ts","../../src/core/dashboard.ts","../../src/core/reports.ts","../../src/core/audit.ts","../../src/core/integrity.ts","../../src/core/pruning.ts","../../src/core/git.ts","../../src/core/costs.ts","../../src/core/budget.ts","../../src/core/prompt-engineer.ts","../../src/core/adapters.ts","../../src/core/pr-context.ts","../../src/core/explain.ts","../../src/core/routing.ts","../../src/core/local-config.ts","../../src/core/sdd.ts","../../src/core/focus.ts","../../src/core/todo-scanner.ts","../../src/core/gitignore-parser.ts"],"sourcesContent":["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 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 { 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 { 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 { 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 { 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 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 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 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 { 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 { 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 { 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 { 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 { 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 { 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 { 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 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 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 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 { 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 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 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 { 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 { 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 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 { 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","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"],"mappings":"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","names":["resolve","readFile","join","readFile","stat","readFile","resolve","relative","join","existsSync","estimateTokens","resolve","readFile","join","readFile","resolve","relative","join","join","basename","join","basename","resolve","resolve","resolve","extname","resolve","extname","prevTier","resolve","randomUUID","readdir","join","resolve","randomUUID","unlink","resolve","basename","chalk","resolve","basename","chalk","resolve","basename","chalk","resolve","basename","chalk","randomUUID","createHash","readdir","join","join","createHash","randomUUID","readdir","unlink","createHash","readFile","readdir","stat","chmod","join","createHash","readFile","join","stat","chmod","readdir","unlink","readFile","extname","TS_EXTENSIONS","content","readFile","extname","resolve","resolve","execFile","promisify","exec","git","resolve","resolve","join","resolve","readFile","writeFile","mkdir","parse","stringify","join","resolve","mkdir","writeFile","stringify","readFile","parse","resolve","relative","resolve","relative","resolve","relative","readFile","readFile","join","resolve","existsSync"]}
|