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.
- package/LICENSE +21 -0
- package/README.md +369 -0
- package/dist/bundle/generator.d.ts +51 -0
- package/dist/bundle/generator.d.ts.map +1 -0
- package/dist/bundle/generator.js +291 -0
- package/dist/bundle/generator.js.map +1 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +388 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/graph/db.d.ts +43 -0
- package/dist/graph/db.d.ts.map +1 -0
- package/dist/graph/db.js +321 -0
- package/dist/graph/db.js.map +1 -0
- package/dist/graph/engine.d.ts +62 -0
- package/dist/graph/engine.d.ts.map +1 -0
- package/dist/graph/engine.js +246 -0
- package/dist/graph/engine.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +17 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +458 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/adapter.d.ts +10 -0
- package/dist/parser/adapter.d.ts.map +1 -0
- package/dist/parser/adapter.js +6 -0
- package/dist/parser/adapter.js.map +1 -0
- package/dist/parser/adapters/csharp.d.ts +24 -0
- package/dist/parser/adapters/csharp.d.ts.map +1 -0
- package/dist/parser/adapters/csharp.js +318 -0
- package/dist/parser/adapters/csharp.js.map +1 -0
- package/dist/parser/adapters/go.d.ts +21 -0
- package/dist/parser/adapters/go.d.ts.map +1 -0
- package/dist/parser/adapters/go.js +186 -0
- package/dist/parser/adapters/go.js.map +1 -0
- package/dist/parser/adapters/java.d.ts +22 -0
- package/dist/parser/adapters/java.d.ts.map +1 -0
- package/dist/parser/adapters/java.js +235 -0
- package/dist/parser/adapters/java.js.map +1 -0
- package/dist/parser/adapters/python.d.ts +19 -0
- package/dist/parser/adapters/python.d.ts.map +1 -0
- package/dist/parser/adapters/python.js +201 -0
- package/dist/parser/adapters/python.js.map +1 -0
- package/dist/parser/adapters/typescript.d.ts +24 -0
- package/dist/parser/adapters/typescript.d.ts.map +1 -0
- package/dist/parser/adapters/typescript.js +349 -0
- package/dist/parser/adapters/typescript.js.map +1 -0
- package/dist/parser/index.d.ts +42 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +191 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/tree-sitter-engine.d.ts +25 -0
- package/dist/parser/tree-sitter-engine.d.ts.map +1 -0
- package/dist/parser/tree-sitter-engine.js +107 -0
- package/dist/parser/tree-sitter-engine.js.map +1 -0
- package/dist/parser/utils.d.ts +19 -0
- package/dist/parser/utils.d.ts.map +1 -0
- package/dist/parser/utils.js +111 -0
- package/dist/parser/utils.js.map +1 -0
- package/dist/types.d.ts +93 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/watcher/index.d.ts +36 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +139 -0
- package/dist/watcher/index.js.map +1 -0
- package/package.json +81 -0
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Code Graph Builder CLI
|
|
5
|
+
* Usage: cgb <command> [options]
|
|
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
|
+
const commander_1 = require("commander");
|
|
42
|
+
const path = __importStar(require("path"));
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
// Lazy-loaded to avoid startup cost when printing help
|
|
45
|
+
async function getServices(root) {
|
|
46
|
+
const { GraphDb } = await Promise.resolve().then(() => __importStar(require('../graph/db.js')));
|
|
47
|
+
const { GraphEngine } = await Promise.resolve().then(() => __importStar(require('../graph/engine.js')));
|
|
48
|
+
const { Parser } = await Promise.resolve().then(() => __importStar(require('../parser/index.js')));
|
|
49
|
+
const { BundleGenerator } = await Promise.resolve().then(() => __importStar(require('../bundle/generator.js')));
|
|
50
|
+
const db = new GraphDb(root);
|
|
51
|
+
await db.init();
|
|
52
|
+
const engine = new GraphEngine(db);
|
|
53
|
+
const parser = new Parser(db, root);
|
|
54
|
+
const bundle = new BundleGenerator(db, engine, root);
|
|
55
|
+
return { db, engine, parser, bundle };
|
|
56
|
+
}
|
|
57
|
+
function resolveRoot(options) {
|
|
58
|
+
const root = options.root ?? process.cwd();
|
|
59
|
+
const abs = path.resolve(root);
|
|
60
|
+
if (!fs.existsSync(abs)) {
|
|
61
|
+
console.error(`Error: Root directory does not exist: ${abs}`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
return abs;
|
|
65
|
+
}
|
|
66
|
+
// ─── CLI definition ───────────────────────────────────────────────────────────
|
|
67
|
+
const program = new commander_1.Command();
|
|
68
|
+
program
|
|
69
|
+
.name('cgb')
|
|
70
|
+
.description('Code Graph Builder — build and query a dependency graph for AI context bundles')
|
|
71
|
+
.version('1.0.0');
|
|
72
|
+
// ─── init ─────────────────────────────────────────────────────────────────────
|
|
73
|
+
program
|
|
74
|
+
.command('init')
|
|
75
|
+
.description('Scan all source files in the project and build the initial graph')
|
|
76
|
+
.option('-r, --root <path>', 'Project root directory (default: cwd)')
|
|
77
|
+
.option('-f, --force', 'Force re-parse all files even if unchanged', false)
|
|
78
|
+
.option('--watch', 'Keep watching for file changes after initial scan', false)
|
|
79
|
+
.action(async (options) => {
|
|
80
|
+
const root = resolveRoot(options);
|
|
81
|
+
console.log(`📊 Initializing graph for: ${root}`);
|
|
82
|
+
const { db, parser, engine } = await getServices(root);
|
|
83
|
+
console.log('🔍 Scanning files…');
|
|
84
|
+
const result = await parser.scanAll(options.force);
|
|
85
|
+
const stats = db.getStats();
|
|
86
|
+
console.log(`\n✅ Done in ${result.durationMs}ms`);
|
|
87
|
+
console.log(` Parsed: ${result.parsed} files`);
|
|
88
|
+
console.log(` Skipped: ${result.skipped} files (unchanged)`);
|
|
89
|
+
console.log(` Errors: ${result.errors.length} files`);
|
|
90
|
+
console.log(`\n Graph: ${stats.files} files · ${stats.nodes} nodes · ${stats.edges} edges`);
|
|
91
|
+
if (result.errors.length > 0) {
|
|
92
|
+
console.log('\nErrors:');
|
|
93
|
+
for (const e of result.errors.slice(0, 10)) {
|
|
94
|
+
console.log(` ✗ ${e.filePath}: ${e.error}`);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Print layer overview
|
|
98
|
+
const layers = engine.layers();
|
|
99
|
+
if (layers.length > 0) {
|
|
100
|
+
console.log('\nArchitectural layers:');
|
|
101
|
+
for (const layer of layers.slice(0, 8)) {
|
|
102
|
+
console.log(` ${layer.layer.padEnd(20)} ${layer.nodeCount} files`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
db.close();
|
|
106
|
+
if (options.watch) {
|
|
107
|
+
await startWatcher(root, parser, db);
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
// ─── deps ─────────────────────────────────────────────────────────────────────
|
|
111
|
+
program
|
|
112
|
+
.command('deps <target>')
|
|
113
|
+
.description('Show what a file or node depends on')
|
|
114
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
115
|
+
.option('-d, --depth <n>', 'Traversal depth for transitive deps', '3')
|
|
116
|
+
.option('--json', 'Output as JSON')
|
|
117
|
+
.action(async (target, options) => {
|
|
118
|
+
const root = resolveRoot(options);
|
|
119
|
+
const { db, engine } = await getServices(root);
|
|
120
|
+
const absTarget = path.isAbsolute(target) ? target : path.resolve(root, target);
|
|
121
|
+
const nodeId = `file:${absTarget}`;
|
|
122
|
+
const result = engine.deps(nodeId, parseInt(options.depth, 10));
|
|
123
|
+
if (!result) {
|
|
124
|
+
console.error(`Node not found: ${target}`);
|
|
125
|
+
console.error('Run `cgb init` first to build the graph.');
|
|
126
|
+
db.close();
|
|
127
|
+
process.exit(1);
|
|
128
|
+
}
|
|
129
|
+
if (options.json) {
|
|
130
|
+
console.log(JSON.stringify(result, null, 2));
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
const rel = path.relative(root, result.target.filePath);
|
|
134
|
+
console.log(`\nDependencies of \`${rel}\`:`);
|
|
135
|
+
console.log(`\nDirect (${result.direct.length}):`);
|
|
136
|
+
for (const dep of result.direct) {
|
|
137
|
+
const label = dep.isExternal ? `[ext] ${dep.name}` : path.relative(root, dep.filePath);
|
|
138
|
+
console.log(` → ${label}`);
|
|
139
|
+
}
|
|
140
|
+
if (result.transitive.length > 0) {
|
|
141
|
+
console.log(`\nTransitive (${result.transitive.length}):`);
|
|
142
|
+
for (const dep of result.transitive.filter((n) => !n.isExternal).slice(0, 15)) {
|
|
143
|
+
console.log(` ⇒ ${path.relative(root, dep.filePath)}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
db.close();
|
|
148
|
+
});
|
|
149
|
+
// ─── callers ──────────────────────────────────────────────────────────────────
|
|
150
|
+
program
|
|
151
|
+
.command('callers <nodeId>')
|
|
152
|
+
.description('Find all nodes that call a function or method')
|
|
153
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
154
|
+
.option('--json', 'Output as JSON')
|
|
155
|
+
.action(async (nodeId, options) => {
|
|
156
|
+
const root = resolveRoot(options);
|
|
157
|
+
const { db, engine } = await getServices(root);
|
|
158
|
+
const result = engine.callers(nodeId);
|
|
159
|
+
if (!result) {
|
|
160
|
+
console.error(`Node not found: ${nodeId}`);
|
|
161
|
+
db.close();
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
if (options.json) {
|
|
165
|
+
console.log(JSON.stringify(result, null, 2));
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
console.log(`\nCallers of \`${result.target.name}\`:`);
|
|
169
|
+
if (result.callers.length === 0) {
|
|
170
|
+
console.log(' (none found)');
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
for (const c of result.callers) {
|
|
174
|
+
const rel = c.node.isExternal ? c.node.name : path.relative(root, c.node.filePath);
|
|
175
|
+
console.log(` ← ${c.node.name} in ${rel} — ${c.reason}`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
db.close();
|
|
180
|
+
});
|
|
181
|
+
// ─── impact ───────────────────────────────────────────────────────────────────
|
|
182
|
+
program
|
|
183
|
+
.command('impact <target>')
|
|
184
|
+
.description('Show what would be affected if a file changes')
|
|
185
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
186
|
+
.option('-d, --depth <n>', 'Maximum traversal depth', '10')
|
|
187
|
+
.option('--json', 'Output as JSON')
|
|
188
|
+
.action(async (target, options) => {
|
|
189
|
+
const root = resolveRoot(options);
|
|
190
|
+
const { db, engine } = await getServices(root);
|
|
191
|
+
const absTarget = path.isAbsolute(target) ? target : path.resolve(root, target);
|
|
192
|
+
const nodeId = `file:${absTarget}`;
|
|
193
|
+
const result = engine.impact(nodeId, parseInt(options.depth, 10));
|
|
194
|
+
if (!result) {
|
|
195
|
+
console.error(`Node not found: ${target}`);
|
|
196
|
+
db.close();
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
if (options.json) {
|
|
200
|
+
console.log(JSON.stringify(result, null, 2));
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
const rel = path.relative(root, result.target.filePath);
|
|
204
|
+
console.log(`\nImpact analysis for \`${rel}\`:`);
|
|
205
|
+
console.log(`${result.affected.length} file(s) would be affected:\n`);
|
|
206
|
+
for (const a of result.affected) {
|
|
207
|
+
const prefix = ' '.repeat(a.depth);
|
|
208
|
+
const nodeRel = path.relative(root, a.node.filePath);
|
|
209
|
+
console.log(`${prefix}↑ depth ${a.depth}: ${nodeRel}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
db.close();
|
|
213
|
+
});
|
|
214
|
+
// ─── search ───────────────────────────────────────────────────────────────────
|
|
215
|
+
program
|
|
216
|
+
.command('search <query>')
|
|
217
|
+
.description('Search for nodes by name, description, or file path')
|
|
218
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
219
|
+
.option('--json', 'Output as JSON')
|
|
220
|
+
.action(async (query, options) => {
|
|
221
|
+
const root = resolveRoot(options);
|
|
222
|
+
const { db, engine } = await getServices(root);
|
|
223
|
+
const results = engine.search(query);
|
|
224
|
+
if (options.json) {
|
|
225
|
+
console.log(JSON.stringify(results, null, 2));
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
console.log(`\nSearch results for "${query}" (${results.length}):\n`);
|
|
229
|
+
for (const node of results) {
|
|
230
|
+
const relPath = node.isExternal ? node.name : path.relative(root, node.filePath);
|
|
231
|
+
console.log(` [${node.kind}] ${node.name}`);
|
|
232
|
+
console.log(` ${relPath}`);
|
|
233
|
+
if (node.description)
|
|
234
|
+
console.log(` ${node.description}`);
|
|
235
|
+
console.log('');
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
db.close();
|
|
239
|
+
});
|
|
240
|
+
// ─── path ─────────────────────────────────────────────────────────────────────
|
|
241
|
+
program
|
|
242
|
+
.command('path <from> <to>')
|
|
243
|
+
.description('Find the shortest dependency path between two files')
|
|
244
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
245
|
+
.option('--json', 'Output as JSON')
|
|
246
|
+
.action(async (from, to, options) => {
|
|
247
|
+
const root = resolveRoot(options);
|
|
248
|
+
const { db, engine } = await getServices(root);
|
|
249
|
+
const absFrom = path.isAbsolute(from) ? from : path.resolve(root, from);
|
|
250
|
+
const absTo = path.isAbsolute(to) ? to : path.resolve(root, to);
|
|
251
|
+
const result = engine.path(`file:${absFrom}`, `file:${absTo}`);
|
|
252
|
+
if (!result) {
|
|
253
|
+
console.log(`No dependency path found between\n ${from}\n ${to}`);
|
|
254
|
+
db.close();
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
if (options.json) {
|
|
258
|
+
console.log(JSON.stringify(result, null, 2));
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
console.log('\nDependency path:');
|
|
262
|
+
for (let i = 0; i < result.path.length; i++) {
|
|
263
|
+
const node = result.path[i];
|
|
264
|
+
const relPath = node.isExternal ? node.name : path.relative(root, node.filePath);
|
|
265
|
+
const edge = result.edges[i];
|
|
266
|
+
console.log(` ${i === 0 ? '' : `[${edge?.kind ?? ''}] `}${relPath}`);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
db.close();
|
|
270
|
+
});
|
|
271
|
+
// ─── bundle ───────────────────────────────────────────────────────────────────
|
|
272
|
+
program
|
|
273
|
+
.command('bundle <target>')
|
|
274
|
+
.description('Generate an AI-ready context bundle for a file')
|
|
275
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
276
|
+
.option('-d, --depth <n>', 'Dependency traversal depth', '2')
|
|
277
|
+
.option('--no-source', 'Exclude the source file from the bundle')
|
|
278
|
+
.option('-o, --output <file>', 'Write bundle to a file instead of stdout')
|
|
279
|
+
.option('--json', 'Output bundle structure as JSON instead of Markdown')
|
|
280
|
+
.action(async (target, options) => {
|
|
281
|
+
const root = resolveRoot(options);
|
|
282
|
+
const { db, bundle } = await getServices(root);
|
|
283
|
+
const absTarget = path.isAbsolute(target) ? target : path.resolve(root, target);
|
|
284
|
+
const result = bundle.generate(absTarget, {
|
|
285
|
+
depth: parseInt(options.depth, 10),
|
|
286
|
+
includeSource: options.source !== false,
|
|
287
|
+
});
|
|
288
|
+
let output;
|
|
289
|
+
if (options.json) {
|
|
290
|
+
output = JSON.stringify(result, null, 2);
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
const { BundleGenerator } = await Promise.resolve().then(() => __importStar(require('../bundle/generator.js')));
|
|
294
|
+
output = new BundleGenerator(db, await Promise.resolve().then(() => __importStar(require('../graph/engine.js'))).then((m) => new m.GraphEngine(db)), root).render(result);
|
|
295
|
+
}
|
|
296
|
+
if (options.output) {
|
|
297
|
+
fs.writeFileSync(options.output, output, 'utf-8');
|
|
298
|
+
console.log(`Bundle written to: ${options.output}`);
|
|
299
|
+
console.log(`Estimated tokens: ~${result.totalTokenEstimate}`);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
console.log(output);
|
|
303
|
+
process.stderr.write(`\n# ~${result.totalTokenEstimate} tokens\n`);
|
|
304
|
+
}
|
|
305
|
+
db.close();
|
|
306
|
+
});
|
|
307
|
+
// ─── stats ────────────────────────────────────────────────────────────────────
|
|
308
|
+
program
|
|
309
|
+
.command('stats')
|
|
310
|
+
.description('Show graph statistics')
|
|
311
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
312
|
+
.option('--json', 'Output as JSON')
|
|
313
|
+
.action(async (options) => {
|
|
314
|
+
const root = resolveRoot(options);
|
|
315
|
+
const { db, engine } = await getServices(root);
|
|
316
|
+
const stats = db.getStats();
|
|
317
|
+
const byKind = db.getNodeCountByKind();
|
|
318
|
+
const layers = engine.layers();
|
|
319
|
+
const cycles = engine.detectCycles();
|
|
320
|
+
const orphans = engine.orphans();
|
|
321
|
+
if (options.json) {
|
|
322
|
+
console.log(JSON.stringify({ stats, byKind, layers, cycleCount: cycles.length, orphanCount: orphans.length }, null, 2));
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
console.log('\n📊 Graph Statistics\n');
|
|
326
|
+
console.log(` Files: ${stats.files}`);
|
|
327
|
+
console.log(` Nodes: ${stats.nodes}`);
|
|
328
|
+
console.log(` Edges: ${stats.edges}`);
|
|
329
|
+
console.log(`\nNode types:`);
|
|
330
|
+
for (const [kind, count] of Object.entries(byKind)) {
|
|
331
|
+
console.log(` ${kind.padEnd(15)} ${count}`);
|
|
332
|
+
}
|
|
333
|
+
console.log(`\nCycles detected: ${cycles.length}`);
|
|
334
|
+
console.log(`Orphan nodes: ${orphans.length}`);
|
|
335
|
+
console.log(`\nLayers (by file count):`);
|
|
336
|
+
for (const layer of layers.slice(0, 10)) {
|
|
337
|
+
console.log(` ${layer.layer.padEnd(20)} ${layer.nodeCount} files`);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
db.close();
|
|
341
|
+
});
|
|
342
|
+
// ─── watch ────────────────────────────────────────────────────────────────────
|
|
343
|
+
program
|
|
344
|
+
.command('watch')
|
|
345
|
+
.description('Watch for file changes and keep the graph up to date')
|
|
346
|
+
.option('-r, --root <path>', 'Project root directory')
|
|
347
|
+
.action(async (options) => {
|
|
348
|
+
const root = resolveRoot(options);
|
|
349
|
+
const { db, parser } = await getServices(root);
|
|
350
|
+
await startWatcher(root, parser, db);
|
|
351
|
+
});
|
|
352
|
+
// ─── Watcher helper ───────────────────────────────────────────────────────────
|
|
353
|
+
async function startWatcher(root, parser, db) {
|
|
354
|
+
const { Watcher } = await Promise.resolve().then(() => __importStar(require('../watcher/index.js')));
|
|
355
|
+
const watcher = new Watcher(root, parser, {
|
|
356
|
+
onUpdate: ({ parsed, errors, files }) => {
|
|
357
|
+
const now = new Date().toLocaleTimeString();
|
|
358
|
+
console.log(`[${now}] Updated ${parsed} file(s) | ${errors} error(s) | ${files.map((f) => path.relative(root, f)).join(', ')}`);
|
|
359
|
+
},
|
|
360
|
+
onError: (err) => console.error('Watcher error:', err.message),
|
|
361
|
+
});
|
|
362
|
+
watcher.start();
|
|
363
|
+
console.log(`👁 Watching for changes in: ${root}`);
|
|
364
|
+
console.log(' Press Ctrl+C to stop.\n');
|
|
365
|
+
// Keep process alive
|
|
366
|
+
process.on('SIGINT', async () => {
|
|
367
|
+
console.log('\nStopping watcher…');
|
|
368
|
+
await watcher.stop();
|
|
369
|
+
db.close();
|
|
370
|
+
process.exit(0);
|
|
371
|
+
});
|
|
372
|
+
// Prevent process from exiting
|
|
373
|
+
await new Promise(() => {
|
|
374
|
+
/* intentionally never resolves */
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// ─── mcp ──────────────────────────────────────────────────────────────────────
|
|
378
|
+
program
|
|
379
|
+
.command('mcp')
|
|
380
|
+
.description('Start the MCP server so Cursor / Claude Code can call cgb tools directly')
|
|
381
|
+
.option('-r, --root <path>', 'Default project root (tools can override per-call)')
|
|
382
|
+
.action(async (_options) => {
|
|
383
|
+
const { startMcpServer } = await Promise.resolve().then(() => __importStar(require('../mcp/server.js')));
|
|
384
|
+
await startMcpServer();
|
|
385
|
+
});
|
|
386
|
+
// ─── Entry point ──────────────────────────────────────────────────────────────
|
|
387
|
+
program.parse(process.argv);
|
|
388
|
+
//# 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
|
+
/**
|
|
2
|
+
* SQLite-backed graph database using sql.js (pure WASM, no native compilation).
|
|
3
|
+
* Stores nodes, edges, and file metadata. Persists to a binary .db file on disk.
|
|
4
|
+
*/
|
|
5
|
+
import type { GraphEdge, GraphNode, FileRecord } from '../types.js';
|
|
6
|
+
export declare class GraphDb {
|
|
7
|
+
private db;
|
|
8
|
+
private dbPath;
|
|
9
|
+
private static sqlJs;
|
|
10
|
+
constructor(projectRoot: string);
|
|
11
|
+
/** Initialize the database (async because sql.js WASM loading is async) */
|
|
12
|
+
init(): Promise<void>;
|
|
13
|
+
/** Save the in-memory DB back to disk */
|
|
14
|
+
persist(): void;
|
|
15
|
+
close(): void;
|
|
16
|
+
upsertNode(node: GraphNode): void;
|
|
17
|
+
getNode(id: string): GraphNode | null;
|
|
18
|
+
getNodesByFile(filePath: string): GraphNode[];
|
|
19
|
+
searchNodes(query: string): GraphNode[];
|
|
20
|
+
deleteNodesByFile(filePath: string): void;
|
|
21
|
+
upsertEdge(edge: GraphEdge): void;
|
|
22
|
+
getEdgesFrom(nodeId: string): GraphEdge[];
|
|
23
|
+
getEdgesTo(nodeId: string): GraphEdge[];
|
|
24
|
+
getEdgesFromByKind(nodeId: string, kind: string): GraphEdge[];
|
|
25
|
+
getEdgesToByKind(nodeId: string, kind: string): GraphEdge[];
|
|
26
|
+
deleteEdgesByFile(filePath: string): void;
|
|
27
|
+
upsertFile(record: FileRecord): void;
|
|
28
|
+
getFile(filePath: string): FileRecord | null;
|
|
29
|
+
getAllFiles(): FileRecord[];
|
|
30
|
+
deleteFile(filePath: string): void;
|
|
31
|
+
getStats(): {
|
|
32
|
+
nodes: number;
|
|
33
|
+
edges: number;
|
|
34
|
+
files: number;
|
|
35
|
+
};
|
|
36
|
+
getNodeCountByKind(): Record<string, number>;
|
|
37
|
+
getAllNodes(): GraphNode[];
|
|
38
|
+
getAllEdges(): GraphEdge[];
|
|
39
|
+
private rowToNode;
|
|
40
|
+
private rowToEdge;
|
|
41
|
+
private rowToFile;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/graph/db.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAmDpE,qBAAa,OAAO;IAClB,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAC,KAAK,CAA4B;gBAEpC,WAAW,EAAE,MAAM;IAQ/B,2EAA2E;IACrE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB3B,yCAAyC;IACzC,OAAO,IAAI,IAAI;IAKf,KAAK,IAAI,IAAI;IAOb,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IA2BjC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IAMrC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE;IAM7C,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE;IAUvC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMzC,UAAU,CAAC,IAAI,EAAE,SAAS,GAAG,IAAI;IAWjC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAMzC,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE;IAMvC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAM7D,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE;IAM3D,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAWzC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAuBpC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAM5C,WAAW,IAAI,UAAU,EAAE;IAM3B,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAQlC,QAAQ,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAO3D,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQ5C,WAAW,IAAI,SAAS,EAAE;IAM1B,WAAW,IAAI,SAAS,EAAE;IAQ1B,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,SAAS;IAajB,OAAO,CAAC,SAAS;CAalB"}
|