@bradtaylorsf/alpha-loop 1.4.2 → 1.5.0

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 (58) hide show
  1. package/README.md +136 -3
  2. package/dist/cli.js +73 -6
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/eval.d.ts +59 -4
  5. package/dist/commands/eval.js +370 -55
  6. package/dist/commands/eval.js.map +1 -1
  7. package/dist/commands/evolve.d.ts +43 -4
  8. package/dist/commands/evolve.js +444 -66
  9. package/dist/commands/evolve.js.map +1 -1
  10. package/dist/commands/init.js +3 -7
  11. package/dist/commands/init.js.map +1 -1
  12. package/dist/commands/plan.d.ts +11 -0
  13. package/dist/commands/plan.js +298 -0
  14. package/dist/commands/plan.js.map +1 -0
  15. package/dist/commands/roadmap.d.ts +9 -0
  16. package/dist/commands/roadmap.js +202 -0
  17. package/dist/commands/roadmap.js.map +1 -0
  18. package/dist/commands/triage.d.ts +9 -0
  19. package/dist/commands/triage.js +226 -0
  20. package/dist/commands/triage.js.map +1 -0
  21. package/dist/commands/vision.js +1 -0
  22. package/dist/commands/vision.js.map +1 -1
  23. package/dist/lib/config.d.ts +20 -0
  24. package/dist/lib/config.js +55 -0
  25. package/dist/lib/config.js.map +1 -1
  26. package/dist/lib/eval-checks.d.ts +11 -1
  27. package/dist/lib/eval-checks.js +39 -0
  28. package/dist/lib/eval-checks.js.map +1 -1
  29. package/dist/lib/eval-fixtures.d.ts +55 -0
  30. package/dist/lib/eval-fixtures.js +172 -0
  31. package/dist/lib/eval-fixtures.js.map +1 -0
  32. package/dist/lib/eval-runner.d.ts +26 -2
  33. package/dist/lib/eval-runner.js +202 -17
  34. package/dist/lib/eval-runner.js.map +1 -1
  35. package/dist/lib/eval-skill-bridge.d.ts +53 -0
  36. package/dist/lib/eval-skill-bridge.js +121 -0
  37. package/dist/lib/eval-skill-bridge.js.map +1 -0
  38. package/dist/lib/eval-swebench.d.ts +68 -0
  39. package/dist/lib/eval-swebench.js +274 -0
  40. package/dist/lib/eval-swebench.js.map +1 -0
  41. package/dist/lib/eval.d.ts +9 -1
  42. package/dist/lib/eval.js +27 -7
  43. package/dist/lib/eval.js.map +1 -1
  44. package/dist/lib/github.d.ts +46 -0
  45. package/dist/lib/github.js +179 -0
  46. package/dist/lib/github.js.map +1 -1
  47. package/dist/lib/pipeline.js +44 -2
  48. package/dist/lib/pipeline.js.map +1 -1
  49. package/dist/lib/planning.d.ts +91 -0
  50. package/dist/lib/planning.js +315 -0
  51. package/dist/lib/planning.js.map +1 -0
  52. package/dist/lib/prompts.d.ts +79 -0
  53. package/dist/lib/prompts.js +151 -2
  54. package/dist/lib/prompts.js.map +1 -1
  55. package/dist/lib/score.d.ts +24 -2
  56. package/dist/lib/score.js +162 -3
  57. package/dist/lib/score.js.map +1 -1
  58. package/package.json +2 -1
@@ -0,0 +1,202 @@
1
+ /**
2
+ * Roadmap command — analyze open GitHub issues and organize them into
3
+ * milestones using an AI agent, then create milestones and assign issues.
4
+ */
5
+ import { writeFileSync, unlinkSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { tmpdir } from 'node:os';
8
+ import { checkbox, confirm } from '@inquirer/prompts';
9
+ import { loadConfig, assertSafeShellArg } from '../lib/config.js';
10
+ import { buildOneShotCommand } from '../lib/agent.js';
11
+ import { buildRoadmapPrompt } from '../lib/prompts.js';
12
+ import { exec } from '../lib/shell.js';
13
+ import { log } from '../lib/logger.js';
14
+ import { extractJsonFromResponse, formatRoadmapTable, buildPlanningContext, } from '../lib/planning.js';
15
+ import { listOpenIssues, listMilestones, createMilestone, setIssueMilestone, addIssueToProject, } from '../lib/github.js';
16
+ /** Truncate issue bodies to stay within agent context limits. */
17
+ const MAX_BODY_CHARS = 500;
18
+ export async function roadmapCommand(options) {
19
+ const config = loadConfig({ dryRun: options.dryRun });
20
+ // ── Fetch open issues ──────────────────────────────────────────────────────
21
+ log.step('Fetching open issues...');
22
+ const issues = listOpenIssues(config.repo);
23
+ if (issues.length === 0) {
24
+ log.info('No open issues found. Nothing to organize.');
25
+ return;
26
+ }
27
+ log.info(`Found ${issues.length} open issue(s)`);
28
+ // ── Fetch existing milestones ─────────────────────────────────────────────
29
+ log.step('Fetching existing milestones...');
30
+ const existingMilestones = listMilestones(config.repo);
31
+ log.info(`Found ${existingMilestones.length} existing milestone(s)`);
32
+ // Build a map of issue number → current milestone title
33
+ // Note: listOpenIssues doesn't return milestone info, so we rely on the agent
34
+ // to include currentMilestone from its analysis. We pass milestone names for context.
35
+ // Truncate issue bodies
36
+ const truncatedIssues = issues.map((issue) => ({
37
+ number: issue.number,
38
+ title: issue.title,
39
+ body: issue.body.length > MAX_BODY_CHARS
40
+ ? issue.body.slice(0, MAX_BODY_CHARS) + '...'
41
+ : issue.body,
42
+ milestone: null,
43
+ }));
44
+ // ── Build context ──────────────────────────────────────────────────────────
45
+ const ctx = buildPlanningContext(config);
46
+ // ── AI analysis ────────────────────────────────────────────────────────────
47
+ log.step('Analyzing issues via AI agent...');
48
+ const roadmapPrompt = buildRoadmapPrompt({
49
+ issues: truncatedIssues,
50
+ milestones: existingMilestones.map((m) => ({
51
+ title: m.title,
52
+ description: m.description,
53
+ dueOn: m.dueOn,
54
+ })),
55
+ projectContext: ctx.projectContext,
56
+ visionContext: ctx.visionContext,
57
+ });
58
+ const safeModel = assertSafeShellArg(config.model, 'model');
59
+ const agentCmd = buildOneShotCommand(config.agent, safeModel);
60
+ const promptFile = join(tmpdir(), `alpha-loop-prompt-${Date.now()}`);
61
+ writeFileSync(promptFile, roadmapPrompt, 'utf-8');
62
+ let result;
63
+ try {
64
+ result = exec(`${agentCmd} < "${promptFile}" 2>/dev/null`, { cwd: process.cwd(), timeout: 10 * 60 * 1000 });
65
+ }
66
+ finally {
67
+ try {
68
+ unlinkSync(promptFile);
69
+ }
70
+ catch { /* cleanup best-effort */ }
71
+ }
72
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
73
+ log.error('Agent failed to analyze issues. Check agent configuration and try again.');
74
+ if (result.stderr)
75
+ log.error(result.stderr.slice(0, 500));
76
+ return;
77
+ }
78
+ let parsed;
79
+ try {
80
+ parsed = extractJsonFromResponse(result.stdout);
81
+ }
82
+ catch (err) {
83
+ log.error(`Failed to parse roadmap JSON: ${err.message}`);
84
+ log.error(`Agent response (first 500 chars): ${result.stdout.slice(0, 500)}`);
85
+ return;
86
+ }
87
+ if (!parsed.milestones || !parsed.assignments || parsed.assignments.length === 0) {
88
+ log.info('Agent returned no roadmap assignments.');
89
+ return;
90
+ }
91
+ // ── Display roadmap ────────────────────────────────────────────────────────
92
+ const existingTitles = existingMilestones.map((m) => m.title);
93
+ console.log('');
94
+ console.log(formatRoadmapTable(parsed.milestones, parsed.assignments, existingTitles));
95
+ console.log('');
96
+ const newMilestones = parsed.milestones.filter((m) => !existingTitles.includes(m.title));
97
+ log.info(`${newMilestones.length} new milestone(s), ${parsed.assignments.length} assignment(s)`);
98
+ // ── Dry run exit ───────────────────────────────────────────────────────────
99
+ if (options.dryRun) {
100
+ log.dry('Dry run — no changes will be made.');
101
+ return;
102
+ }
103
+ // ── Interactive review ─────────────────────────────────────────────────────
104
+ let selectedNums;
105
+ if (options.yes) {
106
+ selectedNums = parsed.assignments.filter((a) => a.selected).map((a) => a.issueNum);
107
+ log.info(`--yes: applying all ${selectedNums.length} milestone assignment(s)`);
108
+ }
109
+ else {
110
+ const choices = parsed.assignments.map((a) => {
111
+ const current = a.currentMilestone || 'unassigned';
112
+ return {
113
+ name: `#${a.issueNum} ${a.title} → ${a.milestone} [currently: ${current}]`,
114
+ value: a.issueNum,
115
+ checked: a.selected,
116
+ };
117
+ });
118
+ selectedNums = await checkbox({
119
+ message: 'Select assignments to apply:',
120
+ choices,
121
+ });
122
+ if (selectedNums.length === 0) {
123
+ log.info('No assignments selected.');
124
+ return;
125
+ }
126
+ const proceed = await confirm({
127
+ message: `Create ${newMilestones.length} milestone(s) and assign ${selectedNums.length} issue(s)?`,
128
+ });
129
+ if (!proceed) {
130
+ log.info('Cancelled.');
131
+ return;
132
+ }
133
+ }
134
+ // ── Execute ────────────────────────────────────────────────────────────────
135
+ const failures = [];
136
+ // Create new milestones and build title → number map
137
+ const milestoneNumMap = new Map();
138
+ // Seed map with existing milestones
139
+ for (const m of existingMilestones) {
140
+ milestoneNumMap.set(m.title, m.number);
141
+ }
142
+ // Create new milestones
143
+ let milestonesCreated = 0;
144
+ for (const ms of newMilestones) {
145
+ try {
146
+ const num = createMilestone(config.repo, ms.title, ms.description, ms.dueOn ?? undefined);
147
+ if (num > 0) {
148
+ milestoneNumMap.set(ms.title, num);
149
+ milestonesCreated++;
150
+ log.success(`Created milestone: ${ms.title}`);
151
+ }
152
+ else {
153
+ failures.push(`Milestone "${ms.title}": creation returned 0`);
154
+ }
155
+ }
156
+ catch (err) {
157
+ failures.push(`Milestone "${ms.title}": ${err.message}`);
158
+ }
159
+ }
160
+ // Assign issues to milestones
161
+ let assigned = 0;
162
+ for (const assignment of parsed.assignments) {
163
+ if (!selectedNums.includes(assignment.issueNum))
164
+ continue;
165
+ const msNum = milestoneNumMap.get(assignment.milestone);
166
+ if (!msNum) {
167
+ failures.push(`#${assignment.issueNum}: milestone "${assignment.milestone}" not found`);
168
+ continue;
169
+ }
170
+ try {
171
+ setIssueMilestone(config.repo, assignment.issueNum, msNum);
172
+ assigned++;
173
+ }
174
+ catch (err) {
175
+ failures.push(`#${assignment.issueNum}: ${err.message}`);
176
+ }
177
+ }
178
+ // Add untracked issues to project board if configured
179
+ if (config.project > 0) {
180
+ for (const assignment of parsed.assignments) {
181
+ if (!selectedNums.includes(assignment.issueNum))
182
+ continue;
183
+ try {
184
+ addIssueToProject(config.repoOwner, config.project, config.repo, assignment.issueNum);
185
+ }
186
+ catch {
187
+ // Project board add is best-effort
188
+ }
189
+ }
190
+ }
191
+ // ── Summary ────────────────────────────────────────────────────────────────
192
+ console.log('');
193
+ log.success(`Created ${milestonesCreated} milestone(s), assigned ${assigned} issue(s)`);
194
+ if (failures.length > 0) {
195
+ console.log('');
196
+ log.warn(`${failures.length} operation(s) failed:`);
197
+ for (const f of failures) {
198
+ console.log(` - ${f}`);
199
+ }
200
+ }
201
+ }
202
+ //# sourceMappingURL=roadmap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roadmap.js","sourceRoot":"","sources":["../../src/commands/roadmap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Triage command — analyze open GitHub issues for staleness, clarity, size,
3
+ * and duplicates using an AI agent, then apply user-selected fixes.
4
+ */
5
+ export type TriageOptions = {
6
+ dryRun?: boolean;
7
+ yes?: boolean;
8
+ };
9
+ export declare function triageCommand(options: TriageOptions): Promise<void>;
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Triage command — analyze open GitHub issues for staleness, clarity, size,
3
+ * and duplicates using an AI agent, then apply user-selected fixes.
4
+ */
5
+ import { writeFileSync, unlinkSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ import { tmpdir } from 'node:os';
8
+ import { checkbox, confirm } from '@inquirer/prompts';
9
+ import { loadConfig, assertSafeShellArg } from '../lib/config.js';
10
+ import { buildOneShotCommand } from '../lib/agent.js';
11
+ import { buildTriagePrompt } from '../lib/prompts.js';
12
+ import { exec } from '../lib/shell.js';
13
+ import { log } from '../lib/logger.js';
14
+ import { extractJsonFromResponse, formatTriageFindings, buildPlanningContext, } from '../lib/planning.js';
15
+ import { listOpenIssues, closeIssue, updateIssue, createIssue, commentIssue, getIssueComments, } from '../lib/github.js';
16
+ /** Truncate issue bodies to stay within agent context limits. */
17
+ const MAX_BODY_CHARS = 500;
18
+ export async function triageCommand(options) {
19
+ const config = loadConfig({ dryRun: options.dryRun });
20
+ // ── Fetch open issues ──────────────────────────────────────────────────────
21
+ log.step('Fetching open issues...');
22
+ const issues = listOpenIssues(config.repo);
23
+ if (issues.length === 0) {
24
+ log.info('No open issues found. Nothing to triage.');
25
+ return;
26
+ }
27
+ log.info(`Found ${issues.length} open issue(s)`);
28
+ // Fetch comments and truncate issue bodies for context
29
+ log.step('Fetching issue comments...');
30
+ const truncatedIssues = issues.map((issue) => {
31
+ const comments = getIssueComments(config.repo, issue.number);
32
+ return {
33
+ ...issue,
34
+ body: issue.body.length > MAX_BODY_CHARS
35
+ ? issue.body.slice(0, MAX_BODY_CHARS) + '...'
36
+ : issue.body,
37
+ comments: comments.slice(0, 5), // Cap at 5 most recent comments
38
+ };
39
+ });
40
+ // ── Build context ──────────────────────────────────────────────────────────
41
+ const ctx = buildPlanningContext(config);
42
+ // ── AI analysis ────────────────────────────────────────────────────────────
43
+ log.step('Analyzing issues via AI agent...');
44
+ const triagePrompt = buildTriagePrompt({
45
+ issues: truncatedIssues,
46
+ projectContext: ctx.projectContext,
47
+ visionContext: ctx.visionContext,
48
+ });
49
+ const safeModel = assertSafeShellArg(config.model, 'model');
50
+ const agentCmd = buildOneShotCommand(config.agent, safeModel);
51
+ const promptFile = join(tmpdir(), `alpha-loop-prompt-${Date.now()}`);
52
+ writeFileSync(promptFile, triagePrompt, 'utf-8');
53
+ let result;
54
+ try {
55
+ result = exec(`${agentCmd} < "${promptFile}" 2>/dev/null`, { cwd: process.cwd(), timeout: 10 * 60 * 1000 });
56
+ }
57
+ finally {
58
+ try {
59
+ unlinkSync(promptFile);
60
+ }
61
+ catch { /* cleanup best-effort */ }
62
+ }
63
+ if (result.exitCode !== 0 || !result.stdout.trim()) {
64
+ log.error('Agent failed to analyze issues. Check agent configuration and try again.');
65
+ if (result.stderr)
66
+ log.error(result.stderr.slice(0, 500));
67
+ return;
68
+ }
69
+ let findings;
70
+ try {
71
+ findings = extractJsonFromResponse(result.stdout);
72
+ }
73
+ catch (err) {
74
+ log.error(`Failed to parse triage JSON: ${err.message}`);
75
+ log.error(`Agent response (first 500 chars): ${result.stdout.slice(0, 500)}`);
76
+ return;
77
+ }
78
+ if (!Array.isArray(findings) || findings.length === 0) {
79
+ log.success('All issues look good — no triage actions needed.');
80
+ return;
81
+ }
82
+ // ── Display findings ───────────────────────────────────────────────────────
83
+ console.log('');
84
+ console.log(formatTriageFindings(findings));
85
+ console.log('');
86
+ log.info(`Found ${findings.length} issue(s) needing attention`);
87
+ // ── Dry run exit ───────────────────────────────────────────────────────────
88
+ if (options.dryRun) {
89
+ log.dry('Dry run — no changes will be made.');
90
+ return;
91
+ }
92
+ // ── Interactive review ─────────────────────────────────────────────────────
93
+ let selectedNums;
94
+ if (options.yes) {
95
+ selectedNums = findings.filter((f) => f.selected).map((f) => f.issueNum);
96
+ log.info(`--yes: applying all ${selectedNums.length} triage action(s)`);
97
+ }
98
+ else {
99
+ const actionLabels = {
100
+ close: 'Close as stale',
101
+ rewrite: 'Rewrite body',
102
+ split: 'Split into sub-issues',
103
+ merge: 'Close as duplicate',
104
+ enrich: 'Enrich with details',
105
+ };
106
+ const choices = findings.map((f) => ({
107
+ name: `[${actionLabels[f.action]}] #${f.issueNum} ${f.title} — ${f.reason.slice(0, 60)}`,
108
+ value: f.issueNum,
109
+ checked: f.selected,
110
+ }));
111
+ selectedNums = await checkbox({
112
+ message: 'Select actions to apply:',
113
+ choices,
114
+ });
115
+ if (selectedNums.length === 0) {
116
+ log.info('No actions selected.');
117
+ return;
118
+ }
119
+ const proceed = await confirm({
120
+ message: `Apply ${selectedNums.length} change(s)?`,
121
+ });
122
+ if (!proceed) {
123
+ log.info('Cancelled.');
124
+ return;
125
+ }
126
+ }
127
+ // ── Execute actions ────────────────────────────────────────────────────────
128
+ const failures = [];
129
+ let applied = 0;
130
+ for (const finding of findings) {
131
+ if (!selectedNums.includes(finding.issueNum))
132
+ continue;
133
+ try {
134
+ switch (finding.category) {
135
+ case 'stale': {
136
+ commentIssue(config.repo, finding.issueNum, `Closing as stale: ${finding.reason}\n\n_Triaged by alpha-loop._`);
137
+ closeIssue(config.repo, finding.issueNum, 'not_planned');
138
+ log.success(`Closed stale issue #${finding.issueNum}`);
139
+ applied++;
140
+ break;
141
+ }
142
+ case 'unclear': {
143
+ if (finding.rewrittenBody) {
144
+ // Preserve original body in a collapsed block
145
+ const original = issues.find((i) => i.number === finding.issueNum)?.body;
146
+ const preserved = original
147
+ ? `<details><summary>Original description</summary>\n\n${original}\n\n</details>\n\n`
148
+ : '';
149
+ updateIssue(config.repo, finding.issueNum, { body: preserved + finding.rewrittenBody });
150
+ commentIssue(config.repo, finding.issueNum, '_Issue rewritten by alpha-loop triage. Original description preserved above._');
151
+ log.success(`Rewrote body for #${finding.issueNum}`);
152
+ applied++;
153
+ }
154
+ else {
155
+ log.warn(`No rewritten body for #${finding.issueNum}, skipping`);
156
+ }
157
+ break;
158
+ }
159
+ case 'too_large': {
160
+ if (finding.splitInto && finding.splitInto.length > 0) {
161
+ const createdNums = [];
162
+ for (const subTitle of finding.splitInto) {
163
+ const num = createIssue(config.repo, subTitle, `Split from #${finding.issueNum}`, ['enhancement']);
164
+ if (num > 0) {
165
+ createdNums.push(num);
166
+ log.success(`Created sub-issue #${num}: ${subTitle}`);
167
+ }
168
+ else {
169
+ failures.push(`Sub-issue "${subTitle}": creation returned 0`);
170
+ }
171
+ }
172
+ if (createdNums.length > 0) {
173
+ const links = createdNums.map((n) => `- #${n}`).join('\n');
174
+ commentIssue(config.repo, finding.issueNum, `Split into smaller issues:\n${links}\n\n_Triaged by alpha-loop._`);
175
+ closeIssue(config.repo, finding.issueNum, 'completed');
176
+ log.success(`Closed #${finding.issueNum} after splitting`);
177
+ applied++;
178
+ }
179
+ }
180
+ else {
181
+ log.warn(`No split suggestions for #${finding.issueNum}, skipping`);
182
+ }
183
+ break;
184
+ }
185
+ case 'duplicate': {
186
+ if (finding.duplicateOf != null) {
187
+ commentIssue(config.repo, finding.issueNum, `Closing as duplicate of #${finding.duplicateOf}.\n\n_Triaged by alpha-loop._`);
188
+ closeIssue(config.repo, finding.issueNum, 'not_planned');
189
+ log.success(`Closed duplicate #${finding.issueNum} (duplicate of #${finding.duplicateOf})`);
190
+ applied++;
191
+ }
192
+ else {
193
+ log.warn(`No duplicate reference for #${finding.issueNum}, skipping`);
194
+ }
195
+ break;
196
+ }
197
+ case 'enrich': {
198
+ if (finding.enrichedBody) {
199
+ updateIssue(config.repo, finding.issueNum, { body: finding.enrichedBody });
200
+ commentIssue(config.repo, finding.issueNum, '_Issue enriched by alpha-loop triage. Original description preserved in collapsed block above._');
201
+ log.success(`Enriched #${finding.issueNum}`);
202
+ applied++;
203
+ }
204
+ else {
205
+ log.warn(`No enriched body for #${finding.issueNum}, skipping`);
206
+ }
207
+ break;
208
+ }
209
+ }
210
+ }
211
+ catch (err) {
212
+ failures.push(`#${finding.issueNum}: ${err.message}`);
213
+ }
214
+ }
215
+ // ── Summary ────────────────────────────────────────────────────────────────
216
+ console.log('');
217
+ log.success(`Applied ${applied} triage action(s)`);
218
+ if (failures.length > 0) {
219
+ console.log('');
220
+ log.warn(`${failures.length} operation(s) failed:`);
221
+ for (const f of failures) {
222
+ console.log(` - ${f}`);
223
+ }
224
+ }
225
+ }
226
+ //# sourceMappingURL=triage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"triage.js","sourceRoot":"","sources":["../../src/commands/triage.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ const PRIORITIES = {
29
29
  '4': 'Security and compliance \u2014 harden, audit, meet regulatory requirements',
30
30
  };
31
31
  export async function visionCommand() {
32
+ log.warn('vision is deprecated — use "alpha-loop plan" instead');
32
33
  if (!process.stdin.isTTY) {
33
34
  log.info('Not running in an interactive terminal. Skipping vision setup.');
34
35
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/commands/vision.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vision.js","sourceRoot":"","sources":["../../src/commands/vision.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,15 @@ export type ModelPricing = {
3
3
  input: number;
4
4
  output: number;
5
5
  };
6
+ /** The pipeline steps that support per-step agent/model overrides. */
7
+ export type PipelineStepName = 'plan' | 'implement' | 'test_fix' | 'review' | 'verify' | 'learn';
8
+ /** Per-step agent/model override. */
9
+ export type StepConfig = {
10
+ agent?: string;
11
+ model?: string;
12
+ };
13
+ /** Per-step pipeline configuration. */
14
+ export type PipelineConfig = Partial<Record<PipelineStepName, StepConfig>>;
6
15
  /**
7
16
  * Estimate cost in USD from token counts and a pricing table.
8
17
  * Returns 0 if the model is not in the pricing table.
@@ -52,8 +61,19 @@ export type Config = {
52
61
  skipPostSessionSecurity: boolean;
53
62
  /** Per-model pricing table (cost per million tokens). */
54
63
  pricing: Record<string, ModelPricing>;
64
+ /** Per-step agent/model overrides. */
65
+ pipeline: PipelineConfig;
55
66
  };
56
67
  /** Validate a string contains only safe shell characters. Empty strings are allowed (model is optional). */
57
68
  export declare function assertSafeShellArg(value: string, name: string): string;
58
69
  export declare function detectRepo(): string | null;
59
70
  export declare function loadConfig(overrides?: Partial<Config>): Config;
71
+ /**
72
+ * Resolve the agent and model for a specific pipeline step.
73
+ * Checks pipeline[step] overrides first, then falls back to top-level config.
74
+ * For 'review', falls back to reviewModel before model.
75
+ */
76
+ export declare function resolveStepConfig(config: Config, step: PipelineStepName): {
77
+ agent: string;
78
+ model: string;
79
+ };
@@ -55,7 +55,12 @@ const DEFAULTS = {
55
55
  'claude-sonnet-4-6': { input: 3.0, output: 15.0 },
56
56
  'claude-haiku-4-5': { input: 0.80, output: 4.0 },
57
57
  'codex-mini': { input: 1.50, output: 6.0 },
58
+ 'gpt-4o': { input: 2.50, output: 10.0 },
59
+ 'gpt-4o-mini': { input: 0.15, output: 0.60 },
60
+ 'deepseek-v3': { input: 0.27, output: 1.10 },
61
+ 'gemini-2.5-flash': { input: 0.15, output: 0.60 },
58
62
  },
63
+ pipeline: {},
59
64
  };
60
65
  /** Map from YAML key (snake_case) to Config key (camelCase). */
61
66
  const YAML_KEY_MAP = {
@@ -94,6 +99,7 @@ const YAML_KEY_MAP = {
94
99
  skip_eval: 'skipEval',
95
100
  eval_timeout: 'evalTimeout',
96
101
  auto_capture: 'autoCapture',
102
+ pipeline: 'pipeline',
97
103
  };
98
104
  /** Map from env var name to Config key. */
99
105
  const ENV_KEY_MAP = {
@@ -183,6 +189,28 @@ function loadYamlConfig(configPath) {
183
189
  result[configKey] = parsed[yamlKey];
184
190
  }
185
191
  }
192
+ // Handle pipeline nested config (per-step agent/model overrides)
193
+ if (parsed.pipeline && typeof parsed.pipeline === 'object') {
194
+ const pipelineRaw = parsed.pipeline;
195
+ const pipeline = {};
196
+ const validSteps = ['plan', 'implement', 'test_fix', 'review', 'verify', 'learn'];
197
+ for (const step of validSteps) {
198
+ const entry = pipelineRaw[step];
199
+ if (entry && typeof entry === 'object') {
200
+ const e = entry;
201
+ const stepCfg = {};
202
+ if (typeof e.agent === 'string')
203
+ stepCfg.agent = e.agent;
204
+ if (typeof e.model === 'string')
205
+ stepCfg.model = e.model;
206
+ if (Object.keys(stepCfg).length > 0)
207
+ pipeline[step] = stepCfg;
208
+ }
209
+ }
210
+ if (Object.keys(pipeline).length > 0) {
211
+ result.pipeline = pipeline;
212
+ }
213
+ }
186
214
  // Handle post_session nested config
187
215
  if (parsed.post_session && typeof parsed.post_session === 'object') {
188
216
  const ps = parsed.post_session;
@@ -232,6 +260,18 @@ export function loadConfig(overrides) {
232
260
  ...yamlConfig.pricing,
233
261
  ...overrides?.pricing,
234
262
  };
263
+ // Pipeline is merged specially: overrides extend YAML rather than replacing
264
+ const mergedPipeline = {};
265
+ const allSteps = new Set([
266
+ ...Object.keys(yamlConfig.pipeline ?? {}),
267
+ ...Object.keys(overrides?.pipeline ?? {}),
268
+ ]);
269
+ for (const step of allSteps) {
270
+ mergedPipeline[step] = {
271
+ ...(yamlConfig.pipeline?.[step] ?? {}),
272
+ ...(overrides?.pipeline?.[step] ?? {}),
273
+ };
274
+ }
235
275
  const merged = {
236
276
  ...DEFAULTS,
237
277
  ...autoDetect,
@@ -239,6 +279,7 @@ export function loadConfig(overrides) {
239
279
  ...envConfig,
240
280
  ...overrides,
241
281
  pricing: mergedPricing,
282
+ pipeline: mergedPipeline,
242
283
  };
243
284
  // Validate agent is a known value
244
285
  const VALID_AGENTS = ['claude', 'codex', 'opencode'];
@@ -251,4 +292,18 @@ export function loadConfig(overrides) {
251
292
  }
252
293
  return merged;
253
294
  }
295
+ /**
296
+ * Resolve the agent and model for a specific pipeline step.
297
+ * Checks pipeline[step] overrides first, then falls back to top-level config.
298
+ * For 'review', falls back to reviewModel before model.
299
+ */
300
+ export function resolveStepConfig(config, step) {
301
+ const stepOverride = config.pipeline[step];
302
+ const agent = stepOverride?.agent ?? config.agent;
303
+ const fallbackModel = step === 'review'
304
+ ? (config.reviewModel || config.model)
305
+ : config.model;
306
+ const model = stepOverride?.model ?? fallbackModel;
307
+ return { agent, model };
308
+ }
254
309
  //# sourceMappingURL=config.js.map