openplanr 1.3.0 → 1.4.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.
Files changed (41) hide show
  1. package/README.md +23 -0
  2. package/dist/ai/prompts/prompt-builder.d.ts +14 -0
  3. package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
  4. package/dist/ai/prompts/prompt-builder.js +32 -1
  5. package/dist/ai/prompts/prompt-builder.js.map +1 -1
  6. package/dist/ai/prompts/system-prompts.d.ts +1 -0
  7. package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
  8. package/dist/ai/prompts/system-prompts.js +110 -0
  9. package/dist/ai/prompts/system-prompts.js.map +1 -1
  10. package/dist/ai/schemas/ai-response-schemas.d.ts +62 -0
  11. package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
  12. package/dist/ai/schemas/ai-response-schemas.js +50 -0
  13. package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
  14. package/dist/cli/commands/spec.d.ts +28 -0
  15. package/dist/cli/commands/spec.d.ts.map +1 -0
  16. package/dist/cli/commands/spec.js +542 -0
  17. package/dist/cli/commands/spec.js.map +1 -0
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/index.js.map +1 -1
  20. package/dist/models/schema.d.ts +1 -0
  21. package/dist/models/schema.d.ts.map +1 -1
  22. package/dist/models/schema.js +1 -0
  23. package/dist/models/schema.js.map +1 -1
  24. package/dist/models/types.d.ts +9 -0
  25. package/dist/models/types.d.ts.map +1 -1
  26. package/dist/services/config-service.d.ts.map +1 -1
  27. package/dist/services/config-service.js +1 -0
  28. package/dist/services/config-service.js.map +1 -1
  29. package/dist/services/spec-service.d.ts +292 -0
  30. package/dist/services/spec-service.d.ts.map +1 -0
  31. package/dist/services/spec-service.js +805 -0
  32. package/dist/services/spec-service.js.map +1 -0
  33. package/dist/templates/spec/spec-shaped.md.hbs +89 -0
  34. package/dist/templates/spec/spec.md.hbs +68 -0
  35. package/dist/templates/spec/story.md.hbs +51 -0
  36. package/dist/templates/spec/task.md.hbs +98 -0
  37. package/dist/utils/constants.d.ts +18 -0
  38. package/dist/utils/constants.d.ts.map +1 -1
  39. package/dist/utils/constants.js +25 -0
  40. package/dist/utils/constants.js.map +1 -1
  41. package/package.json +1 -1
@@ -0,0 +1,542 @@
1
+ /**
2
+ * `planr spec` command group — spec-driven planning mode.
3
+ *
4
+ * The third planning posture alongside agile (epic/feature/story/task) and
5
+ * QT (quick task). Specs decompose into nested User Stories and Tasks with
6
+ * the same artifact contract as the `openplanr-pipeline` Claude Code plugin
7
+ * (file Create/Modify/Preserve lists, Type=UI|Tech, agent assignment, DoD
8
+ * with build/test commands). Pairs with the pipeline plugin via shared
9
+ * schema — no conversion layer ever.
10
+ *
11
+ * See `docs/proposals/spec-driven-mode.md` for the full design.
12
+ *
13
+ * Subcommands:
14
+ * - planr spec init Activate spec-driven mode
15
+ * - planr spec create <title> Create a new SPEC artifact (self-contained dir)
16
+ * - planr spec shape <id> Interactive 4-question SPEC authoring
17
+ * - planr spec decompose <id> AI-driven US + Task generation
18
+ * - planr spec sync [id] Validate integrity + auto-fix safe issues
19
+ * - planr spec list List all specs
20
+ * - planr spec show <id> Print a spec + its US/Task tree
21
+ * - planr spec status [id] Decomposition state per spec
22
+ * - planr spec destroy <id> rm -rf one self-contained spec dir
23
+ * - planr spec attach-design <id> --files <png>... Attach UI mockups
24
+ * - planr spec promote <id> Validate + print pipeline handoff
25
+ */
26
+ import path from 'node:path';
27
+ import { loadConfig, saveConfig } from '../../services/config-service.js';
28
+ import { requireInteractiveForManual } from '../../services/interactive-state.js';
29
+ import { promptConfirm, promptMultiText, promptText } from '../../services/prompt-service.js';
30
+ import { attachSpecDesigns, createSpec, decomposeSpec, destroySpec, getSpecStatus, listSpecStories, listSpecs, listSpecTasks, readSpec, resolveSpecDir, shapeSpec, syncAllSpecs, syncSpec, updateSpecFields, validateSpecForPromotion, } from '../../services/spec-service.js';
31
+ import { display, logger } from '../../utils/logger.js';
32
+ export function registerSpecCommand(program) {
33
+ const spec = program
34
+ .command('spec')
35
+ .description('Spec-driven planning mode — author specs that decompose into agent-executable tasks. Pairs with openplanr-pipeline.');
36
+ // ------------------------------------------------------------------------
37
+ // planr spec init
38
+ // ------------------------------------------------------------------------
39
+ spec
40
+ .command('init')
41
+ .description('Activate spec-driven mode in this project (creates .planr/specs/ root)')
42
+ .action(async () => {
43
+ const projectDir = program.opts().projectDir;
44
+ const config = await loadConfig(projectDir);
45
+ // Ensure spec prefix exists in config (older projects predate this field).
46
+ let configChanged = false;
47
+ if (!config.idPrefix.spec) {
48
+ config.idPrefix.spec = 'SPEC';
49
+ configChanged = true;
50
+ }
51
+ if (configChanged) {
52
+ await saveConfig(projectDir, config);
53
+ }
54
+ // Create .planr/specs/ root.
55
+ const { ensureDir, fileExists, writeFile } = await import('../../utils/fs.js');
56
+ const specsRoot = path.join(projectDir, config.outputPaths.agile, 'specs');
57
+ const existed = await fileExists(specsRoot);
58
+ await ensureDir(specsRoot);
59
+ if (!existed) {
60
+ await writeFile(path.join(specsRoot, '.gitkeep'), '');
61
+ }
62
+ logger.success('Spec-driven mode activated.');
63
+ logger.dim(` ${specsRoot}`);
64
+ if (configChanged) {
65
+ logger.dim(' Added "spec: SPEC" to config.json idPrefix.');
66
+ }
67
+ else if (existed) {
68
+ logger.dim(' (Already initialized — no changes.)');
69
+ }
70
+ logger.dim('');
71
+ display.line('Next steps:');
72
+ display.line(' 1. Author a spec: planr spec create --title "<feature title>"');
73
+ display.line(' 2. Optional: attach: planr spec attach-design <SPEC-id> --files <png>...');
74
+ display.line(' 3. Decompose: planr spec decompose <SPEC-id> (AI-driven US + Tasks)');
75
+ display.line(' 4. Review: planr spec show <SPEC-id>');
76
+ display.line(' 5. Promote: planr spec promote <SPEC-id>');
77
+ display.line(' 6. Ship via plugin: /openplanr-pipeline:plan <slug> (in Claude Code)');
78
+ });
79
+ // ------------------------------------------------------------------------
80
+ // planr spec create
81
+ // ------------------------------------------------------------------------
82
+ spec
83
+ .command('create')
84
+ .description('Create a new spec — a self-contained directory with stories/, tasks/, design/')
85
+ .option('--title <title>', 'spec title (required if not given as positional argument)')
86
+ .option('--slug <slug>', 'explicit kebab-case slug; otherwise derived from title')
87
+ .option('--priority <priority>', 'P0 / P1 / P2 (default: P1)', 'P1')
88
+ .option('--milestone <milestone>', 'milestone label (e.g., v1.0)')
89
+ .option('--po <handle>', 'Product Owner handle (e.g., @AsemDevs)')
90
+ .argument('[title...]', 'spec title (alternative to --title)')
91
+ .action(async (titleParts, opts) => {
92
+ const projectDir = program.opts().projectDir;
93
+ const config = await loadConfig(projectDir);
94
+ const title = opts.title || titleParts.join(' ').trim();
95
+ if (!title) {
96
+ logger.error('Provide a title: planr spec create "Auth flow" OR --title "Auth flow"');
97
+ process.exit(1);
98
+ }
99
+ try {
100
+ const { id, slug, specDir, specFile } = await createSpec(projectDir, config, title, {
101
+ slug: opts.slug,
102
+ priority: opts.priority,
103
+ milestone: opts.milestone,
104
+ po: opts.po,
105
+ });
106
+ logger.success(`Created ${id}: ${title}`);
107
+ logger.dim(` Directory: ${specDir}`);
108
+ logger.dim(` Spec file: ${specFile}`);
109
+ logger.dim('');
110
+ display.line('Next steps:');
111
+ display.line(` - Edit the spec body: ${specFile}`);
112
+ display.line(` - Or use guided authoring: planr spec shape ${id}`);
113
+ display.line(` - Attach UI mockups (optional): planr spec attach-design ${id} --files <png>...`);
114
+ display.line(` - Decompose into US + Tasks: planr spec decompose ${id}`);
115
+ display.line(` - Review the tree: planr spec show ${id}`);
116
+ }
117
+ catch (err) {
118
+ logger.error(err.message);
119
+ process.exit(1);
120
+ }
121
+ });
122
+ // ------------------------------------------------------------------------
123
+ // planr spec shape <id>
124
+ // ------------------------------------------------------------------------
125
+ spec
126
+ .command('shape')
127
+ .description('Interactive 4-question SPEC authoring (Context, Functional Requirements, Business Rules, Acceptance Criteria)')
128
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
129
+ .action(async (specId) => {
130
+ const projectDir = program.opts().projectDir;
131
+ const config = await loadConfig(projectDir);
132
+ // shape is interactive by definition. If the user is in --no-interactive
133
+ // mode, refuse with a helpful message. (Same pattern as `--manual`
134
+ // in `planr quick create` — see requireInteractiveForManual.)
135
+ requireInteractiveForManual(true);
136
+ const spec = await readSpec(projectDir, config, specId);
137
+ if (!spec) {
138
+ logger.error(`Spec ${specId} not found.`);
139
+ process.exit(1);
140
+ }
141
+ logger.heading(`Shape ${spec.id}: ${spec.data.title || spec.slug}`);
142
+ logger.dim('A few short questions. Each answer is a single line.');
143
+ logger.dim('For longer-form prose, edit the spec markdown file directly afterwards.');
144
+ logger.dim('Press Ctrl+C at any time to abort without saving.');
145
+ logger.dim('');
146
+ // ── Question 1 — Context (3 short questions, NOT $EDITOR) ───────────
147
+ // Replaces a single `promptEditor` call (which opened vim/nano and was
148
+ // hostile to use) with three focused single-line prompts. Each is
149
+ // optional — provide what you can, leave blank to skip. We require
150
+ // *some* context but not all three subfields.
151
+ logger.dim('Question 1 of 4 — Context (3 quick questions)');
152
+ const userRole = await promptText(' Who is the primary user? (e.g., "PMs", "founders", "engineering leads")');
153
+ const problem = await promptText(' What problem are they trying to solve today? (one sentence)');
154
+ const outcome = await promptText(' What does success look like? (one sentence)');
155
+ const contextParts = [
156
+ userRole.trim() && `**Primary user:** ${userRole.trim()}`,
157
+ problem.trim() && `**Problem today:** ${problem.trim()}`,
158
+ outcome.trim() && `**Outcome:** ${outcome.trim()}`,
159
+ ].filter(Boolean);
160
+ if (contextParts.length === 0) {
161
+ logger.error('At least one context answer is required. Aborting.');
162
+ process.exit(1);
163
+ }
164
+ const context = contextParts.join('\n\n');
165
+ // ── Question 2 — Functional requirements ────────────────────────────
166
+ logger.dim('');
167
+ logger.dim('Question 2 of 4 — Functional Requirements');
168
+ const functionalRequirements = await promptMultiText('What must the system DO? (comma-separated; one observable behavior per item)', 'e.g., "user can log in", "system validates password complexity", "session expires after 30min"');
169
+ if (functionalRequirements.length === 0) {
170
+ logger.error('At least one functional requirement is required. Aborting.');
171
+ process.exit(1);
172
+ }
173
+ // ── Question 3 — Business rules / constraints (single line, optional) ──
174
+ logger.dim('');
175
+ logger.dim('Question 3 of 4 — Business Rules & Constraints (optional)');
176
+ const businessRules = await promptText(' Key rule or constraint? (one line; leave empty if none — edit spec file later for longer)');
177
+ // ── Question 4 — Acceptance criteria ────────────────────────────────
178
+ logger.dim('');
179
+ logger.dim('Question 4 of 4 — Acceptance Criteria');
180
+ const acceptanceCriteria = await promptMultiText('How will you know this feature is done? (Given/When/Then format recommended; comma-separated)', 'e.g., "Given a logged-out user, when they submit valid creds, then they reach /dashboard"');
181
+ if (acceptanceCriteria.length === 0) {
182
+ logger.error('At least one acceptance criterion is required. Aborting.');
183
+ process.exit(1);
184
+ }
185
+ // ── Optional: out-of-scope items + decomposition notes ──────────────
186
+ logger.dim('');
187
+ const wantExtras = await promptConfirm('Add Out-of-Scope items or Notes for Decomposition? (optional)', false);
188
+ let outOfScope = [];
189
+ let decompositionNotes = '';
190
+ if (wantExtras) {
191
+ outOfScope = await promptMultiText('Out of Scope (comma-separated; what this feature does NOT include)', 'e.g., "email notifications (covered in feat-notifications)"');
192
+ decompositionNotes = await promptText(' Decomposition note (one line; hint for `planr spec decompose` — leave empty if none)');
193
+ }
194
+ // ── Confirm + write ─────────────────────────────────────────────────
195
+ logger.dim('');
196
+ const ok = await promptConfirm(`Update ${spec.id} body with these answers?`, true);
197
+ if (!ok) {
198
+ logger.info('Cancelled.');
199
+ return;
200
+ }
201
+ const answers = {
202
+ context,
203
+ functionalRequirements,
204
+ businessRules,
205
+ outOfScope,
206
+ acceptanceCriteria,
207
+ decompositionNotes,
208
+ };
209
+ try {
210
+ const { specFile } = await shapeSpec(projectDir, config, specId, answers);
211
+ logger.success(`Shaped ${spec.id}.`);
212
+ logger.dim(` ${specFile}`);
213
+ logger.dim(` Status: pending → shaping`);
214
+ logger.dim('');
215
+ display.line('Next steps:');
216
+ display.line(` - Review the spec: planr spec show ${spec.id}`);
217
+ display.line(` - Decompose into US + Tasks: planr spec decompose ${spec.id} (AI-driven)`);
218
+ }
219
+ catch (err) {
220
+ logger.error(err.message);
221
+ process.exit(1);
222
+ }
223
+ });
224
+ // ------------------------------------------------------------------------
225
+ // planr spec decompose <id>
226
+ // ------------------------------------------------------------------------
227
+ spec
228
+ .command('decompose')
229
+ .description('AI-driven decomposition of a SPEC into User Stories + Tasks (matches openplanr-pipeline schema)')
230
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
231
+ .option('--force', 'overwrite existing US/Task files (use after `planr spec destroy` failed)')
232
+ .option('--no-code-context', 'skip the codebase scanner (faster; tasks reference generic paths)')
233
+ .option('--max-stories <n>', 'cap the number of stories the AI emits (1-8)', (v) => Number.parseInt(v, 10))
234
+ .action(async (specId, opts) => {
235
+ const projectDir = program.opts().projectDir;
236
+ const config = await loadConfig(projectDir);
237
+ const spec = await readSpec(projectDir, config, specId);
238
+ if (!spec) {
239
+ logger.error(`Spec ${specId} not found.`);
240
+ process.exit(1);
241
+ }
242
+ const { isAIConfigured } = await import('../../services/ai-service.js');
243
+ if (!isAIConfigured(config)) {
244
+ logger.error('AI is not configured. Set ANTHROPIC_API_KEY (or another provider key) and `planr config set-provider`.');
245
+ process.exit(1);
246
+ }
247
+ logger.heading(`Decompose ${spec.id}: ${spec.data.title || spec.slug}`);
248
+ logger.dim(opts.codeContext === false
249
+ ? ' (--no-code-context: skipping codebase scan)'
250
+ : ' Analyzing spec + codebase...');
251
+ try {
252
+ const result = await decomposeSpec(projectDir, config, specId, {
253
+ force: opts.force ?? false,
254
+ // commander stores boolean negation as `codeContext` (default true; --no-code-context → false)
255
+ noCodeContext: opts.codeContext === false,
256
+ maxStories: opts.maxStories,
257
+ });
258
+ logger.success(`Decomposed ${spec.id}: ${result.storiesCreated} stor${result.storiesCreated === 1 ? 'y' : 'ies'}, ${result.tasksCreated} tasks.`);
259
+ if (result.decompositionNotes) {
260
+ logger.dim('');
261
+ logger.dim(`AI notes: ${result.decompositionNotes}`);
262
+ }
263
+ logger.dim('');
264
+ display.line('Next steps:');
265
+ display.line(` - Review the tree: planr spec show ${spec.id}`);
266
+ display.line(` - Validate + handoff: planr spec promote ${spec.id}`);
267
+ }
268
+ catch (err) {
269
+ // Try to surface AI errors with friendly messaging if applicable
270
+ try {
271
+ const { handleAIError } = await import('../helpers/task-creation.js');
272
+ await handleAIError(err);
273
+ }
274
+ catch {
275
+ logger.error(err.message);
276
+ }
277
+ process.exit(1);
278
+ }
279
+ });
280
+ // ------------------------------------------------------------------------
281
+ // planr spec list
282
+ // ------------------------------------------------------------------------
283
+ spec
284
+ .command('list')
285
+ .description('List all specs in the project')
286
+ .action(async () => {
287
+ const projectDir = program.opts().projectDir;
288
+ const config = await loadConfig(projectDir);
289
+ const specs = await listSpecs(projectDir, config);
290
+ if (specs.length === 0) {
291
+ logger.info('No specs found. Run `planr spec create "<title>"` to create one.');
292
+ return;
293
+ }
294
+ logger.heading('Specs');
295
+ for (const s of specs) {
296
+ const counts = `${s.storyCount} US, ${s.taskCount} tasks`;
297
+ display.line(` ${s.id} [${s.status.padEnd(18)}] ${s.title} (${counts})`);
298
+ }
299
+ });
300
+ // ------------------------------------------------------------------------
301
+ // planr spec show <id>
302
+ // ------------------------------------------------------------------------
303
+ spec
304
+ .command('show')
305
+ .description('Print a spec + its decomposition tree (stories, tasks)')
306
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
307
+ .action(async (specId) => {
308
+ const projectDir = program.opts().projectDir;
309
+ const config = await loadConfig(projectDir);
310
+ const spec = await readSpec(projectDir, config, specId);
311
+ if (!spec) {
312
+ logger.error(`Spec ${specId} not found.`);
313
+ process.exit(1);
314
+ }
315
+ logger.heading(`${spec.id}: ${spec.data.title || spec.slug}`);
316
+ display.line(` Status: ${spec.data.status || 'pending'}`);
317
+ display.line(` Priority: ${spec.data.priority || '(unset)'}`);
318
+ display.line(` Milestone: ${spec.data.milestone || '(unset)'}`);
319
+ display.line(` PO: ${spec.data.po || '(unset)'}`);
320
+ display.line(` Created: ${spec.data.created || '(unset)'}`);
321
+ display.line(` Updated: ${spec.data.updated || '(unset)'}`);
322
+ display.line(` Spec file: ${spec.specFile}`);
323
+ display.line('');
324
+ const stories = await listSpecStories(spec.specDir);
325
+ const tasks = await listSpecTasks(spec.specDir);
326
+ if (stories.length === 0) {
327
+ display.line(' Stories: (none — run `planr spec decompose` to generate)');
328
+ }
329
+ else {
330
+ display.line(` Stories (${stories.length}):`);
331
+ for (const s of stories) {
332
+ const taskCount = tasks.filter((t) => t.storyId === s.id).length;
333
+ display.line(` ${s.id} [${s.status.padEnd(13)}] ${s.title} (${taskCount} tasks)`);
334
+ }
335
+ }
336
+ display.line('');
337
+ if (tasks.length === 0) {
338
+ display.line(' Tasks: (none)');
339
+ }
340
+ else {
341
+ display.line(` Tasks (${tasks.length}):`);
342
+ for (const t of tasks) {
343
+ display.line(` ${t.id} [${t.status.padEnd(13)}] ${t.type.padEnd(4)} ${t.agent.padEnd(20)} ${t.title}`);
344
+ }
345
+ }
346
+ display.line('');
347
+ display.line(` Pipeline handoff: /openplanr-pipeline:plan ${spec.slug}`);
348
+ });
349
+ // ------------------------------------------------------------------------
350
+ // planr spec status [id]
351
+ // ------------------------------------------------------------------------
352
+ spec
353
+ .command('status')
354
+ .description('Decomposition state across all specs (or one spec if --spec specified)')
355
+ .argument('[specId]', 'optional spec ID to scope output')
356
+ .action(async (specId) => {
357
+ const projectDir = program.opts().projectDir;
358
+ const config = await loadConfig(projectDir);
359
+ if (specId) {
360
+ const spec = await readSpec(projectDir, config, specId);
361
+ if (!spec) {
362
+ logger.error(`Spec ${specId} not found.`);
363
+ process.exit(1);
364
+ }
365
+ const stories = await listSpecStories(spec.specDir);
366
+ const tasks = await listSpecTasks(spec.specDir);
367
+ logger.heading(`${spec.id}: ${spec.data.title || spec.slug}`);
368
+ display.line(` Status: ${spec.data.status || 'pending'}`);
369
+ display.line(` Stories: ${stories.length}`);
370
+ display.line(` Tasks: ${tasks.length}`);
371
+ return;
372
+ }
373
+ const report = await getSpecStatus(projectDir, config);
374
+ if (report.specCount === 0) {
375
+ logger.info('No specs found. Run `planr spec init` then `planr spec create "<title>"`.');
376
+ return;
377
+ }
378
+ logger.heading('Spec-driven mode status');
379
+ display.line(` Total specs: ${report.specCount}`);
380
+ display.line(` Total stories: ${report.totalStories}`);
381
+ display.line(` Total tasks: ${report.totalTasks}`);
382
+ display.line('');
383
+ for (const s of report.specs) {
384
+ display.line(` ${s.id} [${s.status.padEnd(18)}] ${s.title} (${s.storyCount} US, ${s.taskCount} tasks)`);
385
+ }
386
+ });
387
+ // ------------------------------------------------------------------------
388
+ // planr spec destroy <id>
389
+ // ------------------------------------------------------------------------
390
+ spec
391
+ .command('destroy')
392
+ .description('Remove a spec entirely (rm -rf of its self-contained directory)')
393
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
394
+ .action(async (specId) => {
395
+ const projectDir = program.opts().projectDir;
396
+ const config = await loadConfig(projectDir);
397
+ const resolved = await resolveSpecDir(projectDir, config, specId);
398
+ if (!resolved) {
399
+ logger.error(`Spec ${specId} not found.`);
400
+ process.exit(1);
401
+ }
402
+ const ok = await promptConfirm(`Delete ${specId} and ALL its stories, tasks, and design assets?`, false);
403
+ if (!ok) {
404
+ logger.info('Cancelled.');
405
+ return;
406
+ }
407
+ await destroySpec(projectDir, config, specId);
408
+ logger.success(`Destroyed ${specId}.`);
409
+ logger.dim(` Removed: ${resolved.dir}`);
410
+ });
411
+ // ------------------------------------------------------------------------
412
+ // planr spec attach-design <id> --files ...
413
+ // ------------------------------------------------------------------------
414
+ spec
415
+ .command('attach-design')
416
+ .description("Copy PNG mockups into a spec's design/ directory and update ui_files frontmatter")
417
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
418
+ .option('--files <paths...>', 'one or more PNG files to attach')
419
+ .action(async (specId, opts) => {
420
+ const projectDir = program.opts().projectDir;
421
+ const config = await loadConfig(projectDir);
422
+ const files = opts.files;
423
+ if (!files || files.length === 0) {
424
+ logger.error('Provide --files <path>... with one or more PNG paths.');
425
+ process.exit(1);
426
+ }
427
+ try {
428
+ const { copied, designDir } = await attachSpecDesigns(projectDir, config, specId, files);
429
+ if (copied.length === 0) {
430
+ logger.warn('No PNG files were copied. Check the paths exist and end in .png.');
431
+ return;
432
+ }
433
+ logger.success(`Attached ${copied.length} design asset(s) to ${specId}.`);
434
+ for (const f of copied) {
435
+ logger.dim(` design/${f}`);
436
+ }
437
+ logger.dim('');
438
+ logger.dim(`Design directory: ${designDir}`);
439
+ logger.dim(`When you run /openplanr-pipeline:plan, the designer-agent will analyze these PNGs into design/design-spec.md.`);
440
+ }
441
+ catch (err) {
442
+ logger.error(err.message);
443
+ process.exit(1);
444
+ }
445
+ });
446
+ // ------------------------------------------------------------------------
447
+ // planr spec promote <id>
448
+ // ------------------------------------------------------------------------
449
+ spec
450
+ .command('promote')
451
+ .description('Validate that a spec is ready and print the pipeline handoff command')
452
+ .argument('<specId>', 'spec ID (e.g., SPEC-001)')
453
+ .action(async (specId) => {
454
+ const projectDir = program.opts().projectDir;
455
+ const config = await loadConfig(projectDir);
456
+ const validation = await validateSpecForPromotion(projectDir, config, specId);
457
+ if (!validation.ready) {
458
+ logger.error(`Spec ${specId} is not ready for the pipeline:`);
459
+ for (const issue of validation.issues) {
460
+ logger.error(` • ${issue}`);
461
+ }
462
+ process.exit(1);
463
+ }
464
+ const spec = await readSpec(projectDir, config, specId);
465
+ if (!spec)
466
+ return; // unreachable if validation passed
467
+ await updateSpecFields(projectDir, config, specId, { status: 'ready-for-pipeline' });
468
+ logger.success(`${specId} is ready for openplanr-pipeline.`);
469
+ logger.dim('');
470
+ display.line('Next: in Claude Code, run:');
471
+ display.line(` /openplanr-pipeline:plan ${spec.slug}`);
472
+ display.line('');
473
+ display.line('After human review of the decomposition:');
474
+ display.line(` /openplanr-pipeline:ship ${spec.slug}`);
475
+ display.line('');
476
+ logger.dim(`(The pipeline plugin reads .planr/specs/${spec.id}-${spec.slug}/ directly when spec mode is active.)`);
477
+ });
478
+ // ------------------------------------------------------------------------
479
+ // planr spec sync [specId]
480
+ // ------------------------------------------------------------------------
481
+ spec
482
+ .command('sync')
483
+ .description('Validate spec integrity (orphaned tasks, stories without tasks, missing specId frontmatter, schema drift)')
484
+ .argument('[specId]', 'optional spec ID to scope; otherwise scans all specs')
485
+ .option('--dry-run', 'report findings without writing any fixes', false)
486
+ .action(async (specId, opts) => {
487
+ const projectDir = program.opts().projectDir;
488
+ const config = await loadConfig(projectDir);
489
+ try {
490
+ if (specId) {
491
+ const report = await syncSpec(projectDir, config, specId, { dryRun: opts.dryRun });
492
+ logger.heading(`${report.specId}: ${report.specSlug}`);
493
+ if (report.fixed.length === 0 && report.warnings.length === 0) {
494
+ logger.success('Clean. No issues found.');
495
+ return;
496
+ }
497
+ if (report.fixed.length > 0) {
498
+ logger.success(`${opts.dryRun ? 'Would fix' : 'Fixed'} ${report.fixed.length} issue${report.fixed.length === 1 ? '' : 's'}:`);
499
+ for (const f of report.fixed) {
500
+ display.line(` ✓ ${f}`);
501
+ }
502
+ }
503
+ if (report.warnings.length > 0) {
504
+ logger.warn(`${report.warnings.length} warning${report.warnings.length === 1 ? '' : 's'} (require human review):`);
505
+ for (const w of report.warnings) {
506
+ display.line(` ⚠ ${w}`);
507
+ }
508
+ }
509
+ return;
510
+ }
511
+ // No specId — scan all
512
+ const { specsScanned, reports } = await syncAllSpecs(projectDir, config, {
513
+ dryRun: opts.dryRun,
514
+ });
515
+ if (specsScanned === 0) {
516
+ logger.info('No specs found.');
517
+ return;
518
+ }
519
+ const totalFixed = reports.reduce((acc, r) => acc + r.fixed.length, 0);
520
+ const totalWarnings = reports.reduce((acc, r) => acc + r.warnings.length, 0);
521
+ logger.heading(`Sync — ${specsScanned} spec${specsScanned === 1 ? '' : 's'} scanned`);
522
+ for (const r of reports) {
523
+ if (r.fixed.length === 0 && r.warnings.length === 0) {
524
+ display.line(` ✓ ${r.specId} (${r.specSlug}) — clean`);
525
+ continue;
526
+ }
527
+ display.line(` ${r.specId} (${r.specSlug}):`);
528
+ for (const f of r.fixed)
529
+ display.line(` ✓ ${f}`);
530
+ for (const w of r.warnings)
531
+ display.line(` ⚠ ${w}`);
532
+ }
533
+ logger.dim('');
534
+ logger.dim(`Summary: ${opts.dryRun ? 'would fix' : 'fixed'} ${totalFixed}, warnings ${totalWarnings}.`);
535
+ }
536
+ catch (err) {
537
+ logger.error(err.message);
538
+ process.exit(1);
539
+ }
540
+ });
541
+ }
542
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../../src/cli/commands/spec.ts"],"names":[],"mappings":"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"}
package/dist/cli/index.js CHANGED
@@ -24,6 +24,7 @@ import { registerReportLinterCommand } from './commands/report-linter.js';
24
24
  import { registerReviseCommand } from './commands/revise.js';
25
25
  import { registerRulesCommand } from './commands/rules.js';
26
26
  import { registerSearchCommand } from './commands/search.js';
27
+ import { registerSpecCommand } from './commands/spec.js';
27
28
  import { registerSprintCommand } from './commands/sprint.js';
28
29
  import { registerStatusCommand } from './commands/status.js';
29
30
  import { registerStoryCommand } from './commands/story.js';
@@ -71,6 +72,7 @@ registerFeatureCommand(program);
71
72
  registerStoryCommand(program);
72
73
  registerTaskCommand(program);
73
74
  registerQuickCommand(program);
75
+ registerSpecCommand(program);
74
76
  registerChecklistCommand(program);
75
77
  registerRulesCommand(program);
76
78
  registerStatusCommand(program);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -103,6 +103,7 @@ export declare const configSchema: z.ZodObject<{
103
103
  quick: z.ZodDefault<z.ZodString>;
104
104
  backlog: z.ZodDefault<z.ZodString>;
105
105
  sprint: z.ZodDefault<z.ZodString>;
106
+ spec: z.ZodDefault<z.ZodString>;
106
107
  }, z.core.$strip>;
107
108
  ai: z.ZodOptional<z.ZodObject<{
108
109
  provider: z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/models/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;EAAwC,CAAC;AACrE,eAAO,MAAM,gBAAgB;;;;EAA4C,CAAC;AAC1E,eAAO,MAAM,iBAAiB;;;;EAAwC,CAAC;AAEvE,eAAO,MAAM,cAAc;;;;;;;;iBAIzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;iBAKvC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;iBAGnC,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;iBAKzC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AASH,6GAA6G;AAC7G,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;iBA4C7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA2BvB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/models/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;EAAwC,CAAC;AACrE,eAAO,MAAM,gBAAgB;;;;EAA4C,CAAC;AAC1E,eAAO,MAAM,iBAAiB;;;;EAAwC,CAAC;AAEvE,eAAO,MAAM,cAAc;;;;;;;;iBAIzB,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;iBAIhC,CAAC;AAEH,eAAO,MAAM,4BAA4B;;;;;iBAKvC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;;;;iBAGnC,CAAC;AAEH,eAAO,MAAM,8BAA8B;;;;;iBAKzC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;iBAMnC,CAAC;AASH,6GAA6G;AAC7G,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;iBA4C7B,CAAC;AAEH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4BvB,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC"}
@@ -100,6 +100,7 @@ export const configSchema = z.object({
100
100
  quick: z.string().default('QT'),
101
101
  backlog: z.string().default('BL'),
102
102
  sprint: z.string().default('SPRINT'),
103
+ spec: z.string().default('SPEC'),
103
104
  }),
104
105
  ai: aiConfigSchema.optional(),
105
106
  defaultAgent: codingAgentSchema.optional(),