@jonit-dev/night-watch-cli 1.8.12-beta.0 → 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 +2331 -1403
  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 +1 -74
  89. package/dist/commands/review.js.map +1 -1
  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 +6 -0
  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,151 @@
1
+ /**
2
+ * Shared environment variable building utilities for Night Watch CLI commands.
3
+ * Extracts common logic for building base env vars and Telegram webhook extraction.
4
+ */
5
+ import { DEFAULT_QUEUE, getSchedulingPlan, loadConfig, resolveJobProvider, resolvePreset, resolveProviderBucketKey, } from '@night-watch/core';
6
+ /**
7
+ * Derive a human-friendly provider label for display in PR bodies, comments, and commits.
8
+ * Uses the preset's name field as the primary source, falls back to config.providerLabel
9
+ * for backward compat, then auto-derives from provider/env.
10
+ */
11
+ function deriveProviderLabel(config, preset) {
12
+ // Primary: use preset name
13
+ if (preset.name)
14
+ return preset.name;
15
+ // Backward compat: use deprecated providerLabel
16
+ if (config.providerLabel)
17
+ return config.providerLabel;
18
+ // Fallback: derive from command
19
+ if (preset.command === 'codex')
20
+ return 'Codex';
21
+ // claude provider: check if a proxy base URL is configured
22
+ if (config.providerEnv?.ANTHROPIC_BASE_URL)
23
+ return 'Claude (proxy)';
24
+ return 'Claude';
25
+ }
26
+ /**
27
+ * Build the base environment variables shared by all job types.
28
+ * Sets provider, queue, execution-context, and optional dry-run/default-branch env vars.
29
+ *
30
+ * Provider env vars (from preset):
31
+ * - NW_PROVIDER_CMD: the CLI binary for the resolved provider
32
+ * - NW_PROVIDER_SUBCOMMAND: optional subcommand (e.g. "exec" for codex)
33
+ * - NW_PROVIDER_PROMPT_FLAG: flag for passing the prompt (e.g. "-p")
34
+ * - NW_PROVIDER_APPROVE_FLAG: flag for auto-approve mode
35
+ * - NW_PROVIDER_WORKDIR_FLAG: flag for working directory
36
+ * - NW_PROVIDER_MODEL_FLAG: flag for model selection
37
+ * - NW_PROVIDER_MODEL: model value to use
38
+ * - NW_PROVIDER_LABEL: human-friendly provider name for PR/comment attribution
39
+ *
40
+ * Other env vars:
41
+ * - NW_DEFAULT_BRANCH: optional default branch
42
+ * - providerEnv: merged into env (preset.envVars takes precedence)
43
+ * - NW_QUEUE_*: queue configuration for bash scripts
44
+ * - NW_DRY_RUN: '1' when isDryRun is true
45
+ * - NW_EXECUTION_CONTEXT: always 'agent'
46
+ */
47
+ export function buildBaseEnvVars(config, jobType, isDryRun) {
48
+ const env = {};
49
+ // Resolve the preset for this job type
50
+ const presetId = resolveJobProvider(config, jobType);
51
+ const preset = resolvePreset(config, presetId);
52
+ // Provider command - the actual CLI binary to call
53
+ env.NW_PROVIDER_CMD = preset.command;
54
+ // Provider subcommand (e.g. "exec" for codex)
55
+ env.NW_PROVIDER_SUBCOMMAND = preset.subcommand ?? '';
56
+ // Provider flags (empty string if not set)
57
+ env.NW_PROVIDER_PROMPT_FLAG = preset.promptFlag ?? '';
58
+ env.NW_PROVIDER_APPROVE_FLAG = preset.autoApproveFlag ?? '';
59
+ env.NW_PROVIDER_WORKDIR_FLAG = preset.workdirFlag ?? '';
60
+ env.NW_PROVIDER_MODEL_FLAG = preset.modelFlag ?? '';
61
+ // Provider model (empty string if not set)
62
+ env.NW_PROVIDER_MODEL = preset.model ?? '';
63
+ // Human-friendly provider label for attribution in PRs, comments, commits
64
+ env.NW_PROVIDER_LABEL = deriveProviderLabel(config, preset);
65
+ // Provider bucket key for per-bucket concurrency tracking
66
+ // Build the effective providerEnv for bucket key resolution:
67
+ // start with config.providerEnv (backward compat) then overlay preset.envVars
68
+ const effectiveProviderEnv = {
69
+ ...(config.providerEnv ?? {}),
70
+ ...(preset.envVars ?? {}),
71
+ };
72
+ env.NW_PROVIDER_KEY = resolveProviderBucketKey(preset.command, effectiveProviderEnv);
73
+ // Default branch (empty = auto-detect in bash script)
74
+ if (config.defaultBranch) {
75
+ env.NW_DEFAULT_BRANCH = config.defaultBranch;
76
+ }
77
+ env.NW_GIT_PUSH_NO_VERIFY = config.gitPushNoVerify ? '1' : '0';
78
+ // Provider environment variables (API keys, base URLs, etc.)
79
+ // First apply config.providerEnv for backward compat
80
+ if (config.providerEnv) {
81
+ Object.assign(env, config.providerEnv);
82
+ }
83
+ // Then apply preset.envVars (takes precedence over config.providerEnv)
84
+ if (preset.envVars) {
85
+ Object.assign(env, preset.envVars);
86
+ }
87
+ // Queue configuration
88
+ const queueConfig = config.queue ?? DEFAULT_QUEUE;
89
+ env.NW_QUEUE_ENABLED = queueConfig.enabled ? '1' : '0';
90
+ env.NW_QUEUE_MAX_CONCURRENCY = String(queueConfig.maxConcurrency);
91
+ env.NW_QUEUE_MAX_WAIT_TIME = String(queueConfig.maxWaitTime);
92
+ env.NW_QUEUE_PRIORITY_JSON = JSON.stringify(queueConfig.priority);
93
+ env.NW_SCHEDULING_PRIORITY = String(config.schedulingPriority ?? 3);
94
+ // Dry run flag
95
+ if (isDryRun) {
96
+ env.NW_DRY_RUN = '1';
97
+ }
98
+ // Sandbox flag - prevents the agent from modifying crontab during execution
99
+ env.NW_EXECUTION_CONTEXT = 'agent';
100
+ return env;
101
+ }
102
+ export function getCronSchedulingPlan(config, jobType, projectDir) {
103
+ return getSchedulingPlan(projectDir, config, jobType);
104
+ }
105
+ export async function maybeApplyCronSchedulingDelay(config, jobType, projectDir) {
106
+ const plan = getSchedulingPlan(projectDir, config, jobType);
107
+ if (process.env.NW_CRON_TRIGGER !== '1' || process.env.NW_QUEUE_DISPATCHED === '1') {
108
+ return plan;
109
+ }
110
+ if (plan.totalDelayMinutes > 0) {
111
+ await new Promise((resolve) => setTimeout(resolve, plan.totalDelayMinutes * 60_000));
112
+ }
113
+ return getSchedulingPlan(projectDir, config, jobType);
114
+ }
115
+ /**
116
+ * Format provider display for notifications/UI using command + label.
117
+ */
118
+ export function formatProviderDisplay(providerCmd, providerLabel) {
119
+ const cmd = providerCmd?.trim();
120
+ if (!cmd)
121
+ return 'unknown';
122
+ const label = providerLabel?.trim();
123
+ if (!label)
124
+ return cmd;
125
+ if (label.toLowerCase() === cmd.toLowerCase())
126
+ return cmd;
127
+ return `${cmd} (${label})`;
128
+ }
129
+ /**
130
+ * Rebuild environment variables for a queued job from the job's own project config.
131
+ * This ensures provider-specific env (ANTHROPIC_BASE_URL, API keys, model ids)
132
+ * always comes from the queued job's own project config, not the dispatcher process env.
133
+ */
134
+ export function buildQueuedJobEnv(entry) {
135
+ const config = loadConfig(entry.projectPath);
136
+ return buildBaseEnvVars(config, entry.jobType, false);
137
+ }
138
+ /**
139
+ * Extract Telegram webhooks that have both botToken and chatId configured.
140
+ * Used for status messages from bash scripts (start/progress/final status).
141
+ */
142
+ export function getTelegramStatusWebhooks(config) {
143
+ return (config.notifications?.webhooks ?? [])
144
+ .filter((wh) => wh.type === 'telegram' &&
145
+ typeof wh.botToken === 'string' &&
146
+ wh.botToken.trim().length > 0 &&
147
+ typeof wh.chatId === 'string' &&
148
+ wh.chatId.trim().length > 0)
149
+ .map((wh) => ({ botToken: wh.botToken, chatId: wh.chatId }));
150
+ }
151
+ //# sourceMappingURL=env-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-builder.js","sourceRoot":"","sources":["../../../src/commands/shared/env-builder.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -0,0 +1,316 @@
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 * as fs from 'fs';
7
+ import * as path from 'path';
8
+ function plannerLockPath(projectDir) {
9
+ return `${LOCK_FILE_PREFIX}slicer-${projectRuntimeKey(projectDir)}.lock`;
10
+ }
11
+ function acquirePlannerLock(projectDir) {
12
+ const lockFile = plannerLockPath(projectDir);
13
+ if (fs.existsSync(lockFile)) {
14
+ const pidRaw = fs.readFileSync(lockFile, 'utf-8').trim();
15
+ const pid = parseInt(pidRaw, 10);
16
+ if (!Number.isNaN(pid) && isProcessRunning(pid)) {
17
+ return { acquired: false, lockFile, pid };
18
+ }
19
+ // stale lock
20
+ try {
21
+ fs.unlinkSync(lockFile);
22
+ }
23
+ catch {
24
+ // ignore stale-lock cleanup errors
25
+ }
26
+ }
27
+ fs.writeFileSync(lockFile, String(process.pid));
28
+ return { acquired: true, lockFile };
29
+ }
30
+ function releasePlannerLock(lockFile) {
31
+ try {
32
+ if (fs.existsSync(lockFile)) {
33
+ fs.unlinkSync(lockFile);
34
+ }
35
+ }
36
+ catch {
37
+ // ignore cleanup errors
38
+ }
39
+ }
40
+ function resolvePlannerIssueColumn(config) {
41
+ return config.roadmapScanner.issueColumn === 'Draft' ? 'Draft' : 'Ready';
42
+ }
43
+ export function buildPlannerIssueBody(projectDir, config, result) {
44
+ const relativePrdPath = path.join(config.prdDir, result.file ?? '').replace(/\\/g, '/');
45
+ const absolutePrdPath = path.join(projectDir, config.prdDir, result.file ?? '');
46
+ const sourceItem = result.item;
47
+ let prdContent;
48
+ try {
49
+ prdContent = fs.readFileSync(absolutePrdPath, 'utf-8');
50
+ }
51
+ catch {
52
+ prdContent = `Unable to read generated PRD file at \`${relativePrdPath}\`.`;
53
+ }
54
+ const maxBodyChars = 60000;
55
+ const truncated = prdContent.length > maxBodyChars;
56
+ const prdBody = truncated ? `${prdContent.slice(0, maxBodyChars)}\n\n...[truncated]` : prdContent;
57
+ const metaLines = [`- PRD file: \`${relativePrdPath}\``];
58
+ if (sourceItem) {
59
+ metaLines.push(`- Source section: ${sourceItem.section}`);
60
+ if (sourceItem.description) {
61
+ metaLines.push(`- Source summary: ${sourceItem.description}`);
62
+ }
63
+ }
64
+ return [
65
+ prdBody,
66
+ '',
67
+ '<details>',
68
+ '<summary>Source metadata</summary>',
69
+ '',
70
+ ...metaLines,
71
+ '',
72
+ '</details>',
73
+ ].join('\n');
74
+ }
75
+ export async function createPlannerIssue(projectDir, config, result) {
76
+ if (!result.sliced || !result.file || !result.item) {
77
+ return { created: false, skippedReason: 'nothing-created' };
78
+ }
79
+ if (!config.boardProvider?.enabled) {
80
+ return { created: false, skippedReason: 'board-disabled' };
81
+ }
82
+ const provider = createBoardProvider(config.boardProvider, projectDir);
83
+ const board = await provider.getBoard();
84
+ if (!board) {
85
+ return { created: false, skippedReason: 'board-not-configured' };
86
+ }
87
+ const issueTitle = `PRD: ${result.item.title}`;
88
+ const normalizeTitle = (t) => t.replace(/^PRD:\s*/i, '').trim().toLowerCase();
89
+ const existingIssues = await provider.getAllIssues();
90
+ const existing = existingIssues.find((issue) => normalizeTitle(issue.title) === normalizeTitle(result.item.title));
91
+ if (existing) {
92
+ return {
93
+ created: false,
94
+ skippedReason: 'already-exists',
95
+ issueNumber: existing.number,
96
+ issueUrl: existing.url,
97
+ };
98
+ }
99
+ const issue = await provider.createIssue({
100
+ title: issueTitle,
101
+ body: buildPlannerIssueBody(projectDir, config, result),
102
+ column: resolvePlannerIssueColumn(config),
103
+ });
104
+ return {
105
+ created: true,
106
+ issueNumber: issue.number,
107
+ issueUrl: issue.url,
108
+ };
109
+ }
110
+ /**
111
+ * Build environment variables map from config and CLI options for slicer
112
+ */
113
+ export function buildEnvVars(config, options) {
114
+ // Start with base env vars shared by all job types
115
+ const env = buildBaseEnvVars(config, 'slicer', options.dryRun);
116
+ // Slicer runtime
117
+ env.NW_SLICER_MAX_RUNTIME = String(config.roadmapScanner.slicerMaxRuntime);
118
+ // PRD directory for slicer output
119
+ env.NW_PRD_DIR = config.prdDir;
120
+ // Roadmap path
121
+ env.NW_ROADMAP_PATH = config.roadmapScanner.roadmapPath;
122
+ env.NW_CLAUDE_MODEL_ID =
123
+ CLAUDE_MODEL_IDS[config.primaryFallbackModel ?? config.claudeModel ?? 'sonnet'];
124
+ // Telegram status messages from bash scripts (start/progress/final status)
125
+ const telegramWebhooks = getTelegramStatusWebhooks(config);
126
+ if (telegramWebhooks.length > 0) {
127
+ env.NW_TELEGRAM_STATUS_WEBHOOKS = JSON.stringify(telegramWebhooks);
128
+ env.NW_TELEGRAM_BOT_TOKEN = telegramWebhooks[0].botToken;
129
+ env.NW_TELEGRAM_CHAT_ID = telegramWebhooks[0].chatId;
130
+ }
131
+ return env;
132
+ }
133
+ /**
134
+ * Apply CLI flag overrides to the config for slicer
135
+ */
136
+ export function applyCliOverrides(config, options) {
137
+ const overridden = { ...config };
138
+ if (options.timeout) {
139
+ const timeout = parseInt(options.timeout, 10);
140
+ if (!isNaN(timeout)) {
141
+ overridden.roadmapScanner = {
142
+ ...overridden.roadmapScanner,
143
+ slicerMaxRuntime: timeout,
144
+ };
145
+ }
146
+ }
147
+ if (options.provider) {
148
+ // Use _cliProviderOverride to ensure CLI flag takes precedence over jobProviders
149
+ overridden._cliProviderOverride = options.provider;
150
+ }
151
+ return overridden;
152
+ }
153
+ /**
154
+ * Register the slice command with the program
155
+ */
156
+ export function sliceCommand(program) {
157
+ program
158
+ .command('slice')
159
+ .alias('planner')
160
+ .description('Run Planner (roadmap slicer) to create a PRD from the next roadmap item')
161
+ .option('--dry-run', 'Show what would be executed without running')
162
+ .option('--timeout <seconds>', 'Override max runtime in seconds for slicer')
163
+ .option('--provider <string>', 'AI provider to use (claude or codex)')
164
+ .action(async (options) => {
165
+ // Get the project directory (current working directory)
166
+ const projectDir = process.cwd();
167
+ const lockResult = acquirePlannerLock(projectDir);
168
+ if (!lockResult.acquired) {
169
+ info(`Planner is already running${lockResult.pid ? ` (PID ${lockResult.pid})` : ''}`);
170
+ process.exit(0);
171
+ }
172
+ const cleanupLock = () => releasePlannerLock(lockResult.lockFile);
173
+ process.on('exit', cleanupLock);
174
+ // Load config from file and environment
175
+ let config = loadConfig(projectDir);
176
+ // Apply CLI flag overrides
177
+ config = applyCliOverrides(config, options);
178
+ // Build environment variables
179
+ const envVars = buildEnvVars(config, options);
180
+ if (options.dryRun) {
181
+ header('Dry Run: Planner');
182
+ // Resolve slicer-specific provider
183
+ const slicerProvider = resolveJobProvider(config, 'slicer');
184
+ // Configuration section with table
185
+ header('Configuration');
186
+ const configTable = createTable({ head: ['Setting', 'Value'] });
187
+ configTable.push(['Provider', slicerProvider]);
188
+ configTable.push(['Provider CLI', PROVIDER_COMMANDS[slicerProvider]]);
189
+ configTable.push(['PRD Directory', config.prdDir]);
190
+ configTable.push(['Roadmap Path', config.roadmapScanner.roadmapPath]);
191
+ configTable.push([
192
+ 'Planner Max Runtime',
193
+ `${config.roadmapScanner.slicerMaxRuntime}s (${Math.floor(config.roadmapScanner.slicerMaxRuntime / 60)}min)`,
194
+ ]);
195
+ configTable.push(['Planner Schedule', config.roadmapScanner.slicerSchedule]);
196
+ configTable.push(['Planner Priority Mode', config.roadmapScanner.priorityMode]);
197
+ configTable.push(['Planner Issue Column', resolvePlannerIssueColumn(config)]);
198
+ configTable.push(['Scanner Enabled', config.roadmapScanner.enabled ? 'Yes' : 'No']);
199
+ console.log(configTable.toString());
200
+ // Get roadmap status
201
+ header('Roadmap Status');
202
+ const roadmapStatus = getRoadmapStatus(projectDir, config);
203
+ if (!config.roadmapScanner.enabled) {
204
+ dim(' Roadmap scanner is disabled');
205
+ }
206
+ else if (roadmapStatus.status === 'no-roadmap') {
207
+ dim(` ROADMAP.md not found at ${config.roadmapScanner.roadmapPath}`);
208
+ }
209
+ else {
210
+ const statusTable = createTable({ head: ['Metric', 'Count'] });
211
+ statusTable.push(['Total Items', roadmapStatus.totalItems]);
212
+ statusTable.push(['Processed', roadmapStatus.processedItems]);
213
+ statusTable.push(['Pending', roadmapStatus.pendingItems]);
214
+ statusTable.push(['Status', roadmapStatus.status]);
215
+ console.log(statusTable.toString());
216
+ // Show pending items
217
+ if (roadmapStatus.pendingItems > 0) {
218
+ header('Pending Items');
219
+ const pendingItems = roadmapStatus.items.filter((item) => !item.processed && !item.checked);
220
+ for (const item of pendingItems.slice(0, 10)) {
221
+ info(` - ${item.title}`);
222
+ if (item.section) {
223
+ dim(` Section: ${item.section}`);
224
+ }
225
+ }
226
+ if (pendingItems.length > 10) {
227
+ dim(` ... and ${pendingItems.length - 10} more`);
228
+ }
229
+ }
230
+ }
231
+ // Provider invocation command
232
+ header('Provider Invocation');
233
+ if (slicerProvider === 'claude') {
234
+ dim(' claude -p "/night-watch-slicer" --dangerously-skip-permissions');
235
+ }
236
+ else {
237
+ dim(' codex exec --yolo "/night-watch-slicer"');
238
+ }
239
+ // Environment variables
240
+ header('Environment Variables');
241
+ for (const [key, value] of Object.entries(envVars)) {
242
+ dim(` ${key}=${value}`);
243
+ }
244
+ // Full command that would be executed
245
+ header('Action');
246
+ dim(' Would invoke sliceNextItem() to process one roadmap item');
247
+ console.log();
248
+ process.exit(0);
249
+ }
250
+ // Check if roadmap scanner is enabled
251
+ if (!config.roadmapScanner.enabled) {
252
+ info('Planner is disabled in config; skipping run.');
253
+ process.exit(0);
254
+ }
255
+ // Execute planner with spinner
256
+ const spinner = createSpinner('Running Planner...');
257
+ spinner.start();
258
+ try {
259
+ await maybeApplyCronSchedulingDelay(config, 'slicer', projectDir);
260
+ const result = await sliceNextItem(projectDir, config);
261
+ let issueSummary = '';
262
+ if (result.sliced) {
263
+ try {
264
+ const issueResult = await createPlannerIssue(projectDir, config, result);
265
+ if (issueResult.created && issueResult.issueNumber) {
266
+ issueSummary = `; issue #${issueResult.issueNumber} (${resolvePlannerIssueColumn(config)})`;
267
+ }
268
+ else if (issueResult.skippedReason === 'already-exists' && issueResult.issueNumber) {
269
+ issueSummary = `; existing issue #${issueResult.issueNumber}`;
270
+ }
271
+ }
272
+ catch (issueError) {
273
+ warn(`Planner created ${result.file} but failed to create board issue: ${issueError instanceof Error ? issueError.message : String(issueError)}`);
274
+ }
275
+ }
276
+ if (result.sliced) {
277
+ spinner.succeed(`Planner completed successfully: Created ${result.file}${issueSummary}`);
278
+ }
279
+ else if (result.error) {
280
+ if (result.error === 'No pending items to process') {
281
+ spinner.succeed('No pending items to process');
282
+ }
283
+ else {
284
+ spinner.fail(`Planner failed: ${result.error}`);
285
+ }
286
+ }
287
+ // Send notifications (fire-and-forget, failures do not affect exit code)
288
+ const nothingPending = result.error === 'No pending items to process';
289
+ const exitCode = result.sliced || nothingPending ? 0 : 1;
290
+ if (!options.dryRun && result.sliced) {
291
+ await sendNotifications(config, {
292
+ event: 'run_succeeded',
293
+ projectName: path.basename(projectDir),
294
+ exitCode,
295
+ provider: config.provider,
296
+ prTitle: result.item?.title,
297
+ });
298
+ }
299
+ else if (!options.dryRun && !nothingPending) {
300
+ await sendNotifications(config, {
301
+ event: 'run_failed',
302
+ projectName: path.basename(projectDir),
303
+ exitCode,
304
+ provider: config.provider,
305
+ });
306
+ }
307
+ process.exit(exitCode);
308
+ }
309
+ catch (err) {
310
+ spinner.fail('Failed to execute planner command');
311
+ uiError(`${err instanceof Error ? err.message : String(err)}`);
312
+ process.exit(1);
313
+ }
314
+ });
315
+ }
316
+ //# 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