@promptwheel/core 0.7.21 → 0.7.34
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/dist/codebase-index/ast-analysis.d.ts +33 -2
- package/dist/codebase-index/ast-analysis.d.ts.map +1 -1
- package/dist/codebase-index/ast-analysis.js +457 -2
- package/dist/codebase-index/ast-analysis.js.map +1 -1
- package/dist/codebase-index/ast-cache.d.ts +9 -1
- package/dist/codebase-index/ast-cache.d.ts.map +1 -1
- package/dist/codebase-index/ast-cache.js.map +1 -1
- package/dist/codebase-index/ast-patterns.d.ts +24 -4
- package/dist/codebase-index/ast-patterns.d.ts.map +1 -1
- package/dist/codebase-index/ast-patterns.js +274 -10
- package/dist/codebase-index/ast-patterns.js.map +1 -1
- package/dist/codebase-index/dead-code.d.ts +37 -4
- package/dist/codebase-index/dead-code.d.ts.map +1 -1
- package/dist/codebase-index/dead-code.js +152 -17
- package/dist/codebase-index/dead-code.js.map +1 -1
- package/dist/codebase-index/index.d.ts +4 -2
- package/dist/codebase-index/index.d.ts.map +1 -1
- package/dist/codebase-index/index.js +129 -14
- package/dist/codebase-index/index.js.map +1 -1
- package/dist/codebase-index/shared.d.ts +31 -0
- package/dist/codebase-index/shared.d.ts.map +1 -1
- package/dist/codebase-index/shared.js +50 -0
- package/dist/codebase-index/shared.js.map +1 -1
- package/dist/dedup/shared.d.ts +14 -0
- package/dist/dedup/shared.d.ts.map +1 -1
- package/dist/dedup/shared.js +40 -0
- package/dist/dedup/shared.js.map +1 -1
- package/dist/learnings/shared.d.ts +1 -1
- package/dist/learnings/shared.d.ts.map +1 -1
- package/dist/learnings/shared.js.map +1 -1
- package/dist/proposals/blueprint.d.ts +68 -0
- package/dist/proposals/blueprint.d.ts.map +1 -0
- package/dist/proposals/blueprint.js +292 -0
- package/dist/proposals/blueprint.js.map +1 -0
- package/dist/proposals/shared.d.ts +30 -2
- package/dist/proposals/shared.d.ts.map +1 -1
- package/dist/proposals/shared.js +58 -11
- package/dist/proposals/shared.js.map +1 -1
- package/dist/proposals/step-classifier.d.ts +32 -0
- package/dist/proposals/step-classifier.d.ts.map +1 -0
- package/dist/proposals/step-classifier.js +49 -0
- package/dist/proposals/step-classifier.js.map +1 -0
- package/dist/proposals/trajectory-critic.d.ts +35 -0
- package/dist/proposals/trajectory-critic.d.ts.map +1 -0
- package/dist/proposals/trajectory-critic.js +211 -0
- package/dist/proposals/trajectory-critic.js.map +1 -0
- package/dist/repos/tickets.d.ts +2 -0
- package/dist/repos/tickets.d.ts.map +1 -1
- package/dist/repos/tickets.js.map +1 -1
- package/dist/scout/index.d.ts.map +1 -1
- package/dist/scout/index.js +10 -1
- package/dist/scout/index.js.map +1 -1
- package/dist/scout/prompt.d.ts.map +1 -1
- package/dist/scout/prompt.js +7 -1
- package/dist/scout/prompt.js.map +1 -1
- package/dist/scout/runner.d.ts.map +1 -1
- package/dist/scout/runner.js +1 -0
- package/dist/scout/runner.js.map +1 -1
- package/dist/scout/types.d.ts +20 -1
- package/dist/scout/types.d.ts.map +1 -1
- package/dist/scout/types.js +4 -2
- package/dist/scout/types.js.map +1 -1
- package/dist/sectors/shared.d.ts +17 -0
- package/dist/sectors/shared.d.ts.map +1 -1
- package/dist/sectors/shared.js +65 -0
- package/dist/sectors/shared.js.map +1 -1
- package/dist/services/scout.d.ts +2 -0
- package/dist/services/scout.d.ts.map +1 -1
- package/dist/services/scout.js +1 -0
- package/dist/services/scout.js.map +1 -1
- package/dist/trajectory/io.d.ts +32 -0
- package/dist/trajectory/io.d.ts.map +1 -0
- package/dist/trajectory/io.js +201 -0
- package/dist/trajectory/io.js.map +1 -0
- package/dist/trajectory/shared.d.ts +50 -0
- package/dist/trajectory/shared.d.ts.map +1 -1
- package/dist/trajectory/shared.js +178 -0
- package/dist/trajectory/shared.js.map +1 -1
- package/dist/waves/conflict.d.ts +130 -0
- package/dist/waves/conflict.d.ts.map +1 -0
- package/dist/waves/conflict.js +400 -0
- package/dist/waves/conflict.js.map +1 -0
- package/dist/waves/merge.d.ts +75 -0
- package/dist/waves/merge.d.ts.map +1 -0
- package/dist/waves/merge.js +305 -0
- package/dist/waves/merge.js.map +1 -0
- package/dist/waves/shared.d.ts +6 -102
- package/dist/waves/shared.d.ts.map +1 -1
- package/dist/waves/shared.js +16 -346
- package/dist/waves/shared.js.map +1 -1
- package/package.json +17 -1
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Proposal Blueprint — pure-function pre-analysis of scout proposals.
|
|
3
|
+
*
|
|
4
|
+
* Groups proposals by file overlap, detects conflicts, identifies enablers
|
|
5
|
+
* (proposals that unblock others via dependency edges), and finds mergeable
|
|
6
|
+
* near-duplicates. Output feeds into trajectory generation prompts.
|
|
7
|
+
*
|
|
8
|
+
* No I/O, no LLM calls. All functions are deterministic.
|
|
9
|
+
*/
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// Core algorithms
|
|
12
|
+
// ---------------------------------------------------------------------------
|
|
13
|
+
/**
|
|
14
|
+
* Compute Jaccard overlap between two file sets.
|
|
15
|
+
*/
|
|
16
|
+
function fileOverlap(a, b) {
|
|
17
|
+
if (a.length === 0 && b.length === 0)
|
|
18
|
+
return 0;
|
|
19
|
+
const setA = new Set(a);
|
|
20
|
+
const setB = new Set(b);
|
|
21
|
+
let intersection = 0;
|
|
22
|
+
for (const f of setA) {
|
|
23
|
+
if (setB.has(f))
|
|
24
|
+
intersection++;
|
|
25
|
+
}
|
|
26
|
+
const union = setA.size + setB.size - intersection;
|
|
27
|
+
return union === 0 ? 0 : intersection / union;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Find the common parent directory of a set of files.
|
|
31
|
+
* Returns the shared prefix path or '' if none.
|
|
32
|
+
*/
|
|
33
|
+
function commonParentDir(files) {
|
|
34
|
+
if (files.length === 0)
|
|
35
|
+
return '';
|
|
36
|
+
const dirs = files
|
|
37
|
+
.map(f => f.split('/').slice(0, -1))
|
|
38
|
+
.filter(d => d.length > 0);
|
|
39
|
+
if (dirs.length === 0)
|
|
40
|
+
return '';
|
|
41
|
+
const first = dirs[0];
|
|
42
|
+
let commonLen = first.length;
|
|
43
|
+
for (const dir of dirs.slice(1)) {
|
|
44
|
+
let i = 0;
|
|
45
|
+
while (i < commonLen && i < dir.length && first[i] === dir[i])
|
|
46
|
+
i++;
|
|
47
|
+
commonLen = i;
|
|
48
|
+
}
|
|
49
|
+
if (commonLen === 0)
|
|
50
|
+
return '';
|
|
51
|
+
return first.slice(0, commonLen).join('/');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Group proposals by file overlap (>=50% Jaccard similarity).
|
|
55
|
+
* Uses single-linkage: if proposal C overlaps with A (already grouped),
|
|
56
|
+
* C joins A's group.
|
|
57
|
+
*/
|
|
58
|
+
export function groupByFileOverlap(proposals, overlapThreshold = 0.5) {
|
|
59
|
+
const n = proposals.length;
|
|
60
|
+
const groupId = new Array(n);
|
|
61
|
+
for (let i = 0; i < n; i++)
|
|
62
|
+
groupId[i] = i;
|
|
63
|
+
// Union-find helpers
|
|
64
|
+
function find(i) {
|
|
65
|
+
while (groupId[i] !== i) {
|
|
66
|
+
groupId[i] = groupId[groupId[i]];
|
|
67
|
+
i = groupId[i];
|
|
68
|
+
}
|
|
69
|
+
return i;
|
|
70
|
+
}
|
|
71
|
+
function union(a, b) {
|
|
72
|
+
const ra = find(a);
|
|
73
|
+
const rb = find(b);
|
|
74
|
+
if (ra !== rb)
|
|
75
|
+
groupId[rb] = ra;
|
|
76
|
+
}
|
|
77
|
+
// Merge proposals with file overlap >= threshold
|
|
78
|
+
for (let i = 0; i < n; i++) {
|
|
79
|
+
for (let j = i + 1; j < n; j++) {
|
|
80
|
+
if (fileOverlap(proposals[i].files, proposals[j].files) >= overlapThreshold) {
|
|
81
|
+
union(i, j);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Collect groups
|
|
86
|
+
const groups = new Map();
|
|
87
|
+
for (let i = 0; i < n; i++) {
|
|
88
|
+
const root = find(i);
|
|
89
|
+
let arr = groups.get(root);
|
|
90
|
+
if (!arr) {
|
|
91
|
+
arr = [];
|
|
92
|
+
groups.set(root, arr);
|
|
93
|
+
}
|
|
94
|
+
arr.push(i);
|
|
95
|
+
}
|
|
96
|
+
// Build ProposalGroup objects
|
|
97
|
+
const result = [];
|
|
98
|
+
let order = 1;
|
|
99
|
+
for (const indices of groups.values()) {
|
|
100
|
+
const allFiles = [...new Set(indices.flatMap(i => proposals[i].files))];
|
|
101
|
+
const parentDir = commonParentDir(allFiles);
|
|
102
|
+
const scope = parentDir ? `${parentDir}/**` : allFiles.length > 0 ? allFiles[0].split('/').slice(0, -1).join('/') + '/**' : '**';
|
|
103
|
+
// Theme from categories present
|
|
104
|
+
const cats = [...new Set(indices.map(i => proposals[i].category))];
|
|
105
|
+
const theme = cats.join('+');
|
|
106
|
+
result.push({
|
|
107
|
+
theme,
|
|
108
|
+
proposalIndices: indices,
|
|
109
|
+
commonScope: scope,
|
|
110
|
+
suggestedOrder: order++,
|
|
111
|
+
isEnabler: false, // set later by identifyEnablers
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Detect conflicts: proposals touching the same file but with different categories.
|
|
118
|
+
* Higher-impact proposal wins by default.
|
|
119
|
+
*/
|
|
120
|
+
export function detectConflicts(proposals) {
|
|
121
|
+
const conflicts = [];
|
|
122
|
+
const n = proposals.length;
|
|
123
|
+
for (let i = 0; i < n; i++) {
|
|
124
|
+
const filesA = new Set(proposals[i].files);
|
|
125
|
+
for (let j = i + 1; j < n; j++) {
|
|
126
|
+
if (proposals[i].category === proposals[j].category)
|
|
127
|
+
continue;
|
|
128
|
+
// Check for shared files
|
|
129
|
+
const shared = [];
|
|
130
|
+
for (const f of proposals[j].files) {
|
|
131
|
+
if (filesA.has(f))
|
|
132
|
+
shared.push(f);
|
|
133
|
+
}
|
|
134
|
+
if (shared.length === 0)
|
|
135
|
+
continue;
|
|
136
|
+
const scoreA = (proposals[i].impact_score ?? 5) * (proposals[i].confidence / 100);
|
|
137
|
+
const scoreB = (proposals[j].impact_score ?? 5) * (proposals[j].confidence / 100);
|
|
138
|
+
const scoreDiff = Math.abs(scoreA - scoreB);
|
|
139
|
+
conflicts.push({
|
|
140
|
+
indexA: i,
|
|
141
|
+
indexB: j,
|
|
142
|
+
reason: `Both touch ${shared.join(', ')} but categories differ (${proposals[i].category} vs ${proposals[j].category})`,
|
|
143
|
+
resolution: scoreDiff > 1 ? 'keep_higher_impact' : 'sequence',
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return conflicts;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Identify enabler proposals — proposals whose files are depended upon by
|
|
151
|
+
* other proposals' files (based on dependency edges).
|
|
152
|
+
*/
|
|
153
|
+
export function identifyEnablers(proposals, depEdges) {
|
|
154
|
+
if (Object.keys(depEdges).length === 0)
|
|
155
|
+
return [];
|
|
156
|
+
// Build a set of modules touched by each proposal (parent dir of each file)
|
|
157
|
+
const proposalModules = proposals.map(p => {
|
|
158
|
+
const mods = new Set();
|
|
159
|
+
for (const f of p.files) {
|
|
160
|
+
const dir = f.split('/').slice(0, -1).join('/');
|
|
161
|
+
if (dir)
|
|
162
|
+
mods.add(dir);
|
|
163
|
+
}
|
|
164
|
+
return mods;
|
|
165
|
+
});
|
|
166
|
+
// Build reverse edge map: module → modules that depend on it
|
|
167
|
+
const reverseEdges = new Map();
|
|
168
|
+
for (const [mod, deps] of Object.entries(depEdges)) {
|
|
169
|
+
for (const dep of deps) {
|
|
170
|
+
let rev = reverseEdges.get(dep);
|
|
171
|
+
if (!rev) {
|
|
172
|
+
rev = new Set();
|
|
173
|
+
reverseEdges.set(dep, rev);
|
|
174
|
+
}
|
|
175
|
+
rev.add(mod);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const enablers = [];
|
|
179
|
+
for (let i = 0; i < proposals.length; i++) {
|
|
180
|
+
// Check if any module touched by proposal i is imported by modules from other proposals
|
|
181
|
+
for (const mod of proposalModules[i]) {
|
|
182
|
+
const dependents = reverseEdges.get(mod);
|
|
183
|
+
if (!dependents)
|
|
184
|
+
continue;
|
|
185
|
+
for (let j = 0; j < proposals.length; j++) {
|
|
186
|
+
if (j === i)
|
|
187
|
+
continue;
|
|
188
|
+
for (const otherMod of proposalModules[j]) {
|
|
189
|
+
if (dependents.has(otherMod)) {
|
|
190
|
+
enablers.push(i);
|
|
191
|
+
// Break out of all inner loops
|
|
192
|
+
break;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (enablers[enablers.length - 1] === i)
|
|
196
|
+
break;
|
|
197
|
+
}
|
|
198
|
+
if (enablers[enablers.length - 1] === i)
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return [...new Set(enablers)];
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Detect mergeable pairs: >=70% file overlap + same category = likely duplicate.
|
|
206
|
+
*/
|
|
207
|
+
export function detectMergeablePairs(proposals, overlapThreshold = 0.7) {
|
|
208
|
+
const pairs = [];
|
|
209
|
+
const n = proposals.length;
|
|
210
|
+
for (let i = 0; i < n; i++) {
|
|
211
|
+
for (let j = i + 1; j < n; j++) {
|
|
212
|
+
if (proposals[i].category !== proposals[j].category)
|
|
213
|
+
continue;
|
|
214
|
+
if (fileOverlap(proposals[i].files, proposals[j].files) >= overlapThreshold) {
|
|
215
|
+
pairs.push([i, j]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return pairs;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Compute a full blueprint from proposals and optional dependency edges.
|
|
223
|
+
*/
|
|
224
|
+
export function computeBlueprint(proposals, depEdges = {}, config) {
|
|
225
|
+
const groups = groupByFileOverlap(proposals, config?.groupOverlapThreshold);
|
|
226
|
+
const conflicts = detectConflicts(proposals);
|
|
227
|
+
const enablers = identifyEnablers(proposals, depEdges);
|
|
228
|
+
const mergeablePairs = detectMergeablePairs(proposals, config?.mergeableOverlapThreshold);
|
|
229
|
+
// Mark enabler groups and adjust ordering (enablers first)
|
|
230
|
+
const enablerSet = new Set(enablers);
|
|
231
|
+
for (const group of groups) {
|
|
232
|
+
group.isEnabler = group.proposalIndices.some(i => enablerSet.has(i));
|
|
233
|
+
}
|
|
234
|
+
// Re-sort: enablers first, then by original order
|
|
235
|
+
groups.sort((a, b) => {
|
|
236
|
+
if (a.isEnabler && !b.isEnabler)
|
|
237
|
+
return -1;
|
|
238
|
+
if (!a.isEnabler && b.isEnabler)
|
|
239
|
+
return 1;
|
|
240
|
+
return a.suggestedOrder - b.suggestedOrder;
|
|
241
|
+
});
|
|
242
|
+
// Re-number suggested orders
|
|
243
|
+
for (let i = 0; i < groups.length; i++) {
|
|
244
|
+
groups[i].suggestedOrder = i + 1;
|
|
245
|
+
}
|
|
246
|
+
// Build execution arc summary
|
|
247
|
+
const arcParts = [];
|
|
248
|
+
if (enablers.length > 0) {
|
|
249
|
+
arcParts.push(`${enablers.length} enabler(s) should go first`);
|
|
250
|
+
}
|
|
251
|
+
if (conflicts.length > 0) {
|
|
252
|
+
arcParts.push(`${conflicts.length} conflict(s) need isolation`);
|
|
253
|
+
}
|
|
254
|
+
if (mergeablePairs.length > 0) {
|
|
255
|
+
arcParts.push(`${mergeablePairs.length} pair(s) can be merged`);
|
|
256
|
+
}
|
|
257
|
+
arcParts.push(`${groups.length} group(s) total`);
|
|
258
|
+
const executionArc = arcParts.join(', ');
|
|
259
|
+
return { groups, conflicts, enablers, mergeablePairs, executionArc };
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Format a blueprint as compact text for injection into the LLM prompt.
|
|
263
|
+
*/
|
|
264
|
+
export function formatBlueprintForPrompt(blueprint, proposals) {
|
|
265
|
+
const lines = [];
|
|
266
|
+
lines.push(`Arc: ${blueprint.executionArc}`);
|
|
267
|
+
lines.push('');
|
|
268
|
+
// Groups
|
|
269
|
+
lines.push('Groups:');
|
|
270
|
+
for (const g of blueprint.groups) {
|
|
271
|
+
const titles = g.proposalIndices.map(i => proposals[i].title).join(', ');
|
|
272
|
+
lines.push(` ${g.suggestedOrder}. [${g.theme}] ${titles} → scope: ${g.commonScope}${g.isEnabler ? ' (ENABLER)' : ''}`);
|
|
273
|
+
}
|
|
274
|
+
// Conflicts
|
|
275
|
+
if (blueprint.conflicts.length > 0) {
|
|
276
|
+
lines.push('');
|
|
277
|
+
lines.push('Conflicts:');
|
|
278
|
+
for (const c of blueprint.conflicts) {
|
|
279
|
+
lines.push(` - #${c.indexA + 1} vs #${c.indexB + 1}: ${c.reason} → ${c.resolution}`);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Mergeable
|
|
283
|
+
if (blueprint.mergeablePairs.length > 0) {
|
|
284
|
+
lines.push('');
|
|
285
|
+
lines.push('Mergeable (>=70% overlap, same category):');
|
|
286
|
+
for (const [a, b] of blueprint.mergeablePairs) {
|
|
287
|
+
lines.push(` - #${a + 1} "${proposals[a].title}" + #${b + 1} "${proposals[b].title}"`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return lines.join('\n');
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=blueprint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/proposals/blueprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,8 @@ export interface RawProposal {
|
|
|
21
21
|
risk?: string;
|
|
22
22
|
touched_files_estimate?: number;
|
|
23
23
|
rollback_note?: string;
|
|
24
|
+
/** Function/class names this proposal modifies (for symbol-aware conflict detection). */
|
|
25
|
+
target_symbols?: string[];
|
|
24
26
|
}
|
|
25
27
|
/** Proposal with all required fields validated and defaults applied. */
|
|
26
28
|
export interface ValidatedProposal {
|
|
@@ -38,6 +40,8 @@ export interface ValidatedProposal {
|
|
|
38
40
|
risk: string;
|
|
39
41
|
touched_files_estimate: number;
|
|
40
42
|
rollback_note: string;
|
|
43
|
+
/** Function/class names this proposal modifies (for symbol-aware conflict detection). */
|
|
44
|
+
target_symbols?: string[];
|
|
41
45
|
}
|
|
42
46
|
/** Result of adversarial review — revised scores for a single proposal. */
|
|
43
47
|
export interface ReviewedProposal {
|
|
@@ -107,14 +111,38 @@ export declare function applyReviewToProposals<T extends {
|
|
|
107
111
|
confidence: number;
|
|
108
112
|
impact_score?: number;
|
|
109
113
|
}>(proposals: T[], reviewed: ReviewedProposal[]): T[];
|
|
114
|
+
/**
|
|
115
|
+
* Optional dependency graph context for structural impact scoring.
|
|
116
|
+
* When provided, proposals touching hub modules (high fan-in) get a score
|
|
117
|
+
* boost, making structurally impactful changes float to the top.
|
|
118
|
+
*/
|
|
119
|
+
export interface GraphContext {
|
|
120
|
+
/** Forward edges: module → modules it imports. */
|
|
121
|
+
edges: Record<string, string[]>;
|
|
122
|
+
/** Reverse edges: module → modules that import it. */
|
|
123
|
+
reverseEdges: Record<string, string[]>;
|
|
124
|
+
/** Modules with fan_in >= 3 (high dependents). */
|
|
125
|
+
hubModules: string[];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Compute a structural boost multiplier for a proposal based on its
|
|
129
|
+
* position in the dependency graph.
|
|
130
|
+
*
|
|
131
|
+
* Returns a multiplier >= 1.0. Hub modules (high fan-in) get boosted
|
|
132
|
+
* because changes to them have cascading impact. Returns 1.0 when
|
|
133
|
+
* no graph context or no matching modules.
|
|
134
|
+
*/
|
|
135
|
+
export declare function computeGraphBoost(files: string[], graph: GraphContext | undefined): number;
|
|
110
136
|
/**
|
|
111
137
|
* Score proposals by impact × confidence and return the top N.
|
|
112
|
-
*
|
|
138
|
+
* When graphContext is provided, proposals touching hub modules get
|
|
139
|
+
* a structural boost. Does not mutate the input array.
|
|
113
140
|
*/
|
|
114
141
|
export declare function scoreAndRank<T extends {
|
|
115
142
|
confidence: number;
|
|
116
143
|
impact_score?: number;
|
|
117
|
-
|
|
144
|
+
files?: string[];
|
|
145
|
+
}>(proposals: T[], maxCount?: number, graphContext?: GraphContext): T[];
|
|
118
146
|
/**
|
|
119
147
|
* Balance test vs non-test proposals by capping the ratio of test-only proposals.
|
|
120
148
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/proposals/shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/proposals/shared.ts"],"names":[],"mappings":"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"}
|
package/dist/proposals/shared.js
CHANGED
|
@@ -26,7 +26,6 @@ export const PROPOSALS_DEFAULTS = {
|
|
|
26
26
|
export const REQUIRED_FIELDS = [
|
|
27
27
|
'category', 'title', 'description', 'allowed_paths',
|
|
28
28
|
'files', 'confidence', 'verification_commands',
|
|
29
|
-
'risk', 'touched_files_estimate', 'rollback_note',
|
|
30
29
|
];
|
|
31
30
|
// ---------------------------------------------------------------------------
|
|
32
31
|
// Schema validation
|
|
@@ -48,14 +47,14 @@ export function validateProposalSchema(raw) {
|
|
|
48
47
|
missing.push('allowed_paths');
|
|
49
48
|
if (typeof raw.confidence !== 'number')
|
|
50
49
|
missing.push('confidence');
|
|
51
|
-
if (!raw.risk || typeof raw.risk !== 'string')
|
|
52
|
-
missing.push('risk');
|
|
53
50
|
// Soft-required: normalizeProposal provides safe defaults for these.
|
|
54
51
|
// We still validate type when present, but missing is not fatal.
|
|
55
52
|
if (raw.files !== null && raw.files !== undefined && !Array.isArray(raw.files))
|
|
56
53
|
missing.push('files');
|
|
57
54
|
if (raw.verification_commands !== null && raw.verification_commands !== undefined && !Array.isArray(raw.verification_commands))
|
|
58
55
|
missing.push('verification_commands');
|
|
56
|
+
if (raw.risk !== null && raw.risk !== undefined && typeof raw.risk !== 'string')
|
|
57
|
+
missing.push('risk');
|
|
59
58
|
if (raw.touched_files_estimate !== null && raw.touched_files_estimate !== undefined && typeof raw.touched_files_estimate !== 'number')
|
|
60
59
|
missing.push('touched_files_estimate');
|
|
61
60
|
if (raw.rollback_note !== null && raw.rollback_note !== undefined && typeof raw.rollback_note !== 'string')
|
|
@@ -67,7 +66,7 @@ export function validateProposalSchema(raw) {
|
|
|
67
66
|
* Caller must ensure schema validation passed first.
|
|
68
67
|
*/
|
|
69
68
|
export function normalizeProposal(raw) {
|
|
70
|
-
|
|
69
|
+
const result = {
|
|
71
70
|
category: raw.category,
|
|
72
71
|
title: raw.title,
|
|
73
72
|
description: raw.description,
|
|
@@ -79,10 +78,13 @@ export function normalizeProposal(raw) {
|
|
|
79
78
|
impact_score: raw.impact_score ?? PROPOSALS_DEFAULTS.DEFAULT_IMPACT,
|
|
80
79
|
rationale: raw.rationale ?? '',
|
|
81
80
|
estimated_complexity: raw.estimated_complexity ?? 'moderate',
|
|
82
|
-
risk: raw.risk,
|
|
81
|
+
risk: raw.risk ?? 'medium',
|
|
83
82
|
touched_files_estimate: raw.touched_files_estimate ?? (raw.allowed_paths?.length ?? 1),
|
|
84
83
|
rollback_note: raw.rollback_note ?? 'git revert',
|
|
85
84
|
};
|
|
85
|
+
if (raw.target_symbols?.length)
|
|
86
|
+
result.target_symbols = raw.target_symbols;
|
|
87
|
+
return result;
|
|
86
88
|
}
|
|
87
89
|
/**
|
|
88
90
|
* Build a prompt for adversarial (second-pass) review of proposals.
|
|
@@ -173,19 +175,64 @@ export function applyReviewToProposals(proposals, reviewed) {
|
|
|
173
175
|
};
|
|
174
176
|
});
|
|
175
177
|
}
|
|
178
|
+
/** Hub boost: 20% increase for proposals touching hub modules. */
|
|
179
|
+
const HUB_BOOST = 0.2;
|
|
180
|
+
/** Fan-in scaling: each additional dependent adds 2% up to 20% max. */
|
|
181
|
+
const FAN_IN_SCALE = 0.02;
|
|
182
|
+
const FAN_IN_CAP = 0.2;
|
|
183
|
+
/**
|
|
184
|
+
* Compute a structural boost multiplier for a proposal based on its
|
|
185
|
+
* position in the dependency graph.
|
|
186
|
+
*
|
|
187
|
+
* Returns a multiplier >= 1.0. Hub modules (high fan-in) get boosted
|
|
188
|
+
* because changes to them have cascading impact. Returns 1.0 when
|
|
189
|
+
* no graph context or no matching modules.
|
|
190
|
+
*/
|
|
191
|
+
export function computeGraphBoost(files, graph) {
|
|
192
|
+
if (!graph || files.length === 0)
|
|
193
|
+
return 1.0;
|
|
194
|
+
// Map files to their containing modules (parent directory paths)
|
|
195
|
+
const modules = new Set();
|
|
196
|
+
for (const f of files) {
|
|
197
|
+
const parts = f.split('/');
|
|
198
|
+
// Try increasingly specific paths: a/b/c → a/b, a/b/c
|
|
199
|
+
for (let i = 1; i <= parts.length - 1; i++) {
|
|
200
|
+
const candidate = parts.slice(0, i).join('/');
|
|
201
|
+
if (candidate in graph.reverseEdges || candidate in graph.edges) {
|
|
202
|
+
modules.add(candidate);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (modules.size === 0)
|
|
207
|
+
return 1.0;
|
|
208
|
+
let maxBoost = 0;
|
|
209
|
+
for (const mod of modules) {
|
|
210
|
+
const fanIn = (graph.reverseEdges[mod] ?? []).length;
|
|
211
|
+
const isHub = graph.hubModules.includes(mod);
|
|
212
|
+
let boost = 0;
|
|
213
|
+
if (isHub)
|
|
214
|
+
boost += HUB_BOOST;
|
|
215
|
+
boost += Math.min(fanIn * FAN_IN_SCALE, FAN_IN_CAP);
|
|
216
|
+
if (boost > maxBoost)
|
|
217
|
+
maxBoost = boost;
|
|
218
|
+
}
|
|
219
|
+
return 1.0 + maxBoost;
|
|
220
|
+
}
|
|
176
221
|
// ---------------------------------------------------------------------------
|
|
177
222
|
// Scoring and ranking
|
|
178
223
|
// ---------------------------------------------------------------------------
|
|
179
224
|
/**
|
|
180
225
|
* Score proposals by impact × confidence and return the top N.
|
|
181
|
-
*
|
|
226
|
+
* When graphContext is provided, proposals touching hub modules get
|
|
227
|
+
* a structural boost. Does not mutate the input array.
|
|
182
228
|
*/
|
|
183
|
-
export function scoreAndRank(proposals, maxCount) {
|
|
229
|
+
export function scoreAndRank(proposals, maxCount, graphContext) {
|
|
184
230
|
const scored = [...proposals]
|
|
185
|
-
.map(p =>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
231
|
+
.map(p => {
|
|
232
|
+
const base = (p.impact_score ?? PROPOSALS_DEFAULTS.DEFAULT_IMPACT) * p.confidence;
|
|
233
|
+
const boost = computeGraphBoost(p.files ?? [], graphContext);
|
|
234
|
+
return { proposal: p, score: base * boost };
|
|
235
|
+
})
|
|
189
236
|
.sort((a, b) => b.score - a.score);
|
|
190
237
|
const capped = maxCount !== undefined ? scored.slice(0, maxCount) : scored;
|
|
191
238
|
return capped.map(s => s.proposal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/proposals/shared.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/proposals/shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step complexity classifier — routes trajectory steps to appropriate models
|
|
3
|
+
* based on category, scope, and description heuristics.
|
|
4
|
+
*/
|
|
5
|
+
/** Complexity levels for model routing */
|
|
6
|
+
export type StepComplexity = 'simple' | 'moderate' | 'complex';
|
|
7
|
+
/** Default model mapping per complexity level */
|
|
8
|
+
export declare const DEFAULT_MODEL_MAP: Record<StepComplexity, string>;
|
|
9
|
+
/**
|
|
10
|
+
* Classify a trajectory step's complexity based on its properties.
|
|
11
|
+
*
|
|
12
|
+
* Rules:
|
|
13
|
+
* - `simple`: single category in [docs, types, cleanup, test] AND narrow scope (single dir or ≤2 files)
|
|
14
|
+
* - `complex`: categories include [security, fix, migration] OR scope is `**` / multi-module (3+ distinct top-level dirs)
|
|
15
|
+
* - `moderate`: everything else
|
|
16
|
+
*/
|
|
17
|
+
export declare function classifyStepComplexity(step: {
|
|
18
|
+
categories?: string[];
|
|
19
|
+
scope?: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
allowed_paths?: string[];
|
|
22
|
+
}): StepComplexity;
|
|
23
|
+
/**
|
|
24
|
+
* Get the recommended model for a step based on its complexity.
|
|
25
|
+
*/
|
|
26
|
+
export declare function getModelForStep(step: {
|
|
27
|
+
categories?: string[];
|
|
28
|
+
scope?: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
allowed_paths?: string[];
|
|
31
|
+
}, modelMap?: Partial<Record<StepComplexity, string>>): string;
|
|
32
|
+
//# sourceMappingURL=step-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-classifier.d.ts","sourceRoot":"","sources":["../../src/proposals/step-classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE/D,iDAAiD;AACjD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAI5D,CAAC;AAKF;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE;IAC3C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B,GAAG,cAAc,CAwBjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,EAC/F,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC,GACjD,MAAM,CAIR"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step complexity classifier — routes trajectory steps to appropriate models
|
|
3
|
+
* based on category, scope, and description heuristics.
|
|
4
|
+
*/
|
|
5
|
+
/** Default model mapping per complexity level */
|
|
6
|
+
export const DEFAULT_MODEL_MAP = {
|
|
7
|
+
simple: 'haiku',
|
|
8
|
+
moderate: 'sonnet',
|
|
9
|
+
complex: 'opus',
|
|
10
|
+
};
|
|
11
|
+
const SIMPLE_CATEGORIES = new Set(['docs', 'types', 'cleanup', 'test']);
|
|
12
|
+
const COMPLEX_CATEGORIES = new Set(['security', 'fix', 'migration']);
|
|
13
|
+
/**
|
|
14
|
+
* Classify a trajectory step's complexity based on its properties.
|
|
15
|
+
*
|
|
16
|
+
* Rules:
|
|
17
|
+
* - `simple`: single category in [docs, types, cleanup, test] AND narrow scope (single dir or ≤2 files)
|
|
18
|
+
* - `complex`: categories include [security, fix, migration] OR scope is `**` / multi-module (3+ distinct top-level dirs)
|
|
19
|
+
* - `moderate`: everything else
|
|
20
|
+
*/
|
|
21
|
+
export function classifyStepComplexity(step) {
|
|
22
|
+
const categories = step.categories ?? [];
|
|
23
|
+
const scope = step.scope ?? '';
|
|
24
|
+
const paths = step.allowed_paths ?? [];
|
|
25
|
+
// Check for complex indicators first (they take priority)
|
|
26
|
+
const hasComplexCategory = categories.some(c => COMPLEX_CATEGORIES.has(c));
|
|
27
|
+
const isBroadScope = scope === '**' || scope === '';
|
|
28
|
+
const distinctTopDirs = new Set(paths.map(p => p.split('/')[0]).filter(Boolean));
|
|
29
|
+
const isMultiModule = distinctTopDirs.size >= 3;
|
|
30
|
+
if (hasComplexCategory || (paths.length > 0 && isMultiModule) || (isBroadScope && paths.length === 0 && categories.length > 1)) {
|
|
31
|
+
return 'complex';
|
|
32
|
+
}
|
|
33
|
+
// Check for simple indicators
|
|
34
|
+
const allSimpleCategories = categories.length > 0 && categories.every(c => SIMPLE_CATEGORIES.has(c));
|
|
35
|
+
const isNarrowScope = paths.length <= 2 || (distinctTopDirs.size <= 1 && paths.length > 0);
|
|
36
|
+
if (allSimpleCategories && isNarrowScope) {
|
|
37
|
+
return 'simple';
|
|
38
|
+
}
|
|
39
|
+
return 'moderate';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get the recommended model for a step based on its complexity.
|
|
43
|
+
*/
|
|
44
|
+
export function getModelForStep(step, modelMap) {
|
|
45
|
+
const complexity = classifyStepComplexity(step);
|
|
46
|
+
const map = { ...DEFAULT_MODEL_MAP, ...modelMap };
|
|
47
|
+
return map[complexity];
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=step-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-classifier.js","sourceRoot":"","sources":["../../src/proposals/step-classifier.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,iDAAiD;AACjD,MAAM,CAAC,MAAM,iBAAiB,GAAmC;IAC/D,MAAM,EAAE,OAAO;IACf,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AACxE,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAKtC;IACC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC;IAEvC,0DAA0D;IAC1D,MAAM,kBAAkB,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;IACpD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACjF,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC;IAEhD,IAAI,kBAAkB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;QAC/H,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,8BAA8B;IAC9B,MAAM,mBAAmB,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrG,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE3F,IAAI,mBAAmB,IAAI,aAAa,EAAE,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA+F,EAC/F,QAAkD;IAElD,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,GAAG,GAAG,EAAE,GAAG,iBAAiB,EAAE,GAAG,QAAQ,EAAE,CAAC;IAClD,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;AACzB,CAAC"}
|