@bradtaylorsf/alpha-loop 1.0.0 → 1.0.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.
@@ -1,45 +1,35 @@
1
- import { existsSync, writeFileSync, mkdirSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- import { detectRepo } from '../lib/config.js';
1
+ import { existsSync, writeFileSync, readFileSync, mkdirSync, realpathSync } from 'node:fs';
2
+ import { join, dirname } from 'node:path';
3
+ import { detectRepo, loadConfig } from '../lib/config.js';
4
4
  import { exec } from '../lib/shell.js';
5
5
  import { log } from '../lib/logger.js';
6
6
  import { syncAgentAssets } from './sync.js';
7
7
  /**
8
8
  * Find the templates directory shipped with alpha-loop.
9
9
  * Works whether running from src/ (tsx) or dist/ (compiled) or as an npm package.
10
+ *
11
+ * Uses the resolved path of the CLI entrypoint (process.argv[1]) to locate the
12
+ * package root, following symlinks so globally-installed npm packages resolve correctly.
10
13
  */
11
14
  function findTemplatesDir() {
12
- // Walk up from this file's location to find the alpha-loop package root.
13
- // src/commands/init.ts -> src/ -> package root (has templates/)
14
- // dist/commands/init.js -> dist/ -> package root (has templates/)
15
- const scriptDir = typeof __dirname !== 'undefined' ? __dirname : '';
16
- const candidates = [];
17
- // Walk up from script location
18
- if (scriptDir) {
19
- let dir = scriptDir;
20
- for (let i = 0; i < 5; i++) {
21
- candidates.push(join(dir, 'templates'));
22
- const parent = join(dir, '..');
23
- if (parent === dir)
24
- break;
25
- dir = parent;
26
- }
15
+ // Resolve symlinks (npm global installs are symlinked from bin/ to the actual package)
16
+ let startDir;
17
+ try {
18
+ startDir = dirname(realpathSync(process.argv[1]));
27
19
  }
28
- // Also check relative to the entry script (process.argv[1])
29
- // e.g., npx tsx /path/to/alpha-loop/src/cli.ts → /path/to/alpha-loop/templates
30
- if (process.argv[1]) {
31
- let dir = join(process.argv[1], '..');
32
- for (let i = 0; i < 5; i++) {
33
- candidates.push(join(dir, 'templates'));
34
- const parent = join(dir, '..');
35
- if (parent === dir)
36
- break;
37
- dir = parent;
38
- }
20
+ catch {
21
+ startDir = process.cwd();
39
22
  }
40
- for (const c of candidates) {
41
- if (existsSync(c))
42
- return c;
23
+ // Walk up from the entrypoint to find templates/
24
+ let dir = startDir;
25
+ for (let i = 0; i < 5; i++) {
26
+ const candidate = join(dir, 'templates');
27
+ if (existsSync(candidate))
28
+ return candidate;
29
+ const parent = dirname(dir);
30
+ if (parent === dir)
31
+ break;
32
+ dir = parent;
43
33
  }
44
34
  return null;
45
35
  }
@@ -115,6 +105,7 @@ body:
115
105
  function configTemplate(repo) {
116
106
  return `# Alpha Loop configuration
117
107
  repo: ${repo}
108
+ project: 0 # GitHub Project number (find it in your project URL)
118
109
  model: opus
119
110
  review_model: opus
120
111
  label: ready
@@ -124,6 +115,12 @@ dev_command: pnpm dev
124
115
  port: 3000
125
116
  auto_merge: true
126
117
 
118
+ # Coding harnesses to sync skills/agents to (run 'alpha-loop sync' after changes)
119
+ # See full list: https://github.com/nicepkg/playwright-cli
120
+ harnesses:
121
+ - claude-code
122
+ - codex
123
+
127
124
  # Safety limits (0 = unlimited)
128
125
  max_issues: 20
129
126
  max_session_duration: 7200 # 2 hours in seconds
@@ -136,6 +133,41 @@ function copyDir(src, dest) {
136
133
  mkdirSync(dest, { recursive: true });
137
134
  exec(`cp -R "${src}/"* "${dest}/" 2>/dev/null || true`);
138
135
  }
136
+ const GITIGNORE_ENTRIES = [
137
+ '# Alpha-loop ephemeral data (not shared)',
138
+ '.alpha-loop/sessions/',
139
+ '.alpha-loop/auth/',
140
+ '.worktrees/',
141
+ ];
142
+ /**
143
+ * Ensure .gitignore tracks learnings but ignores sessions, auth, and worktrees.
144
+ * Also removes stale entries that previously ignored learnings.
145
+ */
146
+ function ensureGitignore() {
147
+ const gitignorePath = '.gitignore';
148
+ let content = existsSync(gitignorePath) ? readFileSync(gitignorePath, 'utf-8') : '';
149
+ let changed = false;
150
+ // Remove old entry that ignored learnings (they should be tracked now)
151
+ if (content.includes('.alpha-loop/learnings/')) {
152
+ content = content
153
+ .split('\n')
154
+ .filter((line) => line.trim() !== '.alpha-loop/learnings/')
155
+ .join('\n');
156
+ changed = true;
157
+ log.info('Removed .alpha-loop/learnings/ from .gitignore (learnings are now tracked)');
158
+ }
159
+ // Add required ignore entries
160
+ const missing = GITIGNORE_ENTRIES.filter((entry) => !content.includes(entry));
161
+ if (missing.length > 0) {
162
+ const suffix = (content.endsWith('\n') || content === '') ? '' : '\n';
163
+ content += suffix + missing.join('\n') + '\n';
164
+ changed = true;
165
+ }
166
+ if (changed) {
167
+ writeFileSync(gitignorePath, content);
168
+ log.success('Updated .gitignore for alpha-loop');
169
+ }
170
+ }
139
171
  export function initCommand() {
140
172
  // Create config if it doesn't exist
141
173
  if (existsSync(CONFIG_FILE)) {
@@ -154,6 +186,11 @@ export function initCommand() {
154
186
  log.success(`Created ${CONFIG_FILE}`);
155
187
  }
156
188
  // Everything below is idempotent — safe to re-run
189
+ // Ensure .gitignore has the right alpha-loop entries:
190
+ // - Track learnings (team-shared knowledge)
191
+ // - Ignore sessions (local logs, screenshots, ephemeral data)
192
+ // - Ignore auth (browser state with credentials)
193
+ ensureGitignore();
157
194
  // Install playwright-cli skills if playwright-cli is available
158
195
  const which = exec('which playwright-cli');
159
196
  if (which.exitCode === 0) {
@@ -232,8 +269,12 @@ export function initCommand() {
232
269
  writeFileSync(templateFile, ISSUE_TEMPLATE);
233
270
  log.success('Created GitHub issue template: .github/ISSUE_TEMPLATE/agent-ready.yml');
234
271
  }
235
- // Sync agent assets so skills land in both .claude/skills/ and .agents/skills/
236
- const syncResult = syncAgentAssets();
272
+ // Sync agent assets to all configured harnesses (default to claude-code + codex on first init)
273
+ const initConfig = loadConfig();
274
+ const initHarnesses = initConfig.harnesses.length > 0
275
+ ? initConfig.harnesses
276
+ : ['claude-code', 'codex'];
277
+ const syncResult = syncAgentAssets(initHarnesses);
237
278
  if (syncResult.synced) {
238
279
  log.success('Agent assets synced across .claude/ and .agents/');
239
280
  }
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export type ResumeOptions = {
2
+ issue?: string;
3
+ session?: string;
4
+ };
5
+ /**
6
+ * Main entry point for `alpha-loop resume`.
7
+ */
8
+ export declare function resumeCommand(options: ResumeOptions): Promise<void>;
@@ -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>;