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.
- package/README.md +272 -25
- package/dist/api/generate.d.ts.map +1 -1
- package/dist/api/generate.js +11 -7
- package/dist/api/generate.js.map +1 -1
- package/dist/api/run.d.ts.map +1 -1
- package/dist/api/run.js +5 -3
- package/dist/api/run.js.map +1 -1
- package/dist/api/types.d.ts +4 -4
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli/commands/analyze.d.ts.map +1 -1
- package/dist/cli/commands/analyze.js +101 -41
- package/dist/cli/commands/analyze.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +28 -23
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +353 -10
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +241 -48
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/view.d.ts.map +1 -1
- package/dist/cli/commands/view.js +33 -4
- package/dist/cli/commands/view.js.map +1 -1
- package/dist/constants.d.ts +11 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +11 -0
- package/dist/constants.js.map +1 -1
- package/dist/core/analyzer/artifact-generator.d.ts.map +1 -1
- package/dist/core/analyzer/artifact-generator.js +11 -3
- package/dist/core/analyzer/artifact-generator.js.map +1 -1
- package/dist/core/analyzer/ast-chunker.d.ts +24 -0
- package/dist/core/analyzer/ast-chunker.d.ts.map +1 -0
- package/dist/core/analyzer/ast-chunker.js +198 -0
- package/dist/core/analyzer/ast-chunker.js.map +1 -0
- package/dist/core/analyzer/call-graph.d.ts +52 -5
- package/dist/core/analyzer/call-graph.d.ts.map +1 -1
- package/dist/core/analyzer/call-graph.js +769 -48
- package/dist/core/analyzer/call-graph.js.map +1 -1
- package/dist/core/analyzer/code-shaper.d.ts.map +1 -1
- package/dist/core/analyzer/code-shaper.js +5 -0
- package/dist/core/analyzer/code-shaper.js.map +1 -1
- package/dist/core/analyzer/codebase-digest.d.ts +40 -0
- package/dist/core/analyzer/codebase-digest.d.ts.map +1 -0
- package/dist/core/analyzer/codebase-digest.js +194 -0
- package/dist/core/analyzer/codebase-digest.js.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts +30 -0
- package/dist/core/analyzer/cpp-header-resolver.d.ts.map +1 -0
- package/dist/core/analyzer/cpp-header-resolver.js +71 -0
- package/dist/core/analyzer/cpp-header-resolver.js.map +1 -0
- package/dist/core/analyzer/dependency-graph.d.ts +19 -0
- package/dist/core/analyzer/dependency-graph.d.ts.map +1 -1
- package/dist/core/analyzer/dependency-graph.js +76 -0
- package/dist/core/analyzer/dependency-graph.js.map +1 -1
- package/dist/core/analyzer/duplicate-detector.d.ts.map +1 -1
- package/dist/core/analyzer/duplicate-detector.js +7 -1
- package/dist/core/analyzer/duplicate-detector.js.map +1 -1
- package/dist/core/analyzer/function-registry-trie.d.ts +21 -0
- package/dist/core/analyzer/function-registry-trie.d.ts.map +1 -0
- package/dist/core/analyzer/function-registry-trie.js +39 -0
- package/dist/core/analyzer/function-registry-trie.js.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts +25 -0
- package/dist/core/analyzer/import-resolver-bridge.d.ts.map +1 -0
- package/dist/core/analyzer/import-resolver-bridge.js +99 -0
- package/dist/core/analyzer/import-resolver-bridge.js.map +1 -0
- package/dist/core/analyzer/signature-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/signature-extractor.js +131 -3
- package/dist/core/analyzer/signature-extractor.js.map +1 -1
- package/dist/core/analyzer/subgraph-extractor.d.ts +10 -2
- package/dist/core/analyzer/subgraph-extractor.d.ts.map +1 -1
- package/dist/core/analyzer/subgraph-extractor.js +25 -7
- package/dist/core/analyzer/subgraph-extractor.js.map +1 -1
- package/dist/core/analyzer/type-inference-engine.d.ts +23 -0
- package/dist/core/analyzer/type-inference-engine.d.ts.map +1 -0
- package/dist/core/analyzer/type-inference-engine.js +130 -0
- package/dist/core/analyzer/type-inference-engine.js.map +1 -0
- package/dist/core/analyzer/vector-index.d.ts +35 -6
- package/dist/core/analyzer/vector-index.d.ts.map +1 -1
- package/dist/core/analyzer/vector-index.js +308 -54
- package/dist/core/analyzer/vector-index.js.map +1 -1
- package/dist/core/generator/spec-pipeline.d.ts +31 -11
- package/dist/core/generator/spec-pipeline.d.ts.map +1 -1
- package/dist/core/generator/spec-pipeline.js +170 -39
- package/dist/core/generator/spec-pipeline.js.map +1 -1
- package/dist/core/generator/stages/stage2-entities.d.ts.map +1 -1
- package/dist/core/generator/stages/stage2-entities.js +2 -1
- package/dist/core/generator/stages/stage2-entities.js.map +1 -1
- package/dist/core/generator/stages/stage3-services.d.ts.map +1 -1
- package/dist/core/generator/stages/stage3-services.js +2 -1
- package/dist/core/generator/stages/stage3-services.js.map +1 -1
- package/dist/core/generator/stages/stage4-api.d.ts.map +1 -1
- package/dist/core/generator/stages/stage4-api.js +2 -1
- package/dist/core/generator/stages/stage4-api.js.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.d.ts +2 -1
- package/dist/core/generator/stages/stage5-architecture.d.ts.map +1 -1
- package/dist/core/generator/stages/stage5-architecture.js +15 -3
- package/dist/core/generator/stages/stage5-architecture.js.map +1 -1
- package/dist/core/services/chat-agent.d.ts +5 -0
- package/dist/core/services/chat-agent.d.ts.map +1 -1
- package/dist/core/services/chat-agent.js +14 -0
- package/dist/core/services/chat-agent.js.map +1 -1
- package/dist/core/services/chat-tools.d.ts.map +1 -1
- package/dist/core/services/chat-tools.js +172 -50
- package/dist/core/services/chat-tools.js.map +1 -1
- package/dist/core/services/llm-service.d.ts +23 -1
- package/dist/core/services/llm-service.d.ts.map +1 -1
- package/dist/core/services/llm-service.js +94 -2
- package/dist/core/services/llm-service.js.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.d.ts +12 -0
- package/dist/core/services/mcp-handlers/analysis.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/analysis.js +138 -2
- package/dist/core/services/mcp-handlers/analysis.js.map +1 -1
- package/dist/core/services/mcp-handlers/graph.d.ts +21 -1
- package/dist/core/services/mcp-handlers/graph.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/graph.js +142 -2
- package/dist/core/services/mcp-handlers/graph.js.map +1 -1
- package/dist/core/services/mcp-handlers/orient.d.ts +17 -0
- package/dist/core/services/mcp-handlers/orient.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/orient.js +200 -0
- package/dist/core/services/mcp-handlers/orient.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +18 -4
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.js +161 -17
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
- package/dist/core/services/mcp-handlers/utils.d.ts +43 -0
- package/dist/core/services/mcp-handlers/utils.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/utils.js +66 -1
- package/dist/core/services/mcp-handlers/utils.js.map +1 -1
- package/dist/core/services/mcp-watcher.d.ts +41 -0
- package/dist/core/services/mcp-watcher.d.ts.map +1 -0
- package/dist/core/services/mcp-watcher.js +177 -0
- package/dist/core/services/mcp-watcher.js.map +1 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/pipeline.d.ts +7 -0
- package/dist/types/pipeline.d.ts.map +1 -1
- package/package.json +4 -2
- package/src/viewer/InteractiveGraphViewer.jsx +39 -10
- package/src/viewer/components/ChatPanel.jsx +8 -5
- package/src/viewer/components/ClassGraph.jsx +782 -0
- package/src/viewer/components/FlatGraph.jsx +3 -3
- package/src/viewer/utils/graph-helpers.js +9 -1
- 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
|
-
/**
|
|
45
|
-
|
|
46
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
-
|
|
80
|
-
|
|
91
|
+
const svcFromConfig = cfg ? EmbeddingService.fromConfig(cfg) : null;
|
|
92
|
+
if (svcFromConfig) {
|
|
93
|
+
embedSvc = svcFromConfig;
|
|
81
94
|
}
|
|
82
|
-
|
|
83
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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;
|
|
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"}
|