@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.
- package/README.md +34 -4
- package/dist/cli.js +25 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/history.js +196 -93
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts +1 -1
- package/dist/commands/init.js +163 -107
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/resume.d.ts +8 -0
- package/dist/commands/resume.js +391 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/review.d.ts +8 -0
- package/dist/commands/review.js +549 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.js +2 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/scan.d.ts +5 -0
- package/dist/commands/scan.js +129 -0
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/sync.d.ts +27 -3
- package/dist/commands/sync.js +222 -44
- package/dist/commands/sync.js.map +1 -1
- package/dist/lib/agent.d.ts +4 -0
- package/dist/lib/agent.js +43 -11
- package/dist/lib/agent.js.map +1 -1
- package/dist/lib/config.d.ts +1 -0
- package/dist/lib/config.js +2 -0
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/github.d.ts +5 -0
- package/dist/lib/github.js +22 -2
- package/dist/lib/github.js.map +1 -1
- package/dist/lib/pipeline.js +19 -11
- package/dist/lib/pipeline.js.map +1 -1
- package/dist/lib/session.js +25 -5
- package/dist/lib/session.js.map +1 -1
- package/dist/lib/templates.d.ts +16 -0
- package/dist/lib/templates.js +59 -0
- package/dist/lib/templates.js.map +1 -0
- package/dist/lib/verify.js +18 -13
- package/dist/lib/verify.js.map +1 -1
- 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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"}
|