graph-indexer 3.0.1 → 3.1.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 (52) hide show
  1. package/CHANGELOG.md +404 -0
  2. package/README.md +61 -8
  3. package/bin/graph-indexer.mjs +46 -5
  4. package/integrations/claude-code/.claude-plugin/plugin.json +1 -1
  5. package/integrations/claude-code/agents/code-structure.md +0 -3
  6. package/integrations/claude-code/skills/setup/SKILL.md +26 -0
  7. package/integrations/claude-code-local/.claude-plugin/plugin.json +9 -0
  8. package/integrations/{claude-code → claude-code-local}/.mcp.json +1 -1
  9. package/integrations/claude-code-local/README.md +10 -0
  10. package/integrations/claude-code-local/agents/code-structure.md +22 -0
  11. package/integrations/{claude-code → claude-code-local}/hooks/gi-hook.mjs +3 -1
  12. package/package.json +1 -1
  13. package/src/cli/helper.mjs +15 -1
  14. package/src/cli/hook.mjs +123 -41
  15. package/src/cli/init.mjs +16 -1
  16. package/src/cli/resident.mjs +1 -1
  17. package/src/index/indexer.mjs +77 -41
  18. package/src/index/modules.mjs +76 -2
  19. package/src/index/parse-worker.mjs +12 -0
  20. package/src/index/parsepool.mjs +73 -0
  21. package/src/index/resolver.mjs +362 -23
  22. package/src/mcp/server.mjs +16 -12
  23. package/src/mcp/tools.mjs +417 -25
  24. package/src/parse/arity.mjs +39 -2
  25. package/src/parse/extract.mjs +269 -45
  26. package/src/parse/lang/ecma.mjs +2 -0
  27. package/src/parse/lang/go.mjs +2 -0
  28. package/src/parse/lang/jvm.mjs +33 -0
  29. package/src/parse/lang/markdown.mjs +92 -0
  30. package/src/parse/lang/python.mjs +43 -0
  31. package/src/parse/lang/rust.mjs +215 -15
  32. package/src/parse/lang/sfc.mjs +125 -0
  33. package/src/parse/languages.mjs +9 -2
  34. package/src/query/check.mjs +49 -13
  35. package/src/query/facts.mjs +3 -2
  36. package/src/query/injection-spring.mjs +405 -0
  37. package/src/query/injection.mjs +173 -0
  38. package/src/query/intel.mjs +76 -14
  39. package/src/query/issue.mjs +156 -0
  40. package/src/query/orm.mjs +286 -0
  41. package/src/query/read.mjs +6 -1
  42. package/src/query/report.mjs +53 -0
  43. package/src/query/routes.mjs +142 -0
  44. package/src/query/showcase.mjs +59 -0
  45. package/src/search/search.mjs +85 -17
  46. package/src/search/semantic.mjs +201 -0
  47. package/src/search/vectors.mjs +122 -0
  48. package/src/store/db.mjs +22 -4
  49. package/vendor/grammars/README.md +47 -0
  50. package/vendor/grammars/kotlin.wasm.gz +0 -0
  51. package/vendor/grammars/manifest.json +4 -4
  52. /package/integrations/{claude-code → claude-code-local}/hooks/hooks.json +0 -0
@@ -64,13 +64,17 @@ export class McpServer {
64
64
  this.#error(id, -32022, `Unsupported protocol version: ${reqVersion}`, { supported: SUPPORTED_VERSIONS, requested: reqVersion });
65
65
  return;
66
66
  }
67
+ // 2026-07-28 results say whether they are complete (or need more input from the client);
68
+ // a client of that version ignores a result without it
69
+ const stateless = this.#requestVersion(params) === '2026-07-28' || method === 'server/discover';
70
+ const done = (res) => this.#result(id, stateless ? { resultType: 'complete', ...res } : res);
67
71
  try {
68
72
  switch (method) {
69
73
  case 'initialize': {
70
74
  const requested = params?.protocolVersion;
71
75
  const version = SUPPORTED_VERSIONS.includes(requested) && requested !== '2026-07-28' ? requested : LATEST_HANDSHAKE;
72
76
  this.negotiated = version;
73
- this.#result(id, {
77
+ done({
74
78
  protocolVersion: version,
75
79
  capabilities: { tools: { listChanged: false } },
76
80
  serverInfo: { ...this.info, title: 'graph-indexer — code graph & search' },
@@ -79,7 +83,7 @@ export class McpServer {
79
83
  return;
80
84
  }
81
85
  case 'server/discover':
82
- this.#result(id, {
86
+ done({
83
87
  supportedVersions: SUPPORTED_VERSIONS,
84
88
  capabilities: { tools: { listChanged: false } },
85
89
  instructions: SERVER_INSTRUCTIONS,
@@ -89,12 +93,12 @@ export class McpServer {
89
93
  });
90
94
  return;
91
95
  case 'ping':
92
- this.#result(id, {});
96
+ done({});
93
97
  return;
94
98
  case 'tools/list': {
95
99
  const res = { tools: TOOLS.map(({ name, title, description, inputSchema, annotations, _meta }) => ({ name, title, description, inputSchema, annotations, ...(_meta ? { _meta } : {}) })) };
96
100
  if (this.#requestVersion(params) === '2026-07-28') Object.assign(res, { ttlMs: 3_600_000, cacheScope: 'private' });
97
- this.#result(id, res);
101
+ done(res);
98
102
  return;
99
103
  }
100
104
  case 'tools/call': {
@@ -104,7 +108,7 @@ export class McpServer {
104
108
  const args = params?.arguments ?? {};
105
109
  const missing = (tool.inputSchema.required ?? []).filter(k => args[k] === undefined || args[k] === null || args[k] === '');
106
110
  if (missing.length) {
107
- this.#result(id, { content: [{ type: 'text', text: `Missing required argument(s): ${missing.join(', ')}.` }], isError: true });
111
+ done({ content: [{ type: 'text', text: `Missing required argument(s): ${missing.join(', ')}.` }], isError: true });
108
112
  return;
109
113
  }
110
114
  this.inflight++;
@@ -112,18 +116,18 @@ export class McpServer {
112
116
  const note = await this.#awaitReady();
113
117
  await this.intel.ensureFresh();
114
118
  const text = await callTool(this.intel, name, args);
115
- this.#result(id, { content: [{ type: 'text', text: note ? `${note}\n${text}` : text }] });
119
+ done({ content: [{ type: 'text', text: note ? `${note}\n${text}` : text }] });
116
120
  } catch (err) {
117
121
  this.log(`tool ${name} failed: ${err.stack || err.message}`);
118
- this.#result(id, { content: [{ type: 'text', text: `graph-indexer error in ${name}: ${err.message}` }], isError: true });
122
+ done({ content: [{ type: 'text', text: `graph-indexer error in ${name}: ${err.message}` }], isError: true });
119
123
  } finally { this.inflight--; }
120
124
  return;
121
125
  }
122
- case 'resources/list': this.#result(id, { resources: [] }); return;
123
- case 'resources/templates/list': this.#result(id, { resourceTemplates: [] }); return;
124
- case 'prompts/list': this.#result(id, { prompts: [] }); return;
125
- case 'logging/setLevel': this.#result(id, {}); return;
126
- case 'completion/complete': this.#result(id, { completion: { values: [], hasMore: false } }); return;
126
+ case 'resources/list': done({ resources: [] }); return;
127
+ case 'resources/templates/list': done({ resourceTemplates: [] }); return;
128
+ case 'prompts/list': done({ prompts: [] }); return;
129
+ case 'logging/setLevel': done({}); return;
130
+ case 'completion/complete': done({ completion: { values: [], hasMore: false } }); return;
127
131
  default:
128
132
  this.#error(id, -32601, `Method not found: ${method}`);
129
133
  }