prizmkit 1.1.42 → 1.1.47

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 (88) hide show
  1. package/bundled/VERSION.json +3 -3
  2. package/bundled/adapters/claude/settings-adapter.js +4 -4
  3. package/bundled/adapters/codebuddy/settings-adapter.js +1 -1
  4. package/bundled/agents/prizm-dev-team-critic.md +9 -9
  5. package/bundled/agents/prizm-dev-team-dev.md +13 -13
  6. package/bundled/agents/prizm-dev-team-reviewer.md +2 -2
  7. package/bundled/dev-pipeline/.env.example +6 -6
  8. package/bundled/dev-pipeline/README.md +32 -32
  9. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +1 -1
  10. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +6 -3
  11. package/bundled/dev-pipeline/launch-feature-daemon.sh +6 -3
  12. package/bundled/dev-pipeline/launch-refactor-daemon.sh +6 -3
  13. package/bundled/dev-pipeline/lib/common.sh +36 -7
  14. package/bundled/dev-pipeline/reset-bug.sh +9 -7
  15. package/bundled/dev-pipeline/reset-feature.sh +9 -7
  16. package/bundled/dev-pipeline/reset-refactor.sh +9 -7
  17. package/bundled/dev-pipeline/run-bugfix.sh +25 -24
  18. package/bundled/dev-pipeline/run-feature.sh +29 -32
  19. package/bundled/dev-pipeline/run-recovery.sh +22 -4
  20. package/bundled/dev-pipeline/run-refactor.sh +27 -28
  21. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +14 -14
  22. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +9 -4
  23. package/bundled/dev-pipeline/scripts/generate-recovery-prompt.py +18 -12
  24. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +9 -4
  25. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +1 -1
  26. package/bundled/dev-pipeline/scripts/update-bug-status.py +9 -1
  27. package/bundled/dev-pipeline/scripts/update-feature-status.py +13 -1
  28. package/bundled/dev-pipeline/scripts/update-refactor-status.py +9 -1
  29. package/bundled/dev-pipeline/templates/agent-prompts/critic-plan-challenge.md +1 -1
  30. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +2 -2
  31. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +8 -8
  32. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +11 -11
  33. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +9 -9
  34. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +6 -6
  35. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +3 -3
  36. package/bundled/dev-pipeline/templates/sections/phase-commit-full.md +5 -5
  37. package/bundled/dev-pipeline/templates/sections/phase-commit.md +6 -6
  38. package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-agent-suffix.md +1 -1
  39. package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-base.md +1 -1
  40. package/bundled/dev-pipeline/templates/sections/phase-specify-plan-full.md +2 -2
  41. package/bundled/dev-pipeline/templates/sections/phase0-init.md +1 -1
  42. package/bundled/dev-pipeline/tests/test-path-resolution.sh +100 -0
  43. package/bundled/rules/USAGE.md +2 -2
  44. package/bundled/rules/_rules-metadata.json +1 -1
  45. package/bundled/rules/prizm/prizm-commit-workflow.md +1 -1
  46. package/bundled/rules/prizm/prizm-documentation.md +4 -4
  47. package/bundled/rules/prizm/prizm-progressive-loading.md +3 -3
  48. package/bundled/skills/_metadata.json +4 -4
  49. package/bundled/skills/app-planner/SKILL.md +35 -7
  50. package/bundled/skills/bug-fix-workflow/SKILL.md +6 -6
  51. package/bundled/skills/bug-planner/SKILL.md +5 -5
  52. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +21 -21
  53. package/bundled/skills/feature-pipeline-launcher/SKILL.md +21 -21
  54. package/bundled/skills/feature-planner/SKILL.md +5 -5
  55. package/bundled/skills/feature-workflow/SKILL.md +8 -8
  56. package/bundled/skills/prizm-kit/SKILL.md +10 -10
  57. package/bundled/skills/prizmkit-committer/SKILL.md +2 -2
  58. package/bundled/skills/prizmkit-implement/SKILL.md +2 -2
  59. package/bundled/skills/prizmkit-init/SKILL.md +17 -18
  60. package/bundled/skills/prizmkit-plan/SKILL.md +3 -3
  61. package/bundled/skills/prizmkit-plan/references/verification-checklist.md +2 -2
  62. package/bundled/skills/prizmkit-prizm-docs/SKILL.md +17 -17
  63. package/bundled/skills/prizmkit-prizm-docs/assets/prizm-docs-format.md +45 -45
  64. package/bundled/skills/prizmkit-prizm-docs/references/op-init.md +9 -9
  65. package/bundled/skills/prizmkit-prizm-docs/references/op-rebuild.md +1 -1
  66. package/bundled/skills/prizmkit-prizm-docs/references/op-status.md +2 -2
  67. package/bundled/skills/prizmkit-prizm-docs/references/op-update.md +3 -3
  68. package/bundled/skills/prizmkit-prizm-docs/references/op-validate.md +1 -1
  69. package/bundled/skills/prizmkit-retrospective/SKILL.md +10 -10
  70. package/bundled/skills/prizmkit-retrospective/references/knowledge-injection-steps.md +3 -3
  71. package/bundled/skills/prizmkit-retrospective/references/structural-sync-steps.md +1 -1
  72. package/bundled/skills/recovery-workflow/SKILL.md +15 -15
  73. package/bundled/skills/recovery-workflow/scripts/detect-recovery-state.py +0 -1
  74. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +21 -21
  75. package/bundled/skills/refactor-planner/SKILL.md +6 -6
  76. package/bundled/skills/refactor-workflow/SKILL.md +9 -9
  77. package/bundled/team/prizm-dev-team.json +1 -1
  78. package/bundled/templates/hooks/commit-intent.json +2 -2
  79. package/bundled/templates/hooks/diff-prizm-docs.sh +8 -8
  80. package/bundled/templates/hooks/prizm-pre-commit.sh +4 -4
  81. package/bundled/templates/hooks/validate-prizm-docs.sh +4 -4
  82. package/bundled/templates/project-memory-template.md +4 -4
  83. package/package.json +1 -1
  84. package/src/clean.js +1 -3
  85. package/src/config.js +1 -1
  86. package/src/gitignore-template.js +4 -59
  87. package/src/scaffold.js +12 -11
  88. package/src/upgrade.js +3 -3
@@ -33,8 +33,12 @@ set -euo pipefail
33
33
  # ============================================================
34
34
 
35
35
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
36
- PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
37
- STATE_DIR="${PROJECT_ROOT}/.prizmkit/state/refactor"
36
+
37
+ # Source shared common helpers (exports PIPELINE_DIR/PRIZMKIT_DIR/PROJECT_ROOT,
38
+ # CLI/platform detection, logs, deps)
39
+ source "$SCRIPT_DIR/lib/common.sh"
40
+
41
+ STATE_DIR="${PRIZMKIT_DIR}/state/refactor"
38
42
  SCRIPTS_DIR="$SCRIPT_DIR/scripts"
39
43
 
40
44
  # Configuration
@@ -55,7 +59,6 @@ STRICT_BEHAVIOR_CHECK=${STRICT_BEHAVIOR_CHECK:-1}
55
59
  ENABLE_DEPLOY=${ENABLE_DEPLOY:-0}
56
60
 
57
61
  # Source shared common helpers (CLI/platform detection + logs + deps)
58
- source "$SCRIPT_DIR/lib/common.sh"
59
62
  prizm_detect_cli_and_platform
60
63
 
61
64
  # Source shared heartbeat library
@@ -192,7 +195,7 @@ spawn_and_wait_session() {
192
195
  # ── Determine session outcome from observable signals ──────────────
193
196
  local session_status
194
197
  local project_root
195
- project_root="$(cd "$SCRIPT_DIR/.." && pwd)"
198
+ project_root="$PROJECT_ROOT"
196
199
  local default_branch="$base_branch"
197
200
 
198
201
  if [[ $exit_code -eq 124 ]]; then
@@ -276,15 +279,13 @@ spawn_and_wait_session() {
276
279
 
277
280
  # Validate key artifacts exist after successful session
278
281
  if [[ "$session_status" == "success" ]]; then
279
- local _artifact_root
280
- _artifact_root="$(cd "$SCRIPT_DIR/.." && pwd)"
281
- local plan_file="$_artifact_root/.prizmkit/refactor/$refactor_id/plan.md"
282
+ local plan_file="$PRIZMKIT_DIR/refactor/$refactor_id/plan.md"
282
283
  if [[ ! -f "$plan_file" ]]; then
283
284
  log_warn "ARTIFACT_MISSING: plan.md not found at $plan_file"
284
285
  fi
285
286
 
286
287
  # Validate checkpoint completeness
287
- local checkpoint_file="$_artifact_root/.prizmkit/refactor/$refactor_id/workflow-checkpoint.json"
288
+ local checkpoint_file="$PRIZMKIT_DIR/refactor/$refactor_id/workflow-checkpoint.json"
288
289
  if [[ -f "$checkpoint_file" ]]; then
289
290
  local checkpoint_result
290
291
  checkpoint_result=$(python3 -c "
@@ -329,7 +330,7 @@ sys.exit(0)
329
330
 
330
331
  # Propagate completion notes for dependency context (only on success)
331
332
  if [[ "$session_status" == "success" ]]; then
332
- local summary_path="$project_root/.prizmkit/refactor/$refactor_id/completion-summary.json"
333
+ local summary_path="$PRIZMKIT_DIR/refactor/$refactor_id/completion-summary.json"
333
334
  if [[ -f "$summary_path" ]]; then
334
335
  python3 "$SCRIPTS_DIR/patch-completion-notes.py" \
335
336
  --refactor-list "$refactor_list" \
@@ -406,7 +407,7 @@ for item in data.get('refactors', []):
406
407
  fi
407
408
 
408
409
  # GUARANTEED: always return to original branch (save WIP on dev branch first)
409
- branch_ensure_return "$(cd "$SCRIPT_DIR/.." && pwd)" "$_ORIGINAL_BRANCH" "$_DEV_BRANCH_NAME"
410
+ branch_ensure_return "$PROJECT_ROOT" "$_ORIGINAL_BRANCH" "$_DEV_BRANCH_NAME"
410
411
 
411
412
  log_info "Refactor pipeline paused. Run './run-refactor.sh run' to resume."
412
413
  exit 130
@@ -420,7 +421,7 @@ trap cleanup SIGINT SIGTERM
420
421
  check_dependencies() {
421
422
  prizm_check_common_dependencies "$CLI_CMD"
422
423
  local _project_root
423
- _project_root="$(cd "$SCRIPT_DIR/.." && pwd)"
424
+ _project_root="$PROJECT_ROOT"
424
425
  prizm_ensure_git_repo "$_project_root"
425
426
  }
426
427
 
@@ -493,7 +494,7 @@ run_one() {
493
494
  fi
494
495
 
495
496
  if [[ -z "$refactor_list" ]]; then
496
- refactor_list=".prizmkit/plans/refactor-list.json"
497
+ refactor_list="$PRIZMKIT_DIR/plans/refactor-list.json"
497
498
  fi
498
499
  if [[ ! "$refactor_list" = /* ]]; then
499
500
  refactor_list="$(pwd)/$refactor_list"
@@ -546,9 +547,9 @@ run_one() {
546
547
 
547
548
  # Ensure state directory is gitignored
548
549
  local _gitignore_path
549
- _gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
550
+ _gitignore_path="$PROJECT_ROOT/.gitignore"
550
551
  local _state_rel
551
- _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/refactor")
552
+ _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$PROJECT_ROOT'))" 2>/dev/null || echo ".prizmkit/state/refactor")
552
553
  if [[ -f "$_gitignore_path" ]]; then
553
554
  if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
554
555
  printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
@@ -594,9 +595,9 @@ sys.exit(1)
594
595
  log_info "Cleaning artifacts for $refactor_id..."
595
596
 
596
597
  local project_root
597
- project_root="$(cd "$SCRIPT_DIR/.." && pwd)"
598
+ project_root="$PROJECT_ROOT"
598
599
 
599
- local refactor_dir="$project_root/.prizmkit/refactor/$refactor_id"
600
+ local refactor_dir="$PRIZMKIT_DIR/refactor/$refactor_id"
600
601
  if [[ -d "$refactor_dir" ]]; then
601
602
  rm -rf "$refactor_dir"
602
603
  log_info "Removed $refactor_dir"
@@ -776,7 +777,7 @@ else:
776
777
  fi
777
778
 
778
779
  # GUARANTEED: always return to original branch (save WIP on dev branch first)
779
- branch_ensure_return "$(cd "$SCRIPT_DIR/.." && pwd)" "$_ORIGINAL_BRANCH" "$_DEV_BRANCH_NAME"
780
+ branch_ensure_return "$PROJECT_ROOT" "$_ORIGINAL_BRANCH" "$_DEV_BRANCH_NAME"
780
781
  exit 130
781
782
  }
782
783
  trap cleanup_single_refactor SIGINT SIGTERM
@@ -785,7 +786,7 @@ else:
785
786
 
786
787
  # Branch lifecycle: create and checkout refactor branch
787
788
  local _proj_root
788
- _proj_root="$(cd "$SCRIPT_DIR/.." && pwd)"
789
+ _proj_root="$PROJECT_ROOT"
789
790
  local _source_branch
790
791
  _source_branch=$(git -C "$_proj_root" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")
791
792
  _ORIGINAL_BRANCH="$_source_branch"
@@ -853,7 +854,7 @@ else:
853
854
  # ============================================================
854
855
 
855
856
  main() {
856
- local refactor_list="${1:-.prizmkit/plans/refactor-list.json}"
857
+ local refactor_list="${1:-$PRIZMKIT_DIR/plans/refactor-list.json}"
857
858
 
858
859
  if [[ ! "$refactor_list" = /* ]]; then
859
860
  refactor_list="$(pwd)/$refactor_list"
@@ -908,9 +909,9 @@ main() {
908
909
 
909
910
  # Ensure state directory is gitignored
910
911
  local _gitignore_path
911
- _gitignore_path="$(cd "$SCRIPT_DIR/.." && pwd)/.gitignore"
912
+ _gitignore_path="$PROJECT_ROOT/.gitignore"
912
913
  local _state_rel
913
- _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$(cd "$SCRIPT_DIR/.." && pwd)'))" 2>/dev/null || echo ".prizmkit/state/refactor")
914
+ _state_rel=$(python3 -c "import os; print(os.path.relpath('$STATE_DIR', '$PROJECT_ROOT'))" 2>/dev/null || echo ".prizmkit/state/refactor")
914
915
  if [[ -f "$_gitignore_path" ]]; then
915
916
  if ! grep -qF "$_state_rel" "$_gitignore_path" 2>/dev/null; then
916
917
  printf '\n# Pipeline runtime state (auto-added by dev-pipeline)\n%s/\n' "$_state_rel" >> "$_gitignore_path"
@@ -951,7 +952,7 @@ main() {
951
952
 
952
953
  # Branch lifecycle: per-refactor branches (like feature pipeline)
953
954
  local _proj_root
954
- _proj_root="$(cd "$SCRIPT_DIR/.." && pwd)"
955
+ _proj_root="$PROJECT_ROOT"
955
956
  local _source_branch
956
957
  _source_branch=$(git -C "$_proj_root" rev-parse --abbrev-ref HEAD 2>/dev/null || echo "main")
957
958
  _ORIGINAL_BRANCH="$_source_branch"
@@ -1194,9 +1195,7 @@ DEPLOY_PROMPT_EOF
1194
1195
 
1195
1196
  # Validate key artifacts after successful session
1196
1197
  if [[ "$_SPAWN_RESULT" == "success" ]]; then
1197
- local _artifact_root
1198
- _artifact_root="$(cd "$SCRIPT_DIR/.." && pwd)"
1199
- local plan_file="$_artifact_root/.prizmkit/refactor/$refactor_id/plan.md"
1198
+ local plan_file="$PRIZMKIT_DIR/refactor/$refactor_id/plan.md"
1200
1199
  if [[ ! -f "$plan_file" ]]; then
1201
1200
  log_warn "ARTIFACT_MISSING: plan.md not found at $plan_file"
1202
1201
  else
@@ -1314,7 +1313,7 @@ case "${1:-run}" in
1314
1313
  if [[ "${1:-}" =~ ^[Rr]-[0-9]+ ]]; then
1315
1314
  run_one "$@"
1316
1315
  else
1317
- main "${1:-.prizmkit/plans/refactor-list.json}"
1316
+ main "${1:-$PRIZMKIT_DIR/plans/refactor-list.json}"
1318
1317
  fi
1319
1318
  ;;
1320
1319
  status)
@@ -1324,7 +1323,7 @@ case "${1:-run}" in
1324
1323
  exit 1
1325
1324
  fi
1326
1325
  python3 "$SCRIPTS_DIR/update-refactor-status.py" \
1327
- --refactor-list "${2:-.prizmkit/plans/refactor-list.json}" \
1326
+ --refactor-list "${2:-$PRIZMKIT_DIR/plans/refactor-list.json}" \
1328
1327
  --state-dir "$STATE_DIR" \
1329
1328
  --action status
1330
1329
  ;;
@@ -1339,7 +1338,7 @@ case "${1:-run}" in
1339
1338
  log_error "No refactor pipeline state found. Run './run-refactor.sh run' first."
1340
1339
  exit 1
1341
1340
  fi
1342
- _unskip_refactor_list=".prizmkit/plans/refactor-list.json"
1341
+ _unskip_refactor_list="$PRIZMKIT_DIR/plans/refactor-list.json"
1343
1342
  _unskip_refactor_id=""
1344
1343
  shift || true
1345
1344
  # Parse arguments: optional refactor-id and refactor-list path
@@ -416,17 +416,17 @@ def _read_project_brief(project_root):
416
416
 
417
417
 
418
418
  def resolve_project_root(script_dir):
419
- """Resolve project root as the parent directory of dev-pipeline/.
419
+ """Resolve project root from script_dir of the prompt-generator script.
420
420
 
421
- The script lives at dev-pipeline/scripts/, so project root is two
422
- levels up from the script directory.
421
+ Layout-aware:
422
+ <project>/.prizmkit/dev-pipeline/scripts/ → project root = <project>
423
+ <repo>/dev-pipeline/scripts/ → project root = <repo>
423
424
  """
424
- # script_dir = .../dev-pipeline/scripts
425
- # dev_pipeline_dir = .../dev-pipeline
426
- # project_root = .../
427
- dev_pipeline_dir = os.path.dirname(script_dir)
428
- project_root = os.path.dirname(dev_pipeline_dir)
429
- return os.path.abspath(project_root)
425
+ pipeline_dir = os.path.dirname(script_dir)
426
+ pipeline_parent = os.path.dirname(pipeline_dir)
427
+ if os.path.basename(pipeline_parent) == ".prizmkit":
428
+ return os.path.abspath(os.path.dirname(pipeline_parent))
429
+ return os.path.abspath(pipeline_parent)
430
430
 
431
431
 
432
432
  def process_conditional_blocks(content, resume_phase):
@@ -557,7 +557,7 @@ def process_mode_blocks(content, pipeline_mode, init_done, critic_enabled=False,
557
557
 
558
558
  def detect_init_status(project_root):
559
559
  """Check if PrizmKit init has already been done."""
560
- prizm_docs = os.path.join(project_root, ".prizm-docs", "root.prizm")
560
+ prizm_docs = os.path.join(project_root, ".prizmkit/prizm-docs", "root.prizm")
561
561
  prizmkit_config = os.path.join(project_root, ".prizmkit", "config.json")
562
562
  return os.path.isfile(prizm_docs) and os.path.isfile(prizmkit_config)
563
563
 
@@ -587,7 +587,7 @@ def determine_pipeline_mode(complexity):
587
587
  Tier assignment rationale:
588
588
  - low + medium → lite (single agent): most features don't benefit from
589
589
  the orchestrator→dev→reviewer overhead. A single agent reading
590
- .prizm-docs + implementing directly is faster and cheaper.
590
+ .prizmkit/prizm-docs + implementing directly is faster and cheaper.
591
591
  - high → standard (orchestrator + dev + reviewer): complex features
592
592
  need the spec→plan→analyze→implement→review pipeline.
593
593
  - critical → full (full team + framework guardrails): architectural
@@ -612,7 +612,7 @@ def determine_pipeline_mode(complexity):
612
612
  # merge_checkpoint_state() never collides.
613
613
  SECTION_TO_SKILL = {
614
614
  "phase0-init": ("prizmkit-init", "Project Bootstrap",
615
- [".prizm-docs/root.prizm", ".prizmkit/config.json"]),
615
+ [".prizmkit/prizm-docs/root.prizm", ".prizmkit/config.json"]),
616
616
  "phase0-test-baseline": ("test-baseline", "Test Baseline", []),
617
617
  "phase-context-snapshot": ("context-snapshot", "Build Context Snapshot",
618
618
  [".prizmkit/specs/{slug}/context-snapshot.md"]),
@@ -1239,8 +1239,8 @@ def build_replacements(args, feature, features, global_context, script_dir):
1239
1239
  "Run `npx prizmkit install` to reinstall agent definitions.",
1240
1240
  agent_path, agent_name,
1241
1241
  )
1242
- # Validator scripts - check if they exist in .codebuddy/scripts/, otherwise use dev-pipeline/scripts/
1243
- validator_scripts_dir = os.path.join(project_root, "dev-pipeline", "scripts")
1242
+ # Validator scripts - check if they exist in .codebuddy/scripts/, otherwise use .prizmkit/dev-pipeline/scripts/
1243
+ validator_scripts_dir = os.path.join(project_root, ".prizmkit", "dev-pipeline", "scripts")
1244
1244
  init_script_path = os.path.join(validator_scripts_dir, "init-dev-team.py")
1245
1245
 
1246
1246
  # Session status path (relative to project root)
@@ -208,10 +208,15 @@ def get_prev_session_status(state_dir, bug_id):
208
208
 
209
209
 
210
210
  def resolve_project_root(script_dir):
211
- """Resolve project root as the parent of dev-pipeline/."""
212
- dev_pipeline_dir = os.path.dirname(script_dir)
213
- project_root = os.path.dirname(dev_pipeline_dir)
214
- return os.path.abspath(project_root)
211
+ """Resolve project root. Layout-aware:
212
+ <project>/.prizmkit/dev-pipeline/scripts/ → <project>
213
+ <repo>/dev-pipeline/scripts/ → <repo>
214
+ """
215
+ pipeline_dir = os.path.dirname(script_dir)
216
+ pipeline_parent = os.path.dirname(pipeline_dir)
217
+ if os.path.basename(pipeline_parent) == ".prizmkit":
218
+ return os.path.abspath(os.path.dirname(pipeline_parent))
219
+ return os.path.abspath(pipeline_parent)
215
220
 
216
221
 
217
222
  def build_replacements(args, bug, global_context, script_dir):
@@ -57,7 +57,7 @@ Use whatever information is available:
57
57
  - Read bug entry from `.prizmkit/plans/bug-fix-list.json` if bug ID is known
58
58
  - Read any existing artifacts in `.prizmkit/bugfix/{bug_id}/`
59
59
  - Read relevant source code and test files
60
- - Read `.prizm-docs/` for affected modules
60
+ - Read `.prizmkit/prizm-docs/` for affected modules
61
61
 
62
62
  Produce a bug summary with: symptom, reproduction steps, expected behavior,
63
63
  affected files, and root cause hypothesis.""",
@@ -66,9 +66,9 @@ affected files, and root cause hypothesis.""",
66
66
  "Triage",
67
67
  """\
68
68
  Locate affected code and identify root cause:
69
- 1. Read `.prizm-docs/root.prizm` then relevant L1/L2 docs for affected modules
69
+ 1. Read `.prizmkit/prizm-docs/root.prizm` then relevant L1/L2 docs for affected modules
70
70
  2. Read files mentioned in the bug description or error/stack trace
71
- 3. Check `.prizm-docs/` TRAPS for known patterns
71
+ 3. Check `.prizmkit/prizm-docs/` TRAPS for known patterns
72
72
  4. Classify: root cause (confirmed/suspected), blast radius, fix complexity
73
73
  5. Log your diagnosis (no need to ask for user confirmation in autonomous mode)""",
74
74
  ),
@@ -115,7 +115,7 @@ for manual user testing:
115
115
  """\
116
116
  Commit the fix and finalize:
117
117
  1. Run `/prizmkit-retrospective` (structural sync only — update file counts,
118
- interfaces, dependencies in .prizm-docs/)
118
+ interfaces, dependencies in .prizmkit/prizm-docs/)
119
119
  2. Stage all changed files explicitly (NEVER use `git add -A` or `git add .`)
120
120
  3. Run `/prizmkit-committer --headless` with commit prefix `fix(<scope>): <description>`
121
121
  4. Verify working tree is clean: `git status --short`
@@ -132,7 +132,7 @@ FEATURE_PHASES = {
132
132
  "Brainstorm",
133
133
  """\
134
134
  Since this is an autonomous recovery session, work with whatever context is
135
- available. Read existing project files, `.prizm-docs/`, and any user-provided
135
+ available. Read existing project files, `.prizmkit/prizm-docs/`, and any user-provided
136
136
  materials to understand the requirements. Skip interactive Q&A.
137
137
  Produce a requirements summary if one doesn't already exist.""",
138
138
  ),
@@ -153,7 +153,7 @@ Invoke `/feature-pipeline-launcher` skill:
153
153
 
154
154
  If `/feature-pipeline-launcher` is not available, run the pipeline directly:
155
155
  ```bash
156
- ./dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json
156
+ ./.prizmkit/dev-pipeline/run-feature.sh run .prizmkit/plans/feature-list.json
157
157
  ```""",
158
158
  ),
159
159
  4: (
@@ -161,7 +161,7 @@ If `/feature-pipeline-launcher` is not available, run the pipeline directly:
161
161
  """\
162
162
  Check pipeline status and report results:
163
163
  ```bash
164
- python3 dev-pipeline/scripts/update-feature-status.py \\
164
+ python3 .prizmkit/dev-pipeline/scripts/update-feature-status.py \\
165
165
  --feature-list .prizmkit/plans/feature-list.json \\
166
166
  --state-dir .prizmkit/state/features \\
167
167
  --action status
@@ -175,7 +175,7 @@ REFACTOR_PHASES = {
175
175
  "Brainstorm",
176
176
  """\
177
177
  Since this is an autonomous recovery session, work with whatever context is
178
- available. Read existing project files, `.prizm-docs/`, and any materials
178
+ available. Read existing project files, `.prizmkit/prizm-docs/`, and any materials
179
179
  to understand the refactoring goals. Skip interactive Q&A.
180
180
  Produce a refactoring goals summary if one doesn't already exist.""",
181
181
  ),
@@ -196,7 +196,7 @@ Invoke `/refactor-pipeline-launcher` skill:
196
196
 
197
197
  If `/refactor-pipeline-launcher` is not available, run the pipeline directly:
198
198
  ```bash
199
- ./dev-pipeline/run-refactor.sh run .prizmkit/plans/refactor-list.json
199
+ ./.prizmkit/dev-pipeline/run-refactor.sh run .prizmkit/plans/refactor-list.json
200
200
  ```""",
201
201
  ),
202
202
  4: (
@@ -204,7 +204,7 @@ If `/refactor-pipeline-launcher` is not available, run the pipeline directly:
204
204
  """\
205
205
  Check pipeline status and report results:
206
206
  ```bash
207
- python3 dev-pipeline/scripts/update-refactor-status.py \\
207
+ python3 .prizmkit/dev-pipeline/scripts/update-refactor-status.py \\
208
208
  --refactor-list .prizmkit/plans/refactor-list.json \\
209
209
  --state-dir .prizmkit/state/refactor \\
210
210
  --action status
@@ -688,9 +688,15 @@ def resolve_project_root(given_root):
688
688
  """Resolve project root from argument or git."""
689
689
  if given_root:
690
690
  return os.path.abspath(given_root)
691
- # Auto-detect: script is at dev-pipeline/scripts/, project root is 2 levels up
691
+ # Auto-detect across two layouts:
692
+ # <project>/.prizmkit/dev-pipeline/scripts/ → up 3 levels
693
+ # <repo>/dev-pipeline/scripts/ → up 2 levels
692
694
  script_dir = os.path.dirname(os.path.abspath(__file__))
693
- return os.path.dirname(os.path.dirname(script_dir))
695
+ pipeline_dir = os.path.dirname(script_dir)
696
+ pipeline_parent = os.path.dirname(pipeline_dir)
697
+ if os.path.basename(pipeline_parent) == ".prizmkit":
698
+ return os.path.dirname(pipeline_parent)
699
+ return pipeline_parent
694
700
 
695
701
 
696
702
  def emit_failure(message):
@@ -357,10 +357,15 @@ def get_prev_session_status(state_dir, refactor_id):
357
357
 
358
358
 
359
359
  def resolve_project_root(script_dir):
360
- """Resolve project root as the parent of dev-pipeline/."""
361
- dev_pipeline_dir = os.path.dirname(script_dir)
362
- project_root = os.path.dirname(dev_pipeline_dir)
363
- return os.path.abspath(project_root)
360
+ """Resolve project root. Layout-aware:
361
+ <project>/.prizmkit/dev-pipeline/scripts/ → <project>
362
+ <repo>/dev-pipeline/scripts/ → <repo>
363
+ """
364
+ pipeline_dir = os.path.dirname(script_dir)
365
+ pipeline_parent = os.path.dirname(pipeline_dir)
366
+ if os.path.basename(pipeline_parent) == ".prizmkit":
367
+ return os.path.abspath(os.path.dirname(pipeline_parent))
368
+ return os.path.abspath(pipeline_parent)
364
369
 
365
370
 
366
371
  def build_replacements(args, refactor, refactors, global_context, script_dir):
@@ -50,7 +50,7 @@ PHASE_KEYWORDS = {
50
50
  },
51
51
  "retrospective": {
52
52
  "strong": ["prizmkit-retrospective"],
53
- "weak": ["retrospective", "structural sync", "architecture knowledge", ".prizm-docs/ sync"],
53
+ "weak": ["retrospective", "structural sync", "architecture knowledge", ".prizmkit/prizm-docs/ sync"],
54
54
  },
55
55
  "commit": {
56
56
  "strong": ["prizmkit-committer"],
@@ -341,7 +341,15 @@ def action_update(args, bug_list_path, state_dir):
341
341
 
342
342
 
343
343
  def _default_project_root():
344
- return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
344
+ env = os.environ.get("PROJECT_ROOT")
345
+ if env:
346
+ return os.path.abspath(env)
347
+ script_dir = os.path.dirname(os.path.abspath(__file__))
348
+ pipeline_dir = os.path.dirname(script_dir)
349
+ pipeline_parent = os.path.dirname(pipeline_dir)
350
+ if os.path.basename(pipeline_parent) == ".prizmkit":
351
+ return os.path.dirname(pipeline_parent)
352
+ return pipeline_parent
345
353
 
346
354
 
347
355
  def cleanup_bug_artifacts(state_dir, bug_id, project_root=None):
@@ -236,7 +236,19 @@ def update_feature_in_list(feature_list_path, feature_id, new_status):
236
236
 
237
237
 
238
238
  def _default_project_root():
239
- return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
239
+ # Script lives at <pipeline>/scripts/update-feature-status.py.
240
+ # Pipeline may be either <project>/.prizmkit/dev-pipeline (user install)
241
+ # or <repo>/dev-pipeline (framework source). Auto-detect by checking if
242
+ # the parent of dev-pipeline is named ".prizmkit".
243
+ env = os.environ.get("PROJECT_ROOT")
244
+ if env:
245
+ return os.path.abspath(env)
246
+ script_dir = os.path.dirname(os.path.abspath(__file__))
247
+ pipeline_dir = os.path.dirname(script_dir)
248
+ pipeline_parent = os.path.dirname(pipeline_dir)
249
+ if os.path.basename(pipeline_parent) == ".prizmkit":
250
+ return os.path.dirname(pipeline_parent)
251
+ return pipeline_parent
240
252
 
241
253
 
242
254
  def _build_feature_slug(feature_id, title):
@@ -384,7 +384,15 @@ def action_update(args, refactor_list_path, state_dir):
384
384
 
385
385
 
386
386
  def _default_project_root():
387
- return os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ".."))
387
+ env = os.environ.get("PROJECT_ROOT")
388
+ if env:
389
+ return os.path.abspath(env)
390
+ script_dir = os.path.dirname(os.path.abspath(__file__))
391
+ pipeline_dir = os.path.dirname(script_dir)
392
+ pipeline_parent = os.path.dirname(pipeline_dir)
393
+ if os.path.basename(pipeline_parent) == ".prizmkit":
394
+ return os.path.dirname(pipeline_parent)
395
+ return pipeline_parent
388
396
 
389
397
 
390
398
  def cleanup_refactor_artifacts(state_dir, refactor_id, project_root=None):
@@ -1,7 +1,7 @@
1
1
  "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
2
2
  **MODE: Plan Challenge**
3
3
  1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has project context, Section 4 has file manifest.
4
- 2. Read `.prizm-docs/root.prizm` and relevant L1/L2 docs for affected modules.
4
+ 2. Read `.prizmkit/prizm-docs/root.prizm` and relevant L1/L2 docs for affected modules.
5
5
  3. Read existing source files in the modules this plan touches.
6
6
  4. Challenge plan.md against the project's existing architecture, patterns, and style.
7
7
  Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report.md` with findings (or 'No significant challenges')."
@@ -24,7 +24,7 @@ Infer what needs to be done from the feature context above and follow the standa
24
24
 
25
25
  ### Execution Steps
26
26
 
27
- 1. **Read context**: Read `.prizm-docs/root.prizm` and relevant L1/L2 docs to understand the codebase.
27
+ 1. **Read context**: Read `.prizmkit/prizm-docs/root.prizm` and relevant L1/L2 docs to understand the codebase.
28
28
 
29
29
  2. **Plan**: Run `/prizmkit-plan` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/` to produce `spec.md` and `plan.md`.
30
30
 
@@ -34,7 +34,7 @@ Infer what needs to be done from the feature context above and follow the standa
34
34
 
35
35
  5. **Review**: Run `/prizmkit-code-review` with `artifact_dir=.prizmkit/specs/{{FEATURE_SLUG}}/` to review and auto-fix changes against the spec (internal review-fix loop, max 3 rounds).
36
36
 
37
- 6. **Retrospective**: Run `/prizmkit-retrospective` to sync `.prizm-docs/` with code changes.
37
+ 6. **Retrospective**: Run `/prizmkit-retrospective` to sync `.prizmkit/prizm-docs/` with code changes.
38
38
 
39
39
  7. **Commit**: Run `/prizmkit-committer --headless` to commit all changes. Do NOT push.
40
40
 
@@ -69,7 +69,7 @@ You are running in **headless non-interactive mode** with a FINITE context windo
69
69
  ### Phase 0: Project Bootstrap
70
70
  - Run `/prizmkit-init` (invoke the prizmkit-init skill)
71
71
  - Run `python3 {{INIT_SCRIPT_PATH}} --project-root {{PROJECT_ROOT}} --feature-id {{FEATURE_ID}} --feature-slug {{FEATURE_SLUG}}`
72
- - **CP-0**: Verify `.prizm-docs/root.prizm`, `.prizmkit/config.json` exist
72
+ - **CP-0**: Verify `.prizmkit/prizm-docs/root.prizm`, `.prizmkit/config.json` exist
73
73
  {{END_IF_INIT_NEEDED}}
74
74
  {{IF_INIT_DONE}}
75
75
  ### Phase 0: SKIP (already initialized)
@@ -82,7 +82,7 @@ ls .prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md 2>/dev/null && echo "EXI
82
82
  ```
83
83
 
84
84
  If MISSING — build it now:
85
- 1. Read `.prizm-docs/root.prizm` and relevant L1 prizm docs
85
+ 1. Read `.prizmkit/prizm-docs/root.prizm` and relevant L1 prizm docs
86
86
  2. Detect source code directories: read KEY_FILES and STRUCTURE sections from `root.prizm` to identify where source code lives (e.g. `src/`, `app/`, `lib/`, `cmd/`, `packages/`, or project root). If `root.prizm` is missing, scan the project tree:
87
87
  ```bash
88
88
  find . -maxdepth 2 -type f \( -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.go" -o -name "*.java" -o -name "*.rb" -o -name "*.rs" \) -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -not -path '*/build/*' -not -path '*/vendor/*' | head -30
@@ -344,22 +344,22 @@ If verification fails, log the failure details but continue to commit. Failures
344
344
 
345
345
  ### Phase 4: Architecture Sync & Commit (SINGLE COMMIT)
346
346
 
347
- **4a.** Run `/prizmkit-retrospective` — maintains `.prizm-docs/` (architecture index):
348
- 1. **Structural sync**: Use `git diff --cached --name-status` to locate changed modules, update KEY_FILES/INTERFACES/DEPENDENCIES/file counts in affected `.prizm-docs/` files
349
- 2. **Architecture knowledge** (feature sessions only): Extract TRAPS/RULES/DECISIONS from completed work into `.prizm-docs/`
347
+ **4a.** Run `/prizmkit-retrospective` — maintains `.prizmkit/prizm-docs/` (architecture index):
348
+ 1. **Structural sync**: Use `git diff --cached --name-status` to locate changed modules, update KEY_FILES/INTERFACES/DEPENDENCIES/file counts in affected `.prizmkit/prizm-docs/` files
349
+ 2. **Architecture knowledge** (feature sessions only): Extract TRAPS/RULES/DECISIONS from completed work into `.prizmkit/prizm-docs/`
350
350
  3. **L2 coverage check**: For any module/sub-module with source files created or significantly modified in this session but no L2 `.prizm` doc — evaluate whether L2 is warranted and create if so. The current session has the best context for accurate KEY_FILES, TRAPS, and DECISIONS.
351
- 4. Stage doc changes: `git add .prizm-docs/`
351
+ 4. Stage doc changes: `git add .prizmkit/prizm-docs/`
352
352
  ⚠️ Do NOT commit here. Only stage.
353
353
 
354
354
  **4b.** Stage all feature code explicitly (NEVER use `git add -A` or `git add .`):
355
355
  ```bash
356
356
  git add <specific-files-created-or-modified>
357
- git add .prizm-docs/
357
+ git add .prizmkit/prizm-docs/
358
358
  ```
359
359
 
360
360
  **4c.** Run `/prizmkit-committer` → THE ONLY commit for this feature:
361
361
  `feat({{FEATURE_ID}}): {{FEATURE_TITLE}}`
362
- This single commit includes: feature code + tests + .prizm-docs/ updates. Do NOT push.
362
+ This single commit includes: feature code + tests + .prizmkit/prizm-docs/ updates. Do NOT push.
363
363
  - MANDATORY: commit must be done via `/prizmkit-committer` skill. Do NOT run manual `git add`/`git commit` as a substitute.
364
364
  - Do NOT run `update-feature-status.py` here — the pipeline runner handles feature-list.json updates automatically after session exit.
365
365
 
@@ -80,7 +80,7 @@ If any agent times out:
80
80
  ### Phase 0: Project Bootstrap
81
81
  - Run `/prizmkit-init` (invoke the prizmkit-init skill)
82
82
  - Run `python3 {{INIT_SCRIPT_PATH}} --project-root {{PROJECT_ROOT}} --feature-id {{FEATURE_ID}} --feature-slug {{FEATURE_SLUG}}`
83
- - **CP-0**: Verify `.prizm-docs/root.prizm`, `.prizmkit/config.json` exist
83
+ - **CP-0**: Verify `.prizmkit/prizm-docs/root.prizm`, `.prizmkit/config.json` exist
84
84
  {{END_IF_INIT_NEEDED}}
85
85
  {{IF_INIT_DONE}}
86
86
  ### Phase 0: SKIP (already initialized)
@@ -104,7 +104,7 @@ cat .prizmkit/specs/{{FEATURE_SLUG}}/failure-log.md 2>/dev/null || echo "NO_PREV
104
104
  ```
105
105
  If failure-log.md exists:
106
106
  - Read ROOT_CAUSE and SUGGESTION — adjust your approach accordingly
107
- - Read DISCOVERED_TRAPS — if any are genuine, inject into .prizm-docs/ during Phase 6 retrospective
107
+ - Read DISCOVERED_TRAPS — if any are genuine, inject into .prizmkit/prizm-docs/ during Phase 6 retrospective
108
108
  - Do NOT delete failure-log.md until this session completes all phases and commits successfully
109
109
 
110
110
  ```bash
@@ -112,7 +112,7 @@ ls .prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md 2>/dev/null && echo "EXI
112
112
  ```
113
113
 
114
114
  If MISSING — build it now:
115
- 1. Read `.prizm-docs/root.prizm` and relevant L1/L2 prizm docs
115
+ 1. Read `.prizmkit/prizm-docs/root.prizm` and relevant L1/L2 prizm docs
116
116
  2. Detect source code directories: read KEY_FILES and STRUCTURE sections from `root.prizm` to identify where source code lives (e.g. `src/`, `app/`, `lib/`, `cmd/`, `packages/`, or project root). If `root.prizm` is missing, scan the project tree:
117
117
  ```bash
118
118
  find . -maxdepth 2 -type f \( -name "*.js" -o -name "*.ts" -o -name "*.py" -o -name "*.go" -o -name "*.java" -o -name "*.rb" -o -name "*.rs" \) -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' -not -path '*/build/*' -not -path '*/vendor/*' | head -30
@@ -137,7 +137,7 @@ If MISSING — build it now:
137
137
  |------|-----------|----------------|
138
138
  | `<source-dir>/security/permission-guard.js` | Permission check integration | `checkCommandPermission(userId, cmd)` |
139
139
 
140
- ### Known TRAPS (from .prizm-docs/)
140
+ ### Known TRAPS (from .prizmkit/prizm-docs/)
141
141
  - <trap entries extracted from L1/L2 docs>
142
142
 
143
143
  ### Phase 2: Plan & Tasks (you, the orchestrator)
@@ -190,7 +190,7 @@ Prompt:
190
190
  > "Read {{CRITIC_SUBAGENT_PATH}}. For feature {{FEATURE_ID}} (slug: {{FEATURE_SLUG}}):
191
191
  > **MODE: Plan Challenge**
192
192
  > 1. Read `.prizmkit/specs/{{FEATURE_SLUG}}/context-snapshot.md` FIRST — Section 3 has project context, Section 4 has file manifest.
193
- > 2. Read `.prizm-docs/root.prizm` and relevant L1/L2 docs for affected modules.
193
+ > 2. Read `.prizmkit/prizm-docs/root.prizm` and relevant L1/L2 docs for affected modules.
194
194
  > 3. Read existing source files in the modules this plan touches.
195
195
  > 4. Challenge plan.md against the project's existing architecture, patterns, and style.
196
196
  > Write `.prizmkit/specs/{{FEATURE_SLUG}}/challenge-report.md` with findings (or 'No significant challenges')."
@@ -437,22 +437,22 @@ If verification fails, log the failure details but continue to commit. Failures
437
437
 
438
438
  ### Phase 6: Architecture Sync & Commit (SINGLE COMMIT)
439
439
 
440
- **6a.** Run `/prizmkit-retrospective` — maintains `.prizm-docs/` (architecture index):
441
- 1. **Structural sync**: Use `git diff --cached --name-status` to locate changed modules, update KEY_FILES/INTERFACES/DEPENDENCIES/file counts in affected `.prizm-docs/` files
442
- 2. **Architecture knowledge** (feature sessions only): Extract TRAPS/RULES/DECISIONS from completed work into `.prizm-docs/`
440
+ **6a.** Run `/prizmkit-retrospective` — maintains `.prizmkit/prizm-docs/` (architecture index):
441
+ 1. **Structural sync**: Use `git diff --cached --name-status` to locate changed modules, update KEY_FILES/INTERFACES/DEPENDENCIES/file counts in affected `.prizmkit/prizm-docs/` files
442
+ 2. **Architecture knowledge** (feature sessions only): Extract TRAPS/RULES/DECISIONS from completed work into `.prizmkit/prizm-docs/`
443
443
  3. **L2 coverage check**: For any module/sub-module with source files created or significantly modified in this session but no L2 `.prizm` doc — evaluate whether L2 is warranted and create if so. The current session has the best context for accurate KEY_FILES, TRAPS, and DECISIONS.
444
- 4. Stage doc changes: `git add .prizm-docs/`
444
+ 4. Stage doc changes: `git add .prizmkit/prizm-docs/`
445
445
  ⚠️ Do NOT commit here. Only stage.
446
446
 
447
447
  **6b.** Stage all feature code explicitly (NEVER use `git add -A` or `git add .`):
448
448
  ```bash
449
449
  git add <specific-files-created-or-modified>
450
- git add .prizm-docs/
450
+ git add .prizmkit/prizm-docs/
451
451
  ```
452
452
 
453
453
  **6c.** Run `/prizmkit-committer` → THE ONLY commit for this feature:
454
454
  `feat({{FEATURE_ID}}): {{FEATURE_TITLE}}`
455
- This single commit includes: feature code + tests + .prizm-docs/ updates. Do NOT push.
455
+ This single commit includes: feature code + tests + .prizmkit/prizm-docs/ updates. Do NOT push.
456
456
  - MANDATORY: commit must be done via `/prizmkit-committer` skill. Do NOT run manual `git add`/`git commit` as a substitute.
457
457
  - Do NOT run `update-feature-status.py` here — the pipeline runner handles feature-list.json updates automatically after session exit.
458
458