@astrolabe-dev/cli 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.
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,657 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @astrolabe-dev/cli — CLI entry point with full command suite.
4
+ */
5
+ import { program } from 'commander';
6
+ import { readFileSync, existsSync, statSync, rmSync, mkdirSync } from 'node:fs';
7
+ import { join, dirname, basename, resolve } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { execSync } from 'node:child_process';
10
+ import { createInterface } from 'node:readline';
11
+ import { createKnowledgeGraph, scanPhase, structurePhase, frameworkPhase, markdownPhase, parseEmitPhase, resolutionPhase, routesPhase, toolsPhase, ormPhase, crossFilePhase, mroPhase, communityPhase, processTracingPhase, cobolPhase, callResolutionPhase, scopeResolutionPhase, initParser, createSqliteStore, createFtsSearch, createLogger, createPhaseContext, runPipeline, startMcpServer, loadRegistry, saveRegistry, removeRepo, getGitRemote, generateSkill, loadMeta, saveMeta, computeFileDiff, buildMeta, installHooks, createGroup, removeGroup, addRepoToGroup, removeRepoFromGroup, listGroups, getGroupStatus, autoSetup, generateAgentFiles, startHttpServer, generateWiki, startEvalServer, } from '@astrolabe-dev/core';
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const pkg = JSON.parse(readFileSync(join(__dirname, '..', 'package.json'), 'utf-8'));
14
+ function getGitCommit(repoPath) {
15
+ try {
16
+ return execSync('git rev-parse HEAD', { cwd: repoPath, encoding: 'utf-8' }).trim();
17
+ }
18
+ catch {
19
+ return 'unknown';
20
+ }
21
+ }
22
+ program.name('astrolabe').description('Codebase knowledge graph analysis tool').version(pkg.version);
23
+ program.command('version').description('Show version information').action(() => { console.log(`astrolabe v${pkg.version}`); });
24
+ // ── analyze ──────────────────────────────────────────────────────────────────
25
+ program
26
+ .command('analyze <repoPath>')
27
+ .description('Analyze a codebase and build the knowledge graph')
28
+ .option('-o, --output <path>', 'Output database path', '.astrolabe/astrolabe.db')
29
+ .option('--log-level <level>', 'Log level (debug, info, warn, error)', 'info')
30
+ .option('--skip-workers', 'Disable parallel parsing (sequential only)')
31
+ .option('--skip-agents-md', 'Skip AGENTS.md/CLAUDE.md generation (#268)')
32
+ .option('--skills', 'Generate per-community SKILL.md files (#267)')
33
+ .option('--max-file-size <kb>', 'Skip files larger than N KB (default: 512, max: 32768)', parseInt)
34
+ .action(async (repoPath, opts) => {
35
+ const log = createLogger({ level: opts.logLevel });
36
+ log.info('Starting analysis', { repoPath, output: opts.output });
37
+ // #373: Configure max file size (env var + CLI flag)
38
+ if (opts.maxFileSize) {
39
+ process.env.ASTROLABE_MAX_FILE_SIZE = String(Math.max(1, opts.maxFileSize));
40
+ log.info(`ASTROLABE_MAX_FILE_SIZE: effective threshold ${process.env.ASTROLABE_MAX_FILE_SIZE}KB (default 512KB)`);
41
+ }
42
+ try {
43
+ await initParser();
44
+ const outDir = dirname(opts.output);
45
+ if (outDir !== '.' && !existsSync(outDir))
46
+ mkdirSync(outDir, { recursive: true });
47
+ const dbPath = resolve(opts.output);
48
+ const repoName = basename(repoPath);
49
+ const lastCommit = getGitCommit(repoPath);
50
+ const onProgress = () => undefined;
51
+ // Phase 1: Always scan first — needed for meta.json and incremental diff
52
+ const scanGraph = createKnowledgeGraph();
53
+ const scanCtx = createPhaseContext(repoPath, scanGraph, onProgress);
54
+ await runPipeline([scanPhase], scanCtx);
55
+ const scanOutput = scanCtx.state.get('output:scan');
56
+ if (!scanOutput)
57
+ throw new Error('Scan phase did not produce output');
58
+ const currentHashes = new Map();
59
+ for (const f of scanOutput.files)
60
+ currentHashes.set(f.path, f.hash);
61
+ // #280: Attempt incremental analysis if previous analysis exists
62
+ const storedMeta = loadMeta(dirname(dbPath));
63
+ const dbExists = existsSync(dbPath);
64
+ let graph;
65
+ let nodeCount = 0;
66
+ let edgeCount = 0;
67
+ let isIncremental = false; // #338: track for AGENTS.md generation
68
+ if (storedMeta && dbExists) {
69
+ // ── Incremental mode ──
70
+ isIncremental = true; // #338: track for AGENTS.md generation
71
+ log.info('Incremental analysis enabled — comparing file hashes...');
72
+ const diff = computeFileDiff(currentHashes, storedMeta);
73
+ const totalChanged = diff.changed.length + diff.added.length + diff.deleted.length;
74
+ log.info('Incremental diff', {
75
+ changed: diff.changed.length, added: diff.added.length,
76
+ deleted: diff.deleted.length, unchanged: diff.unchanged.length,
77
+ });
78
+ // If nothing changed, skip analysis entirely but still save meta
79
+ if (totalChanged === 0 && lastCommit === storedMeta.lastCommit) {
80
+ log.info('No changes detected — analysis skipped.');
81
+ saveMeta(dirname(dbPath), buildMeta(currentHashes, lastCommit));
82
+ return;
83
+ }
84
+ // Load existing graph from DB, patch for deleted/changed files
85
+ const loadStore = createSqliteStore(dbPath);
86
+ graph = loadStore.loadGraph();
87
+ loadStore.close();
88
+ for (const fp of diff.deleted)
89
+ graph.removeNodesByFile(fp);
90
+ for (const fp of diff.changed)
91
+ graph.removeNodesByFile(fp);
92
+ // #318: Clean stale Community/Process nodes before re-running global phases
93
+ // These phases operate on the entire graph and re-create output each run.
94
+ for (const node of [...graph.iterNodes()]) {
95
+ if (node.label === 'Community' || node.label === 'Process') {
96
+ graph.removeNode(node.id);
97
+ }
98
+ }
99
+ // Run remaining phases with file filter
100
+ const ctx = createPhaseContext(repoPath, graph, onProgress);
101
+ ctx.state.set('output:scan', scanOutput);
102
+ ctx.state.set('skipWorkers', opts.skipWorkers ?? false);
103
+ ctx.state.set('incremental:changedPaths', new Set([...diff.changed, ...diff.added]));
104
+ await runPipeline([
105
+ structurePhase, frameworkPhase, markdownPhase, parseEmitPhase,
106
+ resolutionPhase, routesPhase, toolsPhase, ormPhase, crossFilePhase,
107
+ mroPhase, communityPhase, processTracingPhase,
108
+ cobolPhase,
109
+ callResolutionPhase, scopeResolutionPhase,
110
+ ], ctx);
111
+ nodeCount = graph.nodeCount;
112
+ edgeCount = graph.relationshipCount;
113
+ log.info('Incremental analysis complete', { nodes: nodeCount, edges: edgeCount });
114
+ }
115
+ else {
116
+ // ── Full analysis (first run or missing meta/DB) ──
117
+ graph = createKnowledgeGraph();
118
+ const context = createPhaseContext(repoPath, graph, onProgress);
119
+ context.state.set('output:scan', scanOutput);
120
+ await runPipeline([
121
+ structurePhase, frameworkPhase, markdownPhase, parseEmitPhase,
122
+ resolutionPhase, routesPhase, toolsPhase, ormPhase, crossFilePhase,
123
+ mroPhase, communityPhase, processTracingPhase,
124
+ cobolPhase,
125
+ callResolutionPhase, scopeResolutionPhase,
126
+ ], context);
127
+ nodeCount = graph.nodeCount;
128
+ edgeCount = graph.relationshipCount;
129
+ log.info('Full analysis complete', { nodes: nodeCount, edges: edgeCount });
130
+ }
131
+ // Save graph to SQLite
132
+ const store = createSqliteStore(dbPath);
133
+ store.saveGraph(graph);
134
+ // FTS index is created lazily on first query — no eager creation here
135
+ store.close();
136
+ // Save meta.json with current file hashes for next incremental run
137
+ saveMeta(dirname(dbPath), buildMeta(currentHashes, lastCommit));
138
+ // Register repo in global registry for multi-repo MCP support
139
+ const repos = loadRegistry();
140
+ const existingIdx = repos.findIndex((r) => r.path === repoPath);
141
+ const remoteUrl = getGitRemote(repoPath) ?? undefined;
142
+ const entry = { name: repoName, path: repoPath, dbPath, lastCommit, indexedAt: Date.now(), remoteUrl };
143
+ if (existingIdx >= 0)
144
+ repos[existingIdx] = entry;
145
+ else
146
+ repos.push(entry);
147
+ saveRegistry(repos);
148
+ // #276: Install Claude Code hooks for auto-augmentation
149
+ const hookResult = installHooks(repoPath);
150
+ log.info('Claude Code hooks installed', { scripts: hookResult.scripts, config: hookResult.config });
151
+ // #268, #267: Generate AGENTS.md/CLAUDE.md and per-community skills
152
+ if (!opts.skipAgentsMd) {
153
+ // Count nodes by label
154
+ const lc = {};
155
+ for (const n of graph.iterNodes())
156
+ lc[n.label] = (lc[n.label] ?? 0) + 1;
157
+ const agentResult = generateAgentFiles(repoPath, {
158
+ repoName,
159
+ repoPath,
160
+ nodeCount,
161
+ relationshipCount: edgeCount,
162
+ processCount: lc['Process'] ?? 0,
163
+ communityCount: lc['Community'] ?? 0,
164
+ routeCount: lc['Route'] ?? 0,
165
+ toolCount: lc['Tool'] ?? 0,
166
+ lastCommit,
167
+ isIncremental,
168
+ graph: opts.skills ? graph : undefined,
169
+ skills: opts.skills ?? false,
170
+ });
171
+ log.info('Agent files generated', { agentsMd: agentResult.agentsMd, claudeMd: agentResult.claudeMd, skillsCount: agentResult.skillsCount });
172
+ }
173
+ log.info('Analysis complete', { nodes: nodeCount, edges: edgeCount, repo: repoName });
174
+ }
175
+ catch (err) {
176
+ log.error('Analysis failed', { error: String(err) });
177
+ process.exit(1);
178
+ }
179
+ });
180
+ // ── query ────────────────────────────────────────────────────────────────────
181
+ program
182
+ .command('query <search>')
183
+ .description('Search the knowledge graph for symbols')
184
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
185
+ .option('-n, --limit <number>', 'Max results', '20')
186
+ .action((search, opts) => {
187
+ const fts = createFtsSearch(opts.db);
188
+ try {
189
+ const results = fts.search(search, parseInt(opts.limit, 10) || 20);
190
+ for (const r of results)
191
+ console.log(`${r.label.padEnd(12)} ${r.name.padEnd(30)} ${r.filePath}`);
192
+ if (results.length === 0)
193
+ console.log('No results found.');
194
+ }
195
+ finally {
196
+ fts.close();
197
+ }
198
+ });
199
+ // ── serve-mcp ────────────────────────────────────────────────────────────────
200
+ program
201
+ .command('serve-mcp')
202
+ .description('Start an MCP server for AI assistant integration')
203
+ .action(async () => { console.error('Astrolabe MCP server starting...'); await startMcpServer(); });
204
+ // ── serve (HTTP API) ──────────────────────────────────────────────────────
205
+ program
206
+ .command('serve')
207
+ .description('Start an HTTP API server for web UI and headless integration (#262)')
208
+ .option('-p, --port <number>', 'Port to listen on', '4747')
209
+ .option('-h, --host <host>', 'Host to bind to', 'localhost')
210
+ .action((opts) => {
211
+ const server = startHttpServer({ port: parseInt(opts.port, 10), host: opts.host });
212
+ process.on('SIGINT', () => { server.close(); process.exit(0); });
213
+ process.on('SIGTERM', () => { server.close(); process.exit(0); });
214
+ });
215
+ // ── eval-server (REST eval API) ──────────────────────────────────────────
216
+ program
217
+ .command('eval-server')
218
+ .description('Start an eval REST server for benchmarking (#448)')
219
+ .option('-p, --port <number>', 'Port to listen on', '4748')
220
+ .option('-h, --host <host>', 'Host to bind to', 'localhost')
221
+ .option('--idle-timeout <seconds>', 'Idle shutdown timeout in seconds', '300')
222
+ .action((opts) => {
223
+ const server = startEvalServer({
224
+ port: parseInt(opts.port, 10),
225
+ host: opts.host,
226
+ idleTimeout: parseInt(opts.idleTimeout, 10),
227
+ });
228
+ process.on('SIGINT', () => { server.close(); process.exit(0); });
229
+ process.on('SIGTERM', () => { server.close(); process.exit(0); });
230
+ });
231
+ // ── status ────────────────────────────────────────────────────────────────────
232
+ program
233
+ .command('status')
234
+ .description('Show analysis status for the current repository')
235
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
236
+ .action((opts) => {
237
+ if (!existsSync(opts.db)) {
238
+ console.log('No analysis found. Run `astrolabe analyze <repo>` first.');
239
+ return;
240
+ }
241
+ const s = statSync(opts.db);
242
+ console.log(`Database: ${opts.db}\nSize: ${(s.size / 1024).toFixed(1)} KB\nLast modified: ${s.mtime.toISOString()}`);
243
+ try {
244
+ const store = createSqliteStore(opts.db);
245
+ try {
246
+ console.log(`Nodes: ${store.getNodeCount()}\nRelationships: ${store.getRelationshipCount()}`);
247
+ }
248
+ finally {
249
+ store.close();
250
+ }
251
+ }
252
+ catch {
253
+ console.log('Unable to read database.');
254
+ }
255
+ });
256
+ // ── clean ──────────────────────────────────────────────────────────────────────
257
+ program
258
+ .command('clean')
259
+ .description('Remove analysis artifacts (.astrolabe directory)')
260
+ .action(() => {
261
+ if (existsSync('.astrolabe')) {
262
+ rmSync('.astrolabe', { recursive: true, force: true });
263
+ console.log('Removed .astrolabe directory.');
264
+ }
265
+ else {
266
+ console.log('No .astrolabe directory found.');
267
+ }
268
+ });
269
+ // ── remove ────────────────────────────────────────────────────────────────────
270
+ program
271
+ .command('remove <target>')
272
+ .description('Unregister a repo from the global registry by name or path')
273
+ .option('--purge', 'Also remove the .astrolabe directory from the repo')
274
+ .option('--force', 'Skip confirmation prompt')
275
+ .action(async (target, opts) => {
276
+ // Find matching entry without modifying the registry
277
+ const repos = loadRegistry();
278
+ const normalized = target.replace(/[/\\]+$/, '');
279
+ const absTarget = resolve(normalized);
280
+ const match = repos.find((e) => e.name === normalized || e.path === normalized || e.path === absTarget);
281
+ if (!match) {
282
+ console.log(`No registered repo matching "${target}" found.`);
283
+ return;
284
+ }
285
+ console.log(`Found: ${match.name} (${match.path})`);
286
+ // Confirmation prompt (skip with --force)
287
+ if (!opts.force) {
288
+ const answer = await new Promise((res) => {
289
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
290
+ rl.question('Remove from registry? [y/N] ', (ans) => { rl.close(); res(ans.trim().toLowerCase()); });
291
+ });
292
+ if (answer !== 'y' && answer !== 'yes') {
293
+ console.log('Cancelled.');
294
+ return;
295
+ }
296
+ }
297
+ const removed = removeRepo(target);
298
+ if (removed) {
299
+ console.log(`Removed "${removed.name}" from registry.`);
300
+ }
301
+ if (opts.purge && removed) {
302
+ const astrolabeDir = join(removed.path, '.astrolabe');
303
+ if (existsSync(astrolabeDir)) {
304
+ rmSync(astrolabeDir, { recursive: true, force: true });
305
+ console.log(`Purged .astrolabe directory at ${astrolabeDir}.`);
306
+ }
307
+ else {
308
+ console.log(`No .astrolabe directory found at ${removed.path}.`);
309
+ }
310
+ }
311
+ });
312
+ // ── context ────────────────────────────────────────────────────────────────────
313
+ program
314
+ .command('context <symbol-name>')
315
+ .description('Show the definition context for a symbol')
316
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
317
+ .action((symbolName, opts) => {
318
+ const fts = createFtsSearch(opts.db);
319
+ try {
320
+ const results = fts.search(symbolName, 5);
321
+ if (results.length === 0) {
322
+ console.log(`No symbols found matching "${symbolName}".`);
323
+ }
324
+ else {
325
+ console.log(`Context for "${symbolName}":`);
326
+ for (const r of results)
327
+ console.log(` ${r.label} ${r.name} (${r.filePath})`);
328
+ }
329
+ }
330
+ finally {
331
+ fts.close();
332
+ }
333
+ });
334
+ // ── impact ─────────────────────────────────────────────────────────────────────
335
+ program
336
+ .command('impact <symbol-name>')
337
+ .description('Show code impact analysis for a symbol')
338
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
339
+ .action((symbolName, opts) => {
340
+ const store = createSqliteStore(opts.db);
341
+ try {
342
+ const graph = store.loadGraph();
343
+ // #134: Pre-build adjacency index (O(R)) for O(1) neighbor lookup
344
+ const adj = new Map();
345
+ for (const rel of graph.iterRelationships()) {
346
+ let bucket = adj.get(rel.sourceId);
347
+ if (!bucket) {
348
+ bucket = [];
349
+ adj.set(rel.sourceId, bucket);
350
+ }
351
+ bucket.push({ neighborId: rel.targetId, type: rel.type, direction: 'outgoing' });
352
+ bucket = adj.get(rel.targetId);
353
+ if (!bucket) {
354
+ bucket = [];
355
+ adj.set(rel.targetId, bucket);
356
+ }
357
+ bucket.push({ neighborId: rel.sourceId, type: rel.type, direction: 'incoming' });
358
+ }
359
+ let found = 0;
360
+ for (const node of graph.iterNodes()) {
361
+ if (node.properties.name === symbolName) {
362
+ found++;
363
+ console.log(`${node.label}: ${node.id}`);
364
+ const neighbors = adj.get(node.id) ?? [];
365
+ for (const { neighborId, type, direction } of neighbors) {
366
+ const other = graph.getNode(neighborId);
367
+ console.log(` ${direction === 'outgoing' ? '→' : '←'} ${type} ${other?.properties.name ?? neighborId}`);
368
+ }
369
+ }
370
+ }
371
+ if (found === 0)
372
+ console.log(`Symbol "${symbolName}" not found.`);
373
+ }
374
+ finally {
375
+ store.close();
376
+ }
377
+ });
378
+ // ── list ───────────────────────────────────────────────────────────────────────
379
+ program
380
+ .command('list')
381
+ .description('List all symbols in the knowledge graph')
382
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
383
+ .option('--label <label>', 'Filter by node label (Function, Class, etc.)')
384
+ .action((opts) => {
385
+ const store = createSqliteStore(opts.db);
386
+ try {
387
+ const graph = store.loadGraph();
388
+ let count = 0;
389
+ for (const node of graph.iterNodes()) {
390
+ if (opts.label && node.label !== opts.label)
391
+ continue;
392
+ count++;
393
+ console.log(`${node.label.padEnd(12)} ${node.properties.name ?? '?'} (${node.properties.filePath ?? '?'})`);
394
+ if (count >= 100) {
395
+ console.log('...(truncated at 100)');
396
+ break;
397
+ }
398
+ }
399
+ if (count === 0)
400
+ console.log('No symbols found.');
401
+ }
402
+ finally {
403
+ store.close();
404
+ }
405
+ });
406
+ // ── generate-skill ──────────────────────────────────────────────────────────────
407
+ program
408
+ .command('generate-skill')
409
+ .description('Generate a Markdown skill file for AI assistants (#110)')
410
+ .option('-o, --output <path>', 'Output file path', 'astrolabe-skill.md')
411
+ .action((opts) => {
412
+ generateSkill(opts.output);
413
+ });
414
+ // ── group (cross-repo management) ──────────────────────────────────────────
415
+ const groupCmd = program.command('group').description('Manage cross-repo groups for multi-repo tracking (#266)');
416
+ groupCmd.command('create <name>')
417
+ .description('Create a new repository group')
418
+ .action((name) => {
419
+ const group = createGroup(name);
420
+ console.log(`Group "${group.name}" created.`);
421
+ });
422
+ groupCmd.command('remove <name>')
423
+ .description('Remove a repository group')
424
+ .action((name) => {
425
+ removeGroup(name);
426
+ console.log(`Group "${name}" removed.`);
427
+ });
428
+ groupCmd.command('add <group> <path> <repoName>')
429
+ .description('Add a repository to a group at the given hierarchy path')
430
+ .action((group, path, repoName) => {
431
+ addRepoToGroup(group, path, repoName);
432
+ console.log(`Added "${repoName}" to group "${group}" at path "${path}".`);
433
+ });
434
+ groupCmd.command('remove-repo <group> <path>')
435
+ .description('Remove a repository from a group by hierarchy path')
436
+ .action((group, path) => {
437
+ removeRepoFromGroup(group, path);
438
+ console.log(`Removed "${path}" from group "${group}".`);
439
+ });
440
+ groupCmd.command('list')
441
+ .description('List all groups')
442
+ .action(() => {
443
+ const groups = listGroups();
444
+ if (groups.length === 0) {
445
+ console.log('No groups defined. Use `astrolabe group create <name>` to create one.');
446
+ return;
447
+ }
448
+ for (const g of groups) {
449
+ console.log(`${g.name} (${Object.keys(g.repos).length} repos, created ${new Date(g.createdAt).toISOString()})`);
450
+ for (const [path, repo] of Object.entries(g.repos)) {
451
+ console.log(` ${path} → ${repo.repoName}`);
452
+ }
453
+ }
454
+ });
455
+ groupCmd.command('status <name>')
456
+ .description('Show staleness and status of all repos in a group')
457
+ .action((name) => {
458
+ const status = getGroupStatus(name);
459
+ console.log(`Group: ${status.name} (${status.repoCount} repos)`);
460
+ for (const r of status.repos) {
461
+ const staleIcon = r.stale ? '⚠' : '✓';
462
+ const indexed = r.indexedAt ? new Date(r.indexedAt).toISOString() : 'never';
463
+ console.log(` ${staleIcon} ${r.path} → ${r.repoName} (indexed: ${indexed})`);
464
+ }
465
+ });
466
+ // ── setup (auto-detect editors and configure MCP) ─────────────────────────
467
+ program.command('setup')
468
+ .description('Auto-detect editors (Cursor, Windsurf, Claude Code, etc.) and write MCP config')
469
+ .option('--force', 'Overwrite existing configurations')
470
+ .action((opts) => {
471
+ const results = autoSetup(opts.force ?? false);
472
+ let configured = 0;
473
+ for (const r of results) {
474
+ if (r.configured) {
475
+ console.log(` ✓ ${r.editor} — ${r.path}`);
476
+ configured++;
477
+ }
478
+ else if (r.skipped) {
479
+ console.log(` - ${r.editor}: ${r.skipped}`);
480
+ }
481
+ else if (r.error) {
482
+ console.log(` ✗ ${r.editor}: ${r.error}`);
483
+ }
484
+ }
485
+ if (configured === 0 && results.every((r) => !r.configured && !r.skipped)) {
486
+ console.log('\nNo supported editors detected. Manually configure MCP:');
487
+ console.log(' https://github.com/danielperezr88/astrolabe#mcp-integration');
488
+ }
489
+ else {
490
+ console.log(`\n${configured} editor(s) configured. Restart your editor to activate Astrolabe MCP.`);
491
+ }
492
+ });
493
+ function augmentTraverse(graph, startIds, maxDepth) {
494
+ // Build bidirectional adjacency index
495
+ const adj = new Map();
496
+ for (const rel of graph.iterRelationships()) {
497
+ let bucket = adj.get(rel.sourceId);
498
+ if (!bucket) {
499
+ bucket = [];
500
+ adj.set(rel.sourceId, bucket);
501
+ }
502
+ bucket.push({ neighborId: rel.targetId, type: rel.type, direction: 'outgoing' });
503
+ bucket = adj.get(rel.targetId);
504
+ if (!bucket) {
505
+ bucket = [];
506
+ adj.set(rel.targetId, bucket);
507
+ }
508
+ bucket.push({ neighborId: rel.sourceId, type: rel.type, direction: 'incoming' });
509
+ }
510
+ // Relationship types we care about for augmentation
511
+ const augTypes = new Set(['CALLS', 'IMPORTS', 'MEMBER_OF']);
512
+ const visited = new Set(startIds);
513
+ const results = [];
514
+ let frontier = new Set(startIds);
515
+ for (let depth = 1; depth <= maxDepth; depth++) {
516
+ const nextFrontier = new Set();
517
+ for (const nodeId of frontier) {
518
+ const neighbors = adj.get(nodeId) ?? [];
519
+ for (const { neighborId, type, direction } of neighbors) {
520
+ if (!augTypes.has(type))
521
+ continue;
522
+ if (visited.has(neighborId))
523
+ continue;
524
+ visited.add(neighborId);
525
+ const neighbor = graph.getNode(neighborId);
526
+ results.push({
527
+ name: neighbor?.properties.name ?? neighborId,
528
+ label: neighbor?.label ?? 'Unknown',
529
+ filePath: neighbor?.properties.filePath ?? '',
530
+ relationship: type,
531
+ direction,
532
+ depth,
533
+ });
534
+ nextFrontier.add(neighborId);
535
+ }
536
+ }
537
+ frontier = nextFrontier;
538
+ if (frontier.size === 0)
539
+ break;
540
+ }
541
+ return results;
542
+ }
543
+ program
544
+ .command('augment <pattern>')
545
+ .description('Enrich a search pattern with graph context (callers, callees, imports, community members)')
546
+ .option('-d, --db <path>', 'Database path', '.astrolabe/astrolabe.db')
547
+ .option('--depth <number>', 'Traversal depth (hops)', '2')
548
+ .option('--format <format>', 'Output format: text or json', 'text')
549
+ .action((pattern, opts) => {
550
+ if (!existsSync(opts.db)) {
551
+ console.log('No analysis found. Run `astrolabe analyze <repo>` first.');
552
+ return;
553
+ }
554
+ const depth = Math.max(1, parseInt(opts.depth, 10) || 2);
555
+ const format = opts.format === 'json' ? 'json' : 'text';
556
+ const store = createSqliteStore(opts.db);
557
+ try {
558
+ const graph = store.loadGraph();
559
+ // Find nodes matching pattern (case-insensitive substring)
560
+ const lowerPattern = pattern.toLowerCase();
561
+ const matches = [];
562
+ for (const node of graph.iterNodes()) {
563
+ const name = node.properties.name ?? '';
564
+ if (name.toLowerCase().includes(lowerPattern)) {
565
+ matches.push({
566
+ id: node.id,
567
+ name,
568
+ label: node.label,
569
+ filePath: node.properties.filePath ?? '',
570
+ startLine: node.properties.startLine ?? 0,
571
+ });
572
+ }
573
+ }
574
+ if (matches.length === 0) {
575
+ console.log(`No symbols found matching "${pattern}".`);
576
+ return;
577
+ }
578
+ // Traverse from matched nodes
579
+ const startIds = new Set(matches.map((m) => m.id));
580
+ const related = augmentTraverse(graph, startIds, depth);
581
+ if (format === 'json') {
582
+ const output = {
583
+ pattern,
584
+ matches: matches.map((m) => ({
585
+ id: m.id,
586
+ name: m.name,
587
+ label: m.label,
588
+ filePath: m.filePath,
589
+ startLine: m.startLine,
590
+ })),
591
+ related: related.map((r) => ({
592
+ name: r.name,
593
+ label: r.label,
594
+ filePath: r.filePath,
595
+ relationship: r.relationship,
596
+ direction: r.direction,
597
+ depth: r.depth,
598
+ })),
599
+ };
600
+ console.log(JSON.stringify(output, null, 2));
601
+ }
602
+ else {
603
+ console.log(`Pattern: ${pattern}`);
604
+ for (const m of matches) {
605
+ console.log(` Match: ${m.label}:${m.name} (${m.filePath}${m.startLine ? ':' + m.startLine : ''})`);
606
+ }
607
+ console.log(`Related (depth ${depth}):`);
608
+ if (related.length === 0) {
609
+ console.log(' (none)');
610
+ }
611
+ else {
612
+ for (const r of related) {
613
+ const dirLabel = r.direction === 'outgoing' ? 'callee' : 'caller';
614
+ const relLabel = r.relationship === 'MEMBER_OF' ? 'same community' : dirLabel;
615
+ const loc = r.filePath ? ` (${r.filePath})` : '';
616
+ console.log(` - ${r.name} (${relLabel}, depth ${r.depth})${loc}`);
617
+ }
618
+ }
619
+ }
620
+ }
621
+ finally {
622
+ store.close();
623
+ }
624
+ });
625
+ // ── wiki (LLM-powered documentation generation) ────────────────────────────
626
+ program.command('wiki <repoPath>')
627
+ .description('Generate LLM-powered wiki documentation from knowledge graph (#269)')
628
+ .option('--model <model>', 'LLM model name', 'gpt-4o-mini')
629
+ .option('--base-url <url>', 'LLM API base URL')
630
+ .option('--force', 'Force full regeneration of wiki')
631
+ .option('--review', 'Stop after module tree creation for review (#452)')
632
+ .option('--resume', 'Resume from edited module tree (#452)')
633
+ .option('--gist', 'Publish wiki to GitHub Gist after generation (#452)')
634
+ .action(async (repoPath, opts) => {
635
+ const repoName = repoPath.split('/').pop() || repoPath;
636
+ const dbPath = join(repoPath, '.astrolabe', 'astrolabe.db');
637
+ if (!existsSync(dbPath)) {
638
+ console.log('No knowledge graph found. Run `astrolabe analyze` first.');
639
+ return;
640
+ }
641
+ const store = createSqliteStore(dbPath);
642
+ const graph = store.loadGraph();
643
+ store.close();
644
+ console.log(`Generating wiki for ${repoName}...`);
645
+ const result = await generateWiki({
646
+ repoPath, repoName, graph,
647
+ model: opts.model, baseUrl: opts.baseUrl, force: opts.force,
648
+ review: opts.review, resume: opts.resume, gist: opts.gist,
649
+ });
650
+ console.log(`Wiki generated: ${result.pageCount} pages, ${result.moduleCount} modules`);
651
+ console.log(`Overview: ${result.overviewPath}`);
652
+ if (result.gistUrl) {
653
+ console.log(`Gist: ${result.gistUrl}`);
654
+ }
655
+ });
656
+ program.parse();
657
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@astrolabe-dev/cli",
3
+ "version": "1.0.0",
4
+ "description": "Astrolabe CLI — command-line interface for codebase knowledge graph analysis",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "astrolabe": "dist/index.js"
10
+ },
11
+ "files": [
12
+ "dist",
13
+ "!dist/**/*.test.*"
14
+ ],
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "watch": "tsc --watch",
21
+ "clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\""
22
+ },
23
+ "license": "MIT",
24
+ "keywords": [
25
+ "astrolabe",
26
+ "code-analysis",
27
+ "knowledge-graph",
28
+ "cli"
29
+ ],
30
+ "dependencies": {
31
+ "@astrolabe-dev/core": "^1.0.0",
32
+ "@astrolabe-dev/shared": "^1.0.0",
33
+ "commander": "^12.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^22.0.0",
37
+ "typescript": "^5.7.0",
38
+ "vitest": "^4.1.5"
39
+ }
40
+ }