@jonit-dev/night-watch-cli 1.8.10-beta.3 → 1.8.10-beta.4
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.d.ts.map +1 -0
- package/dist/cli.js +957 -1906
- package/dist/cli.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-config.js +873 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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 -0
- package/dist/commands/init.js +777 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +65 -0
- package/dist/commands/install.d.ts.map +1 -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.d.ts.map +1 -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 -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.d.ts.map +1 -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 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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 -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.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/commands/retry.js +71 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/review.d.ts +82 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +479 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +73 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +509 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/serve.d.ts +19 -0
- package/dist/commands/serve.d.ts.map +1 -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 -0
- package/dist/commands/shared/env-builder.js +150 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.d.ts.map +1 -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.d.ts.map +1 -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.d.ts.map +1 -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.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 +25 -0
- package/dist/commands/uninstall.d.ts.map +1 -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.d.ts.map +1 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/scripts/night-watch-helpers.sh +52 -7
- package/dist/web/assets/index-CgXj_KM1.css +1 -0
- package/dist/web/assets/index-Dr4zlyJf.js +406 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-BUgI2S1s.js +0 -406
- package/dist/web/assets/index-CkdLFBd7.js +0 -406
- package/dist/web/assets/index-RMfswANB.css +0 -1
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard command for Night Watch CLI
|
|
3
|
+
* Tabbed TUI with Status, Config, Schedules, Actions, and Logs tabs
|
|
4
|
+
*/
|
|
5
|
+
import blessed from 'blessed';
|
|
6
|
+
import { fetchStatusSnapshot, loadConfig } from '@night-watch/core';
|
|
7
|
+
import { createStatusTab } from './dashboard/tab-status.js';
|
|
8
|
+
import { createConfigTab } from './dashboard/tab-config.js';
|
|
9
|
+
import { createSchedulesTab } from './dashboard/tab-schedules.js';
|
|
10
|
+
import { createActionsTab } from './dashboard/tab-actions.js';
|
|
11
|
+
import { createLogsTab } from './dashboard/tab-logs.js';
|
|
12
|
+
// Re-export render functions for backward compatibility (used by tests)
|
|
13
|
+
export { renderPrdPane, renderProcessPane, renderPrPane, renderLogPane, } from './dashboard/tab-status.js';
|
|
14
|
+
/**
|
|
15
|
+
* Show a temporary flash message overlay
|
|
16
|
+
*/
|
|
17
|
+
function showMessage(screen, text, type, durationMs = 2000) {
|
|
18
|
+
const colors = { success: 'green', error: 'red', info: 'cyan' };
|
|
19
|
+
const msgBox = blessed.box({
|
|
20
|
+
top: 'center',
|
|
21
|
+
left: 'center',
|
|
22
|
+
width: Math.min(60, text.length + 6),
|
|
23
|
+
height: 3,
|
|
24
|
+
content: `{center}${text}{/center}`,
|
|
25
|
+
tags: true,
|
|
26
|
+
border: { type: 'line' },
|
|
27
|
+
style: { border: { fg: colors[type] }, fg: 'white', bg: 'black' },
|
|
28
|
+
});
|
|
29
|
+
screen.append(msgBox);
|
|
30
|
+
screen.render();
|
|
31
|
+
setTimeout(() => {
|
|
32
|
+
msgBox.destroy();
|
|
33
|
+
screen.render();
|
|
34
|
+
}, durationMs);
|
|
35
|
+
}
|
|
36
|
+
export function dashboardCommand(program) {
|
|
37
|
+
program
|
|
38
|
+
.command('dashboard')
|
|
39
|
+
.description('Live terminal dashboard [experimental]')
|
|
40
|
+
.option('--interval <seconds>', 'Refresh interval in seconds', '10')
|
|
41
|
+
.action(async (options) => {
|
|
42
|
+
const projectDir = process.cwd();
|
|
43
|
+
let config = loadConfig(projectDir);
|
|
44
|
+
// Create blessed screen
|
|
45
|
+
const screen = blessed.screen({
|
|
46
|
+
smartCSR: true,
|
|
47
|
+
title: 'Night Watch Dashboard',
|
|
48
|
+
fullUnicode: true,
|
|
49
|
+
});
|
|
50
|
+
// --- Layout ---
|
|
51
|
+
// Header: row 0, height 1
|
|
52
|
+
const headerBox = blessed.box({
|
|
53
|
+
top: 0,
|
|
54
|
+
left: 0,
|
|
55
|
+
width: '100%',
|
|
56
|
+
height: 1,
|
|
57
|
+
content: '{center}Night Watch Dashboard{/center}',
|
|
58
|
+
tags: true,
|
|
59
|
+
style: { fg: 'cyan', bold: true },
|
|
60
|
+
});
|
|
61
|
+
// Tab bar: row 1, height 1
|
|
62
|
+
const tabBar = blessed.box({
|
|
63
|
+
top: 1,
|
|
64
|
+
left: 0,
|
|
65
|
+
width: '100%',
|
|
66
|
+
height: 1,
|
|
67
|
+
tags: true,
|
|
68
|
+
style: { fg: 'white', bg: 'black' },
|
|
69
|
+
content: '',
|
|
70
|
+
});
|
|
71
|
+
// Content area: rows 2..n-2
|
|
72
|
+
const contentArea = blessed.box({
|
|
73
|
+
top: 2,
|
|
74
|
+
left: 0,
|
|
75
|
+
width: '100%',
|
|
76
|
+
height: '100%-4',
|
|
77
|
+
});
|
|
78
|
+
// Footer: bottom row
|
|
79
|
+
const footerBox = blessed.box({
|
|
80
|
+
bottom: 0,
|
|
81
|
+
left: 0,
|
|
82
|
+
width: '100%',
|
|
83
|
+
height: 1,
|
|
84
|
+
content: '',
|
|
85
|
+
tags: true,
|
|
86
|
+
style: { fg: 'white', bg: 'blue' },
|
|
87
|
+
});
|
|
88
|
+
screen.append(headerBox);
|
|
89
|
+
screen.append(tabBar);
|
|
90
|
+
screen.append(contentArea);
|
|
91
|
+
screen.append(footerBox);
|
|
92
|
+
// --- Create tabs ---
|
|
93
|
+
const tabs = [
|
|
94
|
+
createStatusTab(),
|
|
95
|
+
createConfigTab(),
|
|
96
|
+
createSchedulesTab(),
|
|
97
|
+
createActionsTab(),
|
|
98
|
+
createLogsTab(),
|
|
99
|
+
];
|
|
100
|
+
// Append all tab containers to content area
|
|
101
|
+
for (const tab of tabs) {
|
|
102
|
+
contentArea.append(tab.container);
|
|
103
|
+
}
|
|
104
|
+
// --- State ---
|
|
105
|
+
let activeTabIndex = 0;
|
|
106
|
+
let isEditing = false;
|
|
107
|
+
let snapshot = await fetchStatusSnapshot(projectDir, config);
|
|
108
|
+
// --- Tab context ---
|
|
109
|
+
const ctx = {
|
|
110
|
+
screen,
|
|
111
|
+
projectDir,
|
|
112
|
+
config,
|
|
113
|
+
snapshot,
|
|
114
|
+
reloadConfig: () => {
|
|
115
|
+
config = loadConfig(projectDir);
|
|
116
|
+
ctx.config = config;
|
|
117
|
+
return config;
|
|
118
|
+
},
|
|
119
|
+
refreshSnapshot: async () => {
|
|
120
|
+
snapshot = await fetchStatusSnapshot(projectDir, config);
|
|
121
|
+
ctx.snapshot = snapshot;
|
|
122
|
+
return snapshot;
|
|
123
|
+
},
|
|
124
|
+
setFooter: (text) => {
|
|
125
|
+
footerBox.setContent(text);
|
|
126
|
+
},
|
|
127
|
+
showMessage: (text, type, durationMs) => {
|
|
128
|
+
showMessage(screen, text, type, durationMs);
|
|
129
|
+
},
|
|
130
|
+
setEditing: (editing) => {
|
|
131
|
+
isEditing = editing;
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
// --- Tab bar rendering ---
|
|
135
|
+
function renderTabBar() {
|
|
136
|
+
const parts = tabs.map((tab, idx) => {
|
|
137
|
+
const num = idx + 1;
|
|
138
|
+
if (idx === activeTabIndex) {
|
|
139
|
+
return `{white-bg}{black-fg} ${num}:${tab.name} {/black-fg}{/white-bg}`;
|
|
140
|
+
}
|
|
141
|
+
return ` {blue-fg}${num}:${tab.name}{/blue-fg} `;
|
|
142
|
+
});
|
|
143
|
+
tabBar.setContent(parts.join(''));
|
|
144
|
+
}
|
|
145
|
+
// --- Tab switching ---
|
|
146
|
+
function switchTab(newIndex) {
|
|
147
|
+
if (newIndex === activeTabIndex)
|
|
148
|
+
return;
|
|
149
|
+
if (newIndex < 0 || newIndex >= tabs.length)
|
|
150
|
+
return;
|
|
151
|
+
if (isEditing)
|
|
152
|
+
return; // Don't switch while editing
|
|
153
|
+
// Deactivate current tab
|
|
154
|
+
tabs[activeTabIndex].deactivate();
|
|
155
|
+
tabs[activeTabIndex].container.hide();
|
|
156
|
+
// Activate new tab
|
|
157
|
+
activeTabIndex = newIndex;
|
|
158
|
+
tabs[activeTabIndex].container.show();
|
|
159
|
+
renderTabBar();
|
|
160
|
+
tabs[activeTabIndex].activate(ctx);
|
|
161
|
+
screen.render();
|
|
162
|
+
}
|
|
163
|
+
// --- Header ---
|
|
164
|
+
const intervalSeconds = parseInt(options.interval, 10) || 10;
|
|
165
|
+
let countdown = intervalSeconds;
|
|
166
|
+
function updateHeader() {
|
|
167
|
+
headerBox.setContent(`{center}Night Watch: ${snapshot.projectName} | Provider: ${config.provider} | Last: ${snapshot.timestamp.toLocaleTimeString()} | Next: ${countdown}s{/center}`);
|
|
168
|
+
}
|
|
169
|
+
// --- Refresh ---
|
|
170
|
+
async function refreshData() {
|
|
171
|
+
config = loadConfig(projectDir);
|
|
172
|
+
ctx.config = config;
|
|
173
|
+
snapshot = await fetchStatusSnapshot(projectDir, config);
|
|
174
|
+
ctx.snapshot = snapshot;
|
|
175
|
+
countdown = intervalSeconds;
|
|
176
|
+
updateHeader();
|
|
177
|
+
tabs[activeTabIndex].refresh(ctx);
|
|
178
|
+
screen.render();
|
|
179
|
+
}
|
|
180
|
+
// --- Timer ---
|
|
181
|
+
const timer = setInterval(() => {
|
|
182
|
+
countdown--;
|
|
183
|
+
updateHeader();
|
|
184
|
+
screen.render();
|
|
185
|
+
if (countdown <= 0) {
|
|
186
|
+
refreshData().catch(() => {
|
|
187
|
+
// Silently ignore errors during refresh
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}, 1000);
|
|
191
|
+
// --- Global keyboard handlers ---
|
|
192
|
+
screen.key(['q', 'escape'], () => {
|
|
193
|
+
if (isEditing)
|
|
194
|
+
return;
|
|
195
|
+
clearInterval(timer);
|
|
196
|
+
for (const tab of tabs) {
|
|
197
|
+
tab.destroy();
|
|
198
|
+
}
|
|
199
|
+
screen.destroy();
|
|
200
|
+
process.exit(0);
|
|
201
|
+
});
|
|
202
|
+
screen.key(['r'], () => {
|
|
203
|
+
if (isEditing)
|
|
204
|
+
return;
|
|
205
|
+
refreshData().catch(() => {
|
|
206
|
+
// Silently ignore errors during refresh
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
// Tab switching via number keys
|
|
210
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
211
|
+
const idx = i;
|
|
212
|
+
screen.key([String(i + 1)], () => {
|
|
213
|
+
if (isEditing)
|
|
214
|
+
return;
|
|
215
|
+
switchTab(idx);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
// Tab cycling is handled per-tab (Status tab uses Tab for pane focus)
|
|
219
|
+
// Shift+Tab always cycles tabs
|
|
220
|
+
screen.key(['S-tab'], () => {
|
|
221
|
+
if (isEditing)
|
|
222
|
+
return;
|
|
223
|
+
const newIndex = (activeTabIndex - 1 + tabs.length) % tabs.length;
|
|
224
|
+
switchTab(newIndex);
|
|
225
|
+
});
|
|
226
|
+
// --- Initial render ---
|
|
227
|
+
// Show only the first tab's container
|
|
228
|
+
for (let i = 0; i < tabs.length; i++) {
|
|
229
|
+
if (i === 0) {
|
|
230
|
+
tabs[i].container.show();
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
tabs[i].container.hide();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
renderTabBar();
|
|
237
|
+
updateHeader();
|
|
238
|
+
tabs[activeTabIndex].activate(ctx);
|
|
239
|
+
screen.render();
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command for Night Watch CLI
|
|
3
|
+
* Validates environment setup and system health
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
import { IWebhookConfig } from '@night-watch/core';
|
|
7
|
+
/**
|
|
8
|
+
* Validate a single webhook configuration and return a list of issues.
|
|
9
|
+
* Returns an empty array if the webhook is valid.
|
|
10
|
+
*/
|
|
11
|
+
export declare function validateWebhook(webhook: IWebhookConfig): string[];
|
|
12
|
+
/**
|
|
13
|
+
* Register the doctor command on the program
|
|
14
|
+
*/
|
|
15
|
+
export declare function doctorCommand(program: Command): void;
|
|
16
|
+
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAEL,cAAc,EAiBf,MAAM,mBAAmB,CAAC;AAG3B;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAqDjE;AAiDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyHpD"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Doctor command for Night Watch CLI
|
|
3
|
+
* Validates environment setup and system health
|
|
4
|
+
*/
|
|
5
|
+
import { BUILT_IN_PRESETS, checkConfigFile, checkCrontabAccess, checkGhCli, checkGitRepo, checkLogsDirectory, checkNodeVersion, checkProviderCli, header, info, label, loadConfig, step, success, error as uiError, warn, } from '@night-watch/core';
|
|
6
|
+
/**
|
|
7
|
+
* Validate a single webhook configuration and return a list of issues.
|
|
8
|
+
* Returns an empty array if the webhook is valid.
|
|
9
|
+
*/
|
|
10
|
+
export function validateWebhook(webhook) {
|
|
11
|
+
const issues = [];
|
|
12
|
+
// Validate events
|
|
13
|
+
if (!webhook.events || webhook.events.length === 0) {
|
|
14
|
+
issues.push('No events configured');
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
const validEvents = [
|
|
18
|
+
'run_started',
|
|
19
|
+
'run_succeeded',
|
|
20
|
+
'run_failed',
|
|
21
|
+
'run_timeout',
|
|
22
|
+
'review_completed',
|
|
23
|
+
'pr_auto_merged',
|
|
24
|
+
'rate_limit_fallback',
|
|
25
|
+
'qa_completed',
|
|
26
|
+
];
|
|
27
|
+
for (const event of webhook.events) {
|
|
28
|
+
if (!validEvents.includes(event)) {
|
|
29
|
+
issues.push(`Invalid event: ${event}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Platform-specific validation
|
|
34
|
+
switch (webhook.type) {
|
|
35
|
+
case 'slack':
|
|
36
|
+
if (!webhook.url) {
|
|
37
|
+
issues.push('Missing URL');
|
|
38
|
+
}
|
|
39
|
+
else if (!webhook.url.startsWith('https://hooks.slack.com/')) {
|
|
40
|
+
issues.push('URL should start with https://hooks.slack.com/');
|
|
41
|
+
}
|
|
42
|
+
break;
|
|
43
|
+
case 'discord':
|
|
44
|
+
if (!webhook.url) {
|
|
45
|
+
issues.push('Missing URL');
|
|
46
|
+
}
|
|
47
|
+
else if (!webhook.url.startsWith('https://discord.com/api/webhooks/')) {
|
|
48
|
+
issues.push('URL should start with https://discord.com/api/webhooks/');
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case 'telegram':
|
|
52
|
+
if (!webhook.botToken) {
|
|
53
|
+
issues.push('Missing botToken');
|
|
54
|
+
}
|
|
55
|
+
if (!webhook.chatId) {
|
|
56
|
+
issues.push('Missing chatId');
|
|
57
|
+
}
|
|
58
|
+
break;
|
|
59
|
+
default:
|
|
60
|
+
issues.push(`Unknown webhook type: ${webhook.type}`);
|
|
61
|
+
}
|
|
62
|
+
return issues;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Run a single check and print the result
|
|
66
|
+
*/
|
|
67
|
+
function runCheck(checkNum, total, checkName, checkFn, options) {
|
|
68
|
+
step(checkNum, total, `Checking ${checkName}...`);
|
|
69
|
+
const result = checkFn();
|
|
70
|
+
if (result.passed) {
|
|
71
|
+
success(result.message);
|
|
72
|
+
return { passed: true, fixed: false };
|
|
73
|
+
}
|
|
74
|
+
// Check failed
|
|
75
|
+
if (options.fix && result.fixable && result.fix) {
|
|
76
|
+
result.fix();
|
|
77
|
+
// Re-run check after fix
|
|
78
|
+
const recheckResult = checkFn();
|
|
79
|
+
if (recheckResult.passed) {
|
|
80
|
+
success(`Fixed: ${checkName}`);
|
|
81
|
+
return { passed: true, fixed: true };
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
uiError(`Failed to fix: ${checkName}`);
|
|
85
|
+
return { passed: false, fixed: false };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (result.fixable) {
|
|
89
|
+
warn(`${result.message} (run with --fix to auto-fix)`);
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
uiError(result.message);
|
|
93
|
+
}
|
|
94
|
+
return { passed: false, fixed: false };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Register the doctor command on the program
|
|
98
|
+
*/
|
|
99
|
+
export function doctorCommand(program) {
|
|
100
|
+
program
|
|
101
|
+
.command('doctor')
|
|
102
|
+
.description('Check Night Watch configuration and system health')
|
|
103
|
+
.option('--fix', 'Automatically fix fixable issues')
|
|
104
|
+
.action(async (options) => {
|
|
105
|
+
const projectDir = process.cwd();
|
|
106
|
+
const config = loadConfig(projectDir);
|
|
107
|
+
const totalChecks = 7;
|
|
108
|
+
let checkNum = 1;
|
|
109
|
+
let passedChecks = 0;
|
|
110
|
+
let fixedChecks = 0;
|
|
111
|
+
header('Night Watch Doctor');
|
|
112
|
+
// Check 1: Node.js version
|
|
113
|
+
const nodeResult = runCheck(checkNum++, totalChecks, 'Node.js version', () => checkNodeVersion(18), options);
|
|
114
|
+
if (nodeResult.passed)
|
|
115
|
+
passedChecks++;
|
|
116
|
+
if (nodeResult.fixed)
|
|
117
|
+
fixedChecks++;
|
|
118
|
+
// Check 2: Git repository
|
|
119
|
+
const gitResult = runCheck(checkNum++, totalChecks, 'git repository', () => checkGitRepo(projectDir), options);
|
|
120
|
+
if (gitResult.passed)
|
|
121
|
+
passedChecks++;
|
|
122
|
+
if (gitResult.fixed)
|
|
123
|
+
fixedChecks++;
|
|
124
|
+
// Check 3: GitHub CLI
|
|
125
|
+
const ghResult = runCheck(checkNum++, totalChecks, 'GitHub CLI', () => checkGhCli(), options);
|
|
126
|
+
if (ghResult.passed)
|
|
127
|
+
passedChecks++;
|
|
128
|
+
if (ghResult.fixed)
|
|
129
|
+
fixedChecks++;
|
|
130
|
+
// Check 4: Provider CLI — resolve the actual CLI command for preset providers
|
|
131
|
+
// (e.g. glm-5 and glm-47 use the 'claude' binary with env vars)
|
|
132
|
+
const resolvedProviderCli = BUILT_IN_PRESETS[config.provider]?.command ?? config.provider;
|
|
133
|
+
const providerResult = runCheck(checkNum++, totalChecks, 'provider CLI', () => checkProviderCli(resolvedProviderCli), options);
|
|
134
|
+
if (providerResult.passed)
|
|
135
|
+
passedChecks++;
|
|
136
|
+
if (providerResult.fixed)
|
|
137
|
+
fixedChecks++;
|
|
138
|
+
// Check 5: Config file
|
|
139
|
+
const configResult = runCheck(checkNum++, totalChecks, 'config file', () => checkConfigFile(projectDir), options);
|
|
140
|
+
if (configResult.passed)
|
|
141
|
+
passedChecks++;
|
|
142
|
+
if (configResult.fixed)
|
|
143
|
+
fixedChecks++;
|
|
144
|
+
// Check 6: Logs directory
|
|
145
|
+
const logsResult = runCheck(checkNum++, totalChecks, 'logs directory', () => checkLogsDirectory(projectDir), options);
|
|
146
|
+
if (logsResult.passed)
|
|
147
|
+
passedChecks++;
|
|
148
|
+
if (logsResult.fixed)
|
|
149
|
+
fixedChecks++;
|
|
150
|
+
// Check 7: Webhook configuration
|
|
151
|
+
step(checkNum, totalChecks, 'Checking webhook configuration...');
|
|
152
|
+
if (!config.notifications || config.notifications.webhooks.length === 0) {
|
|
153
|
+
info('No webhooks configured (optional)');
|
|
154
|
+
passedChecks++;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
let webhookErrors = 0;
|
|
158
|
+
for (const webhook of config.notifications.webhooks) {
|
|
159
|
+
const issues = validateWebhook(webhook);
|
|
160
|
+
if (issues.length === 0) {
|
|
161
|
+
success(`${webhook.type} webhook: OK`);
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
for (const issue of issues) {
|
|
165
|
+
warn(`${webhook.type} webhook: ${issue}`);
|
|
166
|
+
}
|
|
167
|
+
webhookErrors++;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (webhookErrors === 0) {
|
|
171
|
+
success(`All ${config.notifications.webhooks.length} webhook(s) valid`);
|
|
172
|
+
passedChecks++;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Check crontab access (non-blocking, informational only)
|
|
176
|
+
const crontabResult = checkCrontabAccess();
|
|
177
|
+
info(crontabResult.message);
|
|
178
|
+
// Summary
|
|
179
|
+
console.log();
|
|
180
|
+
header('Summary');
|
|
181
|
+
label('Checks passed', `${passedChecks}/${totalChecks}`);
|
|
182
|
+
if (fixedChecks > 0) {
|
|
183
|
+
label('Issues fixed', `${fixedChecks}`);
|
|
184
|
+
}
|
|
185
|
+
console.log();
|
|
186
|
+
if (passedChecks === totalChecks) {
|
|
187
|
+
success('All checks passed');
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
uiError('Issues found — fix errors above before running Night Watch');
|
|
191
|
+
process.exit(1);
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History command — CLI interface to the execution history ledger.
|
|
3
|
+
* Designed for bash script integration (silent stdout, exit-code signaling).
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export declare function historyCommand(program: Command): void;
|
|
7
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuDrD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* History command — CLI interface to the execution history ledger.
|
|
3
|
+
* Designed for bash script integration (silent stdout, exit-code signaling).
|
|
4
|
+
*/
|
|
5
|
+
import { isInCooldown, recordExecution } from '@night-watch/core';
|
|
6
|
+
const VALID_OUTCOMES = ['success', 'failure', 'timeout', 'rate_limited'];
|
|
7
|
+
export function historyCommand(program) {
|
|
8
|
+
const history = program.command('history').description('Manage PRD execution history ledger');
|
|
9
|
+
history
|
|
10
|
+
.command('record <projectDir> <prdFile> <outcome>')
|
|
11
|
+
.description('Record a PRD execution result')
|
|
12
|
+
.option('--exit-code <n>', 'Process exit code', '0')
|
|
13
|
+
.option('--attempt <n>', 'Attempt number', '1')
|
|
14
|
+
.action((projectDir, prdFile, outcome, options) => {
|
|
15
|
+
if (!VALID_OUTCOMES.includes(outcome)) {
|
|
16
|
+
process.stderr.write(`Invalid outcome: ${outcome}. Must be one of: ${VALID_OUTCOMES.join(', ')}\n`);
|
|
17
|
+
process.exit(2);
|
|
18
|
+
}
|
|
19
|
+
const exitCode = parseInt(options.exitCode, 10);
|
|
20
|
+
const attempt = parseInt(options.attempt, 10);
|
|
21
|
+
if (isNaN(exitCode)) {
|
|
22
|
+
process.stderr.write(`Invalid exit code: ${options.exitCode}\n`);
|
|
23
|
+
process.exit(2);
|
|
24
|
+
}
|
|
25
|
+
if (isNaN(attempt) || attempt < 1) {
|
|
26
|
+
process.stderr.write(`Invalid attempt: ${options.attempt}\n`);
|
|
27
|
+
process.exit(2);
|
|
28
|
+
}
|
|
29
|
+
recordExecution(projectDir, prdFile, outcome, exitCode, attempt);
|
|
30
|
+
});
|
|
31
|
+
history
|
|
32
|
+
.command('check <projectDir> <prdFile>')
|
|
33
|
+
.description('Check if a PRD is in cooldown (exit 0 = in cooldown, exit 1 = eligible)')
|
|
34
|
+
.option('--cooldown <seconds>', 'Cooldown period in seconds', '7200')
|
|
35
|
+
.action((projectDir, prdFile, options) => {
|
|
36
|
+
const cooldownPeriod = parseInt(options.cooldown, 10);
|
|
37
|
+
if (isNaN(cooldownPeriod) || cooldownPeriod < 0) {
|
|
38
|
+
process.stderr.write(`Invalid cooldown period: ${options.cooldown}\n`);
|
|
39
|
+
process.exit(2);
|
|
40
|
+
}
|
|
41
|
+
if (isInCooldown(projectDir, prdFile, cooldownPeriod)) {
|
|
42
|
+
process.exit(0); // in cooldown — caller should skip
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
process.exit(1); // eligible — caller should proceed
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/commands/history.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGlE,MAAM,cAAc,GAAuB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AAE7F,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAE9F,OAAO;SACJ,OAAO,CAAC,yCAAyC,CAAC;SAClD,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,GAAG,CAAC;SACnD,MAAM,CAAC,eAAe,EAAE,gBAAgB,EAAE,GAAG,CAAC;SAC9C,MAAM,CACL,CACE,UAAkB,EAClB,OAAe,EACf,OAAe,EACf,OAA8C,EAC9C,EAAE;QACF,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,OAA2B,CAAC,EAAE,CAAC;YAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oBAAoB,OAAO,qBAAqB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAC9E,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;YACjE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,OAA2B,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvF,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,8BAA8B,CAAC;SACvC,WAAW,CAAC,yEAAyE,CAAC;SACtF,MAAM,CAAC,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,CAAC;SACpE,MAAM,CAAC,CAAC,UAAkB,EAAE,OAAe,EAAE,OAA6B,EAAE,EAAE;QAC7E,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,KAAK,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,YAAY,CAAC,UAAU,EAAE,OAAO,EAAE,cAAc,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;QACtD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,mCAAmC;QACtD,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { INightWatchConfig, Provider } from '@night-watch/core';
|
|
4
|
+
interface IGeneratedInitConfig extends Omit<INightWatchConfig, '_cliProviderOverride'> {
|
|
5
|
+
$schema: string;
|
|
6
|
+
projectName: string;
|
|
7
|
+
providerLabel: string;
|
|
8
|
+
}
|
|
9
|
+
interface IGitHubRemoteStatus {
|
|
10
|
+
hasGitHubRemote: boolean;
|
|
11
|
+
remoteUrl: string | null;
|
|
12
|
+
}
|
|
13
|
+
export declare function isInteractiveInitSession(): boolean;
|
|
14
|
+
export declare function chooseProviderForNonInteractive(providers: Provider[]): Provider;
|
|
15
|
+
export declare function getGitHubRemoteStatus(cwd: string): IGitHubRemoteStatus;
|
|
16
|
+
/**
|
|
17
|
+
* Get the default branch name for the repository
|
|
18
|
+
*/
|
|
19
|
+
export declare function getDefaultBranch(cwd: string): string;
|
|
20
|
+
export declare function buildInitConfig(params: {
|
|
21
|
+
projectName: string;
|
|
22
|
+
defaultBranch: string;
|
|
23
|
+
provider: Provider;
|
|
24
|
+
reviewerEnabled: boolean;
|
|
25
|
+
prdDir: string;
|
|
26
|
+
}): IGeneratedInitConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Result of template path resolution
|
|
29
|
+
*/
|
|
30
|
+
interface ITemplateResolution {
|
|
31
|
+
path: string;
|
|
32
|
+
source: 'custom' | 'bundled';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Resolve a template path with per-file fallback.
|
|
36
|
+
* If customTemplatesDir is non-null and the file exists there, return custom path.
|
|
37
|
+
* Otherwise return the bundled template path.
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveTemplatePath(templateName: string, customTemplatesDir: string | null, bundledTemplatesDir: string): ITemplateResolution;
|
|
40
|
+
/**
|
|
41
|
+
* Main init command implementation
|
|
42
|
+
*/
|
|
43
|
+
export declare function initCommand(program: Command): void;
|
|
44
|
+
export default initCommand;
|
|
45
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EAIL,iBAAiB,EAEjB,QAAQ,EAkBT,MAAM,mBAAmB,CAAC;AA6C3B,UAAU,oBAAqB,SAAQ,IAAI,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,mBAAmB;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAiFD,wBAAgB,wBAAwB,IAAI,OAAO,CAElD;AAED,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAK/E;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CAkBtE;AAuBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiEpD;AAsCD,wBAAgB,eAAe,CAAC,MAAM,EAAE;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,oBAAoB,CAsDvB;AAED;;GAEG;AACH,UAAU,mBAAmB;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,EACjC,mBAAmB,EAAE,MAAM,GAC1B,mBAAmB,CAQrB;AAqJD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoblD;AAED,eAAe,WAAW,CAAC"}
|