repo-codegraph 0.1.0 → 0.2.1

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/README.md CHANGED
@@ -6,6 +6,8 @@ files, parses declarations, resolves internal modules and compiler-resolvable ca
6
6
  answers graph queries, calculates reverse impact, and maps tracked Git changes to
7
7
  the smallest enclosing current symbol.
8
8
 
9
+ ![Codegraph interactive network visualization](docs/assets/interactive-network-graph.png)
10
+
9
11
  ## Current capabilities
10
12
 
11
13
  - File, function, class, interface, and method nodes with source ranges.
@@ -17,6 +19,8 @@ the smallest enclosing current symbol.
17
19
  - Symbol search, dependencies, dependents, shortest paths, reverse impact, and
18
20
  Git-diff impact analysis.
19
21
  - A local stdio MCP server with bounded, source-linked tools for coding agents.
22
+ - A local, interactive force-directed visualization with search, filters, and
23
+ focused dependency neighborhoods.
20
24
 
21
25
  ## CLI
22
26
 
@@ -30,6 +34,7 @@ npm run codegraph -- dependents AuthService.login --root .
30
34
  npm run codegraph -- path AuthController.login TokenService.generate --root .
31
35
  npm run codegraph -- impact AuthService.validateToken --root .
32
36
  npm run codegraph -- diff --root .
37
+ npm run codegraph -- visualize .
33
38
  ```
34
39
 
35
40
  `index` writes a versioned JSON snapshot to `.codegraph/index.json`. Query
@@ -42,6 +47,42 @@ npm run codegraph -- find AuthService --graph .codegraph/index.json
42
47
  npm run codegraph -- impact AuthService.login --graph .codegraph/index.json
43
48
  ```
44
49
 
50
+ After indexing, open the interactive network in the default browser:
51
+
52
+ ```bash
53
+ npm run codegraph -- visualize .
54
+ ```
55
+
56
+ The viewer reads `.codegraph/index.json`, binds only to `127.0.0.1`, and contains
57
+ no CDN scripts or hosted services, so the graph stays on the user's machine.
58
+ Use `--graph <file>` for a custom index, `--port <number>` for a fixed port, or
59
+ `--no-open` to print the URL without launching a browser. Scroll to zoom, drag
60
+ to pan, search by file or symbol, filter relationship types, and click a node to
61
+ focus on its immediate incoming and outgoing neighborhood.
62
+ Hovering over a node reveals its file or symbol name without permanently
63
+ cluttering the graph with labels.
64
+
65
+ To create a self-contained file that can be opened in an IDE HTML preview,
66
+ export the same visualization instead of starting the local server:
67
+
68
+ ```bash
69
+ npm run codegraph -- visualize . --output .codegraph/visualization.html
70
+ ```
71
+
72
+ All graph data, styles, and interaction code are embedded in the generated HTML;
73
+ it does not fetch the index or load scripts from the network.
74
+
75
+ The **Ask Codegraph** box supports local graph questions such as “What calls
76
+ `analyzeProject`?”, “What does `runCli` call?”, “What imports `server.ts`?”, and
77
+ “Where is `ProjectSession` defined?”. It matches the question to indexed files
78
+ and symbols, selects the relevant relationship and direction, focuses the graph,
79
+ and lists connected nodes. This is deterministic graph querying rather than an
80
+ LLM, so it does not send repository data to an external service.
81
+ Source paths in node details and question results are IDE deep links; clicking
82
+ one opens the indexed file at its source line in VS Code-compatible editors.
83
+ Change-impact questions use incoming `CALLS` relationships, so they show callers
84
+ that may be affected rather than functions the changed symbol itself depends on.
85
+
45
86
  After source files change, update the saved index incrementally:
46
87
 
47
88
  ```bash
@@ -202,6 +243,22 @@ const server = createCodeGraphMcpServer({ rootDirectory: process.cwd() });
202
243
  JSON index. `update` performs incremental graph replacement, but it still creates a
203
244
  fresh project-wide TypeScript Program so semantic resolution remains correct.
204
245
 
246
+ ## Releasing
247
+
248
+ The first npm release was published manually. Subsequent versions publish
249
+ automatically when a GitHub Release is published. Before creating the release:
250
+
251
+ 1. Update `version` in `package.json` and `package-lock.json`.
252
+ 2. Merge that version change to `main`.
253
+ 3. Create and publish a GitHub Release whose tag is exactly `v<version>` (for
254
+ example, package version `0.2.0` requires tag `v0.2.0`).
255
+
256
+ The release workflow verifies the tag, installs from the lockfile, runs the type
257
+ check, tests, and build, then publishes the public package to npm. The npm package
258
+ must have `.github/workflows/publish.yml` configured as a GitHub Actions trusted
259
+ publisher for repository `RuchiPurohit/codegraph` with direct `npm publish`
260
+ allowed. No long-lived npm token is required.
261
+
205
262
  ## The graph model
206
263
 
207
264
  A **node** (or vertex) represents an entity. An **edge** represents a relationship
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAsBA,wBAAsB,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAwI3E"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAwBA,wBAAsB,MAAM,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAgK3E"}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import path from "node:path";
3
3
  import { pathToFileURL } from "node:url";
4
- import { analyzeDiffImpact, analyzeImpact, analyzeProject, defaultIndexPath, findCodePath, findSymbols, getCodeDependencies, getCodeDependents, loadProjectAnalysis, readGitDiff, saveProjectAnalysis, updateProjectIndex, } from "./index.js";
4
+ import { analyzeDiffImpact, analyzeImpact, analyzeProject, defaultIndexPath, findCodePath, findSymbols, getCodeDependencies, getCodeDependents, loadProjectAnalysis, readGitDiff, saveProjectAnalysis, startVisualizationServer, writeVisualizationDocument, updateProjectIndex, } from "./index.js";
5
5
  export async function runCli(arguments_) {
6
6
  const options = parseOptions(arguments_);
7
7
  const [command, ...operands] = options.operands;
@@ -24,6 +24,24 @@ export async function runCli(arguments_) {
24
24
  console.log(`Saved: ${path.resolve(indexPath)}`);
25
25
  return 0;
26
26
  }
27
+ if (command === "visualize") {
28
+ const visualizationRoot = operands[0] ?? options.rootDirectory;
29
+ const indexPath = options.graphFile ?? defaultIndexPath(visualizationRoot);
30
+ const analysis = await loadProjectAnalysis(indexPath);
31
+ if (options.outputFile !== undefined) {
32
+ const outputPath = await writeVisualizationDocument(analysis, options.outputFile);
33
+ console.log(`Codegraph visualization saved: ${outputPath}`);
34
+ console.log(`Index: ${path.resolve(indexPath)}`);
35
+ return 0;
36
+ }
37
+ const visualization = await startVisualizationServer(analysis, options.port === undefined
38
+ ? { openBrowser: options.openBrowser }
39
+ : { port: options.port, openBrowser: options.openBrowser });
40
+ console.log(`Codegraph visualization: ${visualization.url}`);
41
+ console.log(`Index: ${path.resolve(indexPath)}`);
42
+ console.log("Press Ctrl+C to stop.");
43
+ return 0;
44
+ }
27
45
  const analysis = command !== "index" && options.graphFile !== undefined
28
46
  ? await loadProjectAnalysis(options.graphFile)
29
47
  : await analyzeProject(effectiveRoot);
@@ -127,7 +145,16 @@ function parseOptions(arguments_) {
127
145
  const rootDirectory = takeOption(result, "--root") ?? process.cwd();
128
146
  const graphFile = takeOption(result, "--graph");
129
147
  const outputFile = takeOption(result, "--output");
130
- return { operands: result, rootDirectory, graphFile, outputFile };
148
+ const portValue = takeOption(result, "--port");
149
+ const port = portValue === undefined ? undefined : Number(portValue);
150
+ if (port !== undefined && (!Number.isInteger(port) || port < 0 || port > 65_535)) {
151
+ throw new Error("--port must be an integer between 0 and 65535");
152
+ }
153
+ const noOpenIndex = result.indexOf("--no-open");
154
+ const openBrowser = noOpenIndex === -1;
155
+ if (noOpenIndex !== -1)
156
+ result.splice(noOpenIndex, 1);
157
+ return { operands: result, rootDirectory, graphFile, outputFile, port, openBrowser };
131
158
  }
132
159
  function takeOption(arguments_, option) {
133
160
  const index = arguments_.indexOf(option);
@@ -205,6 +232,7 @@ function printUsage() {
205
232
  " codegraph path <source> <target> [--root <directory> | --graph <file>]",
206
233
  " codegraph impact <symbol> [--root <directory> | --graph <file>]",
207
234
  " codegraph diff [--root <directory> | --graph <file>]",
235
+ " codegraph visualize [root] [--graph <file>] [--output <html>] [--port <number>] [--no-open]",
208
236
  ].join("\n"));
209
237
  }
210
238
  const invokedPath = process.argv[1];
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -16,4 +16,6 @@ export { CODEGRAPH_JSON_SCHEMA_VERSION, deserializeProjectAnalysis, loadProjectA
16
16
  export { analyzeImpact } from "./queries/analyzeImpact.js";
17
17
  export type { ImpactOptions, ImpactResult, } from "./queries/analyzeImpact.js";
18
18
  export { findCodePath, findSymbols, getCodeDependencies, getCodeDependents, } from "./queries/codeGraphQueries.js";
19
+ export { createVisualizationDocument, startVisualizationServer, writeVisualizationDocument, } from "./visualization/viewer.js";
20
+ export type { VisualizationServer, VisualizationServerOptions, } from "./visualization/viewer.js";
19
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,WAAW,EACX,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,2BAA2B,EAC3B,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,cAAc,GACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,YAAY,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,WAAW,EACX,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,2BAA2B,EAC3B,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,cAAc,GACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,YAAY,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -9,4 +9,5 @@ export { parseSourceFile } from "./parser/parseSourceFile.js";
9
9
  export { CODEGRAPH_JSON_SCHEMA_VERSION, deserializeProjectAnalysis, loadProjectAnalysis, saveProjectAnalysis, serializeProjectAnalysis, } from "./persistence/jsonPersistence.js";
10
10
  export { analyzeImpact } from "./queries/analyzeImpact.js";
11
11
  export { findCodePath, findSymbols, getCodeDependencies, getCodeDependents, } from "./queries/codeGraphQueries.js";
12
+ export { createVisualizationDocument, startVisualizationServer, writeVisualizationDocument, } from "./visualization/viewer.js";
12
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAM9D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAe5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAOtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAM9D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAe5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAOtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type Server } from "node:http";
2
+ import type { ProjectAnalysis } from "../analyzer/analyzeProject.js";
3
+ export interface VisualizationServerOptions {
4
+ readonly host?: string;
5
+ readonly port?: number;
6
+ readonly openBrowser?: boolean;
7
+ readonly openSource?: (uri: string) => void | Promise<void>;
8
+ }
9
+ export interface VisualizationServer {
10
+ readonly server: Server;
11
+ readonly url: string;
12
+ close(): Promise<void>;
13
+ }
14
+ export declare function createVisualizationDocument(analysis: ProjectAnalysis, openMode?: "ide" | "server"): string;
15
+ export declare function writeVisualizationDocument(analysis: ProjectAnalysis, outputPath: string): Promise<string>;
16
+ export declare function startVisualizationServer(analysis: ProjectAnalysis, options?: VisualizationServerOptions): Promise<VisualizationServer>;
17
+ //# sourceMappingURL=viewer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.d.ts","sourceRoot":"","sources":["../../src/visualization/viewer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,WAAW,CAAC;AAGtD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,eAAe,EACzB,QAAQ,GAAE,KAAK,GAAG,QAAgB,GACjC,MAAM,CAiQR;AAED,wBAAsB,0BAA0B,CAC9C,QAAQ,EAAE,eAAe,EACzB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CASjB;AAED,wBAAsB,wBAAwB,CAC5C,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,mBAAmB,CAAC,CA2D9B"}
@@ -0,0 +1,349 @@
1
+ import { spawn } from "node:child_process";
2
+ import { mkdir, writeFile } from "node:fs/promises";
3
+ import { createServer } from "node:http";
4
+ import path from "node:path";
5
+ export function createVisualizationDocument(analysis, openMode = "ide") {
6
+ const payload = JSON.stringify({
7
+ rootDirectory: analysis.rootDirectory,
8
+ nodes: analysis.graph.getNodes(),
9
+ edges: analysis.graph.getEdges(),
10
+ openMode,
11
+ }).replaceAll("<", "\\u003c");
12
+ return `<!doctype html>
13
+ <html lang="en">
14
+ <head>
15
+ <meta charset="utf-8">
16
+ <meta name="viewport" content="width=device-width, initial-scale=1">
17
+ <title>Codegraph</title>
18
+ <style>
19
+ :root { color-scheme: dark; font-family: Inter, ui-sans-serif, system-ui, sans-serif; }
20
+ * { box-sizing: border-box; }
21
+ body { margin: 0; overflow: hidden; background: #0d0e17; color: #f5f6fb; }
22
+ canvas { display: block; width: 100vw; height: 100vh; cursor: grab; }
23
+ canvas.dragging { cursor: grabbing; }
24
+ .panel { position: fixed; z-index: 2; background: rgba(18,20,32,.92); border: 1px solid #30344b; border-radius: 12px; box-shadow: 0 16px 48px #0008; backdrop-filter: blur(12px); }
25
+ #controls { top: 16px; left: 16px; width: min(340px, calc(100vw - 32px)); padding: 16px; }
26
+ h1 { font-size: 18px; margin: 0 0 4px; }
27
+ .subtitle, .hint { color: #9da4bd; font-size: 12px; }
28
+ input[type=search] { width: 100%; margin: 14px 0 10px; padding: 10px 12px; color: inherit; background: #0d0e17; border: 1px solid #3b405b; border-radius: 8px; outline: none; }
29
+ input[type=search]:focus { border-color: #74b9ff; }
30
+ .ask-row { display: flex; gap: 7px; margin: 12px 0 8px; }
31
+ #question { flex: 1; min-width: 0; padding: 9px 10px; color: inherit; background: #0d0e17; border: 1px solid #3b405b; border-radius: 8px; outline: none; }
32
+ #question:focus { border-color: #74b9ff; }
33
+ #ask { margin: 0; }
34
+ #answer { display: none; margin: 0 0 12px; padding: 9px 10px; border-radius: 8px; background: #191c2c; color: #cbd0e2; font-size: 12px; line-height: 1.4; max-height: 130px; overflow: auto; }
35
+ #answer.visible { display: block; }
36
+ #answer button { display: block; width: 100%; margin: 4px 0 0; padding: 4px 6px; text-align: left; border: 0; background: transparent; color: #7fc8ff; }
37
+ #answer .result { display: flex; align-items: center; gap: 6px; }
38
+ #answer .result button { flex: 1; width: auto; }
39
+ a.source-link { color: #7fc8ff; text-decoration: none; }
40
+ a.source-link:hover { text-decoration: underline; }
41
+ #answer a.source-link { flex: none; font-size: 11px; white-space: nowrap; }
42
+ .filters { display: flex; flex-wrap: wrap; gap: 10px 14px; font-size: 12px; }
43
+ .legend-title { margin: 12px 0 7px; color: #9da4bd; font-size: 11px; text-transform: uppercase; letter-spacing: .08em; }
44
+ .node-legend { display: grid; grid-template-columns: repeat(3, max-content); gap: 7px 14px; color: #d8dbea; font-size: 12px; }
45
+ .node-legend span { display: flex; align-items: center; gap: 6px; }
46
+ label { display: flex; align-items: center; gap: 6px; }
47
+ .swatch { width: 9px; height: 9px; border-radius: 50%; }
48
+ button { margin-top: 12px; padding: 7px 10px; border: 1px solid #3b405b; border-radius: 7px; background: #252941; color: inherit; cursor: pointer; }
49
+ button:hover { background: #303651; }
50
+ #details { right: 16px; top: 16px; width: min(360px, calc(100vw - 32px)); padding: 16px; display: none; }
51
+ #details.visible { display: block; }
52
+ #details h2 { margin: 0 24px 8px 0; font-size: 16px; overflow-wrap: anywhere; }
53
+ #details dl { margin: 0; display: grid; grid-template-columns: 92px 1fr; gap: 6px 10px; font-size: 12px; }
54
+ #details dt { color: #9da4bd; }
55
+ #details dd { margin: 0; overflow-wrap: anywhere; }
56
+ #close { position: absolute; right: 10px; top: 4px; border: 0; background: none; font-size: 20px; }
57
+ #status { position: fixed; left: 16px; bottom: 14px; color: #a9aec2; font-size: 11px; pointer-events: none; }
58
+ @media (max-width: 720px) { #details { top: auto; bottom: 40px; } }
59
+ </style>
60
+ </head>
61
+ <body>
62
+ <canvas id="graph" aria-label="Interactive code graph"></canvas>
63
+ <section id="controls" class="panel">
64
+ <h1>Codegraph</h1>
65
+ <div id="summary" class="subtitle"></div>
66
+ <div class="ask-row"><input id="question" placeholder="Ask: What calls analyzeProject?"><button id="ask">Ask</button></div>
67
+ <div id="answer" aria-live="polite"></div>
68
+ <input id="search" type="search" placeholder="Search files and symbols…" autocomplete="off">
69
+ <div class="legend-title">Node colors</div>
70
+ <div class="node-legend" aria-label="Node color legend">
71
+ <span><i class="swatch" style="background:#4cc9f0"></i>File</span>
72
+ <span><i class="swatch" style="background:#ff6b6b"></i>Function</span>
73
+ <span><i class="swatch" style="background:#ffd166"></i>Class</span>
74
+ <span><i class="swatch" style="background:#70e000"></i>Interface</span>
75
+ <span><i class="swatch" style="background:#c77dff"></i>Method</span>
76
+ </div>
77
+ <div class="legend-title">Relationships</div>
78
+ <div class="filters">
79
+ <label><input type="checkbox" data-edge="DEFINES" checked><span class="swatch" style="background:#73809f"></span>Defines</label>
80
+ <label><input type="checkbox" data-edge="IMPORTS" checked><span class="swatch" style="background:#f6bd60"></span>Imports</label>
81
+ <label><input type="checkbox" data-edge="CALLS" checked><span class="swatch" style="background:#f28482"></span>Calls</label>
82
+ </div>
83
+ <button id="fit">Fit graph</button> <button id="reset">Show all</button>
84
+ <div class="hint" style="margin-top:10px">Hover a node to reveal its label · scroll to zoom · drag to pan · click to focus</div>
85
+ </section>
86
+ <aside id="details" class="panel"><button id="close" aria-label="Close">×</button><div id="detail-content"></div></aside>
87
+ <div id="status"></div>
88
+ <script id="codegraph-data" type="application/json">${payload}</script>
89
+ <script>
90
+ (() => {
91
+ const data = JSON.parse(document.getElementById('codegraph-data').textContent);
92
+ const canvas = document.getElementById('graph');
93
+ const context = canvas.getContext('2d');
94
+ const nodes = data.nodes.map((entry, index) => ({
95
+ ...entry, index, x: Math.cos(index * 2.39996) * Math.sqrt(index + 1) * 12,
96
+ y: Math.sin(index * 2.39996) * Math.sqrt(index + 1) * 12, vx: 0, vy: 0, degree: 0
97
+ }));
98
+ const byId = new Map(nodes.map(node => [node.id, node]));
99
+ const edges = data.edges.map(edge => ({ ...edge, source: byId.get(edge.from), target: byId.get(edge.to) })).filter(edge => edge.source && edge.target);
100
+ edges.forEach(edge => { edge.source.degree++; edge.target.degree++; });
101
+ const edgeColors = { DEFINES: '#73809f', IMPORTS: '#f6bd60', CALLS: '#f28482' };
102
+ const kindColors = { file: '#4cc9f0', function: '#ff6b6b', class: '#ffd166', interface: '#70e000', method: '#c77dff' };
103
+ const enabledEdges = new Set(Object.keys(edgeColors));
104
+ let width = 0, height = 0, scale = 1, offsetX = 0, offsetY = 0;
105
+ let dragging = false, moved = false, lastX = 0, lastY = 0, selected = null, hovered = null;
106
+ let visibleNodes = new Set(nodes), simulationTicks = 0;
107
+
108
+ const label = node => node.data.nodeType === 'file' ? node.data.filePath : node.data.qualifiedName;
109
+ const file = node => node.data.nodeType === 'file' ? node.data.filePath : node.data.location.file;
110
+ const color = node => kindColors[node.data.nodeType === 'file' ? 'file' : node.data.declarationKind] || '#8ecae6';
111
+ const radius = node => Math.min(11, 3.3 + Math.sqrt(node.degree) * 1.15);
112
+ const activeEdges = () => edges.filter(edge => enabledEdges.has(edge.type) && visibleNodes.has(edge.source) && visibleNodes.has(edge.target));
113
+ const displayLabel = node => node.data.nodeType === 'file' ? node.data.filePath.split('/').pop() : node.data.name;
114
+ const showLabel = node => node === hovered;
115
+
116
+ function resize() {
117
+ const ratio = window.devicePixelRatio || 1;
118
+ width = window.innerWidth; height = window.innerHeight;
119
+ canvas.width = Math.round(width * ratio); canvas.height = Math.round(height * ratio);
120
+ context.setTransform(ratio, 0, 0, ratio, 0, 0);
121
+ }
122
+
123
+ function simulate() {
124
+ if (simulationTicks++ > 500) return;
125
+ const active = [...visibleNodes];
126
+ const cellSize = 80; const cells = new Map();
127
+ active.forEach(node => { const key=Math.floor(node.x/cellSize)+','+Math.floor(node.y/cellSize); const bucket=cells.get(key)||[]; bucket.push(node); cells.set(key,bucket); });
128
+ active.forEach(a => {
129
+ const cellX=Math.floor(a.x/cellSize), cellY=Math.floor(a.y/cellSize);
130
+ for (let x=cellX-1; x<=cellX+1; x++) for (let y=cellY-1; y<=cellY+1; y++) for (const b of cells.get(x+','+y)||[]) {
131
+ if (b.index <= a.index) continue;
132
+ const dx = b.x - a.x; const dy = b.y - a.y;
133
+ const distance2 = Math.max(100, dx * dx + dy * dy); const force = Math.min(1.2, 900 / distance2);
134
+ a.vx -= dx * force / Math.sqrt(distance2); a.vy -= dy * force / Math.sqrt(distance2);
135
+ b.vx += dx * force / Math.sqrt(distance2); b.vy += dy * force / Math.sqrt(distance2);
136
+ }
137
+ });
138
+ activeEdges().forEach(edge => {
139
+ const dx = edge.target.x - edge.source.x; const dy = edge.target.y - edge.source.y;
140
+ const distance = Math.max(1, Math.hypot(dx, dy)); const target = edge.type === 'DEFINES' ? 45 : 90;
141
+ const force = Math.max(-2, Math.min(2, (distance - target) * .008));
142
+ const forceX = dx / distance * force, forceY = dy / distance * force;
143
+ edge.source.vx += forceX; edge.source.vy += forceY;
144
+ edge.target.vx -= forceX; edge.target.vy -= forceY;
145
+ });
146
+ active.forEach(node => { node.vx -= node.x * .00035; node.vy -= node.y * .00035; node.vx *= .84; node.vy *= .84; node.x += node.vx; node.y += node.vy; });
147
+ }
148
+
149
+ function draw() {
150
+ simulate(); context.clearRect(0, 0, width, height); context.save();
151
+ context.translate(width / 2 + offsetX, height / 2 + offsetY); context.scale(scale, scale);
152
+ activeEdges().forEach(edge => {
153
+ context.beginPath(); context.moveTo(edge.source.x, edge.source.y); context.lineTo(edge.target.x, edge.target.y);
154
+ const edgeColor=edgeColors[edge.type] + (selected && edge.source !== selected && edge.target !== selected ? '35' : '78');
155
+ context.strokeStyle = edgeColor; context.lineWidth = 1 / Math.sqrt(scale); context.stroke();
156
+ const angle=Math.atan2(edge.target.y-edge.source.y,edge.target.x-edge.source.x); const tip=radius(edge.target)+2/scale;
157
+ const tx=edge.target.x-Math.cos(angle)*tip, ty=edge.target.y-Math.sin(angle)*tip, arrow=3.5/Math.sqrt(scale);
158
+ context.beginPath(); context.moveTo(tx,ty); context.lineTo(tx-Math.cos(angle-.55)*arrow,ty-Math.sin(angle-.55)*arrow); context.lineTo(tx-Math.cos(angle+.55)*arrow,ty-Math.sin(angle+.55)*arrow); context.closePath(); context.fillStyle=edgeColor; context.fill();
159
+ });
160
+ visibleNodes.forEach(node => {
161
+ const r = radius(node); context.beginPath(); context.arc(node.x, node.y, r, 0, Math.PI * 2);
162
+ context.fillStyle = color(node); context.globalAlpha = selected && node !== selected && !isNeighbor(selected, node) ? .3 : 1; context.fill();
163
+ if (node === selected || node === hovered) { context.strokeStyle = '#fff'; context.lineWidth = 2 / scale; context.stroke(); }
164
+ });
165
+ visibleNodes.forEach(node => {
166
+ if(!showLabel(node))return;
167
+ const text=displayLabel(node), fontSize=12/scale, padding=3/scale, x=node.x+radius(node)+5/scale, y=node.y;
168
+ context.font='600 '+fontSize+'px ui-sans-serif, system-ui, sans-serif'; context.textBaseline='middle';
169
+ const textWidth=context.measureText(text).width;
170
+ context.globalAlpha=1; context.fillStyle='#10121ddd';
171
+ context.fillRect(x-padding,y-fontSize*.72,textWidth+padding*2,fontSize*1.44);
172
+ context.fillStyle='#f5f6fb'; context.fillText(text,x,y);
173
+ });
174
+ context.globalAlpha = 1; context.restore();
175
+ requestAnimationFrame(draw);
176
+ }
177
+
178
+ function isNeighbor(a, b) { return edges.some(edge => enabledEdges.has(edge.type) && ((edge.source === a && edge.target === b) || (edge.source === b && edge.target === a))); }
179
+ function screenNode(event) {
180
+ const x = (event.clientX - width / 2 - offsetX) / scale; const y = (event.clientY - height / 2 - offsetY) / scale;
181
+ let result = null, best = 16 / scale;
182
+ visibleNodes.forEach(node => { const distance = Math.hypot(node.x - x, node.y - y); if (distance < Math.max(radius(node), best)) { result = node; best = distance; } });
183
+ return result;
184
+ }
185
+ function showDetails(node) {
186
+ const incident = edges.filter(edge => edge.source === node || edge.target === node);
187
+ const counts = incident.reduce((result, edge) => ({ ...result, [edge.type]: (result[edge.type] || 0) + 1 }), {});
188
+ const location = node.data.nodeType === 'symbol' ? node.data.location.file + ':' + node.data.location.line + ':' + node.data.location.column : node.data.filePath;
189
+ document.getElementById('detail-content').innerHTML = '<h2>' + escapeHtml(label(node)) + '</h2><dl>' +
190
+ '<dt>Type</dt><dd>' + escapeHtml(node.data.nodeType === 'file' ? 'file' : node.data.declarationKind) + '</dd>' +
191
+ '<dt>Location</dt><dd><a class="source-link" href="' + editorHref(node) + '">' + escapeHtml(location) + '</a></dd><dt>Connections</dt><dd>' + incident.length + '</dd>' +
192
+ '<dt>Relationships</dt><dd>' + escapeHtml(Object.entries(counts).map(([key,value]) => key + ': ' + value).join(' · ') || 'None') + '</dd></dl>';
193
+ document.getElementById('details').classList.add('visible');
194
+ }
195
+ function editorHref(node) {
196
+ if(data.openMode==='server')return '/open?node='+encodeURIComponent(node.id);
197
+ const relativePath=file(node), suffix=node.data.nodeType==='symbol'?':'+node.data.location.line+':'+node.data.location.column:'';
198
+ const absolutePath=(data.rootDirectory.replace(/\\\/$/,'')+'/'+relativePath).split('/').map((part,index)=>index===0?'':encodeURIComponent(part)).join('/');
199
+ return 'vscode://file'+absolutePath+suffix;
200
+ }
201
+ function focusNode(node, related) {
202
+ selected=node; visibleNodes=new Set([node,...related]); showDetails(node); fit(); restart();
203
+ }
204
+ function normalizedWords(value) { return value.toLowerCase().replace(/[^a-z0-9_.$/\\-]+/g,' ').trim().split(/\\s+/).filter(word => word.length > 1); }
205
+ function bestQuestionNode(question) {
206
+ const ignored=new Set(['what','which','where','who','does','call','calls','called','uses','use','used','imports','import','imported','defines','define','defined','depends','dependents','dependencies','on','by','is','are','the','a','an','of','for','from','show','find','me']);
207
+ const terms=normalizedWords(question).filter(word => !ignored.has(word));
208
+ let best=null, bestScore=0;
209
+ nodes.forEach(node => { const name=label(node).toLowerCase(), location=file(node).toLowerCase(); let score=0; terms.forEach(term => { if(name===term)score+=12; else if(name.endsWith('.'+term)||name.endsWith('/'+term))score+=8; else if(name.includes(term))score+=4; if(location.includes(term))score+=2; }); if(score>bestScore){best=node;bestScore=score;} });
210
+ return best;
211
+ }
212
+ function askQuestion() {
213
+ const question=document.getElementById('question').value.trim(), answer=document.getElementById('answer');
214
+ if(!question){answer.textContent='Ask about a file or symbol, for example: “What calls analyzeProject?”';answer.classList.add('visible');return;}
215
+ const node=bestQuestionNode(question);
216
+ if(!node){answer.textContent='I could not match that question to an indexed file or symbol.';answer.classList.add('visible');return;}
217
+ const lower=question.toLowerCase(); let direction='both', relationship=null;
218
+ const impactIntent=/affected|impact|break|if i change|when i change|changing/.test(lower);
219
+ if(/what (does|do)|dependencies|depends on|calls from/.test(lower))direction='outgoing';
220
+ if(/what calls|who calls|called by|dependents|what imports|imported by|where .*defined/.test(lower))direction='incoming';
221
+ if(/import/.test(lower))relationship='IMPORTS'; else if(/call|use|depend/.test(lower))relationship='CALLS'; else if(/defin|contain/.test(lower))relationship='DEFINES';
222
+ if(impactIntent){direction='incoming';relationship='CALLS';}
223
+ if(relationship) { enabledEdges.clear(); enabledEdges.add(relationship); document.querySelectorAll('[data-edge]').forEach(input => { input.checked=input.dataset.edge===relationship; }); }
224
+ const matches=edges.filter(edge => (!relationship||edge.type===relationship) && ((direction!=='incoming'&&edge.source===node)||(direction!=='outgoing'&&edge.target===node)));
225
+ const related=matches.map(edge => edge.source===node?edge.target:edge.source).filter((entry,index,array)=>array.indexOf(entry)===index);
226
+ focusNode(node,related);
227
+ const heading=impactIntent?'Potentially affected callers':(direction==='incoming'?'Incoming':direction==='outgoing'?'Outgoing':'Connected')+(relationship?' '+relationship.toLowerCase():' relationships');
228
+ answer.innerHTML='<strong>'+escapeHtml(label(node))+'</strong><br>'+escapeHtml(heading)+': '+related.length+(related.length?related.slice(0,8).map(item=>'<div class="result"><button data-node="'+item.index+'">'+escapeHtml(label(item))+'</button><a class="source-link" href="'+editorHref(item)+'">Open file ↗</a></div>').join(''):'')+'<div class="result"><a class="source-link" href="'+editorHref(node)+'">Open matched source ↗</a></div>';
229
+ answer.querySelectorAll('[data-node]').forEach(button=>button.addEventListener('click',()=>{const target=nodes[Number(button.dataset.node)];if(target)focusNode(target,nodes.filter(item=>isNeighbor(target,item)));}));
230
+ answer.classList.add('visible');
231
+ }
232
+ function escapeHtml(value) { const element = document.createElement('span'); element.textContent = String(value); return element.innerHTML; }
233
+ function fit() {
234
+ const active = [...visibleNodes]; if (!active.length) return;
235
+ const xs = active.map(node => node.x), ys = active.map(node => node.y);
236
+ const graphWidth = Math.max(100, Math.max(...xs) - Math.min(...xs)); const graphHeight = Math.max(100, Math.max(...ys) - Math.min(...ys));
237
+ scale = Math.max(.08, Math.min(2.5, Math.min((width - 80) / graphWidth, (height - 80) / graphHeight) * .82));
238
+ offsetX = -((Math.min(...xs) + Math.max(...xs)) / 2) * scale; offsetY = -((Math.min(...ys) + Math.max(...ys)) / 2) * scale;
239
+ }
240
+ function updateStatus() { document.getElementById('status').textContent = visibleNodes.size + ' nodes · ' + activeEdges().length + ' relationships · local visualization'; }
241
+ function restart() { simulationTicks = 0; updateStatus(); }
242
+
243
+ canvas.addEventListener('mousedown', event => { dragging = true; moved = false; lastX = event.clientX; lastY = event.clientY; canvas.classList.add('dragging'); });
244
+ window.addEventListener('mousemove', event => { hovered = screenNode(event); if (!dragging) return; const dx = event.clientX-lastX, dy=event.clientY-lastY; if (Math.abs(dx)+Math.abs(dy)>2) moved=true; offsetX+=dx; offsetY+=dy; lastX=event.clientX; lastY=event.clientY; });
245
+ window.addEventListener('mouseup', event => { if (dragging && !moved) { selected = screenNode(event); if (selected) focusNode(selected,nodes.filter(node => isNeighbor(selected,node))); } dragging=false; canvas.classList.remove('dragging'); });
246
+ canvas.addEventListener('wheel', event => { event.preventDefault(); const previous=scale; scale=Math.max(.05,Math.min(8,scale*Math.exp(-event.deltaY*.001))); offsetX=event.clientX-width/2-(event.clientX-width/2-offsetX)*scale/previous; offsetY=event.clientY-height/2-(event.clientY-height/2-offsetY)*scale/previous; }, {passive:false});
247
+ document.querySelectorAll('[data-edge]').forEach(input => input.addEventListener('change', () => { input.checked ? enabledEdges.add(input.dataset.edge) : enabledEdges.delete(input.dataset.edge); restart(); }));
248
+ document.getElementById('search').addEventListener('input', event => { const query=event.target.value.trim().toLowerCase(); if (!query) { visibleNodes=new Set(nodes); selected=null; } else { const matches=nodes.filter(node => label(node).toLowerCase().includes(query) || file(node).toLowerCase().includes(query)); visibleNodes=new Set(matches); selected=matches.length===1?matches[0]:null; } fit(); restart(); });
249
+ document.getElementById('fit').addEventListener('click', fit);
250
+ document.getElementById('ask').addEventListener('click', askQuestion);
251
+ document.getElementById('question').addEventListener('keydown', event => { if(event.key==='Enter')askQuestion(); });
252
+ document.addEventListener('click', async event => { const link=event.target.closest('a.source-link'); if(!link||!link.getAttribute('href').startsWith('/open?'))return; event.preventDefault(); const response=await fetch(link.href); document.getElementById('status').textContent=response.ok?'Opened source in IDE':'Could not open source: '+await response.text(); });
253
+ document.getElementById('reset').addEventListener('click', () => { visibleNodes=new Set(nodes); selected=null; document.getElementById('search').value=''; document.getElementById('details').classList.remove('visible'); fit(); restart(); });
254
+ document.getElementById('close').addEventListener('click', () => document.getElementById('details').classList.remove('visible'));
255
+ document.getElementById('summary').textContent = data.rootDirectory + ' · ' + nodes.length + ' nodes · ' + edges.length + ' relationships';
256
+ window.addEventListener('resize', () => { resize(); fit(); }); resize(); setTimeout(fit, 500); updateStatus(); draw();
257
+ })();
258
+ </script>
259
+ </body>
260
+ </html>`;
261
+ }
262
+ export async function writeVisualizationDocument(analysis, outputPath) {
263
+ const absoluteOutputPath = path.resolve(outputPath);
264
+ await mkdir(path.dirname(absoluteOutputPath), { recursive: true });
265
+ await writeFile(absoluteOutputPath, createVisualizationDocument(analysis), "utf8");
266
+ return absoluteOutputPath;
267
+ }
268
+ export async function startVisualizationServer(analysis, options = {}) {
269
+ const host = options.host ?? "127.0.0.1";
270
+ const document = createVisualizationDocument(analysis, "server");
271
+ const server = createServer(async (request, response) => {
272
+ const requestUrl = new URL(request.url ?? "/", `http://${host}`);
273
+ if (requestUrl.pathname === "/open") {
274
+ const nodeId = requestUrl.searchParams.get("node");
275
+ const node = nodeId === null ? undefined : analysis.graph.getNode(nodeId);
276
+ if (node === undefined) {
277
+ response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
278
+ response.end("Indexed node not found\n");
279
+ return;
280
+ }
281
+ const relativePath = node.data.nodeType === "file"
282
+ ? node.data.filePath
283
+ : node.data.location.file;
284
+ const absolutePath = path.resolve(analysis.rootDirectory, relativePath);
285
+ const relativeToRoot = path.relative(analysis.rootDirectory, absolutePath);
286
+ if (relativeToRoot.startsWith("..") || path.isAbsolute(relativeToRoot)) {
287
+ response.writeHead(400, { "Content-Type": "text/plain; charset=utf-8" });
288
+ response.end("Indexed path is outside the project root\n");
289
+ return;
290
+ }
291
+ const suffix = node.data.nodeType === "symbol"
292
+ ? `:${node.data.location.line}:${node.data.location.column}`
293
+ : "";
294
+ const uri = `vscode://file${encodeEditorPath(absolutePath)}${suffix}`;
295
+ try {
296
+ await (options.openSource ?? openSourceUri)(uri);
297
+ response.writeHead(204, { "Cache-Control": "no-store" });
298
+ response.end();
299
+ }
300
+ catch (error) {
301
+ response.writeHead(500, { "Content-Type": "text/plain; charset=utf-8" });
302
+ response.end(`Unable to open IDE: ${error instanceof Error ? error.message : String(error)}\n`);
303
+ }
304
+ return;
305
+ }
306
+ if (requestUrl.pathname !== "/" && requestUrl.pathname !== "/index.html") {
307
+ response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
308
+ response.end("Not found\n");
309
+ return;
310
+ }
311
+ response.writeHead(200, {
312
+ "Content-Type": "text/html; charset=utf-8",
313
+ "Cache-Control": "no-store",
314
+ "Content-Security-Policy": "default-src 'none'; script-src 'unsafe-inline'; style-src 'unsafe-inline'; img-src data:; connect-src 'self'",
315
+ });
316
+ response.end(document);
317
+ });
318
+ await new Promise((resolve, reject) => {
319
+ server.once("error", reject);
320
+ server.listen(options.port ?? 0, host, () => { server.off("error", reject); resolve(); });
321
+ });
322
+ const address = server.address();
323
+ if (address === null || typeof address === "string")
324
+ throw new Error("Unable to determine visualization server address");
325
+ const url = `http://${host}:${address.port}/`;
326
+ if (options.openBrowser !== false)
327
+ openBrowser(url);
328
+ return { server, url, close: () => new Promise((resolve, reject) => server.close(error => error ? reject(error) : resolve())) };
329
+ }
330
+ function encodeEditorPath(filePath) {
331
+ return filePath.split(path.sep).map((part, index) => index === 0 ? "" : encodeURIComponent(part)).join("/");
332
+ }
333
+ async function openSourceUri(uri) {
334
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
335
+ const args = process.platform === "win32" ? ["/c", "start", "", uri] : [uri];
336
+ await new Promise((resolve, reject) => {
337
+ const child = spawn(command, args, { stdio: "ignore" });
338
+ child.once("error", reject);
339
+ child.once("exit", (code) => code === 0 ? resolve() : reject(new Error(`${command} exited with code ${String(code)}`)));
340
+ });
341
+ }
342
+ function openBrowser(url) {
343
+ const command = process.platform === "darwin" ? "open" : process.platform === "win32" ? "cmd" : "xdg-open";
344
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
345
+ const child = spawn(command, args, { detached: true, stdio: "ignore" });
346
+ child.on("error", () => { });
347
+ child.unref();
348
+ }
349
+ //# sourceMappingURL=viewer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../src/visualization/viewer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "repo-codegraph",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "A TypeScript code-intelligence graph for imports, calls, queries, and impact analysis",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/RuchiPurohit/codegraph.git"
8
+ },
9
+ "homepage": "https://github.com/RuchiPurohit/codegraph#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/RuchiPurohit/codegraph/issues"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
5
16
  "type": "module",
6
17
  "main": "./dist/index.js",
7
18
  "types": "./dist/index.d.ts",