@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.10
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.d.ts +3 -0
- package/dist/cli.js +3281 -651
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +12 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +307 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.d.ts.map +1 -1
- package/dist/commands/analytics.js +129 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +19 -0
- package/dist/commands/audit.d.ts.map +1 -1
- package/dist/commands/audit.js +189 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/board.d.ts +9 -0
- package/dist/commands/board.js +702 -0
- package/dist/commands/board.js.map +1 -0
- package/dist/commands/cancel.d.ts +46 -0
- package/dist/commands/cancel.js +239 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/cron.d.ts +8 -0
- package/dist/commands/cron.js +134 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/dashboard/tab-actions.d.ts +10 -0
- package/dist/commands/dashboard/tab-actions.js +247 -0
- package/dist/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/commands/dashboard/tab-config.d.ts +21 -0
- package/dist/commands/dashboard/tab-config.js +874 -0
- package/dist/commands/dashboard/tab-config.js.map +1 -0
- package/dist/commands/dashboard/tab-logs.d.ts +10 -0
- package/dist/commands/dashboard/tab-logs.js +202 -0
- package/dist/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
- package/dist/commands/dashboard/tab-schedules.js +320 -0
- package/dist/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/commands/dashboard/tab-status.d.ts +32 -0
- package/dist/commands/dashboard/tab-status.js +424 -0
- package/dist/commands/dashboard/tab-status.js.map +1 -0
- package/dist/commands/dashboard/types.d.ts +42 -0
- package/dist/commands/dashboard/types.js +5 -0
- package/dist/commands/dashboard/types.js.map +1 -0
- package/dist/commands/dashboard.d.ts +11 -0
- package/dist/commands/dashboard.js +242 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.js +195 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/history.d.ts +7 -0
- package/dist/commands/history.js +49 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +45 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +65 -0
- package/dist/commands/install.js +405 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +15 -0
- package/dist/commands/logs.js +155 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/merge.d.ts +26 -0
- package/dist/commands/merge.d.ts.map +1 -1
- package/dist/commands/merge.js +186 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/notify.d.ts +7 -0
- package/dist/commands/notify.js +43 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/plan.d.ts +19 -0
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +133 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prd-state.d.ts +12 -0
- package/dist/commands/prd-state.js +47 -0
- package/dist/commands/prd-state.js.map +1 -0
- package/dist/commands/prd.d.ts +18 -0
- package/dist/commands/prd.js +363 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/prds.d.ts +13 -0
- package/dist/commands/prds.js +194 -0
- package/dist/commands/prds.js.map +1 -0
- package/dist/commands/prs.d.ts +14 -0
- package/dist/commands/prs.js +104 -0
- package/dist/commands/prs.js.map +1 -0
- package/dist/commands/qa.d.ts +34 -0
- package/dist/commands/qa.d.ts.map +1 -1
- package/dist/commands/qa.js +238 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/queue.d.ts +8 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +398 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/resolve.d.ts +26 -0
- package/dist/commands/resolve.d.ts.map +1 -1
- package/dist/commands/resolve.js +212 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/retry.d.ts +9 -0
- package/dist/commands/retry.js +71 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/review.d.ts +79 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +47 -75
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +88 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +85 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/serve.d.ts +19 -0
- package/dist/commands/serve.js +142 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/shared/env-builder.d.ts +49 -0
- package/dist/commands/shared/env-builder.d.ts.map +1 -1
- package/dist/commands/shared/env-builder.js +152 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/shared/feedback.d.ts +24 -0
- package/dist/commands/shared/feedback.d.ts.map +1 -0
- package/dist/commands/shared/feedback.js +38 -0
- package/dist/commands/shared/feedback.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.d.ts.map +1 -1
- package/dist/commands/slice.js +363 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.js +54 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/status.d.ts +14 -0
- package/dist/commands/status.js +297 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summary.d.ts +14 -0
- package/dist/commands/summary.js +193 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/uninstall.d.ts +25 -0
- package/dist/commands/uninstall.js +134 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/scripts/night-watch-audit-cron.sh +1 -0
- package/dist/scripts/night-watch-cron.sh +186 -23
- package/dist/scripts/night-watch-helpers.sh +65 -2
- package/dist/scripts/night-watch-merger-cron.sh +137 -36
- package/dist/scripts/night-watch-plan-cron.sh +2 -0
- package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +22 -5
- package/dist/scripts/night-watch-qa-cron.sh +8 -1
- package/dist/scripts/night-watch-slicer-cron.sh +3 -0
- package/dist/templates/night-watch.config.json +21 -20
- package/dist/templates/slicer.md +3 -0
- package/dist/web/assets/index-C-xpWpS8.css +1 -0
- package/dist/web/assets/index-CEYe-290.js +412 -0
- package/dist/web/assets/index-DpvzoXEv.js +442 -0
- package/dist/web/assets/index-DyME41HV.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -1
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRDs command for Night Watch CLI
|
|
3
|
+
* Lists all PRDs with their status (ready/blocked/in-progress/done) and dependencies
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { collectPrdInfo, createTable, dim, header, loadConfig } from '@night-watch/core';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
/**
|
|
9
|
+
* Get open PR branch names using gh CLI
|
|
10
|
+
*/
|
|
11
|
+
function getOpenPrBranches(projectDir) {
|
|
12
|
+
try {
|
|
13
|
+
execSync('git rev-parse --git-dir', {
|
|
14
|
+
cwd: projectDir,
|
|
15
|
+
encoding: 'utf-8',
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return new Set();
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
execSync('which gh', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return new Set();
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const output = execSync('gh pr list --state open --json headRefName', {
|
|
30
|
+
cwd: projectDir,
|
|
31
|
+
encoding: 'utf-8',
|
|
32
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
33
|
+
});
|
|
34
|
+
const prs = JSON.parse(output);
|
|
35
|
+
return new Set(prs.map((pr) => pr.headRefName));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return new Set();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Derive a branch name from a PRD name
|
|
43
|
+
* Converts "01-feature-name.md" or "01-feature-name" to potential branch patterns
|
|
44
|
+
*/
|
|
45
|
+
function deriveBranchPatterns(prdName, branchPrefix) {
|
|
46
|
+
// Remove .md extension if present
|
|
47
|
+
const baseName = prdName.replace(/\.md$/, '');
|
|
48
|
+
// Common patterns:
|
|
49
|
+
// 1. night-watch/01-feature-name
|
|
50
|
+
// 2. feat/01-feature-name
|
|
51
|
+
// 3. feature/01-feature-name
|
|
52
|
+
return [`${branchPrefix}${baseName}`, `feat/${baseName}`, `feature/${baseName}`];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find matching PR for a PRD
|
|
56
|
+
*/
|
|
57
|
+
function findMatchingPr(prdName, openPrBranches, branchPrefix) {
|
|
58
|
+
const patterns = deriveBranchPatterns(prdName, branchPrefix);
|
|
59
|
+
for (const pattern of patterns) {
|
|
60
|
+
// Check for exact match
|
|
61
|
+
if (openPrBranches.has(pattern)) {
|
|
62
|
+
return pattern;
|
|
63
|
+
}
|
|
64
|
+
// Check for partial match (branch might have additional suffix)
|
|
65
|
+
for (const branch of openPrBranches) {
|
|
66
|
+
if (branch === pattern ||
|
|
67
|
+
branch.startsWith(`${pattern}-`) ||
|
|
68
|
+
branch.startsWith(`${pattern}/`)) {
|
|
69
|
+
return branch;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Format status with color
|
|
77
|
+
*/
|
|
78
|
+
function formatStatus(status) {
|
|
79
|
+
switch (status) {
|
|
80
|
+
case 'ready':
|
|
81
|
+
return chalk.green('ready');
|
|
82
|
+
case 'blocked':
|
|
83
|
+
return chalk.yellow('blocked');
|
|
84
|
+
case 'in-progress':
|
|
85
|
+
return chalk.cyan('in-progress');
|
|
86
|
+
case 'pending-review':
|
|
87
|
+
return chalk.magenta('pending-review');
|
|
88
|
+
case 'done':
|
|
89
|
+
return chalk.dim('done');
|
|
90
|
+
default:
|
|
91
|
+
return status;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format dependencies list
|
|
96
|
+
*/
|
|
97
|
+
function formatDependencies(dependencies, unmetDependencies) {
|
|
98
|
+
if (dependencies.length === 0) {
|
|
99
|
+
return chalk.dim('-');
|
|
100
|
+
}
|
|
101
|
+
return dependencies
|
|
102
|
+
.map((dep) => {
|
|
103
|
+
const isUnmet = unmetDependencies.includes(dep);
|
|
104
|
+
return isUnmet ? chalk.red(dep) : chalk.green(dep);
|
|
105
|
+
})
|
|
106
|
+
.join(', ');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* PRDs command implementation
|
|
110
|
+
*/
|
|
111
|
+
export function prdsCommand(program) {
|
|
112
|
+
program
|
|
113
|
+
.command('prds')
|
|
114
|
+
.description('List all PRDs with their status and dependencies')
|
|
115
|
+
.option('--json', 'Output as JSON')
|
|
116
|
+
.action(async (options) => {
|
|
117
|
+
try {
|
|
118
|
+
const projectDir = process.cwd();
|
|
119
|
+
const config = loadConfig(projectDir);
|
|
120
|
+
// Collect PRD info using existing utility
|
|
121
|
+
const prds = collectPrdInfo(projectDir, config.prdDir, config.maxRuntime);
|
|
122
|
+
// Get open PR branches for in-progress detection
|
|
123
|
+
const openPrBranches = getOpenPrBranches(projectDir);
|
|
124
|
+
// Filter out summary file and update in-progress status based on open PRs
|
|
125
|
+
const filteredPrds = prds;
|
|
126
|
+
// Update status based on open PRs
|
|
127
|
+
for (const prd of filteredPrds) {
|
|
128
|
+
if (prd.status !== 'done') {
|
|
129
|
+
const matchingPr = findMatchingPr(prd.name, openPrBranches, config.branchPrefix);
|
|
130
|
+
if (matchingPr) {
|
|
131
|
+
prd.status = 'in-progress';
|
|
132
|
+
prd.prBranch = matchingPr;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Sort: ready first, then blocked, then in-progress, then done
|
|
137
|
+
const statusOrder = {
|
|
138
|
+
ready: 0,
|
|
139
|
+
blocked: 1,
|
|
140
|
+
'in-progress': 2,
|
|
141
|
+
'pending-review': 3,
|
|
142
|
+
done: 4,
|
|
143
|
+
};
|
|
144
|
+
filteredPrds.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);
|
|
145
|
+
// Output as JSON if requested
|
|
146
|
+
if (options.json) {
|
|
147
|
+
const jsonOutput = filteredPrds.map((prd) => ({
|
|
148
|
+
name: prd.name,
|
|
149
|
+
status: prd.status,
|
|
150
|
+
dependencies: prd.dependencies,
|
|
151
|
+
unmetDependencies: prd.unmetDependencies,
|
|
152
|
+
pr: prd.prBranch || null,
|
|
153
|
+
}));
|
|
154
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Display header
|
|
158
|
+
header('PRD Status');
|
|
159
|
+
if (filteredPrds.length === 0) {
|
|
160
|
+
dim('No PRDs found.');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Create and populate table
|
|
164
|
+
const table = createTable({
|
|
165
|
+
head: ['Name', 'Status', 'Dependencies', 'PR'],
|
|
166
|
+
colWidths: [35, 12, 40, 30],
|
|
167
|
+
});
|
|
168
|
+
for (const prd of filteredPrds) {
|
|
169
|
+
const prBranch = prd.prBranch;
|
|
170
|
+
table.push([
|
|
171
|
+
prd.status === 'done' ? chalk.dim(prd.name) : prd.name,
|
|
172
|
+
formatStatus(prd.status),
|
|
173
|
+
formatDependencies(prd.dependencies, prd.unmetDependencies),
|
|
174
|
+
prBranch ? chalk.cyan(prBranch) : chalk.dim('-'),
|
|
175
|
+
]);
|
|
176
|
+
}
|
|
177
|
+
console.log(table.toString());
|
|
178
|
+
// Summary counts
|
|
179
|
+
const ready = filteredPrds.filter((p) => p.status === 'ready').length;
|
|
180
|
+
const blocked = filteredPrds.filter((p) => p.status === 'blocked').length;
|
|
181
|
+
const inProgress = filteredPrds.filter((p) => p.status === 'in-progress').length;
|
|
182
|
+
const pendingReview = filteredPrds.filter((p) => p.status === 'pending-review').length;
|
|
183
|
+
const done = filteredPrds.filter((p) => p.status === 'done').length;
|
|
184
|
+
console.log();
|
|
185
|
+
dim(` Ready: ${ready} | Blocked: ${blocked} | In Progress: ${inProgress} | Pending Review: ${pendingReview} | Done: ${done}`);
|
|
186
|
+
console.log();
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.error(`Error listing PRDs: ${error instanceof Error ? error.message : String(error)}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=prds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prds.js","sourceRoot":"","sources":["../../src/commands/prds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRs command for Night Watch CLI
|
|
3
|
+
* Lists matching PRs with their CI status and review scores
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface IPrsOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* PRs command implementation
|
|
12
|
+
*/
|
|
13
|
+
export declare function prsCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=prs.d.ts.map
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRs command for Night Watch CLI
|
|
3
|
+
* Lists matching PRs with their CI status and review scores
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { collectPrInfo, createTable, dim, header, info, loadConfig, } from '@night-watch/core';
|
|
7
|
+
/**
|
|
8
|
+
* Format CI status with color coding
|
|
9
|
+
*/
|
|
10
|
+
function formatCiStatus(status) {
|
|
11
|
+
switch (status) {
|
|
12
|
+
case 'pass':
|
|
13
|
+
return chalk.green('pass');
|
|
14
|
+
case 'fail':
|
|
15
|
+
return chalk.red('fail');
|
|
16
|
+
case 'pending':
|
|
17
|
+
return chalk.yellow('pending');
|
|
18
|
+
default:
|
|
19
|
+
return chalk.dim('unknown');
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Format review score with color coding
|
|
24
|
+
*/
|
|
25
|
+
function formatReviewScore(score) {
|
|
26
|
+
if (score === null) {
|
|
27
|
+
return chalk.dim('-');
|
|
28
|
+
}
|
|
29
|
+
if (score >= 80) {
|
|
30
|
+
return chalk.green(String(score));
|
|
31
|
+
}
|
|
32
|
+
if (score >= 60) {
|
|
33
|
+
return chalk.yellow(String(score));
|
|
34
|
+
}
|
|
35
|
+
return chalk.red(String(score));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* PRs command implementation
|
|
39
|
+
*/
|
|
40
|
+
export function prsCommand(program) {
|
|
41
|
+
program
|
|
42
|
+
.command('prs')
|
|
43
|
+
.description('List matching PRs with CI status and review scores')
|
|
44
|
+
.option('--json', 'Output PRs as JSON')
|
|
45
|
+
.option('--debug', 'Enable debug logging for CI status and review score derivation')
|
|
46
|
+
.action(async (options) => {
|
|
47
|
+
try {
|
|
48
|
+
// Enable debug mode via environment variable
|
|
49
|
+
if (options.debug) {
|
|
50
|
+
process.env.DEBUG_PR_DATA = '1';
|
|
51
|
+
}
|
|
52
|
+
const projectDir = process.cwd();
|
|
53
|
+
const config = loadConfig(projectDir);
|
|
54
|
+
const prs = await collectPrInfo(projectDir, config.branchPatterns);
|
|
55
|
+
// Output as JSON if requested
|
|
56
|
+
if (options.json) {
|
|
57
|
+
const output = {
|
|
58
|
+
prs,
|
|
59
|
+
count: prs.length,
|
|
60
|
+
};
|
|
61
|
+
console.log(JSON.stringify(output, null, 2));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
// Print header
|
|
65
|
+
console.log();
|
|
66
|
+
console.log(chalk.bold.cyan('Night Watch PRs'));
|
|
67
|
+
console.log(chalk.dim('-'.repeat(40)));
|
|
68
|
+
console.log();
|
|
69
|
+
if (prs.length === 0) {
|
|
70
|
+
info('No open PRs matching configured branch patterns found.');
|
|
71
|
+
dim(`Branch patterns: ${config.branchPatterns.join(', ')}`);
|
|
72
|
+
console.log();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
header(`Open PRs (${prs.length})`);
|
|
76
|
+
// Create and populate table
|
|
77
|
+
const table = createTable({
|
|
78
|
+
head: ['#', 'Title', 'Branch', 'CI', 'Score', 'URL'],
|
|
79
|
+
colWidths: [6, 30, 25, 10, 8, 50],
|
|
80
|
+
});
|
|
81
|
+
for (const pr of prs) {
|
|
82
|
+
// Truncate title if too long
|
|
83
|
+
const title = pr.title.length > 27 ? pr.title.substring(0, 24) + '...' : pr.title;
|
|
84
|
+
// Truncate branch if too long
|
|
85
|
+
const branch = pr.branch.length > 22 ? pr.branch.substring(0, 19) + '...' : pr.branch;
|
|
86
|
+
table.push([
|
|
87
|
+
String(pr.number),
|
|
88
|
+
title,
|
|
89
|
+
branch,
|
|
90
|
+
formatCiStatus(pr.ciStatus),
|
|
91
|
+
formatReviewScore(pr.reviewScore),
|
|
92
|
+
pr.url,
|
|
93
|
+
]);
|
|
94
|
+
}
|
|
95
|
+
console.log(table.toString());
|
|
96
|
+
console.log();
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(`Error listing PRs: ${error instanceof Error ? error.message : String(error)}`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=prs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prs.js","sourceRoot":"","sources":["../../src/commands/prs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA command - executes the QA cron script for PR test generation
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { INightWatchConfig } from '@night-watch/core';
|
|
6
|
+
/**
|
|
7
|
+
* Options for the qa command
|
|
8
|
+
*/
|
|
9
|
+
export interface IQaOptions {
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
timeout?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* QA notifications should not fire for script-level skip/no-op outcomes.
|
|
16
|
+
*/
|
|
17
|
+
export declare function shouldSendQaNotification(scriptStatus?: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Parse PR numbers emitted by the QA script marker data (e.g. "#12,#34").
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseQaPrNumbers(prsRaw?: string): number[];
|
|
22
|
+
/**
|
|
23
|
+
* Build environment variables map from config and CLI options for QA
|
|
24
|
+
*/
|
|
25
|
+
export declare function buildEnvVars(config: INightWatchConfig, options: IQaOptions): Record<string, string>;
|
|
26
|
+
/**
|
|
27
|
+
* Apply CLI flag overrides to the config for QA
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyCliOverrides(config: INightWatchConfig, options: IQaOptions): INightWatchConfig;
|
|
30
|
+
/**
|
|
31
|
+
* Register the qa command with the program
|
|
32
|
+
*/
|
|
33
|
+
export declare function qaCommand(program: Command): void;
|
|
34
|
+
//# sourceMappingURL=qa.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,iBAAiB,EAgBlB,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,iBAAiB,EAgBlB,MAAM,mBAAmB,CAAC;AAU3B;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAQvE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAc1D;AAWD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,UAAU,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,UAAU,GAClB,iBAAiB,CAgBnB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsKhD"}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA command - executes the QA cron script for PR test generation
|
|
3
|
+
*/
|
|
4
|
+
import { CLAUDE_MODEL_IDS, PROVIDER_COMMANDS, createSpinner, createTable, dim, executeScriptWithOutput, fetchPrDetailsByNumber, fetchQaScreenshotUrlsForPr, getScriptPath, header, info, loadConfig, parseScriptResult, resolveJobProvider, sendNotifications, error as uiError, } from '@night-watch/core';
|
|
5
|
+
import { buildBaseEnvVars, formatProviderDisplay, getTelegramStatusWebhooks, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
|
|
6
|
+
import { recordJobOutcome } from './shared/feedback.js';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
/**
|
|
9
|
+
* QA notifications should not fire for script-level skip/no-op outcomes.
|
|
10
|
+
*/
|
|
11
|
+
export function shouldSendQaNotification(scriptStatus) {
|
|
12
|
+
if (!scriptStatus) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
if (scriptStatus === 'queued') {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
return !scriptStatus.startsWith('skip_');
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse PR numbers emitted by the QA script marker data (e.g. "#12,#34").
|
|
22
|
+
*/
|
|
23
|
+
export function parseQaPrNumbers(prsRaw) {
|
|
24
|
+
if (!prsRaw)
|
|
25
|
+
return [];
|
|
26
|
+
const seen = new Set();
|
|
27
|
+
const numbers = [];
|
|
28
|
+
for (const token of prsRaw.split(',')) {
|
|
29
|
+
const parsed = parseInt(token.trim().replace(/^#/, ''), 10);
|
|
30
|
+
if (Number.isNaN(parsed) || seen.has(parsed)) {
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
seen.add(parsed);
|
|
34
|
+
numbers.push(parsed);
|
|
35
|
+
}
|
|
36
|
+
return numbers;
|
|
37
|
+
}
|
|
38
|
+
function parseRepoFromPrUrl(prUrl) {
|
|
39
|
+
if (!prUrl) {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
const match = prUrl.match(/^https?:\/\/github\.com\/([^/]+\/[^/]+)\/pull\/\d+/i);
|
|
43
|
+
return match?.[1];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Build environment variables map from config and CLI options for QA
|
|
47
|
+
*/
|
|
48
|
+
export function buildEnvVars(config, options) {
|
|
49
|
+
// Start with base env vars shared by all job types
|
|
50
|
+
const env = buildBaseEnvVars(config, 'qa', options.dryRun);
|
|
51
|
+
// Runtime for QA (uses NW_QA_* variables)
|
|
52
|
+
env.NW_QA_MAX_RUNTIME = String(config.qa.maxRuntime);
|
|
53
|
+
// Branch patterns: use qa-specific if non-empty, else top-level
|
|
54
|
+
const branchPatterns = config.qa.branchPatterns.length > 0 ? config.qa.branchPatterns : config.branchPatterns;
|
|
55
|
+
env.NW_BRANCH_PATTERNS = branchPatterns.join(',');
|
|
56
|
+
// QA-specific settings
|
|
57
|
+
env.NW_QA_SKIP_LABEL = config.qa.skipLabel;
|
|
58
|
+
env.NW_QA_VALIDATED_LABEL = config.qa.validatedLabel;
|
|
59
|
+
env.NW_QA_ARTIFACTS = config.qa.artifacts;
|
|
60
|
+
env.NW_QA_AUTO_INSTALL_PLAYWRIGHT = config.qa.autoInstallPlaywright ? '1' : '0';
|
|
61
|
+
env.NW_CLAUDE_MODEL_ID =
|
|
62
|
+
CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
|
|
63
|
+
// Telegram status messages from bash scripts (start/progress/final status)
|
|
64
|
+
const telegramWebhooks = getTelegramStatusWebhooks(config);
|
|
65
|
+
if (telegramWebhooks.length > 0) {
|
|
66
|
+
env.NW_TELEGRAM_STATUS_WEBHOOKS = JSON.stringify(telegramWebhooks);
|
|
67
|
+
env.NW_TELEGRAM_BOT_TOKEN = telegramWebhooks[0].botToken;
|
|
68
|
+
env.NW_TELEGRAM_CHAT_ID = telegramWebhooks[0].chatId;
|
|
69
|
+
}
|
|
70
|
+
return env;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Apply CLI flag overrides to the config for QA
|
|
74
|
+
*/
|
|
75
|
+
export function applyCliOverrides(config, options) {
|
|
76
|
+
const overridden = { ...config, qa: { ...config.qa } };
|
|
77
|
+
if (options.timeout) {
|
|
78
|
+
const timeout = parseInt(options.timeout, 10);
|
|
79
|
+
if (!isNaN(timeout)) {
|
|
80
|
+
overridden.qa.maxRuntime = timeout;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (options.provider) {
|
|
84
|
+
// Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
|
|
85
|
+
overridden._cliProviderOverride = options.provider;
|
|
86
|
+
}
|
|
87
|
+
return overridden;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Register the qa command with the program
|
|
91
|
+
*/
|
|
92
|
+
export function qaCommand(program) {
|
|
93
|
+
program
|
|
94
|
+
.command('qa')
|
|
95
|
+
.description('Run QA process now')
|
|
96
|
+
.option('--dry-run', 'Show what would be executed without running')
|
|
97
|
+
.option('--timeout <seconds>', 'Override max runtime in seconds for QA')
|
|
98
|
+
.option('--provider <string>', 'AI provider to use (claude or codex)')
|
|
99
|
+
.action(async (options) => {
|
|
100
|
+
// Get the project directory (current working directory)
|
|
101
|
+
const projectDir = process.cwd();
|
|
102
|
+
// Load config from file and environment
|
|
103
|
+
let config = loadConfig(projectDir);
|
|
104
|
+
// Apply CLI flag overrides
|
|
105
|
+
config = applyCliOverrides(config, options);
|
|
106
|
+
if (!config.qa.enabled && !options.dryRun) {
|
|
107
|
+
info('QA is disabled in config; skipping run.');
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
110
|
+
// Build environment variables
|
|
111
|
+
const envVars = buildEnvVars(config, options);
|
|
112
|
+
// Get the script path
|
|
113
|
+
const scriptPath = getScriptPath('night-watch-qa-cron.sh');
|
|
114
|
+
if (options.dryRun) {
|
|
115
|
+
header('Dry Run: QA Process');
|
|
116
|
+
// Resolve QA-specific provider
|
|
117
|
+
const qaProvider = resolveJobProvider(config, 'qa');
|
|
118
|
+
// Configuration section with table
|
|
119
|
+
header('Configuration');
|
|
120
|
+
const configTable = createTable({ head: ['Setting', 'Value'] });
|
|
121
|
+
configTable.push(['Provider', qaProvider]);
|
|
122
|
+
configTable.push(['Provider CLI', PROVIDER_COMMANDS[qaProvider]]);
|
|
123
|
+
configTable.push([
|
|
124
|
+
'Max Runtime',
|
|
125
|
+
`${config.qa.maxRuntime}s (${Math.floor(config.qa.maxRuntime / 60)}min)`,
|
|
126
|
+
]);
|
|
127
|
+
const branchPatterns = config.qa.branchPatterns.length > 0 ? config.qa.branchPatterns : config.branchPatterns;
|
|
128
|
+
configTable.push(['Branch Patterns', branchPatterns.join(', ')]);
|
|
129
|
+
configTable.push(['Skip Label', config.qa.skipLabel]);
|
|
130
|
+
configTable.push(['Validated Label', config.qa.validatedLabel]);
|
|
131
|
+
configTable.push(['Artifacts', config.qa.artifacts]);
|
|
132
|
+
configTable.push([
|
|
133
|
+
'Auto-install Playwright',
|
|
134
|
+
config.qa.autoInstallPlaywright ? 'Yes' : 'No',
|
|
135
|
+
]);
|
|
136
|
+
console.log(configTable.toString());
|
|
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 QA process...');
|
|
150
|
+
spinner.start();
|
|
151
|
+
try {
|
|
152
|
+
const startedAt = Date.now();
|
|
153
|
+
await maybeApplyCronSchedulingDelay(config, 'qa', projectDir);
|
|
154
|
+
const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
|
|
155
|
+
const finishedAt = Date.now();
|
|
156
|
+
const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
|
|
157
|
+
if (exitCode === 0) {
|
|
158
|
+
if (scriptResult?.status === 'queued') {
|
|
159
|
+
spinner.succeed('QA process queued — another job is currently running');
|
|
160
|
+
}
|
|
161
|
+
else if (scriptResult?.status?.startsWith('skip_')) {
|
|
162
|
+
spinner.succeed('QA process completed (no PRs needed QA)');
|
|
163
|
+
}
|
|
164
|
+
else if (scriptResult?.status === 'warning_qa') {
|
|
165
|
+
spinner.succeed('QA process completed with warnings');
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
spinner.succeed('QA process completed successfully');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
spinner.fail(`QA process exited with code ${exitCode}`);
|
|
173
|
+
}
|
|
174
|
+
// Send notifications (fire-and-forget, failures do not affect exit code)
|
|
175
|
+
if (!options.dryRun) {
|
|
176
|
+
try {
|
|
177
|
+
recordJobOutcome({
|
|
178
|
+
config,
|
|
179
|
+
exitCode,
|
|
180
|
+
finishedAt,
|
|
181
|
+
jobType: 'qa',
|
|
182
|
+
metadata: {
|
|
183
|
+
providerCommand: envVars.NW_PROVIDER_CMD,
|
|
184
|
+
providerLabel: envVars.NW_PROVIDER_LABEL,
|
|
185
|
+
},
|
|
186
|
+
projectDir,
|
|
187
|
+
providerKey: envVars.NW_PROVIDER_KEY ?? resolveJobProvider(config, 'qa'),
|
|
188
|
+
scriptResult,
|
|
189
|
+
startedAt,
|
|
190
|
+
stderr,
|
|
191
|
+
stdout,
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Outcome persistence must not change command exit behavior.
|
|
196
|
+
}
|
|
197
|
+
const skipNotification = !shouldSendQaNotification(scriptResult?.status);
|
|
198
|
+
if (skipNotification) {
|
|
199
|
+
info('Skipping QA notification (no actionable QA result)');
|
|
200
|
+
}
|
|
201
|
+
if (!skipNotification) {
|
|
202
|
+
const qaPrNumbers = parseQaPrNumbers(scriptResult?.data.prs);
|
|
203
|
+
const primaryQaPr = qaPrNumbers[0];
|
|
204
|
+
const prDetails = primaryQaPr ? fetchPrDetailsByNumber(primaryQaPr, projectDir) : null;
|
|
205
|
+
const repo = scriptResult?.data.repo ?? parseRepoFromPrUrl(prDetails?.url);
|
|
206
|
+
const fallbackPrUrl = !prDetails?.url && primaryQaPr && repo
|
|
207
|
+
? `https://github.com/${repo}/pull/${primaryQaPr}`
|
|
208
|
+
: undefined;
|
|
209
|
+
const qaScreenshotUrls = primaryQaPr !== undefined
|
|
210
|
+
? fetchQaScreenshotUrlsForPr(primaryQaPr, projectDir, repo)
|
|
211
|
+
: [];
|
|
212
|
+
const _qaCtx = {
|
|
213
|
+
event: 'qa_completed',
|
|
214
|
+
projectName: path.basename(projectDir),
|
|
215
|
+
exitCode,
|
|
216
|
+
provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
|
|
217
|
+
prNumber: prDetails?.number ?? primaryQaPr,
|
|
218
|
+
prUrl: prDetails?.url ?? fallbackPrUrl,
|
|
219
|
+
prTitle: prDetails?.title,
|
|
220
|
+
prBody: prDetails?.body,
|
|
221
|
+
filesChanged: prDetails?.changedFiles,
|
|
222
|
+
additions: prDetails?.additions,
|
|
223
|
+
deletions: prDetails?.deletions,
|
|
224
|
+
qaScreenshotUrls,
|
|
225
|
+
};
|
|
226
|
+
await sendNotifications(config, _qaCtx);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
process.exit(exitCode);
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
spinner.fail('Failed to execute QA command');
|
|
233
|
+
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=qa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa.js","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queue command — manage the global job queue.
|
|
3
|
+
* Provides subcommands for viewing, clearing, and dispatching queued jobs.
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function createQueueCommand(): Command;
|
|
7
|
+
export declare function queueCommand(program: Command): void;
|
|
8
|
+
//# sourceMappingURL=queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuEpC,wBAAgB,kBAAkB,IAAI,OAAO,CAsV5C;AAkED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEnD"}
|