@jonit-dev/night-watch-cli 1.0.0
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/LICENSE +21 -0
- package/README.md +509 -0
- package/bin/night-watch.mjs +2 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +35 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +376 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +15 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +135 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +15 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +104 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/review.d.ts +26 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +144 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +26 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +161 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/status.d.ts +14 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +303 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/uninstall.d.ts +13 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +97 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +213 -0
- package/dist/config.js.map +1 -0
- package/dist/constants.d.ts +21 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +33 -0
- package/dist/constants.js.map +1 -0
- package/dist/types.d.ts +35 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/crontab.d.ts +50 -0
- package/dist/utils/crontab.d.ts.map +1 -0
- package/dist/utils/crontab.js +116 -0
- package/dist/utils/crontab.js.map +1 -0
- package/dist/utils/shell.d.ts +13 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +44 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/ui.d.ts +55 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +121 -0
- package/dist/utils/ui.js.map +1 -0
- package/package.json +64 -0
- package/scripts/night-watch-cron.sh +148 -0
- package/scripts/night-watch-helpers.sh +155 -0
- package/scripts/night-watch-pr-reviewer-cron.sh +135 -0
- package/templates/night-watch-pr-reviewer.md +144 -0
- package/templates/night-watch.config.json +21 -0
- package/templates/night-watch.md +100 -0
- package/templates/prd-executor.md +235 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logs command for Night Watch CLI
|
|
3
|
+
* View log output from executor and reviewer
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from "child_process";
|
|
6
|
+
import * as path from "path";
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import { LOG_DIR } from "../constants.js";
|
|
9
|
+
import { header, dim } from "../utils/ui.js";
|
|
10
|
+
/**
|
|
11
|
+
* Get last N lines from a file
|
|
12
|
+
*/
|
|
13
|
+
function getLastLines(filePath, lineCount) {
|
|
14
|
+
if (!fs.existsSync(filePath)) {
|
|
15
|
+
return `Log file not found: ${filePath}`;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
const content = fs.readFileSync(filePath, "utf-8");
|
|
19
|
+
const lines = content.trim().split("\n");
|
|
20
|
+
return lines.slice(-lineCount).join("\n");
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return `Error reading log file: ${error instanceof Error ? error.message : String(error)}`;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Follow log file in real-time using tail -f
|
|
28
|
+
*/
|
|
29
|
+
function followLog(filePath) {
|
|
30
|
+
if (!fs.existsSync(filePath)) {
|
|
31
|
+
console.log(`Log file not found: ${filePath}`);
|
|
32
|
+
console.log("The log file will be created when the first execution runs.");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const tail = spawn("tail", ["-f", filePath], {
|
|
36
|
+
stdio: "inherit",
|
|
37
|
+
});
|
|
38
|
+
tail.on("error", (error) => {
|
|
39
|
+
console.error(`Error following log: ${error.message}`);
|
|
40
|
+
});
|
|
41
|
+
// Handle Ctrl+C gracefully
|
|
42
|
+
process.on("SIGINT", () => {
|
|
43
|
+
tail.kill();
|
|
44
|
+
process.exit(0);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Logs command implementation
|
|
49
|
+
*/
|
|
50
|
+
export function logsCommand(program) {
|
|
51
|
+
program
|
|
52
|
+
.command("logs")
|
|
53
|
+
.description("View night-watch log output")
|
|
54
|
+
.option("-n, --lines <count>", "Number of lines to show", "50")
|
|
55
|
+
.option("-f, --follow", "Follow log output (tail -f)")
|
|
56
|
+
.option("-t, --type <type>", "Log type to view (run|review|all)", "all")
|
|
57
|
+
.action(async (options) => {
|
|
58
|
+
try {
|
|
59
|
+
const projectDir = process.cwd();
|
|
60
|
+
const logDir = path.join(projectDir, LOG_DIR);
|
|
61
|
+
const lineCount = parseInt(options.lines || "50", 10);
|
|
62
|
+
const executorLog = path.join(logDir, "executor.log");
|
|
63
|
+
const reviewerLog = path.join(logDir, "reviewer.log");
|
|
64
|
+
// Determine which logs to show
|
|
65
|
+
const logType = options.type?.toLowerCase() || "all";
|
|
66
|
+
const showExecutor = logType === "all" || logType === "run" || logType === "executor";
|
|
67
|
+
const showReviewer = logType === "all" || logType === "review" || logType === "reviewer";
|
|
68
|
+
// Handle --follow mode
|
|
69
|
+
if (options.follow) {
|
|
70
|
+
if (logType === "all") {
|
|
71
|
+
dim("Note: Following all logs is not supported. Showing executor log.");
|
|
72
|
+
dim("Use --type review to follow reviewer log.\n");
|
|
73
|
+
}
|
|
74
|
+
const targetLog = showReviewer ? reviewerLog : executorLog;
|
|
75
|
+
followLog(targetLog);
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
// Show static log output
|
|
79
|
+
console.log();
|
|
80
|
+
if (showExecutor) {
|
|
81
|
+
header("Executor Log");
|
|
82
|
+
dim(`File: ${executorLog}`);
|
|
83
|
+
console.log();
|
|
84
|
+
console.log(getLastLines(executorLog, lineCount));
|
|
85
|
+
}
|
|
86
|
+
if (showReviewer) {
|
|
87
|
+
header("Reviewer Log");
|
|
88
|
+
dim(`File: ${reviewerLog}`);
|
|
89
|
+
console.log();
|
|
90
|
+
console.log(getLastLines(reviewerLog, lineCount));
|
|
91
|
+
}
|
|
92
|
+
// Add tip
|
|
93
|
+
console.log();
|
|
94
|
+
dim("---");
|
|
95
|
+
dim("Tip: Use -f to follow logs in real-time");
|
|
96
|
+
dim(" Use --type run or --type review to view specific logs");
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
console.error(`Error reading logs: ${err instanceof Error ? err.message : String(err)}`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review command - executes the PR reviewer cron script
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { INightWatchConfig } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Options for the review command
|
|
8
|
+
*/
|
|
9
|
+
export interface ReviewOptions {
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
timeout?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build environment variables map from config and CLI options for reviewer
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildEnvVars(config: INightWatchConfig, options: ReviewOptions): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Apply CLI flag overrides to the config for reviewer
|
|
20
|
+
*/
|
|
21
|
+
export declare function applyCliOverrides(config: INightWatchConfig, options: ReviewOptions): INightWatchConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Register the review command with the program
|
|
24
|
+
*/
|
|
25
|
+
export declare function reviewCommand(program: Command): void;
|
|
26
|
+
//# sourceMappingURL=review.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAahD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAetG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,aAAa,GAAG,iBAAiB,CAetG;AA+BD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuFpD"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Review command - executes the PR reviewer cron script
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig, getScriptPath } from "../config.js";
|
|
5
|
+
import { executeScript } from "../utils/shell.js";
|
|
6
|
+
import { PROVIDER_COMMANDS } from "../constants.js";
|
|
7
|
+
import { execSync } from "child_process";
|
|
8
|
+
import { header, dim, info, error as uiError, createSpinner, createTable, } from "../utils/ui.js";
|
|
9
|
+
/**
|
|
10
|
+
* Build environment variables map from config and CLI options for reviewer
|
|
11
|
+
*/
|
|
12
|
+
export function buildEnvVars(config, options) {
|
|
13
|
+
const env = {};
|
|
14
|
+
// Provider command - the actual CLI binary to call
|
|
15
|
+
env.NW_PROVIDER_CMD = PROVIDER_COMMANDS[config.provider];
|
|
16
|
+
// Runtime for reviewer (uses NW_REVIEWER_* variables)
|
|
17
|
+
env.NW_REVIEWER_MAX_RUNTIME = String(config.reviewerMaxRuntime);
|
|
18
|
+
// Dry run flag
|
|
19
|
+
if (options.dryRun) {
|
|
20
|
+
env.NW_DRY_RUN = "1";
|
|
21
|
+
}
|
|
22
|
+
return env;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Apply CLI flag overrides to the config for reviewer
|
|
26
|
+
*/
|
|
27
|
+
export function applyCliOverrides(config, options) {
|
|
28
|
+
const overridden = { ...config };
|
|
29
|
+
if (options.timeout) {
|
|
30
|
+
const timeout = parseInt(options.timeout, 10);
|
|
31
|
+
if (!isNaN(timeout)) {
|
|
32
|
+
overridden.reviewerMaxRuntime = timeout;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (options.provider) {
|
|
36
|
+
overridden.provider = options.provider;
|
|
37
|
+
}
|
|
38
|
+
return overridden;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get open PRs that need work (matching branch patterns)
|
|
42
|
+
*/
|
|
43
|
+
function getOpenPrsNeedingWork(branchPatterns) {
|
|
44
|
+
try {
|
|
45
|
+
// Build the search query for PRs matching branch patterns
|
|
46
|
+
const headFilter = branchPatterns.map((p) => `--head "${p}"`).join(" ");
|
|
47
|
+
// Get open PRs as JSON
|
|
48
|
+
const result = execSync(`gh pr list --state open --json number,title,headRefName ${headFilter} 2>/dev/null || echo "[]"`, {
|
|
49
|
+
encoding: "utf-8",
|
|
50
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
51
|
+
});
|
|
52
|
+
const prs = JSON.parse(result.trim() || "[]");
|
|
53
|
+
return prs.map((pr) => ({
|
|
54
|
+
number: pr.number,
|
|
55
|
+
title: pr.title,
|
|
56
|
+
branch: pr.headRefName,
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// gh CLI not available or not authenticated
|
|
61
|
+
return [];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Register the review command with the program
|
|
66
|
+
*/
|
|
67
|
+
export function reviewCommand(program) {
|
|
68
|
+
program
|
|
69
|
+
.command("review")
|
|
70
|
+
.description("Run PR reviewer now")
|
|
71
|
+
.option("--dry-run", "Show what would be executed without running")
|
|
72
|
+
.option("--timeout <seconds>", "Override max runtime in seconds for reviewer")
|
|
73
|
+
.option("--provider <string>", "AI provider to use (claude or codex)")
|
|
74
|
+
.action(async (options) => {
|
|
75
|
+
// Get the project directory (current working directory)
|
|
76
|
+
const projectDir = process.cwd();
|
|
77
|
+
// Load config from file and environment
|
|
78
|
+
let config = loadConfig(projectDir);
|
|
79
|
+
// Apply CLI flag overrides
|
|
80
|
+
config = applyCliOverrides(config, options);
|
|
81
|
+
// Build environment variables
|
|
82
|
+
const envVars = buildEnvVars(config, options);
|
|
83
|
+
// Get the script path
|
|
84
|
+
const scriptPath = getScriptPath("night-watch-pr-reviewer-cron.sh");
|
|
85
|
+
if (options.dryRun) {
|
|
86
|
+
header("Dry Run: PR Reviewer");
|
|
87
|
+
// Configuration section with table
|
|
88
|
+
header("Configuration");
|
|
89
|
+
const configTable = createTable({ head: ["Setting", "Value"] });
|
|
90
|
+
configTable.push(["Provider", config.provider]);
|
|
91
|
+
configTable.push(["Provider CLI", PROVIDER_COMMANDS[config.provider]]);
|
|
92
|
+
configTable.push(["Max Runtime", `${config.reviewerMaxRuntime}s (${Math.floor(config.reviewerMaxRuntime / 60)}min)`]);
|
|
93
|
+
configTable.push(["Min Review Score", `${config.minReviewScore}/100`]);
|
|
94
|
+
configTable.push(["Branch Patterns", config.branchPatterns.join(", ")]);
|
|
95
|
+
console.log(configTable.toString());
|
|
96
|
+
// Check for open PRs needing work
|
|
97
|
+
header("Open PRs Needing Work");
|
|
98
|
+
const openPrs = getOpenPrsNeedingWork(config.branchPatterns);
|
|
99
|
+
if (openPrs.length === 0) {
|
|
100
|
+
dim(" (no open PRs matching branch patterns)");
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
for (const pr of openPrs) {
|
|
104
|
+
info(`#${pr.number}: ${pr.title}`);
|
|
105
|
+
dim(` Branch: ${pr.branch}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Provider invocation command
|
|
109
|
+
header("Provider Invocation");
|
|
110
|
+
const providerCmd = PROVIDER_COMMANDS[config.provider];
|
|
111
|
+
const autoFlag = config.provider === "claude" ? "--dangerously-skip-permissions" : "--yolo";
|
|
112
|
+
dim(` ${providerCmd} ${autoFlag} -p "/night-watch-pr-reviewer"`);
|
|
113
|
+
// Environment variables
|
|
114
|
+
header("Environment Variables");
|
|
115
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
116
|
+
dim(` ${key}=${value}`);
|
|
117
|
+
}
|
|
118
|
+
// Full command that would be executed
|
|
119
|
+
header("Command");
|
|
120
|
+
dim(` bash ${scriptPath} ${projectDir}`);
|
|
121
|
+
console.log();
|
|
122
|
+
process.exit(0);
|
|
123
|
+
}
|
|
124
|
+
// Execute the script with spinner
|
|
125
|
+
const spinner = createSpinner("Running PR reviewer...");
|
|
126
|
+
spinner.start();
|
|
127
|
+
try {
|
|
128
|
+
const exitCode = await executeScript(scriptPath, [projectDir], envVars);
|
|
129
|
+
if (exitCode === 0) {
|
|
130
|
+
spinner.succeed("PR reviewer completed successfully");
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
spinner.fail(`PR reviewer exited with code ${exitCode}`);
|
|
134
|
+
}
|
|
135
|
+
process.exit(exitCode);
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
spinner.fail("Failed to execute review command");
|
|
139
|
+
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
140
|
+
process.exit(1);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run command - executes the PRD cron script
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
import { INightWatchConfig } from "../types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Options for the run command
|
|
8
|
+
*/
|
|
9
|
+
export interface RunOptions {
|
|
10
|
+
dryRun: boolean;
|
|
11
|
+
timeout?: string;
|
|
12
|
+
provider?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Build environment variables map from config and CLI options
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildEnvVars(config: INightWatchConfig, options: RunOptions): Record<string, string>;
|
|
18
|
+
/**
|
|
19
|
+
* Apply CLI flag overrides to the config
|
|
20
|
+
*/
|
|
21
|
+
export declare function applyCliOverrides(config: INightWatchConfig, options: RunOptions): INightWatchConfig;
|
|
22
|
+
/**
|
|
23
|
+
* Register the run command with the program
|
|
24
|
+
*/
|
|
25
|
+
export declare function runCommand(program: Command): void;
|
|
26
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAgBhD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAenG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,GAAG,iBAAiB,CAenG;AAmCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmGjD"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run command - executes the PRD cron script
|
|
3
|
+
*/
|
|
4
|
+
import { loadConfig, getScriptPath } from "../config.js";
|
|
5
|
+
import { executeScript } from "../utils/shell.js";
|
|
6
|
+
import { PROVIDER_COMMANDS } from "../constants.js";
|
|
7
|
+
import * as fs from "fs";
|
|
8
|
+
import * as path from "path";
|
|
9
|
+
import { header, dim, info, error as uiError, createSpinner, createTable, } from "../utils/ui.js";
|
|
10
|
+
/**
|
|
11
|
+
* Build environment variables map from config and CLI options
|
|
12
|
+
*/
|
|
13
|
+
export function buildEnvVars(config, options) {
|
|
14
|
+
const env = {};
|
|
15
|
+
// Provider command - the actual CLI binary to call
|
|
16
|
+
env.NW_PROVIDER_CMD = PROVIDER_COMMANDS[config.provider];
|
|
17
|
+
// Runtime
|
|
18
|
+
env.NW_MAX_RUNTIME = String(config.maxRuntime);
|
|
19
|
+
// Dry run flag
|
|
20
|
+
if (options.dryRun) {
|
|
21
|
+
env.NW_DRY_RUN = "1";
|
|
22
|
+
}
|
|
23
|
+
return env;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Apply CLI flag overrides to the config
|
|
27
|
+
*/
|
|
28
|
+
export function applyCliOverrides(config, options) {
|
|
29
|
+
const overridden = { ...config };
|
|
30
|
+
if (options.timeout) {
|
|
31
|
+
const timeout = parseInt(options.timeout, 10);
|
|
32
|
+
if (!isNaN(timeout)) {
|
|
33
|
+
overridden.maxRuntime = timeout;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (options.provider) {
|
|
37
|
+
overridden.provider = options.provider;
|
|
38
|
+
}
|
|
39
|
+
return overridden;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Scan the PRD directory for eligible PRD files
|
|
43
|
+
*/
|
|
44
|
+
function scanPrdDirectory(projectDir, prdDir) {
|
|
45
|
+
const absolutePrdDir = path.join(projectDir, prdDir);
|
|
46
|
+
const doneDir = path.join(absolutePrdDir, "done");
|
|
47
|
+
const pending = [];
|
|
48
|
+
const completed = [];
|
|
49
|
+
// Scan main PRD directory for pending PRDs
|
|
50
|
+
if (fs.existsSync(absolutePrdDir)) {
|
|
51
|
+
const entries = fs.readdirSync(absolutePrdDir, { withFileTypes: true });
|
|
52
|
+
for (const entry of entries) {
|
|
53
|
+
if (entry.isFile() && entry.name.endsWith(".md") && entry.name !== "NIGHT-WATCH-SUMMARY.md") {
|
|
54
|
+
pending.push(entry.name);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Scan done directory for completed PRDs
|
|
59
|
+
if (fs.existsSync(doneDir)) {
|
|
60
|
+
const entries = fs.readdirSync(doneDir, { withFileTypes: true });
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
if (entry.isFile() && entry.name.endsWith(".md")) {
|
|
63
|
+
completed.push(entry.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return { pending, completed };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register the run command with the program
|
|
71
|
+
*/
|
|
72
|
+
export function runCommand(program) {
|
|
73
|
+
program
|
|
74
|
+
.command("run")
|
|
75
|
+
.description("Run PRD executor now")
|
|
76
|
+
.option("--dry-run", "Show what would be executed without running")
|
|
77
|
+
.option("--timeout <seconds>", "Override max runtime in seconds")
|
|
78
|
+
.option("--provider <string>", "AI provider to use (claude or codex)")
|
|
79
|
+
.action(async (options) => {
|
|
80
|
+
// Get the project directory (current working directory)
|
|
81
|
+
const projectDir = process.cwd();
|
|
82
|
+
// Load config from file and environment
|
|
83
|
+
let config = loadConfig(projectDir);
|
|
84
|
+
// Apply CLI flag overrides
|
|
85
|
+
config = applyCliOverrides(config, options);
|
|
86
|
+
// Build environment variables
|
|
87
|
+
const envVars = buildEnvVars(config, options);
|
|
88
|
+
// Get the script path
|
|
89
|
+
const scriptPath = getScriptPath("night-watch-cron.sh");
|
|
90
|
+
if (options.dryRun) {
|
|
91
|
+
header("Dry Run: PRD Executor");
|
|
92
|
+
// Configuration section with table
|
|
93
|
+
header("Configuration");
|
|
94
|
+
const configTable = createTable({ head: ["Setting", "Value"] });
|
|
95
|
+
configTable.push(["Provider", config.provider]);
|
|
96
|
+
configTable.push(["Provider CLI", PROVIDER_COMMANDS[config.provider]]);
|
|
97
|
+
configTable.push(["PRD Directory", config.prdDir]);
|
|
98
|
+
configTable.push(["Max Runtime", `${config.maxRuntime}s (${Math.floor(config.maxRuntime / 60)}min)`]);
|
|
99
|
+
configTable.push(["Branch Prefix", config.branchPrefix]);
|
|
100
|
+
console.log(configTable.toString());
|
|
101
|
+
// Scan for PRDs
|
|
102
|
+
header("PRD Status");
|
|
103
|
+
const prdStatus = scanPrdDirectory(projectDir, config.prdDir);
|
|
104
|
+
if (prdStatus.pending.length === 0) {
|
|
105
|
+
dim(" Pending: (none)");
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
info(`Pending (${prdStatus.pending.length}):`);
|
|
109
|
+
for (const prd of prdStatus.pending) {
|
|
110
|
+
dim(` - ${prd}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (prdStatus.completed.length === 0) {
|
|
114
|
+
dim(" Completed: (none)");
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
info(`Completed (${prdStatus.completed.length}):`);
|
|
118
|
+
for (const prd of prdStatus.completed.slice(0, 5)) {
|
|
119
|
+
dim(` - ${prd}`);
|
|
120
|
+
}
|
|
121
|
+
if (prdStatus.completed.length > 5) {
|
|
122
|
+
dim(` ... and ${prdStatus.completed.length - 5} more`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
// Provider invocation command
|
|
126
|
+
header("Provider Invocation");
|
|
127
|
+
const providerCmd = PROVIDER_COMMANDS[config.provider];
|
|
128
|
+
const autoFlag = config.provider === "claude" ? "--dangerously-skip-permissions" : "--yolo";
|
|
129
|
+
dim(` ${providerCmd} ${autoFlag} -p "/night-watch"`);
|
|
130
|
+
// Environment variables
|
|
131
|
+
header("Environment Variables");
|
|
132
|
+
for (const [key, value] of Object.entries(envVars)) {
|
|
133
|
+
dim(` ${key}=${value}`);
|
|
134
|
+
}
|
|
135
|
+
// Full command that would be executed
|
|
136
|
+
header("Command");
|
|
137
|
+
dim(` bash ${scriptPath} ${projectDir}`);
|
|
138
|
+
console.log();
|
|
139
|
+
process.exit(0);
|
|
140
|
+
}
|
|
141
|
+
// Execute the script with spinner
|
|
142
|
+
const spinner = createSpinner("Running PRD executor...");
|
|
143
|
+
spinner.start();
|
|
144
|
+
try {
|
|
145
|
+
const exitCode = await executeScript(scriptPath, [projectDir], envVars);
|
|
146
|
+
if (exitCode === 0) {
|
|
147
|
+
spinner.succeed("PRD executor completed successfully");
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
spinner.fail(`PRD executor exited with code ${exitCode}`);
|
|
151
|
+
}
|
|
152
|
+
process.exit(exitCode);
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
spinner.fail("Failed to execute run command");
|
|
156
|
+
uiError(`${err instanceof Error ? err.message : String(err)}`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/commands/run.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 StatusOptions {
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAoOD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgIpD"}
|