@eduardo-afonso/codebase-intelligence 0.1.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 (87) hide show
  1. package/README.md +147 -0
  2. package/README.pt-BR.md +147 -0
  3. package/dist/analysis/DependencyAnalyzer.d.ts +8 -0
  4. package/dist/analysis/DependencyAnalyzer.d.ts.map +1 -0
  5. package/dist/analysis/DependencyAnalyzer.js +13 -0
  6. package/dist/analysis/DependencyAnalyzer.js.map +1 -0
  7. package/dist/analysis/ImpactAnalyzer.d.ts +25 -0
  8. package/dist/analysis/ImpactAnalyzer.d.ts.map +1 -0
  9. package/dist/analysis/ImpactAnalyzer.js +41 -0
  10. package/dist/analysis/ImpactAnalyzer.js.map +1 -0
  11. package/dist/cli/Watcher.d.ts +40 -0
  12. package/dist/cli/Watcher.d.ts.map +1 -0
  13. package/dist/cli/Watcher.js +80 -0
  14. package/dist/cli/Watcher.js.map +1 -0
  15. package/dist/cli/index.d.ts +3 -0
  16. package/dist/cli/index.d.ts.map +1 -0
  17. package/dist/cli/index.js +243 -0
  18. package/dist/cli/index.js.map +1 -0
  19. package/dist/core/AnalysisCache.d.ts +43 -0
  20. package/dist/core/AnalysisCache.d.ts.map +1 -0
  21. package/dist/core/AnalysisCache.js +120 -0
  22. package/dist/core/AnalysisCache.js.map +1 -0
  23. package/dist/core/Codebase.d.ts +39 -0
  24. package/dist/core/Codebase.d.ts.map +1 -0
  25. package/dist/core/Codebase.js +122 -0
  26. package/dist/core/Codebase.js.map +1 -0
  27. package/dist/core/errors.d.ts +15 -0
  28. package/dist/core/errors.d.ts.map +1 -0
  29. package/dist/core/errors.js +29 -0
  30. package/dist/core/errors.js.map +1 -0
  31. package/dist/core/interfaces.d.ts +6 -0
  32. package/dist/core/interfaces.d.ts.map +1 -0
  33. package/dist/core/interfaces.js +2 -0
  34. package/dist/core/interfaces.js.map +1 -0
  35. package/dist/core/types.d.ts +29 -0
  36. package/dist/core/types.d.ts.map +1 -0
  37. package/dist/core/types.js +2 -0
  38. package/dist/core/types.js.map +1 -0
  39. package/dist/discovery/FileScanner.d.ts +13 -0
  40. package/dist/discovery/FileScanner.d.ts.map +1 -0
  41. package/dist/discovery/FileScanner.js +55 -0
  42. package/dist/discovery/FileScanner.js.map +1 -0
  43. package/dist/discovery/IgnoreMatcher.d.ts +11 -0
  44. package/dist/discovery/IgnoreMatcher.d.ts.map +1 -0
  45. package/dist/discovery/IgnoreMatcher.js +30 -0
  46. package/dist/discovery/IgnoreMatcher.js.map +1 -0
  47. package/dist/discovery/ProjectDetector.d.ts +17 -0
  48. package/dist/discovery/ProjectDetector.d.ts.map +1 -0
  49. package/dist/discovery/ProjectDetector.js +82 -0
  50. package/dist/discovery/ProjectDetector.js.map +1 -0
  51. package/dist/graph/DependencyGraph.d.ts +48 -0
  52. package/dist/graph/DependencyGraph.d.ts.map +1 -0
  53. package/dist/graph/DependencyGraph.js +114 -0
  54. package/dist/graph/DependencyGraph.js.map +1 -0
  55. package/dist/graph/GraphBuilder.d.ts +11 -0
  56. package/dist/graph/GraphBuilder.d.ts.map +1 -0
  57. package/dist/graph/GraphBuilder.js +22 -0
  58. package/dist/graph/GraphBuilder.js.map +1 -0
  59. package/dist/index/FileIndex.d.ts +12 -0
  60. package/dist/index/FileIndex.d.ts.map +1 -0
  61. package/dist/index/FileIndex.js +26 -0
  62. package/dist/index/FileIndex.js.map +1 -0
  63. package/dist/index/SymbolIndex.d.ts +18 -0
  64. package/dist/index/SymbolIndex.d.ts.map +1 -0
  65. package/dist/index/SymbolIndex.js +40 -0
  66. package/dist/index/SymbolIndex.js.map +1 -0
  67. package/dist/index.d.ts +8 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +4 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/parsers/Parser.d.ts +3 -0
  72. package/dist/parsers/Parser.d.ts.map +1 -0
  73. package/dist/parsers/Parser.js +2 -0
  74. package/dist/parsers/Parser.js.map +1 -0
  75. package/dist/parsers/ParserRegistry.d.ts +7 -0
  76. package/dist/parsers/ParserRegistry.d.ts.map +1 -0
  77. package/dist/parsers/ParserRegistry.js +10 -0
  78. package/dist/parsers/ParserRegistry.js.map +1 -0
  79. package/dist/parsers/typescript/TypeScriptParser.d.ts +9 -0
  80. package/dist/parsers/typescript/TypeScriptParser.d.ts.map +1 -0
  81. package/dist/parsers/typescript/TypeScriptParser.js +134 -0
  82. package/dist/parsers/typescript/TypeScriptParser.js.map +1 -0
  83. package/dist/search/CodeSearch.d.ts +20 -0
  84. package/dist/search/CodeSearch.d.ts.map +1 -0
  85. package/dist/search/CodeSearch.js +54 -0
  86. package/dist/search/CodeSearch.js.map +1 -0
  87. package/package.json +51 -0
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import { Codebase } from '../index.js';
6
+ import { CACHE_DIR_NAME } from '../core/AnalysisCache.js';
7
+ import { Watcher } from './Watcher.js';
8
+ const program = new Command();
9
+ program
10
+ .name('codebase-intelligence')
11
+ .description('CLI to analyze and understand codebases')
12
+ .version('0.1.0');
13
+ // ---- Shared helpers --------------------------------------------------
14
+ const printJson = (data) => {
15
+ console.log(JSON.stringify(data, null, 2));
16
+ };
17
+ const resolveTarget = (rawPath) => path.resolve(rawPath || '.');
18
+ const findFile = (codebase, file) => codebase.files().find(f => f.path.endsWith(file) || f.relativePath === file);
19
+ const loadAndAnalyze = async (targetPath) => {
20
+ const codebase = await Codebase.load(targetPath);
21
+ await codebase.analyze();
22
+ return codebase;
23
+ };
24
+ /** Register SIGINT handler that shuts down the watcher cleanly. */
25
+ const handleCtrlC = (watcher) => {
26
+ const cleanup = () => {
27
+ watcher.stop();
28
+ process.exit(0);
29
+ };
30
+ process.on('SIGINT', cleanup);
31
+ process.on('SIGTERM', cleanup);
32
+ };
33
+ /**
34
+ * Start a watch loop: run `action` immediately, then re-run on any change.
35
+ * Prints a separator and timestamp before each re-run.
36
+ */
37
+ const startWatch = async (targetPath, action) => {
38
+ // Initial run
39
+ let codebase = await loadAndAnalyze(targetPath);
40
+ await action(codebase, new Set());
41
+ console.error('\n[watch] Watching for changes… (Ctrl+C to stop)\n');
42
+ const watcher = new Watcher({
43
+ debounceMs: 300,
44
+ onChanged: async (changedFiles) => {
45
+ const ts = new Date().toLocaleTimeString();
46
+ console.error(`\n[watch ${ts}] ${changedFiles.size} file(s) changed — re-analysing…`);
47
+ try {
48
+ codebase = await loadAndAnalyze(targetPath);
49
+ await action(codebase, changedFiles);
50
+ }
51
+ catch (err) {
52
+ console.error('[watch] Error during re-analysis:', err.message);
53
+ }
54
+ }
55
+ });
56
+ handleCtrlC(watcher);
57
+ watcher.start(targetPath);
58
+ };
59
+ // ---- Commands --------------------------------------------------------
60
+ program
61
+ .command('analyze')
62
+ .description('Analyze the codebase and output a summary')
63
+ .argument('[path]', 'Path to the codebase', '.')
64
+ .option('-w, --watch', 'Watch for changes and re-analyse automatically')
65
+ .action(async (rawPath, opts) => {
66
+ const targetPath = resolveTarget(rawPath);
67
+ const run = (codebase, changedFiles) => {
68
+ const result = {
69
+ project: codebase.projectInfo(),
70
+ filesCount: codebase.files().length,
71
+ symbolsCount: codebase.symbols().length
72
+ };
73
+ if (changedFiles.size > 0) {
74
+ result['reanalysed'] = Array.from(changedFiles);
75
+ }
76
+ printJson(result);
77
+ };
78
+ try {
79
+ if (opts.watch) {
80
+ await startWatch(targetPath, run);
81
+ }
82
+ else {
83
+ const codebase = await loadAndAnalyze(targetPath);
84
+ run(codebase, new Set());
85
+ }
86
+ }
87
+ catch (err) {
88
+ console.error(`Error: ${err.message}`);
89
+ process.exit(1);
90
+ }
91
+ });
92
+ program
93
+ .command('search')
94
+ .description('Search for a symbol or file')
95
+ .argument('<query>', 'The search query')
96
+ .argument('[path]', 'Path to the codebase', '.')
97
+ .option('-w, --watch', 'Watch for changes and re-run automatically')
98
+ .action(async (query, rawPath, opts) => {
99
+ const targetPath = resolveTarget(rawPath);
100
+ const run = (codebase) => {
101
+ printJson(codebase.search(query));
102
+ };
103
+ try {
104
+ if (opts.watch) {
105
+ await startWatch(targetPath, (c) => run(c));
106
+ }
107
+ else {
108
+ run(await loadAndAnalyze(targetPath));
109
+ }
110
+ }
111
+ catch (err) {
112
+ console.error(`Error: ${err.message}`);
113
+ process.exit(1);
114
+ }
115
+ });
116
+ program
117
+ .command('dependencies')
118
+ .description('List dependencies of a specific file')
119
+ .argument('<file>', 'File path (relative or suffix match)')
120
+ .argument('[path]', 'Path to the codebase', '.')
121
+ .option('-w, --watch', 'Watch for changes and re-run automatically')
122
+ .action(async (file, rawPath, opts) => {
123
+ const targetPath = resolveTarget(rawPath);
124
+ const run = (codebase) => {
125
+ const cf = findFile(codebase, file);
126
+ if (!cf) {
127
+ console.error(`Error: File "${file}" not found.`);
128
+ return;
129
+ }
130
+ printJson(codebase.dependencies(cf.path));
131
+ };
132
+ try {
133
+ if (opts.watch) {
134
+ await startWatch(targetPath, (c) => run(c));
135
+ }
136
+ else {
137
+ const codebase = await loadAndAnalyze(targetPath);
138
+ const cf = findFile(codebase, file);
139
+ if (!cf) {
140
+ console.error(`Error: File "${file}" not found.`);
141
+ process.exit(1);
142
+ }
143
+ printJson(codebase.dependencies(cf.path));
144
+ }
145
+ }
146
+ catch (err) {
147
+ console.error(`Error: ${err.message}`);
148
+ process.exit(1);
149
+ }
150
+ });
151
+ program
152
+ .command('dependents')
153
+ .description('List files that depend on a specific file')
154
+ .argument('<file>', 'File path')
155
+ .argument('[path]', 'Path to the codebase', '.')
156
+ .option('-w, --watch', 'Watch for changes and re-run automatically')
157
+ .action(async (file, rawPath, opts) => {
158
+ const targetPath = resolveTarget(rawPath);
159
+ const run = (codebase) => {
160
+ const cf = findFile(codebase, file);
161
+ if (!cf) {
162
+ console.error(`Error: File "${file}" not found.`);
163
+ return;
164
+ }
165
+ printJson(codebase.dependents(cf.path));
166
+ };
167
+ try {
168
+ if (opts.watch) {
169
+ await startWatch(targetPath, (c) => run(c));
170
+ }
171
+ else {
172
+ const codebase = await loadAndAnalyze(targetPath);
173
+ const cf = findFile(codebase, file);
174
+ if (!cf) {
175
+ console.error(`Error: File "${file}" not found.`);
176
+ process.exit(1);
177
+ }
178
+ printJson(codebase.dependents(cf.path));
179
+ }
180
+ }
181
+ catch (err) {
182
+ console.error(`Error: ${err.message}`);
183
+ process.exit(1);
184
+ }
185
+ });
186
+ program
187
+ .command('impact')
188
+ .description('Analyze the impact of changing a file')
189
+ .argument('<file>', 'File path')
190
+ .argument('[path]', 'Path to the codebase', '.')
191
+ .option('-w, --watch', 'Watch for changes and re-run automatically')
192
+ .action(async (file, rawPath, opts) => {
193
+ const targetPath = resolveTarget(rawPath);
194
+ const run = (codebase) => {
195
+ const cf = findFile(codebase, file);
196
+ if (!cf) {
197
+ console.error(`Error: File "${file}" not found.`);
198
+ return;
199
+ }
200
+ printJson(codebase.impact(cf.path));
201
+ };
202
+ try {
203
+ if (opts.watch) {
204
+ await startWatch(targetPath, (c) => run(c));
205
+ }
206
+ else {
207
+ const codebase = await loadAndAnalyze(targetPath);
208
+ const cf = findFile(codebase, file);
209
+ if (!cf) {
210
+ console.error(`Error: File "${file}" not found.`);
211
+ process.exit(1);
212
+ }
213
+ printJson(codebase.impact(cf.path));
214
+ }
215
+ }
216
+ catch (err) {
217
+ console.error(`Error: ${err.message}`);
218
+ process.exit(1);
219
+ }
220
+ });
221
+ program
222
+ .command('clear-cache')
223
+ .description('Clear the analysis cache for the given codebase directory')
224
+ .argument('[path]', 'Path to the codebase', '.')
225
+ .action(async (targetPath) => {
226
+ try {
227
+ const resolvedPath = path.resolve(targetPath);
228
+ const cacheDir = path.join(resolvedPath, CACHE_DIR_NAME);
229
+ if (fs.existsSync(cacheDir)) {
230
+ fs.rmSync(cacheDir, { recursive: true, force: true });
231
+ console.log(`Cache cleared: ${cacheDir}`);
232
+ }
233
+ else {
234
+ console.log('No cache found — nothing to clear.');
235
+ }
236
+ }
237
+ catch (err) {
238
+ console.error(`Error: ${err.message}`);
239
+ process.exit(1);
240
+ }
241
+ });
242
+ program.parse();
243
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { CodeSymbol, CodeDependency } from './types.js';
2
+ export declare const CACHE_DIR_NAME = ".codebase-intelligence-cache";
3
+ export interface CachedEntry {
4
+ /** sha256 of the file content at the time it was cached */
5
+ contentHash: string;
6
+ /** mtime in ms — fast fingerprint used before hashing */
7
+ mtimeMs: number;
8
+ /** size in bytes */
9
+ size: number;
10
+ /** When this cache entry was written (for racy git detection) */
11
+ cachedAtMs: number;
12
+ symbols: CodeSymbol[];
13
+ dependencies: CodeDependency[];
14
+ }
15
+ export declare class AnalysisCache {
16
+ private store;
17
+ private readonly cacheFile;
18
+ private dirty;
19
+ constructor(projectRoot: string);
20
+ /** Compute file fingerprint — mtime+size first (cheap), hash only if needed */
21
+ static fingerprint(filePath: string): {
22
+ mtimeMs: number;
23
+ size: number;
24
+ };
25
+ static contentHash(filePath: string): string;
26
+ /**
27
+ * Returns a cached entry if the file hasn't changed (verified by mtime+size
28
+ * first, then content hash on mismatch-unlikely path).
29
+ */
30
+ get(filePath: string): CachedEntry | null;
31
+ set(filePath: string, data: {
32
+ symbols: CodeSymbol[];
33
+ dependencies: CodeDependency[];
34
+ }): void;
35
+ /** Removes entries for files that are no longer part of the project */
36
+ prune(activeFiles: Set<string>): void;
37
+ /** Persist updated entries to disk. No-op if nothing changed. */
38
+ flush(): Promise<void>;
39
+ /** Remove all cached entries for this project and delete the cache file. */
40
+ invalidate(): void;
41
+ private load;
42
+ }
43
+ //# sourceMappingURL=AnalysisCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisCache.d.ts","sourceRoot":"","sources":["../../src/core/AnalysisCache.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7D,eAAO,MAAM,cAAc,iCAAiC,CAAC;AAG7D,MAAM,WAAW,WAAW;IAC1B,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,cAAc,EAAE,CAAC;CAChC;AAUD,qBAAa,aAAa;IACxB,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAAS;IAEtB,YAAY,WAAW,EAAE,MAAM,EAI9B;IAID,+EAA+E;IAC/E,OAAc,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAG7E;IAED,OAAc,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGlD;IAID;;;OAGG;IACI,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAgC/C;IAEM,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QAAC,YAAY,EAAE,cAAc,EAAE,CAAA;KAAE,GAAG,IAAI,CAWlG;IAED,uEAAuE;IAChE,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAO3C;IAED,iEAAiE;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAED,4EAA4E;IACrE,UAAU,IAAI,IAAI,CAQxB;IAID,OAAO,CAAC,IAAI;CAYb"}
@@ -0,0 +1,120 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as crypto from 'crypto';
4
+ import { fileURLToPath } from 'url';
5
+ export const CACHE_DIR_NAME = '.codebase-intelligence-cache';
6
+ const CACHE_FILE_NAME = 'analysis.json';
7
+ // Bump this when parser logic changes to invalidate old caches
8
+ const CACHE_SCHEMA_VERSION = 'v2-parser';
9
+ export class AnalysisCache {
10
+ store;
11
+ cacheFile;
12
+ dirty = false;
13
+ constructor(projectRoot) {
14
+ const cacheDir = path.join(projectRoot, CACHE_DIR_NAME);
15
+ this.cacheFile = path.join(cacheDir, CACHE_FILE_NAME);
16
+ this.store = this.load(cacheDir);
17
+ }
18
+ // ---- Static helpers --------------------------------------------------
19
+ /** Compute file fingerprint — mtime+size first (cheap), hash only if needed */
20
+ static fingerprint(filePath) {
21
+ const stat = fs.statSync(filePath);
22
+ return { mtimeMs: stat.mtimeMs, size: stat.size };
23
+ }
24
+ static contentHash(filePath) {
25
+ const content = fs.readFileSync(filePath);
26
+ return crypto.createHash('sha256').update(content).digest('hex');
27
+ }
28
+ // ---- Core API --------------------------------------------------------
29
+ /**
30
+ * Returns a cached entry if the file hasn't changed (verified by mtime+size
31
+ * first, then content hash on mismatch-unlikely path).
32
+ */
33
+ get(filePath) {
34
+ const entry = this.store.entries[filePath];
35
+ if (!entry)
36
+ return null;
37
+ let stat;
38
+ try {
39
+ stat = fs.statSync(filePath);
40
+ }
41
+ catch {
42
+ return null; // file deleted
43
+ }
44
+ // Fast path: mtime and size match → trust the cache
45
+ if (stat.mtimeMs === entry.mtimeMs && stat.size === entry.size) {
46
+ // Racy git mitigation: if the file was modified very close to when it was cached,
47
+ // the mtime resolution might hide a subsequent quick write. Force hash check.
48
+ const isRacy = Math.abs(stat.mtimeMs - entry.cachedAtMs) < 2000;
49
+ if (!isRacy) {
50
+ return entry;
51
+ }
52
+ }
53
+ // Slow path: mtime changed (e.g. save without content change) → verify hash
54
+ const currentHash = AnalysisCache.contentHash(filePath);
55
+ if (currentHash === entry.contentHash) {
56
+ // Update fingerprint so next hit is fast again
57
+ entry.mtimeMs = stat.mtimeMs;
58
+ entry.size = stat.size;
59
+ this.dirty = true;
60
+ return entry;
61
+ }
62
+ return null; // content changed — cache miss
63
+ }
64
+ set(filePath, data) {
65
+ const { mtimeMs, size } = AnalysisCache.fingerprint(filePath);
66
+ const contentHash = AnalysisCache.contentHash(filePath);
67
+ this.store.entries[filePath] = {
68
+ contentHash,
69
+ mtimeMs,
70
+ size,
71
+ cachedAtMs: Date.now(),
72
+ ...data
73
+ };
74
+ this.dirty = true;
75
+ }
76
+ /** Removes entries for files that are no longer part of the project */
77
+ prune(activeFiles) {
78
+ for (const filePath of Object.keys(this.store.entries)) {
79
+ if (!activeFiles.has(filePath)) {
80
+ delete this.store.entries[filePath];
81
+ this.dirty = true;
82
+ }
83
+ }
84
+ }
85
+ /** Persist updated entries to disk. No-op if nothing changed. */
86
+ async flush() {
87
+ if (!this.dirty)
88
+ return;
89
+ const cacheDir = path.dirname(this.cacheFile);
90
+ fs.mkdirSync(cacheDir, { recursive: true });
91
+ fs.writeFileSync(this.cacheFile, JSON.stringify(this.store, null, 2), 'utf8');
92
+ this.dirty = false;
93
+ }
94
+ /** Remove all cached entries for this project and delete the cache file. */
95
+ invalidate() {
96
+ this.store = { version: CACHE_SCHEMA_VERSION, entries: {} };
97
+ this.dirty = false;
98
+ try {
99
+ fs.rmSync(path.dirname(this.cacheFile), { recursive: true, force: true });
100
+ }
101
+ catch {
102
+ // ignore — might not exist yet
103
+ }
104
+ }
105
+ // ---- Private ---------------------------------------------------------
106
+ load(cacheDir) {
107
+ try {
108
+ const raw = fs.readFileSync(this.cacheFile, 'utf8');
109
+ const parsed = JSON.parse(raw);
110
+ if (parsed.version !== CACHE_SCHEMA_VERSION) {
111
+ return { version: CACHE_SCHEMA_VERSION, entries: {} };
112
+ }
113
+ return parsed;
114
+ }
115
+ catch {
116
+ return { version: CACHE_SCHEMA_VERSION, entries: {} };
117
+ }
118
+ }
119
+ }
120
+ //# sourceMappingURL=AnalysisCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnalysisCache.js","sourceRoot":"","sources":["../../src/core/AnalysisCache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { DependencyGraph } from '../graph/DependencyGraph.js';
2
+ import type { CodebaseFile, CodeSymbol } from './types.js';
3
+ import type { ProjectInfo } from '../discovery/ProjectDetector.js';
4
+ import type { SearchResult, SearchOptions } from '../search/CodeSearch.js';
5
+ import type { ImpactResult } from '../analysis/ImpactAnalyzer.js';
6
+ export interface CodebaseOptions {
7
+ ignore?: string[];
8
+ /** Enable on-disk caching of parse results. Defaults to true. */
9
+ cache?: boolean;
10
+ }
11
+ export declare class Codebase {
12
+ private _files;
13
+ private _projectInfo;
14
+ private _fileIndex;
15
+ private _symbolIndex;
16
+ private _graph;
17
+ private _analyzed;
18
+ private _cache;
19
+ private readonly cwd;
20
+ private readonly options;
21
+ private constructor();
22
+ static load(cwd: string, options?: CodebaseOptions): Promise<Codebase>;
23
+ analyze(): Promise<void>;
24
+ files(): CodebaseFile[];
25
+ symbols(): CodeSymbol[];
26
+ projectInfo(): ProjectInfo | null;
27
+ graph(): DependencyGraph;
28
+ search(query: string, options?: SearchOptions): SearchResult[];
29
+ dependencies(file: string): string[];
30
+ dependents(file: string): string[];
31
+ impact(file: string): ImpactResult;
32
+ isAnalyzed(): boolean;
33
+ /**
34
+ * Deletes the on-disk cache for this codebase.
35
+ * Subsequent calls to analyze() will re-parse all files.
36
+ */
37
+ invalidateCache(): void;
38
+ }
39
+ //# sourceMappingURL=Codebase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Codebase.d.ts","sourceRoot":"","sources":["../../src/core/Codebase.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEnE,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAG3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,iEAAiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,qBAAa,QAAQ;IACnB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAAmB;IACrC,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAA8B;IAE5C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAE1C,OAAO,eAGN;IAID,OAAoB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAqBtF;IAIY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CA2CpC;IAIM,KAAK,IAAI,YAAY,EAAE,CAE7B;IAEM,OAAO,IAAI,UAAU,EAAE,CAE7B;IAEM,WAAW,IAAI,WAAW,GAAG,IAAI,CAEvC;IAEM,KAAK,IAAI,eAAe,CAE9B;IAEM,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY,EAAE,CAGxE;IAEM,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAE1C;IAEM,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAExC;IAEM,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAExC;IAEM,UAAU,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACI,eAAe,IAAI,IAAI,CAG7B;CACF"}
@@ -0,0 +1,122 @@
1
+ import * as path from 'path';
2
+ import { FileScanner } from '../discovery/FileScanner.js';
3
+ import { ProjectDetector } from '../discovery/ProjectDetector.js';
4
+ import { TypeScriptParser } from '../parsers/typescript/TypeScriptParser.js';
5
+ import { ParserRegistry } from '../parsers/ParserRegistry.js';
6
+ import { FileIndex } from '../index/FileIndex.js';
7
+ import { SymbolIndex } from '../index/SymbolIndex.js';
8
+ import { DependencyGraph } from '../graph/DependencyGraph.js';
9
+ import { GraphBuilder } from '../graph/GraphBuilder.js';
10
+ import { CodeSearch } from '../search/CodeSearch.js';
11
+ import { DependencyAnalyzer } from '../analysis/DependencyAnalyzer.js';
12
+ import { ImpactAnalyzer } from '../analysis/ImpactAnalyzer.js';
13
+ import { AnalysisCache } from './AnalysisCache.js';
14
+ export class Codebase {
15
+ _files = [];
16
+ _projectInfo = null;
17
+ _fileIndex = new FileIndex();
18
+ _symbolIndex = new SymbolIndex();
19
+ _graph = new DependencyGraph();
20
+ _analyzed = false;
21
+ _cache = null;
22
+ cwd;
23
+ options;
24
+ constructor(cwd, options) {
25
+ this.cwd = path.resolve(cwd);
26
+ this.options = options;
27
+ }
28
+ // ---- Factory --------------------------------------------------------
29
+ static async load(cwd, options = {}) {
30
+ const instance = new Codebase(cwd, options);
31
+ const scannerOptions = options.ignore
32
+ ? { cwd: instance.cwd, extraIgnores: options.ignore }
33
+ : { cwd: instance.cwd };
34
+ const scanner = new FileScanner(scannerOptions);
35
+ instance._files = await scanner.scan();
36
+ const detector = new ProjectDetector(instance.cwd, instance._files);
37
+ instance._projectInfo = await detector.detect();
38
+ instance._fileIndex.addAll(instance._files);
39
+ // Initialise cache unless explicitly disabled
40
+ const useCache = options.cache !== false;
41
+ if (useCache) {
42
+ instance._cache = new AnalysisCache(instance.cwd);
43
+ }
44
+ return instance;
45
+ }
46
+ // ---- Analysis -------------------------------------------------------
47
+ async analyze() {
48
+ const registry = new ParserRegistry();
49
+ registry.register(new TypeScriptParser());
50
+ const allDependencies = [];
51
+ for (const file of this._files) {
52
+ const parser = registry.getParser(file.language);
53
+ if (!parser)
54
+ continue;
55
+ // Cache hit?
56
+ const cached = this._cache?.get(file.path) ?? null;
57
+ if (cached) {
58
+ this._symbolIndex.addAll(cached.symbols);
59
+ allDependencies.push(...cached.dependencies);
60
+ continue;
61
+ }
62
+ // Cache miss — parse and store result
63
+ try {
64
+ const parsed = await parser.parse(file.path);
65
+ this._symbolIndex.addAll(parsed.symbols);
66
+ allDependencies.push(...parsed.dependencies);
67
+ this._cache?.set(file.path, {
68
+ symbols: parsed.symbols,
69
+ dependencies: parsed.dependencies
70
+ });
71
+ }
72
+ catch {
73
+ // Skip files that fail to parse (e.g., invalid syntax)
74
+ }
75
+ }
76
+ // Prune deleted/renamed files from the cache
77
+ this._cache?.prune(new Set(this._files.map(f => f.path)));
78
+ // Persist updated cache entries to disk
79
+ await this._cache?.flush();
80
+ const builder = new GraphBuilder();
81
+ this._graph = builder.build(allDependencies);
82
+ this._analyzed = true;
83
+ }
84
+ // ---- Public API -----------------------------------------------------
85
+ files() {
86
+ return this._fileIndex.all();
87
+ }
88
+ symbols() {
89
+ return this._symbolIndex.findSymbols({});
90
+ }
91
+ projectInfo() {
92
+ return this._projectInfo;
93
+ }
94
+ graph() {
95
+ return this._graph;
96
+ }
97
+ search(query, options = {}) {
98
+ const searcher = new CodeSearch(this.files(), this.symbols());
99
+ return searcher.search(query, options);
100
+ }
101
+ dependencies(file) {
102
+ return new DependencyAnalyzer(this._graph).dependencies(file);
103
+ }
104
+ dependents(file) {
105
+ return new DependencyAnalyzer(this._graph).dependents(file);
106
+ }
107
+ impact(file) {
108
+ return new ImpactAnalyzer(this._graph).impact(file);
109
+ }
110
+ isAnalyzed() {
111
+ return this._analyzed;
112
+ }
113
+ /**
114
+ * Deletes the on-disk cache for this codebase.
115
+ * Subsequent calls to analyze() will re-parse all files.
116
+ */
117
+ invalidateCache() {
118
+ this._cache?.invalidate();
119
+ this._cache = null;
120
+ }
121
+ }
122
+ //# sourceMappingURL=Codebase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Codebase.js","sourceRoot":"","sources":["../../src/core/Codebase.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export declare class FileNotFoundError extends Error {
2
+ readonly filePath: string;
3
+ constructor(filePath: string);
4
+ }
5
+ export declare class ParseError extends Error {
6
+ readonly filePath: string;
7
+ readonly originalError: Error | unknown;
8
+ constructor(filePath: string, originalError: Error | unknown);
9
+ }
10
+ export declare class UnresolvedDependencyError extends Error {
11
+ readonly dependencyPath: string;
12
+ readonly sourceFile: string;
13
+ constructor(dependencyPath: string, sourceFile: string);
14
+ }
15
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,iBAAkB,SAAQ,KAAK;aACd,QAAQ,EAAE,MAAM;IAA5C,YAA4B,QAAQ,EAAE,MAAM,EAG3C;CACF;AAED,qBAAa,UAAW,SAAQ,KAAK;aACP,QAAQ,EAAE,MAAM;aAAkB,aAAa,EAAE,KAAK,GAAG,OAAO;IAA5F,YAA4B,QAAQ,EAAE,MAAM,EAAkB,aAAa,EAAE,KAAK,GAAG,OAAO,EAG3F;CACF;AAED,qBAAa,yBAA0B,SAAQ,KAAK;aACtB,cAAc,EAAE,MAAM;aAAkB,UAAU,EAAE,MAAM;IAAtF,YAA4B,cAAc,EAAE,MAAM,EAAkB,UAAU,EAAE,MAAM,EAGrF;CACF"}
@@ -0,0 +1,29 @@
1
+ export class FileNotFoundError extends Error {
2
+ filePath;
3
+ constructor(filePath) {
4
+ super(`File not found: ${filePath}`);
5
+ this.filePath = filePath;
6
+ this.name = 'FileNotFoundError';
7
+ }
8
+ }
9
+ export class ParseError extends Error {
10
+ filePath;
11
+ originalError;
12
+ constructor(filePath, originalError) {
13
+ super(`Failed to parse file: ${filePath}`);
14
+ this.filePath = filePath;
15
+ this.originalError = originalError;
16
+ this.name = 'ParseError';
17
+ }
18
+ }
19
+ export class UnresolvedDependencyError extends Error {
20
+ dependencyPath;
21
+ sourceFile;
22
+ constructor(dependencyPath, sourceFile) {
23
+ super(`Could not resolve dependency '${dependencyPath}' from file: ${sourceFile}`);
24
+ this.dependencyPath = dependencyPath;
25
+ this.sourceFile = sourceFile;
26
+ this.name = 'UnresolvedDependencyError';
27
+ }
28
+ }
29
+ //# sourceMappingURL=errors.js.map