bmalph 2.7.7 → 2.8.0

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 (432) hide show
  1. package/bmad/bmm/agents/analyst.agent.yaml +6 -6
  2. package/bmad/bmm/agents/architect.agent.yaml +2 -2
  3. package/bmad/bmm/agents/bmad-skill-manifest.yaml +39 -0
  4. package/bmad/bmm/agents/dev.agent.yaml +2 -2
  5. package/bmad/bmm/agents/pm.agent.yaml +6 -6
  6. package/bmad/bmm/agents/qa.agent.yaml +1 -1
  7. package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +7 -3
  8. package/bmad/bmm/agents/sm.agent.yaml +4 -4
  9. package/bmad/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
  10. package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +1 -1
  11. package/bmad/bmm/agents/ux-designer.agent.yaml +1 -1
  12. package/bmad/bmm/module-help.csv +26 -25
  13. package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +6 -0
  14. package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +1 -0
  15. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/product-brief.template.md +2 -2
  16. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01-init.md +4 -11
  17. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01b-continue.md +0 -3
  18. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-02-vision.md +5 -11
  19. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-03-users.md +5 -11
  20. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-04-metrics.md +5 -11
  21. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-05-scope.md +5 -11
  22. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-06-complete.md +1 -4
  23. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/workflow.md +4 -6
  24. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/SKILL.md +88 -0
  25. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/artifact-analyzer.md +60 -0
  26. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/opportunity-reviewer.md +44 -0
  27. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/skeptic-reviewer.md +44 -0
  28. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/web-researcher.md +49 -0
  29. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-manifest.json +17 -0
  30. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +1 -0
  31. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/contextual-discovery.md +57 -0
  32. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/draft-and-review.md +86 -0
  33. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/finalize.md +75 -0
  34. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/guided-elicitation.md +70 -0
  35. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/resources/brief-template.md +60 -0
  36. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/SKILL.md +6 -0
  37. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +1 -0
  38. package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-06-research-synthesis.md +2 -1
  39. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/research.template.md +29 -0
  40. package/bmad/bmm/workflows/1-analysis/research/{workflow-domain-research.md → bmad-domain-research/workflow.md} +0 -5
  41. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/SKILL.md +6 -0
  42. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +1 -0
  43. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/research.template.md +29 -0
  44. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
  45. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
  46. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
  47. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
  48. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
  49. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +478 -0
  50. package/bmad/bmm/workflows/1-analysis/research/{workflow-market-research.md → bmad-market-research/workflow.md} +1 -6
  51. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/SKILL.md +6 -0
  52. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +1 -0
  53. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/research.template.md +29 -0
  54. package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-06-research-synthesis.md +2 -1
  55. package/bmad/bmm/workflows/1-analysis/research/{workflow-technical-research.md → bmad-technical-research/workflow.md} +0 -4
  56. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +2 -2
  57. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +2 -2
  58. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +2 -2
  59. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +2 -2
  60. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +2 -1
  61. package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/SKILL.md +6 -0
  62. package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +1 -0
  63. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01-init.md +2 -2
  64. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01b-continue.md +1 -1
  65. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-02-discovery.md +2 -2
  66. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-03-core-experience.md +5 -4
  67. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-04-emotional-response.md +5 -4
  68. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-05-inspiration.md +5 -4
  69. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-06-design-system.md +5 -4
  70. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-07-defining-experience.md +5 -4
  71. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-08-visual-foundation.md +5 -4
  72. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-09-design-directions.md +5 -4
  73. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-10-user-journeys.md +5 -4
  74. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-11-component-strategy.md +5 -4
  75. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-12-ux-patterns.md +5 -4
  76. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-13-responsive-accessibility.md +5 -4
  77. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-14-complete.md +3 -3
  78. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/workflow.md +2 -8
  79. package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/SKILL.md +6 -0
  80. package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +1 -0
  81. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01-discovery.md +3 -8
  82. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01b-legacy-conversion.md +1 -5
  83. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-02-review.md +5 -9
  84. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-03-edit.md +3 -6
  85. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-04-complete.md +2 -5
  86. package/bmad/bmm/workflows/2-plan-workflows/{create-prd/workflow-edit-prd.md → bmad-edit-prd/workflow.md} +2 -4
  87. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/SKILL.md +6 -0
  88. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +1 -0
  89. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/domain-complexity.csv +15 -0
  90. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/prd-purpose.md +197 -0
  91. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/project-types.csv +11 -0
  92. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  93. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  94. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  95. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  96. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  97. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  98. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  99. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  100. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  101. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  102. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  103. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  104. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  105. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  106. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/workflow.md +62 -0
  107. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +2 -4
  108. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +1 -1
  109. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +3 -3
  110. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +3 -2
  111. package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +3 -1
  112. package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/SKILL.md +6 -0
  113. package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
  114. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-01-document-discovery.md +3 -8
  115. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-02-prd-analysis.md +1 -5
  116. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-03-epic-coverage-validation.md +1 -5
  117. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-04-ux-alignment.md +1 -5
  118. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-05-epic-quality-review.md +2 -6
  119. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-06-final-assessment.md +1 -4
  120. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/workflow.md +1 -6
  121. package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/SKILL.md +6 -0
  122. package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +1 -0
  123. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01-init.md +4 -4
  124. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01b-continue.md +11 -2
  125. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-02-context.md +4 -4
  126. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-03-starter.md +5 -7
  127. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-04-decisions.md +4 -4
  128. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-05-patterns.md +4 -4
  129. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-06-structure.md +4 -4
  130. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-07-validation.md +4 -4
  131. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-08-complete.md +1 -1
  132. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/workflow.md +1 -12
  133. package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/SKILL.md +6 -0
  134. package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
  135. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-01-validate-prerequisites.md +37 -41
  136. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-02-design-epics.md +7 -28
  137. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-03-create-stories.md +13 -30
  138. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-04-final-validation.md +3 -21
  139. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/templates/epics-template.md +4 -0
  140. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/workflow.md +1 -6
  141. package/bmad/bmm/workflows/4-implementation/bmad-code-review/SKILL.md +6 -0
  142. package/bmad/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +1 -0
  143. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-01-gather-context.md +61 -0
  144. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +41 -0
  145. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-03-triage.md +50 -0
  146. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +38 -0
  147. package/bmad/bmm/workflows/4-implementation/bmad-code-review/workflow.md +54 -0
  148. package/bmad/bmm/workflows/4-implementation/bmad-correct-course/SKILL.md +6 -0
  149. package/bmad/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +1 -0
  150. package/bmad/bmm/workflows/4-implementation/{correct-course → bmad-correct-course}/checklist.md +1 -1
  151. package/bmad/bmm/workflows/4-implementation/{correct-course/instructions.md → bmad-correct-course/workflow.md} +74 -14
  152. package/bmad/bmm/workflows/4-implementation/bmad-create-story/SKILL.md +6 -0
  153. package/bmad/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +1 -0
  154. package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/checklist.md +9 -10
  155. package/bmad/bmm/workflows/4-implementation/bmad-create-story/discover-inputs.md +88 -0
  156. package/bmad/bmm/workflows/4-implementation/bmad-create-story/workflow.md +380 -0
  157. package/bmad/bmm/workflows/4-implementation/bmad-dev-story/SKILL.md +6 -0
  158. package/bmad/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +1 -0
  159. package/bmad/bmm/workflows/4-implementation/{dev-story/instructions.xml → bmad-dev-story/workflow.md} +42 -2
  160. package/bmad/bmm/workflows/4-implementation/bmad-retrospective/SKILL.md +6 -0
  161. package/bmad/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +1 -0
  162. package/bmad/bmm/workflows/4-implementation/{retrospective/instructions.md → bmad-retrospective/workflow.md} +58 -23
  163. package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/SKILL.md +6 -0
  164. package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +1 -0
  165. package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/sprint-status-template.yaml +1 -0
  166. package/bmad/bmm/workflows/4-implementation/{sprint-planning/instructions.md → bmad-sprint-planning/workflow.md} +47 -10
  167. package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/SKILL.md +6 -0
  168. package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +1 -0
  169. package/bmad/bmm/workflows/4-implementation/{sprint-status/instructions.md → bmad-sprint-status/workflow.md} +39 -8
  170. package/bmad/bmm/workflows/bmad-document-project/SKILL.md +6 -0
  171. package/bmad/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +1 -0
  172. package/bmad/bmm/workflows/{document-project → bmad-document-project}/instructions.md +6 -8
  173. package/bmad/bmm/workflows/bmad-document-project/workflow.md +27 -0
  174. package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/deep-dive-instructions.md +3 -2
  175. package/bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
  176. package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/full-scan-instructions.md +5 -4
  177. package/bmad/bmm/workflows/bmad-document-project/workflows/full-scan-workflow.md +34 -0
  178. package/bmad/bmm/workflows/bmad-generate-project-context/SKILL.md +6 -0
  179. package/bmad/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +1 -0
  180. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-01-discover.md +3 -1
  181. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-02-generate.md +7 -4
  182. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/workflow.md +2 -8
  183. package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
  184. package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +1 -0
  185. package/bmad/bmm/workflows/{qa/automate/instructions.md → bmad-qa-generate-e2e-tests/workflow.md} +33 -7
  186. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +6 -0
  187. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +1 -0
  188. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-01-mode-detection.md +9 -14
  189. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-02-context-gathering.md +1 -5
  190. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-03-execute.md +1 -5
  191. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-04-self-check.md +1 -5
  192. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-05-adversarial-review.md +8 -18
  193. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-06-resolve-findings.md +0 -2
  194. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/workflow.md +1 -13
  195. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
  196. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
  197. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
  198. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +35 -0
  199. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +33 -0
  200. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +50 -0
  201. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +17 -0
  202. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
  203. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +79 -0
  204. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +6 -0
  205. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +1 -0
  206. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-01-understand.md +7 -13
  207. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-02-investigate.md +3 -7
  208. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-03-generate.md +1 -5
  209. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-04-review.md +9 -14
  210. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/workflow.md +1 -7
  211. package/bmad/core/module-help.csv +10 -8
  212. package/bmad/core/module.yaml +1 -1
  213. package/bmad/core/skills/bmad-advanced-elicitation/SKILL.md +6 -0
  214. package/bmad/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +1 -0
  215. package/bmad/core/skills/bmad-advanced-elicitation/workflow.md +135 -0
  216. package/bmad/core/skills/bmad-brainstorming/SKILL.md +6 -0
  217. package/bmad/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
  218. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01-session-setup.md +35 -18
  219. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01b-continue.md +4 -2
  220. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02a-user-selected.md +5 -1
  221. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02b-ai-recommended.md +3 -1
  222. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02c-random-selection.md +3 -1
  223. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02d-progressive-flow.md +3 -1
  224. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-03-technique-execution.md +6 -4
  225. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-04-idea-organization.md +4 -2
  226. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/workflow.md +4 -9
  227. package/bmad/core/skills/bmad-distillator/SKILL.md +178 -0
  228. package/bmad/core/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
  229. package/bmad/core/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
  230. package/bmad/core/skills/bmad-distillator/bmad-skill-manifest.yaml +15 -0
  231. package/bmad/core/skills/bmad-distillator/resources/compression-rules.md +51 -0
  232. package/bmad/core/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
  233. package/bmad/core/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
  234. package/bmad/core/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
  235. package/bmad/core/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
  236. package/bmad/core/skills/bmad-editorial-review-prose/SKILL.md +6 -0
  237. package/bmad/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +1 -0
  238. package/bmad/core/skills/bmad-editorial-review-prose/workflow.md +81 -0
  239. package/bmad/core/skills/bmad-editorial-review-structure/SKILL.md +6 -0
  240. package/bmad/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +1 -0
  241. package/bmad/core/skills/bmad-editorial-review-structure/workflow.md +174 -0
  242. package/bmad/core/skills/bmad-help/SKILL.md +6 -0
  243. package/bmad/core/skills/bmad-help/bmad-skill-manifest.yaml +1 -0
  244. package/bmad/core/{tasks/help.md → skills/bmad-help/workflow.md} +11 -8
  245. package/bmad/core/skills/bmad-index-docs/SKILL.md +6 -0
  246. package/bmad/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +1 -0
  247. package/bmad/core/skills/bmad-index-docs/workflow.md +61 -0
  248. package/bmad/core/skills/bmad-party-mode/SKILL.md +6 -0
  249. package/bmad/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
  250. package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-03-graceful-exit.md +0 -1
  251. package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/workflow.md +0 -4
  252. package/bmad/core/skills/bmad-review-adversarial-general/SKILL.md +6 -0
  253. package/bmad/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
  254. package/bmad/core/skills/bmad-review-adversarial-general/workflow.md +32 -0
  255. package/bmad/core/skills/bmad-review-edge-case-hunter/SKILL.md +6 -0
  256. package/bmad/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
  257. package/bmad/core/skills/bmad-review-edge-case-hunter/workflow.md +62 -0
  258. package/bmad/core/skills/bmad-shard-doc/SKILL.md +6 -0
  259. package/bmad/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +1 -0
  260. package/bmad/core/skills/bmad-shard-doc/workflow.md +100 -0
  261. package/bmad/core/tasks/bmad-create-prd/SKILL.md +6 -0
  262. package/bmad/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +1 -0
  263. package/bmad/core/tasks/bmad-create-prd/data/domain-complexity.csv +15 -0
  264. package/bmad/core/tasks/bmad-create-prd/data/prd-purpose.md +197 -0
  265. package/bmad/core/tasks/bmad-create-prd/data/project-types.csv +11 -0
  266. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01-init.md +7 -20
  267. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01b-continue.md +29 -21
  268. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02-discovery.md +7 -23
  269. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02b-vision.md +5 -17
  270. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02c-executive-summary.md +5 -17
  271. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-03-success.md +4 -16
  272. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-04-journeys.md +4 -16
  273. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-05-domain.md +7 -20
  274. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-06-innovation.md +8 -23
  275. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-07-project-type.md +6 -21
  276. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-08-scoping.md +5 -17
  277. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-09-functional.md +5 -17
  278. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-10-nonfunctional.md +5 -17
  279. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-11-polish.md +22 -18
  280. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-12-complete.md +4 -13
  281. package/bmad/{bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md → core/tasks/bmad-create-prd/workflow.md} +3 -4
  282. package/bundled-versions.json +1 -1
  283. package/dist/commands/doctor-checks.js +14 -5
  284. package/dist/commands/doctor-checks.js.map +1 -1
  285. package/dist/commands/doctor.js +13 -4
  286. package/dist/commands/doctor.js.map +1 -1
  287. package/dist/commands/init.js +12 -2
  288. package/dist/commands/init.js.map +1 -1
  289. package/dist/commands/status.js +3 -2
  290. package/dist/commands/status.js.map +1 -1
  291. package/dist/installer/commands.js +33 -15
  292. package/dist/installer/commands.js.map +1 -1
  293. package/dist/installer/install.js +1 -1
  294. package/dist/installer/install.js.map +1 -1
  295. package/dist/installer/project-files.js +4 -4
  296. package/dist/installer/project-files.js.map +1 -1
  297. package/dist/installer/template-files.js +64 -17
  298. package/dist/installer/template-files.js.map +1 -1
  299. package/dist/platform/codex.js +6 -1
  300. package/dist/platform/codex.js.map +1 -1
  301. package/dist/platform/detect.js +7 -3
  302. package/dist/platform/detect.js.map +1 -1
  303. package/dist/platform/doctor-checks.js +2 -2
  304. package/dist/platform/doctor-checks.js.map +1 -1
  305. package/dist/platform/guidance.js +66 -0
  306. package/dist/platform/guidance.js.map +1 -0
  307. package/dist/platform/instructions-snippet.js +15 -0
  308. package/dist/platform/instructions-snippet.js.map +1 -1
  309. package/dist/platform/opencode.js +20 -0
  310. package/dist/platform/opencode.js.map +1 -0
  311. package/dist/platform/registry.js +2 -0
  312. package/dist/platform/registry.js.map +1 -1
  313. package/dist/platform/types.js +1 -0
  314. package/dist/platform/types.js.map +1 -1
  315. package/dist/reset.js +3 -3
  316. package/dist/reset.js.map +1 -1
  317. package/dist/run/ralph-process.js +51 -7
  318. package/dist/run/ralph-process.js.map +1 -1
  319. package/dist/run/run-dashboard.js +5 -6
  320. package/dist/run/run-dashboard.js.map +1 -1
  321. package/dist/transition/artifact-scan.js +14 -5
  322. package/dist/transition/artifact-scan.js.map +1 -1
  323. package/dist/utils/constants.js +4 -2
  324. package/dist/utils/constants.js.map +1 -1
  325. package/dist/watch/dashboard.js +16 -5
  326. package/dist/watch/dashboard.js.map +1 -1
  327. package/dist/watch/renderer.js +8 -6
  328. package/dist/watch/renderer.js.map +1 -1
  329. package/package.json +1 -1
  330. package/ralph/drivers/opencode.sh +147 -0
  331. package/ralph/lib/response_analyzer.sh +227 -78
  332. package/ralph/lib/wizard_utils.sh +4 -4
  333. package/ralph/ralph_loop.sh +340 -4
  334. package/ralph/templates/ralphrc.template +28 -2
  335. package/slash-commands/advanced-elicitation.md +1 -1
  336. package/slash-commands/adversarial-review.md +1 -1
  337. package/slash-commands/bmad-help.md +1 -1
  338. package/slash-commands/bmalph.md +1 -1
  339. package/slash-commands/brainstorm-project.md +1 -1
  340. package/slash-commands/brainstorming.md +1 -1
  341. package/slash-commands/correct-course.md +1 -1
  342. package/slash-commands/create-architecture.md +1 -1
  343. package/slash-commands/create-brief.md +1 -1
  344. package/slash-commands/create-epics-stories.md +1 -1
  345. package/slash-commands/create-prd.md +1 -1
  346. package/slash-commands/create-story.md +1 -1
  347. package/slash-commands/create-ux.md +1 -1
  348. package/slash-commands/distillator.md +1 -0
  349. package/slash-commands/document-project.md +1 -1
  350. package/slash-commands/domain-research.md +1 -1
  351. package/slash-commands/edge-case-hunter.md +1 -0
  352. package/slash-commands/edit-prd.md +1 -0
  353. package/slash-commands/editorial-prose.md +1 -1
  354. package/slash-commands/editorial-structure.md +1 -1
  355. package/slash-commands/generate-project-context.md +1 -1
  356. package/slash-commands/implementation-readiness.md +1 -1
  357. package/slash-commands/index-docs.md +1 -1
  358. package/slash-commands/market-research.md +1 -1
  359. package/slash-commands/party-mode.md +1 -1
  360. package/slash-commands/qa-automate.md +1 -1
  361. package/slash-commands/quick-dev-new.md +1 -0
  362. package/slash-commands/quick-dev.md +1 -1
  363. package/slash-commands/retrospective.md +1 -1
  364. package/slash-commands/shard-doc.md +1 -1
  365. package/slash-commands/sprint-planning.md +1 -1
  366. package/slash-commands/sprint-status.md +1 -1
  367. package/slash-commands/tech-spec.md +1 -1
  368. package/slash-commands/technical-research.md +1 -1
  369. package/slash-commands/validate-architecture.md +1 -1
  370. package/slash-commands/validate-brief.md +1 -1
  371. package/slash-commands/validate-epics-stories.md +1 -1
  372. package/slash-commands/validate-prd.md +1 -1
  373. package/slash-commands/validate-story.md +1 -1
  374. package/slash-commands/validate-ux.md +1 -1
  375. package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +0 -23
  376. package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +0 -227
  377. package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -44
  378. package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -54
  379. package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +0 -346
  380. package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -53
  381. package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -21
  382. package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -53
  383. package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -47
  384. package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +0 -25
  385. package/bmad/bmm/workflows/document-project/workflow.yaml +0 -22
  386. package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
  387. package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
  388. package/bmad/bmm/workflows/qa/automate/workflow.yaml +0 -44
  389. package/bmad/core/agents/bmad-master.agent.yaml +0 -30
  390. package/bmad/core/tasks/editorial-review-prose.xml +0 -102
  391. package/bmad/core/tasks/editorial-review-structure.xml +0 -209
  392. package/bmad/core/tasks/index-docs.xml +0 -65
  393. package/bmad/core/tasks/review-adversarial-general.xml +0 -48
  394. package/bmad/core/tasks/shard-doc.xml +0 -108
  395. package/bmad/core/tasks/workflow.xml +0 -235
  396. package/bmad/core/workflows/advanced-elicitation/workflow.xml +0 -117
  397. package/slash-commands/execute-workflow.md +0 -1
  398. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-01-init.md +0 -0
  399. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-02-domain-analysis.md +0 -0
  400. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-03-competitive-landscape.md +0 -0
  401. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-04-regulatory-focus.md +0 -0
  402. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-05-technical-trends.md +0 -0
  403. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-01-init.md +0 -0
  404. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-02-technical-overview.md +0 -0
  405. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-03-integration-patterns.md +0 -0
  406. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-04-architectural-patterns.md +0 -0
  407. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-05-implementation-research.md +0 -0
  408. /package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/ux-design-template.md +0 -0
  409. /package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/templates/readiness-report-template.md +0 -0
  410. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/architecture-decision-template.md +0 -0
  411. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/domain-complexity.csv +0 -0
  412. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/project-types.csv +0 -0
  413. /package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/template.md +0 -0
  414. /package/bmad/bmm/workflows/4-implementation/{dev-story → bmad-dev-story}/checklist.md +0 -0
  415. /package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/checklist.md +0 -0
  416. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/checklist.md +0 -0
  417. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/documentation-requirements.csv +0 -0
  418. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/deep-dive-template.md +0 -0
  419. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/index-template.md +0 -0
  420. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-overview-template.md +0 -0
  421. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-scan-report-schema.json +0 -0
  422. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/source-tree-template.md +0 -0
  423. /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/project-context-template.md +0 -0
  424. /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-03-complete.md +0 -0
  425. /package/bmad/bmm/workflows/{qa/automate → bmad-qa-generate-e2e-tests}/checklist.md +0 -0
  426. /package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/tech-spec-template.md +0 -0
  427. /package/bmad/core/{workflows/advanced-elicitation → skills/bmad-advanced-elicitation}/methods.csv +0 -0
  428. /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/brain-methods.csv +0 -0
  429. /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/template.md +0 -0
  430. /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-01-agent-loading.md +0 -0
  431. /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-02-discussion-orchestration.md +0 -0
  432. /package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/templates/prd-template.md +0 -0
@@ -97,7 +97,8 @@ contains_permission_denial_signal() {
97
97
  local line
98
98
  while IFS= read -r line; do
99
99
  local trimmed="${line#"${line%%[![:space:]]*}"}"
100
- local normalized="${trimmed,,}"
100
+ local normalized
101
+ normalized="$(printf '%s' "$trimmed" | tr '[:upper:]' '[:lower:]')"
101
102
 
102
103
  if permission_denial_line_matches "$normalized"; then
103
104
  return 0
@@ -225,6 +226,35 @@ normalize_cursor_stream_json_response() {
225
226
  ' "$output_file" > "$normalized_file"
226
227
  }
227
228
 
229
+ # Normalize OpenCode JSON event output into the object shape expected downstream.
230
+ normalize_opencode_jsonl_response() {
231
+ local output_file=$1
232
+ local normalized_file=$2
233
+
234
+ jq -rs '
235
+ def assistant_text($message):
236
+ [($message.parts // [])[]? | select(.type == "text") | .text]
237
+ | join("\n");
238
+
239
+ (map(
240
+ select(
241
+ (.type == "message.updated" or .type == "message.completed")
242
+ and (.message.role // "") == "assistant"
243
+ )
244
+ ) | last | .message // {}) as $assistant_message
245
+ | {
246
+ result: assistant_text($assistant_message),
247
+ sessionId: (
248
+ map(.session.id // .session_id // .sessionId // empty)
249
+ | map(select(length > 0))
250
+ | first
251
+ // ""
252
+ ),
253
+ metadata: {}
254
+ }
255
+ ' "$output_file" > "$normalized_file"
256
+ }
257
+
228
258
  # Detect whether a multi-document stream matches Codex JSONL events.
229
259
  is_codex_jsonl_output() {
230
260
  local output_file=$1
@@ -240,6 +270,25 @@ is_codex_jsonl_output() {
240
270
  ' < "$output_file" 2>/dev/null
241
271
  }
242
272
 
273
+ # Detect whether a multi-document stream matches OpenCode JSON events.
274
+ is_opencode_jsonl_output() {
275
+ local output_file=$1
276
+
277
+ jq -n -j '
278
+ reduce inputs as $item (
279
+ false;
280
+ . or (
281
+ $item.type == "session.created" or
282
+ $item.type == "session.updated" or
283
+ (
284
+ ($item.type == "message.updated" or $item.type == "message.completed")
285
+ and ($item.message.role? != null)
286
+ )
287
+ )
288
+ )
289
+ ' < "$output_file" 2>/dev/null
290
+ }
291
+
243
292
  # Detect whether a multi-document stream matches Cursor stream-json events.
244
293
  is_cursor_stream_json_output() {
245
294
  local output_file=$1
@@ -275,6 +324,14 @@ normalize_json_output() {
275
324
  return $?
276
325
  fi
277
326
 
327
+ local is_opencode_jsonl
328
+ is_opencode_jsonl=$(is_opencode_jsonl_output "$output_file") || return 1
329
+
330
+ if [[ "$is_opencode_jsonl" == "true" ]]; then
331
+ normalize_opencode_jsonl_response "$output_file" "$normalized_file"
332
+ return $?
333
+ fi
334
+
278
335
  local is_cursor_stream_json
279
336
  is_cursor_stream_json=$(is_cursor_stream_json_output "$output_file") || return 1
280
337
 
@@ -372,6 +429,17 @@ detect_output_format() {
372
429
  return
373
430
  fi
374
431
 
432
+ local is_opencode_jsonl
433
+ is_opencode_jsonl=$(is_opencode_jsonl_output "$output_file") || {
434
+ echo "text"
435
+ return
436
+ }
437
+
438
+ if [[ "$is_opencode_jsonl" == "true" ]]; then
439
+ echo "json"
440
+ return
441
+ fi
442
+
375
443
  local is_cursor_stream_json
376
444
  is_cursor_stream_json=$(is_cursor_stream_json_output "$output_file") || {
377
445
  echo "text"
@@ -417,6 +485,7 @@ extract_ralph_status_block_json() {
417
485
  local exit_signal="false"
418
486
  local exit_signal_found="false"
419
487
  local tasks_completed_this_loop=0
488
+ local tests_status="UNKNOWN"
420
489
  local line=""
421
490
  local trimmed=""
422
491
  local value=""
@@ -442,6 +511,10 @@ extract_ralph_status_block_json() {
442
511
  tasks_completed_this_loop=$value
443
512
  fi
444
513
  ;;
514
+ TESTS_STATUS:*)
515
+ value=$(trim_shell_whitespace "${trimmed#TESTS_STATUS:}")
516
+ [[ -n "$value" ]] && tests_status="$value"
517
+ ;;
445
518
  esac
446
519
  done <<< "$block"
447
520
 
@@ -450,22 +523,25 @@ extract_ralph_status_block_json() {
450
523
  --argjson exit_signal_found "$exit_signal_found" \
451
524
  --argjson exit_signal "$exit_signal" \
452
525
  --argjson tasks_completed_this_loop "$tasks_completed_this_loop" \
526
+ --arg tests_status "$tests_status" \
453
527
  '{
454
528
  status: $status,
455
529
  exit_signal_found: $exit_signal_found,
456
530
  exit_signal: $exit_signal,
457
- tasks_completed_this_loop: $tasks_completed_this_loop
531
+ tasks_completed_this_loop: $tasks_completed_this_loop,
532
+ tests_status: $tests_status
458
533
  }'
459
534
  }
460
535
 
461
536
  # Parse JSON response and extract structured fields
462
537
  # Creates .ralph/.json_parse_result with normalized analysis data
463
- # Supports FIVE JSON formats:
538
+ # Supports SIX JSON formats:
464
539
  # 1. Flat format: { status, exit_signal, work_type, files_modified, ... }
465
540
  # 2. Claude CLI object format: { result, sessionId, metadata: { files_changed, has_errors, completion_status, ... } }
466
541
  # 3. Claude CLI array format: [ {type: "system", ...}, {type: "assistant", ...}, {type: "result", ...} ]
467
542
  # 4. Codex JSONL format: {"type":"thread.started",...}\n{"type":"item.completed","item":{...}}
468
- # 5. Cursor stream-json format: {"type":"assistant",...}\n{"type":"result",...}
543
+ # 5. OpenCode JSON event format: {"type":"session.created",...}\n{"type":"message.updated",...}
544
+ # 6. Cursor stream-json format: {"type":"assistant",...}\n{"type":"result",...}
469
545
  parse_json_response() {
470
546
  local output_file=$1
471
547
  local result_file="${2:-$RALPH_DIR/.json_parse_result}"
@@ -503,39 +579,143 @@ parse_json_response() {
503
579
  output_file="$normalized_file"
504
580
 
505
581
  if [[ "$response_shape" == "jsonl" ]]; then
506
- if is_codex_jsonl_output "$original_output_file" >/dev/null 2>&1; then
582
+ if [[ "$(is_codex_jsonl_output "$original_output_file")" == "true" ]]; then
507
583
  response_shape="codex_jsonl"
584
+ elif [[ "$(is_opencode_jsonl_output "$original_output_file")" == "true" ]]; then
585
+ response_shape="opencode_jsonl"
508
586
  else
509
587
  response_shape="cursor_stream_jsonl"
510
588
  fi
511
589
  fi
512
590
  fi
513
591
 
514
- # Detect JSON format by checking for Claude CLI fields
515
- local has_result_field=$(jq -r -j 'has("result")' "$output_file" 2>/dev/null)
592
+ local has_result_field="false"
593
+ local status="UNKNOWN"
594
+ local completion_status=""
595
+ local exit_signal="false"
596
+ local explicit_exit_signal_found="false"
597
+ local tasks_completed_this_loop=0
598
+ local tests_status="UNKNOWN"
599
+ local result_text=""
600
+ local work_type="UNKNOWN"
601
+ local files_modified=0
602
+ local error_count=0
603
+ local has_errors="false"
604
+ local summary=""
605
+ local session_id=""
606
+ local loop_number=0
607
+ local confidence=0
608
+ local progress_count=0
609
+ local permission_denial_count=0
610
+ local has_permission_denials="false"
611
+ local denied_commands_json="[]"
612
+
613
+ if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "opencode_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]]; then
614
+ local driver_fields=""
615
+ driver_fields=$(jq -r '
616
+ [
617
+ (.result // ""),
618
+ (.sessionId // .metadata.session_id // .session_id // ""),
619
+ ((.permission_denials // []) | length),
620
+ ((.permission_denials // []) | map(
621
+ if .tool_name == "Bash" then
622
+ "Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))"
623
+ else
624
+ .tool_name // "unknown"
625
+ end
626
+ ) | @json)
627
+ ] | @tsv
628
+ ' "$output_file" 2>/dev/null)
629
+
630
+ local denied_commands_field="[]"
631
+ IFS=$'\t' read -r result_text session_id permission_denial_count denied_commands_field <<< "$driver_fields"
632
+
633
+ has_result_field="true"
634
+ summary="$result_text"
635
+ denied_commands_json="${denied_commands_field:-[]}"
636
+
637
+ if [[ ! "$permission_denial_count" =~ ^-?[0-9]+$ ]]; then
638
+ permission_denial_count=0
639
+ fi
516
640
 
517
- # Extract fields - support both flat format and Claude CLI format
518
- # Priority: Claude CLI fields first, then flat format fields
641
+ if [[ $permission_denial_count -gt 0 ]]; then
642
+ has_permission_denials="true"
643
+ fi
644
+ else
645
+ # Detect JSON format by checking for Claude CLI fields
646
+ has_result_field=$(jq -r -j 'has("result")' "$output_file" 2>/dev/null)
519
647
 
520
- # Status: from flat format OR derived from metadata.completion_status
521
- local status=$(jq -r -j '.status // "UNKNOWN"' "$output_file" 2>/dev/null)
522
- local completion_status=$(jq -r -j '.metadata.completion_status // ""' "$output_file" 2>/dev/null)
523
- if [[ "$completion_status" == "complete" || "$completion_status" == "COMPLETE" ]]; then
524
- status="COMPLETE"
525
- fi
648
+ # Extract fields - support both flat format and Claude CLI format
649
+ # Priority: Claude CLI fields first, then flat format fields
526
650
 
527
- # Exit signal: from flat format OR derived from completion_status
528
- # Track whether EXIT_SIGNAL was explicitly provided (vs inferred from STATUS)
529
- local exit_signal=$(jq -r -j '.exit_signal // false' "$output_file" 2>/dev/null)
530
- local explicit_exit_signal_found=$(jq -r -j 'has("exit_signal")' "$output_file" 2>/dev/null)
531
- local tasks_completed_this_loop=$(jq -r -j '.tasks_completed_this_loop // 0' "$output_file" 2>/dev/null)
532
- if [[ ! "$tasks_completed_this_loop" =~ ^-?[0-9]+$ ]]; then
533
- tasks_completed_this_loop=0
534
- fi
651
+ # Status: from flat format OR derived from metadata.completion_status
652
+ status=$(jq -r -j '.status // "UNKNOWN"' "$output_file" 2>/dev/null)
653
+ completion_status=$(jq -r -j '.metadata.completion_status // ""' "$output_file" 2>/dev/null)
654
+ if [[ "$completion_status" == "complete" || "$completion_status" == "COMPLETE" ]]; then
655
+ status="COMPLETE"
656
+ fi
535
657
 
536
- local result_text=""
537
- if [[ "$has_result_field" == "true" ]]; then
538
- result_text=$(jq -r -j '.result // ""' "$output_file" 2>/dev/null)
658
+ # Exit signal: from flat format OR derived from completion_status
659
+ # Track whether EXIT_SIGNAL was explicitly provided (vs inferred from STATUS)
660
+ exit_signal=$(jq -r -j '.exit_signal // false' "$output_file" 2>/dev/null)
661
+ explicit_exit_signal_found=$(jq -r -j 'has("exit_signal")' "$output_file" 2>/dev/null)
662
+ tasks_completed_this_loop=$(jq -r -j '.tasks_completed_this_loop // 0' "$output_file" 2>/dev/null)
663
+ if [[ ! "$tasks_completed_this_loop" =~ ^-?[0-9]+$ ]]; then
664
+ tasks_completed_this_loop=0
665
+ fi
666
+
667
+ if [[ "$has_result_field" == "true" ]]; then
668
+ result_text=$(jq -r -j '.result // ""' "$output_file" 2>/dev/null)
669
+ fi
670
+
671
+ # Work type: from flat format
672
+ work_type=$(jq -r -j '.work_type // "UNKNOWN"' "$output_file" 2>/dev/null)
673
+
674
+ # Files modified: from flat format OR from metadata.files_changed
675
+ files_modified=$(jq -r -j '.metadata.files_changed // .files_modified // 0' "$output_file" 2>/dev/null)
676
+
677
+ # Error count: from flat format OR derived from metadata.has_errors
678
+ # Note: When only has_errors=true is present (without explicit error_count),
679
+ # we set error_count=1 as a minimum. This is defensive programming since
680
+ # the stuck detection threshold is >5 errors, so 1 error won't trigger it.
681
+ # Actual error count may be higher, but precise count isn't critical for our logic.
682
+ error_count=$(jq -r -j '.error_count // 0' "$output_file" 2>/dev/null)
683
+ has_errors=$(jq -r -j '.metadata.has_errors // false' "$output_file" 2>/dev/null)
684
+ if [[ "$has_errors" == "true" && "$error_count" == "0" ]]; then
685
+ error_count=1 # At least one error if has_errors is true
686
+ fi
687
+
688
+ # Summary: from flat format OR from result field (Claude CLI format)
689
+ summary=$(jq -r -j '.result // .summary // ""' "$output_file" 2>/dev/null)
690
+
691
+ # Session ID: from Claude CLI format (sessionId) OR from metadata.session_id
692
+ session_id=$(jq -r -j '.sessionId // .metadata.session_id // .session_id // ""' "$output_file" 2>/dev/null)
693
+
694
+ # Loop number: from metadata
695
+ loop_number=$(jq -r -j '.metadata.loop_number // .loop_number // 0' "$output_file" 2>/dev/null)
696
+
697
+ # Confidence: from flat format
698
+ confidence=$(jq -r -j '.confidence // 0' "$output_file" 2>/dev/null)
699
+
700
+ # Progress indicators: from Claude CLI metadata (optional)
701
+ progress_count=$(jq -r -j '.metadata.progress_indicators | if . then length else 0 end' "$output_file" 2>/dev/null)
702
+
703
+ # Permission denials: from Claude Code output (Issue #101)
704
+ # When Claude Code is denied permission to run commands, it outputs a permission_denials array
705
+ permission_denial_count=$(jq -r -j '.permission_denials | if . then length else 0 end' "$output_file" 2>/dev/null)
706
+ permission_denial_count=$((permission_denial_count + 0)) # Ensure integer
707
+
708
+ if [[ $permission_denial_count -gt 0 ]]; then
709
+ has_permission_denials="true"
710
+ fi
711
+
712
+ # Extract denied tool names and commands for logging/display
713
+ # Shows tool_name for non-Bash tools, and for Bash tools shows the command that was denied
714
+ # This handles both cases: AskUserQuestion denial shows "AskUserQuestion",
715
+ # while Bash denial shows "Bash(git commit -m ...)" with truncated command
716
+ if [[ $permission_denial_count -gt 0 ]]; then
717
+ denied_commands_json=$(jq -r -j '[.permission_denials[] | if .tool_name == "Bash" then "Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))" else .tool_name // "unknown" end]' "$output_file" 2>/dev/null || echo "[]")
718
+ fi
539
719
  fi
540
720
 
541
721
  local ralph_status_json=""
@@ -548,10 +728,15 @@ parse_json_response() {
548
728
  embedded_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.status' 2>/dev/null)
549
729
  local embedded_tasks_completed
550
730
  embedded_tasks_completed=$(printf '%s' "$ralph_status_json" | jq -r -j '.tasks_completed_this_loop' 2>/dev/null)
731
+ local embedded_tests_status
732
+ embedded_tests_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.tests_status' 2>/dev/null)
551
733
 
552
734
  if [[ "$embedded_tasks_completed" =~ ^-?[0-9]+$ ]]; then
553
735
  tasks_completed_this_loop=$embedded_tasks_completed
554
736
  fi
737
+ if [[ -n "$embedded_tests_status" && "$embedded_tests_status" != "null" ]]; then
738
+ tests_status="$embedded_tests_status"
739
+ fi
555
740
 
556
741
  if [[ "$embedded_exit_signal_found" == "true" ]]; then
557
742
  explicit_exit_signal_found="true"
@@ -563,57 +748,6 @@ parse_json_response() {
563
748
  fi
564
749
  fi
565
750
 
566
- # Work type: from flat format
567
- local work_type=$(jq -r -j '.work_type // "UNKNOWN"' "$output_file" 2>/dev/null)
568
-
569
- # Files modified: from flat format OR from metadata.files_changed
570
- local files_modified=$(jq -r -j '.metadata.files_changed // .files_modified // 0' "$output_file" 2>/dev/null)
571
-
572
- # Error count: from flat format OR derived from metadata.has_errors
573
- # Note: When only has_errors=true is present (without explicit error_count),
574
- # we set error_count=1 as a minimum. This is defensive programming since
575
- # the stuck detection threshold is >5 errors, so 1 error won't trigger it.
576
- # Actual error count may be higher, but precise count isn't critical for our logic.
577
- local error_count=$(jq -r -j '.error_count // 0' "$output_file" 2>/dev/null)
578
- local has_errors=$(jq -r -j '.metadata.has_errors // false' "$output_file" 2>/dev/null)
579
- if [[ "$has_errors" == "true" && "$error_count" == "0" ]]; then
580
- error_count=1 # At least one error if has_errors is true
581
- fi
582
-
583
- # Summary: from flat format OR from result field (Claude CLI format)
584
- local summary=$(jq -r -j '.result // .summary // ""' "$output_file" 2>/dev/null)
585
-
586
- # Session ID: from Claude CLI format (sessionId) OR from metadata.session_id
587
- local session_id=$(jq -r -j '.sessionId // .metadata.session_id // .session_id // ""' "$output_file" 2>/dev/null)
588
-
589
- # Loop number: from metadata
590
- local loop_number=$(jq -r -j '.metadata.loop_number // .loop_number // 0' "$output_file" 2>/dev/null)
591
-
592
- # Confidence: from flat format
593
- local confidence=$(jq -r -j '.confidence // 0' "$output_file" 2>/dev/null)
594
-
595
- # Progress indicators: from Claude CLI metadata (optional)
596
- local progress_count=$(jq -r -j '.metadata.progress_indicators | if . then length else 0 end' "$output_file" 2>/dev/null)
597
-
598
- # Permission denials: from Claude Code output (Issue #101)
599
- # When Claude Code is denied permission to run commands, it outputs a permission_denials array
600
- local permission_denial_count=$(jq -r -j '.permission_denials | if . then length else 0 end' "$output_file" 2>/dev/null)
601
- permission_denial_count=$((permission_denial_count + 0)) # Ensure integer
602
-
603
- local has_permission_denials="false"
604
- if [[ $permission_denial_count -gt 0 ]]; then
605
- has_permission_denials="true"
606
- fi
607
-
608
- # Extract denied tool names and commands for logging/display
609
- # Shows tool_name for non-Bash tools, and for Bash tools shows the command that was denied
610
- # This handles both cases: AskUserQuestion denial shows "AskUserQuestion",
611
- # while Bash denial shows "Bash(git commit -m ...)" with truncated command
612
- local denied_commands_json="[]"
613
- if [[ $permission_denial_count -gt 0 ]]; then
614
- denied_commands_json=$(jq -r -j '[.permission_denials[] | if .tool_name == "Bash" then "Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))" else .tool_name // "unknown" end]' "$output_file" 2>/dev/null || echo "[]")
615
- fi
616
-
617
751
  # Heuristic permission-denial matching is limited to the refusal-shaped
618
752
  # response preamble, not arbitrary prose or copied logs later in the body.
619
753
  if [[ "$has_permission_denials" != "true" ]] && contains_permission_denial_text "$summary"; then
@@ -626,7 +760,7 @@ parse_json_response() {
626
760
  # completion markers are absent. This keeps JSONL analysis aligned with text mode.
627
761
  local summary_has_completion_keyword="false"
628
762
  local summary_has_no_work_pattern="false"
629
- if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]] && [[ "$explicit_exit_signal_found" != "true" && -n "$summary" ]]; then
763
+ if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "opencode_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]] && [[ "$explicit_exit_signal_found" != "true" && -n "$summary" ]]; then
630
764
  for keyword in "${COMPLETION_KEYWORDS[@]}"; do
631
765
  if echo "$summary" | grep -qi "$keyword"; then
632
766
  summary_has_completion_keyword="true"
@@ -709,6 +843,7 @@ parse_json_response() {
709
843
  --argjson has_permission_denials "$has_permission_denials" \
710
844
  --argjson permission_denial_count "$permission_denial_count" \
711
845
  --argjson denied_commands "$denied_commands_json" \
846
+ --arg tests_status "$tests_status" \
712
847
  '{
713
848
  status: $status,
714
849
  exit_signal: $exit_signal,
@@ -722,6 +857,7 @@ parse_json_response() {
722
857
  session_id: $session_id,
723
858
  confidence: $confidence,
724
859
  tasks_completed_this_loop: $tasks_completed_this_loop,
860
+ tests_status: $tests_status,
725
861
  has_permission_denials: $has_permission_denials,
726
862
  permission_denial_count: $permission_denial_count,
727
863
  denied_commands: $denied_commands,
@@ -755,6 +891,7 @@ analyze_response() {
755
891
  local work_summary=""
756
892
  local files_modified=0
757
893
  local tasks_completed_this_loop=0
894
+ local tests_status="UNKNOWN"
758
895
 
759
896
  # Read output file
760
897
  if [[ ! -f "$output_file" ]]; then
@@ -781,6 +918,7 @@ analyze_response() {
781
918
  work_summary=$(jq -r -j '.summary' "$json_parse_result_file" 2>/dev/null || echo "")
782
919
  files_modified=$(jq -r -j '.files_modified' "$json_parse_result_file" 2>/dev/null || echo "0")
783
920
  tasks_completed_this_loop=$(jq -r -j '.tasks_completed_this_loop // 0' "$json_parse_result_file" 2>/dev/null || echo "0")
921
+ tests_status=$(jq -r -j '.tests_status // "UNKNOWN"' "$json_parse_result_file" 2>/dev/null || echo "UNKNOWN")
784
922
  local json_confidence=$(jq -r -j '.confidence' "$json_parse_result_file" 2>/dev/null || echo "0")
785
923
  local session_id=$(jq -r -j '.session_id' "$json_parse_result_file" 2>/dev/null || echo "")
786
924
 
@@ -863,6 +1001,7 @@ analyze_response() {
863
1001
  --argjson has_permission_denials "$has_permission_denials" \
864
1002
  --argjson permission_denial_count "$permission_denial_count" \
865
1003
  --argjson denied_commands "$denied_commands_json" \
1004
+ --arg tests_status "$tests_status" \
866
1005
  '{
867
1006
  loop_number: $loop_number,
868
1007
  timestamp: $timestamp,
@@ -877,6 +1016,7 @@ analyze_response() {
877
1016
  confidence_score: $confidence_score,
878
1017
  exit_signal: $exit_signal,
879
1018
  tasks_completed_this_loop: $tasks_completed_this_loop,
1019
+ tests_status: $tests_status,
880
1020
  fix_plan_completed_delta: 0,
881
1021
  has_progress_tracking_mismatch: false,
882
1022
  work_summary: $work_summary,
@@ -910,10 +1050,15 @@ analyze_response() {
910
1050
  exit_sig=$(printf '%s' "$ralph_status_json" | jq -r -j '.exit_signal' 2>/dev/null)
911
1051
  local parsed_tasks_completed
912
1052
  parsed_tasks_completed=$(printf '%s' "$ralph_status_json" | jq -r -j '.tasks_completed_this_loop' 2>/dev/null)
1053
+ local parsed_tests_status
1054
+ parsed_tests_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.tests_status' 2>/dev/null)
913
1055
 
914
1056
  if [[ "$parsed_tasks_completed" =~ ^-?[0-9]+$ ]]; then
915
1057
  tasks_completed_this_loop=$parsed_tasks_completed
916
1058
  fi
1059
+ if [[ -n "$parsed_tests_status" && "$parsed_tests_status" != "null" ]]; then
1060
+ tests_status="$parsed_tests_status"
1061
+ fi
917
1062
 
918
1063
  # If EXIT_SIGNAL is explicitly provided, respect it
919
1064
  if [[ "$exit_sig_found" == "true" ]]; then
@@ -1095,6 +1240,7 @@ analyze_response() {
1095
1240
  --argjson has_permission_denials "$has_permission_denials" \
1096
1241
  --argjson permission_denial_count "$permission_denial_count" \
1097
1242
  --argjson denied_commands "$denied_commands_json" \
1243
+ --arg tests_status "$tests_status" \
1098
1244
  '{
1099
1245
  loop_number: $loop_number,
1100
1246
  timestamp: $timestamp,
@@ -1109,6 +1255,7 @@ analyze_response() {
1109
1255
  confidence_score: $confidence_score,
1110
1256
  exit_signal: $exit_signal,
1111
1257
  tasks_completed_this_loop: $tasks_completed_this_loop,
1258
+ tests_status: $tests_status,
1112
1259
  fix_plan_completed_delta: 0,
1113
1260
  has_progress_tracking_mismatch: false,
1114
1261
  work_summary: $work_summary,
@@ -1386,8 +1533,10 @@ export -f detect_output_format
1386
1533
  export -f count_json_documents
1387
1534
  export -f normalize_cli_array_response
1388
1535
  export -f normalize_codex_jsonl_response
1536
+ export -f normalize_opencode_jsonl_response
1389
1537
  export -f normalize_cursor_stream_json_response
1390
1538
  export -f is_codex_jsonl_output
1539
+ export -f is_opencode_jsonl_output
1391
1540
  export -f is_cursor_stream_json_output
1392
1541
  export -f normalize_json_output
1393
1542
  export -f extract_session_id_from_output
@@ -36,7 +36,7 @@ confirm() {
36
36
  local response
37
37
 
38
38
  local yn_hint="[y/N]"
39
- if [[ "${default,,}" == "y" ]]; then
39
+ if [[ "$default" == [yY] ]]; then
40
40
  yn_hint="[Y/n]"
41
41
  fi
42
42
 
@@ -50,11 +50,11 @@ confirm() {
50
50
  response="$default"
51
51
  fi
52
52
 
53
- case "${response,,}" in
54
- y|yes)
53
+ case "$response" in
54
+ [yY]|[yY][eE][sS])
55
55
  return 0
56
56
  ;;
57
- n|no)
57
+ [nN]|[nN][oO])
58
58
  return 1
59
59
  ;;
60
60
  *)