ctxo-mcp 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +0 -0
- package/dist/chunk-54ETLIQX.js +145 -0
- package/dist/chunk-54ETLIQX.js.map +1 -0
- package/dist/chunk-P7JUSY3I.js +410 -0
- package/dist/chunk-P7JUSY3I.js.map +1 -0
- package/dist/cli-router-PIWHLS5F.js +1118 -0
- package/dist/cli-router-PIWHLS5F.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +786 -0
- package/dist/index.js.map +1 -0
- package/dist/json-index-reader-PNLPAS42.js +8 -0
- package/dist/json-index-reader-PNLPAS42.js.map +1 -0
- package/dist/staleness-detector-5AN223FM.js +39 -0
- package/dist/staleness-detector-5AN223FM.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../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 { 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 type { CommitIntent, AntiPattern } from '../core/types.js';\nimport type { FileIndex } from '../core/types.js';\n\nexport class IndexCommand {\n private readonly projectRoot: string;\n ctxoRoot: string;\n\n constructor(projectRoot: string, ctxoRoot?: string) {\n this.projectRoot = projectRoot;\n this.ctxoRoot = ctxoRoot ?? join(projectRoot, '.ctxo');\n }\n\n async run(options: { file?: string; check?: boolean; skipSideEffects?: boolean; skipHistory?: boolean } = {}): 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 registry.register(new TsMorphAdapter());\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 // Extract symbols and edges for each file\n const indices: FileIndex[] = [];\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 edges = adapter.extractEdges(relativePath, source);\n const complexity = adapter.extractComplexity(relativePath, source);\n\n // Extract git history and anti-patterns (skip if --skip-history)\n let intent: CommitIntent[] = [];\n let antiPatterns: AntiPattern[] = [];\n\n if (!options.skipHistory) {\n const commits = await gitAdapter.getCommitHistory(relativePath);\n intent = commits.map((c) => ({\n hash: c.hash,\n message: c.message,\n date: c.date,\n kind: 'commit' as const,\n }));\n antiPatterns = revertDetector.detect(commits);\n }\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 indices.push(fileIndex);\n processed++;\n\n if (processed % 50 === 0) {\n console.error(`[ctxo] Processed ${processed}/${files.length} files`);\n }\n } catch (err) {\n console.error(`[ctxo] Skipped ${relativePath}: ${(err as Error).message}`);\n }\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 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 ['.ts', '.tsx', '.js', '.jsx'].includes(ext);\n }\n\n private async runCheck(): Promise<void> {\n console.error('[ctxo] Checking index freshness...');\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 const ext = extname(filePath).toLowerCase();\n if (!['.ts', '.tsx', '.js', '.jsx'].includes(ext)) 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, GraphEdge, ComplexityMetrics, SymbolKind } 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\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 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\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 this.cleanupSourceFile(filePath);\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 });\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 });\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 });\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 });\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 });\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 });\n }\n }\n }\n\n // ── Edge Extraction ─────────────────────────────────────────\n\n private extractImportEdges(\n sourceFile: SourceFile,\n filePath: string,\n edges: GraphEdge[],\n ): void {\n // Compute once per file, not per import declaration\n const fileSymbolId = this.buildSymbolId(filePath, sourceFile.getBaseName().replace(/\\.[^.]+$/, ''), 'variable');\n const fromSymbols = this.findExportedSymbolsInFile(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 for (const named of imp.getNamedImports()) {\n const importedName = named.getName();\n\n edges.push({\n from: fromSymbol,\n to: this.resolveImportTarget(normalizedTarget, importedName),\n kind: 'imports',\n });\n }\n\n const defaultImport = imp.getDefaultImport();\n if (defaultImport) {\n\n edges.push({\n from: fromSymbol,\n to: this.resolveImportTarget(normalizedTarget, defaultImport.getText()),\n kind: 'imports',\n });\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 const baseName = baseClass.getExpression().getText();\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 const ifaceName = impl.getExpression().getText();\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 // Check if the called function is a local import\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 // Skip this.xxx calls (internal method calls)\n if (calledText.startsWith('this.')) continue;\n\n const resolved = this.resolveLocalCallTarget(sourceFile, filePath, calledName);\n if (resolved) {\n edges.push({ from: methodSymbolId, to: resolved, kind: 'calls' });\n }\n }\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 // ── Helpers ─────────────────────────────────────────────────\n\n private parseSource(filePath: string, source: string): SourceFile | undefined {\n try {\n const existing = this.project.getSourceFile(filePath);\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 // 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 // PascalCase starting with I + PascalCase = interface (e.g., IStoragePort)\n // PascalCase = class or type\n // camelCase or UPPER_CASE = function or variable\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 targetFile = imp.getModuleSpecifierSourceFile()?.getFilePath() ?? moduleSpecifier;\n return `${this.normalizeFilePath(targetFile)}::${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 findExportedSymbolsInFile(filePath: string): string[] {\n const sourceFile = this.project.getSourceFile(filePath);\n if (!sourceFile) return [];\n\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 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, mkdirSync, unlinkSync, existsSync } from 'node:fs';\nimport { dirname, join, resolve, sep } from 'node:path';\nimport type { FileIndex } 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 writeFileSync(targetPath, json, 'utf-8');\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 SUPPORTED_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx']);\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\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 ext = extname(filePath).toLowerCase();\n if (!SUPPORTED_EXTENSIONS.has(ext)) return;\n\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 (!SUPPORTED_EXTENSIONS.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","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 }\n const checkArg = args.includes('--check');\n const skipHistory = args.includes('--skip-history');\n await new IndexCommand(this.projectRoot).run({ file: fileArg, check: checkArg, skipHistory });\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 }\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\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":["readFileSync","writeFileSync","existsSync","join","extname","extname","dirname","join","writeFileSync","existsSync","mkdirSync","join","dirname","join","readFileSync","existsSync","extname","writeFileSync","join","join","join","existsSync","execFileSync","join","existsSync","execFileSync","join","join","join","existsSync","readFileSync","writeFileSync","mkdirSync","join","extname","relative","readFileSync","SUPPORTED_EXTENSIONS","join","extname","relative","readFileSync"]}
|
package/dist/index.d.ts
ADDED