@orquentra/codebuddy 2.7.0 → 2.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +10 -0
  2. package/dist/adapters-S4HHTWJW.js +24 -0
  3. package/dist/{chunk-EEUFU7KV.js → chunk-2WH2Q4TA.js} +180 -22
  4. package/dist/chunk-2WH2Q4TA.js.map +1 -0
  5. package/dist/{chunk-BQM7FJ7D.js → chunk-6NZEZJYD.js} +5 -3
  6. package/dist/{chunk-BQM7FJ7D.js.map → chunk-6NZEZJYD.js.map} +1 -1
  7. package/dist/{chunk-AQHPEJR6.js → chunk-ENKDFLOO.js} +2 -2
  8. package/dist/{chunk-YJIA2MFL.js → chunk-F4BJ3DXW.js} +15 -13
  9. package/dist/{chunk-YJIA2MFL.js.map → chunk-F4BJ3DXW.js.map} +1 -1
  10. package/dist/{chunk-MSUAVR3R.js → chunk-GXOML4UZ.js} +2 -2
  11. package/dist/chunk-ITQO632W.js +673 -0
  12. package/dist/chunk-ITQO632W.js.map +1 -0
  13. package/dist/chunk-J4T6HHI4.js +1444 -0
  14. package/dist/chunk-J4T6HHI4.js.map +1 -0
  15. package/dist/{chunk-AK2UAE32.js → chunk-QN76UJP7.js} +2 -2
  16. package/dist/{chunk-JUAFCLRB.js → chunk-SRA4MDVG.js} +2 -2
  17. package/dist/{chunk-JUAFCLRB.js.map → chunk-SRA4MDVG.js.map} +1 -1
  18. package/dist/{chunk-5EDGAZQN.js → chunk-TLWGZVPC.js} +64 -725
  19. package/dist/chunk-TLWGZVPC.js.map +1 -0
  20. package/dist/{chunk-LCSBL5TT.js → chunk-UK6XTS2Y.js} +5 -3
  21. package/dist/{chunk-LCSBL5TT.js.map → chunk-UK6XTS2Y.js.map} +1 -1
  22. package/dist/chunk-W7GAXL6C.js +104 -0
  23. package/dist/chunk-W7GAXL6C.js.map +1 -0
  24. package/dist/{chunk-TUR6YKEE.js → chunk-YN7TEIUH.js} +1 -1
  25. package/dist/chunk-YN7TEIUH.js.map +1 -0
  26. package/dist/cli/index.js +4 -4
  27. package/dist/index.js +9 -8
  28. package/dist/install-BXM56QCD.js +19 -0
  29. package/dist/{lean-command-CWJAVQ5G.js → lean-command-7DFW32MA.js} +4 -3
  30. package/dist/{main-AHNGHC4L.js → main-YJKSYFPT.js} +1422 -1772
  31. package/dist/main-YJKSYFPT.js.map +1 -0
  32. package/dist/{operations-7BTAAUHF.js → operations-OG4ISWIM.js} +3 -3
  33. package/dist/{pretool-command-3SXQSMAO.js → pretool-command-PRFOIHMW.js} +3 -3
  34. package/dist/{runtime-E7JQZ2BZ.js → runtime-GCSEIAVD.js} +7 -6
  35. package/dist/{summaries-XV3JGGCC.js → summaries-ML53R7EL.js} +4 -3
  36. package/dist/summaries-ML53R7EL.js.map +1 -0
  37. package/dist/{zvec-KP4KNB7Y.js → zvec-XDZNZ2OL.js} +4 -3
  38. package/dist/zvec-XDZNZ2OL.js.map +1 -0
  39. package/package.json +1 -1
  40. package/dist/chunk-5EDGAZQN.js.map +0 -1
  41. package/dist/chunk-EEUFU7KV.js.map +0 -1
  42. package/dist/chunk-TUR6YKEE.js.map +0 -1
  43. package/dist/main-AHNGHC4L.js.map +0 -1
  44. /package/dist/{lean-command-CWJAVQ5G.js.map → adapters-S4HHTWJW.js.map} +0 -0
  45. /package/dist/{chunk-AQHPEJR6.js.map → chunk-ENKDFLOO.js.map} +0 -0
  46. /package/dist/{chunk-MSUAVR3R.js.map → chunk-GXOML4UZ.js.map} +0 -0
  47. /package/dist/{chunk-AK2UAE32.js.map → chunk-QN76UJP7.js.map} +0 -0
  48. /package/dist/{operations-7BTAAUHF.js.map → install-BXM56QCD.js.map} +0 -0
  49. /package/dist/{pretool-command-3SXQSMAO.js.map → lean-command-7DFW32MA.js.map} +0 -0
  50. /package/dist/{runtime-E7JQZ2BZ.js.map → operations-OG4ISWIM.js.map} +0 -0
  51. /package/dist/{summaries-XV3JGGCC.js.map → pretool-command-PRFOIHMW.js.map} +0 -0
  52. /package/dist/{zvec-KP4KNB7Y.js.map → runtime-GCSEIAVD.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/map/indexer.ts","../src/indexer/engine.ts","../src/map/cache.ts","../src/indexer/store.ts","../src/indexer/types.ts","../src/indexer/scan.ts","../src/indexer/summary.ts"],"sourcesContent":["import { readdir, readFile, stat } from \"node:fs/promises\";\nimport { dirname, extname, join, relative, resolve } from \"node:path\";\nimport { extractPythonImports } from \"../indexer/python.js\";\nimport type { ArchitectureMap, MapQuery, ModuleEdge, ModuleNode } from \"./types.js\";\n\nconst SUPPORTED_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".py\"]);\nconst IGNORED_DIRECTORIES = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".codebuddy\",\n // Python virtualenvs and caches would otherwise map site-packages.\n \".venv\",\n \"venv\",\n \".tox\",\n \"__pycache__\",\n]);\n\nexport async function buildArchitectureMap(\n repositoryRoot = process.cwd(),\n): Promise<ArchitectureMap> {\n const root = resolve(repositoryRoot);\n const files = await listSourceFiles(root);\n const fileSet = new Set(files.map((file) => normalize(relative(root, file))));\n const modules: ModuleNode[] = [];\n const edges: ModuleEdge[] = [];\n\n for (const absolutePath of files) {\n const source = await readFile(absolutePath, \"utf8\");\n const from = normalize(relative(root, absolutePath));\n const resolvedImports = moduleImports(root, from, source, fileSet);\n edges.push(...resolvedImports.map(({ to, kind }) => ({ from, to, kind })));\n modules.push({\n path: from,\n language: moduleLanguage(from),\n imports: [...new Set(resolvedImports.map(({ to }) => to))].sort(),\n });\n }\n\n return {\n modules: modules.sort((left, right) => left.path.localeCompare(right.path)),\n edges: edges.sort((left, right) =>\n `${left.from}:${left.to}`.localeCompare(`${right.from}:${right.to}`),\n ),\n };\n}\n\nexport type IncrementalMapStats = { readFiles: number; reusedFiles: number; rebuilt: boolean };\n\n/** Build or update a map from an already-known source file set. */\nexport async function updateArchitectureMap(\n repositoryRoot: string,\n sourcePaths: string[],\n previous: ArchitectureMap | null,\n changedPaths: string[],\n): Promise<{ map: ArchitectureMap; stats: IncrementalMapStats }> {\n const root = resolve(repositoryRoot);\n const normalizedPaths = sourcePaths.map(normalize).sort();\n const fileSet = new Set(normalizedPaths);\n const changed = new Set(changedPaths.map(normalize));\n const retainedModules = (previous?.modules ?? []).filter(\n (module) => fileSet.has(module.path) && !changed.has(module.path),\n );\n const retainedEdges = (previous?.edges ?? []).filter(\n (edge) => fileSet.has(edge.from) && fileSet.has(edge.to) && !changed.has(edge.from),\n );\n const modules = [...retainedModules];\n const edges = [...retainedEdges];\n\n for (const path of normalizedPaths) {\n if (!changed.has(path)) continue;\n const source = await readFile(join(root, path), \"utf8\");\n const resolvedImports = moduleImports(root, path, source, fileSet);\n edges.push(...resolvedImports.map(({ to, kind }) => ({ from: path, to, kind })));\n modules.push({\n path,\n language: moduleLanguage(path),\n imports: [...new Set(resolvedImports.map(({ to }) => to))].sort(),\n });\n }\n\n return {\n map: {\n modules: modules.sort((left, right) => left.path.localeCompare(right.path)),\n edges: edges.sort((left, right) =>\n `${left.from}:${left.to}`.localeCompare(`${right.from}:${right.to}`),\n ),\n },\n stats: {\n readFiles: changed.size,\n reusedFiles: retainedModules.length,\n rebuilt: previous === null || changed.size === normalizedPaths.length,\n },\n };\n}\n\nexport function queryMap(map: ArchitectureMap, query: MapQuery): ModuleEdge[] {\n const limit = query.limit ?? 50;\n return map.edges\n .filter((edge) => (query.from ? edge.from === normalize(query.from) : true))\n .filter((edge) => (query.to ? edge.to === normalize(query.to) : true))\n .slice(0, limit);\n}\n\nexport function neighbours(\n map: ArchitectureMap,\n modulePath: string,\n direction: \"in\" | \"out\" | \"both\" = \"both\",\n): { modules: ModuleNode[]; edges: ModuleEdge[] } {\n const target = normalize(modulePath);\n const edges = map.edges.filter((edge) => {\n if (direction === \"in\") return edge.to === target;\n if (direction === \"out\") return edge.from === target;\n return edge.from === target || edge.to === target;\n });\n const paths = new Set<string>([target]);\n for (const edge of edges) {\n paths.add(edge.from);\n paths.add(edge.to);\n }\n return {\n modules: map.modules.filter((module) => paths.has(module.path)),\n edges,\n };\n}\n\nasync function listSourceFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n await walk(root, files);\n return files.sort();\n}\n\nasync function walk(directory: string, files: string[]): Promise<void> {\n const entries = await readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n const absolute = join(directory, entry.name);\n if (entry.isDirectory()) {\n if (IGNORED_DIRECTORIES.has(entry.name)) continue;\n await walk(absolute, files);\n continue;\n }\n if (!entry.isFile()) continue;\n if (!SUPPORTED_EXTENSIONS.has(extname(entry.name))) continue;\n const info = await stat(absolute);\n if (info.size > 500_000) continue;\n files.push(absolute);\n }\n}\n\nfunction moduleLanguage(path: string): ModuleNode[\"language\"] {\n const extension = extname(path);\n if (extension === \".py\") return \"py\";\n return extension.includes(\"ts\") ? \"ts\" : \"js\";\n}\n\n/** Resolved in-repo imports of one module; external specifiers yield nothing. */\nfunction moduleImports(\n root: string,\n from: string,\n source: string,\n fileSet: Set<string>,\n): Array<{ to: string; kind: ModuleEdge[\"kind\"] }> {\n if (extname(from) === \".py\") {\n return pythonImports(from, source, fileSet).map((to) => ({ to, kind: \"import\" as const }));\n }\n return extractImports(source).flatMap((specifier) => {\n const to = resolveImport(root, from, specifier.value, fileSet);\n return to ? [{ to, kind: specifier.kind }] : [];\n });\n}\n\n/** Where absolute Python imports are looked up: the repo root, then a `src/` layout. */\nconst PYTHON_ROOTS = [\"\", \"src/\"];\n\n/**\n * Python imports resolved to repo files. Absolute modules are looked up under\n * `PYTHON_ROOTS` (first root that has them wins), relative ones from the\n * importing file's package. In `from pkg import name`, a `name` that is a\n * submodule gets its own edge; other names point at the package. Anything not\n * found (stdlib, third-party) is external and yields no edge.\n */\nfunction pythonImports(from: string, source: string, fileSet: Set<string>): string[] {\n const pick = (...candidates: string[]) =>\n candidates.find((candidate) => fileSet.has(candidate)) ?? null;\n const moduleFile = (base: string) => pick(`${base}.py`, `${base}/__init__.py`);\n const packageDir = from.split(\"/\").slice(0, -1);\n const targets: string[] = [];\n for (const statement of extractPythonImports(source)) {\n const parts = statement.module ? statement.module.split(\".\") : [];\n let bases: string[];\n if (statement.level > 0) {\n const up = statement.level - 1;\n if (up > packageDir.length) continue;\n bases = [[...packageDir.slice(0, packageDir.length - up), ...parts].join(\"/\")];\n } else {\n bases = PYTHON_ROOTS.map((prefix) => `${prefix}${parts.join(\"/\")}`);\n }\n for (const base of bases) {\n const prefix = base ? `${base}/` : \"\";\n // `from . import x` names the package itself, which only an __init__ can be.\n const module = parts.length > 0 ? moduleFile(base) : pick(`${prefix}__init__.py`);\n const submodules = statement.names.flatMap((name) => moduleFile(`${prefix}${name}`) ?? []);\n if (!module && submodules.length === 0) continue;\n targets.push(...submodules);\n if (module && submodules.length < Math.max(1, statement.names.length)) targets.push(module);\n break;\n }\n }\n return [...new Set(targets)].filter((target) => target !== from);\n}\n\nfunction extractImports(source: string): Array<{ value: string; kind: ModuleEdge[\"kind\"] }> {\n const imports: Array<{ value: string; kind: ModuleEdge[\"kind\"] }> = [];\n // Strip line/block comments first so quoted specifiers inside comments can't\n // fabricate phantom edges in the architecture map.\n const stripped = source.replace(/\\/\\*[\\s\\S]*?\\*\\//g, \" \").replace(/(^|[^:])\\/\\/[^\\n]*/g, \"$1 \");\n const staticImport = /\\bimport\\s+(?:type\\s+)?(?:[^'\"()+]+?\\s+from\\s+)?[\"']([^\"']+)[\"']/g;\n const exportFrom = /\\bexport\\s+[^'\"()+]+?\\s+from\\s+[\"']([^\"']+)[\"']/g;\n const dynamicImport = /\\bimport\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g;\n\n for (const match of stripped.matchAll(staticImport)) {\n if (match[1]) imports.push({ value: match[1], kind: \"import\" });\n }\n for (const match of stripped.matchAll(exportFrom)) {\n if (match[1]) imports.push({ value: match[1], kind: \"import\" });\n }\n for (const match of stripped.matchAll(dynamicImport)) {\n if (match[1]) imports.push({ value: match[1], kind: \"dynamic_import\" });\n }\n return imports;\n}\n\nfunction resolveImport(\n root: string,\n from: string,\n specifier: string,\n fileSet: Set<string>,\n): string | null {\n if (!specifier.startsWith(\".\")) return null;\n const base = normalize(relative(root, resolve(root, dirname(from), specifier)));\n // ESM specifiers point at emitted JS (`./x.js`), but the source on disk is\n // often `./x.ts`. Try the specifier EXACTLY as written first (so a real\n // `x.js` file wins when both `x.ts` and `x.js` exist), then fall back to the\n // extension-stripped stem for the TS-source case.\n const stem = base.replace(/\\.(js|jsx|mjs|cjs)$/, \"\");\n const bases = stem === base ? [base] : [base, stem];\n const candidates = bases.flatMap((b) => [\n b,\n `${b}.ts`,\n `${b}.tsx`,\n `${b}.js`,\n `${b}.jsx`,\n `${b}.mjs`,\n `${b}.cjs`,\n `${b}/index.ts`,\n `${b}/index.tsx`,\n `${b}/index.js`,\n `${b}/index.jsx`,\n ]);\n return candidates.find((candidate) => fileSet.has(candidate)) ?? null;\n}\n\nfunction normalize(path: string): string {\n return path.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n","import { createHash } from \"node:crypto\";\nimport type { Stats } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { refreshArchitectureCache } from \"../map/cache.js\";\nimport { listIndexableFiles } from \"./scan.js\";\nimport { emptyManifest, IndexStore } from \"./store.js\";\nimport { summarizeSource } from \"./summary.js\";\nimport { extractSymbolTable, supportsSymbols } from \"./symbols.js\";\nimport {\n INDEX_MANIFEST_VERSION,\n type IndexEntry,\n type IndexError,\n type IndexManifest,\n type IndexResult,\n} from \"./types.js\";\n\n/**\n * Incremental repository indexing. A file is re-summarized only when its\n * content hash differs from the manifest, so repeated runs over an unchanged\n * tree are cheap and deterministic. A file whose size, mtime and ctime still\n * match the entry is not even re-read. Per-file failures (unreadable, too\n * large) are isolated and reported; they never abort the pass. `full` ignores\n * existing hashes and rebuilds every entry.\n *\n * The same pass doubles as use-time validation (`loadFreshIndex`): context\n * tools run it before trusting indexed symbols, summaries or imports, so a CLI\n * or hook process with no watcher still sees current source.\n */\n\n/** Skip files larger than this — summarizing them is neither cheap nor useful. */\nconst MAX_FILE_BYTES = 512_000;\n/**\n * Files changed this recently are always re-hashed: a second edit inside a\n * coarse mtime tick could otherwise keep the same size and timestamps.\n */\nconst RACY_WINDOW_MS = 3_000;\n\nexport type IndexOptions = {\n repositoryRoot?: string;\n full?: boolean;\n /** Injectable clock for deterministic tests. */\n now?: () => Date;\n};\n\nexport async function indexRepository(options: IndexOptions = {}): Promise<IndexResult> {\n return (await refreshIndex(options)).result;\n}\n\nexport type FreshIndex = {\n manifest: IndexManifest;\n /** One `index:` explain line: how the manifest compared with current source. */\n explain: string;\n};\n\n/**\n * The manifest, validated against current source right now. Changed files are\n * re-summarized (symbols, imports), deleted ones dropped, new ones added, and\n * the result is persisted so the next call takes the metadata fast path. Never\n * throws: if validation fails the stored manifest is returned with a reason.\n */\nexport async function loadFreshIndex(repositoryRoot: string): Promise<FreshIndex> {\n try {\n const { result, manifest } = await refreshIndex({ repositoryRoot });\n const delta = result.added + result.changed + result.removed;\n const failures =\n result.errors.length > 0\n ? `; ${result.errors.length} file(s) could not be validated and were omitted`\n : \"\";\n return {\n manifest,\n explain:\n delta === 0\n ? `index: ${result.totalIndexed} indexed file(s) match current source${failures}`\n : `index: refreshed against current source (${result.changed} changed, ${result.added} added, ${result.removed} removed; ${result.totalIndexed} indexed)${failures}`,\n };\n } catch (error) {\n return {\n manifest: emptyManifest(),\n explain: `index: freshness check failed (${(error as Error).message}); indexed evidence omitted`,\n };\n }\n}\n\n// ponytail: in-process serialization only; separate processes (hook + MCP\n// server) can still race, which the metadata check heals on the next pass.\nconst passes = new Map<string, Promise<unknown>>();\n\n/** One pass at a time per repository, so overlapping callers never interleave writes. */\nfunction refreshIndex(\n options: IndexOptions,\n): Promise<{ result: IndexResult; manifest: IndexManifest }> {\n const key = resolve(options.repositoryRoot ?? process.cwd());\n const next = (passes.get(key) ?? Promise.resolve())\n .catch(() => undefined)\n .then(() => runIndexPass(options));\n passes.set(key, next);\n void next\n .finally(() => {\n if (passes.get(key) === next) passes.delete(key);\n })\n .catch(() => undefined);\n return next;\n}\n\nasync function runIndexPass(\n options: IndexOptions,\n): Promise<{ result: IndexResult; manifest: IndexManifest }> {\n const start = Date.now();\n const now = options.now ?? (() => new Date());\n const repositoryRoot = resolve(options.repositoryRoot ?? process.cwd());\n const store = new IndexStore(repositoryRoot);\n\n const [files, previous] = await Promise.all([listIndexableFiles(repositoryRoot), store.read()]);\n\n const entries: Record<string, IndexEntry> = {};\n const errors: IndexError[] = [];\n let added = 0;\n let changed = 0;\n let unchanged = 0;\n let skipped = 0;\n // A never-written manifest is persisted even when the tree is empty.\n let dirty = previous.generatedAt === emptyManifest().generatedAt;\n\n for (const path of files) {\n try {\n const info = await stat(join(repositoryRoot, path));\n if (!info.isFile()) continue;\n if (info.size > MAX_FILE_BYTES) {\n skipped++;\n continue;\n }\n\n const existing = previous.entries[path];\n if (!options.full && existing && statUnchanged(existing, info)) {\n entries[path] = existing;\n unchanged++;\n continue;\n }\n\n const content = await readFile(join(repositoryRoot, path), \"utf8\");\n const hash = hashContent(content);\n const metadata = trustedMetadata(info);\n dirty = true;\n\n if (!options.full && existing && existing.hash === hash) {\n const { mtimeMs: _mtime, ctimeMs: _ctime, ...rest } = existing;\n entries[path] = { ...rest, size: info.size, ...metadata };\n unchanged++;\n continue;\n }\n\n const { language, lines, symbols, summary } = summarizeSource(path, content);\n const symbolTable = supportsSymbols(path) ? extractSymbolTable(content, path) : [];\n entries[path] = {\n path,\n hash,\n size: info.size,\n ...metadata,\n language,\n lines,\n symbols,\n ...(symbolTable.length > 0 ? { symbolTable } : {}),\n summary,\n indexedAt: now().toISOString(),\n };\n if (existing) changed++;\n else added++;\n } catch (error) {\n errors.push({ path, error: (error as Error).message });\n skipped++;\n }\n }\n\n const removed = Object.keys(previous.entries).filter((path) => !(path in entries)).length;\n\n const manifest: IndexManifest = {\n version: INDEX_MANIFEST_VERSION,\n generatedAt: now().toISOString(),\n entries: sortEntries(entries),\n };\n if (dirty || removed > 0) await store.write(manifest);\n const architecture = await refreshArchitectureCache(repositoryRoot, manifest);\n\n const result: IndexResult = {\n scanned: files.length,\n added,\n changed,\n unchanged,\n removed,\n skipped,\n errors,\n durationMs: Date.now() - start,\n totalIndexed: Object.keys(entries).length,\n architecture: {\n source: architecture.source,\n readFiles: architecture.stats.readFiles,\n reusedFiles: architecture.stats.reusedFiles,\n },\n };\n return { result, manifest };\n}\n\nfunction statUnchanged(entry: IndexEntry, info: Stats): boolean {\n return (\n entry.mtimeMs !== undefined &&\n entry.size === info.size &&\n entry.mtimeMs === info.mtimeMs &&\n entry.ctimeMs === info.ctimeMs\n );\n}\n\n/** Stat metadata worth trusting later, or nothing while the file is still racy. */\nfunction trustedMetadata(info: Stats): { mtimeMs?: number; ctimeMs?: number } {\n if (Date.now() - Math.max(info.mtimeMs, info.ctimeMs) < RACY_WINDOW_MS) return {};\n return { mtimeMs: info.mtimeMs, ctimeMs: info.ctimeMs };\n}\n\nexport function hashContent(content: string): string {\n return createHash(\"sha256\").update(content, \"utf8\").digest(\"hex\");\n}\n\nfunction sortEntries(entries: Record<string, IndexEntry>): Record<string, IndexEntry> {\n return Object.fromEntries(\n Object.keys(entries)\n .sort()\n .map((key) => [key, entries[key] as IndexEntry]),\n );\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { dirname, extname, join, resolve } from \"node:path\";\nimport { assertNoSymlinkBetween, writeAtomic } from \"../core/markdown-store-fs.js\";\nimport { IndexStore } from \"../indexer/store.js\";\nimport type { IndexManifest } from \"../indexer/types.js\";\nimport {\n buildArchitectureMap,\n type IncrementalMapStats,\n updateArchitectureMap,\n} from \"./indexer.js\";\nimport type { ArchitectureMap } from \"./types.js\";\n\nconst CACHE_VERSION = 1;\nconst SOURCE_EXTENSIONS = new Set([\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\", \".py\"]);\n\ntype ArchitectureCache = {\n version: 1;\n generatedAt: string;\n sourceHashes: Record<string, string>;\n map: ArchitectureMap;\n};\n\nexport type CachedArchitectureResult = {\n map: ArchitectureMap;\n stats: IncrementalMapStats;\n source: \"cache\" | \"incremental\" | \"rebuild\" | \"fallback\";\n};\n\nexport async function loadArchitectureMap(\n repositoryRoot = process.cwd(),\n suppliedManifest?: IndexManifest,\n): Promise<CachedArchitectureResult> {\n const root = resolve(repositoryRoot);\n const manifest = suppliedManifest ?? (await new IndexStore(root).read());\n if (Object.keys(manifest.entries).length === 0) {\n const map = await buildArchitectureMap(root);\n return {\n map,\n stats: { readFiles: map.modules.length, reusedFiles: 0, rebuilt: true },\n source: \"fallback\",\n };\n }\n return refreshArchitectureCache(root, manifest);\n}\n\nexport async function refreshArchitectureCache(\n repositoryRoot: string,\n manifest: IndexManifest,\n): Promise<CachedArchitectureResult> {\n const root = resolve(repositoryRoot);\n const path = join(root, \".codebuddy\", \"cache\", \"architecture.json\");\n const currentHashes = sourceHashes(manifest);\n const currentPaths = Object.keys(currentHashes).sort();\n const cached = await readCache(path);\n const cachedPaths = cached ? Object.keys(cached.sourceHashes).sort() : [];\n const fileSetChanged = cachedPaths.join(\"\\n\") !== currentPaths.join(\"\\n\");\n const changedPaths =\n !cached || fileSetChanged\n ? currentPaths\n : currentPaths.filter(\n (sourcePath) => cached.sourceHashes[sourcePath] !== currentHashes[sourcePath],\n );\n\n if (cached && changedPaths.length === 0) {\n return {\n map: cached.map,\n stats: { readFiles: 0, reusedFiles: cached.map.modules.length, rebuilt: false },\n source: \"cache\",\n };\n }\n\n const updated = await updateArchitectureMap(\n root,\n currentPaths,\n fileSetChanged ? null : (cached?.map ?? null),\n changedPaths,\n );\n const next: ArchitectureCache = {\n version: CACHE_VERSION,\n generatedAt: manifest.generatedAt,\n sourceHashes: currentHashes,\n map: updated.map,\n };\n await assertNoSymlinkBetween(root, dirname(path));\n await mkdir(dirname(path), { recursive: true, mode: 0o700 });\n await writeAtomic(path, `${JSON.stringify(next, null, 2)}\\n`);\n return { ...updated, source: fileSetChanged || !cached ? \"rebuild\" : \"incremental\" };\n}\n\nasync function readCache(path: string): Promise<ArchitectureCache | null> {\n try {\n const parsed = JSON.parse(await readFile(path, \"utf8\")) as ArchitectureCache;\n if (parsed.version !== CACHE_VERSION || !parsed.map || !parsed.sourceHashes) return null;\n if (!Array.isArray(parsed.map.modules) || !Array.isArray(parsed.map.edges)) return null;\n if (\n !parsed.map.modules.every(\n (module) =>\n module &&\n typeof module.path === \"string\" &&\n typeof module.language === \"string\" &&\n Array.isArray(module.imports),\n ) ||\n !parsed.map.edges.every(\n (edge) => edge && typeof edge.from === \"string\" && typeof edge.to === \"string\",\n )\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n\nfunction sourceHashes(manifest: IndexManifest): Record<string, string> {\n return Object.fromEntries(\n Object.values(manifest.entries)\n .filter((entry) => SOURCE_EXTENSIONS.has(extname(entry.path).toLowerCase()))\n .map((entry) => [entry.path, entry.hash]),\n );\n}\n","import { mkdir, readFile } from \"node:fs/promises\";\nimport { dirname, join, resolve } from \"node:path\";\nimport { z } from \"zod\";\nimport { assertNoSymlinkBetween, writeAtomic } from \"../core/markdown-store-fs.js\";\nimport { INDEX_MANIFEST_VERSION, type IndexManifest } from \"./types.js\";\n\n/**\n * Persists the index manifest as a single JSON file under\n * `.codebuddy/cache/index.json`. `cache/` is gitignored by the project\n * scaffold, so the manifest is treated as a rebuildable derived artifact —\n * corrupt or version-mismatched manifests degrade to \"empty\" rather than\n * throwing, and a full `codebuddy index` regenerates them.\n */\n\nconst symbolSpanSchema = z.object({\n name: z.string(),\n kind: z.enum([\"function\", \"method\", \"class\", \"interface\", \"type\", \"enum\", \"const\", \"heading\"]),\n startLine: z.number().int().nonnegative(),\n endLine: z.number().int().nonnegative(),\n signature: z.string(),\n exported: z.boolean(),\n});\n\nconst entrySchema = z.object({\n path: z.string(),\n hash: z.string(),\n size: z.number().int().nonnegative(),\n mtimeMs: z.number().optional(),\n ctimeMs: z.number().optional(),\n language: z.string(),\n lines: z.number().int().nonnegative(),\n symbols: z.array(z.string()),\n symbolTable: z.array(symbolSpanSchema).optional(),\n summary: z.string(),\n indexedAt: z.string(),\n});\n\nconst manifestSchema = z.object({\n version: z.literal(INDEX_MANIFEST_VERSION),\n generatedAt: z.string(),\n entries: z.record(z.string(), entrySchema),\n});\n\nexport class IndexStore {\n readonly repositoryRoot: string;\n readonly cacheDirectory: string;\n readonly manifestPath: string;\n\n constructor(repositoryRoot = process.cwd()) {\n this.repositoryRoot = resolve(repositoryRoot);\n this.cacheDirectory = join(this.repositoryRoot, \".codebuddy\", \"cache\");\n this.manifestPath = join(this.cacheDirectory, \"index.json\");\n }\n\n /** Read the manifest, or an empty one if absent/corrupt/version-mismatched. */\n async read(): Promise<IndexManifest> {\n try {\n const raw = await readFile(this.manifestPath, \"utf8\");\n const parsed = manifestSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return emptyManifest();\n // Zod's optional() widens to `| undefined`; the parse guarantees the shape.\n return parsed.data as IndexManifest;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return emptyManifest();\n // Unreadable cache is non-fatal: rebuild from scratch.\n return emptyManifest();\n }\n }\n\n async write(manifest: IndexManifest): Promise<void> {\n await assertNoSymlinkBetween(this.repositoryRoot, dirname(this.manifestPath));\n await mkdir(this.cacheDirectory, { recursive: true, mode: 0o700 });\n await writeAtomic(this.manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`);\n }\n}\n\nexport function emptyManifest(): IndexManifest {\n return { version: INDEX_MANIFEST_VERSION, generatedAt: new Date(0).toISOString(), entries: {} };\n}\n","/**\n * Background index model (Proposal 04 Phase 04.3). The indexer builds a\n * deterministic, local-first picture of the repository — one content hash and\n * one lightweight summary per indexable file — so CodeBuddy knows something\n * useful before any memory is manually written. It is a derived *cache* under\n * `.codebuddy/cache/`, never a source of truth: deleting it and re-running\n * `codebuddy index` reproduces it exactly. No LLM is involved; summaries are\n * extracted with simple, stable heuristics.\n */\n\nimport type { SymbolSpan } from \"./symbols.js\";\n\n/** Bumped when symbol tables change shape (2: class methods; 3: Python, doc headings) so old caches rebuild. */\nexport const INDEX_MANIFEST_VERSION = 3 as const;\n\n/** One indexed file. Everything here is reproducible from the file contents. */\nexport type IndexEntry = {\n /** Repo-relative POSIX path. */\n path: string;\n /** SHA-256 of the file contents; the authoritative change-detection signal. */\n hash: string;\n /** Byte size at index time. */\n size: number;\n /**\n * File mtime/ctime observed when `hash` was taken. Recorded only once the file\n * is older than the racy window, so a matching size+mtime+ctime is a reliable\n * \"unchanged\" shortcut; when absent the file is re-hashed.\n */\n mtimeMs?: number;\n ctimeMs?: number;\n /** Coarse language tag derived from the extension (ts, js, md, py, …). */\n language: string;\n /** Line count (excluding a single trailing newline). */\n lines: number;\n /** Best-effort top-level/exported symbol names. Empty for non-code files. */\n symbols: string[];\n /**\n * Optional richer symbol table (name/kind/range/signature) for code files —\n * the basis for symbol-level context (Roadmap N.3). Absent for non-code files\n * and older manifests, so consumers must treat it as optional.\n */\n symbolTable?: SymbolSpan[];\n /** Deterministic one-line summary. */\n summary: string;\n /** ISO timestamp of when this entry was (re)computed. */\n indexedAt: string;\n};\n\nexport type IndexManifest = {\n version: typeof INDEX_MANIFEST_VERSION;\n generatedAt: string;\n /** Keyed by repo-relative POSIX path. */\n entries: Record<string, IndexEntry>;\n};\n\nexport type IndexError = {\n path: string;\n error: string;\n};\n\n/** Outcome of one indexing pass. Counts are disjoint where noted. */\nexport type IndexResult = {\n scanned: number;\n added: number;\n changed: number;\n /** Unchanged files whose summary was reused (the incremental fast path). */\n unchanged: number;\n /** Entries dropped because the file no longer exists or is now ignored. */\n removed: number;\n /** Files skipped as too large or unreadable (isolated, non-fatal). */\n skipped: number;\n errors: IndexError[];\n durationMs: number;\n totalIndexed: number;\n architecture: {\n source: \"cache\" | \"incremental\" | \"rebuild\" | \"fallback\";\n readFiles: number;\n reusedFiles: number;\n };\n};\n","import { spawn } from \"node:child_process\";\nimport { readdir } from \"node:fs/promises\";\nimport { extname, join, relative, sep } from \"node:path\";\nimport { SUPPORTED_EXTENSIONS } from \"./summary.js\";\n\n/**\n * Enumerate the repo-relative POSIX paths the indexer should consider.\n *\n * `.gitignore` respect is delegated to git itself: `git ls-files` lists tracked\n * plus untracked-but-not-ignored files, which is exactly the set a developer\n * expects to be \"in the project\". When the directory is not a git repository we\n * fall back to a plain walk with a conservative ignore list so indexing still\n * works on partially configured repos.\n *\n * CodeBuddy's own generated artifacts (`.codebuddy/`, `graphify-out/`) are\n * always excluded — the index does not index itself.\n */\n\nconst FALLBACK_IGNORED_DIRECTORIES = new Set([\n \".git\",\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".codebuddy\",\n \"graphify-out\",\n \".next\",\n \".turbo\",\n \"out\",\n \".venv\",\n \"venv\",\n \"__pycache__\",\n]);\n\nexport async function listIndexableFiles(repositoryRoot: string): Promise<string[]> {\n const tracked = await gitListFiles(repositoryRoot);\n const paths = tracked ?? (await walkFiles(repositoryRoot));\n return paths\n .map(normalize)\n .filter((path) => !path.startsWith(\".codebuddy/\") && !path.startsWith(\"graphify-out/\"))\n .filter((path) => SUPPORTED_EXTENSIONS.has(extname(path).toLowerCase()))\n .sort();\n}\n\n/** Returns null when the directory is not a git repository. */\nasync function gitListFiles(repositoryRoot: string): Promise<string[] | null> {\n // `-z`: NUL-separated and unquoted, so names with non-ASCII, quotes, tabs\n // or newlines arrive verbatim instead of C-quoted.\n const result = await runGit(repositoryRoot, [\n \"ls-files\",\n \"-z\",\n \"--cached\",\n \"--others\",\n \"--exclude-standard\",\n ]);\n if (result.code !== 0) return null;\n return result.stdout.split(\"\\0\").filter(Boolean);\n}\n\nasync function walkFiles(root: string): Promise<string[]> {\n const files: string[] = [];\n const walk = async (directory: string): Promise<void> => {\n const entries = await readdir(directory, { withFileTypes: true });\n for (const entry of entries) {\n const absolute = join(directory, entry.name);\n if (entry.isDirectory()) {\n if (FALLBACK_IGNORED_DIRECTORIES.has(entry.name)) continue;\n await walk(absolute);\n continue;\n }\n if (entry.isFile()) files.push(relative(root, absolute));\n }\n };\n await walk(root);\n return files;\n}\n\nfunction runGit(\n cwd: string,\n args: string[],\n): Promise<{ code: number; stdout: string; stderr: string }> {\n return new Promise((resolveResult) => {\n const child = spawn(\"git\", args, { cwd, stdio: [\"ignore\", \"pipe\", \"pipe\"] });\n let stdout = \"\";\n let stderr = \"\";\n // Decode as one stream so a multi-byte character split across chunks survives.\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk) => {\n stdout += String(chunk);\n });\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n // A missing git binary should degrade to the walk fallback, not crash.\n child.on(\"error\", () => resolveResult({ code: -1, stdout: \"\", stderr: \"git unavailable\" }));\n child.on(\"close\", (code) => resolveResult({ code: code ?? 0, stdout, stderr }));\n });\n}\n\n/** POSIX form; a backslash is a separator only on Windows, elsewhere part of the name. */\nfunction normalize(path: string): string {\n return (sep === \"\\\\\" ? path.replace(/\\\\/g, \"/\") : path).replace(/^\\.\\//, \"\");\n}\n","import { extname } from \"node:path\";\nimport { extractSymbolTable } from \"./symbols.js\";\n\n/**\n * Deterministic file summarization. No LLM, no network — the same file always\n * produces the same summary, which keeps the index stable across runs and easy\n * to diff. Symbol extraction is intentionally best-effort regex over source\n * text: good enough to orient an agent, cheap enough to run on every save.\n */\n\nconst LANGUAGE_BY_EXTENSION: Record<string, string> = {\n \".ts\": \"ts\",\n \".tsx\": \"tsx\",\n \".js\": \"js\",\n \".jsx\": \"jsx\",\n \".mjs\": \"js\",\n \".cjs\": \"js\",\n \".json\": \"json\",\n \".md\": \"md\",\n \".mdx\": \"md\",\n \".rst\": \"rst\",\n \".yaml\": \"yaml\",\n \".yml\": \"yaml\",\n \".toml\": \"toml\",\n \".css\": \"css\",\n \".scss\": \"scss\",\n \".html\": \"html\",\n \".py\": \"py\",\n \".go\": \"go\",\n \".rs\": \"rust\",\n \".java\": \"java\",\n \".rb\": \"ruby\",\n \".php\": \"php\",\n \".sh\": \"shell\",\n \".sql\": \"sql\",\n \".txt\": \"text\",\n};\n\n/** Extensions the indexer will read and summarize. */\nexport const SUPPORTED_EXTENSIONS = new Set(Object.keys(LANGUAGE_BY_EXTENSION));\n\nconst CODE_LANGUAGES = new Set([\"ts\", \"tsx\", \"js\", \"jsx\"]);\nconst SYMBOL_LIMIT = 8;\nconst SUMMARY_COMMENT_MAX = 80;\n\nexport function languageFor(path: string): string {\n return LANGUAGE_BY_EXTENSION[extname(path).toLowerCase()] ?? \"text\";\n}\n\nexport type FileSummary = {\n language: string;\n lines: number;\n symbols: string[];\n summary: string;\n};\n\nexport function summarizeSource(path: string, content: string): FileSummary {\n const language = languageFor(path);\n const lines = countLines(content);\n const symbols = CODE_LANGUAGES.has(language)\n ? extractSymbols(content)\n : language === \"py\"\n ? pythonPublicNames(content)\n : [];\n const summary = composeSummary(language, lines, symbols, content);\n return { language, lines, symbols, summary };\n}\n\nfunction countLines(content: string): number {\n if (content.length === 0) return 0;\n return content.replace(/\\r/g, \"\").replace(/\\n$/, \"\").split(\"\\n\").length;\n}\n\n/**\n * Pull exported/top-level symbol names from JS/TS source. Covers the common\n * `export <kind> Name` forms, `export default function Name`, and named\n * re-export braces. Order-preserving and de-duplicated.\n */\nexport function extractSymbols(content: string): string[] {\n const names: string[] = [];\n const push = (name: string | undefined) => {\n const trimmed = name?.trim();\n if (trimmed && /^[A-Za-z_$][\\w$]*$/.test(trimmed) && !names.includes(trimmed)) {\n names.push(trimmed);\n }\n };\n\n const declaration =\n /^export\\s+(?:default\\s+)?(?:async\\s+)?(?:abstract\\s+)?(?:const|let|var|function|class|interface|type|enum)\\s+([A-Za-z_$][\\w$]*)/gm;\n for (const match of content.matchAll(declaration)) push(match[1]);\n\n const namedExports = /^export\\s*\\{([^}]*)\\}/gm;\n for (const match of content.matchAll(namedExports)) {\n for (const part of (match[1] ?? \"\").split(\",\")) {\n // Handle `foo as bar` — record the exported name (`bar`).\n const alias = part.includes(\" as \") ? part.split(\" as \").pop() : part;\n push(alias);\n }\n }\n\n return names.slice(0, SYMBOL_LIMIT);\n}\n\n/** Public (no leading underscore) top-level Python names, in file order. */\nfunction pythonPublicNames(content: string): string[] {\n return extractSymbolTable(content, \"x.py\")\n .filter((symbol) => symbol.exported && symbol.kind !== \"method\")\n .map((symbol) => symbol.name)\n .slice(0, SYMBOL_LIMIT);\n}\n\nfunction composeSummary(\n language: string,\n lines: number,\n symbols: string[],\n content: string,\n): string {\n const head = `${language} • ${lines} line${lines === 1 ? \"\" : \"s\"}`;\n if (symbols.length > 0) return `${head} • exports ${symbols.join(\", \")}`;\n const comment = leadingComment(content);\n if (comment) return `${head} • ${comment}`;\n return head;\n}\n\n/** First meaningful line of a leading comment block, if any. */\nfunction leadingComment(content: string): string | null {\n for (const raw of content.split(/\\r?\\n/)) {\n const line = raw.trim();\n if (line === \"\") continue;\n const stripped = line\n .replace(/^\\/\\/+/, \"\")\n .replace(/^\\/\\*+/, \"\")\n .replace(/\\*+\\/$/, \"\")\n .replace(/^[#*]+/, \"\")\n .trim();\n if (\n line.startsWith(\"//\") ||\n line.startsWith(\"/*\") ||\n line.startsWith(\"#\") ||\n line.startsWith(\"*\")\n ) {\n if (stripped) return truncate(stripped, SUMMARY_COMMENT_MAX);\n continue;\n }\n // First non-blank line is not a comment: nothing to summarize.\n return null;\n }\n return null;\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : `${value.slice(0, max - 1)}…`;\n}\n"],"mappings":"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","names":["readFile","stat","join","resolve","mkdir","readFile","dirname","extname","join","resolve","readFile","dirname","join","resolve","resolve","join","readFile","dirname","resolve","join","dirname","mkdir","readFile","extname","readdir","extname","join","relative","extname","SUPPORTED_EXTENSIONS","extname","normalize","SUPPORTED_EXTENSIONS","extname","walk","readdir","join","relative","resolve","stat","join","readFile"]}