@proletariat/cli 0.3.85 → 0.3.86
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/bin/validate-better-sqlite3.cjs +11 -0
- package/dist/commands/session/cleanup.d.ts +2 -0
- package/dist/commands/session/cleanup.js +89 -42
- package/dist/commands/session/cleanup.js.map +1 -1
- package/dist/commands/session/index.js +4 -0
- package/dist/commands/session/index.js.map +1 -1
- package/dist/commands/session/report.d.ts +27 -0
- package/dist/commands/session/report.js +217 -0
- package/dist/commands/session/report.js.map +1 -0
- package/dist/commands/telemetry/disable.js +1 -1
- package/dist/commands/telemetry/disable.js.map +1 -1
- package/dist/commands/telemetry/enable.js +1 -1
- package/dist/commands/telemetry/enable.js.map +1 -1
- package/dist/commands/ticket/create.d.ts +3 -2
- package/dist/commands/ticket/create.js +6 -69
- package/dist/commands/ticket/create.js.map +1 -1
- package/dist/commands/work/groom.d.ts +15 -0
- package/dist/commands/work/groom.js +77 -0
- package/dist/commands/work/groom.js.map +1 -0
- package/dist/commands/work/implement.d.ts +16 -0
- package/dist/commands/work/implement.js +85 -0
- package/dist/commands/work/implement.js.map +1 -0
- package/dist/commands/work/index.js +38 -34
- package/dist/commands/work/index.js.map +1 -1
- package/dist/commands/work/peek.d.ts +18 -0
- package/dist/commands/work/peek.js +78 -0
- package/dist/commands/work/peek.js.map +1 -0
- package/dist/commands/work/poke.d.ts +19 -0
- package/dist/commands/work/poke.js +79 -0
- package/dist/commands/work/poke.js.map +1 -0
- package/dist/commands/work/review.d.ts +1 -31
- package/dist/commands/work/review.js +44 -368
- package/dist/commands/work/review.js.map +1 -1
- package/dist/commands/work/spawn.js +1 -1
- package/dist/commands/work/spawn.js.map +1 -1
- package/dist/commands/work/start.d.ts +2 -0
- package/dist/commands/work/start.js +24 -19
- package/dist/commands/work/start.js.map +1 -1
- package/dist/commands/work/stop.d.ts +14 -0
- package/dist/commands/work/stop.js +103 -0
- package/dist/commands/work/stop.js.map +1 -0
- package/dist/hooks/init.d.ts +1 -1
- package/dist/hooks/init.js +1 -1
- package/dist/lib/execution/config.d.ts +17 -1
- package/dist/lib/execution/config.js +38 -0
- package/dist/lib/execution/config.js.map +1 -1
- package/dist/lib/execution/devcontainer.js +0 -1
- package/dist/lib/execution/devcontainer.js.map +1 -1
- package/dist/lib/execution/runners/docker-management.js +20 -0
- package/dist/lib/execution/runners/docker-management.js.map +1 -1
- package/dist/lib/execution/runners/prompt-builder.js +1 -2
- package/dist/lib/execution/runners/prompt-builder.js.map +1 -1
- package/dist/lib/execution/runners/shared.js +3 -1
- package/dist/lib/execution/runners/shared.js.map +1 -1
- package/dist/lib/execution/spawner.d.ts +3 -1
- package/dist/lib/execution/spawner.js +10 -4
- package/dist/lib/execution/spawner.js.map +1 -1
- package/dist/lib/execution/storage.d.ts +2 -1
- package/dist/lib/execution/storage.js +4 -3
- package/dist/lib/execution/storage.js.map +1 -1
- package/dist/lib/execution/types.d.ts +9 -0
- package/dist/lib/execution/types.js.map +1 -1
- package/dist/lib/mcp/tools/tmux.d.ts +1 -1
- package/dist/lib/mcp/tools/tmux.js +1 -1
- package/dist/lib/mcp/tools/work.js +4 -35
- package/dist/lib/mcp/tools/work.js.map +1 -1
- package/dist/lib/pmo/schema.d.ts +1 -1
- package/dist/lib/pmo/schema.js +1 -0
- package/dist/lib/pmo/schema.js.map +1 -1
- package/dist/lib/pmo/storage/base.js +59 -501
- package/dist/lib/pmo/storage/base.js.map +1 -1
- package/dist/lib/pmo/utils.d.ts +22 -0
- package/dist/lib/pmo/utils.js +31 -0
- package/dist/lib/pmo/utils.js.map +1 -1
- package/dist/lib/telemetry/analytics.d.ts +10 -13
- package/dist/lib/telemetry/analytics.js +35 -125
- package/dist/lib/telemetry/analytics.js.map +1 -1
- package/dist/lib/telemetry/feature-flags.d.ts +12 -37
- package/dist/lib/telemetry/feature-flags.js +15 -63
- package/dist/lib/telemetry/feature-flags.js.map +1 -1
- package/oclif.manifest.json +1751 -1488
- package/package.json +2 -3
- package/dist/commands/work/revise.d.ts +0 -20
- package/dist/commands/work/revise.js +0 -377
- package/dist/commands/work/revise.js.map +0 -1
|
@@ -1,78 +1,32 @@
|
|
|
1
1
|
import { Args, Flags } from '@oclif/core';
|
|
2
|
-
import * as path from 'node:path';
|
|
3
|
-
import { execSync } from 'node:child_process';
|
|
4
|
-
import Database from 'better-sqlite3';
|
|
5
2
|
import { PMOCommand, pmoBaseFlags } from '../../lib/pmo/index.js';
|
|
6
3
|
import { styles } from '../../lib/styles.js';
|
|
7
|
-
import {
|
|
8
|
-
import { ExecutionStorage } from '../../lib/execution/storage.js';
|
|
9
|
-
import { shouldOutputJson, outputErrorAsJson, outputSuccessAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
10
|
-
import { isGHInstalled, isGHAuthenticated, getPRFeedback, getPRForBranch, } from '../../lib/pr/index.js';
|
|
11
|
-
/**
|
|
12
|
-
* Maximum poll duration before giving up (30 minutes).
|
|
13
|
-
*/
|
|
14
|
-
const MAX_POLL_DURATION_MS = 30 * 60 * 1000;
|
|
4
|
+
import { shouldOutputJson, outputErrorAsJson, createMetadata, } from '../../lib/prompt-json.js';
|
|
15
5
|
export default class WorkReview extends PMOCommand {
|
|
16
|
-
static description = '
|
|
6
|
+
static description = 'Evaluate the output/PR for a ticket (model decides whether to comment, fix, or both)';
|
|
17
7
|
static examples = [
|
|
18
|
-
'<%= config.bin %>
|
|
19
|
-
'<%= config.bin %>
|
|
20
|
-
'<%= config.bin %>
|
|
21
|
-
'<%= config.bin %> <%= command.id %> # Interactive mode',
|
|
8
|
+
'<%= config.bin %> work review TKT-001',
|
|
9
|
+
'<%= config.bin %> work review TKT-001 TKT-002',
|
|
10
|
+
'<%= config.bin %> work review # Interactive picker for reviewable tickets',
|
|
22
11
|
];
|
|
12
|
+
static strict = false;
|
|
23
13
|
static args = {
|
|
24
14
|
ticketId: Args.string({
|
|
25
|
-
description: 'Ticket ID to review',
|
|
15
|
+
description: 'Ticket ID(s) to review - prompts with picker if not provided',
|
|
26
16
|
required: false,
|
|
27
17
|
}),
|
|
28
18
|
};
|
|
29
19
|
static flags = {
|
|
30
20
|
...pmoBaseFlags,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
auto: Flags.boolean({
|
|
36
|
-
description: 'Skip confirmations between cycles (fully automated)',
|
|
37
|
-
default: false,
|
|
38
|
-
}),
|
|
39
|
-
executor: Flags.string({
|
|
40
|
-
char: 'e',
|
|
41
|
-
description: 'Override executor',
|
|
42
|
-
options: ['claude-code', 'codex', 'custom'],
|
|
43
|
-
}),
|
|
44
|
-
'run-on-host': Flags.boolean({
|
|
45
|
-
description: 'Run on host even if devcontainer exists (bypasses sandbox)',
|
|
46
|
-
default: false,
|
|
47
|
-
}),
|
|
48
|
-
'skip-permissions': Flags.boolean({
|
|
49
|
-
description: 'Skip permission checks for agents',
|
|
50
|
-
default: false,
|
|
51
|
-
}),
|
|
52
|
-
display: Flags.string({
|
|
53
|
-
char: 'd',
|
|
54
|
-
description: 'Display mode for agents',
|
|
55
|
-
options: ['foreground', 'terminal', 'background'],
|
|
56
|
-
default: 'background',
|
|
57
|
-
}),
|
|
58
|
-
session: Flags.string({
|
|
59
|
-
char: 's',
|
|
60
|
-
description: 'Session manager inside container',
|
|
61
|
-
options: ['tmux', 'direct'],
|
|
62
|
-
default: 'tmux',
|
|
63
|
-
}),
|
|
64
|
-
'poll-interval': Flags.integer({
|
|
65
|
-
description: 'Polling interval in seconds to check agent completion (default: 10)',
|
|
66
|
-
default: 10,
|
|
67
|
-
}),
|
|
68
|
-
force: Flags.boolean({
|
|
69
|
-
char: 'f',
|
|
70
|
-
description: 'Force spawn even if ticket has running executions',
|
|
21
|
+
json: Flags.boolean({
|
|
22
|
+
char: 'm',
|
|
23
|
+
aliases: ['machine'],
|
|
24
|
+
description: 'Output prompt configuration as JSON (for AI agents/scripts)',
|
|
71
25
|
default: false,
|
|
72
26
|
}),
|
|
73
27
|
};
|
|
74
28
|
async execute() {
|
|
75
|
-
const {
|
|
29
|
+
const { flags, argv } = await this.parse(WorkReview);
|
|
76
30
|
const projectId = flags.project;
|
|
77
31
|
const jsonMode = shouldOutputJson(flags);
|
|
78
32
|
const handleError = (code, message) => {
|
|
@@ -82,323 +36,45 @@ export default class WorkReview extends PMOCommand {
|
|
|
82
36
|
}
|
|
83
37
|
this.error(message);
|
|
84
38
|
};
|
|
85
|
-
//
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const dbPath = path.join(workspaceInfo.path, '.proletariat', 'workspace.db');
|
|
98
|
-
const db = new Database(dbPath);
|
|
99
|
-
const executionStorage = new ExecutionStorage(db);
|
|
100
|
-
try {
|
|
101
|
-
// Get ticketId
|
|
102
|
-
let ticketId = args.ticketId;
|
|
103
|
-
if (!ticketId) {
|
|
104
|
-
// Show tickets that are in progress or review (have PRs)
|
|
105
|
-
const allTickets = await this.storage.listTickets(projectId);
|
|
106
|
-
const reviewableTickets = allTickets.filter(t => {
|
|
107
|
-
const hasPR = t.metadata?.pr_url;
|
|
108
|
-
const isInProgress = t.status === 'in_progress' || t.status === 'done';
|
|
109
|
-
return hasPR || isInProgress;
|
|
110
|
-
});
|
|
111
|
-
if (reviewableTickets.length === 0) {
|
|
112
|
-
db.close();
|
|
113
|
-
return handleError('NO_TICKETS', 'No reviewable tickets found. Tickets need a PR to be reviewed.');
|
|
114
|
-
}
|
|
115
|
-
const selected = await this.selectFromList({
|
|
116
|
-
message: 'Select ticket to review:',
|
|
117
|
-
items: reviewableTickets,
|
|
118
|
-
getName: (t) => `${t.id} - ${t.title} ${t.metadata?.pr_url ? '(has PR)' : ''}`,
|
|
119
|
-
getValue: (t) => t.id,
|
|
120
|
-
getCommand: (t) => `prlt work review ${t.id} --json`,
|
|
121
|
-
jsonMode: jsonMode ? { flags, commandName: 'work review' } : null,
|
|
122
|
-
});
|
|
123
|
-
if (!selected) {
|
|
124
|
-
db.close();
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
ticketId = selected;
|
|
128
|
-
}
|
|
129
|
-
// Get ticket
|
|
130
|
-
const ticket = await this.storage.getTicket(ticketId);
|
|
131
|
-
if (!ticket) {
|
|
132
|
-
db.close();
|
|
133
|
-
return handleError('TICKET_NOT_FOUND', `Ticket "${ticketId}" not found.`);
|
|
39
|
+
// Collect ticket IDs from argv (supports multiple args)
|
|
40
|
+
let ticketIds = argv.filter(a => !a.startsWith('-'));
|
|
41
|
+
if (ticketIds.length === 0) {
|
|
42
|
+
// No tickets specified - show picker of reviewable tickets (in progress or done with PRs)
|
|
43
|
+
const allTickets = await this.storage.listTickets(projectId);
|
|
44
|
+
const reviewableTickets = allTickets.filter((t) => t.statusCategory === 'started' ||
|
|
45
|
+
t.statusCategory === 'completed' ||
|
|
46
|
+
t.statusName?.toLowerCase() === 'in progress' ||
|
|
47
|
+
t.statusName?.toLowerCase() === 'review' ||
|
|
48
|
+
t.statusName?.toLowerCase() === 'done');
|
|
49
|
+
if (reviewableTickets.length === 0) {
|
|
50
|
+
return handleError('NO_TICKETS', 'No reviewable tickets found. Implement tickets first with "prlt work implement".');
|
|
134
51
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
if (!prUrl) {
|
|
145
|
-
db.close();
|
|
146
|
-
return handleError('NO_PR', `Ticket "${ticketId}" has no PR. Create one first with "prlt work ready ${ticketId} --pr".`);
|
|
147
|
-
}
|
|
148
|
-
const maxCycles = flags['max-cycles'];
|
|
149
|
-
const autoMode = flags.auto;
|
|
150
|
-
const pollInterval = (flags['poll-interval'] || 10) * 1000;
|
|
151
|
-
this.log('');
|
|
152
|
-
this.log(styles.header('Review Pipeline'));
|
|
153
|
-
this.log(styles.muted(` Ticket: ${ticket.id} - ${ticket.title}`));
|
|
154
|
-
this.log(styles.muted(` PR: ${prUrl}`));
|
|
155
|
-
this.log(styles.muted(` Max cycles: ${maxCycles}`));
|
|
156
|
-
this.log(styles.muted(` Mode: ${autoMode ? 'fully automated' : 'interactive'}`));
|
|
157
|
-
this.log('');
|
|
158
|
-
// Pipeline loop
|
|
159
|
-
for (let cycle = 1; cycle <= maxCycles; cycle++) {
|
|
160
|
-
this.log(styles.header(`Cycle ${cycle}/${maxCycles}: Review Phase`));
|
|
161
|
-
this.log('');
|
|
162
|
-
// === REVIEW PHASE ===
|
|
163
|
-
// Spawn a review agent
|
|
164
|
-
const reviewArgs = this.buildStartArgs(ticketId, flags, 'review');
|
|
165
|
-
this.log(styles.muted('Spawning review agent...'));
|
|
166
|
-
try {
|
|
167
|
-
await this.config.runCommand('work:start', reviewArgs);
|
|
168
|
-
}
|
|
169
|
-
catch (error) {
|
|
170
|
-
this.log(styles.error(`Failed to spawn review agent: ${error instanceof Error ? error.message : error}`));
|
|
171
|
-
break;
|
|
172
|
-
}
|
|
173
|
-
// Wait for the review agent to complete
|
|
174
|
-
this.log(styles.muted('Waiting for review agent to complete...'));
|
|
175
|
-
const reviewCompleted = await this.waitForAgentCompletion(ticketId, executionStorage, pollInterval);
|
|
176
|
-
if (!reviewCompleted) {
|
|
177
|
-
this.log(styles.warning('Review agent did not complete within timeout. Stopping pipeline.'));
|
|
178
|
-
break;
|
|
179
|
-
}
|
|
180
|
-
this.log(styles.success('Review agent completed.'));
|
|
181
|
-
this.log('');
|
|
182
|
-
// Check PR feedback
|
|
183
|
-
this.log(styles.muted('Checking review results...'));
|
|
184
|
-
const feedback = getPRFeedback(prUrl);
|
|
185
|
-
if (!feedback) {
|
|
186
|
-
this.log(styles.warning('Could not fetch PR feedback. Stopping pipeline.'));
|
|
187
|
-
break;
|
|
188
|
-
}
|
|
189
|
-
const verdict = this.getReviewVerdict(feedback);
|
|
190
|
-
if (verdict === 'APPROVED') {
|
|
191
|
-
this.log(styles.success('PR APPROVED! No fixes needed.'));
|
|
192
|
-
this.log('');
|
|
193
|
-
if (jsonMode) {
|
|
194
|
-
outputSuccessAsJson({
|
|
195
|
-
ticketId: ticketId,
|
|
196
|
-
prUrl,
|
|
197
|
-
verdict: 'APPROVED',
|
|
198
|
-
cycles: cycle,
|
|
199
|
-
}, createMetadata('work review', flags));
|
|
200
|
-
return;
|
|
201
|
-
}
|
|
202
|
-
db.close();
|
|
203
|
-
return;
|
|
204
|
-
}
|
|
205
|
-
this.log(styles.warning(`Review verdict: ${verdict}`));
|
|
206
|
-
this.log(styles.muted(` Reviews: ${feedback.reviews.length}`));
|
|
207
|
-
// Show review summary
|
|
208
|
-
for (const review of feedback.reviews) {
|
|
209
|
-
if (review.state === 'CHANGES_REQUESTED' || review.state === 'COMMENTED') {
|
|
210
|
-
this.log(styles.muted(` ${review.author}: ${review.state}`));
|
|
211
|
-
if (review.comments.length > 0) {
|
|
212
|
-
this.log(styles.muted(` ${review.comments.length} comment(s)`));
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
this.log('');
|
|
217
|
-
// Check if we've reached max cycles
|
|
218
|
-
if (cycle === maxCycles) {
|
|
219
|
-
this.log(styles.warning(`Reached maximum cycles (${maxCycles}). Stopping pipeline.`));
|
|
220
|
-
this.log(styles.muted('Review feedback remains on the PR for manual follow-up.'));
|
|
221
|
-
break;
|
|
222
|
-
}
|
|
223
|
-
// === FIX PHASE ===
|
|
224
|
-
if (!autoMode) {
|
|
225
|
-
const shouldFix = await this.selectFromList({
|
|
226
|
-
message: `Issues found in cycle ${cycle}. Auto-fix and re-review?`,
|
|
227
|
-
items: [
|
|
228
|
-
{ id: 'yes', name: 'Yes, spawn fix agent and re-review' },
|
|
229
|
-
{ id: 'fix-only', name: 'Fix only (no re-review)' },
|
|
230
|
-
{ id: 'no', name: 'No, stop pipeline' },
|
|
231
|
-
],
|
|
232
|
-
getName: (item) => item.name,
|
|
233
|
-
getValue: (item) => item.id,
|
|
234
|
-
getCommand: () => '',
|
|
235
|
-
jsonMode: jsonMode ? { flags, commandName: 'work review' } : null,
|
|
236
|
-
});
|
|
237
|
-
if (shouldFix === 'no' || !shouldFix) {
|
|
238
|
-
this.log(styles.muted('Pipeline stopped by user.'));
|
|
239
|
-
break;
|
|
240
|
-
}
|
|
241
|
-
if (shouldFix === 'fix-only') {
|
|
242
|
-
// Spawn fix agent but don't re-review
|
|
243
|
-
this.log(styles.header(`Cycle ${cycle}/${maxCycles}: Fix Phase (final)`));
|
|
244
|
-
await this.runFixPhase(ticketId, flags, executionStorage, pollInterval);
|
|
245
|
-
break;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
this.log(styles.header(`Cycle ${cycle}/${maxCycles}: Fix Phase`));
|
|
249
|
-
this.log('');
|
|
250
|
-
const fixCompleted = await this.runFixPhase(ticketId, flags, executionStorage, pollInterval);
|
|
251
|
-
if (!fixCompleted) {
|
|
252
|
-
this.log(styles.warning('Fix agent did not complete. Stopping pipeline.'));
|
|
253
|
-
break;
|
|
254
|
-
}
|
|
255
|
-
this.log(styles.success('Fix agent completed. Proceeding to re-review...'));
|
|
256
|
-
this.log('');
|
|
257
|
-
// Small delay before re-review to let GitHub update
|
|
258
|
-
await this.sleep(3000);
|
|
259
|
-
}
|
|
260
|
-
// Final status
|
|
261
|
-
this.log('');
|
|
262
|
-
const finalFeedback = getPRFeedback(prUrl);
|
|
263
|
-
const finalVerdict = finalFeedback ? this.getReviewVerdict(finalFeedback) : 'UNKNOWN';
|
|
264
|
-
this.log(styles.header('Pipeline Complete'));
|
|
265
|
-
this.log(styles.muted(` Final status: ${finalVerdict}`));
|
|
266
|
-
this.log(styles.muted(` PR: ${prUrl}`));
|
|
267
|
-
this.log('');
|
|
268
|
-
if (jsonMode) {
|
|
269
|
-
outputSuccessAsJson({
|
|
270
|
-
ticketId: ticketId,
|
|
271
|
-
prUrl,
|
|
272
|
-
verdict: finalVerdict,
|
|
273
|
-
}, createMetadata('work review', flags));
|
|
52
|
+
const selected = await this.selectFromList({
|
|
53
|
+
message: 'Select ticket to review:',
|
|
54
|
+
items: reviewableTickets,
|
|
55
|
+
getName: (t) => `${t.id} - ${t.title} (${t.statusName})`,
|
|
56
|
+
getValue: (t) => t.id,
|
|
57
|
+
getCommand: (t) => `prlt work review ${t.id}${projectId ? ` -P ${projectId}` : ''} --json`,
|
|
58
|
+
jsonMode: jsonMode ? { flags, commandName: 'work review' } : null,
|
|
59
|
+
});
|
|
60
|
+
if (!selected) {
|
|
274
61
|
return;
|
|
275
62
|
}
|
|
276
|
-
|
|
63
|
+
ticketIds = [selected];
|
|
277
64
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
* Build args for `work:start` command.
|
|
285
|
-
*/
|
|
286
|
-
buildStartArgs(ticketId, flags, action) {
|
|
287
|
-
const startArgs = [
|
|
288
|
-
ticketId,
|
|
289
|
-
'--action', action,
|
|
290
|
-
'--ephemeral',
|
|
291
|
-
'--display', flags.display || 'background',
|
|
292
|
-
'--yes',
|
|
293
|
-
];
|
|
294
|
-
if (flags.executor)
|
|
295
|
-
startArgs.push('--executor', flags.executor);
|
|
296
|
-
if (flags['run-on-host'])
|
|
297
|
-
startArgs.push('--run-on-host');
|
|
298
|
-
if (flags['skip-permissions'])
|
|
299
|
-
startArgs.push('--skip-permissions');
|
|
300
|
-
else
|
|
301
|
-
startArgs.push('--permission-mode', 'danger');
|
|
302
|
-
if (flags.session)
|
|
303
|
-
startArgs.push('--session', flags.session);
|
|
304
|
-
// Always pass --force for pipeline (multiple agents may work on same ticket across cycles)
|
|
305
|
-
startArgs.push('--force');
|
|
306
|
-
// Pass project if available
|
|
307
|
-
const projectId = flags.project;
|
|
308
|
-
if (projectId)
|
|
309
|
-
startArgs.push('--project', projectId);
|
|
310
|
-
return startArgs;
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* Run the fix phase: spawn review-fix agent and wait for completion.
|
|
314
|
-
*/
|
|
315
|
-
async runFixPhase(ticketId, flags, executionStorage, pollInterval) {
|
|
316
|
-
const fixArgs = this.buildStartArgs(ticketId, flags, 'review-fix');
|
|
317
|
-
this.log(styles.muted('Spawning fix agent...'));
|
|
318
|
-
try {
|
|
319
|
-
await this.config.runCommand('work:start', fixArgs);
|
|
320
|
-
}
|
|
321
|
-
catch (error) {
|
|
322
|
-
this.log(styles.error(`Failed to spawn fix agent: ${error instanceof Error ? error.message : error}`));
|
|
323
|
-
return false;
|
|
324
|
-
}
|
|
325
|
-
this.log(styles.muted('Waiting for fix agent to complete...'));
|
|
326
|
-
return this.waitForAgentCompletion(ticketId, executionStorage, pollInterval);
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Wait for the most recent execution on a ticket to complete.
|
|
330
|
-
* Polls the execution storage and checks tmux session existence.
|
|
331
|
-
*/
|
|
332
|
-
async waitForAgentCompletion(ticketId, executionStorage, pollInterval) {
|
|
333
|
-
const startTime = Date.now();
|
|
334
|
-
while (Date.now() - startTime < MAX_POLL_DURATION_MS) {
|
|
335
|
-
// Clean up stale executions first
|
|
336
|
-
executionStorage.cleanupStaleExecutions();
|
|
337
|
-
// Check if there's still a running execution for this ticket
|
|
338
|
-
const runningExec = executionStorage.getRunningExecution(ticketId);
|
|
339
|
-
if (!runningExec) {
|
|
340
|
-
// No running execution - agent has completed (or was never started)
|
|
341
|
-
return true;
|
|
342
|
-
}
|
|
343
|
-
// Check if the tmux session still exists
|
|
344
|
-
if (runningExec.sessionId) {
|
|
345
|
-
const sessionExists = this.checkTmuxSession(runningExec.sessionId, runningExec.environment, runningExec.containerId);
|
|
346
|
-
if (!sessionExists) {
|
|
347
|
-
// Session is gone - mark as completed
|
|
348
|
-
executionStorage.updateStatus(runningExec.id, 'completed');
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
65
|
+
// Launch work start with review action for each ticket
|
|
66
|
+
for (const ticketId of ticketIds) {
|
|
67
|
+
this.log(styles.info(`\nLaunching review for ${styles.emphasis(ticketId)}...`));
|
|
68
|
+
const workStartArgs = [ticketId, '--action', 'review'];
|
|
69
|
+
if (projectId) {
|
|
70
|
+
workStartArgs.push('--project', projectId);
|
|
351
71
|
}
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
if (elapsed > 0 && elapsed % 60 === 0) {
|
|
355
|
-
this.log(styles.muted(` Still waiting... (${elapsed}s elapsed)`));
|
|
356
|
-
}
|
|
357
|
-
await this.sleep(pollInterval);
|
|
358
|
-
}
|
|
359
|
-
return false;
|
|
360
|
-
}
|
|
361
|
-
/**
|
|
362
|
-
* Check if a tmux session exists.
|
|
363
|
-
*/
|
|
364
|
-
checkTmuxSession(sessionId, environment, containerId) {
|
|
365
|
-
try {
|
|
366
|
-
if (environment === 'devcontainer' && containerId) {
|
|
367
|
-
execSync(`docker exec ${containerId} tmux has-session -t "${sessionId}"`, { stdio: 'pipe' });
|
|
368
|
-
}
|
|
369
|
-
else {
|
|
370
|
-
execSync(`tmux has-session -t "${sessionId}"`, { stdio: 'pipe' });
|
|
72
|
+
if (jsonMode) {
|
|
73
|
+
workStartArgs.push('--json');
|
|
371
74
|
}
|
|
372
|
-
|
|
75
|
+
// eslint-disable-next-line no-await-in-loop
|
|
76
|
+
await this.config.runCommand('work:start', workStartArgs);
|
|
373
77
|
}
|
|
374
|
-
catch {
|
|
375
|
-
return false;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Get the review verdict from PR feedback.
|
|
380
|
-
*/
|
|
381
|
-
getReviewVerdict(feedback) {
|
|
382
|
-
// Check review decision first (aggregated by GitHub)
|
|
383
|
-
if (feedback.reviewDecision) {
|
|
384
|
-
return feedback.reviewDecision;
|
|
385
|
-
}
|
|
386
|
-
// Check individual reviews - most recent takes precedence
|
|
387
|
-
const sortedReviews = [...feedback.reviews].sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
|
|
388
|
-
for (const review of sortedReviews) {
|
|
389
|
-
if (review.state === 'APPROVED')
|
|
390
|
-
return 'APPROVED';
|
|
391
|
-
if (review.state === 'CHANGES_REQUESTED')
|
|
392
|
-
return 'CHANGES_REQUESTED';
|
|
393
|
-
}
|
|
394
|
-
// If there are any comments, treat as needing attention
|
|
395
|
-
if (feedback.reviews.some(r => r.comments.length > 0) || feedback.comments.length > 0) {
|
|
396
|
-
return 'COMMENTED';
|
|
397
|
-
}
|
|
398
|
-
return 'UNKNOWN';
|
|
399
|
-
}
|
|
400
|
-
sleep(ms) {
|
|
401
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
402
78
|
}
|
|
403
79
|
}
|
|
404
80
|
//# sourceMappingURL=review.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/commands/work/review.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/commands/work/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -1840,7 +1840,7 @@ export default class WorkSpawn extends PMOCommand {
|
|
|
1840
1840
|
batchOutput = 'interactive';
|
|
1841
1841
|
}
|
|
1842
1842
|
// Prompt for permissions mode if not explicitly set via --skip-permissions flag
|
|
1843
|
-
// Non-code-modifying actions (review,
|
|
1843
|
+
// Non-code-modifying actions (review, groom) default to safe mode
|
|
1844
1844
|
// to prevent agents from performing destructive operations like merging PRs
|
|
1845
1845
|
const spawnActionModifiesCode = selectedActionDetails?.modifiesCode ?? true;
|
|
1846
1846
|
if (!flags['skip-permissions']) {
|