@vohongtho.infotech/code-intel 0.1.4 → 0.1.5
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 +44 -6
- package/dist/cli/main.js +1802 -465
- package/dist/cli/main.js.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.js +1480 -588
- package/dist/index.js.map +1 -1
- package/package.json +4 -2
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/storage/db-manager.ts","../../src/storage/schema.ts","../../src/storage/csv-writer.ts","../../src/storage/graph-loader.ts","../../src/storage/repo-registry.ts","../../src/storage/metadata.ts","../../src/storage/index.ts","../../src/search/vector-index.ts","../../src/multi-repo/group-registry.ts","../../src/search/embedder.ts","../../src/graph/knowledge-graph.ts","../../src/pipeline/dag-validator.ts","../../src/pipeline/orchestrator.ts","../../src/shared/detection.ts","../../src/graph/id-generator.ts","../../src/pipeline/phases/scan-phase.ts","../../src/pipeline/phases/parse-phase.ts","../../src/pipeline/phases/resolve-phase.ts","../../src/pipeline/phases/cluster-phase.ts","../../src/pipeline/phases/flow-phase.ts","../../src/search/text-search.ts","../../src/http/app.ts","../../src/multi-repo/group-sync.ts","../../src/multi-repo/graph-from-db.ts","../../src/multi-repo/group-query.ts","../../src/mcp-server/server.ts","../../src/cli/main.ts","../../src/cli/skill-writer.ts","../../src/cli/context-writer.ts"],"names":["fs","path","stream","os","relativePath","__dirname","embedNodes","saveGroup","__filename","fileURLToPath","getVectorDbPath","VectorIndex","codeIntelDir"],"mappings":"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","file":"main.js","sourcesContent":["import { Database, Connection } from '@ladybugdb/core';\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class DbManager {\n private db: InstanceType<typeof Database> | null = null;\n private conn: InstanceType<typeof Connection> | null = null;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async init(): Promise<void> {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n this.db = new Database(this.dbPath);\n await this.db.init();\n this.conn = new Connection(this.db);\n await this.conn.init();\n }\n\n async query(cypher: string): Promise<Record<string, unknown>[]> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n const rows = await qr.getAll();\n qr.close();\n return rows as Record<string, unknown>[];\n }\n\n async execute(cypher: string): Promise<void> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n qr.close();\n }\n\n close(): void {\n try {\n this.conn?.close();\n } catch { /* ignore */ }\n try {\n this.db?.close();\n } catch { /* ignore */ }\n this.conn = null;\n this.db = null;\n }\n\n get isOpen(): boolean {\n return this.conn !== null;\n }\n}\n","import type { NodeKind } from '../shared/index.js';\n\nexport const NODE_TABLE_MAP: Record<NodeKind, string> = {\n file: 'file_nodes',\n directory: 'dir_nodes',\n function: 'func_nodes',\n class: 'class_nodes',\n interface: 'iface_nodes',\n method: 'method_nodes',\n constructor: 'ctor_nodes',\n variable: 'var_nodes',\n property: 'prop_nodes',\n struct: 'struct_nodes',\n enum: 'enum_nodes',\n trait: 'trait_nodes',\n namespace: 'ns_nodes',\n module: 'mod_nodes',\n type_alias: 'type_nodes',\n constant: 'const_nodes',\n route: 'route_nodes',\n cluster: 'cluster_nodes',\n flow: 'flow_nodes',\n};\n\nexport const ALL_NODE_TABLES = [...new Set(Object.values(NODE_TABLE_MAP))];\n\nexport function getCreateNodeTableDDL(tableName: string): string {\n return `CREATE NODE TABLE IF NOT EXISTS ${tableName} (\n id STRING,\n name STRING,\n file_path STRING,\n start_line INT64,\n end_line INT64,\n exported BOOLEAN,\n content STRING,\n metadata STRING,\n PRIMARY KEY (id)\n)`;\n}\n\nexport function getCreateEdgeTableDDL(): string[] {\n const ddls: string[] = [];\n const uniqueTables = ALL_NODE_TABLES;\n\n // Create edge table connecting all node table pairs\n const fromToPairs: string[] = [];\n for (const from of uniqueTables) {\n for (const to of uniqueTables) {\n fromToPairs.push(`FROM ${from} TO ${to}`);\n }\n }\n\n ddls.push(`CREATE REL TABLE IF NOT EXISTS code_edges (\n ${fromToPairs.join(',\\n ')},\n kind STRING,\n weight DOUBLE,\n label STRING\n)`);\n\n return ddls;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { NODE_TABLE_MAP } from './schema.js';\n\nexport function writeNodeCSVs(graph: KnowledgeGraph, outputDir: string): Map<string, string> {\n fs.mkdirSync(outputDir, { recursive: true });\n const tableFiles = new Map<string, fs.WriteStream>();\n const tableFilePaths = new Map<string, string>();\n const header = 'id,name,file_path,start_line,end_line,exported,content,metadata\\n';\n\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n if (!tableFiles.has(table)) {\n const filePath = path.join(outputDir, `${table}.csv`);\n const stream = fs.createWriteStream(filePath);\n stream.write(header);\n tableFiles.set(table, stream);\n tableFilePaths.set(table, filePath);\n }\n\n const stream = tableFiles.get(table)!;\n stream.write(csvRow([\n node.id,\n node.name,\n node.filePath,\n String(node.startLine ?? ''),\n String(node.endLine ?? ''),\n String(node.exported ?? false),\n (node.content ?? '').slice(0, 1000),\n node.metadata ? JSON.stringify(node.metadata) : '',\n ]) + '\\n');\n }\n\n for (const stream of tableFiles.values()) {\n stream.end();\n }\n\n return tableFilePaths;\n}\n\nexport interface EdgeCSVGroup {\n fromTable: string;\n toTable: string;\n filePath: string;\n}\n\nexport function writeEdgeCSV(graph: KnowledgeGraph, outputDir: string): EdgeCSVGroup[] {\n fs.mkdirSync(outputDir, { recursive: true });\n const groups = new Map<string, { stream: fs.WriteStream; filePath: string; from: string; to: string }>();\n const header = 'from_id,to_id,kind,weight,label\\n';\n\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n const key = `${fromTable}->${toTable}`;\n\n if (!groups.has(key)) {\n const filePath = path.join(outputDir, `edges_${fromTable}_${toTable}.csv`);\n const stream = fs.createWriteStream(filePath);\n stream.write(header);\n groups.set(key, { stream, filePath, from: fromTable, to: toTable });\n }\n\n const group = groups.get(key)!;\n group.stream.write(csvRow([\n edge.source,\n edge.target,\n edge.kind,\n String(edge.weight ?? 1.0),\n edge.label ?? '',\n ]) + '\\n');\n }\n\n const result: EdgeCSVGroup[] = [];\n for (const group of groups.values()) {\n group.stream.end();\n result.push({ fromTable: group.from, toTable: group.to, filePath: group.filePath });\n }\n\n return result;\n}\n\nfunction csvRow(fields: string[]): string {\n return fields.map((f) => {\n if (f.includes(',') || f.includes('\"') || f.includes('\\n')) {\n return '\"' + f.replace(/\"/g, '\"\"') + '\"';\n }\n return f;\n }).join(',');\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from './db-manager.js';\nimport { ALL_NODE_TABLES, getCreateNodeTableDDL, getCreateEdgeTableDDL, NODE_TABLE_MAP } from './schema.js';\nimport type { CodeNode } from '../shared/index.js';\n\nexport async function loadGraphToDB(\n graph: KnowledgeGraph,\n dbManager: DbManager,\n): Promise<{ nodeCount: number; edgeCount: number }> {\n // Create all node tables\n for (const table of ALL_NODE_TABLES) {\n await dbManager.execute(getCreateNodeTableDDL(table));\n }\n\n // Create edge table\n const edgeDDLs = getCreateEdgeTableDDL();\n for (const ddl of edgeDDLs) {\n try {\n await dbManager.execute(ddl);\n } catch {\n // Edge table with all pairs might fail, use simpler approach\n }\n }\n\n // Insert nodes via Cypher\n let nodeCount = 0;\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n nodeCount++;\n } catch {\n // Skip duplicate or invalid nodes\n }\n }\n\n // Insert edges via Cypher\n let edgeCount = 0;\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n\n try {\n await dbManager.execute(\n `MATCH (a:${fromTable} {id: '${escCypher(edge.source)}'}), (b:${toTable} {id: '${escCypher(edge.target)}'}) ` +\n `CREATE (a)-[:code_edges {kind: '${edge.kind}', weight: ${edge.weight ?? 1.0}, label: '${escCypher(edge.label ?? '')}'}]->(b)`,\n );\n edgeCount++;\n } catch {\n // Skip invalid edges\n }\n }\n\n return { nodeCount, edgeCount };\n}\n\nfunction buildNodeProps(node: CodeNode): string {\n const parts: string[] = [\n `id: '${escCypher(node.id)}'`,\n `name: '${escCypher(node.name)}'`,\n `file_path: '${escCypher(node.filePath)}'`,\n ];\n if (node.startLine !== undefined) parts.push(`start_line: ${node.startLine}`);\n if (node.endLine !== undefined) parts.push(`end_line: ${node.endLine}`);\n if (node.exported !== undefined) parts.push(`exported: ${node.exported}`);\n if (node.content) parts.push(`content: '${escCypher(node.content.slice(0, 500))}'`);\n if (node.metadata) parts.push(`metadata: '${escCypher(JSON.stringify(node.metadata))}'`);\n return `{${parts.join(', ')}}`;\n}\n\nfunction escCypher(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface RepoEntry {\n name: string;\n path: string;\n indexedAt: string;\n stats: { nodes: number; edges: number; files: number };\n}\n\nconst GLOBAL_DIR = path.join(os.homedir(), '.code-intel');\nconst REPOS_FILE = path.join(GLOBAL_DIR, 'repos.json');\n\nexport function loadRegistry(): RepoEntry[] {\n try {\n const data = fs.readFileSync(REPOS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch {\n return [];\n }\n}\n\nexport function saveRegistry(entries: RepoEntry[]): void {\n fs.mkdirSync(GLOBAL_DIR, { recursive: true });\n fs.writeFileSync(REPOS_FILE, JSON.stringify(entries, null, 2));\n}\n\nexport function upsertRepo(entry: RepoEntry): void {\n const entries = loadRegistry();\n const idx = entries.findIndex((e) => e.path === entry.path);\n if (idx >= 0) {\n entries[idx] = entry;\n } else {\n entries.push(entry);\n }\n saveRegistry(entries);\n}\n\nexport function removeRepo(repoPath: string): void {\n const entries = loadRegistry().filter((e) => e.path !== repoPath);\n saveRegistry(entries);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface IndexMetadata {\n indexedAt: string;\n commitHash?: string;\n stats: {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n };\n}\n\nexport function saveMetadata(repoDir: string, metadata: IndexMetadata): void {\n const metaDir = path.join(repoDir, '.code-intel');\n fs.mkdirSync(metaDir, { recursive: true });\n fs.writeFileSync(path.join(metaDir, 'meta.json'), JSON.stringify(metadata, null, 2));\n}\n\nexport function loadMetadata(repoDir: string): IndexMetadata | null {\n try {\n const data = fs.readFileSync(path.join(repoDir, '.code-intel', 'meta.json'), 'utf-8');\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function getDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'graph.db');\n}\n\nexport function getVectorDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'vector.db');\n}\n","export { DbManager } from './db-manager.js';\nexport { ALL_NODE_TABLES, NODE_TABLE_MAP, getCreateNodeTableDDL, getCreateEdgeTableDDL } from './schema.js';\nexport { writeNodeCSVs, writeEdgeCSV } from './csv-writer.js';\nexport type { EdgeCSVGroup } from './csv-writer.js';\nexport { loadGraphToDB } from './graph-loader.js';\nexport { loadRegistry, saveRegistry, upsertRepo, removeRepo } from './repo-registry.js';\nexport type { RepoEntry } from './repo-registry.js';\nexport { saveMetadata, loadMetadata, getDbPath, getVectorDbPath } from './metadata.js';\nexport type { IndexMetadata } from './metadata.js';\n","import { DbManager } from '../storage/db-manager.js';\nimport type { EmbeddedNode } from './embedder.js';\n\nconst EMBED_TABLE = 'embed_nodes';\nconst EMBED_DIM = 384; // all-MiniLM-L6-v2 output dimension\nconst INDEX_NAME = 'embed_vec_idx';\n\nexport class VectorIndex {\n private db: DbManager;\n\n constructor(db: DbManager) {\n this.db = db;\n }\n\n async init(): Promise<void> {\n // Install + load VECTOR extension\n await this.db.execute('INSTALL VECTOR');\n await this.db.execute('LOAD EXTENSION VECTOR');\n\n // Create node table for embeddings\n await this.db.execute(`\n CREATE NODE TABLE IF NOT EXISTS ${EMBED_TABLE} (\n id STRING,\n name STRING,\n kind STRING,\n file_path STRING,\n text STRING,\n embedding FLOAT[${EMBED_DIM}],\n PRIMARY KEY (id)\n )\n `);\n }\n\n async buildIndex(nodes: EmbeddedNode[]): Promise<void> {\n // Drop existing data\n await this.db.execute(`MATCH (n:${EMBED_TABLE}) DETACH DELETE n`).catch(() => {});\n\n // Insert embeddings\n for (const node of nodes) {\n const vecLiteral = `[${node.embedding.join(',')}]`;\n await this.db.execute(\n `CREATE (:${EMBED_TABLE} {\n id: '${esc(node.id)}',\n name: '${esc(node.name)}',\n kind: '${esc(node.kind)}',\n file_path: '${esc(node.filePath)}',\n text: '${esc(node.text)}',\n embedding: ${vecLiteral}\n })`,\n );\n }\n\n // Drop and recreate vector index (signature: tableName, indexName, propertyName)\n await this.db.execute(`CALL DROP_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}')`).catch(() => {});\n await this.db.execute(`CALL CREATE_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', 'embedding')`);\n // Do NOT close the DB - keep connection open for searches\n }\n\n async search(queryEmbedding: number[], topK = 10): Promise<VectorHit[]> {\n const vecLiteral = `[${queryEmbedding.join(',')}]`;\n const rows = await this.db.query(\n `CALL QUERY_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', ${vecLiteral}, ${topK}) RETURN node.id, node.name, node.kind, node.file_path, distance`,\n );\n return rows.map((r) => ({\n nodeId: String(r['node.id']),\n name: String(r['node.name']),\n kind: String(r['node.kind']),\n filePath: String(r['node.file_path']),\n score: 1 - Number(r['distance']), // cosine distance → similarity\n }));\n }\n\n async isBuilt(): Promise<boolean> {\n try {\n const rows = await this.db.query(`MATCH (n:${EMBED_TABLE}) RETURN count(n) AS cnt`);\n return Number(rows[0]?.cnt ?? 0) > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport interface VectorHit {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number; // 0..1 where 1 = most similar\n}\n\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","/**\n * Persistent store for repo groups.\n * Each group is saved as ~/.code-intel/groups/<name>.json\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { RepoGroup, GroupMember } from './types.js';\n\nconst GROUPS_DIR = path.join(os.homedir(), '.code-intel', 'groups');\n\nfunction groupFile(name: string): string {\n return path.join(GROUPS_DIR, `${name}.json`);\n}\n\nexport function loadGroup(name: string): RepoGroup | null {\n try {\n return JSON.parse(fs.readFileSync(groupFile(name), 'utf-8')) as RepoGroup;\n } catch {\n return null;\n }\n}\n\nexport function saveGroup(group: RepoGroup): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(groupFile(group.name), JSON.stringify(group, null, 2) + '\\n');\n}\n\nexport function listGroups(): RepoGroup[] {\n const groups: RepoGroup[] = [];\n try {\n for (const file of fs.readdirSync(GROUPS_DIR)) {\n if (!file.endsWith('.json') || file.endsWith('.sync.json')) continue;\n try {\n const g = JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, file), 'utf-8'),\n ) as RepoGroup;\n groups.push(g);\n } catch { /* skip malformed */ }\n }\n } catch { /* dir doesn't exist yet */ }\n return groups;\n}\n\nexport function deleteGroup(name: string): void {\n try { fs.unlinkSync(groupFile(name)); } catch { /* ignore */ }\n // also remove sync artifact\n try { fs.unlinkSync(path.join(GROUPS_DIR, `${name}.sync.json`)); } catch { /* ignore */ }\n}\n\nexport function groupExists(name: string): boolean {\n return fs.existsSync(groupFile(name));\n}\n\n/** Add or update a member (by groupPath). Returns the updated group. */\nexport function addMember(groupName: string, member: GroupMember): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n // replace if same groupPath already exists\n const idx = group.members.findIndex((m) => m.groupPath === member.groupPath);\n if (idx >= 0) {\n group.members[idx] = member;\n } else {\n group.members.push(member);\n }\n saveGroup(group);\n return group;\n}\n\n/** Remove a member by groupPath. Returns the updated group. */\nexport function removeMember(groupName: string, groupPath: string): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n const before = group.members.length;\n group.members = group.members.filter((m) => m.groupPath !== groupPath);\n if (group.members.length === before) {\n throw new Error(`No member at path \"${groupPath}\" in group \"${groupName}\".`);\n }\n saveGroup(group);\n return group;\n}\n\n// ─── Sync result persistence ──────────────────────────────────────────────────\n\nimport type { GroupSyncResult } from './types.js';\n\nexport function saveSyncResult(result: GroupSyncResult): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(\n path.join(GROUPS_DIR, `${result.groupName}.sync.json`),\n JSON.stringify(result, null, 2) + '\\n',\n );\n}\n\nexport function loadSyncResult(groupName: string): GroupSyncResult | null {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, `${groupName}.sync.json`), 'utf-8'),\n ) as GroupSyncResult;\n } catch {\n return null;\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EmbeddedNode {\n id: string;\n name: string;\n kind: string;\n filePath: string;\n text: string;\n embedding: number[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet pipelineInstance: ((text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n\nasync function getEmbedder() {\n if (!pipelineInstance) {\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipelineInstance = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as typeof pipelineInstance;\n }\n return pipelineInstance!;\n}\n\nexport async function embedNodes(\n graph: KnowledgeGraph,\n opts: { batchSize?: number; onProgress?: (done: number, total: number) => void } = {},\n): Promise<EmbeddedNode[]> {\n const { batchSize = 32, onProgress } = opts;\n\n // Collect candidates — skip cluster/directory/flow to save time\n const candidates: { id: string; name: string; kind: string; filePath: string; text: string }[] = [];\n for (const node of graph.allNodes()) {\n if (['cluster', 'directory', 'flow'].includes(node.kind)) continue;\n const text = buildText(node);\n candidates.push({ id: node.id, name: node.name, kind: node.kind, filePath: node.filePath, text });\n }\n\n const embedder = await getEmbedder();\n const results: EmbeddedNode[] = [];\n\n for (let i = 0; i < candidates.length; i += batchSize) {\n const batch = candidates.slice(i, i + batchSize);\n const texts = batch.map((c) => c.text);\n\n for (let j = 0; j < texts.length; j++) {\n const out = await embedder(texts[j], { pooling: 'mean', normalize: true });\n results.push({ ...batch[j], embedding: Array.from(out.data) });\n }\n\n onProgress?.(Math.min(i + batchSize, candidates.length), candidates.length);\n }\n\n return results;\n}\n\nfunction buildText(node: { name: string; kind: string; filePath: string; content?: string | null; metadata?: Record<string, unknown> | null }): string {\n const parts: string[] = [`${node.kind} ${node.name}`];\n const sig = node.metadata?.signature as string | undefined;\n if (sig) parts.push(sig);\n if (node.content) parts.push(node.content.slice(0, 256));\n parts.push(node.filePath);\n return parts.join(' ').slice(0, 512);\n}\n","import type { CodeNode, CodeEdge, EdgeKind } from '../shared/index.js';\n\nexport interface KnowledgeGraph {\n addNode(node: CodeNode): void;\n addEdge(edge: CodeEdge): void;\n getNode(id: string): CodeNode | undefined;\n getEdge(id: string): CodeEdge | undefined;\n findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge>;\n findEdgesFrom(sourceId: string): Iterable<CodeEdge>;\n findEdgesTo(targetId: string): Iterable<CodeEdge>;\n removeNodeCascade(id: string): void;\n removeEdge(id: string): void;\n allNodes(): Iterable<CodeNode>;\n allEdges(): Iterable<CodeEdge>;\n readonly size: { nodes: number; edges: number };\n clear(): void;\n}\n\nexport function createKnowledgeGraph(): KnowledgeGraph {\n const nodes = new Map<string, CodeNode>();\n const edges = new Map<string, CodeEdge>();\n const edgesByKind = new Map<EdgeKind, Set<string>>();\n const edgesFromNode = new Map<string, Set<string>>();\n const edgesToNode = new Map<string, Set<string>>();\n\n function indexEdge(edge: CodeEdge): void {\n let kindSet = edgesByKind.get(edge.kind);\n if (!kindSet) {\n kindSet = new Set();\n edgesByKind.set(edge.kind, kindSet);\n }\n kindSet.add(edge.id);\n\n let fromSet = edgesFromNode.get(edge.source);\n if (!fromSet) {\n fromSet = new Set();\n edgesFromNode.set(edge.source, fromSet);\n }\n fromSet.add(edge.id);\n\n let toSet = edgesToNode.get(edge.target);\n if (!toSet) {\n toSet = new Set();\n edgesToNode.set(edge.target, toSet);\n }\n toSet.add(edge.id);\n }\n\n function unindexEdge(edge: CodeEdge): void {\n edgesByKind.get(edge.kind)?.delete(edge.id);\n edgesFromNode.get(edge.source)?.delete(edge.id);\n edgesToNode.get(edge.target)?.delete(edge.id);\n }\n\n return {\n addNode(node: CodeNode): void {\n nodes.set(node.id, node);\n },\n\n addEdge(edge: CodeEdge): void {\n edges.set(edge.id, edge);\n indexEdge(edge);\n },\n\n getNode(id: string): CodeNode | undefined {\n return nodes.get(id);\n },\n\n getEdge(id: string): CodeEdge | undefined {\n return edges.get(id);\n },\n\n *findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge> {\n const ids = edgesByKind.get(kind);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesFrom(sourceId: string): Iterable<CodeEdge> {\n const ids = edgesFromNode.get(sourceId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesTo(targetId: string): Iterable<CodeEdge> {\n const ids = edgesToNode.get(targetId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n removeNodeCascade(id: string): void {\n const fromEdges = edgesFromNode.get(id);\n if (fromEdges) {\n for (const edgeId of [...fromEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n const toEdges = edgesToNode.get(id);\n if (toEdges) {\n for (const edgeId of [...toEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n edgesFromNode.delete(id);\n edgesToNode.delete(id);\n nodes.delete(id);\n },\n\n removeEdge(id: string): void {\n const edge = edges.get(id);\n if (edge) {\n unindexEdge(edge);\n edges.delete(id);\n }\n },\n\n *allNodes(): Iterable<CodeNode> {\n yield* nodes.values();\n },\n\n *allEdges(): Iterable<CodeEdge> {\n yield* edges.values();\n },\n\n get size() {\n return { nodes: nodes.size, edges: edges.size };\n },\n\n clear(): void {\n nodes.clear();\n edges.clear();\n edgesByKind.clear();\n edgesFromNode.clear();\n edgesToNode.clear();\n },\n };\n}\n","import type { Phase } from './types.js';\n\nexport interface ValidationError {\n type: 'duplicate' | 'missing-dep' | 'cycle';\n message: string;\n}\n\nexport function validateDAG(phases: Phase[]): ValidationError[] {\n const errors: ValidationError[] = [];\n const names = new Set<string>();\n\n // Check duplicates\n for (const phase of phases) {\n if (names.has(phase.name)) {\n errors.push({ type: 'duplicate', message: `Duplicate phase name: ${phase.name}` });\n }\n names.add(phase.name);\n }\n\n // Check missing deps\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n if (!names.has(dep)) {\n errors.push({\n type: 'missing-dep',\n message: `Phase \"${phase.name}\" depends on missing phase \"${dep}\"`,\n });\n }\n }\n }\n\n // Check cycles using DFS\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n\n function dfs(name: string, path: string[]): boolean {\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n errors.push({ type: 'cycle', message: `Cycle detected: ${cycle.join(' → ')}` });\n return true;\n }\n if (visited.has(name)) return false;\n\n visiting.add(name);\n path.push(name);\n\n const phase = phaseMap.get(name);\n if (phase) {\n for (const dep of phase.dependencies) {\n if (dfs(dep, path)) return true;\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n path.pop();\n return false;\n }\n\n for (const phase of phases) {\n if (!visited.has(phase.name)) {\n dfs(phase.name, []);\n }\n }\n\n return errors;\n}\n\nexport function topologicalSort(phases: Phase[]): Phase[] {\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n const inDegree = new Map<string, number>();\n const adjList = new Map<string, string[]>();\n\n for (const phase of phases) {\n inDegree.set(phase.name, 0);\n adjList.set(phase.name, []);\n }\n\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n adjList.get(dep)?.push(phase.name);\n inDegree.set(phase.name, (inDegree.get(phase.name) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: Phase[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(phaseMap.get(current)!);\n for (const neighbor of adjList.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n return sorted;\n}\n","import type { Phase, PhaseResult, PipelineContext } from './types.js';\nimport { validateDAG, topologicalSort } from './dag-validator.js';\n\nexport interface PipelineRunResult {\n success: boolean;\n results: Map<string, PhaseResult>;\n totalDuration: number;\n}\n\nexport async function runPipeline(\n phases: Phase[],\n context: PipelineContext,\n): Promise<PipelineRunResult> {\n const errors = validateDAG(phases);\n if (errors.length > 0) {\n throw new Error(`Pipeline validation failed:\\n${errors.map((e) => e.message).join('\\n')}`);\n }\n\n const sorted = topologicalSort(phases);\n const results = new Map<string, PhaseResult>();\n const startTime = Date.now();\n let success = true;\n\n for (const phase of sorted) {\n context.onProgress?.(phase.name, 'running');\n const phaseStart = Date.now();\n\n try {\n const depResults = new Map<string, PhaseResult>();\n for (const dep of phase.dependencies) {\n const depResult = results.get(dep);\n if (depResult) depResults.set(dep, depResult);\n }\n\n const result = await phase.execute(context, depResults);\n results.set(phase.name, result);\n context.onProgress?.(phase.name, result.status);\n\n if (result.status === 'failed') {\n success = false;\n break;\n }\n } catch (err) {\n const result: PhaseResult = {\n status: 'failed',\n duration: Date.now() - phaseStart,\n message: err instanceof Error ? err.message : String(err),\n };\n results.set(phase.name, result);\n context.onProgress?.(phase.name, 'failed');\n success = false;\n break;\n }\n }\n\n return {\n success,\n results,\n totalDuration: Date.now() - startTime,\n };\n}\n","import { Language } from './languages.js';\n\nconst EXTENSION_MAP: Record<string, Language> = {\n '.ts': Language.TypeScript,\n '.tsx': Language.TypeScript,\n '.mts': Language.TypeScript,\n '.cts': Language.TypeScript,\n '.js': Language.JavaScript,\n '.jsx': Language.JavaScript,\n '.mjs': Language.JavaScript,\n '.cjs': Language.JavaScript,\n '.py': Language.Python,\n '.pyi': Language.Python,\n '.java': Language.Java,\n '.go': Language.Go,\n '.c': Language.C,\n '.h': Language.C,\n '.cpp': Language.Cpp,\n '.cxx': Language.Cpp,\n '.cc': Language.Cpp,\n '.hpp': Language.Cpp,\n '.hxx': Language.Cpp,\n '.cs': Language.CSharp,\n '.rs': Language.Rust,\n '.php': Language.PHP,\n '.kt': Language.Kotlin,\n '.kts': Language.Kotlin,\n '.rb': Language.Ruby,\n '.swift': Language.Swift,\n '.dart': Language.Dart,\n};\n\nexport function detectLanguage(filePath: string): Language | null {\n const ext = filePath.slice(filePath.lastIndexOf('.'));\n return EXTENSION_MAP[ext] ?? null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_MAP);\n}\n","import { NodeKind } from '../shared/index.js';\n\nexport function generateNodeId(kind: NodeKind, filePath: string, qualifiedName: string): string {\n return `${kind}:${filePath}:${qualifiedName}`;\n}\n\nexport function generateEdgeId(source: string, target: string, kind: string): string {\n return `${kind}:${source}->${target}`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, getSupportedExtensions } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules', '.git', '.svn', '.hg', 'dist', 'dist-tests', 'build', 'out',\n '__pycache__', '.tox', '.pytest_cache', '.mypy_cache',\n 'vendor', 'target', '.code-intel', 'coverage', '.next',\n '.turbo', '.cache', 'tmp', 'temp', '.parcel-cache',\n]);\n\n/**\n * Load extra ignore patterns from .codeintelignore in the workspace root.\n * Format: one glob/dir name per line, # for comments.\n */\nfunction loadIgnorePatterns(workspaceRoot: string): Set<string> {\n try {\n const raw = fs.readFileSync(path.join(workspaceRoot, '.codeintelignore'), 'utf-8');\n const extras = new Set<string>();\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) extras.add(trimmed);\n }\n return extras;\n } catch {\n return new Set();\n }\n}\n\nconst IGNORED_EXTENSIONS = new Set(['.d.ts', '.js.map', '.d.ts.map']);\n\nexport const scanPhase: Phase = {\n name: 'scan',\n dependencies: [],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const extensions = new Set(getSupportedExtensions());\n const filePaths: string[] = [];\n const extraIgnore = loadIgnorePatterns(context.workspaceRoot);\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') && entry.isDirectory()) continue;\n if (IGNORED_DIRS.has(entry.name) && entry.isDirectory()) continue;\n if (extraIgnore.has(entry.name) && entry.isDirectory()) continue;\n\n const fullPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n walk(fullPath);\n } else if (entry.isFile()) {\n const ext = path.extname(entry.name);\n const fullName = entry.name;\n // Skip declaration files and maps\n if (fullName.endsWith('.d.ts') || fullName.endsWith('.js.map') || fullName.endsWith('.d.ts.map')) continue;\n if (extensions.has(ext)) {\n filePaths.push(fullPath);\n }\n }\n }\n }\n\n walk(context.workspaceRoot);\n context.filePaths.push(...filePaths);\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${filePaths.length} source files`,\n };\n },\n};\n\nexport const structurePhase: Phase = {\n name: 'structure',\n dependencies: ['scan'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const dirs = new Set<string>();\n\n for (const filePath of context.filePaths) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const lang = detectLanguage(filePath);\n\n context.graph.addNode({\n id: generateNodeId('file', relativePath, relativePath),\n kind: 'file',\n name: path.basename(filePath),\n filePath: relativePath,\n metadata: lang ? { language: lang } : undefined,\n });\n\n // Collect directories\n let dir = path.dirname(relativePath);\n while (dir && dir !== '.' && dir !== '') {\n if (dirs.has(dir)) break;\n dirs.add(dir);\n dir = path.dirname(dir);\n }\n }\n\n for (const dir of dirs) {\n context.graph.addNode({\n id: generateNodeId('directory', dir, dir),\n kind: 'directory',\n name: path.basename(dir),\n filePath: dir,\n });\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${context.filePaths.length} file nodes, ${dirs.size} directory nodes`,\n };\n },\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport type { CodeNode, CodeEdge } from '../../shared/index.js';\n\nexport const parsePhase: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n let symbolCount = 0;\n\n for (const filePath of context.filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) {\n if (context.verbose) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n console.log(` [parse] skipped (no parser): ${relativePath}`);\n }\n continue;\n }\n\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n let source: string;\n try {\n source = fs.readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n // Store content on file node for search\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) {\n fileNode.content = source.slice(0, 2000);\n }\n\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n\n const lines = source.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Skip comments\n if (trimmed.startsWith('//') || trimmed.startsWith('#') || trimmed.startsWith('*') || trimmed.startsWith('/*')) continue;\n\n const extracted = extractSymbol(trimmed, lang, i + 1, relativePath);\n if (!extracted) continue;\n if (seen.has(extracted.name + ':' + extracted.kind)) continue;\n seen.add(extracted.name + ':' + extracted.kind);\n\n const nodeId = generateNodeId(extracted.kind, relativePath, extracted.name);\n nodes.push({\n id: nodeId,\n kind: extracted.kind,\n name: extracted.name,\n filePath: relativePath,\n startLine: i + 1,\n exported: extracted.exported,\n content: extractBlock(lines, i, 20),\n });\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n\n // has_member edge for methods inside classes\n if (extracted.ownerName) {\n const ownerId = generateNodeId('class', relativePath, extracted.ownerName);\n if (context.graph.getNode(ownerId) || nodes.some((n) => n.id === ownerId)) {\n edges.push({\n id: generateEdgeId(ownerId, nodeId, 'has_member'),\n source: ownerId,\n target: nodeId,\n kind: 'has_member',\n weight: 1.0,\n });\n }\n }\n\n symbolCount++;\n }\n\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols`,\n };\n },\n};\n\ninterface ExtractedSymbol {\n kind: CodeNode['kind'];\n name: string;\n exported: boolean;\n ownerName?: string;\n}\n\nfunction extractSymbol(\n line: string,\n lang: Language,\n _lineNum: number,\n _filePath: string,\n): ExtractedSymbol | null {\n // --- TypeScript/JavaScript ---\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const func = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('export') };\n\n const arrowFunc = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\(/);\n if (arrowFunc) return { kind: 'function', name: arrowFunc[1], exported: line.includes('export') };\n\n const arrowFunc2 = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[a-zA-Z_]\\w*)\\s*=>/);\n if (arrowFunc2) return { kind: 'function', name: arrowFunc2[1], exported: line.includes('export') };\n\n const cls = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('export') };\n\n const iface = line.match(/^(?:export\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('export') };\n\n const enumM = line.match(/^(?:export\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('export') };\n\n const typeAlias = line.match(/^(?:export\\s+)?type\\s+(\\w+)\\s*[=<]/);\n if (typeAlias) return { kind: 'type_alias', name: typeAlias[1], exported: line.includes('export') };\n\n const constVar = line.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*\\w[^=]*)?\\s*=/);\n if (constVar && /^[A-Z_]+$/.test(constVar[1])) {\n return { kind: 'constant', name: constVar[1], exported: line.includes('export') };\n }\n\n const method = line.match(/^(?:(?:public|private|protected|static|async|readonly)\\s+)*(\\w+)\\s*\\(/);\n if (method && !['if', 'for', 'while', 'switch', 'catch', 'return', 'constructor'].includes(method[1])) {\n if (method[1] === 'constructor') {\n return { kind: 'constructor', name: 'constructor', exported: false };\n }\n }\n }\n\n // --- Python ---\n if (lang === Language.Python) {\n const func = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (func) return { kind: func[1].startsWith('__') ? 'method' : 'function', name: func[1], exported: !func[1].startsWith('_') };\n\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n }\n\n // --- Java ---\n if (lang === Language.Java) {\n const cls = line.match(/(?:public|private|protected)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('public') };\n\n const method = line.match(/(?:public|private|protected)\\s+(?:static\\s+)?(?:[\\w<>\\[\\]]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n }\n\n // --- Go ---\n if (lang === Language.Go) {\n const func = line.match(/^func\\s+(\\w+)\\s*\\(/);\n if (func) return { kind: 'function', name: func[1], exported: func[1][0] === func[1][0].toUpperCase() };\n\n const method = line.match(/^func\\s+\\([^)]+\\)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: method[1][0] === method[1][0].toUpperCase() };\n\n const structM = line.match(/^type\\s+(\\w+)\\s+struct\\b/);\n if (structM) return { kind: 'struct', name: structM[1], exported: structM[1][0] === structM[1][0].toUpperCase() };\n\n const ifaceM = line.match(/^type\\s+(\\w+)\\s+interface\\b/);\n if (ifaceM) return { kind: 'interface', name: ifaceM[1], exported: ifaceM[1][0] === ifaceM[1][0].toUpperCase() };\n }\n\n // --- Rust ---\n if (lang === Language.Rust) {\n const func = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.startsWith('pub') };\n\n const structM = line.match(/^(?:pub\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.startsWith('pub') };\n\n const enumM = line.match(/^(?:pub\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.startsWith('pub') };\n\n const traitM = line.match(/^(?:pub\\s+)?trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: line.startsWith('pub') };\n\n const implM = line.match(/^impl(?:<[^>]*>)?\\s+(\\w+)/);\n if (implM) return { kind: 'class', name: implM[1], exported: false };\n }\n\n // --- C/C++ ---\n if (lang === Language.C || lang === Language.Cpp) {\n const cls = line.match(/^(?:class|struct)\\s+(\\w+)/);\n if (cls) return { kind: lang === Language.Cpp ? 'class' : 'struct', name: cls[1], exported: true };\n\n const nsM = line.match(/^namespace\\s+(\\w+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n\n const func = line.match(/^(?:[\\w:*&<>\\[\\]]+\\s+)+(\\w+)\\s*\\([^;]*$/);\n if (func && !['if', 'for', 'while', 'switch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: true };\n }\n }\n\n // --- C# ---\n if (lang === Language.CSharp) {\n const cls = line.match(/(?:public|internal|private)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:partial\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.includes('public') };\n\n const method = line.match(/(?:public|private|protected|internal)\\s+(?:static\\s+)?(?:async\\s+)?(?:[\\w<>\\[\\]?]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n\n const nsM = line.match(/namespace\\s+([\\w.]+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n }\n\n // --- PHP ---\n if (lang === Language.PHP) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n\n const func = line.match(/(?:public|private|protected|static\\s+)*function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('public') || !line.includes('private') };\n\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: true };\n\n const traitM = line.match(/trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: true };\n }\n\n // --- Kotlin ---\n if (lang === Language.Kotlin) {\n const cls = line.match(/(?:data\\s+|sealed\\s+|abstract\\s+|open\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: !line.includes('private') };\n\n const func = line.match(/(?:suspend\\s+)?fun\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n\n const obj = line.match(/object\\s+(\\w+)/);\n if (obj) return { kind: 'class', name: obj[1], exported: !line.includes('private') };\n }\n\n // --- Ruby ---\n if (lang === Language.Ruby) {\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n\n const modM = line.match(/^module\\s+(\\w+)/);\n if (modM) return { kind: 'module', name: modM[1], exported: true };\n\n const method = line.match(/^(?:def\\s+(?:self\\.)?(\\w+))/);\n if (method) return { kind: 'method', name: method[1], exported: true };\n }\n\n // --- Swift ---\n if (lang === Language.Swift) {\n const cls = line.match(/(?:public\\s+|open\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: !line.includes('private') };\n\n const proto = line.match(/(?:public\\s+)?protocol\\s+(\\w+)/);\n if (proto) return { kind: 'interface', name: proto[1], exported: !line.includes('private') };\n\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: !line.includes('private') };\n\n const func = line.match(/(?:public\\s+|private\\s+|internal\\s+)?(?:static\\s+)?func\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n }\n\n // --- Dart ---\n if (lang === Language.Dart) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n\n const func = line.match(/^(?:\\w+\\s+)?(\\w+)\\s*\\(/);\n if (func && !['if', 'for', 'while', 'switch', 'catch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: !func[1].startsWith('_') };\n }\n }\n\n return null;\n}\n\nfunction extractBlock(lines: string[], startIdx: number, maxLines: number): string {\n const end = Math.min(startIdx + maxLines, lines.length);\n return lines.slice(startIdx, end).join('\\n');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport type { CodeEdge } from '../../shared/index.js';\nimport { getLanguageModule } from '../../languages/registry.js';\n\ninterface ParsedImport {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n line: number;\n}\n\ninterface ParsedCall {\n name: string;\n receiverText?: string;\n isNew: boolean;\n line: number;\n}\n\ninterface ParsedHeritage {\n className: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\nexport const resolvePhase: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n\n // Build file index for import resolution\n const fileIndex = new Map<string, string>();\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex.set(rel, fp);\n // Index without extension\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex.has(noExt)) fileIndex.set(noExt, fp);\n // Index basename\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex.has(base)) fileIndex.set(base, fp);\n }\n\n // Build symbol index: name → nodeId\n const symbolIndex = new Map<string, string>();\n const fileSymbolIndex = new Map<string, Map<string, string>>();\n for (const node of graph.allNodes()) {\n if (['function', 'class', 'interface', 'method', 'enum', 'type_alias', 'variable', 'constant', 'struct', 'trait'].includes(node.kind)) {\n symbolIndex.set(node.name, node.id);\n let fileMap = fileSymbolIndex.get(node.filePath);\n if (!fileMap) {\n fileMap = new Map();\n fileSymbolIndex.set(node.filePath, fileMap);\n }\n fileMap.set(node.name, node.id);\n }\n }\n\n // Process each file for imports, calls, heritage\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n let source: string;\n try {\n source = fs.readFileSync(filePath, 'utf-8');\n } catch {\n continue;\n }\n\n const lines = source.split('\\n');\n const imports = extractImports(lines, lang === 'python');\n const calls = extractCalls(lines);\n const heritages = extractHeritage(lines);\n\n // Resolve imports → IMPORTS edges\n for (const imp of imports) {\n const cleaned = imp.rawPath.replace(/['\"]/g, '');\n let resolvedRelPath: string | null = null;\n\n if (cleaned.startsWith('.')) {\n // Relative import — strip .js/.jsx since TS imports use .js but files are .ts\n const cleanedNoJs = cleaned.replace(/\\.(js|jsx)$/, '');\n const fromDir = path.dirname(relativePath);\n for (const ext of ['', '.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '/index.ts', '/index.js']) {\n const candidate = path.join(fromDir, cleanedNoJs + ext);\n const normalized = path.normalize(candidate);\n if (fileIndex.has(normalized)) {\n // Use the absolute path from the index to derive the canonical relative path\n const absPath = fileIndex.get(normalized)!;\n resolvedRelPath = path.relative(workspaceRoot, absPath);\n break;\n }\n }\n } else {\n // Package import — try to find in file index\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go']) {\n if (fileIndex.has(cleaned + ext)) {\n resolvedRelPath = cleaned + ext;\n break;\n }\n }\n // Try path-based\n const asPath = cleaned.replace(/\\./g, '/');\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go', '/index.ts', '/__init__.py']) {\n if (fileIndex.has(asPath + ext)) {\n resolvedRelPath = asPath + ext;\n break;\n }\n }\n }\n\n if (resolvedRelPath) {\n const targetFileId = generateNodeId('file', resolvedRelPath, resolvedRelPath);\n if (graph.getNode(targetFileId)) {\n const edgeId = generateEdgeId(fileNodeId, targetFileId, 'imports');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: fileNodeId,\n target: targetFileId,\n kind: 'imports',\n weight: 0.95,\n label: cleaned,\n });\n importEdges++;\n }\n }\n }\n }\n\n // Resolve calls → CALLS edges\n const localSymbols = fileSymbolIndex.get(relativePath);\n for (const call of calls) {\n // Tier 1: same file\n let targetId = localSymbols?.get(call.name);\n let confidence = 0.95;\n\n if (!targetId) {\n // Tier 2: global\n targetId = symbolIndex.get(call.name);\n confidence = 0.5;\n }\n\n if (targetId) {\n // Find the caller (enclosing function)\n const callerNodeId = findEnclosingFunction(graph, relativePath, call.line);\n const sourceId = callerNodeId ?? fileNodeId;\n\n if (sourceId !== targetId) {\n const edgeId = generateEdgeId(sourceId, targetId, 'calls');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: sourceId,\n target: targetId,\n kind: 'calls',\n weight: confidence,\n label: call.name,\n });\n callEdges++;\n }\n }\n }\n }\n\n // Heritage → EXTENDS/IMPLEMENTS edges\n for (const h of heritages) {\n const classNodeId = localSymbols?.get(h.className) ?? symbolIndex.get(h.className);\n if (!classNodeId) continue;\n\n for (const ext of h.extendsNames) {\n const targetId = symbolIndex.get(ext);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'extends');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: classNodeId,\n target: targetId,\n kind: 'extends',\n weight: 1.0,\n label: `extends ${ext}`,\n });\n heritageEdges++;\n }\n }\n }\n\n for (const impl of h.implementsNames) {\n const targetId = symbolIndex.get(impl);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'implements');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: classNodeId,\n target: targetId,\n kind: 'implements',\n weight: 1.0,\n label: `implements ${impl}`,\n });\n heritageEdges++;\n }\n }\n }\n }\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n\nfunction extractImports(lines: string[], isPython: boolean): ParsedImport[] {\n const imports: ParsedImport[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // TypeScript/JavaScript: import ... from '...'\n const tsImport = line.match(/import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/);\n if (tsImport) {\n const names: string[] = [];\n const namedMatch = line.match(/\\{([^}]+)\\}/);\n if (namedMatch) {\n names.push(...namedMatch[1].split(',').map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim()).filter(Boolean));\n }\n const defaultMatch = line.match(/import\\s+(\\w+)/);\n if (defaultMatch && defaultMatch[1] !== 'type') {\n names.push(defaultMatch[1]);\n }\n imports.push({\n rawPath: tsImport[1],\n localNames: names,\n isDefault: !namedMatch,\n line: i + 1,\n });\n continue;\n }\n\n // Python: from X import Y / import X\n if (isPython) {\n const fromImport = line.match(/from\\s+([\\w.]+)\\s+import\\s+(.+)/);\n if (fromImport) {\n const names = fromImport[2].split(',').map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim()).filter(Boolean);\n imports.push({ rawPath: fromImport[1], localNames: names, isDefault: false, line: i + 1 });\n continue;\n }\n const directImport = line.match(/^import\\s+([\\w.]+)(?:\\s+as\\s+(\\w+))?/);\n if (directImport) {\n imports.push({\n rawPath: directImport[1],\n localNames: [directImport[2] ?? directImport[1].split('.').pop()!],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n }\n\n // Java/Kotlin: import com.example.Foo\n const javaImport = line.match(/^import\\s+(?:static\\s+)?([\\w.]+)/);\n if (javaImport && !line.includes('from')) {\n const parts = javaImport[1].split('.');\n imports.push({\n rawPath: javaImport[1],\n localNames: [parts[parts.length - 1]],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n\n // Go: import \"path\"\n const goImport = line.match(/^\\s*\"([^\"]+)\"/);\n if (goImport && (i > 0 && lines[i - 1]?.includes('import') || line.match(/^import\\s+\"/))) {\n const parts = goImport[1].split('/');\n imports.push({\n rawPath: goImport[1],\n localNames: [parts[parts.length - 1]],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n\n // C/C++: #include\n const includeMatch = line.match(/#include\\s+[<\"]([^>\"]+)[>\"]/);\n if (includeMatch) {\n imports.push({\n rawPath: includeMatch[1],\n localNames: [],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n\n // Rust: use crate::... / use super::...\n const rustUse = line.match(/^use\\s+([\\w:]+)/);\n if (rustUse) {\n const parts = rustUse[1].split('::');\n imports.push({\n rawPath: rustUse[1],\n localNames: [parts[parts.length - 1]],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n\n // C#: using\n const usingMatch = line.match(/^using\\s+([\\w.]+)/);\n if (usingMatch) {\n const parts = usingMatch[1].split('.');\n imports.push({\n rawPath: usingMatch[1],\n localNames: [parts[parts.length - 1]],\n isDefault: false,\n line: i + 1,\n });\n }\n\n // Ruby: require\n const requireMatch = line.match(/require\\s+['\"]([^'\"]+)['\"]/);\n if (requireMatch) {\n imports.push({\n rawPath: requireMatch[1],\n localNames: [],\n isDefault: false,\n line: i + 1,\n });\n }\n }\n\n return imports;\n}\n\nfunction extractCalls(lines: string[]): ParsedCall[] {\n const calls: ParsedCall[] = [];\n const callRegex = /(?:new\\s+)?(\\w+)\\s*\\(/g;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip declarations\n if (/^\\s*(export\\s+)?(async\\s+)?function\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?(abstract\\s+)?class\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?interface\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?enum\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?type\\s+\\w+\\s*=/.test(line)) continue;\n if (/^\\s*import\\s/.test(line)) continue;\n if (/^\\s*\\/\\//.test(line)) continue;\n\n let match;\n callRegex.lastIndex = 0;\n while ((match = callRegex.exec(line)) !== null) {\n const name = match[1];\n // Skip language keywords\n if (['if', 'for', 'while', 'switch', 'catch', 'return', 'throw', 'typeof', 'instanceof', 'delete', 'void', 'new', 'import', 'export', 'from', 'const', 'let', 'var', 'function', 'class', 'interface', 'type', 'enum', 'extends', 'implements'].includes(name)) continue;\n const isNew = line.substring(Math.max(0, match.index - 4), match.index).includes('new');\n calls.push({ name, isNew, line: i + 1 });\n }\n\n // Member calls: receiver.method(\n const memberCallRegex = /(\\w+)\\.(\\w+)\\s*\\(/g;\n memberCallRegex.lastIndex = 0;\n while ((match = memberCallRegex.exec(line)) !== null) {\n calls.push({\n name: match[2],\n receiverText: match[1],\n isNew: false,\n line: i + 1,\n });\n }\n }\n\n return calls;\n}\n\nfunction extractHeritage(lines: string[]): ParsedHeritage[] {\n const heritages: ParsedHeritage[] = [];\n\n for (const line of lines) {\n // class Foo extends Bar implements Baz, Qux\n const classMatch = line.match(/class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([\\w,\\s]+))?/);\n if (classMatch) {\n const extendsNames = classMatch[2] ? [classMatch[2]] : [];\n const implementsNames = classMatch[3] ? classMatch[3].split(',').map((n) => n.trim()).filter(Boolean) : [];\n heritages.push({ className: classMatch[1], extendsNames, implementsNames });\n continue;\n }\n\n // Python: class Foo(Bar, Baz):\n const pyClassMatch = line.match(/class\\s+(\\w+)\\(([^)]+)\\)/);\n if (pyClassMatch) {\n const bases = pyClassMatch[2].split(',').map((n) => n.trim()).filter(Boolean);\n heritages.push({ className: pyClassMatch[1], extendsNames: bases, implementsNames: [] });\n }\n }\n\n return heritages;\n}\n\nfunction findEnclosingFunction(\n graph: import('../../graph/knowledge-graph.js').KnowledgeGraph,\n filePath: string,\n line: number,\n): string | null {\n let best: { id: string; startLine: number } | null = null;\n\n for (const node of graph.allNodes()) {\n if (node.filePath !== filePath) continue;\n if (!['function', 'method'].includes(node.kind)) continue;\n if (!node.startLine) continue;\n if (node.startLine <= line) {\n if (!best || node.startLine > best.startLine) {\n best = { id: node.id, startLine: node.startLine };\n }\n }\n }\n\n return best?.id ?? null;\n}\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const clusterPhase: Phase = {\n name: 'cluster',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct', 'trait', 'enum']);\n const nodesByDir = new Map<string, { id: string; name: string }[]>();\n\n for (const node of graph.allNodes()) {\n if (!relevantKinds.has(node.kind)) continue;\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = nodesByDir.get(dir);\n if (!group) {\n group = [];\n nodesByDir.set(dir, group);\n }\n group.push({ id: node.id, name: node.name });\n }\n\n let clusterCount = 0;\n for (const [dir, members] of nodesByDir) {\n if (members.length < 2) continue;\n\n const clusterId = generateNodeId('cluster', dir, `cluster-${clusterCount}`);\n const label = dir.split('/').filter(Boolean).pop() ?? `cluster-${clusterCount}`;\n\n graph.addNode({\n id: clusterId,\n kind: 'cluster',\n name: label,\n filePath: dir,\n metadata: { memberCount: members.length },\n });\n\n for (const member of members) {\n graph.addEdge({\n id: generateEdgeId(member.id, clusterId, 'belongs_to'),\n source: member.id,\n target: clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n clusterCount++;\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${clusterCount} clusters`,\n };\n },\n};\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const flowPhase: Phase = {\n name: 'flow',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n // Find entry points: exported functions with no incoming call edges\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: { id: string; name: string; score: number; filePath: string }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n let score = 0;\n const hasCallers = calledNodes.has(node.id);\n const outCalls = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n\n if (!hasCallers && outCalls.length > 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen|bootstrap)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec') || node.filePath.includes('__test')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller') || node.filePath.includes('handler')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({ id: node.id, name: node.name, score, filePath: node.filePath });\n }\n }\n\n entryPoints.sort((a, b) => b.score - a.score);\n\n // Trace flows from top entry points (max 20)\n const maxFlows = 75;\n const maxDepth = 10;\n const maxBranching = 4;\n let flowCount = 0;\n\n for (const ep of entryPoints.slice(0, 20)) {\n if (flowCount >= maxFlows) break;\n\n // BFS trace\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: ep.id, path: [ep.id] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flowCount < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n // Record flow\n const flowId = generateNodeId('flow', ep.filePath, `flow-${flowCount}`);\n graph.addNode({\n id: flowId,\n kind: 'flow',\n name: `${ep.name} flow ${flowCount}`,\n filePath: ep.filePath,\n metadata: { steps: path, entryPoint: ep.name },\n });\n\n // Add step_of edges\n for (let i = 0; i < path.length; i++) {\n graph.addEdge({\n id: generateEdgeId(path[i], flowId, `step_of_${i}`),\n source: path[i],\n target: flowId,\n kind: 'step_of',\n weight: 1.0,\n label: `step ${i + 1}`,\n });\n }\n\n flowCount++;\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${entryPoints.length} entry points, traced ${flowCount} flows`,\n };\n },\n};\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface SearchResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number;\n snippet?: string;\n}\n\nexport function textSearch(\n graph: KnowledgeGraph,\n query: string,\n limit = 20,\n): SearchResult[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const results: SearchResult[] = [];\n\n // Deprioritize test/dist paths\n const isTestPath = (fp: string) =>\n fp.includes('test') || fp.includes('spec') || fp.includes('__test');\n const isDistPath = (fp: string) =>\n fp.includes('/dist') || fp.includes('\\\\dist') || fp.includes('.d.ts');\n\n for (const node of graph.allNodes()) {\n if (['directory', 'cluster', 'flow'].includes(node.kind)) continue;\n\n let score = 0;\n const nameLC = node.name.toLowerCase();\n const pathLC = node.filePath.toLowerCase();\n\n for (const term of terms) {\n if (nameLC === term) score += 10;\n else if (nameLC.startsWith(term)) score += 7;\n else if (nameLC.includes(term)) score += 5;\n if (pathLC.includes(term)) score += 2;\n if (node.content?.toLowerCase().includes(term)) score += 3;\n }\n\n // Boost source files over compiled/test files\n if (score > 0) {\n if (isDistPath(node.filePath)) score -= 8;\n if (isTestPath(node.filePath)) score -= 4;\n // Boost by kind relevance\n if (['function', 'class', 'interface', 'method'].includes(node.kind)) score += 1;\n }\n\n if (score > 0) {\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n score,\n snippet: node.content?.slice(0, 200),\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\nexport function reciprocalRankFusion(\n ...rankings: SearchResult[][]\n): SearchResult[] {\n const K = 60;\n const scoreMap = new Map<string, { result: SearchResult; rrfScore: number }>();\n\n for (const ranking of rankings) {\n for (let rank = 0; rank < ranking.length; rank++) {\n const result = ranking[rank];\n const existing = scoreMap.get(result.nodeId);\n const rrfContribution = 1 / (K + rank + 1);\n\n if (existing) {\n existing.rrfScore += rrfContribution;\n } else {\n scoreMap.set(result.nodeId, {\n result,\n rrfScore: rrfContribution,\n });\n }\n }\n }\n\n return [...scoreMap.values()]\n .sort((a, b) => b.rrfScore - a.rrfScore)\n .map((entry) => ({ ...entry.result, score: entry.rrfScore }));\n}\n","import express from 'express';\nimport cors from 'cors';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { findEntryPoints, traceFlow } from '../flow-detection/entry-point-finder.js';\nimport { DbManager, getDbPath, getVectorDbPath } from '../storage/index.js';\nimport { VectorIndex } from '../search/vector-index.js';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { listGroups, loadGroup, loadSyncResult, saveSyncResult } from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from '../multi-repo/graph-from-db.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Resolve web dist: <core>/dist/http -> ../../web/dist\nconst WEB_DIST = path.resolve(__dirname, '..', '..', '..', 'web', 'dist');\n\nexport function createApp(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): express.Application {\n const app = express();\n\n app.use(cors({ origin: true }));\n app.use(express.json({ limit: '10mb' }));\n\n // Lazy-init vector index state\n let vectorIndex: VectorIndex | null = null;\n let vectorIndexBuilding = false;\n let vectorIndexReady = false;\n\n async function ensureVectorIndex(): Promise<VectorIndex | null> {\n if (vectorIndexReady && vectorIndex) return vectorIndex;\n if (!workspaceRoot || vectorIndexBuilding) return null;\n vectorIndexBuilding = true;\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const dbPath = getVectorDbPath(workspaceRoot);\n const db = new DbManager(dbPath);\n await db.init();\n const idx = new VectorIndex(db);\n await idx.init();\n const alreadyBuilt = await idx.isBuilt();\n if (!alreadyBuilt) {\n console.log(' [vector] Building embeddings…');\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (done % 50 === 0 || done === total) process.stdout.write(`\\r [vector] ${done}/${total}`);\n },\n });\n console.log('');\n await idx.buildIndex(nodes);\n console.log(` [vector] Index built: ${nodes.length} embeddings`);\n } else {\n console.log(' [vector] Index already exists, skipping rebuild.');\n }\n vectorIndex = idx;\n vectorIndexReady = true;\n return idx;\n } catch (err) {\n console.warn(' [vector] Index build failed:', err instanceof Error ? err.message : err);\n return null;\n } finally {\n vectorIndexBuilding = false;\n }\n }\n\n // Kick off in background when workspace is available\n if (workspaceRoot) {\n setImmediate(() => ensureVectorIndex().catch(() => {}));\n }\n\n // Health check\n app.get('/api/health', (_req, res) => {\n res.json({ status: 'ok', nodes: graph.size.nodes, edges: graph.size.edges });\n });\n\n // List repos\n app.get('/api/repos', (_req, res) => {\n res.json([{ name: repoName, nodes: graph.size.nodes, edges: graph.size.edges }]);\n });\n\n // Download full graph\n app.get('/api/graph/:repo', (_req, res) => {\n const nodes = [...graph.allNodes()];\n const edges = [...graph.allEdges()];\n res.json({ nodes, edges });\n });\n\n // Hybrid search (BM25-like text)\n app.post('/api/search', (req, res) => {\n const { query, limit } = req.body;\n const results = textSearch(graph, query, limit ?? 20);\n res.json({ results });\n });\n\n // Vector search (semantic)\n app.post('/api/vector-search', async (req, res) => {\n const { query, limit = 10 } = req.body;\n if (!query) { res.status(400).json({ error: 'Missing query' }); return; }\n\n const idx = await ensureVectorIndex();\n if (!idx) {\n // Fall back to text search\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false });\n return;\n }\n\n try {\n // Embed the query using @huggingface/transformers\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const embedder = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as (text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>;\n const out = await embedder(query, { pooling: 'mean', normalize: true });\n const queryEmbedding = Array.from(out.data);\n const hits = await idx.search(queryEmbedding, limit);\n // Map to SearchResult shape\n const results = hits.map((h) => ({\n nodeId: h.nodeId,\n name: h.name,\n kind: h.kind,\n filePath: h.filePath,\n score: h.score,\n }));\n res.json({ results, source: 'vector', vectorReady: true });\n } catch (err) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // Vector index status\n app.get('/api/vector-status', (_req, res) => {\n res.json({ ready: vectorIndexReady, building: vectorIndexBuilding });\n });\n\n // Read file\n app.post('/api/files/read', (req, res) => {\n const { file_path } = req.body;\n try {\n const content = fs.readFileSync(file_path, 'utf-8');\n res.json({ content });\n } catch {\n res.status(404).json({ error: 'File not found' });\n }\n });\n\n // Grep (regex search in files)\n app.post('/api/grep', (req, res) => {\n const { pattern, file_paths } = req.body;\n const results: { file: string; line: number; text: string }[] = [];\n\n try {\n const regex = new RegExp(pattern, 'gi');\n const paths: string[] = file_paths ?? [];\n\n // If no paths, search from graph nodes\n if (paths.length === 0) {\n for (const node of graph.allNodes()) {\n if (node.kind === 'file' && node.content) {\n const lines = node.content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n results.push({ file: node.filePath, line: i + 1, text: lines[i].trim() });\n }\n regex.lastIndex = 0;\n }\n }\n }\n }\n\n res.json({ results: results.slice(0, 100) });\n } catch {\n res.status(400).json({ error: 'Invalid regex pattern' });\n }\n });\n\n // Cypher query — routed to LadybugDB if available, else falls back to in-memory\n app.post('/api/cypher', async (req, res) => {\n const { query: q } = req.body;\n if (!q) { res.status(400).json({ error: 'Missing query' }); return; }\n\n // Try LadybugDB first\n if (workspaceRoot) {\n try {\n const dbPath = getDbPath(workspaceRoot);\n const dbm = new DbManager(dbPath);\n await dbm.init();\n const rows = await dbm.query(q);\n dbm.close();\n res.json({ results: rows });\n return;\n } catch (err) {\n // Fall through to in-memory fallback\n }\n }\n\n // In-memory fallback\n try {\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const name = nameMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === name) {\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n results.push({ node, incoming: incoming.length, outgoing: outgoing.length });\n }\n }\n res.json({ results });\n return;\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const kind = kindMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kind) results.push(node);\n if (results.length >= 50) break;\n }\n res.json({ results });\n return;\n }\n res.json({ results: [], message: 'Query not recognized.' });\n } catch {\n res.status(400).json({ error: 'Invalid query' });\n }\n });\n\n // Get node detail (inspect)\n app.get('/api/nodes/:id', (req, res) => {\n const nodeId = decodeURIComponent(req.params.id);\n const node = graph.getNode(nodeId);\n if (!node) {\n res.status(404).json({ error: 'Node not found' });\n return;\n }\n\n const incoming = [...graph.findEdgesTo(nodeId)];\n const outgoing = [...graph.findEdgesFrom(nodeId)];\n\n res.json({\n node,\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.source,\n name: graph.getNode(e.source)?.name,\n weight: e.weight,\n })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.target,\n name: graph.getNode(e.target)?.name,\n weight: e.weight,\n })),\n imports: outgoing.filter((e) => e.kind === 'imports').map((e) => ({\n id: e.target,\n name: graph.getNode(e.target)?.name,\n })),\n importedBy: incoming.filter((e) => e.kind === 'imports').map((e) => ({\n id: e.source,\n name: graph.getNode(e.source)?.name,\n })),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => ({\n id: e.target,\n name: graph.getNode(e.target)?.name,\n })),\n implementsEdges: outgoing.filter((e) => e.kind === 'implements').map((e) => ({\n id: e.target,\n name: graph.getNode(e.target)?.name,\n })),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({\n id: e.target,\n name: graph.getNode(e.target)?.name,\n kind: graph.getNode(e.target)?.kind,\n })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => graph.getNode(e.target)?.name)[0],\n });\n });\n\n // Blast radius\n app.post('/api/blast-radius', (req, res) => {\n const { target, direction = 'both', max_hops = 5 } = req.body;\n\n // Find the node\n let targetNode = null;\n for (const node of graph.allNodes()) {\n if (node.name === target || node.id === target) {\n targetNode = node;\n break;\n }\n }\n\n if (!targetNode) {\n res.status(404).json({ error: `Symbol \"${target}\" not found` });\n return;\n }\n\n const affected = new Map<string, { name: string; kind: string; depth: number }>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > max_hops) continue;\n visited.add(id);\n\n const node = graph.getNode(id);\n if (node) {\n affected.set(id, { name: node.name, kind: node.kind, depth });\n }\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') {\n queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n if (direction === 'callees' || direction === 'both') {\n for (const edge of graph.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') {\n queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n }\n\n res.json({\n target: targetNode.name,\n affectedCount: [...affected.values()].filter((a) => a.depth > 0).length,\n affected: [...affected.entries()]\n .map(([id, info]) => ({ id, ...info }))\n .filter((a) => a.depth > 0),\n });\n });\n\n // Flows\n app.get('/api/flows', (_req, res) => {\n const flows: { id: string; name: string; steps: unknown }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') {\n flows.push({\n id: node.id,\n name: node.name,\n steps: node.metadata?.steps,\n });\n }\n }\n res.json({ flows });\n });\n\n // Clusters\n app.get('/api/clusters', (_req, res) => {\n const clusters: { id: string; name: string; memberCount: number }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n clusters.push({\n id: node.id,\n name: node.name,\n memberCount: (node.metadata?.memberCount as number) ?? 0,\n });\n }\n }\n res.json({ clusters });\n });\n\n // ── Group routes ──────────────────────────────────────────────────────────────\n app.get('/api/groups', (_req, res) => {\n const groups = listGroups();\n res.json(groups.map((g) => ({\n name: g.name,\n memberCount: g.members.length,\n lastSync: g.lastSync ?? null,\n createdAt: g.createdAt,\n })));\n });\n\n app.get('/api/groups/:name', (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n res.json(group);\n });\n\n app.get('/api/groups/:name/contracts', (req, res) => {\n const result = loadSyncResult(req.params.name);\n if (!result) { res.status(404).json({ error: 'No sync result. Run sync first.' }); return; }\n res.json(result);\n });\n\n app.post('/api/groups/:name/sync', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n try {\n const result = await syncGroup(group);\n saveSyncResult(result);\n // Update lastSync on group\n group.lastSync = result.syncedAt;\n const { saveGroup } = await import('../multi-repo/group-registry.js');\n saveGroup(group);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n app.post('/api/groups/:name/search', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n const { q, limit = 20 } = req.body;\n if (!q) { res.status(400).json({ error: 'Missing query q' }); return; }\n try {\n const { perRepo, merged } = await queryGroup(group, q, limit);\n res.json({ perRepo, merged });\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n app.get('/api/groups/:name/graph', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n const registry = loadRegistry();\n const mergedGraph = createKnowledgeGraph();\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(mergedGraph, db);\n db.close();\n } catch { db.close(); }\n }\n res.json({ nodes: [...mergedGraph.allNodes()], edges: [...mergedGraph.allEdges()] });\n });\n\n // Serve web UI static files\n if (fs.existsSync(WEB_DIST)) {\n app.use(express.static(WEB_DIST));\n app.get('/{*path}', (_req, res) => {\n res.sendFile(path.join(WEB_DIST, 'index.html'));\n });\n }\n\n return app;\n}\n\nexport function startHttpServer(\n graph: KnowledgeGraph,\n repoName: string,\n port = 4747,\n workspaceRoot?: string,\n): void {\n const app = createApp(graph, repoName, workspaceRoot);\n app.listen(port, () => {\n console.log(`Code Intelligence server running at http://localhost:${port}`);\n console.log(` Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`);\n });\n}\n","/**\n * group-sync.ts\n * Loads each member repo's knowledge graph from its .code-intel/graph.db,\n * extracts contracts (exports, routes, events, schemas), and matches them\n * across repos to produce ContractLinks.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup, Contract, ContractLink, GroupSyncResult } from './types.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph, type KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\n\n// ─── Extract contracts from a single repo's graph ────────────────────────────\n\nfunction extractContracts(\n graph: KnowledgeGraph,\n repoName: string,\n repoPath: string,\n): Contract[] {\n const contracts: Contract[] = [];\n\n for (const node of graph.allNodes()) {\n // exported symbols → 'export' contracts\n if (\n node.exported === true &&\n ['function', 'class', 'interface', 'method', 'type_alias', 'constant', 'enum', 'struct', 'trait'].includes(node.kind)\n ) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'export',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // route nodes → 'route' contracts\n if (node.kind === 'route') {\n contracts.push({\n repoName,\n repoPath,\n kind: 'route',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // interfaces / type aliases with \"event\" or \"schema\" in name → schema/event contracts\n if (['interface', 'type_alias'].includes(node.kind)) {\n const nameLower = node.name.toLowerCase();\n if (nameLower.includes('event') || nameLower.includes('message')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'event',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n } else if (nameLower.includes('schema') || nameLower.includes('dto') || nameLower.includes('request') || nameLower.includes('response')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'schema',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n }\n }\n }\n\n return contracts;\n}\n\n// ─── Match contracts across repos ────────────────────────────────────────────\n\nfunction matchContracts(allContracts: Contract[]): ContractLink[] {\n const links: ContractLink[] = [];\n\n // Group contracts by repo\n const byRepo = new Map<string, Contract[]>();\n for (const c of allContracts) {\n const arr = byRepo.get(c.repoName) ?? [];\n arr.push(c);\n byRepo.set(c.repoName, arr);\n }\n\n const repoNames = [...byRepo.keys()];\n\n for (let i = 0; i < repoNames.length; i++) {\n for (let j = 0; j < repoNames.length; j++) {\n if (i === j) continue;\n const providerContracts = byRepo.get(repoNames[i])!;\n const consumerContracts = byRepo.get(repoNames[j])!;\n\n // Build a name map for the consumer\n const consumerByName = new Map<string, Contract>();\n for (const c of consumerContracts) consumerByName.set(c.name, c);\n\n for (const provider of providerContracts) {\n const consumer = consumerByName.get(provider.name);\n if (consumer) {\n // same-kind matches are more confident\n const sameKind = provider.kind === consumer.kind;\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: consumer.repoName,\n consumerContract: consumer.name,\n matchKind: provider.kind === 'route' ? 'route-match' : 'name-match',\n confidence: sameKind ? 0.9 : 0.6,\n });\n } else {\n // partial-name match (camelCase contained)\n const providerLC = provider.name.toLowerCase();\n for (const c of consumerContracts) {\n if (c.name.toLowerCase().includes(providerLC) || providerLC.includes(c.name.toLowerCase())) {\n if (c.name.length >= 4 && provider.name.length >= 4) {\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: c.repoName,\n consumerContract: c.name,\n matchKind: 'name-match',\n confidence: 0.4,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Deduplicate: keep highest-confidence for a given (pRepo, pContract, cRepo) triple\n const seen = new Map<string, ContractLink>();\n for (const link of links) {\n const key = `${link.providerRepo}:${link.providerContract}:${link.consumerRepo}:${link.consumerContract}`;\n const existing = seen.get(key);\n if (!existing || link.confidence > existing.confidence) {\n seen.set(key, link);\n }\n }\n\n return [...seen.values()].sort((a, b) => b.confidence - a.confidence);\n}\n\n// ─── Main sync function ───────────────────────────────────────────────────────\n\nexport async function syncGroup(group: RepoGroup): Promise<GroupSyncResult> {\n const registry = loadRegistry();\n const allContracts: Contract[] = [];\n\n for (const member of group.members) {\n // Resolve the actual repo path from the registry\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) {\n console.warn(` ⚠ Registry entry \"${member.registryName}\" not found — skipping ${member.groupPath}`);\n continue;\n }\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) {\n console.warn(` ⚠ No index at ${dbPath} — run \\`code-intel analyze ${regEntry.path}\\` first`);\n continue;\n }\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch (err) {\n db.close();\n console.warn(` ⚠ Could not load graph for \"${member.registryName}\": ${err instanceof Error ? err.message : err}`);\n continue;\n }\n\n const contracts = extractContracts(graph, member.registryName, regEntry.path);\n console.log(` ✓ ${member.registryName} (${member.groupPath}): ${contracts.length} contracts`);\n allContracts.push(...contracts);\n }\n\n const links = matchContracts(allContracts);\n\n return {\n groupName: group.name,\n syncedAt: new Date().toISOString(),\n memberCount: group.members.length,\n contracts: allContracts,\n links,\n };\n}\n","/**\n * graph-from-db.ts\n * Loads a KnowledgeGraph from a persisted LadybugDB graph.db.\n * Used by group-sync to read each repo's index without re-analyzing.\n */\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { ALL_NODE_TABLES, NODE_TABLE_MAP } from '../storage/schema.js';\nimport type { CodeNode, CodeEdge, NodeKind, EdgeKind } from '../shared/index.js';\n\n// Reverse map: tableName → NodeKind\nconst TABLE_TO_KIND: Record<string, NodeKind> = Object.fromEntries(\n Object.entries(NODE_TABLE_MAP).map(([kind, table]) => [table, kind as NodeKind]),\n);\n\nfunction parseRow(row: Record<string, unknown>, kind: NodeKind): CodeNode {\n return {\n id: String(row['id'] ?? ''),\n kind,\n name: String(row['name'] ?? ''),\n filePath: String(row['file_path'] ?? ''),\n startLine: row['start_line'] != null ? Number(row['start_line']) : undefined,\n endLine: row['end_line'] != null ? Number(row['end_line']) : undefined,\n exported: row['exported'] != null ? Boolean(row['exported']) : undefined,\n content: row['content'] ? String(row['content']) : undefined,\n metadata: row['metadata'] ? (() => {\n try { return JSON.parse(String(row['metadata'])) as Record<string, unknown>; } catch { return undefined; }\n })() : undefined,\n };\n}\n\nexport async function loadGraphFromDB(\n graph: KnowledgeGraph,\n db: DbManager,\n): Promise<void> {\n // Load all node tables\n for (const table of ALL_NODE_TABLES) {\n const kind = TABLE_TO_KIND[table];\n if (!kind) continue;\n let rows: Record<string, unknown>[] = [];\n try {\n rows = await db.query(`MATCH (n:${table}) RETURN n.id, n.name, n.file_path, n.start_line, n.end_line, n.exported, n.content, n.metadata`);\n } catch {\n // table may not exist in older DBs\n continue;\n }\n for (const row of rows) {\n // kuzu returns column names as aliases\n const node = parseRow({\n id: row['n.id'],\n name: row['n.name'],\n file_path: row['n.file_path'],\n start_line: row['n.start_line'],\n end_line: row['n.end_line'],\n exported: row['n.exported'],\n content: row['n.content'],\n metadata: row['n.metadata'],\n }, kind);\n if (node.id && node.name) graph.addNode(node);\n }\n }\n\n // Load edges\n try {\n const edgeRows = await db.query(\n `MATCH (a)-[e:code_edges]->(b) RETURN a.id, b.id, e.kind, e.weight, e.label`,\n );\n for (const row of edgeRows) {\n const sourceId = String(row['a.id'] ?? '');\n const targetId = String(row['b.id'] ?? '');\n const kind = String(row['e.kind'] ?? '') as EdgeKind;\n if (!sourceId || !targetId || !kind) continue;\n const edge: CodeEdge = {\n id: `${sourceId}::${kind}::${targetId}`,\n source: sourceId,\n target: targetId,\n kind,\n weight: row['e.weight'] != null ? Number(row['e.weight']) : undefined,\n label: row['e.label'] ? String(row['e.label']) : undefined,\n };\n graph.addEdge(edge);\n }\n } catch {\n // edges table may not exist in older DBs\n }\n}\n","/**\n * group-query.ts\n * Search execution flows across all repos in a group.\n * Loads each repo's graph, runs text search, and merges via RRF.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup } from './types.js';\nimport type { SearchResult } from '../search/text-search.js';\nimport { textSearch, reciprocalRankFusion } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\n\nexport interface GroupQueryResult {\n repoName: string;\n repoPath: string;\n groupPath: string;\n results: SearchResult[];\n}\n\nexport async function queryGroup(\n group: RepoGroup,\n query: string,\n limit = 20,\n): Promise<{ perRepo: GroupQueryResult[]; merged: SearchResult[] }> {\n const registry = loadRegistry();\n const perRepo: GroupQueryResult[] = [];\n const allRankings: SearchResult[][] = [];\n\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch {\n db.close();\n continue;\n }\n\n const results = textSearch(graph, query, limit);\n // Tag each result with repo info via snippet prefix\n const taggedResults: SearchResult[] = results.map((r) => ({\n ...r,\n snippet: `[${member.registryName}] ${r.snippet ?? ''}`.trim(),\n }));\n\n perRepo.push({\n repoName: member.registryName,\n repoPath: regEntry.path,\n groupPath: member.groupPath,\n results: taggedResults,\n });\n allRankings.push(taggedResults);\n }\n\n const merged = reciprocalRankFusion(...allRankings).slice(0, limit);\n return { perRepo, merged };\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport fs from 'node:fs';\n\nexport function createMcpServer(graph: KnowledgeGraph, repoName: string): Server {\n const server = new Server(\n { name: 'code-intel', version: '0.1.0' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n {\n name: 'repos',\n description: 'List indexed repositories',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'search',\n description: 'Hybrid search across the codebase knowledge graph',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results (default 20)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'inspect',\n description: '360° view of a symbol: definition, callers, callees, heritage, references',\n inputSchema: {\n type: 'object' as const,\n properties: {\n symbol_name: { type: 'string', description: 'Symbol name to inspect' },\n },\n required: ['symbol_name'],\n },\n },\n {\n name: 'blast_radius',\n description: 'Impact analysis: what depends on / is affected by this symbol',\n inputSchema: {\n type: 'object' as const,\n properties: {\n target: { type: 'string', description: 'Target symbol name' },\n direction: { type: 'string', enum: ['callers', 'callees', 'both'], description: 'Direction to trace' },\n max_hops: { type: 'number', description: 'Max hops (default 5)' },\n },\n required: ['target'],\n },\n },\n {\n name: 'routes',\n description: 'List route handler mappings in the codebase',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'raw_query',\n description: 'Execute a graph query (simplified Cypher-like)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n cypher: { type: 'string', description: 'Query string (name=\\'X\\' or :kind patterns)' },\n },\n required: ['cypher'],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const a = (args ?? {}) as Record<string, unknown>;\n\n switch (name) {\n case 'repos': {\n return { content: [{ type: 'text', text: JSON.stringify([{ name: repoName, nodes: graph.size.nodes, edges: graph.size.edges }], null, 2) }] };\n }\n\n case 'search': {\n const query = a.query as string;\n const limit = (a.limit as number) ?? 20;\n const results = textSearch(graph, query, limit);\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n\n case 'inspect': {\n const symbolName = a.symbol_name as string;\n const node = findNodeByName(graph, symbolName);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${symbolName}\" not found` }] };\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n node: { id: node.id, kind: node.kind, name: node.name, filePath: node.filePath, startLine: node.startLine, endLine: node.endLine, exported: node.exported },\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({ id: e.source, name: graph.getNode(e.source)?.name })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({ id: e.target, name: graph.getNode(e.target)?.name })),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => graph.getNode(e.target)?.name),\n implements: outgoing.filter((e) => e.kind === 'implements').map((e) => graph.getNode(e.target)?.name),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({ name: graph.getNode(e.target)?.name, kind: graph.getNode(e.target)?.kind })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => graph.getNode(e.target)?.name)[0],\n content: node.content?.slice(0, 500),\n }, null, 2),\n }],\n };\n }\n\n case 'blast_radius': {\n const target = a.target as string;\n const direction = (a.direction as string) ?? 'both';\n const maxHops = (a.max_hops as number) ?? 5;\n const node = findNodeByName(graph, target);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${target}\" not found` }] };\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: node.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of graph.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n\n const affectedDetails = [...affected].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n return { content: [{ type: 'text', text: JSON.stringify({ target: node.name, affectedCount: affected.size, affected: affectedDetails }, null, 2) }] };\n }\n\n case 'routes': {\n const routes: { name: string; filePath: string }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'route' || (node.kind === 'function' && /route|handler|controller/i.test(node.filePath))) {\n routes.push({ name: node.name, filePath: node.filePath });\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(routes, null, 2) }] };\n }\n\n case 'raw_query': {\n const q = a.cypher as string;\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === nameMatch[1]) results.push(node);\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kindMatch[1]) results.push(node);\n if (results.length >= 50) break;\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n return { content: [{ type: 'text', text: 'Query not recognized' }] };\n }\n\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n }\n });\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: `codeintel://repo/${repoName}/overview`, name: `${repoName} Overview`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/clusters`, name: `${repoName} Clusters`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/flows`, name: `${repoName} Flows`, mimeType: 'application/json' },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri.endsWith('/overview')) {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ repo: repoName, stats: graph.size, nodeCounts: kindCounts }) }] };\n }\n\n if (uri.endsWith('/clusters')) {\n const clusters = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: node.metadata?.memberCount });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(clusters) }] };\n }\n\n if (uri.endsWith('/flows')) {\n const flows = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps, entryPoint: node.metadata?.entryPoint });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(flows) }] };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n });\n\n return server;\n}\n\nexport async function startMcpStdio(graph: KnowledgeGraph, repoName: string): Promise<void> {\n const server = createMcpServer(graph, repoName);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\nfunction findNodeByName(graph: KnowledgeGraph, name: string) {\n for (const node of graph.allNodes()) {\n if (node.name === name) return node;\n }\n return undefined;\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { join, dirname } from 'node:path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n// Resolve package.json relative to the built CLI file (dist/cli/main.js → ../../package.json)\nconst _pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8')) as { version: string };\n\nimport { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { runPipeline } from '../pipeline/orchestrator.js';\nimport {\n scanPhase,\n structurePhase,\n parsePhase,\n resolvePhase,\n clusterPhase,\n flowPhase,\n} from '../pipeline/phases/index.js';\nimport { startHttpServer } from '../http/app.js';\nimport { startMcpStdio } from '../mcp-server/server.js';\nimport { textSearch } from '../search/text-search.js';\nimport type { PipelineContext } from '../pipeline/types.js';\nimport { saveMetadata, loadMetadata, getDbPath } from '../storage/metadata.js';\nimport { writeSkillFiles } from './skill-writer.js';\nimport { writeContextFiles } from './context-writer.js';\nimport { upsertRepo, loadRegistry, removeRepo } from '../storage/repo-registry.js';\nimport { DbManager, loadGraphToDB } from '../storage/index.js';\nimport {\n loadGroup,\n saveGroup,\n listGroups,\n deleteGroup,\n groupExists,\n addMember,\n removeMember,\n saveSyncResult,\n loadSyncResult,\n} from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\n\nconst program = new Command();\n\nprogram\n .name('code-intel')\n .description('Code Intelligence Platform — Static Analysis + Knowledge Graph')\n .version(_pkg.version);\n\nasync function analyzeWorkspace(targetPath: string, options?: {\n silent?: boolean;\n force?: boolean;\n skills?: boolean;\n skipEmbeddings?: boolean;\n skipAgentsMd?: boolean;\n skipGit?: boolean;\n embeddings?: boolean;\n verbose?: boolean;\n}) {\n const workspaceRoot = path.resolve(targetPath);\n if (!options?.silent) console.log(`Analyzing: ${workspaceRoot}`);\n\n // --skip-git: skip the .git check (allow non-git folders)\n if (!options?.skipGit) {\n const gitDir = path.join(workspaceRoot, '.git');\n if (!fs.existsSync(gitDir)) {\n console.warn(` Warning: ${workspaceRoot} is not a Git repository. Use --skip-git to suppress this warning.`);\n }\n }\n\n const graph = createKnowledgeGraph();\n const context: PipelineContext = {\n workspaceRoot,\n graph,\n filePaths: [],\n verbose: options?.verbose,\n onProgress: options?.silent ? undefined : (phase, msg) => console.log(` [${phase}] ${msg}`),\n };\n\n const phases = [scanPhase, structurePhase, parsePhase, resolvePhase, clusterPhase, flowPhase];\n const result = await runPipeline(phases, context);\n\n // Save metadata\n const repoName = path.basename(workspaceRoot);\n saveMetadata(workspaceRoot, {\n indexedAt: new Date().toISOString(),\n stats: {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n duration: result.totalDuration,\n },\n });\n\n upsertRepo({\n name: repoName,\n path: workspaceRoot,\n indexedAt: new Date().toISOString(),\n stats: {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n },\n });\n\n // Persist graph to LadybugDB\n try {\n const dbPath = getDbPath(workspaceRoot);\n const db = new DbManager(dbPath);\n await db.init();\n const { nodeCount, edgeCount } = await loadGraphToDB(graph, db);\n db.close();\n if (!options?.silent) {\n console.log(` DB: ${nodeCount} nodes, ${edgeCount} edges persisted`);\n }\n } catch (err) {\n if (!options?.silent) {\n console.warn(` DB persist warning: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n // Vector embeddings (opt-in or --embeddings, skip if --skip-embeddings)\n const doEmbeddings = options?.embeddings && !options?.skipEmbeddings;\n if (doEmbeddings) {\n if (!options?.silent) console.log(' Embeddings: building vector index…');\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const { getVectorDbPath } = await import('../storage/index.js');\n const { VectorIndex } = await import('../search/vector-index.js');\n const vdbPath = getVectorDbPath(workspaceRoot);\n const vdb = new DbManager(vdbPath);\n await vdb.init();\n const idx = new VectorIndex(vdb);\n await idx.init();\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (!options?.silent) process.stdout.write(`\\r [vector] ${done}/${total}`);\n },\n });\n if (!options?.silent) console.log('');\n await idx.buildIndex(nodes);\n if (!options?.silent) console.log(` Embeddings: ${nodes.length} vectors built`);\n vdb.close();\n } catch (err) {\n if (!options?.silent) {\n console.warn(` Embeddings warning: ${err instanceof Error ? err.message : err}`);\n }\n }\n } else if (!options?.skipEmbeddings && !options?.silent) {\n console.log(' Embeddings: skipped (use --embeddings to enable)');\n }\n\n // Generate .claude/skills/code-intel/ skill files (always, unless --skills was set to false)\n const doSkills = options?.skills !== false;\n let skillSummaries: { name: string; label: string; symbolCount: number; fileCount: number }[] = [];\n if (doSkills) {\n try {\n const { skills } = await writeSkillFiles(graph, workspaceRoot, repoName);\n skillSummaries = skills;\n if (!options?.silent && skills.length > 0) {\n console.log(` Skills: ${skills.length} generated → .claude/skills/code-intel/`);\n }\n } catch (err) {\n if (!options?.silent) {\n console.warn(` Skills warning: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n // Write AGENTS.md + CLAUDE.md context blocks\n if (!options?.skipAgentsMd) {\n try {\n writeContextFiles(workspaceRoot, repoName, {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n duration: result.totalDuration,\n }, skillSummaries);\n if (!options?.silent) {\n console.log(` Context: AGENTS.md + CLAUDE.md updated`);\n }\n } catch (err) {\n if (!options?.silent) {\n console.warn(` Context warning: ${err instanceof Error ? err.message : err}`);\n }\n }\n }\n\n if (!options?.silent) {\n console.log(`\\nDone in ${result.totalDuration}ms`);\n console.log(` Nodes: ${graph.size.nodes}`);\n console.log(` Edges: ${graph.size.edges}`);\n console.log(` Files: ${context.filePaths.length}`);\n console.log(` Success: ${result.success}`);\n }\n\n return { graph, result, repoName, workspaceRoot };\n}\n\n// ─── 1. setup ────────────────────────────────────────────────────────────────\nprogram\n .command('setup')\n .description('Configure MCP server for your editors (one-time setup)')\n .action(() => {\n const configDir = process.env.HOME ? `${process.env.HOME}/.config/claude` : null;\n\n console.log('\\n📡 Code Intelligence MCP Setup\\n');\n console.log('Add the following to your editor MCP configuration:\\n');\n\n const mcpConfig = {\n mcpServers: {\n 'code-intel': {\n command: 'npx',\n args: ['@vohongtho.infotech/code-intel', 'mcp', '.'],\n },\n },\n };\n\n console.log('For Claude Desktop / Claude Code (~/.config/claude/claude_desktop_config.json):');\n console.log(JSON.stringify(mcpConfig, null, 2));\n\n if (configDir) {\n const configFile = `${configDir}/claude_desktop_config.json`;\n try {\n let existing: Record<string, unknown> = {};\n if (fs.existsSync(configFile)) {\n existing = JSON.parse(fs.readFileSync(configFile, 'utf-8')) as Record<string, unknown>;\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(existing.mcpServers as Record<string, unknown> ?? {}),\n ...mcpConfig.mcpServers,\n },\n };\n fs.mkdirSync(configDir, { recursive: true });\n fs.writeFileSync(configFile, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n console.log(`\\n✅ Written to ${configFile}`);\n } catch (err) {\n console.warn(`\\n⚠ Could not auto-write config: ${err instanceof Error ? err.message : err}`);\n console.log('Please add the config above manually.');\n }\n }\n\n console.log('\\nFor VS Code (settings.json or .vscode/mcp.json), use the same mcpServers block.');\n console.log('\\nThen run `code-intel analyze` in your project to index it.\\n');\n });\n\n// ─── 2. analyze ──────────────────────────────────────────────────────────────\nprogram\n .command('analyze')\n .description('Index a repository (or update stale index)')\n .argument('[path]', 'Path to analyze', '.')\n .option('--force', 'Force full re-index even if already indexed')\n .option('--skills', 'Generate repo-specific skill files from detected communities')\n .option('--skip-embeddings', 'Skip embedding generation (faster)')\n .option('--skip-agents-md', 'Preserve custom AGENTS.md/CLAUDE.md code-intel section edits')\n .option('--skip-git', 'Index folders that are not Git repositories')\n .option('--embeddings', 'Enable embedding generation (slower, better search)')\n .option('--verbose', 'Log skipped files when parsers are unavailable')\n .addHelpText('after', `\nExamples:\n code-intel analyze Index current directory\n code-intel analyze ./my-project Index a specific path\n code-intel analyze --force Force full re-index\n code-intel analyze --skills Also generate .claude/skills/ files\n code-intel analyze --skip-embeddings Skip vector embeddings (faster)\n code-intel analyze --skip-agents-md Preserve custom AGENTS.md edits\n code-intel analyze --skip-git Allow non-Git folders\n code-intel analyze --embeddings Enable vector embeddings\n code-intel analyze --verbose Show skipped files`)\n .action(async (targetPath: string, opts: {\n force?: boolean;\n skills?: boolean;\n skipEmbeddings?: boolean;\n skipAgentsMd?: boolean;\n skipGit?: boolean;\n embeddings?: boolean;\n verbose?: boolean;\n }) => {\n await analyzeWorkspace(targetPath, {\n force: opts.force,\n skills: opts.skills,\n skipEmbeddings: opts.skipEmbeddings,\n skipAgentsMd: opts.skipAgentsMd,\n skipGit: opts.skipGit,\n embeddings: opts.embeddings,\n verbose: opts.verbose,\n });\n });\n\n// ─── 3. mcp ──────────────────────────────────────────────────────────────────\nprogram\n .command('mcp')\n .description('Start MCP server (stdio) — serves all indexed repos')\n .argument('[path]', 'Path to analyze', '.')\n .action(async (targetPath: string) => {\n const { graph, repoName } = await analyzeWorkspace(targetPath, { silent: true });\n await startMcpStdio(graph, repoName);\n });\n\n// ─── 4. serve ────────────────────────────────────────────────────────────────\nprogram\n .command('serve')\n .description('Start local HTTP server + web UI (http://localhost:4747)')\n .argument('[path]', 'Path to analyze', '.')\n .option('-p, --port <port>', 'Port number', '4747')\n .action(async (targetPath: string, options: { port: string }) => {\n const { graph, repoName, workspaceRoot } = await analyzeWorkspace(targetPath);\n startHttpServer(graph, repoName, parseInt(options.port, 10), workspaceRoot);\n });\n\n// ─── 5. list ─────────────────────────────────────────────────────────────────\nprogram\n .command('list')\n .description('List all indexed repositories')\n .action(() => {\n const repos = loadRegistry();\n if (repos.length === 0) {\n console.log('No indexed repositories. Run `code-intel analyze <path>` first.');\n return;\n }\n console.log(`\\nIndexed repositories (${repos.length}):\\n`);\n for (const r of repos) {\n console.log(` ${r.name.padEnd(25)} ${r.stats.nodes} nodes, ${r.stats.edges} edges, ${r.stats.files} files`);\n console.log(` Path: ${r.path}`);\n console.log(` Indexed: ${r.indexedAt}`);\n }\n });\n\n// ─── 6. status ───────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show index status for current repo')\n .argument('[path]', 'Path to check', '.')\n .action((targetPath: string) => {\n const workspaceRoot = path.resolve(targetPath);\n const meta = loadMetadata(workspaceRoot);\n if (!meta) {\n console.log('Not indexed. Run `code-intel analyze` first.');\n return;\n }\n console.log(`\\nIndex status for ${workspaceRoot}:`);\n console.log(` Indexed at: ${meta.indexedAt}`);\n console.log(` Nodes: ${meta.stats.nodes}`);\n console.log(` Edges: ${meta.stats.edges}`);\n console.log(` Files: ${meta.stats.files}`);\n console.log(` Duration: ${meta.stats.duration}ms`);\n });\n\n// ─── 7. clean ────────────────────────────────────────────────────────────────\nprogram\n .command('clean')\n .description('Delete index for current repo (or all repos with --all --force)')\n .argument('[path]', 'Path to clean', '.')\n .option('--all', 'Clean all indexed repositories')\n .option('--force', 'Required with --all to confirm destructive operation')\n .action((targetPath: string, opts: { all?: boolean; force?: boolean }) => {\n if (opts.all) {\n if (!opts.force) {\n console.error('Error: --all requires --force to confirm. Run: code-intel clean --all --force');\n process.exit(1);\n }\n const repos = loadRegistry();\n if (repos.length === 0) {\n console.log('No indexed repositories to clean.');\n return;\n }\n for (const r of repos) {\n const codeIntelDir = path.join(r.path, '.code-intel');\n if (fs.existsSync(codeIntelDir)) {\n fs.rmSync(codeIntelDir, { recursive: true, force: true });\n console.log(` Removed ${codeIntelDir}`);\n }\n removeRepo(r.path);\n }\n console.log(`\\nCleaned ${repos.length} repositor${repos.length === 1 ? 'y' : 'ies'}.`);\n return;\n }\n\n const workspaceRoot = path.resolve(targetPath);\n const codeIntelDir = path.join(workspaceRoot, '.code-intel');\n if (fs.existsSync(codeIntelDir)) {\n fs.rmSync(codeIntelDir, { recursive: true, force: true });\n console.log(`Removed ${codeIntelDir}`);\n }\n removeRepo(workspaceRoot);\n console.log('Index cleaned.');\n });\n\n// ─── 8. search ───────────────────────────────────────────────────────────────\nprogram\n .command('search')\n .description('Search the knowledge graph')\n .argument('<query>', 'Search query')\n .option('-l, --limit <limit>', 'Max results', '20')\n .option('-p, --path <path>', 'Path to analyze', '.')\n .action(async (query: string, options: { limit: string; path: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n const results = textSearch(graph, query, parseInt(options.limit, 10));\n if (results.length === 0) {\n console.log('No results found.');\n return;\n }\n console.log(`Found ${results.length} results for \"${query}\":\\n`);\n for (const r of results) {\n console.log(` ${r.kind.padEnd(12)} ${r.name.padEnd(30)} ${r.filePath}`);\n }\n });\n\n// ─── 9. inspect ──────────────────────────────────────────────────────────────\nprogram\n .command('inspect')\n .description('Inspect a symbol: callers, callees, location')\n .argument('<symbol>', 'Symbol name')\n .option('-p, --path <path>', 'Path to analyze', '.')\n .action(async (symbol: string, options: { path: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n\n let found = false;\n for (const node of graph.allNodes()) {\n if (node.name === symbol) {\n found = true;\n console.log(`\\n${node.kind}: ${node.name}`);\n console.log(` File: ${node.filePath}:${node.startLine ?? '?'}`);\n console.log(` Exported: ${node.exported ?? 'unknown'}`);\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n const callers = incoming.filter((e) => e.kind === 'calls');\n const callees = outgoing.filter((e) => e.kind === 'calls');\n\n if (callers.length > 0) {\n console.log(` Callers (${callers.length}):`);\n for (const c of callers.slice(0, 10)) {\n const n = graph.getNode(c.source);\n console.log(` ← ${n?.name ?? c.source} (${n?.filePath})`);\n }\n }\n if (callees.length > 0) {\n console.log(` Callees (${callees.length}):`);\n for (const c of callees.slice(0, 10)) {\n const n = graph.getNode(c.target);\n console.log(` → ${n?.name ?? c.target} (${n?.filePath})`);\n }\n }\n break;\n }\n }\n\n if (!found) console.log(`Symbol \"${symbol}\" not found.`);\n });\n\n// ─── 10. impact ──────────────────────────────────────────────────────────────\nprogram\n .command('impact')\n .description('Show blast radius for a symbol')\n .argument('<symbol>', 'Symbol name')\n .option('-p, --path <path>', 'Path to analyze', '.')\n .option('-d, --depth <depth>', 'Max hops', '5')\n .action(async (symbol: string, options: { path: string; depth: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n const maxHops = parseInt(options.depth, 10);\n\n let targetNode = null;\n for (const node of graph.allNodes()) {\n if (node.name === symbol) { targetNode = node; break; }\n }\n if (!targetNode) { console.log(`Symbol \"${symbol}\" not found.`); return; }\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') {\n queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n console.log(`\\nBlast radius for \"${symbol}\": ${affected.size} affected symbols\\n`);\n for (const id of affected) {\n const n = graph.getNode(id);\n if (n) console.log(` ${n.kind.padEnd(12)} ${n.name.padEnd(30)} ${n.filePath}`);\n }\n });\n\n// ─── 11. group ───────────────────────────────────────────────────────────────\nconst groupCmd = program\n .command('group')\n .description('Manage repository groups (multi-repo / monorepo service tracking)');\n\n// group create <name>\ngroupCmd\n .command('create <name>')\n .description('Create a repository group')\n .action((name: string) => {\n if (groupExists(name)) {\n console.error(`Error: Group \"${name}\" already exists.`);\n process.exit(1);\n }\n saveGroup({ name, createdAt: new Date().toISOString(), members: [] });\n console.log(`✅ Group \"${name}\" created.`);\n });\n\n// group add <group> <groupPath> <registryName>\ngroupCmd\n .command('add <group> <groupPath> <registryName>')\n .description('Add a repo to a group. <groupPath> is a hierarchy path (e.g. hr/hiring/backend); <registryName> is from `code-intel list`')\n .action((group: string, groupPath: string, registryName: string) => {\n // Validate the registry entry exists\n const registry = loadRegistry();\n const regEntry = registry.find((r) => r.name === registryName);\n if (!regEntry) {\n console.error(`Error: Registry entry \"${registryName}\" not found. Run \\`code-intel list\\` to see available repos.`);\n process.exit(1);\n }\n if (!groupExists(group)) {\n console.error(`Error: Group \"${group}\" does not exist. Create it first with \\`code-intel group create ${group}\\`.`);\n process.exit(1);\n }\n addMember(group, { groupPath, registryName });\n console.log(`✅ Added \"${registryName}\" to group \"${group}\" at path \"${groupPath}\".`);\n });\n\n// group remove <group> <groupPath>\ngroupCmd\n .command('remove <group> <groupPath>')\n .description('Remove a repo from a group by its hierarchy path')\n .action((group: string, groupPath: string) => {\n if (!groupExists(group)) {\n console.error(`Error: Group \"${group}\" does not exist.`);\n process.exit(1);\n }\n try {\n removeMember(group, groupPath);\n console.log(`✅ Removed member at path \"${groupPath}\" from group \"${group}\".`);\n } catch (err) {\n console.error(`Error: ${err instanceof Error ? err.message : err}`);\n process.exit(1);\n }\n });\n\n// group list [name]\ngroupCmd\n .command('list [name]')\n .description('List all groups, or show one group\\'s config')\n .action((name?: string) => {\n if (name) {\n const group = loadGroup(name);\n if (!group) {\n console.error(`Error: Group \"${name}\" not found.`);\n process.exit(1);\n }\n console.log(`\\nGroup: ${group.name}`);\n console.log(`Created: ${group.createdAt}`);\n if (group.lastSync) console.log(`Last sync: ${group.lastSync}`);\n console.log(`\\nMembers (${group.members.length}):`);\n if (group.members.length === 0) {\n console.log(' (none — use `code-intel group add` to add repos)');\n } else {\n for (const m of group.members) {\n console.log(` ${m.groupPath.padEnd(35)} → ${m.registryName}`);\n }\n }\n } else {\n const groups = listGroups();\n if (groups.length === 0) {\n console.log('No groups found. Create one with `code-intel group create <name>`.');\n return;\n }\n console.log(`\\nRepository groups (${groups.length}):\\n`);\n for (const g of groups) {\n const sync = g.lastSync ? `synced ${g.lastSync}` : 'not synced';\n console.log(` ${g.name.padEnd(25)} ${g.members.length} member(s) [${sync}]`);\n }\n }\n });\n\n// group sync <name>\ngroupCmd\n .command('sync <name>')\n .description('Extract contracts and match across repos/services in a group')\n .action(async (name: string) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`Error: Group \"${name}\" not found.`);\n process.exit(1);\n }\n if (group.members.length === 0) {\n console.error(`Error: Group \"${name}\" has no members. Add repos with \\`code-intel group add\\`.`);\n process.exit(1);\n }\n\n console.log(`\\n🔄 Syncing group \"${name}\" (${group.members.length} member(s))…\\n`);\n const result = await syncGroup(group);\n\n // Persist sync result and update lastSync timestamp\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n saveGroup(group);\n\n console.log(`\\n✅ Sync complete:`);\n console.log(` Repos synced: ${result.memberCount}`);\n console.log(` Contracts: ${result.contracts.length}`);\n console.log(` Cross-links: ${result.links.length}`);\n\n if (result.links.length > 0) {\n console.log(`\\nTop cross-repo links:`);\n for (const link of result.links.slice(0, 10)) {\n const conf = (link.confidence * 100).toFixed(0).padStart(3);\n console.log(` ${conf}% ${link.providerRepo} ∷ ${link.providerContract.padEnd(30)} ↔ ${link.consumerRepo} ∷ ${link.consumerContract}`);\n }\n if (result.links.length > 10) {\n console.log(` … and ${result.links.length - 10} more. Run \\`code-intel group contracts ${name}\\` for full details.`);\n }\n }\n });\n\n// group contracts <name>\ngroupCmd\n .command('contracts <name>')\n .description('Inspect extracted contracts and cross-links from the last sync')\n .option('--kind <kind>', 'Filter by contract kind: export | route | schema | event')\n .option('--repo <repo>', 'Filter by registry name')\n .option('--min-confidence <pct>', 'Minimum link confidence 0-100 (default: 0)', '0')\n .action((name: string, opts: { kind?: string; repo?: string; minConfidence: string }) => {\n const result = loadSyncResult(name);\n if (!result) {\n console.error(`No sync data for group \"${name}\". Run \\`code-intel group sync ${name}\\` first.`);\n process.exit(1);\n }\n\n const minConf = parseInt(opts.minConfidence, 10) / 100;\n\n let contracts = result.contracts;\n if (opts.kind) contracts = contracts.filter((c) => c.kind === opts.kind);\n if (opts.repo) contracts = contracts.filter((c) => c.repoName === opts.repo);\n\n let links = result.links.filter((l) => l.confidence >= minConf);\n if (opts.repo) links = links.filter((l) => l.providerRepo === opts.repo || l.consumerRepo === opts.repo);\n\n console.log(`\\n📦 Group \"${name}\" — synced ${result.syncedAt}\\n`);\n\n console.log(`Contracts (${contracts.length}):`);\n for (const c of contracts) {\n const sig = c.signature ? ` ${c.signature.slice(0, 60)}` : '';\n console.log(` [${c.kind.padEnd(6)}] ${c.repoName.padEnd(20)} ${c.name.padEnd(35)}${sig}`);\n }\n\n console.log(`\\nCross-repo links (${links.length}):`);\n if (links.length === 0) {\n console.log(' (none)');\n } else {\n for (const link of links) {\n const conf = (link.confidence * 100).toFixed(0).padStart(3);\n console.log(` ${conf}% [${link.matchKind}] ${link.providerRepo} ∷ ${link.providerContract.padEnd(30)} ↔ ${link.consumerRepo} ∷ ${link.consumerContract}`);\n }\n }\n });\n\n// group query <name> <q>\ngroupCmd\n .command('query <name> <q>')\n .description('Search execution flows across all repos in a group')\n .option('-l, --limit <limit>', 'Max results per repo', '10')\n .action(async (name: string, q: string, opts: { limit: string }) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`Error: Group \"${name}\" not found.`);\n process.exit(1);\n }\n\n console.log(`\\n🔍 Querying group \"${name}\" for: \"${q}\"\\n`);\n const limit = parseInt(opts.limit, 10);\n const { perRepo, merged } = await queryGroup(group, q, limit);\n\n if (merged.length === 0) {\n console.log('No results found across any repo in this group.');\n return;\n }\n\n console.log(`Merged results (${merged.length} total, ranked by Reciprocal Rank Fusion):\\n`);\n for (const r of merged) {\n console.log(` ${r.kind.padEnd(12)} ${r.name.padEnd(30)} ${r.filePath}`);\n if (r.snippet) console.log(` ${r.snippet.slice(0, 100)}`);\n }\n\n console.log(`\\nPer-repo breakdown:`);\n for (const rr of perRepo) {\n console.log(` ${rr.repoName} (${rr.groupPath}): ${rr.results.length} result(s)`);\n }\n });\n\n// group status <name>\ngroupCmd\n .command('status <name>')\n .description('Check staleness of repos in a group')\n .action((name: string) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`Error: Group \"${name}\" not found.`);\n process.exit(1);\n }\n\n const registry = loadRegistry();\n const now = Date.now();\n\n console.log(`\\n📊 Group \"${name}\" status\\n`);\n if (group.lastSync) {\n const age = Math.round((now - new Date(group.lastSync).getTime()) / 60000);\n console.log(`Last sync: ${group.lastSync} (${age} min ago)`);\n } else {\n console.log('Last sync: never (run `code-intel group sync ' + name + '`)');\n }\n console.log(`\\nMembers (${group.members.length}):\\n`);\n\n for (const m of group.members) {\n const regEntry = registry.find((r) => r.name === m.registryName);\n if (!regEntry) {\n console.log(` ✗ ${m.groupPath.padEnd(35)} [${m.registryName}] — NOT IN REGISTRY`);\n continue;\n }\n\n const metaPath = path.join(regEntry.path, '.code-intel', 'meta.json');\n let indexedAt = regEntry.indexedAt;\n try {\n const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8')) as { indexedAt: string; stats: { nodes: number; edges: number; files: number } };\n indexedAt = meta.indexedAt;\n const ageMin = Math.round((now - new Date(indexedAt).getTime()) / 60000);\n const stale = ageMin > 1440 ? ' ⚠ STALE (>24h)' : '';\n console.log(` ✓ ${m.groupPath.padEnd(35)} [${m.registryName}] indexed ${indexedAt} (${ageMin} min ago)${stale}`);\n console.log(` ${regEntry.path}`);\n console.log(` ${meta.stats.nodes} nodes, ${meta.stats.edges} edges, ${meta.stats.files} files`);\n } catch {\n console.log(` ✗ ${m.groupPath.padEnd(35)} [${m.registryName}] — NOT INDEXED (run: code-intel analyze ${regEntry.path})`);\n }\n }\n });\n\nprogram.parse();\n","/**\n * Skill file writer — generates .claude/skills/code-intel/ SKILL.md files\n * from the knowledge graph clusters, giving AI assistants structured,\n * high-accuracy context for each functional area of the codebase.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\n\nexport interface SkillSummary {\n name: string;\n label: string;\n symbolCount: number;\n fileCount: number;\n}\n\ninterface AreaInfo {\n label: string;\n dir: string;\n nodes: CodeNode[];\n files: Map<string, CodeNode[]>; // relPath -> nodes\n entryPoints: CodeNode[]; // exported, not called by others\n hotNodes: { node: CodeNode; inDeg: number; outDeg: number }[]; // highest degree\n callEdgesInArea: number; // density signal\n flowIds: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function writeSkillFiles(\n graph: KnowledgeGraph,\n workspaceRoot: string,\n projectName: string,\n): Promise<{ skills: SkillSummary[]; outputDir: string }> {\n const outputDir = path.join(workspaceRoot, '.claude', 'skills', 'code-intel');\n\n const areas = buildAreaMap(graph, workspaceRoot);\n if (areas.length === 0) return { skills: [], outputDir };\n\n fs.rmSync(outputDir, { recursive: true, force: true });\n fs.mkdirSync(outputDir, { recursive: true });\n\n const skills: SkillSummary[] = [];\n const usedNames = new Set<string>();\n\n for (const area of areas) {\n const kebab = uniqueKebab(area.label, usedNames);\n usedNames.add(kebab);\n\n const content = renderSkill(area, projectName, kebab);\n const dir = path.join(outputDir, kebab);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, 'SKILL.md'), content, 'utf-8');\n\n skills.push({ name: kebab, label: area.label, symbolCount: area.nodes.length, fileCount: area.files.size });\n }\n\n return { skills, outputDir };\n}\n\n// ---------------------------------------------------------------------------\n// Build area map from cluster nodes\n// ---------------------------------------------------------------------------\n\nfunction buildAreaMap(graph: KnowledgeGraph, workspaceRoot: string): AreaInfo[] {\n // Index cluster labels\n const clusterLabel = new Map<string, string>();\n const clusterMembers = new Map<string, CodeNode[]>();\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n clusterLabel.set(node.id, node.name);\n clusterMembers.set(node.id, []);\n }\n }\n\n // Assign members via belongs_to\n for (const edge of graph.findEdgesByKind('belongs_to')) {\n const bucket = clusterMembers.get(edge.target);\n const node = graph.getNode(edge.source);\n if (bucket && node) bucket.push(node);\n }\n\n // Precompute degree maps for hot-node detection\n const inDeg = new Map<string, number>();\n const outDeg = new Map<string, number>();\n const calledIds = new Set<string>();\n\n for (const edge of graph.findEdgesByKind('calls')) {\n calledIds.add(edge.target);\n inDeg.set(edge.target, (inDeg.get(edge.target) ?? 0) + 1);\n outDeg.set(edge.source, (outDeg.get(edge.source) ?? 0) + 1);\n }\n\n const areas: AreaInfo[] = [];\n\n for (const [clusterId, members] of clusterMembers) {\n if (members.length < 3) continue;\n\n const label = clusterLabel.get(clusterId) ?? 'unknown';\n const dir = members[0]?.filePath.split('/').slice(0, -1).join('/') ?? '';\n\n // Group by relative file path\n const files = new Map<string, CodeNode[]>();\n for (const n of members) {\n const rel = relPath(n.filePath, workspaceRoot);\n let list = files.get(rel);\n if (!list) { list = []; files.set(rel, list); }\n list.push(n);\n }\n\n // Entry points: exported, not called from outside, callable kinds\n const entryPoints = members\n .filter((n) => n.exported && !calledIds.has(n.id) && ['function', 'method', 'class'].includes(n.kind))\n .slice(0, 6);\n\n // Hot nodes: highest combined degree (most connected = most important)\n const memberIds = new Set(members.map((n) => n.id));\n const hotNodes = members\n .map((n) => ({ node: n, inDeg: inDeg.get(n.id) ?? 0, outDeg: outDeg.get(n.id) ?? 0 }))\n .sort((a, b) => (b.inDeg + b.outDeg) - (a.inDeg + a.outDeg))\n .slice(0, 12);\n\n // Internal call density\n let callEdgesInArea = 0;\n for (const edge of graph.findEdgesByKind('calls')) {\n if (memberIds.has(edge.source) && memberIds.has(edge.target)) callEdgesInArea++;\n }\n\n // Flows touching this area\n const flowIds: string[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind !== 'flow') continue;\n const steps = node.metadata?.steps as string[] | undefined;\n if (steps?.some((s) => memberIds.has(s))) flowIds.push(node.id);\n if (flowIds.length >= 8) break;\n }\n\n areas.push({ label, dir, nodes: members, files, entryPoints, hotNodes, callEdgesInArea, flowIds });\n }\n\n areas.sort((a, b) => b.nodes.length - a.nodes.length);\n return areas.slice(0, 20);\n}\n\n// ---------------------------------------------------------------------------\n// Render optimized SKILL.md\n// ---------------------------------------------------------------------------\n\nfunction renderSkill(area: AreaInfo, projectName: string, kebabName: string): string {\n const density = area.nodes.length > 0\n ? Math.round((area.callEdgesInArea / area.nodes.length) * 10) / 10\n : 0;\n\n const topEntryNames = area.entryPoints.slice(0, 3).map((n) => n.name);\n const topHotNames = area.hotNodes.slice(0, 3).map((h) => h.node.name);\n\n // Pick best symbol names for description triggers\n const triggerNames = topEntryNames.length > 0 ? topEntryNames : topHotNames;\n const triggerStr = triggerNames.map((n) => `\\`${n}\\``).join(', ');\n\n // Dominant directory for scoping hint\n const dirs = [...area.files.keys()].map((f) => f.split('/').slice(0, -1).join('/') || '.');\n const dirCounts = new Map<string, number>();\n for (const d of dirs) dirCounts.set(d, (dirCounts.get(d) ?? 0) + 1);\n const dominantDir = [...dirCounts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? area.dir;\n\n const lines: string[] = [];\n\n // --- Frontmatter ---\n const description = [\n `Covers the **${area.label}** subsystem of ${projectName}.`,\n `${area.nodes.length} symbols across ${area.files.size} files.`,\n triggerStr ? `Key symbols: ${triggerStr}.` : '',\n `Internal call density: ${density} calls/symbol.`,\n area.flowIds.length > 0 ? `Participates in ${area.flowIds.length} execution flow(s).` : '',\n ].filter(Boolean).join(' ');\n\n lines.push('---');\n lines.push(`name: ${kebabName}`);\n lines.push(`description: \"${description.replace(/\"/g, \"'\")}\"`);\n lines.push('---', '');\n\n // --- Title block ---\n lines.push(`# ${area.label}`);\n lines.push('');\n lines.push(`> **${area.nodes.length} symbols** | **${area.files.size} files** | path: \\`${dominantDir}/\\` | call density: ${density}/sym`);\n lines.push('');\n\n // --- When to Use (precise triggers for the AI) ---\n lines.push('## When to Use');\n lines.push('');\n lines.push('Load this skill when:');\n lines.push(`- The task involves code in \\`${dominantDir}/\\``);\n if (triggerStr) lines.push(`- The user mentions ${triggerStr} or asks how they work`);\n lines.push(`- Adding, modifying, or debugging ${area.label.toLowerCase()}-related functionality`);\n lines.push(`- Tracing call chains that pass through the ${area.label} layer`);\n lines.push('');\n\n // --- Key Files ---\n lines.push('## Key Files');\n lines.push('');\n lines.push('| File | Symbols | Notes |');\n lines.push('|------|---------|-------|');\n const sortedFiles = [...area.files.entries()].sort((a, b) => b[1].length - a[1].length);\n for (const [file, nodes] of sortedFiles.slice(0, 10)) {\n const exported = nodes.filter((n) => n.exported);\n const names = nodes.slice(0, 4).map((n) => `\\`${n.name}\\``).join(', ');\n const extra = nodes.length > 4 ? ` +(${nodes.length - 4})` : '';\n const note = exported.length > 0 ? `${exported.length} exported` : 'internal';\n lines.push(`| \\`${file}\\` | ${names}${extra} | ${note} |`);\n }\n lines.push('');\n\n // --- Entry Points ---\n if (area.entryPoints.length > 0) {\n lines.push('## Entry Points');\n lines.push('');\n lines.push('Start exploration here — exported symbols with no external callers:');\n lines.push('');\n for (const ep of area.entryPoints) {\n const loc = ep.startLine ? `:${ep.startLine}` : '';\n lines.push(`- **\\`${ep.name}\\`** \\`(${ep.kind})\\` → \\`${ep.filePath}${loc}\\``);\n }\n lines.push('');\n }\n\n // --- Hot Symbols (most connected = highest impact) ---\n lines.push('## Hot Symbols');\n lines.push('');\n lines.push('Sorted by call graph degree (changing these has the highest blast radius):');\n lines.push('');\n lines.push('| Symbol | Kind | In ← | → Out | File |');\n lines.push('|--------|------|-----:|------:|------|');\n for (const { node: n, inDeg: i, outDeg: o } of area.hotNodes) {\n lines.push(`| \\`${n.name}\\` | ${n.kind} | ${i} | ${o} | \\`${relFile(n.filePath)}\\` |`);\n }\n lines.push('');\n\n // --- Execution Flows ---\n if (area.flowIds.length > 0) {\n lines.push('## Execution Flows');\n lines.push('');\n lines.push(`**${area.flowIds.length}** execution path(s) pass through this area.`);\n lines.push('Run `code-intel inspect <symbol>` on a hot symbol to trace the full call chain.');\n lines.push('');\n }\n\n // --- Impact Guidance ---\n lines.push('## Impact Guidance');\n lines.push('');\n lines.push('Before modifying any symbol in this area:');\n lines.push(`1. **High-degree symbols** (In ← ≥ 3) — check all callers before changing signatures`);\n lines.push(`2. **Entry points** — changes propagate to external consumers`);\n lines.push(`3. Run \\`code-intel impact <symbol>\\` to get full blast radius`);\n lines.push('');\n\n // --- Quick Commands ---\n const firstHot = area.hotNodes[0]?.node.name ?? area.nodes[0]?.name ?? area.label;\n const firstEntry = area.entryPoints[0]?.name ?? firstHot;\n lines.push('## Quick Commands');\n lines.push('');\n lines.push('```bash');\n lines.push(`# Inspect most-connected symbol`);\n lines.push(`code-intel inspect ${firstHot}`);\n lines.push(`# Blast radius for entry point`);\n lines.push(`code-intel impact ${firstEntry}`);\n lines.push(`# Search this area`);\n lines.push(`code-intel search \"${area.label.toLowerCase()}\"`);\n lines.push('```');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\nfunction uniqueKebab(label: string, used: Set<string>): string {\n let base = label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50) || 'skill';\n let candidate = base;\n let n = 2;\n while (used.has(candidate)) { candidate = `${base}-${n++}`; }\n return candidate;\n}\n\nfunction relPath(filePath: string, workspaceRoot: string): string {\n const norm = filePath.replace(/\\\\/g, '/');\n const root = workspaceRoot.replace(/\\\\/g, '/').replace(/\\/?$/, '/');\n return norm.startsWith(root) ? norm.slice(root.length) : norm.replace(/^\\//, '');\n}\n\nfunction relFile(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, '/').split('/');\n return parts.slice(-2).join('/');\n}\n","/**\n * Context file writer — upserts a <!-- code-intel:start/end --> block into\n * AGENTS.md and CLAUDE.md so AI assistants get accurate codebase stats,\n * CLI commands, and skill links immediately after analysis.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { SkillSummary } from './skill-writer.js';\n\nconst BLOCK_START = '<!-- code-intel:start -->';\nconst BLOCK_END = '<!-- code-intel:end -->';\n\nexport interface ContextStats {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n}\n\n/**\n * Write AGENTS.md and CLAUDE.md at the workspace root.\n * Replaces any existing code-intel block; preserves all other content.\n */\nexport function writeContextFiles(\n workspaceRoot: string,\n projectName: string,\n stats: ContextStats,\n skills: SkillSummary[],\n): void {\n const block = buildBlock(projectName, stats, skills);\n\n upsertFile(path.join(workspaceRoot, 'AGENTS.md'), block);\n upsertFile(path.join(workspaceRoot, 'CLAUDE.md'), block);\n}\n\n// ---------------------------------------------------------------------------\n// Block content\n// ---------------------------------------------------------------------------\n\nfunction buildBlock(projectName: string, stats: ContextStats, skills: SkillSummary[]): string {\n const skillRows = skills\n .map((s) => `| Work in \\`${s.label}\\` (${s.symbolCount} symbols) | \\`.claude/skills/code-intel/${s.name}/SKILL.md\\` |`)\n .join('\\n');\n\n const skillTable = `| Task | Skill file |\n|------|------------|\n| Understand architecture / \"How does X work?\" | Load \\`code-intel-exploring\\` skill |\n| Blast radius / \"What breaks if I change X?\" | Load \\`code-intel-impact\\` skill |\n| Debugging / \"Why is X failing?\" | Load \\`code-intel-debugging\\` skill |\n${skillRows ? skillRows + '\\n' : ''}`;\n\n return `${BLOCK_START}\n# Code Intelligence — ${projectName}\n\nIndexed: **${stats.nodes.toLocaleString()} nodes** | **${stats.edges.toLocaleString()} edges** | **${stats.files} files** | analyzed in ${(stats.duration / 1000).toFixed(1)}s\n\n> If the index is stale, re-run: \\`code-intel analyze\\`\n\n## Always Do\n\n- **Before editing any symbol**, run \\`code-intel impact <symbol>\\` and review blast radius.\n- **Before committing**, verify scope with \\`code-intel inspect <symbol>\\`.\n- Use \\`code-intel search \"<concept>\"\\` to find related symbols instead of grepping.\n- Warn the user if impact shows ≥ 5 direct callers (HIGH risk).\n\n## Never Do\n\n- NEVER rename symbols with find-and-replace — use \\`code-intel inspect\\` to find all usages first.\n- NEVER ignore impact warnings — always report blast radius to the user.\n\n## CLI Quick Reference\n\n\\`\\`\\`bash\ncode-intel analyze [path] # Build / refresh the knowledge graph\ncode-intel serve [path] # Start HTTP API + Web UI on :4747\ncode-intel search <query> # Text search across all symbols\ncode-intel inspect <symbol> # Callers, callees, imports, cluster\ncode-intel impact <symbol> # Blast radius (who breaks if this changes)\ncode-intel status [path] # Index freshness and stats\ncode-intel clean [path] # Remove index data\n\\`\\`\\`\n\n## Skills\n\n${skillTable}\n${BLOCK_END}`;\n}\n\n// ---------------------------------------------------------------------------\n// File upsert: create → replace block → append\n// ---------------------------------------------------------------------------\n\nfunction upsertFile(filePath: string, block: string): void {\n if (!fs.existsSync(filePath)) {\n fs.writeFileSync(filePath, block + '\\n', 'utf-8');\n return;\n }\n\n const existing = fs.readFileSync(filePath, 'utf-8');\n const startIdx = findLineMarker(existing, BLOCK_START);\n const endIdx = findLineMarker(existing, BLOCK_END, startIdx === -1 ? 0 : startIdx);\n\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n // Replace existing block\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + BLOCK_END.length);\n fs.writeFileSync(filePath, (before + block + after).trimEnd() + '\\n', 'utf-8');\n return;\n }\n\n // Append block\n fs.writeFileSync(filePath, existing.trimEnd() + '\\n\\n' + block + '\\n', 'utf-8');\n}\n\n/**\n * Find a marker that stands alone on its own line (not embedded in prose).\n */\nfunction findLineMarker(content: string, marker: string, startFrom = 0): number {\n let idx = content.indexOf(marker, startFrom);\n while (idx !== -1) {\n const atStart = idx === 0 || content[idx - 1] === '\\n';\n const end = idx + marker.length;\n const atEnd = end === content.length || content[end] === '\\n' || content[end] === '\\r';\n if (atStart && atEnd) return idx;\n idx = content.indexOf(marker, idx + 1);\n }\n return -1;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/storage/db-manager.ts","../../src/storage/schema.ts","../../src/storage/csv-writer.ts","../../src/storage/graph-loader.ts","../../src/storage/repo-registry.ts","../../src/storage/metadata.ts","../../src/storage/index.ts","../../src/search/vector-index.ts","../../src/multi-repo/group-registry.ts","../../src/search/embedder.ts","../../src/shared/logger.ts","../../src/graph/knowledge-graph.ts","../../src/pipeline/dag-validator.ts","../../src/pipeline/orchestrator.ts","../../src/shared/detection.ts","../../src/graph/id-generator.ts","../../src/pipeline/phases/scan-phase.ts","../../src/pipeline/phases/parse-phase.ts","../../src/pipeline/phases/resolve-phase.ts","../../src/pipeline/phases/cluster-phase.ts","../../src/pipeline/phases/flow-phase.ts","../../src/search/text-search.ts","../../src/http/app.ts","../../src/multi-repo/group-sync.ts","../../src/multi-repo/graph-from-db.ts","../../src/multi-repo/group-query.ts","../../src/mcp-server/server.ts","../../src/cli/main.ts","../../src/cli/skill-writer.ts","../../src/cli/context-writer.ts"],"names":["fs","path","stream","os","relativePath","__dirname","embedNodes","saveGroup","a","exports","__filename","fileURLToPath","getVectorDbPath","VectorIndex","codeIntelDir"],"mappings":"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","file":"main.js","sourcesContent":["import { Database, Connection } from '@ladybugdb/core';\nimport path from 'node:path';\nimport fs from 'node:fs';\n\nexport class DbManager {\n private db: InstanceType<typeof Database> | null = null;\n private conn: InstanceType<typeof Connection> | null = null;\n private dbPath: string;\n\n constructor(dbPath: string) {\n this.dbPath = dbPath;\n }\n\n async init(): Promise<void> {\n fs.mkdirSync(path.dirname(this.dbPath), { recursive: true });\n this.db = new Database(this.dbPath);\n await this.db.init();\n this.conn = new Connection(this.db);\n await this.conn.init();\n }\n\n async query(cypher: string): Promise<Record<string, unknown>[]> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n const rows = await qr.getAll();\n qr.close();\n return rows as Record<string, unknown>[];\n }\n\n async execute(cypher: string): Promise<void> {\n if (!this.conn) throw new Error('Database not initialized');\n const result = await this.conn.query(cypher);\n const qr = Array.isArray(result) ? result[0] : result;\n qr.close();\n }\n\n close(): void {\n try {\n this.conn?.close();\n } catch { /* ignore */ }\n try {\n this.db?.close();\n } catch { /* ignore */ }\n this.conn = null;\n this.db = null;\n }\n\n get isOpen(): boolean {\n return this.conn !== null;\n }\n}\n","import type { NodeKind } from '../shared/index.js';\n\nexport const NODE_TABLE_MAP: Record<NodeKind, string> = {\n file: 'file_nodes',\n directory: 'dir_nodes',\n function: 'func_nodes',\n class: 'class_nodes',\n interface: 'iface_nodes',\n method: 'method_nodes',\n constructor: 'ctor_nodes',\n variable: 'var_nodes',\n property: 'prop_nodes',\n struct: 'struct_nodes',\n enum: 'enum_nodes',\n trait: 'trait_nodes',\n namespace: 'ns_nodes',\n module: 'mod_nodes',\n type_alias: 'type_nodes',\n constant: 'const_nodes',\n route: 'route_nodes',\n cluster: 'cluster_nodes',\n flow: 'flow_nodes',\n};\n\nexport const ALL_NODE_TABLES = [...new Set(Object.values(NODE_TABLE_MAP))];\n\nexport function getCreateNodeTableDDL(tableName: string): string {\n return `CREATE NODE TABLE IF NOT EXISTS ${tableName} (\n id STRING,\n name STRING,\n file_path STRING,\n start_line INT64,\n end_line INT64,\n exported BOOLEAN,\n content STRING,\n metadata STRING,\n PRIMARY KEY (id)\n)`;\n}\n\nexport function getCreateEdgeTableDDL(): string[] {\n const ddls: string[] = [];\n const uniqueTables = ALL_NODE_TABLES;\n\n // Create edge table connecting all node table pairs\n const fromToPairs: string[] = [];\n for (const from of uniqueTables) {\n for (const to of uniqueTables) {\n fromToPairs.push(`FROM ${from} TO ${to}`);\n }\n }\n\n ddls.push(`CREATE REL TABLE IF NOT EXISTS code_edges (\n ${fromToPairs.join(',\\n ')},\n kind STRING,\n weight DOUBLE,\n label STRING\n)`);\n\n return ddls;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { NODE_TABLE_MAP } from './schema.js';\n\nexport function writeNodeCSVs(graph: KnowledgeGraph, outputDir: string): Map<string, string> {\n fs.mkdirSync(outputDir, { recursive: true });\n const tableFiles = new Map<string, fs.WriteStream>();\n const tableFilePaths = new Map<string, string>();\n const header = 'id,name,file_path,start_line,end_line,exported,content,metadata\\n';\n\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n if (!tableFiles.has(table)) {\n const filePath = path.join(outputDir, `${table}.csv`);\n const stream = fs.createWriteStream(filePath);\n stream.write(header);\n tableFiles.set(table, stream);\n tableFilePaths.set(table, filePath);\n }\n\n const stream = tableFiles.get(table)!;\n stream.write(csvRow([\n node.id,\n node.name,\n node.filePath,\n String(node.startLine ?? ''),\n String(node.endLine ?? ''),\n String(node.exported ?? false),\n (node.content ?? '').slice(0, 1000),\n node.metadata ? JSON.stringify(node.metadata) : '',\n ]) + '\\n');\n }\n\n for (const stream of tableFiles.values()) {\n stream.end();\n }\n\n return tableFilePaths;\n}\n\nexport interface EdgeCSVGroup {\n fromTable: string;\n toTable: string;\n filePath: string;\n}\n\nexport function writeEdgeCSV(graph: KnowledgeGraph, outputDir: string): EdgeCSVGroup[] {\n fs.mkdirSync(outputDir, { recursive: true });\n const groups = new Map<string, { stream: fs.WriteStream; filePath: string; from: string; to: string }>();\n const header = 'from_id,to_id,kind,weight,label\\n';\n\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n const key = `${fromTable}->${toTable}`;\n\n if (!groups.has(key)) {\n const filePath = path.join(outputDir, `edges_${fromTable}_${toTable}.csv`);\n const stream = fs.createWriteStream(filePath);\n stream.write(header);\n groups.set(key, { stream, filePath, from: fromTable, to: toTable });\n }\n\n const group = groups.get(key)!;\n group.stream.write(csvRow([\n edge.source,\n edge.target,\n edge.kind,\n String(edge.weight ?? 1.0),\n edge.label ?? '',\n ]) + '\\n');\n }\n\n const result: EdgeCSVGroup[] = [];\n for (const group of groups.values()) {\n group.stream.end();\n result.push({ fromTable: group.from, toTable: group.to, filePath: group.filePath });\n }\n\n return result;\n}\n\nfunction csvRow(fields: string[]): string {\n return fields.map((f) => {\n if (f.includes(',') || f.includes('\"') || f.includes('\\n')) {\n return '\"' + f.replace(/\"/g, '\"\"') + '\"';\n }\n return f;\n }).join(',');\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from './db-manager.js';\nimport { ALL_NODE_TABLES, getCreateNodeTableDDL, getCreateEdgeTableDDL, NODE_TABLE_MAP } from './schema.js';\nimport type { CodeNode } from '../shared/index.js';\n\nexport async function loadGraphToDB(\n graph: KnowledgeGraph,\n dbManager: DbManager,\n): Promise<{ nodeCount: number; edgeCount: number }> {\n // Create all node tables\n for (const table of ALL_NODE_TABLES) {\n await dbManager.execute(getCreateNodeTableDDL(table));\n }\n\n // Create edge table\n const edgeDDLs = getCreateEdgeTableDDL();\n for (const ddl of edgeDDLs) {\n try {\n await dbManager.execute(ddl);\n } catch {\n // Edge table with all pairs might fail, use simpler approach\n }\n }\n\n // Insert nodes via Cypher\n let nodeCount = 0;\n for (const node of graph.allNodes()) {\n const table = NODE_TABLE_MAP[node.kind];\n const props = buildNodeProps(node);\n try {\n await dbManager.execute(`CREATE (:${table} ${props})`);\n nodeCount++;\n } catch {\n // Skip duplicate or invalid nodes\n }\n }\n\n // Insert edges via Cypher\n let edgeCount = 0;\n for (const edge of graph.allEdges()) {\n const sourceNode = graph.getNode(edge.source);\n const targetNode = graph.getNode(edge.target);\n if (!sourceNode || !targetNode) continue;\n\n const fromTable = NODE_TABLE_MAP[sourceNode.kind];\n const toTable = NODE_TABLE_MAP[targetNode.kind];\n\n try {\n await dbManager.execute(\n `MATCH (a:${fromTable} {id: '${escCypher(edge.source)}'}), (b:${toTable} {id: '${escCypher(edge.target)}'}) ` +\n `CREATE (a)-[:code_edges {kind: '${edge.kind}', weight: ${edge.weight ?? 1.0}, label: '${escCypher(edge.label ?? '')}'}]->(b)`,\n );\n edgeCount++;\n } catch {\n // Skip invalid edges\n }\n }\n\n return { nodeCount, edgeCount };\n}\n\nfunction buildNodeProps(node: CodeNode): string {\n const parts: string[] = [\n `id: '${escCypher(node.id)}'`,\n `name: '${escCypher(node.name)}'`,\n `file_path: '${escCypher(node.filePath)}'`,\n ];\n if (node.startLine !== undefined) parts.push(`start_line: ${node.startLine}`);\n if (node.endLine !== undefined) parts.push(`end_line: ${node.endLine}`);\n if (node.exported !== undefined) parts.push(`exported: ${node.exported}`);\n if (node.content) parts.push(`content: '${escCypher(node.content.slice(0, 500))}'`);\n if (node.metadata) parts.push(`metadata: '${escCypher(JSON.stringify(node.metadata))}'`);\n return `{${parts.join(', ')}}`;\n}\n\nfunction escCypher(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\nexport interface RepoEntry {\n name: string;\n path: string;\n indexedAt: string;\n stats: { nodes: number; edges: number; files: number };\n}\n\nconst GLOBAL_DIR = path.join(os.homedir(), '.code-intel');\nconst REPOS_FILE = path.join(GLOBAL_DIR, 'repos.json');\n\nexport function loadRegistry(): RepoEntry[] {\n try {\n const data = fs.readFileSync(REPOS_FILE, 'utf-8');\n return JSON.parse(data);\n } catch {\n return [];\n }\n}\n\nexport function saveRegistry(entries: RepoEntry[]): void {\n fs.mkdirSync(GLOBAL_DIR, { recursive: true });\n fs.writeFileSync(REPOS_FILE, JSON.stringify(entries, null, 2));\n}\n\nexport function upsertRepo(entry: RepoEntry): void {\n const entries = loadRegistry();\n const idx = entries.findIndex((e) => e.path === entry.path);\n if (idx >= 0) {\n entries[idx] = entry;\n } else {\n entries.push(entry);\n }\n saveRegistry(entries);\n}\n\nexport function removeRepo(repoPath: string): void {\n const entries = loadRegistry().filter((e) => e.path !== repoPath);\n saveRegistry(entries);\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\n\nexport interface IndexMetadata {\n indexedAt: string;\n commitHash?: string;\n stats: {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n };\n}\n\nexport function saveMetadata(repoDir: string, metadata: IndexMetadata): void {\n const metaDir = path.join(repoDir, '.code-intel');\n fs.mkdirSync(metaDir, { recursive: true });\n fs.writeFileSync(path.join(metaDir, 'meta.json'), JSON.stringify(metadata, null, 2));\n}\n\nexport function loadMetadata(repoDir: string): IndexMetadata | null {\n try {\n const data = fs.readFileSync(path.join(repoDir, '.code-intel', 'meta.json'), 'utf-8');\n return JSON.parse(data);\n } catch {\n return null;\n }\n}\n\nexport function getDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'graph.db');\n}\n\nexport function getVectorDbPath(repoDir: string): string {\n return path.join(repoDir, '.code-intel', 'vector.db');\n}\n","export { DbManager } from './db-manager.js';\nexport { ALL_NODE_TABLES, NODE_TABLE_MAP, getCreateNodeTableDDL, getCreateEdgeTableDDL } from './schema.js';\nexport { writeNodeCSVs, writeEdgeCSV } from './csv-writer.js';\nexport type { EdgeCSVGroup } from './csv-writer.js';\nexport { loadGraphToDB } from './graph-loader.js';\nexport { loadRegistry, saveRegistry, upsertRepo, removeRepo } from './repo-registry.js';\nexport type { RepoEntry } from './repo-registry.js';\nexport { saveMetadata, loadMetadata, getDbPath, getVectorDbPath } from './metadata.js';\nexport type { IndexMetadata } from './metadata.js';\n","import { DbManager } from '../storage/db-manager.js';\nimport type { EmbeddedNode } from './embedder.js';\n\nconst EMBED_TABLE = 'embed_nodes';\nconst EMBED_DIM = 384; // all-MiniLM-L6-v2 output dimension\nconst INDEX_NAME = 'embed_vec_idx';\n\nexport class VectorIndex {\n private db: DbManager;\n\n constructor(db: DbManager) {\n this.db = db;\n }\n\n async init(): Promise<void> {\n // Install + load VECTOR extension\n await this.db.execute('INSTALL VECTOR');\n await this.db.execute('LOAD EXTENSION VECTOR');\n\n // Create node table for embeddings\n await this.db.execute(`\n CREATE NODE TABLE IF NOT EXISTS ${EMBED_TABLE} (\n id STRING,\n name STRING,\n kind STRING,\n file_path STRING,\n text STRING,\n embedding FLOAT[${EMBED_DIM}],\n PRIMARY KEY (id)\n )\n `);\n }\n\n async buildIndex(nodes: EmbeddedNode[]): Promise<void> {\n // Drop existing data\n await this.db.execute(`MATCH (n:${EMBED_TABLE}) DETACH DELETE n`).catch(() => {});\n\n // Insert embeddings\n for (const node of nodes) {\n const vecLiteral = `[${node.embedding.join(',')}]`;\n await this.db.execute(\n `CREATE (:${EMBED_TABLE} {\n id: '${esc(node.id)}',\n name: '${esc(node.name)}',\n kind: '${esc(node.kind)}',\n file_path: '${esc(node.filePath)}',\n text: '${esc(node.text)}',\n embedding: ${vecLiteral}\n })`,\n );\n }\n\n // Drop and recreate vector index (signature: tableName, indexName, propertyName)\n await this.db.execute(`CALL DROP_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}')`).catch(() => {});\n await this.db.execute(`CALL CREATE_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', 'embedding')`);\n // Do NOT close the DB - keep connection open for searches\n }\n\n async search(queryEmbedding: number[], topK = 10): Promise<VectorHit[]> {\n const vecLiteral = `[${queryEmbedding.join(',')}]`;\n const rows = await this.db.query(\n `CALL QUERY_VECTOR_INDEX('${EMBED_TABLE}', '${INDEX_NAME}', ${vecLiteral}, ${topK}) RETURN node.id, node.name, node.kind, node.file_path, distance`,\n );\n return rows.map((r) => ({\n nodeId: String(r['node.id']),\n name: String(r['node.name']),\n kind: String(r['node.kind']),\n filePath: String(r['node.file_path']),\n score: 1 - Number(r['distance']), // cosine distance → similarity\n }));\n }\n\n async isBuilt(): Promise<boolean> {\n try {\n const rows = await this.db.query(`MATCH (n:${EMBED_TABLE}) RETURN count(n) AS cnt`);\n return Number(rows[0]?.cnt ?? 0) > 0;\n } catch {\n return false;\n }\n }\n}\n\nexport interface VectorHit {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number; // 0..1 where 1 = most similar\n}\n\nfunction esc(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\").replace(/\\n/g, '\\\\n').replace(/\\r/g, '');\n}\n","/**\n * Persistent store for repo groups.\n * Each group is saved as ~/.code-intel/groups/<name>.json\n */\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\nimport type { RepoGroup, GroupMember } from './types.js';\n\nconst GROUPS_DIR = path.join(os.homedir(), '.code-intel', 'groups');\n\nfunction groupFile(name: string): string {\n return path.join(GROUPS_DIR, `${name}.json`);\n}\n\nexport function loadGroup(name: string): RepoGroup | null {\n try {\n return JSON.parse(fs.readFileSync(groupFile(name), 'utf-8')) as RepoGroup;\n } catch {\n return null;\n }\n}\n\nexport function saveGroup(group: RepoGroup): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(groupFile(group.name), JSON.stringify(group, null, 2) + '\\n');\n}\n\nexport function listGroups(): RepoGroup[] {\n const groups: RepoGroup[] = [];\n try {\n for (const file of fs.readdirSync(GROUPS_DIR)) {\n if (!file.endsWith('.json') || file.endsWith('.sync.json')) continue;\n try {\n const g = JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, file), 'utf-8'),\n ) as RepoGroup;\n groups.push(g);\n } catch { /* skip malformed */ }\n }\n } catch { /* dir doesn't exist yet */ }\n return groups;\n}\n\nexport function deleteGroup(name: string): void {\n try { fs.unlinkSync(groupFile(name)); } catch { /* ignore */ }\n // also remove sync artifact\n try { fs.unlinkSync(path.join(GROUPS_DIR, `${name}.sync.json`)); } catch { /* ignore */ }\n}\n\nexport function groupExists(name: string): boolean {\n return fs.existsSync(groupFile(name));\n}\n\n/** Add or update a member (by groupPath). Returns the updated group. */\nexport function addMember(groupName: string, member: GroupMember): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n // replace if same groupPath already exists\n const idx = group.members.findIndex((m) => m.groupPath === member.groupPath);\n if (idx >= 0) {\n group.members[idx] = member;\n } else {\n group.members.push(member);\n }\n saveGroup(group);\n return group;\n}\n\n/** Remove a member by groupPath. Returns the updated group. */\nexport function removeMember(groupName: string, groupPath: string): RepoGroup {\n const group = loadGroup(groupName);\n if (!group) throw new Error(`Group \"${groupName}\" not found.`);\n const before = group.members.length;\n group.members = group.members.filter((m) => m.groupPath !== groupPath);\n if (group.members.length === before) {\n throw new Error(`No member at path \"${groupPath}\" in group \"${groupName}\".`);\n }\n saveGroup(group);\n return group;\n}\n\n// ─── Sync result persistence ──────────────────────────────────────────────────\n\nimport type { GroupSyncResult } from './types.js';\n\nexport function saveSyncResult(result: GroupSyncResult): void {\n fs.mkdirSync(GROUPS_DIR, { recursive: true });\n fs.writeFileSync(\n path.join(GROUPS_DIR, `${result.groupName}.sync.json`),\n JSON.stringify(result, null, 2) + '\\n',\n );\n}\n\nexport function loadSyncResult(groupName: string): GroupSyncResult | null {\n try {\n return JSON.parse(\n fs.readFileSync(path.join(GROUPS_DIR, `${groupName}.sync.json`), 'utf-8'),\n ) as GroupSyncResult;\n } catch {\n return null;\n }\n}\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface EmbeddedNode {\n id: string;\n name: string;\n kind: string;\n filePath: string;\n text: string;\n embedding: number[];\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nlet pipelineInstance: ((text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>) | null = null;\n\nasync function getEmbedder() {\n if (!pipelineInstance) {\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n pipelineInstance = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as typeof pipelineInstance;\n }\n return pipelineInstance!;\n}\n\nexport async function embedNodes(\n graph: KnowledgeGraph,\n opts: { batchSize?: number; onProgress?: (done: number, total: number) => void } = {},\n): Promise<EmbeddedNode[]> {\n const { batchSize = 32, onProgress } = opts;\n\n // Collect candidates — skip cluster/directory/flow to save time\n const candidates: { id: string; name: string; kind: string; filePath: string; text: string }[] = [];\n for (const node of graph.allNodes()) {\n if (['cluster', 'directory', 'flow'].includes(node.kind)) continue;\n const text = buildText(node);\n candidates.push({ id: node.id, name: node.name, kind: node.kind, filePath: node.filePath, text });\n }\n\n const embedder = await getEmbedder();\n const results: EmbeddedNode[] = [];\n\n for (let i = 0; i < candidates.length; i += batchSize) {\n const batch = candidates.slice(i, i + batchSize);\n const texts = batch.map((c) => c.text);\n\n for (let j = 0; j < texts.length; j++) {\n const out = await embedder(texts[j], { pooling: 'mean', normalize: true });\n results.push({ ...batch[j], embedding: Array.from(out.data) });\n }\n\n onProgress?.(Math.min(i + batchSize, candidates.length), candidates.length);\n }\n\n return results;\n}\n\nfunction buildText(node: { name: string; kind: string; filePath: string; content?: string | null; metadata?: Record<string, unknown> | null }): string {\n const parts: string[] = [`${node.kind} ${node.name}`];\n const sig = node.metadata?.signature as string | undefined;\n if (sig) parts.push(sig);\n if (node.content) parts.push(node.content.slice(0, 256));\n parts.push(node.filePath);\n return parts.join(' ').slice(0, 512);\n}\n","/**\n * Logger with sensitive data masking.\n * Uses winston + winston-daily-rotate-file.\n *\n * - In production / CI (NODE_ENV=production): Console only (stdout, structured).\n * - Otherwise: Daily-rotating file logs under ./logs/ + Console.\n * - Log level controlled by LOG_LEVEL env var (default: \"info\").\n * - Sensitive keys and patterns are masked before output.\n *\n * @module shared/Logger\n */\nimport winston from 'winston';\nimport DailyRotateFile from 'winston-daily-rotate-file';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport os from 'node:os';\n\n// ─── Sensitive-data masking ───────────────────────────────────────────────────\n\nconst SENSITIVE_KEYS: string[] = [\n 'password', 'passwd', 'pass', 'pwd', 'secret', 'secretkey', 'secret_key', 'secretaccesskey', 'accesskeyid',\n 'credentials', 'auth', 'authentication', 'login',\n 'api_key', 'apikey', 'api', 'access_key', 'access_token', 'accesskey',\n 'auth_key', 'auth_token', 'authkey', 'token', 'jwt', 'bearer_token',\n 'refresh_token', 'session_token', 'session_key', 'oauth_token',\n 'connection_string', 'conn_string', 'db_uri', 'db_url', 'database_url',\n 'mongodb_uri', 'mysql_uri', 'postgres_uri', 'sql_uri',\n 'db_username', 'db_password', 'db_host', 'db_port', 'db_name',\n 'encryption_key', 'crypto_key', 'private_key', 'public_key', 'ssl_key',\n 'ssh_key', 'pgp_key', 'rsa_key', 'aes_key',\n 'email', 'phone', 'telephone', 'mobile', 'ssn', 'social_security',\n 'credit_card', 'cc_number', 'card_number', 'cvv', 'expiry_date',\n 'birth_date', 'dob', 'address', 'zip_code', 'postal_code',\n 'bank_account', 'iban', 'swift_code', 'routing_number',\n 'tax_id', 'vat_number', 'financial_id',\n 'certificate', 'client_cert', 'server_cert', 'ca_cert',\n 'aws_key', 'aws_secret', 'azure_key', 'gcp_key', 's3_key',\n 'cloudinary_key', 'stripe_key', 'paypal_key', 'twilio_key',\n 'app_secret', 'client_secret', 'consumer_secret', 'encryption_secret',\n 'master_key', 'root_password', 'admin_password',\n 'config_secret', 'env_secret', 'deploy_key', 'ci_key',\n 'session_id', 'cookie_secret', 'csrf_token', 'xsrf_token',\n 'license_key', 'product_key', 'serial_number', 'activation_code',\n];\n\nconst SENSITIVE_PATTERNS: RegExp[] = [\n /(?:password|passwd|secret|api_key|access_token|auth_token|token)\\s*[:=]\\s*([^\\s,]+)/gi,\n /\\b\\d{16}\\b/gi,\n /\\b\\d{3}-\\d{2}-\\d{4}\\b/gi,\n /\\b[A-Za-z0-9]{32}\\b/gi,\n /\\b[A-Za-z0-9_-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,6}\\b/gi,\n /\\b\\d{10}\\b/gi,\n /\\b[A-Za-z0-9]{64}\\b/gi,\n /(?:connection_string|db_uri|db_url|mongodb_uri)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:apikey|api_key|auth_key)\\s*[:=]\\s*([^\\s,]+)/gi,\n /(?:bearer\\s+)[a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+\\.[a-zA-Z0-9\\-_]+/gi,\n];\n\nconst SENSITIVE_KEYS_REGEX = new RegExp(`^(${SENSITIVE_KEYS.join('|')})$`, 'i');\n\nclass Logger {\n private static instance: winston.Logger | null = null;\n\n static maskSensitiveData(value: string): string {\n if (typeof value === 'string' && value.length > 5) {\n const firstChar = value.at(0)!;\n const lastChar = value.at(-1)!;\n return firstChar + '*'.repeat(value.length - 2) + lastChar;\n }\n return value;\n }\n\n static maskSensitive(message: string, args: unknown[] = []): { maskedMessage: string; maskedArgs: unknown[] } {\n const maskString = (input: string): string => {\n if (typeof input !== 'string') return input;\n return SENSITIVE_PATTERNS.reduce((str, pattern) => {\n return str.replace(pattern, (match: string, value: string) =>\n value ? match.replace(value, Logger.maskSensitiveData(value)) : match,\n );\n }, input);\n };\n\n const deepMask = (obj: unknown): unknown => {\n if (typeof obj === 'string') return maskString(obj);\n if (Array.isArray(obj)) return obj.map((item: unknown) => deepMask(item));\n if (typeof obj === 'object' && obj !== null) {\n return Object.entries(obj as Record<string, unknown>).reduce(\n (acc: Record<string, unknown>, [key, value]) => {\n if (value === undefined) return acc;\n const isSensitiveKey = SENSITIVE_KEYS_REGEX.test(key);\n acc[key] = isSensitiveKey && typeof value === 'string'\n ? Logger.maskSensitiveData(value)\n : deepMask(value);\n return acc;\n },\n {},\n );\n }\n return obj;\n };\n\n return {\n maskedMessage: maskString(message),\n maskedArgs: args.map((arg: unknown) => deepMask(arg)),\n };\n }\n\n /** Global log directory: ~/.code-intel/logs */\n static readonly LOG_DIR = path.join(os.homedir(), '.code-intel', 'logs');\n\n static getLogger(): winston.Logger {\n if (!Logger.instance) {\n const isProduction = process.env.NODE_ENV === 'production';\n const logLevel = process.env.LOG_LEVEL ?? 'info';\n const transports: winston.transport[] = [];\n\n // Always add console transport\n transports.push(new winston.transports.Console());\n\n if (!isProduction) {\n // Dev + global installs: rotate logs into ~/.code-intel/logs/\n try {\n if (!fs.existsSync(Logger.LOG_DIR)) {\n fs.mkdirSync(Logger.LOG_DIR, { recursive: true });\n }\n transports.push(\n new DailyRotateFile({\n filename: path.join(Logger.LOG_DIR, '%DATE%-code-intel.log'),\n datePattern: 'YYYY-MM-DD',\n maxSize: '20m',\n maxFiles: '14d',\n }),\n );\n } catch {\n // If we can't write to the log dir (e.g. read-only FS), continue console-only\n }\n }\n\n Logger.instance = winston.createLogger({\n level: logLevel,\n format: winston.format.combine(\n winston.format.timestamp(),\n winston.format.printf(({ timestamp, level, message, ...meta }) => {\n const args = (meta[Symbol.for('splat') as unknown as string] as unknown[]) || [];\n const { maskedMessage, maskedArgs } = Logger.maskSensitive(message as string, args);\n const formattedArgs = maskedArgs.map((arg: unknown) =>\n typeof arg === 'object' ? JSON.stringify(arg) : String(arg),\n );\n const suffix = formattedArgs.length ? ' ' + formattedArgs.join(' ') : '';\n return `${timestamp} [${level.toUpperCase()}]: ${maskedMessage}${suffix}`;\n }),\n ),\n transports,\n });\n }\n return Logger.instance;\n }\n\n static info(message: string, ...args: unknown[]): void {\n Logger.getLogger().info(message, ...args);\n }\n\n static warn(message: string, ...args: unknown[]): void {\n Logger.getLogger().warn(message, ...args);\n }\n\n static error(message: string, ...args: unknown[]): void {\n Logger.getLogger().error(message, ...args);\n }\n\n static debug(message: string, ...args: unknown[]): void {\n Logger.getLogger().debug(message, ...args);\n }\n}\n\nexport default Logger;\n\n// Eagerly initialize so the log directory and file transport are created on import,\n// even if no log messages are emitted during a short run.\nLogger.getLogger();\n","import type { CodeNode, CodeEdge, EdgeKind } from '../shared/index.js';\n\nexport interface KnowledgeGraph {\n addNode(node: CodeNode): void;\n addEdge(edge: CodeEdge): void;\n getNode(id: string): CodeNode | undefined;\n getEdge(id: string): CodeEdge | undefined;\n findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge>;\n findEdgesFrom(sourceId: string): Iterable<CodeEdge>;\n findEdgesTo(targetId: string): Iterable<CodeEdge>;\n removeNodeCascade(id: string): void;\n removeEdge(id: string): void;\n allNodes(): Iterable<CodeNode>;\n allEdges(): Iterable<CodeEdge>;\n readonly size: { nodes: number; edges: number };\n clear(): void;\n}\n\nexport function createKnowledgeGraph(): KnowledgeGraph {\n const nodes = new Map<string, CodeNode>();\n const edges = new Map<string, CodeEdge>();\n const edgesByKind = new Map<EdgeKind, Set<string>>();\n const edgesFromNode = new Map<string, Set<string>>();\n const edgesToNode = new Map<string, Set<string>>();\n\n function indexEdge(edge: CodeEdge): void {\n let kindSet = edgesByKind.get(edge.kind);\n if (!kindSet) {\n kindSet = new Set();\n edgesByKind.set(edge.kind, kindSet);\n }\n kindSet.add(edge.id);\n\n let fromSet = edgesFromNode.get(edge.source);\n if (!fromSet) {\n fromSet = new Set();\n edgesFromNode.set(edge.source, fromSet);\n }\n fromSet.add(edge.id);\n\n let toSet = edgesToNode.get(edge.target);\n if (!toSet) {\n toSet = new Set();\n edgesToNode.set(edge.target, toSet);\n }\n toSet.add(edge.id);\n }\n\n function unindexEdge(edge: CodeEdge): void {\n edgesByKind.get(edge.kind)?.delete(edge.id);\n edgesFromNode.get(edge.source)?.delete(edge.id);\n edgesToNode.get(edge.target)?.delete(edge.id);\n }\n\n return {\n addNode(node: CodeNode): void {\n nodes.set(node.id, node);\n },\n\n addEdge(edge: CodeEdge): void {\n edges.set(edge.id, edge);\n indexEdge(edge);\n },\n\n getNode(id: string): CodeNode | undefined {\n return nodes.get(id);\n },\n\n getEdge(id: string): CodeEdge | undefined {\n return edges.get(id);\n },\n\n *findEdgesByKind(kind: EdgeKind): Iterable<CodeEdge> {\n const ids = edgesByKind.get(kind);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesFrom(sourceId: string): Iterable<CodeEdge> {\n const ids = edgesFromNode.get(sourceId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n *findEdgesTo(targetId: string): Iterable<CodeEdge> {\n const ids = edgesToNode.get(targetId);\n if (!ids) return;\n for (const id of ids) {\n const edge = edges.get(id);\n if (edge) yield edge;\n }\n },\n\n removeNodeCascade(id: string): void {\n const fromEdges = edgesFromNode.get(id);\n if (fromEdges) {\n for (const edgeId of [...fromEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n const toEdges = edgesToNode.get(id);\n if (toEdges) {\n for (const edgeId of [...toEdges]) {\n const edge = edges.get(edgeId);\n if (edge) {\n unindexEdge(edge);\n edges.delete(edgeId);\n }\n }\n }\n edgesFromNode.delete(id);\n edgesToNode.delete(id);\n nodes.delete(id);\n },\n\n removeEdge(id: string): void {\n const edge = edges.get(id);\n if (edge) {\n unindexEdge(edge);\n edges.delete(id);\n }\n },\n\n *allNodes(): Iterable<CodeNode> {\n yield* nodes.values();\n },\n\n *allEdges(): Iterable<CodeEdge> {\n yield* edges.values();\n },\n\n get size() {\n return { nodes: nodes.size, edges: edges.size };\n },\n\n clear(): void {\n nodes.clear();\n edges.clear();\n edgesByKind.clear();\n edgesFromNode.clear();\n edgesToNode.clear();\n },\n };\n}\n","import type { Phase } from './types.js';\n\nexport interface ValidationError {\n type: 'duplicate' | 'missing-dep' | 'cycle';\n message: string;\n}\n\nexport function validateDAG(phases: Phase[]): ValidationError[] {\n const errors: ValidationError[] = [];\n const names = new Set<string>();\n\n // Check duplicates\n for (const phase of phases) {\n if (names.has(phase.name)) {\n errors.push({ type: 'duplicate', message: `Duplicate phase name: ${phase.name}` });\n }\n names.add(phase.name);\n }\n\n // Check missing deps\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n if (!names.has(dep)) {\n errors.push({\n type: 'missing-dep',\n message: `Phase \"${phase.name}\" depends on missing phase \"${dep}\"`,\n });\n }\n }\n }\n\n // Check cycles using DFS\n const visiting = new Set<string>();\n const visited = new Set<string>();\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n\n function dfs(name: string, path: string[]): boolean {\n if (visiting.has(name)) {\n const cycleStart = path.indexOf(name);\n const cycle = path.slice(cycleStart).concat(name);\n errors.push({ type: 'cycle', message: `Cycle detected: ${cycle.join(' → ')}` });\n return true;\n }\n if (visited.has(name)) return false;\n\n visiting.add(name);\n path.push(name);\n\n const phase = phaseMap.get(name);\n if (phase) {\n for (const dep of phase.dependencies) {\n if (dfs(dep, path)) return true;\n }\n }\n\n visiting.delete(name);\n visited.add(name);\n path.pop();\n return false;\n }\n\n for (const phase of phases) {\n if (!visited.has(phase.name)) {\n dfs(phase.name, []);\n }\n }\n\n return errors;\n}\n\nexport function topologicalSort(phases: Phase[]): Phase[] {\n const phaseMap = new Map(phases.map((p) => [p.name, p]));\n const inDegree = new Map<string, number>();\n const adjList = new Map<string, string[]>();\n\n for (const phase of phases) {\n inDegree.set(phase.name, 0);\n adjList.set(phase.name, []);\n }\n\n for (const phase of phases) {\n for (const dep of phase.dependencies) {\n adjList.get(dep)?.push(phase.name);\n inDegree.set(phase.name, (inDegree.get(phase.name) ?? 0) + 1);\n }\n }\n\n const queue: string[] = [];\n for (const [name, degree] of inDegree) {\n if (degree === 0) queue.push(name);\n }\n\n const sorted: Phase[] = [];\n while (queue.length > 0) {\n const current = queue.shift()!;\n sorted.push(phaseMap.get(current)!);\n for (const neighbor of adjList.get(current) ?? []) {\n const newDegree = (inDegree.get(neighbor) ?? 1) - 1;\n inDegree.set(neighbor, newDegree);\n if (newDegree === 0) queue.push(neighbor);\n }\n }\n\n return sorted;\n}\n","import type { Phase, PhaseResult, PipelineContext } from './types.js';\nimport { validateDAG, topologicalSort } from './dag-validator.js';\n\nexport interface PipelineRunResult {\n success: boolean;\n results: Map<string, PhaseResult>;\n totalDuration: number;\n}\n\nexport async function runPipeline(\n phases: Phase[],\n context: PipelineContext,\n): Promise<PipelineRunResult> {\n const errors = validateDAG(phases);\n if (errors.length > 0) {\n throw new Error(`Pipeline validation failed:\\n${errors.map((e) => e.message).join('\\n')}`);\n }\n\n const sorted = topologicalSort(phases);\n const results = new Map<string, PhaseResult>();\n const startTime = Date.now();\n let success = true;\n\n for (const phase of sorted) {\n context.onProgress?.(phase.name, 'running');\n const phaseStart = Date.now();\n\n try {\n const depResults = new Map<string, PhaseResult>();\n for (const dep of phase.dependencies) {\n const depResult = results.get(dep);\n if (depResult) depResults.set(dep, depResult);\n }\n\n const result = await phase.execute(context, depResults);\n results.set(phase.name, result);\n context.onProgress?.(phase.name, result.status);\n\n if (result.status === 'failed') {\n success = false;\n break;\n }\n } catch (err) {\n const result: PhaseResult = {\n status: 'failed',\n duration: Date.now() - phaseStart,\n message: err instanceof Error ? err.message : String(err),\n };\n results.set(phase.name, result);\n context.onProgress?.(phase.name, 'failed');\n success = false;\n break;\n }\n }\n\n return {\n success,\n results,\n totalDuration: Date.now() - startTime,\n };\n}\n","import { Language } from './languages.js';\n\nconst EXTENSION_MAP: Record<string, Language> = {\n '.ts': Language.TypeScript,\n '.tsx': Language.TypeScript,\n '.mts': Language.TypeScript,\n '.cts': Language.TypeScript,\n '.js': Language.JavaScript,\n '.jsx': Language.JavaScript,\n '.mjs': Language.JavaScript,\n '.cjs': Language.JavaScript,\n '.py': Language.Python,\n '.pyi': Language.Python,\n '.java': Language.Java,\n '.go': Language.Go,\n '.c': Language.C,\n '.h': Language.C,\n '.cpp': Language.Cpp,\n '.cxx': Language.Cpp,\n '.cc': Language.Cpp,\n '.hpp': Language.Cpp,\n '.hxx': Language.Cpp,\n '.cs': Language.CSharp,\n '.rs': Language.Rust,\n '.php': Language.PHP,\n '.kt': Language.Kotlin,\n '.kts': Language.Kotlin,\n '.rb': Language.Ruby,\n '.swift': Language.Swift,\n '.dart': Language.Dart,\n};\n\nexport function detectLanguage(filePath: string): Language | null {\n const ext = filePath.slice(filePath.lastIndexOf('.'));\n return EXTENSION_MAP[ext] ?? null;\n}\n\nexport function getSupportedExtensions(): string[] {\n return Object.keys(EXTENSION_MAP);\n}\n","import { NodeKind } from '../shared/index.js';\n\nexport function generateNodeId(kind: NodeKind, filePath: string, qualifiedName: string): string {\n return `${kind}:${filePath}:${qualifiedName}`;\n}\n\nexport function generateEdgeId(source: string, target: string, kind: string): string {\n return `${kind}:${source}->${target}`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, getSupportedExtensions } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId } from '../../graph/id-generator.js';\n\nconst IGNORED_DIRS = new Set([\n 'node_modules', '.git', '.svn', '.hg', 'dist', 'dist-tests', 'build', 'out',\n '__pycache__', '.tox', '.pytest_cache', '.mypy_cache',\n 'vendor', 'target', '.code-intel', 'coverage', '.next',\n '.turbo', '.cache', 'tmp', 'temp', '.parcel-cache', '.venv', 'venv',\n '.env', 'env', '__snapshots__', '.nyc_output', 'storybook-static',\n]);\n\n/**\n * Load extra ignore patterns from .codeintelignore in the workspace root.\n * Format: one glob/dir name per line, # for comments.\n */\nfunction loadIgnorePatterns(workspaceRoot: string): Set<string> {\n try {\n const raw = fs.readFileSync(path.join(workspaceRoot, '.codeintelignore'), 'utf-8');\n const extras = new Set<string>();\n for (const line of raw.split('\\n')) {\n const trimmed = line.trim();\n if (trimmed && !trimmed.startsWith('#')) extras.add(trimmed);\n }\n return extras;\n } catch {\n return new Set();\n }\n}\n\nconst IGNORED_FILE_SUFFIXES = ['.d.ts', '.js.map', '.d.ts.map', '.min.js', '.min.css'];\nconst MAX_FILE_SIZE_BYTES = 512 * 1024; // skip files > 512 KB\n\nexport const scanPhase: Phase = {\n name: 'scan',\n dependencies: [],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const extensions = new Set(getSupportedExtensions());\n const filePaths: string[] = [];\n const extraIgnore = loadIgnorePatterns(context.workspaceRoot);\n\n function walk(dir: string): void {\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n\n for (const entry of entries) {\n // Skip hidden directories and ignored directories\n if (entry.isDirectory()) {\n if (entry.name.startsWith('.')) continue;\n if (IGNORED_DIRS.has(entry.name)) continue;\n if (extraIgnore.has(entry.name)) continue;\n walk(path.join(dir, entry.name));\n } else if (entry.isFile()) {\n const name = entry.name;\n // Skip known non-source suffixes\n if (IGNORED_FILE_SUFFIXES.some((s) => name.endsWith(s))) continue;\n const ext = path.extname(name);\n if (!extensions.has(ext)) continue;\n const fullPath = path.join(dir, name);\n // Skip very large files (generated code, minified assets)\n try {\n const stat = fs.statSync(fullPath);\n if (stat.size > MAX_FILE_SIZE_BYTES) continue;\n } catch {\n continue;\n }\n filePaths.push(fullPath);\n }\n }\n }\n\n walk(context.workspaceRoot);\n context.filePaths.push(...filePaths);\n context.onPhaseProgress?.('scan', filePaths.length, filePaths.length);\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${filePaths.length} source files`,\n };\n },\n};\n\nexport const structurePhase: Phase = {\n name: 'structure',\n dependencies: ['scan'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const dirs = new Set<string>();\n\n let structDone = 0;\n for (const filePath of context.filePaths) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const lang = detectLanguage(filePath);\n\n context.graph.addNode({\n id: generateNodeId('file', relativePath, relativePath),\n kind: 'file',\n name: path.basename(filePath),\n filePath: relativePath,\n metadata: lang ? { language: lang } : undefined,\n });\n\n // Collect directories\n let dir = path.dirname(relativePath);\n while (dir && dir !== '.' && dir !== '') {\n if (dirs.has(dir)) break;\n dirs.add(dir);\n dir = path.dirname(dir);\n }\n structDone++;\n context.onPhaseProgress?.('structure', structDone, context.filePaths.length);\n }\n\n for (const dir of dirs) {\n context.graph.addNode({\n id: generateNodeId('directory', dir, dir),\n kind: 'directory',\n name: path.basename(dir),\n filePath: dir,\n });\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${context.filePaths.length} file nodes, ${dirs.size} directory nodes`,\n };\n },\n};\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { detectLanguage, Language } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\nimport type { CodeNode, CodeEdge } from '../../shared/index.js';\nimport Logger from '../../shared/logger.js';\n\nexport const parsePhase: Phase = {\n name: 'parse',\n dependencies: ['structure'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n let symbolCount = 0;\n\n // Initialise shared caches that resolve phase will reuse\n if (!context.fileCache) context.fileCache = new Map();\n if (!context.fileFunctionIndex) context.fileFunctionIndex = new Map();\n\n // Batch-read all files in parallel (Node.js async I/O pool)\n const CONCURRENCY = 64;\n const filePaths = context.filePaths;\n\n // Read files in parallel batches\n let readDone = 0;\n for (let i = 0; i < filePaths.length; i += CONCURRENCY) {\n const batch = filePaths.slice(i, i + CONCURRENCY);\n await Promise.all(batch.map(async (filePath) => {\n try {\n const source = await fs.promises.readFile(filePath, 'utf-8');\n context.fileCache!.set(filePath, source);\n } catch {\n // Unreadable file — skip silently\n }\n }));\n readDone += batch.length;\n context.onPhaseProgress?.('parse:read', readDone, filePaths.length);\n }\n\n // Parse symbols from cached content\n let parseDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) {\n if (context.verbose) {\n const relativePath = path.relative(context.workspaceRoot, filePath);\n Logger.info(` [parse] skipped (no parser): ${relativePath}`);\n }\n continue;\n }\n\n const source = context.fileCache.get(filePath);\n if (!source) continue;\n\n const relativePath = path.relative(context.workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Store a snippet on the file node for full-text search\n const fileNode = context.graph.getNode(fileNodeId);\n if (fileNode) {\n fileNode.content = source.slice(0, 2000);\n }\n\n const nodes: CodeNode[] = [];\n const edges: CodeEdge[] = [];\n const seen = new Set<string>();\n\n const lines = source.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmed = line.trim();\n\n // Skip comments\n if (\n trimmed.startsWith('//') ||\n trimmed.startsWith('#') ||\n trimmed.startsWith('*') ||\n trimmed.startsWith('/*')\n ) continue;\n\n const extracted = extractSymbol(trimmed, lang, i + 1, relativePath);\n if (!extracted) continue;\n\n const dedupeKey = extracted.name + ':' + extracted.kind;\n if (seen.has(dedupeKey)) continue;\n seen.add(dedupeKey);\n\n const nodeId = generateNodeId(extracted.kind, relativePath, extracted.name);\n\n // Estimate endLine by scanning forward for the closing brace / dedent (max 200 lines)\n const endLine = estimateEndLine(lines, i, lang);\n\n nodes.push({\n id: nodeId,\n kind: extracted.kind,\n name: extracted.name,\n filePath: relativePath,\n startLine: i + 1,\n endLine,\n exported: extracted.exported,\n content: extractBlock(lines, i, 20),\n });\n edges.push({\n id: generateEdgeId(fileNodeId, nodeId, 'contains'),\n source: fileNodeId,\n target: nodeId,\n kind: 'contains',\n weight: 1.0,\n });\n\n // has_member edge for methods inside classes\n if (extracted.ownerName) {\n const ownerId = generateNodeId('class', relativePath, extracted.ownerName);\n if (context.graph.getNode(ownerId) || nodes.some((n) => n.id === ownerId)) {\n edges.push({\n id: generateEdgeId(ownerId, nodeId, 'has_member'),\n source: ownerId,\n target: nodeId,\n kind: 'has_member',\n weight: 1.0,\n });\n }\n }\n\n symbolCount++;\n }\n\n for (const n of nodes) context.graph.addNode(n);\n for (const e of edges) context.graph.addEdge(e);\n\n // Build per-file sorted function/method index for fast enclosing-function lookup in resolve phase\n const funcs = nodes\n .filter((n) => n.kind === 'function' || n.kind === 'method')\n .map((n) => ({ id: n.id, startLine: n.startLine ?? 0, endLine: n.endLine }))\n .sort((a, b) => a.startLine - b.startLine);\n if (funcs.length > 0) {\n context.fileFunctionIndex!.set(relativePath, funcs);\n }\n parseDone++;\n context.onPhaseProgress?.('parse', parseDone, filePaths.length);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Extracted ${symbolCount} symbols from ${filePaths.length} files`,\n };\n },\n};\n\n// ─── Symbol extraction ────────────────────────────────────────────────────────\n\ninterface ExtractedSymbol {\n kind: CodeNode['kind'];\n name: string;\n exported: boolean;\n ownerName?: string;\n}\n\nfunction extractSymbol(\n line: string,\n lang: Language,\n _lineNum: number,\n _filePath: string,\n): ExtractedSymbol | null {\n // --- TypeScript/JavaScript ---\n if (lang === Language.TypeScript || lang === Language.JavaScript) {\n const func = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:async\\s+)?function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('export') };\n\n const arrowFunc = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?\\(/);\n if (arrowFunc) return { kind: 'function', name: arrowFunc[1], exported: line.includes('export') };\n\n const arrowFunc2 = line.match(/^(?:export\\s+)?(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[a-zA-Z_]\\w*)\\s*=>/);\n if (arrowFunc2) return { kind: 'function', name: arrowFunc2[1], exported: line.includes('export') };\n\n const cls = line.match(/^(?:export\\s+)?(?:default\\s+)?(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('export') };\n\n const iface = line.match(/^(?:export\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('export') };\n\n const enumM = line.match(/^(?:export\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('export') };\n\n const typeAlias = line.match(/^(?:export\\s+)?type\\s+(\\w+)\\s*[=<]/);\n if (typeAlias) return { kind: 'type_alias', name: typeAlias[1], exported: line.includes('export') };\n\n const constVar = line.match(/^(?:export\\s+)?const\\s+(\\w+)\\s*(?::\\s*\\w[^=]*)?\\s*=/);\n if (constVar && /^[A-Z_]+$/.test(constVar[1])) {\n return { kind: 'constant', name: constVar[1], exported: line.includes('export') };\n }\n }\n\n // --- Python ---\n if (lang === Language.Python) {\n const func = line.match(/^(?:async\\s+)?def\\s+(\\w+)/);\n if (func) return { kind: func[1].startsWith('__') ? 'method' : 'function', name: func[1], exported: !func[1].startsWith('_') };\n\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n }\n\n // --- Java ---\n if (lang === Language.Java) {\n const cls = line.match(/(?:public|private|protected)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.includes('public') };\n\n const method = line.match(/(?:public|private|protected)\\s+(?:static\\s+)?(?:[\\w<>\\[\\]]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n }\n\n // --- Go ---\n if (lang === Language.Go) {\n const func = line.match(/^func\\s+(\\w+)\\s*\\(/);\n if (func) return { kind: 'function', name: func[1], exported: func[1][0] === func[1][0].toUpperCase() };\n\n const method = line.match(/^func\\s+\\([^)]+\\)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: method[1][0] === method[1][0].toUpperCase() };\n\n const structM = line.match(/^type\\s+(\\w+)\\s+struct\\b/);\n if (structM) return { kind: 'struct', name: structM[1], exported: structM[1][0] === structM[1][0].toUpperCase() };\n\n const ifaceM = line.match(/^type\\s+(\\w+)\\s+interface\\b/);\n if (ifaceM) return { kind: 'interface', name: ifaceM[1], exported: ifaceM[1][0] === ifaceM[1][0].toUpperCase() };\n }\n\n // --- Rust ---\n if (lang === Language.Rust) {\n const func = line.match(/^(?:pub\\s+)?(?:async\\s+)?fn\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.startsWith('pub') };\n\n const structM = line.match(/^(?:pub\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.startsWith('pub') };\n\n const enumM = line.match(/^(?:pub\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: line.startsWith('pub') };\n\n const traitM = line.match(/^(?:pub\\s+)?trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: line.startsWith('pub') };\n\n const implM = line.match(/^impl(?:<[^>]*>)?\\s+(\\w+)/);\n if (implM) return { kind: 'class', name: implM[1], exported: false };\n }\n\n // --- C/C++ ---\n if (lang === Language.C || lang === Language.Cpp) {\n const cls = line.match(/^(?:class|struct)\\s+(\\w+)/);\n if (cls) return { kind: lang === Language.Cpp ? 'class' : 'struct', name: cls[1], exported: true };\n\n const nsM = line.match(/^namespace\\s+(\\w+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n\n const func = line.match(/^(?:[\\w:*&<>\\[\\]]+\\s+)+(\\w+)\\s*\\([^;]*$/);\n if (func && !['if', 'for', 'while', 'switch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: true };\n }\n }\n\n // --- C# ---\n if (lang === Language.CSharp) {\n const cls = line.match(/(?:public|internal|private)?\\s*(?:static\\s+)?(?:abstract\\s+)?(?:partial\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: line.includes('public') };\n\n const iface = line.match(/(?:public\\s+)?interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: line.includes('public') };\n\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: line.includes('public') };\n\n const method = line.match(/(?:public|private|protected|internal)\\s+(?:static\\s+)?(?:async\\s+)?(?:[\\w<>\\[\\]?]+)\\s+(\\w+)\\s*\\(/);\n if (method) return { kind: 'method', name: method[1], exported: line.includes('public') };\n\n const nsM = line.match(/namespace\\s+([\\w.]+)/);\n if (nsM) return { kind: 'namespace', name: nsM[1], exported: true };\n }\n\n // --- PHP ---\n if (lang === Language.PHP) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n\n const func = line.match(/(?:public|private|protected|static\\s+)*function\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: line.includes('public') || !line.includes('private') };\n\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: true };\n\n const traitM = line.match(/trait\\s+(\\w+)/);\n if (traitM) return { kind: 'trait', name: traitM[1], exported: true };\n }\n\n // --- Kotlin ---\n if (lang === Language.Kotlin) {\n const cls = line.match(/(?:data\\s+|sealed\\s+|abstract\\s+|open\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n\n const iface = line.match(/interface\\s+(\\w+)/);\n if (iface) return { kind: 'interface', name: iface[1], exported: !line.includes('private') };\n\n const func = line.match(/(?:suspend\\s+)?fun\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n\n const obj = line.match(/object\\s+(\\w+)/);\n if (obj) return { kind: 'class', name: obj[1], exported: !line.includes('private') };\n }\n\n // --- Ruby ---\n if (lang === Language.Ruby) {\n const cls = line.match(/^class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: true };\n\n const modM = line.match(/^module\\s+(\\w+)/);\n if (modM) return { kind: 'module', name: modM[1], exported: true };\n\n const method = line.match(/^(?:def\\s+(?:self\\.)?(\\w+))/);\n if (method) return { kind: 'method', name: method[1], exported: true };\n }\n\n // --- Swift ---\n if (lang === Language.Swift) {\n const cls = line.match(/(?:public\\s+|open\\s+)?(?:final\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !line.includes('private') };\n\n const structM = line.match(/(?:public\\s+)?struct\\s+(\\w+)/);\n if (structM) return { kind: 'struct', name: structM[1], exported: !line.includes('private') };\n\n const proto = line.match(/(?:public\\s+)?protocol\\s+(\\w+)/);\n if (proto) return { kind: 'interface', name: proto[1], exported: !line.includes('private') };\n\n const enumM = line.match(/(?:public\\s+)?enum\\s+(\\w+)/);\n if (enumM) return { kind: 'enum', name: enumM[1], exported: !line.includes('private') };\n\n const func = line.match(/(?:public\\s+|private\\s+|internal\\s+)?(?:static\\s+)?func\\s+(\\w+)/);\n if (func) return { kind: 'function', name: func[1], exported: !line.includes('private') };\n }\n\n // --- Dart ---\n if (lang === Language.Dart) {\n const cls = line.match(/(?:abstract\\s+)?class\\s+(\\w+)/);\n if (cls) return { kind: 'class', name: cls[1], exported: !cls[1].startsWith('_') };\n\n const func = line.match(/^(?:\\w+\\s+)?(\\w+)\\s*\\(/);\n if (func && !['if', 'for', 'while', 'switch', 'catch', 'return'].includes(func[1])) {\n return { kind: 'function', name: func[1], exported: !func[1].startsWith('_') };\n }\n }\n\n return null;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Estimate the end line of a block by counting braces/indents (max 200-line scan).\n * Returns undefined when a reliable estimate is not possible.\n */\nfunction estimateEndLine(lines: string[], startIdx: number, lang: Language): number | undefined {\n const MAX_SCAN = 200;\n const end = Math.min(startIdx + MAX_SCAN, lines.length);\n\n // Brace-delimited languages\n if (\n lang !== Language.Python &&\n lang !== Language.Ruby\n ) {\n let depth = 0;\n let foundOpen = false;\n for (let i = startIdx; i < end; i++) {\n for (const ch of lines[i]) {\n if (ch === '{') { depth++; foundOpen = true; }\n else if (ch === '}') {\n depth--;\n if (foundOpen && depth === 0) return i + 1;\n }\n }\n }\n return undefined;\n }\n\n // Indent-based (Python, Ruby) — look for next same-level line\n const startIndent = (lines[startIdx].match(/^(\\s*)/) ?? ['', ''])[1].length;\n for (let i = startIdx + 1; i < end; i++) {\n const l = lines[i];\n if (l.trim() === '') continue;\n const indent = (l.match(/^(\\s*)/) ?? ['', ''])[1].length;\n if (indent <= startIndent && l.trim() !== '') return i;\n }\n return undefined;\n}\n\nfunction extractBlock(lines: string[], startIdx: number, maxLines: number): string {\n const end = Math.min(startIdx + maxLines, lines.length);\n return lines.slice(startIdx, end).join('\\n');\n}\n","import path from 'node:path';\nimport { detectLanguage } from '../../shared/index.js';\nimport type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\ninterface ParsedImport {\n rawPath: string;\n localNames: string[];\n isDefault: boolean;\n line: number;\n}\n\ninterface ParsedCall {\n name: string;\n receiverText?: string;\n isNew: boolean;\n line: number;\n}\n\ninterface ParsedHeritage {\n className: string;\n extendsNames: string[];\n implementsNames: string[];\n}\n\n// ─── Keywords to skip when extracting calls ───────────────────────────────────\nconst CALL_KEYWORDS = new Set([\n 'if', 'for', 'while', 'switch', 'catch', 'return', 'throw',\n 'typeof', 'instanceof', 'delete', 'void', 'new', 'import', 'export',\n 'from', 'const', 'let', 'var', 'function', 'class', 'interface',\n 'type', 'enum', 'extends', 'implements',\n]);\n\nexport const resolvePhase: Phase = {\n name: 'resolve',\n dependencies: ['parse'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph, workspaceRoot, filePaths } = context;\n\n // Reuse content cache populated by parse phase — eliminates all double I/O\n const fileCache = context.fileCache ?? new Map<string, string>();\n // Fast sorted function index built by parse phase — O(log n) enclosing-function lookup\n const fileFunctionIndex = context.fileFunctionIndex ?? new Map<\n string,\n { id: string; startLine: number; endLine: number | undefined }[]\n >();\n\n let importEdges = 0;\n let callEdges = 0;\n let heritageEdges = 0;\n\n // ── Build file index for import resolution ────────────────────────────────\n const fileIndex = new Map<string, string>();\n for (const fp of filePaths) {\n const rel = path.relative(workspaceRoot, fp);\n fileIndex.set(rel, fp);\n const noExt = rel.replace(/\\.\\w+$/, '');\n if (!fileIndex.has(noExt)) fileIndex.set(noExt, fp);\n const base = path.basename(rel, path.extname(rel));\n if (!fileIndex.has(base)) fileIndex.set(base, fp);\n }\n\n // ── Build symbol index: name → nodeId ─────────────────────────────────────\n const symbolIndex = new Map<string, string>();\n const fileSymbolIndex = new Map<string, Map<string, string>>();\n for (const node of graph.allNodes()) {\n if ([\n 'function', 'class', 'interface', 'method', 'enum',\n 'type_alias', 'variable', 'constant', 'struct', 'trait',\n ].includes(node.kind)) {\n symbolIndex.set(node.name, node.id);\n let fileMap = fileSymbolIndex.get(node.filePath);\n if (!fileMap) { fileMap = new Map(); fileSymbolIndex.set(node.filePath, fileMap); }\n fileMap.set(node.name, node.id);\n }\n }\n\n // ── Process each file ─────────────────────────────────────────────────────\n let fileDone = 0;\n for (const filePath of filePaths) {\n const lang = detectLanguage(filePath);\n if (!lang) continue;\n\n const relativePath = path.relative(workspaceRoot, filePath);\n const fileNodeId = generateNodeId('file', relativePath, relativePath);\n\n // Use cached content — zero additional disk I/O\n const source = fileCache.get(filePath);\n if (!source) continue;\n\n const lines = source.split('\\n');\n const imports = extractImports(lines, lang === 'python');\n const calls = extractCalls(lines);\n const heritages = extractHeritage(lines);\n\n // ── Imports → IMPORTS edges ───────────────────────────────────────────\n for (const imp of imports) {\n const cleaned = imp.rawPath.replace(/['\"]/g, '');\n let resolvedRelPath: string | null = null;\n\n if (cleaned.startsWith('.')) {\n // Relative import — strip .js/.jsx since TS imports use .js but files are .ts\n const cleanedNoJs = cleaned.replace(/\\.(js|jsx)$/, '');\n const fromDir = path.dirname(relativePath);\n for (const ext of ['', '.ts', '.tsx', '.js', '.jsx', '.py', '.java', '.go', '/index.ts', '/index.js']) {\n const candidate = path.join(fromDir, cleanedNoJs + ext);\n const normalized = path.normalize(candidate);\n if (fileIndex.has(normalized)) {\n const absPath = fileIndex.get(normalized)!;\n resolvedRelPath = path.relative(workspaceRoot, absPath);\n break;\n }\n }\n } else {\n // Package import — try to find in file index\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go']) {\n if (fileIndex.has(cleaned + ext)) { resolvedRelPath = cleaned + ext; break; }\n }\n if (!resolvedRelPath) {\n const asPath = cleaned.replace(/\\./g, '/');\n for (const ext of ['', '.ts', '.js', '.py', '.java', '.go', '/index.ts', '/__init__.py']) {\n if (fileIndex.has(asPath + ext)) { resolvedRelPath = asPath + ext; break; }\n }\n }\n }\n\n if (resolvedRelPath) {\n const targetFileId = generateNodeId('file', resolvedRelPath, resolvedRelPath);\n if (graph.getNode(targetFileId)) {\n const edgeId = generateEdgeId(fileNodeId, targetFileId, 'imports');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: fileNodeId,\n target: targetFileId,\n kind: 'imports',\n weight: 0.95,\n label: cleaned,\n });\n importEdges++;\n }\n }\n }\n }\n\n // ── Calls → CALLS edges ───────────────────────────────────────────────\n const localSymbols = fileSymbolIndex.get(relativePath);\n const funcList = fileFunctionIndex.get(relativePath); // sorted by startLine\n\n for (const call of calls) {\n // Tier 1: same-file symbol (high confidence)\n let targetId = localSymbols?.get(call.name);\n let confidence = 0.95;\n\n if (!targetId) {\n // Tier 2: global symbol (lower confidence)\n targetId = symbolIndex.get(call.name);\n confidence = 0.5;\n }\n\n if (targetId) {\n // Use fast sorted-list lookup instead of iterating all graph nodes\n const callerNodeId = funcList\n ? findEnclosingFunctionFast(funcList, call.line)\n : null;\n const sourceId = callerNodeId ?? fileNodeId;\n\n if (sourceId !== targetId) {\n const edgeId = generateEdgeId(sourceId, targetId, 'calls');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId,\n source: sourceId,\n target: targetId,\n kind: 'calls',\n weight: confidence,\n label: call.name,\n });\n callEdges++;\n }\n }\n }\n }\n\n // ── Heritage → EXTENDS/IMPLEMENTS edges ──────────────────────────────\n for (const h of heritages) {\n const classNodeId = localSymbols?.get(h.className) ?? symbolIndex.get(h.className);\n if (!classNodeId) continue;\n\n for (const ext of h.extendsNames) {\n const targetId = symbolIndex.get(ext);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'extends');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'extends', weight: 1.0, label: `extends ${ext}`,\n });\n heritageEdges++;\n }\n }\n }\n\n for (const impl of h.implementsNames) {\n const targetId = symbolIndex.get(impl);\n if (targetId) {\n const edgeId = generateEdgeId(classNodeId, targetId, 'implements');\n if (!graph.getEdge(edgeId)) {\n graph.addEdge({\n id: edgeId, source: classNodeId, target: targetId,\n kind: 'implements', weight: 1.0, label: `implements ${impl}`,\n });\n heritageEdges++;\n }\n }\n }\n }\n fileDone++;\n context.onPhaseProgress?.('resolve', fileDone, filePaths.length);\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Resolved ${importEdges} imports, ${callEdges} calls, ${heritageEdges} heritage edges. Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`,\n };\n },\n};\n\n// ─── Import extraction ────────────────────────────────────────────────────────\n\nfunction extractImports(lines: string[], isPython: boolean): ParsedImport[] {\n const imports: ParsedImport[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].trim();\n\n // TypeScript/JavaScript: import ... from '...'\n const tsImport = line.match(/import\\s+.*?from\\s+['\"]([^'\"]+)['\"]/);\n if (tsImport) {\n const names: string[] = [];\n const namedMatch = line.match(/\\{([^}]+)\\}/);\n if (namedMatch) {\n names.push(\n ...namedMatch[1]\n .split(',')\n .map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim())\n .filter(Boolean),\n );\n }\n const defaultMatch = line.match(/import\\s+(\\w+)/);\n if (defaultMatch && defaultMatch[1] !== 'type') names.push(defaultMatch[1]);\n imports.push({ rawPath: tsImport[1], localNames: names, isDefault: !namedMatch, line: i + 1 });\n continue;\n }\n\n // Python: from X import Y / import X\n if (isPython) {\n const fromImport = line.match(/from\\s+([\\w.]+)\\s+import\\s+(.+)/);\n if (fromImport) {\n const names = fromImport[2].split(',').map((n) => n.trim().split(/\\s+as\\s+/).pop()!.trim()).filter(Boolean);\n imports.push({ rawPath: fromImport[1], localNames: names, isDefault: false, line: i + 1 });\n continue;\n }\n const directImport = line.match(/^import\\s+([\\w.]+)(?:\\s+as\\s+(\\w+))?/);\n if (directImport) {\n imports.push({\n rawPath: directImport[1],\n localNames: [directImport[2] ?? directImport[1].split('.').pop()!],\n isDefault: false,\n line: i + 1,\n });\n continue;\n }\n }\n\n // Java/Kotlin: import com.example.Foo\n const javaImport = line.match(/^import\\s+(?:static\\s+)?([\\w.]+)/);\n if (javaImport && !line.includes('from')) {\n const parts = javaImport[1].split('.');\n imports.push({ rawPath: javaImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Go: import \"path\"\n const goImport = line.match(/^\\s*\"([^\"]+)\"/);\n if (goImport && (i > 0 && lines[i - 1]?.includes('import') || line.match(/^import\\s+\"/))) {\n const parts = goImport[1].split('/');\n imports.push({ rawPath: goImport[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C/C++: #include\n const includeMatch = line.match(/#include\\s+[<\"]([^>\"]+)[>\"]/);\n if (includeMatch) {\n imports.push({ rawPath: includeMatch[1], localNames: [], isDefault: false, line: i + 1 });\n continue;\n }\n\n // Rust: use crate::... / use super::...\n const rustUse = line.match(/^use\\s+([\\w:]+)/);\n if (rustUse) {\n const parts = rustUse[1].split('::');\n imports.push({ rawPath: rustUse[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n continue;\n }\n\n // C#: using\n const usingMatch = line.match(/^using\\s+([\\w.]+)/);\n if (usingMatch) {\n const parts = usingMatch[1].split('.');\n imports.push({ rawPath: usingMatch[1], localNames: [parts[parts.length - 1]], isDefault: false, line: i + 1 });\n }\n\n // Ruby: require\n const requireMatch = line.match(/require\\s+['\"]([^'\"]+)['\"]/);\n if (requireMatch) {\n imports.push({ rawPath: requireMatch[1], localNames: [], isDefault: false, line: i + 1 });\n }\n }\n\n return imports;\n}\n\n// ─── Call extraction ──────────────────────────────────────────────────────────\n\nfunction extractCalls(lines: string[]): ParsedCall[] {\n const calls: ParsedCall[] = [];\n const callRegex = /(?:new\\s+)?(\\w+)\\s*\\(/g;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n // Skip declaration lines\n if (/^\\s*(export\\s+)?(async\\s+)?function\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?(abstract\\s+)?class\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?interface\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?enum\\s/.test(line)) continue;\n if (/^\\s*(export\\s+)?type\\s+\\w+\\s*=/.test(line)) continue;\n if (/^\\s*import\\s/.test(line)) continue;\n if (/^\\s*\\/\\//.test(line)) continue;\n\n let match;\n callRegex.lastIndex = 0;\n while ((match = callRegex.exec(line)) !== null) {\n const name = match[1];\n if (CALL_KEYWORDS.has(name)) continue;\n const isNew = line.substring(Math.max(0, match.index - 4), match.index).includes('new');\n calls.push({ name, isNew, line: i + 1 });\n }\n\n // Member calls: receiver.method(\n const memberCallRegex = /(\\w+)\\.(\\w+)\\s*\\(/g;\n memberCallRegex.lastIndex = 0;\n while ((match = memberCallRegex.exec(line)) !== null) {\n calls.push({ name: match[2], receiverText: match[1], isNew: false, line: i + 1 });\n }\n }\n\n return calls;\n}\n\n// ─── Heritage extraction ──────────────────────────────────────────────────────\n\nfunction extractHeritage(lines: string[]): ParsedHeritage[] {\n const heritages: ParsedHeritage[] = [];\n\n for (const line of lines) {\n const classMatch = line.match(/class\\s+(\\w+)(?:\\s+extends\\s+(\\w+))?(?:\\s+implements\\s+([\\w,\\s]+))?/);\n if (classMatch) {\n const extendsNames = classMatch[2] ? [classMatch[2]] : [];\n const implementsNames = classMatch[3] ? classMatch[3].split(',').map((n) => n.trim()).filter(Boolean) : [];\n heritages.push({ className: classMatch[1], extendsNames, implementsNames });\n continue;\n }\n // Python: class Foo(Bar, Baz):\n const pyClassMatch = line.match(/class\\s+(\\w+)\\(([^)]+)\\)/);\n if (pyClassMatch) {\n const bases = pyClassMatch[2].split(',').map((n) => n.trim()).filter(Boolean);\n heritages.push({ className: pyClassMatch[1], extendsNames: bases, implementsNames: [] });\n }\n }\n\n return heritages;\n}\n\n// ─── Enclosing function lookup (O(log n) binary search on sorted list) ────────\n\nfunction findEnclosingFunctionFast(\n funcs: { id: string; startLine: number; endLine: number | undefined }[],\n line: number,\n): string | null {\n // Binary search for the last function whose startLine <= line\n let lo = 0;\n let hi = funcs.length - 1;\n let best: string | null = null;\n\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n const fn = funcs[mid];\n if (fn.startLine <= line) {\n // Candidate — check endLine if available\n if (fn.endLine === undefined || line <= fn.endLine) {\n best = fn.id;\n }\n lo = mid + 1;\n } else {\n hi = mid - 1;\n }\n }\n\n return best;\n}\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const clusterPhase: Phase = {\n name: 'cluster',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n const relevantKinds = new Set(['function', 'class', 'method', 'interface', 'struct', 'trait', 'enum']);\n const nodesByDir = new Map<string, { id: string; name: string }[]>();\n\n for (const node of graph.allNodes()) {\n if (!relevantKinds.has(node.kind)) continue;\n const dir = node.filePath.split('/').slice(0, -1).join('/') || '.';\n let group = nodesByDir.get(dir);\n if (!group) {\n group = [];\n nodesByDir.set(dir, group);\n }\n group.push({ id: node.id, name: node.name });\n }\n\n let clusterCount = 0;\n const dirEntries = [...nodesByDir.entries()];\n let clusterDone = 0;\n for (const [dir, members] of dirEntries) {\n clusterDone++;\n context.onPhaseProgress?.('cluster', clusterDone, dirEntries.length);\n if (members.length < 2) continue;\n\n const clusterId = generateNodeId('cluster', dir, `cluster-${clusterCount}`);\n const label = dir.split('/').filter(Boolean).pop() ?? `cluster-${clusterCount}`;\n\n graph.addNode({\n id: clusterId,\n kind: 'cluster',\n name: label,\n filePath: dir,\n metadata: { memberCount: members.length },\n });\n\n for (const member of members) {\n graph.addEdge({\n id: generateEdgeId(member.id, clusterId, 'belongs_to'),\n source: member.id,\n target: clusterId,\n kind: 'belongs_to',\n weight: 1.0,\n });\n }\n clusterCount++;\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Created ${clusterCount} clusters`,\n };\n },\n};\n","import type { Phase, PhaseResult, PipelineContext } from '../types.js';\nimport { generateNodeId, generateEdgeId } from '../../graph/id-generator.js';\n\nexport const flowPhase: Phase = {\n name: 'flow',\n dependencies: ['resolve'],\n async execute(context: PipelineContext): Promise<PhaseResult> {\n const start = Date.now();\n const { graph } = context;\n\n // Find entry points: exported functions with no incoming call edges\n const calledNodes = new Set<string>();\n for (const edge of graph.findEdgesByKind('calls')) {\n calledNodes.add(edge.target);\n }\n\n const entryPoints: { id: string; name: string; score: number; filePath: string }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!['function', 'method'].includes(node.kind)) continue;\n\n let score = 0;\n const hasCallers = calledNodes.has(node.id);\n const outCalls = [...graph.findEdgesFrom(node.id)].filter((e) => e.kind === 'calls');\n\n if (!hasCallers && outCalls.length > 0) score += 10;\n if (node.exported) score += 5;\n if (/^(main|handle|init|start|run|execute|process|serve|listen|bootstrap)/.test(node.name)) score += 3;\n if (node.filePath.includes('test') || node.filePath.includes('spec') || node.filePath.includes('__test')) score -= 20;\n if (node.filePath.includes('route') || node.filePath.includes('controller') || node.filePath.includes('handler')) score += 8;\n\n if (score >= 5) {\n entryPoints.push({ id: node.id, name: node.name, score, filePath: node.filePath });\n }\n }\n\n entryPoints.sort((a, b) => b.score - a.score);\n\n // Trace flows from top entry points (max 20)\n const maxFlows = 75;\n const maxDepth = 10;\n const maxBranching = 4;\n let flowCount = 0;\n const epSlice = entryPoints.slice(0, 20);\n\n for (let epIdx = 0; epIdx < epSlice.length; epIdx++) {\n const ep = epSlice[epIdx];\n context.onPhaseProgress?.('flow', epIdx + 1, epSlice.length);\n if (flowCount >= maxFlows) break;\n\n // BFS trace\n const queue: { nodeId: string; path: string[] }[] = [{ nodeId: ep.id, path: [ep.id] }];\n const visited = new Set<string>();\n\n while (queue.length > 0 && flowCount < maxFlows) {\n const { nodeId, path } = queue.shift()!;\n if (path.length > maxDepth) continue;\n\n const callEdges = [...graph.findEdgesFrom(nodeId)]\n .filter((e) => e.kind === 'calls')\n .slice(0, maxBranching);\n\n if (callEdges.length === 0 && path.length >= 3) {\n // Record flow\n const flowId = generateNodeId('flow', ep.filePath, `flow-${flowCount}`);\n graph.addNode({\n id: flowId,\n kind: 'flow',\n name: `${ep.name} flow ${flowCount}`,\n filePath: ep.filePath,\n metadata: { steps: path, entryPoint: ep.name },\n });\n\n // Add step_of edges\n for (let i = 0; i < path.length; i++) {\n graph.addEdge({\n id: generateEdgeId(path[i], flowId, `step_of_${i}`),\n source: path[i],\n target: flowId,\n kind: 'step_of',\n weight: 1.0,\n label: `step ${i + 1}`,\n });\n }\n\n flowCount++;\n continue;\n }\n\n for (const edge of callEdges) {\n if (visited.has(edge.target)) continue;\n visited.add(edge.target);\n queue.push({ nodeId: edge.target, path: [...path, edge.target] });\n }\n }\n }\n\n return {\n status: 'completed',\n duration: Date.now() - start,\n message: `Found ${entryPoints.length} entry points, traced ${flowCount} flows`,\n };\n },\n};\n","import type { KnowledgeGraph } from '../graph/knowledge-graph.js';\n\nexport interface SearchResult {\n nodeId: string;\n name: string;\n kind: string;\n filePath: string;\n score: number;\n snippet?: string;\n}\n\nexport function textSearch(\n graph: KnowledgeGraph,\n query: string,\n limit = 20,\n): SearchResult[] {\n const terms = query.toLowerCase().split(/\\s+/).filter(Boolean);\n const results: SearchResult[] = [];\n\n // Deprioritize test/dist paths\n const isTestPath = (fp: string) =>\n fp.includes('test') || fp.includes('spec') || fp.includes('__test');\n const isDistPath = (fp: string) =>\n fp.includes('/dist') || fp.includes('\\\\dist') || fp.includes('.d.ts');\n\n for (const node of graph.allNodes()) {\n if (['directory', 'cluster', 'flow'].includes(node.kind)) continue;\n\n let score = 0;\n const nameLC = node.name.toLowerCase();\n const pathLC = node.filePath.toLowerCase();\n\n for (const term of terms) {\n if (nameLC === term) score += 10;\n else if (nameLC.startsWith(term)) score += 7;\n else if (nameLC.includes(term)) score += 5;\n if (pathLC.includes(term)) score += 2;\n if (node.content?.toLowerCase().includes(term)) score += 3;\n }\n\n // Boost source files over compiled/test files\n if (score > 0) {\n if (isDistPath(node.filePath)) score -= 8;\n if (isTestPath(node.filePath)) score -= 4;\n // Boost by kind relevance\n if (['function', 'class', 'interface', 'method'].includes(node.kind)) score += 1;\n }\n\n if (score > 0) {\n results.push({\n nodeId: node.id,\n name: node.name,\n kind: node.kind,\n filePath: node.filePath,\n score,\n snippet: node.content?.slice(0, 200),\n });\n }\n }\n\n results.sort((a, b) => b.score - a.score);\n return results.slice(0, limit);\n}\n\nexport function reciprocalRankFusion(\n ...rankings: SearchResult[][]\n): SearchResult[] {\n const K = 60;\n const scoreMap = new Map<string, { result: SearchResult; rrfScore: number }>();\n\n for (const ranking of rankings) {\n for (let rank = 0; rank < ranking.length; rank++) {\n const result = ranking[rank];\n const existing = scoreMap.get(result.nodeId);\n const rrfContribution = 1 / (K + rank + 1);\n\n if (existing) {\n existing.rrfScore += rrfContribution;\n } else {\n scoreMap.set(result.nodeId, {\n result,\n rrfScore: rrfContribution,\n });\n }\n }\n }\n\n return [...scoreMap.values()]\n .sort((a, b) => b.rrfScore - a.rrfScore)\n .map((entry) => ({ ...entry.result, score: entry.rrfScore }));\n}\n","import express from 'express';\nimport cors from 'cors';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { findEntryPoints, traceFlow } from '../flow-detection/entry-point-finder.js';\nimport { DbManager, getDbPath, getVectorDbPath } from '../storage/index.js';\nimport { VectorIndex } from '../search/vector-index.js';\nimport fs from 'node:fs';\nimport os from 'node:os';\nimport { listGroups, loadGroup, loadSyncResult, saveSyncResult } from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from '../multi-repo/graph-from-db.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport Logger from '../shared/logger.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n// Resolve web dist: <core>/dist/http -> ../../web/dist\nconst WEB_DIST = path.resolve(__dirname, '..', '..', '..', 'web', 'dist');\n\nexport function createApp(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): express.Application {\n const app = express();\n\n app.use(cors({ origin: true }));\n app.use(express.json({ limit: '10mb' }));\n\n // Lazy-init vector index state\n let vectorIndex: VectorIndex | null = null;\n let vectorIndexBuilding = false;\n let vectorIndexReady = false;\n\n async function ensureVectorIndex(): Promise<VectorIndex | null> {\n if (vectorIndexReady && vectorIndex) return vectorIndex;\n if (!workspaceRoot || vectorIndexBuilding) return null;\n vectorIndexBuilding = true;\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const dbPath = getVectorDbPath(workspaceRoot);\n const db = new DbManager(dbPath);\n await db.init();\n const idx = new VectorIndex(db);\n await idx.init();\n const alreadyBuilt = await idx.isBuilt();\n if (!alreadyBuilt) {\n Logger.info(' [vector] Building embeddings…');\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (done % 50 === 0 || done === total) process.stdout.write(`\\r [vector] ${done}/${total}`);\n },\n });\n Logger.info('');\n await idx.buildIndex(nodes);\n Logger.info(` [vector] Index built: ${nodes.length} embeddings`);\n } else {\n Logger.info(' [vector] Index already exists, skipping rebuild.');\n }\n vectorIndex = idx;\n vectorIndexReady = true;\n return idx;\n } catch (err) {\n Logger.warn(' [vector] Index build failed:', err instanceof Error ? err.message : err);\n return null;\n } finally {\n vectorIndexBuilding = false;\n }\n }\n\n // Kick off in background when workspace is available\n if (workspaceRoot) {\n setImmediate(() => ensureVectorIndex().catch(() => {}));\n }\n\n // Health check\n app.get('/api/health', (_req, res) => {\n res.json({ status: 'ok', nodes: graph.size.nodes, edges: graph.size.edges });\n });\n\n // List ALL indexed repos from the global registry (not just the current one)\n app.get('/api/repos', (_req, res) => {\n const registry = loadRegistry();\n if (registry.length === 0) {\n // Fallback: return only the in-memory repo\n res.json([{ name: repoName, path: workspaceRoot ?? '', nodes: graph.size.nodes, edges: graph.size.edges, indexedAt: null }]);\n return;\n }\n res.json(registry.map((r) => ({\n name: r.name,\n path: r.path,\n nodes: r.stats.nodes,\n edges: r.stats.edges,\n indexedAt: r.indexedAt,\n active: r.path === workspaceRoot,\n })));\n });\n\n // Helper: load graph for a repo by name from its DB (returns in-memory graph if it matches)\n async function loadRepoGraph(requestedRepo: string): Promise<KnowledgeGraph | null> {\n // If the requested repo is the currently loaded in-memory graph, return it directly\n if (requestedRepo === repoName) return graph;\n\n // Otherwise look up in the global registry and load from DB\n const registry = loadRegistry();\n const entry = registry.find((r) => r.name === requestedRepo || r.path === requestedRepo);\n if (!entry) return null;\n\n const dbPath = path.join(entry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) return null;\n\n const repoGraph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(repoGraph, db);\n db.close();\n return repoGraph;\n } catch {\n db.close();\n return null;\n }\n }\n\n // Download full graph — supports any registered repo by name\n app.get('/api/graph/:repo', async (req, res) => {\n const requestedRepo = decodeURIComponent(req.params.repo);\n const g = await loadRepoGraph(requestedRepo);\n if (!g) {\n res.status(404).json({ error: `Repo \"${requestedRepo}\" not found or not indexed. Run: code-intel analyze <path>` });\n return;\n }\n const nodes = [...g.allNodes()];\n const edges = [...g.allEdges()];\n res.json({ nodes, edges });\n });\n\n // Helper: resolve graph for a repo (in-memory if matches, else load from DB)\n async function getGraphForRepo(requestedRepo: string | undefined): Promise<KnowledgeGraph> {\n if (!requestedRepo || requestedRepo === repoName) return graph;\n const g = await loadRepoGraph(requestedRepo);\n return g ?? graph; // fallback to in-memory\n }\n\n // Hybrid search (BM25-like text) — repo-aware\n app.post('/api/search', async (req, res) => {\n const { query, limit, repo } = req.body;\n const g = await getGraphForRepo(repo as string | undefined);\n const results = textSearch(g, query, limit ?? 20);\n res.json({ results });\n });\n\n // Vector search (semantic)\n app.post('/api/vector-search', async (req, res) => {\n const { query, limit = 10 } = req.body;\n if (!query) { res.status(400).json({ error: 'Missing query' }); return; }\n\n const idx = await ensureVectorIndex();\n if (!idx) {\n // Fall back to text search\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false });\n return;\n }\n\n try {\n // Embed the query using @huggingface/transformers\n const { pipeline } = await import('@huggingface/transformers');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const embedder = (await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2')) as unknown as (text: string, opts: Record<string, unknown>) => Promise<{ data: Float32Array }>;\n const out = await embedder(query, { pooling: 'mean', normalize: true });\n const queryEmbedding = Array.from(out.data);\n const hits = await idx.search(queryEmbedding, limit);\n // Map to SearchResult shape\n const results = hits.map((h) => ({\n nodeId: h.nodeId,\n name: h.name,\n kind: h.kind,\n filePath: h.filePath,\n score: h.score,\n }));\n res.json({ results, source: 'vector', vectorReady: true });\n } catch (err) {\n const results = textSearch(graph, query, limit);\n res.json({ results, source: 'text-fallback', vectorReady: false, error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n // Vector index status\n app.get('/api/vector-status', (_req, res) => {\n res.json({ ready: vectorIndexReady, building: vectorIndexBuilding });\n });\n\n // Read file\n app.post('/api/files/read', (req, res) => {\n const { file_path } = req.body;\n try {\n const content = fs.readFileSync(file_path, 'utf-8');\n res.json({ content });\n } catch {\n res.status(404).json({ error: 'File not found' });\n }\n });\n\n // Grep (regex search in files)\n app.post('/api/grep', (req, res) => {\n const { pattern, file_paths } = req.body;\n const results: { file: string; line: number; text: string }[] = [];\n\n try {\n const regex = new RegExp(pattern, 'gi');\n const paths: string[] = file_paths ?? [];\n\n // If no paths, search from graph nodes\n if (paths.length === 0) {\n for (const node of graph.allNodes()) {\n if (node.kind === 'file' && node.content) {\n const lines = node.content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n if (regex.test(lines[i])) {\n results.push({ file: node.filePath, line: i + 1, text: lines[i].trim() });\n }\n regex.lastIndex = 0;\n }\n }\n }\n }\n\n res.json({ results: results.slice(0, 100) });\n } catch {\n res.status(400).json({ error: 'Invalid regex pattern' });\n }\n });\n\n // Cypher query — routed to LadybugDB if available, else falls back to in-memory\n app.post('/api/cypher', async (req, res) => {\n const { query: q } = req.body;\n if (!q) { res.status(400).json({ error: 'Missing query' }); return; }\n\n // Try LadybugDB first\n if (workspaceRoot) {\n try {\n const dbPath = getDbPath(workspaceRoot);\n const dbm = new DbManager(dbPath);\n await dbm.init();\n const rows = await dbm.query(q);\n dbm.close();\n res.json({ results: rows });\n return;\n } catch (err) {\n // Fall through to in-memory fallback\n }\n }\n\n // In-memory fallback\n try {\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const name = nameMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === name) {\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n results.push({ node, incoming: incoming.length, outgoing: outgoing.length });\n }\n }\n res.json({ results });\n return;\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const kind = kindMatch[1];\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kind) results.push(node);\n if (results.length >= 50) break;\n }\n res.json({ results });\n return;\n }\n res.json({ results: [], message: 'Query not recognized.' });\n } catch {\n res.status(400).json({ error: 'Invalid query' });\n }\n });\n\n // Get node detail (inspect) — repo-aware via ?repo= query param\n app.get('/api/nodes/:id', async (req, res) => {\n const nodeId = decodeURIComponent(req.params.id);\n const g = await getGraphForRepo(req.query.repo as string | undefined);\n const node = g.getNode(nodeId);\n if (!node) {\n res.status(404).json({ error: 'Node not found' });\n return;\n }\n\n const incoming = [...g.findEdgesTo(nodeId)];\n const outgoing = [...g.findEdgesFrom(nodeId)];\n\n res.json({\n node,\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.source,\n name: g.getNode(e.source)?.name,\n weight: e.weight,\n })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.target,\n name: g.getNode(e.target)?.name,\n weight: e.weight,\n })),\n imports: outgoing.filter((e) => e.kind === 'imports').map((e) => ({\n id: e.target,\n name: g.getNode(e.target)?.name,\n })),\n importedBy: incoming.filter((e) => e.kind === 'imports').map((e) => ({\n id: e.source,\n name: g.getNode(e.source)?.name,\n })),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => ({\n id: e.target,\n name: g.getNode(e.target)?.name,\n })),\n implementsEdges: outgoing.filter((e) => e.kind === 'implements').map((e) => ({\n id: e.target,\n name: g.getNode(e.target)?.name,\n })),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({\n id: e.target,\n name: g.getNode(e.target)?.name,\n kind: g.getNode(e.target)?.kind,\n })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => g.getNode(e.target)?.name)[0],\n });\n });\n\n // Blast radius — repo-aware\n app.post('/api/blast-radius', async (req, res) => {\n const { target, direction = 'both', max_hops = 5, repo } = req.body;\n const g = await getGraphForRepo(repo as string | undefined);\n\n let targetNode = null;\n for (const node of g.allNodes()) {\n if (node.name === target || node.id === target) { targetNode = node; break; }\n }\n\n if (!targetNode) {\n res.status(404).json({ error: `Symbol \"${target}\" not found` });\n return;\n }\n\n const affected = new Map<string, { name: string; kind: string; depth: number }>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > max_hops) continue;\n visited.add(id);\n const node = g.getNode(id);\n if (node) affected.set(id, { name: node.name, kind: node.kind, depth });\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of g.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of g.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n\n res.json({\n target: targetNode.name,\n affectedCount: [...affected.values()].filter((a) => a.depth > 0).length,\n affected: [...affected.entries()].map(([id, info]) => ({ id, ...info })).filter((a) => a.depth > 0),\n });\n });\n\n // Flows — repo-aware via ?repo=\n app.get('/api/flows', async (req, res) => {\n const g = await getGraphForRepo(req.query.repo as string | undefined);\n const flows: { id: string; name: string; steps: unknown }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps });\n }\n res.json({ flows });\n });\n\n // Clusters — repo-aware via ?repo=\n app.get('/api/clusters', async (req, res) => {\n const g = await getGraphForRepo(req.query.repo as string | undefined);\n const clusters: { id: string; name: string; memberCount: number }[] = [];\n for (const node of g.allNodes()) {\n if (node.kind === 'cluster') {\n clusters.push({ id: node.id, name: node.name, memberCount: (node.metadata?.memberCount as number) ?? 0 });\n }\n }\n res.json({ clusters });\n });\n\n // ── Group routes ──────────────────────────────────────────────────────────────\n app.get('/api/groups', (_req, res) => {\n const groups = listGroups();\n res.json(groups.map((g) => ({\n name: g.name,\n memberCount: g.members.length,\n lastSync: g.lastSync ?? null,\n createdAt: g.createdAt,\n })));\n });\n\n app.get('/api/groups/:name', (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n res.json(group);\n });\n\n app.get('/api/groups/:name/contracts', (req, res) => {\n const result = loadSyncResult(req.params.name);\n if (!result) { res.status(404).json({ error: 'No sync result. Run sync first.' }); return; }\n res.json(result);\n });\n\n app.post('/api/groups/:name/sync', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n try {\n const result = await syncGroup(group);\n saveSyncResult(result);\n // Update lastSync on group\n group.lastSync = result.syncedAt;\n const { saveGroup } = await import('../multi-repo/group-registry.js');\n saveGroup(group);\n res.json(result);\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n app.post('/api/groups/:name/search', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n const { q, limit = 20 } = req.body;\n if (!q) { res.status(400).json({ error: 'Missing query q' }); return; }\n try {\n const { perRepo, merged } = await queryGroup(group, q, limit);\n res.json({ perRepo, merged });\n } catch (err) {\n res.status(500).json({ error: err instanceof Error ? err.message : String(err) });\n }\n });\n\n app.get('/api/groups/:name/graph', async (req, res) => {\n const group = loadGroup(req.params.name);\n if (!group) { res.status(404).json({ error: 'Group not found' }); return; }\n const registry = loadRegistry();\n const mergedGraph = createKnowledgeGraph();\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(mergedGraph, db);\n db.close();\n } catch { db.close(); }\n }\n res.json({ nodes: [...mergedGraph.allNodes()], edges: [...mergedGraph.allEdges()] });\n });\n\n // Serve web UI static files\n if (fs.existsSync(WEB_DIST)) {\n app.use(express.static(WEB_DIST));\n app.get('/{*path}', (_req, res) => {\n res.sendFile(path.join(WEB_DIST, 'index.html'));\n });\n }\n\n return app;\n}\n\nexport function startHttpServer(\n graph: KnowledgeGraph,\n repoName: string,\n port = 4747,\n workspaceRoot?: string,\n): void {\n const app = createApp(graph, repoName, workspaceRoot);\n app.listen(port, () => {\n Logger.info(`Code Intelligence server running at http://localhost:${port}`);\n Logger.info(` Graph: ${graph.size.nodes} nodes, ${graph.size.edges} edges`);\n });\n}\n","/**\n * group-sync.ts\n * Loads each member repo's knowledge graph from its .code-intel/graph.db,\n * extracts contracts (exports, routes, events, schemas), and matches them\n * across repos to produce ContractLinks.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup, Contract, ContractLink, GroupSyncResult } from './types.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph, type KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\nimport Logger from '../shared/logger.js';\n\n// ─── Extract contracts from a single repo's graph ────────────────────────────\n\nfunction extractContracts(\n graph: KnowledgeGraph,\n repoName: string,\n repoPath: string,\n): Contract[] {\n const contracts: Contract[] = [];\n\n for (const node of graph.allNodes()) {\n // exported symbols → 'export' contracts\n if (\n node.exported === true &&\n ['function', 'class', 'interface', 'method', 'type_alias', 'constant', 'enum', 'struct', 'trait'].includes(node.kind)\n ) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'export',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // route nodes → 'route' contracts\n if (node.kind === 'route') {\n contracts.push({\n repoName,\n repoPath,\n kind: 'route',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n signature: node.content?.split('\\n')[0]?.trim(),\n });\n }\n\n // interfaces / type aliases with \"event\" or \"schema\" in name → schema/event contracts\n if (['interface', 'type_alias'].includes(node.kind)) {\n const nameLower = node.name.toLowerCase();\n if (nameLower.includes('event') || nameLower.includes('message')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'event',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n } else if (nameLower.includes('schema') || nameLower.includes('dto') || nameLower.includes('request') || nameLower.includes('response')) {\n contracts.push({\n repoName,\n repoPath,\n kind: 'schema',\n name: node.name,\n nodeId: node.id,\n nodeKind: node.kind,\n filePath: node.filePath,\n });\n }\n }\n }\n\n return contracts;\n}\n\n// ─── Match contracts across repos ────────────────────────────────────────────\n\nfunction matchContracts(allContracts: Contract[]): ContractLink[] {\n const links: ContractLink[] = [];\n\n // Group contracts by repo\n const byRepo = new Map<string, Contract[]>();\n for (const c of allContracts) {\n const arr = byRepo.get(c.repoName) ?? [];\n arr.push(c);\n byRepo.set(c.repoName, arr);\n }\n\n const repoNames = [...byRepo.keys()];\n\n for (let i = 0; i < repoNames.length; i++) {\n for (let j = 0; j < repoNames.length; j++) {\n if (i === j) continue;\n const providerContracts = byRepo.get(repoNames[i])!;\n const consumerContracts = byRepo.get(repoNames[j])!;\n\n // Build a name map for the consumer\n const consumerByName = new Map<string, Contract>();\n for (const c of consumerContracts) consumerByName.set(c.name, c);\n\n for (const provider of providerContracts) {\n const consumer = consumerByName.get(provider.name);\n if (consumer) {\n // same-kind matches are more confident\n const sameKind = provider.kind === consumer.kind;\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: consumer.repoName,\n consumerContract: consumer.name,\n matchKind: provider.kind === 'route' ? 'route-match' : 'name-match',\n confidence: sameKind ? 0.9 : 0.6,\n });\n } else {\n // partial-name match (camelCase contained)\n const providerLC = provider.name.toLowerCase();\n for (const c of consumerContracts) {\n if (c.name.toLowerCase().includes(providerLC) || providerLC.includes(c.name.toLowerCase())) {\n if (c.name.length >= 4 && provider.name.length >= 4) {\n links.push({\n providerRepo: provider.repoName,\n providerContract: provider.name,\n consumerRepo: c.repoName,\n consumerContract: c.name,\n matchKind: 'name-match',\n confidence: 0.4,\n });\n }\n }\n }\n }\n }\n }\n }\n\n // Deduplicate: keep highest-confidence for a given (pRepo, pContract, cRepo) triple\n const seen = new Map<string, ContractLink>();\n for (const link of links) {\n const key = `${link.providerRepo}:${link.providerContract}:${link.consumerRepo}:${link.consumerContract}`;\n const existing = seen.get(key);\n if (!existing || link.confidence > existing.confidence) {\n seen.set(key, link);\n }\n }\n\n return [...seen.values()].sort((a, b) => b.confidence - a.confidence);\n}\n\n// ─── Main sync function ───────────────────────────────────────────────────────\n\nexport async function syncGroup(group: RepoGroup): Promise<GroupSyncResult> {\n const registry = loadRegistry();\n const allContracts: Contract[] = [];\n\n for (const member of group.members) {\n // Resolve the actual repo path from the registry\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) {\n Logger.warn(` ⚠ Registry entry \"${member.registryName}\" not found — skipping ${member.groupPath}`);\n continue;\n }\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) {\n Logger.warn(` ⚠ No index at ${dbPath} — run \\`code-intel analyze ${regEntry.path}\\` first`);\n continue;\n }\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch (err) {\n db.close();\n Logger.warn(` ⚠ Could not load graph for \"${member.registryName}\": ${err instanceof Error ? err.message : err}`);\n continue;\n }\n\n const contracts = extractContracts(graph, member.registryName, regEntry.path);\n Logger.info(` ✓ ${member.registryName} (${member.groupPath}): ${contracts.length} contracts`);\n allContracts.push(...contracts);\n }\n\n const links = matchContracts(allContracts);\n\n return {\n groupName: group.name,\n syncedAt: new Date().toISOString(),\n memberCount: group.members.length,\n contracts: allContracts,\n links,\n };\n}\n","/**\n * graph-from-db.ts\n * Loads a KnowledgeGraph from a persisted LadybugDB graph.db.\n * Used by group-sync to read each repo's index without re-analyzing.\n */\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { ALL_NODE_TABLES, NODE_TABLE_MAP } from '../storage/schema.js';\nimport type { CodeNode, CodeEdge, NodeKind, EdgeKind } from '../shared/index.js';\n\n// Reverse map: tableName → NodeKind\nconst TABLE_TO_KIND: Record<string, NodeKind> = Object.fromEntries(\n Object.entries(NODE_TABLE_MAP).map(([kind, table]) => [table, kind as NodeKind]),\n);\n\nfunction parseRow(row: Record<string, unknown>, kind: NodeKind): CodeNode {\n return {\n id: String(row['id'] ?? ''),\n kind,\n name: String(row['name'] ?? ''),\n filePath: String(row['file_path'] ?? ''),\n startLine: row['start_line'] != null ? Number(row['start_line']) : undefined,\n endLine: row['end_line'] != null ? Number(row['end_line']) : undefined,\n exported: row['exported'] != null ? Boolean(row['exported']) : undefined,\n content: row['content'] ? String(row['content']) : undefined,\n metadata: row['metadata'] ? (() => {\n try { return JSON.parse(String(row['metadata'])) as Record<string, unknown>; } catch { return undefined; }\n })() : undefined,\n };\n}\n\nexport async function loadGraphFromDB(\n graph: KnowledgeGraph,\n db: DbManager,\n): Promise<void> {\n // Load all node tables\n for (const table of ALL_NODE_TABLES) {\n const kind = TABLE_TO_KIND[table];\n if (!kind) continue;\n let rows: Record<string, unknown>[] = [];\n try {\n rows = await db.query(`MATCH (n:${table}) RETURN n.id, n.name, n.file_path, n.start_line, n.end_line, n.exported, n.content, n.metadata`);\n } catch {\n // table may not exist in older DBs\n continue;\n }\n for (const row of rows) {\n // kuzu returns column names as aliases\n const node = parseRow({\n id: row['n.id'],\n name: row['n.name'],\n file_path: row['n.file_path'],\n start_line: row['n.start_line'],\n end_line: row['n.end_line'],\n exported: row['n.exported'],\n content: row['n.content'],\n metadata: row['n.metadata'],\n }, kind);\n if (node.id && node.name) graph.addNode(node);\n }\n }\n\n // Load edges\n try {\n const edgeRows = await db.query(\n `MATCH (a)-[e:code_edges]->(b) RETURN a.id, b.id, e.kind, e.weight, e.label`,\n );\n for (const row of edgeRows) {\n const sourceId = String(row['a.id'] ?? '');\n const targetId = String(row['b.id'] ?? '');\n const kind = String(row['e.kind'] ?? '') as EdgeKind;\n if (!sourceId || !targetId || !kind) continue;\n const edge: CodeEdge = {\n id: `${sourceId}::${kind}::${targetId}`,\n source: sourceId,\n target: targetId,\n kind,\n weight: row['e.weight'] != null ? Number(row['e.weight']) : undefined,\n label: row['e.label'] ? String(row['e.label']) : undefined,\n };\n graph.addEdge(edge);\n }\n } catch {\n // edges table may not exist in older DBs\n }\n}\n","/**\n * group-query.ts\n * Search execution flows across all repos in a group.\n * Loads each repo's graph, runs text search, and merges via RRF.\n */\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport type { RepoGroup } from './types.js';\nimport type { SearchResult } from '../search/text-search.js';\nimport { textSearch, reciprocalRankFusion } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { DbManager } from '../storage/db-manager.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { loadGraphFromDB } from './graph-from-db.js';\n\nexport interface GroupQueryResult {\n repoName: string;\n repoPath: string;\n groupPath: string;\n results: SearchResult[];\n}\n\nexport async function queryGroup(\n group: RepoGroup,\n query: string,\n limit = 20,\n): Promise<{ perRepo: GroupQueryResult[]; merged: SearchResult[] }> {\n const registry = loadRegistry();\n const perRepo: GroupQueryResult[] = [];\n const allRankings: SearchResult[][] = [];\n\n for (const member of group.members) {\n const regEntry = registry.find((r) => r.name === member.registryName);\n if (!regEntry) continue;\n\n const dbPath = path.join(regEntry.path, '.code-intel', 'graph.db');\n if (!fs.existsSync(dbPath)) continue;\n\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n try {\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n } catch {\n db.close();\n continue;\n }\n\n const results = textSearch(graph, query, limit);\n // Tag each result with repo info via snippet prefix\n const taggedResults: SearchResult[] = results.map((r) => ({\n ...r,\n snippet: `[${member.registryName}] ${r.snippet ?? ''}`.trim(),\n }));\n\n perRepo.push({\n repoName: member.registryName,\n repoPath: regEntry.path,\n groupPath: member.groupPath,\n results: taggedResults,\n });\n allRankings.push(taggedResults);\n }\n\n const merged = reciprocalRankFusion(...allRankings).slice(0, limit);\n return { perRepo, merged };\n}\n","import { Server } from '@modelcontextprotocol/sdk/server/index.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport {\n CallToolRequestSchema,\n ListToolsRequestSchema,\n ListResourcesRequestSchema,\n ReadResourceRequestSchema,\n} from '@modelcontextprotocol/sdk/types.js';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { textSearch } from '../search/text-search.js';\nimport { loadRegistry } from '../storage/repo-registry.js';\nimport { loadMetadata } from '../storage/metadata.js';\nimport {\n listGroups,\n loadGroup,\n saveGroup,\n loadSyncResult,\n saveSyncResult,\n} from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\nimport { execSync } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\n\nexport function createMcpServer(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Server {\n const server = new Server(\n { name: 'code-intel', version: '0.1.0' },\n { capabilities: { tools: {}, resources: {} } },\n );\n\n // ─── Tool Definitions ──────────────────────────────────────────────────────\n\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: [\n // ── Core repo tools ──────────────────────────────────────────────────\n {\n name: 'repos',\n description: 'List all indexed repositories with node and edge counts',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'overview',\n description: 'Repository summary: total nodes/edges and a full breakdown of node and edge counts by kind. Use this first to understand the shape of the codebase.',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n\n // ── Search & inspect ─────────────────────────────────────────────────\n {\n name: 'search',\n description: 'BM25 keyword search across all indexed symbols — functions, classes, files, routes, etc.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n query: { type: 'string', description: 'Search query (symbol name, keyword, or partial match)' },\n limit: { type: 'number', description: 'Max results to return (default: 20)' },\n },\n required: ['query'],\n },\n },\n {\n name: 'inspect',\n description: '360° view of a symbol: definition location, callers, callees, heritage (extends/implements), members, cluster, and source preview (first 500 chars)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n symbol_name: { type: 'string', description: 'Exact symbol name to inspect' },\n },\n required: ['symbol_name'],\n },\n },\n {\n name: 'blast_radius',\n description: 'Impact analysis: traverse the call/import graph to find all symbols that depend on or are affected by a given symbol. Returns risk level (LOW / MEDIUM / HIGH).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n target: { type: 'string', description: 'Target symbol name' },\n direction: {\n type: 'string',\n enum: ['callers', 'callees', 'both'],\n description: 'Which direction to trace — callers (who depends on it), callees (what it depends on), or both (default: both)',\n },\n max_hops: { type: 'number', description: 'Maximum traversal depth (default: 5)' },\n },\n required: ['target'],\n },\n },\n {\n name: 'file_symbols',\n description: 'List all symbols defined in a specific file — useful to understand what a file exports or contains without reading raw source.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n file_path: { type: 'string', description: 'File path (partial match is supported, e.g. \"auth/login.ts\")' },\n },\n required: ['file_path'],\n },\n },\n {\n name: 'find_path',\n description: 'Find the shortest call/import path between two symbols. Useful for tracing how one module reaches another.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n from: { type: 'string', description: 'Source symbol name' },\n to: { type: 'string', description: 'Target symbol name' },\n max_hops: { type: 'number', description: 'Maximum path length to search (default: 8)' },\n },\n required: ['from', 'to'],\n },\n },\n {\n name: 'list_exports',\n description: 'List all exported symbols in the repository. Helps AI understand the public API surface of the codebase.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n kind: {\n type: 'string',\n description: 'Filter by node kind: function | class | interface | method | type_alias | constant | enum (optional)',\n },\n limit: { type: 'number', description: 'Max results (default: 100)' },\n },\n },\n },\n\n // ── Routes, clusters, flows ──────────────────────────────────────────\n {\n name: 'routes',\n description: 'List all HTTP route handler mappings detected in the codebase (kind=route or route/handler/controller files)',\n inputSchema: { type: 'object' as const, properties: {} },\n },\n {\n name: 'clusters',\n description: 'List detected code clusters (directory-based communities) with member counts and top 10 symbols each. Useful for understanding code organisation.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max clusters to return (default: 50)' },\n },\n },\n },\n {\n name: 'flows',\n description: 'List all detected execution flows — entry points traced through the call graph. Each flow has a name, entry point, and ordered steps.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n limit: { type: 'number', description: 'Max flows to return (default: 50)' },\n },\n },\n },\n\n // ── Git change impact ─────────────────────────────────────────────────\n {\n name: 'detect_changes',\n description: 'Git-diff impact analysis: detects which source files and line ranges changed (HEAD vs working tree or a custom diff), maps them to graph symbols, and computes the combined blast radius. Ideal for PR review or pre-commit analysis.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n base_ref: {\n type: 'string',\n description: 'Git ref to diff against (default: HEAD). Examples: \"HEAD~1\", \"main\", a commit SHA.',\n },\n diff_text: {\n type: 'string',\n description: 'Raw unified diff text. If provided, base_ref is ignored and this diff is parsed directly.',\n },\n },\n },\n },\n\n // ── Raw query ─────────────────────────────────────────────────────────\n {\n name: 'raw_query',\n description: 'Execute a simplified Cypher-like graph query. Supports: name=\\'X\\' (exact name match) or :kind (list nodes of a kind, max 50)',\n inputSchema: {\n type: 'object' as const,\n properties: {\n cypher: { type: 'string', description: \"Query string — e.g. name='runPipeline' or :function\" },\n },\n required: ['cypher'],\n },\n },\n\n // ── Group / multi-repo tools ──────────────────────────────────────────\n {\n name: 'group_list',\n description: 'List all configured repository groups, or show the full membership of one group. Repository groups track multiple repos as a logical system.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to inspect (optional — omit to list all groups)' },\n },\n },\n },\n {\n name: 'group_sync',\n description: 'Extract cross-repo contracts (exports, routes, schemas, events) from every member repo in a group and detect provider→consumer links via name matching and RRF scoring.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name to sync' },\n },\n required: ['name'],\n },\n },\n {\n name: 'group_contracts',\n description: 'Inspect extracted contracts and confidence-ranked cross-repo links from the last group sync. Supports filtering by kind, repo, and minimum confidence.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n kind: {\n type: 'string',\n enum: ['export', 'route', 'schema', 'event'],\n description: 'Filter by contract kind (optional)',\n },\n repo: { type: 'string', description: 'Filter by registry name (optional)' },\n min_confidence: { type: 'number', description: 'Minimum link confidence 0–1 (default: 0)' },\n },\n required: ['name'],\n },\n },\n {\n name: 'group_query',\n description: 'BM25 search across all repos in a group, merged via Reciprocal Rank Fusion (RRF). Returns a unified ranked list plus per-repo breakdown.',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n query: { type: 'string', description: 'Search query' },\n limit: { type: 'number', description: 'Max results per repo (default: 10)' },\n },\n required: ['name', 'query'],\n },\n },\n {\n name: 'group_status',\n description: 'Check index freshness and sync staleness for all repos in a group. Flags repos that have not been indexed or are stale (>24h).',\n inputSchema: {\n type: 'object' as const,\n properties: {\n name: { type: 'string', description: 'Group name' },\n },\n required: ['name'],\n },\n },\n ],\n }));\n\n // ─── Tool Handlers ─────────────────────────────────────────────────────────\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const { name, arguments: args } = request.params;\n const a = (args ?? {}) as Record<string, unknown>;\n\n switch (name) {\n\n // ── repos ──────────────────────────────────────────────────────────────\n case 'repos': {\n const registry = loadRegistry();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n registry.map((r) => ({ name: r.name, path: r.path, indexedAt: r.indexedAt, stats: r.stats })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── overview ───────────────────────────────────────────────────────────\n case 'overview': {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n const edgeCounts: Record<string, number> = {};\n for (const edge of graph.allEdges()) {\n edgeCounts[edge.kind] = (edgeCounts[edge.kind] ?? 0) + 1;\n }\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n repo: repoName,\n stats: graph.size,\n nodeCounts: kindCounts,\n edgeCounts,\n }, null, 2),\n }],\n };\n }\n\n // ── search ─────────────────────────────────────────────────────────────\n case 'search': {\n const query = a.query as string;\n const limit = (a.limit as number) ?? 20;\n const results = textSearch(graph, query, limit);\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n\n // ── inspect ────────────────────────────────────────────────────────────\n case 'inspect': {\n const symbolName = a.symbol_name as string;\n const node = findNodeByName(graph, symbolName);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${symbolName}\" not found. Try search first.` }] };\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n node: {\n id: node.id,\n kind: node.kind,\n name: node.name,\n filePath: node.filePath,\n startLine: node.startLine,\n endLine: node.endLine,\n exported: node.exported,\n },\n callers: incoming.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.source, name: graph.getNode(e.source)?.name, file: graph.getNode(e.source)?.filePath,\n })),\n callees: outgoing.filter((e) => e.kind === 'calls').map((e) => ({\n id: e.target, name: graph.getNode(e.target)?.name, file: graph.getNode(e.target)?.filePath,\n })),\n imports: incoming.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.source)?.name),\n importedBy: outgoing.filter((e) => e.kind === 'imports').map((e) => graph.getNode(e.target)?.name),\n extends: outgoing.filter((e) => e.kind === 'extends').map((e) => graph.getNode(e.target)?.name),\n implements: outgoing.filter((e) => e.kind === 'implements').map((e) => graph.getNode(e.target)?.name),\n members: outgoing.filter((e) => e.kind === 'has_member').map((e) => ({\n name: graph.getNode(e.target)?.name, kind: graph.getNode(e.target)?.kind,\n })),\n cluster: incoming.filter((e) => e.kind === 'belongs_to').map((e) => graph.getNode(e.target)?.name)[0],\n content: node.content?.slice(0, 500),\n }, null, 2),\n }],\n };\n }\n\n // ── blast_radius ───────────────────────────────────────────────────────\n case 'blast_radius': {\n const target = a.target as string;\n const direction = (a.direction as string) ?? 'both';\n const maxHops = (a.max_hops as number) ?? 5;\n const node = findNodeByName(graph, target);\n if (!node) return { content: [{ type: 'text', text: `Symbol \"${target}\" not found.` }] };\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: node.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n\n if (direction === 'callers' || direction === 'both') {\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n if (direction === 'callees' || direction === 'both') {\n for (const edge of graph.findEdgesFrom(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.target, depth: depth + 1 });\n }\n }\n }\n\n const affectedDetails = [...affected].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = affected.size > 10 ? 'HIGH' : affected.size > 5 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n target: node.name,\n affectedCount: affected.size,\n riskLevel: risk,\n affected: affectedDetails,\n }, null, 2),\n }],\n };\n }\n\n // ── file_symbols ───────────────────────────────────────────────────────\n case 'file_symbols': {\n const filePath = a.file_path as string;\n const matches: { kind: string; name: string; startLine: number | undefined; exported: boolean | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.filePath && node.filePath.includes(filePath)) {\n matches.push({ kind: node.kind, name: node.name, startLine: node.startLine, exported: node.exported });\n }\n }\n if (matches.length === 0) {\n return { content: [{ type: 'text', text: `No symbols found for file path matching \"${filePath}\".` }] };\n }\n matches.sort((a, b) => (a.startLine ?? 0) - (b.startLine ?? 0));\n return { content: [{ type: 'text', text: JSON.stringify(matches, null, 2) }] };\n }\n\n // ── find_path ──────────────────────────────────────────────────────────\n case 'find_path': {\n const fromName = a.from as string;\n const toName = a.to as string;\n const maxHops = (a.max_hops as number) ?? 8;\n\n const fromNode = findNodeByName(graph, fromName);\n const toNode = findNodeByName(graph, toName);\n\n if (!fromNode) return { content: [{ type: 'text', text: `Source symbol \"${fromName}\" not found.` }] };\n if (!toNode) return { content: [{ type: 'text', text: `Target symbol \"${toName}\" not found.` }] };\n\n // BFS for shortest path\n type PathNode = { id: string; path: string[] };\n const queue: PathNode[] = [{ id: fromNode.id, path: [fromNode.id] }];\n const visited = new Set<string>();\n\n let foundPath: string[] | null = null;\n while (queue.length > 0) {\n const { id, path: currentPath } = queue.shift()!;\n if (visited.has(id)) continue;\n visited.add(id);\n\n if (id === toNode.id) { foundPath = currentPath; break; }\n if (currentPath.length > maxHops) continue;\n\n for (const edge of graph.findEdgesFrom(id)) {\n if ((edge.kind === 'calls' || edge.kind === 'imports') && !visited.has(edge.target)) {\n queue.push({ id: edge.target, path: [...currentPath, edge.target] });\n }\n }\n }\n\n if (!foundPath) {\n return { content: [{ type: 'text', text: `No path found from \"${fromName}\" to \"${toName}\" within ${maxHops} hops.` }] };\n }\n\n const pathDetails = foundPath.map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ from: fromName, to: toName, hops: foundPath.length - 1, path: pathDetails }, null, 2),\n }],\n };\n }\n\n // ── list_exports ───────────────────────────────────────────────────────\n case 'list_exports': {\n const kindFilter = a.kind as string | undefined;\n const limit = (a.limit as number) ?? 100;\n const exports: { kind: string; name: string; filePath: string; startLine: number | undefined }[] = [];\n\n for (const node of graph.allNodes()) {\n if (!node.exported) continue;\n if (kindFilter && node.kind !== kindFilter) continue;\n exports.push({ kind: node.kind, name: node.name, filePath: node.filePath, startLine: node.startLine });\n if (exports.length >= limit) break;\n }\n\n return { content: [{ type: 'text', text: JSON.stringify({ total: exports.length, exports }, null, 2) }] };\n }\n\n // ── routes ─────────────────────────────────────────────────────────────\n case 'routes': {\n const routes: { name: string; filePath: string; startLine: number | undefined }[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'route' || (node.kind === 'function' && /route|handler|controller/i.test(node.filePath))) {\n routes.push({ name: node.name, filePath: node.filePath, startLine: node.startLine });\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(routes, null, 2) }] };\n }\n\n // ── clusters ───────────────────────────────────────────────────────────\n case 'clusters': {\n const limit = (a.limit as number) ?? 50;\n const clusters: {\n id: string;\n name: string;\n memberCount: number;\n topSymbols: { name: string; kind: string }[];\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n const members: { name: string; kind: string }[] = [];\n for (const edge of graph.findEdgesTo(node.id)) {\n if (edge.kind === 'belongs_to') {\n const member = graph.getNode(edge.source);\n if (member && member.kind !== 'cluster') {\n members.push({ name: member.name, kind: member.kind });\n }\n }\n }\n clusters.push({\n id: node.id,\n name: node.name,\n memberCount: (node.metadata?.memberCount as number | undefined) ?? members.length,\n topSymbols: members.slice(0, 10),\n });\n if (clusters.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(clusters, null, 2) }] };\n }\n\n // ── flows ──────────────────────────────────────────────────────────────\n case 'flows': {\n const limit = (a.limit as number) ?? 50;\n const flows: {\n id: string;\n name: string;\n entryPoint: string | undefined;\n steps: unknown;\n stepCount: number;\n }[] = [];\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') {\n const steps = node.metadata?.steps as unknown[] | undefined;\n flows.push({\n id: node.id,\n name: node.name,\n entryPoint: node.metadata?.entryPoint as string | undefined,\n steps: steps ?? [],\n stepCount: Array.isArray(steps) ? steps.length : 0,\n });\n if (flows.length >= limit) break;\n }\n }\n return { content: [{ type: 'text', text: JSON.stringify(flows, null, 2) }] };\n }\n\n // ── detect_changes ─────────────────────────────────────────────────────\n case 'detect_changes': {\n const baseRef = (a.base_ref as string) ?? 'HEAD';\n const diffTextInput = a.diff_text as string | undefined;\n\n let diffText: string;\n const repoRoot = workspaceRoot ?? process.cwd();\n\n if (diffTextInput) {\n diffText = diffTextInput;\n } else {\n try {\n diffText = execSync(`git diff ${baseRef}`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n if (!diffText.trim()) {\n // Fall back to staged + unstaged\n diffText = execSync(`git diff HEAD`, { cwd: repoRoot, encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });\n }\n } catch {\n return { content: [{ type: 'text', text: `Could not run git diff in ${repoRoot}. Ensure the path is a Git repository.` }] };\n }\n }\n\n if (!diffText.trim()) {\n return { content: [{ type: 'text', text: 'No changes detected in git diff.' }] };\n }\n\n // Parse unified diff → { filePath, changedLines: number[] }\n const changedFiles = parseDiff(diffText);\n\n // Map changed lines to graph nodes\n const hitNodes = new Set<string>();\n for (const { filePath: changedFile, changedLines } of changedFiles) {\n for (const node of graph.allNodes()) {\n if (!node.filePath) continue;\n // Normalize path comparison (strip repo root prefix)\n const normNode = node.filePath.replace(repoRoot + '/', '').replace(repoRoot + path.sep, '');\n const normChanged = changedFile.replace(/^a\\/|^b\\//, '');\n if (!normNode.endsWith(normChanged) && !normChanged.endsWith(normNode)) continue;\n\n if (node.startLine !== undefined && node.endLine !== undefined) {\n const overlaps = changedLines.some((l) => l >= node.startLine! && l <= node.endLine!);\n if (overlaps) hitNodes.add(node.id);\n } else if (node.startLine !== undefined) {\n const overlaps = changedLines.some((l) => Math.abs(l - node.startLine!) <= 3);\n if (overlaps) hitNodes.add(node.id);\n }\n }\n }\n\n // Compute combined blast radius from all hit nodes\n const allAffected = new Set<string>();\n for (const startId of hitNodes) {\n const queue: { id: string; depth: number }[] = [{ id: startId, depth: 0 }];\n const visited = new Set<string>();\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > 5) continue;\n visited.add(id);\n allAffected.add(id);\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n const changedSymbols = [...hitNodes].map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const affectedSymbols = [...allAffected]\n .filter((id) => !hitNodes.has(id))\n .map((id) => {\n const n = graph.getNode(id);\n return n ? { id, name: n.name, kind: n.kind, filePath: n.filePath } : { id };\n });\n\n const risk = allAffected.size > 10 ? 'HIGH' : allAffected.size > 4 ? 'MEDIUM' : 'LOW';\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n baseRef,\n changedFiles: changedFiles.map((f) => f.filePath),\n directlyChangedSymbols: changedSymbols,\n transitivelyAffectedSymbols: affectedSymbols,\n totalAffected: allAffected.size,\n riskLevel: risk,\n }, null, 2),\n }],\n };\n }\n\n // ── raw_query ──────────────────────────────────────────────────────────\n case 'raw_query': {\n const q = a.cypher as string;\n const nameMatch = q?.match(/name\\s*=\\s*['\"]([^'\"]+)['\"]/i);\n if (nameMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.name === nameMatch[1]) results.push(node);\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n const kindMatch = q?.match(/:\\s*(\\w+)/);\n if (kindMatch) {\n const results = [];\n for (const node of graph.allNodes()) {\n if (node.kind === kindMatch[1]) results.push(node);\n if (results.length >= 50) break;\n }\n return { content: [{ type: 'text', text: JSON.stringify(results, null, 2) }] };\n }\n return { content: [{ type: 'text', text: 'Query not recognized. Use name=\\'X\\' or :kind syntax.' }] };\n }\n\n // ── group_list ─────────────────────────────────────────────────────────\n case 'group_list': {\n const groupName = a.name as string | undefined;\n if (groupName) {\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n return { content: [{ type: 'text', text: JSON.stringify(group, null, 2) }] };\n }\n const groups = listGroups();\n return {\n content: [{\n type: 'text',\n text: JSON.stringify(\n groups.map((g) => ({ name: g.name, createdAt: g.createdAt, lastSync: g.lastSync, memberCount: g.members.length, members: g.members })),\n null, 2,\n ),\n }],\n };\n }\n\n // ── group_sync ─────────────────────────────────────────────────────────\n case 'group_sync': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n if (group.members.length === 0) return { content: [{ type: 'text', text: `Group \"${groupName}\" has no members.` }] };\n\n const result = await syncGroup(group);\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n saveGroup(group);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n groupName: result.groupName,\n syncedAt: result.syncedAt,\n memberCount: result.memberCount,\n contractCount: result.contracts.length,\n linkCount: result.links.length,\n topLinks: result.links.slice(0, 20),\n }, null, 2),\n }],\n };\n }\n\n // ── group_contracts ────────────────────────────────────────────────────\n case 'group_contracts': {\n const groupName = a.name as string;\n const kindFilter = a.kind as string | undefined;\n const repoFilter = a.repo as string | undefined;\n const minConf = (a.min_confidence as number) ?? 0;\n\n const result = loadSyncResult(groupName);\n if (!result) return { content: [{ type: 'text', text: `No sync data for group \"${groupName}\". Run group_sync first.` }] };\n\n let contracts = result.contracts;\n if (kindFilter) contracts = contracts.filter((c) => c.kind === kindFilter);\n if (repoFilter) contracts = contracts.filter((c) => c.repoName === repoFilter);\n\n let links = result.links.filter((l) => l.confidence >= minConf);\n if (repoFilter) links = links.filter((l) => l.providerRepo === repoFilter || l.consumerRepo === repoFilter);\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ syncedAt: result.syncedAt, contracts, links }, null, 2),\n }],\n };\n }\n\n // ── group_query ────────────────────────────────────────────────────────\n case 'group_query': {\n const groupName = a.name as string;\n const query = a.query as string;\n const limit = (a.limit as number) ?? 10;\n\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const { perRepo, merged } = await queryGroup(group, query, limit);\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({ query, merged, perRepo }, null, 2),\n }],\n };\n }\n\n // ── group_status ───────────────────────────────────────────────────────\n case 'group_status': {\n const groupName = a.name as string;\n const group = loadGroup(groupName);\n if (!group) return { content: [{ type: 'text', text: `Group \"${groupName}\" not found.` }] };\n\n const registry = loadRegistry();\n const now = Date.now();\n\n const memberStatus = group.members.map((m) => {\n const regEntry = registry.find((r) => r.name === m.registryName);\n if (!regEntry) return { groupPath: m.groupPath, registryName: m.registryName, status: 'NOT_IN_REGISTRY' };\n\n const meta = loadMetadata(regEntry.path);\n if (!meta) return { groupPath: m.groupPath, registryName: m.registryName, repoPath: regEntry.path, status: 'NOT_INDEXED' };\n\n const ageMin = Math.round((now - new Date(meta.indexedAt).getTime()) / 60000);\n const stale = ageMin > 1440;\n return {\n groupPath: m.groupPath,\n registryName: m.registryName,\n repoPath: regEntry.path,\n indexedAt: meta.indexedAt,\n ageMinutes: ageMin,\n status: stale ? 'STALE' : 'OK',\n stats: meta.stats,\n };\n });\n\n const syncAge = group.lastSync\n ? Math.round((now - new Date(group.lastSync).getTime()) / 60000)\n : null;\n\n return {\n content: [{\n type: 'text',\n text: JSON.stringify({\n group: groupName,\n lastSync: group.lastSync ?? null,\n syncAgeMinutes: syncAge,\n members: memberStatus,\n }, null, 2),\n }],\n };\n }\n\n default:\n return { content: [{ type: 'text', text: `Unknown tool: ${name}` }] };\n }\n });\n\n // ─── Resources ─────────────────────────────────────────────────────────────\n\n server.setRequestHandler(ListResourcesRequestSchema, async () => ({\n resources: [\n { uri: `codeintel://repo/${repoName}/overview`, name: `${repoName} Overview`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/clusters`, name: `${repoName} Clusters`, mimeType: 'application/json' },\n { uri: `codeintel://repo/${repoName}/flows`, name: `${repoName} Flows`, mimeType: 'application/json' },\n ],\n }));\n\n server.setRequestHandler(ReadResourceRequestSchema, async (request) => {\n const { uri } = request.params;\n\n if (uri.endsWith('/overview')) {\n const kindCounts: Record<string, number> = {};\n for (const node of graph.allNodes()) {\n kindCounts[node.kind] = (kindCounts[node.kind] ?? 0) + 1;\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify({ repo: repoName, stats: graph.size, nodeCounts: kindCounts }) }] };\n }\n\n if (uri.endsWith('/clusters')) {\n const clusters = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') clusters.push({ id: node.id, name: node.name, memberCount: node.metadata?.memberCount });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(clusters) }] };\n }\n\n if (uri.endsWith('/flows')) {\n const flows = [];\n for (const node of graph.allNodes()) {\n if (node.kind === 'flow') flows.push({ id: node.id, name: node.name, steps: node.metadata?.steps, entryPoint: node.metadata?.entryPoint });\n }\n return { contents: [{ uri, mimeType: 'application/json', text: JSON.stringify(flows) }] };\n }\n\n throw new Error(`Unknown resource: ${uri}`);\n });\n\n return server;\n}\n\nexport async function startMcpStdio(graph: KnowledgeGraph, repoName: string, workspaceRoot?: string): Promise<void> {\n const server = createMcpServer(graph, repoName, workspaceRoot);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n\n// ─── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction findNodeByName(graph: KnowledgeGraph, name: string) {\n for (const node of graph.allNodes()) {\n if (node.name === name) return node;\n }\n return undefined;\n}\n\n/**\n * Parse a unified diff text and return a list of changed files with their\n * changed line numbers (new-file side, i.e. \"+\" lines).\n */\nfunction parseDiff(diffText: string): { filePath: string; changedLines: number[] }[] {\n const result: { filePath: string; changedLines: number[] }[] = [];\n let currentFile: string | null = null;\n let currentNewLine = 0;\n const changedLinesMap = new Map<string, number[]>();\n\n for (const raw of diffText.split('\\n')) {\n // diff --git a/src/foo.ts b/src/foo.ts OR +++ b/src/foo.ts\n const fileMatch = raw.match(/^\\+\\+\\+ b\\/(.+)/);\n if (fileMatch) {\n currentFile = fileMatch[1];\n if (!changedLinesMap.has(currentFile)) changedLinesMap.set(currentFile, []);\n continue;\n }\n\n // @@ -oldStart,oldLen +newStart,newLen @@\n const hunkMatch = raw.match(/^@@ -\\d+(?:,\\d+)? \\+(\\d+)(?:,\\d+)? @@/);\n if (hunkMatch) {\n currentNewLine = parseInt(hunkMatch[1], 10);\n continue;\n }\n\n if (!currentFile) continue;\n\n if (raw.startsWith('+') && !raw.startsWith('+++')) {\n changedLinesMap.get(currentFile)!.push(currentNewLine);\n currentNewLine++;\n } else if (raw.startsWith('-') && !raw.startsWith('---')) {\n // deleted line: don't advance new-side line counter\n } else if (!raw.startsWith('\\\\')) {\n currentNewLine++;\n }\n }\n\n for (const [filePath, changedLines] of changedLinesMap) {\n result.push({ filePath, changedLines });\n }\n return result;\n}\n","#!/usr/bin/env node\n\nimport { readFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { join, dirname } from 'node:path';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n// Resolve package.json relative to the built CLI file (dist/cli/main.js → ../../package.json)\nconst _pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8')) as { version: string };\n\nimport { Command } from 'commander';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport Logger from '../shared/logger.js';\nimport { createKnowledgeGraph } from '../graph/knowledge-graph.js';\nimport { runPipeline } from '../pipeline/orchestrator.js';\nimport {\n scanPhase,\n structurePhase,\n parsePhase,\n resolvePhase,\n clusterPhase,\n flowPhase,\n} from '../pipeline/phases/index.js';\nimport { startHttpServer } from '../http/app.js';\nimport { startMcpStdio } from '../mcp-server/server.js';\nimport { textSearch } from '../search/text-search.js';\nimport type { PipelineContext } from '../pipeline/types.js';\nimport { saveMetadata, loadMetadata, getDbPath } from '../storage/metadata.js';\nimport { writeSkillFiles } from './skill-writer.js';\nimport { writeContextFiles } from './context-writer.js';\nimport { upsertRepo, loadRegistry, removeRepo } from '../storage/repo-registry.js';\nimport { DbManager, loadGraphToDB } from '../storage/index.js';\nimport { loadGraphFromDB } from '../multi-repo/graph-from-db.js';\nimport {\n loadGroup,\n saveGroup,\n listGroups,\n deleteGroup,\n groupExists,\n addMember,\n removeMember,\n saveSyncResult,\n loadSyncResult,\n} from '../multi-repo/group-registry.js';\nimport { syncGroup } from '../multi-repo/group-sync.js';\nimport { queryGroup } from '../multi-repo/group-query.js';\n\nconst program = new Command();\n\nconst BANNER = `\n ◈ Code Intelligence Platform v${_pkg.version}\n ──────────────────────────────────────────────────────────────────────────────\n Build a Knowledge Graph from source code and explore it via Web UI, HTTP API,\n CLI, and MCP server. Supports 14+ languages. Zero config.\n ──────────────────────────────────────────────────────────────────────────────\n`;\n\nprogram\n .name('code-intel')\n .description('Code Intelligence Platform — Static Analysis + Knowledge Graph')\n .version(_pkg.version)\n .addHelpText('beforeAll', BANNER)\n .addHelpText('after', `\n ┌─ Quick Start ────────────────────────────────────────────────────────────┐\n │ │\n │ code-intel setup Configure MCP for your editors │\n │ code-intel analyze Index current directory │\n │ code-intel serve Start web UI at http://localhost:4747 │\n │ code-intel search \"query\" Search the knowledge graph │\n │ code-intel inspect <symbol> Inspect a symbol's connections │\n │ code-intel impact <symbol> Show blast radius for a symbol │\n │ │\n └──────────────────────────────────────────────────────────────────────────┘\n\n ┌─ All Commands ─────────────────────────────────────────────────────────────────────────────────────────────────────┐\n │ │\n │ setup │\n │ code-intel setup Register the MCP server in your editor config (one-time) │\n │ │\n │ analyze │\n │ code-intel analyze [path] Parse source code and build the knowledge graph │\n │ code-intel analyze --force Discard the existing index and perform a full re-analysis │\n │ code-intel analyze --skills Emit per-cluster SKILL.md files under .claude/skills/code-intel/ │\n │ code-intel analyze --embeddings Build a vector index for semantic (natural-language) search │\n │ code-intel analyze --skip-embeddings Omit embedding generation for a significantly faster run │\n │ code-intel analyze --skip-agents-md Preserve any hand-edited content in AGENTS.md / CLAUDE.md │\n │ code-intel analyze --skip-git Allow analysis of directories that are not Git repositories │\n │ code-intel analyze --verbose Print every file skipped due to an unsupported parser │\n │ │\n │ server │\n │ code-intel mcp [path] Launch the MCP stdio server consumed by AI-enabled editors │\n │ code-intel serve [path] --port <n> Start the HTTP API and serve the interactive web UI (default :4747) │\n │ │\n │ registry │\n │ code-intel list Display all repositories that have been indexed │\n │ code-intel status [path] Report index freshness, symbol counts, and last-run duration │\n │ code-intel clean [path] Remove the .code-intel/ index for the specified repository │\n │ code-intel clean --all --force Permanently remove all indexed repositories (requires --force) │\n │ │\n │ exploration │\n │ code-intel search <query> Execute a BM25 keyword search across all indexed symbols │\n │ code-intel inspect <symbol> Show callers, callees, import edges, and source location │\n │ code-intel impact <symbol> Compute the transitive blast radius of a change to a symbol │\n │ │\n │ groups (multi-repo / monorepo service tracking) │\n │ code-intel group create <name> Create a named group to track multiple repositories together │\n │ code-intel group add <g> <path> <repo> Enroll an indexed repo in a group under the given hierarchy path │\n │ code-intel group remove <g> <path> Remove a repository from a group by its hierarchy path │\n │ code-intel group list [name] List all groups, or print the full membership of one group │\n │ code-intel group sync <name> Extract cross-repo contracts and resolve provider/consumer links │\n │ code-intel group contracts <name> Inspect extracted contracts and confidence-ranked cross-links │\n │ code-intel group query <name> <q> Run a merged RRF search across every repository in a group │\n │ code-intel group status <name> Audit index freshness and sync staleness for all group members │\n │ │\n └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\n\n Multi-language: TypeScript · JavaScript · Python · Java · Go · Rust · C/C++\n C# · PHP · Kotlin · Ruby · Swift · Dart\n\n Docs: https://github.com/vohongtho/code-intel-platform\n`);\n\nasync function analyzeWorkspace(targetPath: string, options?: {\n silent?: boolean;\n force?: boolean;\n skills?: boolean;\n skipEmbeddings?: boolean;\n skipAgentsMd?: boolean;\n skipGit?: boolean;\n embeddings?: boolean;\n verbose?: boolean;\n}) {\n const workspaceRoot = path.resolve(targetPath);\n if (!options?.silent) console.log(`Analyzing: ${workspaceRoot}`);\n Logger.info(`analyze started: ${workspaceRoot}`);\n\n // --force: wipe all existing DB files upfront so there's no stale state\n if (options?.force) {\n const dbPath = getDbPath(workspaceRoot);\n const { getVectorDbPath } = await import('../storage/index.js');\n const vdbPath = getVectorDbPath(workspaceRoot);\n const wipeFiles = [\n dbPath, `${dbPath}-shm`, `${dbPath}-wal`, `${dbPath}.shm`, `${dbPath}.wal`,\n vdbPath, `${vdbPath}-shm`, `${vdbPath}-wal`, `${vdbPath}.shm`, `${vdbPath}.wal`,\n ];\n for (const f of wipeFiles) {\n try { if (fs.existsSync(f)) fs.unlinkSync(f); } catch { /* ignore */ }\n }\n }\n\n // --skip-git: skip the .git check (allow non-git folders)\n if (!options?.skipGit) {\n const gitDir = path.join(workspaceRoot, '.git');\n if (!fs.existsSync(gitDir)) {\n Logger.warn(`${workspaceRoot} is not a Git repository`);\n }\n }\n\n const graph = createKnowledgeGraph();\n\n // ── Progress bar + spinner helpers ───────────────────────────────────────\n const BAR_WIDTH = 30;\n let currentPhase = '';\n function renderBar(phase: string, done: number, total: number): void {\n const pct = total > 0 ? done / total : 1;\n const filled = Math.round(pct * BAR_WIDTH);\n const bar = '█'.repeat(filled) + '░'.repeat(BAR_WIDTH - filled);\n const pctStr = (pct * 100).toFixed(0).padStart(3);\n process.stdout.write(`\\r [${phase.padEnd(9)}] ${bar} ${pctStr}% (${done}/${total})`);\n }\n function clearBar(): void {\n process.stdout.write('\\r' + ' '.repeat(70) + '\\r');\n }\n\n const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n let spinnerIdx = 0;\n let spinnerTimer: ReturnType<typeof setInterval> | null = null;\n function startSpinner(label: string): void {\n if (options?.silent) return;\n spinnerIdx = 0;\n spinnerTimer = setInterval(() => {\n process.stdout.write(`\\r ${SPINNER_FRAMES[spinnerIdx % SPINNER_FRAMES.length]} ${label}…`);\n spinnerIdx++;\n }, 80);\n }\n function stopSpinner(): void {\n if (spinnerTimer) { clearInterval(spinnerTimer); spinnerTimer = null; }\n process.stdout.write('\\r' + ' '.repeat(60) + '\\r');\n }\n\n const context: PipelineContext = {\n workspaceRoot,\n graph,\n filePaths: [],\n verbose: options?.verbose,\n onProgress: options?.silent ? undefined : (phase, msg) => {\n if (!options?.silent) {\n if (currentPhase) clearBar();\n console.log(` [${phase}] ${msg}`);\n currentPhase = '';\n }\n },\n onPhaseProgress: options?.silent ? undefined : (phase, done, total) => {\n currentPhase = phase;\n renderBar(phase, done, total);\n if (done >= total) {\n clearBar();\n currentPhase = '';\n }\n },\n };\n\n const phases = [scanPhase, structurePhase, parsePhase, resolvePhase, clusterPhase, flowPhase];\n const result = await runPipeline(phases, context);\n\n // Save metadata\n const repoName = path.basename(workspaceRoot);\n saveMetadata(workspaceRoot, {\n indexedAt: new Date().toISOString(),\n stats: {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n duration: result.totalDuration,\n },\n });\n\n upsertRepo({\n name: repoName,\n path: workspaceRoot,\n indexedAt: new Date().toISOString(),\n stats: {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n },\n });\n\n // Persist graph to LadybugDB\n startSpinner('Persisting graph to DB');\n try {\n const dbPath = getDbPath(workspaceRoot);\n // Remove stale / incompatible DB files before writing (handles both -wal and .wal suffixes)\n const staleFiles = [\n dbPath,\n `${dbPath}-shm`, `${dbPath}-wal`,\n `${dbPath}.shm`, `${dbPath}.wal`,\n ];\n for (const f of staleFiles) {\n try { if (fs.existsSync(f)) fs.unlinkSync(f); } catch { /* ignore */ }\n }\n const db = new DbManager(dbPath);\n await db.init();\n const { nodeCount, edgeCount } = await loadGraphToDB(graph, db);\n db.close();\n stopSpinner();\n Logger.info(`DB persisted: ${nodeCount} nodes, ${edgeCount} edges`);\n if (!options?.silent) {\n console.log(` ✓ DB: ${nodeCount} nodes, ${edgeCount} edges persisted`);\n }\n } catch (err) {\n stopSpinner();\n Logger.warn(`DB persist failed: ${err instanceof Error ? err.message : err}`);\n }\n\n // Vector embeddings (opt-in or --embeddings, skip if --skip-embeddings)\n const doEmbeddings = options?.embeddings && !options?.skipEmbeddings;\n if (doEmbeddings) {\n startSpinner('Building vector embeddings');\n try {\n const { embedNodes } = await import('../search/embedder.js');\n const { getVectorDbPath } = await import('../storage/index.js');\n const { VectorIndex } = await import('../search/vector-index.js');\n const vdbPath = getVectorDbPath(workspaceRoot);\n // Remove stale vector DB files before writing\n const staleVdb = [vdbPath, `${vdbPath}-shm`, `${vdbPath}-wal`, `${vdbPath}.shm`, `${vdbPath}.wal`];\n for (const f of staleVdb) {\n try { if (fs.existsSync(f)) fs.unlinkSync(f); } catch { /* ignore */ }\n }\n const vdb = new DbManager(vdbPath);\n await vdb.init();\n const idx = new VectorIndex(vdb);\n await idx.init();\n const nodes = await embedNodes(graph, {\n onProgress: (done, total) => {\n if (!options?.silent) {\n stopSpinner();\n renderBar('vector', done, total);\n if (done >= total) clearBar();\n }\n },\n });\n stopSpinner();\n Logger.info(`Embeddings built: ${nodes.length} vectors`);\n await idx.buildIndex(nodes);\n if (!options?.silent) console.log(` ✓ Embeddings: ${nodes.length} vectors built`);\n vdb.close();\n } catch (err) {\n stopSpinner();\n Logger.warn(`Embeddings failed: ${err instanceof Error ? err.message : err}`);\n }\n } else if (!options?.skipEmbeddings && !options?.silent) {\n console.log(' Embeddings: skipped (use --embeddings to enable)');\n }\n\n // Generate .claude/skills/code-intel/ skill files (always, unless --skills was set to false)\n const doSkills = options?.skills !== false;\n let skillSummaries: { name: string; label: string; symbolCount: number; fileCount: number }[] = [];\n if (doSkills) {\n startSpinner('Generating skill files');\n try {\n const { skills } = await writeSkillFiles(graph, workspaceRoot, repoName);\n skillSummaries = skills;\n stopSpinner();\n Logger.info(`Skills generated: ${skills.length}`);\n if (!options?.silent && skills.length > 0) {\n console.log(` ✓ Skills: ${skills.length} generated → .claude/skills/code-intel/`);\n }\n } catch (err) {\n stopSpinner();\n Logger.warn(`Skills generation failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n // Write AGENTS.md + CLAUDE.md context blocks\n if (!options?.skipAgentsMd) {\n startSpinner('Writing context files');\n try {\n writeContextFiles(workspaceRoot, repoName, {\n nodes: graph.size.nodes,\n edges: graph.size.edges,\n files: context.filePaths.length,\n duration: result.totalDuration,\n }, skillSummaries);\n stopSpinner();\n Logger.info('Context files written: AGENTS.md + CLAUDE.md');\n if (!options?.silent) {\n console.log(` ✓ Context: AGENTS.md + CLAUDE.md updated`);\n }\n } catch (err) {\n stopSpinner();\n Logger.warn(`Context file write failed: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n if (!options?.silent) {\n const dur = result.totalDuration;\n const durStr = dur >= 1000 ? `${(dur / 1000).toFixed(1)}s` : `${dur}ms`;\n console.log(`\\n ✅ Done in ${durStr} — ${graph.size.nodes} nodes · ${graph.size.edges} edges · ${context.filePaths.length} files`);\n }\n Logger.info(`analyze complete: ${graph.size.nodes} nodes, ${graph.size.edges} edges, ${context.filePaths.length} files, ${result.totalDuration}ms`);\n\n return { graph, result, repoName, workspaceRoot };\n}\n\n// ─── 1. setup ────────────────────────────────────────────────────────────────\nprogram\n .command('setup')\n .description('Configure MCP server for your editors (one-time setup)')\n .addHelpText('after', `\n Configure the code-intel MCP server for Claude Desktop, VS Code, or any\n editor that supports the Model Context Protocol.\n\n Auto-writes to ~/.config/claude/claude_desktop_config.json when available.\n\n Examples:\n $ code-intel setup\n`)\n .action(() => {\n const configDir = process.env.HOME ? `${process.env.HOME}/.config/claude` : null;\n\n console.log('\\n ◈ Code Intelligence — MCP Setup\\n');\n console.log(' Add the following to your editor MCP configuration:\\n');\n\n const mcpConfig = {\n mcpServers: {\n 'code-intel': {\n command: 'npx',\n args: ['@vohongtho.infotech/code-intel', 'mcp', '.'],\n },\n },\n };\n\n console.log(' Claude Desktop / Claude Code (~/.config/claude/claude_desktop_config.json)');\n console.log(' ' + JSON.stringify(mcpConfig, null, 2).split('\\n').join('\\n '));\n\n if (configDir) {\n const configFile = `${configDir}/claude_desktop_config.json`;\n try {\n let existing: Record<string, unknown> = {};\n if (fs.existsSync(configFile)) {\n existing = JSON.parse(fs.readFileSync(configFile, 'utf-8')) as Record<string, unknown>;\n }\n const merged = {\n ...existing,\n mcpServers: {\n ...(existing.mcpServers as Record<string, unknown> ?? {}),\n ...mcpConfig.mcpServers,\n },\n };\n fs.mkdirSync(configDir, { recursive: true });\n fs.writeFileSync(configFile, JSON.stringify(merged, null, 2) + '\\n', 'utf-8');\n console.log(`\\n ✅ Written to ${configFile}`);\n } catch (err) {\n Logger.warn(`\\n ⚠ Could not auto-write config: ${err instanceof Error ? err.message : err}`);\n console.log(' Please add the config above manually.');\n }\n }\n\n console.log('\\n VS Code / Cursor — add the same mcpServers block to settings.json or .vscode/mcp.json');\n console.log('\\n Next: run `code-intel analyze` inside your project to build the knowledge graph.\\n');\n });\n\n// ─── 2. analyze ──────────────────────────────────────────────────────────────\nprogram\n .command('analyze')\n .description('Index a repository and build the knowledge graph')\n .argument('[path]', 'Path to the repository (default: current directory)', '.')\n .option('--force', 'Force full re-index, ignoring cached data')\n .option('--skills', 'Generate .claude/skills/ SKILL.md files from detected clusters')\n .option('--embeddings', 'Build vector embeddings for semantic search (slower, recommended)')\n .option('--skip-embeddings', 'Skip embedding generation (faster, text-search only)')\n .option('--skip-agents-md', 'Preserve any custom edits inside AGENTS.md / CLAUDE.md')\n .option('--skip-git', 'Allow indexing directories that are not Git repositories')\n .option('--verbose', 'Log every file skipped due to missing parser support')\n .addHelpText('after', `\n Parses your source code with tree-sitter, builds a Knowledge Graph of\n symbols and their relationships, persists it to .code-intel/graph.db,\n and auto-generates AGENTS.md + CLAUDE.md context blocks.\n\n Examples:\n $ code-intel analyze Index current directory\n $ code-intel analyze ./my-project Index a specific path\n $ code-intel analyze --force Force full re-index\n $ code-intel analyze --embeddings Enable semantic (vector) search\n $ code-intel analyze --skills Generate .claude/skills/ files\n $ code-intel analyze --skip-embeddings Skip vectors for a faster run\n $ code-intel analyze --skip-agents-md Preserve your custom AGENTS.md edits\n $ code-intel analyze --skip-git Index a non-Git folder\n $ code-intel analyze --verbose Show files skipped by the parser\n`)\n .action(async (targetPath: string, opts: {\n force?: boolean;\n skills?: boolean;\n skipEmbeddings?: boolean;\n skipAgentsMd?: boolean;\n skipGit?: boolean;\n embeddings?: boolean;\n verbose?: boolean;\n }) => {\n await analyzeWorkspace(targetPath, {\n force: opts.force,\n skills: opts.skills,\n skipEmbeddings: opts.skipEmbeddings,\n skipAgentsMd: opts.skipAgentsMd,\n skipGit: opts.skipGit,\n embeddings: opts.embeddings,\n verbose: opts.verbose,\n });\n });\n\n// ─── 3. mcp ──────────────────────────────────────────────────────────────────\nprogram\n .command('mcp')\n .description('Start MCP server over stdio — exposes all tools to your AI editor')\n .argument('[path]', 'Path to analyze (default: current directory)', '.')\n .addHelpText('after', `\n Starts the Model Context Protocol server over stdio transport.\n Your editor (Claude Desktop, VS Code, Cursor, etc.) connects to it\n and gains access to search, inspect, blast-radius, and flow tools.\n\n Typically invoked automatically by your editor via the config from \\`code-intel setup\\`.\n\n Examples:\n $ code-intel mcp\n $ code-intel mcp ./my-project\n`)\n .action(async (targetPath: string) => {\n const workspaceRoot = path.resolve(targetPath);\n const repoName = path.basename(workspaceRoot);\n const dbPath = getDbPath(workspaceRoot);\n const existingIndex = fs.existsSync(dbPath) && loadMetadata(workspaceRoot) !== null;\n\n if (existingIndex) {\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n await startMcpStdio(graph, repoName, workspaceRoot);\n } else {\n const { graph, repoName: name, workspaceRoot: root } = await analyzeWorkspace(targetPath, { silent: true });\n await startMcpStdio(graph, name, root);\n }\n });\n\n// ─── 4. serve ────────────────────────────────────────────────────────────────\nprogram\n .command('serve')\n .description('Start the local HTTP server + web UI for graph exploration')\n .argument('[path]', 'Path to analyze (default: current directory)', '.')\n .option('-p, --port <port>', 'Port to listen on', '4747')\n .option('--force', 'Force re-analysis even if an index already exists')\n .addHelpText('after', `\n If a .code-intel/graph.db index already exists for the path, the server\n loads the persisted graph directly and starts immediately — no re-analysis.\n Use --force to discard the existing index and re-analyze from scratch.\n\n The web UI offers:\n · Force-directed Knowledge Graph with color-coded node types\n · BM25 text search + optional semantic (vector) search\n · Node detail panel: callers, callees, blast radius, source preview\n · AI Code Chat grounded on your codebase\n · Multi-repo group view (if groups are configured)\n\n Examples:\n $ code-intel serve\n $ code-intel serve ./my-project\n $ code-intel serve --port 8080\n $ code-intel serve --force\n`)\n .action(async (targetPath: string, options: { port: string; force?: boolean }) => {\n const workspaceRoot = path.resolve(targetPath);\n const repoName = path.basename(workspaceRoot);\n const dbPath = getDbPath(workspaceRoot);\n const existingIndex = !options.force && fs.existsSync(dbPath) && loadMetadata(workspaceRoot) !== null;\n\n if (existingIndex) {\n // Load graph from persisted DB — no re-analysis needed\n console.log(`Loading index: ${workspaceRoot}`);\n const meta = loadMetadata(workspaceRoot)!;\n console.log(` ◈ ${meta.stats.nodes} nodes · ${meta.stats.edges} edges · ${meta.stats.files} files (indexed ${meta.indexedAt})`);\n const graph = createKnowledgeGraph();\n const db = new DbManager(dbPath);\n await db.init();\n await loadGraphFromDB(graph, db);\n db.close();\n startHttpServer(graph, repoName, parseInt(options.port, 10), workspaceRoot);\n } else {\n // No index or --force: run full analysis then serve\n const { graph, workspaceRoot: root, repoName: name } = await analyzeWorkspace(targetPath, { force: options.force });\n startHttpServer(graph, name, parseInt(options.port, 10), root);\n }\n });\n\n// ─── 5. list ─────────────────────────────────────────────────────────────────\nprogram\n .command('list')\n .description('List all indexed repositories in the registry')\n .addHelpText('after', `\n Shows every repository that has been indexed with \\`code-intel analyze\\`.\n Useful for checking what is available before using \\`code-intel group add\\`.\n\n Examples:\n $ code-intel list\n`)\n .action(() => {\n const repos = loadRegistry();\n if (repos.length === 0) {\n console.log('\\n No indexed repositories found.');\n console.log(' Run `code-intel analyze <path>` to index a project.\\n');\n return;\n }\n console.log(`\\n Indexed repositories (${repos.length}):\\n`);\n for (const r of repos) {\n console.log(` ◆ ${r.name}`);\n console.log(` Nodes: ${r.stats.nodes} · Edges: ${r.stats.edges} · Files: ${r.stats.files}`);\n console.log(` Path: ${r.path}`);\n console.log(` Indexed: ${r.indexedAt}\\n`);\n }\n });\n\n// ─── 6. status ───────────────────────────────────────────────────────────────\nprogram\n .command('status')\n .description('Show index freshness and statistics for a repository')\n .argument('[path]', 'Path to check (default: current directory)', '.')\n .addHelpText('after', `\n Reads the metadata from .code-intel/meta.json and reports when the index\n was last built and how many symbols were found.\n\n Examples:\n $ code-intel status\n $ code-intel status ./my-project\n`)\n .action((targetPath: string) => {\n const workspaceRoot = path.resolve(targetPath);\n const meta = loadMetadata(workspaceRoot);\n if (!meta) {\n console.log(`\\n ✗ ${workspaceRoot} is not indexed.`);\n console.log(' Run `code-intel analyze` to build the index.\\n');\n return;\n }\n console.log(`\\n ◈ Index status — ${workspaceRoot}\\n`);\n console.log(` Indexed at : ${meta.indexedAt}`);\n console.log(` Nodes : ${meta.stats.nodes}`);\n console.log(` Edges : ${meta.stats.edges}`);\n console.log(` Files : ${meta.stats.files}`);\n console.log(` Duration : ${meta.stats.duration}ms\\n`);\n });\n\n// ─── 7. clean ────────────────────────────────────────────────────────────────\nprogram\n .command('clean')\n .description('Remove the knowledge graph index for a repository')\n .argument('[path]', 'Path to clean (default: current directory)', '.')\n .option('--all', 'Remove indexes for ALL indexed repositories')\n .option('--force', 'Required with --all to confirm the destructive operation')\n .addHelpText('after', `\n Deletes the .code-intel/ directory and removes the entry from the registry.\n\n ⚠ --all --force is irreversible — it deletes every indexed repo's data.\n\n Examples:\n $ code-intel clean Remove index for current directory\n $ code-intel clean ./my-project Remove index for a specific path\n $ code-intel clean --all --force Remove ALL indexes (requires --force)\n`)\n .action((targetPath: string, opts: { all?: boolean; force?: boolean }) => {\n if (opts.all) {\n if (!opts.force) {\n console.error('\\n ✗ --all requires --force to confirm the destructive operation.');\n console.error(' Run: code-intel clean --all --force\\n');\n process.exit(1);\n }\n const repos = loadRegistry();\n if (repos.length === 0) {\n console.log('\\n No indexed repositories to clean.\\n');\n return;\n }\n for (const r of repos) {\n const codeIntelDir = path.join(r.path, '.code-intel');\n if (fs.existsSync(codeIntelDir)) {\n fs.rmSync(codeIntelDir, { recursive: true, force: true });\n console.log(` ✓ Removed ${codeIntelDir}`);\n }\n removeRepo(r.path);\n }\n console.log(`\\n Cleaned ${repos.length} repositor${repos.length === 1 ? 'y' : 'ies'}.\\n`);\n return;\n }\n\n const workspaceRoot = path.resolve(targetPath);\n const codeIntelDir = path.join(workspaceRoot, '.code-intel');\n if (fs.existsSync(codeIntelDir)) {\n fs.rmSync(codeIntelDir, { recursive: true, force: true });\n console.log(`\\n ✓ Removed ${codeIntelDir}`);\n }\n removeRepo(workspaceRoot);\n console.log(' Index cleaned.\\n');\n });\n\n// ─── 8. search ───────────────────────────────────────────────────────────────\nprogram\n .command('search')\n .description('Search the knowledge graph for symbols matching a query')\n .argument('<query>', 'Search query (name, kind, or partial match)')\n .option('-l, --limit <n>', 'Maximum number of results', '20')\n .option('-p, --path <path>', 'Path to the repository (default: current directory)', '.')\n .addHelpText('after', `\n Runs BM25 text search across all indexed symbols — functions, classes,\n files, routes, interfaces, and more.\n\n Examples:\n $ code-intel search \"handleRequest\"\n $ code-intel search \"auth\" --limit 10\n $ code-intel search \"UserService\" --path ./backend\n`)\n .action(async (query: string, options: { limit: string; path: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n const results = textSearch(graph, query, parseInt(options.limit, 10));\n if (results.length === 0) {\n console.log(`\\n No results found for \"${query}\".\\n`);\n return;\n }\n console.log(`\\n ${results.length} result(s) for \"${query}\":\\n`);\n for (const r of results) {\n console.log(` ${r.kind.padEnd(14)} ${r.name.padEnd(32)} ${r.filePath}`);\n }\n console.log('');\n });\n\n// ─── 9. inspect ──────────────────────────────────────────────────────────────\nprogram\n .command('inspect')\n .description('Inspect a symbol — show callers, callees, file location, and export status')\n .argument('<symbol>', 'Exact symbol name to inspect')\n .option('-p, --path <path>', 'Path to the repository (default: current directory)', '.')\n .addHelpText('after', `\n Finds the symbol in the knowledge graph and prints its full connection\n profile: where it lives, who calls it, and what it calls.\n\n Use this before renaming a symbol to understand its blast radius.\n\n Examples:\n $ code-intel inspect runPipeline\n $ code-intel inspect ApiClient --path ./frontend\n`)\n .action(async (symbol: string, options: { path: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n\n let found = false;\n for (const node of graph.allNodes()) {\n if (node.name === symbol) {\n found = true;\n console.log(`\\n ◆ ${node.kind}: ${node.name}`);\n console.log(` File : ${node.filePath}:${node.startLine ?? '?'}`);\n console.log(` Exported : ${node.exported ?? 'unknown'}`);\n\n const incoming = [...graph.findEdgesTo(node.id)];\n const outgoing = [...graph.findEdgesFrom(node.id)];\n const callers = incoming.filter((e) => e.kind === 'calls');\n const callees = outgoing.filter((e) => e.kind === 'calls');\n\n if (callers.length > 0) {\n console.log(`\\n Callers (${callers.length}):`);\n for (const c of callers.slice(0, 10)) {\n const n = graph.getNode(c.source);\n console.log(` ← ${n?.name ?? c.source} (${n?.filePath})`);\n }\n if (callers.length > 10) console.log(` … and ${callers.length - 10} more`);\n }\n if (callees.length > 0) {\n console.log(`\\n Callees (${callees.length}):`);\n for (const c of callees.slice(0, 10)) {\n const n = graph.getNode(c.target);\n console.log(` → ${n?.name ?? c.target} (${n?.filePath})`);\n }\n if (callees.length > 10) console.log(` … and ${callees.length - 10} more`);\n }\n console.log('');\n break;\n }\n }\n\n if (!found) {\n console.log(`\\n Symbol \"${symbol}\" not found.`);\n console.log(` Try: code-intel search \"${symbol}\"\\n`);\n }\n });\n\n// ─── 10. impact ──────────────────────────────────────────────────────────────\nprogram\n .command('impact')\n .description('Show the blast radius — all symbols that break if this one changes')\n .argument('<symbol>', 'Symbol name to analyse')\n .option('-p, --path <path>', 'Path to the repository (default: current directory)', '.')\n .option('-d, --depth <n>', 'Maximum traversal depth (hops)', '5')\n .addHelpText('after', `\n Traverses the call graph upward from the target symbol, collecting every\n symbol that transitively depends on it via calls or imports.\n\n ⚠ If impact shows ≥ 5 direct callers, treat the change as HIGH risk.\n\n Examples:\n $ code-intel impact runPipeline\n $ code-intel impact ApiClient --depth 3\n $ code-intel impact UserService --path ./backend\n`)\n .action(async (symbol: string, options: { path: string; depth: string }) => {\n const { graph } = await analyzeWorkspace(options.path, { silent: true });\n const maxHops = parseInt(options.depth, 10);\n\n let targetNode = null;\n for (const node of graph.allNodes()) {\n if (node.name === symbol) { targetNode = node; break; }\n }\n if (!targetNode) {\n console.log(`\\n Symbol \"${symbol}\" not found.`);\n console.log(` Try: code-intel search \"${symbol}\"\\n`);\n return;\n }\n\n const affected = new Set<string>();\n const queue: { id: string; depth: number }[] = [{ id: targetNode.id, depth: 0 }];\n const visited = new Set<string>();\n\n while (queue.length > 0) {\n const { id, depth } = queue.shift()!;\n if (visited.has(id) || depth > maxHops) continue;\n visited.add(id);\n affected.add(id);\n for (const edge of graph.findEdgesTo(id)) {\n if (edge.kind === 'calls' || edge.kind === 'imports') {\n queue.push({ id: edge.source, depth: depth + 1 });\n }\n }\n }\n\n const risk = affected.size > 10 ? '⚠ HIGH' : affected.size > 5 ? '⚡ MEDIUM' : '✓ LOW';\n console.log(`\\n ◈ Blast radius for \"${symbol}\"\\n`);\n console.log(` Affected symbols : ${affected.size}`);\n console.log(` Risk level : ${risk}\\n`);\n for (const id of affected) {\n const n = graph.getNode(id);\n if (n) console.log(` ${n.kind.padEnd(14)} ${n.name.padEnd(32)} ${n.filePath}`);\n }\n console.log('');\n });\n\n// ─── 11. group ───────────────────────────────────────────────────────────────\nconst groupCmd = program\n .command('group')\n .description('Manage repository groups for multi-repo / monorepo service tracking')\n .addHelpText('after', `\n Repository groups let you track contracts (exports, routes, schemas, events)\n across multiple indexed repos and detect cross-repo dependencies automatically.\n\n Subcommands:\n create <name> Create a new group\n add <group> <groupPath> <registry> Add a repo to the group\n remove <group> <groupPath> Remove a repo from the group\n list [name] List all groups or inspect one\n sync <name> Extract contracts + detect cross-links\n contracts <name> View extracted contracts and links\n query <name> <q> Search across all repos in the group\n status <name> Check index freshness of group members\n\n Examples:\n $ code-intel group create my-platform\n $ code-intel group add my-platform services/auth auth-service\n $ code-intel group sync my-platform\n $ code-intel group contracts my-platform --kind route\n`);\n\n// group create <name>\ngroupCmd\n .command('create <name>')\n .description('Create a new repository group')\n .addHelpText('after', `\n Examples:\n $ code-intel group create my-platform\n $ code-intel group create hr-services\n`)\n .action((name: string) => {\n if (groupExists(name)) {\n console.error(`\\n ✗ Group \"${name}\" already exists.\\n`);\n process.exit(1);\n }\n saveGroup({ name, createdAt: new Date().toISOString(), members: [] });\n console.log(`\\n ✅ Group \"${name}\" created.`);\n console.log(` Add repos with: code-intel group add ${name} <groupPath> <registryName>\\n`);\n });\n\n// group add <group> <groupPath> <registryName>\ngroupCmd\n .command('add <group> <groupPath> <registryName>')\n .description('Add an indexed repository to a group at the given hierarchy path')\n .addHelpText('after', `\n <groupPath> Dot-separated or slash-separated hierarchy path, e.g. hr/hiring/backend\n <registryName> The repo's name as shown by \\`code-intel list\\`\n\n Examples:\n $ code-intel group add my-platform services/auth auth-service\n $ code-intel group add my-platform services/payments payments-api\n $ code-intel group add my-platform frontend web-app\n`)\n .action((group: string, groupPath: string, registryName: string) => {\n const registry = loadRegistry();\n const regEntry = registry.find((r) => r.name === registryName);\n if (!regEntry) {\n console.error(`\\n ✗ Registry entry \"${registryName}\" not found.`);\n console.error(` Run \\`code-intel list\\` to see available repos.\\n`);\n process.exit(1);\n }\n if (!groupExists(group)) {\n console.error(`\\n ✗ Group \"${group}\" does not exist.`);\n console.error(` Create it first: code-intel group create ${group}\\n`);\n process.exit(1);\n }\n addMember(group, { groupPath, registryName });\n console.log(`\\n ✅ Added \"${registryName}\" → group \"${group}\" at path \"${groupPath}\"\\n`);\n });\n\n// group remove <group> <groupPath>\ngroupCmd\n .command('remove <group> <groupPath>')\n .description('Remove a repository from a group by its hierarchy path')\n .addHelpText('after', `\n Examples:\n $ code-intel group remove my-platform services/auth\n`)\n .action((group: string, groupPath: string) => {\n if (!groupExists(group)) {\n console.error(`\\n ✗ Group \"${group}\" does not exist.\\n`);\n process.exit(1);\n }\n try {\n removeMember(group, groupPath);\n console.log(`\\n ✅ Removed \"${groupPath}\" from group \"${group}\"\\n`);\n } catch (err) {\n console.error(`\\n ✗ ${err instanceof Error ? err.message : err}\\n`);\n process.exit(1);\n }\n });\n\n// group list [name]\ngroupCmd\n .command('list [name]')\n .description('List all groups, or show the full config of one group')\n .addHelpText('after', `\n Examples:\n $ code-intel group list\n $ code-intel group list my-platform\n`)\n .action((name?: string) => {\n if (name) {\n const group = loadGroup(name);\n if (!group) {\n console.error(`\\n ✗ Group \"${name}\" not found.\\n`);\n process.exit(1);\n }\n console.log(`\\n ◈ Group: ${group.name}`);\n console.log(` Created : ${group.createdAt}`);\n if (group.lastSync) console.log(` Last sync: ${group.lastSync}`);\n console.log(`\\n Members (${group.members.length}):`);\n if (group.members.length === 0) {\n console.log(' (none — use `code-intel group add` to add repos)');\n } else {\n for (const m of group.members) {\n console.log(` ${m.groupPath.padEnd(35)} → ${m.registryName}`);\n }\n }\n console.log('');\n } else {\n const groups = listGroups();\n if (groups.length === 0) {\n console.log('\\n No groups found.');\n console.log(' Create one with: code-intel group create <name>\\n');\n return;\n }\n console.log(`\\n Repository groups (${groups.length}):\\n`);\n for (const g of groups) {\n const sync = g.lastSync ? `synced ${g.lastSync}` : 'never synced';\n console.log(` ◆ ${g.name.padEnd(25)} ${g.members.length} member(s) [${sync}]`);\n }\n console.log('');\n }\n });\n\n// group sync <name>\ngroupCmd\n .command('sync <name>')\n .description('Extract contracts and detect cross-repo dependencies in a group')\n .addHelpText('after', `\n Scans every member repo's knowledge graph for exported symbols, routes,\n schemas, and events, then cross-matches names across repos to find\n likely provider → consumer relationships.\n\n Examples:\n $ code-intel group sync my-platform\n`)\n .action(async (name: string) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`\\n ✗ Group \"${name}\" not found.\\n`);\n process.exit(1);\n }\n if (group.members.length === 0) {\n console.error(`\\n ✗ Group \"${name}\" has no members.`);\n console.error(` Add repos with \\`code-intel group add\\`.\\n`);\n process.exit(1);\n }\n\n console.log(`\\n ⟳ Syncing group \"${name}\" (${group.members.length} member(s))…\\n`);\n const result = await syncGroup(group);\n\n saveSyncResult(result);\n group.lastSync = result.syncedAt;\n saveGroup(group);\n\n console.log(` ✅ Sync complete\\n`);\n console.log(` Repos synced : ${result.memberCount}`);\n console.log(` Contracts : ${result.contracts.length}`);\n console.log(` Cross-links : ${result.links.length}`);\n\n if (result.links.length > 0) {\n console.log(`\\n Top cross-repo links:\\n`);\n for (const link of result.links.slice(0, 10)) {\n const conf = (link.confidence * 100).toFixed(0).padStart(3);\n console.log(` ${conf}% ${link.providerRepo} ∷ ${link.providerContract.padEnd(30)} ↔ ${link.consumerRepo} ∷ ${link.consumerContract}`);\n }\n if (result.links.length > 10) {\n console.log(`\\n … and ${result.links.length - 10} more. Run \\`code-intel group contracts ${name}\\` for full details.`);\n }\n }\n console.log('');\n });\n\n// group contracts <name>\ngroupCmd\n .command('contracts <name>')\n .description('Inspect extracted contracts and cross-links from the last sync')\n .option('--kind <kind>', 'Filter by contract kind: export | route | schema | event')\n .option('--repo <repo>', 'Filter by registry name')\n .option('--min-confidence <pct>', 'Minimum link confidence 0–100 (default: 0)', '0')\n .addHelpText('after', `\n Examples:\n $ code-intel group contracts my-platform\n $ code-intel group contracts my-platform --kind route\n $ code-intel group contracts my-platform --repo auth-service --min-confidence 70\n`)\n .action((name: string, opts: { kind?: string; repo?: string; minConfidence: string }) => {\n const result = loadSyncResult(name);\n if (!result) {\n console.error(`\\n ✗ No sync data for group \"${name}\".`);\n console.error(` Run: code-intel group sync ${name}\\n`);\n process.exit(1);\n }\n\n const minConf = parseInt(opts.minConfidence, 10) / 100;\n\n let contracts = result.contracts;\n if (opts.kind) contracts = contracts.filter((c) => c.kind === opts.kind);\n if (opts.repo) contracts = contracts.filter((c) => c.repoName === opts.repo);\n\n let links = result.links.filter((l) => l.confidence >= minConf);\n if (opts.repo) links = links.filter((l) => l.providerRepo === opts.repo || l.consumerRepo === opts.repo);\n\n console.log(`\\n ◈ Group \"${name}\" — synced ${result.syncedAt}\\n`);\n\n console.log(` Contracts (${contracts.length}):\\n`);\n for (const c of contracts) {\n const sig = c.signature ? ` ${c.signature.slice(0, 55)}` : '';\n console.log(` [${c.kind.padEnd(6)}] ${c.repoName.padEnd(22)} ${c.name.padEnd(35)}${sig}`);\n }\n\n console.log(`\\n Cross-repo links (${links.length}):\\n`);\n if (links.length === 0) {\n console.log(' (none)');\n } else {\n for (const link of links) {\n const conf = (link.confidence * 100).toFixed(0).padStart(3);\n console.log(` ${conf}% [${link.matchKind}] ${link.providerRepo} ∷ ${link.providerContract.padEnd(30)} ↔ ${link.consumerRepo} ∷ ${link.consumerContract}`);\n }\n }\n console.log('');\n });\n\n// group query <name> <q>\ngroupCmd\n .command('query <name> <q>')\n .description('Search execution flows across all repos in a group')\n .option('-l, --limit <n>', 'Max results per repo', '10')\n .addHelpText('after', `\n Uses BM25 search within each member repo's graph, then merges the results\n using Reciprocal Rank Fusion (RRF) for a unified ranked list.\n\n Examples:\n $ code-intel group query my-platform \"handlePayment\"\n $ code-intel group query my-platform \"UserAuth\" --limit 5\n`)\n .action(async (name: string, q: string, opts: { limit: string }) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`\\n ✗ Group \"${name}\" not found.\\n`);\n process.exit(1);\n }\n\n console.log(`\\n ◈ Querying group \"${name}\" for: \"${q}\"\\n`);\n const limit = parseInt(opts.limit, 10);\n const { perRepo, merged } = await queryGroup(group, q, limit);\n\n if (merged.length === 0) {\n console.log(' No results found across any repo in this group.\\n');\n return;\n }\n\n console.log(` Merged results (${merged.length}, ranked by RRF):\\n`);\n for (const r of merged) {\n console.log(` ${r.kind.padEnd(14)} ${r.name.padEnd(32)} ${r.filePath}`);\n if (r.snippet) console.log(` ${r.snippet.slice(0, 95)}`);\n }\n\n console.log(`\\n Per-repo breakdown:\\n`);\n for (const rr of perRepo) {\n console.log(` ${rr.repoName.padEnd(25)} (${rr.groupPath}) → ${rr.results.length} result(s)`);\n }\n console.log('');\n });\n\n// group status <name>\ngroupCmd\n .command('status <name>')\n .description('Check index freshness and sync status of all repos in a group')\n .addHelpText('after', `\n Examples:\n $ code-intel group status my-platform\n`)\n .action((name: string) => {\n const group = loadGroup(name);\n if (!group) {\n console.error(`\\n ✗ Group \"${name}\" not found.\\n`);\n process.exit(1);\n }\n\n const registry = loadRegistry();\n const now = Date.now();\n\n console.log(`\\n ◈ Group \"${name}\" — status\\n`);\n if (group.lastSync) {\n const age = Math.round((now - new Date(group.lastSync).getTime()) / 60000);\n console.log(` Last sync : ${group.lastSync} (${age} min ago)`);\n } else {\n console.log(` Last sync : never → run \\`code-intel group sync ${name}\\``);\n }\n console.log(`\\n Members (${group.members.length}):\\n`);\n\n for (const m of group.members) {\n const regEntry = registry.find((r) => r.name === m.registryName);\n if (!regEntry) {\n console.log(` ✗ ${m.groupPath.padEnd(35)} [${m.registryName}] — NOT IN REGISTRY`);\n continue;\n }\n\n const metaPath = path.join(regEntry.path, '.code-intel', 'meta.json');\n try {\n const meta = JSON.parse(fs.readFileSync(metaPath, 'utf-8')) as { indexedAt: string; stats: { nodes: number; edges: number; files: number } };\n const indexedAt = meta.indexedAt;\n const ageMin = Math.round((now - new Date(indexedAt).getTime()) / 60000);\n const stale = ageMin > 1440 ? ' ⚠ STALE (>24h)' : '';\n console.log(` ✓ ${m.groupPath.padEnd(35)} [${m.registryName}]${stale}`);\n console.log(` indexed ${indexedAt} (${ageMin} min ago)`);\n console.log(` ${meta.stats.nodes} nodes · ${meta.stats.edges} edges · ${meta.stats.files} files`);\n console.log(` ${regEntry.path}\\n`);\n } catch {\n console.log(` ✗ ${m.groupPath.padEnd(35)} [${m.registryName}] — NOT INDEXED`);\n console.log(` run: code-intel analyze ${regEntry.path}\\n`);\n }\n }\n });\n\nprogram.parse();\n","/**\n * Skill file writer — generates .claude/skills/code-intel/ SKILL.md files\n * from the knowledge graph clusters, giving AI assistants structured,\n * high-accuracy context for each functional area of the codebase.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { KnowledgeGraph } from '../graph/knowledge-graph.js';\nimport type { CodeNode, CodeEdge } from '../shared/index.js';\n\nexport interface SkillSummary {\n name: string;\n label: string;\n symbolCount: number;\n fileCount: number;\n}\n\ninterface AreaInfo {\n label: string;\n dir: string;\n nodes: CodeNode[];\n files: Map<string, CodeNode[]>; // relPath -> nodes\n entryPoints: CodeNode[]; // exported, not called by others\n hotNodes: { node: CodeNode; inDeg: number; outDeg: number }[]; // highest degree\n callEdgesInArea: number; // density signal\n flowIds: string[];\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\nexport async function writeSkillFiles(\n graph: KnowledgeGraph,\n workspaceRoot: string,\n projectName: string,\n): Promise<{ skills: SkillSummary[]; outputDir: string }> {\n const outputDir = path.join(workspaceRoot, '.claude', 'skills', 'code-intel');\n\n const areas = buildAreaMap(graph, workspaceRoot);\n if (areas.length === 0) return { skills: [], outputDir };\n\n fs.rmSync(outputDir, { recursive: true, force: true });\n fs.mkdirSync(outputDir, { recursive: true });\n\n const skills: SkillSummary[] = [];\n const usedNames = new Set<string>();\n\n for (const area of areas) {\n const kebab = uniqueKebab(area.label, usedNames);\n usedNames.add(kebab);\n\n const content = renderSkill(area, projectName, kebab);\n const dir = path.join(outputDir, kebab);\n fs.mkdirSync(dir, { recursive: true });\n fs.writeFileSync(path.join(dir, 'SKILL.md'), content, 'utf-8');\n\n skills.push({ name: kebab, label: area.label, symbolCount: area.nodes.length, fileCount: area.files.size });\n }\n\n return { skills, outputDir };\n}\n\n// ---------------------------------------------------------------------------\n// Build area map from cluster nodes\n// ---------------------------------------------------------------------------\n\nfunction buildAreaMap(graph: KnowledgeGraph, workspaceRoot: string): AreaInfo[] {\n // Index cluster labels\n const clusterLabel = new Map<string, string>();\n const clusterMembers = new Map<string, CodeNode[]>();\n\n for (const node of graph.allNodes()) {\n if (node.kind === 'cluster') {\n clusterLabel.set(node.id, node.name);\n clusterMembers.set(node.id, []);\n }\n }\n\n // Assign members via belongs_to\n for (const edge of graph.findEdgesByKind('belongs_to')) {\n const bucket = clusterMembers.get(edge.target);\n const node = graph.getNode(edge.source);\n if (bucket && node) bucket.push(node);\n }\n\n // Precompute degree maps for hot-node detection\n const inDeg = new Map<string, number>();\n const outDeg = new Map<string, number>();\n const calledIds = new Set<string>();\n\n for (const edge of graph.findEdgesByKind('calls')) {\n calledIds.add(edge.target);\n inDeg.set(edge.target, (inDeg.get(edge.target) ?? 0) + 1);\n outDeg.set(edge.source, (outDeg.get(edge.source) ?? 0) + 1);\n }\n\n const areas: AreaInfo[] = [];\n\n for (const [clusterId, members] of clusterMembers) {\n if (members.length < 3) continue;\n\n const label = clusterLabel.get(clusterId) ?? 'unknown';\n const dir = members[0]?.filePath.split('/').slice(0, -1).join('/') ?? '';\n\n // Group by relative file path\n const files = new Map<string, CodeNode[]>();\n for (const n of members) {\n const rel = relPath(n.filePath, workspaceRoot);\n let list = files.get(rel);\n if (!list) { list = []; files.set(rel, list); }\n list.push(n);\n }\n\n // Entry points: exported, not called from outside, callable kinds\n const entryPoints = members\n .filter((n) => n.exported && !calledIds.has(n.id) && ['function', 'method', 'class'].includes(n.kind))\n .slice(0, 6);\n\n // Hot nodes: highest combined degree (most connected = most important)\n const memberIds = new Set(members.map((n) => n.id));\n const hotNodes = members\n .map((n) => ({ node: n, inDeg: inDeg.get(n.id) ?? 0, outDeg: outDeg.get(n.id) ?? 0 }))\n .sort((a, b) => (b.inDeg + b.outDeg) - (a.inDeg + a.outDeg))\n .slice(0, 12);\n\n // Internal call density\n let callEdgesInArea = 0;\n for (const edge of graph.findEdgesByKind('calls')) {\n if (memberIds.has(edge.source) && memberIds.has(edge.target)) callEdgesInArea++;\n }\n\n // Flows touching this area\n const flowIds: string[] = [];\n for (const node of graph.allNodes()) {\n if (node.kind !== 'flow') continue;\n const steps = node.metadata?.steps as string[] | undefined;\n if (steps?.some((s) => memberIds.has(s))) flowIds.push(node.id);\n if (flowIds.length >= 8) break;\n }\n\n areas.push({ label, dir, nodes: members, files, entryPoints, hotNodes, callEdgesInArea, flowIds });\n }\n\n areas.sort((a, b) => b.nodes.length - a.nodes.length);\n return areas.slice(0, 20);\n}\n\n// ---------------------------------------------------------------------------\n// Render optimized SKILL.md\n// ---------------------------------------------------------------------------\n\nfunction renderSkill(area: AreaInfo, projectName: string, kebabName: string): string {\n const density = area.nodes.length > 0\n ? Math.round((area.callEdgesInArea / area.nodes.length) * 10) / 10\n : 0;\n\n const topEntryNames = area.entryPoints.slice(0, 3).map((n) => n.name);\n const topHotNames = area.hotNodes.slice(0, 3).map((h) => h.node.name);\n\n // Pick best symbol names for description triggers\n const triggerNames = topEntryNames.length > 0 ? topEntryNames : topHotNames;\n const triggerStr = triggerNames.map((n) => `\\`${n}\\``).join(', ');\n\n // Dominant directory for scoping hint\n const dirs = [...area.files.keys()].map((f) => f.split('/').slice(0, -1).join('/') || '.');\n const dirCounts = new Map<string, number>();\n for (const d of dirs) dirCounts.set(d, (dirCounts.get(d) ?? 0) + 1);\n const dominantDir = [...dirCounts.entries()].sort((a, b) => b[1] - a[1])[0]?.[0] ?? area.dir;\n\n const lines: string[] = [];\n\n // --- Frontmatter ---\n const description = [\n `Covers the **${area.label}** subsystem of ${projectName}.`,\n `${area.nodes.length} symbols across ${area.files.size} files.`,\n triggerStr ? `Key symbols: ${triggerStr}.` : '',\n `Internal call density: ${density} calls/symbol.`,\n area.flowIds.length > 0 ? `Participates in ${area.flowIds.length} execution flow(s).` : '',\n ].filter(Boolean).join(' ');\n\n lines.push('---');\n lines.push(`name: ${kebabName}`);\n lines.push(`description: \"${description.replace(/\"/g, \"'\")}\"`);\n lines.push('---', '');\n\n // --- Title block ---\n lines.push(`# ${area.label}`);\n lines.push('');\n lines.push(`> **${area.nodes.length} symbols** | **${area.files.size} files** | path: \\`${dominantDir}/\\` | call density: ${density}/sym`);\n lines.push('');\n\n // --- When to Use (precise triggers for the AI) ---\n lines.push('## When to Use');\n lines.push('');\n lines.push('Load this skill when:');\n lines.push(`- The task involves code in \\`${dominantDir}/\\``);\n if (triggerStr) lines.push(`- The user mentions ${triggerStr} or asks how they work`);\n lines.push(`- Adding, modifying, or debugging ${area.label.toLowerCase()}-related functionality`);\n lines.push(`- Tracing call chains that pass through the ${area.label} layer`);\n lines.push('');\n\n // --- Key Files ---\n lines.push('## Key Files');\n lines.push('');\n lines.push('| File | Symbols | Notes |');\n lines.push('|------|---------|-------|');\n const sortedFiles = [...area.files.entries()].sort((a, b) => b[1].length - a[1].length);\n for (const [file, nodes] of sortedFiles.slice(0, 10)) {\n const exported = nodes.filter((n) => n.exported);\n const names = nodes.slice(0, 4).map((n) => `\\`${n.name}\\``).join(', ');\n const extra = nodes.length > 4 ? ` +(${nodes.length - 4})` : '';\n const note = exported.length > 0 ? `${exported.length} exported` : 'internal';\n lines.push(`| \\`${file}\\` | ${names}${extra} | ${note} |`);\n }\n lines.push('');\n\n // --- Entry Points ---\n if (area.entryPoints.length > 0) {\n lines.push('## Entry Points');\n lines.push('');\n lines.push('Start exploration here — exported symbols with no external callers:');\n lines.push('');\n for (const ep of area.entryPoints) {\n const loc = ep.startLine ? `:${ep.startLine}` : '';\n lines.push(`- **\\`${ep.name}\\`** \\`(${ep.kind})\\` → \\`${ep.filePath}${loc}\\``);\n }\n lines.push('');\n }\n\n // --- Hot Symbols (most connected = highest impact) ---\n lines.push('## Hot Symbols');\n lines.push('');\n lines.push('Sorted by call graph degree (changing these has the highest blast radius):');\n lines.push('');\n lines.push('| Symbol | Kind | In ← | → Out | File |');\n lines.push('|--------|------|-----:|------:|------|');\n for (const { node: n, inDeg: i, outDeg: o } of area.hotNodes) {\n lines.push(`| \\`${n.name}\\` | ${n.kind} | ${i} | ${o} | \\`${relFile(n.filePath)}\\` |`);\n }\n lines.push('');\n\n // --- Execution Flows ---\n if (area.flowIds.length > 0) {\n lines.push('## Execution Flows');\n lines.push('');\n lines.push(`**${area.flowIds.length}** execution path(s) pass through this area.`);\n lines.push('Run `code-intel inspect <symbol>` on a hot symbol to trace the full call chain.');\n lines.push('');\n }\n\n // --- Impact Guidance ---\n lines.push('## Impact Guidance');\n lines.push('');\n lines.push('Before modifying any symbol in this area:');\n lines.push(`1. **High-degree symbols** (In ← ≥ 3) — check all callers before changing signatures`);\n lines.push(`2. **Entry points** — changes propagate to external consumers`);\n lines.push(`3. Run \\`code-intel impact <symbol>\\` to get full blast radius`);\n lines.push('');\n\n // --- Quick Commands ---\n const firstHot = area.hotNodes[0]?.node.name ?? area.nodes[0]?.name ?? area.label;\n const firstEntry = area.entryPoints[0]?.name ?? firstHot;\n lines.push('## Quick Commands');\n lines.push('');\n lines.push('```bash');\n lines.push(`# Inspect most-connected symbol`);\n lines.push(`code-intel inspect ${firstHot}`);\n lines.push(`# Blast radius for entry point`);\n lines.push(`code-intel impact ${firstEntry}`);\n lines.push(`# Search this area`);\n lines.push(`code-intel search \"${area.label.toLowerCase()}\"`);\n lines.push('```');\n lines.push('');\n\n return lines.join('\\n');\n}\n\n// ---------------------------------------------------------------------------\n// Utility helpers\n// ---------------------------------------------------------------------------\n\nfunction uniqueKebab(label: string, used: Set<string>): string {\n let base = label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 50) || 'skill';\n let candidate = base;\n let n = 2;\n while (used.has(candidate)) { candidate = `${base}-${n++}`; }\n return candidate;\n}\n\nfunction relPath(filePath: string, workspaceRoot: string): string {\n const norm = filePath.replace(/\\\\/g, '/');\n const root = workspaceRoot.replace(/\\\\/g, '/').replace(/\\/?$/, '/');\n return norm.startsWith(root) ? norm.slice(root.length) : norm.replace(/^\\//, '');\n}\n\nfunction relFile(filePath: string): string {\n const parts = filePath.replace(/\\\\/g, '/').split('/');\n return parts.slice(-2).join('/');\n}\n","/**\n * context-writer.ts\n *\n * Writes/updates AGENTS.md and CLAUDE.md at the workspace root.\n *\n * Rules:\n * 1. File does NOT exist → create a new file with a standard template that\n * includes the auto-managed block AND a clearly marked section for the\n * user's own custom content.\n *\n * 2. File ALREADY exists AND contains the markers\n * <!-- code-intel:start --> … <!-- code-intel:end -->\n * → replace ONLY the content between (and including) those markers.\n * Everything else in the file is left untouched.\n *\n * 3. File ALREADY exists but has NO markers yet\n * → append the block at the end (never overwrite existing content).\n *\n * The `--skip-agents-md` flag prevents this function from being called at all.\n */\n\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport type { SkillSummary } from './skill-writer.js';\n\nconst BLOCK_START = '<!-- code-intel:start -->';\nconst BLOCK_END = '<!-- code-intel:end -->';\n\nexport interface ContextStats {\n nodes: number;\n edges: number;\n files: number;\n duration: number;\n}\n\n// ─── Public API ──────────────────────────────────────────────────────────────\n\nexport function writeContextFiles(\n workspaceRoot: string,\n projectName: string,\n stats: ContextStats,\n skills: SkillSummary[],\n): void {\n const block = buildBlock(projectName, stats, skills);\n upsertFile(path.join(workspaceRoot, 'AGENTS.md'), block, 'AGENTS.md');\n upsertFile(path.join(workspaceRoot, 'CLAUDE.md'), block, 'CLAUDE.md');\n}\n\n// ─── Block content ────────────────────────────────────────────────────────────\n\nfunction buildBlock(\n projectName: string,\n stats: ContextStats,\n skills: SkillSummary[],\n): string {\n const skillRows = skills\n .map(\n (s) =>\n `| Work in \\`${s.label}\\` (${s.symbolCount} symbols) | \\`.claude/skills/code-intel/${s.name}/SKILL.md\\` |`,\n )\n .join('\\n');\n\n const skillTable = `| Task | Skill file |\n|------|------------|\n| Understand architecture / \"How does X work?\" | Load \\`code-intel-exploring\\` skill |\n| Blast radius / \"What breaks if I change X?\" | Load \\`code-intel-impact\\` skill |\n| Debugging / \"Why is X failing?\" | Load \\`code-intel-debugging\\` skill |\n${skillRows ? skillRows + '\\n' : ''}`;\n\n return `${BLOCK_START}\n# Code Intelligence — ${projectName}\n\n> ⚠ This section is auto-managed by \\`code-intel analyze\\`. Do **not** edit between the markers — your changes will be overwritten.\n> Add your own notes below the \\`${BLOCK_END}\\` marker.\n\nIndexed: **${stats.nodes.toLocaleString()} nodes** | **${stats.edges.toLocaleString()} edges** | **${stats.files} files** | analyzed in ${(stats.duration / 1000).toFixed(1)}s\n\n> Index stale? Re-run: \\`code-intel analyze\\`\n\n## Always Do\n\n- **Before editing any symbol**, run \\`code-intel impact <symbol>\\` to review its blast radius.\n- **Before committing**, verify scope with \\`code-intel inspect <symbol>\\`.\n- Use \\`code-intel search \"<concept>\"\\` to find related symbols instead of grepping.\n- Warn the user if impact shows ≥ 5 direct callers (**HIGH risk**).\n\n## Never Do\n\n- NEVER rename symbols with find-and-replace — use \\`code-intel inspect\\` to find all usages first.\n- NEVER ignore impact warnings — always report blast radius to the user.\n\n## CLI Quick Reference\n\n\\`\\`\\`bash\ncode-intel analyze [path] # Build / refresh the knowledge graph\ncode-intel serve [path] # Start HTTP API + Web UI on :4747\ncode-intel search <query> # Text search across all symbols\ncode-intel inspect <symbol> # Callers, callees, imports, cluster\ncode-intel impact <symbol> # Blast radius (who breaks if this changes)\ncode-intel status [path] # Index freshness and stats\ncode-intel clean [path] # Remove index data\n\\`\\`\\`\n\n## Skills\n\n${skillTable}\n${BLOCK_END}`;\n}\n\n// ─── File upsert ─────────────────────────────────────────────────────────────\n\nfunction upsertFile(filePath: string, block: string, fileName: string): void {\n // ── Case 1: file does not exist → create from template ──────────────────\n if (!fs.existsSync(filePath)) {\n const newContent = [\n `# ${fileName}`,\n '',\n block,\n '',\n '---',\n '',\n '<!-- Add your own custom notes below this line. They will never be overwritten by code-intel. -->',\n '',\n ].join('\\n');\n fs.writeFileSync(filePath, newContent, 'utf-8');\n return;\n }\n\n const existing = fs.readFileSync(filePath, 'utf-8');\n const startIdx = findLineMarker(existing, BLOCK_START);\n const endIdx = findLineMarker(existing, BLOCK_END, startIdx === -1 ? 0 : startIdx);\n\n // ── Case 2: markers found → replace only the managed block ──────────────\n if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {\n const before = existing.slice(0, startIdx);\n const after = existing.slice(endIdx + BLOCK_END.length);\n const updated = (before + block + after).trimEnd() + '\\n';\n fs.writeFileSync(filePath, updated, 'utf-8');\n return;\n }\n\n // ── Case 3: file exists but has no markers → append block ───────────────\n const appended = [\n existing.trimEnd(),\n '',\n '---',\n '',\n '<!-- The following section is auto-managed by code-intel. Do not edit between the markers. -->',\n '',\n block,\n '',\n ].join('\\n');\n fs.writeFileSync(filePath, appended, 'utf-8');\n}\n\n// ─── Helpers ─────────────────────────────────────────────────────────────────\n\n/**\n * Find a marker that occupies its own line (not embedded mid-line in prose).\n */\nfunction findLineMarker(content: string, marker: string, startFrom = 0): number {\n let idx = content.indexOf(marker, startFrom);\n while (idx !== -1) {\n const atLineStart = idx === 0 || content[idx - 1] === '\\n';\n const end = idx + marker.length;\n const atLineEnd =\n end === content.length || content[end] === '\\n' || content[end] === '\\r';\n if (atLineStart && atLineEnd) return idx;\n idx = content.indexOf(marker, idx + 1);\n }\n return -1;\n}\n"]}
|