@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.
Files changed (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +509 -0
  3. package/bin/night-watch.mjs +2 -0
  4. package/dist/cli.d.ts +3 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +35 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/init.d.ts +8 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +376 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/install.d.ts +15 -0
  13. package/dist/commands/install.d.ts.map +1 -0
  14. package/dist/commands/install.js +135 -0
  15. package/dist/commands/install.js.map +1 -0
  16. package/dist/commands/logs.d.ts +15 -0
  17. package/dist/commands/logs.d.ts.map +1 -0
  18. package/dist/commands/logs.js +104 -0
  19. package/dist/commands/logs.js.map +1 -0
  20. package/dist/commands/review.d.ts +26 -0
  21. package/dist/commands/review.d.ts.map +1 -0
  22. package/dist/commands/review.js +144 -0
  23. package/dist/commands/review.js.map +1 -0
  24. package/dist/commands/run.d.ts +26 -0
  25. package/dist/commands/run.d.ts.map +1 -0
  26. package/dist/commands/run.js +161 -0
  27. package/dist/commands/run.js.map +1 -0
  28. package/dist/commands/status.d.ts +14 -0
  29. package/dist/commands/status.d.ts.map +1 -0
  30. package/dist/commands/status.js +303 -0
  31. package/dist/commands/status.js.map +1 -0
  32. package/dist/commands/uninstall.d.ts +13 -0
  33. package/dist/commands/uninstall.d.ts.map +1 -0
  34. package/dist/commands/uninstall.js +97 -0
  35. package/dist/commands/uninstall.js.map +1 -0
  36. package/dist/config.d.ts +23 -0
  37. package/dist/config.d.ts.map +1 -0
  38. package/dist/config.js +213 -0
  39. package/dist/config.js.map +1 -0
  40. package/dist/constants.d.ts +21 -0
  41. package/dist/constants.d.ts.map +1 -0
  42. package/dist/constants.js +33 -0
  43. package/dist/constants.js.map +1 -0
  44. package/dist/types.d.ts +35 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +5 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/utils/crontab.d.ts +50 -0
  49. package/dist/utils/crontab.d.ts.map +1 -0
  50. package/dist/utils/crontab.js +116 -0
  51. package/dist/utils/crontab.js.map +1 -0
  52. package/dist/utils/shell.d.ts +13 -0
  53. package/dist/utils/shell.d.ts.map +1 -0
  54. package/dist/utils/shell.js +44 -0
  55. package/dist/utils/shell.js.map +1 -0
  56. package/dist/utils/ui.d.ts +55 -0
  57. package/dist/utils/ui.d.ts.map +1 -0
  58. package/dist/utils/ui.js +121 -0
  59. package/dist/utils/ui.js.map +1 -0
  60. package/package.json +64 -0
  61. package/scripts/night-watch-cron.sh +148 -0
  62. package/scripts/night-watch-helpers.sh +155 -0
  63. package/scripts/night-watch-pr-reviewer-cron.sh +135 -0
  64. package/templates/night-watch-pr-reviewer.md +144 -0
  65. package/templates/night-watch.config.json +21 -0
  66. package/templates/night-watch.md +100 -0
  67. package/templates/prd-executor.md +235 -0
@@ -0,0 +1,303 @@
1
+ /**
2
+ * Status command for Night Watch CLI
3
+ * Shows current status including lock files, PRDs, PRs, and logs
4
+ */
5
+ import { execSync } from "child_process";
6
+ import * as path from "path";
7
+ import * as fs from "fs";
8
+ import chalk from "chalk";
9
+ import { loadConfig } from "../config.js";
10
+ import { LOCK_FILE_PREFIX, LOG_DIR } from "../constants.js";
11
+ import { getEntries, generateMarker } from "../utils/crontab.js";
12
+ import { header, dim, createTable, formatRunningStatus, formatInstalledStatus, } from "../utils/ui.js";
13
+ /**
14
+ * Get the project name from directory or package.json
15
+ */
16
+ function getProjectName(projectDir) {
17
+ // Try to get name from package.json
18
+ const packageJsonPath = path.join(projectDir, "package.json");
19
+ if (fs.existsSync(packageJsonPath)) {
20
+ try {
21
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
22
+ if (packageJson.name) {
23
+ return packageJson.name;
24
+ }
25
+ }
26
+ catch {
27
+ // Ignore parse errors
28
+ }
29
+ }
30
+ // Fall back to directory name
31
+ return path.basename(projectDir);
32
+ }
33
+ /**
34
+ * Check if a process with the given PID is running
35
+ */
36
+ function isProcessRunning(pid) {
37
+ try {
38
+ // Sending signal 0 doesn't actually kill the process, just checks if it exists
39
+ process.kill(pid, 0);
40
+ return true;
41
+ }
42
+ catch {
43
+ return false;
44
+ }
45
+ }
46
+ /**
47
+ * Read PID from lock file and check if process is running
48
+ */
49
+ function checkLockFile(lockPath) {
50
+ if (!fs.existsSync(lockPath)) {
51
+ return { running: false, pid: null };
52
+ }
53
+ try {
54
+ const pidStr = fs.readFileSync(lockPath, "utf-8").trim();
55
+ const pid = parseInt(pidStr, 10);
56
+ if (isNaN(pid)) {
57
+ return { running: false, pid: null };
58
+ }
59
+ return {
60
+ running: isProcessRunning(pid),
61
+ pid,
62
+ };
63
+ }
64
+ catch {
65
+ return { running: false, pid: null };
66
+ }
67
+ }
68
+ /**
69
+ * Count PRDs in the PRD directory
70
+ */
71
+ function countPRDs(projectDir, prdDir) {
72
+ const fullPrdPath = path.join(projectDir, prdDir);
73
+ if (!fs.existsSync(fullPrdPath)) {
74
+ return { pending: 0, done: 0 };
75
+ }
76
+ let pending = 0;
77
+ let done = 0;
78
+ const countInDir = (dir) => {
79
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
80
+ for (const entry of entries) {
81
+ const fullPath = path.join(dir, entry.name);
82
+ if (entry.isDirectory()) {
83
+ if (entry.name === "done") {
84
+ // Count files in done directory
85
+ try {
86
+ const doneEntries = fs.readdirSync(fullPath);
87
+ done += doneEntries.filter((e) => e.endsWith(".md")).length;
88
+ }
89
+ catch {
90
+ // Ignore errors
91
+ }
92
+ }
93
+ else {
94
+ // Recurse into other directories
95
+ countInDir(fullPath);
96
+ }
97
+ }
98
+ else if (entry.name.endsWith(".md")) {
99
+ pending++;
100
+ }
101
+ }
102
+ };
103
+ try {
104
+ countInDir(fullPrdPath);
105
+ }
106
+ catch {
107
+ // Ignore errors
108
+ }
109
+ return { pending, done };
110
+ }
111
+ /**
112
+ * Count open PRs on night-watch/ or feat/ branches using gh CLI
113
+ */
114
+ function countOpenPRs(projectDir, branchPatterns) {
115
+ try {
116
+ // Check if we're in a git repo
117
+ execSync("git rev-parse --git-dir", {
118
+ cwd: projectDir,
119
+ encoding: "utf-8",
120
+ stdio: ["pipe", "pipe", "pipe"],
121
+ });
122
+ // Check if gh CLI is available
123
+ try {
124
+ execSync("which gh", { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
125
+ }
126
+ catch {
127
+ return 0;
128
+ }
129
+ // Get open PRs
130
+ const output = execSync("gh pr list --state open --json headRefName,number", {
131
+ cwd: projectDir,
132
+ encoding: "utf-8",
133
+ stdio: ["pipe", "pipe", "pipe"],
134
+ });
135
+ const prs = JSON.parse(output);
136
+ // Filter PRs by branch patterns
137
+ const matchingPRs = prs.filter((pr) => branchPatterns.some((pattern) => pr.headRefName.startsWith(pattern)));
138
+ return matchingPRs.length;
139
+ }
140
+ catch {
141
+ return 0;
142
+ }
143
+ }
144
+ /**
145
+ * Get last N lines from a log file
146
+ */
147
+ function getLastLogLines(logPath, lines) {
148
+ if (!fs.existsSync(logPath)) {
149
+ return [];
150
+ }
151
+ try {
152
+ const content = fs.readFileSync(logPath, "utf-8");
153
+ const allLines = content.trim().split("\n");
154
+ return allLines.slice(-lines);
155
+ }
156
+ catch {
157
+ return [];
158
+ }
159
+ }
160
+ /**
161
+ * Get log file info
162
+ */
163
+ function getLogInfo(logPath, lastLines = 5) {
164
+ const exists = fs.existsSync(logPath);
165
+ return {
166
+ path: logPath,
167
+ lastLines: exists ? getLastLogLines(logPath, lastLines) : [],
168
+ exists,
169
+ size: exists ? fs.statSync(logPath).size : 0,
170
+ };
171
+ }
172
+ /**
173
+ * Format bytes to human-readable size
174
+ */
175
+ function formatBytes(bytes) {
176
+ if (bytes === 0)
177
+ return "0 B";
178
+ const k = 1024;
179
+ const sizes = ["B", "KB", "MB", "GB"];
180
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
181
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(1))} ${sizes[i]}`;
182
+ }
183
+ /**
184
+ * Status command implementation
185
+ */
186
+ export function statusCommand(program) {
187
+ program
188
+ .command("status")
189
+ .description("Show current night-watch status")
190
+ .option("-v, --verbose", "Show detailed status information")
191
+ .option("--json", "Output status as JSON")
192
+ .action(async (options) => {
193
+ try {
194
+ const projectDir = process.cwd();
195
+ const config = loadConfig(projectDir);
196
+ const projectName = getProjectName(projectDir);
197
+ const marker = generateMarker(projectName);
198
+ // Gather status info
199
+ const status = {
200
+ projectName,
201
+ projectDir,
202
+ provider: config.provider,
203
+ reviewerEnabled: config.reviewerEnabled,
204
+ executor: checkLockFile(`${LOCK_FILE_PREFIX}executor.lock`),
205
+ reviewer: checkLockFile(`${LOCK_FILE_PREFIX}reviewer.lock`),
206
+ prds: countPRDs(projectDir, config.prdDir),
207
+ prs: { open: countOpenPRs(projectDir, config.branchPatterns) },
208
+ crontab: {
209
+ installed: getEntries(marker).length > 0,
210
+ entries: getEntries(marker),
211
+ },
212
+ logs: {
213
+ executor: getLogInfo(path.join(projectDir, LOG_DIR, "executor.log")),
214
+ reviewer: getLogInfo(path.join(projectDir, LOG_DIR, "reviewer.log")),
215
+ },
216
+ };
217
+ // Output as JSON if requested
218
+ if (options.json) {
219
+ console.log(JSON.stringify(status, null, 2));
220
+ return;
221
+ }
222
+ // Print formatted status dashboard
223
+ console.log();
224
+ console.log(chalk.bold.cyan(`Night Watch Status: ${status.projectName}`));
225
+ console.log(chalk.dim("─".repeat(40)));
226
+ console.log();
227
+ dim(`Project Directory: ${status.projectDir}`);
228
+ // Configuration section with table
229
+ header("Configuration");
230
+ const configTable = createTable({ head: ["Setting", "Value"] });
231
+ configTable.push(["Provider", status.provider]);
232
+ configTable.push(["Reviewer", status.reviewerEnabled ? "Enabled" : "Disabled"]);
233
+ console.log(configTable.toString());
234
+ // Process status section with colored indicators
235
+ header("Process Status");
236
+ const processTable = createTable({ head: ["Process", "Status"] });
237
+ processTable.push(["Executor", formatRunningStatus(status.executor.running, status.executor.pid)]);
238
+ processTable.push(["Reviewer", formatRunningStatus(status.reviewer.running, status.reviewer.pid)]);
239
+ console.log(processTable.toString());
240
+ // PRD status section with table
241
+ header("PRD Status");
242
+ const prdTable = createTable({ head: ["Status", "Count"] });
243
+ prdTable.push(["Pending", String(status.prds.pending)]);
244
+ prdTable.push(["Completed", String(status.prds.done)]);
245
+ console.log(prdTable.toString());
246
+ // PR status section with table
247
+ header("PR Status");
248
+ const prTable = createTable({ head: ["Type", "Count"] });
249
+ prTable.push(["Open PRs (night-watch/feat branches)", String(status.prs.open)]);
250
+ console.log(prTable.toString());
251
+ // Crontab status section with colored output
252
+ header("Crontab Status");
253
+ console.log(` ${formatInstalledStatus(status.crontab.installed)}`);
254
+ if (status.crontab.installed && options.verbose) {
255
+ console.log();
256
+ dim(" Entries:");
257
+ status.crontab.entries.forEach((entry) => dim(` ${entry}`));
258
+ }
259
+ console.log();
260
+ // Log status section with table
261
+ header("Log Files");
262
+ const logTable = createTable({ head: ["Log", "Size", "Status"] });
263
+ if (status.logs.executor) {
264
+ logTable.push([
265
+ "Executor",
266
+ status.logs.executor.exists ? formatBytes(status.logs.executor.size) : "-",
267
+ status.logs.executor.exists ? "Exists" : "Not found",
268
+ ]);
269
+ }
270
+ if (status.logs.reviewer) {
271
+ logTable.push([
272
+ "Reviewer",
273
+ status.logs.reviewer.exists ? formatBytes(status.logs.reviewer.size) : "-",
274
+ status.logs.reviewer.exists ? "Exists" : "Not found",
275
+ ]);
276
+ }
277
+ console.log(logTable.toString());
278
+ // Show last lines in verbose mode
279
+ if (options.verbose) {
280
+ if (status.logs.executor?.exists && status.logs.executor.lastLines.length > 0) {
281
+ dim(" Executor last 5 lines:");
282
+ status.logs.executor.lastLines.forEach((line) => dim(` ${line}`));
283
+ }
284
+ if (status.logs.reviewer?.exists && status.logs.reviewer.lastLines.length > 0) {
285
+ dim(" Reviewer last 5 lines:");
286
+ status.logs.reviewer.lastLines.forEach((line) => dim(` ${line}`));
287
+ }
288
+ }
289
+ // Tips section with dim styling
290
+ header("Commands");
291
+ dim(" night-watch install - Install crontab entries");
292
+ dim(" night-watch logs - View logs");
293
+ dim(" night-watch run - Run executor now");
294
+ dim(" night-watch review - Run reviewer now");
295
+ console.log();
296
+ }
297
+ catch (error) {
298
+ console.error(`Error getting status: ${error instanceof Error ? error.message : String(error)}`);
299
+ process.exit(1);
300
+ }
301
+ });
302
+ }
303
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Uninstall command for Night Watch CLI
3
+ * Removes crontab entries for the current project
4
+ */
5
+ import { Command } from "commander";
6
+ export interface UninstallOptions {
7
+ keepLogs?: boolean;
8
+ }
9
+ /**
10
+ * Uninstall crontab entries for night-watch
11
+ */
12
+ export declare function uninstallCommand(program: Command): void;
13
+ //# sourceMappingURL=uninstall.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.d.ts","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAuBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwEvD"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Uninstall command for Night Watch CLI
3
+ * Removes crontab entries for the current project
4
+ */
5
+ import * as path from "path";
6
+ import * as fs from "fs";
7
+ import { removeEntries, generateMarker, getEntries } from "../utils/crontab.js";
8
+ import { success, error as uiError, warn, dim, } from "../utils/ui.js";
9
+ /**
10
+ * Get the project name from directory or package.json
11
+ */
12
+ function getProjectName(projectDir) {
13
+ // Try to get name from package.json
14
+ const packageJsonPath = path.join(projectDir, "package.json");
15
+ if (fs.existsSync(packageJsonPath)) {
16
+ try {
17
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
18
+ if (packageJson.name) {
19
+ return packageJson.name;
20
+ }
21
+ }
22
+ catch {
23
+ // Ignore parse errors
24
+ }
25
+ }
26
+ // Fall back to directory name
27
+ return path.basename(projectDir);
28
+ }
29
+ /**
30
+ * Uninstall crontab entries for night-watch
31
+ */
32
+ export function uninstallCommand(program) {
33
+ program
34
+ .command("uninstall")
35
+ .description("Remove crontab entries")
36
+ .option("--keep-logs", "Preserve log files")
37
+ .action(async (options) => {
38
+ try {
39
+ // Get project directory
40
+ const projectDir = process.cwd();
41
+ // Get project name
42
+ const projectName = getProjectName(projectDir);
43
+ const marker = generateMarker(projectName);
44
+ // Check if there are entries to remove
45
+ const existingEntries = getEntries(marker);
46
+ if (existingEntries.length === 0) {
47
+ warn(`No Night Watch crontab entries found for ${projectName}.`);
48
+ dim("Nothing to uninstall.");
49
+ return;
50
+ }
51
+ // Show entries that will be removed
52
+ dim(`Removing Night Watch crontab entries for ${projectName}:`);
53
+ existingEntries.forEach((entry) => dim(` ${entry}`));
54
+ // Remove entries
55
+ const removedCount = removeEntries(marker);
56
+ // Handle log files
57
+ if (!options.keepLogs) {
58
+ const logDir = path.join(projectDir, "logs");
59
+ if (fs.existsSync(logDir)) {
60
+ const logFiles = ["executor.log", "reviewer.log"];
61
+ let logsRemoved = 0;
62
+ logFiles.forEach((logFile) => {
63
+ const logPath = path.join(logDir, logFile);
64
+ if (fs.existsSync(logPath)) {
65
+ fs.unlinkSync(logPath);
66
+ logsRemoved++;
67
+ }
68
+ });
69
+ // Try to remove log directory if empty
70
+ try {
71
+ const remainingFiles = fs.readdirSync(logDir);
72
+ if (remainingFiles.length === 0) {
73
+ fs.rmdirSync(logDir);
74
+ }
75
+ }
76
+ catch {
77
+ // Ignore errors removing directory
78
+ }
79
+ if (logsRemoved > 0) {
80
+ console.log();
81
+ dim(`Removed ${logsRemoved} log file(s).`);
82
+ }
83
+ }
84
+ }
85
+ else {
86
+ console.log();
87
+ dim("Log files preserved.");
88
+ }
89
+ success(`Successfully removed ${removedCount} crontab entry/entries.`);
90
+ }
91
+ catch (err) {
92
+ uiError(`Error uninstalling Night Watch: ${err instanceof Error ? err.message : String(err)}`);
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=uninstall.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../src/commands/uninstall.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Configuration loader for Night Watch CLI
3
+ * Loads config from: defaults -> config file -> environment variables
4
+ */
5
+ import { INightWatchConfig } from "./types.js";
6
+ /**
7
+ * Get the default configuration values
8
+ */
9
+ export declare function getDefaultConfig(): INightWatchConfig;
10
+ /**
11
+ * Load Night Watch configuration
12
+ * Priority: defaults < config file < environment variables
13
+ *
14
+ * @param projectDir - The project directory to load config from
15
+ * @returns Merged configuration object
16
+ */
17
+ export declare function loadConfig(projectDir: string): INightWatchConfig;
18
+ /**
19
+ * Get the path to a bundled script
20
+ * This returns the path to a script in the package's scripts/ directory
21
+ */
22
+ export declare function getScriptPath(scriptName: string): string;
23
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,iBAAiB,EAAY,MAAM,YAAY,CAAC;AAiBzD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,iBAAiB,CAmBpD;AAmGD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB,CAoFhE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAIxD"}