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.
- package/README.md +51 -28
- package/bmad/bmm/agents/analyst.agent.yaml +6 -6
- package/bmad/bmm/agents/architect.agent.yaml +2 -2
- package/bmad/bmm/agents/bmad-skill-manifest.yaml +39 -0
- package/bmad/bmm/agents/dev.agent.yaml +2 -2
- package/bmad/bmm/agents/pm.agent.yaml +6 -6
- package/bmad/bmm/agents/qa.agent.yaml +1 -1
- package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +7 -3
- package/bmad/bmm/agents/sm.agent.yaml +4 -4
- package/bmad/bmm/agents/tech-writer/bmad-skill-manifest.yaml +3 -0
- package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +1 -1
- package/bmad/bmm/agents/ux-designer.agent.yaml +1 -1
- package/bmad/bmm/module-help.csv +26 -25
- package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/SKILL.md +6 -0
- package/bmad/bmm/workflows/1-analysis/bmad-create-product-brief/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/product-brief.template.md +2 -2
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01-init.md +4 -11
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-01b-continue.md +0 -3
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-02-vision.md +5 -11
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-03-users.md +5 -11
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-04-metrics.md +5 -11
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-05-scope.md +5 -11
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/steps/step-06-complete.md +1 -4
- package/bmad/bmm/workflows/1-analysis/{create-product-brief → bmad-create-product-brief}/workflow.md +4 -6
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/SKILL.md +88 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/artifact-analyzer.md +60 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/opportunity-reviewer.md +44 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/skeptic-reviewer.md +44 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/agents/web-researcher.md +49 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-manifest.json +17 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/contextual-discovery.md +57 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/draft-and-review.md +86 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/finalize.md +75 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/prompts/guided-elicitation.md +70 -0
- package/bmad/bmm/workflows/1-analysis/bmad-product-brief-preview/resources/brief-template.md +60 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/SKILL.md +6 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-06-research-synthesis.md +2 -1
- package/bmad/bmm/workflows/1-analysis/research/bmad-domain-research/research.template.md +29 -0
- package/bmad/bmm/workflows/1-analysis/research/{workflow-domain-research.md → bmad-domain-research/workflow.md} +0 -5
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/SKILL.md +6 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/research.template.md +29 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-01-init.md +184 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +478 -0
- package/bmad/bmm/workflows/1-analysis/research/{workflow-market-research.md → bmad-market-research/workflow.md} +1 -6
- package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/SKILL.md +6 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/1-analysis/research/bmad-technical-research/research.template.md +29 -0
- package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-06-research-synthesis.md +2 -1
- package/bmad/bmm/workflows/1-analysis/research/{workflow-technical-research.md → bmad-technical-research/workflow.md} +0 -4
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +2 -2
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +2 -2
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +2 -2
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +2 -2
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +2 -1
- package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/SKILL.md +6 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-create-ux-design/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01-init.md +2 -2
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-01b-continue.md +1 -1
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-02-discovery.md +2 -2
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-03-core-experience.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-04-emotional-response.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-05-inspiration.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-06-design-system.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-07-defining-experience.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-08-visual-foundation.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-09-design-directions.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-10-user-journeys.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-11-component-strategy.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-12-ux-patterns.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-13-responsive-accessibility.md +5 -4
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/steps/step-14-complete.md +3 -3
- package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/workflow.md +2 -8
- package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/SKILL.md +6 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-edit-prd/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01-discovery.md +3 -8
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-01b-legacy-conversion.md +1 -5
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-02-review.md +5 -9
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-03-edit.md +3 -6
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd → bmad-edit-prd}/steps-e/step-e-04-complete.md +2 -5
- package/bmad/bmm/workflows/2-plan-workflows/{create-prd/workflow-edit-prd.md → bmad-edit-prd/workflow.md} +2 -4
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/SKILL.md +6 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/domain-complexity.csv +15 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/prd-purpose.md +197 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/data/project-types.csv +11 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
- package/bmad/bmm/workflows/2-plan-workflows/bmad-validate-prd/workflow.md +62 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +2 -4
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +1 -1
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +3 -3
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +3 -2
- package/bmad/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +3 -1
- package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/SKILL.md +6 -0
- package/bmad/bmm/workflows/3-solutioning/bmad-check-implementation-readiness/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-01-document-discovery.md +3 -8
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-02-prd-analysis.md +1 -5
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-03-epic-coverage-validation.md +1 -5
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-04-ux-alignment.md +1 -5
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-05-epic-quality-review.md +2 -6
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/steps/step-06-final-assessment.md +1 -4
- package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/workflow.md +1 -6
- package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/SKILL.md +6 -0
- package/bmad/bmm/workflows/3-solutioning/bmad-create-architecture/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01-init.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-01b-continue.md +11 -2
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-02-context.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-03-starter.md +5 -7
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-04-decisions.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-05-patterns.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-06-structure.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-07-validation.md +4 -4
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/steps/step-08-complete.md +1 -1
- package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/workflow.md +1 -12
- package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/SKILL.md +6 -0
- package/bmad/bmm/workflows/3-solutioning/bmad-create-epics-and-stories/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-01-validate-prerequisites.md +37 -41
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-02-design-epics.md +7 -28
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-03-create-stories.md +13 -30
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/steps/step-04-final-validation.md +3 -21
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/templates/epics-template.md +4 -0
- package/bmad/bmm/workflows/3-solutioning/{create-epics-and-stories → bmad-create-epics-and-stories}/workflow.md +1 -6
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-01-gather-context.md +61 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-02-review.md +41 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-03-triage.md +50 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/steps/step-04-present.md +38 -0
- package/bmad/bmm/workflows/4-implementation/bmad-code-review/workflow.md +54 -0
- package/bmad/bmm/workflows/4-implementation/bmad-correct-course/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-correct-course/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{correct-course → bmad-correct-course}/checklist.md +1 -1
- package/bmad/bmm/workflows/4-implementation/{correct-course/instructions.md → bmad-correct-course/workflow.md} +74 -14
- package/bmad/bmm/workflows/4-implementation/bmad-create-story/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-create-story/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/checklist.md +9 -10
- package/bmad/bmm/workflows/4-implementation/bmad-create-story/discover-inputs.md +88 -0
- package/bmad/bmm/workflows/4-implementation/bmad-create-story/workflow.md +380 -0
- package/bmad/bmm/workflows/4-implementation/bmad-dev-story/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-dev-story/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{dev-story/instructions.xml → bmad-dev-story/workflow.md} +42 -2
- package/bmad/bmm/workflows/4-implementation/bmad-retrospective/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-retrospective/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{retrospective/instructions.md → bmad-retrospective/workflow.md} +58 -23
- package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-sprint-planning/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/sprint-status-template.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{sprint-planning/instructions.md → bmad-sprint-planning/workflow.md} +47 -10
- package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/SKILL.md +6 -0
- package/bmad/bmm/workflows/4-implementation/bmad-sprint-status/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/4-implementation/{sprint-status/instructions.md → bmad-sprint-status/workflow.md} +39 -8
- package/bmad/bmm/workflows/bmad-document-project/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-document-project/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/{document-project → bmad-document-project}/instructions.md +6 -8
- package/bmad/bmm/workflows/bmad-document-project/workflow.md +27 -0
- package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/deep-dive-instructions.md +3 -2
- package/bmad/bmm/workflows/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
- package/bmad/bmm/workflows/{document-project → bmad-document-project}/workflows/full-scan-instructions.md +5 -4
- package/bmad/bmm/workflows/bmad-document-project/workflows/full-scan-workflow.md +34 -0
- package/bmad/bmm/workflows/bmad-generate-project-context/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-generate-project-context/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-01-discover.md +3 -1
- package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-02-generate.md +7 -4
- package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/workflow.md +2 -8
- package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-qa-generate-e2e-tests/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/{qa/automate/instructions.md → bmad-qa-generate-e2e-tests/workflow.md} +33 -7
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-01-mode-detection.md +9 -14
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-02-context-gathering.md +1 -5
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-03-execute.md +1 -5
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-04-self-check.md +1 -5
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-05-adversarial-review.md +8 -18
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/steps/step-06-resolve-findings.md +0 -2
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-dev → bmad-quick-dev}/workflow.md +1 -13
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-02-plan.md +35 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-03-implement.md +33 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-04-review.md +50 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/steps/step-05-present.md +17 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/tech-spec-template.md +90 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-dev-new-preview/workflow.md +79 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/SKILL.md +6 -0
- package/bmad/bmm/workflows/bmad-quick-flow/bmad-quick-spec/bmad-skill-manifest.yaml +1 -0
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-01-understand.md +7 -13
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-02-investigate.md +3 -7
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-03-generate.md +1 -5
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/steps/step-04-review.md +9 -14
- package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/workflow.md +1 -7
- package/bmad/core/module-help.csv +10 -8
- package/bmad/core/module.yaml +1 -1
- package/bmad/core/skills/bmad-advanced-elicitation/SKILL.md +6 -0
- package/bmad/core/skills/bmad-advanced-elicitation/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-advanced-elicitation/workflow.md +135 -0
- package/bmad/core/skills/bmad-brainstorming/SKILL.md +6 -0
- package/bmad/core/skills/bmad-brainstorming/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01-session-setup.md +35 -18
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-01b-continue.md +4 -2
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02a-user-selected.md +5 -1
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02b-ai-recommended.md +3 -1
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02c-random-selection.md +3 -1
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-02d-progressive-flow.md +3 -1
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-03-technique-execution.md +6 -4
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/steps/step-04-idea-organization.md +4 -2
- package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/workflow.md +4 -9
- package/bmad/core/skills/bmad-distillator/SKILL.md +178 -0
- package/bmad/core/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
- package/bmad/core/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
- package/bmad/core/skills/bmad-distillator/bmad-skill-manifest.yaml +15 -0
- package/bmad/core/skills/bmad-distillator/resources/compression-rules.md +51 -0
- package/bmad/core/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
- package/bmad/core/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
- package/bmad/core/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
- package/bmad/core/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
- package/bmad/core/skills/bmad-editorial-review-prose/SKILL.md +6 -0
- package/bmad/core/skills/bmad-editorial-review-prose/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-editorial-review-prose/workflow.md +81 -0
- package/bmad/core/skills/bmad-editorial-review-structure/SKILL.md +6 -0
- package/bmad/core/skills/bmad-editorial-review-structure/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-editorial-review-structure/workflow.md +174 -0
- package/bmad/core/skills/bmad-help/SKILL.md +6 -0
- package/bmad/core/skills/bmad-help/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/{tasks/help.md → skills/bmad-help/workflow.md} +11 -8
- package/bmad/core/skills/bmad-index-docs/SKILL.md +6 -0
- package/bmad/core/skills/bmad-index-docs/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-index-docs/workflow.md +61 -0
- package/bmad/core/skills/bmad-party-mode/SKILL.md +6 -0
- package/bmad/core/skills/bmad-party-mode/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-03-graceful-exit.md +0 -1
- package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/workflow.md +0 -4
- package/bmad/core/skills/bmad-review-adversarial-general/SKILL.md +6 -0
- package/bmad/core/skills/bmad-review-adversarial-general/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-review-adversarial-general/workflow.md +32 -0
- package/bmad/core/skills/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/bmad/core/skills/bmad-review-edge-case-hunter/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-review-edge-case-hunter/workflow.md +62 -0
- package/bmad/core/skills/bmad-shard-doc/SKILL.md +6 -0
- package/bmad/core/skills/bmad-shard-doc/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/skills/bmad-shard-doc/workflow.md +100 -0
- package/bmad/core/tasks/bmad-create-prd/SKILL.md +6 -0
- package/bmad/core/tasks/bmad-create-prd/bmad-skill-manifest.yaml +1 -0
- package/bmad/core/tasks/bmad-create-prd/data/domain-complexity.csv +15 -0
- package/bmad/core/tasks/bmad-create-prd/data/prd-purpose.md +197 -0
- package/bmad/core/tasks/bmad-create-prd/data/project-types.csv +11 -0
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01-init.md +7 -20
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-01b-continue.md +29 -21
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02-discovery.md +7 -23
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02b-vision.md +5 -17
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-02c-executive-summary.md +5 -17
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-03-success.md +4 -16
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-04-journeys.md +4 -16
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-05-domain.md +7 -20
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-06-innovation.md +8 -23
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-07-project-type.md +6 -21
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-08-scoping.md +5 -17
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-09-functional.md +5 -17
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-10-nonfunctional.md +5 -17
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-11-polish.md +22 -18
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd → core/tasks/bmad-create-prd}/steps-c/step-12-complete.md +4 -13
- package/bmad/{bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md → core/tasks/bmad-create-prd/workflow.md} +3 -4
- package/bundled-versions.json +1 -1
- package/dist/cli.js +3 -2
- package/dist/commands/doctor-checks.js +15 -6
- package/dist/commands/doctor-health-checks.js +2 -1
- package/dist/commands/doctor.js +13 -4
- package/dist/commands/init.js +15 -3
- package/dist/commands/reset.js +1 -1
- package/dist/commands/run.js +36 -1
- package/dist/commands/status.js +3 -11
- package/dist/commands/upgrade.js +1 -1
- package/dist/installer/commands.js +33 -15
- package/dist/installer/install.js +1 -1
- package/dist/installer/metadata.js +1 -1
- package/dist/installer/project-files.js +5 -6
- package/dist/installer/ralph-assets.js +8 -0
- package/dist/installer/template-files.js +85 -13
- package/dist/platform/codex.js +6 -1
- package/dist/platform/detect.js +7 -3
- package/dist/platform/doctor-checks.js +2 -2
- package/dist/platform/guidance.js +66 -0
- package/dist/platform/instructions-snippet.js +15 -0
- package/dist/platform/opencode.js +20 -0
- package/dist/platform/registry.js +2 -0
- package/dist/platform/types.js +1 -0
- package/dist/reset.js +4 -5
- package/dist/run/ralph-process.js +59 -10
- package/dist/run/run-dashboard.js +10 -9
- package/dist/transition/artifact-scan.js +16 -10
- package/dist/transition/context.js +1 -1
- package/dist/utils/constants.js +26 -2
- package/dist/utils/github.js +4 -3
- package/dist/utils/ralph-runtime-state.js +3 -13
- package/dist/utils/validate.js +4 -10
- package/dist/watch/dashboard.js +17 -5
- package/dist/watch/renderer.js +31 -6
- package/dist/watch/state-reader.js +20 -1
- package/package.json +8 -2
- package/ralph/drivers/opencode.sh +147 -0
- package/ralph/lib/response_analyzer.sh +227 -78
- package/ralph/lib/wizard_utils.sh +4 -4
- package/ralph/ralph_loop.sh +508 -4
- package/ralph/templates/PROMPT.md +12 -0
- package/ralph/templates/REVIEW_PROMPT.md +60 -0
- package/ralph/templates/ralphrc.template +41 -2
- package/slash-commands/advanced-elicitation.md +1 -1
- package/slash-commands/adversarial-review.md +1 -1
- package/slash-commands/bmad-help.md +1 -1
- package/slash-commands/bmalph.md +1 -1
- package/slash-commands/brainstorm-project.md +1 -1
- package/slash-commands/brainstorming.md +1 -1
- package/slash-commands/correct-course.md +1 -1
- package/slash-commands/create-architecture.md +1 -1
- package/slash-commands/create-brief.md +1 -1
- package/slash-commands/create-epics-stories.md +1 -1
- package/slash-commands/create-prd.md +1 -1
- package/slash-commands/create-story.md +1 -1
- package/slash-commands/create-ux.md +1 -1
- package/slash-commands/distillator.md +1 -0
- package/slash-commands/document-project.md +1 -1
- package/slash-commands/domain-research.md +1 -1
- package/slash-commands/edge-case-hunter.md +1 -0
- package/slash-commands/edit-prd.md +1 -0
- package/slash-commands/editorial-prose.md +1 -1
- package/slash-commands/editorial-structure.md +1 -1
- package/slash-commands/generate-project-context.md +1 -1
- package/slash-commands/implementation-readiness.md +1 -1
- package/slash-commands/index-docs.md +1 -1
- package/slash-commands/market-research.md +1 -1
- package/slash-commands/party-mode.md +1 -1
- package/slash-commands/qa-automate.md +1 -1
- package/slash-commands/quick-dev-new.md +1 -0
- package/slash-commands/quick-dev.md +1 -1
- package/slash-commands/retrospective.md +1 -1
- package/slash-commands/shard-doc.md +1 -1
- package/slash-commands/sprint-planning.md +1 -1
- package/slash-commands/sprint-status.md +1 -1
- package/slash-commands/tech-spec.md +1 -1
- package/slash-commands/technical-research.md +1 -1
- package/slash-commands/validate-architecture.md +1 -1
- package/slash-commands/validate-brief.md +1 -1
- package/slash-commands/validate-epics-stories.md +1 -1
- package/slash-commands/validate-prd.md +1 -1
- package/slash-commands/validate-story.md +1 -1
- package/slash-commands/validate-ux.md +1 -1
- package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +0 -23
- package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +0 -227
- package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -44
- package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -54
- package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +0 -346
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -53
- package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -21
- package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -53
- package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -47
- package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +0 -25
- package/bmad/bmm/workflows/document-project/workflow.yaml +0 -22
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
- package/bmad/bmm/workflows/qa/automate/workflow.yaml +0 -44
- package/bmad/core/agents/bmad-master.agent.yaml +0 -30
- package/bmad/core/tasks/editorial-review-prose.xml +0 -102
- package/bmad/core/tasks/editorial-review-structure.xml +0 -209
- package/bmad/core/tasks/index-docs.xml +0 -65
- package/bmad/core/tasks/review-adversarial-general.xml +0 -48
- package/bmad/core/tasks/shard-doc.xml +0 -108
- package/bmad/core/tasks/workflow.xml +0 -235
- package/bmad/core/workflows/advanced-elicitation/workflow.xml +0 -117
- package/dist/cli.js.map +0 -1
- package/dist/commands/check-updates.js.map +0 -1
- package/dist/commands/doctor-checks.js.map +0 -1
- package/dist/commands/doctor-health-checks.js.map +0 -1
- package/dist/commands/doctor-runtime-checks.js.map +0 -1
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/implement.js.map +0 -1
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/reset.js.map +0 -1
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/upgrade.js.map +0 -1
- package/dist/commands/watch.js.map +0 -1
- package/dist/installer/bmad-assets.js.map +0 -1
- package/dist/installer/commands.js.map +0 -1
- package/dist/installer/install.js.map +0 -1
- package/dist/installer/metadata.js.map +0 -1
- package/dist/installer/project-files.js.map +0 -1
- package/dist/installer/ralph-assets.js.map +0 -1
- package/dist/installer/template-files.js.map +0 -1
- package/dist/installer/types.js.map +0 -1
- package/dist/installer.js.map +0 -1
- package/dist/platform/aider.js.map +0 -1
- package/dist/platform/claude-code.js.map +0 -1
- package/dist/platform/codex.js.map +0 -1
- package/dist/platform/copilot.js.map +0 -1
- package/dist/platform/cursor-runtime-checks.js.map +0 -1
- package/dist/platform/cursor.js.map +0 -1
- package/dist/platform/detect.js.map +0 -1
- package/dist/platform/doctor-checks.js.map +0 -1
- package/dist/platform/instructions-snippet.js.map +0 -1
- package/dist/platform/registry.js.map +0 -1
- package/dist/platform/resolve.js.map +0 -1
- package/dist/platform/types.js.map +0 -1
- package/dist/platform/windsurf.js.map +0 -1
- package/dist/reset.js.map +0 -1
- package/dist/run/ralph-process.js.map +0 -1
- package/dist/run/run-dashboard.js.map +0 -1
- package/dist/run/types.js.map +0 -1
- package/dist/transition/artifact-collection.js.map +0 -1
- package/dist/transition/artifact-loading.js.map +0 -1
- package/dist/transition/artifact-scan.js.map +0 -1
- package/dist/transition/artifacts.js.map +0 -1
- package/dist/transition/context-output.js.map +0 -1
- package/dist/transition/context.js.map +0 -1
- package/dist/transition/fix-plan-sync.js.map +0 -1
- package/dist/transition/fix-plan.js.map +0 -1
- package/dist/transition/index.js.map +0 -1
- package/dist/transition/orchestration.js.map +0 -1
- package/dist/transition/preflight.js.map +0 -1
- package/dist/transition/section-patterns.js.map +0 -1
- package/dist/transition/specs-changelog.js.map +0 -1
- package/dist/transition/specs-index.js.map +0 -1
- package/dist/transition/specs-sync.js.map +0 -1
- package/dist/transition/sprint-status.js.map +0 -1
- package/dist/transition/story-id.js.map +0 -1
- package/dist/transition/story-parsing.js.map +0 -1
- package/dist/transition/tech-stack.js.map +0 -1
- package/dist/transition/types.js.map +0 -1
- package/dist/utils/artifact-definitions.js.map +0 -1
- package/dist/utils/config.js.map +0 -1
- package/dist/utils/constants.js.map +0 -1
- package/dist/utils/dryrun.js.map +0 -1
- package/dist/utils/errors.js.map +0 -1
- package/dist/utils/file-system.js.map +0 -1
- package/dist/utils/format-status.js.map +0 -1
- package/dist/utils/github.js.map +0 -1
- package/dist/utils/json.js.map +0 -1
- package/dist/utils/logger.js.map +0 -1
- package/dist/utils/ralph-runtime-state.js.map +0 -1
- package/dist/utils/state.js.map +0 -1
- package/dist/utils/validate.js.map +0 -1
- package/dist/watch/dashboard.js.map +0 -1
- package/dist/watch/file-watcher.js.map +0 -1
- package/dist/watch/frame-writer.js.map +0 -1
- package/dist/watch/renderer.js.map +0 -1
- package/dist/watch/state-reader.js.map +0 -1
- package/dist/watch/types.js.map +0 -1
- package/slash-commands/execute-workflow.md +0 -1
- /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-01-init.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-02-domain-analysis.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-03-competitive-landscape.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-04-regulatory-focus.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{domain-steps → bmad-domain-research/domain-steps}/step-05-technical-trends.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-01-init.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-02-technical-overview.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-03-integration-patterns.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-04-architectural-patterns.md +0 -0
- /package/bmad/bmm/workflows/1-analysis/research/{technical-steps → bmad-technical-research/technical-steps}/step-05-implementation-research.md +0 -0
- /package/bmad/bmm/workflows/2-plan-workflows/{create-ux-design → bmad-create-ux-design}/ux-design-template.md +0 -0
- /package/bmad/bmm/workflows/3-solutioning/{check-implementation-readiness → bmad-check-implementation-readiness}/templates/readiness-report-template.md +0 -0
- /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/architecture-decision-template.md +0 -0
- /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/domain-complexity.csv +0 -0
- /package/bmad/bmm/workflows/3-solutioning/{create-architecture → bmad-create-architecture}/data/project-types.csv +0 -0
- /package/bmad/bmm/workflows/4-implementation/{create-story → bmad-create-story}/template.md +0 -0
- /package/bmad/bmm/workflows/4-implementation/{dev-story → bmad-dev-story}/checklist.md +0 -0
- /package/bmad/bmm/workflows/4-implementation/{sprint-planning → bmad-sprint-planning}/checklist.md +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/checklist.md +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/documentation-requirements.csv +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/deep-dive-template.md +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/index-template.md +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-overview-template.md +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/project-scan-report-schema.json +0 -0
- /package/bmad/bmm/workflows/{document-project → bmad-document-project}/templates/source-tree-template.md +0 -0
- /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/project-context-template.md +0 -0
- /package/bmad/bmm/workflows/{generate-project-context → bmad-generate-project-context}/steps/step-03-complete.md +0 -0
- /package/bmad/bmm/workflows/{qa/automate → bmad-qa-generate-e2e-tests}/checklist.md +0 -0
- /package/bmad/bmm/workflows/bmad-quick-flow/{quick-spec → bmad-quick-spec}/tech-spec-template.md +0 -0
- /package/bmad/core/{workflows/advanced-elicitation → skills/bmad-advanced-elicitation}/methods.csv +0 -0
- /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/brain-methods.csv +0 -0
- /package/bmad/core/{workflows/brainstorming → skills/bmad-brainstorming}/template.md +0 -0
- /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-01-agent-loading.md +0 -0
- /package/bmad/core/{workflows/party-mode → skills/bmad-party-mode}/steps/step-02-discussion-orchestration.md +0 -0
- /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],
|
package/dist/platform/types.js
CHANGED
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,
|
|
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,
|
|
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(
|
|
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
|
|
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 =
|
|
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
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
|
77
|
+
child.stdout.on("data", (chunk) => {
|
|
63
78
|
stdout += chunk.toString();
|
|
64
79
|
});
|
|
65
|
-
child.stderr
|
|
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
|
|
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
|
-
|
|
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
|
|
25
|
-
const
|
|
26
|
-
return
|
|
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
|
-
}, {
|
|
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
|
-
|
|
6
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
63
|
+
return platform
|
|
64
|
+
? getPlatformArchitectureHint(platform)
|
|
65
|
+
: "Run /architect to create architecture";
|
|
64
66
|
}
|
|
65
67
|
if (!foundNames.has("Epics & Stories")) {
|
|
66
|
-
return
|
|
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
|
|
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 =
|
|
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");
|
package/dist/utils/constants.js
CHANGED
|
@@ -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
|
|
44
|
-
export const
|
|
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 */
|
package/dist/utils/github.js
CHANGED
|
@@ -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
|
|
136
|
-
|
|
137
|
-
|
|
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 =
|
|
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(
|
|
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");
|
package/dist/utils/validate.js
CHANGED
|
@@ -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
|
|
187
|
+
const status = (rawStatus !== undefined
|
|
188
|
+
? RALPH_STATUS_MAP[rawStatus]
|
|
189
|
+
: undefined) ?? "unknown";
|
|
196
190
|
return {
|
|
197
191
|
loopCount,
|
|
198
192
|
status,
|
package/dist/watch/dashboard.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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();
|
package/dist/watch/renderer.js
CHANGED
|
@@ -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
|
|
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(
|
|
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(
|
|
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.
|
|
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/
|
|
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
|
},
|