prizmkit 1.1.99 → 1.1.101

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 (321) hide show
  1. package/bin/create-prizmkit.js +4 -4
  2. package/bundled/VERSION.json +3 -3
  3. package/bundled/dev-pipeline/.env.example +3 -3
  4. package/bundled/dev-pipeline/README.md +110 -90
  5. package/bundled/dev-pipeline/assets/prizm-dev-team-integration.md +1 -1
  6. package/bundled/dev-pipeline/cli.py +27 -0
  7. package/bundled/dev-pipeline/prizmkit_runtime/__init__.py +13 -0
  8. package/bundled/dev-pipeline/prizmkit_runtime/__main__.py +9 -0
  9. package/bundled/dev-pipeline/prizmkit_runtime/cli.py +193 -0
  10. package/bundled/dev-pipeline/prizmkit_runtime/commands.py +313 -0
  11. package/bundled/dev-pipeline/prizmkit_runtime/compat.py +32 -0
  12. package/bundled/dev-pipeline/prizmkit_runtime/config.py +410 -0
  13. package/bundled/dev-pipeline/prizmkit_runtime/daemon.py +478 -0
  14. package/bundled/dev-pipeline/prizmkit_runtime/gitops.py +734 -0
  15. package/bundled/dev-pipeline/prizmkit_runtime/heartbeat.py +256 -0
  16. package/bundled/dev-pipeline/prizmkit_runtime/interoperability.py +109 -0
  17. package/bundled/dev-pipeline/prizmkit_runtime/paths.py +110 -0
  18. package/bundled/dev-pipeline/prizmkit_runtime/processes.py +373 -0
  19. package/bundled/dev-pipeline/prizmkit_runtime/reset.py +389 -0
  20. package/bundled/dev-pipeline/prizmkit_runtime/runner_bookkeeping.py +51 -0
  21. package/bundled/dev-pipeline/prizmkit_runtime/runner_classification.py +179 -0
  22. package/bundled/dev-pipeline/prizmkit_runtime/runner_models.py +345 -0
  23. package/bundled/dev-pipeline/prizmkit_runtime/runner_prompts.py +118 -0
  24. package/bundled/dev-pipeline/prizmkit_runtime/runner_recovery.py +187 -0
  25. package/bundled/dev-pipeline/prizmkit_runtime/runner_status.py +147 -0
  26. package/bundled/dev-pipeline/prizmkit_runtime/runners.py +422 -0
  27. package/bundled/dev-pipeline/prizmkit_runtime/sessions.py +552 -0
  28. package/bundled/dev-pipeline/prizmkit_runtime/status.py +71 -0
  29. package/bundled/dev-pipeline/scripts/check-session-status.py +74 -1
  30. package/bundled/dev-pipeline/scripts/continuation.py +374 -0
  31. package/bundled/dev-pipeline/scripts/generate-bootstrap-prompt.py +64 -52
  32. package/bundled/dev-pipeline/scripts/generate-bugfix-prompt.py +35 -25
  33. package/bundled/dev-pipeline/scripts/generate-recovery-prompt.py +2 -2
  34. package/bundled/dev-pipeline/scripts/generate-refactor-prompt.py +15 -20
  35. package/bundled/dev-pipeline/scripts/parse-stream-progress.py +185 -16
  36. package/bundled/dev-pipeline/scripts/update-bug-status.py +214 -6
  37. package/bundled/dev-pipeline/scripts/update-feature-status.py +237 -6
  38. package/bundled/dev-pipeline/scripts/update-refactor-status.py +214 -6
  39. package/bundled/dev-pipeline/templates/agent-prompts/dev-implement.md +8 -2
  40. package/bundled/dev-pipeline/templates/bootstrap-prompt.md +4 -0
  41. package/bundled/dev-pipeline/templates/bootstrap-tier1.md +14 -5
  42. package/bundled/dev-pipeline/templates/bootstrap-tier2.md +16 -6
  43. package/bundled/dev-pipeline/templates/bootstrap-tier3.md +16 -6
  44. package/bundled/dev-pipeline/templates/bugfix-bootstrap-prompt.md +1 -1
  45. package/bundled/dev-pipeline/templates/refactor-bootstrap-prompt.md +3 -3
  46. package/bundled/dev-pipeline/templates/sections/context-budget-rules.md +2 -0
  47. package/bundled/dev-pipeline/templates/sections/log-size-awareness.md +13 -69
  48. package/bundled/dev-pipeline/templates/sections/phase-context-snapshot-agent-suffix.md +15 -7
  49. package/bundled/dev-pipeline/templates/sections/phase-implement-agent.md +42 -29
  50. package/bundled/dev-pipeline/templates/sections/phase-implement-full.md +41 -39
  51. package/bundled/dev-pipeline/templates/sections/test-failure-recovery-agent.md +4 -0
  52. package/bundled/dev-pipeline/templates/sections/test-failure-recovery-lite.md +4 -0
  53. package/bundled/dev-pipeline/templates/session-status-schema.json +1 -1
  54. package/bundled/dev-pipeline/tests/conftest.py +1 -0
  55. package/bundled/dev-pipeline/tests/test_auto_skip.py +932 -0
  56. package/bundled/dev-pipeline/tests/test_generate_bootstrap_prompt.py +207 -0
  57. package/bundled/dev-pipeline/tests/test_generate_bugfix_prompt.py +100 -0
  58. package/bundled/dev-pipeline/tests/test_generate_refactor_prompt.py +43 -0
  59. package/bundled/dev-pipeline/tests/test_python_runner_parity.py +1138 -0
  60. package/bundled/dev-pipeline/tests/test_unified_cli.py +1045 -0
  61. package/bundled/skills/_metadata.json +1 -1
  62. package/bundled/skills/bugfix-pipeline-launcher/SKILL.md +29 -34
  63. package/bundled/skills/bugfix-pipeline-launcher/references/configuration.md +6 -5
  64. package/bundled/skills/feature-pipeline-launcher/SKILL.md +29 -35
  65. package/bundled/skills/feature-pipeline-launcher/references/configuration.md +7 -6
  66. package/bundled/skills/feature-workflow/SKILL.md +3 -6
  67. package/bundled/skills/recovery-workflow/SKILL.md +23 -32
  68. package/bundled/skills/refactor-pipeline-launcher/SKILL.md +29 -35
  69. package/bundled/skills/refactor-pipeline-launcher/references/configuration.md +7 -6
  70. package/bundled/skills/refactor-workflow/SKILL.md +3 -6
  71. package/bundled/templates/hooks/commit-intent.json +2 -2
  72. package/bundled/templates/hooks/diff-prizm-docs.py +226 -0
  73. package/bundled/templates/hooks/prizm-pre-commit.py +45 -0
  74. package/bundled/templates/hooks/validate-prizm-docs.py +240 -0
  75. package/package.json +1 -1
  76. package/src/config.js +33 -12
  77. package/src/index.js +3 -6
  78. package/src/manifest.js +3 -2
  79. package/src/metadata.js +7 -18
  80. package/src/prompts.js +0 -12
  81. package/src/runtimes.js +18 -11
  82. package/src/scaffold.js +133 -116
  83. package/src/upgrade.js +1 -1
  84. package/bundled/dev-pipeline/launch-bugfix-daemon.sh +0 -500
  85. package/bundled/dev-pipeline/launch-feature-daemon.sh +0 -657
  86. package/bundled/dev-pipeline/launch-refactor-daemon.sh +0 -502
  87. package/bundled/dev-pipeline/lib/branch.sh +0 -326
  88. package/bundled/dev-pipeline/lib/common.sh +0 -1257
  89. package/bundled/dev-pipeline/lib/heartbeat.sh +0 -469
  90. package/bundled/dev-pipeline/reset-bug.sh +0 -395
  91. package/bundled/dev-pipeline/reset-feature.sh +0 -406
  92. package/bundled/dev-pipeline/reset-refactor.sh +0 -393
  93. package/bundled/dev-pipeline/run-bugfix.sh +0 -1315
  94. package/bundled/dev-pipeline/run-feature.sh +0 -1602
  95. package/bundled/dev-pipeline/run-recovery.sh +0 -648
  96. package/bundled/dev-pipeline/run-refactor.sh +0 -1348
  97. package/bundled/dev-pipeline/scripts/monitor-log.sh +0 -104
  98. package/bundled/dev-pipeline/tests/test-path-resolution.sh +0 -100
  99. package/bundled/dev-pipeline-windows/.env.example +0 -36
  100. package/bundled/dev-pipeline-windows/README.md +0 -30
  101. package/bundled/dev-pipeline-windows/SCHEMA_ANALYSIS.md +0 -533
  102. package/bundled/dev-pipeline-windows/assets/feature-list-example.json +0 -146
  103. package/bundled/dev-pipeline-windows/assets/prizm-dev-team-integration.md +0 -137
  104. package/bundled/dev-pipeline-windows/launch-bugfix-daemon.ps1 +0 -9
  105. package/bundled/dev-pipeline-windows/launch-feature-daemon.ps1 +0 -9
  106. package/bundled/dev-pipeline-windows/launch-refactor-daemon.ps1 +0 -9
  107. package/bundled/dev-pipeline-windows/lib/branch.ps1 +0 -235
  108. package/bundled/dev-pipeline-windows/lib/common.ps1 +0 -829
  109. package/bundled/dev-pipeline-windows/lib/daemon.ps1 +0 -140
  110. package/bundled/dev-pipeline-windows/lib/pipeline.ps1 +0 -967
  111. package/bundled/dev-pipeline-windows/lib/reset.ps1 +0 -87
  112. package/bundled/dev-pipeline-windows/reset-bug.ps1 +0 -9
  113. package/bundled/dev-pipeline-windows/reset-feature.ps1 +0 -9
  114. package/bundled/dev-pipeline-windows/reset-refactor.ps1 +0 -9
  115. package/bundled/dev-pipeline-windows/run-bugfix.ps1 +0 -9
  116. package/bundled/dev-pipeline-windows/run-feature.ps1 +0 -9
  117. package/bundled/dev-pipeline-windows/run-recovery.ps1 +0 -179
  118. package/bundled/dev-pipeline-windows/run-refactor.ps1 +0 -9
  119. package/bundled/dev-pipeline-windows/scripts/check-session-status.py +0 -228
  120. package/bundled/dev-pipeline-windows/scripts/detect-stuck.py +0 -530
  121. package/bundled/dev-pipeline-windows/scripts/generate-bootstrap-prompt.py +0 -2282
  122. package/bundled/dev-pipeline-windows/scripts/generate-bugfix-prompt.py +0 -767
  123. package/bundled/dev-pipeline-windows/scripts/generate-recovery-prompt.py +0 -805
  124. package/bundled/dev-pipeline-windows/scripts/generate-refactor-prompt.py +0 -845
  125. package/bundled/dev-pipeline-windows/scripts/init-bugfix-pipeline.py +0 -316
  126. package/bundled/dev-pipeline-windows/scripts/init-dev-team.py +0 -134
  127. package/bundled/dev-pipeline-windows/scripts/init-pipeline.py +0 -382
  128. package/bundled/dev-pipeline-windows/scripts/init-refactor-pipeline.py +0 -399
  129. package/bundled/dev-pipeline-windows/scripts/monitor-log.ps1 +0 -102
  130. package/bundled/dev-pipeline-windows/scripts/parse-stream-progress.py +0 -1232
  131. package/bundled/dev-pipeline-windows/scripts/patch-completion-notes.py +0 -191
  132. package/bundled/dev-pipeline-windows/scripts/prizmkit-test-gate.py +0 -446
  133. package/bundled/dev-pipeline-windows/scripts/update-bug-status.py +0 -913
  134. package/bundled/dev-pipeline-windows/scripts/update-checkpoint.py +0 -173
  135. package/bundled/dev-pipeline-windows/scripts/update-feature-status.py +0 -1558
  136. package/bundled/dev-pipeline-windows/scripts/update-refactor-status.py +0 -1119
  137. package/bundled/dev-pipeline-windows/scripts/utils.py +0 -542
  138. package/bundled/dev-pipeline-windows/templates/agent-prompts/critic-plan-challenge.md +0 -7
  139. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-fix.md +0 -7
  140. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-implement.md +0 -65
  141. package/bundled/dev-pipeline-windows/templates/agent-prompts/dev-resume.md +0 -5
  142. package/bundled/dev-pipeline-windows/templates/agent-prompts/reviewer-review.md +0 -7
  143. package/bundled/dev-pipeline-windows/templates/bootstrap-prompt.md +0 -73
  144. package/bundled/dev-pipeline-windows/templates/bootstrap-tier1.md +0 -589
  145. package/bundled/dev-pipeline-windows/templates/bootstrap-tier2.md +0 -710
  146. package/bundled/dev-pipeline-windows/templates/bootstrap-tier3.md +0 -791
  147. package/bundled/dev-pipeline-windows/templates/bug-fix-list-schema.json +0 -263
  148. package/bundled/dev-pipeline-windows/templates/bugfix-bootstrap-prompt.md +0 -326
  149. package/bundled/dev-pipeline-windows/templates/feature-list-schema.json +0 -237
  150. package/bundled/dev-pipeline-windows/templates/refactor-bootstrap-prompt.md +0 -340
  151. package/bundled/dev-pipeline-windows/templates/refactor-list-schema.json +0 -270
  152. package/bundled/dev-pipeline-windows/templates/sections/ac-verification-checklist.md +0 -7
  153. package/bundled/dev-pipeline-windows/templates/sections/checkpoint-system.md +0 -91
  154. package/bundled/dev-pipeline-windows/templates/sections/context-budget-rules.md +0 -34
  155. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-agent.md +0 -10
  156. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-full.md +0 -12
  157. package/bundled/dev-pipeline-windows/templates/sections/critical-paths-lite.md +0 -7
  158. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-agent.md +0 -8
  159. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-full.md +0 -9
  160. package/bundled/dev-pipeline-windows/templates/sections/directory-convention-lite.md +0 -6
  161. package/bundled/dev-pipeline-windows/templates/sections/failure-capture.md +0 -21
  162. package/bundled/dev-pipeline-windows/templates/sections/feature-context.md +0 -21
  163. package/bundled/dev-pipeline-windows/templates/sections/log-size-awareness.md +0 -78
  164. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-auto.md +0 -283
  165. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification-opencli.md +0 -112
  166. package/bundled/dev-pipeline-windows/templates/sections/phase-browser-verification.md +0 -168
  167. package/bundled/dev-pipeline-windows/templates/sections/phase-commit-full.md +0 -82
  168. package/bundled/dev-pipeline-windows/templates/sections/phase-commit.md +0 -75
  169. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-agent-suffix.md +0 -23
  170. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-base.md +0 -14
  171. package/bundled/dev-pipeline-windows/templates/sections/phase-context-snapshot-lite-suffix.md +0 -19
  172. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan-full.md +0 -63
  173. package/bundled/dev-pipeline-windows/templates/sections/phase-critic-plan.md +0 -42
  174. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-agent.md +0 -44
  175. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-full.md +0 -59
  176. package/bundled/dev-pipeline-windows/templates/sections/phase-implement-lite.md +0 -39
  177. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-agent.md +0 -27
  178. package/bundled/dev-pipeline-windows/templates/sections/phase-plan-lite.md +0 -27
  179. package/bundled/dev-pipeline-windows/templates/sections/phase-prizmkit-test.md +0 -39
  180. package/bundled/dev-pipeline-windows/templates/sections/phase-review-agent.md +0 -35
  181. package/bundled/dev-pipeline-windows/templates/sections/phase-review-full.md +0 -35
  182. package/bundled/dev-pipeline-windows/templates/sections/phase-specify-plan-full.md +0 -73
  183. package/bundled/dev-pipeline-windows/templates/sections/phase0-init.md +0 -13
  184. package/bundled/dev-pipeline-windows/templates/sections/phase0-test-baseline.md +0 -21
  185. package/bundled/dev-pipeline-windows/templates/sections/session-context.md +0 -5
  186. package/bundled/dev-pipeline-windows/templates/sections/subagent-timeout-recovery.md +0 -6
  187. package/bundled/dev-pipeline-windows/templates/sections/task-contract.md +0 -34
  188. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-agent.md +0 -48
  189. package/bundled/dev-pipeline-windows/templates/sections/test-failure-recovery-lite.md +0 -48
  190. package/bundled/dev-pipeline-windows/templates/session-status-schema.json +0 -83
  191. package/bundled/skills-windows/app-planner/SKILL.md +0 -296
  192. package/bundled/skills-windows/app-planner/assets/app-design-guide.md +0 -101
  193. package/bundled/skills-windows/app-planner/references/architecture-decisions.md +0 -52
  194. package/bundled/skills-windows/app-planner/references/brainstorm-guide.md +0 -101
  195. package/bundled/skills-windows/app-planner/references/frontend-design-guide.md +0 -71
  196. package/bundled/skills-windows/app-planner/references/infrastructure-convention-discovery.md +0 -108
  197. package/bundled/skills-windows/app-planner/references/project-brief-guide.md +0 -82
  198. package/bundled/skills-windows/app-planner/references/project-conventions-discovery.md +0 -59
  199. package/bundled/skills-windows/app-planner/references/project-state-detection.md +0 -90
  200. package/bundled/skills-windows/app-planner/references/red-team-checklist.md +0 -40
  201. package/bundled/skills-windows/app-planner/references/rules/backend/derivation-rules.md +0 -619
  202. package/bundled/skills-windows/app-planner/references/rules/backend/fixed-rules.md +0 -285
  203. package/bundled/skills-windows/app-planner/references/rules/backend/question-bank.md +0 -249
  204. package/bundled/skills-windows/app-planner/references/rules/backend/question-manifest.json +0 -46
  205. package/bundled/skills-windows/app-planner/references/rules/backend/template.md +0 -173
  206. package/bundled/skills-windows/app-planner/references/rules/database/derivation-rules.md +0 -382
  207. package/bundled/skills-windows/app-planner/references/rules/database/fixed-rules.md +0 -211
  208. package/bundled/skills-windows/app-planner/references/rules/database/question-bank.md +0 -184
  209. package/bundled/skills-windows/app-planner/references/rules/database/question-manifest.json +0 -39
  210. package/bundled/skills-windows/app-planner/references/rules/database/template.md +0 -158
  211. package/bundled/skills-windows/app-planner/references/rules/frontend/derivation-rules.md +0 -820
  212. package/bundled/skills-windows/app-planner/references/rules/frontend/fixed-rules.md +0 -188
  213. package/bundled/skills-windows/app-planner/references/rules/frontend/question-bank.md +0 -319
  214. package/bundled/skills-windows/app-planner/references/rules/frontend/question-manifest.json +0 -51
  215. package/bundled/skills-windows/app-planner/references/rules/frontend/template.md +0 -339
  216. package/bundled/skills-windows/app-planner/references/rules/mobile/derivation-rules.md +0 -649
  217. package/bundled/skills-windows/app-planner/references/rules/mobile/fixed-rules.md +0 -290
  218. package/bundled/skills-windows/app-planner/references/rules/mobile/question-bank.md +0 -232
  219. package/bundled/skills-windows/app-planner/references/rules/mobile/question-manifest.json +0 -47
  220. package/bundled/skills-windows/app-planner/references/rules/mobile/template.md +0 -175
  221. package/bundled/skills-windows/app-planner/references/rules-configuration.md +0 -46
  222. package/bundled/skills-windows/bug-fix-workflow/SKILL.md +0 -379
  223. package/bundled/skills-windows/bug-fix-workflow/references/bug-diagnosis.md +0 -41
  224. package/bundled/skills-windows/bug-planner/SKILL.md +0 -402
  225. package/bundled/skills-windows/bug-planner/assets/bug-confirmation-template.md +0 -43
  226. package/bundled/skills-windows/bug-planner/references/critic-and-verification.md +0 -44
  227. package/bundled/skills-windows/bug-planner/references/error-recovery.md +0 -73
  228. package/bundled/skills-windows/bug-planner/references/input-formats.md +0 -53
  229. package/bundled/skills-windows/bug-planner/references/schema-validation.md +0 -25
  230. package/bundled/skills-windows/bug-planner/references/severity-rules.md +0 -16
  231. package/bundled/skills-windows/bug-planner/scripts/validate-bug-list.py +0 -322
  232. package/bundled/skills-windows/bugfix-pipeline-launcher/SKILL.md +0 -304
  233. package/bundled/skills-windows/bugfix-pipeline-launcher/references/configuration.md +0 -84
  234. package/bundled/skills-windows/feature-pipeline-launcher/SKILL.md +0 -381
  235. package/bundled/skills-windows/feature-pipeline-launcher/references/configuration.md +0 -67
  236. package/bundled/skills-windows/feature-pipeline-launcher/scripts/preflight-check.py +0 -462
  237. package/bundled/skills-windows/feature-planner/SKILL.md +0 -397
  238. package/bundled/skills-windows/feature-planner/assets/evaluation-guide.md +0 -64
  239. package/bundled/skills-windows/feature-planner/assets/planning-guide.md +0 -214
  240. package/bundled/skills-windows/feature-planner/references/browser-interaction.md +0 -59
  241. package/bundled/skills-windows/feature-planner/references/completeness-review.md +0 -57
  242. package/bundled/skills-windows/feature-planner/references/decomposition-patterns.md +0 -75
  243. package/bundled/skills-windows/feature-planner/references/error-recovery.md +0 -90
  244. package/bundled/skills-windows/feature-planner/references/incremental-feature-planning.md +0 -112
  245. package/bundled/skills-windows/feature-planner/references/new-project-planning.md +0 -85
  246. package/bundled/skills-windows/feature-planner/scripts/validate-and-generate.py +0 -1020
  247. package/bundled/skills-windows/feature-workflow/SKILL.md +0 -374
  248. package/bundled/skills-windows/feature-workflow/references/brainstorm-guide.md +0 -137
  249. package/bundled/skills-windows/prizm-kit/SKILL.md +0 -93
  250. package/bundled/skills-windows/prizmkit-code-review/SKILL.md +0 -161
  251. package/bundled/skills-windows/prizmkit-code-review/references/dev-agent-prompt.md +0 -30
  252. package/bundled/skills-windows/prizmkit-code-review/references/review-report-template.md +0 -31
  253. package/bundled/skills-windows/prizmkit-code-review/references/reviewer-agent-prompt.md +0 -66
  254. package/bundled/skills-windows/prizmkit-code-review/scripts/check_loop.py +0 -186
  255. package/bundled/skills-windows/prizmkit-committer/SKILL.md +0 -89
  256. package/bundled/skills-windows/prizmkit-deploy/SKILL.md +0 -444
  257. package/bundled/skills-windows/prizmkit-deploy/references/ci-cd-workflows.md +0 -115
  258. package/bundled/skills-windows/prizmkit-deploy/references/cloud-platform-deploy.md +0 -93
  259. package/bundled/skills-windows/prizmkit-deploy/references/data-safety-examples.md +0 -120
  260. package/bundled/skills-windows/prizmkit-deploy/references/database-setup.md +0 -46
  261. package/bundled/skills-windows/prizmkit-deploy/references/deploy-config-schema.md +0 -148
  262. package/bundled/skills-windows/prizmkit-deploy/references/deploy-history-schema.md +0 -62
  263. package/bundled/skills-windows/prizmkit-deploy/references/deployment-modes.md +0 -50
  264. package/bundled/skills-windows/prizmkit-deploy/references/direct-upload.md +0 -26
  265. package/bundled/skills-windows/prizmkit-deploy/references/dns-setup.md +0 -42
  266. package/bundled/skills-windows/prizmkit-deploy/references/docker-deploy.md +0 -31
  267. package/bundled/skills-windows/prizmkit-deploy/references/firewall-setup.md +0 -37
  268. package/bundled/skills-windows/prizmkit-deploy/references/live-validation-notes.md +0 -21
  269. package/bundled/skills-windows/prizmkit-deploy/references/nginx-blue-green.md +0 -59
  270. package/bundled/skills-windows/prizmkit-deploy/references/ssh-bootstrap-flow.md +0 -49
  271. package/bundled/skills-windows/prizmkit-deploy/references/ssh-execution-flow.md +0 -41
  272. package/bundled/skills-windows/prizmkit-deploy/references/ssh-takeover.md +0 -20
  273. package/bundled/skills-windows/prizmkit-deploy/references/ssl-setup.md +0 -56
  274. package/bundled/skills-windows/prizmkit-implement/SKILL.md +0 -71
  275. package/bundled/skills-windows/prizmkit-init/SKILL.md +0 -356
  276. package/bundled/skills-windows/prizmkit-init/assets/project-brief-template.md +0 -82
  277. package/bundled/skills-windows/prizmkit-init/references/config-schema.md +0 -70
  278. package/bundled/skills-windows/prizmkit-init/references/rules/layer-detection.md +0 -41
  279. package/bundled/skills-windows/prizmkit-init/references/tech-stack-catalog.md +0 -13
  280. package/bundled/skills-windows/prizmkit-init/references/update-supplement.md +0 -9
  281. package/bundled/skills-windows/prizmkit-plan/SKILL.md +0 -102
  282. package/bundled/skills-windows/prizmkit-plan/assets/plan-template.md +0 -115
  283. package/bundled/skills-windows/prizmkit-plan/assets/spec-template.md +0 -73
  284. package/bundled/skills-windows/prizmkit-plan/references/clarify-guide.md +0 -67
  285. package/bundled/skills-windows/prizmkit-plan/references/examples.md +0 -85
  286. package/bundled/skills-windows/prizmkit-plan/references/verification-checklist.md +0 -60
  287. package/bundled/skills-windows/prizmkit-prizm-docs/SKILL.md +0 -129
  288. package/bundled/skills-windows/prizmkit-prizm-docs/assets/prizm-docs-format.md +0 -613
  289. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-init.md +0 -45
  290. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-rebuild.md +0 -15
  291. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-status.md +0 -14
  292. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-update.md +0 -19
  293. package/bundled/skills-windows/prizmkit-prizm-docs/references/op-validate.md +0 -17
  294. package/bundled/skills-windows/prizmkit-retrospective/SKILL.md +0 -87
  295. package/bundled/skills-windows/prizmkit-retrospective/references/knowledge-injection-steps.md +0 -50
  296. package/bundled/skills-windows/prizmkit-retrospective/references/structural-sync-steps.md +0 -43
  297. package/bundled/skills-windows/prizmkit-test/SKILL.md +0 -227
  298. package/bundled/skills-windows/prizmkit-test/references/boundary-coverage-protocol.md +0 -220
  299. package/bundled/skills-windows/prizmkit-test/references/examples.md +0 -143
  300. package/bundled/skills-windows/prizmkit-test/references/service-boundary-test-catalog.md +0 -225
  301. package/bundled/skills-windows/prizmkit-test/references/test-generation-steps.md +0 -109
  302. package/bundled/skills-windows/prizmkit-test/references/test-report-template.md +0 -111
  303. package/bundled/skills-windows/prizmkit-test/scripts/validate_boundary_report.py +0 -347
  304. package/bundled/skills-windows/recovery-workflow/SKILL.md +0 -355
  305. package/bundled/skills-windows/recovery-workflow/evals/evals.json +0 -46
  306. package/bundled/skills-windows/recovery-workflow/references/detection.md +0 -58
  307. package/bundled/skills-windows/recovery-workflow/scripts/detect-recovery-state.py +0 -544
  308. package/bundled/skills-windows/refactor-pipeline-launcher/SKILL.md +0 -346
  309. package/bundled/skills-windows/refactor-pipeline-launcher/references/configuration.md +0 -72
  310. package/bundled/skills-windows/refactor-planner/SKILL.md +0 -398
  311. package/bundled/skills-windows/refactor-planner/assets/planning-guide.md +0 -292
  312. package/bundled/skills-windows/refactor-planner/references/behavior-preservation.md +0 -301
  313. package/bundled/skills-windows/refactor-planner/references/fast-path.md +0 -59
  314. package/bundled/skills-windows/refactor-planner/references/planning-phases.md +0 -135
  315. package/bundled/skills-windows/refactor-planner/references/refactor-scoping-guide.md +0 -221
  316. package/bundled/skills-windows/refactor-planner/scripts/validate-and-generate-refactor.py +0 -858
  317. package/bundled/skills-windows/refactor-workflow/SKILL.md +0 -343
  318. package/bundled/skills-windows/refactor-workflow/references/brainstorm-guide.md +0 -116
  319. package/bundled/templates/hooks/diff-prizm-docs.sh +0 -158
  320. package/bundled/templates/hooks/prizm-pre-commit.sh +0 -108
  321. package/bundled/templates/hooks/validate-prizm-docs.sh +0 -139
@@ -1,913 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Core state machine for updating bug status in the bug-fix pipeline.
3
-
4
- Handles eight actions:
5
- - get_next: Find the next bug to process based on priority and severity
6
- - start: Mark a bug as fixing when a session starts
7
- - update: Update a bug's status based on session outcome
8
- - status: Print a formatted overview of all bugs
9
- - pause: Save pipeline state for graceful shutdown
10
- - reset: Reset a bug to pending (status + retry count)
11
- - clean: Reset + delete session history + delete bugfix artifacts
12
- - unskip: Reset skipped bugs back to pending
13
-
14
- Usage:
15
- python3 update-bug-status.py \
16
- --bug-list <path> --state-dir <path> \
17
- --action <get_next|start|update|status|pause|reset|clean|unskip> \
18
- [--bug-id <id>] [--session-status <status>] \
19
- [--session-id <id>] [--max-retries <n>] [--max-infra-retries <n>]
20
- """
21
-
22
- import argparse
23
- import json
24
- import os
25
- import shutil
26
- from datetime import datetime, timezone
27
-
28
- from utils import (
29
- load_json_file,
30
- write_json_file,
31
- error_out,
32
- pad_right,
33
- _build_progress_bar,
34
- )
35
-
36
-
37
- SESSION_STATUS_VALUES = [
38
- "success",
39
- "partial_resumable",
40
- "partial_not_resumable",
41
- "failed",
42
- "crashed",
43
- "timed_out",
44
- "infra_error",
45
- "commit_missing",
46
- "docs_missing",
47
- "merge_conflict",
48
- ]
49
-
50
- TERMINAL_STATUSES = {"completed", "failed", "skipped", "needs_info"}
51
-
52
- # Severity priority (lower value = higher priority)
53
- SEVERITY_PRIORITY = {
54
- "critical": 0,
55
- "high": 1,
56
- "medium": 2,
57
- "low": 3,
58
- }
59
-
60
-
61
- def parse_args():
62
- parser = argparse.ArgumentParser(
63
- description="Core state machine for bug-fix pipeline bug status management."
64
- )
65
- parser.add_argument("--bug-list", required=True, help="Path to the .prizmkit/plans/bug-fix-list.json file")
66
- parser.add_argument("--state-dir", required=True, help="Path to the state directory (default: .prizmkit/state/bugfix)")
67
- parser.add_argument(
68
- "--action", required=True,
69
- choices=["get_next", "start", "update", "status", "pause", "reset", "clean", "unskip", "complete"],
70
- help="Action to perform",
71
- )
72
- parser.add_argument("--bug-id", default=None, help="Bug ID (required for 'update'/'reset'/'clean' actions)")
73
- parser.add_argument(
74
- "--session-status", default=None, choices=SESSION_STATUS_VALUES,
75
- help="Session outcome status (required for 'update' action)",
76
- )
77
- parser.add_argument("--session-id", default=None, help="Session ID (optional, for 'update' action)")
78
- parser.add_argument("--max-retries", type=int, default=3, help="Maximum code retry count (default: 3)")
79
- parser.add_argument("--max-infra-retries", type=int, default=3, help="Maximum infrastructure retry count (default: 3)")
80
- parser.add_argument("--project-root", default=None, help="Project root directory. Required for 'clean' action.")
81
- return parser.parse_args()
82
-
83
-
84
- def now_iso():
85
- return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
86
-
87
-
88
- def load_bug_status(state_dir, bug_id):
89
- """Load runtime state from status.json for a bug.
90
-
91
- Returns runtime fields only (retry_count, sessions, etc.).
92
- The 'status' field is NOT included — status lives exclusively
93
- in bug-fix-list.json.
94
- """
95
- status_path = os.path.join(state_dir, bug_id, "status.json")
96
- if not os.path.isfile(status_path):
97
- now = now_iso()
98
- return {
99
- "bug_id": bug_id,
100
- "retry_count": 0,
101
- "max_retries": 3,
102
- "max_infra_retries": 3,
103
- "infra_error_count": 0,
104
- "last_infra_error_session_id": None,
105
- "sessions": [],
106
- "last_session_id": None,
107
- "resume_from_phase": None,
108
- "created_at": now,
109
- "updated_at": now,
110
- }
111
- data, err = load_json_file(status_path)
112
- if err:
113
- now = now_iso()
114
- return {
115
- "bug_id": bug_id,
116
- "retry_count": 0,
117
- "max_retries": 3,
118
- "max_infra_retries": 3,
119
- "infra_error_count": 0,
120
- "last_infra_error_session_id": None,
121
- "sessions": [],
122
- "last_session_id": None,
123
- "resume_from_phase": None,
124
- "created_at": now,
125
- "updated_at": now,
126
- }
127
- # Defensively remove status if present (legacy data)
128
- data.pop("status", None)
129
- return data
130
-
131
-
132
- def save_bug_status(state_dir, bug_id, status_data):
133
- """Write the status.json for a bug (runtime fields only)."""
134
- # Defensively strip status — it belongs in bug-fix-list.json
135
- status_data.pop("status", None)
136
- status_path = os.path.join(state_dir, bug_id, "status.json")
137
- return write_json_file(status_path, status_data)
138
-
139
-
140
- def get_bug_status_from_list(bug_list_path, bug_id):
141
- """Read a single bug's status from bug-fix-list.json."""
142
- data, err = load_json_file(bug_list_path)
143
- if err:
144
- return "pending"
145
- for b in data.get("bugs", []):
146
- if isinstance(b, dict) and b.get("id") == bug_id:
147
- return b.get("status", "pending")
148
- return "pending"
149
-
150
-
151
- def update_bug_in_list(bug_list_path, bug_id, new_status):
152
- data, err = load_json_file(bug_list_path)
153
- if err:
154
- return err
155
- bugs = data.get("bugs", [])
156
- found = False
157
- for bug in bugs:
158
- if isinstance(bug, dict) and bug.get("id") == bug_id:
159
- bug["status"] = new_status
160
- found = True
161
- break
162
- if not found:
163
- return "Bug '{}' not found in .prizmkit/plans/bug-fix-list.json".format(bug_id)
164
- return write_json_file(bug_list_path, data)
165
-
166
-
167
- # ---------------------------------------------------------------------------
168
- # Action: get_next
169
- # ---------------------------------------------------------------------------
170
-
171
- def action_get_next(bug_list_data, state_dir):
172
- """Find the next bug to process.
173
-
174
- Priority logic:
175
- 1. Skip terminal statuses (completed, failed, skipped, needs_info)
176
- 2. Prefer in_progress bugs (interrupted session resume) over pending
177
- 3. Sort by: severity (critical > high > medium > low), then by priority (high > medium > low)
178
- """
179
- bugs = bug_list_data.get("bugs", [])
180
- if not bugs:
181
- print("PIPELINE_COMPLETE")
182
- return
183
-
184
- # Build status map from bug-fix-list.json (single source of truth)
185
- status_map = {}
186
- status_data_map = {}
187
- for bug in bugs:
188
- if not isinstance(bug, dict):
189
- continue
190
- bid = bug.get("id")
191
- if not bid:
192
- continue
193
- status_map[bid] = bug.get("status", "pending")
194
- bs = load_bug_status(state_dir, bid)
195
- status_data_map[bid] = bs
196
-
197
- # Check if all bugs are terminal
198
- non_terminal = [
199
- b for b in bugs
200
- if isinstance(b, dict) and b.get("id")
201
- and status_map.get(b["id"], "pending") not in TERMINAL_STATUSES
202
- ]
203
- if not non_terminal:
204
- print("PIPELINE_COMPLETE")
205
- return
206
-
207
- # Separate in_progress from pending
208
- in_progress_bugs = []
209
- pending_bugs = []
210
- for bug in non_terminal:
211
- bid = bug.get("id")
212
- bstatus = status_map.get(bid, "pending")
213
- if bstatus == "in_progress":
214
- in_progress_bugs.append(bug)
215
- elif bstatus == "pending":
216
- pending_bugs.append(bug)
217
-
218
- _PRIORITY_ORDER = {"high": 0, "medium": 1, "low": 2}
219
-
220
- def sort_key(b):
221
- severity = b.get("severity", "medium")
222
- sev_order = SEVERITY_PRIORITY.get(severity, 2)
223
- priority = _PRIORITY_ORDER.get(b.get("priority", "low"), 2)
224
- return (sev_order, priority)
225
-
226
- if in_progress_bugs:
227
- candidates = sorted(in_progress_bugs, key=sort_key)
228
- elif pending_bugs:
229
- candidates = sorted(pending_bugs, key=sort_key)
230
- else:
231
- # All remaining bugs are in non-terminal but also non-pending/in_progress states
232
- print("PIPELINE_BLOCKED")
233
- return
234
-
235
- chosen = candidates[0]
236
- chosen_id = chosen["id"]
237
- chosen_status_data = status_data_map.get(chosen_id, {})
238
-
239
- result = {
240
- "bug_id": chosen_id,
241
- "title": chosen.get("title", ""),
242
- "severity": chosen.get("severity", "medium"),
243
- "retry_count": chosen_status_data.get("retry_count", 0),
244
- "infra_error_count": chosen_status_data.get("infra_error_count", 0),
245
- "resume_from_phase": chosen_status_data.get("resume_from_phase", None),
246
- }
247
- print(json.dumps(result, indent=2, ensure_ascii=False))
248
-
249
-
250
- # ---------------------------------------------------------------------------
251
- # Action: update
252
- # ---------------------------------------------------------------------------
253
-
254
- def action_update(args, bug_list_path, state_dir):
255
- bug_id = args.bug_id
256
- session_status = args.session_status
257
- session_id = args.session_id
258
- max_retries = args.max_retries
259
- max_infra_retries = args.max_infra_retries
260
-
261
- if not bug_id:
262
- error_out("--bug-id is required for 'update' action")
263
- return
264
- if not session_status:
265
- error_out("--session-status is required for 'update' action")
266
- return
267
-
268
- bs = load_bug_status(state_dir, bug_id)
269
-
270
- # Track what status we write to bug-fix-list.json
271
- new_status = get_bug_status_from_list(bug_list_path, bug_id)
272
-
273
- if session_status == "success":
274
- bs["infra_error_count"] = 0
275
- bs["last_infra_error_session_id"] = None
276
- new_status = "completed"
277
- bs["resume_from_phase"] = None
278
- err = update_bug_in_list(bug_list_path, bug_id, "completed")
279
- if err:
280
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
281
- return
282
- elif session_status in ("commit_missing", "docs_missing", "merge_conflict"):
283
- bs["retry_count"] = bs.get("retry_count", 0) + 1
284
-
285
- if bs["retry_count"] >= max_retries:
286
- new_status = "failed"
287
- else:
288
- new_status = "pending"
289
-
290
- bs["degraded_reason"] = session_status
291
- bs["resume_from_phase"] = None
292
- bs["sessions"] = []
293
- bs["last_session_id"] = None
294
-
295
- err = update_bug_in_list(bug_list_path, bug_id, new_status)
296
- if err:
297
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
298
- return
299
- elif session_status == "infra_error":
300
- # AI CLI/provider outage, auth failure, gateway error, etc.
301
- # Infra failures do not consume the code retry budget, but they still
302
- # need their own bounded budget so a flaky provider cannot loop forever.
303
- infra_error_count = bs.get("infra_error_count", 0) + 1
304
- bs["infra_error_count"] = infra_error_count
305
- bs["last_infra_error_session_id"] = session_id
306
- bs["max_infra_retries"] = max_infra_retries
307
- bs["degraded_reason"] = "infra_error"
308
- if session_id:
309
- bs["last_session_id"] = session_id
310
- bs["resume_from_phase"] = None
311
-
312
- if infra_error_count >= max_infra_retries:
313
- new_status = "failed"
314
- if session_id:
315
- bs["last_failed_session_id"] = session_id
316
- else:
317
- new_status = "pending"
318
-
319
- err = update_bug_in_list(bug_list_path, bug_id, new_status)
320
- if err:
321
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
322
- return
323
- else:
324
- bs["retry_count"] = bs.get("retry_count", 0) + 1
325
-
326
- cleaned = cleanup_bug_artifacts(
327
- state_dir=state_dir,
328
- bug_id=bug_id,
329
- project_root=args.project_root,
330
- )
331
-
332
- if bs["retry_count"] >= max_retries:
333
- new_status = "failed"
334
- else:
335
- new_status = "pending"
336
-
337
- bs["resume_from_phase"] = None
338
- bs["sessions"] = []
339
- bs["last_session_id"] = None
340
-
341
- err = update_bug_in_list(bug_list_path, bug_id, new_status)
342
- if err:
343
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
344
- return
345
-
346
- if session_status == "success" and session_id:
347
- sessions = bs.get("sessions", [])
348
- if session_id not in sessions:
349
- sessions.append(session_id)
350
- bs["sessions"] = sessions
351
- bs["last_session_id"] = session_id
352
-
353
- bs["updated_at"] = now_iso()
354
-
355
- err = save_bug_status(state_dir, bug_id, bs)
356
- if err:
357
- error_out("Failed to save bug status: {}".format(err))
358
- return
359
-
360
- summary = {
361
- "action": "update",
362
- "bug_id": bug_id,
363
- "session_status": session_status,
364
- "new_status": new_status,
365
- "retry_count": bs["retry_count"],
366
- "infra_error_count": bs.get("infra_error_count", 0),
367
- "max_infra_retries": max_infra_retries,
368
- "resume_from_phase": bs.get("resume_from_phase"),
369
- "updated_at": bs["updated_at"],
370
- }
371
- if session_status in ("commit_missing", "docs_missing", "merge_conflict"):
372
- summary["degraded_reason"] = session_status
373
- summary["restart_policy"] = "finalization_retry"
374
- elif session_status == "infra_error":
375
- summary["restart_policy"] = "infra_retry"
376
- summary["infra_error_count"] = bs.get("infra_error_count", 0)
377
- summary["artifacts_preserved"] = True
378
- elif session_status != "success":
379
- summary["restart_policy"] = "full_restart"
380
- summary["cleanup_performed"] = cleaned
381
-
382
- print(json.dumps(summary, indent=2, ensure_ascii=False))
383
-
384
-
385
- def _default_project_root():
386
- env = os.environ.get("PROJECT_ROOT")
387
- if env:
388
- return os.path.abspath(env)
389
- script_dir = os.path.dirname(os.path.abspath(__file__))
390
- pipeline_dir = os.path.dirname(script_dir)
391
- pipeline_parent = os.path.dirname(pipeline_dir)
392
- if os.path.basename(pipeline_parent) == ".prizmkit":
393
- return os.path.dirname(pipeline_parent)
394
- return pipeline_parent
395
-
396
-
397
- def cleanup_bug_artifacts(state_dir, bug_id, project_root=None):
398
- """Delete intermediate artifacts for a failed bug run."""
399
- if not project_root:
400
- project_root = _default_project_root()
401
-
402
- cleaned = []
403
-
404
- # 1) Remove all session history
405
- sessions_dir = os.path.join(state_dir, bug_id, "sessions")
406
- sessions_deleted = 0
407
- if os.path.isdir(sessions_dir):
408
- for entry in os.listdir(sessions_dir):
409
- entry_path = os.path.join(sessions_dir, entry)
410
- if os.path.isdir(entry_path):
411
- shutil.rmtree(entry_path)
412
- sessions_deleted += 1
413
- cleaned.append("Deleted {} session(s) from {}".format(sessions_deleted, sessions_dir))
414
-
415
- # 2) Remove transient files under bug dir (keep status.json)
416
- bug_dir = os.path.join(state_dir, bug_id)
417
- if os.path.isdir(bug_dir):
418
- for entry in os.listdir(bug_dir):
419
- if entry == "status.json" or entry == "sessions":
420
- continue
421
- entry_path = os.path.join(bug_dir, entry)
422
- if os.path.isdir(entry_path):
423
- shutil.rmtree(entry_path)
424
- cleaned.append("Deleted directory {}".format(entry_path))
425
- elif os.path.isfile(entry_path):
426
- os.remove(entry_path)
427
- cleaned.append("Deleted file {}".format(entry_path))
428
-
429
- # 3) Remove bugfix artifacts
430
- bugfix_dir = os.path.join(project_root, ".prizmkit", "bugfix", bug_id)
431
- if os.path.isdir(bugfix_dir):
432
- file_count = sum(len(files) for _, _, files in os.walk(bugfix_dir))
433
- shutil.rmtree(bugfix_dir)
434
- cleaned.append("Deleted {} ({} files)".format(bugfix_dir, file_count))
435
-
436
- # 4) Remove shared dev-team workspace
437
- dev_team_dir = os.path.join(project_root, ".dev-team")
438
- if os.path.isdir(dev_team_dir):
439
- file_count = sum(len(files) for _, _, files in os.walk(dev_team_dir))
440
- shutil.rmtree(dev_team_dir)
441
- cleaned.append("Deleted {} ({} files)".format(dev_team_dir, file_count))
442
-
443
- # 5) (removed: current-session.json no longer used)
444
-
445
- return cleaned
446
-
447
-
448
- def load_session_status(state_dir, bug_id, session_id):
449
- session_status_path = os.path.join(state_dir, bug_id, "sessions",
450
- session_id, "session-status.json"
451
- )
452
- data, err = load_json_file(session_status_path)
453
- if err:
454
- return None, err
455
- return data, None
456
-
457
-
458
- # ---------------------------------------------------------------------------
459
- # Action: status
460
- # ---------------------------------------------------------------------------
461
-
462
- COLOR_GREEN = "\033[92m"
463
- COLOR_YELLOW = "\033[93m"
464
- COLOR_RED = "\033[91m"
465
- COLOR_GRAY = "\033[90m"
466
- COLOR_MAGENTA = "\033[95m"
467
- COLOR_BOLD = "\033[1m"
468
- COLOR_RESET = "\033[0m"
469
-
470
- BOX_WIDTH = 68
471
-
472
-
473
- SEVERITY_ICONS = {
474
- "critical": COLOR_RED + "🔴" + COLOR_RESET,
475
- "high": COLOR_MAGENTA + "🟠" + COLOR_RESET,
476
- "medium": COLOR_YELLOW + "🟡" + COLOR_RESET,
477
- "low": COLOR_GRAY + "🟢" + COLOR_RESET,
478
- }
479
-
480
-
481
- def action_status(bug_list_data, state_dir):
482
- bugs = bug_list_data.get("bugs", [])
483
- project_name = bug_list_data.get("project_name", "Unknown")
484
-
485
- counts = {"completed": 0, "in_progress": 0, "failed": 0, "pending": 0, "needs_info": 0, "skipped": 0}
486
- bug_lines = []
487
-
488
- for bug in bugs:
489
- if not isinstance(bug, dict):
490
- continue
491
- bid = bug.get("id")
492
- title = bug.get("title", "Untitled")
493
- severity = bug.get("severity", "medium")
494
- if not bid:
495
- continue
496
-
497
- bstatus = bug.get("status", "pending")
498
- bs = load_bug_status(state_dir, bid)
499
- retry_count = bs.get("retry_count", 0)
500
- max_retries_val = bs.get("max_retries", 3)
501
- resume_phase = bs.get("resume_from_phase")
502
-
503
- if bstatus in counts:
504
- counts[bstatus] += 1
505
- else:
506
- counts["pending"] += 1
507
-
508
- # Status icon
509
- if bstatus == "completed":
510
- icon = COLOR_GREEN + "[✓]" + COLOR_RESET
511
- elif bstatus == "in_progress":
512
- icon = COLOR_YELLOW + "[→]" + COLOR_RESET
513
- elif bstatus == "failed":
514
- icon = COLOR_RED + "[✗]" + COLOR_RESET
515
- elif bstatus == "needs_info":
516
- icon = COLOR_MAGENTA + "[?]" + COLOR_RESET
517
- elif bstatus == "skipped":
518
- icon = COLOR_GRAY + "[—]" + COLOR_RESET
519
- else:
520
- icon = COLOR_GRAY + "[ ]" + COLOR_RESET
521
-
522
- # Severity badge
523
- sev_badge = "[{}]".format(severity[:4].upper())
524
-
525
- # Detail
526
- detail = ""
527
- if bstatus == "in_progress":
528
- parts = []
529
- if retry_count > 0:
530
- parts.append("retry {}/{}".format(retry_count, max_retries_val))
531
- if resume_phase is not None:
532
- parts.append("CP-BF-{}".format(resume_phase))
533
- if parts:
534
- detail = " ({})".format(", ".join(parts))
535
- elif bstatus == "failed":
536
- detail = " (failed after {} retries)".format(retry_count)
537
- elif bstatus == "needs_info":
538
- detail = " (needs more info)"
539
-
540
- # Colorize
541
- if bstatus == "completed":
542
- line_content = "{} {} {} {} {}{}".format(
543
- bid, icon, sev_badge, COLOR_GREEN + title + COLOR_RESET, "", detail
544
- )
545
- elif bstatus == "in_progress":
546
- line_content = "{} {} {} {} {}{}".format(
547
- bid, icon, sev_badge, COLOR_YELLOW + title + COLOR_RESET, "", detail
548
- )
549
- elif bstatus == "failed":
550
- line_content = "{} {} {} {} {}{}".format(
551
- bid, icon, sev_badge, COLOR_RED + title + COLOR_RESET, "", detail
552
- )
553
- elif bstatus == "needs_info":
554
- line_content = "{} {} {} {} {}{}".format(
555
- bid, icon, sev_badge, COLOR_MAGENTA + title + COLOR_RESET, "", detail
556
- )
557
- else:
558
- line_content = "{} {} {} {} {}{}".format(
559
- bid, icon, sev_badge, COLOR_GRAY + title + COLOR_RESET, "", detail
560
- )
561
-
562
- bug_lines.append(line_content)
563
-
564
- total = len(bugs)
565
- completed = counts["completed"]
566
- percent = round(completed / total * 100, 1) if total > 0 else 0.0
567
- progress_bar = _build_progress_bar(percent, width=24)
568
-
569
- summary_line = "Total: {} bugs | Completed: {} | In Progress: {}".format(
570
- total, completed, counts["in_progress"]
571
- )
572
- summary_line2 = "Failed: {} | Pending: {} | Needs Info: {} | Skipped: {}".format(
573
- counts["failed"], counts["pending"], counts["needs_info"], counts["skipped"]
574
- )
575
-
576
- inner = BOX_WIDTH - 2
577
- print("╔" + "═" * BOX_WIDTH + "╗")
578
- print("║" + pad_right(COLOR_BOLD + " Bug-Fix Pipeline Status" + COLOR_RESET, inner) + " ║")
579
- print("╠" + "═" * BOX_WIDTH + "╣")
580
- print("║" + pad_right(" Project: {}".format(project_name), inner) + " ║")
581
- print("║" + pad_right(" {}".format(summary_line), inner) + " ║")
582
- print("║" + pad_right(" {}".format(summary_line2), inner) + " ║")
583
- print("╠" + "─" * BOX_WIDTH + "╣")
584
- print("║" + pad_right(" Progress: {}".format(progress_bar), inner) + " ║")
585
- print("╠" + "═" * BOX_WIDTH + "╣")
586
- for line in bug_lines:
587
- print("║" + pad_right(" {}".format(line), inner) + " ║")
588
- print("╚" + "═" * BOX_WIDTH + "╝")
589
-
590
-
591
- # ---------------------------------------------------------------------------
592
- # Action: reset
593
- # ---------------------------------------------------------------------------
594
-
595
- def action_reset(args, bug_list_path, state_dir):
596
- bug_id = args.bug_id
597
- if not bug_id:
598
- error_out("--bug-id is required for 'reset' action")
599
- return
600
-
601
- bs = load_bug_status(state_dir, bug_id)
602
- old_status = get_bug_status_from_list(bug_list_path, bug_id)
603
- old_retry = bs.get("retry_count", 0)
604
-
605
- bs["retry_count"] = 0
606
- bs["infra_error_count"] = 0
607
- bs["last_infra_error_session_id"] = None
608
- bs["sessions"] = []
609
- bs["last_session_id"] = None
610
- bs["resume_from_phase"] = None
611
- bs["updated_at"] = now_iso()
612
-
613
- err = save_bug_status(state_dir, bug_id, bs)
614
- if err:
615
- error_out("Failed to save bug status: {}".format(err))
616
- return
617
-
618
- err = update_bug_in_list(bug_list_path, bug_id, "pending")
619
- if err:
620
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
621
- return
622
-
623
- result = {
624
- "action": "reset",
625
- "bug_id": bug_id,
626
- "old_status": old_status,
627
- "old_retry_count": old_retry,
628
- "new_status": "pending",
629
- }
630
- print(json.dumps(result, indent=2, ensure_ascii=False))
631
-
632
-
633
- # ---------------------------------------------------------------------------
634
- # Action: clean
635
- # ---------------------------------------------------------------------------
636
-
637
- def action_clean(args, bug_list_path, state_dir):
638
- bug_id = args.bug_id
639
- project_root = args.project_root
640
-
641
- if not bug_id:
642
- error_out("--bug-id is required for 'clean' action")
643
- return
644
- if not project_root:
645
- error_out("--project-root is required for 'clean' action")
646
- return
647
-
648
- cleaned = []
649
-
650
- # 1. Delete session history
651
- sessions_dir = os.path.join(state_dir, bug_id, "sessions")
652
- sessions_deleted = 0
653
- if os.path.isdir(sessions_dir):
654
- for entry in os.listdir(sessions_dir):
655
- entry_path = os.path.join(sessions_dir, entry)
656
- if os.path.isdir(entry_path):
657
- shutil.rmtree(entry_path)
658
- sessions_deleted += 1
659
- cleaned.append("Deleted {} session(s) from {}".format(sessions_deleted, sessions_dir))
660
-
661
- # 2. Delete bugfix artifacts for this bug
662
- bugfix_dir = os.path.join(project_root, ".prizmkit", "bugfix", bug_id)
663
- if os.path.isdir(bugfix_dir):
664
- file_count = sum(len(files) for _, _, files in os.walk(bugfix_dir))
665
- shutil.rmtree(bugfix_dir)
666
- cleaned.append("Deleted {} ({} files)".format(bugfix_dir, file_count))
667
-
668
- # 3. Delete shared dev-team workspace
669
- dev_team_dir = os.path.join(project_root, ".dev-team")
670
- if os.path.isdir(dev_team_dir):
671
- file_count = sum(len(files) for _, _, files in os.walk(dev_team_dir))
672
- shutil.rmtree(dev_team_dir)
673
- cleaned.append("Deleted {} ({} files)".format(dev_team_dir, file_count))
674
-
675
- # 4. (removed: current-session.json no longer used)
676
-
677
- # 5. Reset status
678
- bs = load_bug_status(state_dir, bug_id)
679
- old_status = get_bug_status_from_list(bug_list_path, bug_id)
680
- old_retry = bs.get("retry_count", 0)
681
-
682
- bs["retry_count"] = 0
683
- bs["infra_error_count"] = 0
684
- bs["last_infra_error_session_id"] = None
685
- bs["sessions"] = []
686
- bs["last_session_id"] = None
687
- bs["resume_from_phase"] = None
688
- bs["updated_at"] = now_iso()
689
-
690
- err = save_bug_status(state_dir, bug_id, bs)
691
- if err:
692
- error_out("Failed to save bug status: {}".format(err))
693
- return
694
-
695
- err = update_bug_in_list(bug_list_path, bug_id, "pending")
696
- if err:
697
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
698
- return
699
-
700
- result = {
701
- "action": "clean",
702
- "bug_id": bug_id,
703
- "old_status": old_status,
704
- "old_retry_count": old_retry,
705
- "new_status": "pending",
706
- "sessions_deleted": sessions_deleted,
707
- "cleaned": cleaned,
708
- }
709
- print(json.dumps(result, indent=2, ensure_ascii=False))
710
-
711
-
712
- # ---------------------------------------------------------------------------
713
- # Action: pause
714
- # ---------------------------------------------------------------------------
715
-
716
- def action_pause(state_dir):
717
- pipeline_path = os.path.join(state_dir, "pipeline.json")
718
- data, err = load_json_file(pipeline_path)
719
- if err:
720
- data = {"status": "paused", "paused_at": now_iso()}
721
- else:
722
- data["status"] = "paused"
723
- data["paused_at"] = now_iso()
724
-
725
- err = write_json_file(pipeline_path, data)
726
- if err:
727
- error_out("Failed to write pipeline.json: {}".format(err))
728
- return
729
-
730
- result = {
731
- "action": "pause",
732
- "status": "paused",
733
- "paused_at": data["paused_at"],
734
- }
735
- print(json.dumps(result, indent=2, ensure_ascii=False))
736
-
737
-
738
- # ---------------------------------------------------------------------------
739
- # Action: start
740
- # ---------------------------------------------------------------------------
741
-
742
- def action_start(args, bug_list_path, state_dir):
743
- """Mark a bug as in_progress when a session starts.
744
-
745
- This keeps bug-fix-list.json/state status in sync during execution,
746
- instead of only updating after session end.
747
- """
748
- bug_id = args.bug_id
749
- if not bug_id:
750
- error_out("--bug-id is required for 'start' action")
751
- return
752
-
753
- bs = load_bug_status(state_dir, bug_id)
754
- old_status = get_bug_status_from_list(bug_list_path, bug_id)
755
-
756
- bs["updated_at"] = now_iso()
757
-
758
- err = save_bug_status(state_dir, bug_id, bs)
759
- if err:
760
- error_out("Failed to save bug status: {}".format(err))
761
- return
762
-
763
- err = update_bug_in_list(bug_list_path, bug_id, "in_progress")
764
- if err:
765
- error_out("Failed to update .prizmkit/plans/bug-fix-list.json: {}".format(err))
766
- return
767
-
768
- result = {
769
- "action": "start",
770
- "bug_id": bug_id,
771
- "old_status": old_status,
772
- "new_status": "in_progress",
773
- "retry_count": bs.get("retry_count", 0),
774
- "infra_error_count": bs.get("infra_error_count", 0),
775
- "updated_at": bs["updated_at"],
776
- }
777
- print(json.dumps(result, indent=2, ensure_ascii=False))
778
-
779
-
780
- # ---------------------------------------------------------------------------
781
- # Action: unskip
782
- # ---------------------------------------------------------------------------
783
-
784
- def action_unskip(args, bug_list_path, state_dir):
785
- """Reset skipped bugs back to pending.
786
-
787
- Two modes:
788
- - --bug-id B-001: Reset the specified skipped bug to pending.
789
- - No --bug-id: Reset ALL skipped bugs to pending.
790
- """
791
- bug_id = args.bug_id
792
-
793
- data, err = load_json_file(bug_list_path)
794
- if err:
795
- error_out("Cannot load bug fix list: {}".format(err))
796
- return
797
- bugs = data.get("bugs", [])
798
-
799
- to_reset = set()
800
-
801
- if bug_id:
802
- # Find the target bug
803
- target = None
804
- for b in bugs:
805
- if isinstance(b, dict) and b.get("id") == bug_id:
806
- target = b
807
- break
808
- if not target:
809
- error_out("Bug '{}' not found in .prizmkit/plans/bug-fix-list.json".format(bug_id))
810
- return
811
- if target.get("status") not in ("failed", "skipped", "needs_info"):
812
- error_out(
813
- "Bug '{}' has status '{}', expected 'failed', 'skipped', or 'needs_info'".format(
814
- bug_id, target.get("status", "unknown")
815
- )
816
- )
817
- return
818
- to_reset.add(bug_id)
819
- else:
820
- # No bug-id: reset ALL skipped/failed/needs_info bugs
821
- for b in bugs:
822
- if isinstance(b, dict) and b.get("id"):
823
- if b.get("status") in ("failed", "skipped", "needs_info"):
824
- to_reset.add(b["id"])
825
-
826
- if not to_reset:
827
- error_out("No bugs to unskip")
828
- return
829
-
830
- # Reset all collected bugs in bug-fix-list.json
831
- reset_details = []
832
- for b in bugs:
833
- if isinstance(b, dict) and b.get("id") in to_reset:
834
- old_status = b.get("status", "unknown")
835
- b["status"] = "pending"
836
- reset_details.append({
837
- "bug_id": b["id"],
838
- "title": b.get("title", ""),
839
- "old_status": old_status,
840
- })
841
-
842
- err = write_json_file(bug_list_path, data)
843
- if err:
844
- error_out("Failed to write .prizmkit/plans/bug-fix-list.json: {}".format(err))
845
- return
846
-
847
- # Reset runtime fields in status.json for each bug
848
- for bid in to_reset:
849
- bs = load_bug_status(state_dir, bid)
850
- bs["retry_count"] = 0
851
- bs["infra_error_count"] = 0
852
- bs["last_infra_error_session_id"] = None
853
- bs["sessions"] = []
854
- bs["last_session_id"] = None
855
- bs["resume_from_phase"] = None
856
- bs["updated_at"] = now_iso()
857
- save_bug_status(state_dir, bid, bs)
858
-
859
- result = {
860
- "action": "unskip",
861
- "reset_count": len(to_reset),
862
- "bugs": reset_details,
863
- }
864
- print(json.dumps(result, indent=2, ensure_ascii=False))
865
-
866
-
867
- # ---------------------------------------------------------------------------
868
- # Main
869
- # ---------------------------------------------------------------------------
870
-
871
- def main():
872
- args = parse_args()
873
-
874
- if args.action == "update":
875
- if not args.bug_id:
876
- error_out("--bug-id is required for 'update' action")
877
- if not args.session_status:
878
- error_out("--session-status is required for 'update' action")
879
- if args.action in ("start", "reset", "clean", "complete"):
880
- if not args.bug_id:
881
- error_out("--bug-id is required for '{}' action".format(args.action))
882
- if args.action == "clean":
883
- if not args.project_root:
884
- error_out("--project-root is required for 'clean' action")
885
-
886
- bug_list_data, err = load_json_file(args.bug_list)
887
- if err:
888
- error_out("Cannot load bug fix list: {}".format(err))
889
-
890
- if args.action == "get_next":
891
- action_get_next(bug_list_data, args.state_dir)
892
- elif args.action == "start":
893
- action_start(args, args.bug_list, args.state_dir)
894
- elif args.action == "update":
895
- action_update(args, args.bug_list, args.state_dir)
896
- elif args.action == "status":
897
- action_status(bug_list_data, args.state_dir)
898
- elif args.action == "reset":
899
- action_reset(args, args.bug_list, args.state_dir)
900
- elif args.action == "clean":
901
- action_clean(args, args.bug_list, args.state_dir)
902
- elif args.action == "pause":
903
- action_pause(args.state_dir)
904
- elif args.action == "unskip":
905
- action_unskip(args, args.bug_list, args.state_dir)
906
- elif args.action == "complete":
907
- # Shortcut: 'complete' is equivalent to 'update --session-status success'
908
- args.session_status = "success"
909
- action_update(args, args.bug_list, args.state_dir)
910
-
911
-
912
- if __name__ == "__main__":
913
- main()