@jonit-dev/night-watch-cli 1.8.10-beta.1 → 1.8.10-beta.3
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/dist/cli.js +2309 -1313
- package/dist/scripts/night-watch-cron.sh +1 -3
- package/dist/scripts/night-watch-merger-cron.sh +1 -1
- package/dist/scripts/night-watch-plan-cron.sh +1 -1
- package/dist/scripts/night-watch-slicer-cron.sh +1 -1
- package/dist/web/assets/index-BUgI2S1s.js +406 -0
- package/dist/web/assets/index-CkdLFBd7.js +406 -0
- package/dist/web/assets/index-RMfswANB.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/commands/analytics.d.ts +0 -14
- package/dist/commands/analytics.d.ts.map +0 -1
- package/dist/commands/analytics.js +0 -69
- package/dist/commands/analytics.js.map +0 -1
- package/dist/commands/audit.d.ts +0 -19
- package/dist/commands/audit.d.ts.map +0 -1
- package/dist/commands/audit.js +0 -144
- package/dist/commands/audit.js.map +0 -1
- package/dist/commands/board.d.ts +0 -9
- package/dist/commands/board.d.ts.map +0 -1
- package/dist/commands/board.js +0 -702
- package/dist/commands/board.js.map +0 -1
- package/dist/commands/cancel.d.ts +0 -46
- package/dist/commands/cancel.d.ts.map +0 -1
- package/dist/commands/cancel.js +0 -239
- package/dist/commands/cancel.js.map +0 -1
- package/dist/commands/cron.d.ts +0 -8
- package/dist/commands/cron.d.ts.map +0 -1
- package/dist/commands/cron.js +0 -134
- package/dist/commands/cron.js.map +0 -1
- package/dist/commands/dashboard/tab-actions.d.ts +0 -10
- package/dist/commands/dashboard/tab-actions.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-actions.js +0 -247
- package/dist/commands/dashboard/tab-actions.js.map +0 -1
- package/dist/commands/dashboard/tab-config.d.ts +0 -21
- package/dist/commands/dashboard/tab-config.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-config.js +0 -873
- package/dist/commands/dashboard/tab-config.js.map +0 -1
- package/dist/commands/dashboard/tab-logs.d.ts +0 -10
- package/dist/commands/dashboard/tab-logs.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-logs.js +0 -202
- package/dist/commands/dashboard/tab-logs.js.map +0 -1
- package/dist/commands/dashboard/tab-schedules.d.ts +0 -21
- package/dist/commands/dashboard/tab-schedules.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-schedules.js +0 -320
- package/dist/commands/dashboard/tab-schedules.js.map +0 -1
- package/dist/commands/dashboard/tab-status.d.ts +0 -32
- package/dist/commands/dashboard/tab-status.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-status.js +0 -424
- package/dist/commands/dashboard/tab-status.js.map +0 -1
- package/dist/commands/dashboard/types.d.ts +0 -42
- package/dist/commands/dashboard/types.d.ts.map +0 -1
- package/dist/commands/dashboard/types.js +0 -5
- package/dist/commands/dashboard/types.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -11
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -242
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -16
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -195
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/history.d.ts +0 -7
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/history.js +0 -49
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/init.d.ts +0 -45
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -777
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/install.d.ts +0 -65
- package/dist/commands/install.d.ts.map +0 -1
- package/dist/commands/install.js +0 -405
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -15
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -155
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/merge.d.ts +0 -26
- package/dist/commands/merge.d.ts.map +0 -1
- package/dist/commands/merge.js +0 -159
- package/dist/commands/merge.js.map +0 -1
- package/dist/commands/notify.d.ts +0 -7
- package/dist/commands/notify.d.ts.map +0 -1
- package/dist/commands/notify.js +0 -43
- package/dist/commands/notify.js.map +0 -1
- package/dist/commands/plan.d.ts +0 -19
- package/dist/commands/plan.d.ts.map +0 -1
- package/dist/commands/plan.js +0 -88
- package/dist/commands/plan.js.map +0 -1
- package/dist/commands/prd-state.d.ts +0 -12
- package/dist/commands/prd-state.d.ts.map +0 -1
- package/dist/commands/prd-state.js +0 -47
- package/dist/commands/prd-state.js.map +0 -1
- package/dist/commands/prd.d.ts +0 -18
- package/dist/commands/prd.d.ts.map +0 -1
- package/dist/commands/prd.js +0 -363
- package/dist/commands/prd.js.map +0 -1
- package/dist/commands/prds.d.ts +0 -13
- package/dist/commands/prds.d.ts.map +0 -1
- package/dist/commands/prds.js +0 -194
- package/dist/commands/prds.js.map +0 -1
- package/dist/commands/prs.d.ts +0 -14
- package/dist/commands/prs.d.ts.map +0 -1
- package/dist/commands/prs.js +0 -104
- package/dist/commands/prs.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -34
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -214
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/queue.d.ts +0 -8
- package/dist/commands/queue.d.ts.map +0 -1
- package/dist/commands/queue.js +0 -376
- package/dist/commands/queue.js.map +0 -1
- package/dist/commands/resolve.d.ts +0 -26
- package/dist/commands/resolve.d.ts.map +0 -1
- package/dist/commands/resolve.js +0 -186
- package/dist/commands/resolve.js.map +0 -1
- package/dist/commands/retry.d.ts +0 -9
- package/dist/commands/retry.d.ts.map +0 -1
- package/dist/commands/retry.js +0 -71
- package/dist/commands/retry.js.map +0 -1
- package/dist/commands/review.d.ts +0 -82
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -479
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/run.d.ts +0 -73
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -509
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -19
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -142
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/shared/env-builder.d.ts +0 -49
- package/dist/commands/shared/env-builder.d.ts.map +0 -1
- package/dist/commands/shared/env-builder.js +0 -150
- package/dist/commands/shared/env-builder.js.map +0 -1
- package/dist/commands/slice.d.ts +0 -35
- package/dist/commands/slice.d.ts.map +0 -1
- package/dist/commands/slice.js +0 -316
- package/dist/commands/slice.js.map +0 -1
- package/dist/commands/state.d.ts +0 -8
- package/dist/commands/state.d.ts.map +0 -1
- package/dist/commands/state.js +0 -54
- package/dist/commands/state.js.map +0 -1
- package/dist/commands/status.d.ts +0 -14
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -297
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/summary.d.ts +0 -14
- package/dist/commands/summary.d.ts.map +0 -1
- package/dist/commands/summary.js +0 -193
- package/dist/commands/summary.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -25
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js +0 -134
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.d.ts +0 -22
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -90
- package/dist/commands/update.js.map +0 -1
- package/dist/web/assets/index-2JY0x_Ij.js +0 -381
- package/dist/web/assets/index-3h8pgmqL.css +0 -1
- package/dist/web/assets/index-B-wbyZq7.js +0 -386
- package/dist/web/assets/index-B1BnOpiO.css +0 -1
- package/dist/web/assets/index-B3CnV08_.js +0 -365
- package/dist/web/assets/index-B5QjuFh9.css +0 -1
- package/dist/web/assets/index-B8FW2ecQ.js +0 -370
- package/dist/web/assets/index-BFxPiKyy.js +0 -381
- package/dist/web/assets/index-BGqNh_Da.js +0 -365
- package/dist/web/assets/index-BIONU0qz.css +0 -1
- package/dist/web/assets/index-B_l_3wnA.js +0 -370
- package/dist/web/assets/index-Ba-4YvTQ.js +0 -365
- package/dist/web/assets/index-Bbb4-39N.js +0 -370
- package/dist/web/assets/index-BdgdShEN.js +0 -365
- package/dist/web/assets/index-BhiC4Z-G.js +0 -381
- package/dist/web/assets/index-BjhCFjZi.js +0 -381
- package/dist/web/assets/index-BlRxmrnQ.css +0 -1
- package/dist/web/assets/index-BqwbXsHS.js +0 -365
- package/dist/web/assets/index-BsC7RT48.css +0 -1
- package/dist/web/assets/index-Bvh8XI8_.js +0 -370
- package/dist/web/assets/index-C01r2ymn.js +0 -381
- package/dist/web/assets/index-C51Rbsmk.js +0 -381
- package/dist/web/assets/index-C7lMNxRE.js +0 -370
- package/dist/web/assets/index-CJLObgsn.js +0 -386
- package/dist/web/assets/index-CLuRf7Zt.js +0 -381
- package/dist/web/assets/index-CM3xFd3e.css +0 -1
- package/dist/web/assets/index-CNkBtDK7.js +0 -370
- package/dist/web/assets/index-CPQbZ1BL.css +0 -1
- package/dist/web/assets/index-CTy5dUDU.css +0 -1
- package/dist/web/assets/index-CU15COKs.js +0 -370
- package/dist/web/assets/index-CiRJZI4z.js +0 -386
- package/dist/web/assets/index-Cp7RYjoy.css +0 -1
- package/dist/web/assets/index-CvPkZOWT.js +0 -381
- package/dist/web/assets/index-CvUk-33B.css +0 -1
- package/dist/web/assets/index-Cvmj-oF6.css +0 -1
- package/dist/web/assets/index-CxE5iQVO.js +0 -381
- package/dist/web/assets/index-D7lZQpFV.js +0 -365
- package/dist/web/assets/index-DAyP4GOi.css +0 -1
- package/dist/web/assets/index-DCG0n8Kg.js +0 -386
- package/dist/web/assets/index-DEEI8cyF.css +0 -1
- package/dist/web/assets/index-DF99BowV.js +0 -381
- package/dist/web/assets/index-DGWsvFj6.css +0 -1
- package/dist/web/assets/index-DGpU39Cp.css +0 -1
- package/dist/web/assets/index-DI4kFgOi.js +0 -370
- package/dist/web/assets/index-DIyTcPw5.css +0 -1
- package/dist/web/assets/index-DTsfDC7m.js +0 -381
- package/dist/web/assets/index-DcgNAi4A.js +0 -386
- package/dist/web/assets/index-DgOAgkZy.css +0 -1
- package/dist/web/assets/index-DnHkqbOa.js +0 -386
- package/dist/web/assets/index-DnR7Idcf.css +0 -1
- package/dist/web/assets/index-DpVirMEe.css +0 -1
- package/dist/web/assets/index-DsYIWZ86.css +0 -1
- package/dist/web/assets/index-DtrDkci5.js +0 -381
- package/dist/web/assets/index-DyjIth5M.js +0 -386
- package/dist/web/assets/index-FwIKfHPL.css +0 -1
- package/dist/web/assets/index-IKrZymWk.css +0 -1
- package/dist/web/assets/index-MA6fM0ab.js +0 -381
- package/dist/web/assets/index-N_QxaSEg.css +0 -1
- package/dist/web/assets/index-OcU-0TCQ.css +0 -1
- package/dist/web/assets/index-OyhrmG-L.js +0 -381
- package/dist/web/assets/index-SQlBKu_s.js +0 -386
- package/dist/web/assets/index-Sv2B60J4.js +0 -370
- package/dist/web/assets/index-Vgyivb5u.js +0 -365
- package/dist/web/assets/index-ZABWMEZR.js +0 -381
- package/dist/web/assets/index-ZE5lOeJp.js +0 -386
- package/dist/web/assets/index-aCHmkAcJ.css +0 -1
- package/dist/web/assets/index-bFijnpuU.js +0 -381
- package/dist/web/assets/index-bUPZgSoZ.css +0 -1
- package/dist/web/assets/index-mz1VIYsP.css +0 -1
- package/dist/web/assets/index-oOp_MFeE.js +0 -376
- package/dist/web/assets/index-rfU713Zm.js +0 -386
- package/dist/web/assets/index-tuNH9gmb.js +0 -448
- package/dist/web/assets/index-viSwHyDD.js +0 -365
- package/dist/web/assets/index-yKEQysks.js +0 -365
package/dist/commands/queue.js
DELETED
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Queue command — manage the global job queue.
|
|
3
|
-
* Provides subcommands for viewing, clearing, and dispatching queued jobs.
|
|
4
|
-
*/
|
|
5
|
-
import * as path from 'path';
|
|
6
|
-
import { spawn } from 'child_process';
|
|
7
|
-
import chalk from 'chalk';
|
|
8
|
-
import { Command } from 'commander';
|
|
9
|
-
import { DEFAULT_QUEUE_MAX_WAIT_TIME, canStartJob, claimJobSlot, clearQueue, dispatchNextJob, enqueueJob, expireStaleJobs, getQueueStatus, getScriptPath, loadConfig, markJobRunning, removeJob, resolveJobProvider, resolvePreset, resolveProviderBucketKey, updateJobStatus, } from '@night-watch/core';
|
|
10
|
-
import { createLogger } from '@night-watch/core';
|
|
11
|
-
import { buildQueuedJobEnv } from './shared/env-builder.js';
|
|
12
|
-
const logger = createLogger('queue');
|
|
13
|
-
const VALID_JOB_TYPES = [
|
|
14
|
-
'executor',
|
|
15
|
-
'reviewer',
|
|
16
|
-
'qa',
|
|
17
|
-
'audit',
|
|
18
|
-
'slicer',
|
|
19
|
-
'planner',
|
|
20
|
-
'pr-resolver',
|
|
21
|
-
'merger',
|
|
22
|
-
];
|
|
23
|
-
function formatTimestamp(unixTs) {
|
|
24
|
-
if (unixTs === null)
|
|
25
|
-
return '-';
|
|
26
|
-
return new Date(unixTs * 1000).toLocaleString();
|
|
27
|
-
}
|
|
28
|
-
function formatDuration(unixTs) {
|
|
29
|
-
const now = Math.floor(Date.now() / 1000);
|
|
30
|
-
const diff = now - unixTs;
|
|
31
|
-
if (diff < 60)
|
|
32
|
-
return `${diff}s ago`;
|
|
33
|
-
if (diff < 3600)
|
|
34
|
-
return `${Math.floor(diff / 60)}m ago`;
|
|
35
|
-
if (diff < 86400)
|
|
36
|
-
return `${Math.floor(diff / 3600)}h ago`;
|
|
37
|
-
return `${Math.floor(diff / 86400)}d ago`;
|
|
38
|
-
}
|
|
39
|
-
function printQueueEntry(entry, indent = '') {
|
|
40
|
-
console.log(`${indent}${chalk.bold(`[${entry.id}]`)} ${chalk.cyan(entry.jobType)} for ${chalk.dim(entry.projectName)}`);
|
|
41
|
-
console.log(`${indent} Status: ${entry.status} | Priority: ${entry.priority} | Enqueued: ${formatDuration(entry.enqueuedAt)}`);
|
|
42
|
-
if (entry.dispatchedAt) {
|
|
43
|
-
console.log(`${indent} Dispatched: ${formatTimestamp(entry.dispatchedAt)}`);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
export function createQueueCommand() {
|
|
47
|
-
const queue = new Command('queue');
|
|
48
|
-
queue.description('Manage the global job queue');
|
|
49
|
-
// night-watch queue status
|
|
50
|
-
queue
|
|
51
|
-
.command('status')
|
|
52
|
-
.description('Show current queue status')
|
|
53
|
-
.option('--json', 'Output as JSON')
|
|
54
|
-
.action((opts) => {
|
|
55
|
-
const status = getQueueStatus();
|
|
56
|
-
if (opts.json) {
|
|
57
|
-
console.log(JSON.stringify({ ...status, enabled: true }, null, 2));
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
console.log(chalk.bold('\n📦 Global Job Queue Status\n'));
|
|
61
|
-
if (status.running) {
|
|
62
|
-
console.log(chalk.yellow('🔄 Running:'));
|
|
63
|
-
printQueueEntry(status.running, ' ');
|
|
64
|
-
console.log();
|
|
65
|
-
}
|
|
66
|
-
else {
|
|
67
|
-
console.log(chalk.dim(' No job currently running'));
|
|
68
|
-
}
|
|
69
|
-
console.log();
|
|
70
|
-
console.log(chalk.bold(`📋 Pending: ${status.pending.total} jobs`));
|
|
71
|
-
if (status.pending.total > 0) {
|
|
72
|
-
const byType = Object.entries(status.pending.byType);
|
|
73
|
-
if (byType.length > 0) {
|
|
74
|
-
console.log(' By type:');
|
|
75
|
-
for (const [type, count] of byType) {
|
|
76
|
-
console.log(` ${type}: ${count}`);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
console.log();
|
|
80
|
-
console.log(chalk.dim(' Next up:'));
|
|
81
|
-
const nextUp = status.items.find((i) => i.status === 'pending');
|
|
82
|
-
if (nextUp) {
|
|
83
|
-
printQueueEntry(nextUp, ' ');
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
if (status.items.length > 1) {
|
|
87
|
-
console.log();
|
|
88
|
-
console.log(chalk.dim(' All queued items:'));
|
|
89
|
-
for (const item of status.items) {
|
|
90
|
-
if (item.status === 'pending') {
|
|
91
|
-
printQueueEntry(item, ' ');
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
console.log();
|
|
96
|
-
});
|
|
97
|
-
// night-watch queue list
|
|
98
|
-
queue
|
|
99
|
-
.command('list')
|
|
100
|
-
.description('List all queue entries')
|
|
101
|
-
.option('--status <status>', 'Filter by status (pending, running, dispatched, expired)')
|
|
102
|
-
.option('--json', 'Output as JSON')
|
|
103
|
-
.action((opts) => {
|
|
104
|
-
const status = getQueueStatus();
|
|
105
|
-
let items = status.items;
|
|
106
|
-
if (opts.status) {
|
|
107
|
-
items = items.filter((i) => i.status === opts.status);
|
|
108
|
-
}
|
|
109
|
-
if (opts.json) {
|
|
110
|
-
console.log(JSON.stringify(items, null, 2));
|
|
111
|
-
return;
|
|
112
|
-
}
|
|
113
|
-
if (items.length === 0) {
|
|
114
|
-
console.log(chalk.dim('No queue entries found.'));
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
console.log(chalk.bold(`\n📋 Queue Entries (${items.length})\n`));
|
|
118
|
-
for (const item of items) {
|
|
119
|
-
printQueueEntry(item);
|
|
120
|
-
console.log();
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
// night-watch queue clear
|
|
124
|
-
queue
|
|
125
|
-
.command('clear')
|
|
126
|
-
.description('Clear pending jobs from the queue')
|
|
127
|
-
.option('--type <type>', 'Only clear jobs of this type')
|
|
128
|
-
.option('--all', 'Clear all entries including running (dangerous)')
|
|
129
|
-
.action((opts) => {
|
|
130
|
-
if (opts.type && !VALID_JOB_TYPES.includes(opts.type)) {
|
|
131
|
-
console.error(chalk.red(`Invalid job type: ${opts.type}`));
|
|
132
|
-
console.error(chalk.dim(`Valid types: ${VALID_JOB_TYPES.join(', ')}`));
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
const count = clearQueue(opts.type);
|
|
136
|
-
console.log(chalk.green(`Cleared ${count} pending job(s) from the queue.`));
|
|
137
|
-
});
|
|
138
|
-
// night-watch queue enqueue
|
|
139
|
-
queue
|
|
140
|
-
.command('enqueue <job-type> <project-dir>')
|
|
141
|
-
.description('Manually enqueue a job')
|
|
142
|
-
.option('--env <json>', 'JSON object of environment variables to store', '{}')
|
|
143
|
-
.option('--provider-key <key>', 'Provider bucket key (e.g. claude-native, codex)')
|
|
144
|
-
.action((jobType, projectDir, opts) => {
|
|
145
|
-
if (!VALID_JOB_TYPES.includes(jobType)) {
|
|
146
|
-
console.error(chalk.red(`Invalid job type: ${jobType}`));
|
|
147
|
-
console.error(chalk.dim(`Valid types: ${VALID_JOB_TYPES.join(', ')}`));
|
|
148
|
-
process.exit(1);
|
|
149
|
-
}
|
|
150
|
-
let envVars = {};
|
|
151
|
-
if (opts.env) {
|
|
152
|
-
try {
|
|
153
|
-
envVars = JSON.parse(opts.env);
|
|
154
|
-
}
|
|
155
|
-
catch {
|
|
156
|
-
console.error(chalk.red('Invalid JSON for --env'));
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
const projectName = path.basename(projectDir);
|
|
161
|
-
const queueConfig = loadConfig(projectDir).queue;
|
|
162
|
-
const id = enqueueJob(projectDir, projectName, jobType, envVars, queueConfig, opts.providerKey);
|
|
163
|
-
console.log(chalk.green(`Enqueued ${jobType} for ${projectName} (ID: ${id})`));
|
|
164
|
-
});
|
|
165
|
-
// night-watch queue resolve-key
|
|
166
|
-
queue
|
|
167
|
-
.command('resolve-key')
|
|
168
|
-
.description('Resolve the provider bucket key for a given project and job type')
|
|
169
|
-
.requiredOption('--project <dir>', 'Project directory')
|
|
170
|
-
.requiredOption('--job-type <type>', 'Job type (executor, reviewer, qa, audit, slicer, planner, pr-resolver, merger)')
|
|
171
|
-
.action((opts) => {
|
|
172
|
-
try {
|
|
173
|
-
const config = loadConfig(opts.project);
|
|
174
|
-
const presetId = resolveJobProvider(config, opts.jobType);
|
|
175
|
-
const preset = resolvePreset(config, presetId);
|
|
176
|
-
const effectiveProviderEnv = {
|
|
177
|
-
...(config.providerEnv ?? {}),
|
|
178
|
-
...(preset.envVars ?? {}),
|
|
179
|
-
};
|
|
180
|
-
const key = resolveProviderBucketKey(preset.command, effectiveProviderEnv);
|
|
181
|
-
process.stdout.write(`${key}\n`);
|
|
182
|
-
}
|
|
183
|
-
catch {
|
|
184
|
-
process.stdout.write('');
|
|
185
|
-
}
|
|
186
|
-
process.exit(0);
|
|
187
|
-
});
|
|
188
|
-
// night-watch queue dispatch
|
|
189
|
-
queue
|
|
190
|
-
.command('dispatch')
|
|
191
|
-
.description('Dispatch the next pending job (used by cron scripts)')
|
|
192
|
-
.option('--log <file>', 'Log file to write dispatch output')
|
|
193
|
-
.option('--project-dir <dir>', 'Project directory to load queue config from (defaults to cwd)')
|
|
194
|
-
.action((_opts) => {
|
|
195
|
-
const configDir = _opts.projectDir ?? process.cwd();
|
|
196
|
-
const entry = dispatchNextJob(loadConfig(configDir).queue);
|
|
197
|
-
if (!entry) {
|
|
198
|
-
logger.info('No pending jobs to dispatch');
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
logger.info(`Dispatching ${entry.jobType} for ${entry.projectName} (ID: ${entry.id})`);
|
|
202
|
-
// Construct the spawn command based on job type
|
|
203
|
-
const scriptName = getScriptNameForJobType(entry.jobType);
|
|
204
|
-
if (!scriptName) {
|
|
205
|
-
logger.error(`Unknown job type: ${entry.jobType}`);
|
|
206
|
-
return;
|
|
207
|
-
}
|
|
208
|
-
// Rebuild env from queued project's config (not from dispatcher process.env)
|
|
209
|
-
// This ensures provider-specific env (ANTHROPIC_BASE_URL, API keys, model ids)
|
|
210
|
-
// always comes from the queued job's own project config.
|
|
211
|
-
let projectEnv;
|
|
212
|
-
try {
|
|
213
|
-
projectEnv = buildQueuedJobEnv(entry);
|
|
214
|
-
}
|
|
215
|
-
catch {
|
|
216
|
-
// If config load fails, fall back to process env
|
|
217
|
-
projectEnv = {};
|
|
218
|
-
}
|
|
219
|
-
const env = {
|
|
220
|
-
...process.env,
|
|
221
|
-
...projectEnv,
|
|
222
|
-
// Overlay persisted runtime-only NW_* queue markers from the queue entry
|
|
223
|
-
// (These are queue-specific flags, not provider identity)
|
|
224
|
-
...filterQueueMarkers(entry.envJson),
|
|
225
|
-
NW_QUEUE_DISPATCHED: '1',
|
|
226
|
-
NW_QUEUE_ENTRY_ID: String(entry.id),
|
|
227
|
-
};
|
|
228
|
-
// Resolve the bundled script path for the current install context.
|
|
229
|
-
const scriptPath = getScriptPath(scriptName);
|
|
230
|
-
logger.info(`Spawning: ${scriptPath} ${entry.projectPath}`);
|
|
231
|
-
try {
|
|
232
|
-
// Spawn as detached to let it run independently
|
|
233
|
-
const child = spawn('bash', [scriptPath, entry.projectPath], {
|
|
234
|
-
detached: true,
|
|
235
|
-
stdio: 'ignore',
|
|
236
|
-
env,
|
|
237
|
-
cwd: entry.projectPath,
|
|
238
|
-
});
|
|
239
|
-
child.unref();
|
|
240
|
-
logger.info(`Spawned PID: ${child.pid}`);
|
|
241
|
-
// Mark as running now that the process is launched
|
|
242
|
-
markJobRunning(entry.id);
|
|
243
|
-
}
|
|
244
|
-
catch (error) {
|
|
245
|
-
updateJobStatus(entry.id, 'pending');
|
|
246
|
-
logger.error(`Failed to dispatch ${entry.jobType} for ${entry.projectName}: ${error instanceof Error ? error.message : String(error)}`);
|
|
247
|
-
process.exit(1);
|
|
248
|
-
}
|
|
249
|
-
});
|
|
250
|
-
// night-watch queue claim
|
|
251
|
-
queue
|
|
252
|
-
.command('claim <job-type> <project-dir>')
|
|
253
|
-
.description('Atomically claim a concurrency slot and insert a running entry (used by cron scripts)')
|
|
254
|
-
.option('--provider-key <key>', 'Provider bucket key (e.g. claude-native, codex)')
|
|
255
|
-
.action((jobType, projectDir, opts) => {
|
|
256
|
-
if (!VALID_JOB_TYPES.includes(jobType)) {
|
|
257
|
-
console.error(`Invalid job type: ${jobType}`);
|
|
258
|
-
console.error(`Valid types: ${VALID_JOB_TYPES.join(', ')}`);
|
|
259
|
-
process.exit(1);
|
|
260
|
-
}
|
|
261
|
-
const queueConfig = loadConfig(projectDir).queue;
|
|
262
|
-
const projectName = path.basename(projectDir);
|
|
263
|
-
const result = claimJobSlot(projectDir, projectName, jobType, opts.providerKey, queueConfig);
|
|
264
|
-
if (!result.claimed) {
|
|
265
|
-
process.exit(1);
|
|
266
|
-
}
|
|
267
|
-
// Print only the numeric ID so bash callers can capture it cleanly.
|
|
268
|
-
process.stdout.write(`${result.id}\n`);
|
|
269
|
-
process.exit(0);
|
|
270
|
-
});
|
|
271
|
-
queue
|
|
272
|
-
.command('complete <id>')
|
|
273
|
-
.description('Remove a completed queue entry (used by cron scripts)')
|
|
274
|
-
.action((id) => {
|
|
275
|
-
const queueId = parseInt(id, 10);
|
|
276
|
-
if (isNaN(queueId) || queueId < 1) {
|
|
277
|
-
console.error(chalk.red('Queue entry id must be a positive integer'));
|
|
278
|
-
process.exit(1);
|
|
279
|
-
}
|
|
280
|
-
removeJob(queueId);
|
|
281
|
-
});
|
|
282
|
-
queue
|
|
283
|
-
.command('can-start')
|
|
284
|
-
.description('Return a zero exit status when the global queue has an available slot')
|
|
285
|
-
.option('--project-dir <dir>', 'Project directory to load queue config from (defaults to cwd)')
|
|
286
|
-
.action((opts) => {
|
|
287
|
-
const configDir = opts.projectDir ?? process.cwd();
|
|
288
|
-
const queueConfig = loadConfig(configDir).queue;
|
|
289
|
-
process.exit(canStartJob(queueConfig) ? 0 : 1);
|
|
290
|
-
});
|
|
291
|
-
// night-watch queue expire
|
|
292
|
-
queue
|
|
293
|
-
.command('expire')
|
|
294
|
-
.description('Expire stale queued jobs')
|
|
295
|
-
.option('--max-wait <seconds>', 'Maximum wait time in seconds', String(DEFAULT_QUEUE_MAX_WAIT_TIME))
|
|
296
|
-
.action((opts) => {
|
|
297
|
-
const maxWait = parseInt(opts.maxWait, 10);
|
|
298
|
-
if (isNaN(maxWait) || maxWait < 60) {
|
|
299
|
-
console.error(chalk.red('--max-wait must be at least 60 seconds'));
|
|
300
|
-
process.exit(1);
|
|
301
|
-
}
|
|
302
|
-
const count = expireStaleJobs(maxWait);
|
|
303
|
-
if (count > 0) {
|
|
304
|
-
console.log(chalk.yellow(`Expired ${count} stale job(s)`));
|
|
305
|
-
}
|
|
306
|
-
else {
|
|
307
|
-
console.log(chalk.dim('No stale jobs to expire'));
|
|
308
|
-
}
|
|
309
|
-
});
|
|
310
|
-
return queue;
|
|
311
|
-
}
|
|
312
|
-
/**
|
|
313
|
-
* NW_* env keys that are legitimate queue/runtime markers (not provider identity keys).
|
|
314
|
-
* Only these keys from a queued entry's envJson are forwarded at dispatch time.
|
|
315
|
-
* Provider identity (ANTHROPIC_BASE_URL, API keys, model ids) is always recomputed
|
|
316
|
-
* from the queued job's own project config via buildQueuedJobEnv.
|
|
317
|
-
*/
|
|
318
|
-
const QUEUE_MARKER_KEYS = new Set([
|
|
319
|
-
'NW_DRY_RUN',
|
|
320
|
-
'NW_CRON_TRIGGER',
|
|
321
|
-
'NW_DEFAULT_BRANCH',
|
|
322
|
-
'NW_TARGET_PR',
|
|
323
|
-
'NW_REVIEWER_WORKER_MODE',
|
|
324
|
-
'NW_REVIEWER_PARALLEL',
|
|
325
|
-
'NW_REVIEWER_WORKER_STAGGER',
|
|
326
|
-
'NW_REVIEWER_MAX_RUNTIME',
|
|
327
|
-
'NW_REVIEWER_MAX_RETRIES',
|
|
328
|
-
'NW_REVIEWER_RETRY_DELAY',
|
|
329
|
-
'NW_REVIEWER_MAX_PRS_PER_RUN',
|
|
330
|
-
'NW_MIN_REVIEW_SCORE',
|
|
331
|
-
'NW_BRANCH_PATTERNS',
|
|
332
|
-
'NW_PRD_DIR',
|
|
333
|
-
'NW_AUTO_MERGE',
|
|
334
|
-
'NW_AUTO_MERGE_METHOD',
|
|
335
|
-
'NW_MAX_RUNTIME',
|
|
336
|
-
'NW_QA_MAX_RUNTIME',
|
|
337
|
-
]);
|
|
338
|
-
/**
|
|
339
|
-
* Filter envJson to only pass through legitimate queue/runtime markers.
|
|
340
|
-
* Drops any provider identity keys that may have been persisted in the queue entry.
|
|
341
|
-
*/
|
|
342
|
-
function filterQueueMarkers(envJson) {
|
|
343
|
-
const result = {};
|
|
344
|
-
for (const [key, value] of Object.entries(envJson)) {
|
|
345
|
-
if (QUEUE_MARKER_KEYS.has(key)) {
|
|
346
|
-
result[key] = value;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
return result;
|
|
350
|
-
}
|
|
351
|
-
function getScriptNameForJobType(jobType) {
|
|
352
|
-
switch (jobType) {
|
|
353
|
-
case 'executor':
|
|
354
|
-
return 'night-watch-cron.sh';
|
|
355
|
-
case 'reviewer':
|
|
356
|
-
return 'night-watch-pr-reviewer-cron.sh';
|
|
357
|
-
case 'qa':
|
|
358
|
-
return 'night-watch-qa-cron.sh';
|
|
359
|
-
case 'audit':
|
|
360
|
-
return 'night-watch-audit-cron.sh';
|
|
361
|
-
case 'slicer':
|
|
362
|
-
return 'night-watch-slicer-cron.sh';
|
|
363
|
-
case 'planner':
|
|
364
|
-
return 'night-watch-plan-cron.sh';
|
|
365
|
-
case 'pr-resolver':
|
|
366
|
-
return 'night-watch-pr-resolver-cron.sh';
|
|
367
|
-
case 'merger':
|
|
368
|
-
return 'night-watch-merger-cron.sh';
|
|
369
|
-
default:
|
|
370
|
-
return null;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
export function queueCommand(program) {
|
|
374
|
-
program.addCommand(createQueueCommand());
|
|
375
|
-
}
|
|
376
|
-
//# sourceMappingURL=queue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve command - executes the PR resolver cron script
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from 'commander';
|
|
5
|
-
import { INightWatchConfig } from '@night-watch/core';
|
|
6
|
-
/**
|
|
7
|
-
* Options for the resolve command
|
|
8
|
-
*/
|
|
9
|
-
export interface IResolveOptions {
|
|
10
|
-
dryRun: boolean;
|
|
11
|
-
timeout?: string;
|
|
12
|
-
provider?: string;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Build environment variables map from config and CLI options for PR resolver
|
|
16
|
-
*/
|
|
17
|
-
export declare function buildEnvVars(config: INightWatchConfig, options: IResolveOptions): Record<string, string>;
|
|
18
|
-
/**
|
|
19
|
-
* Apply CLI flag overrides to the config for PR resolver
|
|
20
|
-
*/
|
|
21
|
-
export declare function applyCliOverrides(config: INightWatchConfig, options: IResolveOptions): INightWatchConfig;
|
|
22
|
-
/**
|
|
23
|
-
* Register the resolve command with the program
|
|
24
|
-
*/
|
|
25
|
-
export declare function resolveCommand(program: Command): void;
|
|
26
|
-
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,iBAAiB,EAalB,MAAM,mBAAmB,CAAC;AAS3B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,eAAe,GACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAcxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,eAAe,GACvB,iBAAiB,CAgBnB;AA6BD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyIrD"}
|
package/dist/commands/resolve.js
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Resolve command - executes the PR resolver cron script
|
|
3
|
-
*/
|
|
4
|
-
import { createSpinner, createTable, dim, executeScriptWithOutput, getScriptPath, header, info, loadConfig, parseScriptResult, resolveJobProvider, sendNotifications, error as uiError, } from '@night-watch/core';
|
|
5
|
-
import { buildBaseEnvVars, formatProviderDisplay, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
|
|
6
|
-
import { execFileSync } from 'child_process';
|
|
7
|
-
import * as path from 'path';
|
|
8
|
-
/**
|
|
9
|
-
* Build environment variables map from config and CLI options for PR resolver
|
|
10
|
-
*/
|
|
11
|
-
export function buildEnvVars(config, options) {
|
|
12
|
-
// Start with base env vars shared by all job types
|
|
13
|
-
const env = buildBaseEnvVars(config, 'pr-resolver', options.dryRun);
|
|
14
|
-
// Runtime for PR resolver (uses NW_PR_RESOLVER_* variables)
|
|
15
|
-
env.NW_PR_RESOLVER_MAX_RUNTIME = String(config.prResolver.maxRuntime);
|
|
16
|
-
env.NW_PR_RESOLVER_MAX_PRS_PER_RUN = String(config.prResolver.maxPrsPerRun);
|
|
17
|
-
env.NW_PR_RESOLVER_PER_PR_TIMEOUT = String(config.prResolver.perPrTimeout);
|
|
18
|
-
env.NW_PR_RESOLVER_AI_CONFLICT_RESOLUTION = config.prResolver.aiConflictResolution ? '1' : '0';
|
|
19
|
-
env.NW_PR_RESOLVER_AI_REVIEW_RESOLUTION = config.prResolver.aiReviewResolution ? '1' : '0';
|
|
20
|
-
env.NW_PR_RESOLVER_READY_LABEL = config.prResolver.readyLabel;
|
|
21
|
-
env.NW_PR_RESOLVER_BRANCH_PATTERNS = config.prResolver.branchPatterns.join(',');
|
|
22
|
-
return env;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Apply CLI flag overrides to the config for PR resolver
|
|
26
|
-
*/
|
|
27
|
-
export function applyCliOverrides(config, options) {
|
|
28
|
-
const overridden = { ...config, prResolver: { ...config.prResolver } };
|
|
29
|
-
if (options.timeout) {
|
|
30
|
-
const timeout = parseInt(options.timeout, 10);
|
|
31
|
-
if (!isNaN(timeout)) {
|
|
32
|
-
overridden.prResolver.maxRuntime = timeout;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
if (options.provider) {
|
|
36
|
-
// Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
|
|
37
|
-
overridden._cliProviderOverride = options.provider;
|
|
38
|
-
}
|
|
39
|
-
return overridden;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Get open PRs with conflict status (no branch pattern filtering)
|
|
43
|
-
*/
|
|
44
|
-
function getOpenPrs() {
|
|
45
|
-
try {
|
|
46
|
-
const args = ['pr', 'list', '--state', 'open', '--json', 'number,title,headRefName,mergeable'];
|
|
47
|
-
const result = execFileSync('gh', args, {
|
|
48
|
-
encoding: 'utf-8',
|
|
49
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
50
|
-
});
|
|
51
|
-
const prs = JSON.parse(result.trim() || '[]');
|
|
52
|
-
return prs.map((pr) => ({
|
|
53
|
-
number: pr.number,
|
|
54
|
-
title: pr.title,
|
|
55
|
-
branch: pr.headRefName,
|
|
56
|
-
mergeable: pr.mergeable,
|
|
57
|
-
}));
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
// gh CLI not available or not authenticated
|
|
61
|
-
return [];
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Register the resolve command with the program
|
|
66
|
-
*/
|
|
67
|
-
export function resolveCommand(program) {
|
|
68
|
-
program
|
|
69
|
-
.command('resolve')
|
|
70
|
-
.description('Run PR conflict resolver now')
|
|
71
|
-
.option('--dry-run', 'Show what would be executed without running')
|
|
72
|
-
.option('--timeout <seconds>', 'Override max runtime')
|
|
73
|
-
.option('--provider <string>', 'AI provider to use')
|
|
74
|
-
.action(async (options) => {
|
|
75
|
-
// Get the project directory (current working directory)
|
|
76
|
-
const projectDir = process.cwd();
|
|
77
|
-
// Load config from file and environment
|
|
78
|
-
let config = loadConfig(projectDir);
|
|
79
|
-
// Apply CLI flag overrides
|
|
80
|
-
config = applyCliOverrides(config, options);
|
|
81
|
-
if (!config.prResolver.enabled && !options.dryRun) {
|
|
82
|
-
info('PR resolver is disabled in config; skipping.');
|
|
83
|
-
process.exit(0);
|
|
84
|
-
}
|
|
85
|
-
// Build environment variables
|
|
86
|
-
const envVars = buildEnvVars(config, options);
|
|
87
|
-
// Get the script path
|
|
88
|
-
const scriptPath = getScriptPath('night-watch-pr-resolver-cron.sh');
|
|
89
|
-
if (options.dryRun) {
|
|
90
|
-
header('Dry Run: PR Resolver');
|
|
91
|
-
// Resolve resolver-specific provider
|
|
92
|
-
const resolverProvider = resolveJobProvider(config, 'pr-resolver');
|
|
93
|
-
// Configuration section with table
|
|
94
|
-
header('Configuration');
|
|
95
|
-
const configTable = createTable({ head: ['Setting', 'Value'] });
|
|
96
|
-
configTable.push(['Provider', resolverProvider]);
|
|
97
|
-
configTable.push([
|
|
98
|
-
'Max Runtime',
|
|
99
|
-
`${config.prResolver.maxRuntime}s (${Math.floor(config.prResolver.maxRuntime / 60)}min)`,
|
|
100
|
-
]);
|
|
101
|
-
configTable.push([
|
|
102
|
-
'Max PRs Per Run',
|
|
103
|
-
config.prResolver.maxPrsPerRun === 0
|
|
104
|
-
? 'Unlimited'
|
|
105
|
-
: String(config.prResolver.maxPrsPerRun),
|
|
106
|
-
]);
|
|
107
|
-
configTable.push(['Per-PR Timeout', `${config.prResolver.perPrTimeout}s`]);
|
|
108
|
-
configTable.push([
|
|
109
|
-
'AI Conflict Resolution',
|
|
110
|
-
config.prResolver.aiConflictResolution ? 'Enabled' : 'Disabled',
|
|
111
|
-
]);
|
|
112
|
-
configTable.push([
|
|
113
|
-
'AI Review Resolution',
|
|
114
|
-
config.prResolver.aiReviewResolution ? 'Enabled' : 'Disabled',
|
|
115
|
-
]);
|
|
116
|
-
configTable.push(['Ready Label', config.prResolver.readyLabel]);
|
|
117
|
-
configTable.push([
|
|
118
|
-
'Branch Patterns',
|
|
119
|
-
config.prResolver.branchPatterns.length > 0
|
|
120
|
-
? config.prResolver.branchPatterns.join(', ')
|
|
121
|
-
: '(all)',
|
|
122
|
-
]);
|
|
123
|
-
console.log(configTable.toString());
|
|
124
|
-
// Check for open PRs
|
|
125
|
-
header('Open PRs');
|
|
126
|
-
const openPrs = getOpenPrs();
|
|
127
|
-
if (openPrs.length === 0) {
|
|
128
|
-
dim(' (no open PRs found)');
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
for (const pr of openPrs) {
|
|
132
|
-
const conflictStatus = pr.mergeable === 'CONFLICTING' ? ' [CONFLICT]' : '';
|
|
133
|
-
info(`#${pr.number}: ${pr.title}${conflictStatus}`);
|
|
134
|
-
dim(` Branch: ${pr.branch}`);
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
// Environment variables
|
|
138
|
-
header('Environment Variables');
|
|
139
|
-
for (const [key, value] of Object.entries(envVars)) {
|
|
140
|
-
dim(` ${key}=${value}`);
|
|
141
|
-
}
|
|
142
|
-
// Full command that would be executed
|
|
143
|
-
header('Command');
|
|
144
|
-
dim(` bash ${scriptPath} ${projectDir}`);
|
|
145
|
-
console.log();
|
|
146
|
-
process.exit(0);
|
|
147
|
-
}
|
|
148
|
-
// Execute the script with spinner
|
|
149
|
-
const spinner = createSpinner('Running PR resolver...');
|
|
150
|
-
spinner.start();
|
|
151
|
-
try {
|
|
152
|
-
await maybeApplyCronSchedulingDelay(config, 'pr-resolver', projectDir);
|
|
153
|
-
const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
|
|
154
|
-
const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
|
|
155
|
-
if (exitCode === 0) {
|
|
156
|
-
if (scriptResult?.status === 'queued') {
|
|
157
|
-
spinner.succeed('PR resolver queued — another job is currently running');
|
|
158
|
-
}
|
|
159
|
-
else if (scriptResult?.status?.startsWith('skip_')) {
|
|
160
|
-
spinner.succeed('PR resolver completed (no PRs needed resolution)');
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
spinner.succeed('PR resolver completed successfully');
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
else {
|
|
167
|
-
spinner.fail(`PR resolver exited with code ${exitCode}`);
|
|
168
|
-
}
|
|
169
|
-
// Send notifications (fire-and-forget, failures do not affect exit code)
|
|
170
|
-
const notificationEvent = exitCode === 0 ? 'pr_resolver_completed' : 'pr_resolver_failed';
|
|
171
|
-
await sendNotifications(config, {
|
|
172
|
-
event: notificationEvent,
|
|
173
|
-
projectName: path.basename(projectDir),
|
|
174
|
-
exitCode,
|
|
175
|
-
provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
|
|
176
|
-
});
|
|
177
|
-
process.exit(exitCode);
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
spinner.fail('Failed to execute resolve command');
|
|
181
|
-
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
182
|
-
process.exit(1);
|
|
183
|
-
}
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
//# sourceMappingURL=resolve.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/retry.d.ts
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Retry command — Move a completed PRD back to pending for re-execution.
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from 'commander';
|
|
5
|
-
/**
|
|
6
|
-
* Register the retry command with the program
|
|
7
|
-
*/
|
|
8
|
-
export declare function retryCommand(program: Command): void;
|
|
9
|
-
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBpC;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CnD"}
|