@jonit-dev/night-watch-cli 1.8.12-beta.0 → 1.8.12-beta.10
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.js +3281 -651
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +12 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +307 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/analytics.d.ts +14 -0
- package/dist/commands/analytics.d.ts.map +1 -1
- package/dist/commands/analytics.js +129 -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 -1
- package/dist/commands/audit.js +189 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/board.d.ts +9 -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.js +239 -0
- package/dist/commands/cancel.js.map +1 -0
- package/dist/commands/cron.d.ts +8 -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.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.js +874 -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.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.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.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.js +5 -0
- package/dist/commands/dashboard/types.js.map +1 -0
- package/dist/commands/dashboard.d.ts +11 -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.js +195 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/history.d.ts +7 -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 -1
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/install.d.ts +65 -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.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 -1
- package/dist/commands/merge.js +186 -0
- package/dist/commands/merge.js.map +1 -0
- package/dist/commands/notify.d.ts +7 -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 -1
- package/dist/commands/plan.js +133 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/prd-state.d.ts +12 -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.js +363 -0
- package/dist/commands/prd.js.map +1 -0
- package/dist/commands/prds.d.ts +13 -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.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 -1
- package/dist/commands/qa.js +238 -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 -1
- package/dist/commands/queue.js +398 -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 -1
- package/dist/commands/resolve.js +212 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/retry.d.ts +9 -0
- package/dist/commands/retry.js +71 -0
- package/dist/commands/retry.js.map +1 -0
- package/dist/commands/review.d.ts +79 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +47 -75
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/run.d.ts +88 -0
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +85 -1
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/serve.d.ts +19 -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 -1
- package/dist/commands/shared/env-builder.js +152 -0
- package/dist/commands/shared/env-builder.js.map +1 -0
- package/dist/commands/shared/feedback.d.ts +24 -0
- package/dist/commands/shared/feedback.d.ts.map +1 -0
- package/dist/commands/shared/feedback.js +38 -0
- package/dist/commands/shared/feedback.js.map +1 -0
- package/dist/commands/slice.d.ts +35 -0
- package/dist/commands/slice.d.ts.map +1 -1
- package/dist/commands/slice.js +363 -0
- package/dist/commands/slice.js.map +1 -0
- package/dist/commands/state.d.ts +8 -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.js +297 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/summary.d.ts +14 -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.js +134 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/update.d.ts +22 -0
- package/dist/commands/update.js +90 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/scripts/night-watch-audit-cron.sh +1 -0
- package/dist/scripts/night-watch-cron.sh +186 -23
- package/dist/scripts/night-watch-helpers.sh +65 -2
- package/dist/scripts/night-watch-merger-cron.sh +137 -36
- package/dist/scripts/night-watch-plan-cron.sh +2 -0
- package/dist/scripts/night-watch-pr-resolver-cron.sh +6 -0
- package/dist/scripts/night-watch-pr-reviewer-cron.sh +22 -5
- package/dist/scripts/night-watch-qa-cron.sh +8 -1
- package/dist/scripts/night-watch-slicer-cron.sh +3 -0
- package/dist/templates/night-watch.config.json +21 -20
- package/dist/templates/slicer.md +3 -0
- package/dist/web/assets/index-C-xpWpS8.css +1 -0
- package/dist/web/assets/index-CEYe-290.js +412 -0
- package/dist/web/assets/index-DpvzoXEv.js +442 -0
- package/dist/web/assets/index-DyME41HV.css +1 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -1
|
@@ -0,0 +1,12 @@
|
|
|
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
|
|
@@ -0,0 +1,47 @@
|
|
|
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 '@night-watch/core';
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prd-state.js","sourceRoot":"","sources":["../../src/commands/prd-state.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAExF,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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRD command group - manage PRD files
|
|
3
|
+
*/
|
|
4
|
+
import { Command } from 'commander';
|
|
5
|
+
export interface IPrdCreateOptions {
|
|
6
|
+
number?: boolean;
|
|
7
|
+
model?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function slugify(name: string): string;
|
|
10
|
+
export declare function getNextPrdNumber(prdDir: string): number;
|
|
11
|
+
export declare function extractPrdMarkdown(response: string): string;
|
|
12
|
+
export declare function extractPrdTitle(markdown: string): string | null;
|
|
13
|
+
export declare function buildPrdPrompt(description: string, projectDir: string, planningPrinciples: string): string;
|
|
14
|
+
export declare function buildNativeClaudeEnv(baseEnv?: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
15
|
+
export declare function resolvePrdCreateDir(): string;
|
|
16
|
+
export declare function buildGithubIssueBody(prdPath: string, projectDir: string, prdContent: string): string;
|
|
17
|
+
export declare function prdCommand(program: Command): void;
|
|
18
|
+
//# sourceMappingURL=prd.d.ts.map
|
|
@@ -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
|