@jonit-dev/night-watch-cli 1.8.10-beta.1 → 1.8.10-beta.12

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.
Files changed (209) hide show
  1. package/dist/cli.js +2453 -1378
  2. package/dist/commands/dashboard/tab-config.d.ts.map +1 -1
  3. package/dist/commands/queue.d.ts.map +1 -1
  4. package/dist/commands/shared/env-builder.d.ts.map +1 -1
  5. package/dist/scripts/night-watch-audit-cron.sh +6 -0
  6. package/dist/scripts/night-watch-cron.sh +352 -53
  7. package/dist/scripts/night-watch-helpers.sh +212 -12
  8. package/dist/scripts/night-watch-merger-cron.sh +8 -2
  9. package/dist/scripts/night-watch-plan-cron.sh +1 -1
  10. package/dist/scripts/night-watch-pr-resolver-cron.sh +7 -3
  11. package/dist/scripts/night-watch-pr-reviewer-cron.sh +11 -0
  12. package/dist/scripts/night-watch-qa-cron.sh +11 -0
  13. package/dist/scripts/night-watch-slicer-cron.sh +1 -1
  14. package/dist/web/assets/index-B6E6kOoR.js +406 -0
  15. package/dist/web/assets/index-DIMUXIP8.css +1 -0
  16. package/dist/web/assets/index-Ds8OqaCa.css +1 -0
  17. package/dist/web/assets/index-NR27JE3b.js +406 -0
  18. package/dist/web/index.html +2 -2
  19. package/package.json +1 -1
  20. package/dist/cli.d.ts +0 -3
  21. package/dist/cli.js.map +0 -1
  22. package/dist/commands/analytics.d.ts +0 -14
  23. package/dist/commands/analytics.js +0 -69
  24. package/dist/commands/analytics.js.map +0 -1
  25. package/dist/commands/audit.d.ts +0 -19
  26. package/dist/commands/audit.js +0 -144
  27. package/dist/commands/audit.js.map +0 -1
  28. package/dist/commands/board.d.ts +0 -9
  29. package/dist/commands/board.js +0 -702
  30. package/dist/commands/board.js.map +0 -1
  31. package/dist/commands/cancel.d.ts +0 -46
  32. package/dist/commands/cancel.js +0 -239
  33. package/dist/commands/cancel.js.map +0 -1
  34. package/dist/commands/cron.d.ts +0 -8
  35. package/dist/commands/cron.js +0 -134
  36. package/dist/commands/cron.js.map +0 -1
  37. package/dist/commands/dashboard/tab-actions.d.ts +0 -10
  38. package/dist/commands/dashboard/tab-actions.js +0 -247
  39. package/dist/commands/dashboard/tab-actions.js.map +0 -1
  40. package/dist/commands/dashboard/tab-config.d.ts +0 -21
  41. package/dist/commands/dashboard/tab-config.js +0 -873
  42. package/dist/commands/dashboard/tab-config.js.map +0 -1
  43. package/dist/commands/dashboard/tab-logs.d.ts +0 -10
  44. package/dist/commands/dashboard/tab-logs.js +0 -202
  45. package/dist/commands/dashboard/tab-logs.js.map +0 -1
  46. package/dist/commands/dashboard/tab-schedules.d.ts +0 -21
  47. package/dist/commands/dashboard/tab-schedules.js +0 -320
  48. package/dist/commands/dashboard/tab-schedules.js.map +0 -1
  49. package/dist/commands/dashboard/tab-status.d.ts +0 -32
  50. package/dist/commands/dashboard/tab-status.js +0 -424
  51. package/dist/commands/dashboard/tab-status.js.map +0 -1
  52. package/dist/commands/dashboard/types.d.ts +0 -42
  53. package/dist/commands/dashboard/types.js +0 -5
  54. package/dist/commands/dashboard/types.js.map +0 -1
  55. package/dist/commands/dashboard.d.ts +0 -11
  56. package/dist/commands/dashboard.js +0 -242
  57. package/dist/commands/dashboard.js.map +0 -1
  58. package/dist/commands/doctor.d.ts +0 -16
  59. package/dist/commands/doctor.js +0 -195
  60. package/dist/commands/doctor.js.map +0 -1
  61. package/dist/commands/history.d.ts +0 -7
  62. package/dist/commands/history.js +0 -49
  63. package/dist/commands/history.js.map +0 -1
  64. package/dist/commands/init.d.ts +0 -45
  65. package/dist/commands/init.js +0 -777
  66. package/dist/commands/init.js.map +0 -1
  67. package/dist/commands/install.d.ts +0 -65
  68. package/dist/commands/install.js +0 -405
  69. package/dist/commands/install.js.map +0 -1
  70. package/dist/commands/logs.d.ts +0 -15
  71. package/dist/commands/logs.js +0 -155
  72. package/dist/commands/logs.js.map +0 -1
  73. package/dist/commands/merge.d.ts +0 -26
  74. package/dist/commands/merge.js +0 -159
  75. package/dist/commands/merge.js.map +0 -1
  76. package/dist/commands/notify.d.ts +0 -7
  77. package/dist/commands/notify.js +0 -43
  78. package/dist/commands/notify.js.map +0 -1
  79. package/dist/commands/plan.d.ts +0 -19
  80. package/dist/commands/plan.js +0 -88
  81. package/dist/commands/plan.js.map +0 -1
  82. package/dist/commands/prd-state.d.ts +0 -12
  83. package/dist/commands/prd-state.js +0 -47
  84. package/dist/commands/prd-state.js.map +0 -1
  85. package/dist/commands/prd.d.ts +0 -18
  86. package/dist/commands/prd.js +0 -363
  87. package/dist/commands/prd.js.map +0 -1
  88. package/dist/commands/prds.d.ts +0 -13
  89. package/dist/commands/prds.js +0 -194
  90. package/dist/commands/prds.js.map +0 -1
  91. package/dist/commands/prs.d.ts +0 -14
  92. package/dist/commands/prs.js +0 -104
  93. package/dist/commands/prs.js.map +0 -1
  94. package/dist/commands/qa.d.ts +0 -34
  95. package/dist/commands/qa.js +0 -214
  96. package/dist/commands/qa.js.map +0 -1
  97. package/dist/commands/queue.d.ts +0 -8
  98. package/dist/commands/queue.js +0 -376
  99. package/dist/commands/queue.js.map +0 -1
  100. package/dist/commands/resolve.d.ts +0 -26
  101. package/dist/commands/resolve.js +0 -186
  102. package/dist/commands/resolve.js.map +0 -1
  103. package/dist/commands/retry.d.ts +0 -9
  104. package/dist/commands/retry.js +0 -71
  105. package/dist/commands/retry.js.map +0 -1
  106. package/dist/commands/review.d.ts +0 -82
  107. package/dist/commands/review.js +0 -479
  108. package/dist/commands/review.js.map +0 -1
  109. package/dist/commands/run.d.ts +0 -73
  110. package/dist/commands/run.js +0 -509
  111. package/dist/commands/run.js.map +0 -1
  112. package/dist/commands/serve.d.ts +0 -19
  113. package/dist/commands/serve.js +0 -142
  114. package/dist/commands/serve.js.map +0 -1
  115. package/dist/commands/shared/env-builder.d.ts +0 -49
  116. package/dist/commands/shared/env-builder.js +0 -150
  117. package/dist/commands/shared/env-builder.js.map +0 -1
  118. package/dist/commands/slice.d.ts +0 -35
  119. package/dist/commands/slice.js +0 -316
  120. package/dist/commands/slice.js.map +0 -1
  121. package/dist/commands/state.d.ts +0 -8
  122. package/dist/commands/state.js +0 -54
  123. package/dist/commands/state.js.map +0 -1
  124. package/dist/commands/status.d.ts +0 -14
  125. package/dist/commands/status.js +0 -297
  126. package/dist/commands/status.js.map +0 -1
  127. package/dist/commands/summary.d.ts +0 -14
  128. package/dist/commands/summary.js +0 -193
  129. package/dist/commands/summary.js.map +0 -1
  130. package/dist/commands/uninstall.d.ts +0 -25
  131. package/dist/commands/uninstall.js +0 -134
  132. package/dist/commands/uninstall.js.map +0 -1
  133. package/dist/commands/update.d.ts +0 -22
  134. package/dist/commands/update.js +0 -90
  135. package/dist/commands/update.js.map +0 -1
  136. package/dist/web/assets/index-2JY0x_Ij.js +0 -381
  137. package/dist/web/assets/index-3h8pgmqL.css +0 -1
  138. package/dist/web/assets/index-B-wbyZq7.js +0 -386
  139. package/dist/web/assets/index-B1BnOpiO.css +0 -1
  140. package/dist/web/assets/index-B3CnV08_.js +0 -365
  141. package/dist/web/assets/index-B5QjuFh9.css +0 -1
  142. package/dist/web/assets/index-B8FW2ecQ.js +0 -370
  143. package/dist/web/assets/index-BFxPiKyy.js +0 -381
  144. package/dist/web/assets/index-BGqNh_Da.js +0 -365
  145. package/dist/web/assets/index-BIONU0qz.css +0 -1
  146. package/dist/web/assets/index-B_l_3wnA.js +0 -370
  147. package/dist/web/assets/index-Ba-4YvTQ.js +0 -365
  148. package/dist/web/assets/index-Bbb4-39N.js +0 -370
  149. package/dist/web/assets/index-BdgdShEN.js +0 -365
  150. package/dist/web/assets/index-BhiC4Z-G.js +0 -381
  151. package/dist/web/assets/index-BjhCFjZi.js +0 -381
  152. package/dist/web/assets/index-BlRxmrnQ.css +0 -1
  153. package/dist/web/assets/index-BqwbXsHS.js +0 -365
  154. package/dist/web/assets/index-BsC7RT48.css +0 -1
  155. package/dist/web/assets/index-Bvh8XI8_.js +0 -370
  156. package/dist/web/assets/index-C01r2ymn.js +0 -381
  157. package/dist/web/assets/index-C51Rbsmk.js +0 -381
  158. package/dist/web/assets/index-C7lMNxRE.js +0 -370
  159. package/dist/web/assets/index-CJLObgsn.js +0 -386
  160. package/dist/web/assets/index-CLuRf7Zt.js +0 -381
  161. package/dist/web/assets/index-CM3xFd3e.css +0 -1
  162. package/dist/web/assets/index-CNkBtDK7.js +0 -370
  163. package/dist/web/assets/index-CPQbZ1BL.css +0 -1
  164. package/dist/web/assets/index-CTy5dUDU.css +0 -1
  165. package/dist/web/assets/index-CU15COKs.js +0 -370
  166. package/dist/web/assets/index-CiRJZI4z.js +0 -386
  167. package/dist/web/assets/index-Cp7RYjoy.css +0 -1
  168. package/dist/web/assets/index-CvPkZOWT.js +0 -381
  169. package/dist/web/assets/index-CvUk-33B.css +0 -1
  170. package/dist/web/assets/index-Cvmj-oF6.css +0 -1
  171. package/dist/web/assets/index-CxE5iQVO.js +0 -381
  172. package/dist/web/assets/index-D7lZQpFV.js +0 -365
  173. package/dist/web/assets/index-DAyP4GOi.css +0 -1
  174. package/dist/web/assets/index-DCG0n8Kg.js +0 -386
  175. package/dist/web/assets/index-DEEI8cyF.css +0 -1
  176. package/dist/web/assets/index-DF99BowV.js +0 -381
  177. package/dist/web/assets/index-DGWsvFj6.css +0 -1
  178. package/dist/web/assets/index-DGpU39Cp.css +0 -1
  179. package/dist/web/assets/index-DI4kFgOi.js +0 -370
  180. package/dist/web/assets/index-DIyTcPw5.css +0 -1
  181. package/dist/web/assets/index-DTsfDC7m.js +0 -381
  182. package/dist/web/assets/index-DcgNAi4A.js +0 -386
  183. package/dist/web/assets/index-DgOAgkZy.css +0 -1
  184. package/dist/web/assets/index-DnHkqbOa.js +0 -386
  185. package/dist/web/assets/index-DnR7Idcf.css +0 -1
  186. package/dist/web/assets/index-DpVirMEe.css +0 -1
  187. package/dist/web/assets/index-DsYIWZ86.css +0 -1
  188. package/dist/web/assets/index-DtrDkci5.js +0 -381
  189. package/dist/web/assets/index-DyjIth5M.js +0 -386
  190. package/dist/web/assets/index-FwIKfHPL.css +0 -1
  191. package/dist/web/assets/index-IKrZymWk.css +0 -1
  192. package/dist/web/assets/index-MA6fM0ab.js +0 -381
  193. package/dist/web/assets/index-N_QxaSEg.css +0 -1
  194. package/dist/web/assets/index-OcU-0TCQ.css +0 -1
  195. package/dist/web/assets/index-OyhrmG-L.js +0 -381
  196. package/dist/web/assets/index-SQlBKu_s.js +0 -386
  197. package/dist/web/assets/index-Sv2B60J4.js +0 -370
  198. package/dist/web/assets/index-Vgyivb5u.js +0 -365
  199. package/dist/web/assets/index-ZABWMEZR.js +0 -381
  200. package/dist/web/assets/index-ZE5lOeJp.js +0 -386
  201. package/dist/web/assets/index-aCHmkAcJ.css +0 -1
  202. package/dist/web/assets/index-bFijnpuU.js +0 -381
  203. package/dist/web/assets/index-bUPZgSoZ.css +0 -1
  204. package/dist/web/assets/index-mz1VIYsP.css +0 -1
  205. package/dist/web/assets/index-oOp_MFeE.js +0 -376
  206. package/dist/web/assets/index-rfU713Zm.js +0 -386
  207. package/dist/web/assets/index-tuNH9gmb.js +0 -448
  208. package/dist/web/assets/index-viSwHyDD.js +0 -365
  209. package/dist/web/assets/index-yKEQysks.js +0 -365
@@ -1,242 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -1,16 +0,0 @@
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
@@ -1,195 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
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
@@ -1,49 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,45 +0,0 @@
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