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
@@ -0,0 +1,147 @@
1
+ """Status updater subprocess bridge for Python foreground runners."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import subprocess
7
+ import sys
8
+ from dataclasses import dataclass
9
+ from pathlib import Path
10
+
11
+ from .runner_models import RunnerFamily, RunnerInvocation
12
+
13
+
14
+ @dataclass(frozen=True)
15
+ class StatusCommandResult:
16
+ """Captured output from a canonical status updater script."""
17
+
18
+ action: str
19
+ return_code: int
20
+ stdout: str
21
+ stderr: str
22
+ data: object | None = None
23
+
24
+ @property
25
+ def ok(self) -> bool:
26
+ return self.return_code == 0
27
+
28
+ @property
29
+ def text(self) -> str:
30
+ return self.stdout.strip() or self.stderr.strip()
31
+
32
+
33
+ def run_status_action(
34
+ family: RunnerFamily,
35
+ action: str,
36
+ invocation: RunnerInvocation,
37
+ *,
38
+ item_id: str = "",
39
+ session_status: str = "",
40
+ session_id: str = "",
41
+ max_retries: int = 3,
42
+ active_dev_branch: str = "",
43
+ base_branch: str = "",
44
+ last_fatal_error_code: str = "",
45
+ continuation_summary_path: Path | None = None,
46
+ no_progress_count: int | None = None,
47
+ progress_fingerprint: object | None = None,
48
+ project_root: Path | None = None,
49
+ ) -> StatusCommandResult:
50
+ """Invoke an existing updater script and parse JSON output when present."""
51
+ command = [
52
+ sys.executable,
53
+ str(family.updater_script),
54
+ family.list_arg,
55
+ str(invocation.list_path),
56
+ "--state-dir",
57
+ str(family.state_dir),
58
+ "--action",
59
+ action,
60
+ "--max-retries",
61
+ str(max_retries),
62
+ "--max-infra-retries",
63
+ str(invocation.max_infra_retries),
64
+ ]
65
+ if item_id:
66
+ command.extend([family.item_id_arg, item_id])
67
+ if session_status:
68
+ command.extend(["--session-status", session_status])
69
+ if session_id:
70
+ command.extend(["--session-id", session_id])
71
+ if family.kind == "feature" and invocation.item_filter:
72
+ command.extend(["--features", invocation.item_filter])
73
+ if active_dev_branch:
74
+ command.extend(["--active-dev-branch", active_dev_branch])
75
+ if base_branch:
76
+ command.extend(["--base-branch", base_branch])
77
+ if last_fatal_error_code:
78
+ command.extend(["--last-fatal-error-code", last_fatal_error_code])
79
+ if continuation_summary_path is not None:
80
+ command.extend(["--continuation-summary-path", str(continuation_summary_path)])
81
+ if no_progress_count is not None:
82
+ command.extend(["--no-progress-count", str(no_progress_count)])
83
+ if progress_fingerprint is not None:
84
+ command.extend(["--progress-fingerprint", json.dumps(progress_fingerprint, sort_keys=True)])
85
+ if project_root is not None:
86
+ command.extend(["--project-root", str(project_root)])
87
+
88
+ completed = subprocess.run(
89
+ command,
90
+ cwd=str(project_root or family.plan_path.parent.parent.parent),
91
+ stdout=subprocess.PIPE,
92
+ stderr=subprocess.PIPE,
93
+ text=True,
94
+ check=False,
95
+ )
96
+ text = completed.stdout.strip()
97
+ data = None
98
+ if text and text not in {"PIPELINE_COMPLETE", "PIPELINE_BLOCKED"}:
99
+ try:
100
+ data = json.loads(text)
101
+ except json.JSONDecodeError:
102
+ data = None
103
+ return StatusCommandResult(
104
+ action=action,
105
+ return_code=completed.returncode,
106
+ stdout=completed.stdout,
107
+ stderr=completed.stderr,
108
+ data=data,
109
+ )
110
+
111
+
112
+ def get_next(family: RunnerFamily, invocation: RunnerInvocation, project_root: Path) -> StatusCommandResult:
113
+ return run_status_action(family, "get_next", invocation, project_root=project_root)
114
+
115
+
116
+ def start_item(family: RunnerFamily, invocation: RunnerInvocation, item_id: str, project_root: Path) -> StatusCommandResult:
117
+ return run_status_action(family, "start", invocation, item_id=item_id, project_root=project_root)
118
+
119
+
120
+ def update_item(
121
+ family: RunnerFamily,
122
+ invocation: RunnerInvocation,
123
+ item_id: str,
124
+ session_status: str,
125
+ session_id: str,
126
+ project_root: Path,
127
+ **metadata: object,
128
+ ) -> StatusCommandResult:
129
+ return run_status_action(
130
+ family,
131
+ "update",
132
+ invocation,
133
+ item_id=item_id,
134
+ session_status=session_status,
135
+ session_id=session_id,
136
+ project_root=project_root,
137
+ active_dev_branch=str(metadata.get("active_dev_branch") or ""),
138
+ base_branch=str(metadata.get("base_branch") or ""),
139
+ last_fatal_error_code=str(metadata.get("last_fatal_error_code") or ""),
140
+ continuation_summary_path=metadata.get("continuation_summary_path") if isinstance(metadata.get("continuation_summary_path"), Path) else None,
141
+ no_progress_count=metadata.get("no_progress_count") if isinstance(metadata.get("no_progress_count"), int) else None,
142
+ progress_fingerprint=metadata.get("progress_fingerprint"),
143
+ )
144
+
145
+
146
+ def status_text(family: RunnerFamily, invocation: RunnerInvocation, project_root: Path) -> StatusCommandResult:
147
+ return run_status_action(family, "status", invocation, project_root=project_root)
@@ -0,0 +1,422 @@
1
+ """Python foreground runner dispatch for feature, bugfix, refactor, and recovery."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ import time
7
+ from pathlib import Path
8
+
9
+ from .commands import CommandResult # type: ignore # imported only at runtime by commands.py
10
+ from .config import load_runtime_config
11
+ from .gitops import (
12
+ BranchContext,
13
+ WorktreePolicy,
14
+ branch_create_plan,
15
+ branch_ensure_return,
16
+ branch_merge_plan,
17
+ current_branch,
18
+ ensure_linked_worktree,
19
+ guarded_worktree_remove,
20
+ materialize_worktree_support_assets,
21
+ merge_linked_worktree,
22
+ run_git_command,
23
+ run_git_plan,
24
+ worktree_runtime_context,
25
+ worktree_save_wip,
26
+ )
27
+ from .runner_bookkeeping import commit_final_bookkeeping, commit_pre_branch_bookkeeping
28
+ from .runner_classification import classify_session
29
+ from .runner_models import RunnerEnvironment, RunnerFamily, RunnerInvocation, SessionPaths, family_for, parse_invocation
30
+ from .runner_prompts import PromptGenerationResult, generate_prompt
31
+ from .runner_recovery import run_recovery, run_recovery_detect
32
+ from .runner_status import get_next, run_status_action, start_item, status_text, update_item
33
+ from .sessions import AISessionConfig, AISessionLauncher, detect_stream_json_support
34
+
35
+
36
+ def run_pipeline_command(kind: str, action: str, legacy_args: tuple[str, ...], paths) -> CommandResult:
37
+ """Dispatch a feature/bugfix/refactor Python foreground command."""
38
+ family = family_for(kind, paths)
39
+ invocation = parse_invocation(family, action, legacy_args)
40
+ invocation = _resolve_invocation_paths(invocation, paths.project_root)
41
+ if invocation.help_requested:
42
+ return CommandResult(0, f"Python {kind} runner", _help_text(family))
43
+ if action == "status":
44
+ status = status_text(family, invocation, paths.project_root)
45
+ return CommandResult(status.return_code, f"Python {kind} status", status.stdout.strip() or status.stderr.strip())
46
+ if action == "unskip":
47
+ status = run_status_action(
48
+ family,
49
+ "unskip",
50
+ invocation,
51
+ item_id=invocation.item_id,
52
+ project_root=paths.project_root,
53
+ )
54
+ return CommandResult(
55
+ status.return_code,
56
+ f"Python {kind} unskip",
57
+ status.stdout.strip() or status.stderr.strip(),
58
+ )
59
+ if action == "test-cli":
60
+ return _test_cli(kind, paths)
61
+ if action != "run":
62
+ return CommandResult(1, "Unsupported Python runner action", f"Unsupported action: {kind} {action}")
63
+ if not invocation.list_path.is_file():
64
+ return CommandResult(1, f"Python {kind} runner", f"Plan list not found: {invocation.list_path}")
65
+ try:
66
+ result = _run_pipeline(family, invocation, paths)
67
+ except Exception as exc: # keep CLI boundary traceback-free
68
+ return CommandResult(1, f"Python {kind} runner failed", str(exc))
69
+ details = result.details + ((f"last_status: {result.last_status}",) if result.last_status else ())
70
+ return CommandResult(
71
+ 0 if result.completed else 1,
72
+ f"Python {kind} runner",
73
+ f"processed={result.processed} completed={result.completed} stopped_reason={result.stopped_reason or 'none'}",
74
+ details=details,
75
+ )
76
+
77
+
78
+ def run_recovery_command(action: str, legacy_args: tuple[str, ...], paths) -> CommandResult:
79
+ """Dispatch a Python recovery command."""
80
+ if action == "detect":
81
+ code, stdout, stderr, _data = run_recovery_detect(paths)
82
+ return CommandResult(code, "Python recovery detect", stdout.strip() or stderr.strip())
83
+ if action == "run":
84
+ code, stdout, stderr = run_recovery(paths, legacy_args)
85
+ return CommandResult(code, "Python recovery run", stdout.strip() or stderr.strip())
86
+ return CommandResult(1, "Unsupported Python recovery action", f"Unsupported action: {action}")
87
+
88
+
89
+ def _run_pipeline(family: RunnerFamily, invocation: RunnerInvocation, paths) -> "PipelineRunResult":
90
+ from .runner_models import PipelineRunResult
91
+
92
+ processed = 0
93
+ details: list[str] = []
94
+ if invocation.item_id:
95
+ status = _process_item(family, invocation, invocation.item_id, paths, initial_metadata={})
96
+ return PipelineRunResult(status == "completed", 1, "single_item_done", status, tuple(details))
97
+
98
+ while True:
99
+ next_result = get_next(family, invocation, paths.project_root)
100
+ if not next_result.ok:
101
+ return PipelineRunResult(False, processed, "get_next_failed", details=(next_result.text,))
102
+ marker = next_result.stdout.strip()
103
+ if marker == "PIPELINE_COMPLETE":
104
+ return PipelineRunResult(True, processed, "pipeline_complete", details=tuple(details))
105
+ if marker == "PIPELINE_BLOCKED":
106
+ return PipelineRunResult(False, processed, "pipeline_blocked", details=tuple(details))
107
+ if not isinstance(next_result.data, dict):
108
+ return PipelineRunResult(False, processed, "invalid_get_next_output", details=(marker[:500],))
109
+ item_id = str(next_result.data.get(f"{family.kind}_id") or next_result.data.get("feature_id") or next_result.data.get("bug_id") or next_result.data.get("refactor_id") or "")
110
+ if not item_id:
111
+ return PipelineRunResult(False, processed, "missing_item_id", details=(marker[:500],))
112
+ final_status = _process_item(family, invocation, item_id, paths, initial_metadata=next_result.data)
113
+ processed += 1
114
+ details.append(f"{item_id}:{final_status}")
115
+ if final_status == "completed":
116
+ continue
117
+ if RunnerEnvironment.from_env().stop_on_failure:
118
+ return PipelineRunResult(False, processed, "stop_on_failure", final_status, tuple(details))
119
+ if final_status in {"failed", "needs_info"}:
120
+ return PipelineRunResult(False, processed, "item_failed", final_status, tuple(details))
121
+
122
+
123
+ def _process_item(
124
+ family: RunnerFamily,
125
+ invocation: RunnerInvocation,
126
+ item_id: str,
127
+ paths,
128
+ *,
129
+ initial_metadata: dict[str, object],
130
+ ) -> str:
131
+ env = RunnerEnvironment.from_env()
132
+ config = load_runtime_config(paths)
133
+ if not config.ai_client.command:
134
+ raise RuntimeError("No supported AI CLI command was found")
135
+ start = start_item(family, invocation, item_id, paths.project_root)
136
+ if not start.ok:
137
+ raise RuntimeError(start.text)
138
+ commit_pre_branch_bookkeeping(paths.project_root, family, item_id)
139
+
140
+ base_branch = str(initial_metadata.get("base_branch") or current_branch(paths.project_root) or "main")
141
+ branch_name = str(initial_metadata.get("active_dev_branch") or env.dev_branch or _default_branch_name(family, item_id))
142
+ branch_context = BranchContext(base_branch, branch_name, paths.project_root)
143
+ worktree_runtime = None
144
+ use_worktree = _use_worktree_for_family(env, family)
145
+ execution_root = paths.project_root
146
+ if use_worktree:
147
+ worktree_runtime = worktree_runtime_context(
148
+ branch_context,
149
+ WorktreePolicy(
150
+ use_worktree=True,
151
+ cleanup_on_success=True,
152
+ preserve_on_failure=True,
153
+ worktree_root=paths.state_dir / "worktrees",
154
+ ),
155
+ )
156
+ setup = ensure_linked_worktree(worktree_runtime)
157
+ if not setup.ok:
158
+ status = update_item(family, invocation, item_id, "infra_error", "", paths.project_root)
159
+ return _status_from_update(status)
160
+ worktree_runtime = setup.runtime or worktree_runtime
161
+ support_assets = materialize_worktree_support_assets(worktree_runtime)
162
+ if not support_assets.ok:
163
+ status = update_item(family, invocation, item_id, "infra_error", "", paths.project_root)
164
+ return _status_from_update(status)
165
+ execution_root = worktree_runtime.worktree_path
166
+ else:
167
+ branch_result = run_git_plan(paths.project_root, branch_create_plan(branch_context))
168
+ if not branch_result.ok:
169
+ status = update_item(family, invocation, item_id, "infra_error", "", paths.project_root)
170
+ return _status_from_update(status)
171
+
172
+ previous_fingerprint = initial_metadata.get("last_progress_fingerprint")
173
+ previous_no_progress_count = int(initial_metadata.get("no_progress_count") or 0)
174
+ continuation_pending = bool(initial_metadata.get("continuation_pending"))
175
+ previous_session_id = str(initial_metadata.get("previous_session_id") or initial_metadata.get("last_context_overflow_session_id") or "")
176
+ continuation_count = int(initial_metadata.get("continuation_count") or 0)
177
+ context_overflow_count = int(initial_metadata.get("context_overflow_count") or 0)
178
+
179
+ while True:
180
+ session_id = _session_id(item_id)
181
+ session_paths = SessionPaths.for_item(family.state_dir, item_id, session_id)
182
+ continuation = None
183
+ if continuation_pending:
184
+ continuation = {
185
+ "previous_session_id": previous_session_id,
186
+ "continuation_count": continuation_count,
187
+ "context_overflow_count": context_overflow_count,
188
+ "task_type": family.task_type,
189
+ "active_dev_branch": branch_name,
190
+ "base_branch": base_branch,
191
+ "continuation_summary_path": _continuation_summary_path(paths.project_root, family, item_id, None),
192
+ }
193
+ prompt = generate_prompt(
194
+ family,
195
+ invocation,
196
+ item_id=item_id,
197
+ session_id=session_id,
198
+ run_id="run-python",
199
+ retry_count=0,
200
+ session_paths=session_paths,
201
+ project_root=paths.project_root,
202
+ execution_root=execution_root,
203
+ continuation=continuation,
204
+ )
205
+ if invocation.dry_run:
206
+ return "dry_run"
207
+ stream_json = detect_stream_json_support(config.ai_client.command, config.ai_client.platform).enabled
208
+ base_head = run_git_command(execution_root, ("rev-parse", "HEAD")).stdout.strip()
209
+ session_result = AISessionLauncher(
210
+ AISessionConfig(
211
+ cli_command=config.ai_client.command,
212
+ platform=config.ai_client.platform or "codebuddy",
213
+ model=prompt.model or config.model,
214
+ prompt_path=prompt.output_path,
215
+ cwd=execution_root,
216
+ log_path=session_paths.session_log,
217
+ progress_path=session_paths.progress_json,
218
+ heartbeat_path=session_paths.heartbeat_json,
219
+ effort=config.effort,
220
+ verbose=env.verbose,
221
+ use_stream_json=stream_json,
222
+ stale_kill_threshold_seconds=env.stale_kill_threshold_seconds,
223
+ )
224
+ ).run()
225
+ classification = classify_session(
226
+ session_result,
227
+ project_root=execution_root,
228
+ base_head=base_head,
229
+ prompt=prompt,
230
+ previous_fingerprint=previous_fingerprint,
231
+ previous_no_progress_count=previous_no_progress_count,
232
+ )
233
+ if classification.session_status == "context_overflow":
234
+ summary_path = _continuation_summary_path(paths.project_root, family, item_id, prompt)
235
+ update = update_item(
236
+ family,
237
+ invocation,
238
+ item_id,
239
+ "context_overflow",
240
+ session_id,
241
+ paths.project_root,
242
+ active_dev_branch=branch_name,
243
+ base_branch=base_branch,
244
+ last_fatal_error_code=classification.fatal_error_code or "context_overflow",
245
+ continuation_summary_path=summary_path,
246
+ no_progress_count=classification.no_progress_count,
247
+ progress_fingerprint=classification.progress_fingerprint,
248
+ )
249
+ if not update.ok:
250
+ raise RuntimeError(update.text)
251
+ previous_fingerprint = classification.progress_fingerprint
252
+ previous_no_progress_count = classification.no_progress_count
253
+ continuation_pending = True
254
+ previous_session_id = session_id
255
+ continuation_count += 1
256
+ context_overflow_count += 1
257
+ continue
258
+
259
+ final_session_status = classification.session_status
260
+ if use_worktree and worktree_runtime is not None:
261
+ if final_session_status == "success":
262
+ merge = merge_linked_worktree(worktree_runtime, auto_push=env.auto_push)
263
+ if merge.ok:
264
+ guarded_worktree_remove(worktree_runtime, delete_branch=True)
265
+ else:
266
+ final_session_status = "merge_conflict"
267
+ guarded_worktree_remove(worktree_runtime, delete_branch=False)
268
+ else:
269
+ worktree_save_wip(worktree_runtime)
270
+ guarded_worktree_remove(worktree_runtime, delete_branch=False)
271
+ else:
272
+ if final_session_status == "success":
273
+ merge = run_git_plan(paths.project_root, branch_merge_plan(branch_context, auto_push=env.auto_push))
274
+ if not merge.ok:
275
+ branch_ensure_return(paths.project_root, base_branch, branch_name)
276
+ final_session_status = "merge_conflict"
277
+ else:
278
+ branch_ensure_return(paths.project_root, base_branch, branch_name)
279
+
280
+ _write_session_status(
281
+ session_paths,
282
+ status=final_session_status,
283
+ session_id=session_id,
284
+ task_id=item_id,
285
+ task_type=family.task_type,
286
+ base_branch=base_branch,
287
+ active_dev_branch=branch_name,
288
+ worktree_path=worktree_runtime.worktree_path if worktree_runtime is not None else None,
289
+ reason=classification.reason,
290
+ fatal_error_code=classification.fatal_error_code,
291
+ )
292
+
293
+ update = update_item(
294
+ family,
295
+ invocation,
296
+ item_id,
297
+ final_session_status,
298
+ session_id,
299
+ paths.project_root,
300
+ active_dev_branch=branch_name,
301
+ base_branch=base_branch,
302
+ last_fatal_error_code=classification.fatal_error_code,
303
+ no_progress_count=classification.no_progress_count,
304
+ progress_fingerprint=classification.progress_fingerprint,
305
+ )
306
+ if not update.ok:
307
+ raise RuntimeError(update.text)
308
+ new_status = _status_from_update(update)
309
+ commit_final_bookkeeping(paths.project_root, family, item_id, new_status)
310
+ return new_status
311
+
312
+
313
+
314
+ def _test_cli(kind: str, paths) -> CommandResult:
315
+ """Report the AI CLI resolution used by Python runner commands."""
316
+ config = load_runtime_config(paths)
317
+ cli = config.ai_client.command or "(not found)"
318
+ platform = config.ai_client.platform or "unresolved"
319
+ details = [
320
+ f"detected_cli: {cli}",
321
+ f"platform: {platform}",
322
+ f"source: {config.ai_client.source}",
323
+ f"runtime_mode: {config.runtime_mode}",
324
+ ]
325
+ if config.model:
326
+ details.append(f"model: {config.model}")
327
+ details.extend(f"note: {note}" for note in config.ai_client.notes)
328
+ return CommandResult(
329
+ 0 if config.ai_client.command else 1,
330
+ f"Python {kind} AI CLI test",
331
+ "AI CLI resolution for the canonical Python runtime.",
332
+ tuple(details),
333
+ )
334
+
335
+
336
+ def _use_worktree_for_family(env: RunnerEnvironment, family: RunnerFamily) -> bool:
337
+ return env.use_worktree and family.kind in {"feature", "bugfix"}
338
+
339
+
340
+ def _write_session_status(
341
+ session_paths: SessionPaths,
342
+ *,
343
+ status: str,
344
+ session_id: str,
345
+ task_id: str,
346
+ task_type: str,
347
+ base_branch: str,
348
+ active_dev_branch: str,
349
+ worktree_path: Path | None = None,
350
+ reason: str = "",
351
+ fatal_error_code: str = "",
352
+ ) -> None:
353
+ payload = {
354
+ "status": status,
355
+ "session_id": session_id,
356
+ "task_id": task_id,
357
+ "task_type": task_type,
358
+ "base_branch": base_branch,
359
+ "active_dev_branch": active_dev_branch,
360
+ }
361
+ if worktree_path is not None:
362
+ payload["worktree_path"] = str(worktree_path)
363
+ if reason:
364
+ payload["reason"] = reason
365
+ if fatal_error_code:
366
+ payload["fatal_error_code"] = fatal_error_code
367
+ session_paths.session_status_json.parent.mkdir(parents=True, exist_ok=True)
368
+ session_paths.session_status_json.write_text(
369
+ json.dumps(payload, indent=2, sort_keys=True) + "\n",
370
+ encoding="utf-8",
371
+ )
372
+
373
+ def _status_from_update(update_result) -> str:
374
+ if isinstance(update_result.data, dict):
375
+ return str(update_result.data.get("new_status") or update_result.data.get("status") or "unknown")
376
+ return "unknown"
377
+
378
+
379
+ def _default_branch_name(family: RunnerFamily, item_id: str) -> str:
380
+ stamp = time.strftime("%Y%m%d%H%M")
381
+ return f"{family.branch_prefix}/{item_id}-{stamp}"
382
+
383
+
384
+ def _session_id(item_id: str) -> str:
385
+ return f"{item_id}-{time.strftime('%Y%m%d%H%M%S')}"
386
+
387
+
388
+ def _continuation_summary_path(project_root: Path, family: RunnerFamily, item_id: str, prompt: PromptGenerationResult | None) -> Path:
389
+ if prompt and prompt.artifact_path:
390
+ return prompt.artifact_path / "continuation-summary.md"
391
+ if family.kind == "feature":
392
+ return project_root / ".prizmkit" / "specs" / item_id / "continuation-summary.md"
393
+ return project_root / ".prizmkit" / family.artifact_root_name / item_id / "continuation-summary.md"
394
+
395
+
396
+ def _resolve_invocation_paths(invocation: RunnerInvocation, project_root: Path) -> RunnerInvocation:
397
+ if invocation.list_path.is_absolute():
398
+ return invocation
399
+ return RunnerInvocation(
400
+ action=invocation.action,
401
+ list_path=(project_root / invocation.list_path).resolve(),
402
+ item_id=invocation.item_id,
403
+ item_filter=invocation.item_filter,
404
+ max_infra_retries=invocation.max_infra_retries,
405
+ mode=invocation.mode,
406
+ critic=invocation.critic,
407
+ dry_run=invocation.dry_run,
408
+ clean=invocation.clean,
409
+ no_reset=invocation.no_reset,
410
+ resume_phase=invocation.resume_phase,
411
+ help_requested=invocation.help_requested,
412
+ unknown_args=invocation.unknown_args,
413
+ raw_args=invocation.raw_args,
414
+ )
415
+
416
+
417
+ def _help_text(family: RunnerFamily) -> str:
418
+ return (
419
+ f"Python foreground runner for {family.kind}.\n"
420
+ "Supported legacy options include plan list path, item id, --features for feature, "
421
+ "--max-infra-retries, --mode, --critic/--no-critic, --resume-phase, and --dry-run."
422
+ )