spec-gen-cli 1.2.2 → 1.2.4

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 (141) hide show
  1. package/README.md +272 -25
  2. package/dist/api/generate.d.ts.map +1 -1
  3. package/dist/api/generate.js +11 -7
  4. package/dist/api/generate.js.map +1 -1
  5. package/dist/api/run.d.ts.map +1 -1
  6. package/dist/api/run.js +5 -3
  7. package/dist/api/run.js.map +1 -1
  8. package/dist/api/types.d.ts +4 -4
  9. package/dist/api/types.d.ts.map +1 -1
  10. package/dist/cli/commands/analyze.d.ts.map +1 -1
  11. package/dist/cli/commands/analyze.js +101 -41
  12. package/dist/cli/commands/analyze.js.map +1 -1
  13. package/dist/cli/commands/generate.d.ts.map +1 -1
  14. package/dist/cli/commands/generate.js +28 -23
  15. package/dist/cli/commands/generate.js.map +1 -1
  16. package/dist/cli/commands/mcp.d.ts +353 -10
  17. package/dist/cli/commands/mcp.d.ts.map +1 -1
  18. package/dist/cli/commands/mcp.js +241 -48
  19. package/dist/cli/commands/mcp.js.map +1 -1
  20. package/dist/cli/commands/view.d.ts.map +1 -1
  21. package/dist/cli/commands/view.js +33 -4
  22. package/dist/cli/commands/view.js.map +1 -1
  23. package/dist/constants.d.ts +11 -0
  24. package/dist/constants.d.ts.map +1 -1
  25. package/dist/constants.js +11 -0
  26. package/dist/constants.js.map +1 -1
  27. package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
  28. package/dist/core/analyzer/artifact-generator.js +11 -3
  29. package/dist/core/analyzer/artifact-generator.js.map +1 -1
  30. package/dist/core/analyzer/ast-chunker.d.ts +24 -0
  31. package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
  32. package/dist/core/analyzer/ast-chunker.js +198 -0
  33. package/dist/core/analyzer/ast-chunker.js.map +1 -0
  34. package/dist/core/analyzer/call-graph.d.ts +52 -5
  35. package/dist/core/analyzer/call-graph.d.ts.map +1 -1
  36. package/dist/core/analyzer/call-graph.js +769 -48
  37. package/dist/core/analyzer/call-graph.js.map +1 -1
  38. package/dist/core/analyzer/code-shaper.d.ts.map +1 -1
  39. package/dist/core/analyzer/code-shaper.js +5 -0
  40. package/dist/core/analyzer/code-shaper.js.map +1 -1
  41. package/dist/core/analyzer/codebase-digest.d.ts +40 -0
  42. package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
  43. package/dist/core/analyzer/codebase-digest.js +194 -0
  44. package/dist/core/analyzer/codebase-digest.js.map +1 -0
  45. package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
  46. package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
  47. package/dist/core/analyzer/cpp-header-resolver.js +71 -0
  48. package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
  49. package/dist/core/analyzer/dependency-graph.d.ts +19 -0
  50. package/dist/core/analyzer/dependency-graph.d.ts.map +1 -1
  51. package/dist/core/analyzer/dependency-graph.js +76 -0
  52. package/dist/core/analyzer/dependency-graph.js.map +1 -1
  53. package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -1
  54. package/dist/core/analyzer/duplicate-detector.js +7 -1
  55. package/dist/core/analyzer/duplicate-detector.js.map +1 -1
  56. package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
  57. package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
  58. package/dist/core/analyzer/function-registry-trie.js +39 -0
  59. package/dist/core/analyzer/function-registry-trie.js.map +1 -0
  60. package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
  61. package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
  62. package/dist/core/analyzer/import-resolver-bridge.js +99 -0
  63. package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
  64. package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
  65. package/dist/core/analyzer/signature-extractor.js +131 -3
  66. package/dist/core/analyzer/signature-extractor.js.map +1 -1
  67. package/dist/core/analyzer/subgraph-extractor.d.ts +10 -2
  68. package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -1
  69. package/dist/core/analyzer/subgraph-extractor.js +25 -7
  70. package/dist/core/analyzer/subgraph-extractor.js.map +1 -1
  71. package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
  72. package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
  73. package/dist/core/analyzer/type-inference-engine.js +130 -0
  74. package/dist/core/analyzer/type-inference-engine.js.map +1 -0
  75. package/dist/core/analyzer/vector-index.d.ts +35 -6
  76. package/dist/core/analyzer/vector-index.d.ts.map +1 -1
  77. package/dist/core/analyzer/vector-index.js +308 -54
  78. package/dist/core/analyzer/vector-index.js.map +1 -1
  79. package/dist/core/generator/spec-pipeline.d.ts +31 -11
  80. package/dist/core/generator/spec-pipeline.d.ts.map +1 -1
  81. package/dist/core/generator/spec-pipeline.js +170 -39
  82. package/dist/core/generator/spec-pipeline.js.map +1 -1
  83. package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -1
  84. package/dist/core/generator/stages/stage2-entities.js +2 -1
  85. package/dist/core/generator/stages/stage2-entities.js.map +1 -1
  86. package/dist/core/generator/stages/stage3-services.d.ts.map +1 -1
  87. package/dist/core/generator/stages/stage3-services.js +2 -1
  88. package/dist/core/generator/stages/stage3-services.js.map +1 -1
  89. package/dist/core/generator/stages/stage4-api.d.ts.map +1 -1
  90. package/dist/core/generator/stages/stage4-api.js +2 -1
  91. package/dist/core/generator/stages/stage4-api.js.map +1 -1
  92. package/dist/core/generator/stages/stage5-architecture.d.ts +2 -1
  93. package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -1
  94. package/dist/core/generator/stages/stage5-architecture.js +15 -3
  95. package/dist/core/generator/stages/stage5-architecture.js.map +1 -1
  96. package/dist/core/services/chat-agent.d.ts +5 -0
  97. package/dist/core/services/chat-agent.d.ts.map +1 -1
  98. package/dist/core/services/chat-agent.js +14 -0
  99. package/dist/core/services/chat-agent.js.map +1 -1
  100. package/dist/core/services/chat-tools.d.ts.map +1 -1
  101. package/dist/core/services/chat-tools.js +172 -50
  102. package/dist/core/services/chat-tools.js.map +1 -1
  103. package/dist/core/services/llm-service.d.ts +23 -1
  104. package/dist/core/services/llm-service.d.ts.map +1 -1
  105. package/dist/core/services/llm-service.js +94 -2
  106. package/dist/core/services/llm-service.js.map +1 -1
  107. package/dist/core/services/mcp-handlers/analysis.d.ts +12 -0
  108. package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -1
  109. package/dist/core/services/mcp-handlers/analysis.js +138 -2
  110. package/dist/core/services/mcp-handlers/analysis.js.map +1 -1
  111. package/dist/core/services/mcp-handlers/graph.d.ts +21 -1
  112. package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
  113. package/dist/core/services/mcp-handlers/graph.js +142 -2
  114. package/dist/core/services/mcp-handlers/graph.js.map +1 -1
  115. package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
  116. package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
  117. package/dist/core/services/mcp-handlers/orient.js +200 -0
  118. package/dist/core/services/mcp-handlers/orient.js.map +1 -0
  119. package/dist/core/services/mcp-handlers/semantic.d.ts +18 -4
  120. package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
  121. package/dist/core/services/mcp-handlers/semantic.js +161 -17
  122. package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
  123. package/dist/core/services/mcp-handlers/utils.d.ts +43 -0
  124. package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
  125. package/dist/core/services/mcp-handlers/utils.js +66 -1
  126. package/dist/core/services/mcp-handlers/utils.js.map +1 -1
  127. package/dist/core/services/mcp-watcher.d.ts +41 -0
  128. package/dist/core/services/mcp-watcher.d.ts.map +1 -0
  129. package/dist/core/services/mcp-watcher.js +177 -0
  130. package/dist/core/services/mcp-watcher.js.map +1 -0
  131. package/dist/types/index.d.ts +2 -2
  132. package/dist/types/index.d.ts.map +1 -1
  133. package/dist/types/pipeline.d.ts +7 -0
  134. package/dist/types/pipeline.d.ts.map +1 -1
  135. package/package.json +4 -2
  136. package/src/viewer/InteractiveGraphViewer.jsx +39 -10
  137. package/src/viewer/components/ChatPanel.jsx +8 -5
  138. package/src/viewer/components/ClassGraph.jsx +782 -0
  139. package/src/viewer/components/FlatGraph.jsx +3 -3
  140. package/src/viewer/utils/graph-helpers.js +9 -1
  141. package/src/viewer/utils/themes.js +36 -0
@@ -5,7 +5,7 @@
5
5
  import { join } from 'node:path';
6
6
  import { INSERTION_SEMANTIC_WEIGHT, INSERTION_STRUCTURAL_WEIGHT, INSERTION_ROLE_BONUS_ENTRY_POINT, INSERTION_ROLE_BONUS_ORCHESTRATOR, INSERTION_ROLE_BONUS_HUB, INSERTION_ROLE_BONUS_INTERNAL, INSERTION_ROLE_BONUS_UTILITY, INSERTION_ORCHESTRATOR_FAN_OUT_THRESHOLD, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, OPENSPEC_DIR, OPENSPEC_SPECS_SUBDIR, } from '../../../constants.js';
7
7
  import { fileExists } from '../../../utils/command-helpers.js';
8
- import { validateDirectory } from './utils.js';
8
+ import { validateDirectory, loadMappingIndex, specsForFile, functionsForDomain } from './utils.js';
9
9
  import { readSpecGenConfig } from '../config-manager.js';
10
10
  export function classifyRole(fanIn, fanOut, isHub, isEntryPoint) {
11
11
  if (isEntryPoint)
@@ -41,9 +41,15 @@ export function buildReason(name, role, strategy, fanIn, fanOut) {
41
41
  return `${name} is semantically close to your feature and operates in the same domain. Extend or call alongside it.`;
42
42
  }
43
43
  }
44
- /** Composite score = semantic * INSERTION_SEMANTIC_WEIGHT + structuralBonus * INSERTION_STRUCTURAL_WEIGHT */
45
- export function compositeScore(semanticDistance, role) {
46
- const semantic = Math.max(0, 1 - semanticDistance);
44
+ /**
45
+ * Composite score = semanticRelevance * INSERTION_SEMANTIC_WEIGHT + structuralBonus * INSERTION_STRUCTURAL_WEIGHT.
46
+ *
47
+ * `semanticRelevance` must be in the 0-1 range (higher = more relevant).
48
+ * Callers using VectorIndex.search (hybrid/RRF or BM25) should normalise scores
49
+ * into [0, 1] before calling this function.
50
+ */
51
+ export function compositeScore(semanticRelevance, role) {
52
+ const semantic = Math.max(0, Math.min(1, semanticRelevance));
47
53
  const structuralBonus = {
48
54
  entry_point: INSERTION_ROLE_BONUS_ENTRY_POINT,
49
55
  orchestrator: INSERTION_ROLE_BONUS_ORCHESTRATOR,
@@ -57,7 +63,11 @@ export function compositeScore(semanticDistance, role) {
57
63
  // HANDLERS
58
64
  // ============================================================================
59
65
  /**
60
- * Semantic search over the vector index built by "spec-gen analyze --embed".
66
+ * MCP retrieval strategy: semantic search graph neighborhood enrichment.
67
+ *
68
+ * Returns the top-k semantic results, each enriched with:
69
+ * - callers / callees from the call graph (graph-first context)
70
+ * - linkedSpecs from mapping.json (bidirectional code↔spec linking)
61
71
  */
62
72
  export async function handleSearchCode(directory, query, limit = 10, language, minFanIn) {
63
73
  const absDir = await validateDirectory(directory);
@@ -70,25 +80,70 @@ export async function handleSearchCode(directory, query, limit = 10, language, m
70
80
  'then configure EMBED_BASE_URL and EMBED_MODEL.',
71
81
  };
72
82
  }
73
- let embedSvc;
83
+ // Resolve embedding service — fall back to BM25-only search if unavailable
84
+ let embedSvc = null;
85
+ let searchMode = 'hybrid';
74
86
  try {
75
87
  embedSvc = EmbeddingService.fromEnv();
76
88
  }
77
89
  catch {
78
90
  const cfg = await readSpecGenConfig(absDir);
79
- if (!cfg) {
80
- return { error: 'No embedding configuration found. Set EMBED_BASE_URL and EMBED_MODEL env vars, or add an "embedding" section to .spec-gen/config.json.' };
91
+ const svcFromConfig = cfg ? EmbeddingService.fromConfig(cfg) : null;
92
+ if (svcFromConfig) {
93
+ embedSvc = svcFromConfig;
81
94
  }
82
- const svcFromConfig = EmbeddingService.fromConfig(cfg);
83
- if (!svcFromConfig) {
84
- return { error: 'No embedding configuration found. Set EMBED_BASE_URL and EMBED_MODEL env vars, or add an "embedding" section to .spec-gen/config.json.' };
95
+ else {
96
+ searchMode = 'bm25_fallback';
85
97
  }
86
- embedSvc = svcFromConfig;
87
98
  }
88
99
  limit = Math.max(1, Math.min(limit, 100));
89
- const results = await VectorIndex.search(outputDir, query, embedSvc, { limit, language, minFanIn });
100
+ const { readCachedContext } = await import('./utils.js');
101
+ const [results, mappingIdx, llmCtx] = await Promise.all([
102
+ VectorIndex.search(outputDir, query, embedSvc, { limit, language, minFanIn }),
103
+ loadMappingIndex(absDir),
104
+ readCachedContext(absDir),
105
+ ]);
106
+ let callerMap;
107
+ let calleeMap;
108
+ if (llmCtx?.callGraph) {
109
+ const cg = llmCtx.callGraph;
110
+ const nodeMap = new Map(cg.nodes.map(n => [n.id, n]));
111
+ callerMap = new Map(cg.nodes.map(n => [n.id, []]));
112
+ calleeMap = new Map(cg.nodes.map(n => [n.id, []]));
113
+ for (const e of cg.edges) {
114
+ if (!e.calleeId)
115
+ continue;
116
+ const caller = nodeMap.get(e.callerId);
117
+ const callee = nodeMap.get(e.calleeId);
118
+ if (caller && callee) {
119
+ calleeMap.get(e.callerId)?.push({ name: callee.name, filePath: callee.filePath });
120
+ callerMap.get(e.calleeId)?.push({ name: caller.name, filePath: caller.filePath });
121
+ }
122
+ }
123
+ }
124
+ const specPeers = [];
125
+ if (mappingIdx) {
126
+ const resultFileSet = new Set(results.map(r => r.record.filePath));
127
+ const seedDomains = new Set();
128
+ for (const r of results) {
129
+ for (const spec of specsForFile(mappingIdx, r.record.filePath))
130
+ seedDomains.add(spec.domain);
131
+ }
132
+ const seen = new Set();
133
+ for (const domain of seedDomains) {
134
+ for (const fn of functionsForDomain(mappingIdx, domain)) {
135
+ const key = `${fn.name}::${fn.file}`;
136
+ if (seen.has(key) || resultFileSet.has(fn.file))
137
+ continue;
138
+ seen.add(key);
139
+ specPeers.push({ name: fn.name, filePath: fn.file, domain, requirement: fn.requirement });
140
+ }
141
+ }
142
+ }
90
143
  return {
91
144
  query,
145
+ searchMode,
146
+ ...(searchMode === 'bm25_fallback' ? { note: 'Embedding server unavailable — results based on keyword matching only. Configure EMBED_BASE_URL + EMBED_MODEL for semantic search.' } : {}),
92
147
  count: results.length,
93
148
  results: results.map(r => ({
94
149
  score: r.score,
@@ -102,7 +157,12 @@ export async function handleSearchCode(directory, query, limit = 10, language, m
102
157
  fanOut: r.record.fanOut,
103
158
  isHub: r.record.isHub,
104
159
  isEntryPoint: r.record.isEntryPoint,
160
+ linkedSpecs: mappingIdx ? specsForFile(mappingIdx, r.record.filePath) : undefined,
161
+ // Graph neighbourhood: callers and callees in the call graph
162
+ callers: callerMap?.get(r.record.id),
163
+ callees: calleeMap?.get(r.record.id),
105
164
  })),
165
+ ...(specPeers.length > 0 ? { specLinkedFunctions: specPeers } : {}),
106
166
  };
107
167
  }
108
168
  /**
@@ -135,15 +195,22 @@ export async function handleSuggestInsertionPoints(directory, description, limit
135
195
  embedSvc = svcFromConfig;
136
196
  }
137
197
  limit = Math.max(1, Math.min(limit, 20));
138
- const rawResults = await VectorIndex.search(outputDir, description, embedSvc, { limit: limit * 4, language });
198
+ const { readCachedContext } = await import('./utils.js');
199
+ const [rawResults, llmCtx] = await Promise.all([
200
+ VectorIndex.search(outputDir, description, embedSvc, { limit: limit * 4, language }),
201
+ readCachedContext(absDir),
202
+ ]);
203
+ // Normalise search scores to [0, 1] for compositeScore (scores are RRF/BM25: higher = better)
204
+ const maxScore = rawResults.length > 0 ? Math.max(...rawResults.map(r => r.score)) : 1;
205
+ const normalise = (s) => maxScore > 0 ? s / maxScore : 0;
139
206
  const candidates = rawResults.map(r => {
140
207
  const role = classifyRole(r.record.fanIn, r.record.fanOut, r.record.isHub, r.record.isEntryPoint);
141
208
  const strategy = deriveStrategy(role);
142
- const score = compositeScore(r.score, role);
209
+ const score = compositeScore(normalise(r.score), role);
143
210
  return {
144
211
  rank: 0,
145
212
  score,
146
- semanticDistance: r.score,
213
+ semanticScore: r.score,
147
214
  name: r.record.name,
148
215
  filePath: r.record.filePath,
149
216
  className: r.record.className || undefined,
@@ -156,6 +223,55 @@ export async function handleSuggestInsertionPoints(directory, description, limit
156
223
  isHub: r.record.isHub, isEntryPoint: r.record.isEntryPoint,
157
224
  };
158
225
  });
226
+ // RIG-13 — Graph expansion: add depth-1 callers of semantic seed functions.
227
+ // Callers (orchestrators) are likely to be the right insertion point for a new feature:
228
+ // they coordinate the domain logic and control the execution flow.
229
+ if (llmCtx?.callGraph) {
230
+ const cg = llmCtx.callGraph;
231
+ const nodeById = new Map(cg.nodes.map(n => [n.id, n]));
232
+ // Build callerOf: nodeId → caller node ids
233
+ const callerOf = new Map();
234
+ for (const e of cg.edges) {
235
+ if (!e.calleeId)
236
+ continue;
237
+ const list = callerOf.get(e.calleeId) ?? [];
238
+ list.push(e.callerId);
239
+ callerOf.set(e.calleeId, list);
240
+ }
241
+ const seedIds = new Set(rawResults.map(r => r.record.id));
242
+ const existingIds = new Set(candidates.map(c => `${c.filePath}::${c.name}`));
243
+ for (const seedResult of rawResults) {
244
+ const callerIds = callerOf.get(seedResult.record.id) ?? [];
245
+ for (const callerId of callerIds) {
246
+ const callerNode = nodeById.get(callerId);
247
+ if (!callerNode)
248
+ continue;
249
+ const key = `${callerNode.filePath}::${callerNode.name}`;
250
+ if (existingIds.has(key) || seedIds.has(callerId))
251
+ continue;
252
+ existingIds.add(key);
253
+ const role = classifyRole(callerNode.fanIn, callerNode.fanOut, false, false);
254
+ const strategy = deriveStrategy(role);
255
+ // Graph-expanded candidates score slightly lower than the semantic seed
256
+ const score = compositeScore(seedResult.score + 0.15, role) * 0.85;
257
+ candidates.push({
258
+ rank: 0,
259
+ score,
260
+ semanticScore: seedResult.score + 0.15,
261
+ name: callerNode.name,
262
+ filePath: callerNode.filePath,
263
+ className: callerNode.className,
264
+ language: callerNode.language,
265
+ signature: undefined,
266
+ docstring: undefined,
267
+ role, insertionStrategy: strategy,
268
+ reason: `${callerNode.name} calls ${seedResult.record.name} (semantically close to your feature). Adding logic here propagates to the domain.`,
269
+ fanIn: callerNode.fanIn, fanOut: callerNode.fanOut,
270
+ isHub: false, isEntryPoint: false,
271
+ });
272
+ }
273
+ }
274
+ }
159
275
  candidates.sort((a, b) => b.score - a.score);
160
276
  const top = candidates.slice(0, limit).map((c, i) => ({ ...c, rank: i + 1 }));
161
277
  return {
@@ -171,6 +287,30 @@ export async function handleSuggestInsertionPoints(directory, description, limit
171
287
  : ['No candidates found. Try a broader description or run "spec-gen analyze --embed" to build the index.'],
172
288
  };
173
289
  }
290
+ /**
291
+ * Return the full content of a spec domain's spec.md plus its mapping entries.
292
+ */
293
+ export async function handleGetSpec(directory, domain) {
294
+ const { existsSync } = await import('node:fs');
295
+ const { readFile } = await import('node:fs/promises');
296
+ const { join: pjoin } = await import('node:path');
297
+ const absDir = await validateDirectory(directory);
298
+ const specFile = pjoin(absDir, 'openspec', 'specs', domain, 'spec.md');
299
+ if (!existsSync(specFile)) {
300
+ return { error: `No spec found for domain "${domain}". Run list_spec_domains to see available domains.` };
301
+ }
302
+ const [content, mappingIdx] = await Promise.all([
303
+ readFile(specFile, 'utf-8'),
304
+ loadMappingIndex(absDir),
305
+ ]);
306
+ const linkedFunctions = mappingIdx ? functionsForDomain(mappingIdx, domain) : undefined;
307
+ return {
308
+ domain,
309
+ specFile: `openspec/specs/${domain}/spec.md`,
310
+ content,
311
+ linkedFunctions,
312
+ };
313
+ }
174
314
  /**
175
315
  * List all spec domains available in the project (reads openspec/specs/ directory).
176
316
  * Useful for the agent to discover what domains exist before doing a targeted search.
@@ -225,7 +365,10 @@ export async function handleSearchSpecs(directory, query, limit = 10, domain, se
225
365
  embedSvc = svcFromConfig;
226
366
  }
227
367
  limit = Math.max(1, Math.min(limit, 50));
228
- const results = await SpecVectorIndex.search(outputDir, query, embedSvc, { limit, domain, section });
368
+ const [results, mappingIdx] = await Promise.all([
369
+ SpecVectorIndex.search(outputDir, query, embedSvc, { limit, domain, section }),
370
+ loadMappingIndex(absDir),
371
+ ]);
229
372
  return {
230
373
  query,
231
374
  count: results.length,
@@ -237,6 +380,7 @@ export async function handleSearchSpecs(directory, query, limit = 10, domain, se
237
380
  title: r.record.title,
238
381
  text: r.record.text,
239
382
  linkedFiles: r.record.linkedFiles,
383
+ linkedFunctions: mappingIdx ? functionsForDomain(mappingIdx, r.record.domain) : undefined,
240
384
  })),
241
385
  };
242
386
  }
@@ -1 +1 @@
1
- {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/semantic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semantic.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/semantic.ts"],"names":[],"mappings":"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"}
@@ -15,7 +15,50 @@ export declare function validateDirectory(directory: string): Promise<string>;
15
15
  * returning it to MCP clients, to prevent secret leakage via error responses.
16
16
  */
17
17
  export declare function sanitizeMcpError(err: unknown): string;
18
+ /**
19
+ * Resolve a user-supplied relative file path against a validated project root
20
+ * and ensure the result stays within that root. Prevents path traversal via
21
+ * `../` sequences.
22
+ */
23
+ export declare function safeJoin(absDir: string, filePath: string): string;
18
24
  export declare function readCachedContext(directory: string): Promise<LLMContext | null>;
19
25
  /** Returns true if the cached analysis is present and less than 1 hour old. */
20
26
  export declare function isCacheFresh(directory: string): Promise<boolean>;
27
+ export interface MappingEntry {
28
+ requirement: string;
29
+ service: string;
30
+ domain: string;
31
+ specFile: string;
32
+ functions: Array<{
33
+ name: string;
34
+ file: string;
35
+ line: number;
36
+ kind: string;
37
+ confidence: string;
38
+ }>;
39
+ }
40
+ export interface MappingIndex {
41
+ /** filePath → list of mapping entries that reference it */
42
+ byFile: Map<string, MappingEntry[]>;
43
+ /** domain → list of mapping entries for that domain */
44
+ byDomain: Map<string, MappingEntry[]>;
45
+ entries: MappingEntry[];
46
+ }
47
+ /** Load and index mapping.json for bidirectional lookup. Returns null if not found. */
48
+ export declare function loadMappingIndex(absDir: string): Promise<MappingIndex | null>;
49
+ /** Summarise which specs cover a given file path (for search_code enrichment). */
50
+ export declare function specsForFile(index: MappingIndex, filePath: string): Array<{
51
+ requirement: string;
52
+ domain: string;
53
+ specFile: string;
54
+ }>;
55
+ /** Return functions that implement a given domain/specFile (for search_specs enrichment). */
56
+ export declare function functionsForDomain(index: MappingIndex, domain: string): Array<{
57
+ name: string;
58
+ file: string;
59
+ line: number;
60
+ kind: string;
61
+ confidence: string;
62
+ requirement: string;
63
+ }>;
21
64
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAUrF;AAED,+EAA+E;AAC/E,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtE"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAGvE;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe1E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQrD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMjE;AAED,wBAAsB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAUrF;AAED,+EAA+E;AAC/E,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOtE;AAMD,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClG;AAED,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACpC,uDAAuD;IACvD,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;IACtC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,uFAAuF;AACvF,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CA6BnF;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAOpI;AAED,6FAA6F;AAC7F,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAUlL"}
@@ -2,7 +2,7 @@
2
2
  * Shared utilities for MCP tool handlers.
3
3
  */
4
4
  import { readFile, stat } from 'node:fs/promises';
5
- import { join, resolve } from 'node:path';
5
+ import { join, resolve, sep } from 'node:path';
6
6
  import { ANALYSIS_STALE_THRESHOLD_MS, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, ARTIFACT_LLM_CONTEXT } from '../../../constants.js';
7
7
  /**
8
8
  * Resolve and validate a user-supplied directory path.
@@ -41,6 +41,18 @@ export function sanitizeMcpError(err) {
41
41
  .replace(/Authorization:\s*\S+/gi, 'Authorization: [REDACTED]')
42
42
  .replace(/api[_-]?key[=:]\s*\S{8,}/gi, 'api_key=[REDACTED]');
43
43
  }
44
+ /**
45
+ * Resolve a user-supplied relative file path against a validated project root
46
+ * and ensure the result stays within that root. Prevents path traversal via
47
+ * `../` sequences.
48
+ */
49
+ export function safeJoin(absDir, filePath) {
50
+ const resolved = resolve(absDir, filePath);
51
+ if (!resolved.startsWith(absDir + sep) && resolved !== absDir) {
52
+ throw new Error(`Path traversal blocked: "${filePath}" resolves outside project directory`);
53
+ }
54
+ return resolved;
55
+ }
44
56
  export async function readCachedContext(directory) {
45
57
  try {
46
58
  const raw = await readFile(join(directory, SPEC_GEN_DIR, SPEC_GEN_ANALYSIS_SUBDIR, ARTIFACT_LLM_CONTEXT), 'utf-8');
@@ -60,4 +72,57 @@ export async function isCacheFresh(directory) {
60
72
  return false;
61
73
  }
62
74
  }
75
+ /** Load and index mapping.json for bidirectional lookup. Returns null if not found. */
76
+ export async function loadMappingIndex(absDir) {
77
+ try {
78
+ const raw = await readFile(join(absDir, '.spec-gen', 'analysis', 'mapping.json'), 'utf-8');
79
+ const data = JSON.parse(raw);
80
+ const entries = data.mappings ?? [];
81
+ const byFile = new Map();
82
+ const byDomain = new Map();
83
+ for (const entry of entries) {
84
+ // index by domain
85
+ const domainList = byDomain.get(entry.domain) ?? [];
86
+ domainList.push(entry);
87
+ byDomain.set(entry.domain, domainList);
88
+ // index by each referenced file
89
+ for (const fn of entry.functions) {
90
+ if (!fn.file || fn.file === '*')
91
+ continue;
92
+ const fileList = byFile.get(fn.file) ?? [];
93
+ // avoid duplicates (same requirement may appear multiple times per file)
94
+ if (!fileList.includes(entry))
95
+ fileList.push(entry);
96
+ byFile.set(fn.file, fileList);
97
+ }
98
+ }
99
+ return { byFile, byDomain, entries };
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ /** Summarise which specs cover a given file path (for search_code enrichment). */
106
+ export function specsForFile(index, filePath) {
107
+ const entries = index.byFile.get(filePath) ?? [];
108
+ // deduplicate by requirement
109
+ const seen = new Set();
110
+ return entries
111
+ .filter(e => { const k = `${e.domain}::${e.requirement}`; if (seen.has(k))
112
+ return false; seen.add(k); return true; })
113
+ .map(e => ({ requirement: e.requirement, domain: e.domain, specFile: e.specFile }));
114
+ }
115
+ /** Return functions that implement a given domain/specFile (for search_specs enrichment). */
116
+ export function functionsForDomain(index, domain) {
117
+ const entries = index.byDomain.get(domain) ?? [];
118
+ const result = [];
119
+ for (const entry of entries) {
120
+ for (const fn of entry.functions) {
121
+ if (fn.name === '*')
122
+ continue;
123
+ result.push({ ...fn, requirement: entry.requirement });
124
+ }
125
+ }
126
+ return result;
127
+ }
63
128
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,2BAA2B,EAAE,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElI;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAClC,IAAI,CAAmC,CAAC;IACxC,IAAI,CAAC;QACH,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,GAAG;SACP,OAAO,CAAC,6BAA6B,EAAE,YAAY,CAAC;SACpD,OAAO,CAAC,yBAAyB,EAAE,YAAY,CAAC;SAChD,OAAO,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SACjD,OAAO,CAAC,wBAAwB,EAAE,2BAA2B,CAAC;SAC9D,OAAO,CAAC,4BAA4B,EAAE,oBAAoB,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,SAAiB;IACvD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,CAAC,EAC7E,OAAO,CACR,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAe,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,wBAAwB,EAAE,oBAAoB,CAAC,CAAC,CAAC;QACpG,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,2BAA2B,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * McpWatcher — incremental re-indexer for the MCP server's --watch mode.
3
+ *
4
+ * Watches source files for changes and incrementally updates:
5
+ * 1. signatures in llm-context.json (always)
6
+ * 2. vector index (only when embed: true and an embedding server is reachable)
7
+ *
8
+ * The call graph is deliberately excluded — rebuilding it requires full
9
+ * tree-sitter analysis of all call sites and is too expensive for a watch loop.
10
+ * It stays current via the post-commit hook (spec-gen analyze --force --embed).
11
+ */
12
+ export interface McpWatcherOptions {
13
+ /** Absolute path to the project root being watched */
14
+ rootPath: string;
15
+ /** Absolute path to .spec-gen/analysis/ — where llm-context.json lives */
16
+ outputPath?: string;
17
+ /** Milliseconds to debounce file-change events (default: 400) */
18
+ debounceMs?: number;
19
+ /** Extra glob patterns to ignore in addition to defaults */
20
+ ignore?: string[];
21
+ }
22
+ export declare class McpWatcher {
23
+ private readonly rootPath;
24
+ private readonly outputPath;
25
+ private readonly debounceMs;
26
+ private readonly ignore;
27
+ private fsWatcher?;
28
+ private timers;
29
+ private running;
30
+ constructor(options: McpWatcherOptions);
31
+ start(): Promise<void>;
32
+ stop(): Promise<void>;
33
+ private scheduleChange;
34
+ /**
35
+ * Re-index a single changed file.
36
+ * Exposed for unit testing without needing a real file watcher.
37
+ */
38
+ handleChange(absPath: string): Promise<void>;
39
+ private reEmbed;
40
+ }
41
+ //# sourceMappingURL=mcp-watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-watcher.d.ts","sourceRoot":"","sources":["../../../src/core/services/mcp-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAeH,MAAM,WAAW,iBAAiB;IAChC,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iEAAiE;IACjE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAiBD,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAElC,OAAO,CAAC,SAAS,CAAC,CAAY;IAC9B,OAAO,CAAC,MAAM,CAAoD;IAClE,OAAO,CAAC,OAAO,CAAS;gBAEZ,OAAO,EAAE,iBAAiB;IAUhC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,OAAO,CAAC,cAAc;IAsBtB;;;OAGG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAgDpC,OAAO;CA2CtB"}