@jonit-dev/night-watch-cli 1.8.8-beta.1 → 1.8.8-beta.8
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 +621 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +38 -6
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +4 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +25 -0
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +2 -0
- package/dist/commands/qa.js.map +1 -1
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +27 -4
- package/dist/commands/queue.js.map +1 -1
- package/dist/commands/resolve.d.ts +26 -0
- package/dist/commands/resolve.d.ts.map +1 -0
- package/dist/commands/resolve.js +186 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/summary.d.ts +14 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +193 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +14 -2
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/scripts/night-watch-helpers.sh +10 -1
- package/dist/scripts/night-watch-pr-resolver-cron.sh +402 -0
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +21 -5
- package/dist/scripts/night-watch-qa-cron.sh +30 -4
- package/dist/scripts/test-helpers.bats +45 -0
- package/dist/templates/night-watch-pr-reviewer.md +2 -1
- package/dist/templates/pr-reviewer.md +2 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/commands/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary command for Night Watch CLI
|
|
3
|
+
* Shows a "morning briefing" combining job runs, PRs, and queue status
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface ISummaryOptions {
|
|
7
|
+
hours?: string;
|
|
8
|
+
json?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Summary command implementation
|
|
12
|
+
*/
|
|
13
|
+
export declare function summaryCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=summary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.d.ts","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA2DD;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyIrD"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Summary command for Night Watch CLI
|
|
3
|
+
* Shows a "morning briefing" combining job runs, PRs, and queue status
|
|
4
|
+
*/
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { DEFAULT_SUMMARY_WINDOW_HOURS, createTable, dim, getSummaryData, header, info, loadConfig, } from '@night-watch/core';
|
|
8
|
+
/**
|
|
9
|
+
* Format duration from seconds to human-readable string (e.g., "8m 32s")
|
|
10
|
+
*/
|
|
11
|
+
function formatDuration(seconds) {
|
|
12
|
+
if (seconds === null)
|
|
13
|
+
return '-';
|
|
14
|
+
const mins = Math.floor(seconds / 60);
|
|
15
|
+
const secs = seconds % 60;
|
|
16
|
+
if (mins === 0)
|
|
17
|
+
return `${secs}s`;
|
|
18
|
+
return `${mins}m ${secs}s`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Format CI status with color coding
|
|
22
|
+
*/
|
|
23
|
+
function formatCiStatus(status) {
|
|
24
|
+
if (status === 'pass')
|
|
25
|
+
return chalk.green('pass');
|
|
26
|
+
if (status === 'fail')
|
|
27
|
+
return chalk.red('fail');
|
|
28
|
+
if (status === 'pending')
|
|
29
|
+
return chalk.yellow('pending');
|
|
30
|
+
return chalk.dim('unknown');
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format review score with color coding
|
|
34
|
+
*/
|
|
35
|
+
function formatReviewScore(score) {
|
|
36
|
+
if (score === null)
|
|
37
|
+
return chalk.dim('-');
|
|
38
|
+
if (score >= 80)
|
|
39
|
+
return chalk.green(String(score));
|
|
40
|
+
if (score >= 60)
|
|
41
|
+
return chalk.yellow(String(score));
|
|
42
|
+
return chalk.red(String(score));
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Format job status with color coding
|
|
46
|
+
*/
|
|
47
|
+
function formatJobStatus(status) {
|
|
48
|
+
if (status === 'success')
|
|
49
|
+
return chalk.green('success');
|
|
50
|
+
if (status === 'failure')
|
|
51
|
+
return chalk.red('failure');
|
|
52
|
+
if (status === 'timeout')
|
|
53
|
+
return chalk.yellow('timeout');
|
|
54
|
+
if (status === 'rate_limited')
|
|
55
|
+
return chalk.magenta('rate_limited');
|
|
56
|
+
if (status === 'skipped')
|
|
57
|
+
return chalk.dim('skipped');
|
|
58
|
+
return chalk.dim(status);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Extract project name from path
|
|
62
|
+
*/
|
|
63
|
+
function getProjectName(projectPath) {
|
|
64
|
+
return path.basename(projectPath) || projectPath;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format provider key for display
|
|
68
|
+
*/
|
|
69
|
+
function formatProvider(providerKey) {
|
|
70
|
+
return providerKey.split(':')[0] || providerKey;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Summary command implementation
|
|
74
|
+
*/
|
|
75
|
+
export function summaryCommand(program) {
|
|
76
|
+
program
|
|
77
|
+
.command('summary')
|
|
78
|
+
.description('Show a summary of recent Night Watch activity')
|
|
79
|
+
.option('--hours <n>', 'Time window in hours (default: 12)', String(DEFAULT_SUMMARY_WINDOW_HOURS))
|
|
80
|
+
.option('--json', 'Output summary as JSON')
|
|
81
|
+
.action(async (options) => {
|
|
82
|
+
try {
|
|
83
|
+
const projectDir = process.cwd();
|
|
84
|
+
const config = loadConfig(projectDir);
|
|
85
|
+
const hours = parseInt(options.hours || String(DEFAULT_SUMMARY_WINDOW_HOURS), 10);
|
|
86
|
+
if (isNaN(hours) || hours <= 0) {
|
|
87
|
+
console.error('Error: --hours must be a positive integer');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
const data = await getSummaryData(projectDir, hours, config.branchPatterns);
|
|
91
|
+
// Output as JSON if requested
|
|
92
|
+
if (options.json) {
|
|
93
|
+
console.log(JSON.stringify(data, null, 2));
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
// Print header
|
|
97
|
+
console.log();
|
|
98
|
+
console.log(chalk.bold.cyan(`Night Watch Summary (last ${data.windowHours}h)`));
|
|
99
|
+
console.log(chalk.dim('─'.repeat(40)));
|
|
100
|
+
console.log();
|
|
101
|
+
// Jobs executed section
|
|
102
|
+
if (data.jobRuns.length === 0) {
|
|
103
|
+
info('No recent activity in this time window.');
|
|
104
|
+
console.log();
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
// Job counts with colored indicators
|
|
108
|
+
const countParts = [];
|
|
109
|
+
if (data.counts.succeeded > 0) {
|
|
110
|
+
countParts.push(chalk.green(`✓ ${data.counts.succeeded} succeeded`));
|
|
111
|
+
}
|
|
112
|
+
if (data.counts.failed > 0) {
|
|
113
|
+
countParts.push(chalk.red(`✗ ${data.counts.failed} failed`));
|
|
114
|
+
}
|
|
115
|
+
if (data.counts.timedOut > 0) {
|
|
116
|
+
countParts.push(chalk.yellow(`⏱ ${data.counts.timedOut} timed out`));
|
|
117
|
+
}
|
|
118
|
+
if (data.counts.rateLimited > 0) {
|
|
119
|
+
countParts.push(chalk.magenta(`⏳ ${data.counts.rateLimited} rate limited`));
|
|
120
|
+
}
|
|
121
|
+
if (data.counts.skipped > 0) {
|
|
122
|
+
countParts.push(chalk.dim(`${data.counts.skipped} skipped`));
|
|
123
|
+
}
|
|
124
|
+
console.log(`Jobs Executed: ${data.counts.total}`);
|
|
125
|
+
if (countParts.length > 0) {
|
|
126
|
+
console.log(` ${countParts.join(' ')}`);
|
|
127
|
+
}
|
|
128
|
+
console.log();
|
|
129
|
+
// Job runs table
|
|
130
|
+
const table = createTable({
|
|
131
|
+
head: ['Job', 'Status', 'Project', 'Provider', 'Duration'],
|
|
132
|
+
colWidths: [12, 12, 20, 12, 12],
|
|
133
|
+
});
|
|
134
|
+
for (const run of data.jobRuns.slice(0, 10)) {
|
|
135
|
+
table.push([
|
|
136
|
+
run.jobType,
|
|
137
|
+
formatJobStatus(run.status),
|
|
138
|
+
getProjectName(run.projectPath),
|
|
139
|
+
formatProvider(run.providerKey),
|
|
140
|
+
formatDuration(run.durationSeconds),
|
|
141
|
+
]);
|
|
142
|
+
}
|
|
143
|
+
console.log(table.toString());
|
|
144
|
+
if (data.jobRuns.length > 10) {
|
|
145
|
+
dim(` ... and ${data.jobRuns.length - 10} more`);
|
|
146
|
+
}
|
|
147
|
+
console.log();
|
|
148
|
+
}
|
|
149
|
+
// Open PRs section
|
|
150
|
+
if (data.openPrs.length > 0) {
|
|
151
|
+
header(`Open PRs (${data.openPrs.length})`);
|
|
152
|
+
const prTable = createTable({
|
|
153
|
+
head: ['#', 'Title', 'CI', 'Score'],
|
|
154
|
+
colWidths: [6, 40, 10, 8],
|
|
155
|
+
});
|
|
156
|
+
for (const pr of data.openPrs) {
|
|
157
|
+
const title = pr.title.length > 37 ? pr.title.substring(0, 34) + '...' : pr.title;
|
|
158
|
+
prTable.push([
|
|
159
|
+
String(pr.number),
|
|
160
|
+
title,
|
|
161
|
+
formatCiStatus(pr.ciStatus),
|
|
162
|
+
formatReviewScore(pr.reviewScore),
|
|
163
|
+
]);
|
|
164
|
+
}
|
|
165
|
+
console.log(prTable.toString());
|
|
166
|
+
console.log();
|
|
167
|
+
}
|
|
168
|
+
// Queue section
|
|
169
|
+
if (data.pendingQueueItems.length > 0) {
|
|
170
|
+
const jobTypes = [...new Set(data.pendingQueueItems.map((item) => item.jobType))];
|
|
171
|
+
const projectNames = [...new Set(data.pendingQueueItems.map((item) => item.projectName))];
|
|
172
|
+
dim(`Queue: ${data.pendingQueueItems.length} pending (${jobTypes.join(', ')}) for ${projectNames.join(', ')}`);
|
|
173
|
+
console.log();
|
|
174
|
+
}
|
|
175
|
+
// Action items or "all healthy" message
|
|
176
|
+
if (data.actionItems.length > 0) {
|
|
177
|
+
console.log(chalk.yellow('⚠ Action needed:'));
|
|
178
|
+
for (const item of data.actionItems) {
|
|
179
|
+
console.log(` • ${item}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
console.log(chalk.green('✓ No action needed — all jobs healthy.'));
|
|
184
|
+
}
|
|
185
|
+
console.log();
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
console.error(`Error getting summary: ${error instanceof Error ? error.message : String(error)}`);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
//# sourceMappingURL=summary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"summary.js","sourceRoot":"","sources":["../../src/commands/summary.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,gBAAgB,
|
|
1
|
+
{"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBpC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC/B,gBAAgB,CAoDlB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgFvD"}
|
|
@@ -23,7 +23,13 @@ export function performUninstall(projectDir, options) {
|
|
|
23
23
|
if (!options?.keepLogs) {
|
|
24
24
|
const logDir = path.join(projectDir, 'logs');
|
|
25
25
|
if (fs.existsSync(logDir)) {
|
|
26
|
-
const logFiles = [
|
|
26
|
+
const logFiles = [
|
|
27
|
+
'executor.log',
|
|
28
|
+
'reviewer.log',
|
|
29
|
+
'slicer.log',
|
|
30
|
+
'audit.log',
|
|
31
|
+
'pr-resolver.log',
|
|
32
|
+
];
|
|
27
33
|
logFiles.forEach((logFile) => {
|
|
28
34
|
const logPath = path.join(logDir, logFile);
|
|
29
35
|
if (fs.existsSync(logPath)) {
|
|
@@ -82,7 +88,13 @@ export function uninstallCommand(program) {
|
|
|
82
88
|
if (!options.keepLogs) {
|
|
83
89
|
const logDir = path.join(projectDir, 'logs');
|
|
84
90
|
if (fs.existsSync(logDir)) {
|
|
85
|
-
const logFiles = [
|
|
91
|
+
const logFiles = [
|
|
92
|
+
'executor.log',
|
|
93
|
+
'reviewer.log',
|
|
94
|
+
'slicer.log',
|
|
95
|
+
'audit.log',
|
|
96
|
+
'pr-resolver.log',
|
|
97
|
+
];
|
|
86
98
|
let logsRemoved = 0;
|
|
87
99
|
logFiles.forEach((logFile) => {
|
|
88
100
|
const logPath = path.join(logDir, logFile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EACL,GAAG,EACH,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,uBAAuB,EACvB,OAAO,EACP,KAAK,IAAI,OAAO,EAChB,iBAAiB,EACjB,IAAI,GACL,MAAM,mBAAmB,CAAC;AAY3B;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAAkB,EAClB,OAAgC;IAEhC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAE3C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CACnE,CAAC;QACF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,YAAY,GAAG,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACjE,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAE9B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YAC7C,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,MAAM,QAAQ,GAAG,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
|
|
@@ -589,6 +589,11 @@ cleanup_worktrees() {
|
|
|
589
589
|
local project_name
|
|
590
590
|
project_name=$(basename "${project_dir}")
|
|
591
591
|
|
|
592
|
+
# Clear stale worktree registrations first. This fixes cases where a
|
|
593
|
+
# worktree directory was deleted out-of-band (for example by an agent
|
|
594
|
+
# runtime crash), leaving Git thinking the branch is still in use.
|
|
595
|
+
git -C "${project_dir}" worktree prune >/dev/null 2>&1 || true
|
|
596
|
+
|
|
592
597
|
local match_token="${project_name}-nw"
|
|
593
598
|
if [ -n "${scope}" ]; then
|
|
594
599
|
match_token="${scope}"
|
|
@@ -602,6 +607,10 @@ cleanup_worktrees() {
|
|
|
602
607
|
log "CLEANUP: Removing leftover worktree ${wt}"
|
|
603
608
|
git -C "${project_dir}" worktree remove --force "${wt}" 2>/dev/null || true
|
|
604
609
|
done || true
|
|
610
|
+
|
|
611
|
+
# Prune again after removals so Git drops any admin entries left behind by
|
|
612
|
+
# force-removal or previously broken worktrees outside Night Watch naming.
|
|
613
|
+
git -C "${project_dir}" worktree prune >/dev/null 2>&1 || true
|
|
605
614
|
}
|
|
606
615
|
|
|
607
616
|
# Pick the best available ref for creating a new detached worktree.
|
|
@@ -1149,7 +1158,7 @@ dispatch_next_queued_job() {
|
|
|
1149
1158
|
log "QUEUE: Checking for pending jobs to dispatch"
|
|
1150
1159
|
|
|
1151
1160
|
# Call CLI to dispatch next job (this handles priority, expiration, and spawning)
|
|
1152
|
-
"${cli_bin}" queue dispatch --log "${LOG_FILE:-/dev/null}" 2>/dev/null || true
|
|
1161
|
+
"${cli_bin}" queue dispatch --project-dir "${PROJECT_DIR:-$(pwd)}" --log "${LOG_FILE:-/dev/null}" 2>/dev/null || true
|
|
1153
1162
|
}
|
|
1154
1163
|
|
|
1155
1164
|
complete_queued_job() {
|