@jonit-dev/night-watch-cli 1.8.11 → 1.8.12-beta.1

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 (120) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.js +2363 -1382
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/analytics.d.ts +14 -0
  5. package/dist/commands/analytics.js +69 -0
  6. package/dist/commands/analytics.js.map +1 -0
  7. package/dist/commands/audit.d.ts +19 -0
  8. package/dist/commands/audit.js +144 -0
  9. package/dist/commands/audit.js.map +1 -0
  10. package/dist/commands/board.d.ts +9 -0
  11. package/dist/commands/board.js +702 -0
  12. package/dist/commands/board.js.map +1 -0
  13. package/dist/commands/cancel.d.ts +46 -0
  14. package/dist/commands/cancel.js +239 -0
  15. package/dist/commands/cancel.js.map +1 -0
  16. package/dist/commands/cron.d.ts +8 -0
  17. package/dist/commands/cron.js +134 -0
  18. package/dist/commands/cron.js.map +1 -0
  19. package/dist/commands/dashboard/tab-actions.d.ts +10 -0
  20. package/dist/commands/dashboard/tab-actions.js +247 -0
  21. package/dist/commands/dashboard/tab-actions.js.map +1 -0
  22. package/dist/commands/dashboard/tab-config.d.ts +21 -0
  23. package/dist/commands/dashboard/tab-config.js +874 -0
  24. package/dist/commands/dashboard/tab-config.js.map +1 -0
  25. package/dist/commands/dashboard/tab-logs.d.ts +10 -0
  26. package/dist/commands/dashboard/tab-logs.js +202 -0
  27. package/dist/commands/dashboard/tab-logs.js.map +1 -0
  28. package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
  29. package/dist/commands/dashboard/tab-schedules.js +320 -0
  30. package/dist/commands/dashboard/tab-schedules.js.map +1 -0
  31. package/dist/commands/dashboard/tab-status.d.ts +32 -0
  32. package/dist/commands/dashboard/tab-status.js +424 -0
  33. package/dist/commands/dashboard/tab-status.js.map +1 -0
  34. package/dist/commands/dashboard/types.d.ts +42 -0
  35. package/dist/commands/dashboard/types.js +5 -0
  36. package/dist/commands/dashboard/types.js.map +1 -0
  37. package/dist/commands/dashboard.d.ts +11 -0
  38. package/dist/commands/dashboard.js +242 -0
  39. package/dist/commands/dashboard.js.map +1 -0
  40. package/dist/commands/doctor.d.ts +16 -0
  41. package/dist/commands/doctor.js +195 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/history.d.ts +7 -0
  44. package/dist/commands/history.js +49 -0
  45. package/dist/commands/history.js.map +1 -0
  46. package/dist/commands/init.d.ts +45 -0
  47. package/dist/commands/install.d.ts +65 -0
  48. package/dist/commands/install.js +405 -0
  49. package/dist/commands/install.js.map +1 -0
  50. package/dist/commands/logs.d.ts +15 -0
  51. package/dist/commands/logs.js +155 -0
  52. package/dist/commands/logs.js.map +1 -0
  53. package/dist/commands/merge.d.ts +26 -0
  54. package/dist/commands/merge.js +159 -0
  55. package/dist/commands/merge.js.map +1 -0
  56. package/dist/commands/notify.d.ts +7 -0
  57. package/dist/commands/notify.js +43 -0
  58. package/dist/commands/notify.js.map +1 -0
  59. package/dist/commands/plan.d.ts +19 -0
  60. package/dist/commands/plan.js +88 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/prd-state.d.ts +12 -0
  63. package/dist/commands/prd-state.js +47 -0
  64. package/dist/commands/prd-state.js.map +1 -0
  65. package/dist/commands/prd.d.ts +18 -0
  66. package/dist/commands/prd.js +363 -0
  67. package/dist/commands/prd.js.map +1 -0
  68. package/dist/commands/prds.d.ts +13 -0
  69. package/dist/commands/prds.js +194 -0
  70. package/dist/commands/prds.js.map +1 -0
  71. package/dist/commands/prs.d.ts +14 -0
  72. package/dist/commands/prs.js +104 -0
  73. package/dist/commands/prs.js.map +1 -0
  74. package/dist/commands/qa.d.ts +34 -0
  75. package/dist/commands/qa.js +214 -0
  76. package/dist/commands/qa.js.map +1 -0
  77. package/dist/commands/queue.d.ts +8 -0
  78. package/dist/commands/queue.js +378 -0
  79. package/dist/commands/queue.js.map +1 -0
  80. package/dist/commands/resolve.d.ts +26 -0
  81. package/dist/commands/resolve.js +186 -0
  82. package/dist/commands/resolve.js.map +1 -0
  83. package/dist/commands/retry.d.ts +9 -0
  84. package/dist/commands/retry.js +71 -0
  85. package/dist/commands/retry.js.map +1 -0
  86. package/dist/commands/review.d.ts +77 -0
  87. package/dist/commands/review.d.ts.map +1 -1
  88. package/dist/commands/review.js +447 -0
  89. package/dist/commands/review.js.map +1 -0
  90. package/dist/commands/run.d.ts +73 -0
  91. package/dist/commands/serve.d.ts +19 -0
  92. package/dist/commands/serve.js +142 -0
  93. package/dist/commands/serve.js.map +1 -0
  94. package/dist/commands/shared/env-builder.d.ts +49 -0
  95. package/dist/commands/shared/env-builder.js +151 -0
  96. package/dist/commands/shared/env-builder.js.map +1 -0
  97. package/dist/commands/slice.d.ts +35 -0
  98. package/dist/commands/slice.js +316 -0
  99. package/dist/commands/slice.js.map +1 -0
  100. package/dist/commands/state.d.ts +8 -0
  101. package/dist/commands/state.js +54 -0
  102. package/dist/commands/state.js.map +1 -0
  103. package/dist/commands/status.d.ts +14 -0
  104. package/dist/commands/status.js +297 -0
  105. package/dist/commands/status.js.map +1 -0
  106. package/dist/commands/summary.d.ts +14 -0
  107. package/dist/commands/summary.js +193 -0
  108. package/dist/commands/summary.js.map +1 -0
  109. package/dist/commands/uninstall.d.ts +25 -0
  110. package/dist/commands/uninstall.js +134 -0
  111. package/dist/commands/uninstall.js.map +1 -0
  112. package/dist/commands/update.d.ts +22 -0
  113. package/dist/commands/update.js +90 -0
  114. package/dist/commands/update.js.map +1 -0
  115. package/dist/scripts/night-watch-pr-reviewer-cron.sh +146 -32
  116. package/dist/templates/night-watch.config.json +1 -21
  117. package/package.json +1 -1
  118. package/dist/web/assets/index-B6E6kOoR.js +0 -406
  119. package/dist/web/assets/index-DIMUXIP8.css +0 -1
  120. package/dist/web/assets/index-NR27JE3b.js +0 -406
@@ -0,0 +1,71 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,77 @@
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
+ * Build environment variables map from config and CLI options for reviewer
52
+ */
53
+ export declare function buildEnvVars(config: INightWatchConfig, options: IReviewOptions): Record<string, string>;
54
+ /**
55
+ * Apply CLI flag overrides to the config for reviewer
56
+ */
57
+ export declare function applyCliOverrides(config: INightWatchConfig, options: IReviewOptions): INightWatchConfig;
58
+ interface ICheckStatus {
59
+ name?: string;
60
+ bucket?: string;
61
+ state?: string;
62
+ conclusion?: string;
63
+ }
64
+ /**
65
+ * Whether a GitHub check entry should be treated as failing/action-required.
66
+ */
67
+ export declare function isFailingCheck(check: ICheckStatus): boolean;
68
+ /**
69
+ * Get a human-readable list of failing checks for a PR.
70
+ */
71
+ export declare function getPrFailingChecks(prNumber: number): string[];
72
+ /**
73
+ * Register the review command with the program
74
+ */
75
+ export declare function reviewCommand(program: Command): void;
76
+ export {};
77
+ //# sourceMappingURL=review.d.ts.map
@@ -1 +1 @@
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
+ {"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;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,cAAc,GACtB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBxB;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,CA+PpD"}
@@ -0,0 +1,447 @@
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
+ * Build environment variables map from config and CLI options for reviewer
108
+ */
109
+ export function buildEnvVars(config, options) {
110
+ // Start with base env vars shared by all job types
111
+ const env = buildBaseEnvVars(config, 'reviewer', options.dryRun);
112
+ // Runtime for reviewer (uses NW_REVIEWER_* variables)
113
+ env.NW_REVIEWER_MAX_RUNTIME = String(config.reviewerMaxRuntime);
114
+ env.NW_REVIEWER_MAX_RETRIES = String(config.reviewerMaxRetries);
115
+ env.NW_REVIEWER_RETRY_DELAY = String(config.reviewerRetryDelay);
116
+ env.NW_REVIEWER_MAX_PRS_PER_RUN = String(config.reviewerMaxPrsPerRun);
117
+ env.NW_MIN_REVIEW_SCORE = String(config.minReviewScore);
118
+ env.NW_BRANCH_PATTERNS = config.branchPatterns.join(',');
119
+ env.NW_PRD_DIR = config.prdDir;
120
+ env.NW_PR_RESOLVER_READY_LABEL = config.prResolver.readyLabel;
121
+ env.NW_CLAUDE_MODEL_ID =
122
+ CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
123
+ return env;
124
+ }
125
+ /**
126
+ * Apply CLI flag overrides to the config for reviewer
127
+ */
128
+ export function applyCliOverrides(config, options) {
129
+ const overridden = { ...config };
130
+ if (options.timeout) {
131
+ const timeout = parseInt(options.timeout, 10);
132
+ if (!isNaN(timeout)) {
133
+ overridden.reviewerMaxRuntime = timeout;
134
+ }
135
+ }
136
+ if (options.provider) {
137
+ // Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
138
+ overridden._cliProviderOverride = options.provider;
139
+ }
140
+ return overridden;
141
+ }
142
+ /**
143
+ * Whether a GitHub check entry should be treated as failing/action-required.
144
+ */
145
+ export function isFailingCheck(check) {
146
+ const bucket = (check.bucket ?? '').toLowerCase();
147
+ const state = (check.state ?? '').toLowerCase();
148
+ const conclusion = (check.conclusion ?? '').toLowerCase();
149
+ return (bucket === 'fail' ||
150
+ bucket === 'cancel' ||
151
+ state === 'failure' ||
152
+ state === 'error' ||
153
+ state === 'cancelled' ||
154
+ conclusion === 'failure' ||
155
+ conclusion === 'error' ||
156
+ conclusion === 'cancelled' ||
157
+ conclusion === 'timed_out' ||
158
+ conclusion === 'action_required' ||
159
+ conclusion === 'startup_failure' ||
160
+ conclusion === 'stale');
161
+ }
162
+ /**
163
+ * Get a human-readable list of failing checks for a PR.
164
+ */
165
+ export function getPrFailingChecks(prNumber) {
166
+ try {
167
+ const result = execFileSync('gh', ['pr', 'checks', String(prNumber), '--json', 'name,bucket,state,conclusion'], {
168
+ encoding: 'utf-8',
169
+ stdio: ['pipe', 'pipe', 'pipe'],
170
+ });
171
+ const checks = JSON.parse(result.trim() || '[]');
172
+ const failing = checks
173
+ .filter((check) => isFailingCheck(check))
174
+ .map((check) => `${check.name ?? 'unknown'} [state=${check.state ?? 'unknown'}, conclusion=${check.conclusion ?? 'unknown'}]`);
175
+ if (failing.length > 0) {
176
+ return failing;
177
+ }
178
+ }
179
+ catch {
180
+ // Fall through to text-mode fallback.
181
+ }
182
+ try {
183
+ const result = execFileSync('gh', ['pr', 'checks', String(prNumber)], {
184
+ encoding: 'utf-8',
185
+ stdio: ['pipe', 'pipe', 'pipe'],
186
+ });
187
+ return result
188
+ .split('\n')
189
+ .map((line) => line.trim())
190
+ .filter((line) => line.length > 0)
191
+ .filter((line) => /fail|error|cancel|timed[_ -]?out|action_required|startup_failure|stale/i.test(line));
192
+ }
193
+ catch {
194
+ return [];
195
+ }
196
+ }
197
+ /**
198
+ * Get open PRs that need work (matching branch patterns)
199
+ */
200
+ function getOpenPrsNeedingWork(branchPatterns) {
201
+ try {
202
+ // Build args array for safe shell execution
203
+ const args = ['pr', 'list', '--state', 'open', '--json', 'number,title,headRefName'];
204
+ for (const pattern of branchPatterns) {
205
+ args.push('--head', pattern);
206
+ }
207
+ // Get open PRs as JSON using execFileSync for safe argument handling
208
+ const result = execFileSync('gh', args, {
209
+ encoding: 'utf-8',
210
+ stdio: ['pipe', 'pipe', 'pipe'],
211
+ });
212
+ const prs = JSON.parse(result.trim() || '[]');
213
+ return prs.map((pr) => ({
214
+ number: pr.number,
215
+ title: pr.title,
216
+ branch: pr.headRefName,
217
+ }));
218
+ }
219
+ catch {
220
+ // gh CLI not available or not authenticated
221
+ return [];
222
+ }
223
+ }
224
+ /**
225
+ * Register the review command with the program
226
+ */
227
+ export function reviewCommand(program) {
228
+ program
229
+ .command('review')
230
+ .description('Run PR reviewer now')
231
+ .option('--dry-run', 'Show what would be executed without running')
232
+ .option('--timeout <seconds>', 'Override max runtime in seconds for reviewer')
233
+ .option('--provider <string>', 'AI provider to use (claude or codex)')
234
+ .action(async (options) => {
235
+ // Get the project directory (current working directory)
236
+ const projectDir = process.cwd();
237
+ // Load config from file and environment
238
+ let config = loadConfig(projectDir);
239
+ // Apply CLI flag overrides
240
+ config = applyCliOverrides(config, options);
241
+ if (!config.reviewerEnabled && !options.dryRun) {
242
+ info('Reviewer is disabled in config; skipping review.');
243
+ process.exit(0);
244
+ }
245
+ // Build environment variables
246
+ const envVars = buildEnvVars(config, options);
247
+ // Get the script path
248
+ const scriptPath = getScriptPath('night-watch-pr-reviewer-cron.sh');
249
+ if (options.dryRun) {
250
+ header('Dry Run: PR Reviewer');
251
+ // Resolve reviewer-specific provider
252
+ const reviewerProvider = resolveJobProvider(config, 'reviewer');
253
+ // Configuration section with table
254
+ header('Configuration');
255
+ const configTable = createTable({ head: ['Setting', 'Value'] });
256
+ configTable.push(['Provider', reviewerProvider]);
257
+ configTable.push(['Provider CLI', PROVIDER_COMMANDS[reviewerProvider]]);
258
+ configTable.push([
259
+ 'Max Runtime',
260
+ `${config.reviewerMaxRuntime}s (${Math.floor(config.reviewerMaxRuntime / 60)}min)`,
261
+ ]);
262
+ configTable.push(['Min Review Score', `${config.minReviewScore}/100`]);
263
+ configTable.push(['Branch Patterns', config.branchPatterns.join(', ')]);
264
+ configTable.push(['Max Retry Attempts', String(config.reviewerMaxRetries)]);
265
+ configTable.push(['Retry Delay', `${config.reviewerRetryDelay}s`]);
266
+ configTable.push([
267
+ 'Max PRs Per Run',
268
+ config.reviewerMaxPrsPerRun === 0 ? 'Unlimited' : String(config.reviewerMaxPrsPerRun),
269
+ ]);
270
+ console.log(configTable.toString());
271
+ // Check for open PRs needing work
272
+ header('Open PRs Needing Work');
273
+ const openPrs = getOpenPrsNeedingWork(config.branchPatterns);
274
+ if (openPrs.length === 0) {
275
+ dim(' (no open PRs matching branch patterns)');
276
+ }
277
+ else {
278
+ for (const pr of openPrs) {
279
+ info(`#${pr.number}: ${pr.title}`);
280
+ dim(` Branch: ${pr.branch}`);
281
+ }
282
+ }
283
+ // Provider invocation command
284
+ header('Provider Invocation');
285
+ if (reviewerProvider === 'claude') {
286
+ dim(' claude -p "/night-watch-pr-reviewer" --dangerously-skip-permissions');
287
+ }
288
+ else {
289
+ dim(' codex exec --yolo "/night-watch-pr-reviewer"');
290
+ }
291
+ // Environment variables
292
+ header('Environment Variables');
293
+ for (const [key, value] of Object.entries(envVars)) {
294
+ dim(` ${key}=${value}`);
295
+ }
296
+ // Full command that would be executed
297
+ header('Command');
298
+ dim(` bash ${scriptPath} ${projectDir}`);
299
+ console.log();
300
+ process.exit(0);
301
+ }
302
+ // Preflight visibility: show currently failing checks before the fixer runs.
303
+ const preflightOpenPrs = getOpenPrsNeedingWork(config.branchPatterns);
304
+ const preflightFailures = preflightOpenPrs
305
+ .map((pr) => ({
306
+ prNumber: pr.number,
307
+ title: pr.title,
308
+ failingChecks: getPrFailingChecks(pr.number),
309
+ }))
310
+ .filter((entry) => entry.failingChecks.length > 0);
311
+ if (preflightFailures.length > 0) {
312
+ header('Preflight Failing Checks');
313
+ for (const entry of preflightFailures) {
314
+ info(`#${entry.prNumber}: ${entry.title}`);
315
+ for (const check of entry.failingChecks) {
316
+ dim(` ${check}`);
317
+ }
318
+ }
319
+ }
320
+ // Execute the script with spinner
321
+ const spinner = createSpinner('Running PR reviewer...');
322
+ spinner.start();
323
+ try {
324
+ await maybeApplyCronSchedulingDelay(config, 'reviewer', projectDir);
325
+ const { exitCode, stdout, stderr } = await executeScriptWithOutput(scriptPath, [projectDir], envVars);
326
+ const scriptResult = parseScriptResult(`${stdout}\n${stderr}`);
327
+ if (exitCode === 0) {
328
+ if (scriptResult?.status === 'queued') {
329
+ spinner.succeed('PR reviewer queued — another job is currently running');
330
+ }
331
+ else if (scriptResult?.status?.startsWith('skip_')) {
332
+ spinner.succeed('PR reviewer completed (no PRs needed review)');
333
+ }
334
+ else {
335
+ spinner.succeed('PR reviewer completed successfully');
336
+ }
337
+ }
338
+ else {
339
+ spinner.fail(`PR reviewer exited with code ${exitCode}`);
340
+ }
341
+ // Send notifications (fire-and-forget, failures do not affect exit code)
342
+ if (!options.dryRun) {
343
+ const shouldNotifyCompletion = shouldSendReviewCompletionNotification(exitCode, scriptResult?.status);
344
+ if (!shouldNotifyCompletion) {
345
+ info('Skipping review completion notification (review did not complete successfully)');
346
+ }
347
+ // Enrich with PR details (graceful — null if gh fails)
348
+ let fallbackPrDetails = null;
349
+ if (shouldNotifyCompletion) {
350
+ const reviewedPrNumbers = parseReviewedPrNumbers(scriptResult?.data.prs);
351
+ const firstReviewedPrNumber = reviewedPrNumbers[0];
352
+ if (firstReviewedPrNumber !== undefined) {
353
+ fallbackPrDetails = fetchPrDetailsByNumber(firstReviewedPrNumber, projectDir);
354
+ }
355
+ if (!fallbackPrDetails) {
356
+ fallbackPrDetails = fetchReviewedPrDetails(config.branchPatterns, projectDir);
357
+ }
358
+ }
359
+ if (shouldNotifyCompletion) {
360
+ // Extract retry attempts from script result
361
+ const attempts = parseRetryAttempts(scriptResult?.data.attempts);
362
+ const finalScore = parseFinalReviewScore(scriptResult?.data.final_score);
363
+ const legacyNoChangesNeeded = scriptResult?.data.no_changes_needed === '1';
364
+ const reviewedPrNumbers = parseReviewedPrNumbers(scriptResult?.data.prs);
365
+ const noChangesPrNumbers = parseReviewedPrNumbers(scriptResult?.data.no_changes_prs);
366
+ const fallbackPrNumber = fallbackPrDetails?.number;
367
+ let notificationPrNumbers = reviewedPrNumbers;
368
+ if (notificationPrNumbers.length === 0 && fallbackPrNumber !== undefined) {
369
+ notificationPrNumbers = [fallbackPrNumber];
370
+ }
371
+ const notificationTargets = buildReviewNotificationTargets(notificationPrNumbers, noChangesPrNumbers, legacyNoChangesNeeded);
372
+ if (notificationTargets.length === 0) {
373
+ const reviewEvent = legacyNoChangesNeeded
374
+ ? 'review_ready_for_human'
375
+ : 'review_completed';
376
+ await sendNotifications(config, {
377
+ event: reviewEvent,
378
+ projectName: path.basename(projectDir),
379
+ exitCode,
380
+ provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
381
+ prUrl: fallbackPrDetails?.url,
382
+ prTitle: fallbackPrDetails?.title,
383
+ prBody: fallbackPrDetails?.body,
384
+ prNumber: fallbackPrDetails?.number,
385
+ filesChanged: fallbackPrDetails?.changedFiles,
386
+ additions: fallbackPrDetails?.additions,
387
+ deletions: fallbackPrDetails?.deletions,
388
+ attempts,
389
+ finalScore,
390
+ });
391
+ }
392
+ else {
393
+ for (const target of notificationTargets) {
394
+ const prDetails = fallbackPrDetails?.number === target.prNumber
395
+ ? fallbackPrDetails
396
+ : fetchPrDetailsByNumber(target.prNumber, projectDir);
397
+ const reviewEvent = target.noChangesNeeded
398
+ ? 'review_ready_for_human'
399
+ : 'review_completed';
400
+ await sendNotifications(config, {
401
+ event: reviewEvent,
402
+ projectName: path.basename(projectDir),
403
+ exitCode,
404
+ provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
405
+ prUrl: prDetails?.url,
406
+ prTitle: prDetails?.title,
407
+ prBody: prDetails?.body,
408
+ prNumber: prDetails?.number ?? target.prNumber,
409
+ filesChanged: prDetails?.changedFiles,
410
+ additions: prDetails?.additions,
411
+ deletions: prDetails?.deletions,
412
+ attempts,
413
+ finalScore,
414
+ });
415
+ }
416
+ }
417
+ }
418
+ const autoMergedPrNumbers = parseAutoMergedPrNumbers(scriptResult?.data.auto_merged);
419
+ if (autoMergedPrNumbers.length > 0) {
420
+ const autoMergedPrNumber = autoMergedPrNumbers[0];
421
+ const autoMergedPrDetails = fetchPrDetailsByNumber(autoMergedPrNumber, projectDir);
422
+ const _mergeCtx = {
423
+ event: 'pr_auto_merged',
424
+ projectName: path.basename(projectDir),
425
+ exitCode,
426
+ provider: formatProviderDisplay(envVars.NW_PROVIDER_CMD, envVars.NW_PROVIDER_LABEL),
427
+ prNumber: autoMergedPrDetails?.number ?? autoMergedPrNumber,
428
+ prUrl: autoMergedPrDetails?.url,
429
+ prTitle: autoMergedPrDetails?.title,
430
+ prBody: autoMergedPrDetails?.body,
431
+ filesChanged: autoMergedPrDetails?.changedFiles,
432
+ additions: autoMergedPrDetails?.additions,
433
+ deletions: autoMergedPrDetails?.deletions,
434
+ };
435
+ await sendNotifications(config, _mergeCtx);
436
+ }
437
+ }
438
+ process.exit(exitCode);
439
+ }
440
+ catch (err) {
441
+ spinner.fail('Failed to execute review command');
442
+ uiError(`${err instanceof Error ? err.message : String(err)}`);
443
+ process.exit(1);
444
+ }
445
+ });
446
+ }
447
+ //# sourceMappingURL=review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}