mcp-codebase-intelligence 0.2.0 → 0.3.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.
Files changed (40) hide show
  1. package/README.md +97 -16
  2. package/dist/graph/code-graph.d.ts +16 -0
  3. package/dist/graph/code-graph.js +30 -4
  4. package/dist/graph/code-graph.js.map +1 -1
  5. package/dist/graph/schema.js +1 -0
  6. package/dist/graph/schema.js.map +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.js +61 -60
  9. package/dist/index.js.map +1 -1
  10. package/dist/indexer/docstring-extractor.d.ts +7 -0
  11. package/dist/indexer/docstring-extractor.js +118 -0
  12. package/dist/indexer/docstring-extractor.js.map +1 -0
  13. package/dist/indexer/file-watcher.d.ts +2 -2
  14. package/dist/indexer/file-watcher.js +24 -15
  15. package/dist/indexer/file-watcher.js.map +1 -1
  16. package/dist/indexer/lang-cpp.d.ts +3 -0
  17. package/dist/indexer/lang-cpp.js +469 -0
  18. package/dist/indexer/lang-cpp.js.map +1 -0
  19. package/dist/indexer/lang-go.js +4 -0
  20. package/dist/indexer/lang-go.js.map +1 -1
  21. package/dist/indexer/lang-java.js +4 -0
  22. package/dist/indexer/lang-java.js.map +1 -1
  23. package/dist/indexer/lang-python.js +3 -0
  24. package/dist/indexer/lang-python.js.map +1 -1
  25. package/dist/indexer/lang-rust.js +5 -0
  26. package/dist/indexer/lang-rust.js.map +1 -1
  27. package/dist/indexer/tree-sitter-indexer.js +5 -0
  28. package/dist/indexer/tree-sitter-indexer.js.map +1 -1
  29. package/dist/project-manager.d.ts +63 -0
  30. package/dist/project-manager.js +479 -0
  31. package/dist/project-manager.js.map +1 -0
  32. package/dist/tools/find-symbol.js +2 -1
  33. package/dist/tools/find-symbol.js.map +1 -1
  34. package/dist/tools/project-tools.d.ts +38 -0
  35. package/dist/tools/project-tools.js +72 -0
  36. package/dist/tools/project-tools.js.map +1 -0
  37. package/dist/tools/search-codebase.d.ts +39 -0
  38. package/dist/tools/search-codebase.js +59 -0
  39. package/dist/tools/search-codebase.js.map +1 -0
  40. package/package.json +3 -1
@@ -0,0 +1,479 @@
1
+ import { existsSync, readFileSync, statSync, mkdirSync, writeFileSync } from "fs";
2
+ import path from "path";
3
+ import { initializeDatabase } from "./graph/schema.js";
4
+ import { CodeGraph } from "./graph/code-graph.js";
5
+ import { FileWatcher } from "./indexer/file-watcher.js";
6
+ import { LspManager } from "./lsp/lsp-manager.js";
7
+ import { logger } from "./utils/logger.js";
8
+ const CODEGRAPH_DIR = path.join(process.env.HOME || process.env.USERPROFILE || "/tmp", ".codegraph");
9
+ /**
10
+ * Detect git root by walking up from cwd
11
+ */
12
+ function detectGitRoot(startDir) {
13
+ let dir = path.resolve(startDir);
14
+ while (true) {
15
+ if (existsSync(path.join(dir, ".git")))
16
+ return dir;
17
+ const parent = path.dirname(dir);
18
+ if (parent === dir)
19
+ return null;
20
+ dir = parent;
21
+ }
22
+ }
23
+ /**
24
+ * Detect monorepo workspace packages and return include paths
25
+ */
26
+ function detectMonorepoIncludes(root) {
27
+ // pnpm-workspace.yaml
28
+ const pnpmPath = path.join(root, "pnpm-workspace.yaml");
29
+ if (existsSync(pnpmPath)) {
30
+ try {
31
+ const content = readFileSync(pnpmPath, "utf-8");
32
+ const packages = [];
33
+ // Simple YAML parsing — extract packages array entries
34
+ let inPackages = false;
35
+ for (const line of content.split("\n")) {
36
+ if (line.match(/^packages\s*:/)) {
37
+ inPackages = true;
38
+ continue;
39
+ }
40
+ if (inPackages) {
41
+ const match = line.match(/^\s+-\s+['"]?([^'"]+)['"]?\s*$/);
42
+ if (match) {
43
+ packages.push(match[1].replace(/\/\*$/, ""));
44
+ }
45
+ else if (line.match(/^\S/)) {
46
+ break; // next top-level key
47
+ }
48
+ }
49
+ }
50
+ if (packages.length > 0) {
51
+ logger.info(`Detected pnpm workspace: ${packages.length} package patterns`);
52
+ return packages;
53
+ }
54
+ }
55
+ catch { /* ignore parse errors */ }
56
+ }
57
+ // lerna.json
58
+ const lernaPath = path.join(root, "lerna.json");
59
+ if (existsSync(lernaPath)) {
60
+ try {
61
+ const config = JSON.parse(readFileSync(lernaPath, "utf-8"));
62
+ const packages = (config.packages || ["packages/*"]).map((p) => p.replace(/\/\*$/, ""));
63
+ logger.info(`Detected lerna workspace: ${packages.length} package patterns`);
64
+ return packages;
65
+ }
66
+ catch { /* ignore */ }
67
+ }
68
+ // nx.json (check for workspace layout)
69
+ if (existsSync(path.join(root, "nx.json"))) {
70
+ const pkgJson = path.join(root, "package.json");
71
+ if (existsSync(pkgJson)) {
72
+ try {
73
+ const pkg = JSON.parse(readFileSync(pkgJson, "utf-8"));
74
+ if (pkg.workspaces) {
75
+ const ws = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages || [];
76
+ const packages = ws.map((p) => p.replace(/\/\*$/, ""));
77
+ logger.info(`Detected nx workspace: ${packages.length} package patterns`);
78
+ return packages;
79
+ }
80
+ }
81
+ catch { /* ignore */ }
82
+ }
83
+ }
84
+ // go.work
85
+ const goWorkPath = path.join(root, "go.work");
86
+ if (existsSync(goWorkPath)) {
87
+ try {
88
+ const content = readFileSync(goWorkPath, "utf-8");
89
+ const dirs = [];
90
+ let inUse = false;
91
+ for (const line of content.split("\n")) {
92
+ if (line.match(/^use\s*\(/)) {
93
+ inUse = true;
94
+ continue;
95
+ }
96
+ if (inUse && line.match(/^\)/)) {
97
+ inUse = false;
98
+ continue;
99
+ }
100
+ if (inUse) {
101
+ const dir = line.trim();
102
+ if (dir && !dir.startsWith("//"))
103
+ dirs.push(dir);
104
+ }
105
+ // single-line: use ./foo
106
+ const single = line.match(/^use\s+(\S+)/);
107
+ if (single && !line.includes("("))
108
+ dirs.push(single[1]);
109
+ }
110
+ if (dirs.length > 0) {
111
+ logger.info(`Detected Go workspace: ${dirs.length} modules`);
112
+ return dirs;
113
+ }
114
+ }
115
+ catch { /* ignore */ }
116
+ }
117
+ // Cargo.toml with [workspace]
118
+ const cargoPath = path.join(root, "Cargo.toml");
119
+ if (existsSync(cargoPath)) {
120
+ try {
121
+ const content = readFileSync(cargoPath, "utf-8");
122
+ if (content.includes("[workspace]")) {
123
+ const members = [];
124
+ let inMembers = false;
125
+ for (const line of content.split("\n")) {
126
+ if (line.match(/^members\s*=/)) {
127
+ inMembers = true;
128
+ // Check for inline array: members = ["foo", "bar"]
129
+ const inline = line.match(/\[([^\]]+)\]/);
130
+ if (inline) {
131
+ inline[1].split(",").forEach(m => {
132
+ const trimmed = m.trim().replace(/['"]/g, "").replace(/\/\*$/, "");
133
+ if (trimmed)
134
+ members.push(trimmed);
135
+ });
136
+ inMembers = false;
137
+ }
138
+ continue;
139
+ }
140
+ if (inMembers) {
141
+ if (line.match(/^\s*\]/)) {
142
+ inMembers = false;
143
+ continue;
144
+ }
145
+ const m = line.match(/['"]([^'"]+)['"]/);
146
+ if (m)
147
+ members.push(m[1].replace(/\/\*$/, ""));
148
+ }
149
+ }
150
+ if (members.length > 0) {
151
+ logger.info(`Detected Cargo workspace: ${members.length} members`);
152
+ return members;
153
+ }
154
+ }
155
+ }
156
+ catch { /* ignore */ }
157
+ }
158
+ // npm/yarn workspaces (package.json)
159
+ const pkgJsonPath = path.join(root, "package.json");
160
+ if (existsSync(pkgJsonPath)) {
161
+ try {
162
+ const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
163
+ if (pkg.workspaces) {
164
+ const ws = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages || [];
165
+ if (ws.length > 0) {
166
+ const packages = ws.map((p) => p.replace(/\/\*$/, ""));
167
+ logger.info(`Detected npm/yarn workspace: ${packages.length} package patterns`);
168
+ return packages;
169
+ }
170
+ }
171
+ }
172
+ catch { /* ignore */ }
173
+ }
174
+ return null;
175
+ }
176
+ /**
177
+ * Find .codegraph.json walking up from startDir to git root
178
+ */
179
+ function findLocalConfig(startDir) {
180
+ let dir = path.resolve(startDir);
181
+ const gitRoot = detectGitRoot(startDir);
182
+ const stopAt = gitRoot ? path.dirname(gitRoot) : path.parse(dir).root;
183
+ while (true) {
184
+ const configPath = path.join(dir, ".codegraph.json");
185
+ if (existsSync(configPath)) {
186
+ try {
187
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
188
+ logger.info(`Loaded config from ${configPath}`);
189
+ return { config, dir };
190
+ }
191
+ catch (err) {
192
+ logger.warn(`Invalid .codegraph.json at ${configPath}`, err);
193
+ }
194
+ }
195
+ if (dir === stopAt || dir === path.parse(dir).root)
196
+ break;
197
+ dir = path.dirname(dir);
198
+ }
199
+ return null;
200
+ }
201
+ /**
202
+ * Load user-level config from ~/.codegraph/config.json
203
+ */
204
+ function loadUserConfig() {
205
+ const configPath = path.join(CODEGRAPH_DIR, "config.json");
206
+ if (existsSync(configPath)) {
207
+ try {
208
+ const config = JSON.parse(readFileSync(configPath, "utf-8"));
209
+ logger.info(`Loaded user config from ${configPath}`);
210
+ return config;
211
+ }
212
+ catch (err) {
213
+ logger.warn(`Invalid config at ${configPath}`, err);
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ /**
219
+ * Resolve a ProjectConfig into absolute root paths
220
+ */
221
+ function resolveRoots(config, baseDir) {
222
+ const roots = [];
223
+ if (config.root) {
224
+ const absRoot = path.resolve(config.root);
225
+ if (config.include && config.include.length > 0) {
226
+ // Monorepo scoped — each include becomes a root
227
+ for (const inc of config.include) {
228
+ const absInc = path.resolve(absRoot, inc);
229
+ if (existsSync(absInc))
230
+ roots.push(absInc);
231
+ else
232
+ logger.warn(`Include path not found: ${absInc}`);
233
+ }
234
+ }
235
+ else {
236
+ roots.push(absRoot);
237
+ }
238
+ }
239
+ if (config.roots) {
240
+ for (const r of config.roots) {
241
+ const absRoot = path.resolve(r);
242
+ if (existsSync(absRoot))
243
+ roots.push(absRoot);
244
+ else
245
+ logger.warn(`Root not found: ${absRoot}`);
246
+ }
247
+ }
248
+ return [...new Set(roots)]; // deduplicate
249
+ }
250
+ /**
251
+ * Get DB path for a project
252
+ */
253
+ function getDbPath(projectName) {
254
+ const graphsDir = path.join(CODEGRAPH_DIR, "graphs");
255
+ mkdirSync(graphsDir, { recursive: true });
256
+ return path.join(graphsDir, `${projectName}.db`);
257
+ }
258
+ /**
259
+ * Initialize a resolved project (DB, graph, watcher, LSP)
260
+ */
261
+ function initProject(name, roots) {
262
+ const dbPath = getDbPath(name);
263
+ const db = initializeDatabase(dbPath);
264
+ const graph = new CodeGraph(db);
265
+ const watcher = new FileWatcher(roots, graph);
266
+ // LSP uses the first root as the workspace root
267
+ const lspManager = new LspManager(roots[0]);
268
+ return { name, roots, graph, watcher, lspManager, db };
269
+ }
270
+ export class ProjectManager {
271
+ projects = new Map();
272
+ _activeProject = null;
273
+ /**
274
+ * Resolve configuration and initialize all projects
275
+ */
276
+ async initialize() {
277
+ const cwd = process.cwd();
278
+ let projectConfigs = {};
279
+ // 1. Check for local .codegraph.json
280
+ const localConfig = findLocalConfig(cwd);
281
+ if (localConfig) {
282
+ for (const [name, config] of Object.entries(localConfig.config.projects || {})) {
283
+ // If root is relative or not set, resolve relative to config file location
284
+ if (config.root && !path.isAbsolute(config.root)) {
285
+ config.root = path.resolve(localConfig.dir, config.root);
286
+ }
287
+ if (!config.root && !config.roots) {
288
+ config.root = localConfig.dir;
289
+ }
290
+ projectConfigs[name] = config;
291
+ }
292
+ }
293
+ // 2. Check user-level config (merge, local takes precedence)
294
+ const userConfig = loadUserConfig();
295
+ if (userConfig) {
296
+ for (const [name, config] of Object.entries(userConfig.projects || {})) {
297
+ if (!projectConfigs[name]) {
298
+ projectConfigs[name] = config;
299
+ }
300
+ }
301
+ }
302
+ // 3. Check PROJECT_ROOTS env
303
+ if (Object.keys(projectConfigs).length === 0 && process.env.PROJECT_ROOTS) {
304
+ const roots = process.env.PROJECT_ROOTS.split(",").map(r => r.trim()).filter(Boolean);
305
+ projectConfigs["default"] = { roots };
306
+ }
307
+ // 4. Check PROJECT_ROOT env (backwards compat)
308
+ if (Object.keys(projectConfigs).length === 0 && process.env.PROJECT_ROOT) {
309
+ projectConfigs["default"] = { root: process.env.PROJECT_ROOT };
310
+ }
311
+ // 5. Auto-detect from cwd
312
+ if (Object.keys(projectConfigs).length === 0) {
313
+ const gitRoot = detectGitRoot(cwd);
314
+ const root = gitRoot || cwd;
315
+ // Check for monorepo markers
316
+ const includes = detectMonorepoIncludes(root);
317
+ if (includes) {
318
+ projectConfigs["default"] = { root, include: includes };
319
+ }
320
+ else {
321
+ projectConfigs["default"] = { root };
322
+ }
323
+ }
324
+ // Resolve and initialize all projects
325
+ for (const [name, config] of Object.entries(projectConfigs)) {
326
+ const roots = resolveRoots(config);
327
+ if (roots.length === 0) {
328
+ logger.warn(`Project "${name}" has no valid roots, skipping`);
329
+ continue;
330
+ }
331
+ // Validate all roots exist and are directories
332
+ for (const root of roots) {
333
+ if (!existsSync(root) || !statSync(root).isDirectory()) {
334
+ logger.warn(`Project "${name}": root is not a valid directory: ${root}`);
335
+ }
336
+ }
337
+ const project = initProject(name, roots.filter(r => existsSync(r) && statSync(r).isDirectory()));
338
+ this.projects.set(name, project);
339
+ logger.info(`Project "${name}": ${project.roots.length} root(s) — ${project.roots.join(", ")}`);
340
+ }
341
+ // Auto-select active project
342
+ if (this.projects.size === 1) {
343
+ this._activeProject = this.projects.keys().next().value;
344
+ }
345
+ else if (this.projects.size > 1) {
346
+ // Match cwd against project roots
347
+ const cwdResolved = path.resolve(cwd);
348
+ let bestMatch = null;
349
+ let bestLen = 0;
350
+ for (const [name, project] of this.projects) {
351
+ for (const root of project.roots) {
352
+ if (cwdResolved.startsWith(root) && root.length > bestLen) {
353
+ bestMatch = name;
354
+ bestLen = root.length;
355
+ }
356
+ }
357
+ }
358
+ this._activeProject = bestMatch || this.projects.keys().next().value;
359
+ }
360
+ if (this._activeProject) {
361
+ logger.info(`Active project: "${this._activeProject}"`);
362
+ }
363
+ }
364
+ /**
365
+ * Index and start watching all projects
366
+ */
367
+ async startAll() {
368
+ for (const [name, project] of this.projects) {
369
+ logger.info(`Indexing project "${name}"...`);
370
+ await project.watcher.initialIndex();
371
+ project.watcher.startWatching();
372
+ // Start LSP in background
373
+ project.lspManager.start().then(() => {
374
+ const servers = project.lspManager.getActiveServers();
375
+ if (servers.length > 0) {
376
+ logger.info(`Project "${name}" LSP: ${servers.join(", ")}`);
377
+ }
378
+ }).catch((err) => {
379
+ logger.warn(`Project "${name}" LSP startup failed (non-fatal)`, err);
380
+ });
381
+ }
382
+ }
383
+ /**
384
+ * Get the active project
385
+ */
386
+ get active() {
387
+ if (!this._activeProject)
388
+ return null;
389
+ return this.projects.get(this._activeProject) || null;
390
+ }
391
+ get activeProjectName() {
392
+ return this._activeProject;
393
+ }
394
+ /**
395
+ * Switch active project
396
+ */
397
+ switchProject(name) {
398
+ if (this.projects.has(name)) {
399
+ this._activeProject = name;
400
+ logger.info(`Switched to project "${name}"`);
401
+ return true;
402
+ }
403
+ return false;
404
+ }
405
+ /**
406
+ * List all projects with stats
407
+ */
408
+ listProjects() {
409
+ const result = [];
410
+ for (const [name, project] of this.projects) {
411
+ result.push({
412
+ name,
413
+ active: name === this._activeProject,
414
+ roots: project.roots,
415
+ stats: project.graph.getStats(),
416
+ });
417
+ }
418
+ return result;
419
+ }
420
+ /**
421
+ * Add a project at runtime and persist to user config
422
+ */
423
+ async addProject(name, config) {
424
+ if (this.projects.has(name)) {
425
+ return `Project "${name}" already exists. Use switch_project to activate it.`;
426
+ }
427
+ const roots = resolveRoots(config);
428
+ if (roots.length === 0) {
429
+ return `No valid roots found for project "${name}".`;
430
+ }
431
+ const project = initProject(name, roots);
432
+ this.projects.set(name, project);
433
+ // Index it
434
+ await project.watcher.initialIndex();
435
+ project.watcher.startWatching();
436
+ project.lspManager.start().catch(() => { });
437
+ // Persist to user config
438
+ const userConfigPath = path.join(CODEGRAPH_DIR, "config.json");
439
+ let userConfig = { projects: {} };
440
+ if (existsSync(userConfigPath)) {
441
+ try {
442
+ userConfig = JSON.parse(readFileSync(userConfigPath, "utf-8"));
443
+ }
444
+ catch { /* start fresh */ }
445
+ }
446
+ userConfig.projects[name] = config;
447
+ mkdirSync(CODEGRAPH_DIR, { recursive: true });
448
+ writeFileSync(userConfigPath, JSON.stringify(userConfig, null, 2) + "\n");
449
+ // Auto-switch to new project
450
+ this._activeProject = name;
451
+ const stats = project.graph.getStats();
452
+ return `Project "${name}" added and activated. ${stats.files} files, ${stats.symbols} symbols indexed.`;
453
+ }
454
+ /**
455
+ * Get all root paths for the active project (for descriptions, etc.)
456
+ */
457
+ getActiveRoots() {
458
+ return this.active?.roots || [];
459
+ }
460
+ /**
461
+ * Get the primary root (first root) of the active project
462
+ */
463
+ getPrimaryRoot() {
464
+ const roots = this.getActiveRoots();
465
+ return roots.length > 0 ? roots[0] : null;
466
+ }
467
+ /**
468
+ * Shut down all projects
469
+ */
470
+ async shutdown() {
471
+ for (const [name, project] of this.projects) {
472
+ logger.info(`Shutting down project "${name}"...`);
473
+ await project.watcher.stop();
474
+ await project.lspManager.stop();
475
+ project.db.close();
476
+ }
477
+ }
478
+ }
479
+ //# sourceMappingURL=project-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-manager.js","sourceRoot":"","sources":["../src/project-manager.ts"],"names":[],"mappings":"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"}
@@ -38,7 +38,8 @@ export function handleFindSymbol(graph, args) {
38
38
  const formatted = results.map((s) => {
39
39
  const exported = s.isExported ? " [exported]" : "";
40
40
  const sig = s.signature ? `\n Signature: ${s.signature}` : "";
41
- return `${s.kind} ${s.name}${exported}\n Location: ${s.filePath}:${s.lineStart}-${s.lineEnd}${sig}`;
41
+ const doc = s.docstring ? `\n Docstring: ${s.docstring}` : "";
42
+ return `${s.kind} ${s.name}${exported}\n Location: ${s.filePath}:${s.lineStart}-${s.lineEnd}${sig}${doc}`;
42
43
  });
43
44
  return {
44
45
  content: [
@@ -1 +1 @@
1
- {"version":3,"file":"find-symbol.js","sourceRoot":"","sources":["../../src/tools/find-symbol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,oJAAoJ;IACtJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uDAAuD;aACrE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;gBAC1F,WAAW,EAAE,iCAAiC;aAC/C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wDAAwD;aACtE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,IAAqE;IAErE,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;KACxB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;IACpG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,iBAAiB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG,EAAE,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,wBAAwB,IAAI,CAAC,IAAI,SAAS,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;aAChG;SACF;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"find-symbol.js","sourceRoot":"","sources":["../../src/tools/find-symbol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,aAAa;IACnB,WAAW,EACT,oJAAoJ;IACtJ,WAAW,EAAE;QACX,IAAI,EAAE,QAAiB;QACvB,UAAU,EAAE;YACV,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,uDAAuD;aACrE;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,IAAI,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC;gBAC1F,WAAW,EAAE,iCAAiC;aAC/C;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,wDAAwD;aACtE;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,yCAAyC;aACvD;SACF;QACD,QAAQ,EAAE,CAAC,MAAM,CAAC;KACnB;CACF,CAAC;AAEF,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,IAAqE;IAErE,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,CAAC;QAChC,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;KACxB,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,8BAA8B,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;IACpG,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAClC,MAAM,QAAQ,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,OAAO,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,GAAG,QAAQ,iBAAiB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,OAAO,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IAC7G,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,wBAAwB,IAAI,CAAC,IAAI,SAAS,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;aAChG;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { ProjectManager } from "../project-manager.js";
2
+ export declare const listProjectsTool: {
3
+ name: string;
4
+ description: string;
5
+ };
6
+ export declare function handleListProjects(pm: ProjectManager): {
7
+ content: {
8
+ type: "text";
9
+ text: string;
10
+ }[];
11
+ };
12
+ export declare const switchProjectTool: {
13
+ name: string;
14
+ description: string;
15
+ };
16
+ export declare function handleSwitchProject(pm: ProjectManager, args: {
17
+ project_name: string;
18
+ }): {
19
+ content: {
20
+ type: "text";
21
+ text: string;
22
+ }[];
23
+ };
24
+ export declare const addProjectTool: {
25
+ name: string;
26
+ description: string;
27
+ };
28
+ export declare function handleAddProject(pm: ProjectManager, args: {
29
+ project_name: string;
30
+ roots?: string;
31
+ root?: string;
32
+ include?: string;
33
+ }): Promise<{
34
+ content: {
35
+ type: "text";
36
+ text: string;
37
+ }[];
38
+ }>;
@@ -0,0 +1,72 @@
1
+ export const listProjectsTool = {
2
+ name: "list_projects",
3
+ description: "List all configured projects, their roots, and index stats. Shows which project is currently active.",
4
+ };
5
+ export function handleListProjects(pm) {
6
+ const projects = pm.listProjects();
7
+ if (projects.length === 0) {
8
+ return {
9
+ content: [{ type: "text", text: "No projects configured." }],
10
+ };
11
+ }
12
+ const lines = [];
13
+ for (const p of projects) {
14
+ const marker = p.active ? " (active)" : "";
15
+ lines.push(`## ${p.name}${marker}`);
16
+ lines.push(`Roots: ${p.roots.join(", ")}`);
17
+ lines.push(`Files: ${p.stats.files}, Symbols: ${p.stats.symbols}, References: ${p.stats.references}, Imports: ${p.stats.imports}`);
18
+ lines.push("");
19
+ }
20
+ return {
21
+ content: [{ type: "text", text: lines.join("\n") }],
22
+ };
23
+ }
24
+ export const switchProjectTool = {
25
+ name: "switch_project",
26
+ description: "Switch the active project context. All subsequent tool calls will operate against the selected project's code graph.",
27
+ };
28
+ export function handleSwitchProject(pm, args) {
29
+ const success = pm.switchProject(args.project_name);
30
+ if (success) {
31
+ const active = pm.active;
32
+ const stats = active.graph.getStats();
33
+ return {
34
+ content: [{
35
+ type: "text",
36
+ text: `Switched to project "${args.project_name}".\nRoots: ${active.roots.join(", ")}\nFiles: ${stats.files}, Symbols: ${stats.symbols}, References: ${stats.references}`,
37
+ }],
38
+ };
39
+ }
40
+ const available = pm.listProjects().map(p => p.name).join(", ");
41
+ return {
42
+ content: [{
43
+ type: "text",
44
+ text: `Project "${args.project_name}" not found. Available projects: ${available}`,
45
+ }],
46
+ };
47
+ }
48
+ export const addProjectTool = {
49
+ name: "add_project",
50
+ description: "Add a new project at runtime. Provide a name and one or more root paths. The project is indexed immediately and persisted to ~/.codegraph/config.json.",
51
+ };
52
+ export async function handleAddProject(pm, args) {
53
+ const roots = args.roots ? args.roots.split(",").map(r => r.trim()).filter(Boolean) : undefined;
54
+ const include = args.include ? args.include.split(",").map(r => r.trim()).filter(Boolean) : undefined;
55
+ const config = {};
56
+ if (args.root)
57
+ config.root = args.root;
58
+ if (roots && roots.length > 0)
59
+ config.roots = roots;
60
+ if (include && include.length > 0)
61
+ config.include = include;
62
+ if (!config.root && (!config.roots || config.roots.length === 0)) {
63
+ return {
64
+ content: [{ type: "text", text: "Please provide at least one root path (via 'root' or 'roots' parameter)." }],
65
+ };
66
+ }
67
+ const result = await pm.addProject(args.project_name, config);
68
+ return {
69
+ content: [{ type: "text", text: result }],
70
+ };
71
+ }
72
+ //# sourceMappingURL=project-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-tools.js","sourceRoot":"","sources":["../../src/tools/project-tools.ts"],"names":[],"mappings":"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"}