@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.3
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.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.js +1812 -631
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +12 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +307 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.js +69 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +19 -0
- package/dist/commands/audit.js +144 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/board.d.ts +9 -0
- package/dist/commands/board.js +702 -0
- package/dist/commands/board.js.map +1 -0
- package/dist/commands/cancel.d.ts +46 -0
- package/dist/commands/cancel.js +239 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/cron.d.ts +8 -0
- package/dist/commands/cron.js +134 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/dashboard/tab-actions.d.ts +10 -0
- package/dist/commands/dashboard/tab-actions.js +247 -0
- package/dist/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/commands/dashboard/tab-config.d.ts +21 -0
- package/dist/commands/dashboard/tab-config.js +874 -0
- package/dist/commands/dashboard/tab-config.js.map +1 -0
- package/dist/commands/dashboard/tab-logs.d.ts +10 -0
- package/dist/commands/dashboard/tab-logs.js +202 -0
- package/dist/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
- package/dist/commands/dashboard/tab-schedules.js +320 -0
- package/dist/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/commands/dashboard/tab-status.d.ts +32 -0
- package/dist/commands/dashboard/tab-status.js +424 -0
- package/dist/commands/dashboard/tab-status.js.map +1 -0
- package/dist/commands/dashboard/types.d.ts +42 -0
- package/dist/commands/dashboard/types.js +5 -0
- package/dist/commands/dashboard/types.js.map +1 -0
- package/dist/commands/dashboard.d.ts +11 -0
- package/dist/commands/dashboard.js +242 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.js +195 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/history.d.ts +7 -0
- package/dist/commands/history.js +49 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +45 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +12 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +65 -0
- package/dist/commands/install.js +405 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +15 -0
- package/dist/commands/logs.js +155 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/merge.d.ts +26 -0
- package/dist/commands/merge.js +159 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/notify.d.ts +7 -0
- package/dist/commands/notify.js +43 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/plan.d.ts +19 -0
- package/dist/commands/plan.js +88 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prd-state.d.ts +12 -0
- package/dist/commands/prd-state.js +47 -0
- package/dist/commands/prd-state.js.map +1 -0
- package/dist/commands/prd.d.ts +18 -0
- package/dist/commands/prd.js +363 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/prds.d.ts +13 -0
- package/dist/commands/prds.js +194 -0
- package/dist/commands/prds.js.map +1 -0
- package/dist/commands/prs.d.ts +14 -0
- package/dist/commands/prs.js +104 -0
- package/dist/commands/prs.js.map +1 -0
- package/dist/commands/qa.d.ts +34 -0
- package/dist/commands/qa.js +214 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/queue.d.ts +8 -0
- package/dist/commands/queue.d.ts.map +1 -1
- package/dist/commands/queue.js +398 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/resolve.d.ts +26 -0
- package/dist/commands/resolve.js +186 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/retry.d.ts +9 -0
- package/dist/commands/retry.js +71 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/review.d.ts +77 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +1 -74
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +73 -0
- package/dist/commands/serve.d.ts +19 -0
- package/dist/commands/serve.js +142 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/shared/env-builder.d.ts +49 -0
- package/dist/commands/shared/env-builder.d.ts.map +1 -1
- package/dist/commands/shared/env-builder.js +152 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.js +316 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.js +54 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/status.d.ts +14 -0
- package/dist/commands/status.js +297 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summary.d.ts +14 -0
- package/dist/commands/summary.js +193 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/uninstall.d.ts +25 -0
- package/dist/commands/uninstall.js +134 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/scripts/night-watch-audit-cron.sh +1 -0
- package/dist/scripts/night-watch-cron.sh +1 -0
- package/dist/scripts/night-watch-helpers.sh +22 -1
- package/dist/scripts/night-watch-merger-cron.sh +32 -3
- package/dist/scripts/night-watch-plan-cron.sh +2 -0
- package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +18 -5
- package/dist/scripts/night-watch-qa-cron.sh +8 -1
- package/dist/scripts/night-watch-slicer-cron.sh +3 -0
- package/dist/templates/night-watch.config.json +21 -20
- package/dist/web/assets/index-C-xpWpS8.css +1 -0
- package/dist/web/assets/index-CEYe-290.js +412 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
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_PR_RESOLVER_READY_LABEL = config.prResolver?.readyLabel ?? 'ready-to-merge';
|
|
78
|
+
env.NW_GIT_PUSH_NO_VERIFY = config.gitPushNoVerify ? '1' : '0';
|
|
79
|
+
// Provider environment variables (API keys, base URLs, etc.)
|
|
80
|
+
// First apply config.providerEnv for backward compat
|
|
81
|
+
if (config.providerEnv) {
|
|
82
|
+
Object.assign(env, config.providerEnv);
|
|
83
|
+
}
|
|
84
|
+
// Then apply preset.envVars (takes precedence over config.providerEnv)
|
|
85
|
+
if (preset.envVars) {
|
|
86
|
+
Object.assign(env, preset.envVars);
|
|
87
|
+
}
|
|
88
|
+
// Queue configuration
|
|
89
|
+
const queueConfig = config.queue ?? DEFAULT_QUEUE;
|
|
90
|
+
env.NW_QUEUE_ENABLED = queueConfig.enabled ? '1' : '0';
|
|
91
|
+
env.NW_QUEUE_MAX_CONCURRENCY = String(queueConfig.maxConcurrency);
|
|
92
|
+
env.NW_QUEUE_MAX_WAIT_TIME = String(queueConfig.maxWaitTime);
|
|
93
|
+
env.NW_QUEUE_PRIORITY_JSON = JSON.stringify(queueConfig.priority);
|
|
94
|
+
env.NW_SCHEDULING_PRIORITY = String(config.schedulingPriority ?? 3);
|
|
95
|
+
// Dry run flag
|
|
96
|
+
if (isDryRun) {
|
|
97
|
+
env.NW_DRY_RUN = '1';
|
|
98
|
+
}
|
|
99
|
+
// Sandbox flag - prevents the agent from modifying crontab during execution
|
|
100
|
+
env.NW_EXECUTION_CONTEXT = 'agent';
|
|
101
|
+
return env;
|
|
102
|
+
}
|
|
103
|
+
export function getCronSchedulingPlan(config, jobType, projectDir) {
|
|
104
|
+
return getSchedulingPlan(projectDir, config, jobType);
|
|
105
|
+
}
|
|
106
|
+
export async function maybeApplyCronSchedulingDelay(config, jobType, projectDir) {
|
|
107
|
+
const plan = getSchedulingPlan(projectDir, config, jobType);
|
|
108
|
+
if (process.env.NW_CRON_TRIGGER !== '1' || process.env.NW_QUEUE_DISPATCHED === '1') {
|
|
109
|
+
return plan;
|
|
110
|
+
}
|
|
111
|
+
if (plan.totalDelayMinutes > 0) {
|
|
112
|
+
await new Promise((resolve) => setTimeout(resolve, plan.totalDelayMinutes * 60_000));
|
|
113
|
+
}
|
|
114
|
+
return getSchedulingPlan(projectDir, config, jobType);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Format provider display for notifications/UI using command + label.
|
|
118
|
+
*/
|
|
119
|
+
export function formatProviderDisplay(providerCmd, providerLabel) {
|
|
120
|
+
const cmd = providerCmd?.trim();
|
|
121
|
+
if (!cmd)
|
|
122
|
+
return 'unknown';
|
|
123
|
+
const label = providerLabel?.trim();
|
|
124
|
+
if (!label)
|
|
125
|
+
return cmd;
|
|
126
|
+
if (label.toLowerCase() === cmd.toLowerCase())
|
|
127
|
+
return cmd;
|
|
128
|
+
return `${cmd} (${label})`;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Rebuild environment variables for a queued job from the job's own project config.
|
|
132
|
+
* This ensures provider-specific env (ANTHROPIC_BASE_URL, API keys, model ids)
|
|
133
|
+
* always comes from the queued job's own project config, not the dispatcher process env.
|
|
134
|
+
*/
|
|
135
|
+
export function buildQueuedJobEnv(entry) {
|
|
136
|
+
const config = loadConfig(entry.projectPath);
|
|
137
|
+
return buildBaseEnvVars(config, entry.jobType, false);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Extract Telegram webhooks that have both botToken and chatId configured.
|
|
141
|
+
* Used for status messages from bash scripts (start/progress/final status).
|
|
142
|
+
*/
|
|
143
|
+
export function getTelegramStatusWebhooks(config) {
|
|
144
|
+
return (config.notifications?.webhooks ?? [])
|
|
145
|
+
.filter((wh) => wh.type === 'telegram' &&
|
|
146
|
+
typeof wh.botToken === 'string' &&
|
|
147
|
+
wh.botToken.trim().length > 0 &&
|
|
148
|
+
typeof wh.chatId === 'string' &&
|
|
149
|
+
wh.chatId.trim().length > 0)
|
|
150
|
+
.map((wh) => ({ botToken: wh.botToken, chatId: wh.chatId }));
|
|
151
|
+
}
|
|
152
|
+
//# 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
|