@jonit-dev/night-watch-cli 1.8.4-beta.0 → 1.8.4-beta.1
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.js +307 -164
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +5 -0
- package/dist/commands/init.js.map +1 -1
- 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.d.ts +8 -14
- package/dist/commands/prd.d.ts.map +1 -1
- package/dist/commands/prd.js +238 -145
- package/dist/commands/prd.js.map +1 -1
- package/dist/scripts/night-watch-plan-cron.sh +130 -0
- package/dist/templates/pr-reviewer.md +1 -1
- package/dist/templates/prd-creator.md +330 -0
- package/dist/templates/qa.md +8 -4
- package/package.json +1 -1
package/dist/commands/prd.js
CHANGED
|
@@ -1,22 +1,32 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PRD command group - manage PRD files
|
|
3
3
|
*/
|
|
4
|
+
import { execSync, spawn, spawnSync } from 'child_process';
|
|
4
5
|
import * as fs from 'fs';
|
|
5
6
|
import * as path from 'path';
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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);
|
|
11
24
|
export function slugify(name) {
|
|
12
25
|
return name
|
|
13
26
|
.toLowerCase()
|
|
14
27
|
.replace(/[^a-z0-9]+/g, '-')
|
|
15
28
|
.replace(/^-|-$/g, '');
|
|
16
29
|
}
|
|
17
|
-
/**
|
|
18
|
-
* Get the next PRD number based on existing files in the directory
|
|
19
|
-
*/
|
|
20
30
|
export function getNextPrdNumber(prdDir) {
|
|
21
31
|
if (!fs.existsSync(prdDir))
|
|
22
32
|
return 1;
|
|
@@ -27,19 +37,195 @@ export function getNextPrdNumber(prdDir) {
|
|
|
27
37
|
});
|
|
28
38
|
return Math.max(0, ...numbers) + 1;
|
|
29
39
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
+
}
|
|
37
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));
|
|
38
202
|
});
|
|
39
203
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
+
}
|
|
43
229
|
function parseDependencies(content) {
|
|
44
230
|
const match = content.match(/\*\*Depends on:\*\*\s*(.+)/i) || content.match(/Depends on:\s*(.+)/i);
|
|
45
231
|
if (!match)
|
|
@@ -49,9 +235,6 @@ function parseDependencies(content) {
|
|
|
49
235
|
.map((d) => d.replace(/`/g, '').trim())
|
|
50
236
|
.filter(Boolean);
|
|
51
237
|
}
|
|
52
|
-
/**
|
|
53
|
-
* Check if a claim file is active (not stale)
|
|
54
|
-
*/
|
|
55
238
|
function isClaimActive(claimPath, maxRuntime) {
|
|
56
239
|
try {
|
|
57
240
|
if (!fs.existsSync(claimPath)) {
|
|
@@ -69,136 +252,50 @@ function isClaimActive(claimPath, maxRuntime) {
|
|
|
69
252
|
return { active: false };
|
|
70
253
|
}
|
|
71
254
|
}
|
|
72
|
-
/**
|
|
73
|
-
* Register the prd command group with the program
|
|
74
|
-
*/
|
|
75
255
|
export function prdCommand(program) {
|
|
76
256
|
const prd = program.command('prd').description('Manage PRD files');
|
|
77
257
|
prd
|
|
78
258
|
.command('create')
|
|
79
|
-
.description('Generate a new PRD markdown file
|
|
80
|
-
.argument('<name>', 'PRD
|
|
81
|
-
.option('
|
|
82
|
-
.option('
|
|
83
|
-
.option('--deps <files>', 'Comma-separated dependency filenames')
|
|
84
|
-
.option('--phases <count>', 'Number of execution phases', '3')
|
|
85
|
-
.option('--no-number', 'Skip auto-numbering prefix')
|
|
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)')
|
|
86
263
|
.action(async (name, options) => {
|
|
87
264
|
const projectDir = process.cwd();
|
|
88
|
-
|
|
89
|
-
const config = loadConfig(projectDir);
|
|
90
|
-
const prdDir = path.join(projectDir, config.prdDir);
|
|
91
|
-
// Ensure the PRD directory exists
|
|
265
|
+
const prdDir = path.join(projectDir, resolvePrdCreateDir());
|
|
92
266
|
if (!fs.existsSync(prdDir)) {
|
|
93
267
|
fs.mkdirSync(prdDir, { recursive: true });
|
|
94
268
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
dependsOn = options.deps
|
|
105
|
-
.split(',')
|
|
106
|
-
.map((d) => d.trim())
|
|
107
|
-
.filter((d) => d.length > 0);
|
|
108
|
-
}
|
|
109
|
-
// Interactive mode: prompt for values
|
|
110
|
-
if (options.interactive) {
|
|
111
|
-
const rl = readline.createInterface({
|
|
112
|
-
input: process.stdin,
|
|
113
|
-
output: process.stdout,
|
|
114
|
-
});
|
|
115
|
-
try {
|
|
116
|
-
// Prompt for complexity
|
|
117
|
-
const complexityInput = await prompt(rl, 'Complexity score (1-10, default 5): ');
|
|
118
|
-
if (complexityInput) {
|
|
119
|
-
const parsed = parseInt(complexityInput, 10);
|
|
120
|
-
if (!isNaN(parsed) && parsed >= 1 && parsed <= 10) {
|
|
121
|
-
complexityScore = parsed;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
// Prompt for dependencies
|
|
125
|
-
const depsInput = await prompt(rl, 'Dependencies (comma-separated filenames, or empty): ');
|
|
126
|
-
if (depsInput) {
|
|
127
|
-
dependsOn = depsInput
|
|
128
|
-
.split(',')
|
|
129
|
-
.map((d) => d.trim())
|
|
130
|
-
.filter((d) => d.length > 0);
|
|
131
|
-
}
|
|
132
|
-
// Prompt for phases
|
|
133
|
-
const phasesInput = await prompt(rl, `Number of phases (default ${phaseCount}): `);
|
|
134
|
-
if (phasesInput) {
|
|
135
|
-
const parsed = parseInt(phasesInput, 10);
|
|
136
|
-
if (!isNaN(parsed) && parsed >= 1) {
|
|
137
|
-
phaseCount = parsed;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
finally {
|
|
142
|
-
rl.close();
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
// Determine complexity level from score
|
|
146
|
-
let complexityLevel;
|
|
147
|
-
if (complexityScore <= 3) {
|
|
148
|
-
complexityLevel = 'LOW';
|
|
149
|
-
}
|
|
150
|
-
else if (complexityScore <= 7) {
|
|
151
|
-
complexityLevel = 'MEDIUM';
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
complexityLevel = 'HIGH';
|
|
155
|
-
}
|
|
156
|
-
// Build filename
|
|
157
|
-
const slug = slugify(name);
|
|
158
|
-
let filename;
|
|
159
|
-
if (options.number) {
|
|
160
|
-
const nextNum = getNextPrdNumber(prdDir);
|
|
161
|
-
const padded = String(nextNum).padStart(2, '0');
|
|
162
|
-
filename = `${padded}-${slug}.md`;
|
|
163
|
-
}
|
|
164
|
-
else {
|
|
165
|
-
filename = `${slug}.md`;
|
|
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);
|
|
166
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`;
|
|
167
284
|
const filePath = path.join(prdDir, filename);
|
|
168
|
-
// Refuse to overwrite existing files
|
|
169
285
|
if (fs.existsSync(filePath)) {
|
|
170
286
|
uiError(`File already exists: ${filePath}`);
|
|
171
287
|
dim('Use a different name or remove the existing file.');
|
|
172
288
|
process.exit(1);
|
|
173
289
|
}
|
|
174
|
-
|
|
175
|
-
let customTemplate;
|
|
176
|
-
if (options.template) {
|
|
177
|
-
const templatePath = path.resolve(options.template);
|
|
178
|
-
if (!fs.existsSync(templatePath)) {
|
|
179
|
-
uiError(`Template file not found: ${templatePath}`);
|
|
180
|
-
process.exit(1);
|
|
181
|
-
}
|
|
182
|
-
customTemplate = fs.readFileSync(templatePath, 'utf-8');
|
|
183
|
-
}
|
|
184
|
-
// Render template
|
|
185
|
-
const vars = {
|
|
186
|
-
title: name,
|
|
187
|
-
dependsOn,
|
|
188
|
-
complexityScore,
|
|
189
|
-
complexityLevel,
|
|
190
|
-
complexityBreakdown: [],
|
|
191
|
-
phaseCount,
|
|
192
|
-
};
|
|
193
|
-
const content = renderPrdTemplate(vars, customTemplate);
|
|
194
|
-
// Write the file
|
|
195
|
-
fs.writeFileSync(filePath, content, 'utf-8');
|
|
290
|
+
fs.writeFileSync(filePath, generated, 'utf-8');
|
|
196
291
|
header('PRD Created');
|
|
197
292
|
success(`Created: ${filePath}`);
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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).');
|
|
202
299
|
}
|
|
203
300
|
});
|
|
204
301
|
prd
|
|
@@ -210,7 +307,6 @@ export function prdCommand(program) {
|
|
|
210
307
|
const config = loadConfig(projectDir);
|
|
211
308
|
const absolutePrdDir = path.join(projectDir, config.prdDir);
|
|
212
309
|
const doneDir = path.join(absolutePrdDir, 'done');
|
|
213
|
-
// Scan pending PRDs
|
|
214
310
|
const pending = [];
|
|
215
311
|
if (fs.existsSync(absolutePrdDir)) {
|
|
216
312
|
const files = fs.readdirSync(absolutePrdDir).filter((f) => f.endsWith('.md'));
|
|
@@ -229,7 +325,6 @@ export function prdCommand(program) {
|
|
|
229
325
|
});
|
|
230
326
|
}
|
|
231
327
|
}
|
|
232
|
-
// Scan done PRDs
|
|
233
328
|
const done = [];
|
|
234
329
|
if (fs.existsSync(doneDir)) {
|
|
235
330
|
const files = fs.readdirSync(doneDir).filter((f) => f.endsWith('.md'));
|
|
@@ -248,18 +343,16 @@ export function prdCommand(program) {
|
|
|
248
343
|
dim(' No PRDs found.');
|
|
249
344
|
return;
|
|
250
345
|
}
|
|
251
|
-
const table = createTable({
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
const statusDisplay = prd.claimed && prd.claimInfo
|
|
257
|
-
? `claimed (${prd.claimInfo.hostname}:${prd.claimInfo.pid})`
|
|
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})`
|
|
258
351
|
: status;
|
|
259
|
-
table.push([
|
|
352
|
+
table.push([prdEntry.name, statusDisplay, prdEntry.dependencies.join(', ') || '-']);
|
|
260
353
|
}
|
|
261
|
-
for (const
|
|
262
|
-
table.push([
|
|
354
|
+
for (const prdEntry of done) {
|
|
355
|
+
table.push([prdEntry.name, 'done', prdEntry.dependencies.join(', ') || '-']);
|
|
263
356
|
}
|
|
264
357
|
console.log(table.toString());
|
|
265
358
|
const claimedCount = pending.filter((p) => p.claimed).length;
|
package/dist/commands/prd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"prd.js","sourceRoot":"","sources":["../../src/commands/prd.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# Night Watch Plan Runner (project-agnostic)
|
|
5
|
+
# Usage: night-watch-plan-cron.sh /path/to/project
|
|
6
|
+
#
|
|
7
|
+
# NOTE: This script expects environment variables to be set by the caller.
|
|
8
|
+
# The Node.js CLI will inject config values via environment variables.
|
|
9
|
+
# Required env vars (with defaults shown):
|
|
10
|
+
# NW_PLAN_TASK='' - Task/feature description to plan (required)
|
|
11
|
+
# NW_PRD_DIR=docs/PRDs - PRD output directory (relative to project)
|
|
12
|
+
# NW_PLAN_MAX_RUNTIME=1800 - Maximum runtime in seconds
|
|
13
|
+
# NW_PROVIDER_CMD=claude - AI provider CLI to use
|
|
14
|
+
# NW_DRY_RUN=0 - Set to 1 for dry-run mode
|
|
15
|
+
|
|
16
|
+
PROJECT_DIR="${1:?Usage: $0 /path/to/project}"
|
|
17
|
+
PROJECT_NAME=$(basename "${PROJECT_DIR}")
|
|
18
|
+
LOG_DIR="${PROJECT_DIR}/logs"
|
|
19
|
+
LOG_FILE="${LOG_DIR}/plan.log"
|
|
20
|
+
MAX_RUNTIME="${NW_PLAN_MAX_RUNTIME:-1800}"
|
|
21
|
+
MAX_LOG_SIZE="524288" # 512 KB
|
|
22
|
+
PROVIDER_CMD="${NW_PROVIDER_CMD:-claude}"
|
|
23
|
+
PROVIDER_LABEL="${NW_PROVIDER_LABEL:-}"
|
|
24
|
+
SCRIPT_START_TIME=$(date +%s)
|
|
25
|
+
|
|
26
|
+
mkdir -p "${LOG_DIR}"
|
|
27
|
+
|
|
28
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
29
|
+
# shellcheck source=night-watch-helpers.sh
|
|
30
|
+
source "${SCRIPT_DIR}/night-watch-helpers.sh"
|
|
31
|
+
|
|
32
|
+
emit_result() {
|
|
33
|
+
local status="${1:?status required}"
|
|
34
|
+
local details="${2:-}"
|
|
35
|
+
if [ -n "${details}" ]; then
|
|
36
|
+
echo "NIGHT_WATCH_RESULT:${status}|${details}"
|
|
37
|
+
else
|
|
38
|
+
echo "NIGHT_WATCH_RESULT:${status}"
|
|
39
|
+
fi
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Validate provider
|
|
43
|
+
if ! validate_provider "${PROVIDER_CMD}"; then
|
|
44
|
+
echo "ERROR: Unknown provider: ${PROVIDER_CMD}" >&2
|
|
45
|
+
emit_result "failure" "reason=unknown_provider"
|
|
46
|
+
exit 1
|
|
47
|
+
fi
|
|
48
|
+
|
|
49
|
+
# Ensure provider CLI is on PATH
|
|
50
|
+
if ! ensure_provider_on_path "${PROVIDER_CMD}"; then
|
|
51
|
+
echo "ERROR: Provider '${PROVIDER_CMD}' not found in PATH or common installation locations" >&2
|
|
52
|
+
emit_result "failure" "reason=provider_not_found"
|
|
53
|
+
exit 1
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
PROVIDER_MODEL_DISPLAY=$(resolve_provider_model_display "${PROVIDER_CMD}" "${PROVIDER_LABEL}")
|
|
57
|
+
PRD_DIR="${NW_PRD_DIR:-docs/PRDs}"
|
|
58
|
+
PLAN_TASK="${NW_PLAN_TASK:-}"
|
|
59
|
+
|
|
60
|
+
rotate_log
|
|
61
|
+
log_separator
|
|
62
|
+
log "RUN-START: planner invoked project=${PROJECT_DIR} provider=${PROVIDER_CMD} dry_run=${NW_DRY_RUN:-0}"
|
|
63
|
+
log "CONFIG: max_runtime=${MAX_RUNTIME}s prd_dir=${PRD_DIR}"
|
|
64
|
+
|
|
65
|
+
# Dry-run mode
|
|
66
|
+
if [ "${NW_DRY_RUN:-0}" = "1" ]; then
|
|
67
|
+
echo "=== Dry Run: PRD Planner ==="
|
|
68
|
+
echo "Provider (model): ${PROVIDER_MODEL_DISPLAY}"
|
|
69
|
+
echo "Task: ${PLAN_TASK:-<none>}"
|
|
70
|
+
echo "PRD Directory: ${PRD_DIR}"
|
|
71
|
+
emit_result "skip_dry_run"
|
|
72
|
+
exit 0
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
# Resolve prd-creator instructions (project instructions/ > .claude/commands/ > bundled templates/)
|
|
76
|
+
CREATOR_PROMPT_PATH=$(resolve_instruction_path "${PROJECT_DIR}" "prd-creator.md" || true)
|
|
77
|
+
if [ -z "${CREATOR_PROMPT_PATH}" ]; then
|
|
78
|
+
log "FAIL: Missing prd-creator instructions. Checked instructions/, .claude/commands/, and bundled templates/"
|
|
79
|
+
emit_result "failure_missing_prompt"
|
|
80
|
+
exit 1
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
CREATOR_PROMPT="$(cat "${CREATOR_PROMPT_PATH}")"
|
|
84
|
+
|
|
85
|
+
# Append the task description if provided
|
|
86
|
+
if [ -n "${PLAN_TASK}" ]; then
|
|
87
|
+
CREATOR_PROMPT="${CREATOR_PROMPT}
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Your Task
|
|
92
|
+
|
|
93
|
+
You are planning the following feature for the project in the current directory:
|
|
94
|
+
|
|
95
|
+
**Task:** ${PLAN_TASK}
|
|
96
|
+
|
|
97
|
+
**PRD Directory:** ${PRD_DIR}
|
|
98
|
+
|
|
99
|
+
Explore the codebase, determine an appropriate output filename based on the task title, and create the PRD following the skill instructions above. Write the PRD file to \`${PRD_DIR}/<slugified-task-name>.md\`."
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
log "START: Running PRD planner for ${PROJECT_NAME} (provider: ${PROVIDER_CMD})"
|
|
103
|
+
|
|
104
|
+
EXIT_CODE=0
|
|
105
|
+
|
|
106
|
+
# Build provider command array using generic helper
|
|
107
|
+
mapfile -d '' -t PROVIDER_CMD_PARTS < <(build_provider_cmd "${PROJECT_DIR}" "${CREATOR_PROMPT}")
|
|
108
|
+
|
|
109
|
+
# Execute in the project directory so the provider can explore the codebase
|
|
110
|
+
if (cd "${PROJECT_DIR}" && timeout "${MAX_RUNTIME}" "${PROVIDER_CMD_PARTS[@]}" 2>&1 | tee -a "${LOG_FILE}"); then
|
|
111
|
+
EXIT_CODE=0
|
|
112
|
+
else
|
|
113
|
+
EXIT_CODE=$?
|
|
114
|
+
fi
|
|
115
|
+
|
|
116
|
+
ELAPSED=$(( $(date +%s) - SCRIPT_START_TIME ))
|
|
117
|
+
log "OUTCOME: exit_code=${EXIT_CODE} elapsed=${ELAPSED}s project=${PROJECT_NAME}"
|
|
118
|
+
|
|
119
|
+
if [ "${EXIT_CODE}" -eq 0 ]; then
|
|
120
|
+
log "DONE: Planner complete"
|
|
121
|
+
emit_result "success_plan"
|
|
122
|
+
elif [ "${EXIT_CODE}" -eq 124 ]; then
|
|
123
|
+
log "TIMEOUT: Planner killed after ${MAX_RUNTIME}s"
|
|
124
|
+
emit_result "timeout"
|
|
125
|
+
else
|
|
126
|
+
log "FAIL: Planner exited with code ${EXIT_CODE}"
|
|
127
|
+
emit_result "failure" "provider_exit=${EXIT_CODE}"
|
|
128
|
+
fi
|
|
129
|
+
|
|
130
|
+
exit "${EXIT_CODE}"
|
|
@@ -187,7 +187,7 @@ Parse the review score from the comment body. Look for patterns like:
|
|
|
187
187
|
<If CI was fixed>### CI Failures Fixed:
|
|
188
188
|
- <job>: <what was wrong and how it was fixed><end>
|
|
189
189
|
|
|
190
|
-
|
|
190
|
+
Verification passes locally. Ready for re-review.
|
|
191
191
|
|
|
192
192
|
Night Watch PR Reviewer"
|
|
193
193
|
```
|