@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.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +657 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
package/dist/index.d.ts
ADDED
|
@@ -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
|
+
}
|