@jonit-dev/night-watch-cli 1.7.18 → 1.7.19

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 (264) hide show
  1. package/bin/night-watch.mjs +1 -1
  2. package/dist/src/cli.js +13 -4
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/server/index.d.ts.map +1 -1
  5. package/dist/src/server/index.js +12 -1
  6. package/dist/src/server/index.js.map +1 -1
  7. package/package.json +1 -1
  8. package/web/dist/assets/index-DOzZY27d.js +473 -0
  9. package/web/dist/assets/index-w6Q6gxCS.css +1 -0
  10. package/web/dist/index.html +2 -2
  11. package/dist/board/factory.d.ts +0 -3
  12. package/dist/board/factory.d.ts.map +0 -1
  13. package/dist/board/factory.js +0 -10
  14. package/dist/board/factory.js.map +0 -1
  15. package/dist/board/providers/github-graphql.d.ts +0 -16
  16. package/dist/board/providers/github-graphql.d.ts.map +0 -1
  17. package/dist/board/providers/github-graphql.js +0 -43
  18. package/dist/board/providers/github-graphql.js.map +0 -1
  19. package/dist/board/providers/github-projects.d.ts +0 -51
  20. package/dist/board/providers/github-projects.d.ts.map +0 -1
  21. package/dist/board/providers/github-projects.js +0 -672
  22. package/dist/board/providers/github-projects.js.map +0 -1
  23. package/dist/board/types.d.ts +0 -60
  24. package/dist/board/types.d.ts.map +0 -1
  25. package/dist/board/types.js +0 -4
  26. package/dist/board/types.js.map +0 -1
  27. package/dist/cli.d.ts +0 -3
  28. package/dist/cli.d.ts.map +0 -1
  29. package/dist/cli.js +0 -80
  30. package/dist/cli.js.map +0 -1
  31. package/dist/commands/board.d.ts +0 -9
  32. package/dist/commands/board.d.ts.map +0 -1
  33. package/dist/commands/board.js +0 -294
  34. package/dist/commands/board.js.map +0 -1
  35. package/dist/commands/cancel.d.ts +0 -46
  36. package/dist/commands/cancel.d.ts.map +0 -1
  37. package/dist/commands/cancel.js +0 -241
  38. package/dist/commands/cancel.js.map +0 -1
  39. package/dist/commands/dashboard/tab-actions.d.ts +0 -10
  40. package/dist/commands/dashboard/tab-actions.d.ts.map +0 -1
  41. package/dist/commands/dashboard/tab-actions.js +0 -245
  42. package/dist/commands/dashboard/tab-actions.js.map +0 -1
  43. package/dist/commands/dashboard/tab-config.d.ts +0 -21
  44. package/dist/commands/dashboard/tab-config.d.ts.map +0 -1
  45. package/dist/commands/dashboard/tab-config.js +0 -829
  46. package/dist/commands/dashboard/tab-config.js.map +0 -1
  47. package/dist/commands/dashboard/tab-logs.d.ts +0 -10
  48. package/dist/commands/dashboard/tab-logs.d.ts.map +0 -1
  49. package/dist/commands/dashboard/tab-logs.js +0 -178
  50. package/dist/commands/dashboard/tab-logs.js.map +0 -1
  51. package/dist/commands/dashboard/tab-schedules.d.ts +0 -21
  52. package/dist/commands/dashboard/tab-schedules.d.ts.map +0 -1
  53. package/dist/commands/dashboard/tab-schedules.js +0 -304
  54. package/dist/commands/dashboard/tab-schedules.js.map +0 -1
  55. package/dist/commands/dashboard/tab-status.d.ts +0 -32
  56. package/dist/commands/dashboard/tab-status.d.ts.map +0 -1
  57. package/dist/commands/dashboard/tab-status.js +0 -421
  58. package/dist/commands/dashboard/tab-status.js.map +0 -1
  59. package/dist/commands/dashboard/types.d.ts +0 -43
  60. package/dist/commands/dashboard/types.d.ts.map +0 -1
  61. package/dist/commands/dashboard/types.js +0 -5
  62. package/dist/commands/dashboard/types.js.map +0 -1
  63. package/dist/commands/dashboard.d.ts +0 -11
  64. package/dist/commands/dashboard.d.ts.map +0 -1
  65. package/dist/commands/dashboard.js +0 -239
  66. package/dist/commands/dashboard.js.map +0 -1
  67. package/dist/commands/doctor.d.ts +0 -16
  68. package/dist/commands/doctor.d.ts.map +0 -1
  69. package/dist/commands/doctor.js +0 -202
  70. package/dist/commands/doctor.js.map +0 -1
  71. package/dist/commands/history.d.ts +0 -7
  72. package/dist/commands/history.d.ts.map +0 -1
  73. package/dist/commands/history.js +0 -56
  74. package/dist/commands/history.js.map +0 -1
  75. package/dist/commands/init.d.ts +0 -25
  76. package/dist/commands/init.d.ts.map +0 -1
  77. package/dist/commands/init.js +0 -534
  78. package/dist/commands/init.js.map +0 -1
  79. package/dist/commands/install.d.ts +0 -48
  80. package/dist/commands/install.d.ts.map +0 -1
  81. package/dist/commands/install.js +0 -303
  82. package/dist/commands/install.js.map +0 -1
  83. package/dist/commands/logs.d.ts +0 -15
  84. package/dist/commands/logs.d.ts.map +0 -1
  85. package/dist/commands/logs.js +0 -104
  86. package/dist/commands/logs.js.map +0 -1
  87. package/dist/commands/prd-state.d.ts +0 -12
  88. package/dist/commands/prd-state.d.ts.map +0 -1
  89. package/dist/commands/prd-state.js +0 -47
  90. package/dist/commands/prd-state.js.map +0 -1
  91. package/dist/commands/prd.d.ts +0 -24
  92. package/dist/commands/prd.d.ts.map +0 -1
  93. package/dist/commands/prd.js +0 -283
  94. package/dist/commands/prd.js.map +0 -1
  95. package/dist/commands/prds.d.ts +0 -13
  96. package/dist/commands/prds.d.ts.map +0 -1
  97. package/dist/commands/prds.js +0 -196
  98. package/dist/commands/prds.js.map +0 -1
  99. package/dist/commands/prs.d.ts +0 -14
  100. package/dist/commands/prs.d.ts.map +0 -1
  101. package/dist/commands/prs.js +0 -106
  102. package/dist/commands/prs.js.map +0 -1
  103. package/dist/commands/qa.d.ts +0 -30
  104. package/dist/commands/qa.d.ts.map +0 -1
  105. package/dist/commands/qa.js +0 -159
  106. package/dist/commands/qa.js.map +0 -1
  107. package/dist/commands/retry.d.ts +0 -9
  108. package/dist/commands/retry.d.ts.map +0 -1
  109. package/dist/commands/retry.js +0 -72
  110. package/dist/commands/retry.js.map +0 -1
  111. package/dist/commands/review.d.ts +0 -35
  112. package/dist/commands/review.d.ts.map +0 -1
  113. package/dist/commands/review.js +0 -252
  114. package/dist/commands/review.js.map +0 -1
  115. package/dist/commands/run.d.ts +0 -61
  116. package/dist/commands/run.d.ts.map +0 -1
  117. package/dist/commands/run.js +0 -364
  118. package/dist/commands/run.js.map +0 -1
  119. package/dist/commands/serve.d.ts +0 -7
  120. package/dist/commands/serve.d.ts.map +0 -1
  121. package/dist/commands/serve.js +0 -27
  122. package/dist/commands/serve.js.map +0 -1
  123. package/dist/commands/slice.d.ts +0 -26
  124. package/dist/commands/slice.d.ts.map +0 -1
  125. package/dist/commands/slice.js +0 -175
  126. package/dist/commands/slice.js.map +0 -1
  127. package/dist/commands/state.d.ts +0 -8
  128. package/dist/commands/state.d.ts.map +0 -1
  129. package/dist/commands/state.js +0 -56
  130. package/dist/commands/state.js.map +0 -1
  131. package/dist/commands/status.d.ts +0 -14
  132. package/dist/commands/status.d.ts.map +0 -1
  133. package/dist/commands/status.js +0 -147
  134. package/dist/commands/status.js.map +0 -1
  135. package/dist/commands/uninstall.d.ts +0 -25
  136. package/dist/commands/uninstall.d.ts.map +0 -1
  137. package/dist/commands/uninstall.js +0 -141
  138. package/dist/commands/uninstall.js.map +0 -1
  139. package/dist/commands/update.d.ts +0 -21
  140. package/dist/commands/update.d.ts.map +0 -1
  141. package/dist/commands/update.js +0 -87
  142. package/dist/commands/update.js.map +0 -1
  143. package/dist/config.d.ts +0 -23
  144. package/dist/config.d.ts.map +0 -1
  145. package/dist/config.js +0 -601
  146. package/dist/config.js.map +0 -1
  147. package/dist/constants.d.ts +0 -59
  148. package/dist/constants.d.ts.map +0 -1
  149. package/dist/constants.js +0 -110
  150. package/dist/constants.js.map +0 -1
  151. package/dist/server/index.d.ts +0 -23
  152. package/dist/server/index.d.ts.map +0 -1
  153. package/dist/server/index.js +0 -1074
  154. package/dist/server/index.js.map +0 -1
  155. package/dist/storage/json-state-migrator.d.ts +0 -24
  156. package/dist/storage/json-state-migrator.d.ts.map +0 -1
  157. package/dist/storage/json-state-migrator.js +0 -197
  158. package/dist/storage/json-state-migrator.js.map +0 -1
  159. package/dist/storage/repositories/index.d.ts +0 -23
  160. package/dist/storage/repositories/index.d.ts.map +0 -1
  161. package/dist/storage/repositories/index.js +0 -37
  162. package/dist/storage/repositories/index.js.map +0 -1
  163. package/dist/storage/repositories/interfaces.d.ts +0 -37
  164. package/dist/storage/repositories/interfaces.d.ts.map +0 -1
  165. package/dist/storage/repositories/interfaces.js +0 -6
  166. package/dist/storage/repositories/interfaces.js.map +0 -1
  167. package/dist/storage/repositories/sqlite/execution-history-repository.d.ts +0 -21
  168. package/dist/storage/repositories/sqlite/execution-history-repository.d.ts.map +0 -1
  169. package/dist/storage/repositories/sqlite/execution-history-repository.js +0 -94
  170. package/dist/storage/repositories/sqlite/execution-history-repository.js.map +0 -1
  171. package/dist/storage/repositories/sqlite/prd-state-repository.d.ts +0 -17
  172. package/dist/storage/repositories/sqlite/prd-state-repository.d.ts.map +0 -1
  173. package/dist/storage/repositories/sqlite/prd-state-repository.js +0 -74
  174. package/dist/storage/repositories/sqlite/prd-state-repository.js.map +0 -1
  175. package/dist/storage/repositories/sqlite/project-registry-repository.d.ts +0 -16
  176. package/dist/storage/repositories/sqlite/project-registry-repository.d.ts.map +0 -1
  177. package/dist/storage/repositories/sqlite/project-registry-repository.js +0 -34
  178. package/dist/storage/repositories/sqlite/project-registry-repository.js.map +0 -1
  179. package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts +0 -14
  180. package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +0 -1
  181. package/dist/storage/repositories/sqlite/roadmap-state-repository.js +0 -47
  182. package/dist/storage/repositories/sqlite/roadmap-state-repository.js.map +0 -1
  183. package/dist/storage/sqlite/client.d.ts +0 -23
  184. package/dist/storage/sqlite/client.d.ts.map +0 -1
  185. package/dist/storage/sqlite/client.js +0 -47
  186. package/dist/storage/sqlite/client.js.map +0 -1
  187. package/dist/storage/sqlite/migrations.d.ts +0 -11
  188. package/dist/storage/sqlite/migrations.d.ts.map +0 -1
  189. package/dist/storage/sqlite/migrations.js +0 -57
  190. package/dist/storage/sqlite/migrations.js.map +0 -1
  191. package/dist/templates/prd-template.d.ts +0 -11
  192. package/dist/templates/prd-template.d.ts.map +0 -1
  193. package/dist/templates/prd-template.js +0 -166
  194. package/dist/templates/prd-template.js.map +0 -1
  195. package/dist/templates/slicer-prompt.d.ts +0 -54
  196. package/dist/templates/slicer-prompt.d.ts.map +0 -1
  197. package/dist/templates/slicer-prompt.js +0 -163
  198. package/dist/templates/slicer-prompt.js.map +0 -1
  199. package/dist/types.d.ts +0 -123
  200. package/dist/types.d.ts.map +0 -1
  201. package/dist/types.js +0 -5
  202. package/dist/types.js.map +0 -1
  203. package/dist/utils/checks.d.ts +0 -55
  204. package/dist/utils/checks.d.ts.map +0 -1
  205. package/dist/utils/checks.js +0 -246
  206. package/dist/utils/checks.js.map +0 -1
  207. package/dist/utils/config-writer.d.ts +0 -16
  208. package/dist/utils/config-writer.d.ts.map +0 -1
  209. package/dist/utils/config-writer.js +0 -45
  210. package/dist/utils/config-writer.js.map +0 -1
  211. package/dist/utils/crontab.d.ts +0 -62
  212. package/dist/utils/crontab.d.ts.map +0 -1
  213. package/dist/utils/crontab.js +0 -168
  214. package/dist/utils/crontab.js.map +0 -1
  215. package/dist/utils/execution-history.d.ts +0 -54
  216. package/dist/utils/execution-history.d.ts.map +0 -1
  217. package/dist/utils/execution-history.js +0 -80
  218. package/dist/utils/execution-history.js.map +0 -1
  219. package/dist/utils/github.d.ts +0 -40
  220. package/dist/utils/github.d.ts.map +0 -1
  221. package/dist/utils/github.js +0 -126
  222. package/dist/utils/github.js.map +0 -1
  223. package/dist/utils/notify.d.ts +0 -63
  224. package/dist/utils/notify.d.ts.map +0 -1
  225. package/dist/utils/notify.js +0 -264
  226. package/dist/utils/notify.js.map +0 -1
  227. package/dist/utils/prd-states.d.ts +0 -16
  228. package/dist/utils/prd-states.d.ts.map +0 -1
  229. package/dist/utils/prd-states.js +0 -28
  230. package/dist/utils/prd-states.js.map +0 -1
  231. package/dist/utils/registry.d.ts +0 -44
  232. package/dist/utils/registry.d.ts.map +0 -1
  233. package/dist/utils/registry.js +0 -86
  234. package/dist/utils/registry.js.map +0 -1
  235. package/dist/utils/roadmap-parser.d.ts +0 -45
  236. package/dist/utils/roadmap-parser.d.ts.map +0 -1
  237. package/dist/utils/roadmap-parser.js +0 -136
  238. package/dist/utils/roadmap-parser.js.map +0 -1
  239. package/dist/utils/roadmap-scanner.d.ts +0 -92
  240. package/dist/utils/roadmap-scanner.d.ts.map +0 -1
  241. package/dist/utils/roadmap-scanner.js +0 -349
  242. package/dist/utils/roadmap-scanner.js.map +0 -1
  243. package/dist/utils/roadmap-state.d.ts +0 -90
  244. package/dist/utils/roadmap-state.d.ts.map +0 -1
  245. package/dist/utils/roadmap-state.js +0 -154
  246. package/dist/utils/roadmap-state.js.map +0 -1
  247. package/dist/utils/script-result.d.ts +0 -12
  248. package/dist/utils/script-result.d.ts.map +0 -1
  249. package/dist/utils/script-result.js +0 -46
  250. package/dist/utils/script-result.js.map +0 -1
  251. package/dist/utils/shell.d.ts +0 -27
  252. package/dist/utils/shell.d.ts.map +0 -1
  253. package/dist/utils/shell.js +0 -64
  254. package/dist/utils/shell.js.map +0 -1
  255. package/dist/utils/status-data.d.ts +0 -148
  256. package/dist/utils/status-data.d.ts.map +0 -1
  257. package/dist/utils/status-data.js +0 -593
  258. package/dist/utils/status-data.js.map +0 -1
  259. package/dist/utils/ui.d.ts +0 -55
  260. package/dist/utils/ui.d.ts.map +0 -1
  261. package/dist/utils/ui.js +0 -121
  262. package/dist/utils/ui.js.map +0 -1
  263. package/web/dist/assets/index-BtxQU4oX.css +0 -1
  264. package/web/dist/assets/index-D3awZ0gS.js +0 -473
@@ -1,239 +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 { loadConfig } from "../config.js";
7
- import { fetchStatusSnapshot } from "../utils/status-data.js";
8
- import { createStatusTab } from "./dashboard/tab-status.js";
9
- import { createConfigTab } from "./dashboard/tab-config.js";
10
- import { createSchedulesTab } from "./dashboard/tab-schedules.js";
11
- import { createActionsTab } from "./dashboard/tab-actions.js";
12
- import { createLogsTab } from "./dashboard/tab-logs.js";
13
- // Re-export render functions for backward compatibility (used by tests)
14
- export { renderPrdPane, renderProcessPane, renderPrPane, renderLogPane, } from "./dashboard/tab-status.js";
15
- /**
16
- * Show a temporary flash message overlay
17
- */
18
- function showMessage(screen, text, type, durationMs = 2000) {
19
- const colors = { success: "green", error: "red", info: "cyan" };
20
- const msgBox = blessed.box({
21
- top: "center",
22
- left: "center",
23
- width: Math.min(60, text.length + 6),
24
- height: 3,
25
- content: `{center}${text}{/center}`,
26
- tags: true,
27
- border: { type: "line" },
28
- style: { border: { fg: colors[type] }, fg: "white", bg: "black" },
29
- });
30
- screen.append(msgBox);
31
- screen.render();
32
- setTimeout(() => {
33
- msgBox.destroy();
34
- screen.render();
35
- }, durationMs);
36
- }
37
- export function dashboardCommand(program) {
38
- program
39
- .command("dashboard")
40
- .description("Live terminal dashboard")
41
- .option("--interval <seconds>", "Refresh interval in seconds", "10")
42
- .action(async (options) => {
43
- const projectDir = process.cwd();
44
- let config = loadConfig(projectDir);
45
- // Create blessed screen
46
- const screen = blessed.screen({
47
- smartCSR: true,
48
- title: "Night Watch Dashboard",
49
- fullUnicode: true,
50
- });
51
- // --- Layout ---
52
- // Header: row 0, height 1
53
- const headerBox = blessed.box({
54
- top: 0,
55
- left: 0,
56
- width: "100%",
57
- height: 1,
58
- content: "{center}Night Watch Dashboard{/center}",
59
- tags: true,
60
- style: { fg: "cyan", bold: true },
61
- });
62
- // Tab bar: row 1, height 1
63
- const tabBar = blessed.box({
64
- top: 1,
65
- left: 0,
66
- width: "100%",
67
- height: 1,
68
- tags: true,
69
- style: { fg: "white", bg: "black" },
70
- content: "",
71
- });
72
- // Content area: rows 2..n-2
73
- const contentArea = blessed.box({
74
- top: 2,
75
- left: 0,
76
- width: "100%",
77
- height: "100%-4",
78
- });
79
- // Footer: bottom row
80
- const footerBox = blessed.box({
81
- bottom: 0,
82
- left: 0,
83
- width: "100%",
84
- height: 1,
85
- content: "",
86
- tags: true,
87
- style: { fg: "white", bg: "blue" },
88
- });
89
- screen.append(headerBox);
90
- screen.append(tabBar);
91
- screen.append(contentArea);
92
- screen.append(footerBox);
93
- // --- Create tabs ---
94
- const tabs = [
95
- createStatusTab(),
96
- createConfigTab(),
97
- createSchedulesTab(),
98
- createActionsTab(),
99
- createLogsTab(),
100
- ];
101
- // Append all tab containers to content area
102
- for (const tab of tabs) {
103
- contentArea.append(tab.container);
104
- }
105
- // --- State ---
106
- let activeTabIndex = 0;
107
- let isEditing = false;
108
- let snapshot = fetchStatusSnapshot(projectDir, config);
109
- // --- Tab context ---
110
- const ctx = {
111
- screen,
112
- projectDir,
113
- config,
114
- snapshot,
115
- reloadConfig: () => {
116
- config = loadConfig(projectDir);
117
- ctx.config = config;
118
- return config;
119
- },
120
- refreshSnapshot: () => {
121
- snapshot = fetchStatusSnapshot(projectDir, config);
122
- ctx.snapshot = snapshot;
123
- return snapshot;
124
- },
125
- setFooter: (text) => {
126
- footerBox.setContent(text);
127
- },
128
- showMessage: (text, type, durationMs) => {
129
- showMessage(screen, text, type, durationMs);
130
- },
131
- setEditing: (editing) => {
132
- isEditing = editing;
133
- },
134
- };
135
- // --- Tab bar rendering ---
136
- function renderTabBar() {
137
- const parts = tabs.map((tab, idx) => {
138
- const num = idx + 1;
139
- if (idx === activeTabIndex) {
140
- return `{white-bg}{black-fg} ${num}:${tab.name} {/black-fg}{/white-bg}`;
141
- }
142
- return ` {blue-fg}${num}:${tab.name}{/blue-fg} `;
143
- });
144
- tabBar.setContent(parts.join(""));
145
- }
146
- // --- Tab switching ---
147
- function switchTab(newIndex) {
148
- if (newIndex === activeTabIndex)
149
- return;
150
- if (newIndex < 0 || newIndex >= tabs.length)
151
- return;
152
- if (isEditing)
153
- return; // Don't switch while editing
154
- // Deactivate current tab
155
- tabs[activeTabIndex].deactivate();
156
- tabs[activeTabIndex].container.hide();
157
- // Activate new tab
158
- activeTabIndex = newIndex;
159
- tabs[activeTabIndex].container.show();
160
- renderTabBar();
161
- tabs[activeTabIndex].activate(ctx);
162
- screen.render();
163
- }
164
- // --- Header ---
165
- const intervalSeconds = parseInt(options.interval, 10) || 10;
166
- let countdown = intervalSeconds;
167
- function updateHeader() {
168
- headerBox.setContent(`{center}Night Watch: ${snapshot.projectName} | Provider: ${config.provider} | Last: ${snapshot.timestamp.toLocaleTimeString()} | Next: ${countdown}s{/center}`);
169
- }
170
- // --- Refresh ---
171
- function refreshData() {
172
- config = loadConfig(projectDir);
173
- ctx.config = config;
174
- snapshot = fetchStatusSnapshot(projectDir, config);
175
- ctx.snapshot = snapshot;
176
- countdown = intervalSeconds;
177
- updateHeader();
178
- tabs[activeTabIndex].refresh(ctx);
179
- screen.render();
180
- }
181
- // --- Timer ---
182
- const timer = setInterval(() => {
183
- countdown--;
184
- updateHeader();
185
- screen.render();
186
- if (countdown <= 0) {
187
- refreshData();
188
- }
189
- }, 1000);
190
- // --- Global keyboard handlers ---
191
- screen.key(["q", "escape"], () => {
192
- if (isEditing)
193
- return;
194
- clearInterval(timer);
195
- for (const tab of tabs) {
196
- tab.destroy();
197
- }
198
- screen.destroy();
199
- process.exit(0);
200
- });
201
- screen.key(["r"], () => {
202
- if (isEditing)
203
- return;
204
- refreshData();
205
- });
206
- // Tab switching via number keys
207
- for (let i = 0; i < tabs.length; i++) {
208
- const idx = i;
209
- screen.key([String(i + 1)], () => {
210
- if (isEditing)
211
- return;
212
- switchTab(idx);
213
- });
214
- }
215
- // Tab cycling is handled per-tab (Status tab uses Tab for pane focus)
216
- // Shift+Tab always cycles tabs
217
- screen.key(["S-tab"], () => {
218
- if (isEditing)
219
- return;
220
- const newIndex = (activeTabIndex - 1 + tabs.length) % tabs.length;
221
- switchTab(newIndex);
222
- });
223
- // --- Initial render ---
224
- // Show only the first tab's container
225
- for (let i = 0; i < tabs.length; i++) {
226
- if (i === 0) {
227
- tabs[i].container.show();
228
- }
229
- else {
230
- tabs[i].container.hide();
231
- }
232
- }
233
- renderTabBar();
234
- updateHeader();
235
- tabs[activeTabIndex].activate(ctx);
236
- screen.render();
237
- });
238
- }
239
- //# 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 "../types.js";
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 +0,0 @@
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;AAEpC,OAAO,EAAE,cAAc,EAAqB,MAAM,aAAa,CAAC;AAsBhE;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,EAAE,CAuDjE;AAiDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+IpD"}
@@ -1,202 +0,0 @@
1
- /**
2
- * Doctor command for Night Watch CLI
3
- * Validates environment setup and system health
4
- */
5
- import { loadConfig } from "../config.js";
6
- import { header, info, label, step, success, error as uiError, warn, } from "../utils/ui.js";
7
- import { checkConfigFile, checkCrontabAccess, checkGhCli, checkGitRepo, checkLogsDirectory, checkNodeVersion, checkPrdDirectory, checkProviderCli, } from "../utils/checks.js";
8
- /**
9
- * Validate a single webhook configuration and return a list of issues.
10
- * Returns an empty array if the webhook is valid.
11
- */
12
- export function validateWebhook(webhook) {
13
- const issues = [];
14
- // Validate events
15
- if (!webhook.events || webhook.events.length === 0) {
16
- issues.push("No events configured");
17
- }
18
- else {
19
- const validEvents = [
20
- "run_started",
21
- "run_succeeded",
22
- "run_failed",
23
- "run_timeout",
24
- "review_completed",
25
- "pr_auto_merged",
26
- "rate_limit_fallback",
27
- "qa_completed",
28
- ];
29
- for (const event of webhook.events) {
30
- if (!validEvents.includes(event)) {
31
- issues.push(`Invalid event: ${event}`);
32
- }
33
- }
34
- }
35
- // Platform-specific validation
36
- switch (webhook.type) {
37
- case "slack":
38
- if (!webhook.url) {
39
- issues.push("Missing URL");
40
- }
41
- else if (!webhook.url.startsWith("https://hooks.slack.com/")) {
42
- issues.push("URL should start with https://hooks.slack.com/");
43
- }
44
- break;
45
- case "discord":
46
- if (!webhook.url) {
47
- issues.push("Missing URL");
48
- }
49
- else if (!webhook.url.startsWith("https://discord.com/api/webhooks/")) {
50
- issues.push("URL should start with https://discord.com/api/webhooks/");
51
- }
52
- break;
53
- case "telegram":
54
- if (!webhook.botToken) {
55
- issues.push("Missing botToken");
56
- }
57
- if (!webhook.chatId) {
58
- issues.push("Missing chatId");
59
- }
60
- break;
61
- default:
62
- issues.push(`Unknown webhook type: ${webhook.type}`);
63
- }
64
- return issues;
65
- }
66
- /**
67
- * Run a single check and print the result
68
- */
69
- function runCheck(checkNum, total, checkName, checkFn, options) {
70
- step(checkNum, total, `Checking ${checkName}...`);
71
- const result = checkFn();
72
- if (result.passed) {
73
- success(result.message);
74
- return { passed: true, fixed: false };
75
- }
76
- // Check failed
77
- if (options.fix && result.fixable && result.fix) {
78
- result.fix();
79
- // Re-run check after fix
80
- const recheckResult = checkFn();
81
- if (recheckResult.passed) {
82
- success(`Fixed: ${checkName}`);
83
- return { passed: true, fixed: true };
84
- }
85
- else {
86
- uiError(`Failed to fix: ${checkName}`);
87
- return { passed: false, fixed: false };
88
- }
89
- }
90
- if (result.fixable) {
91
- warn(`${result.message} (run with --fix to auto-fix)`);
92
- }
93
- else {
94
- uiError(result.message);
95
- }
96
- return { passed: false, fixed: false };
97
- }
98
- /**
99
- * Register the doctor command on the program
100
- */
101
- export function doctorCommand(program) {
102
- program
103
- .command("doctor")
104
- .description("Check Night Watch configuration and system health")
105
- .option("--fix", "Automatically fix fixable issues")
106
- .action(async (options) => {
107
- const projectDir = process.cwd();
108
- const config = loadConfig(projectDir);
109
- const totalChecks = 8;
110
- let checkNum = 1;
111
- let passedChecks = 0;
112
- let fixedChecks = 0;
113
- header("Night Watch Doctor");
114
- // Check 1: Node.js version
115
- const nodeResult = runCheck(checkNum++, totalChecks, "Node.js version", () => checkNodeVersion(18), options);
116
- if (nodeResult.passed)
117
- passedChecks++;
118
- if (nodeResult.fixed)
119
- fixedChecks++;
120
- // Check 2: Git repository
121
- const gitResult = runCheck(checkNum++, totalChecks, "git repository", () => checkGitRepo(projectDir), options);
122
- if (gitResult.passed)
123
- passedChecks++;
124
- if (gitResult.fixed)
125
- fixedChecks++;
126
- // Check 3: GitHub CLI
127
- const ghResult = runCheck(checkNum++, totalChecks, "GitHub CLI", () => checkGhCli(), options);
128
- if (ghResult.passed)
129
- passedChecks++;
130
- if (ghResult.fixed)
131
- fixedChecks++;
132
- // Check 4: Provider CLI
133
- const providerResult = runCheck(checkNum++, totalChecks, "provider CLI", () => checkProviderCli(config.provider), 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: PRD directory
145
- const prdResult = runCheck(checkNum++, totalChecks, "PRD directory", () => checkPrdDirectory(projectDir, config.prdDir), options);
146
- if (prdResult.passed)
147
- passedChecks++;
148
- if (prdResult.fixed)
149
- fixedChecks++;
150
- // Check 7: Logs directory
151
- const logsResult = runCheck(checkNum++, totalChecks, "logs directory", () => checkLogsDirectory(projectDir), options);
152
- if (logsResult.passed)
153
- passedChecks++;
154
- if (logsResult.fixed)
155
- fixedChecks++;
156
- // Check 8: Webhook configuration
157
- step(checkNum, totalChecks, "Checking webhook configuration...");
158
- if (!config.notifications ||
159
- config.notifications.webhooks.length === 0) {
160
- info("No webhooks configured (optional)");
161
- passedChecks++;
162
- }
163
- else {
164
- let webhookErrors = 0;
165
- for (const webhook of config.notifications.webhooks) {
166
- const issues = validateWebhook(webhook);
167
- if (issues.length === 0) {
168
- success(`${webhook.type} webhook: OK`);
169
- }
170
- else {
171
- for (const issue of issues) {
172
- warn(`${webhook.type} webhook: ${issue}`);
173
- }
174
- webhookErrors++;
175
- }
176
- }
177
- if (webhookErrors === 0) {
178
- success(`All ${config.notifications.webhooks.length} webhook(s) valid`);
179
- passedChecks++;
180
- }
181
- }
182
- // Check crontab access (non-blocking, informational only)
183
- const crontabResult = checkCrontabAccess();
184
- info(crontabResult.message);
185
- // Summary
186
- console.log();
187
- header("Summary");
188
- label("Checks passed", `${passedChecks}/${totalChecks}`);
189
- if (fixedChecks > 0) {
190
- label("Issues fixed", `${fixedChecks}`);
191
- }
192
- console.log();
193
- if (passedChecks === totalChecks) {
194
- success("All checks passed");
195
- }
196
- else {
197
- uiError("Issues found — fix errors above before running Night Watch");
198
- process.exit(1);
199
- }
200
- });
201
- }
202
- //# 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 +0,0 @@
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;AAcpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyErD"}
@@ -1,56 +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 "../utils/execution-history.js";
6
- const VALID_OUTCOMES = [
7
- "success",
8
- "failure",
9
- "timeout",
10
- "rate_limited",
11
- ];
12
- export function historyCommand(program) {
13
- const history = program
14
- .command("history")
15
- .description("Manage PRD execution history ledger");
16
- history
17
- .command("record <projectDir> <prdFile> <outcome>")
18
- .description("Record a PRD execution result")
19
- .option("--exit-code <n>", "Process exit code", "0")
20
- .option("--attempt <n>", "Attempt number", "1")
21
- .action((projectDir, prdFile, outcome, options) => {
22
- if (!VALID_OUTCOMES.includes(outcome)) {
23
- process.stderr.write(`Invalid outcome: ${outcome}. Must be one of: ${VALID_OUTCOMES.join(", ")}\n`);
24
- process.exit(2);
25
- }
26
- const exitCode = parseInt(options.exitCode, 10);
27
- const attempt = parseInt(options.attempt, 10);
28
- if (isNaN(exitCode)) {
29
- process.stderr.write(`Invalid exit code: ${options.exitCode}\n`);
30
- process.exit(2);
31
- }
32
- if (isNaN(attempt) || attempt < 1) {
33
- process.stderr.write(`Invalid attempt: ${options.attempt}\n`);
34
- process.exit(2);
35
- }
36
- recordExecution(projectDir, prdFile, outcome, exitCode, attempt);
37
- });
38
- history
39
- .command("check <projectDir> <prdFile>")
40
- .description("Check if a PRD is in cooldown (exit 0 = in cooldown, exit 1 = eligible)")
41
- .option("--cooldown <seconds>", "Cooldown period in seconds", "7200")
42
- .action((projectDir, prdFile, options) => {
43
- const cooldownPeriod = parseInt(options.cooldown, 10);
44
- if (isNaN(cooldownPeriod) || cooldownPeriod < 0) {
45
- process.stderr.write(`Invalid cooldown period: ${options.cooldown}\n`);
46
- process.exit(2);
47
- }
48
- if (isInCooldown(projectDir, prdFile, cooldownPeriod)) {
49
- process.exit(0); // in cooldown — caller should skip
50
- }
51
- else {
52
- process.exit(1); // eligible — caller should proceed
53
- }
54
- });
55
- }
56
- //# 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,EAEL,YAAY,EACZ,eAAe,GAChB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,cAAc,GAAuB;IACzC,SAAS;IACT,SAAS;IACT,SAAS;IACT,cAAc;CACf,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,qCAAqC,CAAC,CAAC;IAEtD,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,CACb,UAAU,EACV,OAAO,EACP,OAA2B,EAC3B,QAAQ,EACR,OAAO,CACR,CAAC;IACJ,CAAC,CACF,CAAC;IAEJ,OAAO;SACJ,OAAO,CAAC,8BAA8B,CAAC;SACvC,WAAW,CACV,yEAAyE,CAC1E;SACA,MAAM,CAAC,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,CAAC;SACpE,MAAM,CACL,CACE,UAAkB,EAClB,OAAe,EACf,OAA6B,EAC7B,EAAE;QACF,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,CAClB,4BAA4B,OAAO,CAAC,QAAQ,IAAI,CACjD,CAAC;YACF,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,CACF,CAAC;AACN,CAAC"}
@@ -1,25 +0,0 @@
1
- #!/usr/bin/env node
2
- import { Command } from 'commander';
3
- /**
4
- * Get the default branch name for the repository
5
- */
6
- export declare function getDefaultBranch(cwd: string): string;
7
- /**
8
- * Result of template path resolution
9
- */
10
- interface ITemplateResolution {
11
- path: string;
12
- source: "custom" | "bundled";
13
- }
14
- /**
15
- * Resolve a template path with per-file fallback.
16
- * If customTemplatesDir is non-null and the file exists there, return custom path.
17
- * Otherwise return the bundled template path.
18
- */
19
- export declare function resolveTemplatePath(templateName: string, customTemplatesDir: string | null, bundledTemplatesDir: string): ITemplateResolution;
20
- /**
21
- * Main init command implementation
22
- */
23
- export declare function initCommand(program: Command): void;
24
- export default initCommand;
25
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+IpC;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiEpD;AA6CD;;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;AAsFD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyTlD;AAED,eAAe,WAAW,CAAC"}