bmalph 2.7.7 → 2.9.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 (502) hide show
  1. package/README.md +51 -28
  2. package/bmad/bmm/agents/analyst.agent.yaml +6 -6
  3. package/bmad/bmm/agents/architect.agent.yaml +2 -2
  4. package/bmad/bmm/agents/bmad-skill-manifest.yaml +39 -0
  5. package/bmad/bmm/agents/dev.agent.yaml +2 -2
  6. package/bmad/bmm/agents/pm.agent.yaml +6 -6
  7. package/bmad/bmm/agents/qa.agent.yaml +1 -1
  8. package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +7 -3
  9. package/bmad/bmm/agents/sm.agent.yaml +4 -4
  10. package/bmad/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
  11. package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +1 -1
  12. package/bmad/bmm/agents/ux-designer.agent.yaml +1 -1
  13. package/bmad/bmm/module-help.csv +26 -25
  14. package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +6 -0
  15. package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +1 -0
  16. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/product-brief.template.md +2 -2
  17. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01-init.md +4 -11
  18. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01b-continue.md +0 -3
  19. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-02-vision.md +5 -11
  20. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-03-users.md +5 -11
  21. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-04-metrics.md +5 -11
  22. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-05-scope.md +5 -11
  23. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-06-complete.md +1 -4
  24. package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/workflow.md +4 -6
  25. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/SKILL.md +88 -0
  26. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/artifact-analyzer.md +60 -0
  27. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/opportunity-reviewer.md +44 -0
  28. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/skeptic-reviewer.md +44 -0
  29. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/web-researcher.md +49 -0
  30. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-manifest.json +17 -0
  31. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +1 -0
  32. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/contextual-discovery.md +57 -0
  33. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/draft-and-review.md +86 -0
  34. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/finalize.md +75 -0
  35. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/guided-elicitation.md +70 -0
  36. package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/resources/brief-template.md +60 -0
  37. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/SKILL.md +6 -0
  38. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +1 -0
  39. package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-06-research-synthesis.md +2 -1
  40. package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/research.template.md +29 -0
  41. package/bmad/bmm/workflows/1-analysis/research/{workflow-domain-research.md → bmad-domain-research/workflow.md} +0 -5
  42. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/SKILL.md +6 -0
  43. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +1 -0
  44. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/research.template.md +29 -0
  45. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
  46. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
  47. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
  48. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
  49. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
  50. package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +478 -0
  51. package/bmad/bmm/workflows/1-analysis/research/{workflow-market-research.md → bmad-market-research/workflow.md} +1 -6
  52. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/SKILL.md +6 -0
  53. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +1 -0
  54. package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/research.template.md +29 -0
  55. package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-06-research-synthesis.md +2 -1
  56. package/bmad/bmm/workflows/1-analysis/research/{workflow-technical-research.md → bmad-technical-research/workflow.md} +0 -4
  57. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +2 -2
  58. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +2 -2
  59. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +2 -2
  60. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +2 -2
  61. package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +2 -1
  62. package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/SKILL.md +6 -0
  63. package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +1 -0
  64. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01-init.md +2 -2
  65. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01b-continue.md +1 -1
  66. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-02-discovery.md +2 -2
  67. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-03-core-experience.md +5 -4
  68. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-04-emotional-response.md +5 -4
  69. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-05-inspiration.md +5 -4
  70. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-06-design-system.md +5 -4
  71. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-07-defining-experience.md +5 -4
  72. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-08-visual-foundation.md +5 -4
  73. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-09-design-directions.md +5 -4
  74. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-10-user-journeys.md +5 -4
  75. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-11-component-strategy.md +5 -4
  76. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-12-ux-patterns.md +5 -4
  77. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-13-responsive-accessibility.md +5 -4
  78. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-14-complete.md +3 -3
  79. package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/workflow.md +2 -8
  80. package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/SKILL.md +6 -0
  81. package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +1 -0
  82. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01-discovery.md +3 -8
  83. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01b-legacy-conversion.md +1 -5
  84. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-02-review.md +5 -9
  85. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-03-edit.md +3 -6
  86. package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-04-complete.md +2 -5
  87. package/bmad/bmm/workflows/2-plan-workflows/{create-prd/workflow-edit-prd.md → bmad-edit-prd/workflow.md} +2 -4
  88. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/SKILL.md +6 -0
  89. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +1 -0
  90. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/domain-complexity.csv +15 -0
  91. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/prd-purpose.md +197 -0
  92. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/project-types.csv +11 -0
  93. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  94. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  95. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  96. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  97. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  98. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  99. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  100. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  101. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  102. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  103. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  104. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  105. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  106. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  107. package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/workflow.md +62 -0
  108. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +2 -4
  109. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +1 -1
  110. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +3 -3
  111. package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +3 -2
  112. package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +3 -1
  113. package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/SKILL.md +6 -0
  114. package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
  115. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-01-document-discovery.md +3 -8
  116. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-02-prd-analysis.md +1 -5
  117. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-03-epic-coverage-validation.md +1 -5
  118. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-04-ux-alignment.md +1 -5
  119. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-05-epic-quality-review.md +2 -6
  120. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-06-final-assessment.md +1 -4
  121. package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/workflow.md +1 -6
  122. package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/SKILL.md +6 -0
  123. package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +1 -0
  124. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01-init.md +4 -4
  125. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01b-continue.md +11 -2
  126. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-02-context.md +4 -4
  127. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-03-starter.md +5 -7
  128. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-04-decisions.md +4 -4
  129. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-05-patterns.md +4 -4
  130. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-06-structure.md +4 -4
  131. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-07-validation.md +4 -4
  132. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-08-complete.md +1 -1
  133. package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/workflow.md +1 -12
  134. package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/SKILL.md +6 -0
  135. package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
  136. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-01-validate-prerequisites.md +37 -41
  137. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-02-design-epics.md +7 -28
  138. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-03-create-stories.md +13 -30
  139. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-04-final-validation.md +3 -21
  140. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/templates/epics-template.md +4 -0
  141. package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/workflow.md +1 -6
  142. package/bmad/bmm/workflows/4-implementation/bmad-code-review/SKILL.md +6 -0
  143. package/bmad/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +1 -0
  144. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-01-gather-context.md +61 -0
  145. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +41 -0
  146. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-03-triage.md +50 -0
  147. package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +38 -0
  148. package/bmad/bmm/workflows/4-implementation/bmad-code-review/workflow.md +54 -0
  149. package/bmad/bmm/workflows/4-implementation/bmad-correct-course/SKILL.md +6 -0
  150. package/bmad/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +1 -0
  151. package/bmad/bmm/workflows/4-implementation/{correct-course → bmad-correct-course}/checklist.md +1 -1
  152. package/bmad/bmm/workflows/4-implementation/{correct-course/instructions.md → bmad-correct-course/workflow.md} +74 -14
  153. package/bmad/bmm/workflows/4-implementation/bmad-create-story/SKILL.md +6 -0
  154. package/bmad/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +1 -0
  155. package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/checklist.md +9 -10
  156. package/bmad/bmm/workflows/4-implementation/bmad-create-story/discover-inputs.md +88 -0
  157. package/bmad/bmm/workflows/4-implementation/bmad-create-story/workflow.md +380 -0
  158. package/bmad/bmm/workflows/4-implementation/bmad-dev-story/SKILL.md +6 -0
  159. package/bmad/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +1 -0
  160. package/bmad/bmm/workflows/4-implementation/{dev-story/instructions.xml → bmad-dev-story/workflow.md} +42 -2
  161. package/bmad/bmm/workflows/4-implementation/bmad-retrospective/SKILL.md +6 -0
  162. package/bmad/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +1 -0
  163. package/bmad/bmm/workflows/4-implementation/{retrospective/instructions.md → bmad-retrospective/workflow.md} +58 -23
  164. package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/SKILL.md +6 -0
  165. package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +1 -0
  166. package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/sprint-status-template.yaml +1 -0
  167. package/bmad/bmm/workflows/4-implementation/{sprint-planning/instructions.md → bmad-sprint-planning/workflow.md} +47 -10
  168. package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/SKILL.md +6 -0
  169. package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +1 -0
  170. package/bmad/bmm/workflows/4-implementation/{sprint-status/instructions.md → bmad-sprint-status/workflow.md} +39 -8
  171. package/bmad/bmm/workflows/bmad-document-project/SKILL.md +6 -0
  172. package/bmad/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +1 -0
  173. package/bmad/bmm/workflows/{document-project → bmad-document-project}/instructions.md +6 -8
  174. package/bmad/bmm/workflows/bmad-document-project/workflow.md +27 -0
  175. package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/deep-dive-instructions.md +3 -2
  176. package/bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
  177. package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/full-scan-instructions.md +5 -4
  178. package/bmad/bmm/workflows/bmad-document-project/workflows/full-scan-workflow.md +34 -0
  179. package/bmad/bmm/workflows/bmad-generate-project-context/SKILL.md +6 -0
  180. package/bmad/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +1 -0
  181. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-01-discover.md +3 -1
  182. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-02-generate.md +7 -4
  183. package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/workflow.md +2 -8
  184. package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
  185. package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +1 -0
  186. package/bmad/bmm/workflows/{qa/automate/instructions.md → bmad-qa-generate-e2e-tests/workflow.md} +33 -7
  187. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +6 -0
  188. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +1 -0
  189. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-01-mode-detection.md +9 -14
  190. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-02-context-gathering.md +1 -5
  191. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-03-execute.md +1 -5
  192. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-04-self-check.md +1 -5
  193. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-05-adversarial-review.md +8 -18
  194. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-06-resolve-findings.md +0 -2
  195. package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/workflow.md +1 -13
  196. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
  197. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
  198. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
  199. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +35 -0
  200. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +33 -0
  201. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +50 -0
  202. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +17 -0
  203. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
  204. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +79 -0
  205. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +6 -0
  206. package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +1 -0
  207. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-01-understand.md +7 -13
  208. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-02-investigate.md +3 -7
  209. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-03-generate.md +1 -5
  210. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-04-review.md +9 -14
  211. package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/workflow.md +1 -7
  212. package/bmad/core/module-help.csv +10 -8
  213. package/bmad/core/module.yaml +1 -1
  214. package/bmad/core/skills/bmad-advanced-elicitation/SKILL.md +6 -0
  215. package/bmad/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +1 -0
  216. package/bmad/core/skills/bmad-advanced-elicitation/workflow.md +135 -0
  217. package/bmad/core/skills/bmad-brainstorming/SKILL.md +6 -0
  218. package/bmad/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
  219. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01-session-setup.md +35 -18
  220. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01b-continue.md +4 -2
  221. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02a-user-selected.md +5 -1
  222. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02b-ai-recommended.md +3 -1
  223. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02c-random-selection.md +3 -1
  224. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02d-progressive-flow.md +3 -1
  225. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-03-technique-execution.md +6 -4
  226. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-04-idea-organization.md +4 -2
  227. package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/workflow.md +4 -9
  228. package/bmad/core/skills/bmad-distillator/SKILL.md +178 -0
  229. package/bmad/core/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
  230. package/bmad/core/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
  231. package/bmad/core/skills/bmad-distillator/bmad-skill-manifest.yaml +15 -0
  232. package/bmad/core/skills/bmad-distillator/resources/compression-rules.md +51 -0
  233. package/bmad/core/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
  234. package/bmad/core/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
  235. package/bmad/core/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
  236. package/bmad/core/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
  237. package/bmad/core/skills/bmad-editorial-review-prose/SKILL.md +6 -0
  238. package/bmad/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +1 -0
  239. package/bmad/core/skills/bmad-editorial-review-prose/workflow.md +81 -0
  240. package/bmad/core/skills/bmad-editorial-review-structure/SKILL.md +6 -0
  241. package/bmad/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +1 -0
  242. package/bmad/core/skills/bmad-editorial-review-structure/workflow.md +174 -0
  243. package/bmad/core/skills/bmad-help/SKILL.md +6 -0
  244. package/bmad/core/skills/bmad-help/bmad-skill-manifest.yaml +1 -0
  245. package/bmad/core/{tasks/help.md → skills/bmad-help/workflow.md} +11 -8
  246. package/bmad/core/skills/bmad-index-docs/SKILL.md +6 -0
  247. package/bmad/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +1 -0
  248. package/bmad/core/skills/bmad-index-docs/workflow.md +61 -0
  249. package/bmad/core/skills/bmad-party-mode/SKILL.md +6 -0
  250. package/bmad/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
  251. package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-03-graceful-exit.md +0 -1
  252. package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/workflow.md +0 -4
  253. package/bmad/core/skills/bmad-review-adversarial-general/SKILL.md +6 -0
  254. package/bmad/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
  255. package/bmad/core/skills/bmad-review-adversarial-general/workflow.md +32 -0
  256. package/bmad/core/skills/bmad-review-edge-case-hunter/SKILL.md +6 -0
  257. package/bmad/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
  258. package/bmad/core/skills/bmad-review-edge-case-hunter/workflow.md +62 -0
  259. package/bmad/core/skills/bmad-shard-doc/SKILL.md +6 -0
  260. package/bmad/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +1 -0
  261. package/bmad/core/skills/bmad-shard-doc/workflow.md +100 -0
  262. package/bmad/core/tasks/bmad-create-prd/SKILL.md +6 -0
  263. package/bmad/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +1 -0
  264. package/bmad/core/tasks/bmad-create-prd/data/domain-complexity.csv +15 -0
  265. package/bmad/core/tasks/bmad-create-prd/data/prd-purpose.md +197 -0
  266. package/bmad/core/tasks/bmad-create-prd/data/project-types.csv +11 -0
  267. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01-init.md +7 -20
  268. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01b-continue.md +29 -21
  269. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02-discovery.md +7 -23
  270. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02b-vision.md +5 -17
  271. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02c-executive-summary.md +5 -17
  272. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-03-success.md +4 -16
  273. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-04-journeys.md +4 -16
  274. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-05-domain.md +7 -20
  275. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-06-innovation.md +8 -23
  276. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-07-project-type.md +6 -21
  277. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-08-scoping.md +5 -17
  278. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-09-functional.md +5 -17
  279. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-10-nonfunctional.md +5 -17
  280. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-11-polish.md +22 -18
  281. package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-12-complete.md +4 -13
  282. package/bmad/{bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md → core/tasks/bmad-create-prd/workflow.md} +3 -4
  283. package/bundled-versions.json +1 -1
  284. package/dist/cli.js +3 -2
  285. package/dist/commands/doctor-checks.js +15 -6
  286. package/dist/commands/doctor-health-checks.js +2 -1
  287. package/dist/commands/doctor.js +13 -4
  288. package/dist/commands/init.js +15 -3
  289. package/dist/commands/reset.js +1 -1
  290. package/dist/commands/run.js +36 -1
  291. package/dist/commands/status.js +3 -11
  292. package/dist/commands/upgrade.js +1 -1
  293. package/dist/installer/commands.js +33 -15
  294. package/dist/installer/install.js +1 -1
  295. package/dist/installer/metadata.js +1 -1
  296. package/dist/installer/project-files.js +5 -6
  297. package/dist/installer/ralph-assets.js +8 -0
  298. package/dist/installer/template-files.js +85 -13
  299. package/dist/platform/codex.js +6 -1
  300. package/dist/platform/detect.js +7 -3
  301. package/dist/platform/doctor-checks.js +2 -2
  302. package/dist/platform/guidance.js +66 -0
  303. package/dist/platform/instructions-snippet.js +15 -0
  304. package/dist/platform/opencode.js +20 -0
  305. package/dist/platform/registry.js +2 -0
  306. package/dist/platform/types.js +1 -0
  307. package/dist/reset.js +4 -5
  308. package/dist/run/ralph-process.js +59 -10
  309. package/dist/run/run-dashboard.js +10 -9
  310. package/dist/transition/artifact-scan.js +16 -10
  311. package/dist/transition/context.js +1 -1
  312. package/dist/utils/constants.js +26 -2
  313. package/dist/utils/github.js +4 -3
  314. package/dist/utils/ralph-runtime-state.js +3 -13
  315. package/dist/utils/validate.js +4 -10
  316. package/dist/watch/dashboard.js +17 -5
  317. package/dist/watch/renderer.js +31 -6
  318. package/dist/watch/state-reader.js +20 -1
  319. package/package.json +8 -2
  320. package/ralph/drivers/opencode.sh +147 -0
  321. package/ralph/lib/response_analyzer.sh +227 -78
  322. package/ralph/lib/wizard_utils.sh +4 -4
  323. package/ralph/ralph_loop.sh +508 -4
  324. package/ralph/templates/PROMPT.md +12 -0
  325. package/ralph/templates/REVIEW_PROMPT.md +60 -0
  326. package/ralph/templates/ralphrc.template +41 -2
  327. package/slash-commands/advanced-elicitation.md +1 -1
  328. package/slash-commands/adversarial-review.md +1 -1
  329. package/slash-commands/bmad-help.md +1 -1
  330. package/slash-commands/bmalph.md +1 -1
  331. package/slash-commands/brainstorm-project.md +1 -1
  332. package/slash-commands/brainstorming.md +1 -1
  333. package/slash-commands/correct-course.md +1 -1
  334. package/slash-commands/create-architecture.md +1 -1
  335. package/slash-commands/create-brief.md +1 -1
  336. package/slash-commands/create-epics-stories.md +1 -1
  337. package/slash-commands/create-prd.md +1 -1
  338. package/slash-commands/create-story.md +1 -1
  339. package/slash-commands/create-ux.md +1 -1
  340. package/slash-commands/distillator.md +1 -0
  341. package/slash-commands/document-project.md +1 -1
  342. package/slash-commands/domain-research.md +1 -1
  343. package/slash-commands/edge-case-hunter.md +1 -0
  344. package/slash-commands/edit-prd.md +1 -0
  345. package/slash-commands/editorial-prose.md +1 -1
  346. package/slash-commands/editorial-structure.md +1 -1
  347. package/slash-commands/generate-project-context.md +1 -1
  348. package/slash-commands/implementation-readiness.md +1 -1
  349. package/slash-commands/index-docs.md +1 -1
  350. package/slash-commands/market-research.md +1 -1
  351. package/slash-commands/party-mode.md +1 -1
  352. package/slash-commands/qa-automate.md +1 -1
  353. package/slash-commands/quick-dev-new.md +1 -0
  354. package/slash-commands/quick-dev.md +1 -1
  355. package/slash-commands/retrospective.md +1 -1
  356. package/slash-commands/shard-doc.md +1 -1
  357. package/slash-commands/sprint-planning.md +1 -1
  358. package/slash-commands/sprint-status.md +1 -1
  359. package/slash-commands/tech-spec.md +1 -1
  360. package/slash-commands/technical-research.md +1 -1
  361. package/slash-commands/validate-architecture.md +1 -1
  362. package/slash-commands/validate-brief.md +1 -1
  363. package/slash-commands/validate-epics-stories.md +1 -1
  364. package/slash-commands/validate-prd.md +1 -1
  365. package/slash-commands/validate-story.md +1 -1
  366. package/slash-commands/validate-ux.md +1 -1
  367. package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +0 -23
  368. package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +0 -227
  369. package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -44
  370. package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -54
  371. package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +0 -346
  372. package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -53
  373. package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -21
  374. package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -53
  375. package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -47
  376. package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +0 -25
  377. package/bmad/bmm/workflows/document-project/workflow.yaml +0 -22
  378. package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
  379. package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
  380. package/bmad/bmm/workflows/qa/automate/workflow.yaml +0 -44
  381. package/bmad/core/agents/bmad-master.agent.yaml +0 -30
  382. package/bmad/core/tasks/editorial-review-prose.xml +0 -102
  383. package/bmad/core/tasks/editorial-review-structure.xml +0 -209
  384. package/bmad/core/tasks/index-docs.xml +0 -65
  385. package/bmad/core/tasks/review-adversarial-general.xml +0 -48
  386. package/bmad/core/tasks/shard-doc.xml +0 -108
  387. package/bmad/core/tasks/workflow.xml +0 -235
  388. package/bmad/core/workflows/advanced-elicitation/workflow.xml +0 -117
  389. package/dist/cli.js.map +0 -1
  390. package/dist/commands/check-updates.js.map +0 -1
  391. package/dist/commands/doctor-checks.js.map +0 -1
  392. package/dist/commands/doctor-health-checks.js.map +0 -1
  393. package/dist/commands/doctor-runtime-checks.js.map +0 -1
  394. package/dist/commands/doctor.js.map +0 -1
  395. package/dist/commands/implement.js.map +0 -1
  396. package/dist/commands/init.js.map +0 -1
  397. package/dist/commands/reset.js.map +0 -1
  398. package/dist/commands/run.js.map +0 -1
  399. package/dist/commands/status.js.map +0 -1
  400. package/dist/commands/upgrade.js.map +0 -1
  401. package/dist/commands/watch.js.map +0 -1
  402. package/dist/installer/bmad-assets.js.map +0 -1
  403. package/dist/installer/commands.js.map +0 -1
  404. package/dist/installer/install.js.map +0 -1
  405. package/dist/installer/metadata.js.map +0 -1
  406. package/dist/installer/project-files.js.map +0 -1
  407. package/dist/installer/ralph-assets.js.map +0 -1
  408. package/dist/installer/template-files.js.map +0 -1
  409. package/dist/installer/types.js.map +0 -1
  410. package/dist/installer.js.map +0 -1
  411. package/dist/platform/aider.js.map +0 -1
  412. package/dist/platform/claude-code.js.map +0 -1
  413. package/dist/platform/codex.js.map +0 -1
  414. package/dist/platform/copilot.js.map +0 -1
  415. package/dist/platform/cursor-runtime-checks.js.map +0 -1
  416. package/dist/platform/cursor.js.map +0 -1
  417. package/dist/platform/detect.js.map +0 -1
  418. package/dist/platform/doctor-checks.js.map +0 -1
  419. package/dist/platform/instructions-snippet.js.map +0 -1
  420. package/dist/platform/registry.js.map +0 -1
  421. package/dist/platform/resolve.js.map +0 -1
  422. package/dist/platform/types.js.map +0 -1
  423. package/dist/platform/windsurf.js.map +0 -1
  424. package/dist/reset.js.map +0 -1
  425. package/dist/run/ralph-process.js.map +0 -1
  426. package/dist/run/run-dashboard.js.map +0 -1
  427. package/dist/run/types.js.map +0 -1
  428. package/dist/transition/artifact-collection.js.map +0 -1
  429. package/dist/transition/artifact-loading.js.map +0 -1
  430. package/dist/transition/artifact-scan.js.map +0 -1
  431. package/dist/transition/artifacts.js.map +0 -1
  432. package/dist/transition/context-output.js.map +0 -1
  433. package/dist/transition/context.js.map +0 -1
  434. package/dist/transition/fix-plan-sync.js.map +0 -1
  435. package/dist/transition/fix-plan.js.map +0 -1
  436. package/dist/transition/index.js.map +0 -1
  437. package/dist/transition/orchestration.js.map +0 -1
  438. package/dist/transition/preflight.js.map +0 -1
  439. package/dist/transition/section-patterns.js.map +0 -1
  440. package/dist/transition/specs-changelog.js.map +0 -1
  441. package/dist/transition/specs-index.js.map +0 -1
  442. package/dist/transition/specs-sync.js.map +0 -1
  443. package/dist/transition/sprint-status.js.map +0 -1
  444. package/dist/transition/story-id.js.map +0 -1
  445. package/dist/transition/story-parsing.js.map +0 -1
  446. package/dist/transition/tech-stack.js.map +0 -1
  447. package/dist/transition/types.js.map +0 -1
  448. package/dist/utils/artifact-definitions.js.map +0 -1
  449. package/dist/utils/config.js.map +0 -1
  450. package/dist/utils/constants.js.map +0 -1
  451. package/dist/utils/dryrun.js.map +0 -1
  452. package/dist/utils/errors.js.map +0 -1
  453. package/dist/utils/file-system.js.map +0 -1
  454. package/dist/utils/format-status.js.map +0 -1
  455. package/dist/utils/github.js.map +0 -1
  456. package/dist/utils/json.js.map +0 -1
  457. package/dist/utils/logger.js.map +0 -1
  458. package/dist/utils/ralph-runtime-state.js.map +0 -1
  459. package/dist/utils/state.js.map +0 -1
  460. package/dist/utils/validate.js.map +0 -1
  461. package/dist/watch/dashboard.js.map +0 -1
  462. package/dist/watch/file-watcher.js.map +0 -1
  463. package/dist/watch/frame-writer.js.map +0 -1
  464. package/dist/watch/renderer.js.map +0 -1
  465. package/dist/watch/state-reader.js.map +0 -1
  466. package/dist/watch/types.js.map +0 -1
  467. package/slash-commands/execute-workflow.md +0 -1
  468. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-01-init.md +0 -0
  469. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-02-domain-analysis.md +0 -0
  470. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-03-competitive-landscape.md +0 -0
  471. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-04-regulatory-focus.md +0 -0
  472. /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-05-technical-trends.md +0 -0
  473. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-01-init.md +0 -0
  474. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-02-technical-overview.md +0 -0
  475. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-03-integration-patterns.md +0 -0
  476. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-04-architectural-patterns.md +0 -0
  477. /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-05-implementation-research.md +0 -0
  478. /package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/ux-design-template.md +0 -0
  479. /package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/templates/readiness-report-template.md +0 -0
  480. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/architecture-decision-template.md +0 -0
  481. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/domain-complexity.csv +0 -0
  482. /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/project-types.csv +0 -0
  483. /package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/template.md +0 -0
  484. /package/bmad/bmm/workflows/4-implementation/{dev-story → bmad-dev-story}/checklist.md +0 -0
  485. /package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/checklist.md +0 -0
  486. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/checklist.md +0 -0
  487. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/documentation-requirements.csv +0 -0
  488. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/deep-dive-template.md +0 -0
  489. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/index-template.md +0 -0
  490. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-overview-template.md +0 -0
  491. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-scan-report-schema.json +0 -0
  492. /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/source-tree-template.md +0 -0
  493. /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/project-context-template.md +0 -0
  494. /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-03-complete.md +0 -0
  495. /package/bmad/bmm/workflows/{qa/automate → bmad-qa-generate-e2e-tests}/checklist.md +0 -0
  496. /package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/tech-spec-template.md +0 -0
  497. /package/bmad/core/{workflows/advanced-elicitation → skills/bmad-advanced-elicitation}/methods.csv +0 -0
  498. /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/brain-methods.csv +0 -0
  499. /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/template.md +0 -0
  500. /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-01-agent-loading.md +0 -0
  501. /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-02-discussion-orchestration.md +0 -0
  502. /package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/templates/prd-template.md +0 -0
@@ -33,6 +33,7 @@ LIVE_LOG_FILE="$RALPH_DIR/live.log" # Fixed file for live output monitoring
33
33
  CALL_COUNT_FILE="$RALPH_DIR/.call_count"
34
34
  TIMESTAMP_FILE="$RALPH_DIR/.last_reset"
35
35
  USE_TMUX=false
36
+ PENDING_EXIT_REASON=""
36
37
 
37
38
  # Save environment variable state BEFORE setting defaults
38
39
  # These are used by load_ralphrc() to determine which values came from environment
@@ -68,6 +69,13 @@ _cli_CLAUDE_SESSION_EXPIRY_HOURS="${CLAUDE_SESSION_EXPIRY_HOURS:-}"
68
69
  _cli_VERBOSE_PROGRESS="${VERBOSE_PROGRESS:-}"
69
70
  _env_CB_COOLDOWN_MINUTES="${CB_COOLDOWN_MINUTES:-}"
70
71
  _env_CB_AUTO_RESET="${CB_AUTO_RESET:-}"
72
+ _env_TEST_COMMAND="${TEST_COMMAND:-}"
73
+ _env_QUALITY_GATES="${QUALITY_GATES:-}"
74
+ _env_QUALITY_GATE_MODE="${QUALITY_GATE_MODE:-}"
75
+ _env_QUALITY_GATE_TIMEOUT="${QUALITY_GATE_TIMEOUT:-}"
76
+ _env_QUALITY_GATE_ON_COMPLETION_ONLY="${QUALITY_GATE_ON_COMPLETION_ONLY:-}"
77
+ _env_REVIEW_ENABLED="${REVIEW_ENABLED:-}"
78
+ _env_REVIEW_INTERVAL="${REVIEW_INTERVAL:-}"
71
79
 
72
80
  # Now set defaults (only if not already set by environment)
73
81
  MAX_CALLS_PER_HOUR="${MAX_CALLS_PER_HOUR:-100}"
@@ -93,6 +101,21 @@ RALPH_SESSION_HISTORY_FILE="$RALPH_DIR/.ralph_session_history" # Session transi
93
101
  # Too short = frequent context loss; Too long = stale context causes unpredictable behavior
94
102
  CLAUDE_SESSION_EXPIRY_HOURS=${CLAUDE_SESSION_EXPIRY_HOURS:-24}
95
103
 
104
+ # Quality gates configuration
105
+ TEST_COMMAND="${TEST_COMMAND:-}"
106
+ QUALITY_GATES="${QUALITY_GATES:-}"
107
+ QUALITY_GATE_MODE="${QUALITY_GATE_MODE:-warn}"
108
+ QUALITY_GATE_TIMEOUT="${QUALITY_GATE_TIMEOUT:-120}"
109
+ QUALITY_GATE_ON_COMPLETION_ONLY="${QUALITY_GATE_ON_COMPLETION_ONLY:-false}"
110
+ QUALITY_GATE_RESULTS_FILE="$RALPH_DIR/.quality_gate_results"
111
+
112
+ # Periodic code review configuration
113
+ REVIEW_ENABLED="${REVIEW_ENABLED:-false}"
114
+ REVIEW_INTERVAL="${REVIEW_INTERVAL:-5}"
115
+ REVIEW_FINDINGS_FILE="$RALPH_DIR/.review_findings.json"
116
+ REVIEW_PROMPT_FILE="$RALPH_DIR/REVIEW_PROMPT.md"
117
+ REVIEW_LAST_SHA_FILE="$RALPH_DIR/.review_last_sha"
118
+
96
119
  # Valid tool patterns for --allowed-tools validation
97
120
  # Default: Claude Code tools. Platform driver overwrites via driver_valid_tools() in main().
98
121
  # Validation runs in main() after load_platform_driver so the correct patterns are in effect.
@@ -237,6 +260,13 @@ load_ralphrc() {
237
260
  [[ "$_CLI_VERBOSE_PROGRESS" == "true" ]] && VERBOSE_PROGRESS="$_cli_VERBOSE_PROGRESS"
238
261
  [[ -n "$_env_CB_COOLDOWN_MINUTES" ]] && CB_COOLDOWN_MINUTES="$_env_CB_COOLDOWN_MINUTES"
239
262
  [[ -n "$_env_CB_AUTO_RESET" ]] && CB_AUTO_RESET="$_env_CB_AUTO_RESET"
263
+ [[ -n "$_env_TEST_COMMAND" ]] && TEST_COMMAND="$_env_TEST_COMMAND"
264
+ [[ -n "$_env_QUALITY_GATES" ]] && QUALITY_GATES="$_env_QUALITY_GATES"
265
+ [[ -n "$_env_QUALITY_GATE_MODE" ]] && QUALITY_GATE_MODE="$_env_QUALITY_GATE_MODE"
266
+ [[ -n "$_env_QUALITY_GATE_TIMEOUT" ]] && QUALITY_GATE_TIMEOUT="$_env_QUALITY_GATE_TIMEOUT"
267
+ [[ -n "$_env_QUALITY_GATE_ON_COMPLETION_ONLY" ]] && QUALITY_GATE_ON_COMPLETION_ONLY="$_env_QUALITY_GATE_ON_COMPLETION_ONLY"
268
+ [[ -n "$_env_REVIEW_ENABLED" ]] && REVIEW_ENABLED="$_env_REVIEW_ENABLED"
269
+ [[ -n "$_env_REVIEW_INTERVAL" ]] && REVIEW_INTERVAL="$_env_REVIEW_INTERVAL"
240
270
 
241
271
  normalize_claude_permission_mode
242
272
  RALPHRC_FILE="$config_file"
@@ -513,6 +543,17 @@ update_status() {
513
543
  exit_reason: $exit_reason,
514
544
  next_reset: $next_reset
515
545
  }' > "$STATUS_FILE"
546
+
547
+ # Merge quality gate status if results exist
548
+ if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
549
+ local qg_tmp="$STATUS_FILE.qg_tmp"
550
+ if jq -s '.[0] * {quality_gates: {overall_status: .[1].overall_status, mode: .[1].mode}}' \
551
+ "$STATUS_FILE" "$QUALITY_GATE_RESULTS_FILE" > "$qg_tmp" 2>/dev/null; then
552
+ mv "$qg_tmp" "$STATUS_FILE"
553
+ else
554
+ rm -f "$qg_tmp" 2>/dev/null
555
+ fi
556
+ fi
516
557
  }
517
558
 
518
559
  validate_permission_denial_mode() {
@@ -530,6 +571,31 @@ validate_permission_denial_mode() {
530
571
  esac
531
572
  }
532
573
 
574
+ validate_quality_gate_mode() {
575
+ local mode=$1
576
+
577
+ case "$mode" in
578
+ warn|block|circuit-breaker)
579
+ return 0
580
+ ;;
581
+ *)
582
+ echo "Error: Invalid QUALITY_GATE_MODE: '$mode'"
583
+ echo "Valid modes: warn block circuit-breaker"
584
+ return 1
585
+ ;;
586
+ esac
587
+ }
588
+
589
+ validate_quality_gate_timeout() {
590
+ local timeout=$1
591
+
592
+ if [[ ! "$timeout" =~ ^[0-9]+$ ]] || [[ "$timeout" -eq 0 ]]; then
593
+ echo "Error: QUALITY_GATE_TIMEOUT must be a positive integer, got: '$timeout'"
594
+ return 1
595
+ fi
596
+ return 0
597
+ }
598
+
533
599
  normalize_claude_permission_mode() {
534
600
  if [[ -z "${CLAUDE_PERMISSION_MODE:-}" ]]; then
535
601
  CLAUDE_PERMISSION_MODE="bypassPermissions"
@@ -796,9 +862,207 @@ enforce_fix_plan_progress_tracking() {
796
862
  return 0
797
863
  }
798
864
 
865
+ # Run the built-in test gate
866
+ # Reads tests_status from .response_analysis. If FAILING and TEST_COMMAND is set,
867
+ # runs the command to verify. Returns JSON with status/verified/output on stdout.
868
+ run_test_gate() {
869
+ local analysis_file=$1
870
+
871
+ if [[ ! -f "$analysis_file" ]]; then
872
+ echo '{"status":"skip","tests_status_reported":"","verified":false,"output":""}'
873
+ return 0
874
+ fi
875
+
876
+ local tests_status
877
+ tests_status=$(jq -r '.analysis.tests_status // "UNKNOWN"' "$analysis_file" 2>/dev/null || echo "UNKNOWN")
878
+
879
+ if [[ "$tests_status" == "UNKNOWN" && -z "$TEST_COMMAND" ]]; then
880
+ echo '{"status":"skip","tests_status_reported":"UNKNOWN","verified":false,"output":""}'
881
+ return 0
882
+ fi
883
+
884
+ if [[ "$tests_status" == "PASSING" && -z "$TEST_COMMAND" ]]; then
885
+ jq -n --arg ts "$tests_status" '{"status":"pass","tests_status_reported":$ts,"verified":false,"output":""}'
886
+ return 0
887
+ fi
888
+
889
+ if [[ -n "$TEST_COMMAND" ]]; then
890
+ local cmd_output=""
891
+ local cmd_exit=0
892
+ cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$TEST_COMMAND" 2>&1) || cmd_exit=$?
893
+ cmd_output="${cmd_output:0:500}"
894
+
895
+ local verified_status="pass"
896
+ if [[ $cmd_exit -ne 0 ]]; then
897
+ verified_status="fail"
898
+ fi
899
+
900
+ jq -n \
901
+ --arg status "$verified_status" \
902
+ --arg ts "$tests_status" \
903
+ --arg out "$cmd_output" \
904
+ '{"status":$status,"tests_status_reported":$ts,"verified":true,"output":$out}'
905
+ return 0
906
+ fi
907
+
908
+ # No TEST_COMMAND, trust the reported status
909
+ local gate_status="pass"
910
+ if [[ "$tests_status" == "FAILING" ]]; then
911
+ gate_status="fail"
912
+ fi
913
+
914
+ jq -n \
915
+ --arg status "$gate_status" \
916
+ --arg ts "$tests_status" \
917
+ '{"status":$status,"tests_status_reported":$ts,"verified":false,"output":""}'
918
+ }
919
+
920
+ # Run user-defined quality gate commands
921
+ # Splits QUALITY_GATES on semicolons, runs each with portable_timeout.
922
+ # Returns JSON array of results on stdout.
923
+ run_custom_gates() {
924
+ if [[ -z "$QUALITY_GATES" ]]; then
925
+ echo "[]"
926
+ return 0
927
+ fi
928
+
929
+ local results="[]"
930
+ local gates
931
+ IFS=";" read -ra gates <<< "$QUALITY_GATES"
932
+
933
+ for gate_cmd in "${gates[@]}"; do
934
+ gate_cmd=$(echo "$gate_cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
935
+ [[ -z "$gate_cmd" ]] && continue
936
+
937
+ local cmd_output=""
938
+ local cmd_exit=0
939
+ local start_time
940
+ start_time=$(date +%s)
941
+ local timed_out="false"
942
+
943
+ cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$gate_cmd" 2>&1) || cmd_exit=$?
944
+
945
+ local end_time
946
+ end_time=$(date +%s)
947
+ local duration=$((end_time - start_time))
948
+
949
+ # portable_timeout returns 124 on timeout
950
+ if [[ $cmd_exit -eq 124 ]]; then
951
+ timed_out="true"
952
+ fi
953
+
954
+ cmd_output="${cmd_output:0:500}"
955
+
956
+ local gate_status="pass"
957
+ if [[ $cmd_exit -ne 0 ]]; then
958
+ gate_status="fail"
959
+ fi
960
+
961
+ results=$(echo "$results" | jq \
962
+ --arg cmd "$gate_cmd" \
963
+ --arg status "$gate_status" \
964
+ --argjson exit_code "$cmd_exit" \
965
+ --arg out "$cmd_output" \
966
+ --argjson dur "$duration" \
967
+ --argjson timed_out "$timed_out" \
968
+ '. += [{"command":$cmd,"status":$status,"exit_code":$exit_code,"output":$out,"duration_seconds":$dur,"timed_out":$timed_out}]'
969
+ )
970
+ done
971
+
972
+ echo "$results"
973
+ }
974
+
975
+ # Orchestrator: run all quality gates and write results file
976
+ # Args: loop_number exit_signal_active
977
+ # Returns (on stdout): 0=pass/warn, 1=block failure, 2=circuit-breaker failure
978
+ run_quality_gates() {
979
+ local loop_number=$1
980
+ local exit_signal_active=${2:-"false"}
981
+
982
+ # Skip if no gates configured
983
+ if [[ -z "$TEST_COMMAND" && -z "$QUALITY_GATES" ]]; then
984
+ echo "0"
985
+ return 0
986
+ fi
987
+
988
+ # Skip if completion-only mode and not completing
989
+ if [[ "$QUALITY_GATE_ON_COMPLETION_ONLY" == "true" && "$exit_signal_active" != "true" ]]; then
990
+ echo "0"
991
+ return 0
992
+ fi
993
+
994
+ local test_gate_json
995
+ test_gate_json=$(run_test_gate "$RESPONSE_ANALYSIS_FILE")
996
+
997
+ local custom_gates_json
998
+ custom_gates_json=$(run_custom_gates)
999
+
1000
+ # Determine overall status
1001
+ local overall_status="pass"
1002
+ local test_gate_status
1003
+ test_gate_status=$(echo "$test_gate_json" | jq -r '.status' 2>/dev/null || echo "skip")
1004
+ if [[ "$test_gate_status" == "fail" ]]; then
1005
+ overall_status="fail"
1006
+ fi
1007
+
1008
+ local custom_fail_count
1009
+ custom_fail_count=$(echo "$custom_gates_json" | jq '[.[] | select(.status == "fail")] | length' 2>/dev/null || echo "0")
1010
+ if [[ $custom_fail_count -gt 0 ]]; then
1011
+ overall_status="fail"
1012
+ fi
1013
+
1014
+ # Write results file atomically (tmp+mv to avoid truncation on jq failure)
1015
+ local qg_tmp="$QUALITY_GATE_RESULTS_FILE.tmp"
1016
+ if jq -n \
1017
+ --arg timestamp "$(get_iso_timestamp)" \
1018
+ --argjson loop_number "$loop_number" \
1019
+ --argjson test_gate "$test_gate_json" \
1020
+ --argjson custom_gates "$custom_gates_json" \
1021
+ --arg overall_status "$overall_status" \
1022
+ --arg mode "$QUALITY_GATE_MODE" \
1023
+ '{
1024
+ timestamp: $timestamp,
1025
+ loop_number: $loop_number,
1026
+ test_gate: $test_gate,
1027
+ custom_gates: $custom_gates,
1028
+ overall_status: $overall_status,
1029
+ mode: $mode
1030
+ }' > "$qg_tmp" 2>/dev/null; then
1031
+ mv "$qg_tmp" "$QUALITY_GATE_RESULTS_FILE"
1032
+ else
1033
+ rm -f "$qg_tmp" 2>/dev/null
1034
+ fi
1035
+
1036
+ if [[ "$overall_status" == "fail" ]]; then
1037
+ log_status "WARN" "Quality gate failure (mode=$QUALITY_GATE_MODE): test_gate=$test_gate_status, custom_failures=$custom_fail_count"
1038
+ fi
1039
+
1040
+ # Return code based on mode
1041
+ if [[ "$overall_status" == "pass" ]]; then
1042
+ echo "0"
1043
+ return 0
1044
+ fi
1045
+
1046
+ case "$QUALITY_GATE_MODE" in
1047
+ block)
1048
+ echo "1"
1049
+ return 0
1050
+ ;;
1051
+ circuit-breaker)
1052
+ echo "2"
1053
+ return 0
1054
+ ;;
1055
+ *)
1056
+ # warn mode: return 0 even on failure
1057
+ echo "0"
1058
+ return 0
1059
+ ;;
1060
+ esac
1061
+ }
1062
+
799
1063
  # Check if we should gracefully exit
800
1064
  should_exit_gracefully() {
801
-
1065
+
802
1066
  if [[ ! -f "$EXIT_SIGNALS_FILE" ]]; then
803
1067
  return 1 # Don't exit, file doesn't exist
804
1068
  fi
@@ -989,7 +1253,28 @@ build_loop_context() {
989
1253
  if [[ -f "$RESPONSE_ANALYSIS_FILE" ]]; then
990
1254
  local prev_summary=$(jq -r '.analysis.work_summary // ""' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null | head -c 200)
991
1255
  if [[ -n "$prev_summary" && "$prev_summary" != "null" ]]; then
992
- context+="Previous: ${prev_summary}"
1256
+ context+="Previous: ${prev_summary}. "
1257
+ fi
1258
+ fi
1259
+
1260
+ # Add quality gate failure feedback (block and circuit-breaker modes only)
1261
+ if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
1262
+ local qg_status qg_mode
1263
+ qg_status=$(jq -r '.overall_status // "pass"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
1264
+ qg_mode=$(jq -r '.mode // "warn"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
1265
+
1266
+ if [[ "$qg_status" == "fail" && "$qg_mode" != "warn" ]]; then
1267
+ local test_gate_status
1268
+ test_gate_status=$(jq -r '.test_gate.status // "skip"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
1269
+ if [[ "$test_gate_status" == "fail" ]]; then
1270
+ context+="TESTS FAILING. "
1271
+ fi
1272
+
1273
+ local failed_gates
1274
+ failed_gates=$(jq -r '[.custom_gates[] | select(.status == "fail") | .command | split(" ")[0:2] | join(" ")] | join(", ")' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
1275
+ if [[ -n "$failed_gates" ]]; then
1276
+ context+="QG fail: ${failed_gates}. "
1277
+ fi
993
1278
  fi
994
1279
  fi
995
1280
 
@@ -997,6 +1282,151 @@ build_loop_context() {
997
1282
  echo "${context:0:500}"
998
1283
  }
999
1284
 
1285
+ # Check if a periodic code review should run this iteration
1286
+ # Returns 0 (true) when review is due, 1 (false) otherwise
1287
+ should_run_review() {
1288
+ [[ "$REVIEW_ENABLED" != "true" ]] && return 1
1289
+ local loop_count=$1
1290
+ # Never review on first loop (no implementation yet)
1291
+ (( loop_count < 1 )) && return 1
1292
+ (( loop_count % REVIEW_INTERVAL != 0 )) && return 1
1293
+ # Skip if circuit breaker is not CLOSED
1294
+ if [[ -f "$RALPH_DIR/.circuit_breaker_state" ]]; then
1295
+ local cb_state
1296
+ cb_state=$(jq -r '.state // "CLOSED"' "$RALPH_DIR/.circuit_breaker_state" 2>/dev/null)
1297
+ [[ "$cb_state" != "CLOSED" ]] && return 1
1298
+ fi
1299
+ # Skip if no changes since last review (committed or uncommitted)
1300
+ if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null 2>&1; then
1301
+ local current_sha last_sha
1302
+ current_sha=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
1303
+ last_sha=""
1304
+ [[ -f "$REVIEW_LAST_SHA_FILE" ]] && last_sha=$(cat "$REVIEW_LAST_SHA_FILE" 2>/dev/null)
1305
+ # Check for new commits OR uncommitted workspace changes
1306
+ local has_uncommitted
1307
+ has_uncommitted=$(git status --porcelain 2>/dev/null | head -1)
1308
+ if [[ "$current_sha" == "$last_sha" && -z "$has_uncommitted" ]]; then
1309
+ return 1
1310
+ fi
1311
+ fi
1312
+ return 0
1313
+ }
1314
+
1315
+ # Build review findings context for injection into the next implementation loop
1316
+ # Returns a compact string (max 500 chars) with unresolved findings
1317
+ build_review_context() {
1318
+ if [[ ! -f "$REVIEW_FINDINGS_FILE" ]]; then
1319
+ echo ""
1320
+ return
1321
+ fi
1322
+
1323
+ local severity issues_found summary
1324
+ severity=$(jq -r '.severity // ""' "$REVIEW_FINDINGS_FILE" 2>/dev/null)
1325
+ issues_found=$(jq -r '.issues_found // 0' "$REVIEW_FINDINGS_FILE" 2>/dev/null)
1326
+ summary=$(jq -r '.summary // ""' "$REVIEW_FINDINGS_FILE" 2>/dev/null | head -c 300)
1327
+
1328
+ if [[ "$issues_found" == "0" || -z "$severity" || "$severity" == "null" ]]; then
1329
+ echo ""
1330
+ return
1331
+ fi
1332
+
1333
+ local context="REVIEW FINDINGS ($severity, $issues_found issues): $summary"
1334
+ # Include top details if space allows
1335
+ local top_details
1336
+ top_details=$(jq -r '(.details[:2] // []) | map("- [\(.severity)] \(.file): \(.issue)") | join("; ")' "$REVIEW_FINDINGS_FILE" 2>/dev/null | head -c 150)
1337
+ if [[ -n "$top_details" && "$top_details" != "null" ]]; then
1338
+ context+=" Details: $top_details"
1339
+ fi
1340
+
1341
+ echo "${context:0:500}"
1342
+ }
1343
+
1344
+ # Execute a periodic code review loop (read-only, no file modifications)
1345
+ # Uses a fresh ephemeral session with restricted tool permissions
1346
+ run_review_loop() {
1347
+ local loop_count=$1
1348
+
1349
+ log_status "INFO" "Starting periodic code review (loop #$loop_count)"
1350
+
1351
+ # Get diff context (committed + uncommitted changes)
1352
+ local last_sha=""
1353
+ [[ -f "$REVIEW_LAST_SHA_FILE" ]] && last_sha=$(cat "$REVIEW_LAST_SHA_FILE" 2>/dev/null)
1354
+ local diff_context=""
1355
+ if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null 2>&1; then
1356
+ local committed_diff="" uncommitted_diff=""
1357
+ if [[ -n "$last_sha" ]]; then
1358
+ committed_diff=$(git diff "$last_sha"..HEAD --stat 2>/dev/null | head -20 || true)
1359
+ else
1360
+ committed_diff=$(git diff HEAD~5..HEAD --stat 2>/dev/null | head -20 || true)
1361
+ fi
1362
+ uncommitted_diff=$(git diff --stat 2>/dev/null | head -10 || true)
1363
+ diff_context="${committed_diff}"
1364
+ if [[ -n "$uncommitted_diff" ]]; then
1365
+ diff_context+=$'\nUncommitted:\n'"${uncommitted_diff}"
1366
+ fi
1367
+ [[ -z "$diff_context" ]] && diff_context="No recent changes"
1368
+ fi
1369
+
1370
+ # Check review prompt exists
1371
+ if [[ ! -f "$REVIEW_PROMPT_FILE" ]]; then
1372
+ log_status "WARN" "Review prompt file not found: $REVIEW_PROMPT_FILE — skipping review"
1373
+ return 0
1374
+ fi
1375
+
1376
+ # Build review-specific context
1377
+ local review_context="CODE REVIEW LOOP (read-only). Analyze changes since last review. Recent changes: $diff_context"
1378
+
1379
+ # Save and override CLAUDE_ALLOWED_TOOLS for read-only mode
1380
+ local saved_tools="$CLAUDE_ALLOWED_TOOLS"
1381
+ CLAUDE_ALLOWED_TOOLS="Read,Glob,Grep"
1382
+
1383
+ local timeout_seconds=$((CLAUDE_TIMEOUT_MINUTES * 60))
1384
+ local review_output_file="$LOG_DIR/review_loop_${loop_count}.log"
1385
+
1386
+ # Build command with review prompt and NO session resume (ephemeral)
1387
+ if driver_build_command "$REVIEW_PROMPT_FILE" "$review_context" ""; then
1388
+ # Execute review (capture output)
1389
+ portable_timeout "${timeout_seconds}s" "${CLAUDE_CMD_ARGS[@]}" \
1390
+ < /dev/null > "$review_output_file" 2>&1 || true
1391
+ fi
1392
+
1393
+ # Restore CLAUDE_ALLOWED_TOOLS
1394
+ CLAUDE_ALLOWED_TOOLS="$saved_tools"
1395
+
1396
+ # Parse review findings from output
1397
+ if [[ -f "$review_output_file" ]]; then
1398
+ # Review ran successfully — save SHA so we don't re-review the same state
1399
+ git rev-parse HEAD > "$REVIEW_LAST_SHA_FILE" 2>/dev/null || true
1400
+
1401
+ local findings_json=""
1402
+ # Extract JSON between ---REVIEW_FINDINGS--- and ---END_REVIEW_FINDINGS--- markers
1403
+ findings_json=$(sed -n '/---REVIEW_FINDINGS---/,/---END_REVIEW_FINDINGS---/{//!p;}' "$review_output_file" 2>/dev/null | tr -d '\n' | head -c 5000)
1404
+
1405
+ # If output is JSON format, try extracting from result field first
1406
+ if [[ -z "$findings_json" ]]; then
1407
+ local raw_text
1408
+ raw_text=$(jq -r '.result // .content // ""' "$review_output_file" 2>/dev/null || cat "$review_output_file" 2>/dev/null)
1409
+ findings_json=$(echo "$raw_text" | sed -n '/---REVIEW_FINDINGS---/,/---END_REVIEW_FINDINGS---/{//!p;}' 2>/dev/null | tr -d '\n' | head -c 5000)
1410
+ fi
1411
+
1412
+ if [[ -n "$findings_json" ]]; then
1413
+ # Validate it's valid JSON before writing
1414
+ if echo "$findings_json" | jq . > /dev/null 2>&1; then
1415
+ local tmp_findings="$REVIEW_FINDINGS_FILE.tmp"
1416
+ echo "$findings_json" > "$tmp_findings"
1417
+ mv "$tmp_findings" "$REVIEW_FINDINGS_FILE"
1418
+ local issue_count
1419
+ issue_count=$(echo "$findings_json" | jq -r '.issues_found // 0' 2>/dev/null)
1420
+ log_status "INFO" "Code review complete. $issue_count issue(s) found."
1421
+ else
1422
+ log_status "WARN" "Review findings JSON is malformed — skipping"
1423
+ fi
1424
+ else
1425
+ log_status "INFO" "Code review complete. No structured findings extracted."
1426
+ fi
1427
+ fi
1428
+ }
1429
+
1000
1430
  # Get session file age in seconds (cross-platform)
1001
1431
  # Returns: age in seconds on stdout, or -1 if stat fails
1002
1432
  get_session_file_age_seconds() {
@@ -1102,7 +1532,15 @@ save_claude_session() {
1102
1532
  # Try to extract session ID from structured output
1103
1533
  if [[ -f "$output_file" ]]; then
1104
1534
  local session_id
1105
- session_id=$(extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
1535
+ if declare -F driver_extract_session_id_from_output >/dev/null; then
1536
+ session_id=$(driver_extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
1537
+ fi
1538
+ if [[ -z "$session_id" || "$session_id" == "null" ]]; then
1539
+ session_id=$(extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
1540
+ fi
1541
+ if [[ -z "$session_id" || "$session_id" == "null" ]] && declare -F driver_fallback_session_id >/dev/null; then
1542
+ session_id=$(driver_fallback_session_id "$output_file" 2>/dev/null || echo "")
1543
+ fi
1106
1544
  if [[ -n "$session_id" && "$session_id" != "null" ]]; then
1107
1545
  echo "$session_id" > "$CLAUDE_SESSION_FILE"
1108
1546
  sync_ralph_session_with_driver "$session_id"
@@ -1523,6 +1961,13 @@ execute_claude_code() {
1523
1961
  if build_claude_command "$PROMPT_FILE" "$loop_context" "$session_id"; then
1524
1962
  use_modern_cli=true
1525
1963
  log_status "INFO" "Using modern CLI mode (${CLAUDE_OUTPUT_FORMAT} output)"
1964
+
1965
+ # Build review findings context (separate from loop context)
1966
+ local review_context=""
1967
+ review_context=$(build_review_context)
1968
+ if [[ -n "$review_context" ]]; then
1969
+ CLAUDE_CMD_ARGS+=("--append-system-prompt" "$review_context")
1970
+ fi
1526
1971
  else
1527
1972
  log_status "WARN" "Failed to build modern CLI command, falling back to legacy mode"
1528
1973
  if [[ "$LIVE_OUTPUT" == "true" ]]; then
@@ -1741,12 +2186,32 @@ EOF
1741
2186
  read -r fix_plan_completed_after _ _ < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
1742
2187
  enforce_fix_plan_progress_tracking "$RESPONSE_ANALYSIS_FILE" "$fix_plan_completed_before" "$fix_plan_completed_after"
1743
2188
 
2189
+ # Run quality gates
2190
+ local exit_signal_for_gates
2191
+ exit_signal_for_gates=$(jq -r '.analysis.exit_signal // false' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null || echo "false")
2192
+ local qg_result
2193
+ qg_result=$(run_quality_gates "$loop_count" "$exit_signal_for_gates")
2194
+
2195
+ # Block mode: suppress exit signals so the loop keeps running
2196
+ if [[ "$qg_result" == "1" ]]; then
2197
+ log_status "WARN" "Quality gate block: suppressing completion signals"
2198
+ local qg_tmp="$RESPONSE_ANALYSIS_FILE.qg_tmp"
2199
+ if jq '.analysis.has_completion_signal = false | .analysis.exit_signal = false' \
2200
+ "$RESPONSE_ANALYSIS_FILE" > "$qg_tmp" 2>/dev/null; then
2201
+ mv "$qg_tmp" "$RESPONSE_ANALYSIS_FILE"
2202
+ else
2203
+ rm -f "$qg_tmp" 2>/dev/null
2204
+ fi
2205
+ fi
2206
+
1744
2207
  # Update exit signals based on analysis
1745
2208
  update_exit_signals
1746
2209
 
1747
2210
  # Log analysis summary
1748
2211
  log_analysis_summary
1749
2212
 
2213
+ PENDING_EXIT_REASON=$(should_exit_gracefully)
2214
+
1750
2215
  # Get file change count for circuit breaker
1751
2216
  # Fix #141: Detect both uncommitted changes AND committed changes
1752
2217
  local files_changed=0
@@ -1807,6 +2272,13 @@ EOF
1807
2272
  fi
1808
2273
  local output_length=$(wc -c < "$output_file" 2>/dev/null || echo 0)
1809
2274
 
2275
+ # Circuit-breaker mode: override progress signals so circuit breaker sees no-progress
2276
+ if [[ "$qg_result" == "2" ]]; then
2277
+ log_status "WARN" "Quality gate circuit-breaker: overriding progress signals"
2278
+ files_changed=0
2279
+ has_errors="true"
2280
+ fi
2281
+
1810
2282
  # Record result in circuit breaker
1811
2283
  record_loop_result "$loop_count" "$files_changed" "$has_errors" "$output_length"
1812
2284
  local circuit_result=$?
@@ -1854,6 +2326,18 @@ main() {
1854
2326
  exit 1
1855
2327
  fi
1856
2328
 
2329
+ if [[ -n "$QUALITY_GATES" || -n "$TEST_COMMAND" ]]; then
2330
+ if ! validate_quality_gate_mode "$QUALITY_GATE_MODE"; then
2331
+ exit 1
2332
+ fi
2333
+ if ! validate_quality_gate_timeout "$QUALITY_GATE_TIMEOUT"; then
2334
+ exit 1
2335
+ fi
2336
+ if ! has_timeout_command; then
2337
+ log_status "WARN" "No timeout command available. Quality gate and test commands will fail. Install coreutils to enable timeout support."
2338
+ fi
2339
+ fi
2340
+
1857
2341
  if [[ "$(driver_name)" == "claude-code" ]]; then
1858
2342
  normalize_claude_permission_mode
1859
2343
 
@@ -1998,8 +2482,28 @@ main() {
1998
2482
  continue
1999
2483
  fi
2000
2484
 
2485
+ if [[ -n "$PENDING_EXIT_REASON" ]]; then
2486
+ local exit_reason="$PENDING_EXIT_REASON"
2487
+ PENDING_EXIT_REASON=""
2488
+
2489
+ log_status "SUCCESS" "🏁 Graceful exit triggered: $exit_reason"
2490
+ reset_session "project_complete"
2491
+ update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "graceful_exit" "completed" "$exit_reason"
2492
+
2493
+ log_status "SUCCESS" "🎉 Ralph has completed the project! Final stats:"
2494
+ log_status "INFO" " - Total loops: $loop_count"
2495
+ log_status "INFO" " - API calls used: $(cat "$CALL_COUNT_FILE")"
2496
+ log_status "INFO" " - Exit reason: $exit_reason"
2497
+ break
2498
+ fi
2499
+
2001
2500
  update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "completed" "success"
2002
2501
 
2502
+ # Periodic code review check
2503
+ if should_run_review "$loop_count"; then
2504
+ run_review_loop "$loop_count"
2505
+ fi
2506
+
2003
2507
  # Brief pause between successful executions
2004
2508
  sleep 5
2005
2509
  elif [ $exec_result -eq 3 ]; then
@@ -2083,7 +2587,7 @@ Options:
2083
2587
  Modern CLI Options (Phase 1.1):
2084
2588
  --output-format FORMAT Set driver output format: json or text (default: $CLAUDE_OUTPUT_FORMAT)
2085
2589
  Note: --live mode requires JSON and will auto-switch
2086
- --allowed-tools TOOLS Claude Code only. Ignored by codex, cursor, and copilot
2590
+ --allowed-tools TOOLS Claude Code only. Ignored by codex, opencode, cursor, and copilot
2087
2591
  --no-continue Disable session continuity across loops
2088
2592
  --session-expiry HOURS Set session expiration time in hours (default: $CLAUDE_SESSION_EXPIRY_HOURS)
2089
2593
 
@@ -50,6 +50,18 @@ You are Ralph, an autonomous AI development agent working on a [YOUR PROJECT NAM
50
50
  - prefer small, reversible changes when requirements are ambiguous
51
51
  - surface blockers in the Ralph status block instead of starting a conversation
52
52
 
53
+ ## Self-Review Checklist (Before Reporting Status)
54
+
55
+ Before writing your RALPH_STATUS block, review your own work:
56
+
57
+ 1. Re-read the diff of files you modified this loop — check for obvious bugs, typos, missing error handling
58
+ 2. Verify you did not introduce regressions in existing functionality
59
+ 3. Confirm your changes match the spec in .ralph/specs/ for the story you worked on
60
+ 4. Check that new functions have proper error handling and edge case coverage
61
+ 5. Ensure you did not leave TODO/FIXME/HACK comments without justification
62
+
63
+ If you find issues, fix them before reporting status. This self-check costs nothing extra.
64
+
53
65
  ## 🎯 Status Reporting (CRITICAL - Ralph needs this!)
54
66
 
55
67
  **IMPORTANT**: At the end of your response, ALWAYS include this status block: