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
@@ -1,5 +1,6 @@
1
1
  import { claudeCodePlatform } from "./claude-code.js";
2
2
  import { codexPlatform } from "./codex.js";
3
+ import { opencodePlatform } from "./opencode.js";
3
4
  import { cursorPlatform } from "./cursor.js";
4
5
  import { windsurfPlatform } from "./windsurf.js";
5
6
  import { copilotPlatform } from "./copilot.js";
@@ -7,6 +8,7 @@ import { aiderPlatform } from "./aider.js";
7
8
  const PLATFORMS = new Map([
8
9
  ["claude-code", claudeCodePlatform],
9
10
  ["codex", codexPlatform],
11
+ ["opencode", opencodePlatform],
10
12
  ["cursor", cursorPlatform],
11
13
  ["windsurf", windsurfPlatform],
12
14
  ["copilot", copilotPlatform],
@@ -8,6 +8,7 @@
8
8
  export const PLATFORM_IDS = [
9
9
  "claude-code",
10
10
  "codex",
11
+ "opencode",
11
12
  "cursor",
12
13
  "windsurf",
13
14
  "copilot",
package/dist/reset.js CHANGED
@@ -3,7 +3,7 @@ import { join, posix } from "node:path";
3
3
  import { getSlashCommandsDir } from "./installer.js";
4
4
  import { exists, atomicWriteFile, parseGitignoreLines, replaceSection, } from "./utils/file-system.js";
5
5
  import { isEnoent } from "./utils/errors.js";
6
- import { BMAD_DIR, RALPH_DIR, BMALPH_DIR, BMAD_OUTPUT_DIR, SKILLS_DIR, SKILLS_PREFIX, } from "./utils/constants.js";
6
+ import { BMAD_DIR, RALPH_DIR, BMALPH_DIR, BMAD_OUTPUT_DIR, GITIGNORE_ENTRIES, SKILLS_PREFIX, } from "./utils/constants.js";
7
7
  export async function buildResetPlan(projectDir, platform) {
8
8
  const plan = {
9
9
  directories: [],
@@ -40,10 +40,10 @@ export async function buildResetPlan(projectDir, platform) {
40
40
  // Check for skills to remove (skills delivery only)
41
41
  if (platform.commandDelivery.kind === "skills") {
42
42
  try {
43
- const existingDirs = await readdir(join(projectDir, SKILLS_DIR));
43
+ const existingDirs = await readdir(join(projectDir, platform.commandDelivery.dir));
44
44
  for (const dir of existingDirs) {
45
45
  if (dir.startsWith(SKILLS_PREFIX)) {
46
- plan.commandFiles.push(posix.join(SKILLS_DIR, dir));
46
+ plan.commandFiles.push(posix.join(platform.commandDelivery.dir, dir));
47
47
  }
48
48
  }
49
49
  }
@@ -74,8 +74,7 @@ export async function buildResetPlan(projectDir, platform) {
74
74
  try {
75
75
  const content = await readFile(join(projectDir, ".gitignore"), "utf-8");
76
76
  const existingLines = parseGitignoreLines(content);
77
- const bmalpEntries = [".ralph/logs/", "_bmad-output/"];
78
- for (const entry of bmalpEntries) {
77
+ for (const entry of GITIGNORE_ENTRIES) {
79
78
  if (existingLines.has(entry)) {
80
79
  plan.gitignoreLines.push(entry);
81
80
  }
@@ -5,7 +5,7 @@ import { exists } from "../utils/file-system.js";
5
5
  const RALPH_LOOP_PATH = `${RALPH_DIR}/ralph_loop.sh`;
6
6
  const BASH_RALPH_LOOP_PATH = `./${RALPH_LOOP_PATH}`;
7
7
  const BASH_VALIDATION_TIMEOUT_MS = 3000;
8
- const BASH_COMMAND_TIMEOUT_MS = 5000;
8
+ const BASH_COMMAND_TIMEOUT_MS = 15000;
9
9
  const DEFAULT_WINDOWS_GIT_BASH_PATHS = [
10
10
  "C:\\Program Files\\Git\\bin\\bash.exe",
11
11
  "C:\\Program Files\\Git\\usr\\bin\\bash.exe",
@@ -13,18 +13,33 @@ const DEFAULT_WINDOWS_GIT_BASH_PATHS = [
13
13
  "C:\\Program Files (x86)\\Git\\usr\\bin\\bash.exe",
14
14
  ];
15
15
  let cachedBashCommand;
16
+ let pendingBashCommand;
17
+ let cachedBashVersion;
18
+ let versionDetected = false;
19
+ let pendingBashVersion;
16
20
  export async function resolveBashCommand() {
17
21
  if (cachedBashCommand) {
18
22
  return cachedBashCommand;
19
23
  }
20
- const candidates = process.platform === "win32" ? getWindowsBashCandidates() : ["bash"];
21
- for (const candidate of candidates) {
22
- if (await canExecuteBash(candidate)) {
23
- cachedBashCommand = candidate;
24
- return candidate;
24
+ if (pendingBashCommand) {
25
+ return pendingBashCommand;
26
+ }
27
+ pendingBashCommand = (async () => {
28
+ const candidates = process.platform === "win32" ? getWindowsBashCandidates() : ["bash"];
29
+ for (const candidate of candidates) {
30
+ if (await canExecuteBash(candidate)) {
31
+ cachedBashCommand = candidate;
32
+ return candidate;
33
+ }
25
34
  }
35
+ throw new Error(getMissingBashMessage());
36
+ })();
37
+ try {
38
+ return await pendingBashCommand;
39
+ }
40
+ finally {
41
+ pendingBashCommand = undefined;
26
42
  }
27
- throw new Error(getMissingBashMessage());
28
43
  }
29
44
  export async function validateBashAvailable() {
30
45
  await resolveBashCommand();
@@ -59,10 +74,10 @@ export async function runBashCommand(command, options = {}) {
59
74
  }
60
75
  finish(() => reject(new Error(`bash command timed out: ${command}`)));
61
76
  }, timeoutMs);
62
- child.stdout?.on("data", (chunk) => {
77
+ child.stdout.on("data", (chunk) => {
63
78
  stdout += chunk.toString();
64
79
  });
65
- child.stderr?.on("data", (chunk) => {
80
+ child.stderr.on("data", (chunk) => {
66
81
  stderr += chunk.toString();
67
82
  });
68
83
  child.on("close", (exitCode) => finish(() => resolve({
@@ -73,6 +88,35 @@ export async function runBashCommand(command, options = {}) {
73
88
  child.on("error", (error) => finish(() => reject(new Error(`Failed to run bash command: ${error.message}`, { cause: error }))));
74
89
  });
75
90
  }
91
+ export function parseBashVersion(output) {
92
+ const match = /version (\d+\.\d+\.\d+)/.exec(output);
93
+ return match?.[1];
94
+ }
95
+ export async function detectBashVersion() {
96
+ if (versionDetected) {
97
+ return cachedBashVersion;
98
+ }
99
+ if (pendingBashVersion) {
100
+ return pendingBashVersion;
101
+ }
102
+ pendingBashVersion = (async () => {
103
+ try {
104
+ const result = await runBashCommand("bash --version");
105
+ cachedBashVersion = parseBashVersion(result.stdout);
106
+ }
107
+ catch {
108
+ cachedBashVersion = undefined;
109
+ }
110
+ versionDetected = true;
111
+ return cachedBashVersion;
112
+ })();
113
+ try {
114
+ return await pendingBashVersion;
115
+ }
116
+ finally {
117
+ pendingBashVersion = undefined;
118
+ }
119
+ }
76
120
  export async function validateRalphLoop(projectDir) {
77
121
  const loopPath = join(projectDir, RALPH_LOOP_PATH);
78
122
  if (!(await exists(loopPath))) {
@@ -80,9 +124,14 @@ export async function validateRalphLoop(projectDir) {
80
124
  }
81
125
  }
82
126
  export function spawnRalphLoop(projectDir, platformId, options) {
127
+ const env = { ...process.env, PLATFORM_DRIVER: platformId };
128
+ if (options.reviewEnabled) {
129
+ env.REVIEW_ENABLED = "true";
130
+ env.REVIEW_INTERVAL = "5";
131
+ }
83
132
  const child = spawn(cachedBashCommand ?? "bash", [BASH_RALPH_LOOP_PATH], {
84
133
  cwd: projectDir,
85
- env: { ...process.env, PLATFORM_DRIVER: platformId },
134
+ env,
86
135
  stdio: options.inheritStdio ? "inherit" : ["ignore", "pipe", "pipe"],
87
136
  detached: process.platform !== "win32",
88
137
  windowsHide: true,
@@ -1,11 +1,13 @@
1
1
  import { createRefreshCallback } from "../watch/dashboard.js";
2
2
  import { createTerminalFrameWriter } from "../watch/frame-writer.js";
3
3
  import { FileWatcher } from "../watch/file-watcher.js";
4
- export function renderStatusBar(ralph) {
4
+ import { renderFooterLine } from "../watch/renderer.js";
5
+ export function renderStatusBar(ralph, reviewEnabled) {
5
6
  const pid = ralph.child.pid ?? "?";
7
+ const badge = reviewEnabled ? " [review]" : "";
6
8
  switch (ralph.state) {
7
9
  case "running":
8
- return `Ralph: running (PID ${pid}) | q: stop/detach`;
10
+ return `Ralph: running (PID ${pid})${badge} | q: stop/detach`;
9
11
  case "stopped":
10
12
  return `Ralph: stopped (exit ${ralph.exitCode ?? "?"}) | q: quit`;
11
13
  case "detached":
@@ -16,27 +18,25 @@ export function renderQuitPrompt() {
16
18
  return "Stop (s) | Detach (d) | Cancel (c)";
17
19
  }
18
20
  export async function startRunDashboard(options) {
19
- const { projectDir, interval, ralph } = options;
21
+ const { projectDir, interval, ralph, reviewEnabled } = options;
20
22
  const frameWriter = createTerminalFrameWriter();
21
- let statusBarText = renderStatusBar(ralph);
22
23
  let showingPrompt = false;
23
24
  let stopped = false;
24
- const decorateFrame = (frame) => {
25
- const bar = showingPrompt ? renderQuitPrompt() : statusBarText;
26
- return `${frame}\n${bar}`;
25
+ const footerRenderer = (lastUpdated, cols) => {
26
+ const leftText = showingPrompt ? renderQuitPrompt() : renderStatusBar(ralph, reviewEnabled);
27
+ return renderFooterLine(leftText, `Updated: ${lastUpdated.toISOString().slice(11, 19)}`, cols);
27
28
  };
28
29
  const refresh = createRefreshCallback(projectDir, (frame) => {
29
30
  if (stopped) {
30
31
  return;
31
32
  }
32
33
  frameWriter.write(frame);
33
- }, { decorateFrame });
34
+ }, { footerRenderer });
34
35
  const watcher = new FileWatcher(refresh, interval);
35
36
  ralph.onExit(() => {
36
37
  if (stopped) {
37
38
  return;
38
39
  }
39
- statusBarText = renderStatusBar(ralph);
40
40
  void refresh();
41
41
  });
42
42
  return new Promise((resolve) => {
@@ -101,6 +101,7 @@ export async function startRunDashboard(options) {
101
101
  }
102
102
  resolve();
103
103
  };
104
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- setRawMode absent in pseudo-TTY
104
105
  if (process.stdin.isTTY && process.stdin.setRawMode) {
105
106
  process.stdin.setRawMode(true);
106
107
  process.stdin.resume();
@@ -2,9 +2,8 @@ import { readdir } from "node:fs/promises";
2
2
  import { relative } from "node:path";
3
3
  import { findArtifactsDir } from "./artifacts.js";
4
4
  import { ARTIFACT_DEFINITIONS } from "../utils/artifact-definitions.js";
5
- function getCursorNextAction() {
6
- return "Read _bmad/COMMANDS.md and ask Cursor to run the BMAD master agent for the next BMAD workflow";
7
- }
5
+ import { getPlatform } from "../platform/registry.js";
6
+ import { getPlatformAnalysisHint, getPlatformArchitectureHint, getPlatformEpicsStoriesHint, getPlatformMasterAgentHint, getPlatformPrdHint, getPlatformReadinessHint, } from "../platform/guidance.js";
8
7
  export function classifyArtifact(filename) {
9
8
  for (const rule of ARTIFACT_DEFINITIONS) {
10
9
  if (rule.pattern.test(filename)) {
@@ -44,29 +43,36 @@ export function getMissing(phases) {
44
43
  }
45
44
  export function suggestNext(phases, detectedPhase, platformId) {
46
45
  const foundNames = new Set([...phases[1], ...phases[2], ...phases[3]].map((a) => a.name));
47
- if (platformId === "cursor") {
46
+ const platform = platformId ? getPlatform(platformId) : null;
47
+ if (platform && platform.commandDelivery.kind === "index") {
48
48
  const allPlanningArtifactsPresent = foundNames.has("PRD") &&
49
49
  foundNames.has("Architecture") &&
50
50
  foundNames.has("Epics & Stories") &&
51
51
  foundNames.has("Readiness Report");
52
52
  if (!allPlanningArtifactsPresent) {
53
- return getCursorNextAction();
53
+ return getPlatformMasterAgentHint(platform);
54
54
  }
55
55
  }
56
56
  if (detectedPhase <= 1 && phases[1].length === 0) {
57
- return "Run /analyst to start analysis";
57
+ return platform ? getPlatformAnalysisHint(platform) : "Run /analyst to start analysis";
58
58
  }
59
59
  if (!foundNames.has("PRD")) {
60
- return "Run /create-prd to create the PRD";
60
+ return platform ? getPlatformPrdHint(platform) : "Run /create-prd to create the PRD";
61
61
  }
62
62
  if (!foundNames.has("Architecture")) {
63
- return "Run /architect to create architecture";
63
+ return platform
64
+ ? getPlatformArchitectureHint(platform)
65
+ : "Run /architect to create architecture";
64
66
  }
65
67
  if (!foundNames.has("Epics & Stories")) {
66
- return "Run /create-epics-stories to define epics and stories";
68
+ return platform
69
+ ? getPlatformEpicsStoriesHint(platform)
70
+ : "Run /create-epics-stories to define epics and stories";
67
71
  }
68
72
  if (!foundNames.has("Readiness Report")) {
69
- return "Run /architect to generate readiness report";
73
+ return platform
74
+ ? getPlatformReadinessHint(platform)
75
+ : "Run /architect to generate readiness report";
70
76
  }
71
77
  return "Run: bmalph implement";
72
78
  }
@@ -11,7 +11,7 @@ export function extractSectionWithInfo(content, headingPattern, maxLength = SECT
11
11
  // Determine heading level from the match
12
12
  const headingLevelMatch = match[0].match(/^(#{1,6})\s/);
13
13
  const level = headingLevelMatch ? headingLevelMatch[1].length : 2;
14
- const startIndex = (match.index ?? 0) + match[0].length;
14
+ const startIndex = match.index + match[0].length;
15
15
  const rest = content.slice(startIndex);
16
16
  // Find next heading of same or higher level
17
17
  const nextHeadingPattern = new RegExp(`^#{1,${level}}\\s`, "m");
@@ -40,8 +40,10 @@ export const BMAD_DIR = "_bmad";
40
40
  export const BMALPH_DIR = "bmalph";
41
41
  /** BMAD output directory (planning artifacts) */
42
42
  export const BMAD_OUTPUT_DIR = "_bmad-output";
43
- /** Skills directory (for skills-based command delivery) */
44
- export const SKILLS_DIR = ".agents/skills";
43
+ /** Skills directory used by the Codex platform */
44
+ export const CODEX_SKILLS_DIR = ".agents/skills";
45
+ /** Skills directory used by the OpenCode platform */
46
+ export const OPENCODE_SKILLS_DIR = ".opencode/skills";
45
47
  /** Prefix for bmalph-managed skill directories */
46
48
  export const SKILLS_PREFIX = "bmad-";
47
49
  /** bmalph state subdirectory (inside BMALPH_DIR) */
@@ -51,6 +53,28 @@ export const CONFIG_FILE = "bmalph/config.json";
51
53
  /** Ralph status file path */
52
54
  export const RALPH_STATUS_FILE = ".ralph/status.json";
53
55
  // =============================================================================
56
+ // Ralph status mapping
57
+ // =============================================================================
58
+ /**
59
+ * Maps raw Ralph bash status strings to normalized status values.
60
+ * Single source of truth — used by both validate.ts and ralph-runtime-state.ts.
61
+ */
62
+ export const RALPH_STATUS_MAP = {
63
+ running: "running",
64
+ halted: "blocked",
65
+ stopped: "blocked",
66
+ completed: "completed",
67
+ success: "completed",
68
+ graceful_exit: "completed",
69
+ paused: "blocked",
70
+ error: "blocked",
71
+ };
72
+ // =============================================================================
73
+ // Gitignore entries managed by bmalph
74
+ // =============================================================================
75
+ /** Entries bmalph adds to .gitignore during init and checks during doctor */
76
+ export const GITIGNORE_ENTRIES = [".ralph/logs/", "_bmad-output/"];
77
+ // =============================================================================
54
78
  // Dashboard constants
55
79
  // =============================================================================
56
80
  /** Default dashboard refresh interval in milliseconds */
@@ -132,9 +132,10 @@ export class GitHubClient {
132
132
  typeof data.sha !== "string" ||
133
133
  !("commit" in data) ||
134
134
  !data.commit ||
135
- typeof data.commit?.message !== "string" ||
136
- !data.commit?.author ||
137
- typeof data.commit?.author?.date !== "string") {
135
+ typeof data.commit.message !==
136
+ "string" ||
137
+ !data.commit.author ||
138
+ typeof data.commit.author.date !== "string") {
138
139
  return {
139
140
  success: false,
140
141
  error: {
@@ -1,22 +1,12 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { RALPH_DIR, RALPH_STATUS_FILE } from "./constants.js";
3
+ import { RALPH_DIR, RALPH_STATUS_FILE, RALPH_STATUS_MAP } from "./constants.js";
4
4
  import { isEnoent } from "./errors.js";
5
5
  import { validateCircuitBreakerState, validateRalphLoopStatus, validateRalphSession, } from "./validate.js";
6
6
  const RALPH_SESSION_FILE = ".ralph_session";
7
7
  const CIRCUIT_BREAKER_STATE_FILE = ".circuit_breaker_state";
8
8
  const CAMEL_CASE_CORE_KEYS = ["loopCount", "tasksCompleted", "tasksTotal"];
9
9
  const SNAKE_CASE_CORE_KEYS = ["loop_count", "tasks_completed", "tasks_total"];
10
- const RAW_RALPH_STATUS_MAP = {
11
- running: "running",
12
- halted: "blocked",
13
- stopped: "blocked",
14
- completed: "completed",
15
- success: "completed",
16
- graceful_exit: "completed",
17
- paused: "blocked",
18
- error: "blocked",
19
- };
20
10
  export async function readRalphRuntimeStatus(projectDir) {
21
11
  const path = join(projectDir, RALPH_STATUS_FILE);
22
12
  const raw = await readRuntimeJson(path);
@@ -149,9 +139,9 @@ function validateRalphSnakeCaseStatus(data) {
149
139
  if (typeof data.status !== "string") {
150
140
  throw new Error("ralphSnakeCaseStatus.status must be a string");
151
141
  }
152
- const mappedStatus = RAW_RALPH_STATUS_MAP[data.status] ?? undefined;
142
+ const mappedStatus = RALPH_STATUS_MAP[data.status];
153
143
  if (mappedStatus === undefined) {
154
- throw new Error(`ralphSnakeCaseStatus.status must be one of: ${Object.keys(RAW_RALPH_STATUS_MAP).join(", ")}`);
144
+ throw new Error(`ralphSnakeCaseStatus.status must be one of: ${Object.keys(RALPH_STATUS_MAP).join(", ")}`);
155
145
  }
156
146
  if ("tasks_completed" in data && typeof data.tasks_completed !== "number") {
157
147
  throw new Error("ralphSnakeCaseStatus.tasks_completed must be a number");
@@ -1,5 +1,5 @@
1
1
  import { PLATFORM_IDS } from "../platform/types.js";
2
- import { DEFAULT_INTERVAL_MS, MAX_PROJECT_NAME_LENGTH, MIN_INTERVAL_MS } from "./constants.js";
2
+ import { DEFAULT_INTERVAL_MS, MAX_PROJECT_NAME_LENGTH, MIN_INTERVAL_MS, RALPH_STATUS_MAP, } from "./constants.js";
3
3
  const VALID_STATUSES = ["planning", "implementing", "completed"];
4
4
  // Invalid filesystem characters (Windows + POSIX)
5
5
  const INVALID_FS_CHARS = /[<>:"/\\|?*]/;
@@ -178,21 +178,15 @@ export function validateRalphLoopStatus(data) {
178
178
  tasksTotal: data.tasksTotal,
179
179
  };
180
180
  }
181
- const BASH_STATUS_MAP = {
182
- running: "running",
183
- halted: "blocked",
184
- stopped: "blocked",
185
- completed: "completed",
186
- success: "completed",
187
- graceful_exit: "completed",
188
- };
189
181
  // Loose normalization helper for non-runtime consumers and legacy tests.
190
182
  // Runtime-file parsing uses the stricter contract in ralph-runtime-state.ts.
191
183
  export function normalizeRalphStatus(data) {
192
184
  assertObject(data, "normalizeRalphStatus");
193
185
  const loopCount = typeof data.loop_count === "number" ? data.loop_count : 0;
194
186
  const rawStatus = typeof data.status === "string" ? data.status : undefined;
195
- const status = (rawStatus !== undefined ? BASH_STATUS_MAP[rawStatus] : undefined) ?? "unknown";
187
+ const status = (rawStatus !== undefined
188
+ ? RALPH_STATUS_MAP[rawStatus]
189
+ : undefined) ?? "unknown";
196
190
  return {
197
191
  loopCount,
198
192
  status,
@@ -6,27 +6,38 @@ export function createRefreshCallback(projectDir, write, options = {}) {
6
6
  const now = options.now ?? (() => new Date());
7
7
  let lastMeaningfulUpdate;
8
8
  let lastRenderedBody;
9
+ const renderOptions = options.footerRenderer
10
+ ? { footerRenderer: options.footerRenderer }
11
+ : undefined;
9
12
  return async () => {
10
13
  const state = await readDashboardState(projectDir);
11
14
  if (lastMeaningfulUpdate === undefined) {
12
15
  lastMeaningfulUpdate = now();
13
16
  }
14
- let body = renderDashboard({
17
+ let frame = renderDashboard({
15
18
  ...state,
16
19
  lastUpdated: lastMeaningfulUpdate,
17
- });
20
+ }, undefined, renderOptions);
21
+ let body = stripFooterLine(frame);
18
22
  if (lastRenderedBody !== undefined && body !== lastRenderedBody) {
19
23
  lastMeaningfulUpdate = now();
20
- body = renderDashboard({
24
+ frame = renderDashboard({
21
25
  ...state,
22
26
  lastUpdated: lastMeaningfulUpdate,
23
- });
27
+ }, undefined, renderOptions);
28
+ body = stripFooterLine(frame);
24
29
  }
25
30
  lastRenderedBody = body;
26
- const frame = options.decorateFrame ? options.decorateFrame(body) : body;
27
31
  write(frame);
28
32
  };
29
33
  }
34
+ function stripFooterLine(frame) {
35
+ const footerIndex = frame.lastIndexOf("\n");
36
+ if (footerIndex === -1) {
37
+ return frame;
38
+ }
39
+ return frame.slice(0, footerIndex);
40
+ }
30
41
  export async function startDashboard(options) {
31
42
  const { projectDir, interval } = options;
32
43
  const frameWriter = createTerminalFrameWriter();
@@ -61,6 +72,7 @@ export async function startDashboard(options) {
61
72
  }
62
73
  resolve();
63
74
  };
75
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- setRawMode absent in pseudo-TTY
64
76
  if (process.stdin.isTTY && process.stdin.setRawMode) {
65
77
  process.stdin.setRawMode(true);
66
78
  process.stdin.resume();
@@ -311,6 +311,23 @@ export function renderAnalysisPanel(analysis, cols) {
311
311
  ];
312
312
  return box("Last Analysis", lines, cols);
313
313
  }
314
+ export function renderReviewPanel(review, cols) {
315
+ if (!review) {
316
+ return "";
317
+ }
318
+ const safeSeverity = sanitizeExternalText(review.severity);
319
+ const severityColor = safeSeverity === "CRITICAL" || safeSeverity === "HIGH"
320
+ ? chalk.red
321
+ : safeSeverity === "MEDIUM"
322
+ ? chalk.yellow
323
+ : chalk.green;
324
+ const safeSummary = sanitizeExternalText(review.summary);
325
+ const lines = [
326
+ `Severity: ${severityColor(safeSeverity)} Issues: ${String(review.issuesFound)}`,
327
+ safeSummary ? chalk.dim(safeSummary.slice(0, 70)) : "",
328
+ ].filter(Boolean);
329
+ return box("Review Findings", lines, cols);
330
+ }
314
331
  export function renderLogsPanel(logs, cols) {
315
332
  if (logs.length === 0) {
316
333
  return box("Recent Activity", [chalk.dim("No activity yet")], cols);
@@ -339,9 +356,7 @@ export function renderLiveLogPanel(liveLog, cols) {
339
356
  });
340
357
  return box("Live Output", lines, cols);
341
358
  }
342
- export function renderFooter(lastUpdated, cols) {
343
- const leftText = "q quit";
344
- const rightText = `Updated: ${formatTime(lastUpdated)}`;
359
+ export function renderFooterLine(leftText, rightText, cols) {
345
360
  const availableWidth = Math.max(0, cols - 1);
346
361
  const minimumWidth = displayWidth(leftText) + 1 + displayWidth(rightText);
347
362
  if (availableWidth < minimumWidth) {
@@ -350,6 +365,9 @@ export function renderFooter(lastUpdated, cols) {
350
365
  const gap = availableWidth - displayWidth(leftText) - displayWidth(rightText);
351
366
  return ` ${chalk.dim(leftText)}${" ".repeat(gap)}${chalk.dim(rightText)}`;
352
367
  }
368
+ export function renderFooter(lastUpdated, cols) {
369
+ return renderFooterLine("q quit", `Updated: ${formatTime(lastUpdated)}`, cols);
370
+ }
353
371
  function hasAnyData(state) {
354
372
  return (state.loop !== null ||
355
373
  state.circuitBreaker !== null ||
@@ -357,19 +375,22 @@ function hasAnyData(state) {
357
375
  state.analysis !== null ||
358
376
  state.execution !== null ||
359
377
  state.session !== null ||
378
+ state.review !== null ||
360
379
  state.recentLogs.length > 0 ||
361
380
  state.liveLog.length > 0);
362
381
  }
363
- export function renderDashboard(state, cols) {
382
+ export function renderDashboard(state, cols, options = {}) {
383
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- columns is undefined in non-TTY
364
384
  const width = cols ?? process.stdout.columns ?? 80;
365
385
  const referenceTime = state.lastUpdated.getTime();
386
+ const footerRenderer = options.footerRenderer ?? renderFooter;
366
387
  if (!hasAnyData(state)) {
367
388
  const lines = [];
368
389
  lines.push(renderHeader(width));
369
390
  lines.push("");
370
391
  lines.push(chalk.dim(padRight(" Waiting for Ralph to start...", width)));
371
392
  lines.push("");
372
- lines.push(renderFooter(state.lastUpdated, width));
393
+ lines.push(footerRenderer(state.lastUpdated, width));
373
394
  return lines.join("\n");
374
395
  }
375
396
  const sections = [];
@@ -379,11 +400,15 @@ export function renderDashboard(state, cols) {
379
400
  const rightPanel = renderStoriesPanel(state.stories, width);
380
401
  sections.push(renderSideBySide(leftPanel, rightPanel, width));
381
402
  sections.push(renderAnalysisPanel(state.analysis, width));
403
+ const reviewPanel = renderReviewPanel(state.review, width);
404
+ if (reviewPanel) {
405
+ sections.push(reviewPanel);
406
+ }
382
407
  if (state.execution !== null) {
383
408
  sections.push(renderLiveLogPanel(state.liveLog, width));
384
409
  }
385
410
  sections.push(renderLogsPanel(state.recentLogs, width));
386
- sections.push(renderFooter(state.lastUpdated, width));
411
+ sections.push(footerRenderer(state.lastUpdated, width));
387
412
  return sections
388
413
  .join("\n")
389
414
  .split("\n")
@@ -10,13 +10,14 @@ const LOG_LINE_PATTERN = /^\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\] \[(\w+)\] (
10
10
  const DEFAULT_MAX_LOG_LINES = 8;
11
11
  const TAIL_BYTES = 4096;
12
12
  export async function readDashboardState(projectDir) {
13
- const [loop, circuitBreaker, stories, analysis, execution, session, recentLogs, liveLog] = await Promise.all([
13
+ const [loop, circuitBreaker, stories, analysis, execution, session, review, recentLogs, liveLog] = await Promise.all([
14
14
  readLoopInfo(projectDir),
15
15
  readCircuitBreakerInfo(projectDir),
16
16
  readStoryProgress(projectDir),
17
17
  readAnalysisInfo(projectDir),
18
18
  readExecutionProgress(projectDir),
19
19
  readSessionInfo(projectDir),
20
+ readReviewInfo(projectDir),
20
21
  readRecentLogs(projectDir),
21
22
  readLiveLog(projectDir),
22
23
  ]);
@@ -28,6 +29,7 @@ export async function readDashboardState(projectDir) {
28
29
  analysis,
29
30
  execution,
30
31
  session,
32
+ review,
31
33
  recentLogs,
32
34
  liveLog,
33
35
  ralphCompleted,
@@ -157,6 +159,23 @@ export async function readSessionInfo(projectDir) {
157
159
  lastUsed: result.value.last_used,
158
160
  };
159
161
  }
162
+ export async function readReviewInfo(projectDir) {
163
+ try {
164
+ const data = await readJsonFile(join(projectDir, RALPH_DIR, ".review_findings.json"));
165
+ if (data === null)
166
+ return null;
167
+ const issuesFound = typeof data.issues_found === "number" ? data.issues_found : 0;
168
+ if (issuesFound === 0)
169
+ return null;
170
+ const severity = typeof data.severity === "string" ? data.severity : "LOW";
171
+ const summary = typeof data.summary === "string" ? data.summary : "";
172
+ return { issuesFound, severity, summary };
173
+ }
174
+ catch (err) {
175
+ debug(`Failed to read review info: ${formatError(err)}`);
176
+ return null;
177
+ }
178
+ }
160
179
  const LIVE_LOG_MAX_LINES = 5;
161
180
  const LIVE_LOG_TAIL_BYTES = 2048;
162
181
  export async function readLiveLog(projectDir) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmalph",
3
- "version": "2.7.7",
3
+ "version": "2.9.0",
4
4
  "description": "Unified AI Development Framework - BMAD phases with Ralph execution loop",
5
5
  "type": "module",
6
6
  "bin": {
@@ -22,6 +22,9 @@
22
22
  "fmt:fix": "prettier --write .",
23
23
  "type-check": "tsc --noEmit",
24
24
  "ci": "npm run type-check && npm run lint && npm run fmt:check && npm run build && npm run test:all",
25
+ "clean": "rm -rf dist",
26
+ "rebuild": "npm run clean && npm run build",
27
+ "prepack": "npm run build",
25
28
  "prepublishOnly": "npm run lint && npm run build && npm run test:all",
26
29
  "update-bundled": "bash scripts/update-bundled.sh"
27
30
  },
@@ -55,13 +58,16 @@
55
58
  "files": [
56
59
  "bin/",
57
60
  "dist/",
61
+ "!dist/**/*.map",
58
62
  "bmad/",
59
63
  "ralph/",
60
64
  "slash-commands/",
61
65
  "bundled-versions.json"
62
66
  ],
63
67
  "dependencies": {
64
- "@inquirer/prompts": "^8.3.0",
68
+ "@inquirer/confirm": "^5.1.9",
69
+ "@inquirer/input": "^4.1.9",
70
+ "@inquirer/select": "^4.2.0",
65
71
  "chalk": "^5.6.2",
66
72
  "commander": "^14.0.2"
67
73
  },