cgb-builder 1.0.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 (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +369 -0
  3. package/dist/bundle/generator.d.ts +51 -0
  4. package/dist/bundle/generator.d.ts.map +1 -0
  5. package/dist/bundle/generator.js +291 -0
  6. package/dist/bundle/generator.js.map +1 -0
  7. package/dist/cli/index.d.ts +7 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +388 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/graph/db.d.ts +43 -0
  12. package/dist/graph/db.d.ts.map +1 -0
  13. package/dist/graph/db.js +321 -0
  14. package/dist/graph/db.js.map +1 -0
  15. package/dist/graph/engine.d.ts +62 -0
  16. package/dist/graph/engine.d.ts.map +1 -0
  17. package/dist/graph/engine.js +246 -0
  18. package/dist/graph/engine.js.map +1 -0
  19. package/dist/index.d.ts +13 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +22 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/mcp/server.d.ts +17 -0
  24. package/dist/mcp/server.d.ts.map +1 -0
  25. package/dist/mcp/server.js +458 -0
  26. package/dist/mcp/server.js.map +1 -0
  27. package/dist/parser/adapter.d.ts +10 -0
  28. package/dist/parser/adapter.d.ts.map +1 -0
  29. package/dist/parser/adapter.js +6 -0
  30. package/dist/parser/adapter.js.map +1 -0
  31. package/dist/parser/adapters/csharp.d.ts +24 -0
  32. package/dist/parser/adapters/csharp.d.ts.map +1 -0
  33. package/dist/parser/adapters/csharp.js +318 -0
  34. package/dist/parser/adapters/csharp.js.map +1 -0
  35. package/dist/parser/adapters/go.d.ts +21 -0
  36. package/dist/parser/adapters/go.d.ts.map +1 -0
  37. package/dist/parser/adapters/go.js +186 -0
  38. package/dist/parser/adapters/go.js.map +1 -0
  39. package/dist/parser/adapters/java.d.ts +22 -0
  40. package/dist/parser/adapters/java.d.ts.map +1 -0
  41. package/dist/parser/adapters/java.js +235 -0
  42. package/dist/parser/adapters/java.js.map +1 -0
  43. package/dist/parser/adapters/python.d.ts +19 -0
  44. package/dist/parser/adapters/python.d.ts.map +1 -0
  45. package/dist/parser/adapters/python.js +201 -0
  46. package/dist/parser/adapters/python.js.map +1 -0
  47. package/dist/parser/adapters/typescript.d.ts +24 -0
  48. package/dist/parser/adapters/typescript.d.ts.map +1 -0
  49. package/dist/parser/adapters/typescript.js +349 -0
  50. package/dist/parser/adapters/typescript.js.map +1 -0
  51. package/dist/parser/index.d.ts +42 -0
  52. package/dist/parser/index.d.ts.map +1 -0
  53. package/dist/parser/index.js +191 -0
  54. package/dist/parser/index.js.map +1 -0
  55. package/dist/parser/tree-sitter-engine.d.ts +25 -0
  56. package/dist/parser/tree-sitter-engine.d.ts.map +1 -0
  57. package/dist/parser/tree-sitter-engine.js +107 -0
  58. package/dist/parser/tree-sitter-engine.js.map +1 -0
  59. package/dist/parser/utils.d.ts +19 -0
  60. package/dist/parser/utils.d.ts.map +1 -0
  61. package/dist/parser/utils.js +111 -0
  62. package/dist/parser/utils.js.map +1 -0
  63. package/dist/types.d.ts +93 -0
  64. package/dist/types.d.ts.map +1 -0
  65. package/dist/types.js +16 -0
  66. package/dist/types.js.map +1 -0
  67. package/dist/watcher/index.d.ts +36 -0
  68. package/dist/watcher/index.d.ts.map +1 -0
  69. package/dist/watcher/index.js +139 -0
  70. package/dist/watcher/index.js.map +1 -0
  71. package/package.json +81 -0
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ /**
3
+ * TypeScript & JavaScript language adapter.
4
+ *
5
+ * Extracts:
6
+ * - import / require statements → imports edges
7
+ * - export declarations → exports edges
8
+ * - class / interface definitions → class / interface nodes + inherits / implements edges
9
+ * - function / method definitions → function / method nodes
10
+ * - function call expressions → calls edges
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.TypeScriptAdapter = void 0;
47
+ const path = __importStar(require("path"));
48
+ const tree_sitter_engine_js_1 = require("../tree-sitter-engine.js");
49
+ const utils_js_1 = require("../utils.js");
50
+ // ─── Tree-sitter queries ──────────────────────────────────────────────────────
51
+ /**
52
+ * Queries written in tree-sitter query syntax (S-expression patterns).
53
+ * We use broad patterns that work for both JS and TS.
54
+ */
55
+ // Import statements: import ... from '...' / import('...')
56
+ const IMPORT_QUERY = `
57
+ [
58
+ (import_statement source: (string) @import_path)
59
+ (call_expression
60
+ function: (identifier) @require_fn (#eq? @require_fn "require")
61
+ arguments: (arguments (string) @import_path))
62
+ (import_statement source: (string) @import_path)
63
+ ]
64
+ `;
65
+ // Export declarations (to mark public API) — kept for future use
66
+ // const EXPORT_QUERY = `...
67
+ // Class declarations
68
+ const CLASS_QUERY = `
69
+ (class_declaration
70
+ name: (type_identifier) @class_name
71
+ (class_heritage
72
+ (extends_clause value: (_) @extends_name) ?
73
+ (implements_clause (type_identifier) @implements_name) *
74
+ ) ?
75
+ ) @class_decl
76
+ `;
77
+ // Interface declarations (TypeScript)
78
+ const INTERFACE_QUERY = `
79
+ (interface_declaration
80
+ name: (type_identifier) @interface_name
81
+ (extends_type_clause (type_identifier) @extends_name) ?
82
+ ) @interface_decl
83
+ `;
84
+ // Function / method declarations
85
+ const FUNCTION_QUERY = `
86
+ [
87
+ (function_declaration name: (identifier) @fn_name) @fn_decl
88
+ (method_definition key: (property_identifier) @fn_name) @fn_decl
89
+ (arrow_function) @fn_decl
90
+ (variable_declarator
91
+ name: (identifier) @fn_name
92
+ value: (arrow_function)) @fn_decl
93
+ (lexical_declaration
94
+ (variable_declarator
95
+ name: (identifier) @fn_name
96
+ value: (arrow_function))) @fn_decl
97
+ ]
98
+ `;
99
+ // Call expressions — kept for future use
100
+ // const CALL_QUERY = `...
101
+ // ─── TypeScriptAdapter ────────────────────────────────────────────────────────
102
+ class TypeScriptAdapter {
103
+ language;
104
+ constructor(lang = 'typescript') {
105
+ this.language = lang;
106
+ }
107
+ async parse(filePath, source) {
108
+ const tree = await tree_sitter_engine_js_1.treeSitterEngine.parse(source, this.language);
109
+ const langObj = await tree_sitter_engine_js_1.treeSitterEngine.loadLanguage(this.language);
110
+ const nodes = [];
111
+ const edges = [];
112
+ // File node (always created)
113
+ const fileNodeId = (0, utils_js_1.makeNodeId)('file', filePath);
114
+ nodes.push({
115
+ id: fileNodeId,
116
+ kind: 'file',
117
+ name: (0, utils_js_1.fileDisplayName)(filePath),
118
+ filePath,
119
+ description: `Source file: ${path.basename(filePath)}`,
120
+ isExternal: false,
121
+ language: this.language,
122
+ meta: '{}',
123
+ });
124
+ // ── Imports ──────────────────────────────────────────────────────────────
125
+ this.extractImports(tree, langObj, filePath, fileNodeId, nodes, edges);
126
+ // ── Classes ──────────────────────────────────────────────────────────────
127
+ this.extractClasses(tree, langObj, filePath, fileNodeId, nodes, edges, source);
128
+ // ── Interfaces ───────────────────────────────────────────────────────────
129
+ this.extractInterfaces(tree, langObj, filePath, fileNodeId, nodes, edges);
130
+ // ── Functions ────────────────────────────────────────────────────────────
131
+ this.extractFunctions(tree, langObj, filePath, fileNodeId, nodes, edges, source);
132
+ return { filePath, language: this.language, nodes, edges };
133
+ }
134
+ // ─── Private extraction helpers ────────────────────────────────────────────
135
+ extractImports(tree, lang, filePath, fileNodeId, nodes, edges) {
136
+ try {
137
+ const q = lang.query(IMPORT_QUERY);
138
+ const captures = q.captures(tree.rootNode);
139
+ const seen = new Set();
140
+ for (const { name, node } of captures) {
141
+ if (name !== 'import_path')
142
+ continue;
143
+ // Strip surrounding quotes
144
+ const rawPath = node.text.replace(/^['"`]|['"`]$/g, '');
145
+ if (seen.has(rawPath))
146
+ continue;
147
+ seen.add(rawPath);
148
+ const isExternal = !rawPath.startsWith('.');
149
+ const targetNodeId = isExternal
150
+ ? (0, utils_js_1.makeNodeId)('external_dep', rawPath)
151
+ : (0, utils_js_1.makeNodeId)('file', this.resolveTs(filePath, rawPath));
152
+ // Ensure the external dep node exists
153
+ if (isExternal) {
154
+ const pkgName = rawPath.split('/')[0];
155
+ const extId = (0, utils_js_1.makeNodeId)('external_dep', pkgName);
156
+ if (!nodes.find((n) => n.id === extId)) {
157
+ nodes.push({
158
+ id: extId,
159
+ kind: 'external_dep',
160
+ name: pkgName,
161
+ filePath: pkgName,
162
+ description: `External dependency: ${pkgName}`,
163
+ isExternal: true,
164
+ language: null,
165
+ meta: '{}',
166
+ });
167
+ }
168
+ edges.push({
169
+ id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'imports', extId),
170
+ fromId: fileNodeId,
171
+ toId: extId,
172
+ kind: 'imports',
173
+ reason: `imports ${rawPath}`,
174
+ });
175
+ }
176
+ else {
177
+ edges.push({
178
+ id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'imports', targetNodeId),
179
+ fromId: fileNodeId,
180
+ toId: targetNodeId,
181
+ kind: 'imports',
182
+ reason: `imports ${rawPath}`,
183
+ });
184
+ }
185
+ }
186
+ }
187
+ catch {
188
+ // Query may fail on malformed source — gracefully skip
189
+ }
190
+ }
191
+ extractClasses(tree, lang, filePath, fileNodeId, nodes, edges, source) {
192
+ try {
193
+ const q = lang.query(CLASS_QUERY);
194
+ const matches = q.matches(tree.rootNode);
195
+ for (const match of matches) {
196
+ const classNameCapture = match.captures.find((c) => c.name === 'class_name');
197
+ if (!classNameCapture)
198
+ continue;
199
+ const className = classNameCapture.node.text;
200
+ const classNodeId = (0, utils_js_1.makeNodeId)('class', filePath, className);
201
+ // Get surrounding comment as description
202
+ const classDecl = match.captures.find((c) => c.name === 'class_decl');
203
+ const snippet = classDecl
204
+ ? (0, utils_js_1.truncate)(source.slice(classDecl.node.startIndex, classDecl.node.startIndex + 120))
205
+ : '';
206
+ nodes.push({
207
+ id: classNodeId,
208
+ kind: 'class',
209
+ name: className,
210
+ filePath,
211
+ description: `Class ${className}. ${snippet}`,
212
+ isExternal: false,
213
+ language: this.language,
214
+ meta: JSON.stringify({ visibility: 'public' }),
215
+ });
216
+ // File exports the class
217
+ edges.push({
218
+ id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', classNodeId),
219
+ fromId: fileNodeId,
220
+ toId: classNodeId,
221
+ kind: 'exports',
222
+ reason: `defines class ${className}`,
223
+ });
224
+ // Extends
225
+ const extendsCapture = match.captures.find((c) => c.name === 'extends_name');
226
+ if (extendsCapture) {
227
+ const parentName = extendsCapture.node.text;
228
+ const parentId = (0, utils_js_1.makeNodeId)('class', filePath, parentName);
229
+ edges.push({
230
+ id: (0, utils_js_1.makeEdgeId)(classNodeId, 'inherits', parentId),
231
+ fromId: classNodeId,
232
+ toId: parentId,
233
+ kind: 'inherits',
234
+ reason: `extends ${parentName}`,
235
+ });
236
+ }
237
+ // Implements
238
+ for (const cap of match.captures.filter((c) => c.name === 'implements_name')) {
239
+ const ifaceName = cap.node.text;
240
+ const ifaceId = (0, utils_js_1.makeNodeId)('interface', filePath, ifaceName);
241
+ edges.push({
242
+ id: (0, utils_js_1.makeEdgeId)(classNodeId, 'implements', ifaceId),
243
+ fromId: classNodeId,
244
+ toId: ifaceId,
245
+ kind: 'implements',
246
+ reason: `implements ${ifaceName}`,
247
+ });
248
+ }
249
+ }
250
+ }
251
+ catch {
252
+ // Skip on query error
253
+ }
254
+ }
255
+ extractInterfaces(tree, lang, filePath, fileNodeId, nodes, edges) {
256
+ try {
257
+ const q = lang.query(INTERFACE_QUERY);
258
+ const matches = q.matches(tree.rootNode);
259
+ for (const match of matches) {
260
+ const nameCap = match.captures.find((c) => c.name === 'interface_name');
261
+ if (!nameCap)
262
+ continue;
263
+ const ifaceName = nameCap.node.text;
264
+ const ifaceId = (0, utils_js_1.makeNodeId)('interface', filePath, ifaceName);
265
+ nodes.push({
266
+ id: ifaceId,
267
+ kind: 'interface',
268
+ name: ifaceName,
269
+ filePath,
270
+ description: `Interface ${ifaceName}`,
271
+ isExternal: false,
272
+ language: this.language,
273
+ meta: '{}',
274
+ });
275
+ edges.push({
276
+ id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', ifaceId),
277
+ fromId: fileNodeId,
278
+ toId: ifaceId,
279
+ kind: 'exports',
280
+ reason: `defines interface ${ifaceName}`,
281
+ });
282
+ }
283
+ }
284
+ catch {
285
+ // Skip on query error
286
+ }
287
+ }
288
+ extractFunctions(tree, lang, filePath, fileNodeId, nodes, edges, _source) {
289
+ try {
290
+ const q = lang.query(FUNCTION_QUERY);
291
+ const captures = q.captures(tree.rootNode);
292
+ const seen = new Set();
293
+ for (const { name, node } of captures) {
294
+ if (name !== 'fn_name')
295
+ continue;
296
+ const fnName = node.text;
297
+ if (seen.has(fnName) || fnName.length === 0)
298
+ continue;
299
+ seen.add(fnName);
300
+ const fnId = (0, utils_js_1.makeNodeId)('function', filePath, fnName);
301
+ nodes.push({
302
+ id: fnId,
303
+ kind: 'function',
304
+ name: fnName,
305
+ filePath,
306
+ description: `Function ${fnName} in ${path.basename(filePath)}`,
307
+ isExternal: false,
308
+ language: this.language,
309
+ meta: '{}',
310
+ });
311
+ edges.push({
312
+ id: (0, utils_js_1.makeEdgeId)(fileNodeId, 'exports', fnId),
313
+ fromId: fileNodeId,
314
+ toId: fnId,
315
+ kind: 'exports',
316
+ reason: `defines function ${fnName}`,
317
+ });
318
+ }
319
+ }
320
+ catch {
321
+ // Skip on query error
322
+ }
323
+ }
324
+ /** Resolve a relative TS/JS import path to an absolute path */
325
+ resolveTs(fromFile, importPath) {
326
+ const dir = path.dirname(fromFile);
327
+ // TypeScript source files import with .js/.jsx/.mjs/.cjs extensions at runtime
328
+ // (e.g. import from '../graph/db.js') but the actual source is .ts/.tsx.
329
+ // Strip those extensions before resolution so we find the real .ts file.
330
+ const stripped = importPath.replace(/\.(m?jsx?|cjs)$/, '');
331
+ const resolved = path.resolve(dir, stripped);
332
+ // Try source extensions first (prefer .ts over .js for the same base name)
333
+ const extensions = ['.ts', '.tsx', '.js', '.jsx'];
334
+ for (const ext of extensions) {
335
+ if (require('fs').existsSync(resolved + ext))
336
+ return resolved + ext;
337
+ }
338
+ // Try index file
339
+ for (const ext of extensions) {
340
+ const idx = path.join(resolved, `index${ext}`);
341
+ if (require('fs').existsSync(idx))
342
+ return idx;
343
+ }
344
+ // Return the stripped path (without phantom extension) as fallback
345
+ return resolved;
346
+ }
347
+ }
348
+ exports.TypeScriptAdapter = TypeScriptAdapter;
349
+ //# sourceMappingURL=typescript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescript.js","sourceRoot":"","sources":["../../../src/parser/adapters/typescript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Main parser orchestrator.
3
+ * Dispatches files to the correct language adapter, handles incremental
4
+ * updates (skip unchanged files), and writes results to the graph DB.
5
+ */
6
+ import type { GraphDb } from '../graph/db.js';
7
+ export interface ParseResult {
8
+ parsed: number;
9
+ skipped: number;
10
+ errors: Array<{
11
+ filePath: string;
12
+ error: string;
13
+ }>;
14
+ durationMs: number;
15
+ }
16
+ export declare class Parser {
17
+ private readonly db;
18
+ private readonly projectRoot;
19
+ constructor(db: GraphDb, projectRoot: string);
20
+ /**
21
+ * Full scan: traverse all source files under projectRoot and parse them.
22
+ * Respects incremental hashing — skips files that haven't changed.
23
+ */
24
+ scanAll(force?: boolean): Promise<ParseResult>;
25
+ /**
26
+ * Parse a specific list of files (used by the watcher for incremental updates).
27
+ */
28
+ parseFiles(filePaths: string[], force?: boolean, _startTime?: number): Promise<ParseResult>;
29
+ /**
30
+ * Parse a single file.
31
+ * Returns 'skipped' if the file hasn't changed since last parse.
32
+ * Returns 'parsed' if the file was (re)parsed.
33
+ */
34
+ parseFile(filePath: string, force?: boolean): Promise<'parsed' | 'skipped'>;
35
+ /**
36
+ * Remove a file from the graph (called when file is deleted).
37
+ */
38
+ removeFile(filePath: string): void;
39
+ /** Discover all parseable source files under projectRoot */
40
+ private discoverFiles;
41
+ }
42
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAuC9C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,qBAAa,MAAM;IAEf,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,WAAW;gBADX,EAAE,EAAE,OAAO,EACX,WAAW,EAAE,MAAM;IAGtC;;;OAGG;IACG,OAAO,CAAC,KAAK,UAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;IAMlD;;OAEG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,KAAK,UAAQ,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuB/F;;;;OAIG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAwD/E;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAOlC,4DAA4D;YAC9C,aAAa;CAa5B"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Main parser orchestrator.
4
+ * Dispatches files to the correct language adapter, handles incremental
5
+ * updates (skip unchanged files), and writes results to the graph DB.
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ exports.Parser = void 0;
42
+ const fs = __importStar(require("fs"));
43
+ const glob_1 = require("glob");
44
+ const typescript_js_1 = require("./adapters/typescript.js");
45
+ const csharp_js_1 = require("./adapters/csharp.js");
46
+ const python_js_1 = require("./adapters/python.js");
47
+ const go_js_1 = require("./adapters/go.js");
48
+ const java_js_1 = require("./adapters/java.js");
49
+ const utils_js_1 = require("./utils.js");
50
+ // ─── Adapter registry ─────────────────────────────────────────────────────────
51
+ const ADAPTERS = {
52
+ typescript: new typescript_js_1.TypeScriptAdapter('typescript'),
53
+ javascript: new typescript_js_1.TypeScriptAdapter('javascript'),
54
+ csharp: new csharp_js_1.CSharpAdapter(),
55
+ python: new python_js_1.PythonAdapter(),
56
+ go: new go_js_1.GoAdapter(),
57
+ java: new java_js_1.JavaAdapter(),
58
+ };
59
+ /** Default glob patterns to ignore */
60
+ const DEFAULT_IGNORES = [
61
+ '**/node_modules/**',
62
+ '**/dist/**',
63
+ '**/build/**',
64
+ '**/bin/**',
65
+ '**/obj/**',
66
+ '**/.git/**',
67
+ '**/.cgb/**',
68
+ '**/vendor/**',
69
+ '**/__pycache__/**',
70
+ '**/coverage/**',
71
+ '**/*.min.js',
72
+ '**/*.d.ts',
73
+ ];
74
+ // ─── Parser orchestrator ──────────────────────────────────────────────────────
75
+ class Parser {
76
+ db;
77
+ projectRoot;
78
+ constructor(db, projectRoot) {
79
+ this.db = db;
80
+ this.projectRoot = projectRoot;
81
+ }
82
+ /**
83
+ * Full scan: traverse all source files under projectRoot and parse them.
84
+ * Respects incremental hashing — skips files that haven't changed.
85
+ */
86
+ async scanAll(force = false) {
87
+ const start = Date.now();
88
+ const files = await this.discoverFiles();
89
+ return this.parseFiles(files, force, start);
90
+ }
91
+ /**
92
+ * Parse a specific list of files (used by the watcher for incremental updates).
93
+ */
94
+ async parseFiles(filePaths, force = false, _startTime) {
95
+ const start = _startTime ?? Date.now();
96
+ let parsed = 0;
97
+ let skipped = 0;
98
+ const errors = [];
99
+ for (const filePath of filePaths) {
100
+ try {
101
+ const result = await this.parseFile(filePath, force);
102
+ if (result === 'skipped')
103
+ skipped++;
104
+ else
105
+ parsed++;
106
+ }
107
+ catch (err) {
108
+ errors.push({
109
+ filePath,
110
+ error: err instanceof Error ? err.message : String(err),
111
+ });
112
+ }
113
+ }
114
+ this.db.persist();
115
+ return { parsed, skipped, errors, durationMs: Date.now() - start };
116
+ }
117
+ /**
118
+ * Parse a single file.
119
+ * Returns 'skipped' if the file hasn't changed since last parse.
120
+ * Returns 'parsed' if the file was (re)parsed.
121
+ */
122
+ async parseFile(filePath, force = false) {
123
+ const lang = (0, utils_js_1.detectLanguage)(filePath);
124
+ if (!lang)
125
+ return 'skipped'; // unsupported file type
126
+ if (!fs.existsSync(filePath)) {
127
+ // File was deleted — remove from graph
128
+ this.db.deleteFile(filePath);
129
+ return 'parsed';
130
+ }
131
+ // Skip directories that happen to match a source extension (e.g. `countup.js/`)
132
+ const stat = fs.statSync(filePath);
133
+ if (!stat.isFile())
134
+ return 'skipped';
135
+ const source = fs.readFileSync(filePath, 'utf-8');
136
+ const contentHash = (0, utils_js_1.hashContent)(source);
137
+ if (!force) {
138
+ const existing = this.db.getFile(filePath);
139
+ if (existing && existing.contentHash === contentHash) {
140
+ return 'skipped';
141
+ }
142
+ }
143
+ const adapter = ADAPTERS[lang];
144
+ const parsed = await adapter.parse(filePath, source);
145
+ // Remove stale graph data for this file
146
+ this.db.deleteFile(filePath);
147
+ // Write new nodes
148
+ const now = Date.now();
149
+ for (const node of parsed.nodes) {
150
+ this.db.upsertNode({ ...node, updatedAt: now });
151
+ }
152
+ // Write new edges (only if both endpoints exist or will be created)
153
+ for (const edge of parsed.edges) {
154
+ // Allow edges to unresolved nodes (they'll be created when that file is parsed)
155
+ this.db.upsertEdge({ ...edge, updatedAt: now });
156
+ }
157
+ const stats = fs.statSync(filePath);
158
+ this.db.upsertFile({
159
+ filePath,
160
+ language: lang,
161
+ contentHash,
162
+ mtime: stats.mtimeMs,
163
+ nodeCount: parsed.nodes.length,
164
+ edgeCount: parsed.edges.length,
165
+ parsedAt: now,
166
+ });
167
+ return 'parsed';
168
+ }
169
+ /**
170
+ * Remove a file from the graph (called when file is deleted).
171
+ */
172
+ removeFile(filePath) {
173
+ this.db.deleteFile(filePath);
174
+ this.db.persist();
175
+ }
176
+ // ─── Private helpers ───────────────────────────────────────────────────────
177
+ /** Discover all parseable source files under projectRoot */
178
+ async discoverFiles() {
179
+ const extensions = ['ts', 'tsx', 'js', 'jsx', 'mjs', 'cs', 'py', 'go', 'java'];
180
+ const pattern = `**/*.{${extensions.join(',')}}`;
181
+ const files = await (0, glob_1.glob)(pattern, {
182
+ cwd: this.projectRoot,
183
+ ignore: DEFAULT_IGNORES,
184
+ absolute: true,
185
+ nodir: true, // never return directories that match the extension pattern
186
+ });
187
+ return files;
188
+ }
189
+ }
190
+ exports.Parser = Parser;
191
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/parser/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Tree-sitter WASM engine orchestrator.
3
+ * Initialises web-tree-sitter, loads language grammars on demand,
4
+ * and provides a unified parse() method that returns a Tree for any
5
+ * supported language.
6
+ */
7
+ import Parser from 'web-tree-sitter';
8
+ import type { SupportedLanguage } from '../types.js';
9
+ export declare class TreeSitterEngine {
10
+ private parser;
11
+ private languageCache;
12
+ private initialised;
13
+ init(): Promise<void>;
14
+ /** Parse source text in the given language and return a tree-sitter Tree */
15
+ parse(source: string, language: SupportedLanguage): Promise<Parser.Tree>;
16
+ /** Return the tree-sitter Language object (cached) */
17
+ loadLanguage(language: SupportedLanguage): Promise<Parser.Language>;
18
+ /** Run a tree-sitter query against a tree and collect all matches */
19
+ query(tree: Parser.Tree, language: Parser.Language, queryString: string): Parser.QueryMatch[];
20
+ /** Collect all captures from a query */
21
+ captures(tree: Parser.Tree, language: Parser.Language, queryString: string): Parser.QueryCapture[];
22
+ }
23
+ /** Singleton engine instance shared across adapters */
24
+ export declare const treeSitterEngine: TreeSitterEngine;
25
+ //# sourceMappingURL=tree-sitter-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tree-sitter-engine.d.ts","sourceRoot":"","sources":["../../src/parser/tree-sitter-engine.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiBrD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,WAAW,CAAS;IAEtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,4EAA4E;IACtE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;IAO9E,sDAAsD;IAChD,YAAY,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;IAczE,qEAAqE;IACrE,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE;IAK7F,wCAAwC;IACxC,QAAQ,CACN,IAAI,EAAE,MAAM,CAAC,IAAI,EACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ,EACzB,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,YAAY,EAAE;CAIzB;AAED,uDAAuD;AACvD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}