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.
Files changed (63) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/dev-pipeline/README.md +65 -65
  3. package/bundled/dev-pipeline/assets/feature-list-example.json +2 -2
  4. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +11 -10
  5. package/bundled/dev-pipeline/launch-feature-daemon.sh +12 -11
  6. package/bundled/dev-pipeline/launch-refactor-daemon.sh +11 -10
  7. package/bundled/dev-pipeline/reset-bug.sh +305 -0
  8. package/bundled/dev-pipeline/reset-feature.sh +9 -8
  9. package/bundled/dev-pipeline/reset-refactor.sh +10 -9
  10. package/bundled/dev-pipeline/retry-bugfix.sh +7 -6
  11. package/bundled/dev-pipeline/retry-feature.sh +7 -6
  12. package/bundled/dev-pipeline/retry-refactor.sh +7 -6
  13. package/bundled/dev-pipeline/run-bugfix.sh +71 -23
  14. package/bundled/dev-pipeline/run-feature.sh +30 -21
  15. package/bundled/dev-pipeline/run-refactor.sh +21 -17
  16. package/bundled/dev-pipeline/scripts/cleanup-logs.py +2 -2
  17. package/bundled/dev-pipeline/scripts/detect-stuck.py +3 -3
  18. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +26 -14
  19. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +6 -6
  20. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +6 -6
  21. package/bundled/dev-pipeline/scripts/init-bugfix-pipeline.py +4 -4
  22. package/bundled/dev-pipeline/scripts/init-pipeline.py +26 -12
  23. package/bundled/dev-pipeline/scripts/init-refactor-pipeline.py +4 -4
  24. package/bundled/dev-pipeline/scripts/update-bug-status.py +10 -10
  25. package/bundled/dev-pipeline/scripts/update-feature-status.py +31 -31
  26. package/bundled/dev-pipeline/scripts/update-refactor-status.py +8 -8
  27. package/bundled/dev-pipeline/templates/bug-fix-list-schema.json +111 -31
  28. package/bundled/dev-pipeline/templates/feature-list-schema.json +91 -25
  29. package/bundled/dev-pipeline/templates/refactor-list-schema.json +107 -28
  30. package/bundled/dev-pipeline/tests/test_auto_skip.py +1 -1
  31. package/bundled/skills/_metadata.json +10 -2
  32. package/bundled/skills/app-planner/SKILL.md +24 -13
  33. package/bundled/skills/app-planner/references/project-brief-guide.md +1 -1
  34. package/bundled/skills/bug-fix-workflow/SKILL.md +7 -5
  35. package/bundled/skills/bug-planner/SKILL.md +80 -25
  36. package/bundled/skills/bug-planner/scripts/validate-bug-list.py +3 -3
  37. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +38 -33
  38. package/bundled/skills/feature-pipeline-launcher/SKILL.md +33 -33
  39. package/bundled/skills/feature-pipeline-launcher/scripts/preflight-check.py +3 -3
  40. package/bundled/skills/feature-planner/SKILL.md +96 -24
  41. package/bundled/skills/feature-planner/references/error-recovery.md +9 -9
  42. package/bundled/skills/feature-planner/scripts/validate-and-generate.py +25 -24
  43. package/bundled/skills/feature-workflow/SKILL.md +23 -20
  44. package/bundled/skills/prizmkit-committer/SKILL.md +1 -0
  45. package/bundled/skills/prizmkit-deploy/SKILL.md +1 -0
  46. package/bundled/skills/prizmkit-deploy/assets/deploy-template.md +1 -1
  47. package/bundled/skills/prizmkit-implement/SKILL.md +1 -1
  48. package/bundled/skills/prizmkit-implement/references/deploy-guide-protocol.md +4 -4
  49. package/bundled/skills/prizmkit-plan/SKILL.md +3 -3
  50. package/bundled/skills/prizmkit-retrospective/SKILL.md +40 -3
  51. package/bundled/skills/prizmkit-verify/SKILL.md +281 -0
  52. package/bundled/skills/prizmkit-verify/scripts/verify-light.py +402 -0
  53. package/bundled/skills/recovery-workflow/SKILL.md +15 -14
  54. package/bundled/skills/recovery-workflow/evals/evals.json +5 -5
  55. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +43 -10
  56. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +38 -34
  57. package/bundled/skills/refactor-planner/SKILL.md +74 -24
  58. package/bundled/skills/refactor-planner/scripts/validate-and-generate-refactor.py +17 -17
  59. package/bundled/skills/refactor-workflow/SKILL.md +24 -20
  60. package/package.json +1 -1
  61. package/src/clean.js +4 -4
  62. package/src/gitignore-template.js +7 -8
  63. 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**: `feature-list.json` must exist in project root (or user-specified path)
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 `feature-list.json` is missing, inform user:
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 dev-pipeline/state \
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 `feature-list.json` and `.prizmkit/config.json`
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 dev-pipeline/state/pipeline-daemon.log
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 dev-pipeline/state \
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 dev-pipeline/state/pipeline-daemon.log
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 dev-pipeline/state/pipeline-daemon.log
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 dev-pipeline/state/pipeline-daemon.log
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 dev-pipeline/state/features/<FEATURE_ID>/status.json 2>/dev/null
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 dev-pipeline/state/features/<FEATURE_ID>/sessions/<SESSION_ID>/logs/session.log
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
- | `feature-list.json` not found | Tell user to run `feature-planner` skill first |
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 dev-pipeline/state/pipeline-daemon.log` |
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 `feature-list.json`, suggest launching the pipeline.
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 (`state/` vs `bugfix-state/`), so they can run simultaneously without conflict.
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 `feature-list.json` that conforms to `dev-pipeline-feature-list`.
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 `feature-list.json`
38
+ - Execute any implementation action beyond writing `.prizmkit/plans/feature-list.json`
39
39
 
40
40
  **Your ONLY writable outputs are:**
41
- 1. `feature-list.json` (project root)
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 `feature-list.json`
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
- - existing `feature-list.json` (required for incremental mode)
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 `feature-list.json`.
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 `feature-list.json` yet.
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 `feature-list.json`
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 `feature-list.json` and wants to add or adjust features.
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 `feature-list.json` first (if missing, ask whether to start new plan)
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 `feature-list.json`
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** | `feature-list.json` Generated | Schema validates, all required keys present | 7-8 |
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 `feature-list.json`, review the full feature set holistically. Individual features may look fine in isolation but have gaps when viewed together.
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 `feature-list.json` and confirm scope
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
- `feature-list.json` must satisfy:
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
- - `feature-list.json` MUST be written to project root (same level as `package.json` / `.git`)
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 `feature-list.json` written in this session
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 `feature-list.json` but we haven't completed it yet."
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 `app_name`, wrong `features` type | "Set `$schema` to `dev-pipeline-feature-list-v1`, `app_name` to string" | Yes |
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 the project root directory
94
- (same level as `package.json` / `.git`).
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 package.json .git 2>/dev/null` — if these exist in the current
97
- directory, you are at the project root. NEVER write to `dev-pipeline/` or any subdirectory.
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
- ├── feature-list.json # Primary output (always here, at project root)
104
- └── .prizmkit/planning/ # Optional organization for backups
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 the project root by default. If the user specifies a custom path, the launcher accepts it as an argument.
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
- app_name = data.get("app_name")
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("app_name must be a non-empty string")
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
- "app_name": "YOUR_APP_NAME",
445
- "app_description": "YOUR_APP_DESCRIPTION",
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
- "app_name": data.get("app_name", ""),
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",