@bradtaylorsf/alpha-loop 1.0.0 → 1.1.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 (41) hide show
  1. package/README.md +34 -4
  2. package/dist/cli.js +25 -5
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/history.js +196 -93
  5. package/dist/commands/history.js.map +1 -1
  6. package/dist/commands/init.d.ts +1 -1
  7. package/dist/commands/init.js +163 -107
  8. package/dist/commands/init.js.map +1 -1
  9. package/dist/commands/resume.d.ts +8 -0
  10. package/dist/commands/resume.js +391 -0
  11. package/dist/commands/resume.js.map +1 -0
  12. package/dist/commands/review.d.ts +8 -0
  13. package/dist/commands/review.js +549 -0
  14. package/dist/commands/review.js.map +1 -0
  15. package/dist/commands/run.js +2 -2
  16. package/dist/commands/run.js.map +1 -1
  17. package/dist/commands/scan.d.ts +5 -0
  18. package/dist/commands/scan.js +129 -0
  19. package/dist/commands/scan.js.map +1 -1
  20. package/dist/commands/sync.d.ts +27 -3
  21. package/dist/commands/sync.js +222 -44
  22. package/dist/commands/sync.js.map +1 -1
  23. package/dist/lib/agent.d.ts +4 -0
  24. package/dist/lib/agent.js +43 -11
  25. package/dist/lib/agent.js.map +1 -1
  26. package/dist/lib/config.d.ts +1 -0
  27. package/dist/lib/config.js +2 -0
  28. package/dist/lib/config.js.map +1 -1
  29. package/dist/lib/github.d.ts +5 -0
  30. package/dist/lib/github.js +22 -2
  31. package/dist/lib/github.js.map +1 -1
  32. package/dist/lib/pipeline.js +19 -11
  33. package/dist/lib/pipeline.js.map +1 -1
  34. package/dist/lib/session.js +25 -5
  35. package/dist/lib/session.js.map +1 -1
  36. package/dist/lib/templates.d.ts +16 -0
  37. package/dist/lib/templates.js +59 -0
  38. package/dist/lib/templates.js.map +1 -0
  39. package/dist/lib/verify.js +18 -13
  40. package/dist/lib/verify.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Resume Command — pick up stranded work from a crashed or hung loop session.
3
+ *
4
+ * Finds local branches matching agent/issue-* that have commits ahead of
5
+ * origin/<baseBranch> but no corresponding open PR, then pushes, reviews,
6
+ * and opens a PR for each one. Also updates the session PR if one exists.
7
+ */
8
+ import { existsSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+ import { loadConfig } from '../lib/config.js';
11
+ import { log } from '../lib/logger.js';
12
+ import { exec } from '../lib/shell.js';
13
+ import { spawnAgent } from '../lib/agent.js';
14
+ import { buildReviewPrompt } from '../lib/prompts.js';
15
+ import { labelIssue, commentIssue, createPR, updateProjectStatus, } from '../lib/github.js';
16
+ /**
17
+ * Find local branches matching agent/issue-* that have no open PR and have
18
+ * commits ahead of the remote base branch.
19
+ */
20
+ function findStrandedBranches(baseBranch, filterIssue) {
21
+ const listResult = exec('git branch --list "agent/issue-*"');
22
+ if (listResult.exitCode !== 0 || !listResult.stdout.trim()) {
23
+ return [];
24
+ }
25
+ const branches = listResult.stdout
26
+ .split('\n')
27
+ .map((b) => b.trim().replace(/^\*\s*/, ''))
28
+ .filter(Boolean);
29
+ const stranded = [];
30
+ for (const branch of branches) {
31
+ // Parse issue number from branch name
32
+ const match = branch.match(/^agent\/issue-(\d+)$/);
33
+ if (!match)
34
+ continue;
35
+ const issueNum = parseInt(match[1], 10);
36
+ // Apply --issue filter if provided
37
+ if (filterIssue !== undefined && issueNum !== filterIssue)
38
+ continue;
39
+ // Check if there are commits ahead of the base branch
40
+ const aheadResult = exec(`git log "origin/${baseBranch}..${branch}" --oneline`);
41
+ if (aheadResult.exitCode !== 0 || !aheadResult.stdout.trim()) {
42
+ // No commits ahead — not stranded
43
+ continue;
44
+ }
45
+ const commits = aheadResult.stdout
46
+ .split('\n')
47
+ .map((l) => l.trim())
48
+ .filter(Boolean);
49
+ // Get files changed relative to base branch
50
+ const filesResult = exec(`git diff --name-only "origin/${baseBranch}...${branch}"`);
51
+ const filesChanged = filesResult.exitCode === 0
52
+ ? filesResult.stdout.split('\n').map((l) => l.trim()).filter(Boolean)
53
+ : [];
54
+ stranded.push({ branch, issueNum, commits, filesChanged });
55
+ }
56
+ return stranded;
57
+ }
58
+ /**
59
+ * Return true if an open PR already exists for the given branch.
60
+ */
61
+ function prExists(repo, branch) {
62
+ const result = exec(`gh pr list --repo "${repo}" --head "${branch}" --state open --json number --limit 1`);
63
+ if (result.exitCode !== 0)
64
+ return false;
65
+ try {
66
+ const prs = JSON.parse(result.stdout);
67
+ return prs.length > 0;
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ }
73
+ /**
74
+ * Fetch the issue title from GitHub.
75
+ */
76
+ function getIssueTitle(repo, issueNum) {
77
+ const result = exec(`gh issue view ${issueNum} --repo "${repo}" --json title`);
78
+ if (result.exitCode !== 0)
79
+ return `Issue #${issueNum}`;
80
+ try {
81
+ const data = JSON.parse(result.stdout);
82
+ return data.title;
83
+ }
84
+ catch {
85
+ return `Issue #${issueNum}`;
86
+ }
87
+ }
88
+ /**
89
+ * Get the diff between the base branch and the given branch.
90
+ */
91
+ function getBranchDiff(baseBranch, branch) {
92
+ const result = exec(`git diff "origin/${baseBranch}...${branch}"`);
93
+ if (result.exitCode !== 0)
94
+ return '';
95
+ // Cap at 50k chars to avoid bloating the review prompt
96
+ const MAX = 50_000;
97
+ if (result.stdout.length > MAX) {
98
+ return result.stdout.slice(0, MAX) + '\n... (diff truncated)';
99
+ }
100
+ return result.stdout;
101
+ }
102
+ /**
103
+ * Print what was found for a stranded branch.
104
+ */
105
+ function printStrandedSummary(item) {
106
+ log.step(`Found stranded branch: ${item.branch}`);
107
+ log.info(` Issue: #${item.issueNum}`);
108
+ log.info(` Commits: ${item.commits.length}`);
109
+ for (const commit of item.commits) {
110
+ log.info(` ${commit}`);
111
+ }
112
+ log.info(` Files changed: ${item.filesChanged.length}`);
113
+ for (const file of item.filesChanged.slice(0, 10)) {
114
+ log.info(` ${file}`);
115
+ }
116
+ if (item.filesChanged.length > 10) {
117
+ log.info(` ... and ${item.filesChanged.length - 10} more`);
118
+ }
119
+ }
120
+ /**
121
+ * Resume a single stranded branch — push, review, open PR, update labels.
122
+ */
123
+ async function resumeBranch(item, config) {
124
+ const { branch, issueNum } = item;
125
+ const repo = config.repo;
126
+ const baseBranch = config.baseBranch;
127
+ const title = getIssueTitle(repo, issueNum);
128
+ log.step(`Resuming issue #${issueNum}: ${title}`);
129
+ // Push the branch so createPR can work with it.
130
+ // createPR also pushes internally, but we do it first here for explicit
131
+ // feedback and to fail fast if the push is going to be a problem.
132
+ log.info(`Pushing ${branch} to origin...`);
133
+ const pushResult = exec(`git push -u origin "${branch}"`);
134
+ if (pushResult.exitCode !== 0) {
135
+ log.warn(`Push failed: ${pushResult.stderr}. Attempting force push...`);
136
+ const forceResult = exec(`git push -u origin "${branch}" --force`);
137
+ if (forceResult.exitCode !== 0) {
138
+ log.error(`Could not push ${branch}: ${forceResult.stderr}`);
139
+ return null;
140
+ }
141
+ }
142
+ // Run code review
143
+ let reviewOutput = '';
144
+ if (!config.skipReview) {
145
+ log.step(`Running code review for #${issueNum}...`);
146
+ const diff = getBranchDiff(baseBranch, branch);
147
+ // buildReviewPrompt expects body and baseBranch; we pass the diff as body
148
+ // context so the reviewer can see the changes inline.
149
+ const reviewPrompt = buildReviewPrompt({
150
+ issueNum,
151
+ title,
152
+ body: diff ? `## Diff\n\`\`\`diff\n${diff}\n\`\`\`` : '(no diff available)',
153
+ baseBranch,
154
+ });
155
+ // Determine the cwd for the review — use the repo root (git toplevel).
156
+ const toplevelResult = exec('git rev-parse --show-toplevel');
157
+ const cwd = toplevelResult.exitCode === 0 ? toplevelResult.stdout : process.cwd();
158
+ // Switch to the branch so the agent can run git commands against it.
159
+ exec(`git checkout "${branch}"`);
160
+ const reviewResult = await spawnAgent({
161
+ agent: 'claude',
162
+ model: config.reviewModel,
163
+ prompt: reviewPrompt,
164
+ cwd,
165
+ verbose: config.verbose,
166
+ timeout: 10 * 60 * 1000, // 10 minutes for a review
167
+ maxTurns: 20,
168
+ });
169
+ reviewOutput = reviewResult.output;
170
+ if (reviewResult.exitCode !== 0) {
171
+ log.warn(`Review agent exited with code ${reviewResult.exitCode}`);
172
+ }
173
+ else {
174
+ log.success(`Review complete for #${issueNum}`);
175
+ }
176
+ }
177
+ // Build PR body
178
+ const prBody = reviewOutput
179
+ ? `## Code Review\n\n${reviewOutput}`
180
+ : `Resumes stranded work for issue #${issueNum}.`;
181
+ // Create PR (createPR handles push internally as well; that is idempotent)
182
+ log.step(`Creating PR for #${issueNum}...`);
183
+ let prUrl;
184
+ try {
185
+ prUrl = createPR({
186
+ repo,
187
+ base: baseBranch,
188
+ head: branch,
189
+ title: `feat: ${title} (closes #${issueNum})`,
190
+ body: prBody,
191
+ });
192
+ }
193
+ catch (err) {
194
+ log.error(`Failed to create PR for #${issueNum}: ${String(err)}`);
195
+ return null;
196
+ }
197
+ log.success(`PR created: ${prUrl}`);
198
+ // Update issue labels: add in-review, remove in-progress
199
+ labelIssue(repo, issueNum, 'in-review', 'in-progress');
200
+ // Update project board status to Done
201
+ if (config.project && config.project > 0) {
202
+ updateProjectStatus(repo, config.project, config.repoOwner, issueNum, 'Done');
203
+ }
204
+ // Comment on the issue with the PR link
205
+ commentIssue(repo, issueNum, `Resumed by alpha-loop. PR ready for review: ${prUrl}`);
206
+ return { issueNum, prUrl, title };
207
+ }
208
+ /**
209
+ * Find the session directory that an issue belongs to.
210
+ * Checks for result files first, then falls back to log files, then most recent session.
211
+ */
212
+ function findSessionForIssue(issueNum) {
213
+ const sessionsRoot = join(process.cwd(), '.alpha-loop', 'sessions');
214
+ if (!existsSync(sessionsRoot))
215
+ return null;
216
+ // Walk all session directories, sorted newest first
217
+ const sessionDirs = [];
218
+ for (const a of readdirSync(sessionsRoot)) {
219
+ const aDir = join(sessionsRoot, a);
220
+ try {
221
+ for (const b of readdirSync(aDir)) {
222
+ sessionDirs.push({ dir: join(aDir, b), name: `${a}/${b}` });
223
+ }
224
+ }
225
+ catch { /* not a directory */ }
226
+ }
227
+ sessionDirs.sort((a, b) => b.name.localeCompare(a.name));
228
+ // First: look for a session with logs for this issue (the crashed session)
229
+ for (const s of sessionDirs) {
230
+ const logsDir = join(s.dir, 'logs');
231
+ if (existsSync(logsDir)) {
232
+ const hasLogs = readdirSync(logsDir).some((f) => f.startsWith(`issue-${issueNum}`));
233
+ if (hasLogs)
234
+ return { sessionDir: s.dir, sessionName: s.name };
235
+ }
236
+ }
237
+ // Fallback: most recent session
238
+ if (sessionDirs.length > 0)
239
+ return { sessionDir: sessionDirs[0].dir, sessionName: sessionDirs[0].name };
240
+ return null;
241
+ }
242
+ /**
243
+ * Save a result file to the session directory and update the session PR.
244
+ */
245
+ function saveResumedResult(sessionDir, result) {
246
+ const filePath = join(sessionDir, `result-${result.issueNum}.json`);
247
+ writeFileSync(filePath, JSON.stringify(result, null, 2) + '\n');
248
+ log.info(`Session result saved: ${filePath}`);
249
+ }
250
+ /**
251
+ * Find and update the session PR with current results.
252
+ */
253
+ function updateSessionPR(repo, sessionName, sessionDir, baseBranch) {
254
+ // Find the session branch
255
+ const sessionBranch = sessionName;
256
+ // Find the PR for this session branch
257
+ const prResult = exec(`gh pr list --repo "${repo}" --head "${sessionBranch}" --state open --json number,url --limit 1`);
258
+ if (prResult.exitCode !== 0 || !prResult.stdout.trim()) {
259
+ log.info('No session PR found to update');
260
+ return;
261
+ }
262
+ let prData;
263
+ try {
264
+ prData = JSON.parse(prResult.stdout);
265
+ }
266
+ catch {
267
+ return;
268
+ }
269
+ if (prData.length === 0)
270
+ return;
271
+ const prNumber = prData[0].number;
272
+ const prUrl = prData[0].url;
273
+ // Read all result files from the session directory
274
+ const resultFiles = readdirSync(sessionDir)
275
+ .filter((f) => f.startsWith('result-') && f.endsWith('.json'))
276
+ .sort();
277
+ const results = [];
278
+ for (const f of resultFiles) {
279
+ try {
280
+ const content = readFileSync(join(sessionDir, f), 'utf-8');
281
+ results.push(JSON.parse(content));
282
+ }
283
+ catch { /* skip invalid */ }
284
+ }
285
+ if (results.length === 0)
286
+ return;
287
+ const successCount = results.filter((r) => r.status === 'success').length;
288
+ const totalDuration = results.reduce((sum, r) => sum + r.duration, 0);
289
+ const title = `Session: ${sessionName} — ${successCount}/${results.length} succeeded`;
290
+ const body = `## Session Summary
291
+
292
+ **Branch:** ${sessionBranch}
293
+ **Issues processed:** ${results.length} (${successCount} succeeded, ${results.length - successCount} failed)
294
+ **Total duration:** ${Math.round(totalDuration / 60)} minutes
295
+ **Updated:** ${new Date().toISOString()}
296
+
297
+ ### Issues
298
+ ${results.map((r) => `- #${r.issueNum}: ${r.title} — ${r.status === 'success' ? 'SUCCESS' : 'FAILURE'}${r.prUrl ? ` ([PR](${r.prUrl}))` : ''}`).join('\n')}
299
+
300
+ ---
301
+ This PR collects all changes from this session for final review before merging to ${baseBranch}.
302
+
303
+ *Automated by alpha-loop*`;
304
+ exec(`gh pr edit ${prNumber} --repo "${repo}" --title ${JSON.stringify(title)}`);
305
+ // Use --body-file to avoid escaping issues
306
+ const { tmpdir } = require('node:os');
307
+ const bodyFile = join(tmpdir(), `alpha-loop-session-pr-${Date.now()}`);
308
+ writeFileSync(bodyFile, body, 'utf-8');
309
+ exec(`gh pr edit ${prNumber} --repo "${repo}" --body-file "${bodyFile}"`);
310
+ try {
311
+ require('node:fs').unlinkSync(bodyFile);
312
+ }
313
+ catch { /* cleanup */ }
314
+ log.success(`Session PR updated: ${prUrl}`);
315
+ }
316
+ /**
317
+ * Main entry point for `alpha-loop resume`.
318
+ */
319
+ export async function resumeCommand(options) {
320
+ const config = loadConfig();
321
+ if (!config.repo) {
322
+ log.error('No repo configured. Set `repo` in .alpha-loop.yaml or the REPO env var.');
323
+ process.exit(1);
324
+ }
325
+ const filterIssue = options.issue ? parseInt(options.issue, 10) : undefined;
326
+ if (options.issue && isNaN(filterIssue)) {
327
+ log.error(`Invalid issue number: ${options.issue}`);
328
+ process.exit(1);
329
+ }
330
+ log.step('Scanning for stranded branches...');
331
+ // Find local branches with unpushed/unreviewed work
332
+ const stranded = findStrandedBranches(config.baseBranch, filterIssue);
333
+ // Filter out branches that already have an open PR
334
+ const withoutPR = stranded.filter((item) => !prExists(config.repo, item.branch));
335
+ if (withoutPR.length === 0) {
336
+ if (stranded.length > 0) {
337
+ log.info('All stranded branches already have open PRs — nothing to resume.');
338
+ }
339
+ else {
340
+ log.info('No stranded branches found — nothing to resume.');
341
+ }
342
+ return;
343
+ }
344
+ log.info(`Found ${withoutPR.length} stranded branch(es) without a PR:`);
345
+ for (const item of withoutPR) {
346
+ printStrandedSummary(item);
347
+ }
348
+ // Process each stranded branch
349
+ const results = [];
350
+ const failed = [];
351
+ for (const item of withoutPR) {
352
+ const result = await resumeBranch(item, config);
353
+ if (result) {
354
+ results.push(result);
355
+ }
356
+ else {
357
+ failed.push(item.issueNum);
358
+ }
359
+ }
360
+ // Save results to session and update session PR
361
+ for (const r of results) {
362
+ const session = findSessionForIssue(r.issueNum);
363
+ if (session) {
364
+ const pipelineResult = {
365
+ issueNum: r.issueNum,
366
+ title: r.title,
367
+ status: 'success',
368
+ prUrl: r.prUrl,
369
+ testsPassing: true,
370
+ verifyPassing: false, // verification was skipped/crashed
371
+ duration: 0,
372
+ filesChanged: 0,
373
+ };
374
+ saveResumedResult(session.sessionDir, pipelineResult);
375
+ updateSessionPR(config.repo, session.sessionName, session.sessionDir, config.baseBranch);
376
+ }
377
+ }
378
+ // Print summary
379
+ console.error('');
380
+ log.step('Resume summary');
381
+ if (results.length > 0) {
382
+ log.success(`Resumed ${results.length} issue(s):`);
383
+ for (const r of results) {
384
+ log.info(` #${r.issueNum} -> ${r.prUrl}`);
385
+ }
386
+ }
387
+ if (failed.length > 0) {
388
+ log.warn(`Failed to resume ${failed.length} issue(s): ${failed.map((n) => `#${n}`).join(', ')}`);
389
+ }
390
+ }
391
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../src/commands/resume.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type ReviewOptions = {
2
+ apply?: boolean;
3
+ session?: string;
4
+ };
5
+ /**
6
+ * Main review command implementation.
7
+ */
8
+ export declare function reviewCommand(options: ReviewOptions): Promise<void>;