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

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 (235) hide show
  1. package/dist/cli.js +2309 -1313
  2. package/dist/web/assets/index-BUgI2S1s.js +406 -0
  3. package/dist/web/assets/index-CkdLFBd7.js +406 -0
  4. package/dist/web/assets/index-RMfswANB.css +1 -0
  5. package/dist/web/index.html +2 -2
  6. package/package.json +1 -1
  7. package/dist/cli.d.ts +0 -3
  8. package/dist/cli.d.ts.map +0 -1
  9. package/dist/cli.js.map +0 -1
  10. package/dist/commands/analytics.d.ts +0 -14
  11. package/dist/commands/analytics.d.ts.map +0 -1
  12. package/dist/commands/analytics.js +0 -69
  13. package/dist/commands/analytics.js.map +0 -1
  14. package/dist/commands/audit.d.ts +0 -19
  15. package/dist/commands/audit.d.ts.map +0 -1
  16. package/dist/commands/audit.js +0 -144
  17. package/dist/commands/audit.js.map +0 -1
  18. package/dist/commands/board.d.ts +0 -9
  19. package/dist/commands/board.d.ts.map +0 -1
  20. package/dist/commands/board.js +0 -702
  21. package/dist/commands/board.js.map +0 -1
  22. package/dist/commands/cancel.d.ts +0 -46
  23. package/dist/commands/cancel.d.ts.map +0 -1
  24. package/dist/commands/cancel.js +0 -239
  25. package/dist/commands/cancel.js.map +0 -1
  26. package/dist/commands/cron.d.ts +0 -8
  27. package/dist/commands/cron.d.ts.map +0 -1
  28. package/dist/commands/cron.js +0 -134
  29. package/dist/commands/cron.js.map +0 -1
  30. package/dist/commands/dashboard/tab-actions.d.ts +0 -10
  31. package/dist/commands/dashboard/tab-actions.d.ts.map +0 -1
  32. package/dist/commands/dashboard/tab-actions.js +0 -247
  33. package/dist/commands/dashboard/tab-actions.js.map +0 -1
  34. package/dist/commands/dashboard/tab-config.d.ts +0 -21
  35. package/dist/commands/dashboard/tab-config.d.ts.map +0 -1
  36. package/dist/commands/dashboard/tab-config.js +0 -873
  37. package/dist/commands/dashboard/tab-config.js.map +0 -1
  38. package/dist/commands/dashboard/tab-logs.d.ts +0 -10
  39. package/dist/commands/dashboard/tab-logs.d.ts.map +0 -1
  40. package/dist/commands/dashboard/tab-logs.js +0 -202
  41. package/dist/commands/dashboard/tab-logs.js.map +0 -1
  42. package/dist/commands/dashboard/tab-schedules.d.ts +0 -21
  43. package/dist/commands/dashboard/tab-schedules.d.ts.map +0 -1
  44. package/dist/commands/dashboard/tab-schedules.js +0 -320
  45. package/dist/commands/dashboard/tab-schedules.js.map +0 -1
  46. package/dist/commands/dashboard/tab-status.d.ts +0 -32
  47. package/dist/commands/dashboard/tab-status.d.ts.map +0 -1
  48. package/dist/commands/dashboard/tab-status.js +0 -424
  49. package/dist/commands/dashboard/tab-status.js.map +0 -1
  50. package/dist/commands/dashboard/types.d.ts +0 -42
  51. package/dist/commands/dashboard/types.d.ts.map +0 -1
  52. package/dist/commands/dashboard/types.js +0 -5
  53. package/dist/commands/dashboard/types.js.map +0 -1
  54. package/dist/commands/dashboard.d.ts +0 -11
  55. package/dist/commands/dashboard.d.ts.map +0 -1
  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.d.ts.map +0 -1
  60. package/dist/commands/doctor.js +0 -195
  61. package/dist/commands/doctor.js.map +0 -1
  62. package/dist/commands/history.d.ts +0 -7
  63. package/dist/commands/history.d.ts.map +0 -1
  64. package/dist/commands/history.js +0 -49
  65. package/dist/commands/history.js.map +0 -1
  66. package/dist/commands/init.d.ts +0 -45
  67. package/dist/commands/init.d.ts.map +0 -1
  68. package/dist/commands/init.js +0 -777
  69. package/dist/commands/init.js.map +0 -1
  70. package/dist/commands/install.d.ts +0 -65
  71. package/dist/commands/install.d.ts.map +0 -1
  72. package/dist/commands/install.js +0 -405
  73. package/dist/commands/install.js.map +0 -1
  74. package/dist/commands/logs.d.ts +0 -15
  75. package/dist/commands/logs.d.ts.map +0 -1
  76. package/dist/commands/logs.js +0 -155
  77. package/dist/commands/logs.js.map +0 -1
  78. package/dist/commands/merge.d.ts +0 -26
  79. package/dist/commands/merge.d.ts.map +0 -1
  80. package/dist/commands/merge.js +0 -159
  81. package/dist/commands/merge.js.map +0 -1
  82. package/dist/commands/notify.d.ts +0 -7
  83. package/dist/commands/notify.d.ts.map +0 -1
  84. package/dist/commands/notify.js +0 -43
  85. package/dist/commands/notify.js.map +0 -1
  86. package/dist/commands/plan.d.ts +0 -19
  87. package/dist/commands/plan.d.ts.map +0 -1
  88. package/dist/commands/plan.js +0 -88
  89. package/dist/commands/plan.js.map +0 -1
  90. package/dist/commands/prd-state.d.ts +0 -12
  91. package/dist/commands/prd-state.d.ts.map +0 -1
  92. package/dist/commands/prd-state.js +0 -47
  93. package/dist/commands/prd-state.js.map +0 -1
  94. package/dist/commands/prd.d.ts +0 -18
  95. package/dist/commands/prd.d.ts.map +0 -1
  96. package/dist/commands/prd.js +0 -363
  97. package/dist/commands/prd.js.map +0 -1
  98. package/dist/commands/prds.d.ts +0 -13
  99. package/dist/commands/prds.d.ts.map +0 -1
  100. package/dist/commands/prds.js +0 -194
  101. package/dist/commands/prds.js.map +0 -1
  102. package/dist/commands/prs.d.ts +0 -14
  103. package/dist/commands/prs.d.ts.map +0 -1
  104. package/dist/commands/prs.js +0 -104
  105. package/dist/commands/prs.js.map +0 -1
  106. package/dist/commands/qa.d.ts +0 -34
  107. package/dist/commands/qa.d.ts.map +0 -1
  108. package/dist/commands/qa.js +0 -214
  109. package/dist/commands/qa.js.map +0 -1
  110. package/dist/commands/queue.d.ts +0 -8
  111. package/dist/commands/queue.d.ts.map +0 -1
  112. package/dist/commands/queue.js +0 -376
  113. package/dist/commands/queue.js.map +0 -1
  114. package/dist/commands/resolve.d.ts +0 -26
  115. package/dist/commands/resolve.d.ts.map +0 -1
  116. package/dist/commands/resolve.js +0 -186
  117. package/dist/commands/resolve.js.map +0 -1
  118. package/dist/commands/retry.d.ts +0 -9
  119. package/dist/commands/retry.d.ts.map +0 -1
  120. package/dist/commands/retry.js +0 -71
  121. package/dist/commands/retry.js.map +0 -1
  122. package/dist/commands/review.d.ts +0 -82
  123. package/dist/commands/review.d.ts.map +0 -1
  124. package/dist/commands/review.js +0 -479
  125. package/dist/commands/review.js.map +0 -1
  126. package/dist/commands/run.d.ts +0 -73
  127. package/dist/commands/run.d.ts.map +0 -1
  128. package/dist/commands/run.js +0 -509
  129. package/dist/commands/run.js.map +0 -1
  130. package/dist/commands/serve.d.ts +0 -19
  131. package/dist/commands/serve.d.ts.map +0 -1
  132. package/dist/commands/serve.js +0 -142
  133. package/dist/commands/serve.js.map +0 -1
  134. package/dist/commands/shared/env-builder.d.ts +0 -49
  135. package/dist/commands/shared/env-builder.d.ts.map +0 -1
  136. package/dist/commands/shared/env-builder.js +0 -150
  137. package/dist/commands/shared/env-builder.js.map +0 -1
  138. package/dist/commands/slice.d.ts +0 -35
  139. package/dist/commands/slice.d.ts.map +0 -1
  140. package/dist/commands/slice.js +0 -316
  141. package/dist/commands/slice.js.map +0 -1
  142. package/dist/commands/state.d.ts +0 -8
  143. package/dist/commands/state.d.ts.map +0 -1
  144. package/dist/commands/state.js +0 -54
  145. package/dist/commands/state.js.map +0 -1
  146. package/dist/commands/status.d.ts +0 -14
  147. package/dist/commands/status.d.ts.map +0 -1
  148. package/dist/commands/status.js +0 -297
  149. package/dist/commands/status.js.map +0 -1
  150. package/dist/commands/summary.d.ts +0 -14
  151. package/dist/commands/summary.d.ts.map +0 -1
  152. package/dist/commands/summary.js +0 -193
  153. package/dist/commands/summary.js.map +0 -1
  154. package/dist/commands/uninstall.d.ts +0 -25
  155. package/dist/commands/uninstall.d.ts.map +0 -1
  156. package/dist/commands/uninstall.js +0 -134
  157. package/dist/commands/uninstall.js.map +0 -1
  158. package/dist/commands/update.d.ts +0 -22
  159. package/dist/commands/update.d.ts.map +0 -1
  160. package/dist/commands/update.js +0 -90
  161. package/dist/commands/update.js.map +0 -1
  162. package/dist/web/assets/index-2JY0x_Ij.js +0 -381
  163. package/dist/web/assets/index-3h8pgmqL.css +0 -1
  164. package/dist/web/assets/index-B-wbyZq7.js +0 -386
  165. package/dist/web/assets/index-B1BnOpiO.css +0 -1
  166. package/dist/web/assets/index-B3CnV08_.js +0 -365
  167. package/dist/web/assets/index-B5QjuFh9.css +0 -1
  168. package/dist/web/assets/index-B8FW2ecQ.js +0 -370
  169. package/dist/web/assets/index-BFxPiKyy.js +0 -381
  170. package/dist/web/assets/index-BGqNh_Da.js +0 -365
  171. package/dist/web/assets/index-BIONU0qz.css +0 -1
  172. package/dist/web/assets/index-B_l_3wnA.js +0 -370
  173. package/dist/web/assets/index-Ba-4YvTQ.js +0 -365
  174. package/dist/web/assets/index-Bbb4-39N.js +0 -370
  175. package/dist/web/assets/index-BdgdShEN.js +0 -365
  176. package/dist/web/assets/index-BhiC4Z-G.js +0 -381
  177. package/dist/web/assets/index-BjhCFjZi.js +0 -381
  178. package/dist/web/assets/index-BlRxmrnQ.css +0 -1
  179. package/dist/web/assets/index-BqwbXsHS.js +0 -365
  180. package/dist/web/assets/index-BsC7RT48.css +0 -1
  181. package/dist/web/assets/index-Bvh8XI8_.js +0 -370
  182. package/dist/web/assets/index-C01r2ymn.js +0 -381
  183. package/dist/web/assets/index-C51Rbsmk.js +0 -381
  184. package/dist/web/assets/index-C7lMNxRE.js +0 -370
  185. package/dist/web/assets/index-CJLObgsn.js +0 -386
  186. package/dist/web/assets/index-CLuRf7Zt.js +0 -381
  187. package/dist/web/assets/index-CM3xFd3e.css +0 -1
  188. package/dist/web/assets/index-CNkBtDK7.js +0 -370
  189. package/dist/web/assets/index-CPQbZ1BL.css +0 -1
  190. package/dist/web/assets/index-CTy5dUDU.css +0 -1
  191. package/dist/web/assets/index-CU15COKs.js +0 -370
  192. package/dist/web/assets/index-CiRJZI4z.js +0 -386
  193. package/dist/web/assets/index-Cp7RYjoy.css +0 -1
  194. package/dist/web/assets/index-CvPkZOWT.js +0 -381
  195. package/dist/web/assets/index-CvUk-33B.css +0 -1
  196. package/dist/web/assets/index-Cvmj-oF6.css +0 -1
  197. package/dist/web/assets/index-CxE5iQVO.js +0 -381
  198. package/dist/web/assets/index-D7lZQpFV.js +0 -365
  199. package/dist/web/assets/index-DAyP4GOi.css +0 -1
  200. package/dist/web/assets/index-DCG0n8Kg.js +0 -386
  201. package/dist/web/assets/index-DEEI8cyF.css +0 -1
  202. package/dist/web/assets/index-DF99BowV.js +0 -381
  203. package/dist/web/assets/index-DGWsvFj6.css +0 -1
  204. package/dist/web/assets/index-DGpU39Cp.css +0 -1
  205. package/dist/web/assets/index-DI4kFgOi.js +0 -370
  206. package/dist/web/assets/index-DIyTcPw5.css +0 -1
  207. package/dist/web/assets/index-DTsfDC7m.js +0 -381
  208. package/dist/web/assets/index-DcgNAi4A.js +0 -386
  209. package/dist/web/assets/index-DgOAgkZy.css +0 -1
  210. package/dist/web/assets/index-DnHkqbOa.js +0 -386
  211. package/dist/web/assets/index-DnR7Idcf.css +0 -1
  212. package/dist/web/assets/index-DpVirMEe.css +0 -1
  213. package/dist/web/assets/index-DsYIWZ86.css +0 -1
  214. package/dist/web/assets/index-DtrDkci5.js +0 -381
  215. package/dist/web/assets/index-DyjIth5M.js +0 -386
  216. package/dist/web/assets/index-FwIKfHPL.css +0 -1
  217. package/dist/web/assets/index-IKrZymWk.css +0 -1
  218. package/dist/web/assets/index-MA6fM0ab.js +0 -381
  219. package/dist/web/assets/index-N_QxaSEg.css +0 -1
  220. package/dist/web/assets/index-OcU-0TCQ.css +0 -1
  221. package/dist/web/assets/index-OyhrmG-L.js +0 -381
  222. package/dist/web/assets/index-SQlBKu_s.js +0 -386
  223. package/dist/web/assets/index-Sv2B60J4.js +0 -370
  224. package/dist/web/assets/index-Vgyivb5u.js +0 -365
  225. package/dist/web/assets/index-ZABWMEZR.js +0 -381
  226. package/dist/web/assets/index-ZE5lOeJp.js +0 -386
  227. package/dist/web/assets/index-aCHmkAcJ.css +0 -1
  228. package/dist/web/assets/index-bFijnpuU.js +0 -381
  229. package/dist/web/assets/index-bUPZgSoZ.css +0 -1
  230. package/dist/web/assets/index-mz1VIYsP.css +0 -1
  231. package/dist/web/assets/index-oOp_MFeE.js +0 -376
  232. package/dist/web/assets/index-rfU713Zm.js +0 -386
  233. package/dist/web/assets/index-tuNH9gmb.js +0 -448
  234. package/dist/web/assets/index-viSwHyDD.js +0 -365
  235. package/dist/web/assets/index-yKEQysks.js +0 -365
@@ -1,71 +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 { dim, info, loadConfig, success, error as uiError } from '@night-watch/core';
7
- /**
8
- * Normalize the PRD name to ensure it has .md extension
9
- */
10
- function normalizePrdName(name) {
11
- if (!name.endsWith('.md')) {
12
- return `${name}.md`;
13
- }
14
- return name;
15
- }
16
- /**
17
- * Get list of PRD files in the done directory
18
- */
19
- function getDonePrds(doneDir) {
20
- if (!fs.existsSync(doneDir)) {
21
- return [];
22
- }
23
- return fs.readdirSync(doneDir).filter((f) => f.endsWith('.md'));
24
- }
25
- /**
26
- * Register the retry command with the program
27
- */
28
- export function retryCommand(program) {
29
- program
30
- .command('retry <prdName>')
31
- .description('Move a completed PRD from done/ back to pending')
32
- .action((prdName) => {
33
- const projectDir = process.cwd();
34
- const config = loadConfig(projectDir);
35
- const prdDir = path.join(projectDir, config.prdDir);
36
- const doneDir = path.join(prdDir, 'done');
37
- // Normalize the PRD name
38
- const normalizedPrdName = normalizePrdName(prdName);
39
- // Check if PRD is already pending (exists in prdDir root)
40
- const pendingPath = path.join(prdDir, normalizedPrdName);
41
- if (fs.existsSync(pendingPath)) {
42
- info(`"${normalizedPrdName}" is already pending, nothing to retry.`);
43
- return;
44
- }
45
- // Check if PRD exists in done directory
46
- const donePath = path.join(doneDir, normalizedPrdName);
47
- if (fs.existsSync(donePath)) {
48
- // Move from done to pending
49
- fs.renameSync(donePath, pendingPath);
50
- success(`Moved "${normalizedPrdName}" back to pending.`);
51
- dim(`From: ${donePath}`);
52
- dim(`To: ${pendingPath}`);
53
- return;
54
- }
55
- // PRD not found anywhere
56
- uiError(`PRD "${normalizedPrdName}" not found.`);
57
- // List available PRDs in done directory
58
- const donePrds = getDonePrds(doneDir);
59
- if (donePrds.length > 0) {
60
- info(`Available PRDs in done/:`);
61
- for (const prd of donePrds) {
62
- dim(` - ${prd}`);
63
- }
64
- }
65
- else {
66
- info('No PRDs found in done/ directory.');
67
- }
68
- process.exit(1);
69
- });
70
- }
71
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/commands/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAErF;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,GAAG,IAAI,KAAK,CAAC;IACtB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,CAAC,OAAe,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAE1C,yBAAyB;QACzB,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAEpD,0DAA0D;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACzD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,IAAI,iBAAiB,yCAAyC,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QACvD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,4BAA4B;YAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACrC,OAAO,CAAC,UAAU,iBAAiB,oBAAoB,CAAC,CAAC;YACzD,GAAG,CAAC,SAAS,QAAQ,EAAE,CAAC,CAAC;YACzB,GAAG,CAAC,SAAS,WAAW,EAAE,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,yBAAyB;QACzB,OAAO,CAAC,QAAQ,iBAAiB,cAAc,CAAC,CAAC;QAEjD,wCAAwC;QACxC,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACtC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mCAAmC,CAAC,CAAC;QAC5C,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,82 +0,0 @@
1
- /**
2
- * Review command - executes the PR reviewer cron script
3
- */
4
- import { Command } from 'commander';
5
- import { INightWatchConfig } from '@night-watch/core';
6
- /**
7
- * Options for the review command
8
- */
9
- export interface IReviewOptions {
10
- dryRun: boolean;
11
- timeout?: string;
12
- provider?: string;
13
- }
14
- /**
15
- * Review notifications should not fire for script-level skip/no-op outcomes.
16
- */
17
- export declare function shouldSendReviewNotification(scriptStatus?: string): boolean;
18
- /**
19
- * Review completion notifications are only valid for successful reviewer runs.
20
- * Guard against both non-zero exits and mismatched legacy status markers.
21
- */
22
- export declare function shouldSendReviewCompletionNotification(exitCode: number, scriptStatus?: string): boolean;
23
- /**
24
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
25
- */
26
- export declare function parseAutoMergedPrNumbers(raw?: string): number[];
27
- /**
28
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
29
- * Deduplicates while preserving order.
30
- */
31
- export declare function parseReviewedPrNumbers(raw?: string): number[];
32
- /**
33
- * Build per-PR review notification targets from the script result payload.
34
- * Legacy no_changes_needed is only trustworthy when exactly one PR was reviewed.
35
- */
36
- export declare function buildReviewNotificationTargets(reviewedPrNumbers: number[], noChangesPrNumbers: number[], legacyNoChangesNeeded?: boolean): Array<{
37
- prNumber: number;
38
- noChangesNeeded: boolean;
39
- }>;
40
- /**
41
- * Parse retry attempts from script result data.
42
- * Returns the number of attempts (defaults to 1 if not present or invalid).
43
- */
44
- export declare function parseRetryAttempts(raw?: string): number;
45
- /**
46
- * Parse final review score from script result data.
47
- * Returns undefined when missing or invalid.
48
- */
49
- export declare function parseFinalReviewScore(raw?: string): number | undefined;
50
- /**
51
- * Post a "ready for human review" comment and add a label to the PR.
52
- * Silently ignores failures — gh CLI may not be available.
53
- */
54
- export declare function postReadyForHumanReviewComment(prNumber: number, finalScore: number | undefined, cwd: string): void;
55
- /**
56
- * Build environment variables map from config and CLI options for reviewer
57
- */
58
- export declare function buildEnvVars(config: INightWatchConfig, options: IReviewOptions): Record<string, string>;
59
- /**
60
- * Apply CLI flag overrides to the config for reviewer
61
- */
62
- export declare function applyCliOverrides(config: INightWatchConfig, options: IReviewOptions): INightWatchConfig;
63
- interface ICheckStatus {
64
- name?: string;
65
- bucket?: string;
66
- state?: string;
67
- conclusion?: string;
68
- }
69
- /**
70
- * Whether a GitHub check entry should be treated as failing/action-required.
71
- */
72
- export declare function isFailingCheck(check: ICheckStatus): boolean;
73
- /**
74
- * Get a human-readable list of failing checks for a PR.
75
- */
76
- export declare function getPrFailingChecks(prNumber: number): string[];
77
- /**
78
- * Register the review command with the program
79
- */
80
- export declare function reviewCommand(program: Command): void;
81
- export {};
82
- //# 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;AACpC,OAAO,EAEL,iBAAiB,EAgBlB,MAAM,mBAAmB,CAAC;AAU3B;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,sCAAsC,CACpD,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAUT;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ/D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAiB7D;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,iBAAiB,EAAE,MAAM,EAAE,EAC3B,kBAAkB,EAAE,MAAM,EAAE,EAC5B,qBAAqB,UAAQ,GAC5B,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,CAAC,CAYvD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAMvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAStE;AAED;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,GAAG,EAAE,MAAM,GACV,IAAI,CA2BN;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,cAAc,GACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,cAAc,GACtB,iBAAiB,CAgBnB;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAmB3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA0C7D;AAiCD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgQpD"}
@@ -1,479 +0,0 @@
1
- /**
2
- * Review command - executes the PR reviewer cron script
3
- */
4
- import { CLAUDE_MODEL_IDS, PROVIDER_COMMANDS, createSpinner, createTable, dim, executeScriptWithOutput, fetchPrDetailsByNumber, fetchReviewedPrDetails, getScriptPath, header, info, loadConfig, parseScriptResult, resolveJobProvider, sendNotifications, error as uiError, } from '@night-watch/core';
5
- import { buildBaseEnvVars, formatProviderDisplay, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
6
- import { execFileSync } from 'child_process';
7
- import * as path from 'path';
8
- /**
9
- * Review notifications should not fire for script-level skip/no-op outcomes.
10
- */
11
- export function shouldSendReviewNotification(scriptStatus) {
12
- if (!scriptStatus) {
13
- return true;
14
- }
15
- if (scriptStatus === 'queued') {
16
- return false;
17
- }
18
- return !scriptStatus.startsWith('skip_');
19
- }
20
- /**
21
- * Review completion notifications are only valid for successful reviewer runs.
22
- * Guard against both non-zero exits and mismatched legacy status markers.
23
- */
24
- export function shouldSendReviewCompletionNotification(exitCode, scriptStatus) {
25
- if (exitCode !== 0) {
26
- return false;
27
- }
28
- if (scriptStatus === 'failure' || scriptStatus === 'timeout') {
29
- return false;
30
- }
31
- return shouldSendReviewNotification(scriptStatus);
32
- }
33
- /**
34
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
35
- */
36
- export function parseAutoMergedPrNumbers(raw) {
37
- if (!raw || raw.trim().length === 0) {
38
- return [];
39
- }
40
- return raw
41
- .split(',')
42
- .map((token) => parseInt(token.trim().replace(/^#/, ''), 10))
43
- .filter((value) => !Number.isNaN(value));
44
- }
45
- /**
46
- * Parse comma-separated PR numbers like "#12,#34" into numeric IDs.
47
- * Deduplicates while preserving order.
48
- */
49
- export function parseReviewedPrNumbers(raw) {
50
- if (!raw || raw.trim().length === 0) {
51
- return [];
52
- }
53
- const seen = new Set();
54
- return raw
55
- .split(',')
56
- .map((token) => parseInt(token.trim().replace(/^#/, ''), 10))
57
- .filter((value) => !Number.isNaN(value))
58
- .filter((value) => {
59
- if (seen.has(value)) {
60
- return false;
61
- }
62
- seen.add(value);
63
- return true;
64
- });
65
- }
66
- /**
67
- * Build per-PR review notification targets from the script result payload.
68
- * Legacy no_changes_needed is only trustworthy when exactly one PR was reviewed.
69
- */
70
- export function buildReviewNotificationTargets(reviewedPrNumbers, noChangesPrNumbers, legacyNoChangesNeeded = false) {
71
- const uniqueReviewedPrNumbers = Array.from(new Set(reviewedPrNumbers));
72
- const noChangesSet = new Set(noChangesPrNumbers);
73
- if (legacyNoChangesNeeded && uniqueReviewedPrNumbers.length === 1) {
74
- noChangesSet.add(uniqueReviewedPrNumbers[0]);
75
- }
76
- return uniqueReviewedPrNumbers.map((prNumber) => ({
77
- prNumber,
78
- noChangesNeeded: noChangesSet.has(prNumber),
79
- }));
80
- }
81
- /**
82
- * Parse retry attempts from script result data.
83
- * Returns the number of attempts (defaults to 1 if not present or invalid).
84
- */
85
- export function parseRetryAttempts(raw) {
86
- if (!raw) {
87
- return 1;
88
- }
89
- const parsed = parseInt(raw, 10);
90
- return Number.isNaN(parsed) || parsed < 1 ? 1 : parsed;
91
- }
92
- /**
93
- * Parse final review score from script result data.
94
- * Returns undefined when missing or invalid.
95
- */
96
- export function parseFinalReviewScore(raw) {
97
- if (!raw) {
98
- return undefined;
99
- }
100
- const parsed = parseInt(raw, 10);
101
- if (Number.isNaN(parsed)) {
102
- return undefined;
103
- }
104
- return parsed;
105
- }
106
- /**
107
- * Post a "ready for human review" comment and add a label to the PR.
108
- * Silently ignores failures — gh CLI may not be available.
109
- */
110
- export function postReadyForHumanReviewComment(prNumber, finalScore, cwd) {
111
- const scoreNote = finalScore !== undefined ? ` (score: ${finalScore}/100)` : '';
112
- const body = `## ✅ Ready for Human Review\n\n` +
113
- `Night Watch has reviewed this PR${scoreNote} and found no issues requiring automated fixes.\n\n` +
114
- `This PR is ready for human code review and merge.`;
115
- try {
116
- execFileSync('gh', ['pr', 'comment', String(prNumber), '--body', body], {
117
- cwd,
118
- encoding: 'utf-8',
119
- stdio: ['pipe', 'pipe', 'pipe'],
120
- });
121
- }
122
- catch {
123
- // gh CLI unavailable or not authenticated — ignore
124
- }
125
- try {
126
- execFileSync('gh', ['pr', 'edit', String(prNumber), '--add-label', 'ready-for-review'], {
127
- cwd,
128
- encoding: 'utf-8',
129
- stdio: ['pipe', 'pipe', 'pipe'],
130
- });
131
- }
132
- catch {
133
- // Label may not exist yet — ignore
134
- }
135
- }
136
- /**
137
- * Build environment variables map from config and CLI options for reviewer
138
- */
139
- export function buildEnvVars(config, options) {
140
- // Start with base env vars shared by all job types
141
- const env = buildBaseEnvVars(config, 'reviewer', options.dryRun);
142
- // Runtime for reviewer (uses NW_REVIEWER_* variables)
143
- env.NW_REVIEWER_MAX_RUNTIME = String(config.reviewerMaxRuntime);
144
- env.NW_REVIEWER_MAX_RETRIES = String(config.reviewerMaxRetries);
145
- env.NW_REVIEWER_RETRY_DELAY = String(config.reviewerRetryDelay);
146
- env.NW_REVIEWER_MAX_PRS_PER_RUN = String(config.reviewerMaxPrsPerRun);
147
- env.NW_MIN_REVIEW_SCORE = String(config.minReviewScore);
148
- env.NW_BRANCH_PATTERNS = config.branchPatterns.join(',');
149
- env.NW_PRD_DIR = config.prdDir;
150
- env.NW_CLAUDE_MODEL_ID =
151
- CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
152
- return env;
153
- }
154
- /**
155
- * Apply CLI flag overrides to the config for reviewer
156
- */
157
- export function applyCliOverrides(config, options) {
158
- const overridden = { ...config };
159
- if (options.timeout) {
160
- const timeout = parseInt(options.timeout, 10);
161
- if (!isNaN(timeout)) {
162
- overridden.reviewerMaxRuntime = timeout;
163
- }
164
- }
165
- if (options.provider) {
166
- // Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
167
- overridden._cliProviderOverride = options.provider;
168
- }
169
- return overridden;
170
- }
171
- /**
172
- * Whether a GitHub check entry should be treated as failing/action-required.
173
- */
174
- export function isFailingCheck(check) {
175
- const bucket = (check.bucket ?? '').toLowerCase();
176
- const state = (check.state ?? '').toLowerCase();
177
- const conclusion = (check.conclusion ?? '').toLowerCase();
178
- return (bucket === 'fail' ||
179
- bucket === 'cancel' ||
180
- state === 'failure' ||
181
- state === 'error' ||
182
- state === 'cancelled' ||
183
- conclusion === 'failure' ||
184
- conclusion === 'error' ||
185
- conclusion === 'cancelled' ||
186
- conclusion === 'timed_out' ||
187
- conclusion === 'action_required' ||
188
- conclusion === 'startup_failure' ||
189
- conclusion === 'stale');
190
- }
191
- /**
192
- * Get a human-readable list of failing checks for a PR.
193
- */
194
- export function getPrFailingChecks(prNumber) {
195
- try {
196
- const result = execFileSync('gh', ['pr', 'checks', String(prNumber), '--json', 'name,bucket,state,conclusion'], {
197
- encoding: 'utf-8',
198
- stdio: ['pipe', 'pipe', 'pipe'],
199
- });
200
- const checks = JSON.parse(result.trim() || '[]');
201
- const failing = checks
202
- .filter((check) => isFailingCheck(check))
203
- .map((check) => `${check.name ?? 'unknown'} [state=${check.state ?? 'unknown'}, conclusion=${check.conclusion ?? 'unknown'}]`);
204
- if (failing.length > 0) {
205
- return failing;
206
- }
207
- }
208
- catch {
209
- // Fall through to text-mode fallback.
210
- }
211
- try {
212
- const result = execFileSync('gh', ['pr', 'checks', String(prNumber)], {
213
- encoding: 'utf-8',
214
- stdio: ['pipe', 'pipe', 'pipe'],
215
- });
216
- return result
217
- .split('\n')
218
- .map((line) => line.trim())
219
- .filter((line) => line.length > 0)
220
- .filter((line) => /fail|error|cancel|timed[_ -]?out|action_required|startup_failure|stale/i.test(line));
221
- }
222
- catch {
223
- return [];
224
- }
225
- }
226
- /**
227
- * Get open PRs that need work (matching branch patterns)
228
- */
229
- function getOpenPrsNeedingWork(branchPatterns) {
230
- try {
231
- // Build args array for safe shell execution
232
- const args = ['pr', 'list', '--state', 'open', '--json', 'number,title,headRefName'];
233
- for (const pattern of branchPatterns) {
234
- args.push('--head', pattern);
235
- }
236
- // Get open PRs as JSON using execFileSync for safe argument handling
237
- const result = execFileSync('gh', args, {
238
- encoding: 'utf-8',
239
- stdio: ['pipe', 'pipe', 'pipe'],
240
- });
241
- const prs = JSON.parse(result.trim() || '[]');
242
- return prs.map((pr) => ({
243
- number: pr.number,
244
- title: pr.title,
245
- branch: pr.headRefName,
246
- }));
247
- }
248
- catch {
249
- // gh CLI not available or not authenticated
250
- return [];
251
- }
252
- }
253
- /**
254
- * Register the review command with the program
255
- */
256
- export function reviewCommand(program) {
257
- program
258
- .command('review')
259
- .description('Run PR reviewer now')
260
- .option('--dry-run', 'Show what would be executed without running')
261
- .option('--timeout <seconds>', 'Override max runtime in seconds for reviewer')
262
- .option('--provider <string>', 'AI provider to use (claude or codex)')
263
- .action(async (options) => {
264
- // Get the project directory (current working directory)
265
- const projectDir = process.cwd();
266
- // Load config from file and environment
267
- let config = loadConfig(projectDir);
268
- // Apply CLI flag overrides
269
- config = applyCliOverrides(config, options);
270
- if (!config.reviewerEnabled && !options.dryRun) {
271
- info('Reviewer is disabled in config; skipping review.');
272
- process.exit(0);
273
- }
274
- // Build environment variables
275
- const envVars = buildEnvVars(config, options);
276
- // Get the script path
277
- const scriptPath = getScriptPath('night-watch-pr-reviewer-cron.sh');
278
- if (options.dryRun) {
279
- header('Dry Run: PR Reviewer');
280
- // Resolve reviewer-specific provider
281
- const reviewerProvider = resolveJobProvider(config, 'reviewer');
282
- // Configuration section with table
283
- header('Configuration');
284
- const configTable = createTable({ head: ['Setting', 'Value'] });
285
- configTable.push(['Provider', reviewerProvider]);
286
- configTable.push(['Provider CLI', PROVIDER_COMMANDS[reviewerProvider]]);
287
- configTable.push([
288
- 'Max Runtime',
289
- `${config.reviewerMaxRuntime}s (${Math.floor(config.reviewerMaxRuntime / 60)}min)`,
290
- ]);
291
- configTable.push(['Min Review Score', `${config.minReviewScore}/100`]);
292
- configTable.push(['Branch Patterns', config.branchPatterns.join(', ')]);
293
- configTable.push(['Max Retry Attempts', String(config.reviewerMaxRetries)]);
294
- configTable.push(['Retry Delay', `${config.reviewerRetryDelay}s`]);
295
- configTable.push([
296
- 'Max PRs Per Run',
297
- config.reviewerMaxPrsPerRun === 0 ? 'Unlimited' : String(config.reviewerMaxPrsPerRun),
298
- ]);
299
- console.log(configTable.toString());
300
- // Check for open PRs needing work
301
- header('Open PRs Needing Work');
302
- const openPrs = getOpenPrsNeedingWork(config.branchPatterns);
303
- if (openPrs.length === 0) {
304
- dim(' (no open PRs matching branch patterns)');
305
- }
306
- else {
307
- for (const pr of openPrs) {
308
- info(`#${pr.number}: ${pr.title}`);
309
- dim(` Branch: ${pr.branch}`);
310
- }
311
- }
312
- // Provider invocation command
313
- header('Provider Invocation');
314
- if (reviewerProvider === 'claude') {
315
- dim(' claude -p "/night-watch-pr-reviewer" --dangerously-skip-permissions');
316
- }
317
- else {
318
- dim(' codex exec --yolo "/night-watch-pr-reviewer"');
319
- }
320
- // Environment variables
321
- header('Environment Variables');
322
- for (const [key, value] of Object.entries(envVars)) {
323
- dim(` ${key}=${value}`);
324
- }
325
- // Full command that would be executed
326
- header('Command');
327
- dim(` bash ${scriptPath} ${projectDir}`);
328
- console.log();
329
- process.exit(0);
330
- }
331
- // Preflight visibility: show currently failing checks before the fixer runs.
332
- const preflightOpenPrs = getOpenPrsNeedingWork(config.branchPatterns);
333
- const preflightFailures = preflightOpenPrs
334
- .map((pr) => ({
335
- prNumber: pr.number,
336
- title: pr.title,
337
- failingChecks: getPrFailingChecks(pr.number),
338
- }))
339
- .filter((entry) => entry.failingChecks.length > 0);
340
- if (preflightFailures.length > 0) {
341
- header('Preflight Failing Checks');
342
- for (const entry of preflightFailures) {
343
- info(`#${entry.prNumber}: ${entry.title}`);
344
- for (const check of entry.failingChecks) {
345
- dim(` ${check}`);
346
- }
347
- }
348
- }
349
- // Execute the script with spinner
350
- const spinner = createSpinner('Running PR reviewer...');
351
- spinner.start();
352
- try {
353
- await maybeApplyCronSchedulingDelay(config, 'reviewer', projectDir);
354
- const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
355
- const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
356
- if (exitCode === 0) {
357
- if (scriptResult?.status === 'queued') {
358
- spinner.succeed('PR reviewer queued — another job is currently running');
359
- }
360
- else if (scriptResult?.status?.startsWith('skip_')) {
361
- spinner.succeed('PR reviewer completed (no PRs needed review)');
362
- }
363
- else {
364
- spinner.succeed('PR reviewer completed successfully');
365
- }
366
- }
367
- else {
368
- spinner.fail(`PR reviewer exited with code ${exitCode}`);
369
- }
370
- // Send notifications (fire-and-forget, failures do not affect exit code)
371
- if (!options.dryRun) {
372
- const shouldNotifyCompletion = shouldSendReviewCompletionNotification(exitCode, scriptResult?.status);
373
- if (!shouldNotifyCompletion) {
374
- info('Skipping review completion notification (review did not complete successfully)');
375
- }
376
- // Enrich with PR details (graceful — null if gh fails)
377
- let fallbackPrDetails = null;
378
- if (shouldNotifyCompletion) {
379
- const reviewedPrNumbers = parseReviewedPrNumbers(scriptResult?.data.prs);
380
- const firstReviewedPrNumber = reviewedPrNumbers[0];
381
- if (firstReviewedPrNumber !== undefined) {
382
- fallbackPrDetails = fetchPrDetailsByNumber(firstReviewedPrNumber, projectDir);
383
- }
384
- if (!fallbackPrDetails) {
385
- fallbackPrDetails = fetchReviewedPrDetails(config.branchPatterns, projectDir);
386
- }
387
- }
388
- if (shouldNotifyCompletion) {
389
- // Extract retry attempts from script result
390
- const attempts = parseRetryAttempts(scriptResult?.data.attempts);
391
- const finalScore = parseFinalReviewScore(scriptResult?.data.final_score);
392
- const legacyNoChangesNeeded = scriptResult?.data.no_changes_needed === '1';
393
- const reviewedPrNumbers = parseReviewedPrNumbers(scriptResult?.data.prs);
394
- const noChangesPrNumbers = parseReviewedPrNumbers(scriptResult?.data.no_changes_prs);
395
- const fallbackPrNumber = fallbackPrDetails?.number;
396
- const notificationTargets = buildReviewNotificationTargets(reviewedPrNumbers.length > 0
397
- ? reviewedPrNumbers
398
- : fallbackPrNumber !== undefined
399
- ? [fallbackPrNumber]
400
- : [], noChangesPrNumbers, legacyNoChangesNeeded);
401
- if (notificationTargets.length === 0) {
402
- const reviewEvent = legacyNoChangesNeeded
403
- ? 'review_ready_for_human'
404
- : 'review_completed';
405
- await sendNotifications(config, {
406
- event: reviewEvent,
407
- projectName: path.basename(projectDir),
408
- exitCode,
409
- provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
410
- prUrl: fallbackPrDetails?.url,
411
- prTitle: fallbackPrDetails?.title,
412
- prBody: fallbackPrDetails?.body,
413
- prNumber: fallbackPrDetails?.number,
414
- filesChanged: fallbackPrDetails?.changedFiles,
415
- additions: fallbackPrDetails?.additions,
416
- deletions: fallbackPrDetails?.deletions,
417
- attempts,
418
- finalScore,
419
- });
420
- }
421
- else {
422
- for (const target of notificationTargets) {
423
- const prDetails = fallbackPrDetails?.number === target.prNumber
424
- ? fallbackPrDetails
425
- : fetchPrDetailsByNumber(target.prNumber, projectDir);
426
- if (target.noChangesNeeded && prDetails?.number) {
427
- postReadyForHumanReviewComment(prDetails.number, finalScore, projectDir);
428
- }
429
- const reviewEvent = target.noChangesNeeded
430
- ? 'review_ready_for_human'
431
- : 'review_completed';
432
- await sendNotifications(config, {
433
- event: reviewEvent,
434
- projectName: path.basename(projectDir),
435
- exitCode,
436
- provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
437
- prUrl: prDetails?.url,
438
- prTitle: prDetails?.title,
439
- prBody: prDetails?.body,
440
- prNumber: prDetails?.number ?? target.prNumber,
441
- filesChanged: prDetails?.changedFiles,
442
- additions: prDetails?.additions,
443
- deletions: prDetails?.deletions,
444
- attempts,
445
- finalScore,
446
- });
447
- }
448
- }
449
- }
450
- const autoMergedPrNumbers = parseAutoMergedPrNumbers(scriptResult?.data.auto_merged);
451
- if (autoMergedPrNumbers.length > 0) {
452
- const autoMergedPrNumber = autoMergedPrNumbers[0];
453
- const autoMergedPrDetails = fetchPrDetailsByNumber(autoMergedPrNumber, projectDir);
454
- const _mergeCtx = {
455
- event: 'pr_auto_merged',
456
- projectName: path.basename(projectDir),
457
- exitCode,
458
- provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
459
- prNumber: autoMergedPrDetails?.number ?? autoMergedPrNumber,
460
- prUrl: autoMergedPrDetails?.url,
461
- prTitle: autoMergedPrDetails?.title,
462
- prBody: autoMergedPrDetails?.body,
463
- filesChanged: autoMergedPrDetails?.changedFiles,
464
- additions: autoMergedPrDetails?.additions,
465
- deletions: autoMergedPrDetails?.deletions,
466
- };
467
- await sendNotifications(config, _mergeCtx);
468
- }
469
- }
470
- process.exit(exitCode);
471
- }
472
- catch (err) {
473
- spinner.fail('Failed to execute review command');
474
- uiError(`${err instanceof Error ? err.message : String(err)}`);
475
- process.exit(1);
476
- }
477
- });
478
- }
479
- //# sourceMappingURL=review.js.map