@bradtaylorsf/alpha-loop 1.13.1 → 1.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +99 -1
  2. package/dist/cli.js +40 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/eval.d.ts +22 -0
  5. package/dist/commands/eval.js +105 -1
  6. package/dist/commands/eval.js.map +1 -1
  7. package/dist/commands/evolve-routing.d.ts +24 -0
  8. package/dist/commands/evolve-routing.js +320 -0
  9. package/dist/commands/evolve-routing.js.map +1 -0
  10. package/dist/commands/history.d.ts +2 -0
  11. package/dist/commands/history.js +95 -1
  12. package/dist/commands/history.js.map +1 -1
  13. package/dist/commands/init.d.ts +6 -0
  14. package/dist/commands/init.js +28 -1
  15. package/dist/commands/init.js.map +1 -1
  16. package/dist/commands/report.d.ts +7 -0
  17. package/dist/commands/report.js +27 -0
  18. package/dist/commands/report.js.map +1 -0
  19. package/dist/commands/run.d.ts +16 -0
  20. package/dist/commands/run.js +265 -36
  21. package/dist/commands/run.js.map +1 -1
  22. package/dist/commands/scan.d.ts +1 -1
  23. package/dist/commands/scan.js.map +1 -1
  24. package/dist/engine/agents.d.ts +30 -8
  25. package/dist/engine/agents.js +94 -10
  26. package/dist/engine/agents.js.map +1 -1
  27. package/dist/engine/prerequisites.d.ts +40 -2
  28. package/dist/engine/prerequisites.js +126 -2
  29. package/dist/engine/prerequisites.js.map +1 -1
  30. package/dist/lib/agent.d.ts +39 -2
  31. package/dist/lib/agent.js +106 -4
  32. package/dist/lib/agent.js.map +1 -1
  33. package/dist/lib/config.d.ts +78 -1
  34. package/dist/lib/config.js +217 -1
  35. package/dist/lib/config.js.map +1 -1
  36. package/dist/lib/epics.d.ts +57 -0
  37. package/dist/lib/epics.js +76 -0
  38. package/dist/lib/epics.js.map +1 -0
  39. package/dist/lib/escalation.d.ts +102 -0
  40. package/dist/lib/escalation.js +241 -0
  41. package/dist/lib/escalation.js.map +1 -0
  42. package/dist/lib/eval-matrix.d.ts +125 -0
  43. package/dist/lib/eval-matrix.js +317 -0
  44. package/dist/lib/eval-matrix.js.map +1 -0
  45. package/dist/lib/eval-report.d.ts +12 -0
  46. package/dist/lib/eval-report.js +132 -0
  47. package/dist/lib/eval-report.js.map +1 -0
  48. package/dist/lib/eval-secret-scan.d.ts +41 -0
  49. package/dist/lib/eval-secret-scan.js +163 -0
  50. package/dist/lib/eval-secret-scan.js.map +1 -0
  51. package/dist/lib/eval.js +7 -4
  52. package/dist/lib/eval.js.map +1 -1
  53. package/dist/lib/github.d.ts +25 -0
  54. package/dist/lib/github.js +75 -0
  55. package/dist/lib/github.js.map +1 -1
  56. package/dist/lib/hardware.d.ts +9 -0
  57. package/dist/lib/hardware.js +32 -0
  58. package/dist/lib/hardware.js.map +1 -0
  59. package/dist/lib/pipeline.d.ts +6 -1
  60. package/dist/lib/pipeline.js +223 -19
  61. package/dist/lib/pipeline.js.map +1 -1
  62. package/dist/lib/prerequisites.js +11 -3
  63. package/dist/lib/prerequisites.js.map +1 -1
  64. package/dist/lib/routing-history.d.ts +43 -0
  65. package/dist/lib/routing-history.js +112 -0
  66. package/dist/lib/routing-history.js.map +1 -0
  67. package/dist/lib/routing-promotion.d.ts +95 -0
  68. package/dist/lib/routing-promotion.js +229 -0
  69. package/dist/lib/routing-promotion.js.map +1 -0
  70. package/dist/lib/session.d.ts +10 -1
  71. package/dist/lib/session.js +38 -7
  72. package/dist/lib/session.js.map +1 -1
  73. package/dist/lib/telemetry.d.ts +147 -0
  74. package/dist/lib/telemetry.js +353 -0
  75. package/dist/lib/telemetry.js.map +1 -0
  76. package/dist/lib/verify-epic.d.ts +31 -0
  77. package/dist/lib/verify-epic.js +237 -0
  78. package/dist/lib/verify-epic.js.map +1 -0
  79. package/package.json +1 -1
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Per-Stage Telemetry — granular metrics per pipeline stage invocation.
3
+ *
4
+ * Session-level cost logs hide which stage burned the tokens. For A/B routing
5
+ * analysis we need apples-to-apples metrics per (stage, model) cell across many
6
+ * issues. This module defines the StageTelemetry record, persistence helpers
7
+ * (stages.jsonl in the trace dir), and aggregation math for the
8
+ * `alpha-loop report routing` command.
9
+ */
10
+ import { existsSync, mkdirSync, readdirSync, readFileSync, appendFileSync } from 'node:fs';
11
+ import { join } from 'node:path';
12
+ import { estimateCost } from './config.js';
13
+ /**
14
+ * Build a StageTelemetry record from an AgentResult and stage context.
15
+ *
16
+ * Uses the agent's reported cost/tokens when present. Falls back to the
17
+ * pricing table (0 for local endpoints since pricing entries are 0/0).
18
+ */
19
+ export function buildStageTelemetry(agentResult, stage, config, ctx) {
20
+ const model = agentResult.model || config.model;
21
+ const endpointName = ctx.endpoint ?? 'default';
22
+ const isLocal = ctx.endpointType === 'anthropic_compat' || ctx.endpointType === 'openai_compat';
23
+ let tokensIn;
24
+ let tokensOut;
25
+ let costUsd;
26
+ if (agentResult.costUsd != null &&
27
+ agentResult.inputTokens != null &&
28
+ agentResult.outputTokens != null) {
29
+ tokensIn = agentResult.inputTokens;
30
+ tokensOut = agentResult.outputTokens;
31
+ costUsd = isLocal ? 0 : agentResult.costUsd;
32
+ }
33
+ else {
34
+ // Estimate tokens from output length (chars / 4 ≈ tokens).
35
+ tokensOut = Math.round(agentResult.output.length / 4);
36
+ tokensIn = Math.round(tokensOut * 1.3);
37
+ costUsd = isLocal ? 0 : estimateCost(model, tokensIn, tokensOut, config.pricing);
38
+ }
39
+ return {
40
+ stage,
41
+ model,
42
+ endpoint: endpointName,
43
+ endpoint_type: ctx.endpointType,
44
+ tokens_in: tokensIn,
45
+ tokens_out: tokensOut,
46
+ cost_usd: Math.round(costUsd * 1_000_000) / 1_000_000,
47
+ wall_time_s: Math.round((agentResult.duration / 1000) * 1000) / 1000,
48
+ tool_calls: agentResult.toolCalls ?? 0,
49
+ tool_errors: agentResult.toolErrors ?? 0,
50
+ stage_success: agentResult.exitCode === 0,
51
+ started_at: ctx.startedAt ?? new Date(Date.now() - agentResult.duration).toISOString(),
52
+ profile: ctx.profile,
53
+ issue_num: ctx.issueNum,
54
+ };
55
+ }
56
+ function stagesJsonlPath(runDirPath) {
57
+ return join(runDirPath, 'stages.jsonl');
58
+ }
59
+ /**
60
+ * Append a stage telemetry entry to the run's stages.jsonl file.
61
+ * Creates the file and parent directory when needed.
62
+ */
63
+ export function writeStageTelemetry(runDirPath, entry) {
64
+ mkdirSync(runDirPath, { recursive: true });
65
+ const line = JSON.stringify(entry) + '\n';
66
+ appendFileSync(stagesJsonlPath(runDirPath), line);
67
+ }
68
+ /**
69
+ * Read all stage telemetry entries for a single run.
70
+ * Returns an empty array if the file doesn't exist or has parse errors.
71
+ */
72
+ export function readStageTelemetry(runDirPath) {
73
+ const filePath = stagesJsonlPath(runDirPath);
74
+ if (!existsSync(filePath))
75
+ return [];
76
+ const raw = readFileSync(filePath, 'utf-8');
77
+ const entries = [];
78
+ for (const line of raw.split('\n')) {
79
+ const trimmed = line.trim();
80
+ if (!trimmed)
81
+ continue;
82
+ try {
83
+ entries.push(JSON.parse(trimmed));
84
+ }
85
+ catch {
86
+ /* skip invalid line */
87
+ }
88
+ }
89
+ return entries;
90
+ }
91
+ /**
92
+ * Scan `.alpha-loop/traces/` under the given project dir and return all
93
+ * stage telemetry entries across all runs, each tagged with its session name.
94
+ */
95
+ export function readAllStageTelemetry(projectDir) {
96
+ const root = join(projectDir ?? process.cwd(), '.alpha-loop', 'traces');
97
+ if (!existsSync(root))
98
+ return [];
99
+ const out = [];
100
+ for (const name of readdirSync(root)) {
101
+ const dir = join(root, name);
102
+ const entries = readStageTelemetry(dir);
103
+ if (entries.length > 0) {
104
+ out.push({ session: name, entries });
105
+ }
106
+ }
107
+ return out;
108
+ }
109
+ /**
110
+ * Load session manifests written to `.alpha-loop/learnings/` by finalizeSession.
111
+ * Used by the reporter to join cost data with shipped-issue counts.
112
+ */
113
+ export function readSessionManifests(projectDir) {
114
+ const dir = join(projectDir ?? process.cwd(), '.alpha-loop', 'learnings');
115
+ if (!existsSync(dir))
116
+ return [];
117
+ const out = [];
118
+ for (const file of readdirSync(dir)) {
119
+ if (!file.startsWith('session-') || !file.endsWith('.json'))
120
+ continue;
121
+ try {
122
+ const raw = readFileSync(join(dir, file), 'utf-8');
123
+ const parsed = JSON.parse(raw);
124
+ if (parsed.name)
125
+ out.push(parsed);
126
+ }
127
+ catch {
128
+ /* skip invalid */
129
+ }
130
+ }
131
+ return out;
132
+ }
133
+ function median(values) {
134
+ if (values.length === 0)
135
+ return 0;
136
+ const sorted = [...values].sort((a, b) => a - b);
137
+ const mid = Math.floor(sorted.length / 2);
138
+ return sorted.length % 2 === 0 ? (sorted[mid - 1] + sorted[mid]) / 2 : sorted[mid];
139
+ }
140
+ /**
141
+ * Aggregate stage telemetry across sessions into per (stage, model) cells.
142
+ *
143
+ * - `pipeline_success_rate`: fraction of parent sessions that shipped a
144
+ * successful issue while this (stage, model) cell was active.
145
+ * - `cost_per_issue_shipped`: total cost across this cell divided by the
146
+ * number of shipped (status=success, filesChanged>0) issues in the sessions
147
+ * where this cell ran.
148
+ * - `median_wall_time_s`: median wall_time_s across invocations.
149
+ * - `tool_error_rate`: sum(tool_errors) / sum(tool_calls || runs).
150
+ * - Delta columns compare each cell against the cell at the same `stage` with
151
+ * `model` matching the baseline. When `baseline` is 'all-frontier' (default)
152
+ * we pick the highest-cost cell per stage as the baseline (frontier).
153
+ */
154
+ export function aggregateRouting(items, manifests, opts = {}) {
155
+ const baseline = opts.baseline ?? 'all-frontier';
156
+ const manifestByName = new Map();
157
+ for (const m of manifests)
158
+ manifestByName.set(m.name, m);
159
+ const buckets = new Map();
160
+ const sessionShipped = new Map();
161
+ const sessionsSeen = new Set();
162
+ let totalStages = 0;
163
+ for (const { session, entries } of items) {
164
+ const sessionName = deriveSessionName(session);
165
+ const manifest = manifestByName.get(sessionName) ?? manifestByName.get(session);
166
+ // Count shipped issues per session (success + filesChanged > 0).
167
+ if (manifest && !sessionShipped.has(session)) {
168
+ const shipped = (manifest.results ?? []).filter((r) => r.status === 'success' && (r.filesChanged ?? 0) > 0).length;
169
+ sessionShipped.set(session, shipped);
170
+ }
171
+ for (const e of entries) {
172
+ if (opts.profile && e.profile !== opts.profile)
173
+ continue;
174
+ if (opts.sinceMs && new Date(e.started_at).getTime() < opts.sinceMs)
175
+ continue;
176
+ sessionsSeen.add(session);
177
+ totalStages++;
178
+ const key = `${e.stage}::${e.model}`;
179
+ let bucket = buckets.get(key);
180
+ if (!bucket) {
181
+ bucket = {
182
+ stage: e.stage,
183
+ model: e.model,
184
+ endpoint: e.endpoint,
185
+ endpoint_type: e.endpoint_type,
186
+ profile: e.profile,
187
+ runs: 0,
188
+ tokens_in: 0,
189
+ tokens_out: 0,
190
+ total_cost_usd: 0,
191
+ wall_times: [],
192
+ tool_calls: 0,
193
+ tool_errors: 0,
194
+ sessions: new Set(),
195
+ };
196
+ buckets.set(key, bucket);
197
+ }
198
+ bucket.runs++;
199
+ bucket.tokens_in += e.tokens_in;
200
+ bucket.tokens_out += e.tokens_out;
201
+ bucket.total_cost_usd += e.cost_usd;
202
+ bucket.wall_times.push(e.wall_time_s);
203
+ bucket.tool_calls += e.tool_calls;
204
+ bucket.tool_errors += e.tool_errors;
205
+ bucket.sessions.add(session);
206
+ }
207
+ }
208
+ let totalCost = 0;
209
+ let totalIssuesShipped = 0;
210
+ for (const s of sessionsSeen)
211
+ totalIssuesShipped += sessionShipped.get(s) ?? 0;
212
+ const cells = [];
213
+ for (const b of buckets.values()) {
214
+ totalCost += b.total_cost_usd;
215
+ // Shipped issues among sessions that ran this (stage, model).
216
+ let shipped = 0;
217
+ let successfulSessions = 0;
218
+ for (const s of b.sessions) {
219
+ const perSession = sessionShipped.get(s) ?? 0;
220
+ shipped += perSession;
221
+ if (perSession > 0)
222
+ successfulSessions++;
223
+ }
224
+ const pipeline_success_rate = b.sessions.size > 0 ? successfulSessions / b.sessions.size : 0;
225
+ const cost_per_issue_shipped = shipped > 0 ? b.total_cost_usd / shipped : null;
226
+ const tool_error_rate = b.tool_calls > 0 ? b.tool_errors / b.tool_calls : (b.runs > 0 ? b.tool_errors / b.runs : 0);
227
+ cells.push({
228
+ stage: b.stage,
229
+ model: b.model,
230
+ endpoint: b.endpoint,
231
+ endpoint_type: b.endpoint_type,
232
+ profile: b.profile,
233
+ runs: b.runs,
234
+ tokens_in: b.tokens_in,
235
+ tokens_out: b.tokens_out,
236
+ total_cost_usd: Math.round(b.total_cost_usd * 10000) / 10000,
237
+ pipeline_success_rate: Math.round(pipeline_success_rate * 1000) / 1000,
238
+ cost_per_issue_shipped: cost_per_issue_shipped != null ? Math.round(cost_per_issue_shipped * 10000) / 10000 : null,
239
+ median_wall_time_s: Math.round(median(b.wall_times) * 1000) / 1000,
240
+ tool_error_rate: Math.round(tool_error_rate * 10000) / 10000,
241
+ });
242
+ }
243
+ // Pick per-stage baseline: the cell with the highest total_cost_usd
244
+ // (treats frontier models as the reference point). Stable for ties: first seen wins.
245
+ const baselineByStage = new Map();
246
+ for (const cell of cells) {
247
+ const current = baselineByStage.get(cell.stage);
248
+ if (!current || cell.total_cost_usd > current.total_cost_usd) {
249
+ baselineByStage.set(cell.stage, cell);
250
+ }
251
+ }
252
+ for (const cell of cells) {
253
+ const b = baselineByStage.get(cell.stage);
254
+ if (!b || b === cell) {
255
+ cell.delta_cost_per_issue_shipped_vs_baseline = null;
256
+ cell.delta_median_wall_time_s_vs_baseline = null;
257
+ cell.delta_tool_error_rate_vs_baseline = null;
258
+ cell.delta_pipeline_success_rate_vs_baseline = null;
259
+ continue;
260
+ }
261
+ cell.delta_cost_per_issue_shipped_vs_baseline =
262
+ cell.cost_per_issue_shipped != null && b.cost_per_issue_shipped != null
263
+ ? Math.round((cell.cost_per_issue_shipped - b.cost_per_issue_shipped) * 10000) / 10000
264
+ : null;
265
+ cell.delta_median_wall_time_s_vs_baseline =
266
+ Math.round((cell.median_wall_time_s - b.median_wall_time_s) * 1000) / 1000;
267
+ cell.delta_tool_error_rate_vs_baseline =
268
+ Math.round((cell.tool_error_rate - b.tool_error_rate) * 10000) / 10000;
269
+ cell.delta_pipeline_success_rate_vs_baseline =
270
+ Math.round((cell.pipeline_success_rate - b.pipeline_success_rate) * 1000) / 1000;
271
+ }
272
+ cells.sort((a, b) => (a.stage.localeCompare(b.stage) || a.model.localeCompare(b.model)));
273
+ return {
274
+ cells,
275
+ total_sessions: sessionsSeen.size,
276
+ total_stages: totalStages,
277
+ total_issues_shipped: totalIssuesShipped,
278
+ total_cost_usd: Math.round(totalCost * 10000) / 10000,
279
+ filters: {
280
+ profile: opts.profile,
281
+ since_ms: opts.sinceMs,
282
+ baseline,
283
+ },
284
+ };
285
+ }
286
+ /**
287
+ * Trace directory names stored on disk include a replaced slash (e.g.
288
+ * `session-20260401-120000`). Session manifests reference the original
289
+ * `session/20260401-120000` form. This helper mirrors `traces.ts:runDir`.
290
+ */
291
+ function deriveSessionName(dirName) {
292
+ if (dirName.startsWith('session-')) {
293
+ return dirName.replace(/^session-/, 'session/');
294
+ }
295
+ return dirName;
296
+ }
297
+ /**
298
+ * Format an aggregation as a human-readable table or JSON string.
299
+ */
300
+ export function formatRoutingReport(agg, opts = {}) {
301
+ if (opts.json) {
302
+ return JSON.stringify(agg, null, 2);
303
+ }
304
+ if (agg.cells.length === 0) {
305
+ return 'No per-stage telemetry recorded yet. Run alpha-loop with `routing:` configured to populate stages.jsonl.';
306
+ }
307
+ const lines = [];
308
+ lines.push(`Routing report — ${agg.total_sessions} session(s), ${agg.total_stages} stage invocation(s), ${agg.total_issues_shipped} shipped`);
309
+ if (agg.filters.profile)
310
+ lines.push(` Profile: ${agg.filters.profile}`);
311
+ if (agg.filters.since_ms)
312
+ lines.push(` Since: ${new Date(agg.filters.since_ms).toISOString()}`);
313
+ lines.push(` Baseline: ${agg.filters.baseline} (highest-cost cell per stage)`);
314
+ lines.push('');
315
+ const header = ['stage', 'model', 'runs', 'tok_in', 'tok_out', 'cost_usd', 'cost/issue', 'wall_s', 'err_rate', 'Δcost/issue'];
316
+ lines.push(header.join('\t'));
317
+ for (const c of agg.cells) {
318
+ const costPerIssue = c.cost_per_issue_shipped != null ? `$${c.cost_per_issue_shipped.toFixed(4)}` : 'n/a';
319
+ const delta = c.delta_cost_per_issue_shipped_vs_baseline;
320
+ const deltaStr = delta == null ? '—' : (delta >= 0 ? `+$${delta.toFixed(4)}` : `-$${Math.abs(delta).toFixed(4)}`);
321
+ lines.push([
322
+ c.stage,
323
+ c.model,
324
+ String(c.runs),
325
+ String(c.tokens_in),
326
+ String(c.tokens_out),
327
+ `$${c.total_cost_usd.toFixed(4)}`,
328
+ costPerIssue,
329
+ c.median_wall_time_s.toFixed(2),
330
+ c.tool_error_rate.toFixed(4),
331
+ deltaStr,
332
+ ].join('\t'));
333
+ }
334
+ lines.push('');
335
+ lines.push(`Total cost: $${agg.total_cost_usd.toFixed(4)}`);
336
+ return lines.join('\n');
337
+ }
338
+ /**
339
+ * Parse a duration string like "30d", "12h", "45m", "90s" into milliseconds.
340
+ * Returns undefined when the input is empty or unparseable.
341
+ */
342
+ export function parseDuration(input) {
343
+ if (!input)
344
+ return undefined;
345
+ const match = /^(\d+)([smhd])$/.exec(input.trim());
346
+ if (!match)
347
+ return undefined;
348
+ const n = parseInt(match[1], 10);
349
+ const unit = match[2];
350
+ const mult = unit === 's' ? 1000 : unit === 'm' ? 60_000 : unit === 'h' ? 3_600_000 : 86_400_000;
351
+ return n * mult;
352
+ }
353
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/lib/telemetry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { Config } from './config.js';
2
+ import type { Issue } from './github.js';
3
+ export type EpicFindingVerdict = 'met' | 'partial' | 'missing' | 'unclear';
4
+ export type EpicOverallVerdict = 'pass' | 'partial' | 'fail';
5
+ export type EpicFinding = {
6
+ issueNum: number;
7
+ criterion: string;
8
+ verdict: EpicFindingVerdict;
9
+ notes?: string;
10
+ };
11
+ export type EpicVerdict = {
12
+ verdict: EpicOverallVerdict;
13
+ summary: string;
14
+ findings: EpicFinding[];
15
+ };
16
+ export type VerifyEpicInput = {
17
+ epic: Issue;
18
+ subIssues: Issue[];
19
+ /** Parallel to subIssues — null entries indicate sub-issues without a merged PR. */
20
+ mergedPRUrls: Array<string | null>;
21
+ };
22
+ export type VerifyEpicResult = {
23
+ verdict: EpicOverallVerdict;
24
+ comment: string;
25
+ parsed: EpicVerdict;
26
+ };
27
+ /**
28
+ * Run the verification pass. If any sub-issue has no merged PR, the overall
29
+ * verdict is capped at `partial`.
30
+ */
31
+ export declare function verifyEpic(input: VerifyEpicInput, config: Config, logsDir: string): Promise<VerifyEpicResult>;
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Epic verification pass — runs after all sub-issues of an epic have shipped.
3
+ *
4
+ * The agent is given the epic body (with its acceptance criteria), each
5
+ * sub-issue body (with its own AC checklist), and the merged PR diffs.
6
+ * It emits a structured {@link EpicVerdict} JSON block rating each
7
+ * sub-issue's AC against what actually landed.
8
+ *
9
+ * Permissive `--verify-only` mode: sub-issues without a merged PR are reported
10
+ * as `skipped` in the comment; the overall verdict caps at `partial` in that
11
+ * case (we can't declare `pass` without full coverage).
12
+ */
13
+ import { spawnAgent } from './agent.js';
14
+ import { log } from './logger.js';
15
+ import { ghExec } from './rate-limit.js';
16
+ /** Max chars of a single PR diff to include in the prompt. Mirrors pipeline.ts. */
17
+ const MAX_DIFF_CHARS = 10_000;
18
+ const DEFAULT_VERDICT = {
19
+ verdict: 'partial',
20
+ summary: 'Verification output could not be parsed; defaulting to partial.',
21
+ findings: [],
22
+ };
23
+ /**
24
+ * Extract a pr number from a github PR URL like
25
+ * `https://github.com/owner/repo/pull/42`.
26
+ */
27
+ function prNumberFromUrl(url) {
28
+ const m = url.match(/\/pull\/(\d+)(?:\D|$)/);
29
+ return m ? parseInt(m[1], 10) : null;
30
+ }
31
+ function fetchPRDiff(repo, prUrl) {
32
+ const prNum = prNumberFromUrl(prUrl);
33
+ if (prNum === null)
34
+ return '';
35
+ const result = ghExec(`gh pr diff ${prNum} --repo "${repo}"`);
36
+ if (result.exitCode !== 0)
37
+ return '';
38
+ const diff = result.stdout;
39
+ return diff.length > MAX_DIFF_CHARS
40
+ ? diff.slice(0, MAX_DIFF_CHARS) + '\n\n... (diff truncated)'
41
+ : diff;
42
+ }
43
+ /** Extract the last fenced ```json block from agent output, or a trailing JSON object. */
44
+ function extractJsonBlock(output) {
45
+ const fence = /```json\s*([\s\S]*?)\s*```/gi;
46
+ let lastMatch = null;
47
+ let m;
48
+ while ((m = fence.exec(output)) !== null)
49
+ lastMatch = m;
50
+ if (lastMatch)
51
+ return lastMatch[1];
52
+ const trailing = output.match(/\{[\s\S]*\}\s*$/);
53
+ return trailing ? trailing[0] : null;
54
+ }
55
+ function parseVerdict(output) {
56
+ const block = extractJsonBlock(output);
57
+ if (!block)
58
+ return DEFAULT_VERDICT;
59
+ try {
60
+ const parsed = JSON.parse(block);
61
+ const rawVerdict = String(parsed.verdict ?? '').toLowerCase();
62
+ const verdict = ['pass', 'partial', 'fail'].includes(rawVerdict)
63
+ ? rawVerdict
64
+ : 'partial';
65
+ const findings = Array.isArray(parsed.findings)
66
+ ? parsed.findings.flatMap((f) => {
67
+ const issueNum = Number(f.issueNum ?? f.issue ?? 0);
68
+ if (!Number.isFinite(issueNum) || issueNum <= 0)
69
+ return [];
70
+ const rawFindingVerdict = String(f.verdict ?? '').toLowerCase();
71
+ const findingVerdict = ['met', 'partial', 'missing', 'unclear'].includes(rawFindingVerdict)
72
+ ? rawFindingVerdict
73
+ : 'unclear';
74
+ return [
75
+ {
76
+ issueNum,
77
+ criterion: String(f.criterion ?? ''),
78
+ verdict: findingVerdict,
79
+ notes: f.notes ? String(f.notes) : undefined,
80
+ },
81
+ ];
82
+ })
83
+ : [];
84
+ return {
85
+ verdict,
86
+ summary: String(parsed.summary ?? ''),
87
+ findings,
88
+ };
89
+ }
90
+ catch {
91
+ return DEFAULT_VERDICT;
92
+ }
93
+ }
94
+ function buildPrompt(input, diffs) {
95
+ const lines = [
96
+ `You are verifying that epic #${input.epic.number} ("${input.epic.title}") has been met by its merged sub-issue PRs.`,
97
+ '',
98
+ `For each sub-issue, evaluate each acceptance-criterion checklist item against the merged PR diff.`,
99
+ `Return ONLY a JSON object (wrapped in a \`\`\`json code fence) matching this shape:`,
100
+ '',
101
+ '```json',
102
+ '{',
103
+ ' "verdict": "pass" | "partial" | "fail",',
104
+ ' "summary": "one-paragraph overall assessment",',
105
+ ' "findings": [',
106
+ ' { "issueNum": 123, "criterion": "quoted AC text", "verdict": "met" | "partial" | "missing" | "unclear", "notes": "why" }',
107
+ ' ]',
108
+ '}',
109
+ '```',
110
+ '',
111
+ 'Rules:',
112
+ '- `pass` only if every criterion on every evaluated sub-issue is `met`.',
113
+ '- `partial` if some are met and some are `partial`/`missing`/`unclear`.',
114
+ '- `fail` if a majority are `missing` or `unclear`.',
115
+ '- Sub-issues marked as "not yet merged" in the input are out of scope — do not include findings for them.',
116
+ '',
117
+ '---',
118
+ '',
119
+ `## Epic #${input.epic.number}: ${input.epic.title}`,
120
+ '',
121
+ input.epic.body.slice(0, 4000),
122
+ '',
123
+ '## Sub-issues',
124
+ '',
125
+ ];
126
+ for (let i = 0; i < input.subIssues.length; i++) {
127
+ const sub = input.subIssues[i];
128
+ const prUrl = input.mergedPRUrls[i];
129
+ lines.push(`### #${sub.number}: ${sub.title}`);
130
+ if (!prUrl) {
131
+ lines.push('*Not yet merged — skipped in this pass.*', '');
132
+ continue;
133
+ }
134
+ lines.push(`Merged PR: ${prUrl}`, '');
135
+ lines.push('#### Issue body');
136
+ lines.push(sub.body.slice(0, 3000), '');
137
+ const diff = diffs.get(sub.number) ?? '';
138
+ if (diff) {
139
+ lines.push('#### Merged diff');
140
+ lines.push('```diff');
141
+ lines.push(diff);
142
+ lines.push('```', '');
143
+ }
144
+ else {
145
+ lines.push('*(diff unavailable)*', '');
146
+ }
147
+ }
148
+ return lines.join('\n');
149
+ }
150
+ function formatComment(input, parsed, capped) {
151
+ const lines = [
152
+ '## Epic Verification',
153
+ '',
154
+ `**Overall:** ${parsed.verdict.toUpperCase()}${capped ? ' (capped — some sub-issues not yet merged)' : ''}`,
155
+ '',
156
+ ];
157
+ if (parsed.summary) {
158
+ lines.push(parsed.summary, '');
159
+ }
160
+ lines.push('| Sub-issue | PR | Status |', '|---|---|---|');
161
+ for (let i = 0; i < input.subIssues.length; i++) {
162
+ const sub = input.subIssues[i];
163
+ const prUrl = input.mergedPRUrls[i];
164
+ if (!prUrl) {
165
+ lines.push(`| #${sub.number} ${sub.title} | — | not yet merged |`);
166
+ continue;
167
+ }
168
+ const subFindings = parsed.findings.filter((f) => f.issueNum === sub.number);
169
+ const met = subFindings.filter((f) => f.verdict === 'met').length;
170
+ const total = subFindings.length;
171
+ const status = total === 0
172
+ ? 'evaluated'
173
+ : met === total
174
+ ? `pass (${met}/${total})`
175
+ : `partial (${met}/${total})`;
176
+ lines.push(`| #${sub.number} ${sub.title} | [PR](${prUrl}) | ${status} |`);
177
+ }
178
+ lines.push('');
179
+ if (parsed.findings.length > 0) {
180
+ lines.push('<details>', `<summary>Per-criterion findings (${parsed.findings.length})</summary>`, '');
181
+ for (const f of parsed.findings) {
182
+ const notes = f.notes ? ` — ${f.notes}` : '';
183
+ lines.push(`- #${f.issueNum} • **${f.verdict}** — ${f.criterion}${notes}`);
184
+ }
185
+ lines.push('', '</details>', '');
186
+ }
187
+ lines.push('---', '*Verified by alpha-loop*');
188
+ return lines.join('\n');
189
+ }
190
+ /**
191
+ * Run the verification pass. If any sub-issue has no merged PR, the overall
192
+ * verdict is capped at `partial`.
193
+ */
194
+ export async function verifyEpic(input, config, logsDir) {
195
+ // Fetch diffs for every sub-issue that has a merged PR.
196
+ const diffs = new Map();
197
+ for (let i = 0; i < input.subIssues.length; i++) {
198
+ const sub = input.subIssues[i];
199
+ const url = input.mergedPRUrls[i];
200
+ if (!url)
201
+ continue;
202
+ try {
203
+ diffs.set(sub.number, fetchPRDiff(config.repo, url));
204
+ }
205
+ catch (err) {
206
+ log.warn(`Could not fetch diff for sub-issue #${sub.number}: ${err instanceof Error ? err.message : err}`);
207
+ }
208
+ }
209
+ const prompt = buildPrompt(input, diffs);
210
+ const model = config.reviewModel || config.model;
211
+ log.step(`Verifying epic #${input.epic.number} (${input.subIssues.filter((_, i) => input.mergedPRUrls[i]).length}/${input.subIssues.length} sub-issues merged)`);
212
+ let parsed;
213
+ try {
214
+ const result = await spawnAgent({
215
+ agent: config.agent,
216
+ model,
217
+ prompt,
218
+ cwd: process.cwd(),
219
+ logFile: `${logsDir}/epic-${input.epic.number}-verify.log`,
220
+ verbose: config.verbose,
221
+ timeout: config.agentTimeout * 1000,
222
+ });
223
+ parsed = parseVerdict(result.output);
224
+ }
225
+ catch (err) {
226
+ log.warn(`Epic verification agent call failed: ${err instanceof Error ? err.message : err}`);
227
+ parsed = DEFAULT_VERDICT;
228
+ }
229
+ const hasUnmerged = input.mergedPRUrls.some((u) => !u);
230
+ let verdict = parsed.verdict;
231
+ if (hasUnmerged && verdict === 'pass') {
232
+ verdict = 'partial';
233
+ }
234
+ const comment = formatComment(input, { ...parsed, verdict }, hasUnmerged && parsed.verdict === 'pass');
235
+ return { verdict, comment, parsed: { ...parsed, verdict } };
236
+ }
237
+ //# sourceMappingURL=verify-epic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verify-epic.js","sourceRoot":"","sources":["../../src/lib/verify-epic.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bradtaylorsf/alpha-loop",
3
- "version": "1.13.1",
3
+ "version": "1.14.1",
4
4
  "description": "Agent-agnostic automated development loop: Plan → Build → Test → Review → Ship",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@9.0.0",