@jonit-dev/night-watch-cli 1.8.10-beta.3 → 1.8.10-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +957 -1906
- package/dist/cli.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.d.ts.map +1 -0
- package/dist/commands/analytics.js +69 -0
- package/dist/commands/analytics.js.map +1 -0
- package/dist/commands/audit.d.ts +19 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +144 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/board.d.ts +9 -0
- package/dist/commands/board.d.ts.map +1 -0
- package/dist/commands/board.js +702 -0
- package/dist/commands/board.js.map +1 -0
- package/dist/commands/cancel.d.ts +46 -0
- package/dist/commands/cancel.d.ts.map +1 -0
- package/dist/commands/cancel.js +239 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/cron.d.ts +8 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +134 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/dashboard/tab-actions.d.ts +10 -0
- package/dist/commands/dashboard/tab-actions.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-actions.js +247 -0
- package/dist/commands/dashboard/tab-actions.js.map +1 -0
- package/dist/commands/dashboard/tab-config.d.ts +21 -0
- package/dist/commands/dashboard/tab-config.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-config.js +873 -0
- package/dist/commands/dashboard/tab-config.js.map +1 -0
- package/dist/commands/dashboard/tab-logs.d.ts +10 -0
- package/dist/commands/dashboard/tab-logs.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-logs.js +202 -0
- package/dist/commands/dashboard/tab-logs.js.map +1 -0
- package/dist/commands/dashboard/tab-schedules.d.ts +21 -0
- package/dist/commands/dashboard/tab-schedules.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-schedules.js +320 -0
- package/dist/commands/dashboard/tab-schedules.js.map +1 -0
- package/dist/commands/dashboard/tab-status.d.ts +32 -0
- package/dist/commands/dashboard/tab-status.d.ts.map +1 -0
- package/dist/commands/dashboard/tab-status.js +424 -0
- package/dist/commands/dashboard/tab-status.js.map +1 -0
- package/dist/commands/dashboard/types.d.ts +42 -0
- package/dist/commands/dashboard/types.d.ts.map +1 -0
- package/dist/commands/dashboard/types.js +5 -0
- package/dist/commands/dashboard/types.js.map +1 -0
- package/dist/commands/dashboard.d.ts +11 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +242 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/doctor.d.ts +16 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +195 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/history.d.ts +7 -0
- package/dist/commands/history.d.ts.map +1 -0
- package/dist/commands/history.js +49 -0
- package/dist/commands/history.js.map +1 -0
- package/dist/commands/init.d.ts +45 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +777 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +65 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +405 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +15 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +155 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/merge.d.ts +26 -0
- package/dist/commands/merge.d.ts.map +1 -0
- package/dist/commands/merge.js +159 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/notify.d.ts +7 -0
- package/dist/commands/notify.d.ts.map +1 -0
- package/dist/commands/notify.js +43 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/plan.d.ts +19 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +88 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prd-state.d.ts +12 -0
- package/dist/commands/prd-state.d.ts.map +1 -0
- package/dist/commands/prd-state.js +47 -0
- package/dist/commands/prd-state.js.map +1 -0
- package/dist/commands/prd.d.ts +18 -0
- package/dist/commands/prd.d.ts.map +1 -0
- package/dist/commands/prd.js +363 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/prds.d.ts +13 -0
- package/dist/commands/prds.d.ts.map +1 -0
- package/dist/commands/prds.js +194 -0
- package/dist/commands/prds.js.map +1 -0
- package/dist/commands/prs.d.ts +14 -0
- package/dist/commands/prs.d.ts.map +1 -0
- package/dist/commands/prs.js +104 -0
- package/dist/commands/prs.js.map +1 -0
- package/dist/commands/qa.d.ts +34 -0
- package/dist/commands/qa.d.ts.map +1 -0
- package/dist/commands/qa.js +214 -0
- package/dist/commands/qa.js.map +1 -0
- package/dist/commands/queue.d.ts +8 -0
- package/dist/commands/queue.d.ts.map +1 -0
- package/dist/commands/queue.js +378 -0
- package/dist/commands/queue.js.map +1 -0
- package/dist/commands/resolve.d.ts +26 -0
- package/dist/commands/resolve.d.ts.map +1 -0
- package/dist/commands/resolve.js +186 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/retry.d.ts +9 -0
- package/dist/commands/retry.d.ts.map +1 -0
- package/dist/commands/retry.js +71 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/review.d.ts +82 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +479 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/run.d.ts +73 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +509 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/serve.d.ts +19 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +142 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/shared/env-builder.d.ts +49 -0
- package/dist/commands/shared/env-builder.d.ts.map +1 -0
- package/dist/commands/shared/env-builder.js +150 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.d.ts.map +1 -0
- package/dist/commands/slice.js +316 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/state.d.ts +8 -0
- package/dist/commands/state.d.ts.map +1 -0
- package/dist/commands/state.js +54 -0
- package/dist/commands/state.js.map +1 -0
- package/dist/commands/status.d.ts +14 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +297 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summary.d.ts +14 -0
- package/dist/commands/summary.d.ts.map +1 -0
- package/dist/commands/summary.js +193 -0
- package/dist/commands/summary.js.map +1 -0
- package/dist/commands/uninstall.d.ts +25 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +134 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/scripts/night-watch-cron.sh +9 -0
- package/dist/scripts/night-watch-helpers.sh +65 -7
- package/dist/web/assets/index-CgXj_KM1.css +1 -0
- package/dist/web/assets/index-Dr4zlyJf.js +406 -0
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/dist/web/assets/index-BUgI2S1s.js +0 -406
- package/dist/web/assets/index-CkdLFBd7.js +0 -406
- package/dist/web/assets/index-RMfswANB.css +0 -1
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD command group - manage PRD files
|
|
3
|
+
*/
|
|
4
|
+
import { execSync, spawn, spawnSync } from 'child_process';
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { fileURLToPath } from 'url';
|
|
8
|
+
import { dirname } from 'path';
|
|
9
|
+
import { CLAIM_FILE_EXTENSION, CLAUDE_MODEL_IDS, createTable, dim, header, info, loadConfig, success, error as uiError, } from '@night-watch/core';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
function findTemplatesDir(startDir) {
|
|
13
|
+
let current = startDir;
|
|
14
|
+
for (let i = 0; i < 8; i++) {
|
|
15
|
+
const candidate = path.join(current, 'templates');
|
|
16
|
+
if (fs.existsSync(candidate) && fs.statSync(candidate).isDirectory()) {
|
|
17
|
+
return candidate;
|
|
18
|
+
}
|
|
19
|
+
current = path.dirname(current);
|
|
20
|
+
}
|
|
21
|
+
return path.join(startDir, 'templates');
|
|
22
|
+
}
|
|
23
|
+
const TEMPLATES_DIR = findTemplatesDir(__dirname);
|
|
24
|
+
export function slugify(name) {
|
|
25
|
+
return name
|
|
26
|
+
.toLowerCase()
|
|
27
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
28
|
+
.replace(/^-|-$/g, '');
|
|
29
|
+
}
|
|
30
|
+
export function getNextPrdNumber(prdDir) {
|
|
31
|
+
if (!fs.existsSync(prdDir))
|
|
32
|
+
return 1;
|
|
33
|
+
const files = fs.readdirSync(prdDir).filter((f) => f.endsWith('.md'));
|
|
34
|
+
const numbers = files.map((f) => {
|
|
35
|
+
const match = f.match(/^(\d+)-/);
|
|
36
|
+
return match ? parseInt(match[1], 10) : 0;
|
|
37
|
+
});
|
|
38
|
+
return Math.max(0, ...numbers) + 1;
|
|
39
|
+
}
|
|
40
|
+
export function extractPrdMarkdown(response) {
|
|
41
|
+
const match = response.match(/(^#\s+[\s\S]*)/m);
|
|
42
|
+
return match ? match[1].trim() : response.trim();
|
|
43
|
+
}
|
|
44
|
+
export function extractPrdTitle(markdown) {
|
|
45
|
+
const match = markdown.match(/^#\s+PRD:\s*(.+)/m);
|
|
46
|
+
return match ? match[1].trim() : null;
|
|
47
|
+
}
|
|
48
|
+
export function buildPrdPrompt(description, projectDir, planningPrinciples) {
|
|
49
|
+
return `You are generating a PRD markdown file for Night Watch.
|
|
50
|
+
|
|
51
|
+
Return only the final PRD markdown.
|
|
52
|
+
|
|
53
|
+
Hard requirements:
|
|
54
|
+
- Start with: # PRD: <title>
|
|
55
|
+
- Do not ask follow-up questions
|
|
56
|
+
- Do not add any preamble, commentary, or code fences
|
|
57
|
+
- Do not describe what you are going to do
|
|
58
|
+
- Do not mention these instructions
|
|
59
|
+
- Treat the planning guide below as mandatory instructions, not background context
|
|
60
|
+
|
|
61
|
+
Project directory: ${projectDir}
|
|
62
|
+
|
|
63
|
+
Planning guide:
|
|
64
|
+
${planningPrinciples}
|
|
65
|
+
|
|
66
|
+
User request:
|
|
67
|
+
${description}
|
|
68
|
+
|
|
69
|
+
Now write the complete PRD markdown file.`;
|
|
70
|
+
}
|
|
71
|
+
export function buildNativeClaudeEnv(baseEnv = process.env) {
|
|
72
|
+
const env = { ...baseEnv };
|
|
73
|
+
delete env.ANTHROPIC_BASE_URL;
|
|
74
|
+
delete env.ANTHROPIC_API_KEY;
|
|
75
|
+
delete env.ANTHROPIC_AUTH_TOKEN;
|
|
76
|
+
delete env.ANTHROPIC_DEFAULT_SONNET_MODEL;
|
|
77
|
+
delete env.ANTHROPIC_DEFAULT_OPUS_MODEL;
|
|
78
|
+
delete env.API_TIMEOUT_MS;
|
|
79
|
+
delete env.CLAUDE_CODE_SSE_PORT;
|
|
80
|
+
delete env.CLAUDE_NIGHTS_WATCH_DIR;
|
|
81
|
+
delete env.NW_CLAUDE_MODEL_ID;
|
|
82
|
+
delete env.NW_CLAUDE_PRIMARY_MODEL_ID;
|
|
83
|
+
delete env.NW_CLAUDE_SECONDARY_MODEL_ID;
|
|
84
|
+
delete env.NW_PROVIDER_CMD;
|
|
85
|
+
delete env.NW_PROVIDER_SUBCOMMAND;
|
|
86
|
+
delete env.NW_PROVIDER_PROMPT_FLAG;
|
|
87
|
+
delete env.NW_PROVIDER_APPROVE_FLAG;
|
|
88
|
+
delete env.NW_PROVIDER_WORKDIR_FLAG;
|
|
89
|
+
delete env.NW_PROVIDER_MODEL_FLAG;
|
|
90
|
+
delete env.NW_PROVIDER_MODEL;
|
|
91
|
+
delete env.NW_PROVIDER_LABEL;
|
|
92
|
+
return env;
|
|
93
|
+
}
|
|
94
|
+
export function resolvePrdCreateDir() {
|
|
95
|
+
return 'docs/PRDs';
|
|
96
|
+
}
|
|
97
|
+
function resolveGitHubBlobUrl(projectDir, relPath) {
|
|
98
|
+
try {
|
|
99
|
+
const remoteUrl = execSync('git remote get-url origin', {
|
|
100
|
+
cwd: projectDir,
|
|
101
|
+
encoding: 'utf-8',
|
|
102
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
103
|
+
}).trim();
|
|
104
|
+
const branch = execSync('git rev-parse --abbrev-ref HEAD', {
|
|
105
|
+
cwd: projectDir,
|
|
106
|
+
encoding: 'utf-8',
|
|
107
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
108
|
+
}).trim();
|
|
109
|
+
const httpsBase = remoteUrl
|
|
110
|
+
.replace(/^git@github\.com:/, 'https://github.com/')
|
|
111
|
+
.replace(/^ssh:\/\/git@github\.com\//, 'https://github.com/')
|
|
112
|
+
.replace(/\.git$/, '');
|
|
113
|
+
if (!httpsBase.startsWith('https://github.com/')) {
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const ref = branch && branch !== 'HEAD' ? branch : 'main';
|
|
117
|
+
return `${httpsBase}/blob/${encodeURIComponent(ref).replace(/%2F/g, '/')}/${relPath
|
|
118
|
+
.split(path.sep)
|
|
119
|
+
.map((segment) => encodeURIComponent(segment))
|
|
120
|
+
.join('/')}`;
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
export function buildGithubIssueBody(prdPath, projectDir, prdContent) {
|
|
127
|
+
const relPath = path.relative(projectDir, prdPath);
|
|
128
|
+
const blobUrl = resolveGitHubBlobUrl(projectDir, relPath);
|
|
129
|
+
const fileLine = blobUrl ? `PRD file: [\`${relPath}\`](${blobUrl})` : `PRD file: \`${relPath}\``;
|
|
130
|
+
return `${fileLine}\n\n${prdContent}\n\n---\nCreated via \`night-watch prd create\`.`;
|
|
131
|
+
}
|
|
132
|
+
async function generatePrdWithClaude(description, projectDir, model) {
|
|
133
|
+
const bundledTemplatePath = path.join(TEMPLATES_DIR, 'prd-creator.md');
|
|
134
|
+
const installedTemplatePath = path.join(projectDir, 'instructions', 'prd-creator.md');
|
|
135
|
+
const templatePath = fs.existsSync(installedTemplatePath)
|
|
136
|
+
? installedTemplatePath
|
|
137
|
+
: bundledTemplatePath;
|
|
138
|
+
if (!fs.existsSync(templatePath)) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
const planningPrinciples = fs.readFileSync(templatePath, 'utf-8');
|
|
142
|
+
const prompt = buildPrdPrompt(description, projectDir, planningPrinciples);
|
|
143
|
+
const modelId = model ?? CLAUDE_MODEL_IDS.opus;
|
|
144
|
+
const env = buildNativeClaudeEnv(process.env);
|
|
145
|
+
return await new Promise((resolve) => {
|
|
146
|
+
const child = spawn('claude', [
|
|
147
|
+
'-p',
|
|
148
|
+
'--verbose',
|
|
149
|
+
'--output-format',
|
|
150
|
+
'stream-json',
|
|
151
|
+
'--include-partial-messages',
|
|
152
|
+
'--model',
|
|
153
|
+
modelId,
|
|
154
|
+
prompt,
|
|
155
|
+
], { env, stdio: ['ignore', 'pipe', 'pipe'] });
|
|
156
|
+
let stdoutBuffer = '';
|
|
157
|
+
let finalResult = '';
|
|
158
|
+
child.stdout.on('data', (chunk) => {
|
|
159
|
+
stdoutBuffer += chunk.toString('utf-8');
|
|
160
|
+
while (stdoutBuffer.includes('\n')) {
|
|
161
|
+
const newlineIndex = stdoutBuffer.indexOf('\n');
|
|
162
|
+
const line = stdoutBuffer.slice(0, newlineIndex).trim();
|
|
163
|
+
stdoutBuffer = stdoutBuffer.slice(newlineIndex + 1);
|
|
164
|
+
if (!line)
|
|
165
|
+
continue;
|
|
166
|
+
try {
|
|
167
|
+
const payload = JSON.parse(line);
|
|
168
|
+
if (payload.type === 'stream_event') {
|
|
169
|
+
const event = payload.event;
|
|
170
|
+
const delta = event?.delta;
|
|
171
|
+
if (delta?.type === 'text_delta' && typeof delta.text === 'string') {
|
|
172
|
+
process.stdout.write(delta.text);
|
|
173
|
+
}
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
if (payload.type === 'result' && typeof payload.result === 'string') {
|
|
177
|
+
finalResult = payload.result;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// Ignore non-JSON metadata lines.
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
child.stderr.on('data', (chunk) => process.stderr.write(chunk));
|
|
186
|
+
child.on('close', (code) => {
|
|
187
|
+
if (stdoutBuffer.trim().length > 0) {
|
|
188
|
+
try {
|
|
189
|
+
const payload = JSON.parse(stdoutBuffer.trim());
|
|
190
|
+
if (payload.type === 'result' && typeof payload.result === 'string') {
|
|
191
|
+
finalResult = payload.result;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
// Ignore trailing partial data.
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
process.stdout.write('\n');
|
|
199
|
+
resolve(code === 0 && finalResult ? extractPrdMarkdown(finalResult) : null);
|
|
200
|
+
});
|
|
201
|
+
child.on('error', () => resolve(null));
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
function runGh(args, cwd) {
|
|
205
|
+
const result = spawnSync('gh', args, { cwd, encoding: 'utf-8' });
|
|
206
|
+
if (result.status === 0)
|
|
207
|
+
return (result.stdout ?? '').trim();
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
function createGithubIssue(title, prdPath, projectDir, prdContent) {
|
|
211
|
+
const tmpFile = path.join(projectDir, `.prd-issue-body-${Date.now()}.tmp`);
|
|
212
|
+
try {
|
|
213
|
+
const body = buildGithubIssueBody(prdPath, projectDir, prdContent);
|
|
214
|
+
fs.writeFileSync(tmpFile, body, 'utf-8');
|
|
215
|
+
const baseArgs = ['issue', 'create', '--title', `PRD: ${title}`, '--body-file', tmpFile];
|
|
216
|
+
return (runGh([...baseArgs, '--label', 'prd'], projectDir) ??
|
|
217
|
+
runGh(baseArgs, projectDir));
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
try {
|
|
224
|
+
fs.unlinkSync(tmpFile);
|
|
225
|
+
}
|
|
226
|
+
catch { /* ignore */ }
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
function parseDependencies(content) {
|
|
230
|
+
const match = content.match(/\*\*Depends on:\*\*\s*(.+)/i) || content.match(/Depends on:\s*(.+)/i);
|
|
231
|
+
if (!match)
|
|
232
|
+
return [];
|
|
233
|
+
return match[1]
|
|
234
|
+
.split(',')
|
|
235
|
+
.map((d) => d.replace(/`/g, '').trim())
|
|
236
|
+
.filter(Boolean);
|
|
237
|
+
}
|
|
238
|
+
function isClaimActive(claimPath, maxRuntime) {
|
|
239
|
+
try {
|
|
240
|
+
if (!fs.existsSync(claimPath)) {
|
|
241
|
+
return { active: false };
|
|
242
|
+
}
|
|
243
|
+
const content = fs.readFileSync(claimPath, 'utf-8');
|
|
244
|
+
const claim = JSON.parse(content);
|
|
245
|
+
const age = Math.floor(Date.now() / 1000) - claim.timestamp;
|
|
246
|
+
if (age < maxRuntime) {
|
|
247
|
+
return { active: true, hostname: claim.hostname, pid: claim.pid };
|
|
248
|
+
}
|
|
249
|
+
return { active: false };
|
|
250
|
+
}
|
|
251
|
+
catch {
|
|
252
|
+
return { active: false };
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
export function prdCommand(program) {
|
|
256
|
+
const prd = program.command('prd').description('Manage PRD files');
|
|
257
|
+
prd
|
|
258
|
+
.command('create')
|
|
259
|
+
.description('Generate a new PRD markdown file using Claude')
|
|
260
|
+
.argument('<name>', 'PRD description')
|
|
261
|
+
.option('--number', 'Add auto-numbering prefix to the filename', false)
|
|
262
|
+
.option('--model <model>', 'Claude model to use (e.g. sonnet, opus, or a full model ID)')
|
|
263
|
+
.action(async (name, options) => {
|
|
264
|
+
const projectDir = process.cwd();
|
|
265
|
+
const prdDir = path.join(projectDir, resolvePrdCreateDir());
|
|
266
|
+
if (!fs.existsSync(prdDir)) {
|
|
267
|
+
fs.mkdirSync(prdDir, { recursive: true });
|
|
268
|
+
}
|
|
269
|
+
const resolvedModel = options.model
|
|
270
|
+
? (CLAUDE_MODEL_IDS[options.model] ?? options.model)
|
|
271
|
+
: undefined;
|
|
272
|
+
const modelLabel = resolvedModel ?? CLAUDE_MODEL_IDS.opus;
|
|
273
|
+
dim(`Calling Claude (${modelLabel}) to generate the PRD. It can take several minutes, please hang on!\n`);
|
|
274
|
+
const generated = await generatePrdWithClaude(name, projectDir, resolvedModel);
|
|
275
|
+
if (!generated) {
|
|
276
|
+
uiError('Claude generation failed. Is the provider configured and available?');
|
|
277
|
+
process.exit(1);
|
|
278
|
+
}
|
|
279
|
+
const prdTitle = extractPrdTitle(generated) ?? name;
|
|
280
|
+
const slug = slugify(prdTitle);
|
|
281
|
+
const filename = options.number
|
|
282
|
+
? `${String(getNextPrdNumber(prdDir)).padStart(2, '0')}-${slug}.md`
|
|
283
|
+
: `${slug}.md`;
|
|
284
|
+
const filePath = path.join(prdDir, filename);
|
|
285
|
+
if (fs.existsSync(filePath)) {
|
|
286
|
+
uiError(`File already exists: ${filePath}`);
|
|
287
|
+
dim('Use a different name or remove the existing file.');
|
|
288
|
+
process.exit(1);
|
|
289
|
+
}
|
|
290
|
+
fs.writeFileSync(filePath, generated, 'utf-8');
|
|
291
|
+
header('PRD Created');
|
|
292
|
+
success(`Created: ${filePath}`);
|
|
293
|
+
const issueUrl = createGithubIssue(prdTitle, filePath, projectDir, generated);
|
|
294
|
+
if (issueUrl) {
|
|
295
|
+
info(`Issue: ${issueUrl}`);
|
|
296
|
+
}
|
|
297
|
+
else {
|
|
298
|
+
dim('GitHub issue creation skipped (gh not available or not in a GitHub repo).');
|
|
299
|
+
}
|
|
300
|
+
});
|
|
301
|
+
prd
|
|
302
|
+
.command('list')
|
|
303
|
+
.description('List all PRDs with status')
|
|
304
|
+
.option('--json', 'Output as JSON')
|
|
305
|
+
.action(async (options) => {
|
|
306
|
+
const projectDir = process.cwd();
|
|
307
|
+
const config = loadConfig(projectDir);
|
|
308
|
+
const absolutePrdDir = path.join(projectDir, config.prdDir);
|
|
309
|
+
const doneDir = path.join(absolutePrdDir, 'done');
|
|
310
|
+
const pending = [];
|
|
311
|
+
if (fs.existsSync(absolutePrdDir)) {
|
|
312
|
+
const files = fs.readdirSync(absolutePrdDir).filter((f) => f.endsWith('.md'));
|
|
313
|
+
for (const file of files) {
|
|
314
|
+
const content = fs.readFileSync(path.join(absolutePrdDir, file), 'utf-8');
|
|
315
|
+
const deps = parseDependencies(content);
|
|
316
|
+
const claimPath = path.join(absolutePrdDir, file + CLAIM_FILE_EXTENSION);
|
|
317
|
+
const claimStatus = isClaimActive(claimPath, config.maxRuntime);
|
|
318
|
+
pending.push({
|
|
319
|
+
name: file,
|
|
320
|
+
dependencies: deps,
|
|
321
|
+
claimed: claimStatus.active,
|
|
322
|
+
claimInfo: claimStatus.active
|
|
323
|
+
? { hostname: claimStatus.hostname, pid: claimStatus.pid }
|
|
324
|
+
: undefined,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
const done = [];
|
|
329
|
+
if (fs.existsSync(doneDir)) {
|
|
330
|
+
const files = fs.readdirSync(doneDir).filter((f) => f.endsWith('.md'));
|
|
331
|
+
for (const file of files) {
|
|
332
|
+
const content = fs.readFileSync(path.join(doneDir, file), 'utf-8');
|
|
333
|
+
const deps = parseDependencies(content);
|
|
334
|
+
done.push({ name: file, dependencies: deps });
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
if (options.json) {
|
|
338
|
+
console.log(JSON.stringify({ pending, done }, null, 2));
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
header('PRD Status');
|
|
342
|
+
if (pending.length === 0 && done.length === 0) {
|
|
343
|
+
dim(' No PRDs found.');
|
|
344
|
+
return;
|
|
345
|
+
}
|
|
346
|
+
const table = createTable({ head: ['Name', 'Status', 'Dependencies'] });
|
|
347
|
+
for (const prdEntry of pending) {
|
|
348
|
+
const status = prdEntry.claimed ? 'claimed' : 'pending';
|
|
349
|
+
const statusDisplay = prdEntry.claimed && prdEntry.claimInfo
|
|
350
|
+
? `claimed (${prdEntry.claimInfo.hostname}:${prdEntry.claimInfo.pid})`
|
|
351
|
+
: status;
|
|
352
|
+
table.push([prdEntry.name, statusDisplay, prdEntry.dependencies.join(', ') || '-']);
|
|
353
|
+
}
|
|
354
|
+
for (const prdEntry of done) {
|
|
355
|
+
table.push([prdEntry.name, 'done', prdEntry.dependencies.join(', ') || '-']);
|
|
356
|
+
}
|
|
357
|
+
console.log(table.toString());
|
|
358
|
+
const claimedCount = pending.filter((p) => p.claimed).length;
|
|
359
|
+
const pendingCount = pending.length - claimedCount;
|
|
360
|
+
info(`${pendingCount} pending, ${claimedCount} claimed, ${done.length} done`);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
//# sourceMappingURL=prd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRDs command for Night Watch CLI
|
|
3
|
+
* Lists all PRDs with their status (ready/blocked/in-progress/done) and dependencies
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface IPrdsOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* PRDs command implementation
|
|
11
|
+
*/
|
|
12
|
+
export declare function prdsCommand(program: Command): void;
|
|
13
|
+
//# sourceMappingURL=prds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prds.d.ts","sourceRoot":"","sources":["../../src/commands/prds.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AA6HD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkGlD"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRDs command for Night Watch CLI
|
|
3
|
+
* Lists all PRDs with their status (ready/blocked/in-progress/done) and dependencies
|
|
4
|
+
*/
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { collectPrdInfo, createTable, dim, header, loadConfig } from '@night-watch/core';
|
|
7
|
+
import { execSync } from 'child_process';
|
|
8
|
+
/**
|
|
9
|
+
* Get open PR branch names using gh CLI
|
|
10
|
+
*/
|
|
11
|
+
function getOpenPrBranches(projectDir) {
|
|
12
|
+
try {
|
|
13
|
+
execSync('git rev-parse --git-dir', {
|
|
14
|
+
cwd: projectDir,
|
|
15
|
+
encoding: 'utf-8',
|
|
16
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return new Set();
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
execSync('which gh', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return new Set();
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const output = execSync('gh pr list --state open --json headRefName', {
|
|
30
|
+
cwd: projectDir,
|
|
31
|
+
encoding: 'utf-8',
|
|
32
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
33
|
+
});
|
|
34
|
+
const prs = JSON.parse(output);
|
|
35
|
+
return new Set(prs.map((pr) => pr.headRefName));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return new Set();
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Derive a branch name from a PRD name
|
|
43
|
+
* Converts "01-feature-name.md" or "01-feature-name" to potential branch patterns
|
|
44
|
+
*/
|
|
45
|
+
function deriveBranchPatterns(prdName, branchPrefix) {
|
|
46
|
+
// Remove .md extension if present
|
|
47
|
+
const baseName = prdName.replace(/\.md$/, '');
|
|
48
|
+
// Common patterns:
|
|
49
|
+
// 1. night-watch/01-feature-name
|
|
50
|
+
// 2. feat/01-feature-name
|
|
51
|
+
// 3. feature/01-feature-name
|
|
52
|
+
return [`${branchPrefix}${baseName}`, `feat/${baseName}`, `feature/${baseName}`];
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Find matching PR for a PRD
|
|
56
|
+
*/
|
|
57
|
+
function findMatchingPr(prdName, openPrBranches, branchPrefix) {
|
|
58
|
+
const patterns = deriveBranchPatterns(prdName, branchPrefix);
|
|
59
|
+
for (const pattern of patterns) {
|
|
60
|
+
// Check for exact match
|
|
61
|
+
if (openPrBranches.has(pattern)) {
|
|
62
|
+
return pattern;
|
|
63
|
+
}
|
|
64
|
+
// Check for partial match (branch might have additional suffix)
|
|
65
|
+
for (const branch of openPrBranches) {
|
|
66
|
+
if (branch === pattern ||
|
|
67
|
+
branch.startsWith(`${pattern}-`) ||
|
|
68
|
+
branch.startsWith(`${pattern}/`)) {
|
|
69
|
+
return branch;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Format status with color
|
|
77
|
+
*/
|
|
78
|
+
function formatStatus(status) {
|
|
79
|
+
switch (status) {
|
|
80
|
+
case 'ready':
|
|
81
|
+
return chalk.green('ready');
|
|
82
|
+
case 'blocked':
|
|
83
|
+
return chalk.yellow('blocked');
|
|
84
|
+
case 'in-progress':
|
|
85
|
+
return chalk.cyan('in-progress');
|
|
86
|
+
case 'pending-review':
|
|
87
|
+
return chalk.magenta('pending-review');
|
|
88
|
+
case 'done':
|
|
89
|
+
return chalk.dim('done');
|
|
90
|
+
default:
|
|
91
|
+
return status;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Format dependencies list
|
|
96
|
+
*/
|
|
97
|
+
function formatDependencies(dependencies, unmetDependencies) {
|
|
98
|
+
if (dependencies.length === 0) {
|
|
99
|
+
return chalk.dim('-');
|
|
100
|
+
}
|
|
101
|
+
return dependencies
|
|
102
|
+
.map((dep) => {
|
|
103
|
+
const isUnmet = unmetDependencies.includes(dep);
|
|
104
|
+
return isUnmet ? chalk.red(dep) : chalk.green(dep);
|
|
105
|
+
})
|
|
106
|
+
.join(', ');
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* PRDs command implementation
|
|
110
|
+
*/
|
|
111
|
+
export function prdsCommand(program) {
|
|
112
|
+
program
|
|
113
|
+
.command('prds')
|
|
114
|
+
.description('List all PRDs with their status and dependencies')
|
|
115
|
+
.option('--json', 'Output as JSON')
|
|
116
|
+
.action(async (options) => {
|
|
117
|
+
try {
|
|
118
|
+
const projectDir = process.cwd();
|
|
119
|
+
const config = loadConfig(projectDir);
|
|
120
|
+
// Collect PRD info using existing utility
|
|
121
|
+
const prds = collectPrdInfo(projectDir, config.prdDir, config.maxRuntime);
|
|
122
|
+
// Get open PR branches for in-progress detection
|
|
123
|
+
const openPrBranches = getOpenPrBranches(projectDir);
|
|
124
|
+
// Filter out summary file and update in-progress status based on open PRs
|
|
125
|
+
const filteredPrds = prds;
|
|
126
|
+
// Update status based on open PRs
|
|
127
|
+
for (const prd of filteredPrds) {
|
|
128
|
+
if (prd.status !== 'done') {
|
|
129
|
+
const matchingPr = findMatchingPr(prd.name, openPrBranches, config.branchPrefix);
|
|
130
|
+
if (matchingPr) {
|
|
131
|
+
prd.status = 'in-progress';
|
|
132
|
+
prd.prBranch = matchingPr;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// Sort: ready first, then blocked, then in-progress, then done
|
|
137
|
+
const statusOrder = {
|
|
138
|
+
ready: 0,
|
|
139
|
+
blocked: 1,
|
|
140
|
+
'in-progress': 2,
|
|
141
|
+
'pending-review': 3,
|
|
142
|
+
done: 4,
|
|
143
|
+
};
|
|
144
|
+
filteredPrds.sort((a, b) => statusOrder[a.status] - statusOrder[b.status]);
|
|
145
|
+
// Output as JSON if requested
|
|
146
|
+
if (options.json) {
|
|
147
|
+
const jsonOutput = filteredPrds.map((prd) => ({
|
|
148
|
+
name: prd.name,
|
|
149
|
+
status: prd.status,
|
|
150
|
+
dependencies: prd.dependencies,
|
|
151
|
+
unmetDependencies: prd.unmetDependencies,
|
|
152
|
+
pr: prd.prBranch || null,
|
|
153
|
+
}));
|
|
154
|
+
console.log(JSON.stringify(jsonOutput, null, 2));
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// Display header
|
|
158
|
+
header('PRD Status');
|
|
159
|
+
if (filteredPrds.length === 0) {
|
|
160
|
+
dim('No PRDs found.');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
// Create and populate table
|
|
164
|
+
const table = createTable({
|
|
165
|
+
head: ['Name', 'Status', 'Dependencies', 'PR'],
|
|
166
|
+
colWidths: [35, 12, 40, 30],
|
|
167
|
+
});
|
|
168
|
+
for (const prd of filteredPrds) {
|
|
169
|
+
const prBranch = prd.prBranch;
|
|
170
|
+
table.push([
|
|
171
|
+
prd.status === 'done' ? chalk.dim(prd.name) : prd.name,
|
|
172
|
+
formatStatus(prd.status),
|
|
173
|
+
formatDependencies(prd.dependencies, prd.unmetDependencies),
|
|
174
|
+
prBranch ? chalk.cyan(prBranch) : chalk.dim('-'),
|
|
175
|
+
]);
|
|
176
|
+
}
|
|
177
|
+
console.log(table.toString());
|
|
178
|
+
// Summary counts
|
|
179
|
+
const ready = filteredPrds.filter((p) => p.status === 'ready').length;
|
|
180
|
+
const blocked = filteredPrds.filter((p) => p.status === 'blocked').length;
|
|
181
|
+
const inProgress = filteredPrds.filter((p) => p.status === 'in-progress').length;
|
|
182
|
+
const pendingReview = filteredPrds.filter((p) => p.status === 'pending-review').length;
|
|
183
|
+
const done = filteredPrds.filter((p) => p.status === 'done').length;
|
|
184
|
+
console.log();
|
|
185
|
+
dim(` Ready: ${ready} | Blocked: ${blocked} | In Progress: ${inProgress} | Pending Review: ${pendingReview} | Done: ${done}`);
|
|
186
|
+
console.log();
|
|
187
|
+
}
|
|
188
|
+
catch (error) {
|
|
189
|
+
console.error(`Error listing PRDs: ${error instanceof Error ? error.message : String(error)}`);
|
|
190
|
+
process.exit(1);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=prds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prds.js","sourceRoot":"","sources":["../../src/commands/prds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRs command for Night Watch CLI
|
|
3
|
+
* Lists matching PRs with their CI status and review scores
|
|
4
|
+
*/
|
|
5
|
+
import { Command } from 'commander';
|
|
6
|
+
export interface IPrsOptions {
|
|
7
|
+
json?: boolean;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* PRs command implementation
|
|
12
|
+
*/
|
|
13
|
+
export declare function prsCommand(program: Command): void;
|
|
14
|
+
//# sourceMappingURL=prs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prs.d.ts","sourceRoot":"","sources":["../../src/commands/prs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA0CD;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyEjD"}
|