spec-gen-cli 1.2.5 → 1.2.6
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 +36 -2
- package/dist/cli/commands/mcp.d.ts +225 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +116 -1
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/refresh-stories.d.ts +10 -0
- package/dist/cli/commands/refresh-stories.d.ts.map +1 -0
- package/dist/cli/commands/refresh-stories.js +314 -0
- package/dist/cli/commands/refresh-stories.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/analyzer/unified-search.d.ts +107 -0
- package/dist/core/analyzer/unified-search.d.ts.map +1 -0
- package/dist/core/analyzer/unified-search.js +237 -0
- package/dist/core/analyzer/unified-search.js.map +1 -0
- package/dist/core/generator/openspec-format-generator.js +1 -1
- package/dist/core/generator/openspec-format-generator.js.map +1 -1
- package/dist/core/services/chat-tools.d.ts.map +1 -1
- package/dist/core/services/chat-tools.js +54 -6
- package/dist/core/services/chat-tools.js.map +1 -1
- package/dist/core/services/mcp-handlers/change.d.ts +14 -0
- package/dist/core/services/mcp-handlers/change.d.ts.map +1 -0
- package/dist/core/services/mcp-handlers/change.js +416 -0
- package/dist/core/services/mcp-handlers/change.js.map +1 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts +4 -0
- package/dist/core/services/mcp-handlers/semantic.d.ts.map +1 -1
- package/dist/core/services/mcp-handlers/semantic.js +101 -32
- package/dist/core/services/mcp-handlers/semantic.js.map +1 -1
- package/package.json +4 -1
- package/src/viewer/InteractiveGraphViewer.jsx +46 -4
- package/src/viewer/components/ChatPanel.jsx +2 -3
- package/src/viewer/components/ClusterGraph.jsx +22 -6
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handler: generate_change_proposal
|
|
3
|
+
*
|
|
4
|
+
* Given a story description (BMAD story, free-form intent, or spec delta request),
|
|
5
|
+
* produces a populated OpenSpec change proposal at openspec/changes/{slug}/proposal.md.
|
|
6
|
+
*
|
|
7
|
+
* The proposal is built from pure structural analysis — no LLM required:
|
|
8
|
+
* - orient() → affected functions, spec domains, insertion points
|
|
9
|
+
* - search_specs() → existing requirements touched by this change
|
|
10
|
+
* - analyze_impact()→ risk scores for the top 2 functions
|
|
11
|
+
*/
|
|
12
|
+
export declare function handleGenerateChangeProposal(directory: string, description: string, slug: string, storyContent?: string): Promise<unknown>;
|
|
13
|
+
export declare function handleAnnotateStory(directory: string, storyFilePath: string, description: string): Promise<unknown>;
|
|
14
|
+
//# sourceMappingURL=change.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/change.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqQH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EACZ,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,CAAC,CA4ElB;AA+HD,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC,CAsDlB"}
|
|
@@ -0,0 +1,416 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool handler: generate_change_proposal
|
|
3
|
+
*
|
|
4
|
+
* Given a story description (BMAD story, free-form intent, or spec delta request),
|
|
5
|
+
* produces a populated OpenSpec change proposal at openspec/changes/{slug}/proposal.md.
|
|
6
|
+
*
|
|
7
|
+
* The proposal is built from pure structural analysis — no LLM required:
|
|
8
|
+
* - orient() → affected functions, spec domains, insertion points
|
|
9
|
+
* - search_specs() → existing requirements touched by this change
|
|
10
|
+
* - analyze_impact()→ risk scores for the top 2 functions
|
|
11
|
+
*/
|
|
12
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
13
|
+
import { join } from 'node:path';
|
|
14
|
+
import { validateDirectory, safeJoin } from './utils.js';
|
|
15
|
+
import { handleOrient } from './orient.js';
|
|
16
|
+
import { handleSearchSpecs } from './semantic.js';
|
|
17
|
+
import { handleAnalyzeImpact } from './graph.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// PROPOSAL TEMPLATE BUILDER
|
|
20
|
+
// ============================================================================
|
|
21
|
+
function strategyText(s) {
|
|
22
|
+
if (!s)
|
|
23
|
+
return 'n/a';
|
|
24
|
+
if (typeof s === 'string')
|
|
25
|
+
return s;
|
|
26
|
+
return s.approach;
|
|
27
|
+
}
|
|
28
|
+
function riskBadge(score) {
|
|
29
|
+
if (score < 40)
|
|
30
|
+
return '🟢 low';
|
|
31
|
+
if (score < 70)
|
|
32
|
+
return '🟡 medium';
|
|
33
|
+
if (score < 85)
|
|
34
|
+
return '🟠 high';
|
|
35
|
+
return '🔴 critical';
|
|
36
|
+
}
|
|
37
|
+
function buildProposal(slug, description, storyContent, orient, specSearch, impacts, generatedAt) {
|
|
38
|
+
const lines = [];
|
|
39
|
+
// Header
|
|
40
|
+
lines.push(`# Proposal: ${slug.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase())}`);
|
|
41
|
+
lines.push('');
|
|
42
|
+
lines.push(`> Generated by spec-gen on ${generatedAt}`);
|
|
43
|
+
lines.push(`> Source: ${storyContent ? 'BMAD story' : 'intent description'}`);
|
|
44
|
+
lines.push(`> Status: draft`);
|
|
45
|
+
lines.push('');
|
|
46
|
+
// Intent
|
|
47
|
+
lines.push('## Intent');
|
|
48
|
+
lines.push('');
|
|
49
|
+
lines.push(description);
|
|
50
|
+
lines.push('');
|
|
51
|
+
if (storyContent) {
|
|
52
|
+
lines.push('### Story');
|
|
53
|
+
lines.push('');
|
|
54
|
+
lines.push('```');
|
|
55
|
+
lines.push(storyContent.trim());
|
|
56
|
+
lines.push('```');
|
|
57
|
+
lines.push('');
|
|
58
|
+
}
|
|
59
|
+
// Spec domains affected
|
|
60
|
+
const domains = orient.specDomains ?? [];
|
|
61
|
+
if (domains.length > 0) {
|
|
62
|
+
lines.push('## Spec Domains Affected');
|
|
63
|
+
lines.push('');
|
|
64
|
+
lines.push('| Domain | Spec File | Match Count |');
|
|
65
|
+
lines.push('|--------|-----------|-------------|');
|
|
66
|
+
for (const d of domains) {
|
|
67
|
+
lines.push(`| \`${d.domain}\` | \`${d.specFile}\` | ${d.matchCount} |`);
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
lines.push('## Spec Domains Affected');
|
|
73
|
+
lines.push('');
|
|
74
|
+
lines.push('> No spec domains found. Run `spec-gen generate` to create specs from this codebase.');
|
|
75
|
+
lines.push('');
|
|
76
|
+
}
|
|
77
|
+
// Existing requirements touched
|
|
78
|
+
const specResults = specSearch.results ?? [];
|
|
79
|
+
if (specResults.length > 0) {
|
|
80
|
+
lines.push('## Existing Requirements Touched');
|
|
81
|
+
lines.push('');
|
|
82
|
+
lines.push('> Review these before writing new requirements — avoid duplication.');
|
|
83
|
+
lines.push('');
|
|
84
|
+
const byDomain = new Map();
|
|
85
|
+
for (const r of specResults) {
|
|
86
|
+
const bucket = byDomain.get(r.domain) ?? [];
|
|
87
|
+
bucket.push(r);
|
|
88
|
+
byDomain.set(r.domain, bucket);
|
|
89
|
+
}
|
|
90
|
+
for (const [domain, reqs] of byDomain) {
|
|
91
|
+
lines.push(`### Domain: \`${domain}\``);
|
|
92
|
+
lines.push('');
|
|
93
|
+
for (const req of reqs) {
|
|
94
|
+
const scoreStr = req.score.toFixed(2);
|
|
95
|
+
lines.push(`**${req.title}** *(relevance: ${scoreStr})*`);
|
|
96
|
+
if (req.section)
|
|
97
|
+
lines.push(`*Section: ${req.section}*`);
|
|
98
|
+
lines.push('');
|
|
99
|
+
const preview = req.text.length > 400 ? req.text.slice(0, 400) + '…' : req.text;
|
|
100
|
+
for (const line of preview.split('\n'))
|
|
101
|
+
lines.push(`> ${line}`);
|
|
102
|
+
if (req.linkedFiles && req.linkedFiles.length > 0) {
|
|
103
|
+
lines.push('');
|
|
104
|
+
lines.push(`*Linked files: ${req.linkedFiles.map(f => `\`${f}\``).join(', ')}*`);
|
|
105
|
+
}
|
|
106
|
+
lines.push('');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Proposed spec changes (scaffold for human completion)
|
|
111
|
+
lines.push('## Proposed Spec Changes');
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push('> Complete this section. Then run `openspec specs ' + slug + '` to formalise.');
|
|
114
|
+
lines.push('');
|
|
115
|
+
if (domains.length > 0) {
|
|
116
|
+
for (const d of domains.slice(0, 3)) {
|
|
117
|
+
lines.push(`### Domain: \`${d.domain}\``);
|
|
118
|
+
lines.push('');
|
|
119
|
+
lines.push('- [ ] **Add requirement**: <!-- describe new behaviour in RFC 2119 (SHALL/SHOULD/MAY) -->');
|
|
120
|
+
lines.push('- [ ] **Modify requirement**: <!-- existing requirement id + what changes -->');
|
|
121
|
+
lines.push('- [ ] **Add scenario**: <!-- Given / When / Then -->');
|
|
122
|
+
lines.push('');
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
lines.push('- [ ] **Add requirement**: <!-- describe new behaviour in RFC 2119 (SHALL/SHOULD/MAY) -->');
|
|
127
|
+
lines.push('- [ ] **Add scenario**: <!-- Given / When / Then -->');
|
|
128
|
+
lines.push('');
|
|
129
|
+
}
|
|
130
|
+
// Technical context
|
|
131
|
+
lines.push('## Technical Context');
|
|
132
|
+
lines.push('');
|
|
133
|
+
lines.push('> Generated by spec-gen static analysis. Do not edit this section manually.');
|
|
134
|
+
lines.push('');
|
|
135
|
+
// Affected functions
|
|
136
|
+
const topFunctions = (orient.relevantFunctions ?? []).slice(0, 5);
|
|
137
|
+
if (topFunctions.length > 0) {
|
|
138
|
+
lines.push('### Affected Functions');
|
|
139
|
+
lines.push('');
|
|
140
|
+
lines.push('| Function | File | Fan-in | Fan-out | Hub |');
|
|
141
|
+
lines.push('|----------|------|--------|---------|-----|');
|
|
142
|
+
for (const fn of topFunctions) {
|
|
143
|
+
const hub = fn.isHub ? '⚠️ yes' : 'no';
|
|
144
|
+
lines.push(`| \`${fn.name}\` | \`${fn.filePath}\` | ${fn.fanIn} | ${fn.fanOut} | ${hub} |`);
|
|
145
|
+
}
|
|
146
|
+
lines.push('');
|
|
147
|
+
}
|
|
148
|
+
// Risk assessment
|
|
149
|
+
const validImpacts = impacts.filter(i => i.riskScore !== undefined);
|
|
150
|
+
if (validImpacts.length > 0) {
|
|
151
|
+
lines.push('### Risk Assessment');
|
|
152
|
+
lines.push('');
|
|
153
|
+
lines.push('| Function | Risk Score | Level | Strategy |');
|
|
154
|
+
lines.push('|----------|-----------|-------|----------|');
|
|
155
|
+
for (const i of validImpacts) {
|
|
156
|
+
const score = i.riskScore ?? 0;
|
|
157
|
+
lines.push(`| \`${i.symbol}\` | ${score} | ${riskBadge(score)} | \`${strategyText(i.recommendedStrategy)}\` |`);
|
|
158
|
+
}
|
|
159
|
+
lines.push('');
|
|
160
|
+
const maxRisk = Math.max(...validImpacts.map(i => i.riskScore ?? 0));
|
|
161
|
+
if (maxRisk >= 70) {
|
|
162
|
+
lines.push('> ⚠️ **High risk detected.** Run `bmad/tasks/refactor.md` before implementing this change.');
|
|
163
|
+
lines.push('');
|
|
164
|
+
}
|
|
165
|
+
else if (maxRisk >= 40) {
|
|
166
|
+
lines.push('> ⚠️ **Moderate risk.** Ensure callers are covered by tests before implementing.');
|
|
167
|
+
lines.push('');
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Insertion points
|
|
171
|
+
const insertionPoints = orient.insertionPoints ?? [];
|
|
172
|
+
if (insertionPoints.length > 0) {
|
|
173
|
+
lines.push('### Insertion Points');
|
|
174
|
+
lines.push('');
|
|
175
|
+
for (const ip of insertionPoints) {
|
|
176
|
+
lines.push(`${ip.rank}. **\`${ip.name}\`** in \`${ip.filePath}\``);
|
|
177
|
+
lines.push(` - Role: \`${ip.role}\` | Strategy: \`${ip.strategy}\``);
|
|
178
|
+
lines.push(` - ${ip.reason}`);
|
|
179
|
+
}
|
|
180
|
+
lines.push('');
|
|
181
|
+
}
|
|
182
|
+
// Next steps
|
|
183
|
+
lines.push('## Next Steps');
|
|
184
|
+
lines.push('');
|
|
185
|
+
lines.push(`- [ ] Complete "Proposed Spec Changes" above`);
|
|
186
|
+
lines.push(`- [ ] \`openspec specs ${slug}\` — formalise spec delta`);
|
|
187
|
+
lines.push(`- [ ] \`openspec design ${slug}\` — technical design`);
|
|
188
|
+
lines.push(`- [ ] \`openspec tasks ${slug}\` — implementation task list`);
|
|
189
|
+
if (validImpacts.some(i => (i.riskScore ?? 0) >= 70)) {
|
|
190
|
+
lines.push(`- [ ] Run \`bmad/tasks/brownfield-refactor.md\` for high-risk functions before implementation`);
|
|
191
|
+
}
|
|
192
|
+
lines.push('');
|
|
193
|
+
return lines.join('\n');
|
|
194
|
+
}
|
|
195
|
+
// ============================================================================
|
|
196
|
+
// HANDLER
|
|
197
|
+
// ============================================================================
|
|
198
|
+
export async function handleGenerateChangeProposal(directory, description, slug, storyContent) {
|
|
199
|
+
const absDir = await validateDirectory(directory);
|
|
200
|
+
// Normalise slug: lowercase, hyphens only
|
|
201
|
+
const safeSlug = slug
|
|
202
|
+
.toLowerCase()
|
|
203
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
204
|
+
.replace(/^-+|-+$/g, '');
|
|
205
|
+
if (!safeSlug) {
|
|
206
|
+
return { error: 'Invalid slug. Use alphanumeric characters and hyphens, e.g. "add-payment-retry".' };
|
|
207
|
+
}
|
|
208
|
+
const changeDir = join(absDir, 'openspec', 'changes', safeSlug);
|
|
209
|
+
const proposalPath = join(changeDir, 'proposal.md');
|
|
210
|
+
const generatedAt = new Date().toISOString().split('T')[0];
|
|
211
|
+
// ── Parallel orientation + spec search ────────────────────────────────────
|
|
212
|
+
const [orientRaw, specSearchRaw] = await Promise.all([
|
|
213
|
+
handleOrient(directory, description, 7),
|
|
214
|
+
handleSearchSpecs(directory, description, 5),
|
|
215
|
+
]);
|
|
216
|
+
const orient = orientRaw;
|
|
217
|
+
const specSearch = specSearchRaw;
|
|
218
|
+
// ── Impact analysis on top 2 functions (best-effort) ──────────────────────
|
|
219
|
+
const topFunctions = (orient.relevantFunctions ?? []).slice(0, 2);
|
|
220
|
+
const impacts = [];
|
|
221
|
+
for (const fn of topFunctions) {
|
|
222
|
+
try {
|
|
223
|
+
const raw = await handleAnalyzeImpact(directory, fn.name, 2);
|
|
224
|
+
const impact = raw;
|
|
225
|
+
if (!impact.error)
|
|
226
|
+
impacts.push(impact);
|
|
227
|
+
}
|
|
228
|
+
catch {
|
|
229
|
+
// non-fatal — proceed with partial context
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// ── Build proposal ─────────────────────────────────────────────────────────
|
|
233
|
+
const content = buildProposal(safeSlug, description, storyContent, orient, specSearch, impacts, generatedAt);
|
|
234
|
+
// ── Write to disk ──────────────────────────────────────────────────────────
|
|
235
|
+
await mkdir(changeDir, { recursive: true });
|
|
236
|
+
await writeFile(proposalPath, content, 'utf8');
|
|
237
|
+
// ── Summary ────────────────────────────────────────────────────────────────
|
|
238
|
+
const domains = (orient.specDomains ?? []).map(d => d.domain);
|
|
239
|
+
const maxRisk = impacts.length > 0
|
|
240
|
+
? Math.max(...impacts.map(i => i.riskScore ?? 0))
|
|
241
|
+
: null;
|
|
242
|
+
return {
|
|
243
|
+
slug: safeSlug,
|
|
244
|
+
proposalPath: join('openspec', 'changes', safeSlug, 'proposal.md'),
|
|
245
|
+
domainsAffected: domains,
|
|
246
|
+
functionsFound: (orient.relevantFunctions ?? []).length,
|
|
247
|
+
requirementsTouched: (specSearch.results ?? []).length,
|
|
248
|
+
maxRiskScore: maxRisk,
|
|
249
|
+
riskLevel: maxRisk !== null
|
|
250
|
+
? (maxRisk < 40 ? 'low' : maxRisk < 70 ? 'medium' : maxRisk < 85 ? 'high' : 'critical')
|
|
251
|
+
: 'unknown',
|
|
252
|
+
nextStep: `Review and complete openspec/changes/${safeSlug}/proposal.md, then run: openspec specs ${safeSlug}`,
|
|
253
|
+
orientErrors: orient.error ? [orient.error] : [],
|
|
254
|
+
specSearchErrors: specSearch.error ? [specSearch.error] : [],
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
// ============================================================================
|
|
258
|
+
// ANNOTATE STORY
|
|
259
|
+
// ============================================================================
|
|
260
|
+
/**
|
|
261
|
+
* Build the compact risk_context block written into story files.
|
|
262
|
+
*/
|
|
263
|
+
function buildRiskContextBlock(orient, impacts, generatedAt) {
|
|
264
|
+
const validImpacts = impacts.filter(i => i.riskScore !== undefined);
|
|
265
|
+
const maxRisk = validImpacts.length > 0
|
|
266
|
+
? Math.max(...validImpacts.map(i => i.riskScore ?? 0))
|
|
267
|
+
: null;
|
|
268
|
+
const badge = maxRisk === null ? '' : ` ${riskBadge(maxRisk)}`;
|
|
269
|
+
const lines = [];
|
|
270
|
+
lines.push(`> Auto-generated by spec-gen on ${generatedAt}. Re-run \`annotate_story\` after structural changes.`);
|
|
271
|
+
lines.push('');
|
|
272
|
+
const domains = (orient.specDomains ?? []).map(d => d.domain);
|
|
273
|
+
lines.push(`- **Domains**: ${domains.length > 0 ? domains.join(', ') : 'none detected'}`);
|
|
274
|
+
if (maxRisk !== null) {
|
|
275
|
+
lines.push(`- **Max risk score**: ${maxRisk}${badge}`);
|
|
276
|
+
}
|
|
277
|
+
else {
|
|
278
|
+
lines.push('- **Max risk score**: unknown (run analyze_codebase first)');
|
|
279
|
+
}
|
|
280
|
+
const topFunctions = (orient.relevantFunctions ?? []).slice(0, 4);
|
|
281
|
+
if (topFunctions.length > 0) {
|
|
282
|
+
const fnList = topFunctions.map(f => `\`${f.name}\` (${f.filePath})`).join(', ');
|
|
283
|
+
lines.push(`- **Functions in scope**: ${fnList}`);
|
|
284
|
+
}
|
|
285
|
+
// Callers to protect = upstream of highest-risk function
|
|
286
|
+
const topImpact = validImpacts[0];
|
|
287
|
+
if (topImpact?.upstreamChain && Array.isArray(topImpact.upstreamChain) && topImpact.upstreamChain.length > 0) {
|
|
288
|
+
const callers = topImpact.upstreamChain
|
|
289
|
+
.slice(0, 3)
|
|
290
|
+
.map(c => `\`${c.name}\``)
|
|
291
|
+
.join(', ');
|
|
292
|
+
lines.push(`- **Callers to protect**: ${callers}`);
|
|
293
|
+
}
|
|
294
|
+
// Blocking refactors
|
|
295
|
+
if (maxRisk !== null && maxRisk >= 70 && validImpacts.length > 0) {
|
|
296
|
+
const blocked = validImpacts
|
|
297
|
+
.filter(i => (i.riskScore ?? 0) >= 70)
|
|
298
|
+
.map(i => `Refactor \`${i.symbol}\` first (risk: ${i.riskScore})`)
|
|
299
|
+
.join('; ');
|
|
300
|
+
lines.push(`- **Blocking refactors**: ${blocked}`);
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
lines.push('- **Blocking refactors**: none');
|
|
304
|
+
}
|
|
305
|
+
// Insertion points
|
|
306
|
+
const insertionPoints = orient.insertionPoints ?? [];
|
|
307
|
+
if (insertionPoints.length > 0) {
|
|
308
|
+
const top = insertionPoints[0];
|
|
309
|
+
lines.push(`- **Insertion points**: \`${top.name}\` — ${top.strategy} (score: ${top.score})`);
|
|
310
|
+
}
|
|
311
|
+
// Spec domains with file links
|
|
312
|
+
if (domains.length > 0) {
|
|
313
|
+
const specLinks = (orient.specDomains ?? [])
|
|
314
|
+
.slice(0, 3)
|
|
315
|
+
.map(d => `\`${d.specFile}\``)
|
|
316
|
+
.join(', ');
|
|
317
|
+
lines.push(`- **Spec domains linked**: ${specLinks}`);
|
|
318
|
+
}
|
|
319
|
+
// Warning
|
|
320
|
+
if (maxRisk !== null && maxRisk >= 70) {
|
|
321
|
+
lines.push('');
|
|
322
|
+
lines.push('> ⚠️ **Blocked.** Schedule `bmad/tasks/refactor.md` for the high-risk function(s) before this story enters a sprint.');
|
|
323
|
+
}
|
|
324
|
+
else if (maxRisk !== null && maxRisk >= 40) {
|
|
325
|
+
lines.push('');
|
|
326
|
+
lines.push('> ⚠️ **Caution.** Ensure callers listed above are covered by tests.');
|
|
327
|
+
}
|
|
328
|
+
return lines.join('\n');
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Patch the `## Risk Context` section of a markdown story file in-place.
|
|
332
|
+
*
|
|
333
|
+
* - If the section exists: replaces its body (keeps the heading).
|
|
334
|
+
* - If it doesn't exist: inserts it before `## Technical Constraints`,
|
|
335
|
+
* `## Tasks`, or `## Dependencies` — whichever comes first.
|
|
336
|
+
* If none found, appends at end of file.
|
|
337
|
+
*/
|
|
338
|
+
function patchRiskContext(original, newBody) {
|
|
339
|
+
const HEADING = '## Risk Context';
|
|
340
|
+
const lines = original.split('\n');
|
|
341
|
+
const sectionStart = lines.findIndex(l => l.trim() === HEADING);
|
|
342
|
+
if (sectionStart !== -1) {
|
|
343
|
+
// Find end of section = next ## heading (exclusive) or EOF
|
|
344
|
+
let sectionEnd = lines.length;
|
|
345
|
+
for (let i = sectionStart + 1; i < lines.length; i++) {
|
|
346
|
+
if (lines[i].startsWith('## ')) {
|
|
347
|
+
sectionEnd = i;
|
|
348
|
+
break;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
const replacement = [HEADING, '', newBody, ''];
|
|
352
|
+
lines.splice(sectionStart, sectionEnd - sectionStart, ...replacement);
|
|
353
|
+
return lines.join('\n');
|
|
354
|
+
}
|
|
355
|
+
// Section not found — find insertion point
|
|
356
|
+
const insertBefore = ['## Technical Constraints', '## Tasks', '## Dependencies', '## Dev Agent Record'];
|
|
357
|
+
let insertAt = lines.length;
|
|
358
|
+
for (const marker of insertBefore) {
|
|
359
|
+
const idx = lines.findIndex(l => l.trim() === marker);
|
|
360
|
+
if (idx !== -1 && idx < insertAt)
|
|
361
|
+
insertAt = idx;
|
|
362
|
+
}
|
|
363
|
+
const insertion = ['', HEADING, '', newBody, ''];
|
|
364
|
+
lines.splice(insertAt, 0, ...insertion);
|
|
365
|
+
return lines.join('\n');
|
|
366
|
+
}
|
|
367
|
+
export async function handleAnnotateStory(directory, storyFilePath, description) {
|
|
368
|
+
const absDir = await validateDirectory(directory);
|
|
369
|
+
// Resolve story path and ensure it stays within the project directory
|
|
370
|
+
const absStory = safeJoin(absDir, storyFilePath);
|
|
371
|
+
let original;
|
|
372
|
+
try {
|
|
373
|
+
original = await readFile(absStory, 'utf8');
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return { error: `Story file not found: ${absStory}` };
|
|
377
|
+
}
|
|
378
|
+
const generatedAt = new Date().toISOString().split('T')[0];
|
|
379
|
+
// ── Structural analysis (same pattern as generate_change_proposal) ─────────
|
|
380
|
+
// spec search not needed for risk_context — orient already returns linked specs
|
|
381
|
+
const orient = await handleOrient(directory, description, 7);
|
|
382
|
+
const topFunctions = (orient.relevantFunctions ?? []).slice(0, 2);
|
|
383
|
+
const impacts = [];
|
|
384
|
+
for (const fn of topFunctions) {
|
|
385
|
+
try {
|
|
386
|
+
const raw = await handleAnalyzeImpact(directory, fn.name, 2);
|
|
387
|
+
const impact = raw;
|
|
388
|
+
if (!impact.error)
|
|
389
|
+
impacts.push(impact);
|
|
390
|
+
}
|
|
391
|
+
catch { /* non-fatal */ }
|
|
392
|
+
}
|
|
393
|
+
// ── Build and patch ────────────────────────────────────────────────────────
|
|
394
|
+
const riskBlock = buildRiskContextBlock(orient, impacts, generatedAt);
|
|
395
|
+
const patched = patchRiskContext(original, riskBlock);
|
|
396
|
+
await writeFile(absStory, patched, 'utf8');
|
|
397
|
+
// ── Summary ────────────────────────────────────────────────────────────────
|
|
398
|
+
const maxRisk = impacts.length > 0
|
|
399
|
+
? Math.max(...impacts.map(i => i.riskScore ?? 0))
|
|
400
|
+
: null;
|
|
401
|
+
const domains = (orient.specDomains ?? []).map(d => d.domain);
|
|
402
|
+
return {
|
|
403
|
+
storyFile: storyFilePath,
|
|
404
|
+
domainsAffected: domains,
|
|
405
|
+
functionsFound: (orient.relevantFunctions ?? []).length,
|
|
406
|
+
maxRiskScore: maxRisk,
|
|
407
|
+
riskLevel: maxRisk === null ? 'unknown'
|
|
408
|
+
: maxRisk < 40 ? 'low'
|
|
409
|
+
: maxRisk < 70 ? 'medium'
|
|
410
|
+
: maxRisk < 85 ? 'high'
|
|
411
|
+
: 'critical',
|
|
412
|
+
blocked: maxRisk !== null && maxRisk >= 70,
|
|
413
|
+
orientErrors: orient.error ? [orient.error] : [],
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
//# sourceMappingURL=change.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change.js","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/change.ts"],"names":[],"mappings":"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"}
|
|
@@ -59,4 +59,8 @@ export declare function handleListSpecDomains(directory: string): Promise<unknow
|
|
|
59
59
|
* or "spec-gen analyze --reindex-specs".
|
|
60
60
|
*/
|
|
61
61
|
export declare function handleSearchSpecs(directory: string, query: string, limit?: number, domain?: string, section?: string): Promise<unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* Unified search that combines code and spec indexes with cross-scoring
|
|
64
|
+
*/
|
|
65
|
+
export declare function handleUnifiedSearch(directory: string, query: string, limit?: number, language?: string, domain?: string, section?: string): Promise<unknown>;
|
|
62
66
|
//# sourceMappingURL=semantic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/semantic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5F,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,wBAAwB,GACxB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,
|
|
1
|
+
{"version":3,"file":"semantic.d.ts","sourceRoot":"","sources":["../../../../src/core/services/mcp-handlers/semantic.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAyBH,MAAM,MAAM,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAC5F,MAAM,MAAM,iBAAiB,GACzB,oBAAoB,GACpB,wBAAwB,GACxB,oBAAoB,GACpB,sBAAsB,GACtB,gBAAgB,CAAC;AAErB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,aAAa,CAAC;IACpB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,YAAY,EAAE,OAAO,GACpB,aAAa,CAMf;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,iBAAiB,CAarE;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,MAAM,CAaR;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,iBAAiB,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAUrF;AAMD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CA4GlB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAChD,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,KAAK,SAAI,EACT,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAmJlB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyBvF;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB/E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAwDlB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,KAAK,SAAK,EACV,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACf,OAAO,CAAC,OAAO,CAAC,CAyClB"}
|