@jonit-dev/night-watch-cli 1.7.18 → 1.7.19
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/bin/night-watch.mjs +1 -1
- package/dist/src/cli.js +13 -4
- package/dist/src/cli.js.map +1 -1
- package/dist/src/server/index.d.ts.map +1 -1
- package/dist/src/server/index.js +12 -1
- package/dist/src/server/index.js.map +1 -1
- package/package.json +1 -1
- package/web/dist/assets/index-DOzZY27d.js +473 -0
- package/web/dist/assets/index-w6Q6gxCS.css +1 -0
- package/web/dist/index.html +2 -2
- package/dist/board/factory.d.ts +0 -3
- package/dist/board/factory.d.ts.map +0 -1
- package/dist/board/factory.js +0 -10
- package/dist/board/factory.js.map +0 -1
- package/dist/board/providers/github-graphql.d.ts +0 -16
- package/dist/board/providers/github-graphql.d.ts.map +0 -1
- package/dist/board/providers/github-graphql.js +0 -43
- package/dist/board/providers/github-graphql.js.map +0 -1
- package/dist/board/providers/github-projects.d.ts +0 -51
- package/dist/board/providers/github-projects.d.ts.map +0 -1
- package/dist/board/providers/github-projects.js +0 -672
- package/dist/board/providers/github-projects.js.map +0 -1
- package/dist/board/types.d.ts +0 -60
- package/dist/board/types.d.ts.map +0 -1
- package/dist/board/types.js +0 -4
- package/dist/board/types.js.map +0 -1
- package/dist/cli.d.ts +0 -3
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -80
- package/dist/cli.js.map +0 -1
- package/dist/commands/board.d.ts +0 -9
- package/dist/commands/board.d.ts.map +0 -1
- package/dist/commands/board.js +0 -294
- package/dist/commands/board.js.map +0 -1
- package/dist/commands/cancel.d.ts +0 -46
- package/dist/commands/cancel.d.ts.map +0 -1
- package/dist/commands/cancel.js +0 -241
- package/dist/commands/cancel.js.map +0 -1
- package/dist/commands/dashboard/tab-actions.d.ts +0 -10
- package/dist/commands/dashboard/tab-actions.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-actions.js +0 -245
- package/dist/commands/dashboard/tab-actions.js.map +0 -1
- package/dist/commands/dashboard/tab-config.d.ts +0 -21
- package/dist/commands/dashboard/tab-config.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-config.js +0 -829
- package/dist/commands/dashboard/tab-config.js.map +0 -1
- package/dist/commands/dashboard/tab-logs.d.ts +0 -10
- package/dist/commands/dashboard/tab-logs.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-logs.js +0 -178
- package/dist/commands/dashboard/tab-logs.js.map +0 -1
- package/dist/commands/dashboard/tab-schedules.d.ts +0 -21
- package/dist/commands/dashboard/tab-schedules.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-schedules.js +0 -304
- package/dist/commands/dashboard/tab-schedules.js.map +0 -1
- package/dist/commands/dashboard/tab-status.d.ts +0 -32
- package/dist/commands/dashboard/tab-status.d.ts.map +0 -1
- package/dist/commands/dashboard/tab-status.js +0 -421
- package/dist/commands/dashboard/tab-status.js.map +0 -1
- package/dist/commands/dashboard/types.d.ts +0 -43
- package/dist/commands/dashboard/types.d.ts.map +0 -1
- package/dist/commands/dashboard/types.js +0 -5
- package/dist/commands/dashboard/types.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -11
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -239
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -16
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -202
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/history.d.ts +0 -7
- package/dist/commands/history.d.ts.map +0 -1
- package/dist/commands/history.js +0 -56
- package/dist/commands/history.js.map +0 -1
- package/dist/commands/init.d.ts +0 -25
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -534
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/install.d.ts +0 -48
- package/dist/commands/install.d.ts.map +0 -1
- package/dist/commands/install.js +0 -303
- package/dist/commands/install.js.map +0 -1
- package/dist/commands/logs.d.ts +0 -15
- package/dist/commands/logs.d.ts.map +0 -1
- package/dist/commands/logs.js +0 -104
- package/dist/commands/logs.js.map +0 -1
- package/dist/commands/prd-state.d.ts +0 -12
- package/dist/commands/prd-state.d.ts.map +0 -1
- package/dist/commands/prd-state.js +0 -47
- package/dist/commands/prd-state.js.map +0 -1
- package/dist/commands/prd.d.ts +0 -24
- package/dist/commands/prd.d.ts.map +0 -1
- package/dist/commands/prd.js +0 -283
- package/dist/commands/prd.js.map +0 -1
- package/dist/commands/prds.d.ts +0 -13
- package/dist/commands/prds.d.ts.map +0 -1
- package/dist/commands/prds.js +0 -196
- package/dist/commands/prds.js.map +0 -1
- package/dist/commands/prs.d.ts +0 -14
- package/dist/commands/prs.d.ts.map +0 -1
- package/dist/commands/prs.js +0 -106
- package/dist/commands/prs.js.map +0 -1
- package/dist/commands/qa.d.ts +0 -30
- package/dist/commands/qa.d.ts.map +0 -1
- package/dist/commands/qa.js +0 -159
- package/dist/commands/qa.js.map +0 -1
- package/dist/commands/retry.d.ts +0 -9
- package/dist/commands/retry.d.ts.map +0 -1
- package/dist/commands/retry.js +0 -72
- package/dist/commands/retry.js.map +0 -1
- package/dist/commands/review.d.ts +0 -35
- package/dist/commands/review.d.ts.map +0 -1
- package/dist/commands/review.js +0 -252
- package/dist/commands/review.js.map +0 -1
- package/dist/commands/run.d.ts +0 -61
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -364
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/serve.d.ts +0 -7
- package/dist/commands/serve.d.ts.map +0 -1
- package/dist/commands/serve.js +0 -27
- package/dist/commands/serve.js.map +0 -1
- package/dist/commands/slice.d.ts +0 -26
- package/dist/commands/slice.d.ts.map +0 -1
- package/dist/commands/slice.js +0 -175
- package/dist/commands/slice.js.map +0 -1
- package/dist/commands/state.d.ts +0 -8
- package/dist/commands/state.d.ts.map +0 -1
- package/dist/commands/state.js +0 -56
- package/dist/commands/state.js.map +0 -1
- package/dist/commands/status.d.ts +0 -14
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -147
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/uninstall.d.ts +0 -25
- package/dist/commands/uninstall.d.ts.map +0 -1
- package/dist/commands/uninstall.js +0 -141
- package/dist/commands/uninstall.js.map +0 -1
- package/dist/commands/update.d.ts +0 -21
- package/dist/commands/update.d.ts.map +0 -1
- package/dist/commands/update.js +0 -87
- package/dist/commands/update.js.map +0 -1
- package/dist/config.d.ts +0 -23
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -601
- package/dist/config.js.map +0 -1
- package/dist/constants.d.ts +0 -59
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js +0 -110
- package/dist/constants.js.map +0 -1
- package/dist/server/index.d.ts +0 -23
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -1074
- package/dist/server/index.js.map +0 -1
- package/dist/storage/json-state-migrator.d.ts +0 -24
- package/dist/storage/json-state-migrator.d.ts.map +0 -1
- package/dist/storage/json-state-migrator.js +0 -197
- package/dist/storage/json-state-migrator.js.map +0 -1
- package/dist/storage/repositories/index.d.ts +0 -23
- package/dist/storage/repositories/index.d.ts.map +0 -1
- package/dist/storage/repositories/index.js +0 -37
- package/dist/storage/repositories/index.js.map +0 -1
- package/dist/storage/repositories/interfaces.d.ts +0 -37
- package/dist/storage/repositories/interfaces.d.ts.map +0 -1
- package/dist/storage/repositories/interfaces.js +0 -6
- package/dist/storage/repositories/interfaces.js.map +0 -1
- package/dist/storage/repositories/sqlite/execution-history-repository.d.ts +0 -21
- package/dist/storage/repositories/sqlite/execution-history-repository.d.ts.map +0 -1
- package/dist/storage/repositories/sqlite/execution-history-repository.js +0 -94
- package/dist/storage/repositories/sqlite/execution-history-repository.js.map +0 -1
- package/dist/storage/repositories/sqlite/prd-state-repository.d.ts +0 -17
- package/dist/storage/repositories/sqlite/prd-state-repository.d.ts.map +0 -1
- package/dist/storage/repositories/sqlite/prd-state-repository.js +0 -74
- package/dist/storage/repositories/sqlite/prd-state-repository.js.map +0 -1
- package/dist/storage/repositories/sqlite/project-registry-repository.d.ts +0 -16
- package/dist/storage/repositories/sqlite/project-registry-repository.d.ts.map +0 -1
- package/dist/storage/repositories/sqlite/project-registry-repository.js +0 -34
- package/dist/storage/repositories/sqlite/project-registry-repository.js.map +0 -1
- package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts +0 -14
- package/dist/storage/repositories/sqlite/roadmap-state-repository.d.ts.map +0 -1
- package/dist/storage/repositories/sqlite/roadmap-state-repository.js +0 -47
- package/dist/storage/repositories/sqlite/roadmap-state-repository.js.map +0 -1
- package/dist/storage/sqlite/client.d.ts +0 -23
- package/dist/storage/sqlite/client.d.ts.map +0 -1
- package/dist/storage/sqlite/client.js +0 -47
- package/dist/storage/sqlite/client.js.map +0 -1
- package/dist/storage/sqlite/migrations.d.ts +0 -11
- package/dist/storage/sqlite/migrations.d.ts.map +0 -1
- package/dist/storage/sqlite/migrations.js +0 -57
- package/dist/storage/sqlite/migrations.js.map +0 -1
- package/dist/templates/prd-template.d.ts +0 -11
- package/dist/templates/prd-template.d.ts.map +0 -1
- package/dist/templates/prd-template.js +0 -166
- package/dist/templates/prd-template.js.map +0 -1
- package/dist/templates/slicer-prompt.d.ts +0 -54
- package/dist/templates/slicer-prompt.d.ts.map +0 -1
- package/dist/templates/slicer-prompt.js +0 -163
- package/dist/templates/slicer-prompt.js.map +0 -1
- package/dist/types.d.ts +0 -123
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -5
- package/dist/types.js.map +0 -1
- package/dist/utils/checks.d.ts +0 -55
- package/dist/utils/checks.d.ts.map +0 -1
- package/dist/utils/checks.js +0 -246
- package/dist/utils/checks.js.map +0 -1
- package/dist/utils/config-writer.d.ts +0 -16
- package/dist/utils/config-writer.d.ts.map +0 -1
- package/dist/utils/config-writer.js +0 -45
- package/dist/utils/config-writer.js.map +0 -1
- package/dist/utils/crontab.d.ts +0 -62
- package/dist/utils/crontab.d.ts.map +0 -1
- package/dist/utils/crontab.js +0 -168
- package/dist/utils/crontab.js.map +0 -1
- package/dist/utils/execution-history.d.ts +0 -54
- package/dist/utils/execution-history.d.ts.map +0 -1
- package/dist/utils/execution-history.js +0 -80
- package/dist/utils/execution-history.js.map +0 -1
- package/dist/utils/github.d.ts +0 -40
- package/dist/utils/github.d.ts.map +0 -1
- package/dist/utils/github.js +0 -126
- package/dist/utils/github.js.map +0 -1
- package/dist/utils/notify.d.ts +0 -63
- package/dist/utils/notify.d.ts.map +0 -1
- package/dist/utils/notify.js +0 -264
- package/dist/utils/notify.js.map +0 -1
- package/dist/utils/prd-states.d.ts +0 -16
- package/dist/utils/prd-states.d.ts.map +0 -1
- package/dist/utils/prd-states.js +0 -28
- package/dist/utils/prd-states.js.map +0 -1
- package/dist/utils/registry.d.ts +0 -44
- package/dist/utils/registry.d.ts.map +0 -1
- package/dist/utils/registry.js +0 -86
- package/dist/utils/registry.js.map +0 -1
- package/dist/utils/roadmap-parser.d.ts +0 -45
- package/dist/utils/roadmap-parser.d.ts.map +0 -1
- package/dist/utils/roadmap-parser.js +0 -136
- package/dist/utils/roadmap-parser.js.map +0 -1
- package/dist/utils/roadmap-scanner.d.ts +0 -92
- package/dist/utils/roadmap-scanner.d.ts.map +0 -1
- package/dist/utils/roadmap-scanner.js +0 -349
- package/dist/utils/roadmap-scanner.js.map +0 -1
- package/dist/utils/roadmap-state.d.ts +0 -90
- package/dist/utils/roadmap-state.d.ts.map +0 -1
- package/dist/utils/roadmap-state.js +0 -154
- package/dist/utils/roadmap-state.js.map +0 -1
- package/dist/utils/script-result.d.ts +0 -12
- package/dist/utils/script-result.d.ts.map +0 -1
- package/dist/utils/script-result.js +0 -46
- package/dist/utils/script-result.js.map +0 -1
- package/dist/utils/shell.d.ts +0 -27
- package/dist/utils/shell.d.ts.map +0 -1
- package/dist/utils/shell.js +0 -64
- package/dist/utils/shell.js.map +0 -1
- package/dist/utils/status-data.d.ts +0 -148
- package/dist/utils/status-data.d.ts.map +0 -1
- package/dist/utils/status-data.js +0 -593
- package/dist/utils/status-data.js.map +0 -1
- package/dist/utils/ui.d.ts +0 -55
- package/dist/utils/ui.d.ts.map +0 -1
- package/dist/utils/ui.js +0 -121
- package/dist/utils/ui.js.map +0 -1
- package/web/dist/assets/index-BtxQU4oX.css +0 -1
- package/web/dist/assets/index-D3awZ0gS.js +0 -473
package/dist/commands/install.js
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Install command for Night Watch CLI
|
|
3
|
-
* Adds crontab entries for automated PRD execution
|
|
4
|
-
*/
|
|
5
|
-
import { execSync } from "child_process";
|
|
6
|
-
import * as path from "path";
|
|
7
|
-
import * as fs from "fs";
|
|
8
|
-
import { loadConfig } from "../config.js";
|
|
9
|
-
import { LOG_DIR } from "../constants.js";
|
|
10
|
-
import { generateMarker, getEntries, getProjectEntries, readCrontab, writeCrontab, } from "../utils/crontab.js";
|
|
11
|
-
import { dim, header, success, error as uiError, warn, } from "../utils/ui.js";
|
|
12
|
-
/**
|
|
13
|
-
* Safely quote a value for POSIX shell commands.
|
|
14
|
-
*/
|
|
15
|
-
function shellQuote(value) {
|
|
16
|
-
return `'${value.replace(/'/g, "'\"'\"'")}'`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Get the path to the night-watch binary
|
|
20
|
-
*/
|
|
21
|
-
function getNightWatchBinPath() {
|
|
22
|
-
// Try to find night-watch in npm global bin
|
|
23
|
-
try {
|
|
24
|
-
const npmBin = execSync("npm bin -g", { encoding: "utf-8" }).trim();
|
|
25
|
-
const binPath = path.join(npmBin, "night-watch");
|
|
26
|
-
if (fs.existsSync(binPath)) {
|
|
27
|
-
return binPath;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
// Ignore error, fall back to which
|
|
32
|
-
}
|
|
33
|
-
// Try which command
|
|
34
|
-
try {
|
|
35
|
-
return execSync("which night-watch", { encoding: "utf-8" }).trim();
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
// Fall back to assuming it's in PATH
|
|
39
|
-
return "night-watch";
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Get the directory containing the node binary.
|
|
44
|
-
* Cron runs with a minimal PATH that typically doesn't include nvm/fnm/volta paths,
|
|
45
|
-
* so we need to explicitly add the node bin directory to each cron entry.
|
|
46
|
-
*/
|
|
47
|
-
function getNodeBinDir() {
|
|
48
|
-
try {
|
|
49
|
-
const nodePath = execSync("which node", { encoding: "utf-8" }).trim();
|
|
50
|
-
return path.dirname(nodePath);
|
|
51
|
-
}
|
|
52
|
-
catch {
|
|
53
|
-
return "";
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Build PATH export for cron entries using relevant binary directories.
|
|
58
|
-
*/
|
|
59
|
-
export function buildCronPathPrefix(nodeBinDir, nightWatchBin) {
|
|
60
|
-
const nightWatchBinDir = (nightWatchBin.includes("/") || nightWatchBin.includes("\\"))
|
|
61
|
-
? path.dirname(nightWatchBin)
|
|
62
|
-
: "";
|
|
63
|
-
const pathParts = Array.from(new Set([nodeBinDir, nightWatchBinDir].filter((part) => part.length > 0)));
|
|
64
|
-
if (pathParts.length === 0) {
|
|
65
|
-
return "";
|
|
66
|
-
}
|
|
67
|
-
return `export PATH="${pathParts.join(":")}:$PATH" && `;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* Get the project name from directory or package.json
|
|
71
|
-
*/
|
|
72
|
-
function getProjectName(projectDir) {
|
|
73
|
-
// Try to get name from package.json
|
|
74
|
-
const packageJsonPath = path.join(projectDir, "package.json");
|
|
75
|
-
if (fs.existsSync(packageJsonPath)) {
|
|
76
|
-
try {
|
|
77
|
-
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
|
|
78
|
-
if (packageJson.name) {
|
|
79
|
-
return packageJson.name;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
catch {
|
|
83
|
-
// Ignore parse errors
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
// Fall back to directory name
|
|
87
|
-
return path.basename(projectDir);
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Apply minute offset to a cron schedule expression.
|
|
91
|
-
* Replaces the minute field (first field) with the offset value.
|
|
92
|
-
* Only applies if the minute field is a single number (e.g. "0").
|
|
93
|
-
* Complex expressions (e.g. star-slash, comma-separated) are left unchanged.
|
|
94
|
-
*/
|
|
95
|
-
export function applyScheduleOffset(schedule, offset) {
|
|
96
|
-
if (offset === 0)
|
|
97
|
-
return schedule;
|
|
98
|
-
const parts = schedule.split(/\s+/);
|
|
99
|
-
if (parts.length < 5)
|
|
100
|
-
return schedule;
|
|
101
|
-
// Only replace if minute field is a plain number
|
|
102
|
-
if (/^\d+$/.test(parts[0])) {
|
|
103
|
-
parts[0] = String(offset);
|
|
104
|
-
return parts.join(" ");
|
|
105
|
-
}
|
|
106
|
-
return schedule;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Core install logic, reusable from dashboard.
|
|
110
|
-
* Returns result without printing to console.
|
|
111
|
-
*/
|
|
112
|
-
export function performInstall(projectDir, config, options) {
|
|
113
|
-
try {
|
|
114
|
-
const offset = config.cronScheduleOffset ?? 0;
|
|
115
|
-
const executorSchedule = applyScheduleOffset(options?.schedule || config.cronSchedule, offset);
|
|
116
|
-
const reviewerSchedule = applyScheduleOffset(options?.reviewerSchedule || config.reviewerSchedule, offset);
|
|
117
|
-
const nightWatchBin = getNightWatchBinPath();
|
|
118
|
-
const projectName = getProjectName(projectDir);
|
|
119
|
-
const marker = generateMarker(projectName);
|
|
120
|
-
const logDir = path.join(projectDir, LOG_DIR);
|
|
121
|
-
if (!fs.existsSync(logDir)) {
|
|
122
|
-
fs.mkdirSync(logDir, { recursive: true });
|
|
123
|
-
}
|
|
124
|
-
const executorLog = path.join(logDir, "executor.log");
|
|
125
|
-
const reviewerLog = path.join(logDir, "reviewer.log");
|
|
126
|
-
// Check if already installed (unless force)
|
|
127
|
-
if (!options?.force) {
|
|
128
|
-
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
129
|
-
if (existingEntries.length > 0) {
|
|
130
|
-
return { success: false, entries: existingEntries, error: "Already installed. Uninstall first or use force." };
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
const entries = [];
|
|
134
|
-
const nodeBinDir = getNodeBinDir();
|
|
135
|
-
const pathPrefix = buildCronPathPrefix(nodeBinDir, nightWatchBin);
|
|
136
|
-
const cliBinPrefix = `export NW_CLI_BIN=${shellQuote(nightWatchBin)} && `;
|
|
137
|
-
let providerEnvPrefix = "";
|
|
138
|
-
if (config.providerEnv && Object.keys(config.providerEnv).length > 0) {
|
|
139
|
-
const exports = Object.entries(config.providerEnv)
|
|
140
|
-
.map(([key, value]) => `export ${key}=${shellQuote(value)}`)
|
|
141
|
-
.join(" && ");
|
|
142
|
-
providerEnvPrefix = exports + " && ";
|
|
143
|
-
}
|
|
144
|
-
const executorEntry = `${executorSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} run >> ${shellQuote(executorLog)} 2>&1 ${marker}`;
|
|
145
|
-
entries.push(executorEntry);
|
|
146
|
-
const installReviewer = options?.noReviewer === true ? false : config.reviewerEnabled;
|
|
147
|
-
if (installReviewer) {
|
|
148
|
-
const reviewerEntry = `${reviewerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} review >> ${shellQuote(reviewerLog)} 2>&1 ${marker}`;
|
|
149
|
-
entries.push(reviewerEntry);
|
|
150
|
-
}
|
|
151
|
-
// Slicer entry (if roadmap scanner enabled and noSlicer not set)
|
|
152
|
-
const installSlicer = options?.noSlicer === true ? false : config.roadmapScanner.enabled;
|
|
153
|
-
if (installSlicer) {
|
|
154
|
-
const slicerSchedule = applyScheduleOffset(config.roadmapScanner.slicerSchedule, offset);
|
|
155
|
-
const slicerLog = path.join(logDir, "slicer.log");
|
|
156
|
-
const slicerEntry = `${slicerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} slice >> ${shellQuote(slicerLog)} 2>&1 ${marker}`;
|
|
157
|
-
entries.push(slicerEntry);
|
|
158
|
-
}
|
|
159
|
-
// QA entry (if enabled and noQa not set)
|
|
160
|
-
const disableQa = options?.noQa === true || options?.qa === false;
|
|
161
|
-
const installQa = disableQa ? false : config.qa.enabled;
|
|
162
|
-
if (installQa) {
|
|
163
|
-
const qaSchedule = applyScheduleOffset(config.qa.schedule, offset);
|
|
164
|
-
const qaLog = path.join(logDir, "qa.log");
|
|
165
|
-
const qaEntry = `${qaSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} qa >> ${shellQuote(qaLog)} 2>&1 ${marker}`;
|
|
166
|
-
entries.push(qaEntry);
|
|
167
|
-
}
|
|
168
|
-
const currentCrontab = readCrontab();
|
|
169
|
-
const newCrontab = [...currentCrontab, ...entries];
|
|
170
|
-
writeCrontab(newCrontab);
|
|
171
|
-
return { success: true, entries };
|
|
172
|
-
}
|
|
173
|
-
catch (err) {
|
|
174
|
-
return {
|
|
175
|
-
success: false,
|
|
176
|
-
entries: [],
|
|
177
|
-
error: err instanceof Error ? err.message : String(err),
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Install crontab entries for night-watch
|
|
183
|
-
*/
|
|
184
|
-
export function installCommand(program) {
|
|
185
|
-
program
|
|
186
|
-
.command("install")
|
|
187
|
-
.description("Add crontab entries for automated execution")
|
|
188
|
-
.option("-s, --schedule <cron>", "Cron schedule for PRD executor")
|
|
189
|
-
.option("--reviewer-schedule <cron>", "Cron schedule for reviewer")
|
|
190
|
-
.option("--no-reviewer", "Skip installing reviewer cron")
|
|
191
|
-
.option("--no-slicer", "Skip installing slicer cron")
|
|
192
|
-
.option("--no-qa", "Skip installing QA cron")
|
|
193
|
-
.action(async (options) => {
|
|
194
|
-
try {
|
|
195
|
-
// Get project directory
|
|
196
|
-
const projectDir = process.cwd();
|
|
197
|
-
// Load configuration
|
|
198
|
-
const config = loadConfig(projectDir);
|
|
199
|
-
// Get schedule from options or config, applying offset
|
|
200
|
-
const offset = config.cronScheduleOffset ?? 0;
|
|
201
|
-
const executorSchedule = applyScheduleOffset(options.schedule || config.cronSchedule, offset);
|
|
202
|
-
const reviewerSchedule = applyScheduleOffset(options.reviewerSchedule || config.reviewerSchedule, offset);
|
|
203
|
-
// Get paths
|
|
204
|
-
const nightWatchBin = getNightWatchBinPath();
|
|
205
|
-
const projectName = getProjectName(projectDir);
|
|
206
|
-
const marker = generateMarker(projectName);
|
|
207
|
-
const logDir = path.join(projectDir, LOG_DIR);
|
|
208
|
-
// Ensure log directory exists
|
|
209
|
-
if (!fs.existsSync(logDir)) {
|
|
210
|
-
fs.mkdirSync(logDir, { recursive: true });
|
|
211
|
-
}
|
|
212
|
-
const executorLog = path.join(logDir, "executor.log");
|
|
213
|
-
const reviewerLog = path.join(logDir, "reviewer.log");
|
|
214
|
-
// Check if already installed
|
|
215
|
-
const existingEntries = Array.from(new Set([...getEntries(marker), ...getProjectEntries(projectDir)]));
|
|
216
|
-
if (existingEntries.length > 0) {
|
|
217
|
-
warn(`Night Watch is already installed for ${projectName}.`);
|
|
218
|
-
console.log();
|
|
219
|
-
dim("Existing crontab entries:");
|
|
220
|
-
existingEntries.forEach((entry) => dim(` ${entry}`));
|
|
221
|
-
console.log();
|
|
222
|
-
dim("Run 'night-watch uninstall' first to reinstall.");
|
|
223
|
-
return;
|
|
224
|
-
}
|
|
225
|
-
// Create crontab entries
|
|
226
|
-
const entries = [];
|
|
227
|
-
// Detect node bin directory for cron PATH
|
|
228
|
-
const nodeBinDir = getNodeBinDir();
|
|
229
|
-
const pathPrefix = buildCronPathPrefix(nodeBinDir, nightWatchBin);
|
|
230
|
-
const cliBinPrefix = `export NW_CLI_BIN=${shellQuote(nightWatchBin)} && `;
|
|
231
|
-
// Build providerEnv export prefix for cron entries
|
|
232
|
-
let providerEnvPrefix = "";
|
|
233
|
-
if (config.providerEnv && Object.keys(config.providerEnv).length > 0) {
|
|
234
|
-
const exports = Object.entries(config.providerEnv)
|
|
235
|
-
.map(([key, value]) => `export ${key}=${shellQuote(value)}`)
|
|
236
|
-
.join(" && ");
|
|
237
|
-
providerEnvPrefix = exports + " && ";
|
|
238
|
-
}
|
|
239
|
-
// Executor entry
|
|
240
|
-
const executorEntry = `${executorSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} run >> ${shellQuote(executorLog)} 2>&1 ${marker}`;
|
|
241
|
-
entries.push(executorEntry);
|
|
242
|
-
// Determine if reviewer should be installed
|
|
243
|
-
// Priority: --no-reviewer flag > config.reviewerEnabled
|
|
244
|
-
const installReviewer = options.noReviewer === true ? false : config.reviewerEnabled;
|
|
245
|
-
// Reviewer entry (if enabled)
|
|
246
|
-
if (installReviewer) {
|
|
247
|
-
const reviewerEntry = `${reviewerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} review >> ${shellQuote(reviewerLog)} 2>&1 ${marker}`;
|
|
248
|
-
entries.push(reviewerEntry);
|
|
249
|
-
}
|
|
250
|
-
// Determine if slicer should be installed
|
|
251
|
-
// Priority: --no-slicer flag > config.roadmapScanner.enabled
|
|
252
|
-
const installSlicer = options.noSlicer === true ? false : config.roadmapScanner.enabled;
|
|
253
|
-
// Slicer entry (if roadmap scanner enabled)
|
|
254
|
-
let slicerLog;
|
|
255
|
-
if (installSlicer) {
|
|
256
|
-
slicerLog = path.join(logDir, "slicer.log");
|
|
257
|
-
const slicerSchedule = applyScheduleOffset(config.roadmapScanner.slicerSchedule, offset);
|
|
258
|
-
const slicerEntry = `${slicerSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} slice >> ${shellQuote(slicerLog)} 2>&1 ${marker}`;
|
|
259
|
-
entries.push(slicerEntry);
|
|
260
|
-
}
|
|
261
|
-
// Determine if QA should be installed
|
|
262
|
-
const disableQa = options.noQa === true || options.qa === false;
|
|
263
|
-
const installQa = disableQa ? false : config.qa.enabled;
|
|
264
|
-
// QA entry (if enabled)
|
|
265
|
-
let qaLog;
|
|
266
|
-
if (installQa) {
|
|
267
|
-
qaLog = path.join(logDir, "qa.log");
|
|
268
|
-
const qaSchedule = applyScheduleOffset(config.qa.schedule, offset);
|
|
269
|
-
const qaEntry = `${qaSchedule} ${pathPrefix}${providerEnvPrefix}${cliBinPrefix}cd ${shellQuote(projectDir)} && ${shellQuote(nightWatchBin)} qa >> ${shellQuote(qaLog)} 2>&1 ${marker}`;
|
|
270
|
-
entries.push(qaEntry);
|
|
271
|
-
}
|
|
272
|
-
// Add all entries
|
|
273
|
-
const currentCrontab = readCrontab();
|
|
274
|
-
const newCrontab = [...currentCrontab, ...entries];
|
|
275
|
-
writeCrontab(newCrontab);
|
|
276
|
-
// Success message
|
|
277
|
-
success(`Night Watch installed successfully for ${projectName}!`);
|
|
278
|
-
console.log();
|
|
279
|
-
header("Crontab Entries Added");
|
|
280
|
-
entries.forEach((entry) => dim(` ${entry}`));
|
|
281
|
-
console.log();
|
|
282
|
-
header("Log Files");
|
|
283
|
-
dim(` Executor: ${executorLog}`);
|
|
284
|
-
if (installReviewer) {
|
|
285
|
-
dim(` Reviewer: ${reviewerLog}`);
|
|
286
|
-
}
|
|
287
|
-
if (installSlicer && slicerLog) {
|
|
288
|
-
dim(` Slicer: ${slicerLog}`);
|
|
289
|
-
}
|
|
290
|
-
if (installQa && qaLog) {
|
|
291
|
-
dim(` QA: ${qaLog}`);
|
|
292
|
-
}
|
|
293
|
-
console.log();
|
|
294
|
-
dim("To uninstall, run: night-watch uninstall");
|
|
295
|
-
dim("To check status, run: night-watch status");
|
|
296
|
-
}
|
|
297
|
-
catch (err) {
|
|
298
|
-
uiError(`Error installing Night Watch: ${err instanceof Error ? err.message : String(err)}`);
|
|
299
|
-
process.exit(1);
|
|
300
|
-
}
|
|
301
|
-
});
|
|
302
|
-
}
|
|
303
|
-
//# sourceMappingURL=install.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/logs.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Logs command for Night Watch CLI
|
|
3
|
-
* View log output from executor and reviewer
|
|
4
|
-
*/
|
|
5
|
-
import { Command } from "commander";
|
|
6
|
-
export interface ILogsOptions {
|
|
7
|
-
lines?: string;
|
|
8
|
-
follow?: boolean;
|
|
9
|
-
type?: string;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Logs command implementation
|
|
13
|
-
*/
|
|
14
|
-
export declare function logsCommand(program: Command): void;
|
|
15
|
-
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AA4CD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8DlD"}
|
package/dist/commands/logs.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
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 { dim, header } 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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* prd-state command — manage PRD state entries in ~/.night-watch/prd-states.json
|
|
3
|
-
* Used by bash scripts to track pending-review state without moving files.
|
|
4
|
-
*
|
|
5
|
-
* Subcommands:
|
|
6
|
-
* set <projectDir> <prdName> pending-review [--branch <branch>]
|
|
7
|
-
* clear <projectDir> <prdName>
|
|
8
|
-
* list <projectDir> [--status <status>]
|
|
9
|
-
*/
|
|
10
|
-
import { Command } from "commander";
|
|
11
|
-
export declare function prdStateCommand(program: Command): void;
|
|
12
|
-
//# sourceMappingURL=prd-state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prd-state.d.ts","sourceRoot":"","sources":["../../src/commands/prd-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsCtD"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* prd-state command — manage PRD state entries in ~/.night-watch/prd-states.json
|
|
3
|
-
* Used by bash scripts to track pending-review state without moving files.
|
|
4
|
-
*
|
|
5
|
-
* Subcommands:
|
|
6
|
-
* set <projectDir> <prdName> pending-review [--branch <branch>]
|
|
7
|
-
* clear <projectDir> <prdName>
|
|
8
|
-
* list <projectDir> [--status <status>]
|
|
9
|
-
*/
|
|
10
|
-
import { clearPrdState, listPrdStatesByStatus, writePrdState, } from "../utils/prd-states.js";
|
|
11
|
-
export function prdStateCommand(program) {
|
|
12
|
-
const prdState = program
|
|
13
|
-
.command("prd-state")
|
|
14
|
-
.description("Manage PRD state entries in ~/.night-watch/prd-states.json");
|
|
15
|
-
prdState
|
|
16
|
-
.command("set <projectDir> <prdName>")
|
|
17
|
-
.description("Set a PRD state to pending-review")
|
|
18
|
-
.option("--branch <branch>", "Branch name associated with the PR", "")
|
|
19
|
-
.action((projectDir, prdName, options) => {
|
|
20
|
-
writePrdState(projectDir, prdName, {
|
|
21
|
-
status: "pending-review",
|
|
22
|
-
branch: options.branch,
|
|
23
|
-
timestamp: Math.floor(Date.now() / 1000),
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
prdState
|
|
27
|
-
.command("clear <projectDir> <prdName>")
|
|
28
|
-
.description("Remove a PRD state entry")
|
|
29
|
-
.action((projectDir, prdName) => {
|
|
30
|
-
clearPrdState(projectDir, prdName);
|
|
31
|
-
});
|
|
32
|
-
prdState
|
|
33
|
-
.command("list <projectDir>")
|
|
34
|
-
.description("List PRD names with a given state (default: pending-review)")
|
|
35
|
-
.option("--status <status>", "Filter by status", "pending-review")
|
|
36
|
-
.action((projectDir, options) => {
|
|
37
|
-
if (options.status !== "pending-review") {
|
|
38
|
-
// Future statuses can be added here
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const names = listPrdStatesByStatus(projectDir, "pending-review");
|
|
42
|
-
for (const name of names) {
|
|
43
|
-
console.log(name);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=prd-state.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prd-state.js","sourceRoot":"","sources":["../../src/commands/prd-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAEhC,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,WAAW,CAAC;SACpB,WAAW,CAAC,4DAA4D,CAAC,CAAC;IAE7E,QAAQ;SACL,OAAO,CAAC,4BAA4B,CAAC;SACrC,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,mBAAmB,EAAE,oCAAoC,EAAE,EAAE,CAAC;SACrE,MAAM,CAAC,CAAC,UAAkB,EAAE,OAAe,EAAE,OAA2B,EAAE,EAAE;QAC3E,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE;YACjC,MAAM,EAAE,gBAAgB;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;SACzC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,8BAA8B,CAAC;SACvC,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,CAAC,UAAkB,EAAE,OAAe,EAAE,EAAE;QAC9C,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEL,QAAQ;SACL,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,6DAA6D,CAAC;SAC1E,MAAM,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,gBAAgB,CAAC;SACjE,MAAM,CAAC,CAAC,UAAkB,EAAE,OAA2B,EAAE,EAAE;QAC1D,IAAI,OAAO,CAAC,MAAM,KAAK,gBAAgB,EAAE,CAAC;YACxC,oCAAoC;YACpC,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;QAClE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/prd.d.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PRD command group - manage PRD files
|
|
3
|
-
*/
|
|
4
|
-
import { Command } from "commander";
|
|
5
|
-
export interface IPrdCreateOptions {
|
|
6
|
-
interactive: boolean;
|
|
7
|
-
template?: string;
|
|
8
|
-
deps?: string;
|
|
9
|
-
phases?: string;
|
|
10
|
-
number: boolean;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Slugify a name into a filename-safe string
|
|
14
|
-
*/
|
|
15
|
-
export declare function slugify(name: string): string;
|
|
16
|
-
/**
|
|
17
|
-
* Get the next PRD number based on existing files in the directory
|
|
18
|
-
*/
|
|
19
|
-
export declare function getNextPrdNumber(prdDir: string): number;
|
|
20
|
-
/**
|
|
21
|
-
* Register the prd command group with the program
|
|
22
|
-
*/
|
|
23
|
-
export declare function prdCommand(program: Command): void;
|
|
24
|
-
//# sourceMappingURL=prd.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUvD;AA+CD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgPjD"}
|