@bradtaylorsf/alpha-loop 1.4.3 → 1.6.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 (40) hide show
  1. package/README.md +57 -2
  2. package/dist/cli.js +33 -2
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/init.js +3 -7
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/plan.d.ts +11 -0
  7. package/dist/commands/plan.js +298 -0
  8. package/dist/commands/plan.js.map +1 -0
  9. package/dist/commands/roadmap.d.ts +9 -0
  10. package/dist/commands/roadmap.js +202 -0
  11. package/dist/commands/roadmap.js.map +1 -0
  12. package/dist/commands/run.d.ts +2 -0
  13. package/dist/commands/run.js +80 -33
  14. package/dist/commands/run.js.map +1 -1
  15. package/dist/commands/triage.d.ts +9 -0
  16. package/dist/commands/triage.js +226 -0
  17. package/dist/commands/triage.js.map +1 -0
  18. package/dist/commands/vision.js +1 -0
  19. package/dist/commands/vision.js.map +1 -1
  20. package/dist/lib/config.d.ts +4 -0
  21. package/dist/lib/config.js +6 -0
  22. package/dist/lib/config.js.map +1 -1
  23. package/dist/lib/github.d.ts +46 -0
  24. package/dist/lib/github.js +180 -1
  25. package/dist/lib/github.js.map +1 -1
  26. package/dist/lib/pipeline.d.ts +12 -0
  27. package/dist/lib/pipeline.js +537 -2
  28. package/dist/lib/pipeline.js.map +1 -1
  29. package/dist/lib/planning.d.ts +91 -0
  30. package/dist/lib/planning.js +315 -0
  31. package/dist/lib/planning.js.map +1 -0
  32. package/dist/lib/prompts.d.ts +118 -0
  33. package/dist/lib/prompts.js +270 -2
  34. package/dist/lib/prompts.js.map +1 -1
  35. package/dist/lib/session.d.ts +1 -1
  36. package/dist/lib/session.js +7 -4
  37. package/dist/lib/session.js.map +1 -1
  38. package/dist/lib/traces.d.ts +2 -0
  39. package/dist/lib/traces.js.map +1 -1
  40. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/lib/github.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../../src/lib/github.ts"],"names":[],"mappings":"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"}
@@ -60,3 +60,15 @@ export type PipelineResult = {
60
60
  * review → PR → learnings → update → auto-merge → cleanup
61
61
  */
62
62
  export declare function processIssue(issueNum: number, title: string, body: string, config: Config, session: SessionContext): Promise<PipelineResult>;
63
+ /**
64
+ * Process a batch of issues through a single plan → implement → test → review cycle.
65
+ * Instead of spawning separate agents per issue, combines all issues into one prompt
66
+ * for each stage, dramatically reducing agent spin-up and context loading overhead.
67
+ *
68
+ * After the batch completes, each issue is individually updated with labels, comments, and PR.
69
+ */
70
+ export declare function processBatch(issues: Array<{
71
+ number: number;
72
+ title: string;
73
+ body: string;
74
+ }>, config: Config, session: SessionContext): Promise<PipelineResult[]>;
@@ -7,8 +7,8 @@ import { log } from './logger.js';
7
7
  import { exec } from './shell.js';
8
8
  import { spawnAgent } from './agent.js';
9
9
  import { setupWorktree, cleanupWorktree } from './worktree.js';
10
- import { assignIssue, labelIssue, commentIssue, createPR, mergePR, updateProjectStatus, } from './github.js';
11
- import { buildImplementPrompt, buildReviewPrompt } from './prompts.js';
10
+ import { assignIssue, labelIssue, commentIssue, createPR, mergePR, updateProjectStatus, getIssueComments, } from './github.js';
11
+ import { buildImplementPrompt, buildReviewPrompt, buildAssumptionsPrompt, buildBatchPlanPrompt, buildBatchImplementPrompt, buildBatchReviewPrompt, } from './prompts.js';
12
12
  import { runTests } from './testing.js';
13
13
  import { runVerify } from './verify.js';
14
14
  import { extractLearnings, getLearningContext } from './learning.js';
@@ -322,6 +322,14 @@ Rules:
322
322
  else {
323
323
  log.dry('Would run planning agent');
324
324
  }
325
+ // --- Step 3b: Fetch issue comments for full context ---
326
+ let issueComments = [];
327
+ if (!config.dryRun) {
328
+ issueComments = getIssueComments(config.repo, issueNum);
329
+ if (issueComments.length > 0) {
330
+ log.info(`Loaded ${issueComments.length} comment(s) from issue #${issueNum}`);
331
+ }
332
+ }
325
333
  // --- Step 4: Implement ---
326
334
  log.step('Step 4: Implementing');
327
335
  if (!config.dryRun) {
@@ -334,6 +342,7 @@ Rules:
334
342
  issueNum,
335
343
  title,
336
344
  body,
345
+ comments: issueComments.length > 0 ? issueComments : undefined,
337
346
  planContent: plan.implementation || undefined,
338
347
  visionContext: visionContext ?? undefined,
339
348
  projectContext: projectContext ?? undefined,
@@ -466,6 +475,7 @@ Rules:
466
475
  issueNum,
467
476
  title,
468
477
  body,
478
+ comments: issueComments.length > 0 ? issueComments : undefined,
469
479
  baseBranch: config.baseBranch,
470
480
  visionContext: loadFileIfExists(join(projectDir, '.alpha-loop', 'vision.md')) ?? undefined,
471
481
  });
@@ -661,6 +671,38 @@ Rules:
661
671
  else {
662
672
  log.dry('Would create PR');
663
673
  }
674
+ // --- Step 8b: Post assumptions/decisions comment ---
675
+ if (!config.dryRun && prUrl) {
676
+ try {
677
+ const assumptionsDiff = exec(`git diff "origin/${config.baseBranch}...HEAD"`, { cwd: worktreePath });
678
+ const reviewSummary = reviewGate.summary || 'No review findings';
679
+ const assumptionsPrompt = buildAssumptionsPrompt({
680
+ issueNum,
681
+ title,
682
+ body,
683
+ diff: assumptionsDiff.stdout,
684
+ reviewSummary,
685
+ });
686
+ tracePrompt(session.name, issueNum, 'assumptions', assumptionsPrompt);
687
+ const assumptionsResult = await spawnAgent({
688
+ agent: config.agent,
689
+ model: config.model,
690
+ prompt: assumptionsPrompt,
691
+ cwd: worktreePath,
692
+ logFile: join(session.logsDir, `issue-${issueNum}-assumptions.log`),
693
+ verbose: config.verbose,
694
+ });
695
+ traceOutput(session.name, issueNum, 'assumptions', assumptionsResult.output);
696
+ stepCosts.push(buildStepCost('assumptions', issueNum, assumptionsResult, config));
697
+ if (assumptionsResult.exitCode === 0 && assumptionsResult.output.trim()) {
698
+ commentIssue(config.repo, issueNum, `## AI Implementation Notes\n\n${assumptionsResult.output.trim()}\n\n---\n_Posted by alpha-loop for user validation._`);
699
+ log.success('Posted assumptions/decisions comment');
700
+ }
701
+ }
702
+ catch (err) {
703
+ log.warn(`Failed to post assumptions comment: ${err}`);
704
+ }
705
+ }
664
706
  // --- Step 9: Extract learnings ---
665
707
  log.step('Step 9: Extracting learnings');
666
708
  const duration = Math.round((Date.now() - startTime) / 1000);
@@ -802,6 +844,459 @@ Rules:
802
844
  log.info(`PR: ${prUrl}`);
803
845
  return result;
804
846
  }
847
+ /**
848
+ * Process a batch of issues through a single plan → implement → test → review cycle.
849
+ * Instead of spawning separate agents per issue, combines all issues into one prompt
850
+ * for each stage, dramatically reducing agent spin-up and context loading overhead.
851
+ *
852
+ * After the batch completes, each issue is individually updated with labels, comments, and PR.
853
+ */
854
+ export async function processBatch(issues, config, session) {
855
+ const startTime = Date.now();
856
+ const projectDir = process.cwd();
857
+ const stepCosts = [];
858
+ const stepsCompleted = [];
859
+ const issueNums = issues.map((i) => i.number);
860
+ mkdirSync(session.logsDir, { recursive: true });
861
+ const logFile = join(session.logsDir, `batch-${issueNums.join('-')}.log`);
862
+ log.step(`Batch processing ${issues.length} issues: ${issueNums.map((n) => `#${n}`).join(', ')}`);
863
+ // --- Step 1: Update all issue statuses ---
864
+ log.step('Batch Step 1: Updating issue statuses');
865
+ if (!config.dryRun) {
866
+ for (const issue of issues) {
867
+ updateProjectStatus(config.repo, config.project, config.repoOwner, issue.number, 'In progress');
868
+ labelIssue(config.repo, issue.number, 'in-progress', config.labelReady);
869
+ assignIssue(config.repo, issue.number, '@me');
870
+ }
871
+ }
872
+ // --- Step 2: Setup single worktree for the batch ---
873
+ log.step('Batch Step 2: Setting up worktree');
874
+ const batchId = issueNums.join('-');
875
+ let worktreePath;
876
+ let worktreeBranch;
877
+ try {
878
+ const wt = await setupWorktree({
879
+ issueNum: issues[0].number, // Use first issue number for branch naming
880
+ projectDir,
881
+ baseBranch: config.baseBranch,
882
+ sessionBranch: session.branch,
883
+ autoMerge: config.autoMerge,
884
+ skipInstall: config.skipInstall,
885
+ setupCommand: config.setupCommand,
886
+ dryRun: config.dryRun,
887
+ });
888
+ worktreePath = wt.path;
889
+ worktreeBranch = wt.branch;
890
+ }
891
+ catch (err) {
892
+ log.error(`Failed to set up worktree for batch: ${err}`);
893
+ return issues.map((i) => failureResult(i.number, i.title, startTime, 'permanent'));
894
+ }
895
+ // --- Step 3: Fetch comments for all issues ---
896
+ const issueComments = new Map();
897
+ if (!config.dryRun) {
898
+ for (const issue of issues) {
899
+ const comments = getIssueComments(config.repo, issue.number);
900
+ if (comments.length > 0) {
901
+ issueComments.set(issue.number, comments);
902
+ log.info(`Loaded ${comments.length} comment(s) from issue #${issue.number}`);
903
+ }
904
+ }
905
+ }
906
+ // Build BatchIssue array with comments
907
+ const batchIssues = issues.map((i) => ({
908
+ issueNum: i.number,
909
+ title: i.title,
910
+ body: i.body,
911
+ comments: issueComments.get(i.number)?.map((c) => ({
912
+ author: c.author,
913
+ body: c.body,
914
+ createdAt: c.createdAt,
915
+ })),
916
+ }));
917
+ // --- Step 4: Batch plan ---
918
+ log.step('Batch Step 3: Planning all issues');
919
+ const plans = new Map();
920
+ if (!config.dryRun) {
921
+ try {
922
+ const planPrompt = buildBatchPlanPrompt({ issues: batchIssues });
923
+ tracePrompt(session.name, issues[0].number, 'batch-plan', planPrompt);
924
+ const planResult = await spawnAgent({
925
+ agent: config.agent,
926
+ model: config.model,
927
+ prompt: planPrompt,
928
+ cwd: worktreePath,
929
+ logFile: join(session.logsDir, `batch-plan.log`),
930
+ verbose: config.verbose,
931
+ });
932
+ traceOutput(session.name, issues[0].number, 'batch-plan', planResult.output);
933
+ stepCosts.push(buildStepCost('plan', issues[0].number, planResult, config));
934
+ if (planResult.exitCode !== 0 && isTransientError(planResult.output)) {
935
+ log.warn('Agent hit a transient error during batch planning — re-queuing all issues');
936
+ for (const issue of issues)
937
+ requeueIssue(config, issue.number);
938
+ await cleanupWorktree({ issueNum: issues[0].number, projectDir, autoCleanup: config.autoCleanup });
939
+ return issues.map((i) => failureResult(i.number, i.title, startTime, 'transient'));
940
+ }
941
+ // Read plan files for each issue
942
+ for (const issue of issues) {
943
+ const planFile = join(worktreePath, `plan-issue-${issue.number}.json`);
944
+ const planFileSession = join(session.logsDir, `plan-issue-${issue.number}.json`);
945
+ const plan = readPlan(planFile);
946
+ plans.set(issue.number, plan);
947
+ moveToSessionLogs(planFile, planFileSession);
948
+ if (plan.summary) {
949
+ log.success(`Plan #${issue.number}: ${plan.summary}`);
950
+ }
951
+ }
952
+ stepsCompleted.push('plan');
953
+ }
954
+ catch {
955
+ log.warn('Batch planning failed, using defaults for all issues');
956
+ }
957
+ }
958
+ // --- Step 5: Batch implement ---
959
+ log.step('Batch Step 4: Implementing all issues');
960
+ if (!config.dryRun) {
961
+ const visionContext = loadFileIfExists(join(projectDir, '.alpha-loop', 'vision.md'));
962
+ const projectContext = loadFileIfExists(join(projectDir, '.alpha-loop', 'context.md'));
963
+ const learningContext = getLearningContext(join(projectDir, '.alpha-loop', 'learnings'));
964
+ // Combine all plans into one content block
965
+ const allPlans = issues.map((i) => {
966
+ const plan = plans.get(i.number) ?? DEFAULT_PLAN;
967
+ return `### Plan for #${i.number}: ${i.title}\n${plan.implementation || '(no plan)'}`;
968
+ }).join('\n\n');
969
+ const implementPrompt = buildBatchImplementPrompt({
970
+ issues: batchIssues,
971
+ planContent: allPlans,
972
+ visionContext: visionContext ?? undefined,
973
+ projectContext: projectContext ?? undefined,
974
+ learningContext: learningContext || undefined,
975
+ });
976
+ tracePrompt(session.name, issues[0].number, 'batch-implement', implementPrompt);
977
+ const implResult = await spawnAgent({
978
+ agent: config.agent,
979
+ model: config.model,
980
+ prompt: implementPrompt,
981
+ cwd: worktreePath,
982
+ logFile: join(session.logsDir, `batch-implement.log`),
983
+ verbose: config.verbose,
984
+ });
985
+ traceOutput(session.name, issues[0].number, 'batch-implement', implResult.output);
986
+ stepCosts.push(buildStepCost('implement', issues[0].number, implResult, config));
987
+ if (implResult.exitCode !== 0) {
988
+ if (isTransientError(implResult.output)) {
989
+ log.warn('Agent hit a transient error during batch implementation — re-queuing');
990
+ for (const issue of issues)
991
+ requeueIssue(config, issue.number);
992
+ await cleanupWorktree({ issueNum: issues[0].number, projectDir, autoCleanup: config.autoCleanup });
993
+ return issues.map((i) => failureResult(i.number, i.title, startTime, 'transient'));
994
+ }
995
+ log.error('Batch implementation failed');
996
+ for (const issue of issues) {
997
+ labelIssue(config.repo, issue.number, 'failed', 'in-progress');
998
+ commentIssue(config.repo, issue.number, 'Agent loop failed during batch implementation. See logs.');
999
+ }
1000
+ await cleanupWorktree({ issueNum: issues[0].number, projectDir, autoCleanup: config.autoCleanup });
1001
+ return issues.map((i) => failureResult(i.number, i.title, startTime, 'permanent'));
1002
+ }
1003
+ // Auto-commit if agent didn't
1004
+ const statusResult = exec('git status --porcelain', { cwd: worktreePath });
1005
+ if (statusResult.stdout.trim()) {
1006
+ exec('git add -A', { cwd: worktreePath });
1007
+ const issueRefs = issues.map((i) => `#${i.number}`).join(', ');
1008
+ exec(`git commit -m "feat: batch implement issues ${issueRefs}"`, { cwd: worktreePath });
1009
+ }
1010
+ stepsCompleted.push('implement');
1011
+ // Capture implement diff
1012
+ try {
1013
+ const implDiff = exec(`git diff "origin/${config.baseBranch}...HEAD"`, { cwd: worktreePath });
1014
+ if (implDiff.stdout)
1015
+ traceDiff(session.name, issues[0].number, 'batch-implement', implDiff.stdout);
1016
+ }
1017
+ catch { /* non-fatal */ }
1018
+ }
1019
+ // --- Step 6: Test + retry loop ---
1020
+ log.step('Batch Step 5: Running tests');
1021
+ let testOutput = '';
1022
+ let testsPassing = false;
1023
+ // Check if any plan says testing is needed
1024
+ const anyTestsNeeded = issues.some((i) => (plans.get(i.number) ?? DEFAULT_PLAN).testing.needed);
1025
+ if (!anyTestsNeeded) {
1026
+ log.info('Tests skipped by all plans');
1027
+ testsPassing = true;
1028
+ testOutput = 'Tests skipped by plan';
1029
+ }
1030
+ for (let attempt = 1; testsPassing ? false : attempt <= config.maxTestRetries; attempt++) {
1031
+ log.info(`Test attempt ${attempt} of ${config.maxTestRetries}`);
1032
+ const testResult = runTests(worktreePath, config, logFile);
1033
+ testOutput = testResult.output;
1034
+ traceTest(session.name, issues[0].number, attempt, testOutput);
1035
+ if (testResult.passed) {
1036
+ testsPassing = true;
1037
+ stepsCompleted.push('test');
1038
+ log.success(`All tests passed on attempt ${attempt}`);
1039
+ break;
1040
+ }
1041
+ if (attempt < config.maxTestRetries) {
1042
+ log.warn(`Tests failed on attempt ${attempt}, invoking agent to fix...`);
1043
+ if (!config.dryRun) {
1044
+ const issueRefs = issues.map((i) => `#${i.number}`).join(', ');
1045
+ const fixPrompt = `Tests are failing for batch implementation (issues ${issueRefs}, attempt ${attempt} of ${config.maxTestRetries}). Fix the failing tests.\n\nTest output:\n${testOutput}\n\nInstructions:\n1. Read the failing test output carefully and identify the ROOT CAUSE\n2. Fix ONLY code related to the batch issues — do NOT modify test infrastructure\n3. Run the tests again to verify\n4. Commit your fixes with a descriptive message`;
1046
+ tracePrompt(session.name, issues[0].number, `batch-fix-${attempt}`, fixPrompt);
1047
+ const fixResult = await spawnAgent({
1048
+ agent: config.agent,
1049
+ model: config.model,
1050
+ prompt: fixPrompt,
1051
+ cwd: worktreePath,
1052
+ resume: true,
1053
+ logFile: join(session.logsDir, `batch-fix-${attempt}.log`),
1054
+ verbose: config.verbose,
1055
+ });
1056
+ traceOutput(session.name, issues[0].number, `batch-fix-${attempt}`, fixResult.output);
1057
+ stepCosts.push(buildStepCost('test_fix', issues[0].number, fixResult, config));
1058
+ const fixStatus = exec('git status --porcelain', { cwd: worktreePath });
1059
+ if (fixStatus.stdout.trim()) {
1060
+ exec('git add -A', { cwd: worktreePath });
1061
+ exec(`git commit -m "fix: resolve batch test failures (attempt ${attempt})"`, { cwd: worktreePath });
1062
+ }
1063
+ }
1064
+ }
1065
+ else {
1066
+ log.warn(`Tests still failing after ${config.maxTestRetries} attempts`);
1067
+ }
1068
+ }
1069
+ // --- Step 7: Batch review ---
1070
+ log.step('Batch Step 6: Code review');
1071
+ let reviewOutput = '';
1072
+ let reviewGate = DEFAULT_GATE;
1073
+ if (config.skipReview) {
1074
+ log.info('Code review skipped');
1075
+ }
1076
+ else if (!config.dryRun) {
1077
+ const reviewFileInWorktree = join(worktreePath, 'review-batch.json');
1078
+ const reviewFileInSession = join(session.logsDir, 'review-batch.json');
1079
+ for (let attempt = 1; attempt <= config.maxTestRetries; attempt++) {
1080
+ log.info(`Review attempt ${attempt} of ${config.maxTestRetries}`);
1081
+ try {
1082
+ const reviewPrompt = buildBatchReviewPrompt({
1083
+ issues: batchIssues,
1084
+ baseBranch: config.baseBranch,
1085
+ visionContext: loadFileIfExists(join(projectDir, '.alpha-loop', 'vision.md')) ?? undefined,
1086
+ });
1087
+ tracePrompt(session.name, issues[0].number, `batch-review${attempt > 1 ? `-${attempt}` : ''}`, reviewPrompt);
1088
+ const reviewResult = await spawnAgent({
1089
+ agent: config.agent,
1090
+ model: config.reviewModel,
1091
+ prompt: reviewPrompt,
1092
+ cwd: worktreePath,
1093
+ logFile: join(session.logsDir, `batch-review${attempt > 1 ? `-${attempt}` : ''}.log`),
1094
+ verbose: config.verbose,
1095
+ });
1096
+ traceOutput(session.name, issues[0].number, `batch-review${attempt > 1 ? `-${attempt}` : ''}`, reviewResult.output);
1097
+ stepCosts.push(buildStepCost('review', issues[0].number, reviewResult, config));
1098
+ reviewOutput = reviewResult.output;
1099
+ }
1100
+ catch {
1101
+ log.warn('Batch review failed, continuing without review');
1102
+ break;
1103
+ }
1104
+ reviewGate = readGateResult(reviewFileInWorktree);
1105
+ moveToSessionLogs(reviewFileInWorktree, reviewFileInSession);
1106
+ if (reviewGate.passed) {
1107
+ stepsCompleted.push('review');
1108
+ log.success(`Batch review passed: ${reviewGate.summary || 'no issues found'}`);
1109
+ break;
1110
+ }
1111
+ const unfixedCount = reviewGate.findings.filter((f) => !f.fixed).length;
1112
+ log.warn(`Review found ${unfixedCount} unfixed issue(s), sending back to implementer...`);
1113
+ if (attempt < config.maxTestRetries) {
1114
+ const findings = formatGateFindings(reviewGate, 'Code Review');
1115
+ const fixPrompt = `The code review for the batch found problems that need to be fixed.\n\n${findings}\n\nInstructions:\n1. Address each finding listed above\n2. Run tests to make sure nothing is broken\n3. Commit your fixes`;
1116
+ tracePrompt(session.name, issues[0].number, `batch-review-fix-${attempt}`, fixPrompt);
1117
+ const reviewFixResult = await spawnAgent({
1118
+ agent: config.agent,
1119
+ model: config.model,
1120
+ prompt: fixPrompt,
1121
+ cwd: worktreePath,
1122
+ resume: true,
1123
+ logFile: join(session.logsDir, `batch-review-fix-${attempt}.log`),
1124
+ verbose: config.verbose,
1125
+ });
1126
+ traceOutput(session.name, issues[0].number, `batch-review-fix-${attempt}`, reviewFixResult.output);
1127
+ stepCosts.push(buildStepCost('review', issues[0].number, reviewFixResult, config));
1128
+ const fixStatus = exec('git status --porcelain', { cwd: worktreePath });
1129
+ if (fixStatus.stdout.trim()) {
1130
+ exec('git add -A', { cwd: worktreePath });
1131
+ exec(`git commit -m "fix: address batch review findings (attempt ${attempt})"`, { cwd: worktreePath });
1132
+ }
1133
+ const retest = runTests(worktreePath, config, logFile);
1134
+ if (!retest.passed) {
1135
+ log.warn('Tests failed after review fixes');
1136
+ testOutput = retest.output;
1137
+ testsPassing = false;
1138
+ }
1139
+ }
1140
+ }
1141
+ }
1142
+ // --- Step 8: Create single PR for the batch ---
1143
+ log.step('Batch Step 7: Creating PR');
1144
+ let prUrl;
1145
+ if (!config.dryRun) {
1146
+ const prBase = config.autoMerge ? session.branch : config.baseBranch;
1147
+ const issueRefs = issues.map((i) => `#${i.number}`).join(', ');
1148
+ const prBody = buildBatchPRBody(issues.map((i) => ({ issueNum: i.number, title: i.title })), reviewGate, testOutput, testsPassing);
1149
+ try {
1150
+ prUrl = createPR({
1151
+ repo: config.repo,
1152
+ base: prBase,
1153
+ head: worktreeBranch,
1154
+ title: `feat: batch implementation (${issueRefs})`,
1155
+ body: prBody,
1156
+ cwd: worktreePath,
1157
+ });
1158
+ stepsCompleted.push('pr');
1159
+ log.success(`Batch PR created: ${prUrl}`);
1160
+ }
1161
+ catch (err) {
1162
+ log.error(`Failed to create batch PR: ${err}`);
1163
+ for (const issue of issues) {
1164
+ labelIssue(config.repo, issue.number, 'failed', 'in-progress');
1165
+ commentIssue(config.repo, issue.number, `Agent loop failed: could not create PR. Branch: ${worktreeBranch}`);
1166
+ }
1167
+ await cleanupWorktree({ issueNum: issues[0].number, projectDir, autoCleanup: config.autoCleanup });
1168
+ return issues.map((i) => failureResult(i.number, i.title, startTime, 'permanent'));
1169
+ }
1170
+ }
1171
+ // --- Step 9: Update each issue individually ---
1172
+ log.step('Batch Step 8: Updating individual issues');
1173
+ const duration = Math.round((Date.now() - startTime) / 1000);
1174
+ const perIssueDuration = Math.round(duration / issues.length);
1175
+ // Get diff for traces
1176
+ let runDiff = '';
1177
+ if (!config.dryRun) {
1178
+ const diffResult = exec(`git diff "origin/${config.baseBranch}...HEAD"`, { cwd: worktreePath });
1179
+ runDiff = diffResult.stdout.slice(0, MAX_DIFF_CHARS);
1180
+ }
1181
+ const filesChanged = runDiff ? (runDiff.match(/^diff --git/gm) ?? []).length : 0;
1182
+ const results = [];
1183
+ for (const issue of issues) {
1184
+ if (!config.dryRun) {
1185
+ const testsStatus = testsPassing ? 'PASSING' : 'FAILING';
1186
+ updateProjectStatus(config.repo, config.project, config.repoOwner, issue.number, 'In Review');
1187
+ labelIssue(config.repo, issue.number, 'in-review', 'in-progress');
1188
+ commentIssue(config.repo, issue.number, `Automated batch implementation complete.\n\n**PR**: ${prUrl ?? 'N/A'}\n**Tests**: ${testsStatus}\n**Batch**: ${issues.length} issues processed together\n\n---\n*Processed by alpha-loop batch mode in ${duration}s total*`);
1189
+ }
1190
+ const result = {
1191
+ issueNum: issue.number,
1192
+ title: issue.title,
1193
+ status: testsPassing ? 'success' : 'failure',
1194
+ prUrl,
1195
+ testsPassing,
1196
+ verifyPassing: true,
1197
+ verifySkipped: true,
1198
+ duration: perIssueDuration,
1199
+ filesChanged,
1200
+ };
1201
+ results.push(result);
1202
+ saveResult(session, result);
1203
+ // Write per-issue traces
1204
+ if (!config.dryRun) {
1205
+ try {
1206
+ const issueScoreResult = {
1207
+ issueNum: issue.number,
1208
+ status: testsPassing ? 'success' : 'failure',
1209
+ testsPassing,
1210
+ verifyPassing: true,
1211
+ verifySkipped: true,
1212
+ retries: 0,
1213
+ duration: perIssueDuration,
1214
+ filesChanged,
1215
+ stepsCompleted,
1216
+ };
1217
+ writeTraceMetadata(session.name, issue.number, {
1218
+ issueNum: issue.number,
1219
+ title: issue.title,
1220
+ status: testsPassing ? 'success' : 'failure',
1221
+ duration: perIssueDuration,
1222
+ retries: 0,
1223
+ testsPassing,
1224
+ verifyPassing: true,
1225
+ verifySkipped: true,
1226
+ filesChanged,
1227
+ prUrl,
1228
+ timestamp: new Date().toISOString(),
1229
+ agent: config.agent,
1230
+ model: config.model,
1231
+ batchMode: true,
1232
+ batchSize: issues.length,
1233
+ });
1234
+ }
1235
+ catch (err) {
1236
+ log.warn(`Failed to write traces for #${issue.number}: ${err}`);
1237
+ }
1238
+ }
1239
+ log.success(`Issue #${issue.number} updated`);
1240
+ }
1241
+ // Write aggregate scores and costs
1242
+ if (!config.dryRun) {
1243
+ try {
1244
+ const scoreResults = results.map((r) => ({
1245
+ issueNum: r.issueNum,
1246
+ status: r.status,
1247
+ testsPassing: r.testsPassing,
1248
+ verifyPassing: r.verifyPassing,
1249
+ verifySkipped: r.verifySkipped,
1250
+ retries: 0,
1251
+ duration: r.duration,
1252
+ filesChanged: r.filesChanged,
1253
+ stepsCompleted,
1254
+ }));
1255
+ writeScores(session.name, computeScores(scoreResults));
1256
+ writeCosts(session.name, computeCosts(stepCosts));
1257
+ // Config snapshot
1258
+ try {
1259
+ const configPath = join(projectDir, '.alpha-loop.yaml');
1260
+ if (existsSync(configPath)) {
1261
+ writeConfigSnapshot(session.name, readFileSync(configPath, 'utf-8'));
1262
+ }
1263
+ }
1264
+ catch { /* non-fatal */ }
1265
+ }
1266
+ catch (err) {
1267
+ log.warn(`Failed to write batch traces: ${err}`);
1268
+ }
1269
+ }
1270
+ // --- Step 10: Auto-merge ---
1271
+ if (config.autoMerge && !config.dryRun && prUrl) {
1272
+ log.step('Batch Step 9: Auto-merging PR');
1273
+ try {
1274
+ mergePR(config.repo, worktreeBranch);
1275
+ exec('git fetch origin', { cwd: projectDir });
1276
+ const currentBranch = exec('git rev-parse --abbrev-ref HEAD', { cwd: projectDir }).stdout;
1277
+ if (currentBranch !== session.branch) {
1278
+ exec(`git checkout "${session.branch}"`, { cwd: projectDir });
1279
+ }
1280
+ exec(`git pull origin "${session.branch}"`, { cwd: projectDir });
1281
+ }
1282
+ catch (err) {
1283
+ log.warn(`Auto-merge failed: ${err}`);
1284
+ }
1285
+ }
1286
+ // --- Step 11: Cleanup ---
1287
+ log.step('Batch Step 10: Cleanup');
1288
+ await cleanupWorktree({
1289
+ issueNum: issues[0].number,
1290
+ projectDir,
1291
+ autoCleanup: config.autoCleanup,
1292
+ dryRun: config.dryRun,
1293
+ });
1294
+ const successCount = results.filter((r) => r.status === 'success').length;
1295
+ log.success(`Batch complete: ${successCount}/${issues.length} issues succeeded in ${duration}s`);
1296
+ if (prUrl)
1297
+ log.info(`PR: ${prUrl}`);
1298
+ return results;
1299
+ }
805
1300
  function failureResult(issueNum, title, startTime, reason) {
806
1301
  return {
807
1302
  issueNum,
@@ -883,6 +1378,46 @@ function extractTestSummary(testOutput) {
883
1378
  parts.push(`${totalSkipped} skipped`);
884
1379
  return parts.join(', ');
885
1380
  }
1381
+ function buildBatchPRBody(issues, reviewGate, testOutput, testsPassing) {
1382
+ const testSummary = extractTestSummary(testOutput);
1383
+ const reviewStatus = reviewGate.passed ? 'PASS' : 'FAIL';
1384
+ const closesRefs = issues.map((i) => `Closes #${i.issueNum}`).join('\n');
1385
+ const lines = [
1386
+ closesRefs,
1387
+ '',
1388
+ '## Summary',
1389
+ '',
1390
+ `Batch implementation of ${issues.length} issues:`,
1391
+ ...issues.map((i) => `- **#${i.issueNum}**: ${i.title}`),
1392
+ '',
1393
+ '## Test Results',
1394
+ '',
1395
+ `| Check | Status |`,
1396
+ `|-------|--------|`,
1397
+ `| Unit tests | ${testsPassing ? 'PASS' : 'FAIL'} |`,
1398
+ `| Code review | ${reviewStatus} |`,
1399
+ ];
1400
+ if (testSummary) {
1401
+ lines.push(`| Details | ${testSummary} |`);
1402
+ }
1403
+ lines.push('');
1404
+ if (reviewGate.findings.length > 0) {
1405
+ lines.push('## Code Review', '');
1406
+ lines.push(reviewGate.summary || 'Review completed');
1407
+ lines.push('');
1408
+ for (const f of reviewGate.findings) {
1409
+ const status = f.fixed ? 'FIXED' : 'OPEN';
1410
+ const fileRef = f.file ? ` \`${f.file}\`` : '';
1411
+ lines.push(`- **${f.severity.toUpperCase()}** [${status}]${fileRef}: ${f.description}`);
1412
+ }
1413
+ lines.push('');
1414
+ }
1415
+ else {
1416
+ lines.push('## Code Review', '', reviewGate.summary || 'No issues found', '');
1417
+ }
1418
+ lines.push('---', `*Automated by [alpha-loop](https://github.com/bradtaylorsf/alpha-loop) · Batch mode · Full logs in \`.alpha-loop/sessions/\`*`);
1419
+ return lines.join('\n');
1420
+ }
886
1421
  function buildPRBody(issueNum, title, reviewGate, testOutput, testsPassing, verifyPassing, verifySkipped, body) {
887
1422
  const testSummary = extractTestSummary(testOutput);
888
1423
  const verifyStatus = verifySkipped ? 'SKIPPED' : verifyPassing ? 'PASS' : 'FAIL';