@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,30 +0,0 @@
1
- /**
2
- * QA command - executes the QA cron script for PR test generation
3
- */
4
- import { Command } from "commander";
5
- import { INightWatchConfig } from "../types.js";
6
- /**
7
- * Options for the qa command
8
- */
9
- export interface IQaOptions {
10
- dryRun: boolean;
11
- timeout?: string;
12
- provider?: string;
13
- }
14
- /**
15
- * QA notifications should not fire for script-level skip/no-op outcomes.
16
- */
17
- export declare function shouldSendQaNotification(scriptStatus?: string): boolean;
18
- /**
19
- * Build environment variables map from config and CLI options for QA
20
- */
21
- export declare function buildEnvVars(config: INightWatchConfig, options: IQaOptions): Record<string, string>;
22
- /**
23
- * Apply CLI flag overrides to the config for QA
24
- */
25
- export declare function applyCliOverrides(config: INightWatchConfig, options: IQaOptions): INightWatchConfig;
26
- /**
27
- * Register the qa command with the program
28
- */
29
- export declare function qaCommand(program: Command): void;
30
- //# sourceMappingURL=qa.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAe/C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAKvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAuCnG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,iBAAiB,CAenG;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkGhD"}
@@ -1,159 +0,0 @@
1
- /**
2
- * QA command - executes the QA cron script for PR test generation
3
- */
4
- import { getScriptPath, loadConfig } from "../config.js";
5
- import { executeScriptWithOutput } from "../utils/shell.js";
6
- import { sendNotifications } from "../utils/notify.js";
7
- import { PROVIDER_COMMANDS } from "../constants.js";
8
- import * as path from "path";
9
- import { parseScriptResult } from "../utils/script-result.js";
10
- import { createSpinner, createTable, dim, header, info, error as uiError, } from "../utils/ui.js";
11
- /**
12
- * QA notifications should not fire for script-level skip/no-op outcomes.
13
- */
14
- export function shouldSendQaNotification(scriptStatus) {
15
- if (!scriptStatus) {
16
- return true;
17
- }
18
- return !scriptStatus.startsWith("skip_");
19
- }
20
- /**
21
- * Build environment variables map from config and CLI options for QA
22
- */
23
- export function buildEnvVars(config, options) {
24
- const env = {};
25
- // Provider command - the actual CLI binary to call
26
- env.NW_PROVIDER_CMD = PROVIDER_COMMANDS[config.provider];
27
- // Default branch (empty = auto-detect in bash script)
28
- if (config.defaultBranch) {
29
- env.NW_DEFAULT_BRANCH = config.defaultBranch;
30
- }
31
- // Runtime for QA (uses NW_QA_* variables)
32
- env.NW_QA_MAX_RUNTIME = String(config.qa.maxRuntime);
33
- // Branch patterns: use qa-specific if non-empty, else top-level
34
- const branchPatterns = config.qa.branchPatterns.length > 0
35
- ? config.qa.branchPatterns
36
- : config.branchPatterns;
37
- env.NW_BRANCH_PATTERNS = branchPatterns.join(",");
38
- // QA-specific settings
39
- env.NW_QA_SKIP_LABEL = config.qa.skipLabel;
40
- env.NW_QA_ARTIFACTS = config.qa.artifacts;
41
- env.NW_QA_AUTO_INSTALL_PLAYWRIGHT = config.qa.autoInstallPlaywright ? "1" : "0";
42
- // Provider environment variables (API keys, base URLs, etc.)
43
- if (config.providerEnv) {
44
- Object.assign(env, config.providerEnv);
45
- }
46
- // Dry run flag
47
- if (options.dryRun) {
48
- env.NW_DRY_RUN = "1";
49
- }
50
- // Sandbox flag -- prevents the agent from modifying crontab during execution
51
- env.NW_EXECUTION_CONTEXT = "agent";
52
- return env;
53
- }
54
- /**
55
- * Apply CLI flag overrides to the config for QA
56
- */
57
- export function applyCliOverrides(config, options) {
58
- const overridden = { ...config, qa: { ...config.qa } };
59
- if (options.timeout) {
60
- const timeout = parseInt(options.timeout, 10);
61
- if (!isNaN(timeout)) {
62
- overridden.qa.maxRuntime = timeout;
63
- }
64
- }
65
- if (options.provider) {
66
- overridden.provider = options.provider;
67
- }
68
- return overridden;
69
- }
70
- /**
71
- * Register the qa command with the program
72
- */
73
- export function qaCommand(program) {
74
- program
75
- .command("qa")
76
- .description("Run QA process now")
77
- .option("--dry-run", "Show what would be executed without running")
78
- .option("--timeout <seconds>", "Override max runtime in seconds for QA")
79
- .option("--provider <string>", "AI provider to use (claude or codex)")
80
- .action(async (options) => {
81
- // Get the project directory (current working directory)
82
- const projectDir = process.cwd();
83
- // Load config from file and environment
84
- let config = loadConfig(projectDir);
85
- // Apply CLI flag overrides
86
- config = applyCliOverrides(config, options);
87
- // Build environment variables
88
- const envVars = buildEnvVars(config, options);
89
- // Get the script path
90
- const scriptPath = getScriptPath("night-watch-qa-cron.sh");
91
- if (options.dryRun) {
92
- header("Dry Run: QA Process");
93
- // Configuration section with table
94
- header("Configuration");
95
- const configTable = createTable({ head: ["Setting", "Value"] });
96
- configTable.push(["Provider", config.provider]);
97
- configTable.push(["Provider CLI", PROVIDER_COMMANDS[config.provider]]);
98
- configTable.push(["Max Runtime", `${config.qa.maxRuntime}s (${Math.floor(config.qa.maxRuntime / 60)}min)`]);
99
- const branchPatterns = config.qa.branchPatterns.length > 0
100
- ? config.qa.branchPatterns
101
- : config.branchPatterns;
102
- configTable.push(["Branch Patterns", branchPatterns.join(", ")]);
103
- configTable.push(["Skip Label", config.qa.skipLabel]);
104
- configTable.push(["Artifacts", config.qa.artifacts]);
105
- configTable.push(["Auto-install Playwright", config.qa.autoInstallPlaywright ? "Yes" : "No"]);
106
- console.log(configTable.toString());
107
- // Environment variables
108
- header("Environment Variables");
109
- for (const [key, value] of Object.entries(envVars)) {
110
- dim(` ${key}=${value}`);
111
- }
112
- // Full command that would be executed
113
- header("Command");
114
- dim(` bash ${scriptPath} ${projectDir}`);
115
- console.log();
116
- process.exit(0);
117
- }
118
- // Execute the script with spinner
119
- const spinner = createSpinner("Running QA process...");
120
- spinner.start();
121
- try {
122
- const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
123
- const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
124
- if (exitCode === 0) {
125
- if (scriptResult?.status?.startsWith("skip_")) {
126
- spinner.succeed("QA process completed (no PRs needed QA)");
127
- }
128
- else {
129
- spinner.succeed("QA process completed successfully");
130
- }
131
- }
132
- else {
133
- spinner.fail(`QA process exited with code ${exitCode}`);
134
- }
135
- // Send notifications (fire-and-forget, failures do not affect exit code)
136
- if (!options.dryRun) {
137
- const skipNotification = !shouldSendQaNotification(scriptResult?.status);
138
- if (skipNotification) {
139
- info("Skipping QA notification (no actionable QA result)");
140
- }
141
- if (!skipNotification) {
142
- await sendNotifications(config, {
143
- event: "qa_completed",
144
- projectName: path.basename(projectDir),
145
- exitCode,
146
- provider: config.provider,
147
- });
148
- }
149
- }
150
- process.exit(exitCode);
151
- }
152
- catch (err) {
153
- spinner.fail("Failed to execute QA command");
154
- uiError(`${err instanceof Error ? err.message : String(err)}`);
155
- process.exit(1);
156
- }
157
- });
158
- }
159
- //# sourceMappingURL=qa.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"qa.js","sourceRoot":"","sources":["../../src/commands/qa.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Retry command — Move a completed PRD back to pending for re-execution.
3
- */
4
- import { Command } from "commander";
5
- /**
6
- * Register the retry command with the program
7
- */
8
- export declare function retryCommand(program: Command): void;
9
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+BpC;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+CnD"}
@@ -1,72 +0,0 @@
1
- /**
2
- * Retry command — Move a completed PRD back to pending for re-execution.
3
- */
4
- import * as fs from "fs";
5
- import * as path from "path";
6
- import { loadConfig } from "../config.js";
7
- import { dim, info, success, error as uiError, } from "../utils/ui.js";
8
- /**
9
- * Normalize the PRD name to ensure it has .md extension
10
- */
11
- function normalizePrdName(name) {
12
- if (!name.endsWith(".md")) {
13
- return `${name}.md`;
14
- }
15
- return name;
16
- }
17
- /**
18
- * Get list of PRD files in the done directory
19
- */
20
- function getDonePrds(doneDir) {
21
- if (!fs.existsSync(doneDir)) {
22
- return [];
23
- }
24
- return fs.readdirSync(doneDir).filter((f) => f.endsWith(".md"));
25
- }
26
- /**
27
- * Register the retry command with the program
28
- */
29
- export function retryCommand(program) {
30
- program
31
- .command("retry <prdName>")
32
- .description("Move a completed PRD from done/ back to pending")
33
- .action((prdName) => {
34
- const projectDir = process.cwd();
35
- const config = loadConfig(projectDir);
36
- const prdDir = path.join(projectDir, config.prdDir);
37
- const doneDir = path.join(prdDir, "done");
38
- // Normalize the PRD name
39
- const normalizedPrdName = normalizePrdName(prdName);
40
- // Check if PRD is already pending (exists in prdDir root)
41
- const pendingPath = path.join(prdDir, normalizedPrdName);
42
- if (fs.existsSync(pendingPath)) {
43
- info(`"${normalizedPrdName}" is already pending, nothing to retry.`);
44
- return;
45
- }
46
- // Check if PRD exists in done directory
47
- const donePath = path.join(doneDir, normalizedPrdName);
48
- if (fs.existsSync(donePath)) {
49
- // Move from done to pending
50
- fs.renameSync(donePath, pendingPath);
51
- success(`Moved "${normalizedPrdName}" back to pending.`);
52
- dim(`From: ${donePath}`);
53
- dim(`To: ${pendingPath}`);
54
- return;
55
- }
56
- // PRD not found anywhere
57
- uiError(`PRD "${normalizedPrdName}" not found.`);
58
- // List available PRDs in done directory
59
- const donePrds = getDonePrds(doneDir);
60
- if (donePrds.length > 0) {
61
- info(`Available PRDs in done/:`);
62
- for (const prd of donePrds) {
63
- dim(` - ${prd}`);
64
- }
65
- }
66
- else {
67
- info("No PRDs found in done/ directory.");
68
- }
69
- process.exit(1);
70
- });
71
- }
72
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"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"}
@@ -1,35 +0,0 @@
1
- /**
2
- * Review command - executes the PR reviewer cron script
3
- */
4
- import { Command } from "commander";
5
- import { INightWatchConfig } from "../types.js";
6
- /**
7
- * Options for the review command
8
- */
9
- export interface IReviewOptions {
10
- dryRun: boolean;
11
- timeout?: string;
12
- provider?: string;
13
- autoMerge?: boolean;
14
- }
15
- /**
16
- * Review notifications should not fire for script-level skip/no-op outcomes.
17
- */
18
- export declare function shouldSendReviewNotification(scriptStatus?: string): boolean;
19
- /**
20
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
21
- */
22
- export declare function parseAutoMergedPrNumbers(raw?: string): number[];
23
- /**
24
- * Build environment variables map from config and CLI options for reviewer
25
- */
26
- export declare function buildEnvVars(config: INightWatchConfig, options: IReviewOptions): Record<string, string>;
27
- /**
28
- * Apply CLI flag overrides to the config for reviewer
29
- */
30
- export declare function applyCliOverrides(config: INightWatchConfig, options: IReviewOptions): INightWatchConfig;
31
- /**
32
- * Register the review command with the program
33
- */
34
- export declare function reviewCommand(program: Command): void;
35
- //# sourceMappingURL=review.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiBhD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAK3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/D;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoCvG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAmBvG;AA+BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6JpD"}
@@ -1,252 +0,0 @@
1
- /**
2
- * Review command - executes the PR reviewer cron script
3
- */
4
- import { getScriptPath, loadConfig } from "../config.js";
5
- import { executeScriptWithOutput } from "../utils/shell.js";
6
- import { sendNotifications } from "../utils/notify.js";
7
- import { fetchPrDetailsByNumber, fetchReviewedPrDetails } from "../utils/github.js";
8
- import { PROVIDER_COMMANDS } from "../constants.js";
9
- import { execSync } from "child_process";
10
- import * as path from "path";
11
- import { parseScriptResult } from "../utils/script-result.js";
12
- import { createSpinner, createTable, dim, header, info, error as uiError, } from "../utils/ui.js";
13
- /**
14
- * Review notifications should not fire for script-level skip/no-op outcomes.
15
- */
16
- export function shouldSendReviewNotification(scriptStatus) {
17
- if (!scriptStatus) {
18
- return true;
19
- }
20
- return !scriptStatus.startsWith("skip_");
21
- }
22
- /**
23
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
24
- */
25
- export function parseAutoMergedPrNumbers(raw) {
26
- if (!raw || raw.trim().length === 0) {
27
- return [];
28
- }
29
- return raw
30
- .split(",")
31
- .map((token) => parseInt(token.trim().replace(/^#/, ""), 10))
32
- .filter((value) => !Number.isNaN(value));
33
- }
34
- /**
35
- * Build environment variables map from config and CLI options for reviewer
36
- */
37
- export function buildEnvVars(config, options) {
38
- const env = {};
39
- // Provider command - the actual CLI binary to call
40
- env.NW_PROVIDER_CMD = PROVIDER_COMMANDS[config.provider];
41
- // Default branch (empty = auto-detect in bash script)
42
- if (config.defaultBranch) {
43
- env.NW_DEFAULT_BRANCH = config.defaultBranch;
44
- }
45
- // Runtime for reviewer (uses NW_REVIEWER_* variables)
46
- env.NW_REVIEWER_MAX_RUNTIME = String(config.reviewerMaxRuntime);
47
- env.NW_MIN_REVIEW_SCORE = String(config.minReviewScore);
48
- env.NW_BRANCH_PATTERNS = config.branchPatterns.join(",");
49
- // Provider environment variables (API keys, base URLs, etc.)
50
- if (config.providerEnv) {
51
- Object.assign(env, config.providerEnv);
52
- }
53
- // Dry run flag
54
- if (options.dryRun) {
55
- env.NW_DRY_RUN = "1";
56
- }
57
- // Auto-merge configuration
58
- if (config.autoMerge) {
59
- env.NW_AUTO_MERGE = "1";
60
- }
61
- env.NW_AUTO_MERGE_METHOD = config.autoMergeMethod;
62
- // Sandbox flag — prevents the agent from modifying crontab during execution
63
- env.NW_EXECUTION_CONTEXT = "agent";
64
- return env;
65
- }
66
- /**
67
- * Apply CLI flag overrides to the config for reviewer
68
- */
69
- export function applyCliOverrides(config, options) {
70
- const overridden = { ...config };
71
- if (options.timeout) {
72
- const timeout = parseInt(options.timeout, 10);
73
- if (!isNaN(timeout)) {
74
- overridden.reviewerMaxRuntime = timeout;
75
- }
76
- }
77
- if (options.provider) {
78
- overridden.provider = options.provider;
79
- }
80
- if (options.autoMerge !== undefined) {
81
- overridden.autoMerge = options.autoMerge;
82
- }
83
- return overridden;
84
- }
85
- /**
86
- * Get open PRs that need work (matching branch patterns)
87
- */
88
- function getOpenPrsNeedingWork(branchPatterns) {
89
- try {
90
- // Build the search query for PRs matching branch patterns
91
- const headFilter = branchPatterns.map((p) => `--head "${p}"`).join(" ");
92
- // Get open PRs as JSON
93
- const result = execSync(`gh pr list --state open --json number,title,headRefName ${headFilter} 2>/dev/null || echo "[]"`, {
94
- encoding: "utf-8",
95
- stdio: ["pipe", "pipe", "pipe"],
96
- });
97
- const prs = JSON.parse(result.trim() || "[]");
98
- return prs.map((pr) => ({
99
- number: pr.number,
100
- title: pr.title,
101
- branch: pr.headRefName,
102
- }));
103
- }
104
- catch {
105
- // gh CLI not available or not authenticated
106
- return [];
107
- }
108
- }
109
- /**
110
- * Register the review command with the program
111
- */
112
- export function reviewCommand(program) {
113
- program
114
- .command("review")
115
- .description("Run PR reviewer now")
116
- .option("--dry-run", "Show what would be executed without running")
117
- .option("--timeout <seconds>", "Override max runtime in seconds for reviewer")
118
- .option("--provider <string>", "AI provider to use (claude or codex)")
119
- .option("--auto-merge", "Enable auto-merge for this run")
120
- .action(async (options) => {
121
- // Get the project directory (current working directory)
122
- const projectDir = process.cwd();
123
- // Load config from file and environment
124
- let config = loadConfig(projectDir);
125
- // Apply CLI flag overrides
126
- config = applyCliOverrides(config, options);
127
- // Build environment variables
128
- const envVars = buildEnvVars(config, options);
129
- // Get the script path
130
- const scriptPath = getScriptPath("night-watch-pr-reviewer-cron.sh");
131
- if (options.dryRun) {
132
- header("Dry Run: PR Reviewer");
133
- // Configuration section with table
134
- header("Configuration");
135
- const configTable = createTable({ head: ["Setting", "Value"] });
136
- configTable.push(["Provider", config.provider]);
137
- configTable.push(["Provider CLI", PROVIDER_COMMANDS[config.provider]]);
138
- configTable.push(["Max Runtime", `${config.reviewerMaxRuntime}s (${Math.floor(config.reviewerMaxRuntime / 60)}min)`]);
139
- configTable.push(["Min Review Score", `${config.minReviewScore}/100`]);
140
- configTable.push(["Branch Patterns", config.branchPatterns.join(", ")]);
141
- configTable.push(["Auto-merge", config.autoMerge ? `Enabled (${config.autoMergeMethod})` : "Disabled"]);
142
- console.log(configTable.toString());
143
- // Check for open PRs needing work
144
- header("Open PRs Needing Work");
145
- const openPrs = getOpenPrsNeedingWork(config.branchPatterns);
146
- if (openPrs.length === 0) {
147
- dim(" (no open PRs matching branch patterns)");
148
- }
149
- else {
150
- for (const pr of openPrs) {
151
- info(`#${pr.number}: ${pr.title}`);
152
- dim(` Branch: ${pr.branch}`);
153
- }
154
- }
155
- // Provider invocation command
156
- header("Provider Invocation");
157
- const providerCmd = PROVIDER_COMMANDS[config.provider];
158
- const autoFlag = config.provider === "claude" ? "--dangerously-skip-permissions" : "--yolo";
159
- dim(` ${providerCmd} ${autoFlag} -p "/night-watch-pr-reviewer"`);
160
- // Environment variables
161
- header("Environment Variables");
162
- for (const [key, value] of Object.entries(envVars)) {
163
- dim(` ${key}=${value}`);
164
- }
165
- // Full command that would be executed
166
- header("Command");
167
- dim(` bash ${scriptPath} ${projectDir}`);
168
- console.log();
169
- process.exit(0);
170
- }
171
- // Execute the script with spinner
172
- const spinner = createSpinner("Running PR reviewer...");
173
- spinner.start();
174
- try {
175
- const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
176
- const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
177
- if (exitCode === 0) {
178
- if (scriptResult?.status?.startsWith("skip_")) {
179
- spinner.succeed("PR reviewer completed (no PRs needed review)");
180
- }
181
- else {
182
- spinner.succeed("PR reviewer completed successfully");
183
- }
184
- }
185
- else {
186
- spinner.fail(`PR reviewer exited with code ${exitCode}`);
187
- }
188
- // Send notifications (fire-and-forget, failures do not affect exit code)
189
- if (!options.dryRun) {
190
- const skipNotification = !shouldSendReviewNotification(scriptResult?.status);
191
- if (skipNotification) {
192
- info("Skipping review notification (no actionable review result)");
193
- }
194
- // Enrich with PR details (graceful — null if gh fails)
195
- let prDetails = null;
196
- if (!skipNotification && exitCode === 0) {
197
- const prsRaw = scriptResult?.data.prs;
198
- const firstPrToken = prsRaw?.split(",")[0]?.trim();
199
- if (firstPrToken) {
200
- const parsedNumber = parseInt(firstPrToken.replace(/^#/, ""), 10);
201
- if (!Number.isNaN(parsedNumber)) {
202
- prDetails = fetchPrDetailsByNumber(parsedNumber, projectDir);
203
- }
204
- }
205
- if (!prDetails) {
206
- prDetails = fetchReviewedPrDetails(config.branchPatterns, projectDir);
207
- }
208
- }
209
- if (!skipNotification) {
210
- await sendNotifications(config, {
211
- event: "review_completed",
212
- projectName: path.basename(projectDir),
213
- exitCode,
214
- provider: config.provider,
215
- prUrl: prDetails?.url,
216
- prTitle: prDetails?.title,
217
- prBody: prDetails?.body,
218
- prNumber: prDetails?.number,
219
- filesChanged: prDetails?.changedFiles,
220
- additions: prDetails?.additions,
221
- deletions: prDetails?.deletions,
222
- });
223
- }
224
- const autoMergedPrNumbers = parseAutoMergedPrNumbers(scriptResult?.data.auto_merged);
225
- if (autoMergedPrNumbers.length > 0) {
226
- const autoMergedPrNumber = autoMergedPrNumbers[0];
227
- const autoMergedPrDetails = fetchPrDetailsByNumber(autoMergedPrNumber, projectDir);
228
- await sendNotifications(config, {
229
- event: "pr_auto_merged",
230
- projectName: path.basename(projectDir),
231
- exitCode,
232
- provider: config.provider,
233
- prNumber: autoMergedPrDetails?.number ?? autoMergedPrNumber,
234
- prUrl: autoMergedPrDetails?.url,
235
- prTitle: autoMergedPrDetails?.title,
236
- prBody: autoMergedPrDetails?.body,
237
- filesChanged: autoMergedPrDetails?.changedFiles,
238
- additions: autoMergedPrDetails?.additions,
239
- deletions: autoMergedPrDetails?.deletions,
240
- });
241
- }
242
- }
243
- process.exit(exitCode);
244
- }
245
- catch (err) {
246
- spinner.fail("Failed to execute review command");
247
- uiError(`${err instanceof Error ? err.message : String(err)}`);
248
- process.exit(1);
249
- }
250
- });
251
- }
252
- //# sourceMappingURL=review.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}