@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.1
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 +2331 -1403
- package/dist/cli.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.js +69 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +19 -0
- package/dist/commands/audit.js +144 -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/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.js +159 -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.js +88 -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.js +214 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/queue.d.ts +8 -0
- package/dist/commands/queue.js +378 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/resolve.d.ts +26 -0
- package/dist/commands/resolve.js +186 -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 +77 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +1 -74
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +73 -0
- 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.js +151 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.js +316 -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-pr-reviewer-cron.sh +6 -0
- package/dist/templates/night-watch.config.json +1 -21
- package/package.json +1 -1
- package/dist/web/assets/index-B6E6kOoR.js +0 -406
- package/dist/web/assets/index-DIMUXIP8.css +0 -1
- package/dist/web/assets/index-NR27JE3b.js +0 -406
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install command for Night Watch CLI
|
|
3
|
+
* Adds crontab entries for automated PRD execution
|
|
4
|
+
*/
|
|
5
|
+
import { execSync } from 'child_process';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { LOG_DIR, dim, generateMarker, getEntries, getProjectEntries, getProjectName, header, loadConfig, readCrontab, registerProject, success, error as uiError, warn, writeCrontab, } from '@night-watch/core';
|
|
9
|
+
/**
|
|
10
|
+
* Safely quote a value for POSIX shell commands.
|
|
11
|
+
*/
|
|
12
|
+
function shellQuote(value) {
|
|
13
|
+
return `'${value.replace(/'/g, "'\"'\"'")}'`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Get the path to the night-watch binary
|
|
17
|
+
*/
|
|
18
|
+
function getNightWatchBinPath() {
|
|
19
|
+
// Try to find night-watch in npm global bin
|
|
20
|
+
try {
|
|
21
|
+
const npmBin = execSync('npm bin -g', { encoding: 'utf-8' }).trim();
|
|
22
|
+
const binPath = path.join(npmBin, 'night-watch');
|
|
23
|
+
if (fs.existsSync(binPath)) {
|
|
24
|
+
return binPath;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Ignore error, fall back to which
|
|
29
|
+
}
|
|
30
|
+
// Try which command
|
|
31
|
+
try {
|
|
32
|
+
return execSync('which night-watch', { encoding: 'utf-8' }).trim();
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// Fall back to assuming it's in PATH
|
|
36
|
+
return 'night-watch';
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get the directory containing the node binary.
|
|
41
|
+
* Cron runs with a minimal PATH that typically doesn't include nvm/fnm/volta paths,
|
|
42
|
+
* so we need to explicitly add the node bin directory to each cron entry.
|
|
43
|
+
*/
|
|
44
|
+
function getNodeBinDir() {
|
|
45
|
+
// process.execPath is the node binary that ran this install command — stable even
|
|
46
|
+
// when invoked via yarn (which sets a temp /tmp/yarn-* dir in PATH that gets wiped
|
|
47
|
+
// on WSL restart). Falls back to `which node` for edge cases.
|
|
48
|
+
if (process.execPath && process.execPath !== 'node') {
|
|
49
|
+
return path.dirname(process.execPath);
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
const nodePath = execSync('which node', { encoding: 'utf-8' }).trim();
|
|
53
|
+
return path.dirname(nodePath);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Build PATH export for cron entries using relevant binary directories.
|
|
61
|
+
*/
|
|
62
|
+
export function buildCronPathPrefix(nodeBinDir, nightWatchBin) {
|
|
63
|
+
const nightWatchBinDir = nightWatchBin.includes('/') || nightWatchBin.includes('\\') ? path.dirname(nightWatchBin) : '';
|
|
64
|
+
const pathParts = Array.from(new Set([nodeBinDir, nightWatchBinDir].filter((part) => part.length > 0)));
|
|
65
|
+
if (pathParts.length === 0) {
|
|
66
|
+
return '';
|
|
67
|
+
}
|
|
68
|
+
return `export PATH="${pathParts.join(':')}:$PATH" && `;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Apply minute offset to a cron schedule expression.
|
|
72
|
+
* Replaces the minute field (first field) with the offset value.
|
|
73
|
+
* Only applies if the minute field is a single number (e.g. "0").
|
|
74
|
+
* Complex expressions (e.g. star-slash, comma-separated) are left unchanged.
|
|
75
|
+
*/
|
|
76
|
+
export function applyScheduleOffset(schedule, offset) {
|
|
77
|
+
if (offset === 0)
|
|
78
|
+
return schedule;
|
|
79
|
+
const parts = schedule.split(/\s+/);
|
|
80
|
+
if (parts.length < 5)
|
|
81
|
+
return schedule;
|
|
82
|
+
// Only replace if minute field is a plain number
|
|
83
|
+
if (/^\d+$/.test(parts[0])) {
|
|
84
|
+
parts[0] = String(offset);
|
|
85
|
+
return parts.join(' ');
|
|
86
|
+
}
|
|
87
|
+
return schedule;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Core install logic, reusable from dashboard.
|
|
91
|
+
* Returns result without printing to console.
|
|
92
|
+
*/
|
|
93
|
+
export function performInstall(projectDir, config, options) {
|
|
94
|
+
try {
|
|
95
|
+
const executorSchedule = options?.schedule || config.cronSchedule;
|
|
96
|
+
const reviewerSchedule = options?.reviewerSchedule || config.reviewerSchedule;
|
|
97
|
+
const nightWatchBin = getNightWatchBinPath();
|
|
98
|
+
const projectName = getProjectName(projectDir);
|
|
99
|
+
const marker = generateMarker(projectName);
|
|
100
|
+
const logDir = path.join(projectDir, LOG_DIR);
|
|
101
|
+
if (!fs.existsSync(logDir)) {
|
|
102
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
103
|
+
}
|
|
104
|
+
const executorLog = path.join(logDir, 'executor.log');
|
|
105
|
+
const reviewerLog = path.join(logDir, 'reviewer.log');
|
|
106
|
+
// Check if already installed (unless force)
|
|
107
|
+
if (!options?.force) {
|
|
108
|
+
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
109
|
+
if (existingEntries.length > 0) {
|
|
110
|
+
registerProject(projectDir);
|
|
111
|
+
return {
|
|
112
|
+
success: false,
|
|
113
|
+
entries: existingEntries,
|
|
114
|
+
error: 'Already installed. Uninstall first or use force.',
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const entries = [];
|
|
119
|
+
const nodeBinDir = getNodeBinDir();
|
|
120
|
+
const pathPrefix = buildCronPathPrefix(nodeBinDir, nightWatchBin);
|
|
121
|
+
const cliBinPrefix = `export NW_CLI_BIN=${shellQuote(nightWatchBin)} && `;
|
|
122
|
+
const cronTriggerPrefix = 'export NW_CRON_TRIGGER=1 && ';
|
|
123
|
+
let providerEnvPrefix = '';
|
|
124
|
+
if (config.providerEnv && Object.keys(config.providerEnv).length > 0) {
|
|
125
|
+
const exports = Object.entries(config.providerEnv)
|
|
126
|
+
.map(([key, value]) => `export ${key}=${shellQuote(value)}`)
|
|
127
|
+
.join(' && ');
|
|
128
|
+
providerEnvPrefix = exports + ' && ';
|
|
129
|
+
}
|
|
130
|
+
const installExecutor = config.executorEnabled !== false;
|
|
131
|
+
if (installExecutor) {
|
|
132
|
+
const executorEntry = `${executorSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} run >> ${shellQuote(executorLog)} 2>&1 ${marker}`;
|
|
133
|
+
entries.push(executorEntry);
|
|
134
|
+
}
|
|
135
|
+
const installReviewer = options?.noReviewer === true ? false : config.reviewerEnabled;
|
|
136
|
+
if (installReviewer) {
|
|
137
|
+
const reviewerEntry = `${reviewerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} review >> ${shellQuote(reviewerLog)} 2>&1 ${marker}`;
|
|
138
|
+
entries.push(reviewerEntry);
|
|
139
|
+
}
|
|
140
|
+
// Planner entry (uses roadmap scanner schedule; noSlicer flag kept for backward compatibility)
|
|
141
|
+
const installSlicer = options?.noSlicer === true ? false : config.roadmapScanner.enabled;
|
|
142
|
+
if (installSlicer) {
|
|
143
|
+
const slicerSchedule = config.roadmapScanner.slicerSchedule;
|
|
144
|
+
const slicerLog = path.join(logDir, 'slicer.log');
|
|
145
|
+
const slicerEntry = `${slicerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} planner >> ${shellQuote(slicerLog)} 2>&1 ${marker}`;
|
|
146
|
+
entries.push(slicerEntry);
|
|
147
|
+
}
|
|
148
|
+
// QA entry (if enabled and noQa not set)
|
|
149
|
+
const disableQa = options?.noQa === true || options?.qa === false;
|
|
150
|
+
const installQa = disableQa ? false : config.qa.enabled;
|
|
151
|
+
if (installQa) {
|
|
152
|
+
const qaSchedule = config.qa.schedule;
|
|
153
|
+
const qaLog = path.join(logDir, 'qa.log');
|
|
154
|
+
const qaEntry = `${qaSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} qa >> ${shellQuote(qaLog)} 2>&1 ${marker}`;
|
|
155
|
+
entries.push(qaEntry);
|
|
156
|
+
}
|
|
157
|
+
// Audit entry (if enabled and noAudit not set)
|
|
158
|
+
const disableAudit = options?.noAudit === true || options?.audit === false;
|
|
159
|
+
const installAudit = disableAudit ? false : config.audit.enabled;
|
|
160
|
+
if (installAudit) {
|
|
161
|
+
const auditSchedule = config.audit.schedule;
|
|
162
|
+
const auditLog = path.join(logDir, 'audit.log');
|
|
163
|
+
const auditEntry = `${auditSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} audit >> ${shellQuote(auditLog)} 2>&1 ${marker}`;
|
|
164
|
+
entries.push(auditEntry);
|
|
165
|
+
}
|
|
166
|
+
// Analytics entry (if enabled and noAnalytics not set)
|
|
167
|
+
const disableAnalytics = options?.noAnalytics === true || options?.analytics === false;
|
|
168
|
+
const installAnalytics = disableAnalytics ? false : config.analytics.enabled;
|
|
169
|
+
if (installAnalytics) {
|
|
170
|
+
const analyticsSchedule = config.analytics.schedule;
|
|
171
|
+
const analyticsLog = path.join(logDir, 'analytics.log');
|
|
172
|
+
const analyticsEntry = `${analyticsSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} analytics >> ${shellQuote(analyticsLog)} 2>&1 ${marker}`;
|
|
173
|
+
entries.push(analyticsEntry);
|
|
174
|
+
}
|
|
175
|
+
// PR Resolver entry (if enabled and noPrResolver not set)
|
|
176
|
+
const disablePrResolver = options?.noPrResolver === true || options?.prResolver === false;
|
|
177
|
+
const installPrResolver = disablePrResolver ? false : config.prResolver.enabled;
|
|
178
|
+
if (installPrResolver) {
|
|
179
|
+
const prResolverSchedule = config.prResolver.schedule;
|
|
180
|
+
const prResolverLog = path.join(logDir, 'pr-resolver.log');
|
|
181
|
+
const prResolverEntry = `${prResolverSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} resolve >> ${shellQuote(prResolverLog)} 2>&1 ${marker}`;
|
|
182
|
+
entries.push(prResolverEntry);
|
|
183
|
+
}
|
|
184
|
+
// Merger entry (if enabled and noMerger not set)
|
|
185
|
+
const disableMerger = options?.noMerger === true || options?.merger === false;
|
|
186
|
+
const installMerger = disableMerger ? false : (config.merger?.enabled ?? false);
|
|
187
|
+
if (installMerger) {
|
|
188
|
+
const mergerSchedule = config.merger.schedule;
|
|
189
|
+
const mergerLog = path.join(logDir, 'merger.log');
|
|
190
|
+
const mergerEntry = `${mergerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} merge >> ${shellQuote(mergerLog)} 2>&1 ${marker}`;
|
|
191
|
+
entries.push(mergerEntry);
|
|
192
|
+
}
|
|
193
|
+
const existingEntries = new Set(Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)])));
|
|
194
|
+
const currentCrontab = readCrontab();
|
|
195
|
+
const baseCrontab = options?.force
|
|
196
|
+
? currentCrontab.filter((line) => !existingEntries.has(line) && !line.includes(marker))
|
|
197
|
+
: currentCrontab;
|
|
198
|
+
const newCrontab = [...baseCrontab, ...entries];
|
|
199
|
+
writeCrontab(newCrontab);
|
|
200
|
+
registerProject(projectDir);
|
|
201
|
+
return { success: true, entries };
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
return {
|
|
205
|
+
success: false,
|
|
206
|
+
entries: [],
|
|
207
|
+
error: err instanceof Error ? err.message : String(err),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Install crontab entries for night-watch
|
|
213
|
+
*/
|
|
214
|
+
export function installCommand(program) {
|
|
215
|
+
program
|
|
216
|
+
.command('install')
|
|
217
|
+
.description('Add crontab entries for automated execution')
|
|
218
|
+
.option('-s, --schedule <cron>', 'Cron schedule for PRD executor')
|
|
219
|
+
.option('--reviewer-schedule <cron>', 'Cron schedule for reviewer')
|
|
220
|
+
.option('--no-reviewer', 'Skip installing reviewer cron')
|
|
221
|
+
.option('--no-slicer', 'Skip installing slicer cron')
|
|
222
|
+
.option('--no-qa', 'Skip installing QA cron')
|
|
223
|
+
.option('--no-audit', 'Skip installing audit cron')
|
|
224
|
+
.option('--no-analytics', 'Skip installing analytics cron')
|
|
225
|
+
.option('--no-pr-resolver', 'Skip installing PR resolver cron')
|
|
226
|
+
.option('--no-merger', 'Skip installing merger cron')
|
|
227
|
+
.option('-f, --force', 'Replace existing cron entries for this project')
|
|
228
|
+
.action(async (options) => {
|
|
229
|
+
try {
|
|
230
|
+
// Get project directory
|
|
231
|
+
const projectDir = process.cwd();
|
|
232
|
+
// Load configuration
|
|
233
|
+
const config = loadConfig(projectDir);
|
|
234
|
+
// Get schedules from options or config.
|
|
235
|
+
const executorSchedule = options.schedule || config.cronSchedule;
|
|
236
|
+
const reviewerSchedule = options.reviewerSchedule || config.reviewerSchedule;
|
|
237
|
+
// Get paths
|
|
238
|
+
const nightWatchBin = getNightWatchBinPath();
|
|
239
|
+
const projectName = getProjectName(projectDir);
|
|
240
|
+
const marker = generateMarker(projectName);
|
|
241
|
+
const logDir = path.join(projectDir, LOG_DIR);
|
|
242
|
+
// Ensure log directory exists
|
|
243
|
+
if (!fs.existsSync(logDir)) {
|
|
244
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
245
|
+
}
|
|
246
|
+
const executorLog = path.join(logDir, 'executor.log');
|
|
247
|
+
const reviewerLog = path.join(logDir, 'reviewer.log');
|
|
248
|
+
// Check if already installed
|
|
249
|
+
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
250
|
+
if (existingEntries.length > 0 && !options.force) {
|
|
251
|
+
warn(`Night Watch is already installed for ${projectName}.`);
|
|
252
|
+
console.log();
|
|
253
|
+
dim('Existing crontab entries:');
|
|
254
|
+
existingEntries.forEach((entry) => dim(` ${entry}`));
|
|
255
|
+
console.log();
|
|
256
|
+
dim("Run 'night-watch install --force' to replace them.");
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
// Create crontab entries
|
|
260
|
+
const entries = [];
|
|
261
|
+
// Detect node bin directory for cron PATH
|
|
262
|
+
const nodeBinDir = getNodeBinDir();
|
|
263
|
+
const pathPrefix = buildCronPathPrefix(nodeBinDir, nightWatchBin);
|
|
264
|
+
const cliBinPrefix = `export NW_CLI_BIN=${shellQuote(nightWatchBin)} && `;
|
|
265
|
+
const cronTriggerPrefix = 'export NW_CRON_TRIGGER=1 && ';
|
|
266
|
+
// Build providerEnv export prefix for cron entries
|
|
267
|
+
let providerEnvPrefix = '';
|
|
268
|
+
if (config.providerEnv && Object.keys(config.providerEnv).length > 0) {
|
|
269
|
+
const exports = Object.entries(config.providerEnv)
|
|
270
|
+
.map(([key, value]) => `export ${key}=${shellQuote(value)}`)
|
|
271
|
+
.join(' && ');
|
|
272
|
+
providerEnvPrefix = exports + ' && ';
|
|
273
|
+
}
|
|
274
|
+
// Executor entry (if enabled)
|
|
275
|
+
const installExecutor = config.executorEnabled !== false;
|
|
276
|
+
if (installExecutor) {
|
|
277
|
+
const executorEntry = `${executorSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} run >> ${shellQuote(executorLog)} 2>&1 ${marker}`;
|
|
278
|
+
entries.push(executorEntry);
|
|
279
|
+
}
|
|
280
|
+
// Determine if reviewer should be installed
|
|
281
|
+
// Priority: --no-reviewer flag > config.reviewerEnabled
|
|
282
|
+
const installReviewer = options.noReviewer === true ? false : config.reviewerEnabled;
|
|
283
|
+
// Reviewer entry (if enabled)
|
|
284
|
+
if (installReviewer) {
|
|
285
|
+
const reviewerEntry = `${reviewerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} review >> ${shellQuote(reviewerLog)} 2>&1 ${marker}`;
|
|
286
|
+
entries.push(reviewerEntry);
|
|
287
|
+
}
|
|
288
|
+
// Determine if planner should be installed
|
|
289
|
+
// Priority: --no-slicer flag > config.roadmapScanner.enabled
|
|
290
|
+
const installSlicer = options.noSlicer === true ? false : config.roadmapScanner.enabled;
|
|
291
|
+
// Planner entry (if roadmap scanner enabled)
|
|
292
|
+
let slicerLog;
|
|
293
|
+
if (installSlicer) {
|
|
294
|
+
slicerLog = path.join(logDir, 'slicer.log');
|
|
295
|
+
const slicerSchedule = config.roadmapScanner.slicerSchedule;
|
|
296
|
+
const slicerEntry = `${slicerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} planner >> ${shellQuote(slicerLog)} 2>&1 ${marker}`;
|
|
297
|
+
entries.push(slicerEntry);
|
|
298
|
+
}
|
|
299
|
+
// Determine if QA should be installed
|
|
300
|
+
const disableQa = options.noQa === true || options.qa === false;
|
|
301
|
+
const installQa = disableQa ? false : config.qa.enabled;
|
|
302
|
+
// QA entry (if enabled)
|
|
303
|
+
let qaLog;
|
|
304
|
+
if (installQa) {
|
|
305
|
+
qaLog = path.join(logDir, 'qa.log');
|
|
306
|
+
const qaSchedule = config.qa.schedule;
|
|
307
|
+
const qaEntry = `${qaSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} qa >> ${shellQuote(qaLog)} 2>&1 ${marker}`;
|
|
308
|
+
entries.push(qaEntry);
|
|
309
|
+
}
|
|
310
|
+
// Determine if audit should be installed
|
|
311
|
+
const disableAudit = options.noAudit === true || options.audit === false;
|
|
312
|
+
const installAudit = disableAudit ? false : config.audit.enabled;
|
|
313
|
+
// Audit entry (if enabled)
|
|
314
|
+
let auditLog;
|
|
315
|
+
if (installAudit) {
|
|
316
|
+
auditLog = path.join(logDir, 'audit.log');
|
|
317
|
+
const auditSchedule = config.audit.schedule;
|
|
318
|
+
const auditEntry = `${auditSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} audit >> ${shellQuote(auditLog)} 2>&1 ${marker}`;
|
|
319
|
+
entries.push(auditEntry);
|
|
320
|
+
}
|
|
321
|
+
// Determine if analytics should be installed
|
|
322
|
+
const disableAnalytics = options.noAnalytics === true || options.analytics === false;
|
|
323
|
+
const installAnalytics = disableAnalytics ? false : config.analytics.enabled;
|
|
324
|
+
// Analytics entry (if enabled)
|
|
325
|
+
let analyticsLog;
|
|
326
|
+
if (installAnalytics) {
|
|
327
|
+
analyticsLog = path.join(logDir, 'analytics.log');
|
|
328
|
+
const analyticsSchedule = config.analytics.schedule;
|
|
329
|
+
const analyticsEntry = `${analyticsSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} analytics >> ${shellQuote(analyticsLog)} 2>&1 ${marker}`;
|
|
330
|
+
entries.push(analyticsEntry);
|
|
331
|
+
}
|
|
332
|
+
// Determine if PR resolver should be installed
|
|
333
|
+
const disablePrResolver = options.noPrResolver === true ||
|
|
334
|
+
options.prResolver === false;
|
|
335
|
+
const installPrResolver = disablePrResolver ? false : config.prResolver.enabled;
|
|
336
|
+
// PR Resolver entry (if enabled)
|
|
337
|
+
let prResolverLog;
|
|
338
|
+
if (installPrResolver) {
|
|
339
|
+
prResolverLog = path.join(logDir, 'pr-resolver.log');
|
|
340
|
+
const prResolverSchedule = config.prResolver.schedule;
|
|
341
|
+
const prResolverEntry = `${prResolverSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} resolve >> ${shellQuote(prResolverLog)} 2>&1 ${marker}`;
|
|
342
|
+
entries.push(prResolverEntry);
|
|
343
|
+
}
|
|
344
|
+
// Determine if merger should be installed
|
|
345
|
+
const disableMerger = options.noMerger === true ||
|
|
346
|
+
options.merger === false;
|
|
347
|
+
const installMerger = disableMerger ? false : (config.merger?.enabled ?? false);
|
|
348
|
+
// Merger entry (if enabled)
|
|
349
|
+
let mergerLog;
|
|
350
|
+
if (installMerger) {
|
|
351
|
+
mergerLog = path.join(logDir, 'merger.log');
|
|
352
|
+
const mergerSchedule = config.merger.schedule;
|
|
353
|
+
const mergerEntry = `${mergerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}${cronTriggerPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} merge >> ${shellQuote(mergerLog)} 2>&1 ${marker}`;
|
|
354
|
+
entries.push(mergerEntry);
|
|
355
|
+
}
|
|
356
|
+
// Add all entries
|
|
357
|
+
const existingEntrySet = new Set(existingEntries);
|
|
358
|
+
const currentCrontab = readCrontab();
|
|
359
|
+
const baseCrontab = options.force
|
|
360
|
+
? currentCrontab.filter((line) => !existingEntrySet.has(line) && !line.includes(marker))
|
|
361
|
+
: currentCrontab;
|
|
362
|
+
const newCrontab = [...baseCrontab, ...entries];
|
|
363
|
+
writeCrontab(newCrontab);
|
|
364
|
+
// Success message
|
|
365
|
+
success(`Night Watch installed successfully for ${projectName}!`);
|
|
366
|
+
console.log();
|
|
367
|
+
header('Crontab Entries Added');
|
|
368
|
+
entries.forEach((entry) => dim(` ${entry}`));
|
|
369
|
+
console.log();
|
|
370
|
+
header('Log Files');
|
|
371
|
+
if (installExecutor) {
|
|
372
|
+
dim(` Executor: ${executorLog}`);
|
|
373
|
+
}
|
|
374
|
+
if (installReviewer) {
|
|
375
|
+
dim(` Reviewer: ${reviewerLog}`);
|
|
376
|
+
}
|
|
377
|
+
if (installSlicer && slicerLog) {
|
|
378
|
+
dim(` Planner: ${slicerLog}`);
|
|
379
|
+
}
|
|
380
|
+
if (installQa && qaLog) {
|
|
381
|
+
dim(` QA: ${qaLog}`);
|
|
382
|
+
}
|
|
383
|
+
if (installAudit && auditLog) {
|
|
384
|
+
dim(` Audit: ${auditLog}`);
|
|
385
|
+
}
|
|
386
|
+
if (installAnalytics && analyticsLog) {
|
|
387
|
+
dim(` Analytics: ${analyticsLog}`);
|
|
388
|
+
}
|
|
389
|
+
if (installPrResolver && prResolverLog) {
|
|
390
|
+
dim(` PR Resolver: ${prResolverLog}`);
|
|
391
|
+
}
|
|
392
|
+
if (installMerger && mergerLog) {
|
|
393
|
+
dim(` Merger: ${mergerLog}`);
|
|
394
|
+
}
|
|
395
|
+
console.log();
|
|
396
|
+
dim('To uninstall, run: night-watch uninstall');
|
|
397
|
+
dim('To check status, run: night-watch status');
|
|
398
|
+
}
|
|
399
|
+
catch (err) {
|
|
400
|
+
uiError(`Error installing Night Watch: ${err instanceof Error ? err.message : String(err)}`);
|
|
401
|
+
process.exit(1);
|
|
402
|
+
}
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAEL,OAAO,EACP,GAAG,EACH,cAAc,EACd,UAAU,EACV,iBAAiB,EACjB,cAAc,EACd,MAAM,EACN,UAAU,EACV,WAAW,EACX,eAAe,EACf,OAAO,EACP,KAAK,IAAI,OAAO,EAChB,IAAI,EACJ,YAAY,GACb,MAAM,mBAAmB,CAAC;AAoB3B;;GAEG;AACH,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB;IAC3B,4CAA4C;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;QACjD,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mCAAmC;IACrC,CAAC;IAED,oBAAoB;IACpB,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,mBAAmB,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;QACrC,OAAO,aAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa;IACpB,kFAAkF;IAClF,mFAAmF;IACnF,8DAA8D;IAC9D,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;QACpD,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAAkB,EAAE,aAAqB;IAC3E,MAAM,gBAAgB,GACpB,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAC1B,IAAI,GAAG,CAAC,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAC1E,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,gBAAgB,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC;AAC1D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,MAAc;IAClE,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACtC,iDAAiD;IACjD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,MAAyB,EACzB,OAgBC;IAED,IAAI,CAAC;QACH,MAAM,gBAAgB,GAAG,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC;QAClE,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC;QAC9E,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAE9C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAEtD,4CAA4C;QAC5C,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;YACpB,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;YACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,eAAe,CAAC,UAAU,CAAC,CAAC;gBAC5B,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,OAAO,EAAE,eAAe;oBACxB,KAAK,EAAE,kDAAkD;iBAC1D,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAa,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,qBAAqB,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC;QAC1E,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;QAEzD,IAAI,iBAAiB,GAAG,EAAE,CAAC;QAC3B,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;iBAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;iBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC;YAChB,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;QACvC,CAAC;QAED,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC;QACzD,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,aAAa,GAAG,GAAG,gBAAgB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,WAAW,UAAU,CAAC,WAAW,CAAC,UAAU,MAAM,EAAE,CAAC;YAC/N,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,MAAM,eAAe,GAAG,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;QACtF,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,aAAa,GAAG,GAAG,gBAAgB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,cAAc,UAAU,CAAC,WAAW,CAAC,UAAU,MAAM,EAAE,CAAC;YAClO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;QAED,+FAA+F;QAC/F,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;QACzF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC;YAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,GAAG,cAAc,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,eAAe,UAAU,CAAC,SAAS,CAAC,UAAU,MAAM,EAAE,CAAC;YAC7N,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,yCAAyC;QACzC,MAAM,SAAS,GAAG,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,EAAE,EAAE,KAAK,KAAK,CAAC;QAClE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;QACxD,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC1C,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU,MAAM,EAAE,CAAC;YAC5M,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QAED,+CAA+C;QAC/C,MAAM,YAAY,GAAG,OAAO,EAAE,OAAO,KAAK,IAAI,IAAI,OAAO,EAAE,KAAK,KAAK,KAAK,CAAC;QAC3E,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QACjE,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAChD,MAAM,UAAU,GAAG,GAAG,aAAa,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,aAAa,UAAU,CAAC,QAAQ,CAAC,UAAU,MAAM,EAAE,CAAC;YACxN,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3B,CAAC;QAED,uDAAuD;QACvD,MAAM,gBAAgB,GAAG,OAAO,EAAE,WAAW,KAAK,IAAI,IAAI,OAAO,EAAE,SAAS,KAAK,KAAK,CAAC;QACvF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;QAC7E,IAAI,gBAAgB,EAAE,CAAC;YACrB,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;YACpD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;YACxD,MAAM,cAAc,GAAG,GAAG,iBAAiB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,iBAAiB,UAAU,CAAC,YAAY,CAAC,UAAU,MAAM,EAAE,CAAC;YACxO,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/B,CAAC;QAED,0DAA0D;QAC1D,MAAM,iBAAiB,GAAG,OAAO,EAAE,YAAY,KAAK,IAAI,IAAI,OAAO,EAAE,UAAU,KAAK,KAAK,CAAC;QAC1F,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAChF,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YACtD,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;YAC3D,MAAM,eAAe,GAAG,GAAG,kBAAkB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,eAAe,UAAU,CAAC,aAAa,CAAC,UAAU,MAAM,EAAE,CAAC;YACzO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAChC,CAAC;QAED,iDAAiD;QACjD,MAAM,aAAa,GAAG,OAAO,EAAE,QAAQ,KAAK,IAAI,IAAI,OAAO,EAAE,MAAM,KAAK,KAAK,CAAC;QAC9E,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;QAChF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAClD,MAAM,WAAW,GAAG,GAAG,cAAc,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,aAAa,UAAU,CAAC,SAAS,CAAC,UAAU,MAAM,EAAE,CAAC;YAC3N,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAC7B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,EAAE,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAC/E,CAAC;QACF,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;QACrC,MAAM,WAAW,GAAG,OAAO,EAAE,KAAK;YAChC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvF,CAAC,CAAC,cAAc,CAAC;QACnB,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;QAChD,YAAY,CAAC,UAAU,CAAC,CAAC;QACzB,eAAe,CAAC,UAAU,CAAC,CAAC;QAE5B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,uBAAuB,EAAE,gCAAgC,CAAC;SACjE,MAAM,CAAC,4BAA4B,EAAE,4BAA4B,CAAC;SAClE,MAAM,CAAC,eAAe,EAAE,+BAA+B,CAAC;SACxD,MAAM,CAAC,aAAa,EAAE,6BAA6B,CAAC;SACpD,MAAM,CAAC,SAAS,EAAE,yBAAyB,CAAC;SAC5C,MAAM,CAAC,YAAY,EAAE,4BAA4B,CAAC;SAClD,MAAM,CAAC,gBAAgB,EAAE,gCAAgC,CAAC;SAC1D,MAAM,CAAC,kBAAkB,EAAE,kCAAkC,CAAC;SAC9D,MAAM,CAAC,aAAa,EAAE,6BAA6B,CAAC;SACpD,MAAM,CAAC,aAAa,EAAE,gDAAgD,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,OAAwB,EAAE,EAAE;QACzC,IAAI,CAAC;YACH,wBAAwB;YACxB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;YAEjC,qBAAqB;YACrB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YAEtC,wCAAwC;YACxC,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,YAAY,CAAC;YACjE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,MAAM,CAAC,gBAAgB,CAAC;YAE7E,YAAY;YACZ,MAAM,aAAa,GAAG,oBAAoB,EAAE,CAAC;YAC7C,MAAM,WAAW,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;YAC/C,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YAE9C,8BAA8B;YAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAEtD,6BAA6B;YAC7B,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;YACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACjD,IAAI,CAAC,wCAAwC,WAAW,GAAG,CAAC,CAAC;gBAC7D,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACjC,eAAe,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,GAAG,CAAC,oDAAoD,CAAC,CAAC;gBAC1D,OAAO;YACT,CAAC;YAED,yBAAyB;YACzB,MAAM,OAAO,GAAa,EAAE,CAAC;YAE7B,0CAA0C;YAC1C,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,qBAAqB,UAAU,CAAC,aAAa,CAAC,MAAM,CAAC;YAC1E,MAAM,iBAAiB,GAAG,8BAA8B,CAAC;YAEzD,mDAAmD;YACnD,IAAI,iBAAiB,GAAG,EAAE,CAAC;YAC3B,IAAI,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC;qBAC/C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;qBAC3D,IAAI,CAAC,MAAM,CAAC,CAAC;gBAChB,iBAAiB,GAAG,OAAO,GAAG,MAAM,CAAC;YACvC,CAAC;YAED,8BAA8B;YAC9B,MAAM,eAAe,GAAG,MAAM,CAAC,eAAe,KAAK,KAAK,CAAC;YACzD,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,GAAG,gBAAgB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,WAAW,UAAU,CAAC,WAAW,CAAC,UAAU,MAAM,EAAE,CAAC;gBAC/N,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YAED,4CAA4C;YAC5C,wDAAwD;YACxD,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC;YAErF,8BAA8B;YAC9B,IAAI,eAAe,EAAE,CAAC;gBACpB,MAAM,aAAa,GAAG,GAAG,gBAAgB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,cAAc,UAAU,CAAC,WAAW,CAAC,UAAU,MAAM,EAAE,CAAC;gBAClO,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YAED,2CAA2C;YAC3C,6DAA6D;YAC7D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC;YAExF,6CAA6C;YAC7C,IAAI,SAA6B,CAAC;YAClC,IAAI,aAAa,EAAE,CAAC;gBAClB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC,cAAc,CAAC;gBAC5D,MAAM,WAAW,GAAG,GAAG,cAAc,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,eAAe,UAAU,CAAC,SAAS,CAAC,UAAU,MAAM,EAAE,CAAC;gBAC7N,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YAED,sCAAsC;YACtC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,KAAK,CAAC;YAChE,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC;YAExD,wBAAwB;YACxB,IAAI,KAAyB,CAAC;YAC9B,IAAI,SAAS,EAAE,CAAC;gBACd,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;gBACpC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC;gBACtC,MAAM,OAAO,GAAG,GAAG,UAAU,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,UAAU,UAAU,CAAC,KAAK,CAAC,UAAU,MAAM,EAAE,CAAC;gBAC5M,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxB,CAAC;YAED,yCAAyC;YACzC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC;YACzE,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;YAEjE,2BAA2B;YAC3B,IAAI,QAA4B,CAAC;YACjC,IAAI,YAAY,EAAE,CAAC;gBACjB,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC;gBAC5C,MAAM,UAAU,GAAG,GAAG,aAAa,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,aAAa,UAAU,CAAC,QAAQ,CAAC,UAAU,MAAM,EAAE,CAAC;gBACxN,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3B,CAAC;YAED,6CAA6C;YAC7C,MAAM,gBAAgB,GACpB,OAAO,CAAC,WAAW,KAAK,IAAI,IAAK,OAAmC,CAAC,SAAS,KAAK,KAAK,CAAC;YAC3F,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC;YAE7E,+BAA+B;YAC/B,IAAI,YAAgC,CAAC;YACrC,IAAI,gBAAgB,EAAE,CAAC;gBACrB,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;gBAClD,MAAM,iBAAiB,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;gBACpD,MAAM,cAAc,GAAG,GAAG,iBAAiB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,iBAAiB,UAAU,CAAC,YAAY,CAAC,UAAU,MAAM,EAAE,CAAC;gBACxO,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YAC/B,CAAC;YAED,+CAA+C;YAC/C,MAAM,iBAAiB,GACrB,OAAO,CAAC,YAAY,KAAK,IAAI;gBAC5B,OAAmC,CAAC,UAAU,KAAK,KAAK,CAAC;YAC5D,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;YAEhF,iCAAiC;YACjC,IAAI,aAAiC,CAAC;YACtC,IAAI,iBAAiB,EAAE,CAAC;gBACtB,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;gBACrD,MAAM,kBAAkB,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;gBACtD,MAAM,eAAe,GAAG,GAAG,kBAAkB,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,eAAe,UAAU,CAAC,aAAa,CAAC,UAAU,MAAM,EAAE,CAAC;gBACzO,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAChC,CAAC;YAED,0CAA0C;YAC1C,MAAM,aAAa,GACjB,OAAO,CAAC,QAAQ,KAAK,IAAI;gBACxB,OAAmC,CAAC,MAAM,KAAK,KAAK,CAAC;YACxD,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YAEhF,4BAA4B;YAC5B,IAAI,SAA6B,CAAC;YAClC,IAAI,aAAa,EAAE,CAAC;gBAClB,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAC5C,MAAM,cAAc,GAAG,MAAM,CAAC,MAAO,CAAC,QAAQ,CAAC;gBAC/C,MAAM,WAAW,GAAG,GAAG,cAAc,IAAI,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,iBAAiB,MAAM,UAAU,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,aAAa,CAAC,aAAa,UAAU,CAAC,SAAS,CAAC,UAAU,MAAM,EAAE,CAAC;gBAC3N,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,CAAC;YAED,kBAAkB;YAClB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,CAAC;YAClD,MAAM,cAAc,GAAG,WAAW,EAAE,CAAC;YACrC,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK;gBAC/B,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACxF,CAAC,CAAC,cAAc,CAAC;YACnB,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,OAAO,CAAC,CAAC;YAChD,YAAY,CAAC,UAAU,CAAC,CAAC;YAEzB,kBAAkB;YAClB,OAAO,CAAC,0CAA0C,WAAW,GAAG,CAAC,CAAC;YAClE,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,uBAAuB,CAAC,CAAC;YAChC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,CAAC,WAAW,CAAC,CAAC;YACpB,IAAI,eAAe,EAAE,CAAC;gBACpB,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACpB,GAAG,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC;YACpC,CAAC;YACD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;YACjC,CAAC;YACD,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;gBACvB,GAAG,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;YACxB,CAAC;YACD,IAAI,YAAY,IAAI,QAAQ,EAAE,CAAC;gBAC7B,GAAG,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;YAC9B,CAAC;YACD,IAAI,gBAAgB,IAAI,YAAY,EAAE,CAAC;gBACrC,GAAG,CAAC,gBAAgB,YAAY,EAAE,CAAC,CAAC;YACtC,CAAC;YACD,IAAI,iBAAiB,IAAI,aAAa,EAAE,CAAC;gBACvC,GAAG,CAAC,kBAAkB,aAAa,EAAE,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;gBAC/B,GAAG,CAAC,aAAa,SAAS,EAAE,CAAC,CAAC;YAChC,CAAC;YACD,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,GAAG,CAAC,0CAA0C,CAAC,CAAC;YAChD,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CACL,iCAAiC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACpF,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logs command for Night Watch CLI
|
|
3
|
+
* View log output from Night Watch jobs
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface ILogsOptions {
|
|
7
|
+
lines?: string;
|
|
8
|
+
follow?: boolean;
|
|
9
|
+
type?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Logs command implementation
|
|
13
|
+
*/
|
|
14
|
+
export declare function logsCommand(program: Command): void;
|
|
15
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logs command for Night Watch CLI
|
|
3
|
+
* View log output from Night Watch jobs
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import * as fs from 'fs';
|
|
8
|
+
import { ANALYTICS_LOG_NAME, AUDIT_LOG_NAME, EXECUTOR_LOG_FILE, LOG_DIR, MERGER_LOG_NAME, PLANNER_LOG_NAME, QA_LOG_NAME, REVIEWER_LOG_FILE, dim, header, } from '@night-watch/core';
|
|
9
|
+
/**
|
|
10
|
+
* Get last N lines from a file
|
|
11
|
+
*/
|
|
12
|
+
function getLastLines(filePath, lineCount) {
|
|
13
|
+
if (!fs.existsSync(filePath)) {
|
|
14
|
+
return `Log file not found: ${filePath}`;
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
18
|
+
const lines = content.trim().split('\n');
|
|
19
|
+
return lines.slice(-lineCount).join('\n');
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return `Error reading log file: ${error instanceof Error ? error.message : String(error)}`;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Follow log file in real-time using tail -f
|
|
27
|
+
*/
|
|
28
|
+
function followLog(filePath) {
|
|
29
|
+
if (!fs.existsSync(filePath)) {
|
|
30
|
+
console.log(`Log file not found: ${filePath}`);
|
|
31
|
+
console.log('The log file will be created when the first execution runs.');
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const tail = spawn('tail', ['-f', filePath], {
|
|
35
|
+
stdio: 'inherit',
|
|
36
|
+
});
|
|
37
|
+
tail.on('error', (error) => {
|
|
38
|
+
console.error(`Error following log: ${error.message}`);
|
|
39
|
+
});
|
|
40
|
+
// Handle Ctrl+C gracefully
|
|
41
|
+
process.on('SIGINT', () => {
|
|
42
|
+
tail.kill();
|
|
43
|
+
process.exit(0);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Logs command implementation
|
|
48
|
+
*/
|
|
49
|
+
export function logsCommand(program) {
|
|
50
|
+
program
|
|
51
|
+
.command('logs')
|
|
52
|
+
.description('View night-watch log output')
|
|
53
|
+
.option('-n, --lines <count>', 'Number of lines to show', '50')
|
|
54
|
+
.option('-f, --follow', 'Follow log output (tail -f)')
|
|
55
|
+
.option('-t, --type <type>', 'Log type to view (executor|reviewer|qa|audit|planner|analytics|merger|all)', 'all')
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
try {
|
|
58
|
+
const projectDir = process.cwd();
|
|
59
|
+
const logDir = path.join(projectDir, LOG_DIR);
|
|
60
|
+
const lineCount = parseInt(options.lines || '50', 10);
|
|
61
|
+
const executorLog = path.join(logDir, EXECUTOR_LOG_FILE);
|
|
62
|
+
const reviewerLog = path.join(logDir, REVIEWER_LOG_FILE);
|
|
63
|
+
const qaLog = path.join(logDir, `${QA_LOG_NAME}.log`);
|
|
64
|
+
const auditLog = path.join(logDir, `${AUDIT_LOG_NAME}.log`);
|
|
65
|
+
const plannerLog = path.join(logDir, `${PLANNER_LOG_NAME}.log`);
|
|
66
|
+
const analyticsLog = path.join(logDir, `${ANALYTICS_LOG_NAME}.log`);
|
|
67
|
+
const mergerLog = path.join(logDir, `${MERGER_LOG_NAME}.log`);
|
|
68
|
+
// Determine which logs to show
|
|
69
|
+
const logType = options.type?.toLowerCase() || 'all';
|
|
70
|
+
const showExecutor = logType === 'all' || logType === 'run' || logType === 'executor';
|
|
71
|
+
const showReviewer = logType === 'all' || logType === 'review' || logType === 'reviewer';
|
|
72
|
+
const showQa = logType === 'all' || logType === 'qa';
|
|
73
|
+
const showAudit = logType === 'all' || logType === 'audit';
|
|
74
|
+
const showPlanner = logType === 'all' || logType === 'planner' || logType === 'slice' || logType === 'slicer';
|
|
75
|
+
const showAnalytics = logType === 'all' || logType === 'analytics';
|
|
76
|
+
const showMerger = logType === 'all' || logType === 'merge' || logType === 'merger';
|
|
77
|
+
// Handle --follow mode
|
|
78
|
+
if (options.follow) {
|
|
79
|
+
if (logType === 'all') {
|
|
80
|
+
dim('Note: Following all logs is not supported. Showing executor log.');
|
|
81
|
+
dim('Use --type reviewer|qa|audit|planner|analytics|merger for other logs.\n');
|
|
82
|
+
}
|
|
83
|
+
let targetLog = executorLog;
|
|
84
|
+
if (showReviewer)
|
|
85
|
+
targetLog = reviewerLog;
|
|
86
|
+
else if (showQa)
|
|
87
|
+
targetLog = qaLog;
|
|
88
|
+
else if (showAudit)
|
|
89
|
+
targetLog = auditLog;
|
|
90
|
+
else if (showPlanner)
|
|
91
|
+
targetLog = plannerLog;
|
|
92
|
+
else if (showAnalytics)
|
|
93
|
+
targetLog = analyticsLog;
|
|
94
|
+
else if (showMerger)
|
|
95
|
+
targetLog = mergerLog;
|
|
96
|
+
followLog(targetLog);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
// Show static log output
|
|
100
|
+
console.log();
|
|
101
|
+
if (showExecutor) {
|
|
102
|
+
header('Executor Log');
|
|
103
|
+
dim(`File: ${executorLog}`);
|
|
104
|
+
console.log();
|
|
105
|
+
console.log(getLastLines(executorLog, lineCount));
|
|
106
|
+
}
|
|
107
|
+
if (showReviewer) {
|
|
108
|
+
header('Reviewer Log');
|
|
109
|
+
dim(`File: ${reviewerLog}`);
|
|
110
|
+
console.log();
|
|
111
|
+
console.log(getLastLines(reviewerLog, lineCount));
|
|
112
|
+
}
|
|
113
|
+
if (showQa) {
|
|
114
|
+
header('QA Log');
|
|
115
|
+
dim(`File: ${qaLog}`);
|
|
116
|
+
console.log();
|
|
117
|
+
console.log(getLastLines(qaLog, lineCount));
|
|
118
|
+
}
|
|
119
|
+
if (showAudit) {
|
|
120
|
+
header('Audit Log');
|
|
121
|
+
dim(`File: ${auditLog}`);
|
|
122
|
+
console.log();
|
|
123
|
+
console.log(getLastLines(auditLog, lineCount));
|
|
124
|
+
}
|
|
125
|
+
if (showPlanner) {
|
|
126
|
+
header('Planner Log');
|
|
127
|
+
dim(`File: ${plannerLog}`);
|
|
128
|
+
console.log();
|
|
129
|
+
console.log(getLastLines(plannerLog, lineCount));
|
|
130
|
+
}
|
|
131
|
+
if (showAnalytics) {
|
|
132
|
+
header('Analytics Log');
|
|
133
|
+
dim(`File: ${analyticsLog}`);
|
|
134
|
+
console.log();
|
|
135
|
+
console.log(getLastLines(analyticsLog, lineCount));
|
|
136
|
+
}
|
|
137
|
+
if (showMerger) {
|
|
138
|
+
header('Merger Log');
|
|
139
|
+
dim(`File: ${mergerLog}`);
|
|
140
|
+
console.log();
|
|
141
|
+
console.log(getLastLines(mergerLog, lineCount));
|
|
142
|
+
}
|
|
143
|
+
// Add tip
|
|
144
|
+
console.log();
|
|
145
|
+
dim('---');
|
|
146
|
+
dim('Tip: Use -f to follow logs in real-time');
|
|
147
|
+
dim(' Use --type executor|reviewer|qa|audit|planner|analytics|merger to view specific logs');
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
console.error(`Error reading logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Merge command - executes the merger cron script
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
import { INightWatchConfig } from '@night-watch/core';
|
|
6
|
+
/**
|
|
7
|
+
* Options for the merge command
|
|
8
|
+
*/
|
|
9
|
+
export interface IMergeOptions {
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
timeout?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build environment variables map from config and CLI options for merger
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildEnvVars(config: INightWatchConfig, options: IMergeOptions): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Apply CLI flag overrides to the config for merger
|
|
20
|
+
*/
|
|
21
|
+
export declare function applyCliOverrides(config: INightWatchConfig, options: IMergeOptions): INightWatchConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Register the merge command with the program
|
|
24
|
+
*/
|
|
25
|
+
export declare function mergeCommand(program: Command): void;
|
|
26
|
+
//# sourceMappingURL=merge.d.ts.map
|