prizmkit 1.1.6 → 1.1.8
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/bundled/VERSION.json +3 -3
- package/bundled/dev-pipeline/README.md +65 -65
- package/bundled/dev-pipeline/assets/feature-list-example.json +2 -2
- package/bundled/dev-pipeline/launch-bugfix-daemon.sh +11 -10
- package/bundled/dev-pipeline/launch-feature-daemon.sh +12 -11
- package/bundled/dev-pipeline/launch-refactor-daemon.sh +11 -10
- package/bundled/dev-pipeline/reset-bug.sh +305 -0
- package/bundled/dev-pipeline/reset-feature.sh +9 -8
- package/bundled/dev-pipeline/reset-refactor.sh +10 -9
- package/bundled/dev-pipeline/retry-bugfix.sh +7 -6
- package/bundled/dev-pipeline/retry-feature.sh +7 -6
- package/bundled/dev-pipeline/retry-refactor.sh +7 -6
- package/bundled/dev-pipeline/run-bugfix.sh +71 -23
- package/bundled/dev-pipeline/run-feature.sh +30 -21
- package/bundled/dev-pipeline/run-refactor.sh +21 -17
- package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
- package/bundled/dev-pipeline/scripts/detect-stuck.py +3 -3
- package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +26 -14
- package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +6 -6
- package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +6 -6
- package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +4 -4
- package/bundled/dev-pipeline/scripts/init-pipeline.py +26 -12
- package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +4 -4
- package/bundled/dev-pipeline/scripts/update-bug-status.py +10 -10
- package/bundled/dev-pipeline/scripts/update-feature-status.py +31 -31
- package/bundled/dev-pipeline/scripts/update-refactor-status.py +8 -8
- package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +111 -31
- package/bundled/dev-pipeline/templates/feature-list-schema.json +91 -25
- package/bundled/dev-pipeline/templates/refactor-list-schema.json +107 -28
- package/bundled/dev-pipeline/tests/test_auto_skip.py +1 -1
- package/bundled/skills/_metadata.json +10 -2
- package/bundled/skills/app-planner/SKILL.md +24 -13
- package/bundled/skills/app-planner/references/project-brief-guide.md +1 -1
- package/bundled/skills/bug-fix-workflow/SKILL.md +7 -5
- package/bundled/skills/bug-planner/SKILL.md +80 -25
- package/bundled/skills/bug-planner/scripts/validate-bug-list.py +3 -3
- package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +38 -33
- package/bundled/skills/feature-pipeline-launcher/SKILL.md +33 -33
- package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
- package/bundled/skills/feature-planner/SKILL.md +96 -24
- package/bundled/skills/feature-planner/references/error-recovery.md +9 -9
- package/bundled/skills/feature-planner/scripts/validate-and-generate.py +25 -24
- package/bundled/skills/feature-workflow/SKILL.md +23 -20
- package/bundled/skills/prizmkit-committer/SKILL.md +1 -0
- package/bundled/skills/prizmkit-deploy/SKILL.md +1 -0
- package/bundled/skills/prizmkit-deploy/assets/deploy-template.md +1 -1
- package/bundled/skills/prizmkit-implement/SKILL.md +1 -1
- package/bundled/skills/prizmkit-implement/references/deploy-guide-protocol.md +4 -4
- package/bundled/skills/prizmkit-plan/SKILL.md +3 -3
- package/bundled/skills/prizmkit-retrospective/SKILL.md +40 -3
- package/bundled/skills/prizmkit-verify/SKILL.md +281 -0
- package/bundled/skills/prizmkit-verify/scripts/verify-light.py +402 -0
- package/bundled/skills/recovery-workflow/SKILL.md +15 -14
- package/bundled/skills/recovery-workflow/evals/evals.json +5 -5
- package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +43 -10
- package/bundled/skills/refactor-pipeline-launcher/SKILL.md +38 -34
- package/bundled/skills/refactor-planner/SKILL.md +74 -24
- package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
- package/bundled/skills/refactor-workflow/SKILL.md +24 -20
- package/package.json +1 -1
- package/src/clean.js +4 -4
- package/src/gitignore-template.js +7 -8
- package/src/scaffold.js +4 -2
|
@@ -49,7 +49,7 @@ Three execution modes are available. The user chooses one before configuring oth
|
|
|
49
49
|
Before any action, validate:
|
|
50
50
|
|
|
51
51
|
1. **dev-pipeline exists**: Confirm `dev-pipeline/launch-feature-daemon.sh` is present and executable
|
|
52
|
-
2. **For start**:
|
|
52
|
+
2. **For start**: `.prizmkit/plans/feature-list.json` must exist in `.prizmkit/plans/` (or user-specified path)
|
|
53
53
|
3. **Dependencies**: `jq`, `python3`, AI CLI (`cbc` or `claude`) must be in PATH
|
|
54
54
|
4. **Python version**: Requires Python 3.8+ for dev-pipeline scripts
|
|
55
55
|
5. **playwright-cli** (optional): If any feature has `browser_interaction` field, check `playwright-cli` is available
|
|
@@ -61,8 +61,8 @@ command -v jq && command -v python3 && (command -v cbc || command -v claude) &&
|
|
|
61
61
|
command -v playwright-cli && echo "playwright-cli OK" || echo "playwright-cli not found (browser verification will be skipped)"
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
If
|
|
65
|
-
> "No feature-list.json found. Run the `feature-planner` skill first to generate one, or provide a path to your feature list."
|
|
64
|
+
If `.prizmkit/plans/feature-list.json` is missing, inform user:
|
|
65
|
+
> "No .prizmkit/plans/feature-list.json found. Run the `feature-planner` skill first to generate one, or provide a path to your feature list."
|
|
66
66
|
|
|
67
67
|
### Workflow
|
|
68
68
|
|
|
@@ -74,7 +74,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
74
74
|
|
|
75
75
|
1. **Check prerequisites**:
|
|
76
76
|
```bash
|
|
77
|
-
ls feature-list.json 2>/dev/null && echo "Found" || echo "Missing"
|
|
77
|
+
ls .prizmkit/plans/feature-list.json 2>/dev/null && echo "Found" || echo "Missing"
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
2. **Check not already running**:
|
|
@@ -87,7 +87,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
87
87
|
```bash
|
|
88
88
|
python3 -c "
|
|
89
89
|
import json
|
|
90
|
-
with open('feature-list.json') as f:
|
|
90
|
+
with open('.prizmkit/plans/feature-list.json') as f:
|
|
91
91
|
data = json.load(f)
|
|
92
92
|
features = data.get('features', [])
|
|
93
93
|
print(f'Total features: {len(features)}')
|
|
@@ -98,8 +98,8 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
98
98
|
If pipeline state already exists, use the status command instead:
|
|
99
99
|
```bash
|
|
100
100
|
python3 dev-pipeline/scripts/update-feature-status.py \
|
|
101
|
-
--feature-list feature-list.json \
|
|
102
|
-
--state-dir
|
|
101
|
+
--feature-list .prizmkit/plans/feature-list.json \
|
|
102
|
+
--state-dir .prizmkit/state/features \
|
|
103
103
|
--action status 2>/dev/null
|
|
104
104
|
```
|
|
105
105
|
|
|
@@ -107,11 +107,11 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
107
107
|
|
|
108
108
|
Run the preflight script to auto-detect the database type, verify env vars, test connectivity, and check migration status:
|
|
109
109
|
```bash
|
|
110
|
-
python3 ${SKILL_DIR}/scripts/preflight-check.py feature-list.json
|
|
110
|
+
python3 ${SKILL_DIR}/scripts/preflight-check.py .prizmkit/plans/feature-list.json
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
The script:
|
|
114
|
-
- Reads `global_context.database` from
|
|
114
|
+
- Reads `global_context.database` from `.prizmkit/plans/feature-list.json` and `.prizmkit/config.json`
|
|
115
115
|
- Scans `.env.local` / `.env` for connection variables (supports Supabase, PostgreSQL, MySQL, MongoDB, Firebase, and generic `DATABASE_URL`)
|
|
116
116
|
- Tests connectivity using the appropriate method per database type
|
|
117
117
|
- Checks migration status (Prisma, Drizzle, Supabase raw SQL, or generic migration directories)
|
|
@@ -176,34 +176,34 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
176
176
|
|
|
177
177
|
**Foreground command:**
|
|
178
178
|
```bash
|
|
179
|
-
VERBOSE=1 dev-pipeline/run-feature.sh run feature-list.json
|
|
179
|
+
VERBOSE=1 dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json
|
|
180
180
|
```
|
|
181
181
|
With all options:
|
|
182
182
|
```bash
|
|
183
183
|
VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5 SESSION_TIMEOUT=3600 \
|
|
184
|
-
dev-pipeline/run-feature.sh run feature-list.json --features F-001:F-005
|
|
184
|
+
dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json --features F-001:F-005
|
|
185
185
|
```
|
|
186
186
|
|
|
187
187
|
**Background daemon command:**
|
|
188
188
|
```bash
|
|
189
|
-
dev-pipeline/launch-feature-daemon.sh start feature-list.json --env "VERBOSE=1"
|
|
189
|
+
dev-pipeline/launch-feature-daemon.sh start .prizmkit/plans/feature-list.json --env "VERBOSE=1"
|
|
190
190
|
```
|
|
191
191
|
With all options:
|
|
192
192
|
```bash
|
|
193
|
-
dev-pipeline/launch-feature-daemon.sh start feature-list.json --features F-001:F-005 \
|
|
193
|
+
dev-pipeline/launch-feature-daemon.sh start .prizmkit/plans/feature-list.json --features F-001:F-005 \
|
|
194
194
|
--env "VERBOSE=1 ENABLE_CRITIC=true MAX_RETRIES=5"
|
|
195
195
|
```
|
|
196
196
|
|
|
197
197
|
**Manual mode**: Print the assembled command(s) and **stop here**. Do not execute anything. Do not proceed to step 8.
|
|
198
198
|
```
|
|
199
199
|
# To run in foreground:
|
|
200
|
-
VERBOSE=1 dev-pipeline/run-feature.sh run feature-list.json
|
|
200
|
+
VERBOSE=1 dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json
|
|
201
201
|
|
|
202
202
|
# To run in background (detached):
|
|
203
|
-
dev-pipeline/launch-feature-daemon.sh start feature-list.json --env "VERBOSE=1"
|
|
203
|
+
dev-pipeline/launch-feature-daemon.sh start .prizmkit/plans/feature-list.json --env "VERBOSE=1"
|
|
204
204
|
|
|
205
205
|
# To check status:
|
|
206
|
-
dev-pipeline/run-feature.sh status feature-list.json
|
|
206
|
+
dev-pipeline/run-feature.sh status .prizmkit/plans/feature-list.json
|
|
207
207
|
```
|
|
208
208
|
|
|
209
209
|
8. **Confirm and launch** (Foreground and Background only — Manual mode ends at step 7):
|
|
@@ -227,7 +227,7 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
227
227
|
```
|
|
228
228
|
2. Start log monitoring — Use the Bash tool with `run_in_background: true`:
|
|
229
229
|
```bash
|
|
230
|
-
tail -f
|
|
230
|
+
tail -f .prizmkit/state/features/pipeline-daemon.log
|
|
231
231
|
```
|
|
232
232
|
3. Report to user:
|
|
233
233
|
- Pipeline PID
|
|
@@ -247,14 +247,14 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
247
247
|
2. **Show feature-level progress**:
|
|
248
248
|
```bash
|
|
249
249
|
python3 dev-pipeline/scripts/update-feature-status.py \
|
|
250
|
-
--feature-list feature-list.json \
|
|
251
|
-
--state-dir
|
|
250
|
+
--feature-list .prizmkit/plans/feature-list.json \
|
|
251
|
+
--state-dir .prizmkit/state/features \
|
|
252
252
|
--action status
|
|
253
253
|
```
|
|
254
254
|
|
|
255
255
|
3. **Show recent log activity** (last 20 lines):
|
|
256
256
|
```bash
|
|
257
|
-
tail -20
|
|
257
|
+
tail -20 .prizmkit/state/features/pipeline-daemon.log
|
|
258
258
|
```
|
|
259
259
|
|
|
260
260
|
4. **Summarize** to user: total features, completed, in-progress, failed, pending.
|
|
@@ -286,20 +286,20 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
286
286
|
|
|
287
287
|
2. **If running** -- Start live tail with Bash tool `run_in_background: true`:
|
|
288
288
|
```bash
|
|
289
|
-
tail -f
|
|
289
|
+
tail -f .prizmkit/state/features/pipeline-daemon.log
|
|
290
290
|
```
|
|
291
291
|
|
|
292
292
|
3. **If not running** -- Show last 50 lines:
|
|
293
293
|
```bash
|
|
294
|
-
tail -50
|
|
294
|
+
tail -50 .prizmkit/state/features/pipeline-daemon.log
|
|
295
295
|
```
|
|
296
296
|
|
|
297
297
|
4. **For per-feature session logs** (when user asks about a specific feature):
|
|
298
298
|
```bash
|
|
299
299
|
# Check feature status for last session ID
|
|
300
|
-
cat
|
|
300
|
+
cat .prizmkit/state/features/features/<FEATURE_ID>/status.json 2>/dev/null
|
|
301
301
|
# Then tail that feature's session log
|
|
302
|
-
tail -100
|
|
302
|
+
tail -100 .prizmkit/state/features/features/<FEATURE_ID>/sessions/<SESSION_ID>/logs/session.log
|
|
303
303
|
```
|
|
304
304
|
|
|
305
305
|
---
|
|
@@ -309,18 +309,18 @@ Detect user intent from their message, then follow the corresponding workflow:
|
|
|
309
309
|
When user says "retry F-003":
|
|
310
310
|
|
|
311
311
|
```bash
|
|
312
|
-
dev-pipeline/retry-feature.sh F-003 feature-list.json
|
|
312
|
+
dev-pipeline/retry-feature.sh F-003 .prizmkit/plans/feature-list.json
|
|
313
313
|
```
|
|
314
314
|
|
|
315
315
|
When user says "clean retry F-003" or "retry F-003 from scratch":
|
|
316
316
|
|
|
317
317
|
```bash
|
|
318
|
-
dev-pipeline/reset-feature.sh F-003 --clean --run feature-list.json
|
|
318
|
+
dev-pipeline/reset-feature.sh F-003 --clean --run .prizmkit/plans/feature-list.json
|
|
319
319
|
```
|
|
320
320
|
|
|
321
321
|
Environment variables (optional):
|
|
322
322
|
```bash
|
|
323
|
-
SESSION_TIMEOUT=3600 dev-pipeline/retry-feature.sh F-003 feature-list.json
|
|
323
|
+
SESSION_TIMEOUT=3600 dev-pipeline/retry-feature.sh F-003 .prizmkit/plans/feature-list.json
|
|
324
324
|
```
|
|
325
325
|
|
|
326
326
|
Notes:
|
|
@@ -339,7 +339,7 @@ After pipeline completion, if features have `browser_interaction` fields and `pl
|
|
|
339
339
|
```bash
|
|
340
340
|
python3 -c "
|
|
341
341
|
import json
|
|
342
|
-
with open('feature-list.json') as f:
|
|
342
|
+
with open('.prizmkit/plans/feature-list.json') as f:
|
|
343
343
|
data = json.load(f)
|
|
344
344
|
for feat in data.get('features', []):
|
|
345
345
|
bi = feat.get('browser_interaction')
|
|
@@ -368,14 +368,14 @@ After pipeline completion, if features have `browser_interaction` fields and `pl
|
|
|
368
368
|
|
|
369
369
|
| Error | Action |
|
|
370
370
|
|-------|--------|
|
|
371
|
-
|
|
|
371
|
+
| `.prizmkit/plans/feature-list.json` not found | Tell user to run `feature-planner` skill first |
|
|
372
372
|
| `jq` not installed | Suggest: `brew install jq` |
|
|
373
373
|
| `cbc`/`claude` not in PATH | Check AI CLI installation |
|
|
374
374
|
| Pipeline already running | Show status, ask if user wants to stop and restart |
|
|
375
375
|
| PID file stale (process dead) | `launch-feature-daemon.sh` auto-cleans, retry start |
|
|
376
|
-
| Launch failed (process died immediately) | Show last 20 lines of log: `tail -20
|
|
376
|
+
| Launch failed (process died immediately) | Show last 20 lines of log: `tail -20 .prizmkit/state/features/pipeline-daemon.log` |
|
|
377
377
|
| Feature stuck/blocked | Use `retry-feature.sh <F-XXX>` to retry; use `reset-feature.sh <F-XXX> --clean --run` for fresh start |
|
|
378
|
-
| All features blocked/failed | Show status, suggest daemon-safe recovery: `dev-pipeline/reset-feature.sh <F-XXX> --clean --run feature-list.json` |
|
|
378
|
+
| All features blocked/failed | Show status, suggest daemon-safe recovery: `dev-pipeline/reset-feature.sh <F-XXX> --clean --run .prizmkit/plans/feature-list.json` |
|
|
379
379
|
| `playwright-cli` not installed | Browser verification skipped (non-blocking). Suggest: `npm install -g @playwright/cli@latest && playwright-cli install --skills` |
|
|
380
380
|
| Permission denied on script | Run `chmod +x dev-pipeline/launch-feature-daemon.sh dev-pipeline/run-feature.sh` |
|
|
381
381
|
| Pipeline stop failed (process won't die) | Process may be stuck in I/O wait. Try `kill -9 <PID>` manually. Check for orphaned child processes with `ps aux \| grep claude` |
|
|
@@ -385,9 +385,9 @@ After pipeline completion, if features have `browser_interaction` fields and `pl
|
|
|
385
385
|
|
|
386
386
|
### Integration Notes
|
|
387
387
|
|
|
388
|
-
- **After feature-planner**: This is the natural next step. When user finishes planning and has
|
|
388
|
+
- **After feature-planner**: This is the natural next step. When user finishes planning and has `.prizmkit/plans/feature-list.json`, suggest launching the pipeline.
|
|
389
389
|
- **Session independence**: The pipeline runs completely detached. User can close the AI CLI session, open a new session later, and use this skill to check progress or stop the pipeline.
|
|
390
390
|
- **Single instance**: Only one pipeline can run at a time. The PID file prevents duplicates.
|
|
391
|
-
- **Pipeline coexistence**: Feature and bugfix pipelines use separate state directories (
|
|
391
|
+
- **Pipeline coexistence**: Feature and bugfix pipelines use separate state directories (`.prizmkit/state/features/` vs `.prizmkit/state/bugfix/`), so they can run simultaneously without conflict.
|
|
392
392
|
- **State preservation**: Stopping and restarting the pipeline resumes from where it left off -- completed features are not re-run.
|
|
393
393
|
- **HANDOFF**: After pipeline completes all features, each session has already run `prizmkit-retrospective` internally. Ask user what's next.
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"""
|
|
3
3
|
dev-pipeline environment preflight checker.
|
|
4
4
|
|
|
5
|
-
Detects database type from feature-list.json / .prizmkit/config.json,
|
|
5
|
+
Detects database type from .prizmkit/plans/feature-list.json / .prizmkit/config.json,
|
|
6
6
|
verifies env vars, tests connectivity, and checks migration status.
|
|
7
7
|
|
|
8
8
|
Usage:
|
|
9
|
-
python3 preflight-check.py [feature-list.json]
|
|
9
|
+
python3 preflight-check.py [.prizmkit/plans/feature-list.json]
|
|
10
10
|
|
|
11
11
|
Output: PREFLIGHT lines to stdout (✓ / ⚠ / ℹ), JSON summary to stderr.
|
|
12
12
|
Exit code: 0 = all clear, 1 = warnings found, 2 = error.
|
|
@@ -402,7 +402,7 @@ def check_dev_server(feature_list_path):
|
|
|
402
402
|
# ── Main ────────────────────────────────────────────────────────
|
|
403
403
|
|
|
404
404
|
def main():
|
|
405
|
-
feature_list = sys.argv[1] if len(sys.argv) > 1 else "feature-list.json"
|
|
405
|
+
feature_list = sys.argv[1] if len(sys.argv) > 1 else ".prizmkit/plans/feature-list.json"
|
|
406
406
|
|
|
407
407
|
if not os.path.isfile(feature_list):
|
|
408
408
|
print(f"PREFLIGHT ⚠ Feature list not found: {feature_list}")
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "feature-planner"
|
|
3
|
-
description: "Plan and manage features for an existing project — add new features, reprioritize, split, and generate validated feature-list.json for dev-pipeline execution. Use this skill for feature scoping, incremental planning, continuing a feature plan, or preparing pipeline input. For planning a new app from scratch, use app-planner instead."
|
|
3
|
+
description: "Plan and manage features for an existing project — add new features, reprioritize, split, and generate validated .prizmkit/plans/feature-list.json for dev-pipeline execution. Use this skill for feature scoping, incremental planning, continuing a feature plan, or preparing pipeline input. For planning a new app from scratch, use app-planner instead."
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# feature planner
|
|
7
7
|
|
|
8
8
|
Plan deliverable features for dev-pipeline on existing projects:
|
|
9
|
-
- **New Feature Set**: create an initial feature-list.json for a project that has code but no plan yet
|
|
9
|
+
- **New Feature Set**: create an initial .prizmkit/plans/feature-list.json for a project that has code but no plan yet
|
|
10
10
|
- **Incremental Feature Planning**: append, adjust, or reprioritize features in an existing plan
|
|
11
11
|
|
|
12
|
-
Always produce a validated
|
|
12
|
+
Always produce a validated `.prizmkit/plans/feature-list.json` that conforms to `dev-pipeline-feature-list`.
|
|
13
13
|
|
|
14
14
|
For planning a **new application from scratch** (vision, tech stack, decomposition), use `app-planner` instead.
|
|
15
15
|
|
|
@@ -35,24 +35,24 @@ The user chose this skill intentionally. Respect that choice.
|
|
|
35
35
|
- Create, modify, or delete source code files (*.js, *.ts, *.py, *.go, *.html, *.css, etc.)
|
|
36
36
|
- Create project scaffolding, directories, or boilerplate
|
|
37
37
|
- Run build/install/test commands (npm init, pip install, etc.)
|
|
38
|
-
- Execute any implementation action beyond writing
|
|
38
|
+
- Execute any implementation action beyond writing `.prizmkit/plans/feature-list.json`
|
|
39
39
|
|
|
40
40
|
**Your ONLY writable outputs are:**
|
|
41
|
-
1.
|
|
41
|
+
1. `.prizmkit/plans/feature-list.json` (`.prizmkit/plans/`)
|
|
42
42
|
2. Draft backups in `.prizmkit/planning/`
|
|
43
43
|
|
|
44
44
|
**After planning is complete**, you MUST:
|
|
45
45
|
1. Present the summary and recommended next step
|
|
46
46
|
2. **Ask the user explicitly** whether they want to proceed to execution
|
|
47
47
|
3. If the user agrees → recommend invoking `feature-pipeline-launcher` or running `run-feature.sh` (do NOT execute it yourself)
|
|
48
|
-
4. If the user wants to adjust → continue refining
|
|
48
|
+
4. If the user wants to adjust → continue refining `.prizmkit/plans/feature-list.json`
|
|
49
49
|
5. **NEVER auto-execute** the pipeline, launcher, or any implementation step
|
|
50
50
|
|
|
51
51
|
## When to Use
|
|
52
52
|
|
|
53
53
|
Trigger this skill for requests like:
|
|
54
54
|
- "Add features to existing system", "Continue planning"
|
|
55
|
-
- "Prepare feature-list.json", "Prepare dev-pipeline input"
|
|
55
|
+
- "Prepare .prizmkit/plans/feature-list.json", "Prepare dev-pipeline input"
|
|
56
56
|
- "Reprioritize features", "Split features"
|
|
57
57
|
- "Plan features for my project" (when the project already exists)
|
|
58
58
|
|
|
@@ -79,43 +79,115 @@ Do NOT use this skill when:
|
|
|
79
79
|
```bash
|
|
80
80
|
python3 ${SKILL_DIR}/scripts/validate-and-generate.py validate --input <output-path> --mode <new|incremental>
|
|
81
81
|
```
|
|
82
|
+
|
|
83
|
+
If the script is not available, perform these manual validation checks:
|
|
84
|
+
1. **ID sequence**: All feature IDs are sequential (F-001, F-002, F-003, ...)
|
|
85
|
+
2. **No circular dependencies**: No feature depends (directly or transitively) on itself
|
|
86
|
+
3. **Description length**: Minimum 15 words per description (error), 30/50/80 recommended
|
|
87
|
+
4. **Dependency references**: All referenced features in dependencies exist in features array
|
|
88
|
+
5. **Priority enums**: All priority values are exactly "high", "medium", or "low" (case-sensitive)
|
|
89
|
+
6. **Status enum**: All status values are one of: pending, in_progress, completed, failed, skipped, split, auto_skipped
|
|
90
|
+
7. **Acceptance criteria**: At least 1 criterion per feature, each is a concrete, measurable statement
|
|
91
|
+
8. **Browser interaction**: If present, has url, verify_steps array, and optional setup_command
|
|
92
|
+
9. **Complexity enum**: If present, is one of: low, medium, high
|
|
93
|
+
10. **Model field**: If present, is a non-empty string
|
|
94
|
+
11. **Critic field**: If present, is boolean; if true, critic_count should be 1 or 3
|
|
95
|
+
12. **Root schema**: Has $schema='dev-pipeline-feature-list-v1', project_name, and non-empty features array
|
|
82
96
|
|
|
83
97
|
5. **Use script output as source of truth** — if validation fails, fix and re-run until pass
|
|
84
98
|
|
|
85
99
|
## Prerequisites
|
|
86
100
|
|
|
87
101
|
Before questions, check optional context files (never block if absent):
|
|
88
|
-
- `.prizm-docs/root.prizm` (architecture/project context)
|
|
102
|
+
- `.prizm-docs/root.prizm` (architecture/project context — typically created by app-planner with captured decisions)
|
|
89
103
|
- `.prizmkit/config.json` (existing stack preferences and detected tech stack)
|
|
90
|
-
-
|
|
104
|
+
- `.prizmkit/plans/project-brief.md` (project context from app-planner, if available)
|
|
105
|
+
- existing `.prizmkit/plans/feature-list.json` (required for incremental mode)
|
|
106
|
+
- `.prizmkit/project-conventions.json` (project conventions from app-planner, if available)
|
|
91
107
|
- If `.prizm-docs/root.prizm` is absent and the project has existing source code, scan the directory structure to understand the codebase layout:
|
|
92
108
|
```bash
|
|
93
109
|
find . -maxdepth 2 -type d -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -not -path '*/build/*' -not -path '*/__pycache__/*' -not -path '*/vendor/*' | sed -e 's;[^/]*/;|____;g;s;____|; |;g'
|
|
94
110
|
```
|
|
95
111
|
|
|
96
112
|
**Tech stack from config.json:**
|
|
97
|
-
- If `.prizmkit/config.json` contains a `tech_stack` object, use it to pre-fill `global_context` fields in the generated
|
|
113
|
+
- If `.prizmkit/config.json` contains a `tech_stack` object, use it to pre-fill `global_context` fields in the generated `.prizmkit/plans/feature-list.json`.
|
|
98
114
|
- Map config fields to global_context: `language`, `runtime`, `frontend_framework`, `frontend_styling`, `backend_framework`, `database`, `orm`, `testing` → `testing_strategy`, `bundler`, `project_type`.
|
|
99
115
|
- Do NOT re-ask the user for tech stack info already present in config.json. Show detected stack and confirm.
|
|
100
116
|
|
|
117
|
+
## Global Context Population
|
|
118
|
+
|
|
119
|
+
The `global_context` object in `.prizmkit/plans/feature-list.json` provides technology stack information to the pipeline for intelligent code generation.
|
|
120
|
+
|
|
121
|
+
### Recommended Fields by Project Type
|
|
122
|
+
|
|
123
|
+
**Frontend-only projects:**
|
|
124
|
+
- `language` (required) — e.g., "TypeScript", "JavaScript"
|
|
125
|
+
- `frontend_framework` (required) — e.g., "React", "Vue", "Svelte"
|
|
126
|
+
- `frontend_styling` (recommended) — e.g., "Tailwind CSS", "styled-components"
|
|
127
|
+
- `testing_strategy` (recommended) — e.g., "Jest + React Testing Library"
|
|
128
|
+
|
|
129
|
+
**Backend-only projects:**
|
|
130
|
+
- `language` (required) — e.g., "TypeScript", "Python", "Go"
|
|
131
|
+
- `backend_framework` (required) — e.g., "Express", "Django", "FastAPI"
|
|
132
|
+
- `database` (required if applicable) — e.g., "PostgreSQL", "MongoDB"
|
|
133
|
+
- `testing_strategy` (recommended) — e.g., "Jest", "pytest"
|
|
134
|
+
|
|
135
|
+
**Full-stack projects (include both frontend AND backend fields):**
|
|
136
|
+
- `language`, `frontend_framework`, `backend_framework`, `database`, `testing_strategy` (all recommended)
|
|
137
|
+
- Additional: `frontend_styling`, `orm`, `bundler`, `runtime`
|
|
138
|
+
|
|
139
|
+
### Auto-Population from app-planner
|
|
140
|
+
|
|
141
|
+
If the project was planned with `app-planner`, `feature-planner` will automatically read:
|
|
142
|
+
- `.prizmkit/config.json` (tech stack detected by app-planner)
|
|
143
|
+
- `.prizmkit/plans/project-brief.md` (tech choices made during planning)
|
|
144
|
+
- `.prizm-docs/root.prizm` (architecture decisions)
|
|
145
|
+
|
|
146
|
+
**Recommendation**: Always run `app-planner` before `feature-planner` to ensure `global_context` is pre-populated correctly. This reduces planning time and improves code generation consistency.
|
|
147
|
+
|
|
148
|
+
### Manual Population (if no app-planner context)
|
|
149
|
+
|
|
150
|
+
If planning features directly without app-planner:
|
|
151
|
+
1. During Phase 1 (Scope Clarification), identify the project's tech stack
|
|
152
|
+
2. Ask user or read from existing `package.json` / `pyproject.toml` / `go.mod`
|
|
153
|
+
3. Populate `global_context` in `.prizmkit/plans/feature-list.json` with detected values
|
|
154
|
+
4. Confirm with user: "Using tech stack: [language] + [frameworks]. Correct?"
|
|
155
|
+
|
|
156
|
+
### Pipeline Behavior with Missing Fields
|
|
157
|
+
|
|
158
|
+
| Missing Field | Pipeline Behavior |
|
|
159
|
+
|---------------|-------------------|
|
|
160
|
+
| `language` | Uses generic pseudocode patterns; code generation may be generic |
|
|
161
|
+
| `frontend_framework` | Frontend features generate generic HTML/JavaScript; no framework-specific patterns |
|
|
162
|
+
| `backend_framework` | Backend features generate generic API patterns; no framework-specific scaffolding |
|
|
163
|
+
| `database` | Assumes no persistent storage; generates unit tests only with mocks |
|
|
164
|
+
| `testing_strategy` | Defaults to Jest (if JavaScript/TypeScript); pytest (if Python) |
|
|
165
|
+
| All fields empty | Pipeline still works but code quality/consistency may suffer; recommend re-running with app-planner |
|
|
166
|
+
|
|
167
|
+
### Note
|
|
168
|
+
|
|
169
|
+
**global_context fields are all optional** — pipeline can execute without them. However, including the recommended fields dramatically improves code generation quality and framework-specific best practices.
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
101
173
|
## Scenario Routing
|
|
102
174
|
|
|
103
175
|
Classify user intent first:
|
|
104
176
|
|
|
105
177
|
### Route A: New Feature Set (No Existing Plan)
|
|
106
|
-
Use when the project exists but has no
|
|
178
|
+
Use when the project exists but has no `.prizmkit/plans/feature-list.json` yet.
|
|
107
179
|
|
|
108
180
|
Actions:
|
|
109
181
|
1. Understand the existing codebase and what's already implemented
|
|
110
182
|
2. Run interactive planning phases to identify needed features
|
|
111
|
-
3. Generate initial
|
|
183
|
+
3. Generate initial `.prizmkit/plans/feature-list.json`
|
|
112
184
|
|
|
113
185
|
### Route B: Incremental Feature Planning
|
|
114
|
-
Use when user already has a
|
|
186
|
+
Use when user already has a `.prizmkit/plans/feature-list.json` and wants to add or adjust features.
|
|
115
187
|
|
|
116
188
|
Actions:
|
|
117
189
|
1. Load `${SKILL_DIR}/references/incremental-feature-planning.md`
|
|
118
|
-
2. Read existing
|
|
190
|
+
2. Read existing `.prizmkit/plans/feature-list.json` first (if missing, ask whether to start new plan)
|
|
119
191
|
3. Append features with next sequential `F-NNN` IDs
|
|
120
192
|
4. Preserve style/language/detail consistency with existing plan
|
|
121
193
|
|
|
@@ -133,7 +205,7 @@ Execute the planning workflow in conversation mode with mandatory checkpoints:
|
|
|
133
205
|
4.2 **Browser interaction** (mandatory for fullstack/frontend projects) — see §Browser Interaction Planning below. Qualifying features get `browser_interaction` by default. Only confirm with the user as a batch summary; do NOT ask per-feature.
|
|
134
206
|
5. Verify DAG/order/priorities
|
|
135
207
|
6. Pre-generation completeness review (see §Pre-Generation Completeness Review below)
|
|
136
|
-
7. Build or append
|
|
208
|
+
7. Build or append `.prizmkit/plans/feature-list.json`
|
|
137
209
|
8. Apply default testing strategy (see §Testing Defaults below)
|
|
138
210
|
9. Validate and fix until pass
|
|
139
211
|
10. Summarize final feature table
|
|
@@ -150,14 +222,14 @@ Checkpoints catch cascading errors early — skipping one means the next phase b
|
|
|
150
222
|
| **CP-FP-3.1** | Browser Interaction Applied | Qualifying features have `browser_interaction` field; user confirmed or opted out | 4 |
|
|
151
223
|
| **CP-FP-3.2** | Testing Defaults Applied | All features have appropriate `critic`, `critic_count`, and testing expectations | 7 |
|
|
152
224
|
| **CP-FP-3.3** | Completeness Review Passed | All features reviewed for description adequacy and cross-feature gaps | 6 |
|
|
153
|
-
| **CP-FP-4** |
|
|
225
|
+
| **CP-FP-4** | `.prizmkit/plans/feature-list.json` Generated | Schema validates, all required keys present | 7-8 |
|
|
154
226
|
| **CP-FP-5** | Final Validation Pass | Python script returns `"valid": true` with zero errors | 9 |
|
|
155
227
|
|
|
156
228
|
**Resume Detection**: If existing artifacts are found, read `${SKILL_DIR}/references/error-recovery.md` §Resume Support for checkpoint-based resumption.
|
|
157
229
|
|
|
158
230
|
## Pre-Generation Completeness Review (Phase 6)
|
|
159
231
|
|
|
160
|
-
Before generating
|
|
232
|
+
Before generating `.prizmkit/plans/feature-list.json`, review the full feature set holistically. Individual features may look fine in isolation but have gaps when viewed together.
|
|
161
233
|
|
|
162
234
|
### Step 1: Description Adequacy Scan
|
|
163
235
|
|
|
@@ -211,7 +283,7 @@ For simple incremental planning, skip detailed Phase 2-3 analysis:
|
|
|
211
283
|
- **No architectural changes** to existing tech stack
|
|
212
284
|
|
|
213
285
|
### Fast Path Workflow
|
|
214
|
-
1. Read existing
|
|
286
|
+
1. Read existing `.prizmkit/plans/feature-list.json` and confirm scope
|
|
215
287
|
2. **User confirmation (mandatory)** — Tell the user: "This qualifies for fast-path (simple incremental addition). Skip detailed Phase 2-3 analysis and draft directly? Or use full workflow?" Only proceed with fast path if user confirms.
|
|
216
288
|
3. Generate next sequential feature IDs
|
|
217
289
|
4. Draft features (title + description + acceptance_criteria + dependencies)
|
|
@@ -242,7 +314,7 @@ A feature is **exempt** when ANY true:
|
|
|
242
314
|
|
|
243
315
|
## Output Rules
|
|
244
316
|
|
|
245
|
-
|
|
317
|
+
`.prizmkit/plans/feature-list.json` must satisfy:
|
|
246
318
|
- `$schema` = `dev-pipeline-feature-list-v1`
|
|
247
319
|
- non-empty `features`
|
|
248
320
|
- sequential feature IDs (`F-001`, `F-002`, ...)
|
|
@@ -291,7 +363,7 @@ Recommend these three options in this strict order:
|
|
|
291
363
|
1. **Preferred**: invoke `feature-pipeline-launcher` skill
|
|
292
364
|
2. **Fallback A**: run daemon wrapper
|
|
293
365
|
```bash
|
|
294
|
-
./dev-pipeline/launch-feature-daemon.sh start feature-list.json
|
|
366
|
+
./dev-pipeline/launch-feature-daemon.sh start .prizmkit/plans/feature-list.json
|
|
295
367
|
./dev-pipeline/launch-feature-daemon.sh status
|
|
296
368
|
```
|
|
297
369
|
3. **Fallback B**: run direct foreground script
|
|
@@ -308,7 +380,7 @@ Key behaviors:
|
|
|
308
380
|
- Warnings only → proceed with user approval
|
|
309
381
|
- Critical errors → group by type, auto-fix where possible, max 3 total attempts
|
|
310
382
|
- Interrupted session → detect checkpoint from existing artifacts, offer resume or restart
|
|
311
|
-
-
|
|
383
|
+
- `.prizmkit/plans/feature-list.json` MUST be written to `.prizmkit/plans/` (project root level: `./{root}/.prizmkit/plans/feature-list.json`)
|
|
312
384
|
|
|
313
385
|
## Session Exit Gate
|
|
314
386
|
|
|
@@ -316,13 +388,13 @@ Prevent accidental session exit without deliverable completion.
|
|
|
316
388
|
|
|
317
389
|
### Trigger Conditions
|
|
318
390
|
Activate when ALL true:
|
|
319
|
-
- User expressed intent to produce feature-list.json
|
|
391
|
+
- User expressed intent to produce .prizmkit/plans/feature-list.json
|
|
320
392
|
- Current phase < Phase 7
|
|
321
|
-
- No valid
|
|
393
|
+
- No valid `.prizmkit/plans/feature-list.json` written in this session
|
|
322
394
|
|
|
323
395
|
### Gate Behavior
|
|
324
396
|
When the session appears to be ending:
|
|
325
|
-
1. **Remind**: "You set out to produce
|
|
397
|
+
1. **Remind**: "You set out to produce `.prizmkit/plans/feature-list.json` but we haven't completed it yet."
|
|
326
398
|
2. **Offer 3 options**:
|
|
327
399
|
- **(a) Continue to completion**
|
|
328
400
|
- **(b) Save draft & exit** — write current progress as draft
|
|
@@ -21,7 +21,7 @@ Group errors by type and apply targeted fixes:
|
|
|
21
21
|
|
|
22
22
|
| Error Type | Symptom | Fix Offered | Auto-Fix? |
|
|
23
23
|
|-----------|---------|------------|-----------|
|
|
24
|
-
| **Schema mismatch** | `$schema` invalid, missing `
|
|
24
|
+
| **Schema mismatch** | `$schema` invalid, missing `project_name`, wrong `features` type | "Set `$schema` to `dev-pipeline-feature-list-v1`, `project_name` to string" | Yes |
|
|
25
25
|
| **Feature ID issues** | Invalid format (not `F-NNN`), duplicate IDs, undefined refs | "Suggest corrected IDs, show duplicates" | Yes |
|
|
26
26
|
| **Dependency errors** | Circular dependency, undefined target features | "Show cycle chain (e.g., `F-003 → F-005 → F-003`), suggest break point" | No |
|
|
27
27
|
| **Missing fields** | Feature missing required keys (title, description, AC) | "List each feature + missing keys, guide patch" | Partial |
|
|
@@ -90,20 +90,20 @@ If in Incremental mode but existing `feature-list.json` not found:
|
|
|
90
90
|
|
|
91
91
|
### Artifact Path Convention
|
|
92
92
|
|
|
93
|
-
**CRITICAL PATH RULE**: `feature-list.json` MUST be written to
|
|
94
|
-
(
|
|
93
|
+
**CRITICAL PATH RULE**: `feature-list.json` MUST be written to `.prizmkit/plans/` directory
|
|
94
|
+
(unified artifact location).
|
|
95
95
|
|
|
96
|
-
Before writing, verify: `ls
|
|
97
|
-
directory, you are at the project root.
|
|
96
|
+
Before writing, verify: `ls .prizmkit 2>/dev/null` — if this directory exists in the current
|
|
97
|
+
directory, you are at the project root. If not, create `.prizmkit/plans/` first (mkdir -p .prizmkit/plans).
|
|
98
98
|
|
|
99
|
-
After writing, verify: `ls -la feature-list.json` from project root.
|
|
99
|
+
After writing, verify: `ls -la .prizmkit/plans/feature-list.json` from project root.
|
|
100
100
|
|
|
101
101
|
```
|
|
102
102
|
<project-root>/
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
└── .prizmkit/plans/
|
|
104
|
+
├── feature-list.json # Primary output (always here, at .prizmkit/plans/)
|
|
105
105
|
├── feature-list.validated.json # Checkpoint backup after CP-FP-5
|
|
106
106
|
└── <ISO-timestamp>.backup.json # Optional incremental backups
|
|
107
107
|
```
|
|
108
108
|
|
|
109
|
-
The pipeline reads `feature-list.json` from
|
|
109
|
+
The pipeline reads `feature-list.json` from `.prizmkit/plans/` by default. If the user specifies a custom path, the launcher accepts it as an argument.
|
|
@@ -4,15 +4,15 @@ validate-and-generate.py - Validate and generate feature-list.json files
|
|
|
4
4
|
for the dev-pipeline system.
|
|
5
5
|
|
|
6
6
|
Commands:
|
|
7
|
-
validate Validate an existing feature-list.json
|
|
8
|
-
template Generate a blank template feature-list.json
|
|
9
|
-
summary Print a summary table of features from a feature-list.json
|
|
7
|
+
validate Validate an existing .prizmkit/plans/feature-list.json
|
|
8
|
+
template Generate a blank template .prizmkit/plans/feature-list.json
|
|
9
|
+
summary Print a summary table of features from a .prizmkit/plans/feature-list.json
|
|
10
10
|
grade Generate grading results from eval runs (for npm run skill:review)
|
|
11
11
|
|
|
12
12
|
Usage:
|
|
13
|
-
python3 validate-and-generate.py validate --input feature-list.json [--output validated.json] [--mode new|incremental]
|
|
14
|
-
python3 validate-and-generate.py template --output feature-list.json
|
|
15
|
-
python3 validate-and-generate.py summary --input feature-list.json [--format markdown|json]
|
|
13
|
+
python3 validate-and-generate.py validate --input .prizmkit/plans/feature-list.json [--output validated.json] [--mode new|incremental]
|
|
14
|
+
python3 validate-and-generate.py template --output .prizmkit/plans/feature-list.json
|
|
15
|
+
python3 validate-and-generate.py summary --input .prizmkit/plans/feature-list.json [--format markdown|json]
|
|
16
16
|
python3 validate-and-generate.py grade --workspace /.codebuddy/skill-evals/feature-planner-workspace --iteration iteration-1
|
|
17
17
|
|
|
18
18
|
Python 3.6+ required. No external dependencies.
|
|
@@ -174,9 +174,10 @@ def validate_feature_list(data, planning_mode="new"):
|
|
|
174
174
|
"$schema must be '{}', got '{}'".format(SCHEMA_VERSION, schema)
|
|
175
175
|
)
|
|
176
176
|
|
|
177
|
-
|
|
177
|
+
# Support both project_name (canonical) and app_name (legacy)
|
|
178
|
+
app_name = data.get("project_name", data.get("app_name"))
|
|
178
179
|
if not isinstance(app_name, str) or not app_name.strip():
|
|
179
|
-
errors.append("
|
|
180
|
+
errors.append("project_name must be a non-empty string")
|
|
180
181
|
|
|
181
182
|
features = data.get("features")
|
|
182
183
|
if not isinstance(features, list) or len(features) == 0:
|
|
@@ -441,8 +442,8 @@ def generate_template():
|
|
|
441
442
|
|
|
442
443
|
return {
|
|
443
444
|
"$schema": SCHEMA_VERSION,
|
|
444
|
-
"
|
|
445
|
-
"
|
|
445
|
+
"project_name": "YOUR_PROJECT_NAME",
|
|
446
|
+
"project_description": "YOUR_PROJECT_DESCRIPTION",
|
|
446
447
|
"created_at": now,
|
|
447
448
|
"created_by": "feature-planner",
|
|
448
449
|
"source_spec": "",
|
|
@@ -545,7 +546,7 @@ def _build_dependency_graph_text(features):
|
|
|
545
546
|
|
|
546
547
|
def generate_summary_markdown(data):
|
|
547
548
|
"""Generate a markdown summary of the feature list."""
|
|
548
|
-
app_name = data.get("app_name", "Unknown")
|
|
549
|
+
app_name = data.get("project_name", data.get("app_name", "Unknown"))
|
|
549
550
|
features = data.get("features", [])
|
|
550
551
|
|
|
551
552
|
lines = []
|
|
@@ -634,7 +635,7 @@ def generate_summary_json(data):
|
|
|
634
635
|
})
|
|
635
636
|
|
|
636
637
|
return {
|
|
637
|
-
"
|
|
638
|
+
"project_name": data.get("project_name", data.get("app_name", "")),
|
|
638
639
|
"features": feature_summaries,
|
|
639
640
|
"stats": {
|
|
640
641
|
"total_features": len(features),
|
|
@@ -846,16 +847,16 @@ def cmd_grade(args):
|
|
|
846
847
|
|
|
847
848
|
def main():
|
|
848
849
|
parser = argparse.ArgumentParser(
|
|
849
|
-
description="Validate and generate feature-list.json files for the dev-pipeline system.",
|
|
850
|
+
description="Validate and generate .prizmkit/plans/feature-list.json files for the dev-pipeline system.",
|
|
850
851
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
851
852
|
epilog=(
|
|
852
853
|
"Examples:\n"
|
|
853
|
-
" %(prog)s validate --input feature-list.json\n"
|
|
854
|
-
" %(prog)s validate --input feature-list.json --mode incremental\n"
|
|
855
|
-
" %(prog)s validate --input feature-list.json --output validated.json\n"
|
|
856
|
-
" %(prog)s template --output feature-list.json\n"
|
|
857
|
-
" %(prog)s summary --input feature-list.json\n"
|
|
858
|
-
" %(prog)s summary --input feature-list.json --format json\n"
|
|
854
|
+
" %(prog)s validate --input .prizmkit/plans/feature-list.json\n"
|
|
855
|
+
" %(prog)s validate --input .prizmkit/plans/feature-list.json --mode incremental\n"
|
|
856
|
+
" %(prog)s validate --input .prizmkit/plans/feature-list.json --output validated.json\n"
|
|
857
|
+
" %(prog)s template --output .prizmkit/plans/feature-list.json\n"
|
|
858
|
+
" %(prog)s summary --input .prizmkit/plans/feature-list.json\n"
|
|
859
|
+
" %(prog)s summary --input .prizmkit/plans/feature-list.json --format json\n"
|
|
859
860
|
),
|
|
860
861
|
)
|
|
861
862
|
|
|
@@ -864,10 +865,10 @@ def main():
|
|
|
864
865
|
# -- validate --
|
|
865
866
|
p_validate = subparsers.add_parser(
|
|
866
867
|
"validate",
|
|
867
|
-
help="Validate an existing feature-list.json",
|
|
868
|
+
help="Validate an existing .prizmkit/plans/feature-list.json",
|
|
868
869
|
)
|
|
869
870
|
p_validate.add_argument(
|
|
870
|
-
"--input", required=True, help="Path to input feature-list.json"
|
|
871
|
+
"--input", required=True, help="Path to input .prizmkit/plans/feature-list.json"
|
|
871
872
|
)
|
|
872
873
|
p_validate.add_argument(
|
|
873
874
|
"--output", help="Path to write validated output (optional)"
|
|
@@ -882,7 +883,7 @@ def main():
|
|
|
882
883
|
# -- template --
|
|
883
884
|
p_template = subparsers.add_parser(
|
|
884
885
|
"template",
|
|
885
|
-
help="Generate a blank template feature-list.json",
|
|
886
|
+
help="Generate a blank template .prizmkit/plans/feature-list.json",
|
|
886
887
|
)
|
|
887
888
|
p_template.add_argument(
|
|
888
889
|
"--output", required=True, help="Path to write template file"
|
|
@@ -891,10 +892,10 @@ def main():
|
|
|
891
892
|
# -- summary --
|
|
892
893
|
p_summary = subparsers.add_parser(
|
|
893
894
|
"summary",
|
|
894
|
-
help="Print a summary table of features from a feature-list.json",
|
|
895
|
+
help="Print a summary table of features from a .prizmkit/plans/feature-list.json",
|
|
895
896
|
)
|
|
896
897
|
p_summary.add_argument(
|
|
897
|
-
"--input", required=True, help="Path to input feature-list.json"
|
|
898
|
+
"--input", required=True, help="Path to input .prizmkit/plans/feature-list.json"
|
|
898
899
|
)
|
|
899
900
|
p_summary.add_argument(
|
|
900
901
|
"--format",
|