@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.10

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 (154) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.js +3281 -651
  3. package/dist/cli.js.map +1 -0
  4. package/dist/commands/agent.d.ts +12 -0
  5. package/dist/commands/agent.d.ts.map +1 -0
  6. package/dist/commands/agent.js +307 -0
  7. package/dist/commands/agent.js.map +1 -0
  8. package/dist/commands/analytics.d.ts +14 -0
  9. package/dist/commands/analytics.d.ts.map +1 -1
  10. package/dist/commands/analytics.js +129 -0
  11. package/dist/commands/analytics.js.map +1 -0
  12. package/dist/commands/audit.d.ts +19 -0
  13. package/dist/commands/audit.d.ts.map +1 -1
  14. package/dist/commands/audit.js +189 -0
  15. package/dist/commands/audit.js.map +1 -0
  16. package/dist/commands/board.d.ts +9 -0
  17. package/dist/commands/board.js +702 -0
  18. package/dist/commands/board.js.map +1 -0
  19. package/dist/commands/cancel.d.ts +46 -0
  20. package/dist/commands/cancel.js +239 -0
  21. package/dist/commands/cancel.js.map +1 -0
  22. package/dist/commands/cron.d.ts +8 -0
  23. package/dist/commands/cron.js +134 -0
  24. package/dist/commands/cron.js.map +1 -0
  25. package/dist/commands/dashboard/tab-actions.d.ts +10 -0
  26. package/dist/commands/dashboard/tab-actions.js +247 -0
  27. package/dist/commands/dashboard/tab-actions.js.map +1 -0
  28. package/dist/commands/dashboard/tab-config.d.ts +21 -0
  29. package/dist/commands/dashboard/tab-config.js +874 -0
  30. package/dist/commands/dashboard/tab-config.js.map +1 -0
  31. package/dist/commands/dashboard/tab-logs.d.ts +10 -0
  32. package/dist/commands/dashboard/tab-logs.js +202 -0
  33. package/dist/commands/dashboard/tab-logs.js.map +1 -0
  34. package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
  35. package/dist/commands/dashboard/tab-schedules.js +320 -0
  36. package/dist/commands/dashboard/tab-schedules.js.map +1 -0
  37. package/dist/commands/dashboard/tab-status.d.ts +32 -0
  38. package/dist/commands/dashboard/tab-status.js +424 -0
  39. package/dist/commands/dashboard/tab-status.js.map +1 -0
  40. package/dist/commands/dashboard/types.d.ts +42 -0
  41. package/dist/commands/dashboard/types.js +5 -0
  42. package/dist/commands/dashboard/types.js.map +1 -0
  43. package/dist/commands/dashboard.d.ts +11 -0
  44. package/dist/commands/dashboard.js +242 -0
  45. package/dist/commands/dashboard.js.map +1 -0
  46. package/dist/commands/doctor.d.ts +16 -0
  47. package/dist/commands/doctor.js +195 -0
  48. package/dist/commands/doctor.js.map +1 -0
  49. package/dist/commands/history.d.ts +7 -0
  50. package/dist/commands/history.js +49 -0
  51. package/dist/commands/history.js.map +1 -0
  52. package/dist/commands/init.d.ts +45 -0
  53. package/dist/commands/init.d.ts.map +1 -1
  54. package/dist/commands/init.js +13 -0
  55. package/dist/commands/init.js.map +1 -1
  56. package/dist/commands/install.d.ts +65 -0
  57. package/dist/commands/install.js +405 -0
  58. package/dist/commands/install.js.map +1 -0
  59. package/dist/commands/logs.d.ts +15 -0
  60. package/dist/commands/logs.js +155 -0
  61. package/dist/commands/logs.js.map +1 -0
  62. package/dist/commands/merge.d.ts +26 -0
  63. package/dist/commands/merge.d.ts.map +1 -1
  64. package/dist/commands/merge.js +186 -0
  65. package/dist/commands/merge.js.map +1 -0
  66. package/dist/commands/notify.d.ts +7 -0
  67. package/dist/commands/notify.js +43 -0
  68. package/dist/commands/notify.js.map +1 -0
  69. package/dist/commands/plan.d.ts +19 -0
  70. package/dist/commands/plan.d.ts.map +1 -1
  71. package/dist/commands/plan.js +133 -0
  72. package/dist/commands/plan.js.map +1 -0
  73. package/dist/commands/prd-state.d.ts +12 -0
  74. package/dist/commands/prd-state.js +47 -0
  75. package/dist/commands/prd-state.js.map +1 -0
  76. package/dist/commands/prd.d.ts +18 -0
  77. package/dist/commands/prd.js +363 -0
  78. package/dist/commands/prd.js.map +1 -0
  79. package/dist/commands/prds.d.ts +13 -0
  80. package/dist/commands/prds.js +194 -0
  81. package/dist/commands/prds.js.map +1 -0
  82. package/dist/commands/prs.d.ts +14 -0
  83. package/dist/commands/prs.js +104 -0
  84. package/dist/commands/prs.js.map +1 -0
  85. package/dist/commands/qa.d.ts +34 -0
  86. package/dist/commands/qa.d.ts.map +1 -1
  87. package/dist/commands/qa.js +238 -0
  88. package/dist/commands/qa.js.map +1 -0
  89. package/dist/commands/queue.d.ts +8 -0
  90. package/dist/commands/queue.d.ts.map +1 -1
  91. package/dist/commands/queue.js +398 -0
  92. package/dist/commands/queue.js.map +1 -0
  93. package/dist/commands/resolve.d.ts +26 -0
  94. package/dist/commands/resolve.d.ts.map +1 -1
  95. package/dist/commands/resolve.js +212 -0
  96. package/dist/commands/resolve.js.map +1 -0
  97. package/dist/commands/retry.d.ts +9 -0
  98. package/dist/commands/retry.js +71 -0
  99. package/dist/commands/retry.js.map +1 -0
  100. package/dist/commands/review.d.ts +79 -0
  101. package/dist/commands/review.d.ts.map +1 -1
  102. package/dist/commands/review.js +47 -75
  103. package/dist/commands/review.js.map +1 -1
  104. package/dist/commands/run.d.ts +88 -0
  105. package/dist/commands/run.d.ts.map +1 -1
  106. package/dist/commands/run.js +85 -1
  107. package/dist/commands/run.js.map +1 -1
  108. package/dist/commands/serve.d.ts +19 -0
  109. package/dist/commands/serve.js +142 -0
  110. package/dist/commands/serve.js.map +1 -0
  111. package/dist/commands/shared/env-builder.d.ts +49 -0
  112. package/dist/commands/shared/env-builder.d.ts.map +1 -1
  113. package/dist/commands/shared/env-builder.js +152 -0
  114. package/dist/commands/shared/env-builder.js.map +1 -0
  115. package/dist/commands/shared/feedback.d.ts +24 -0
  116. package/dist/commands/shared/feedback.d.ts.map +1 -0
  117. package/dist/commands/shared/feedback.js +38 -0
  118. package/dist/commands/shared/feedback.js.map +1 -0
  119. package/dist/commands/slice.d.ts +35 -0
  120. package/dist/commands/slice.d.ts.map +1 -1
  121. package/dist/commands/slice.js +363 -0
  122. package/dist/commands/slice.js.map +1 -0
  123. package/dist/commands/state.d.ts +8 -0
  124. package/dist/commands/state.js +54 -0
  125. package/dist/commands/state.js.map +1 -0
  126. package/dist/commands/status.d.ts +14 -0
  127. package/dist/commands/status.js +297 -0
  128. package/dist/commands/status.js.map +1 -0
  129. package/dist/commands/summary.d.ts +14 -0
  130. package/dist/commands/summary.js +193 -0
  131. package/dist/commands/summary.js.map +1 -0
  132. package/dist/commands/uninstall.d.ts +25 -0
  133. package/dist/commands/uninstall.js +134 -0
  134. package/dist/commands/uninstall.js.map +1 -0
  135. package/dist/commands/update.d.ts +22 -0
  136. package/dist/commands/update.js +90 -0
  137. package/dist/commands/update.js.map +1 -0
  138. package/dist/scripts/night-watch-audit-cron.sh +1 -0
  139. package/dist/scripts/night-watch-cron.sh +186 -23
  140. package/dist/scripts/night-watch-helpers.sh +65 -2
  141. package/dist/scripts/night-watch-merger-cron.sh +137 -36
  142. package/dist/scripts/night-watch-plan-cron.sh +2 -0
  143. package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
  144. package/dist/scripts/night-watch-pr-reviewer-cron.sh +22 -5
  145. package/dist/scripts/night-watch-qa-cron.sh +8 -1
  146. package/dist/scripts/night-watch-slicer-cron.sh +3 -0
  147. package/dist/templates/night-watch.config.json +21 -20
  148. package/dist/templates/slicer.md +3 -0
  149. package/dist/web/assets/index-C-xpWpS8.css +1 -0
  150. package/dist/web/assets/index-CEYe-290.js +412 -0
  151. package/dist/web/assets/index-DpvzoXEv.js +442 -0
  152. package/dist/web/assets/index-DyME41HV.css +1 -0
  153. package/dist/web/index.html +2 -2
  154. package/package.json +3 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../../src/commands/shared/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,OAAO,EAMR,MAAM,mBAAmB,CAAC;AAE3B,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,iBAAiB;;;;;EAanE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAEpE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,sBAAsB,GAAG,IAAI,CAqBpE"}
@@ -0,0 +1,38 @@
1
+ import { analyzeFeedbackOutcome, buildSessionOutcomeInput, getRepositories, isFeedbackPromptEnabled, resolveJobProvider, } from '@night-watch/core';
2
+ export function getFeedbackAnalysisOptions(config) {
3
+ const feedback = config.feedback ?? {
4
+ augmentationTtlDays: 14,
5
+ confidenceThreshold: 0.75,
6
+ maxActiveAugmentations: 3,
7
+ successStreakToExpire: 3,
8
+ };
9
+ return {
10
+ augmentationTtlMs: feedback.augmentationTtlDays * 24 * 60 * 60 * 1000,
11
+ confidenceThreshold: feedback.confidenceThreshold,
12
+ maxActiveAugmentations: feedback.maxActiveAugmentations,
13
+ successStreakToExpire: feedback.successStreakToExpire,
14
+ };
15
+ }
16
+ export function isFeedbackEnabled(config) {
17
+ return config.feedback?.enabled !== false && isFeedbackPromptEnabled();
18
+ }
19
+ export function recordJobOutcome(input) {
20
+ const repository = getRepositories().sessionOutcomes;
21
+ const storedOutcome = repository.insertOutcome(buildSessionOutcomeInput({
22
+ exitCode: input.exitCode,
23
+ finishedAt: input.finishedAt,
24
+ jobType: input.jobType,
25
+ metadata: input.metadata,
26
+ minReviewScore: input.minReviewScore,
27
+ projectPath: input.projectDir,
28
+ providerKey: input.providerKey ?? resolveJobProvider(input.config, input.jobType),
29
+ scriptResult: input.scriptResult,
30
+ startedAt: input.startedAt,
31
+ stderr: input.stderr,
32
+ stdout: input.stdout,
33
+ }));
34
+ if (isFeedbackEnabled(input.config)) {
35
+ analyzeFeedbackOutcome(repository, storedOutcome, getFeedbackAnalysisOptions(input.config));
36
+ }
37
+ }
38
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../../src/commands/shared/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,sBAAsB,EACtB,wBAAwB,EACxB,eAAe,EACf,uBAAuB,EACvB,kBAAkB,GACnB,MAAM,mBAAmB,CAAC;AAiB3B,MAAM,UAAU,0BAA0B,CAAC,MAAyB;IAClE,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI;QAClC,mBAAmB,EAAE,EAAE;QACvB,mBAAmB,EAAE,IAAI;QACzB,sBAAsB,EAAE,CAAC;QACzB,qBAAqB,EAAE,CAAC;KACzB,CAAC;IACF,OAAO;QACL,iBAAiB,EAAE,QAAQ,CAAC,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACrE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QACjD,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB;QACvD,qBAAqB,EAAE,QAAQ,CAAC,qBAAqB;KACtD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAyB;IACzD,OAAO,MAAM,CAAC,QAAQ,EAAE,OAAO,KAAK,KAAK,IAAI,uBAAuB,EAAE,CAAC;AACzE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,eAAe,CAAC;IACrD,MAAM,aAAa,GAAG,UAAU,CAAC,aAAa,CAC5C,wBAAwB,CAAC;QACvB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,cAAc,EAAE,KAAK,CAAC,cAAc;QACpC,WAAW,EAAE,KAAK,CAAC,UAAU;QAC7B,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,kBAAkB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC;QACjF,YAAY,EAAE,KAAK,CAAC,YAAY;QAChC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,CAAC,MAAM;KACrB,CAAC,CACH,CAAC;IAEF,IAAI,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACpC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,CAAC;AACH,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Slice command - executes the roadmap slicer to create PRDs from roadmap items
3
+ */
4
+ import { Command } from 'commander';
5
+ import { INightWatchConfig } from '@night-watch/core';
6
+ import type { ISliceResult } from '@night-watch/core';
7
+ /**
8
+ * Options for the slice command
9
+ */
10
+ export interface ISliceOptions {
11
+ dryRun: boolean;
12
+ timeout?: string;
13
+ provider?: string;
14
+ }
15
+ export interface IPlannerIssueCreationResult {
16
+ created: boolean;
17
+ skippedReason?: string;
18
+ issueNumber?: number;
19
+ issueUrl?: string;
20
+ }
21
+ export declare function buildPlannerIssueBody(projectDir: string, config: INightWatchConfig, result: ISliceResult): string;
22
+ export declare function createPlannerIssue(projectDir: string, config: INightWatchConfig, result: ISliceResult): Promise<IPlannerIssueCreationResult>;
23
+ /**
24
+ * Build environment variables map from config and CLI options for slicer
25
+ */
26
+ export declare function buildEnvVars(config: INightWatchConfig, options: ISliceOptions): Record<string, string>;
27
+ /**
28
+ * Apply CLI flag overrides to the config for slicer
29
+ */
30
+ export declare function applyCliOverrides(config: INightWatchConfig, options: ISliceOptions): INightWatchConfig;
31
+ /**
32
+ * Register the slice command with the program
33
+ */
34
+ export declare function sliceCommand(program: Command): void;
35
+ //# sourceMappingURL=slice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAGL,iBAAiB,EAkBlB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,MAAM,CAkCR;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA0CtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAmBnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiLnD"}
1
+ {"version":3,"file":"slice.d.ts","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAGL,iBAAiB,EAkBlB,MAAM,mBAAmB,CAAC;AAO3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA4CD,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,MAAM,CAkCR;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,iBAAiB,EACzB,MAAM,EAAE,YAAY,GACnB,OAAO,CAAC,2BAA2B,CAAC,CA8CtC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,iBAAiB,CAmBnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2NnD"}
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Slice command - executes the roadmap slicer to create PRDs from roadmap items
3
+ */
4
+ import { CLAUDE_MODEL_IDS, LOCK_FILE_PREFIX, PROVIDER_COMMANDS, createBoardProvider, createSpinner, createTable, dim, getRoadmapStatus, header, info, isProcessRunning, loadConfig, projectRuntimeKey, resolveJobProvider, sendNotifications, sliceNextItem, error as uiError, warn, } from '@night-watch/core';
5
+ import { buildBaseEnvVars, getTelegramStatusWebhooks, maybeApplyCronSchedulingDelay, } from './shared/env-builder.js';
6
+ import { recordJobOutcome } from './shared/feedback.js';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ function plannerLockPath(projectDir) {
10
+ return `${LOCK_FILE_PREFIX}slicer-${projectRuntimeKey(projectDir)}.lock`;
11
+ }
12
+ function acquirePlannerLock(projectDir) {
13
+ const lockFile = plannerLockPath(projectDir);
14
+ if (fs.existsSync(lockFile)) {
15
+ const pidRaw = fs.readFileSync(lockFile, 'utf-8').trim();
16
+ const pid = parseInt(pidRaw, 10);
17
+ if (!Number.isNaN(pid) && isProcessRunning(pid)) {
18
+ return { acquired: false, lockFile, pid };
19
+ }
20
+ // stale lock
21
+ try {
22
+ fs.unlinkSync(lockFile);
23
+ }
24
+ catch {
25
+ // ignore stale-lock cleanup errors
26
+ }
27
+ }
28
+ fs.writeFileSync(lockFile, String(process.pid));
29
+ return { acquired: true, lockFile };
30
+ }
31
+ function releasePlannerLock(lockFile) {
32
+ try {
33
+ if (fs.existsSync(lockFile)) {
34
+ fs.unlinkSync(lockFile);
35
+ }
36
+ }
37
+ catch {
38
+ // ignore cleanup errors
39
+ }
40
+ }
41
+ function resolvePlannerIssueColumn(config) {
42
+ return config.roadmapScanner.issueColumn === 'Draft' ? 'Draft' : 'Ready';
43
+ }
44
+ export function buildPlannerIssueBody(projectDir, config, result) {
45
+ const relativePrdPath = path.join(config.prdDir, result.file ?? '').replace(/\\/g, '/');
46
+ const absolutePrdPath = path.join(projectDir, config.prdDir, result.file ?? '');
47
+ const sourceItem = result.item;
48
+ let prdContent;
49
+ try {
50
+ prdContent = fs.readFileSync(absolutePrdPath, 'utf-8');
51
+ }
52
+ catch {
53
+ prdContent = `Unable to read generated PRD file at \`${relativePrdPath}\`.`;
54
+ }
55
+ const maxBodyChars = 60000;
56
+ const truncated = prdContent.length > maxBodyChars;
57
+ const prdBody = truncated ? `${prdContent.slice(0, maxBodyChars)}\n\n...[truncated]` : prdContent;
58
+ const metaLines = [`- PRD file: \`${relativePrdPath}\``];
59
+ if (sourceItem) {
60
+ metaLines.push(`- Source section: ${sourceItem.section}`);
61
+ if (sourceItem.description) {
62
+ metaLines.push(`- Source summary: ${sourceItem.description}`);
63
+ }
64
+ }
65
+ return [
66
+ prdBody,
67
+ '',
68
+ '<details>',
69
+ '<summary>Source metadata</summary>',
70
+ '',
71
+ ...metaLines,
72
+ '',
73
+ '</details>',
74
+ ].join('\n');
75
+ }
76
+ export async function createPlannerIssue(projectDir, config, result) {
77
+ if (!result.sliced || !result.file || !result.item) {
78
+ return { created: false, skippedReason: 'nothing-created' };
79
+ }
80
+ if (!config.boardProvider?.enabled) {
81
+ return { created: false, skippedReason: 'board-disabled' };
82
+ }
83
+ const provider = createBoardProvider(config.boardProvider, projectDir);
84
+ const board = await provider.getBoard();
85
+ if (!board) {
86
+ return { created: false, skippedReason: 'board-not-configured' };
87
+ }
88
+ const issueTitle = `PRD: ${result.item.title}`;
89
+ const normalizeTitle = (t) => t
90
+ .replace(/^PRD:\s*/i, '')
91
+ .trim()
92
+ .toLowerCase();
93
+ const existingIssues = await provider.getAllIssues();
94
+ const existing = existingIssues.find((issue) => normalizeTitle(issue.title) === normalizeTitle(result.item.title));
95
+ if (existing) {
96
+ return {
97
+ created: false,
98
+ skippedReason: 'already-exists',
99
+ issueNumber: existing.number,
100
+ issueUrl: existing.url,
101
+ };
102
+ }
103
+ const issue = await provider.createIssue({
104
+ title: issueTitle,
105
+ body: buildPlannerIssueBody(projectDir, config, result),
106
+ column: resolvePlannerIssueColumn(config),
107
+ });
108
+ return {
109
+ created: true,
110
+ issueNumber: issue.number,
111
+ issueUrl: issue.url,
112
+ };
113
+ }
114
+ /**
115
+ * Build environment variables map from config and CLI options for slicer
116
+ */
117
+ export function buildEnvVars(config, options) {
118
+ // Start with base env vars shared by all job types
119
+ const env = buildBaseEnvVars(config, 'slicer', options.dryRun);
120
+ // Slicer runtime
121
+ env.NW_SLICER_MAX_RUNTIME = String(config.roadmapScanner.slicerMaxRuntime);
122
+ // PRD directory for slicer output
123
+ env.NW_PRD_DIR = config.prdDir;
124
+ // Roadmap path
125
+ env.NW_ROADMAP_PATH = config.roadmapScanner.roadmapPath;
126
+ env.NW_CLAUDE_MODEL_ID =
127
+ CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
128
+ // Telegram status messages from bash scripts (start/progress/final status)
129
+ const telegramWebhooks = getTelegramStatusWebhooks(config);
130
+ if (telegramWebhooks.length > 0) {
131
+ env.NW_TELEGRAM_STATUS_WEBHOOKS = JSON.stringify(telegramWebhooks);
132
+ env.NW_TELEGRAM_BOT_TOKEN = telegramWebhooks[0].botToken;
133
+ env.NW_TELEGRAM_CHAT_ID = telegramWebhooks[0].chatId;
134
+ }
135
+ return env;
136
+ }
137
+ /**
138
+ * Apply CLI flag overrides to the config for slicer
139
+ */
140
+ export function applyCliOverrides(config, options) {
141
+ const overridden = { ...config };
142
+ if (options.timeout) {
143
+ const timeout = parseInt(options.timeout, 10);
144
+ if (!isNaN(timeout)) {
145
+ overridden.roadmapScanner = {
146
+ ...overridden.roadmapScanner,
147
+ slicerMaxRuntime: timeout,
148
+ };
149
+ }
150
+ }
151
+ if (options.provider) {
152
+ // Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
153
+ overridden._cliProviderOverride = options.provider;
154
+ }
155
+ return overridden;
156
+ }
157
+ /**
158
+ * Register the slice command with the program
159
+ */
160
+ export function sliceCommand(program) {
161
+ program
162
+ .command('slice')
163
+ .alias('planner')
164
+ .description('Run Planner (roadmap slicer) to create a PRD from the next roadmap item')
165
+ .option('--dry-run', 'Show what would be executed without running')
166
+ .option('--timeout <seconds>', 'Override max runtime in seconds for slicer')
167
+ .option('--provider <string>', 'AI provider to use (claude or codex)')
168
+ .action(async (options) => {
169
+ // Get the project directory (current working directory)
170
+ const projectDir = process.cwd();
171
+ const lockResult = acquirePlannerLock(projectDir);
172
+ if (!lockResult.acquired) {
173
+ info(`Planner is already running${lockResult.pid ? ` (PID ${lockResult.pid})` : ''}`);
174
+ process.exit(0);
175
+ }
176
+ const cleanupLock = () => releasePlannerLock(lockResult.lockFile);
177
+ process.on('exit', cleanupLock);
178
+ // Load config from file and environment
179
+ let config = loadConfig(projectDir);
180
+ // Apply CLI flag overrides
181
+ config = applyCliOverrides(config, options);
182
+ // Build environment variables
183
+ const envVars = buildEnvVars(config, options);
184
+ if (options.dryRun) {
185
+ header('Dry Run: Planner');
186
+ // Resolve slicer-specific provider
187
+ const slicerProvider = resolveJobProvider(config, 'slicer');
188
+ // Configuration section with table
189
+ header('Configuration');
190
+ const configTable = createTable({ head: ['Setting', 'Value'] });
191
+ configTable.push(['Provider', slicerProvider]);
192
+ configTable.push(['Provider CLI', PROVIDER_COMMANDS[slicerProvider]]);
193
+ configTable.push(['PRD Directory', config.prdDir]);
194
+ configTable.push(['Roadmap Path', config.roadmapScanner.roadmapPath]);
195
+ configTable.push([
196
+ 'Planner Max Runtime',
197
+ `${config.roadmapScanner.slicerMaxRuntime}s (${Math.floor(config.roadmapScanner.slicerMaxRuntime / 60)}min)`,
198
+ ]);
199
+ configTable.push(['Planner Schedule', config.roadmapScanner.slicerSchedule]);
200
+ configTable.push(['Planner Priority Mode', config.roadmapScanner.priorityMode]);
201
+ configTable.push(['Planner Issue Column', resolvePlannerIssueColumn(config)]);
202
+ configTable.push(['Scanner Enabled', config.roadmapScanner.enabled ? 'Yes' : 'No']);
203
+ console.log(configTable.toString());
204
+ // Get roadmap status
205
+ header('Roadmap Status');
206
+ const roadmapStatus = getRoadmapStatus(projectDir, config);
207
+ if (!config.roadmapScanner.enabled) {
208
+ dim(' Roadmap scanner is disabled');
209
+ }
210
+ else if (roadmapStatus.status === 'no-roadmap') {
211
+ dim(` ROADMAP.md not found at ${config.roadmapScanner.roadmapPath}`);
212
+ }
213
+ else {
214
+ const statusTable = createTable({ head: ['Metric', 'Count'] });
215
+ statusTable.push(['Total Items', roadmapStatus.totalItems]);
216
+ statusTable.push(['Processed', roadmapStatus.processedItems]);
217
+ statusTable.push(['Pending', roadmapStatus.pendingItems]);
218
+ statusTable.push(['Status', roadmapStatus.status]);
219
+ console.log(statusTable.toString());
220
+ // Show pending items
221
+ if (roadmapStatus.pendingItems > 0) {
222
+ header('Pending Items');
223
+ const pendingItems = roadmapStatus.items.filter((item) => !item.processed && !item.checked);
224
+ for (const item of pendingItems.slice(0, 10)) {
225
+ info(` - ${item.title}`);
226
+ if (item.section) {
227
+ dim(` Section: ${item.section}`);
228
+ }
229
+ }
230
+ if (pendingItems.length > 10) {
231
+ dim(` ... and ${pendingItems.length - 10} more`);
232
+ }
233
+ }
234
+ }
235
+ // Provider invocation command
236
+ header('Provider Invocation');
237
+ if (slicerProvider === 'claude') {
238
+ dim(' claude -p "/night-watch-slicer" --dangerously-skip-permissions');
239
+ }
240
+ else {
241
+ dim(' codex exec --yolo "/night-watch-slicer"');
242
+ }
243
+ // Environment variables
244
+ header('Environment Variables');
245
+ for (const [key, value] of Object.entries(envVars)) {
246
+ dim(` ${key}=${value}`);
247
+ }
248
+ // Full command that would be executed
249
+ header('Action');
250
+ dim(' Would invoke sliceNextItem() to process one roadmap item');
251
+ console.log();
252
+ process.exit(0);
253
+ }
254
+ // Check if roadmap scanner is enabled
255
+ if (!config.roadmapScanner.enabled) {
256
+ info('Planner is disabled in config; skipping run.');
257
+ process.exit(0);
258
+ }
259
+ // Execute planner with spinner
260
+ const spinner = createSpinner('Running Planner...');
261
+ spinner.start();
262
+ const startedAt = Date.now();
263
+ try {
264
+ await maybeApplyCronSchedulingDelay(config, 'slicer', projectDir);
265
+ const result = await sliceNextItem(projectDir, config);
266
+ let issueSummary = '';
267
+ if (result.sliced) {
268
+ try {
269
+ const issueResult = await createPlannerIssue(projectDir, config, result);
270
+ if (issueResult.created && issueResult.issueNumber) {
271
+ issueSummary = `; issue #${issueResult.issueNumber} (${resolvePlannerIssueColumn(config)})`;
272
+ }
273
+ else if (issueResult.skippedReason === 'already-exists' && issueResult.issueNumber) {
274
+ issueSummary = `; existing issue #${issueResult.issueNumber}`;
275
+ }
276
+ }
277
+ catch (issueError) {
278
+ warn(`Planner created ${result.file} but failed to create board issue: ${issueError instanceof Error ? issueError.message : String(issueError)}`);
279
+ }
280
+ }
281
+ if (result.sliced) {
282
+ spinner.succeed(`Planner completed successfully: Created ${result.file}${issueSummary}`);
283
+ }
284
+ else if (result.error) {
285
+ if (result.error === 'No pending items to process') {
286
+ spinner.succeed('No pending items to process');
287
+ }
288
+ else {
289
+ spinner.fail(`Planner failed: ${result.error}`);
290
+ }
291
+ }
292
+ // Send notifications (fire-and-forget, failures do not affect exit code)
293
+ const nothingPending = result.error === 'No pending items to process';
294
+ const exitCode = result.sliced || nothingPending ? 0 : 1;
295
+ if (!options.dryRun) {
296
+ try {
297
+ recordJobOutcome({
298
+ config,
299
+ exitCode,
300
+ finishedAt: Date.now(),
301
+ jobType: 'planner',
302
+ metadata: {
303
+ error: result.error ?? null,
304
+ file: result.file ?? null,
305
+ itemTitle: result.item?.title ?? null,
306
+ sliced: result.sliced,
307
+ },
308
+ projectDir,
309
+ providerKey: resolveJobProvider(config, 'slicer'),
310
+ startedAt,
311
+ stderr: result.error,
312
+ stdout: result.file ? `Created ${result.file}` : undefined,
313
+ });
314
+ }
315
+ catch {
316
+ // Outcome persistence must not change command exit behavior.
317
+ }
318
+ }
319
+ if (!options.dryRun && result.sliced) {
320
+ await sendNotifications(config, {
321
+ event: 'run_succeeded',
322
+ projectName: path.basename(projectDir),
323
+ exitCode,
324
+ provider: config.provider,
325
+ prTitle: result.item?.title,
326
+ });
327
+ }
328
+ else if (!options.dryRun && !nothingPending) {
329
+ await sendNotifications(config, {
330
+ event: 'run_failed',
331
+ projectName: path.basename(projectDir),
332
+ exitCode,
333
+ provider: config.provider,
334
+ });
335
+ }
336
+ process.exit(exitCode);
337
+ }
338
+ catch (err) {
339
+ try {
340
+ recordJobOutcome({
341
+ config,
342
+ exitCode: 1,
343
+ finishedAt: Date.now(),
344
+ jobType: 'planner',
345
+ metadata: {
346
+ error: err instanceof Error ? err.message : String(err),
347
+ },
348
+ projectDir,
349
+ providerKey: resolveJobProvider(config, 'slicer'),
350
+ startedAt,
351
+ stderr: err instanceof Error ? err.message : String(err),
352
+ });
353
+ }
354
+ catch {
355
+ // Outcome persistence must not change command exit behavior.
356
+ }
357
+ spinner.fail('Failed to execute planner command');
358
+ uiError(`${err instanceof Error ? err.message : String(err)}`);
359
+ process.exit(1);
360
+ }
361
+ });
362
+ }
363
+ //# sourceMappingURL=slice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slice.js","sourceRoot":"","sources":["../../src/commands/slice.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * State command — manage Night Watch persistent state.
3
+ * Provides the `night-watch state migrate` subcommand for migrating
4
+ * legacy JSON state files into the SQLite backend.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare function createStateCommand(): Command;
8
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1,54 @@
1
+ /**
2
+ * State command — manage Night Watch persistent state.
3
+ * Provides the `night-watch state migrate` subcommand for migrating
4
+ * legacy JSON state files into the SQLite backend.
5
+ */
6
+ import * as os from 'os';
7
+ import * as path from 'path';
8
+ import chalk from 'chalk';
9
+ import { Command } from 'commander';
10
+ import { GLOBAL_CONFIG_DIR, migrateJsonToSqlite } from '@night-watch/core';
11
+ export function createStateCommand() {
12
+ const state = new Command('state');
13
+ state.description('Manage Night Watch state');
14
+ state
15
+ .command('migrate')
16
+ .description('Migrate legacy JSON state files to SQLite')
17
+ .option('--dry-run', 'Show what would be migrated without making changes')
18
+ .action((opts) => {
19
+ const nightWatchHome = process.env.NIGHT_WATCH_HOME || path.join(os.homedir(), GLOBAL_CONFIG_DIR);
20
+ if (opts.dryRun) {
21
+ console.log(chalk.cyan('Dry-run mode: no changes will be made.\n'));
22
+ console.log(`Legacy JSON files that would be migrated from: ${chalk.bold(nightWatchHome)}`);
23
+ console.log(` ${path.join(nightWatchHome, 'projects.json')}`);
24
+ console.log(` ${path.join(nightWatchHome, 'history.json')}`);
25
+ console.log(` ${path.join(nightWatchHome, 'prd-states.json')}`);
26
+ console.log(` <project>/<prdDir>/.roadmap-state.json (per project)`);
27
+ console.log(chalk.dim('\nRun without --dry-run to apply the migration.'));
28
+ return;
29
+ }
30
+ console.log(chalk.cyan('Migrating legacy JSON state to SQLite...\n'));
31
+ let result;
32
+ try {
33
+ result = migrateJsonToSqlite(nightWatchHome);
34
+ }
35
+ catch (err) {
36
+ const message = err instanceof Error ? err.message : String(err);
37
+ console.error(chalk.red(`Migration failed: ${message}`));
38
+ process.exit(1);
39
+ }
40
+ if (result.alreadyMigrated) {
41
+ console.log(chalk.yellow('Migration already completed previously. Nothing to do.'));
42
+ return;
43
+ }
44
+ console.log(chalk.green('Migration complete.\n'));
45
+ console.log(chalk.bold('Summary:'));
46
+ console.log(` Projects migrated: ${chalk.cyan(String(result.projectsMigrated))}`);
47
+ console.log(` History records migrated: ${chalk.cyan(String(result.historyRecordsMigrated))}`);
48
+ console.log(` PRD states migrated: ${chalk.cyan(String(result.prdStatesMigrated))}`);
49
+ console.log(` Roadmap states migrated: ${chalk.cyan(String(result.roadmapStatesMigrated))}`);
50
+ console.log(`\n Backup directory: ${chalk.dim(result.backupDir)}`);
51
+ });
52
+ return state;
53
+ }
54
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/commands/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Status command for Night Watch CLI
3
+ * Shows current status including lock files, PRDs, PRs, and logs
4
+ */
5
+ import { Command } from 'commander';
6
+ export interface IStatusOptions {
7
+ verbose?: boolean;
8
+ json?: boolean;
9
+ }
10
+ /**
11
+ * Status command implementation
12
+ */
13
+ export declare function statusCommand(program: Command): void;
14
+ //# sourceMappingURL=status.d.ts.map