@colbymchenry/codegraph 0.6.5 → 0.6.6

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,46 @@
1
+ /**
2
+ * CodeGraph Visualizer Server
3
+ *
4
+ * Lightweight HTTP server that serves the graph visualization UI
5
+ * and exposes REST API endpoints for querying the CodeGraph database.
6
+ */
7
+ import type CodeGraph from '../index';
8
+ export interface VisualizerOptions {
9
+ /** Port to listen on (0 = auto-assign) */
10
+ port?: number;
11
+ /** Whether to open browser automatically */
12
+ openBrowser?: boolean;
13
+ /** Host to bind to */
14
+ host?: string;
15
+ }
16
+ export declare class VisualizerServer {
17
+ private cg;
18
+ private server;
19
+ private projectRoot;
20
+ private symbolIndexCache;
21
+ private claudeAvailable;
22
+ constructor(cg: CodeGraph);
23
+ /**
24
+ * Build a compact symbol index string for Claude prompts
25
+ */
26
+ private buildSymbolIndex;
27
+ /**
28
+ * Ask Claude CLI to interpret a natural language question into relevant symbol names
29
+ */
30
+ private askClaude;
31
+ /**
32
+ * Start the visualizer server
33
+ */
34
+ start(options?: VisualizerOptions): Promise<{
35
+ port: number;
36
+ url: string;
37
+ }>;
38
+ /**
39
+ * Stop the server
40
+ */
41
+ stop(): Promise<void>;
42
+ private handleRequest;
43
+ private handleAPI;
44
+ private serveStatic;
45
+ }
46
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/visualizer/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,OAAO,KAAK,SAAS,MAAM,UAAU,CAAC;AAGtC,MAAM,WAAW,iBAAiB;IAChC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAaD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAY;IACtB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,eAAe,CAAwB;gBAEnC,EAAE,EAAE,SAAS;IAKzB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAuBxB;;OAEG;YACW,SAAS;IA2EvB;;OAEG;IACG,KAAK,CAAC,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IA2BpF;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAUP,aAAa;YAwBb,SAAS;IAmRvB,OAAO,CAAC,WAAW;CAoCpB"}
@@ -0,0 +1,499 @@
1
+ "use strict";
2
+ /**
3
+ * CodeGraph Visualizer Server
4
+ *
5
+ * Lightweight HTTP server that serves the graph visualization UI
6
+ * and exposes REST API endpoints for querying the CodeGraph database.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.VisualizerServer = void 0;
43
+ const http = __importStar(require("http"));
44
+ const fs = __importStar(require("fs"));
45
+ const path = __importStar(require("path"));
46
+ const url = __importStar(require("url"));
47
+ const child_process_1 = require("child_process");
48
+ /**
49
+ * Serialize a Subgraph (which uses Map) to plain JSON
50
+ */
51
+ function serializeSubgraph(subgraph) {
52
+ return {
53
+ nodes: Array.from(subgraph.nodes.values()),
54
+ edges: subgraph.edges,
55
+ roots: subgraph.roots,
56
+ };
57
+ }
58
+ class VisualizerServer {
59
+ cg;
60
+ server = null;
61
+ projectRoot;
62
+ symbolIndexCache = null;
63
+ claudeAvailable = null;
64
+ constructor(cg) {
65
+ this.cg = cg;
66
+ this.projectRoot = cg.getProjectRoot();
67
+ }
68
+ /**
69
+ * Build a compact symbol index string for Claude prompts
70
+ */
71
+ buildSymbolIndex() {
72
+ if (this.symbolIndexCache)
73
+ return this.symbolIndexCache;
74
+ const validKinds = ['function', 'method', 'class', 'interface', 'component', 'route', 'enum', 'type_alias'];
75
+ const byFile = new Map();
76
+ for (const kind of validKinds) {
77
+ for (const node of this.cg.getNodesByKind(kind)) {
78
+ const symbols = byFile.get(node.filePath) || [];
79
+ symbols.push(`${node.kind}:${node.name}`);
80
+ byFile.set(node.filePath, symbols);
81
+ }
82
+ }
83
+ const lines = [];
84
+ for (const [file, symbols] of byFile) {
85
+ lines.push(`${file}: ${symbols.join(', ')}`);
86
+ }
87
+ this.symbolIndexCache = lines.join('\n');
88
+ return this.symbolIndexCache;
89
+ }
90
+ /**
91
+ * Ask Claude CLI to interpret a natural language question into relevant symbol names
92
+ */
93
+ async askClaude(question) {
94
+ // Check if claude is available (cache result)
95
+ if (this.claudeAvailable === false)
96
+ return null;
97
+ const symbolIndex = this.buildSymbolIndex();
98
+ const prompt = `Given the question and codebase symbol index below, identify the single best ENTRY POINT symbol — the one function, component, or route handler where this flow starts.
99
+
100
+ Rules:
101
+ - Pick ONE symbol that is the starting point a user or request would hit first
102
+ - Prefer page components, route handlers, or top-level functions
103
+ - Do NOT pick utility functions, helpers, or middleware
104
+
105
+ Return ONLY this JSON, nothing else:
106
+ {"entry": "symbolName"}
107
+
108
+ Question: "${question}"
109
+
110
+ Symbol index:
111
+ ${symbolIndex}`;
112
+ return new Promise((resolve) => {
113
+ const timeout = setTimeout(() => {
114
+ resolve(null);
115
+ }, 30000);
116
+ (0, child_process_1.execFile)('claude', ['-p', prompt, '--output-format', 'text'], {
117
+ timeout: 30000,
118
+ maxBuffer: 1024 * 1024,
119
+ }, (err, stdout) => {
120
+ clearTimeout(timeout);
121
+ if (err) {
122
+ this.claudeAvailable = false;
123
+ resolve(null);
124
+ return;
125
+ }
126
+ this.claudeAvailable = true;
127
+ // Parse Claude's response — try object format first, then array fallback
128
+ try {
129
+ const text = stdout.trim();
130
+ // Try to extract JSON object {"entry": ..., "flow": [...]}
131
+ const objMatch = text.match(/\{[\s\S]*\}/);
132
+ if (objMatch) {
133
+ const parsed = JSON.parse(objMatch[0]);
134
+ if (parsed.flow && Array.isArray(parsed.flow) && parsed.flow.length > 0) {
135
+ // Return flow with entry first
136
+ const names = parsed.flow.map(String);
137
+ if (parsed.entry && !names.includes(parsed.entry)) {
138
+ names.unshift(String(parsed.entry));
139
+ }
140
+ resolve(names);
141
+ return;
142
+ }
143
+ }
144
+ // Fallback: try JSON array
145
+ const arrMatch = text.match(/\[[\s\S]*\]/);
146
+ if (arrMatch) {
147
+ const names = JSON.parse(arrMatch[0]);
148
+ if (Array.isArray(names) && names.length > 0) {
149
+ resolve(names.map(String));
150
+ return;
151
+ }
152
+ }
153
+ }
154
+ catch {
155
+ // Parse failed
156
+ }
157
+ resolve(null);
158
+ });
159
+ });
160
+ }
161
+ /**
162
+ * Start the visualizer server
163
+ */
164
+ async start(options = {}) {
165
+ const host = options.host || '127.0.0.1';
166
+ const port = options.port || 0;
167
+ this.server = http.createServer((req, res) => {
168
+ this.handleRequest(req, res).catch((err) => {
169
+ console.error('[Visualizer] Request error:', err);
170
+ res.writeHead(500, { 'Content-Type': 'application/json' });
171
+ res.end(JSON.stringify({ error: 'Internal server error' }));
172
+ });
173
+ });
174
+ return new Promise((resolve, reject) => {
175
+ this.server.listen(port, host, () => {
176
+ const addr = this.server.address();
177
+ if (!addr || typeof addr === 'string') {
178
+ reject(new Error('Failed to get server address'));
179
+ return;
180
+ }
181
+ const serverUrl = `http://${host}:${addr.port}`;
182
+ resolve({ port: addr.port, url: serverUrl });
183
+ });
184
+ this.server.on('error', reject);
185
+ });
186
+ }
187
+ /**
188
+ * Stop the server
189
+ */
190
+ stop() {
191
+ return new Promise((resolve) => {
192
+ if (this.server) {
193
+ this.server.close(() => resolve());
194
+ }
195
+ else {
196
+ resolve();
197
+ }
198
+ });
199
+ }
200
+ async handleRequest(req, res) {
201
+ const parsedUrl = url.parse(req.url || '/', true);
202
+ const pathname = parsedUrl.pathname || '/';
203
+ // CORS headers for local development
204
+ res.setHeader('Access-Control-Allow-Origin', '*');
205
+ res.setHeader('Access-Control-Allow-Methods', 'GET, OPTIONS');
206
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
207
+ if (req.method === 'OPTIONS') {
208
+ res.writeHead(204);
209
+ res.end();
210
+ return;
211
+ }
212
+ // API routes
213
+ if (pathname.startsWith('/api/')) {
214
+ return this.handleAPI(pathname, parsedUrl.query, res);
215
+ }
216
+ // Static file serving
217
+ return this.serveStatic(pathname, res);
218
+ }
219
+ async handleAPI(pathname, query, res) {
220
+ const json = (data, status = 200) => {
221
+ res.writeHead(status, { 'Content-Type': 'application/json' });
222
+ res.end(JSON.stringify(data));
223
+ };
224
+ try {
225
+ // GET /api/status
226
+ if (pathname === '/api/status') {
227
+ const stats = this.cg.getStats();
228
+ json({ stats, projectRoot: this.projectRoot, projectName: path.basename(this.projectRoot) });
229
+ return;
230
+ }
231
+ // GET /api/embeddings/status
232
+ if (pathname === '/api/embeddings/status') {
233
+ const config = this.cg.getConfig();
234
+ const embeddingStats = this.cg.getEmbeddingStats();
235
+ const isEnabled = config.enableEmbeddings === true;
236
+ const isInitialized = this.cg.isEmbeddingsInitialized();
237
+ const totalVectors = embeddingStats?.totalVectors ?? 0;
238
+ const stats = this.cg.getStats();
239
+ // Consider ready if we have vectors for at least half the eligible nodes
240
+ const eligibleNodes = stats.nodeCount - (stats.nodesByKind.file ?? 0) - (stats.nodesByKind.import ?? 0);
241
+ const isReady = isEnabled && totalVectors > 0 && totalVectors >= eligibleNodes * 0.5;
242
+ json({ isEnabled, isInitialized, isReady, totalVectors, eligibleNodes });
243
+ return;
244
+ }
245
+ // GET /api/embeddings/generate — SSE stream that enables, initializes, and generates embeddings
246
+ if (pathname === '/api/embeddings/generate') {
247
+ res.writeHead(200, {
248
+ 'Content-Type': 'text/event-stream',
249
+ 'Cache-Control': 'no-cache',
250
+ 'Connection': 'keep-alive',
251
+ });
252
+ const send = (event, data) => {
253
+ res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
254
+ };
255
+ try {
256
+ // Step 1: Enable embeddings in config
257
+ send('status', { phase: 'config', message: 'Enabling embeddings...' });
258
+ const config = this.cg.getConfig();
259
+ if (!config.enableEmbeddings) {
260
+ this.cg.updateConfig({ enableEmbeddings: true });
261
+ }
262
+ // Step 2: Initialize embedding model (downloads on first use)
263
+ send('status', { phase: 'model', message: 'Loading embedding model (first time may download ~30MB)...' });
264
+ await this.cg.initializeEmbeddings();
265
+ send('status', { phase: 'model', message: 'Embedding model ready' });
266
+ // Step 3: Generate embeddings with progress
267
+ send('status', { phase: 'embedding', message: 'Generating embeddings...' });
268
+ const count = await this.cg.generateEmbeddings((progress) => {
269
+ send('progress', {
270
+ current: progress.current,
271
+ total: progress.total,
272
+ nodeName: progress.nodeName,
273
+ percent: progress.total > 0 ? Math.round((progress.current / progress.total) * 100) : 0,
274
+ });
275
+ });
276
+ send('complete', { totalEmbedded: count, message: `Generated ${count} embeddings` });
277
+ }
278
+ catch (err) {
279
+ const message = err instanceof Error ? err.message : String(err);
280
+ send('error', { message });
281
+ }
282
+ res.end();
283
+ return;
284
+ }
285
+ // GET /api/search?q=...&kind=...&limit=...
286
+ if (pathname === '/api/search') {
287
+ const q = query.q || '';
288
+ const kind = query.kind;
289
+ const limit = parseInt(query.limit || '30', 10);
290
+ if (!q) {
291
+ json({ results: [] });
292
+ return;
293
+ }
294
+ const results = this.cg.searchNodes(q, { kinds: kind ? [kind] : undefined, limit });
295
+ json({ results });
296
+ return;
297
+ }
298
+ // GET /api/explore?q=...
299
+ // Find the best entry point, then return its call graph
300
+ if (pathname === '/api/explore') {
301
+ const q = query.q || '';
302
+ if (!q) {
303
+ json({ nodes: [], edges: [], roots: [], entryPoint: null });
304
+ return;
305
+ }
306
+ let entryNodeId = null;
307
+ let usedClaude = false;
308
+ const validKinds = ['function', 'method', 'class', 'interface', 'component', 'route'];
309
+ // Try Claude CLI to find the best entry point
310
+ const claudeNames = await this.askClaude(q);
311
+ if (claudeNames && claudeNames.length > 0) {
312
+ usedClaude = true;
313
+ // Find the entry point in the graph
314
+ for (const name of claudeNames) {
315
+ if (entryNodeId)
316
+ break;
317
+ const results = this.cg.searchNodes(name, { kinds: validKinds, limit: 3 });
318
+ for (const r of results) {
319
+ if (r.node.name.toLowerCase() === name.toLowerCase() ||
320
+ r.node.name.toLowerCase().includes(name.toLowerCase()) ||
321
+ name.toLowerCase().includes(r.node.name.toLowerCase())) {
322
+ entryNodeId = r.node.id;
323
+ break;
324
+ }
325
+ }
326
+ }
327
+ }
328
+ // Keyword fallback: find best match from query keywords
329
+ if (!entryNodeId) {
330
+ const stopWords = new Set(['how', 'does', 'what', 'the', 'is', 'a', 'an', 'and', 'or', 'in', 'to', 'for', 'of', 'with', 'when', 'do', 'it', 'my', 'work', 'works', 'about', 'show', 'me']);
331
+ const keywords = q.toLowerCase().split(/\s+/)
332
+ .map(w => w.replace(/[^a-z0-9]/g, ''))
333
+ .filter(w => w.length >= 2 && !stopWords.has(w));
334
+ for (const kw of keywords) {
335
+ if (entryNodeId)
336
+ break;
337
+ const results = this.cg.searchNodes(kw, { kinds: validKinds, limit: 5 });
338
+ if (results.length > 0) {
339
+ entryNodeId = results[0].node.id;
340
+ }
341
+ }
342
+ }
343
+ if (!entryNodeId) {
344
+ json({ nodes: [], edges: [], roots: [], entryPoint: null });
345
+ return;
346
+ }
347
+ // Get the call graph from this entry point (depth 3)
348
+ const callGraph = this.cg.getCallGraph(entryNodeId, 3);
349
+ const result = serializeSubgraph(callGraph);
350
+ json({
351
+ nodes: result.nodes,
352
+ edges: result.edges,
353
+ roots: [entryNodeId],
354
+ entryPoint: entryNodeId,
355
+ usedClaude,
356
+ });
357
+ return;
358
+ }
359
+ // GET /api/overview?limit=...
360
+ if (pathname === '/api/overview') {
361
+ const limit = parseInt(query.limit || '50', 10);
362
+ // Get top-level exported classes, functions, components
363
+ const kinds = ['class', 'function', 'interface', 'component', 'enum', 'type_alias'];
364
+ const nodes = [];
365
+ for (const kind of kinds) {
366
+ const kindNodes = this.cg.getNodesByKind(kind);
367
+ for (const n of kindNodes) {
368
+ if (n.isExported || n.kind === 'class' || n.kind === 'component') {
369
+ nodes.push(n);
370
+ }
371
+ if (nodes.length >= limit)
372
+ break;
373
+ }
374
+ if (nodes.length >= limit)
375
+ break;
376
+ }
377
+ json({ nodes });
378
+ return;
379
+ }
380
+ // GET /api/files
381
+ if (pathname === '/api/files') {
382
+ const files = this.cg.getFiles();
383
+ json({ files });
384
+ return;
385
+ }
386
+ // Routes with node ID: /api/node/<id>/...
387
+ const nodeMatch = pathname.match(/^\/api\/node\/([^/]+)(\/.*)?$/);
388
+ if (nodeMatch) {
389
+ const nodeId = decodeURIComponent(nodeMatch[1]);
390
+ const sub = nodeMatch[2] || '';
391
+ // GET /api/node/<id>
392
+ if (!sub || sub === '/') {
393
+ const node = this.cg.getNode(nodeId);
394
+ if (!node) {
395
+ json({ error: 'Node not found' }, 404);
396
+ return;
397
+ }
398
+ const code = await this.cg.getCode(nodeId);
399
+ const ancestors = this.cg.getAncestors(nodeId);
400
+ json({ node, code, ancestors });
401
+ return;
402
+ }
403
+ // GET /api/node/<id>/callers?depth=...
404
+ if (sub === '/callers') {
405
+ const depth = parseInt(query.depth || '1', 10);
406
+ const items = this.cg.getCallers(nodeId, depth);
407
+ json({ items });
408
+ return;
409
+ }
410
+ // GET /api/node/<id>/callees?depth=...
411
+ if (sub === '/callees') {
412
+ const depth = parseInt(query.depth || '1', 10);
413
+ const items = this.cg.getCallees(nodeId, depth);
414
+ json({ items });
415
+ return;
416
+ }
417
+ // GET /api/node/<id>/children
418
+ if (sub === '/children') {
419
+ const children = this.cg.getChildren(nodeId);
420
+ json({ children });
421
+ return;
422
+ }
423
+ // GET /api/node/<id>/impact?depth=...
424
+ if (sub === '/impact') {
425
+ const depth = parseInt(query.depth || '2', 10);
426
+ const subgraph = this.cg.getImpactRadius(nodeId, depth);
427
+ json(serializeSubgraph(subgraph));
428
+ return;
429
+ }
430
+ // GET /api/node/<id>/callgraph?depth=...
431
+ if (sub === '/callgraph') {
432
+ const depth = parseInt(query.depth || '2', 10);
433
+ const subgraph = this.cg.getCallGraph(nodeId, depth);
434
+ json(serializeSubgraph(subgraph));
435
+ return;
436
+ }
437
+ // GET /api/node/<id>/context
438
+ if (sub === '/context') {
439
+ const context = this.cg.getContext(nodeId);
440
+ json({ context });
441
+ return;
442
+ }
443
+ json({ error: 'Unknown endpoint' }, 404);
444
+ return;
445
+ }
446
+ // GET /api/file-nodes?path=...
447
+ if (pathname === '/api/file-nodes') {
448
+ const filePath = query.path || '';
449
+ if (!filePath) {
450
+ json({ error: 'path parameter required' }, 400);
451
+ return;
452
+ }
453
+ const nodes = this.cg.getNodesInFile(filePath);
454
+ json({ nodes });
455
+ return;
456
+ }
457
+ json({ error: 'Unknown API endpoint' }, 404);
458
+ }
459
+ catch (err) {
460
+ const message = err instanceof Error ? err.message : String(err);
461
+ json({ error: message }, 500);
462
+ }
463
+ }
464
+ serveStatic(pathname, res) {
465
+ if (pathname === '/' || pathname === '/index.html') {
466
+ pathname = '/index.html';
467
+ }
468
+ // Resolve from the public directory next to this file
469
+ const publicDir = path.join(__dirname, 'public');
470
+ const filePath = path.join(publicDir, pathname);
471
+ // Security: prevent directory traversal
472
+ if (!filePath.startsWith(publicDir)) {
473
+ res.writeHead(403);
474
+ res.end('Forbidden');
475
+ return;
476
+ }
477
+ const ext = path.extname(filePath).toLowerCase();
478
+ const mimeTypes = {
479
+ '.html': 'text/html',
480
+ '.css': 'text/css',
481
+ '.js': 'application/javascript',
482
+ '.json': 'application/json',
483
+ '.png': 'image/png',
484
+ '.svg': 'image/svg+xml',
485
+ '.ico': 'image/x-icon',
486
+ };
487
+ try {
488
+ const content = fs.readFileSync(filePath);
489
+ res.writeHead(200, { 'Content-Type': mimeTypes[ext] || 'application/octet-stream' });
490
+ res.end(content);
491
+ }
492
+ catch {
493
+ res.writeHead(404, { 'Content-Type': 'text/plain' });
494
+ res.end('Not found');
495
+ }
496
+ }
497
+ }
498
+ exports.VisualizerServer = VisualizerServer;
499
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/visualizer/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@colbymchenry/codegraph",
3
- "version": "0.6.5",
3
+ "version": "0.6.6",
4
4
  "description": "Supercharge Claude Code with semantic code intelligence. 30% fewer tokens, 25% fewer tool calls, 100% local.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -16,7 +16,7 @@
16
16
  "build": "tsc && npm run copy-assets",
17
17
  "postinstall": "node scripts/postinstall.js",
18
18
  "preuninstall": "node dist/bin/uninstall.js",
19
- "copy-assets": "node -e \"const fs=require('fs');fs.mkdirSync('dist/db',{recursive:true});fs.copyFileSync('src/db/schema.sql','dist/db/schema.sql');fs.mkdirSync('dist/extraction/wasm',{recursive:true});fs.readdirSync('src/extraction/wasm').filter(f=>f.endsWith('.wasm')).forEach(f=>fs.copyFileSync('src/extraction/wasm/'+f,'dist/extraction/wasm/'+f))\"",
19
+ "copy-assets": "node -e \"const fs=require('fs');fs.mkdirSync('dist/db',{recursive:true});fs.copyFileSync('src/db/schema.sql','dist/db/schema.sql');fs.mkdirSync('dist/extraction/wasm',{recursive:true});fs.readdirSync('src/extraction/wasm').filter(f=>f.endsWith('.wasm')).forEach(f=>fs.copyFileSync('src/extraction/wasm/'+f,'dist/extraction/wasm/'+f));fs.mkdirSync('dist/visualizer/public',{recursive:true});fs.copyFileSync('src/visualizer/public/index.html','dist/visualizer/public/index.html')\"",
20
20
  "dev": "tsc --watch",
21
21
  "cli": "npm run build && node dist/bin/codegraph.js",
22
22
  "test": "vitest run",