@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,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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"}
|
package/dist/config.d.ts
ADDED
|
@@ -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"}
|