@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.
@@ -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 * as readline from 'readline';
7
- import { CLAIM_FILE_EXTENSION, createTable, dim, header, info, loadConfig, renderPrdTemplate, success, error as uiError, } from '@night-watch/core';
8
- /**
9
- * Slugify a name into a filename-safe string
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
- * Prompt the user for a value using readline
32
- */
33
- function prompt(rl, question) {
34
- return new Promise((resolve) => {
35
- rl.question(question, (answer) => {
36
- resolve(answer.trim());
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
- * Parse dependency references from PRD markdown content
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 from template')
80
- .argument('<name>', 'PRD name (used for title and filename)')
81
- .option('-i, --interactive', 'Prompt for complexity, dependencies, and phase count', false)
82
- .option('-t, --template <path>', 'Path to a custom template file')
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
- // Load config to get prdDir
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
- // Prepare template variables with defaults
96
- let complexityScore = 5;
97
- let dependsOn = [];
98
- let phaseCount = parseInt(options.phases ?? '3', 10);
99
- if (isNaN(phaseCount) || phaseCount < 1) {
100
- phaseCount = 3;
101
- }
102
- // Parse --deps flag
103
- if (options.deps) {
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
- // Load custom template if provided
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
- info(`Title: ${name}`);
199
- dim(`Phases: ${phaseCount}`);
200
- if (dependsOn.length > 0) {
201
- dim(`Dependencies: ${dependsOn.join(', ')}`);
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
- head: ['Name', 'Status', 'Dependencies'],
253
- });
254
- for (const prd of pending) {
255
- const status = prd.claimed ? 'claimed' : 'pending';
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([prd.name, statusDisplay, prd.dependencies.join(', ') || '-']);
352
+ table.push([prdEntry.name, statusDisplay, prdEntry.dependencies.join(', ') || '-']);
260
353
  }
261
- for (const prd of done) {
262
- table.push([prd.name, 'done', prd.dependencies.join(', ') || '-']);
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;
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,WAAW,EACX,GAAG,EACH,MAAM,EACN,IAAI,EACJ,UAAU,EACV,OAAO,EACP,KAAK,IAAI,OAAO,GACjB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,SAAS,gBAAgB,CAAC,QAAgB;IACxC,IAAI,OAAO,GAAG,QAAQ,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACrE,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,aAAa,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;AAOlD,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACjC,OAAO,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClD,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,WAAmB,EACnB,UAAkB,EAClB,kBAA0B;IAE1B,OAAO;;;;;;;;;;;;qBAYY,UAAU;;;EAG7B,kBAAkB;;;EAGlB,WAAW;;0CAE6B,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,UAA6B,OAAO,CAAC,GAAG;IAC3E,MAAM,GAAG,GAAsB,EAAE,GAAG,OAAO,EAAE,CAAC;IAE9C,OAAO,GAAG,CAAC,kBAAkB,CAAC;IAC9B,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC7B,OAAO,GAAG,CAAC,oBAAoB,CAAC;IAChC,OAAO,GAAG,CAAC,8BAA8B,CAAC;IAC1C,OAAO,GAAG,CAAC,4BAA4B,CAAC;IACxC,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1B,OAAO,GAAG,CAAC,oBAAoB,CAAC;IAChC,OAAO,GAAG,CAAC,uBAAuB,CAAC;IACnC,OAAO,GAAG,CAAC,kBAAkB,CAAC;IAC9B,OAAO,GAAG,CAAC,0BAA0B,CAAC;IACtC,OAAO,GAAG,CAAC,4BAA4B,CAAC;IACxC,OAAO,GAAG,CAAC,eAAe,CAAC;IAC3B,OAAO,GAAG,CAAC,sBAAsB,CAAC;IAClC,OAAO,GAAG,CAAC,uBAAuB,CAAC;IACnC,OAAO,GAAG,CAAC,wBAAwB,CAAC;IACpC,OAAO,GAAG,CAAC,wBAAwB,CAAC;IACpC,OAAO,GAAG,CAAC,sBAAsB,CAAC;IAClC,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAC7B,OAAO,GAAG,CAAC,iBAAiB,CAAC;IAE7B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,UAAkB,EAAE,OAAe;IAC/D,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,QAAQ,CAAC,2BAA2B,EAAE;YACtD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,MAAM,GAAG,QAAQ,CAAC,iCAAiC,EAAE;YACzD,GAAG,EAAE,UAAU;YACf,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,MAAM,SAAS,GAAG,SAAS;aACxB,OAAO,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;aACnD,OAAO,CAAC,4BAA4B,EAAE,qBAAqB,CAAC;aAC5D,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAEzB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,qBAAqB,CAAC,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,OAAO,GAAG,SAAS,SAAS,kBAAkB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,OAAO;aAChF,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;aACf,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;aAC7C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAE,UAAkB,EAAE,UAAkB;IAC1F,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,gBAAgB,OAAO,OAAO,OAAO,GAAG,CAAC,CAAC,CAAC,eAAe,OAAO,IAAI,CAAC;IACjG,OAAO,GAAG,QAAQ,OAAO,UAAU,kDAAkD,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,WAAmB,EACnB,UAAkB,EAClB,KAAc;IAEd,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,gBAAgB,CAAC,CAAC;IACvE,MAAM,qBAAqB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC;QACvD,CAAC,CAAC,qBAAqB;QACvB,CAAC,CAAC,mBAAmB,CAAC;IAExB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,kBAAkB,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAClE,MAAM,MAAM,GAAG,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC;IAC3E,MAAM,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAAC,IAAI,CAAC;IAC/C,MAAM,GAAG,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9C,OAAO,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,KAAK,CACjB,QAAQ,EACR;YACE,IAAI;YACJ,WAAW;YACX,iBAAiB;YACjB,aAAa;YACb,4BAA4B;YAC5B,SAAS;YACT,OAAO;YACP,MAAM;SACP,EACD,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAC3C,CAAC;QAEF,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,WAAW,GAAG,EAAE,CAAC;QAErB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAExC,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,IAAI,EAAE,CAAC;gBACxD,YAAY,GAAG,YAAY,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;gBAEpD,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;oBAE5D,IAAI,OAAO,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;wBACpC,MAAM,KAAK,GAAG,OAAO,CAAC,KAA4C,CAAC;wBACnE,MAAM,KAAK,GAAG,KAAK,EAAE,KAA4C,CAAC;wBAClE,IAAI,KAAK,EAAE,IAAI,KAAK,YAAY,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;4BACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACnC,CAAC;wBACD,SAAS;oBACX,CAAC;oBAED,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACpE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kCAAkC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACxE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAA4B,CAAC;oBAC3E,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;wBACpE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,gCAAgC;gBAClC,CAAC;YACH,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,IAAI,KAAK,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,KAAK,CAAC,IAAc,EAAE,GAAW;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa,EAAE,OAAe,EAAE,UAAkB,EAAE,UAAkB;IAC/F,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QACnE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,KAAK,EAAE,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC;QACzF,OAAO,CACL,KAAK,CAAC,CAAC,GAAG,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,UAAU,CAAC;YAClD,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAC5B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAe;IACxC,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACvF,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,KAAK,CAAC,CAAC,CAAC;SACZ,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;SACtC,MAAM,CAAC,OAAO,CAAC,CAAC;AACrB,CAAC;AAED,SAAS,aAAa,CACpB,SAAiB,EACjB,UAAkB;IAElB,IAAI,CAAC;QACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2D,CAAC;QAC5F,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;QAC5D,IAAI,GAAG,GAAG,UAAU,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC;QACpE,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC;IAEnE,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;SACrC,MAAM,CAAC,UAAU,EAAE,2CAA2C,EAAE,KAAK,CAAC;SACtE,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;SACxF,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA0B,EAAE,EAAE;QACzD,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,CAAC;QAED,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK;YACjC,CAAC,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,KAAsC,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;YACrF,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,UAAU,GAAG,aAAa,IAAI,gBAAgB,CAAC,IAAI,CAAC;QAC1D,GAAG,CAAC,mBAAmB,UAAU,uEAAuE,CAAC,CAAC;QAC1G,MAAM,SAAS,GAAG,MAAM,qBAAqB,CAAC,IAAI,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;QAE/E,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,CAAC,qEAAqE,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM;YAC7B,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,KAAK;YACnE,CAAC,CAAC,GAAG,IAAI,KAAK,CAAC;QACjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAE7C,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;YAC5C,GAAG,CAAC,mDAAmD,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAE/C,MAAM,CAAC,aAAa,CAAC,CAAC;QACtB,OAAO,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC;QAEhC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QAC9E,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC;QAC7B,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,2EAA2E,CAAC,CAAC;QACnF,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;SAClC,MAAM,CAAC,KAAK,EAAE,OAA0B,EAAE,EAAE;QAC3C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QACtC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAElD,MAAM,OAAO,GAKR,EAAE,CAAC;QAER,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC1E,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,GAAG,oBAAoB,CAAC,CAAC;gBACzE,MAAM,WAAW,GAAG,aAAa,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;gBAChE,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,IAAI;oBACV,YAAY,EAAE,IAAI;oBAClB,OAAO,EAAE,WAAW,CAAC,MAAM;oBAC3B,SAAS,EAAE,WAAW,CAAC,MAAM;wBAC3B,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,QAAS,EAAE,GAAG,EAAE,WAAW,CAAC,GAAI,EAAE;wBAC5D,CAAC,CAAC,SAAS;iBACd,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAoD,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACvE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBACxC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;QAED,MAAM,CAAC,YAAY,CAAC,CAAC;QAErB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACxB,OAAO;QACT,CAAC;QAED,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC;QACxE,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YACxD,MAAM,aAAa,GACjB,QAAQ,CAAC,OAAO,IAAI,QAAQ,CAAC,SAAS;gBACpC,CAAC,CAAC,YAAY,QAAQ,CAAC,SAAS,CAAC,QAAQ,IAAI,QAAQ,CAAC,SAAS,CAAC,GAAG,GAAG;gBACtE,CAAC,CAAC,MAAM,CAAC;YACb,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,IAAI,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;QAC7D,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,GAAG,YAAY,CAAC;QACnD,IAAI,CAAC,GAAG,YAAY,aAAa,YAAY,aAAa,IAAI,CAAC,MAAM,OAAO,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -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
- \`npm run verify\` passes locally. Ready for re-review.
190
+ Verification passes locally. Ready for re-review.
191
191
 
192
192
  Night Watch PR Reviewer"
193
193
  ```