@isac322/pi-codegraph 0.2.0 → 0.3.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.
Files changed (58) hide show
  1. package/.mcp.json +1 -2
  2. package/CONTRIBUTING.md +63 -0
  3. package/README.md +35 -2
  4. package/dist/bin/codegraph-mcp.d.ts +3 -0
  5. package/dist/bin/codegraph-mcp.d.ts.map +1 -0
  6. package/dist/bin/codegraph-mcp.js +199 -0
  7. package/dist/bin/codegraph-mcp.js.map +1 -0
  8. package/dist/extensions/omp.d.ts +14 -0
  9. package/dist/extensions/omp.d.ts.map +1 -0
  10. package/dist/extensions/omp.js +19 -0
  11. package/dist/extensions/omp.js.map +1 -0
  12. package/dist/extensions/pi.d.ts +3 -0
  13. package/dist/extensions/pi.d.ts.map +1 -0
  14. package/dist/extensions/pi.js +162 -0
  15. package/dist/extensions/pi.js.map +1 -0
  16. package/dist/lib/codegraph.d.ts +65 -0
  17. package/dist/lib/codegraph.d.ts.map +1 -0
  18. package/dist/lib/codegraph.js +567 -0
  19. package/dist/lib/codegraph.js.map +1 -0
  20. package/dist/lib/config.d.ts +5 -0
  21. package/dist/lib/config.d.ts.map +1 -0
  22. package/dist/lib/config.js +131 -0
  23. package/dist/lib/config.js.map +1 -0
  24. package/dist/lib/jsonrpc.d.ts +19 -0
  25. package/dist/lib/jsonrpc.d.ts.map +1 -0
  26. package/dist/lib/jsonrpc.js +116 -0
  27. package/dist/lib/jsonrpc.js.map +1 -0
  28. package/dist/lib/pi-mcp-client.d.ts +15 -0
  29. package/dist/lib/pi-mcp-client.d.ts.map +1 -0
  30. package/dist/lib/pi-mcp-client.js +84 -0
  31. package/dist/lib/pi-mcp-client.js.map +1 -0
  32. package/dist/lib/prompt.d.ts +7 -0
  33. package/dist/lib/prompt.d.ts.map +1 -0
  34. package/dist/lib/prompt.js +16 -0
  35. package/dist/lib/prompt.js.map +1 -0
  36. package/dist/lib/tool-metadata.d.ts +10 -0
  37. package/dist/lib/tool-metadata.d.ts.map +1 -0
  38. package/dist/lib/tool-metadata.js +163 -0
  39. package/dist/lib/tool-metadata.js.map +1 -0
  40. package/dist/lib/types.d.ts +69 -0
  41. package/dist/lib/types.d.ts.map +1 -0
  42. package/dist/lib/types.js +2 -0
  43. package/dist/lib/types.js.map +1 -0
  44. package/dist/lib/worker-pool.d.ts +19 -0
  45. package/dist/lib/worker-pool.d.ts.map +1 -0
  46. package/dist/lib/worker-pool.js +221 -0
  47. package/dist/lib/worker-pool.js.map +1 -0
  48. package/package.json +30 -9
  49. package/bin/codegraph-mcp.mjs +0 -146
  50. package/extensions/omp.mjs +0 -14
  51. package/extensions/pi.mjs +0 -127
  52. package/lib/codegraph.mjs +0 -415
  53. package/lib/config.mjs +0 -103
  54. package/lib/jsonrpc.mjs +0 -90
  55. package/lib/pi-mcp-client.mjs +0 -68
  56. package/lib/prompt.mjs +0 -15
  57. package/lib/tool-metadata.mjs +0 -97
  58. package/lib/worker-pool.mjs +0 -107
@@ -0,0 +1,69 @@
1
+ export interface CodeGraphSettings {
2
+ autoSync: boolean;
3
+ autoGc: boolean;
4
+ indexStore: string;
5
+ workerIdleTimeoutMs: number;
6
+ maxWorkers: number;
7
+ requestTimeoutMs: number;
8
+ syncMinIntervalMs: number;
9
+ maxOutputChars: number;
10
+ allowedProjectRoots: string[];
11
+ promptInjection: boolean;
12
+ codegraphExecutable: string;
13
+ configFile: string;
14
+ }
15
+ export interface WorkspaceIdentity {
16
+ sourcePath: string;
17
+ repoRoot: string;
18
+ repoIdentity: string;
19
+ worktreeIdentity: string;
20
+ gitCommonDir: string;
21
+ }
22
+ export interface WorkspaceStatus {
23
+ state: "ready" | "uninitialized" | "missing" | string;
24
+ sourcePath: string;
25
+ indexPath: string | null;
26
+ lastSyncAt: string | number | null;
27
+ identityMatches: boolean;
28
+ managed?: boolean;
29
+ }
30
+ export interface JsonRpcRequestOptions {
31
+ signal?: AbortSignal;
32
+ timeoutMs?: number;
33
+ }
34
+ export interface JsonRpcErrorShape {
35
+ code?: number | string;
36
+ message: string;
37
+ }
38
+ export interface JsonRpcMessage {
39
+ jsonrpc: "2.0";
40
+ id?: number | string | null;
41
+ method?: string;
42
+ params?: Record<string, unknown>;
43
+ result?: unknown;
44
+ error?: JsonRpcErrorShape;
45
+ }
46
+ export interface CodeGraphTool {
47
+ name: string;
48
+ label: string;
49
+ description: string;
50
+ promptSnippet: string;
51
+ promptGuidelines: string[];
52
+ inputSchema: {
53
+ type: "object";
54
+ properties: Record<string, unknown>;
55
+ required: string[];
56
+ additionalProperties: boolean;
57
+ };
58
+ }
59
+ export interface ToolResult {
60
+ content?: Array<{
61
+ type: string;
62
+ text?: string;
63
+ [key: string]: unknown;
64
+ }>;
65
+ isError?: boolean;
66
+ _meta?: Record<string, unknown>;
67
+ [key: string]: unknown;
68
+ }
69
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,OAAO,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,GAAG,eAAe,GAAG,SAAS,GAAG,MAAM,CAAC;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ,CAAC;QACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACnB,oBAAoB,EAAE,OAAO,CAAC;KAC/B,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,CAAC,CAAC;IACzE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import type { CodeGraphSettings, ToolResult } from "./types.js";
2
+ export declare function codeGraphDaemonRoot(indexStore: string): string;
3
+ export declare class CodeGraphWorkerPool {
4
+ readonly settings: CodeGraphSettings;
5
+ readonly projects: Set<string>;
6
+ private entry?;
7
+ private creating?;
8
+ private closed;
9
+ constructor(settings: CodeGraphSettings);
10
+ activeProjects(): Set<string>;
11
+ call(projectPath: string, toolName: string, args: Record<string, unknown>, signal?: AbortSignal): Promise<ToolResult>;
12
+ closeProject(projectPath: string, _error?: Error): Promise<void>;
13
+ close(): Promise<void>;
14
+ private getOrCreateEntry;
15
+ private createEntry;
16
+ private closeEntry;
17
+ private stopEntry;
18
+ }
19
+ //# sourceMappingURL=worker-pool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.d.ts","sourceRoot":"","sources":["../../lib/worker-pool.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA8BhE,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE9D;AA4DD,qBAAa,mBAAmB;IAC9B,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,cAAqB;IACtC,OAAO,CAAC,KAAK,CAAC,CAAc;IAC5B,OAAO,CAAC,QAAQ,CAAC,CAAuB;IACxC,OAAO,CAAC,MAAM,CAAS;IAEvB,YAAY,QAAQ,EAAE,iBAAiB,EAEtC;IAED,cAAc,IAAI,GAAG,CAAC,MAAM,CAAC,CAE5B;IAEK,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAmBrB;IAEK,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAY3B;YAEa,gBAAgB;YAsBhB,WAAW;YAyEX,UAAU;YAQV,SAAS;CAexB"}
@@ -0,0 +1,221 @@
1
+ import { spawn } from "node:child_process";
2
+ import { access, mkdir, rm, stat } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { setTimeout as delay } from "node:timers/promises";
5
+ import { pathToFileURL } from "node:url";
6
+ import { resolveCodeGraphLaunch, runCodeGraph, sanitizeDiagnostic, } from "./codegraph.js";
7
+ import { JsonRpcPeer } from "./jsonrpc.js";
8
+ const DAEMON_DIRECTORY = "daemon";
9
+ const INITIALIZE_LOCK = ".initialize.lock";
10
+ const DATABASE_PATH = join(".codegraph", "codegraph.db");
11
+ const LOCK_POLL_MS = 50;
12
+ const MIN_STALE_LOCK_MS = 30_000;
13
+ function isNodeError(error) {
14
+ return error instanceof Error && "code" in error;
15
+ }
16
+ async function pathExists(path) {
17
+ try {
18
+ await access(path);
19
+ return true;
20
+ }
21
+ catch (error) {
22
+ if (isNodeError(error) && error.code === "ENOENT") {
23
+ return false;
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ export function codeGraphDaemonRoot(indexStore) {
29
+ return join(indexStore, DAEMON_DIRECTORY);
30
+ }
31
+ async function acquireInitializeLock(lockPath, timeoutMs) {
32
+ const startedAt = Date.now();
33
+ const staleAfterMs = Math.max(timeoutMs, MIN_STALE_LOCK_MS);
34
+ while (true) {
35
+ try {
36
+ await mkdir(lockPath);
37
+ return () => rm(lockPath, { force: true, recursive: true });
38
+ }
39
+ catch (error) {
40
+ if (!isNodeError(error) || error.code !== "EEXIST") {
41
+ throw error;
42
+ }
43
+ const lockStat = await stat(lockPath).catch(() => undefined);
44
+ if (lockStat && Date.now() - lockStat.mtimeMs > staleAfterMs) {
45
+ await rm(lockPath, { force: true, recursive: true });
46
+ continue;
47
+ }
48
+ if (Date.now() - startedAt >= timeoutMs) {
49
+ throw new Error(`Timed out waiting for CodeGraph daemon initialization lock: ${lockPath}`);
50
+ }
51
+ await delay(LOCK_POLL_MS);
52
+ }
53
+ }
54
+ }
55
+ async function ensureDaemonRoot(settings) {
56
+ const daemonRoot = codeGraphDaemonRoot(settings.indexStore);
57
+ const databasePath = join(daemonRoot, DATABASE_PATH);
58
+ await mkdir(daemonRoot, { recursive: true });
59
+ if (await pathExists(databasePath)) {
60
+ return daemonRoot;
61
+ }
62
+ const release = await acquireInitializeLock(join(settings.indexStore, INITIALIZE_LOCK), settings.requestTimeoutMs);
63
+ try {
64
+ if (!(await pathExists(databasePath))) {
65
+ await runCodeGraph(settings, daemonRoot, ["init", "-i"], {
66
+ timeoutMs: settings.requestTimeoutMs,
67
+ });
68
+ }
69
+ }
70
+ finally {
71
+ await release();
72
+ }
73
+ return daemonRoot;
74
+ }
75
+ export class CodeGraphWorkerPool {
76
+ settings;
77
+ projects = new Set();
78
+ entry;
79
+ creating;
80
+ closed = false;
81
+ constructor(settings) {
82
+ this.settings = settings;
83
+ }
84
+ activeProjects() {
85
+ return new Set(this.projects);
86
+ }
87
+ async call(projectPath, toolName, args, signal) {
88
+ if (this.closed) {
89
+ throw new Error("CodeGraph worker pool is closed");
90
+ }
91
+ this.projects.add(projectPath);
92
+ const entry = await this.getOrCreateEntry();
93
+ const result = await entry.peer.request("tools/call", {
94
+ name: toolName,
95
+ arguments: { ...args, projectPath },
96
+ }, {
97
+ signal,
98
+ timeoutMs: this.settings.requestTimeoutMs,
99
+ });
100
+ return result;
101
+ }
102
+ async closeProject(projectPath, _error) {
103
+ this.projects.delete(projectPath);
104
+ }
105
+ async close() {
106
+ if (this.closed) {
107
+ return;
108
+ }
109
+ this.closed = true;
110
+ this.projects.clear();
111
+ const pending = this.creating;
112
+ if (pending) {
113
+ await pending.catch(() => undefined);
114
+ }
115
+ await this.closeEntry();
116
+ }
117
+ async getOrCreateEntry() {
118
+ if (this.entry && !this.entry.exited) {
119
+ return this.entry;
120
+ }
121
+ if (this.creating) {
122
+ return this.creating;
123
+ }
124
+ this.creating = this.createEntry();
125
+ try {
126
+ const entry = await this.creating;
127
+ if (this.closed) {
128
+ await this.stopEntry(entry);
129
+ throw new Error("CodeGraph worker pool closed while connecting");
130
+ }
131
+ this.entry = entry;
132
+ return entry;
133
+ }
134
+ finally {
135
+ this.creating = undefined;
136
+ }
137
+ }
138
+ async createEntry() {
139
+ const daemonRoot = await ensureDaemonRoot(this.settings);
140
+ const launch = await resolveCodeGraphLaunch(this.settings, [
141
+ "serve",
142
+ "--mcp",
143
+ "--path",
144
+ daemonRoot,
145
+ ]);
146
+ const child = spawn(launch.command, launch.args, {
147
+ cwd: daemonRoot,
148
+ env: {
149
+ ...process.env,
150
+ CODEGRAPH_DAEMON_IDLE_TIMEOUT_MS: process.env.CODEGRAPH_DAEMON_IDLE_TIMEOUT_MS ??
151
+ String(this.settings.workerIdleTimeoutMs),
152
+ CODEGRAPH_QUERY_POOL_SIZE: process.env.CODEGRAPH_QUERY_POOL_SIZE ??
153
+ String(this.settings.maxWorkers),
154
+ },
155
+ stdio: ["pipe", "pipe", "pipe"],
156
+ });
157
+ const peer = new JsonRpcPeer(child.stdout, child.stdin, {
158
+ name: "shared-codegraph-daemon",
159
+ });
160
+ const entry = { child, peer, exited: false };
161
+ let stderr = "";
162
+ child.stderr.setEncoding("utf8");
163
+ child.stderr.on("data", (chunk) => {
164
+ stderr = (stderr + chunk).slice(-8_192);
165
+ });
166
+ child.once("error", (error) => {
167
+ entry.exited = true;
168
+ peer.close(error);
169
+ });
170
+ child.once("exit", (code, signal) => {
171
+ entry.exited = true;
172
+ if (this.entry === entry) {
173
+ this.entry = undefined;
174
+ }
175
+ const detail = stderr.trim() ? `: ${sanitizeDiagnostic(stderr)}` : "";
176
+ peer.close(new Error(`CodeGraph proxy exited (code=${String(code)}, signal=${String(signal)})${detail}`));
177
+ });
178
+ try {
179
+ await peer.request("initialize", {
180
+ protocolVersion: "2024-11-05",
181
+ capabilities: {},
182
+ clientInfo: {
183
+ name: "pi-codegraph",
184
+ version: "0.0.0",
185
+ },
186
+ rootUri: pathToFileURL(daemonRoot).href,
187
+ }, { timeoutMs: this.settings.requestTimeoutMs });
188
+ peer.notify("notifications/initialized");
189
+ return entry;
190
+ }
191
+ catch (error) {
192
+ await this.stopEntry(entry);
193
+ const detail = stderr.trim() ? `: ${sanitizeDiagnostic(stderr)}` : "";
194
+ throw new Error(`Failed to connect to shared CodeGraph daemon${detail}`, {
195
+ cause: error,
196
+ });
197
+ }
198
+ }
199
+ async closeEntry() {
200
+ const entry = this.entry;
201
+ this.entry = undefined;
202
+ if (entry) {
203
+ await this.stopEntry(entry);
204
+ }
205
+ }
206
+ async stopEntry(entry) {
207
+ entry.peer.close(new Error("CodeGraph proxy closed"));
208
+ if (entry.exited) {
209
+ return;
210
+ }
211
+ entry.child.stdin.end();
212
+ const exited = new Promise((resolve) => {
213
+ entry.child.once("exit", () => resolve());
214
+ });
215
+ await Promise.race([exited, delay(500)]);
216
+ if (!entry.exited) {
217
+ entry.child.kill();
218
+ }
219
+ }
220
+ }
221
+ //# sourceMappingURL=worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../lib/worker-pool.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isac322/pi-codegraph",
3
- "version": "0.2.0",
3
+ "version": "0.3.1",
4
4
  "description": "CodeGraph tools for Pi and OMP with worktree-aware index lifecycle management.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -24,27 +24,40 @@
24
24
  ],
25
25
  "files": [
26
26
  ".mcp.json",
27
- "bin",
28
- "extensions",
29
- "lib",
27
+ "dist",
30
28
  "README.md",
29
+ "CONTRIBUTING.md",
31
30
  "LICENSE"
32
31
  ],
33
32
  "bin": {
34
- "pi-codegraph-mcp": "./bin/codegraph-mcp.mjs"
33
+ "pi-codegraph-mcp": "./dist/bin/codegraph-mcp.js"
35
34
  },
36
35
  "pi": {
37
36
  "extensions": [
38
- "./extensions/pi.mjs"
37
+ "./dist/extensions/pi.js"
39
38
  ]
40
39
  },
41
40
  "omp": {
42
41
  "extensions": [
43
- "./extensions/omp.mjs"
42
+ "./dist/extensions/omp.js"
44
43
  ]
45
44
  },
46
45
  "engines": {
47
- "node": ">=22.19.0"
46
+ "node": ">=22.19.0 <25.0.0"
47
+ },
48
+ "scripts": {
49
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
50
+ "build": "npm run clean && tsc -p tsconfig.build.json && node scripts/ensure-bin-executable.ts",
51
+ "check": "biome check .",
52
+ "check:fix": "biome check --write .",
53
+ "format": "biome format --write .",
54
+ "lint": "biome lint .",
55
+ "test:omp:docker": "docker build --file tests/docker/Dockerfile.omp --tag pi-codegraph-omp-integration . && docker run --rm pi-codegraph-omp-integration",
56
+ "test": "npm run build && node --test tests/codegraph.test.mjs",
57
+ "typecheck": "tsc -p tsconfig.json",
58
+ "prepack": "npm run build",
59
+ "test:integration:daemon": "docker build -f tests/docker/Dockerfile.omp -t pi-codegraph-omp-integration . && docker run --rm --init pi-codegraph-omp-integration bun tests/shared-daemon-docker.integration.ts",
60
+ "test:integration:pi": "docker build -f tests/docker/Dockerfile.pi -t pi-codegraph-pi-integration . && docker run --rm --init pi-codegraph-pi-integration"
48
61
  },
49
62
  "peerDependencies": {
50
63
  "@earendil-works/pi-coding-agent": "*",
@@ -59,7 +72,15 @@
59
72
  }
60
73
  },
61
74
  "optionalDependencies": {
62
- "@colbymchenry/codegraph": "1.0.1"
75
+ "@colbymchenry/codegraph": "1.4.1"
76
+ },
77
+ "devDependencies": {
78
+ "@biomejs/biome": "^2.5.4",
79
+ "@earendil-works/pi-coding-agent": "^0.80.10",
80
+ "@earendil-works/pi-tui": "^0.80.10",
81
+ "@types/node": "^22.20.1",
82
+ "tsx": "^4.23.1",
83
+ "typescript": "^7.0.2"
63
84
  },
64
85
  "publishConfig": {
65
86
  "access": "public"
@@ -1,146 +0,0 @@
1
- #!/usr/bin/env node
2
- import { loadSettings } from "../lib/config.mjs";
3
- import { ProjectGuard, WorkspaceManager, annotateFilesResult, normalizeFilesPath, publicSettings, sanitizeDiagnostic, truncateText } from "../lib/codegraph.mjs";
4
- import { CodeGraphWorkerPool } from "../lib/worker-pool.mjs";
5
- import { codegraphTools, codegraphToolNames } from "../lib/tool-metadata.mjs";
6
-
7
- const settings = await loadSettings();
8
- const baseRoot = process.env.PI_CODEGRAPH_BASE_ROOT || process.cwd();
9
- const guard = await ProjectGuard.create(baseRoot, settings);
10
- const manager = new WorkspaceManager(settings);
11
- const pool = new CodeGraphWorkerPool(settings);
12
- const controllers = new Map();
13
- let buffer = "";
14
- let gcTimer;
15
-
16
- function write(message) {
17
- process.stdout.write(`${JSON.stringify(message)}\n`);
18
- }
19
-
20
- function response(id, result) {
21
- write({ jsonrpc: "2.0", id, result });
22
- }
23
-
24
- function errorResponse(id, error, code = -32603) {
25
- write({ jsonrpc: "2.0", id, error: { code, message: sanitizeDiagnostic(error?.message || error) } });
26
- }
27
-
28
- async function resolveIdentity(params = {}) {
29
- return guard.resolve(params.projectPath || baseRoot);
30
- }
31
-
32
- function extractText(result) {
33
- return (result?.content || []).filter((part) => part?.type === "text").map((part) => part.text).join("\n") || JSON.stringify(result);
34
- }
35
-
36
- async function callTool(params, signal) {
37
- const name = params?.name;
38
- if (!codegraphToolNames.includes(name)) throw new Error(`Unknown CodeGraph tool: ${name}`);
39
- const supplied = { ...(params?.arguments || {}) };
40
- const identity = await resolveIdentity(supplied);
41
- await manager.prepare(identity, { signal });
42
- delete supplied.projectPath;
43
- const originalFilesPath = name === "codegraph_files" && typeof supplied.path === "string" ? supplied.path : undefined;
44
- if (name === "codegraph_files") {
45
- const normalized = normalizeFilesPath(originalFilesPath, identity.sourcePath);
46
- if (normalized === undefined) delete supplied.path;
47
- else supplied.path = normalized;
48
- }
49
- const result = await pool.call(identity.sourcePath, name, supplied, signal);
50
- if (result?.isError) return result;
51
- let text = extractText(result);
52
- if (name === "codegraph_files") text = annotateFilesResult(text, originalFilesPath);
53
- const limited = truncateText(text, settings.maxOutputChars);
54
- return {
55
- ...result,
56
- content: [{ type: "text", text: limited.text }],
57
- _meta: { projectPath: identity.sourcePath, truncated: limited.truncated },
58
- };
59
- }
60
-
61
- async function handleRequest(message, signal) {
62
- switch (message.method) {
63
- case "initialize":
64
- return {
65
- protocolVersion: "2024-11-05",
66
- capabilities: { tools: { listChanged: false } },
67
- serverInfo: { name: "pi-codegraph", version: "0.2.0" },
68
- };
69
- case "tools/list":
70
- return { tools: codegraphTools.map((tool) => ({ name: tool.name, description: tool.description, inputSchema: tool.inputSchema })) };
71
- case "tools/call":
72
- return callTool(message.params, signal);
73
- case "codegraph/workspace/prepare": {
74
- const identity = await resolveIdentity(message.params);
75
- const result = await manager.prepare(identity, { signal });
76
- await manager.gc(pool.activeProjects());
77
- return result;
78
- }
79
- case "codegraph/workspace/status": {
80
- const identity = await resolveIdentity(message.params);
81
- return manager.status(identity);
82
- }
83
- case "codegraph/workspace/sync": {
84
- const identity = await resolveIdentity(message.params);
85
- return manager.prepare(identity, { signal, forceSync: true });
86
- }
87
- case "codegraph/workspace/doctor": {
88
- const identity = await resolveIdentity(message.params);
89
- return manager.doctor(identity);
90
- }
91
- case "codegraph/workspace/gc":
92
- return manager.gc(pool.activeProjects(), Boolean(message.params?.force));
93
- case "codegraph/settings":
94
- return publicSettings(settings);
95
- case "shutdown":
96
- return null;
97
- default:
98
- throw Object.assign(new Error(`Method not found: ${message.method}`), { rpcCode: -32601 });
99
- }
100
- }
101
-
102
- async function receive(message) {
103
- if (message.method === "notifications/cancelled") {
104
- controllers.get(message.params?.requestId)?.abort();
105
- return;
106
- }
107
- if (message.id === undefined) return;
108
- const controller = new AbortController();
109
- controllers.set(message.id, controller);
110
- try {
111
- response(message.id, await handleRequest(message, controller.signal));
112
- } catch (error) {
113
- if (message.method === "tools/call") {
114
- response(message.id, { content: [{ type: "text", text: sanitizeDiagnostic(error.message) }], isError: true });
115
- } else {
116
- errorResponse(message.id, error, error.rpcCode);
117
- }
118
- } finally {
119
- controllers.delete(message.id);
120
- }
121
- }
122
-
123
- process.stdin.on("data", (chunk) => {
124
- buffer += chunk.toString("utf8");
125
- let newline;
126
- while ((newline = buffer.indexOf("\n")) !== -1) {
127
- const line = buffer.slice(0, newline).trim();
128
- buffer = buffer.slice(newline + 1);
129
- if (!line) continue;
130
- try { void receive(JSON.parse(line)); } catch { errorResponse(null, new Error("Invalid JSON"), -32700); }
131
- }
132
- });
133
-
134
- async function shutdown() {
135
- clearInterval(gcTimer);
136
- for (const controller of controllers.values()) controller.abort();
137
- await pool.close();
138
- }
139
-
140
- if (settings.autoGc) {
141
- gcTimer = setInterval(() => { void manager.gc(pool.activeProjects()); }, 60 * 60_000);
142
- gcTimer.unref?.();
143
- }
144
- process.on("SIGTERM", () => { void shutdown().finally(() => process.exit(0)); });
145
- process.on("SIGINT", () => { void shutdown().finally(() => process.exit(0)); });
146
- process.stdin.on("end", () => { void shutdown().finally(() => process.exit(0)); });
@@ -1,14 +0,0 @@
1
- import { loadSettings } from "../lib/config.mjs";
2
- import { workspaceSummary } from "../lib/codegraph.mjs";
3
- import { buildCodeGraphPrompt } from "../lib/prompt.mjs";
4
-
5
- export default async function ompCodeGraphExtension(omp) {
6
- const settings = await loadSettings();
7
- if (!settings.promptInjection || typeof omp?.on !== "function") return;
8
- omp.on("before_agent_start", async (event, ctx) => {
9
- const cwd = ctx?.cwd || process.cwd();
10
- const status = await workspaceSummary(cwd);
11
- const guidance = buildCodeGraphPrompt({ runtime: "omp", cwd, status });
12
- return { systemPrompt: event.systemPrompt ? `${event.systemPrompt}\n\n${guidance}` : guidance };
13
- });
14
- }