openplanr 1.3.0 → 1.4.0
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/README.md +23 -0
- package/dist/ai/prompts/prompt-builder.d.ts +14 -0
- package/dist/ai/prompts/prompt-builder.d.ts.map +1 -1
- package/dist/ai/prompts/prompt-builder.js +32 -1
- package/dist/ai/prompts/prompt-builder.js.map +1 -1
- package/dist/ai/prompts/system-prompts.d.ts +1 -0
- package/dist/ai/prompts/system-prompts.d.ts.map +1 -1
- package/dist/ai/prompts/system-prompts.js +110 -0
- package/dist/ai/prompts/system-prompts.js.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.d.ts +62 -0
- package/dist/ai/schemas/ai-response-schemas.d.ts.map +1 -1
- package/dist/ai/schemas/ai-response-schemas.js +50 -0
- package/dist/ai/schemas/ai-response-schemas.js.map +1 -1
- package/dist/cli/commands/spec.d.ts +28 -0
- package/dist/cli/commands/spec.d.ts.map +1 -0
- package/dist/cli/commands/spec.js +529 -0
- package/dist/cli/commands/spec.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/models/schema.d.ts +1 -0
- package/dist/models/schema.d.ts.map +1 -1
- package/dist/models/schema.js +1 -0
- package/dist/models/schema.js.map +1 -1
- package/dist/models/types.d.ts +9 -0
- package/dist/models/types.d.ts.map +1 -1
- package/dist/services/config-service.d.ts.map +1 -1
- package/dist/services/config-service.js +1 -0
- package/dist/services/config-service.js.map +1 -1
- package/dist/services/spec-service.d.ts +292 -0
- package/dist/services/spec-service.d.ts.map +1 -0
- package/dist/services/spec-service.js +805 -0
- package/dist/services/spec-service.js.map +1 -0
- package/dist/templates/spec/spec-shaped.md.hbs +89 -0
- package/dist/templates/spec/spec.md.hbs +68 -0
- package/dist/templates/spec/story.md.hbs +51 -0
- package/dist/templates/spec/task.md.hbs +98 -0
- package/dist/utils/constants.d.ts +18 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +25 -0
- package/dist/utils/constants.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,529 @@
|
|
|
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, promptEditor, promptMultiText, } 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('4 questions. Answers populate the spec body.');
|
|
143
|
+
logger.dim('Press Ctrl+C at any time to abort without saving.');
|
|
144
|
+
logger.dim('');
|
|
145
|
+
// ── Question 1 — Context ────────────────────────────────────────────
|
|
146
|
+
logger.dim('Question 1 of 4 — Context');
|
|
147
|
+
const context = await promptEditor('What problem does this feature solve? Who is the primary user? (opens your $EDITOR)', '');
|
|
148
|
+
if (!context.trim()) {
|
|
149
|
+
logger.error('Context cannot be empty. Aborting.');
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
// ── Question 2 — Functional requirements ────────────────────────────
|
|
153
|
+
logger.dim('');
|
|
154
|
+
logger.dim('Question 2 of 4 — Functional Requirements');
|
|
155
|
+
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"');
|
|
156
|
+
if (functionalRequirements.length === 0) {
|
|
157
|
+
logger.error('At least one functional requirement is required. Aborting.');
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
// ── Question 3 — Business rules / constraints ───────────────────────
|
|
161
|
+
logger.dim('');
|
|
162
|
+
logger.dim('Question 3 of 4 — Business Rules & Constraints (optional)');
|
|
163
|
+
const businessRules = await promptEditor('Any rules, limits, or constraints? (permissions, validations, dependencies — leave empty if none)', '');
|
|
164
|
+
// ── Question 4 — Acceptance criteria ────────────────────────────────
|
|
165
|
+
logger.dim('');
|
|
166
|
+
logger.dim('Question 4 of 4 — Acceptance Criteria');
|
|
167
|
+
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"');
|
|
168
|
+
if (acceptanceCriteria.length === 0) {
|
|
169
|
+
logger.error('At least one acceptance criterion is required. Aborting.');
|
|
170
|
+
process.exit(1);
|
|
171
|
+
}
|
|
172
|
+
// ── Optional: out-of-scope items + decomposition notes ──────────────
|
|
173
|
+
logger.dim('');
|
|
174
|
+
const wantExtras = await promptConfirm('Add Out-of-Scope items or Notes for Decomposition? (optional)', false);
|
|
175
|
+
let outOfScope = [];
|
|
176
|
+
let decompositionNotes = '';
|
|
177
|
+
if (wantExtras) {
|
|
178
|
+
outOfScope = await promptMultiText('Out of Scope (comma-separated; what this feature does NOT include)', 'e.g., "email notifications (covered in feat-notifications)"');
|
|
179
|
+
decompositionNotes = await promptEditor('Notes for `planr spec decompose` (hints to guide the AI; not business requirements)', '');
|
|
180
|
+
}
|
|
181
|
+
// ── Confirm + write ─────────────────────────────────────────────────
|
|
182
|
+
logger.dim('');
|
|
183
|
+
const ok = await promptConfirm(`Update ${spec.id} body with these answers?`, true);
|
|
184
|
+
if (!ok) {
|
|
185
|
+
logger.info('Cancelled.');
|
|
186
|
+
return;
|
|
187
|
+
}
|
|
188
|
+
const answers = {
|
|
189
|
+
context,
|
|
190
|
+
functionalRequirements,
|
|
191
|
+
businessRules,
|
|
192
|
+
outOfScope,
|
|
193
|
+
acceptanceCriteria,
|
|
194
|
+
decompositionNotes,
|
|
195
|
+
};
|
|
196
|
+
try {
|
|
197
|
+
const { specFile } = await shapeSpec(projectDir, config, specId, answers);
|
|
198
|
+
logger.success(`Shaped ${spec.id}.`);
|
|
199
|
+
logger.dim(` ${specFile}`);
|
|
200
|
+
logger.dim(` Status: pending → shaping`);
|
|
201
|
+
logger.dim('');
|
|
202
|
+
display.line('Next steps:');
|
|
203
|
+
display.line(` - Review the spec: planr spec show ${spec.id}`);
|
|
204
|
+
display.line(` - Decompose into US + Tasks: planr spec decompose ${spec.id} (AI-driven)`);
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
logger.error(err.message);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
// ------------------------------------------------------------------------
|
|
212
|
+
// planr spec decompose <id>
|
|
213
|
+
// ------------------------------------------------------------------------
|
|
214
|
+
spec
|
|
215
|
+
.command('decompose')
|
|
216
|
+
.description('AI-driven decomposition of a SPEC into User Stories + Tasks (matches openplanr-pipeline schema)')
|
|
217
|
+
.argument('<specId>', 'spec ID (e.g., SPEC-001)')
|
|
218
|
+
.option('--force', 'overwrite existing US/Task files (use after `planr spec destroy` failed)')
|
|
219
|
+
.option('--no-code-context', 'skip the codebase scanner (faster; tasks reference generic paths)')
|
|
220
|
+
.option('--max-stories <n>', 'cap the number of stories the AI emits (1-8)', (v) => Number.parseInt(v, 10))
|
|
221
|
+
.action(async (specId, opts) => {
|
|
222
|
+
const projectDir = program.opts().projectDir;
|
|
223
|
+
const config = await loadConfig(projectDir);
|
|
224
|
+
const spec = await readSpec(projectDir, config, specId);
|
|
225
|
+
if (!spec) {
|
|
226
|
+
logger.error(`Spec ${specId} not found.`);
|
|
227
|
+
process.exit(1);
|
|
228
|
+
}
|
|
229
|
+
const { isAIConfigured } = await import('../../services/ai-service.js');
|
|
230
|
+
if (!isAIConfigured(config)) {
|
|
231
|
+
logger.error('AI is not configured. Set ANTHROPIC_API_KEY (or another provider key) and `planr config set-provider`.');
|
|
232
|
+
process.exit(1);
|
|
233
|
+
}
|
|
234
|
+
logger.heading(`Decompose ${spec.id}: ${spec.data.title || spec.slug}`);
|
|
235
|
+
logger.dim(opts.codeContext === false
|
|
236
|
+
? ' (--no-code-context: skipping codebase scan)'
|
|
237
|
+
: ' Analyzing spec + codebase...');
|
|
238
|
+
try {
|
|
239
|
+
const result = await decomposeSpec(projectDir, config, specId, {
|
|
240
|
+
force: opts.force ?? false,
|
|
241
|
+
// commander stores boolean negation as `codeContext` (default true; --no-code-context → false)
|
|
242
|
+
noCodeContext: opts.codeContext === false,
|
|
243
|
+
maxStories: opts.maxStories,
|
|
244
|
+
});
|
|
245
|
+
logger.success(`Decomposed ${spec.id}: ${result.storiesCreated} stor${result.storiesCreated === 1 ? 'y' : 'ies'}, ${result.tasksCreated} tasks.`);
|
|
246
|
+
if (result.decompositionNotes) {
|
|
247
|
+
logger.dim('');
|
|
248
|
+
logger.dim(`AI notes: ${result.decompositionNotes}`);
|
|
249
|
+
}
|
|
250
|
+
logger.dim('');
|
|
251
|
+
display.line('Next steps:');
|
|
252
|
+
display.line(` - Review the tree: planr spec show ${spec.id}`);
|
|
253
|
+
display.line(` - Validate + handoff: planr spec promote ${spec.id}`);
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
// Try to surface AI errors with friendly messaging if applicable
|
|
257
|
+
try {
|
|
258
|
+
const { handleAIError } = await import('../helpers/task-creation.js');
|
|
259
|
+
await handleAIError(err);
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
logger.error(err.message);
|
|
263
|
+
}
|
|
264
|
+
process.exit(1);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
// ------------------------------------------------------------------------
|
|
268
|
+
// planr spec list
|
|
269
|
+
// ------------------------------------------------------------------------
|
|
270
|
+
spec
|
|
271
|
+
.command('list')
|
|
272
|
+
.description('List all specs in the project')
|
|
273
|
+
.action(async () => {
|
|
274
|
+
const projectDir = program.opts().projectDir;
|
|
275
|
+
const config = await loadConfig(projectDir);
|
|
276
|
+
const specs = await listSpecs(projectDir, config);
|
|
277
|
+
if (specs.length === 0) {
|
|
278
|
+
logger.info('No specs found. Run `planr spec create "<title>"` to create one.');
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
logger.heading('Specs');
|
|
282
|
+
for (const s of specs) {
|
|
283
|
+
const counts = `${s.storyCount} US, ${s.taskCount} tasks`;
|
|
284
|
+
display.line(` ${s.id} [${s.status.padEnd(18)}] ${s.title} (${counts})`);
|
|
285
|
+
}
|
|
286
|
+
});
|
|
287
|
+
// ------------------------------------------------------------------------
|
|
288
|
+
// planr spec show <id>
|
|
289
|
+
// ------------------------------------------------------------------------
|
|
290
|
+
spec
|
|
291
|
+
.command('show')
|
|
292
|
+
.description('Print a spec + its decomposition tree (stories, tasks)')
|
|
293
|
+
.argument('<specId>', 'spec ID (e.g., SPEC-001)')
|
|
294
|
+
.action(async (specId) => {
|
|
295
|
+
const projectDir = program.opts().projectDir;
|
|
296
|
+
const config = await loadConfig(projectDir);
|
|
297
|
+
const spec = await readSpec(projectDir, config, specId);
|
|
298
|
+
if (!spec) {
|
|
299
|
+
logger.error(`Spec ${specId} not found.`);
|
|
300
|
+
process.exit(1);
|
|
301
|
+
}
|
|
302
|
+
logger.heading(`${spec.id}: ${spec.data.title || spec.slug}`);
|
|
303
|
+
display.line(` Status: ${spec.data.status || 'pending'}`);
|
|
304
|
+
display.line(` Priority: ${spec.data.priority || '(unset)'}`);
|
|
305
|
+
display.line(` Milestone: ${spec.data.milestone || '(unset)'}`);
|
|
306
|
+
display.line(` PO: ${spec.data.po || '(unset)'}`);
|
|
307
|
+
display.line(` Created: ${spec.data.created || '(unset)'}`);
|
|
308
|
+
display.line(` Updated: ${spec.data.updated || '(unset)'}`);
|
|
309
|
+
display.line(` Spec file: ${spec.specFile}`);
|
|
310
|
+
display.line('');
|
|
311
|
+
const stories = await listSpecStories(spec.specDir);
|
|
312
|
+
const tasks = await listSpecTasks(spec.specDir);
|
|
313
|
+
if (stories.length === 0) {
|
|
314
|
+
display.line(' Stories: (none — run `planr spec decompose` to generate)');
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
display.line(` Stories (${stories.length}):`);
|
|
318
|
+
for (const s of stories) {
|
|
319
|
+
const taskCount = tasks.filter((t) => t.storyId === s.id).length;
|
|
320
|
+
display.line(` ${s.id} [${s.status.padEnd(13)}] ${s.title} (${taskCount} tasks)`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
display.line('');
|
|
324
|
+
if (tasks.length === 0) {
|
|
325
|
+
display.line(' Tasks: (none)');
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
display.line(` Tasks (${tasks.length}):`);
|
|
329
|
+
for (const t of tasks) {
|
|
330
|
+
display.line(` ${t.id} [${t.status.padEnd(13)}] ${t.type.padEnd(4)} ${t.agent.padEnd(20)} ${t.title}`);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
display.line('');
|
|
334
|
+
display.line(` Pipeline handoff: /openplanr-pipeline:plan ${spec.slug}`);
|
|
335
|
+
});
|
|
336
|
+
// ------------------------------------------------------------------------
|
|
337
|
+
// planr spec status [id]
|
|
338
|
+
// ------------------------------------------------------------------------
|
|
339
|
+
spec
|
|
340
|
+
.command('status')
|
|
341
|
+
.description('Decomposition state across all specs (or one spec if --spec specified)')
|
|
342
|
+
.argument('[specId]', 'optional spec ID to scope output')
|
|
343
|
+
.action(async (specId) => {
|
|
344
|
+
const projectDir = program.opts().projectDir;
|
|
345
|
+
const config = await loadConfig(projectDir);
|
|
346
|
+
if (specId) {
|
|
347
|
+
const spec = await readSpec(projectDir, config, specId);
|
|
348
|
+
if (!spec) {
|
|
349
|
+
logger.error(`Spec ${specId} not found.`);
|
|
350
|
+
process.exit(1);
|
|
351
|
+
}
|
|
352
|
+
const stories = await listSpecStories(spec.specDir);
|
|
353
|
+
const tasks = await listSpecTasks(spec.specDir);
|
|
354
|
+
logger.heading(`${spec.id}: ${spec.data.title || spec.slug}`);
|
|
355
|
+
display.line(` Status: ${spec.data.status || 'pending'}`);
|
|
356
|
+
display.line(` Stories: ${stories.length}`);
|
|
357
|
+
display.line(` Tasks: ${tasks.length}`);
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
const report = await getSpecStatus(projectDir, config);
|
|
361
|
+
if (report.specCount === 0) {
|
|
362
|
+
logger.info('No specs found. Run `planr spec init` then `planr spec create "<title>"`.');
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
logger.heading('Spec-driven mode status');
|
|
366
|
+
display.line(` Total specs: ${report.specCount}`);
|
|
367
|
+
display.line(` Total stories: ${report.totalStories}`);
|
|
368
|
+
display.line(` Total tasks: ${report.totalTasks}`);
|
|
369
|
+
display.line('');
|
|
370
|
+
for (const s of report.specs) {
|
|
371
|
+
display.line(` ${s.id} [${s.status.padEnd(18)}] ${s.title} (${s.storyCount} US, ${s.taskCount} tasks)`);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
// ------------------------------------------------------------------------
|
|
375
|
+
// planr spec destroy <id>
|
|
376
|
+
// ------------------------------------------------------------------------
|
|
377
|
+
spec
|
|
378
|
+
.command('destroy')
|
|
379
|
+
.description('Remove a spec entirely (rm -rf of its self-contained directory)')
|
|
380
|
+
.argument('<specId>', 'spec ID (e.g., SPEC-001)')
|
|
381
|
+
.action(async (specId) => {
|
|
382
|
+
const projectDir = program.opts().projectDir;
|
|
383
|
+
const config = await loadConfig(projectDir);
|
|
384
|
+
const resolved = await resolveSpecDir(projectDir, config, specId);
|
|
385
|
+
if (!resolved) {
|
|
386
|
+
logger.error(`Spec ${specId} not found.`);
|
|
387
|
+
process.exit(1);
|
|
388
|
+
}
|
|
389
|
+
const ok = await promptConfirm(`Delete ${specId} and ALL its stories, tasks, and design assets?`, false);
|
|
390
|
+
if (!ok) {
|
|
391
|
+
logger.info('Cancelled.');
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
await destroySpec(projectDir, config, specId);
|
|
395
|
+
logger.success(`Destroyed ${specId}.`);
|
|
396
|
+
logger.dim(` Removed: ${resolved.dir}`);
|
|
397
|
+
});
|
|
398
|
+
// ------------------------------------------------------------------------
|
|
399
|
+
// planr spec attach-design <id> --files ...
|
|
400
|
+
// ------------------------------------------------------------------------
|
|
401
|
+
spec
|
|
402
|
+
.command('attach-design')
|
|
403
|
+
.description("Copy PNG mockups into a spec's design/ directory and update ui_files frontmatter")
|
|
404
|
+
.argument('<specId>', 'spec ID (e.g., SPEC-001)')
|
|
405
|
+
.option('--files <paths...>', 'one or more PNG files to attach')
|
|
406
|
+
.action(async (specId, opts) => {
|
|
407
|
+
const projectDir = program.opts().projectDir;
|
|
408
|
+
const config = await loadConfig(projectDir);
|
|
409
|
+
const files = opts.files;
|
|
410
|
+
if (!files || files.length === 0) {
|
|
411
|
+
logger.error('Provide --files <path>... with one or more PNG paths.');
|
|
412
|
+
process.exit(1);
|
|
413
|
+
}
|
|
414
|
+
try {
|
|
415
|
+
const { copied, designDir } = await attachSpecDesigns(projectDir, config, specId, files);
|
|
416
|
+
if (copied.length === 0) {
|
|
417
|
+
logger.warn('No PNG files were copied. Check the paths exist and end in .png.');
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
logger.success(`Attached ${copied.length} design asset(s) to ${specId}.`);
|
|
421
|
+
for (const f of copied) {
|
|
422
|
+
logger.dim(` design/${f}`);
|
|
423
|
+
}
|
|
424
|
+
logger.dim('');
|
|
425
|
+
logger.dim(`Design directory: ${designDir}`);
|
|
426
|
+
logger.dim(`When you run /openplanr-pipeline:plan, the designer-agent will analyze these PNGs into design/design-spec.md.`);
|
|
427
|
+
}
|
|
428
|
+
catch (err) {
|
|
429
|
+
logger.error(err.message);
|
|
430
|
+
process.exit(1);
|
|
431
|
+
}
|
|
432
|
+
});
|
|
433
|
+
// ------------------------------------------------------------------------
|
|
434
|
+
// planr spec promote <id>
|
|
435
|
+
// ------------------------------------------------------------------------
|
|
436
|
+
spec
|
|
437
|
+
.command('promote')
|
|
438
|
+
.description('Validate that a spec is ready and print the pipeline handoff command')
|
|
439
|
+
.argument('<specId>', 'spec ID (e.g., SPEC-001)')
|
|
440
|
+
.action(async (specId) => {
|
|
441
|
+
const projectDir = program.opts().projectDir;
|
|
442
|
+
const config = await loadConfig(projectDir);
|
|
443
|
+
const validation = await validateSpecForPromotion(projectDir, config, specId);
|
|
444
|
+
if (!validation.ready) {
|
|
445
|
+
logger.error(`Spec ${specId} is not ready for the pipeline:`);
|
|
446
|
+
for (const issue of validation.issues) {
|
|
447
|
+
logger.error(` • ${issue}`);
|
|
448
|
+
}
|
|
449
|
+
process.exit(1);
|
|
450
|
+
}
|
|
451
|
+
const spec = await readSpec(projectDir, config, specId);
|
|
452
|
+
if (!spec)
|
|
453
|
+
return; // unreachable if validation passed
|
|
454
|
+
await updateSpecFields(projectDir, config, specId, { status: 'ready-for-pipeline' });
|
|
455
|
+
logger.success(`${specId} is ready for openplanr-pipeline.`);
|
|
456
|
+
logger.dim('');
|
|
457
|
+
display.line('Next: in Claude Code, run:');
|
|
458
|
+
display.line(` /openplanr-pipeline:plan ${spec.slug}`);
|
|
459
|
+
display.line('');
|
|
460
|
+
display.line('After human review of the decomposition:');
|
|
461
|
+
display.line(` /openplanr-pipeline:ship ${spec.slug}`);
|
|
462
|
+
display.line('');
|
|
463
|
+
logger.dim(`(The pipeline plugin reads .planr/specs/${spec.id}-${spec.slug}/ directly when spec mode is active.)`);
|
|
464
|
+
});
|
|
465
|
+
// ------------------------------------------------------------------------
|
|
466
|
+
// planr spec sync [specId]
|
|
467
|
+
// ------------------------------------------------------------------------
|
|
468
|
+
spec
|
|
469
|
+
.command('sync')
|
|
470
|
+
.description('Validate spec integrity (orphaned tasks, stories without tasks, missing specId frontmatter, schema drift)')
|
|
471
|
+
.argument('[specId]', 'optional spec ID to scope; otherwise scans all specs')
|
|
472
|
+
.option('--dry-run', 'report findings without writing any fixes', false)
|
|
473
|
+
.action(async (specId, opts) => {
|
|
474
|
+
const projectDir = program.opts().projectDir;
|
|
475
|
+
const config = await loadConfig(projectDir);
|
|
476
|
+
try {
|
|
477
|
+
if (specId) {
|
|
478
|
+
const report = await syncSpec(projectDir, config, specId, { dryRun: opts.dryRun });
|
|
479
|
+
logger.heading(`${report.specId}: ${report.specSlug}`);
|
|
480
|
+
if (report.fixed.length === 0 && report.warnings.length === 0) {
|
|
481
|
+
logger.success('Clean. No issues found.');
|
|
482
|
+
return;
|
|
483
|
+
}
|
|
484
|
+
if (report.fixed.length > 0) {
|
|
485
|
+
logger.success(`${opts.dryRun ? 'Would fix' : 'Fixed'} ${report.fixed.length} issue${report.fixed.length === 1 ? '' : 's'}:`);
|
|
486
|
+
for (const f of report.fixed) {
|
|
487
|
+
display.line(` ✓ ${f}`);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
if (report.warnings.length > 0) {
|
|
491
|
+
logger.warn(`${report.warnings.length} warning${report.warnings.length === 1 ? '' : 's'} (require human review):`);
|
|
492
|
+
for (const w of report.warnings) {
|
|
493
|
+
display.line(` ⚠ ${w}`);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
498
|
+
// No specId — scan all
|
|
499
|
+
const { specsScanned, reports } = await syncAllSpecs(projectDir, config, {
|
|
500
|
+
dryRun: opts.dryRun,
|
|
501
|
+
});
|
|
502
|
+
if (specsScanned === 0) {
|
|
503
|
+
logger.info('No specs found.');
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
const totalFixed = reports.reduce((acc, r) => acc + r.fixed.length, 0);
|
|
507
|
+
const totalWarnings = reports.reduce((acc, r) => acc + r.warnings.length, 0);
|
|
508
|
+
logger.heading(`Sync — ${specsScanned} spec${specsScanned === 1 ? '' : 's'} scanned`);
|
|
509
|
+
for (const r of reports) {
|
|
510
|
+
if (r.fixed.length === 0 && r.warnings.length === 0) {
|
|
511
|
+
display.line(` ✓ ${r.specId} (${r.specSlug}) — clean`);
|
|
512
|
+
continue;
|
|
513
|
+
}
|
|
514
|
+
display.line(` ${r.specId} (${r.specSlug}):`);
|
|
515
|
+
for (const f of r.fixed)
|
|
516
|
+
display.line(` ✓ ${f}`);
|
|
517
|
+
for (const w of r.warnings)
|
|
518
|
+
display.line(` ⚠ ${w}`);
|
|
519
|
+
}
|
|
520
|
+
logger.dim('');
|
|
521
|
+
logger.dim(`Summary: ${opts.dryRun ? 'would fix' : 'fixed'} ${totalFixed}, warnings ${totalWarnings}.`);
|
|
522
|
+
}
|
|
523
|
+
catch (err) {
|
|
524
|
+
logger.error(err.message);
|
|
525
|
+
process.exit(1);
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
//# 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);
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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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"}
|
package/dist/models/schema.d.ts
CHANGED
|
@@ -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
|
|
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"}
|
package/dist/models/schema.js
CHANGED
|
@@ -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(),
|