ctxo-mcp 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +58 -19
- package/dist/{chunk-BMB6SQIR.js → chunk-WZKXGKKI.js} +151 -10
- package/dist/chunk-WZKXGKKI.js.map +1 -0
- package/dist/{cli-router-Z5CSD6QN.js → cli-router-H557TJAM.js} +165 -2
- package/dist/cli-router-H557TJAM.js.map +1 -0
- package/dist/index.js +79 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-BMB6SQIR.js.map +0 -1
- package/dist/cli-router-Z5CSD6QN.js.map +0 -1
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts","../src/adapters/storage/sqlite-storage-adapter.ts","../src/adapters/git/simple-git-adapter.ts","../src/core/why-context/revert-detector.ts","../src/core/co-change/co-change-analyzer.ts"],"sourcesContent":["/**\n * Structured logger for Ctxo — all output goes to stderr (stdout reserved for MCP JSON-RPC).\n *\n * Supports debug mode via DEBUG environment variable:\n * DEBUG=ctxo:* — all debug output\n * DEBUG=ctxo:git — only git adapter debug\n * DEBUG=ctxo:index — only indexing debug\n * DEBUG=ctxo:mcp — only MCP handler debug\n * DEBUG=ctxo:storage — only storage adapter debug\n * DEBUG=ctxo:masking — only masking pipeline debug\n *\n * Always outputs: info, warn, error (regardless of DEBUG).\n * Only outputs debug when matching namespace is enabled.\n */\n\nfunction isDebugEnabled(namespace: string): boolean {\n const debugEnv = process.env['DEBUG'] ?? '';\n if (!debugEnv) return false;\n const patterns = debugEnv.split(',').map(p => p.trim());\n return patterns.some(p => {\n if (p === '*' || p === 'ctxo:*') return true;\n if (p === namespace) return true;\n if (p.endsWith(':*') && namespace.startsWith(p.slice(0, -1))) return true;\n return false;\n });\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n}\n\nexport function createLogger(namespace: string): Logger {\n const prefix = `[${namespace}]`;\n\n return {\n debug(message: string, ...args: unknown[]) {\n if (isDebugEnabled(namespace)) {\n console.error(`${prefix} DEBUG ${message}`, ...args);\n }\n },\n info(message: string, ...args: unknown[]) {\n console.error(`${prefix} ${message}`, ...args);\n },\n warn(message: string, ...args: unknown[]) {\n console.error(`${prefix} WARN ${message}`, ...args);\n },\n error(message: string, ...args: unknown[]) {\n console.error(`${prefix} ERROR ${message}`, ...args);\n },\n };\n}\n","import initSqlJs, { type Database } from 'sql.js';\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport type { FileIndex, GraphEdge, SymbolNode } from '../../core/types.js';\nimport type { IStoragePort } from '../../ports/i-storage-port.js';\nimport { JsonIndexReader } from './json-index-reader.js';\nimport { createLogger } from '../../core/logger.js';\n\nconst log = createLogger('ctxo:storage');\n\nexport class SqliteStorageAdapter implements IStoragePort {\n private db: Database | undefined;\n private readonly dbPath: string;\n private readonly ctxoRoot: string;\n\n constructor(ctxoRoot: string) {\n this.ctxoRoot = ctxoRoot;\n this.dbPath = join(ctxoRoot, '.cache', 'symbols.db');\n }\n\n async init(): Promise<void> {\n const SQL = await initSqlJs();\n\n if (existsSync(this.dbPath)) {\n try {\n const buffer = readFileSync(this.dbPath);\n this.db = new SQL.Database(buffer);\n this.verifyIntegrity();\n } catch {\n log.warn('Corrupt DB detected, rebuilding from JSON index');\n this.db = new SQL.Database();\n this.createTables();\n }\n } else {\n this.db = new SQL.Database();\n this.createTables();\n }\n\n // Always rebuild from JSON — it is the source of truth\n this.rebuildFromJson();\n }\n\n async initEmpty(): Promise<void> {\n const SQL = await initSqlJs();\n this.db = new SQL.Database();\n this.createTables();\n }\n\n private database(): Database {\n if (!this.db) {\n throw new Error('SqliteStorageAdapter not initialized. Call init() first.');\n }\n return this.db;\n }\n\n private verifyIntegrity(): void {\n const db = this.database();\n const result = db.exec('PRAGMA integrity_check');\n const firstRow = result[0]?.values[0];\n if (!firstRow || firstRow[0] !== 'ok') {\n throw new Error('SQLite integrity check failed');\n }\n\n const tables = db.exec(\n \"SELECT name FROM sqlite_master WHERE type='table' AND name IN ('symbols', 'edges', 'files')\",\n );\n if (!tables[0] || tables[0].values.length < 3) {\n throw new Error('Missing required tables');\n }\n }\n\n private createTables(): void {\n const db = this.database();\n db.run(`\n CREATE TABLE IF NOT EXISTS files (\n file_path TEXT PRIMARY KEY,\n last_modified INTEGER NOT NULL\n )\n `);\n db.run(`\n CREATE TABLE IF NOT EXISTS symbols (\n symbol_id TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n kind TEXT NOT NULL,\n file_path TEXT NOT NULL,\n start_line INTEGER NOT NULL,\n end_line INTEGER NOT NULL\n )\n `);\n db.run(`\n CREATE TABLE IF NOT EXISTS edges (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n from_symbol TEXT NOT NULL,\n to_symbol TEXT NOT NULL,\n kind TEXT NOT NULL\n )\n `);\n db.run('CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_path)');\n db.run('CREATE INDEX IF NOT EXISTS idx_edges_from ON edges(from_symbol)');\n db.run('CREATE INDEX IF NOT EXISTS idx_edges_to ON edges(to_symbol)');\n }\n\n private rebuildFromJson(): void {\n const reader = new JsonIndexReader(this.ctxoRoot);\n const indices = reader.readAll();\n\n if (indices.length > 0) {\n this.bulkWrite(indices);\n }\n }\n\n writeSymbolFile(fileIndex: FileIndex): void {\n const db = this.database();\n\n db.run('BEGIN TRANSACTION');\n try {\n this.deleteFileData(db, fileIndex.file);\n\n db.run(\n 'INSERT INTO files (file_path, last_modified) VALUES (?, ?)',\n [fileIndex.file, fileIndex.lastModified],\n );\n\n for (const sym of fileIndex.symbols) {\n db.run(\n 'INSERT OR REPLACE INTO symbols (symbol_id, name, kind, file_path, start_line, end_line) VALUES (?, ?, ?, ?, ?, ?)',\n [sym.symbolId, sym.name, sym.kind, fileIndex.file, sym.startLine, sym.endLine],\n );\n }\n\n for (const edge of fileIndex.edges) {\n db.run(\n 'INSERT INTO edges (from_symbol, to_symbol, kind) VALUES (?, ?, ?)',\n [edge.from, edge.to, edge.kind],\n );\n }\n\n db.run('COMMIT');\n this.persistIfNeeded();\n } catch (err) {\n db.run('ROLLBACK');\n throw err;\n }\n }\n\n /**\n * Read symbol file from SQLite cache.\n * NOTE: SQLite only caches symbols + edges (graph topology).\n * intent, antiPatterns, and complexity live in committed JSON index only.\n * Use JsonIndexReader for full FileIndex data.\n */\n readSymbolFile(relativePath: string): FileIndex | undefined {\n const db = this.database();\n\n const fileResult = db.exec(\n 'SELECT file_path, last_modified FROM files WHERE file_path = ?',\n [relativePath],\n );\n if (!fileResult[0] || fileResult[0].values.length === 0) {\n return undefined;\n }\n\n const [filePath, lastModified] = fileResult[0].values[0] as [string, number];\n\n const symbols = this.getSymbolsForFile(db, filePath);\n const edges = this.getEdgesForFile(db, filePath);\n\n return {\n file: filePath,\n lastModified,\n symbols,\n edges,\n // Not stored in SQLite — use JsonIndexReader for these fields\n intent: [],\n antiPatterns: [],\n };\n }\n\n listIndexedFiles(): string[] {\n const db = this.database();\n const result = db.exec('SELECT file_path FROM files ORDER BY file_path');\n if (!result[0]) return [];\n return result[0].values.map((row) => row[0] as string);\n }\n\n deleteSymbolFile(relativePath: string): void {\n const db = this.database();\n this.deleteFileData(db, relativePath);\n }\n\n getSymbolById(symbolId: string): SymbolNode | undefined {\n const db = this.database();\n const result = db.exec(\n 'SELECT symbol_id, name, kind, start_line, end_line FROM symbols WHERE symbol_id = ?',\n [symbolId],\n );\n if (!result[0] || result[0].values.length === 0) {\n return undefined;\n }\n\n const [sid, name, kind, startLine, endLine] = result[0].values[0] as [string, string, string, number, number];\n return { symbolId: sid, name, kind: kind as SymbolNode['kind'], startLine, endLine };\n }\n\n getEdgesFrom(symbolId: string): GraphEdge[] {\n const db = this.database();\n const result = db.exec(\n 'SELECT from_symbol, to_symbol, kind FROM edges WHERE from_symbol = ?',\n [symbolId],\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n from: row[0] as string,\n to: row[1] as string,\n kind: row[2] as GraphEdge['kind'],\n }));\n }\n\n getEdgesTo(symbolId: string): GraphEdge[] {\n const db = this.database();\n const result = db.exec(\n 'SELECT from_symbol, to_symbol, kind FROM edges WHERE to_symbol = ?',\n [symbolId],\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n from: row[0] as string,\n to: row[1] as string,\n kind: row[2] as GraphEdge['kind'],\n }));\n }\n\n getAllSymbols(): SymbolNode[] {\n const db = this.database();\n const result = db.exec(\n 'SELECT symbol_id, name, kind, start_line, end_line FROM symbols',\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n symbolId: row[0] as string,\n name: row[1] as string,\n kind: row[2] as SymbolNode['kind'],\n startLine: row[3] as number,\n endLine: row[4] as number,\n }));\n }\n\n getAllEdges(): GraphEdge[] {\n const db = this.database();\n const result = db.exec(\n 'SELECT from_symbol, to_symbol, kind FROM edges',\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n from: row[0] as string,\n to: row[1] as string,\n kind: row[2] as GraphEdge['kind'],\n }));\n }\n\n bulkWrite(indices: FileIndex[]): void {\n const db = this.database();\n\n db.run('BEGIN TRANSACTION');\n try {\n for (const fileIndex of indices) {\n this.deleteFileData(db, fileIndex.file);\n\n db.run(\n 'INSERT INTO files (file_path, last_modified) VALUES (?, ?)',\n [fileIndex.file, fileIndex.lastModified],\n );\n\n for (const sym of fileIndex.symbols) {\n db.run(\n 'INSERT OR REPLACE INTO symbols (symbol_id, name, kind, file_path, start_line, end_line) VALUES (?, ?, ?, ?, ?, ?)',\n [sym.symbolId, sym.name, sym.kind, fileIndex.file, sym.startLine, sym.endLine],\n );\n }\n\n for (const edge of fileIndex.edges) {\n db.run(\n 'INSERT INTO edges (from_symbol, to_symbol, kind) VALUES (?, ?, ?)',\n [edge.from, edge.to, edge.kind],\n );\n }\n }\n\n db.run('COMMIT');\n this.persistIfNeeded();\n } catch (err) {\n db.run('ROLLBACK');\n throw err;\n }\n }\n\n persist(): void {\n const db = this.database();\n const data = db.export();\n const buffer = Buffer.from(data);\n mkdirSync(dirname(this.dbPath), { recursive: true });\n writeFileSync(this.dbPath, buffer);\n }\n\n close(): void {\n if (this.db) {\n this.persist();\n this.db.close();\n this.db = undefined;\n }\n }\n\n private persistIfNeeded(): void {\n try {\n this.persist();\n } catch (err) {\n log.error(`Failed to persist DB: ${(err as Error).message}`);\n }\n }\n\n private deleteFileData(db: Database, filePath: string): void {\n // Delete edges originating from this file's symbols\n const symResult = db.exec(\n 'SELECT symbol_id FROM symbols WHERE file_path = ?',\n [filePath],\n );\n if (symResult[0]) {\n for (const row of symResult[0].values) {\n db.run('DELETE FROM edges WHERE from_symbol = ?', [row[0]]);\n }\n }\n db.run('DELETE FROM symbols WHERE file_path = ?', [filePath]);\n db.run('DELETE FROM files WHERE file_path = ?', [filePath]);\n }\n\n private getSymbolsForFile(db: Database, filePath: string): SymbolNode[] {\n const result = db.exec(\n 'SELECT symbol_id, name, kind, start_line, end_line FROM symbols WHERE file_path = ? ORDER BY start_line',\n [filePath],\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n symbolId: row[0] as string,\n name: row[1] as string,\n kind: row[2] as SymbolNode['kind'],\n startLine: row[3] as number,\n endLine: row[4] as number,\n }));\n }\n\n private getEdgesForFile(db: Database, filePath: string): GraphEdge[] {\n const result = db.exec(\n `SELECT e.from_symbol, e.to_symbol, e.kind FROM edges e\n INNER JOIN symbols s ON e.from_symbol = s.symbol_id\n WHERE s.file_path = ?`,\n [filePath],\n );\n if (!result[0]) return [];\n return result[0].values.map((row) => ({\n from: row[0] as string,\n to: row[1] as string,\n kind: row[2] as GraphEdge['kind'],\n }));\n }\n}\n","import { simpleGit, type SimpleGit } from 'simple-git';\nimport type { IGitPort } from '../../ports/i-git-port.js';\nimport type { CommitRecord, ChurnData } from '../../core/types.js';\nimport { createLogger } from '../../core/logger.js';\n\nconst log = createLogger('ctxo:git');\n\nexport class SimpleGitAdapter implements IGitPort {\n private readonly git: SimpleGit;\n\n constructor(projectRoot: string) {\n this.git = simpleGit(projectRoot);\n log.debug('Initialized with root: %s', projectRoot);\n }\n\n async isAvailable(): Promise<boolean> {\n try {\n await this.git.version();\n return true;\n } catch {\n return false;\n }\n }\n\n async getCommitHistory(filePath: string, maxCount?: number): Promise<CommitRecord[]> {\n try {\n const log = await this.git.log({\n file: filePath,\n '--follow': null,\n ...(maxCount ? { maxCount } : {}),\n });\n\n return log.all.map((entry) => ({\n hash: entry.hash,\n message: entry.message,\n date: entry.date,\n author: entry.author_name,\n }));\n } catch (err) {\n log.error(` Failed to get history for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n async getBatchHistory(maxCount = 20): Promise<Map<string, CommitRecord[]>> {\n try {\n const log = await this.git.log({ maxCount: maxCount * 50, '--name-only': null });\n const result = new Map<string, CommitRecord[]>();\n\n for (const entry of log.all) {\n const record: CommitRecord = {\n hash: entry.hash,\n message: entry.message,\n date: entry.date,\n author: entry.author_name,\n };\n\n const diff = entry.diff;\n const files: string[] = diff?.files?.map((f: { file: string }) => f.file.replace(/\\\\/g, '/')) ?? [];\n\n for (const file of files) {\n let list = result.get(file);\n if (!list) { list = []; result.set(file, list); }\n if (list.length < maxCount) {\n list.push(record);\n }\n }\n }\n\n return result;\n } catch (err) {\n log.error(` Batch history failed: ${(err as Error).message}`);\n return new Map();\n }\n }\n\n async getChangedFiles(since: string): Promise<string[]> {\n try {\n const diff = await this.git.diffSummary([since]);\n return diff.files.map((f) => f.file.replace(/\\\\/g, '/'));\n } catch (err) {\n log.error(` Failed to get changed files since ${since}: ${(err as Error).message}`);\n return [];\n }\n }\n\n async getFileChurn(filePath: string): Promise<ChurnData> {\n try {\n const log = await this.git.log({ file: filePath, '--follow': null });\n\n return {\n filePath,\n commitCount: log.total,\n };\n } catch (err) {\n log.error(` Failed to get churn for ${filePath}: ${(err as Error).message}`);\n return { filePath, commitCount: 0 };\n }\n }\n}\n","import type { CommitRecord, AntiPattern } from '../types.js';\n\n// Explicit revert patterns\nconst REVERT_QUOTED_PATTERN = /^Revert \"(.+)\"$/;\nconst REVERT_PREFIX_PATTERN = /^revert:\\s*(.+)$/i;\n\n// Undo/rollback patterns\nconst UNDO_PATTERN = /^undo[:\\s]/i;\nconst ROLLBACK_PATTERN = /^rollback[:\\s]/i;\n\n// Indirect revert indicators (keywords in commit message body)\nconst INDIRECT_KEYWORDS = [\n /\\brevert(?:s|ed|ing)?\\b/i,\n /\\broll(?:s|ed|ing)?\\s*back\\b/i,\n /\\bundo(?:es|ne|ing)?\\b/i,\n /\\bbacked?\\s*out\\b/i,\n /\\bremov(?:e|es|ed|ing)\\s+(?:broken|buggy|faulty)\\b/i,\n];\n\nexport class RevertDetector {\n detect(commits: readonly CommitRecord[]): AntiPattern[] {\n const antiPatterns: AntiPattern[] = [];\n\n for (const commit of commits) {\n if (!commit.message) continue;\n\n if (this.isRevert(commit.message)) {\n antiPatterns.push({\n hash: commit.hash,\n message: commit.message,\n date: commit.date,\n });\n }\n }\n\n return antiPatterns;\n }\n\n private isRevert(message: string): boolean {\n // Explicit patterns (high confidence)\n if (REVERT_QUOTED_PATTERN.test(message)) return true;\n if (REVERT_PREFIX_PATTERN.test(message)) return true;\n if (UNDO_PATTERN.test(message)) return true;\n if (ROLLBACK_PATTERN.test(message)) return true;\n\n // Indirect indicators (keyword search in full message)\n for (const pattern of INDIRECT_KEYWORDS) {\n if (pattern.test(message)) return true;\n }\n\n return false;\n }\n}\n","import type { CoChangeEntry, CoChangeMatrix, FileIndex } from '../types.js';\n\nconst MIN_SHARED_COMMITS = 2;\nconst MIN_FREQUENCY = 0.1;\n\nexport function aggregateCoChanges(indices: readonly FileIndex[]): CoChangeMatrix {\n // Step 1: Build commit → files map\n const commitToFiles = new Map<string, Set<string>>();\n const fileCommitCounts = new Map<string, number>();\n\n for (const idx of indices) {\n const file = idx.file;\n let count = 0;\n for (const intent of idx.intent) {\n count++;\n let files = commitToFiles.get(intent.hash);\n if (!files) {\n files = new Set();\n commitToFiles.set(intent.hash, files);\n }\n files.add(file);\n }\n if (count > 0) {\n fileCommitCounts.set(file, count);\n }\n }\n\n // Step 2: Count shared commits per file pair\n const pairCounts = new Map<string, number>();\n for (const files of commitToFiles.values()) {\n if (files.size < 2) continue;\n const sorted = [...files].sort();\n for (let i = 0; i < sorted.length; i++) {\n for (let j = i + 1; j < sorted.length; j++) {\n const key = `${sorted[i]}|${sorted[j]}`;\n pairCounts.set(key, (pairCounts.get(key) ?? 0) + 1);\n }\n }\n }\n\n // Step 3: Calculate frequency and filter\n const entries: CoChangeEntry[] = [];\n for (const [key, sharedCommits] of pairCounts) {\n if (sharedCommits < MIN_SHARED_COMMITS) continue;\n\n const [file1, file2] = key.split('|') as [string, string];\n const count1 = fileCommitCounts.get(file1) ?? 0;\n const count2 = fileCommitCounts.get(file2) ?? 0;\n const minCount = Math.min(count1, count2);\n if (minCount === 0) continue;\n\n const frequency = Math.round((sharedCommits / minCount) * 1000) / 1000;\n if (frequency < MIN_FREQUENCY) continue;\n\n entries.push({ file1, file2, sharedCommits, frequency });\n }\n\n entries.sort((a, b) => b.frequency - a.frequency || b.sharedCommits - a.sharedCommits);\n\n return {\n version: 1,\n timestamp: Math.floor(Date.now() / 1000),\n entries,\n };\n}\n\nexport function loadCoChangeMap(matrix: CoChangeMatrix): Map<string, CoChangeEntry[]> {\n const map = new Map<string, CoChangeEntry[]>();\n for (const entry of matrix.entries) {\n let list1 = map.get(entry.file1);\n if (!list1) { list1 = []; map.set(entry.file1, list1); }\n list1.push(entry);\n\n let list2 = map.get(entry.file2);\n if (!list2) { list2 = []; map.set(entry.file2, list2); }\n list2.push(entry);\n }\n return map;\n}\n"],"mappings":"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","names":["log"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/adapters/language/tree-sitter-adapter.ts","../src/adapters/language/go-adapter.ts","../src/adapters/language/csharp-adapter.ts","../src/cli/index-command.ts","../src/core/staleness/content-hasher.ts","../src/adapters/language/ts-morph-adapter.ts","../src/adapters/language/language-adapter-registry.ts","../src/adapters/storage/json-index-writer.ts","../src/adapters/storage/schema-manager.ts","../src/cli/sync-command.ts","../src/cli/status-command.ts","../src/cli/verify-command.ts","../src/cli/init-command.ts","../src/cli/watch-command.ts","../src/adapters/watcher/chokidar-watcher-adapter.ts","../src/cli/cli-router.ts"],"sourcesContent":["import Parser from 'tree-sitter';\nimport type { Tree, SyntaxNode } from 'tree-sitter';\ntype Language = Parameters<InstanceType<typeof Parser>['setLanguage']>[0];\nimport { extname } from 'node:path';\nimport type { SymbolNode, GraphEdge, ComplexityMetrics, SymbolKind } from '../../core/types.js';\nimport type { ILanguageAdapter } from '../../ports/i-language-adapter.js';\n\nexport abstract class TreeSitterAdapter implements ILanguageAdapter {\n abstract readonly extensions: readonly string[];\n readonly tier = 'syntax' as const;\n\n protected parser: Parser;\n protected symbolRegistry = new Map<string, SymbolKind>();\n\n constructor(language: Language) {\n this.parser = new Parser();\n this.parser.setLanguage(language);\n }\n\n isSupported(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n return (this.extensions as readonly string[]).includes(ext);\n }\n\n setSymbolRegistry(registry: Map<string, SymbolKind>): void {\n this.symbolRegistry = registry;\n }\n\n protected parse(source: string): Tree {\n return this.parser.parse(source);\n }\n\n protected buildSymbolId(filePath: string, name: string, kind: SymbolKind): string {\n return `${filePath}::${name}::${kind}`;\n }\n\n protected nodeToLineRange(node: SyntaxNode): {\n startLine: number;\n endLine: number;\n startOffset: number;\n endOffset: number;\n } {\n return {\n startLine: node.startPosition.row,\n endLine: node.endPosition.row,\n startOffset: node.startIndex,\n endOffset: node.endIndex,\n };\n }\n\n protected countCyclomaticComplexity(node: SyntaxNode, branchTypes: string[]): number {\n let complexity = 1;\n const visit = (n: SyntaxNode) => {\n if (branchTypes.includes(n.type)) {\n complexity++;\n }\n for (let i = 0; i < n.childCount; i++) {\n visit(n.child(i)!);\n }\n };\n visit(node);\n return complexity;\n }\n\n abstract extractSymbols(filePath: string, source: string): SymbolNode[];\n abstract extractEdges(filePath: string, source: string): GraphEdge[];\n abstract extractComplexity(filePath: string, source: string): ComplexityMetrics[];\n}\n","import GoLanguage from 'tree-sitter-go';\nimport type { SyntaxNode } from 'tree-sitter';\nimport { TreeSitterAdapter } from './tree-sitter-adapter.js';\nimport type { SymbolNode, GraphEdge, ComplexityMetrics } from '../../core/types.js';\n\nconst GO_BRANCH_TYPES = [\n 'if_statement', 'for_statement',\n 'expression_switch_statement', 'type_switch_statement',\n 'expression_case', 'type_case',\n 'select_statement', 'communication_case',\n];\n\nexport class GoAdapter extends TreeSitterAdapter {\n readonly extensions = ['.go'] as const;\n\n constructor() {\n super(GoLanguage);\n }\n\n extractSymbols(filePath: string, source: string): SymbolNode[] {\n try {\n const tree = this.parse(source);\n const symbols: SymbolNode[] = [];\n\n for (let i = 0; i < tree.rootNode.childCount; i++) {\n const node = tree.rootNode.child(i)!;\n\n if (node.type === 'function_declaration') {\n const name = node.childForFieldName('name')?.text;\n if (!name || !this.isExported(name)) continue;\n const range = this.nodeToLineRange(node);\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'function'),\n name,\n kind: 'function',\n ...range,\n });\n }\n\n if (node.type === 'method_declaration') {\n const methodName = node.childForFieldName('name')?.text;\n if (!methodName || !this.isExported(methodName)) continue;\n const receiverType = this.extractReceiverType(node);\n const qualifiedName = receiverType ? `${receiverType}.${methodName}` : methodName;\n const range = this.nodeToLineRange(node);\n symbols.push({\n symbolId: this.buildSymbolId(filePath, qualifiedName, 'method'),\n name: qualifiedName,\n kind: 'method',\n ...range,\n });\n }\n\n if (node.type === 'type_declaration') {\n this.extractTypeSymbols(node, filePath, symbols);\n }\n }\n\n return symbols;\n } catch (err) {\n console.error(`[ctxo:go] Symbol extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n extractEdges(filePath: string, source: string): GraphEdge[] {\n try {\n const tree = this.parse(source);\n const edges: GraphEdge[] = [];\n const firstExportedSymbol = this.findFirstExportedSymbolId(tree.rootNode, filePath);\n if (!firstExportedSymbol) return edges;\n\n for (let i = 0; i < tree.rootNode.childCount; i++) {\n const node = tree.rootNode.child(i)!;\n\n if (node.type === 'import_declaration') {\n this.extractImportEdges(node, filePath, firstExportedSymbol, edges);\n }\n }\n\n return edges;\n } catch (err) {\n console.error(`[ctxo:go] Edge extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n extractComplexity(filePath: string, source: string): ComplexityMetrics[] {\n try {\n const tree = this.parse(source);\n const metrics: ComplexityMetrics[] = [];\n\n for (let i = 0; i < tree.rootNode.childCount; i++) {\n const node = tree.rootNode.child(i)!;\n\n if (node.type === 'function_declaration') {\n const name = node.childForFieldName('name')?.text;\n if (!name || !this.isExported(name)) continue;\n metrics.push({\n symbolId: this.buildSymbolId(filePath, name, 'function'),\n cyclomatic: this.countCyclomaticComplexity(node, GO_BRANCH_TYPES),\n });\n }\n\n if (node.type === 'method_declaration') {\n const methodName = node.childForFieldName('name')?.text;\n if (!methodName || !this.isExported(methodName)) continue;\n const receiverType = this.extractReceiverType(node);\n const qualifiedName = receiverType ? `${receiverType}.${methodName}` : methodName;\n metrics.push({\n symbolId: this.buildSymbolId(filePath, qualifiedName, 'method'),\n cyclomatic: this.countCyclomaticComplexity(node, GO_BRANCH_TYPES),\n });\n }\n }\n\n return metrics;\n } catch (err) {\n console.error(`[ctxo:go] Complexity extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n // ── Private helpers ─────────────────────────────────────────\n\n private isExported(name: string): boolean {\n return name.length > 0 && name[0]! === name[0]!.toUpperCase() && name[0]! !== name[0]!.toLowerCase();\n }\n\n private extractReceiverType(methodNode: SyntaxNode): string | undefined {\n // method_declaration has parameter_list as first child (receiver)\n const params = methodNode.child(1);\n if (params?.type !== 'parameter_list') return undefined;\n\n for (let i = 0; i < params.childCount; i++) {\n const param = params.child(i)!;\n if (param.type === 'parameter_declaration') {\n // Find type identifier — may be pointer (*Type) or plain (Type)\n const typeNode = param.childForFieldName('type');\n if (typeNode) {\n const text = typeNode.text;\n return text.replace(/^\\*/, '');\n }\n }\n }\n return undefined;\n }\n\n private extractTypeSymbols(typeDecl: SyntaxNode, filePath: string, symbols: SymbolNode[]): void {\n for (let i = 0; i < typeDecl.childCount; i++) {\n const spec = typeDecl.child(i)!;\n if (spec.type !== 'type_spec') continue;\n\n const name = spec.childForFieldName('name')?.text;\n if (!name || !this.isExported(name)) continue;\n\n // Determine kind from the type body\n const typeBody = spec.childForFieldName('type');\n let kind: 'class' | 'interface' | 'type' = 'type';\n if (typeBody?.type === 'struct_type') kind = 'class';\n else if (typeBody?.type === 'interface_type') kind = 'interface';\n\n const range = this.nodeToLineRange(spec);\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, kind),\n name,\n kind,\n ...range,\n });\n }\n }\n\n private extractImportEdges(\n importDecl: SyntaxNode,\n _filePath: string,\n fromSymbol: string,\n edges: GraphEdge[],\n ): void {\n const visit = (node: SyntaxNode) => {\n if (node.type === 'import_spec') {\n const pathNode = node.childForFieldName('path') ?? node.child(0);\n if (pathNode) {\n const importPath = pathNode.text.replace(/\"/g, '');\n edges.push({\n from: fromSymbol,\n to: `${importPath}::${importPath.split('/').pop()}::variable`,\n kind: 'imports',\n });\n }\n }\n for (let i = 0; i < node.childCount; i++) {\n visit(node.child(i)!);\n }\n };\n visit(importDecl);\n }\n\n private findFirstExportedSymbolId(rootNode: SyntaxNode, filePath: string): string | undefined {\n for (let i = 0; i < rootNode.childCount; i++) {\n const node = rootNode.child(i)!;\n\n if (node.type === 'function_declaration') {\n const name = node.childForFieldName('name')?.text;\n if (name && this.isExported(name)) return this.buildSymbolId(filePath, name, 'function');\n }\n if (node.type === 'type_declaration') {\n for (let j = 0; j < node.childCount; j++) {\n const spec = node.child(j)!;\n if (spec.type === 'type_spec') {\n const name = spec.childForFieldName('name')?.text;\n if (name && this.isExported(name)) {\n const typeBody = spec.childForFieldName('type');\n const kind = typeBody?.type === 'struct_type' ? 'class' : typeBody?.type === 'interface_type' ? 'interface' : 'type';\n return this.buildSymbolId(filePath, name, kind);\n }\n }\n }\n }\n }\n return undefined;\n }\n}\n","import CSharpLanguage from 'tree-sitter-c-sharp';\nimport type { SyntaxNode } from 'tree-sitter';\nimport { TreeSitterAdapter } from './tree-sitter-adapter.js';\nimport type { SymbolNode, GraphEdge, ComplexityMetrics, SymbolKind } from '../../core/types.js';\n\nconst CSHARP_BRANCH_TYPES = [\n 'if_statement', 'for_statement', 'foreach_statement',\n 'while_statement', 'do_statement', 'switch_section',\n 'catch_clause', 'conditional_expression',\n];\n\nexport class CSharpAdapter extends TreeSitterAdapter {\n readonly extensions = ['.cs'] as const;\n\n constructor() {\n super(CSharpLanguage);\n }\n\n extractSymbols(filePath: string, source: string): SymbolNode[] {\n try {\n const tree = this.parse(source);\n const symbols: SymbolNode[] = [];\n this.visitSymbols(tree.rootNode, filePath, '', symbols);\n return symbols;\n } catch (err) {\n console.error(`[ctxo:csharp] Symbol extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n extractEdges(filePath: string, source: string): GraphEdge[] {\n try {\n const tree = this.parse(source);\n const edges: GraphEdge[] = [];\n const symbols = this.extractSymbols(filePath, source);\n const firstSymbol = symbols.length > 0 ? symbols[0]!.symbolId : undefined;\n if (!firstSymbol) return edges;\n\n this.visitEdges(tree.rootNode, filePath, firstSymbol, '', edges);\n return edges;\n } catch (err) {\n console.error(`[ctxo:csharp] Edge extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n extractComplexity(filePath: string, source: string): ComplexityMetrics[] {\n try {\n const tree = this.parse(source);\n const metrics: ComplexityMetrics[] = [];\n this.visitComplexity(tree.rootNode, filePath, '', metrics);\n return metrics;\n } catch (err) {\n console.error(`[ctxo:csharp] Complexity extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n }\n }\n\n // ── Symbol visitor ──────────────────────────────────────────\n\n private visitSymbols(\n node: SyntaxNode,\n filePath: string,\n namespace: string,\n symbols: SymbolNode[],\n ): void {\n if (node.type === 'namespace_declaration') {\n const name = node.childForFieldName('name')?.text ?? '';\n const ns = namespace ? `${namespace}.${name}` : name;\n for (let i = 0; i < node.childCount; i++) {\n this.visitSymbols(node.child(i)!, filePath, ns, symbols);\n }\n return;\n }\n\n if (node.type === 'declaration_list') {\n for (let i = 0; i < node.childCount; i++) {\n this.visitSymbols(node.child(i)!, filePath, namespace, symbols);\n }\n return;\n }\n\n const typeMapping: Record<string, SymbolKind> = {\n class_declaration: 'class',\n struct_declaration: 'class',\n record_declaration: 'class',\n interface_declaration: 'interface',\n enum_declaration: 'type',\n };\n\n const kind = typeMapping[node.type];\n if (kind) {\n if (!this.isPublic(node)) return;\n const name = node.childForFieldName('name')?.text;\n if (!name) return;\n\n const qualifiedName = namespace ? `${namespace}.${name}` : name;\n const range = this.nodeToLineRange(node);\n symbols.push({\n symbolId: this.buildSymbolId(filePath, qualifiedName, kind),\n name: qualifiedName,\n kind,\n ...range,\n });\n\n // Extract methods inside the class/struct/record\n if (kind === 'class') {\n this.extractMethodSymbols(node, filePath, qualifiedName, symbols);\n }\n return;\n }\n\n // Recurse into compilation_unit and other containers\n for (let i = 0; i < node.childCount; i++) {\n this.visitSymbols(node.child(i)!, filePath, namespace, symbols);\n }\n }\n\n private extractMethodSymbols(\n classNode: SyntaxNode,\n filePath: string,\n className: string,\n symbols: SymbolNode[],\n ): void {\n const declList = classNode.children.find(c => c.type === 'declaration_list');\n if (!declList) return;\n\n for (let i = 0; i < declList.childCount; i++) {\n const child = declList.child(i)!;\n if (child.type !== 'method_declaration' && child.type !== 'constructor_declaration') continue;\n if (!this.isPublic(child)) continue;\n\n const name = child.childForFieldName('name')?.text;\n if (!name) continue;\n\n const paramCount = this.countParameters(child);\n const qualifiedName = `${className}.${name}(${paramCount})`;\n const range = this.nodeToLineRange(child);\n symbols.push({\n symbolId: this.buildSymbolId(filePath, qualifiedName, 'method'),\n name: qualifiedName,\n kind: 'method',\n ...range,\n });\n }\n }\n\n // ── Edge visitor ────────────────────────────────────────────\n\n private visitEdges(\n node: SyntaxNode,\n filePath: string,\n fromSymbol: string,\n namespace: string,\n edges: GraphEdge[],\n ): void {\n if (node.type === 'using_directive') {\n const nameNode = node.children.find(c => c.type === 'identifier' || c.type === 'qualified_name');\n if (nameNode) {\n edges.push({\n from: fromSymbol,\n to: `${nameNode.text}::${nameNode.text.split('.').pop()}::variable`,\n kind: 'imports',\n });\n }\n return;\n }\n\n if (node.type === 'namespace_declaration') {\n const name = node.childForFieldName('name')?.text ?? '';\n const ns = namespace ? `${namespace}.${name}` : name;\n for (let i = 0; i < node.childCount; i++) {\n this.visitEdges(node.child(i)!, filePath, fromSymbol, ns, edges);\n }\n return;\n }\n\n if (node.type === 'class_declaration' || node.type === 'struct_declaration') {\n if (!this.isPublic(node)) return;\n const name = node.childForFieldName('name')?.text;\n if (!name) return;\n\n const qualifiedName = namespace ? `${namespace}.${name}` : name;\n const classSymbolId = this.buildSymbolId(filePath, qualifiedName, 'class');\n\n // Check base_list for extends/implements\n const baseList = node.children.find(c => c.type === 'base_list');\n if (baseList) {\n for (let i = 0; i < baseList.childCount; i++) {\n const child = baseList.child(i)!;\n if (child.type === 'identifier' || child.type === 'qualified_name') {\n const baseName = child.text;\n // Heuristic: I-prefix = interface → implements, otherwise extends\n const edgeKind = baseName.match(/^I[A-Z]/) ? 'implements' : 'extends';\n const targetKind = edgeKind === 'implements' ? 'interface' : 'class';\n edges.push({\n from: classSymbolId,\n to: this.resolveBaseType(baseName, namespace, targetKind),\n kind: edgeKind,\n });\n }\n }\n }\n }\n\n for (let i = 0; i < node.childCount; i++) {\n this.visitEdges(node.child(i)!, filePath, fromSymbol, namespace, edges);\n }\n }\n\n // ── Complexity visitor ──────────────────────────────────────\n\n private visitComplexity(\n node: SyntaxNode,\n filePath: string,\n namespace: string,\n metrics: ComplexityMetrics[],\n ): void {\n if (node.type === 'namespace_declaration') {\n const name = node.childForFieldName('name')?.text ?? '';\n const ns = namespace ? `${namespace}.${name}` : name;\n for (let i = 0; i < node.childCount; i++) {\n this.visitComplexity(node.child(i)!, filePath, ns, metrics);\n }\n return;\n }\n\n const typeMapping: Record<string, true> = {\n class_declaration: true,\n struct_declaration: true,\n record_declaration: true,\n };\n\n if (typeMapping[node.type]) {\n if (!this.isPublic(node)) return;\n const className = node.childForFieldName('name')?.text;\n if (!className) return;\n\n const qualifiedClass = namespace ? `${namespace}.${className}` : className;\n const declList = node.children.find(c => c.type === 'declaration_list');\n if (!declList) return;\n\n for (let i = 0; i < declList.childCount; i++) {\n const child = declList.child(i)!;\n if (child.type !== 'method_declaration') continue;\n if (!this.isPublic(child)) continue;\n\n const methodName = child.childForFieldName('name')?.text;\n if (!methodName) continue;\n\n const paramCount = this.countParameters(child);\n metrics.push({\n symbolId: this.buildSymbolId(filePath, `${qualifiedClass}.${methodName}(${paramCount})`, 'method'),\n cyclomatic: this.countCyclomaticComplexity(child, CSHARP_BRANCH_TYPES),\n });\n }\n return;\n }\n\n for (let i = 0; i < node.childCount; i++) {\n this.visitComplexity(node.child(i)!, filePath, namespace, metrics);\n }\n }\n\n // ── Helpers ─────────────────────────────────────────────────\n\n private countParameters(methodNode: SyntaxNode): number {\n const paramList = methodNode.childForFieldName('parameters');\n if (!paramList) return 0;\n let count = 0;\n for (let i = 0; i < paramList.childCount; i++) {\n if (paramList.child(i)!.type === 'parameter') count++;\n }\n return count;\n }\n\n private isPublic(node: SyntaxNode): boolean {\n for (let i = 0; i < node.childCount; i++) {\n const child = node.child(i)!;\n if (child.type === 'modifier' && child.text === 'public') return true;\n }\n return false;\n }\n\n private resolveBaseType(baseName: string, namespace: string, defaultKind: SymbolKind): string {\n // Check symbol registry first\n const prefix = namespace ? `${namespace}.${baseName}` : baseName;\n for (const [id] of this.symbolRegistry) {\n if (id.includes(`::${prefix}::`)) return id;\n if (id.includes(`::${baseName}::`)) return id;\n }\n // Fallback: assume same namespace\n const qualifiedName = namespace ? `${namespace}.${baseName}` : baseName;\n return `${qualifiedName}::${baseName}::${defaultKind}`;\n }\n}\n","import { execFileSync } from 'node:child_process';\nimport { readFileSync, writeFileSync, existsSync, statSync, readdirSync } from 'node:fs';\nimport { join, relative, extname } from 'node:path';\nimport { ContentHasher } from '../core/staleness/content-hasher.js';\nimport { TsMorphAdapter } from '../adapters/language/ts-morph-adapter.js';\nimport { LanguageAdapterRegistry } from '../adapters/language/language-adapter-registry.js';\nimport { JsonIndexWriter } from '../adapters/storage/json-index-writer.js';\nimport { SqliteStorageAdapter } from '../adapters/storage/sqlite-storage-adapter.js';\nimport { SchemaManager } from '../adapters/storage/schema-manager.js';\nimport { SimpleGitAdapter } from '../adapters/git/simple-git-adapter.js';\nimport { RevertDetector } from '../core/why-context/revert-detector.js';\nimport { aggregateCoChanges } from '../core/co-change/co-change-analyzer.js';\nimport type { FileIndex, SymbolKind } from '../core/types.js';\n\nexport class IndexCommand {\n private readonly projectRoot: string;\n ctxoRoot: string;\n private supportedExtensions: Set<string>;\n\n constructor(projectRoot: string, ctxoRoot?: string) {\n this.projectRoot = projectRoot;\n this.ctxoRoot = ctxoRoot ?? join(projectRoot, '.ctxo');\n this.supportedExtensions = new Set(['.ts', '.tsx', '.js', '.jsx', '.go', '.cs']);\n }\n\n async run(options: { file?: string; check?: boolean; skipSideEffects?: boolean; skipHistory?: boolean; maxHistory?: number } = {}): Promise<void> {\n if (options.check) {\n // Delegate to verify logic: hash-based freshness check\n return this.runCheck();\n }\n\n // Set up adapters\n const registry = new LanguageAdapterRegistry();\n const tsMorphAdapter = new TsMorphAdapter();\n registry.register(tsMorphAdapter);\n this.registerTreeSitterAdapters(registry);\n this.supportedExtensions = registry.getSupportedExtensions();\n\n const writer = new JsonIndexWriter(this.ctxoRoot);\n const schemaManager = new SchemaManager(this.ctxoRoot);\n const hasher = new ContentHasher();\n const gitAdapter = new SimpleGitAdapter(this.projectRoot);\n const revertDetector = new RevertDetector();\n\n // Discover files (single file, monorepo workspaces, or full project)\n let files: string[];\n if (options.file) {\n const fullPath = join(this.projectRoot, options.file);\n files = [fullPath];\n console.error(`[ctxo] Incremental re-index: ${options.file}`);\n } else {\n // Check for monorepo workspaces — discover files across all roots\n const workspaces = this.discoverWorkspaces();\n files = [];\n for (const ws of workspaces) {\n const wsFiles = this.discoverFilesIn(ws);\n files.push(...wsFiles);\n }\n console.error(`[ctxo] Building codebase index... Found ${files.length} source files`);\n }\n\n // Phase 1a: Extract symbols (CPU-bound, builds symbol registry for edge resolution)\n const symbolRegistry = new Map<string, SymbolKind>();\n const pendingIndices: Array<{\n relativePath: string;\n source: string;\n fileIndex: FileIndex;\n }> = [];\n let processed = 0;\n\n for (const filePath of files) {\n const adapter = registry.getAdapter(filePath);\n if (!adapter) continue;\n\n const relativePath = relative(this.projectRoot, filePath).replace(/\\\\/g, '/');\n\n try {\n const source = readFileSync(filePath, 'utf-8');\n const lastModified = Math.floor(Date.now() / 1000);\n\n const symbols = adapter.extractSymbols(relativePath, source);\n const complexity = adapter.extractComplexity(relativePath, source);\n\n // Build symbol registry for accurate edge resolution\n for (const sym of symbols) {\n symbolRegistry.set(sym.symbolId, sym.kind);\n }\n\n pendingIndices.push({\n relativePath,\n source,\n fileIndex: {\n file: relativePath,\n lastModified,\n contentHash: hasher.hash(source),\n symbols,\n edges: [],\n complexity,\n intent: [],\n antiPatterns: [],\n },\n });\n\n processed++;\n if (processed % 50 === 0) {\n console.error(`[ctxo] Processed ${processed}/${files.length} files (symbols)`);\n }\n } catch (err) {\n console.error(`[ctxo] Skipped ${relativePath}: ${(err as Error).message}`);\n }\n }\n\n // Pre-load all sources into ts-morph for cross-file resolution\n const allSources = new Map<string, string>();\n for (const entry of pendingIndices) {\n allSources.set(entry.relativePath, entry.source);\n }\n tsMorphAdapter.loadProjectSources(allSources);\n\n // Phase 1b: Extract edges (uses symbol registry for correct kind resolution)\n for (const entry of pendingIndices) {\n const adapter = registry.getAdapter(entry.relativePath);\n if (!adapter) continue;\n\n try {\n adapter.setSymbolRegistry?.(symbolRegistry);\n entry.fileIndex.edges = adapter.extractEdges(entry.relativePath, entry.source);\n } catch (err) {\n console.error(`[ctxo] Edge extraction failed for ${entry.relativePath}: ${(err as Error).message}`);\n }\n }\n\n // Clean up pre-loaded sources\n tsMorphAdapter.clearProjectSources();\n\n // Phase 2: Batch git history (single git call for all files)\n if (!options.skipHistory && pendingIndices.length > 0) {\n const maxHistory = options.maxHistory ?? 20;\n const batchHistory = await gitAdapter.getBatchHistory?.(maxHistory) ?? new Map<string, import('../core/types.js').CommitRecord[]>();\n\n for (const { relativePath, fileIndex } of pendingIndices) {\n const commits = batchHistory.get(relativePath) ?? [];\n fileIndex.intent = commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n date: c.date,\n kind: 'commit' as const,\n }));\n fileIndex.antiPatterns = revertDetector.detect(commits);\n }\n }\n\n // Phase 2b: Aggregate co-change data from git history\n if (!options.skipHistory && pendingIndices.length > 0) {\n const fileIndices = pendingIndices.map(e => e.fileIndex);\n const coChangeMatrix = aggregateCoChanges(fileIndices);\n writer.writeCoChanges(coChangeMatrix);\n console.error(`[ctxo] Co-change analysis: ${coChangeMatrix.entries.length} file pairs detected`);\n }\n\n // Phase 3: Write all indices\n const indices: FileIndex[] = [];\n for (const { fileIndex } of pendingIndices) {\n writer.write(fileIndex);\n indices.push(fileIndex);\n }\n\n // Write schema version\n schemaManager.writeVersion();\n\n // Populate SQLite cache (skip rebuildFromJson since we just wrote the JSON)\n const storage = new SqliteStorageAdapter(this.ctxoRoot);\n try {\n await storage.initEmpty();\n storage.bulkWrite(indices);\n } finally {\n storage.close();\n }\n\n // Ensure .ctxo/.cache/ is in .gitignore (skip during verify runs)\n if (!options.skipSideEffects) {\n this.ensureGitignore();\n }\n\n console.error(`[ctxo] Index complete: ${processed} files indexed`);\n }\n\n private registerTreeSitterAdapters(registry: LanguageAdapterRegistry): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { GoAdapter } = require('../adapters/language/go-adapter.js');\n registry.register(new GoAdapter());\n } catch {\n console.error('[ctxo] Go adapter unavailable (tree-sitter-go not installed)');\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { CSharpAdapter } = require('../adapters/language/csharp-adapter.js');\n registry.register(new CSharpAdapter());\n } catch {\n console.error('[ctxo] C# adapter unavailable (tree-sitter-c-sharp not installed)');\n }\n }\n\n private discoverFilesIn(root: string): string[] {\n try {\n const output = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {\n cwd: root,\n encoding: 'utf-8',\n maxBuffer: 10 * 1024 * 1024,\n });\n\n return output\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .filter((line) => this.isSupportedExtension(line))\n .map((line) => join(root, line));\n } catch {\n console.error(`[ctxo] git ls-files failed for ${root}`);\n return [];\n }\n }\n\n private discoverWorkspaces(): string[] {\n const pkgPath = join(this.projectRoot, 'package.json');\n if (!existsSync(pkgPath)) return [this.projectRoot];\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));\n const workspaces: string[] | undefined = Array.isArray(pkg.workspaces)\n ? pkg.workspaces\n : pkg.workspaces?.packages;\n\n if (!workspaces || workspaces.length === 0) return [this.projectRoot];\n\n // Resolve workspace patterns (supports simple globs like packages/*)\n const resolved: string[] = [];\n for (const ws of workspaces) {\n if (ws.endsWith('/*') || ws.endsWith('\\\\*')) {\n // Glob: packages/* → list subdirectories of packages/\n const parentDir = join(this.projectRoot, ws.slice(0, -2));\n if (existsSync(parentDir)) {\n for (const entry of readdirSync(parentDir, { withFileTypes: true })) {\n if (entry.isDirectory()) {\n resolved.push(join(parentDir, entry.name));\n }\n }\n }\n } else {\n // Literal path\n const wsPath = join(this.projectRoot, ws);\n if (existsSync(wsPath)) {\n resolved.push(wsPath);\n }\n }\n }\n\n if (resolved.length === 0) return [this.projectRoot];\n\n console.error(`[ctxo] Monorepo detected: ${resolved.length} workspace(s)`);\n return resolved;\n } catch {\n return [this.projectRoot];\n }\n }\n\n private isSupportedExtension(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n return this.supportedExtensions.has(ext);\n }\n\n private async runCheck(): Promise<void> {\n console.error('[ctxo] Checking index freshness...');\n\n // Register adapters so supportedExtensions includes .go/.cs\n const registry = new LanguageAdapterRegistry();\n registry.register(new TsMorphAdapter());\n this.registerTreeSitterAdapters(registry);\n this.supportedExtensions = registry.getSupportedExtensions();\n\n const hasher = new ContentHasher();\n const files = this.discoverFilesIn(this.projectRoot);\n const reader = new (await import('../adapters/storage/json-index-reader.js')).JsonIndexReader(this.ctxoRoot);\n const indices = reader.readAll();\n const indexedMap = new Map(indices.map((i) => [i.file, i]));\n\n let staleCount = 0;\n\n for (const filePath of files) {\n if (!this.isSupportedExtension(filePath)) continue;\n\n const relativePath = relative(this.projectRoot, filePath).replace(/\\\\/g, '/');\n const indexed = indexedMap.get(relativePath);\n\n if (!indexed) {\n console.error(`[ctxo] NOT INDEXED: ${relativePath}`);\n staleCount++;\n continue;\n }\n\n // Guard: file may be deleted from disk but still tracked by git\n if (!existsSync(filePath)) {\n console.error(`[ctxo] DELETED: ${relativePath}`);\n staleCount++;\n continue;\n }\n\n // Fast path: mtime check (skip hash if mtime hasn't changed)\n const mtime = Math.floor(statSync(filePath).mtimeMs / 1000);\n if (mtime <= indexed.lastModified) continue;\n\n // Slow path: hash-based verification (handles git checkout, cp -p, CI)\n if (indexed.contentHash) {\n const source = readFileSync(filePath, 'utf-8');\n const currentHash = hasher.hash(source);\n if (currentHash === indexed.contentHash) continue;\n }\n\n console.error(`[ctxo] STALE: ${relativePath}`);\n staleCount++;\n }\n\n if (staleCount > 0) {\n console.error(`[ctxo] ${staleCount} file(s) need re-indexing. Run \"ctxo index\"`);\n process.exit(1);\n }\n\n console.error('[ctxo] Index is up to date');\n }\n\n private ensureGitignore(): void {\n const gitignorePath = join(this.projectRoot, '.gitignore');\n const cachePattern = '.ctxo/.cache/';\n const suffix = `\\n# Ctxo local cache (never committed)\\n${cachePattern}\\n`;\n\n // Read-modify-write atomically to avoid TOCTOU race\n const existing = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';\n if (existing.includes(cachePattern)) return;\n\n writeFileSync(gitignorePath, existing + suffix, 'utf-8');\n console.error('[ctxo] Added .ctxo/.cache/ to .gitignore');\n }\n}\n","import { createHash } from 'node:crypto';\n\nexport class ContentHasher {\n hash(content: string): string {\n return createHash('sha256').update(content, 'utf-8').digest('hex');\n }\n}\n","import {\n Project,\n SyntaxKind,\n Node,\n type SourceFile,\n type FunctionDeclaration,\n type MethodDeclaration,\n ScriptTarget,\n} from 'ts-morph';\nimport { extname, dirname, join, normalize } from 'node:path';\nimport { type SymbolNode, type GraphEdge, type ComplexityMetrics, type SymbolKind, SYMBOL_KINDS } from '../../core/types.js';\nimport type { ILanguageAdapter } from '../../ports/i-language-adapter.js';\n\nconst SUPPORTED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx'] as const;\n\nexport class TsMorphAdapter implements ILanguageAdapter {\n readonly extensions = SUPPORTED_EXTENSIONS;\n readonly tier = 'full' as const;\n\n private readonly project: Project;\n private symbolRegistry = new Map<string, SymbolKind>();\n private projectPreloaded = false;\n\n constructor() {\n this.project = new Project({\n compilerOptions: {\n target: ScriptTarget.ES2022,\n allowJs: true,\n jsx: 2, // React\n skipLibCheck: true,\n },\n useInMemoryFileSystem: true,\n });\n }\n\n isSupported(filePath: string): boolean {\n const ext = extname(filePath).toLowerCase();\n return (SUPPORTED_EXTENSIONS as readonly string[]).includes(ext);\n }\n\n setSymbolRegistry(registry: Map<string, SymbolKind>): void {\n this.symbolRegistry = registry;\n }\n\n loadProjectSources(files: Map<string, string>): void {\n for (const [filePath, source] of files) {\n try {\n const existing = this.project.getSourceFile(filePath);\n if (existing) this.project.removeSourceFile(existing);\n this.project.createSourceFile(filePath, source, { overwrite: true });\n } catch (err) {\n console.error(`[ctxo:ts-morph] Failed to preload ${filePath}: ${(err as Error).message}`);\n }\n }\n this.projectPreloaded = true;\n }\n\n clearProjectSources(): void {\n for (const sf of this.project.getSourceFiles()) {\n this.project.removeSourceFile(sf);\n }\n this.projectPreloaded = false;\n }\n\n extractSymbols(filePath: string, source: string): SymbolNode[] {\n const sourceFile = this.parseSource(filePath, source);\n if (!sourceFile) return [];\n\n try {\n const symbols: SymbolNode[] = [];\n\n this.extractFunctions(sourceFile, filePath, symbols);\n this.extractClasses(sourceFile, filePath, symbols);\n this.extractInterfaces(sourceFile, filePath, symbols);\n this.extractTypeAliases(sourceFile, filePath, symbols);\n this.extractVariables(sourceFile, filePath, symbols);\n\n return symbols;\n } catch (err) {\n console.error(`[ctxo:ts-morph] Symbol extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n } finally {\n this.cleanupSourceFile(filePath);\n }\n }\n\n extractEdges(filePath: string, source: string): GraphEdge[] {\n const sourceFile = this.parseSource(filePath, source);\n if (!sourceFile) return [];\n\n try {\n const edges: GraphEdge[] = [];\n\n this.extractImportEdges(sourceFile, filePath, edges);\n this.extractInheritanceEdges(sourceFile, filePath, edges);\n this.extractCallEdges(sourceFile, filePath, edges);\n this.extractReferenceEdges(sourceFile, filePath, edges);\n\n return edges;\n } catch (err) {\n console.error(`[ctxo:ts-morph] Edge extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n } finally {\n if (!this.projectPreloaded) {\n this.cleanupSourceFile(filePath);\n }\n }\n }\n\n extractComplexity(filePath: string, source: string): ComplexityMetrics[] {\n const sourceFile = this.parseSource(filePath, source);\n if (!sourceFile) return [];\n\n try {\n const metrics: ComplexityMetrics[] = [];\n\n for (const fn of sourceFile.getFunctions()) {\n if (!this.isExported(fn)) continue;\n const name = fn.getName();\n if (!name) continue;\n const symbolId = this.buildSymbolId(filePath, name, 'function');\n metrics.push({ symbolId, cyclomatic: this.countCyclomaticComplexity(fn) });\n }\n\n for (const cls of sourceFile.getClasses()) {\n const className = cls.getName();\n if (!className || !this.isExported(cls)) continue;\n\n for (const method of cls.getMethods()) {\n const methodName = method.getName();\n const symbolId = this.buildSymbolId(filePath, `${className}.${methodName}`, 'method');\n metrics.push({ symbolId, cyclomatic: this.countCyclomaticComplexity(method) });\n }\n }\n\n return metrics;\n } catch (err) {\n console.error(`[ctxo:ts-morph] Complexity extraction failed for ${filePath}: ${(err as Error).message}`);\n return [];\n } finally {\n this.cleanupSourceFile(filePath);\n }\n }\n\n // ── Symbol Extraction ───────────────────────────────────────\n\n private extractFunctions(\n sourceFile: SourceFile,\n filePath: string,\n symbols: SymbolNode[],\n ): void {\n for (const fn of sourceFile.getFunctions()) {\n if (!this.isExported(fn)) continue;\n const name = fn.getName();\n if (!name) continue;\n\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'function'),\n name,\n kind: 'function',\n startLine: fn.getStartLineNumber() - 1,\n endLine: fn.getEndLineNumber() - 1,\n startOffset: fn.getStart(),\n endOffset: fn.getEnd(),\n });\n }\n }\n\n private extractClasses(\n sourceFile: SourceFile,\n filePath: string,\n symbols: SymbolNode[],\n ): void {\n for (const cls of sourceFile.getClasses()) {\n const name = cls.getName();\n if (!name || !this.isExported(cls)) continue;\n\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'class'),\n name,\n kind: 'class',\n startLine: cls.getStartLineNumber() - 1,\n endLine: cls.getEndLineNumber() - 1,\n startOffset: cls.getStart(),\n endOffset: cls.getEnd(),\n });\n\n // Extract methods\n for (const method of cls.getMethods()) {\n const methodName = method.getName();\n symbols.push({\n symbolId: this.buildSymbolId(filePath, `${name}.${methodName}`, 'method'),\n name: `${name}.${methodName}`,\n kind: 'method',\n startLine: method.getStartLineNumber() - 1,\n endLine: method.getEndLineNumber() - 1,\n startOffset: method.getStart(),\n endOffset: method.getEnd(),\n });\n }\n }\n }\n\n private extractInterfaces(\n sourceFile: SourceFile,\n filePath: string,\n symbols: SymbolNode[],\n ): void {\n for (const iface of sourceFile.getInterfaces()) {\n if (!this.isExported(iface)) continue;\n const name = iface.getName();\n\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'interface'),\n name,\n kind: 'interface',\n startLine: iface.getStartLineNumber() - 1,\n endLine: iface.getEndLineNumber() - 1,\n startOffset: iface.getStart(),\n endOffset: iface.getEnd(),\n });\n }\n }\n\n private extractTypeAliases(\n sourceFile: SourceFile,\n filePath: string,\n symbols: SymbolNode[],\n ): void {\n for (const typeAlias of sourceFile.getTypeAliases()) {\n if (!this.isExported(typeAlias)) continue;\n const name = typeAlias.getName();\n\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'type'),\n name,\n kind: 'type',\n startLine: typeAlias.getStartLineNumber() - 1,\n endLine: typeAlias.getEndLineNumber() - 1,\n startOffset: typeAlias.getStart(),\n endOffset: typeAlias.getEnd(),\n });\n }\n }\n\n private extractVariables(\n sourceFile: SourceFile,\n filePath: string,\n symbols: SymbolNode[],\n ): void {\n for (const stmt of sourceFile.getVariableStatements()) {\n if (!this.isExported(stmt)) continue;\n\n for (const decl of stmt.getDeclarations()) {\n const name = decl.getName();\n\n symbols.push({\n symbolId: this.buildSymbolId(filePath, name, 'variable'),\n name,\n kind: 'variable',\n startLine: stmt.getStartLineNumber() - 1,\n endLine: stmt.getEndLineNumber() - 1,\n startOffset: decl.getStart(),\n endOffset: decl.getEnd(),\n });\n }\n }\n }\n\n // ── Edge Extraction ─────────────────────────────────────────\n\n private extractImportEdges(\n sourceFile: SourceFile,\n filePath: string,\n edges: GraphEdge[],\n ): void {\n // BUG-1 FIX: use sourceFile directly instead of project lookup (file may be cleaned up)\n const fileSymbolId = this.buildSymbolId(filePath, sourceFile.getBaseName().replace(/\\.[^.]+$/, ''), 'variable');\n const fromSymbols = this.getExportedSymbolIds(sourceFile, filePath);\n const fromSymbol = fromSymbols.length > 0 ? fromSymbols[0]! : fileSymbolId;\n\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n\n // Only track local imports (relative paths)\n if (!moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/')) {\n continue;\n }\n\n // Resolve relative import to project-relative path\n const normalizedTarget = this.resolveRelativeImport(filePath, moduleSpecifier);\n\n // SCHEMA-40 FIX: detect type-only imports\n const isTypeOnly = imp.isTypeOnly();\n\n for (const named of imp.getNamedImports()) {\n const importedName = named.getName();\n const edge: GraphEdge = {\n from: fromSymbol,\n to: this.resolveImportTarget(normalizedTarget, importedName),\n kind: 'imports',\n };\n if (isTypeOnly || named.isTypeOnly()) edge.typeOnly = true;\n edges.push(edge);\n }\n\n const defaultImport = imp.getDefaultImport();\n if (defaultImport) {\n const edge: GraphEdge = {\n from: fromSymbol,\n to: this.resolveImportTarget(normalizedTarget, defaultImport.getText()),\n kind: 'imports',\n };\n if (isTypeOnly) edge.typeOnly = true;\n edges.push(edge);\n }\n\n // GAP-3 FIX: namespace imports (import * as X from './mod')\n const nsImport = imp.getNamespaceImport();\n if (nsImport) {\n const edge: GraphEdge = {\n from: fromSymbol,\n to: this.buildSymbolId(normalizedTarget, nsImport.getText(), 'variable'),\n kind: 'imports',\n };\n if (isTypeOnly) edge.typeOnly = true;\n edges.push(edge);\n }\n }\n }\n\n private extractInheritanceEdges(\n sourceFile: SourceFile,\n filePath: string,\n edges: GraphEdge[],\n ): void {\n for (const cls of sourceFile.getClasses()) {\n const className = cls.getName();\n if (!className || !this.isExported(cls)) continue;\n\n const classSymbolId = this.buildSymbolId(filePath, className, 'class');\n\n // extends\n const baseClass = cls.getExtends();\n if (baseClass) {\n // BUG-17 FIX: strip generic type arguments (Base<string> → Base)\n const baseName = baseClass.getExpression().getText().replace(/<.*>$/, '');\n edges.push({\n from: classSymbolId,\n to: this.resolveSymbolReference(sourceFile, baseName, 'class'),\n kind: 'extends',\n });\n }\n\n // implements\n for (const impl of cls.getImplements()) {\n // BUG-18 FIX: strip generic type arguments (IRepo<User> → IRepo)\n const ifaceName = impl.getExpression().getText().replace(/<.*>$/, '');\n edges.push({\n from: classSymbolId,\n to: this.resolveSymbolReference(sourceFile, ifaceName, 'interface'),\n kind: 'implements',\n });\n }\n }\n }\n\n private extractCallEdges(\n sourceFile: SourceFile,\n filePath: string,\n edges: GraphEdge[],\n ): void {\n // Extract function call edges from exported functions and methods\n for (const fn of sourceFile.getFunctions()) {\n if (!this.isExported(fn)) continue;\n const fnName = fn.getName();\n if (!fnName) continue;\n\n const fnSymbolId = this.buildSymbolId(filePath, fnName, 'function');\n\n for (const call of fn.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const calledName = call.getExpression().getText().split('.').pop();\n if (!calledName || calledName === fnName) continue;\n\n const resolved = this.resolveLocalCallTarget(sourceFile, filePath, calledName);\n if (resolved) {\n edges.push({ from: fnSymbolId, to: resolved, kind: 'calls' });\n }\n }\n\n // GAP-11 FIX: constructor calls (new Foo())\n for (const newExpr of fn.getDescendantsOfKind(SyntaxKind.NewExpression)) {\n const calledName = newExpr.getExpression().getText().split('.').pop();\n if (!calledName) continue;\n\n const resolved = this.resolveLocalCallTarget(sourceFile, filePath, calledName);\n if (resolved) {\n edges.push({ from: fnSymbolId, to: resolved, kind: 'calls' });\n }\n }\n }\n\n // Extract calls from class methods\n for (const cls of sourceFile.getClasses()) {\n const className = cls.getName();\n if (!className || !this.isExported(cls)) continue;\n\n for (const method of cls.getMethods()) {\n const methodName = method.getName();\n const methodSymbolId = this.buildSymbolId(filePath, `${className}.${methodName}`, 'method');\n\n for (const call of method.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const calledText = call.getExpression().getText();\n const calledName = calledText.split('.').pop();\n if (!calledName || calledName === methodName) continue;\n\n let resolved: string | undefined;\n if (calledText.startsWith('this.')) {\n resolved = this.resolveThisMethodCall(sourceFile, filePath, className, calledName);\n } else {\n resolved = this.resolveLocalCallTarget(sourceFile, filePath, calledName);\n }\n if (resolved) {\n edges.push({ from: methodSymbolId, to: resolved, kind: 'calls' });\n }\n }\n\n // GAP-11 FIX: constructor calls from methods (new Foo())\n for (const newExpr of method.getDescendantsOfKind(SyntaxKind.NewExpression)) {\n const calledText = newExpr.getExpression().getText();\n const calledName = calledText.split('.').pop();\n if (!calledName) continue;\n\n let resolved: string | undefined;\n if (calledText.startsWith('this.')) {\n resolved = this.resolveThisMethodCall(sourceFile, filePath, className, calledName);\n } else {\n resolved = this.resolveLocalCallTarget(sourceFile, filePath, calledName);\n }\n if (resolved) {\n edges.push({ from: methodSymbolId, to: resolved, kind: 'calls' });\n }\n }\n }\n }\n }\n\n private extractReferenceEdges(\n sourceFile: SourceFile,\n filePath: string,\n edges: GraphEdge[],\n ): void {\n // Build map of all named imports from local modules: importedName → resolved symbolId\n const importMap = new Map<string, string>();\n for (const imp of sourceFile.getImportDeclarations()) {\n const mod = imp.getModuleSpecifierValue();\n if (!mod.startsWith('.') && !mod.startsWith('/')) continue;\n const targetFile = this.resolveRelativeImport(filePath, mod);\n for (const named of imp.getNamedImports()) {\n importMap.set(named.getName(), this.resolveImportTarget(targetFile, named.getName()));\n }\n const defaultImport = imp.getDefaultImport();\n if (defaultImport) {\n importMap.set(defaultImport.getText(), this.resolveImportTarget(targetFile, defaultImport.getText()));\n }\n }\n if (importMap.size === 0) return;\n\n // Scan each exported symbol's body for identifier references to imports\n for (const fn of sourceFile.getFunctions()) {\n if (!this.isExported(fn)) continue;\n const fnName = fn.getName();\n if (!fnName) continue;\n const fromId = this.buildSymbolId(filePath, fnName, 'function');\n this.emitUsesEdges(fn, fromId, importMap, edges);\n }\n\n for (const cls of sourceFile.getClasses()) {\n if (!this.isExported(cls)) continue;\n const className = cls.getName();\n if (!className) continue;\n\n // Class-level references (property types, constructor params)\n const classId = this.buildSymbolId(filePath, className, 'class');\n this.emitUsesEdges(cls, classId, importMap, edges);\n }\n }\n\n private emitUsesEdges(\n node: Node,\n fromId: string,\n importMap: Map<string, string>,\n edges: GraphEdge[],\n ): void {\n const seen = new Set<string>();\n for (const id of node.getDescendantsOfKind(SyntaxKind.Identifier)) {\n const name = id.getText();\n if (seen.has(name)) continue;\n const target = importMap.get(name);\n if (target) {\n seen.add(name);\n edges.push({ from: fromId, to: target, kind: 'uses' });\n }\n }\n }\n\n private resolveLocalCallTarget(\n sourceFile: SourceFile,\n filePath: string,\n calledName: string,\n ): string | undefined {\n // Check if the called name is imported from a local module\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n if (!moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/')) continue;\n\n for (const named of imp.getNamedImports()) {\n if (named.getName() === calledName) {\n const targetFile = this.resolveRelativeImport(filePath, moduleSpecifier);\n return this.resolveImportTarget(targetFile, calledName);\n }\n }\n }\n\n // Check if it's a locally defined function in the same file\n for (const fn of sourceFile.getFunctions()) {\n if (fn.getName() === calledName) {\n return this.buildSymbolId(filePath, calledName, 'function');\n }\n }\n\n return undefined;\n }\n\n private resolveThisMethodCall(\n sourceFile: SourceFile,\n filePath: string,\n className: string,\n calledName: string,\n ): string | undefined {\n for (const cls of sourceFile.getClasses()) {\n if (cls.getName() !== className) continue;\n for (const method of cls.getMethods()) {\n if (method.getName() === calledName) {\n return this.buildSymbolId(filePath, `${className}.${calledName}`, 'method');\n }\n }\n }\n return undefined;\n }\n\n // ── Helpers ─────────────────────────────────────────────────\n\n private parseSource(filePath: string, source: string): SourceFile | undefined {\n try {\n const existing = this.project.getSourceFile(filePath);\n if (existing && this.projectPreloaded) {\n return existing;\n }\n if (existing) {\n this.project.removeSourceFile(existing);\n }\n return this.project.createSourceFile(filePath, source, { overwrite: true });\n } catch (err) {\n console.error(`[ctxo:ts-morph] Parse failed for ${filePath}: ${(err as Error).message}`);\n return undefined;\n }\n }\n\n private cleanupSourceFile(filePath: string): void {\n const existing = this.project.getSourceFile(filePath);\n if (existing) {\n this.project.removeSourceFile(existing);\n }\n }\n\n private buildSymbolId(filePath: string, name: string, kind: SymbolKind): string {\n return `${filePath}::${name}::${kind}`;\n }\n\n private resolveRelativeImport(fromFile: string, moduleSpecifier: string): string {\n // Convert relative import like '../types.js' to project-relative 'src/core/types.ts'\n const fromDir = dirname(fromFile);\n let resolved = normalize(join(fromDir, moduleSpecifier)).replace(/\\\\/g, '/');\n\n // Strip .js extension (TypeScript imports use .js but source files are .ts)\n if (resolved.endsWith('.js')) {\n resolved = resolved.slice(0, -3) + '.ts';\n } else if (resolved.endsWith('.jsx')) {\n resolved = resolved.slice(0, -4) + '.tsx';\n } else if (!extname(resolved)) {\n resolved += '.ts';\n }\n\n return resolved;\n }\n\n private resolveImportTarget(targetFile: string, name: string): string {\n // BUG-8/9 FIX: check symbol registry first (populated from Phase 1 of indexing)\n const prefix = `${targetFile}::${name}::`;\n for (const kind of SYMBOL_KINDS) {\n if (this.symbolRegistry.has(`${prefix}${kind}`)) {\n return `${prefix}${kind}`;\n }\n }\n\n // Try to find the symbol in the already-parsed project to get the correct kind\n const targetSourceFile = this.project.getSourceFile(targetFile);\n if (targetSourceFile) {\n for (const fn of targetSourceFile.getFunctions()) {\n if (fn.getName() === name && this.isExported(fn)) {\n return this.buildSymbolId(targetFile, name, 'function');\n }\n }\n for (const cls of targetSourceFile.getClasses()) {\n if (cls.getName() === name && this.isExported(cls)) {\n return this.buildSymbolId(targetFile, name, 'class');\n }\n }\n for (const iface of targetSourceFile.getInterfaces()) {\n if (iface.getName() === name && this.isExported(iface)) {\n return this.buildSymbolId(targetFile, name, 'interface');\n }\n }\n for (const t of targetSourceFile.getTypeAliases()) {\n if (t.getName() === name && this.isExported(t)) {\n return this.buildSymbolId(targetFile, name, 'type');\n }\n }\n }\n // Fallback: infer kind from naming conventions\n const kind = this.inferSymbolKind(name);\n return `${targetFile}::${name}::${kind}`;\n }\n\n private resolveSymbolReference(\n sourceFile: SourceFile,\n name: string,\n defaultKind: SymbolKind,\n ): string {\n // Check if the name is imported\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n if (!moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/')) continue;\n\n for (const named of imp.getNamedImports()) {\n if (named.getName() === name) {\n const resolved = imp.getModuleSpecifierSourceFile()?.getFilePath();\n if (resolved) {\n return `${this.normalizeFilePath(resolved)}::${name}::${defaultKind}`;\n }\n // Fallback: resolve relative module specifier manually\n const sourceDir = dirname(this.normalizeFilePath(sourceFile.getFilePath()));\n const resolvedPath = normalize(join(sourceDir, moduleSpecifier))\n .replace(/\\\\/g, '/')\n .replace(/\\.jsx$/, '.tsx')\n .replace(/\\.js$/, '.ts');\n return `${resolvedPath}::${name}::${defaultKind}`;\n }\n }\n }\n\n // Assume it's in the same file\n return `${sourceFile.getFilePath()}::${name}::${defaultKind}`;\n }\n\n private inferSymbolKind(name: string): SymbolKind {\n // Interface: starts with I followed by uppercase (IStoragePort, IGitPort)\n if (/^I[A-Z]/.test(name) && name.length > 2) return 'interface';\n // All caps with underscores: variable/constant (MAX_AMOUNT, EDGE_KINDS)\n if (/^[A-Z][A-Z_0-9]+$/.test(name)) return 'variable';\n // PascalCase: could be class, interface, or type — default to class\n if (/^[A-Z]/.test(name)) return 'class';\n // camelCase: function\n return 'function';\n }\n\n private normalizeFilePath(filePath: string): string {\n // Remove leading / from in-memory file system paths\n return filePath.replace(/^\\//, '');\n }\n\n private getExportedSymbolIds(sourceFile: SourceFile, filePath: string): string[] {\n const ids: string[] = [];\n for (const fn of sourceFile.getFunctions()) {\n if (!this.isExported(fn)) continue;\n const name = fn.getName();\n if (name) ids.push(this.buildSymbolId(filePath, name, 'function'));\n }\n for (const cls of sourceFile.getClasses()) {\n if (!this.isExported(cls)) continue;\n const name = cls.getName();\n if (name) ids.push(this.buildSymbolId(filePath, name, 'class'));\n }\n for (const iface of sourceFile.getInterfaces()) {\n if (!this.isExported(iface)) continue;\n ids.push(this.buildSymbolId(filePath, iface.getName(), 'interface'));\n }\n for (const t of sourceFile.getTypeAliases()) {\n if (!this.isExported(t)) continue;\n ids.push(this.buildSymbolId(filePath, t.getName(), 'type'));\n }\n for (const stmt of sourceFile.getVariableStatements()) {\n if (!this.isExported(stmt)) continue;\n for (const decl of stmt.getDeclarations()) {\n ids.push(this.buildSymbolId(filePath, decl.getName(), 'variable'));\n }\n }\n return ids;\n }\n\n private isExported(node: Node): boolean {\n if (Node.isExportable(node)) {\n return node.isExported();\n }\n return false;\n }\n\n private countCyclomaticComplexity(node: FunctionDeclaration | MethodDeclaration): number {\n let complexity = 1;\n\n node.forEachDescendant((child) => {\n switch (child.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 case SyntaxKind.BinaryExpression: {\n const text = child.getText();\n if (child.getKind() === SyntaxKind.BinaryExpression) {\n if (text.includes('&&') || text.includes('||') || text.includes('??')) {\n complexity++;\n }\n } else {\n complexity++;\n }\n break;\n }\n }\n });\n\n return complexity;\n }\n}\n","import { extname } from 'node:path';\nimport type { ILanguageAdapter } from '../../ports/i-language-adapter.js';\n\nexport class LanguageAdapterRegistry {\n private readonly adaptersByExtension = new Map<string, ILanguageAdapter>();\n\n register(adapter: ILanguageAdapter): void {\n for (const ext of adapter.extensions) {\n this.adaptersByExtension.set(ext.toLowerCase(), adapter);\n }\n }\n\n getSupportedExtensions(): Set<string> {\n return new Set(this.adaptersByExtension.keys());\n }\n\n getAdapter(filePath: string): ILanguageAdapter | undefined {\n if (!filePath) return undefined;\n\n const ext = extname(filePath).toLowerCase();\n if (!ext) return undefined;\n\n return this.adaptersByExtension.get(ext);\n }\n}\n","import { writeFileSync, renameSync, mkdirSync, unlinkSync, existsSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport type { FileIndex, CoChangeMatrix } from '../../core/types.js';\n\nexport class JsonIndexWriter {\n private readonly indexDir: string;\n\n constructor(ctxoRoot: string) {\n this.indexDir = join(ctxoRoot, 'index');\n }\n\n write(fileIndex: FileIndex): void {\n if (!fileIndex.file) {\n throw new Error('FileIndex.file must not be empty');\n }\n\n const targetPath = this.resolveIndexPath(fileIndex.file);\n mkdirSync(dirname(targetPath), { recursive: true });\n\n const sorted = this.sortKeys(fileIndex);\n const json = JSON.stringify(sorted, null, 2);\n this.atomicWrite(targetPath, json);\n }\n\n writeCoChanges(matrix: CoChangeMatrix): void {\n mkdirSync(this.indexDir, { recursive: true });\n const targetPath = join(this.indexDir, 'co-changes.json');\n this.atomicWrite(targetPath, JSON.stringify(matrix, null, 2));\n }\n\n private atomicWrite(targetPath: string, content: string): void {\n const tmpPath = `${targetPath}.${process.pid}.tmp`;\n writeFileSync(tmpPath, content, 'utf-8');\n renameSync(tmpPath, targetPath);\n }\n\n delete(relativePath: string): void {\n const targetPath = this.resolveIndexPath(relativePath);\n if (existsSync(targetPath)) {\n unlinkSync(targetPath);\n }\n }\n\n private resolveIndexPath(relativePath: string): string {\n const resolved = resolve(this.indexDir, `${relativePath}.json`);\n const normalizedDir = resolve(this.indexDir) + sep;\n if (!resolved.startsWith(normalizedDir)) {\n throw new Error(`Path traversal detected: ${relativePath}`);\n }\n return resolved;\n }\n\n private sortKeys(obj: unknown): unknown {\n if (Array.isArray(obj)) {\n return obj.map((item) => this.sortKeys(item));\n }\n if (obj !== null && typeof obj === 'object') {\n const sorted: Record<string, unknown> = {};\n for (const key of Object.keys(obj).sort()) {\n sorted[key] = this.sortKeys((obj as Record<string, unknown>)[key]);\n }\n return sorted;\n }\n return obj;\n }\n}\n","import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\n\nconst CURRENT_SCHEMA_VERSION = '1.0.0';\n\nexport class SchemaManager {\n private readonly versionFilePath: string;\n\n constructor(ctxoRoot: string) {\n this.versionFilePath = join(ctxoRoot, 'index', 'schema-version');\n }\n\n currentVersion(): string {\n return CURRENT_SCHEMA_VERSION;\n }\n\n readStoredVersion(): string | undefined {\n if (!existsSync(this.versionFilePath)) {\n return undefined;\n }\n return readFileSync(this.versionFilePath, 'utf-8').trim();\n }\n\n writeVersion(): void {\n mkdirSync(dirname(this.versionFilePath), { recursive: true });\n writeFileSync(this.versionFilePath, CURRENT_SCHEMA_VERSION, 'utf-8');\n }\n\n isCompatible(): boolean {\n const stored = this.readStoredVersion();\n if (!stored) return false;\n return stored === CURRENT_SCHEMA_VERSION;\n }\n}\n","import { join } from 'node:path';\nimport { SqliteStorageAdapter } from '../adapters/storage/sqlite-storage-adapter.js';\n\nexport class SyncCommand {\n private readonly ctxoRoot: string;\n\n constructor(projectRoot: string) {\n this.ctxoRoot = join(projectRoot, '.ctxo');\n }\n\n async run(): Promise<void> {\n console.error('[ctxo] Rebuilding SQLite cache from committed JSON index...');\n\n const storage = new SqliteStorageAdapter(this.ctxoRoot);\n try {\n await storage.init();\n } finally {\n storage.close();\n }\n\n console.error('[ctxo] Sync complete');\n }\n}\n","import { join } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { execFileSync } from 'node:child_process';\nimport { JsonIndexReader } from '../adapters/storage/json-index-reader.js';\nimport { SchemaManager } from '../adapters/storage/schema-manager.js';\n\nexport class StatusCommand {\n private readonly projectRoot: string;\n private readonly ctxoRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.ctxoRoot = join(projectRoot, '.ctxo');\n }\n\n run(): void {\n const indexDir = join(this.ctxoRoot, 'index');\n\n if (!existsSync(indexDir)) {\n console.error('[ctxo] No index found. Run \"ctxo index\" first.');\n return;\n }\n\n const schemaManager = new SchemaManager(this.ctxoRoot);\n const version = schemaManager.readStoredVersion() ?? 'unknown';\n\n const reader = new JsonIndexReader(this.ctxoRoot);\n const indices = reader.readAll();\n\n const totalSymbols = indices.reduce((sum, idx) => sum + idx.symbols.length, 0);\n const totalEdges = indices.reduce((sum, idx) => sum + idx.edges.length, 0);\n\n console.error(`[ctxo] Index Status`);\n console.error(` Schema version: ${version}`);\n console.error(` Indexed files: ${indices.length}`);\n console.error(` Total symbols: ${totalSymbols}`);\n console.error(` Total edges: ${totalEdges}`);\n\n const cacheExists = existsSync(join(this.ctxoRoot, '.cache', 'symbols.db'));\n console.error(` SQLite cache: ${cacheExists ? 'present' : 'missing (run ctxo sync)'}`);\n\n // Per-file listing with timestamps\n if (indices.length > 0) {\n console.error('');\n console.error(' Files:');\n\n // Get source files to detect orphans\n const sourceFiles = this.getSourceFiles();\n\n for (const idx of indices.sort((a, b) => a.file.localeCompare(b.file))) {\n const ts = new Date(idx.lastModified * 1000).toISOString();\n const isOrphaned = sourceFiles.size > 0 && !sourceFiles.has(idx.file);\n const badge = isOrphaned ? ' [orphaned]' : '';\n console.error(` ${idx.file} ${ts} (${idx.symbols.length} symbols, ${idx.edges.length} edges)${badge}`);\n }\n }\n }\n\n private getSourceFiles(): Set<string> {\n try {\n const output = execFileSync('git', ['ls-files', '--cached', '--others', '--exclude-standard'], {\n cwd: this.projectRoot,\n encoding: 'utf-8',\n });\n return new Set(output.split('\\n').map((l) => l.trim()).filter((l) => l.length > 0));\n } catch {\n return new Set();\n }\n }\n}\n","import { mkdtempSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { IndexCommand } from './index-command.js';\nimport { JsonIndexReader } from '../adapters/storage/json-index-reader.js';\n\nexport class VerifyCommand {\n private readonly projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n async run(): Promise<void> {\n console.error('[ctxo] Verifying index freshness...');\n\n // Build index into a temp directory to avoid overwriting committed index\n const tempDir = mkdtempSync(join(tmpdir(), 'ctxo-verify-'));\n\n try {\n const tempCtxo = join(tempDir, '.ctxo');\n\n // Run index into temp .ctxo (does not touch committed index)\n const indexCmd = new IndexCommand(this.projectRoot, tempCtxo);\n await indexCmd.run({ skipSideEffects: true });\n\n // Compare temp index with committed index\n const committedReader = new JsonIndexReader(join(this.projectRoot, '.ctxo'));\n const freshReader = new JsonIndexReader(tempCtxo);\n\n const committedIndices = committedReader.readAll();\n const freshIndices = freshReader.readAll();\n\n // Compare full index: symbols + edges + intent + antiPatterns\n const serialize = (i: { symbols: unknown; edges: unknown; intent: unknown; antiPatterns: unknown }) =>\n JSON.stringify({ symbols: i.symbols, edges: i.edges, intent: i.intent, antiPatterns: i.antiPatterns });\n\n const committedMap = new Map(committedIndices.map((i) => [i.file, serialize(i)]));\n const freshMap = new Map(freshIndices.map((i) => [i.file, serialize(i)]));\n\n let stale = false;\n\n // Check for files that changed or were added\n for (const [file, freshData] of freshMap) {\n const committed = committedMap.get(file);\n if (committed !== freshData) {\n console.error(`[ctxo] STALE: ${file}`);\n stale = true;\n }\n }\n\n // Check for files that were removed\n for (const file of committedMap.keys()) {\n if (!freshMap.has(file)) {\n console.error(`[ctxo] REMOVED: ${file}`);\n stale = true;\n }\n }\n\n if (stale) {\n console.error('[ctxo] Index is STALE — run \"ctxo index\" and commit .ctxo/index/');\n process.exit(1);\n }\n\n console.error('[ctxo] Index is up to date');\n } finally {\n rmSync(tempDir, { recursive: true, force: true });\n }\n }\n}\n","import { join } from 'node:path';\nimport { existsSync, readFileSync, writeFileSync, mkdirSync, chmodSync } from 'node:fs';\n\nconst CTXO_START = '# ctxo-start';\nconst CTXO_END = '# ctxo-end';\n\nconst POST_COMMIT_CONTENT = `\n${CTXO_START}\n# Incremental re-index on commit (only changed files)\nif command -v ctxo >/dev/null 2>&1; then\n for file in $(git diff --name-only HEAD~1 HEAD 2>/dev/null); do\n ctxo index --file \"$file\" 2>/dev/null || true\n done\nfi\n${CTXO_END}\n`.trim();\n\nconst POST_MERGE_CONTENT = `\n${CTXO_START}\n# Rebuild SQLite cache after merge (index updated via git pull)\nif command -v ctxo >/dev/null 2>&1; then\n ctxo sync 2>/dev/null || true\nfi\n${CTXO_END}\n`.trim();\n\nexport class InitCommand {\n private readonly projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n run(): void {\n const hooksDir = join(this.projectRoot, '.git', 'hooks');\n\n if (!existsSync(join(this.projectRoot, '.git'))) {\n console.error('[ctxo] Not a git repository. Run \"git init\" first.');\n process.exit(1);\n }\n\n mkdirSync(hooksDir, { recursive: true });\n\n this.installHook(hooksDir, 'post-commit', POST_COMMIT_CONTENT);\n this.installHook(hooksDir, 'post-merge', POST_MERGE_CONTENT);\n\n console.error('[ctxo] Git hooks installed (post-commit, post-merge)');\n }\n\n private installHook(hooksDir: string, hookName: string, hookContent: string): void {\n const hookPath = join(hooksDir, hookName);\n\n let existing = '';\n if (existsSync(hookPath)) {\n existing = readFileSync(hookPath, 'utf-8');\n\n // Already installed — idempotent\n if (existing.includes(CTXO_START)) {\n console.error(`[ctxo] ${hookName} hook already has ctxo block — skipping`);\n return;\n }\n } else {\n existing = '#!/bin/sh\\n';\n }\n\n // Append ctxo block\n const updated = existing.endsWith('\\n')\n ? existing + '\\n' + hookContent + '\\n'\n : existing + '\\n\\n' + hookContent + '\\n';\n\n writeFileSync(hookPath, updated, 'utf-8');\n chmodSync(hookPath, 0o755);\n }\n}\n","import { join, extname, relative } from 'node:path';\nimport { readFileSync } from 'node:fs';\nimport { TsMorphAdapter } from '../adapters/language/ts-morph-adapter.js';\nimport { LanguageAdapterRegistry } from '../adapters/language/language-adapter-registry.js';\nimport { JsonIndexWriter } from '../adapters/storage/json-index-writer.js';\nimport { SqliteStorageAdapter } from '../adapters/storage/sqlite-storage-adapter.js';\nimport { ChokidarWatcherAdapter } from '../adapters/watcher/chokidar-watcher-adapter.js';\nimport { ContentHasher } from '../core/staleness/content-hasher.js';\nimport { SimpleGitAdapter } from '../adapters/git/simple-git-adapter.js';\nimport { RevertDetector } from '../core/why-context/revert-detector.js';\nimport type { FileIndex, CommitIntent, AntiPattern } from '../core/types.js';\n\nconst DEBOUNCE_MS = 300;\n\nexport class WatchCommand {\n private readonly projectRoot: string;\n private readonly ctxoRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n this.ctxoRoot = join(projectRoot, '.ctxo');\n }\n\n async run(): Promise<void> {\n console.error('[ctxo] Starting file watcher...');\n\n const registry = new LanguageAdapterRegistry();\n registry.register(new TsMorphAdapter());\n this.registerTreeSitterAdapters(registry);\n const supportedExtensions = registry.getSupportedExtensions();\n\n const writer = new JsonIndexWriter(this.ctxoRoot);\n const storage = new SqliteStorageAdapter(this.ctxoRoot);\n await storage.init();\n const hasher = new ContentHasher();\n\n const gitAdapter = new SimpleGitAdapter(this.projectRoot);\n const revertDetector = new RevertDetector();\n const watcher = new ChokidarWatcherAdapter(this.projectRoot);\n const pendingFiles = new Map<string, NodeJS.Timeout>();\n\n const reindexFile = async (filePath: string) => {\n const adapter = registry.getAdapter(filePath);\n if (!adapter) return;\n\n const relativePath = relative(this.projectRoot, filePath).replace(/\\\\/g, '/');\n\n try {\n const source = readFileSync(filePath, 'utf-8');\n const lastModified = Math.floor(Date.now() / 1000);\n\n const symbols = adapter.extractSymbols(relativePath, source);\n const edges = adapter.extractEdges(relativePath, source);\n const complexity = adapter.extractComplexity(relativePath, source);\n\n // Git history and anti-patterns\n const commits = await gitAdapter.getCommitHistory(relativePath);\n const intent: CommitIntent[] = commits.map((c) => ({\n hash: c.hash, message: c.message, date: c.date, kind: 'commit' as const,\n }));\n const antiPatterns: AntiPattern[] = revertDetector.detect(commits);\n\n const fileIndex: FileIndex = {\n file: relativePath,\n lastModified,\n contentHash: hasher.hash(source),\n symbols,\n edges,\n complexity,\n intent,\n antiPatterns,\n };\n\n writer.write(fileIndex);\n storage.writeSymbolFile(fileIndex);\n console.error(`[ctxo] Re-indexed: ${relativePath}`);\n } catch (err) {\n console.error(`[ctxo] Failed to re-index ${relativePath}: ${(err as Error).message}`);\n }\n };\n\n const debouncedReindex = (filePath: string) => {\n const existing = pendingFiles.get(filePath);\n if (existing) clearTimeout(existing);\n\n pendingFiles.set(\n filePath,\n setTimeout(() => {\n pendingFiles.delete(filePath);\n reindexFile(filePath);\n }, DEBOUNCE_MS),\n );\n };\n\n watcher.start((event, filePath) => {\n if (event === 'unlink') {\n const ext = extname(filePath).toLowerCase();\n if (!supportedExtensions.has(ext)) return;\n\n const relativePath = relative(this.projectRoot, filePath).replace(/\\\\/g, '/');\n writer.delete(relativePath);\n storage.deleteSymbolFile(relativePath);\n console.error(`[ctxo] Removed from index: ${relativePath}`);\n } else {\n debouncedReindex(filePath);\n }\n });\n\n console.error('[ctxo] Watching for file changes... (Ctrl+C to stop)');\n\n const cleanup = () => {\n console.error('\\n[ctxo] Stopping watcher...');\n for (const timeout of pendingFiles.values()) {\n clearTimeout(timeout);\n }\n watcher.stop().then(() => {\n storage.close();\n console.error('[ctxo] Watcher stopped');\n process.exit(0);\n });\n };\n\n process.on('SIGINT', cleanup);\n process.on('SIGTERM', cleanup);\n }\n\n private registerTreeSitterAdapters(registry: LanguageAdapterRegistry): void {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { GoAdapter } = require('../adapters/language/go-adapter.js');\n registry.register(new GoAdapter());\n } catch {\n console.error('[ctxo] Go adapter unavailable (tree-sitter-go not installed)');\n }\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { CSharpAdapter } = require('../adapters/language/csharp-adapter.js');\n registry.register(new CSharpAdapter());\n } catch {\n console.error('[ctxo] C# adapter unavailable (tree-sitter-c-sharp not installed)');\n }\n }\n}\n","import { watch, type FSWatcher } from 'chokidar';\nimport type { IWatcherPort, FileChangeHandler } from '../../ports/i-watcher-port.js';\n\nconst DEFAULT_IGNORED = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.ctxo/**',\n '**/dist/**',\n '**/coverage/**',\n];\n\nexport class ChokidarWatcherAdapter implements IWatcherPort {\n private readonly projectRoot: string;\n private readonly ignored: string[];\n private watcher: FSWatcher | undefined;\n\n constructor(projectRoot: string, ignored?: string[]) {\n this.projectRoot = projectRoot;\n this.ignored = ignored ?? DEFAULT_IGNORED;\n }\n\n start(handler: FileChangeHandler): void {\n if (this.watcher) {\n throw new Error('Watcher already started. Call stop() before starting again.');\n }\n\n this.watcher = watch(this.projectRoot, {\n ignored: this.ignored,\n persistent: true,\n ignoreInitial: true,\n });\n\n this.watcher.on('add', (path) => handler('add', path));\n this.watcher.on('change', (path) => handler('change', path));\n this.watcher.on('unlink', (path) => handler('unlink', path));\n }\n\n async stop(): Promise<void> {\n if (this.watcher) {\n await this.watcher.close();\n this.watcher = undefined;\n }\n }\n}\n","import { IndexCommand } from './index-command.js';\nimport { SyncCommand } from './sync-command.js';\nimport { StatusCommand } from './status-command.js';\nimport { VerifyCommand } from './verify-command.js';\nimport { InitCommand } from './init-command.js';\nimport { WatchCommand } from './watch-command.js';\n\nexport class CliRouter {\n private readonly projectRoot: string;\n\n constructor(projectRoot: string) {\n this.projectRoot = projectRoot;\n }\n\n async route(args: string[]): Promise<void> {\n const command = args[0];\n\n if (!command || command === '--help' || command === '-h') {\n this.printHelp();\n return;\n }\n\n switch (command) {\n case 'index': {\n const fileIdx = args.indexOf('--file');\n const fileArg = fileIdx !== -1 ? args[fileIdx + 1] : undefined;\n if (fileIdx !== -1 && (!fileArg || fileArg.startsWith('--'))) {\n console.error('[ctxo] --file requires a path argument');\n process.exit(1);\n return;\n }\n const checkArg = args.includes('--check');\n const skipHistory = args.includes('--skip-history');\n const maxHistoryIdx = args.indexOf('--max-history');\n const maxHistoryArg = maxHistoryIdx !== -1 ? Number(args[maxHistoryIdx + 1]) : undefined;\n if (maxHistoryIdx !== -1 && (!maxHistoryArg || isNaN(maxHistoryArg) || maxHistoryArg < 1)) {\n console.error('[ctxo] --max-history requires a positive integer');\n process.exit(1);\n return;\n }\n await new IndexCommand(this.projectRoot).run({ file: fileArg, check: checkArg, skipHistory, maxHistory: maxHistoryArg });\n break;\n }\n\n case 'sync':\n await new SyncCommand(this.projectRoot).run();\n break;\n\n case 'watch':\n await new WatchCommand(this.projectRoot).run();\n break;\n\n case 'verify-index':\n await new VerifyCommand(this.projectRoot).run();\n break;\n\n case 'status':\n new StatusCommand(this.projectRoot).run();\n break;\n\n case 'init':\n new InitCommand(this.projectRoot).run();\n break;\n\n default:\n console.error(`[ctxo] Unknown command: \"${command}\". Run \"ctxo --help\" for usage.`);\n process.exit(1);\n return;\n }\n }\n\n private printHelp(): void {\n console.error(`\nctxo — MCP server for dependency-aware codebase context\n\nUsage:\n ctxo Start MCP server (stdio transport)\n ctxo index Build full codebase index (--max-history N, default 20)\n ctxo sync Rebuild SQLite cache from committed JSON index\n ctxo watch Start file watcher for incremental re-indexing\n ctxo verify-index CI gate: fail if index is stale\n ctxo status Show index manifest\n ctxo init Install git hooks\n ctxo --help Show this help message\n`.trim());\n }\n}\n"],"mappings":"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","names":["extname","readFileSync","writeFileSync","existsSync","join","extname","kind","extname","dirname","join","writeFileSync","existsSync","mkdirSync","join","dirname","join","readFileSync","GoAdapter","CSharpAdapter","existsSync","extname","writeFileSync","join","join","join","existsSync","execFileSync","join","existsSync","execFileSync","join","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","extname","relative","readFileSync","join","relative","readFileSync","extname","GoAdapter","CSharpAdapter"]}
|