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
package/ralph/ralph_loop.sh
CHANGED
|
@@ -33,6 +33,7 @@ LIVE_LOG_FILE="$RALPH_DIR/live.log" # Fixed file for live output monitoring
|
|
|
33
33
|
CALL_COUNT_FILE="$RALPH_DIR/.call_count"
|
|
34
34
|
TIMESTAMP_FILE="$RALPH_DIR/.last_reset"
|
|
35
35
|
USE_TMUX=false
|
|
36
|
+
PENDING_EXIT_REASON=""
|
|
36
37
|
|
|
37
38
|
# Save environment variable state BEFORE setting defaults
|
|
38
39
|
# These are used by load_ralphrc() to determine which values came from environment
|
|
@@ -68,6 +69,13 @@ _cli_CLAUDE_SESSION_EXPIRY_HOURS="${CLAUDE_SESSION_EXPIRY_HOURS:-}"
|
|
|
68
69
|
_cli_VERBOSE_PROGRESS="${VERBOSE_PROGRESS:-}"
|
|
69
70
|
_env_CB_COOLDOWN_MINUTES="${CB_COOLDOWN_MINUTES:-}"
|
|
70
71
|
_env_CB_AUTO_RESET="${CB_AUTO_RESET:-}"
|
|
72
|
+
_env_TEST_COMMAND="${TEST_COMMAND:-}"
|
|
73
|
+
_env_QUALITY_GATES="${QUALITY_GATES:-}"
|
|
74
|
+
_env_QUALITY_GATE_MODE="${QUALITY_GATE_MODE:-}"
|
|
75
|
+
_env_QUALITY_GATE_TIMEOUT="${QUALITY_GATE_TIMEOUT:-}"
|
|
76
|
+
_env_QUALITY_GATE_ON_COMPLETION_ONLY="${QUALITY_GATE_ON_COMPLETION_ONLY:-}"
|
|
77
|
+
_env_REVIEW_ENABLED="${REVIEW_ENABLED:-}"
|
|
78
|
+
_env_REVIEW_INTERVAL="${REVIEW_INTERVAL:-}"
|
|
71
79
|
|
|
72
80
|
# Now set defaults (only if not already set by environment)
|
|
73
81
|
MAX_CALLS_PER_HOUR="${MAX_CALLS_PER_HOUR:-100}"
|
|
@@ -93,6 +101,21 @@ RALPH_SESSION_HISTORY_FILE="$RALPH_DIR/.ralph_session_history" # Session transi
|
|
|
93
101
|
# Too short = frequent context loss; Too long = stale context causes unpredictable behavior
|
|
94
102
|
CLAUDE_SESSION_EXPIRY_HOURS=${CLAUDE_SESSION_EXPIRY_HOURS:-24}
|
|
95
103
|
|
|
104
|
+
# Quality gates configuration
|
|
105
|
+
TEST_COMMAND="${TEST_COMMAND:-}"
|
|
106
|
+
QUALITY_GATES="${QUALITY_GATES:-}"
|
|
107
|
+
QUALITY_GATE_MODE="${QUALITY_GATE_MODE:-warn}"
|
|
108
|
+
QUALITY_GATE_TIMEOUT="${QUALITY_GATE_TIMEOUT:-120}"
|
|
109
|
+
QUALITY_GATE_ON_COMPLETION_ONLY="${QUALITY_GATE_ON_COMPLETION_ONLY:-false}"
|
|
110
|
+
QUALITY_GATE_RESULTS_FILE="$RALPH_DIR/.quality_gate_results"
|
|
111
|
+
|
|
112
|
+
# Periodic code review configuration
|
|
113
|
+
REVIEW_ENABLED="${REVIEW_ENABLED:-false}"
|
|
114
|
+
REVIEW_INTERVAL="${REVIEW_INTERVAL:-5}"
|
|
115
|
+
REVIEW_FINDINGS_FILE="$RALPH_DIR/.review_findings.json"
|
|
116
|
+
REVIEW_PROMPT_FILE="$RALPH_DIR/REVIEW_PROMPT.md"
|
|
117
|
+
REVIEW_LAST_SHA_FILE="$RALPH_DIR/.review_last_sha"
|
|
118
|
+
|
|
96
119
|
# Valid tool patterns for --allowed-tools validation
|
|
97
120
|
# Default: Claude Code tools. Platform driver overwrites via driver_valid_tools() in main().
|
|
98
121
|
# Validation runs in main() after load_platform_driver so the correct patterns are in effect.
|
|
@@ -237,6 +260,13 @@ load_ralphrc() {
|
|
|
237
260
|
[[ "$_CLI_VERBOSE_PROGRESS" == "true" ]] && VERBOSE_PROGRESS="$_cli_VERBOSE_PROGRESS"
|
|
238
261
|
[[ -n "$_env_CB_COOLDOWN_MINUTES" ]] && CB_COOLDOWN_MINUTES="$_env_CB_COOLDOWN_MINUTES"
|
|
239
262
|
[[ -n "$_env_CB_AUTO_RESET" ]] && CB_AUTO_RESET="$_env_CB_AUTO_RESET"
|
|
263
|
+
[[ -n "$_env_TEST_COMMAND" ]] && TEST_COMMAND="$_env_TEST_COMMAND"
|
|
264
|
+
[[ -n "$_env_QUALITY_GATES" ]] && QUALITY_GATES="$_env_QUALITY_GATES"
|
|
265
|
+
[[ -n "$_env_QUALITY_GATE_MODE" ]] && QUALITY_GATE_MODE="$_env_QUALITY_GATE_MODE"
|
|
266
|
+
[[ -n "$_env_QUALITY_GATE_TIMEOUT" ]] && QUALITY_GATE_TIMEOUT="$_env_QUALITY_GATE_TIMEOUT"
|
|
267
|
+
[[ -n "$_env_QUALITY_GATE_ON_COMPLETION_ONLY" ]] && QUALITY_GATE_ON_COMPLETION_ONLY="$_env_QUALITY_GATE_ON_COMPLETION_ONLY"
|
|
268
|
+
[[ -n "$_env_REVIEW_ENABLED" ]] && REVIEW_ENABLED="$_env_REVIEW_ENABLED"
|
|
269
|
+
[[ -n "$_env_REVIEW_INTERVAL" ]] && REVIEW_INTERVAL="$_env_REVIEW_INTERVAL"
|
|
240
270
|
|
|
241
271
|
normalize_claude_permission_mode
|
|
242
272
|
RALPHRC_FILE="$config_file"
|
|
@@ -513,6 +543,17 @@ update_status() {
|
|
|
513
543
|
exit_reason: $exit_reason,
|
|
514
544
|
next_reset: $next_reset
|
|
515
545
|
}' > "$STATUS_FILE"
|
|
546
|
+
|
|
547
|
+
# Merge quality gate status if results exist
|
|
548
|
+
if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
|
|
549
|
+
local qg_tmp="$STATUS_FILE.qg_tmp"
|
|
550
|
+
if jq -s '.[0] * {quality_gates: {overall_status: .[1].overall_status, mode: .[1].mode}}' \
|
|
551
|
+
"$STATUS_FILE" "$QUALITY_GATE_RESULTS_FILE" > "$qg_tmp" 2>/dev/null; then
|
|
552
|
+
mv "$qg_tmp" "$STATUS_FILE"
|
|
553
|
+
else
|
|
554
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
555
|
+
fi
|
|
556
|
+
fi
|
|
516
557
|
}
|
|
517
558
|
|
|
518
559
|
validate_permission_denial_mode() {
|
|
@@ -530,6 +571,31 @@ validate_permission_denial_mode() {
|
|
|
530
571
|
esac
|
|
531
572
|
}
|
|
532
573
|
|
|
574
|
+
validate_quality_gate_mode() {
|
|
575
|
+
local mode=$1
|
|
576
|
+
|
|
577
|
+
case "$mode" in
|
|
578
|
+
warn|block|circuit-breaker)
|
|
579
|
+
return 0
|
|
580
|
+
;;
|
|
581
|
+
*)
|
|
582
|
+
echo "Error: Invalid QUALITY_GATE_MODE: '$mode'"
|
|
583
|
+
echo "Valid modes: warn block circuit-breaker"
|
|
584
|
+
return 1
|
|
585
|
+
;;
|
|
586
|
+
esac
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
validate_quality_gate_timeout() {
|
|
590
|
+
local timeout=$1
|
|
591
|
+
|
|
592
|
+
if [[ ! "$timeout" =~ ^[0-9]+$ ]] || [[ "$timeout" -eq 0 ]]; then
|
|
593
|
+
echo "Error: QUALITY_GATE_TIMEOUT must be a positive integer, got: '$timeout'"
|
|
594
|
+
return 1
|
|
595
|
+
fi
|
|
596
|
+
return 0
|
|
597
|
+
}
|
|
598
|
+
|
|
533
599
|
normalize_claude_permission_mode() {
|
|
534
600
|
if [[ -z "${CLAUDE_PERMISSION_MODE:-}" ]]; then
|
|
535
601
|
CLAUDE_PERMISSION_MODE="bypassPermissions"
|
|
@@ -796,9 +862,207 @@ enforce_fix_plan_progress_tracking() {
|
|
|
796
862
|
return 0
|
|
797
863
|
}
|
|
798
864
|
|
|
865
|
+
# Run the built-in test gate
|
|
866
|
+
# Reads tests_status from .response_analysis. If FAILING and TEST_COMMAND is set,
|
|
867
|
+
# runs the command to verify. Returns JSON with status/verified/output on stdout.
|
|
868
|
+
run_test_gate() {
|
|
869
|
+
local analysis_file=$1
|
|
870
|
+
|
|
871
|
+
if [[ ! -f "$analysis_file" ]]; then
|
|
872
|
+
echo '{"status":"skip","tests_status_reported":"","verified":false,"output":""}'
|
|
873
|
+
return 0
|
|
874
|
+
fi
|
|
875
|
+
|
|
876
|
+
local tests_status
|
|
877
|
+
tests_status=$(jq -r '.analysis.tests_status // "UNKNOWN"' "$analysis_file" 2>/dev/null || echo "UNKNOWN")
|
|
878
|
+
|
|
879
|
+
if [[ "$tests_status" == "UNKNOWN" && -z "$TEST_COMMAND" ]]; then
|
|
880
|
+
echo '{"status":"skip","tests_status_reported":"UNKNOWN","verified":false,"output":""}'
|
|
881
|
+
return 0
|
|
882
|
+
fi
|
|
883
|
+
|
|
884
|
+
if [[ "$tests_status" == "PASSING" && -z "$TEST_COMMAND" ]]; then
|
|
885
|
+
jq -n --arg ts "$tests_status" '{"status":"pass","tests_status_reported":$ts,"verified":false,"output":""}'
|
|
886
|
+
return 0
|
|
887
|
+
fi
|
|
888
|
+
|
|
889
|
+
if [[ -n "$TEST_COMMAND" ]]; then
|
|
890
|
+
local cmd_output=""
|
|
891
|
+
local cmd_exit=0
|
|
892
|
+
cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$TEST_COMMAND" 2>&1) || cmd_exit=$?
|
|
893
|
+
cmd_output="${cmd_output:0:500}"
|
|
894
|
+
|
|
895
|
+
local verified_status="pass"
|
|
896
|
+
if [[ $cmd_exit -ne 0 ]]; then
|
|
897
|
+
verified_status="fail"
|
|
898
|
+
fi
|
|
899
|
+
|
|
900
|
+
jq -n \
|
|
901
|
+
--arg status "$verified_status" \
|
|
902
|
+
--arg ts "$tests_status" \
|
|
903
|
+
--arg out "$cmd_output" \
|
|
904
|
+
'{"status":$status,"tests_status_reported":$ts,"verified":true,"output":$out}'
|
|
905
|
+
return 0
|
|
906
|
+
fi
|
|
907
|
+
|
|
908
|
+
# No TEST_COMMAND, trust the reported status
|
|
909
|
+
local gate_status="pass"
|
|
910
|
+
if [[ "$tests_status" == "FAILING" ]]; then
|
|
911
|
+
gate_status="fail"
|
|
912
|
+
fi
|
|
913
|
+
|
|
914
|
+
jq -n \
|
|
915
|
+
--arg status "$gate_status" \
|
|
916
|
+
--arg ts "$tests_status" \
|
|
917
|
+
'{"status":$status,"tests_status_reported":$ts,"verified":false,"output":""}'
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
# Run user-defined quality gate commands
|
|
921
|
+
# Splits QUALITY_GATES on semicolons, runs each with portable_timeout.
|
|
922
|
+
# Returns JSON array of results on stdout.
|
|
923
|
+
run_custom_gates() {
|
|
924
|
+
if [[ -z "$QUALITY_GATES" ]]; then
|
|
925
|
+
echo "[]"
|
|
926
|
+
return 0
|
|
927
|
+
fi
|
|
928
|
+
|
|
929
|
+
local results="[]"
|
|
930
|
+
local gates
|
|
931
|
+
IFS=";" read -ra gates <<< "$QUALITY_GATES"
|
|
932
|
+
|
|
933
|
+
for gate_cmd in "${gates[@]}"; do
|
|
934
|
+
gate_cmd=$(echo "$gate_cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
935
|
+
[[ -z "$gate_cmd" ]] && continue
|
|
936
|
+
|
|
937
|
+
local cmd_output=""
|
|
938
|
+
local cmd_exit=0
|
|
939
|
+
local start_time
|
|
940
|
+
start_time=$(date +%s)
|
|
941
|
+
local timed_out="false"
|
|
942
|
+
|
|
943
|
+
cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$gate_cmd" 2>&1) || cmd_exit=$?
|
|
944
|
+
|
|
945
|
+
local end_time
|
|
946
|
+
end_time=$(date +%s)
|
|
947
|
+
local duration=$((end_time - start_time))
|
|
948
|
+
|
|
949
|
+
# portable_timeout returns 124 on timeout
|
|
950
|
+
if [[ $cmd_exit -eq 124 ]]; then
|
|
951
|
+
timed_out="true"
|
|
952
|
+
fi
|
|
953
|
+
|
|
954
|
+
cmd_output="${cmd_output:0:500}"
|
|
955
|
+
|
|
956
|
+
local gate_status="pass"
|
|
957
|
+
if [[ $cmd_exit -ne 0 ]]; then
|
|
958
|
+
gate_status="fail"
|
|
959
|
+
fi
|
|
960
|
+
|
|
961
|
+
results=$(echo "$results" | jq \
|
|
962
|
+
--arg cmd "$gate_cmd" \
|
|
963
|
+
--arg status "$gate_status" \
|
|
964
|
+
--argjson exit_code "$cmd_exit" \
|
|
965
|
+
--arg out "$cmd_output" \
|
|
966
|
+
--argjson dur "$duration" \
|
|
967
|
+
--argjson timed_out "$timed_out" \
|
|
968
|
+
'. += [{"command":$cmd,"status":$status,"exit_code":$exit_code,"output":$out,"duration_seconds":$dur,"timed_out":$timed_out}]'
|
|
969
|
+
)
|
|
970
|
+
done
|
|
971
|
+
|
|
972
|
+
echo "$results"
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
# Orchestrator: run all quality gates and write results file
|
|
976
|
+
# Args: loop_number exit_signal_active
|
|
977
|
+
# Returns (on stdout): 0=pass/warn, 1=block failure, 2=circuit-breaker failure
|
|
978
|
+
run_quality_gates() {
|
|
979
|
+
local loop_number=$1
|
|
980
|
+
local exit_signal_active=${2:-"false"}
|
|
981
|
+
|
|
982
|
+
# Skip if no gates configured
|
|
983
|
+
if [[ -z "$TEST_COMMAND" && -z "$QUALITY_GATES" ]]; then
|
|
984
|
+
echo "0"
|
|
985
|
+
return 0
|
|
986
|
+
fi
|
|
987
|
+
|
|
988
|
+
# Skip if completion-only mode and not completing
|
|
989
|
+
if [[ "$QUALITY_GATE_ON_COMPLETION_ONLY" == "true" && "$exit_signal_active" != "true" ]]; then
|
|
990
|
+
echo "0"
|
|
991
|
+
return 0
|
|
992
|
+
fi
|
|
993
|
+
|
|
994
|
+
local test_gate_json
|
|
995
|
+
test_gate_json=$(run_test_gate "$RESPONSE_ANALYSIS_FILE")
|
|
996
|
+
|
|
997
|
+
local custom_gates_json
|
|
998
|
+
custom_gates_json=$(run_custom_gates)
|
|
999
|
+
|
|
1000
|
+
# Determine overall status
|
|
1001
|
+
local overall_status="pass"
|
|
1002
|
+
local test_gate_status
|
|
1003
|
+
test_gate_status=$(echo "$test_gate_json" | jq -r '.status' 2>/dev/null || echo "skip")
|
|
1004
|
+
if [[ "$test_gate_status" == "fail" ]]; then
|
|
1005
|
+
overall_status="fail"
|
|
1006
|
+
fi
|
|
1007
|
+
|
|
1008
|
+
local custom_fail_count
|
|
1009
|
+
custom_fail_count=$(echo "$custom_gates_json" | jq '[.[] | select(.status == "fail")] | length' 2>/dev/null || echo "0")
|
|
1010
|
+
if [[ $custom_fail_count -gt 0 ]]; then
|
|
1011
|
+
overall_status="fail"
|
|
1012
|
+
fi
|
|
1013
|
+
|
|
1014
|
+
# Write results file atomically (tmp+mv to avoid truncation on jq failure)
|
|
1015
|
+
local qg_tmp="$QUALITY_GATE_RESULTS_FILE.tmp"
|
|
1016
|
+
if jq -n \
|
|
1017
|
+
--arg timestamp "$(get_iso_timestamp)" \
|
|
1018
|
+
--argjson loop_number "$loop_number" \
|
|
1019
|
+
--argjson test_gate "$test_gate_json" \
|
|
1020
|
+
--argjson custom_gates "$custom_gates_json" \
|
|
1021
|
+
--arg overall_status "$overall_status" \
|
|
1022
|
+
--arg mode "$QUALITY_GATE_MODE" \
|
|
1023
|
+
'{
|
|
1024
|
+
timestamp: $timestamp,
|
|
1025
|
+
loop_number: $loop_number,
|
|
1026
|
+
test_gate: $test_gate,
|
|
1027
|
+
custom_gates: $custom_gates,
|
|
1028
|
+
overall_status: $overall_status,
|
|
1029
|
+
mode: $mode
|
|
1030
|
+
}' > "$qg_tmp" 2>/dev/null; then
|
|
1031
|
+
mv "$qg_tmp" "$QUALITY_GATE_RESULTS_FILE"
|
|
1032
|
+
else
|
|
1033
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
1034
|
+
fi
|
|
1035
|
+
|
|
1036
|
+
if [[ "$overall_status" == "fail" ]]; then
|
|
1037
|
+
log_status "WARN" "Quality gate failure (mode=$QUALITY_GATE_MODE): test_gate=$test_gate_status, custom_failures=$custom_fail_count"
|
|
1038
|
+
fi
|
|
1039
|
+
|
|
1040
|
+
# Return code based on mode
|
|
1041
|
+
if [[ "$overall_status" == "pass" ]]; then
|
|
1042
|
+
echo "0"
|
|
1043
|
+
return 0
|
|
1044
|
+
fi
|
|
1045
|
+
|
|
1046
|
+
case "$QUALITY_GATE_MODE" in
|
|
1047
|
+
block)
|
|
1048
|
+
echo "1"
|
|
1049
|
+
return 0
|
|
1050
|
+
;;
|
|
1051
|
+
circuit-breaker)
|
|
1052
|
+
echo "2"
|
|
1053
|
+
return 0
|
|
1054
|
+
;;
|
|
1055
|
+
*)
|
|
1056
|
+
# warn mode: return 0 even on failure
|
|
1057
|
+
echo "0"
|
|
1058
|
+
return 0
|
|
1059
|
+
;;
|
|
1060
|
+
esac
|
|
1061
|
+
}
|
|
1062
|
+
|
|
799
1063
|
# Check if we should gracefully exit
|
|
800
1064
|
should_exit_gracefully() {
|
|
801
|
-
|
|
1065
|
+
|
|
802
1066
|
if [[ ! -f "$EXIT_SIGNALS_FILE" ]]; then
|
|
803
1067
|
return 1 # Don't exit, file doesn't exist
|
|
804
1068
|
fi
|
|
@@ -989,7 +1253,28 @@ build_loop_context() {
|
|
|
989
1253
|
if [[ -f "$RESPONSE_ANALYSIS_FILE" ]]; then
|
|
990
1254
|
local prev_summary=$(jq -r '.analysis.work_summary // ""' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null | head -c 200)
|
|
991
1255
|
if [[ -n "$prev_summary" && "$prev_summary" != "null" ]]; then
|
|
992
|
-
context+="Previous: ${prev_summary}"
|
|
1256
|
+
context+="Previous: ${prev_summary}. "
|
|
1257
|
+
fi
|
|
1258
|
+
fi
|
|
1259
|
+
|
|
1260
|
+
# Add quality gate failure feedback (block and circuit-breaker modes only)
|
|
1261
|
+
if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
|
|
1262
|
+
local qg_status qg_mode
|
|
1263
|
+
qg_status=$(jq -r '.overall_status // "pass"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1264
|
+
qg_mode=$(jq -r '.mode // "warn"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1265
|
+
|
|
1266
|
+
if [[ "$qg_status" == "fail" && "$qg_mode" != "warn" ]]; then
|
|
1267
|
+
local test_gate_status
|
|
1268
|
+
test_gate_status=$(jq -r '.test_gate.status // "skip"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1269
|
+
if [[ "$test_gate_status" == "fail" ]]; then
|
|
1270
|
+
context+="TESTS FAILING. "
|
|
1271
|
+
fi
|
|
1272
|
+
|
|
1273
|
+
local failed_gates
|
|
1274
|
+
failed_gates=$(jq -r '[.custom_gates[] | select(.status == "fail") | .command | split(" ")[0:2] | join(" ")] | join(", ")' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1275
|
+
if [[ -n "$failed_gates" ]]; then
|
|
1276
|
+
context+="QG fail: ${failed_gates}. "
|
|
1277
|
+
fi
|
|
993
1278
|
fi
|
|
994
1279
|
fi
|
|
995
1280
|
|
|
@@ -997,6 +1282,151 @@ build_loop_context() {
|
|
|
997
1282
|
echo "${context:0:500}"
|
|
998
1283
|
}
|
|
999
1284
|
|
|
1285
|
+
# Check if a periodic code review should run this iteration
|
|
1286
|
+
# Returns 0 (true) when review is due, 1 (false) otherwise
|
|
1287
|
+
should_run_review() {
|
|
1288
|
+
[[ "$REVIEW_ENABLED" != "true" ]] && return 1
|
|
1289
|
+
local loop_count=$1
|
|
1290
|
+
# Never review on first loop (no implementation yet)
|
|
1291
|
+
(( loop_count < 1 )) && return 1
|
|
1292
|
+
(( loop_count % REVIEW_INTERVAL != 0 )) && return 1
|
|
1293
|
+
# Skip if circuit breaker is not CLOSED
|
|
1294
|
+
if [[ -f "$RALPH_DIR/.circuit_breaker_state" ]]; then
|
|
1295
|
+
local cb_state
|
|
1296
|
+
cb_state=$(jq -r '.state // "CLOSED"' "$RALPH_DIR/.circuit_breaker_state" 2>/dev/null)
|
|
1297
|
+
[[ "$cb_state" != "CLOSED" ]] && return 1
|
|
1298
|
+
fi
|
|
1299
|
+
# Skip if no changes since last review (committed or uncommitted)
|
|
1300
|
+
if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null 2>&1; then
|
|
1301
|
+
local current_sha last_sha
|
|
1302
|
+
current_sha=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
|
|
1303
|
+
last_sha=""
|
|
1304
|
+
[[ -f "$REVIEW_LAST_SHA_FILE" ]] && last_sha=$(cat "$REVIEW_LAST_SHA_FILE" 2>/dev/null)
|
|
1305
|
+
# Check for new commits OR uncommitted workspace changes
|
|
1306
|
+
local has_uncommitted
|
|
1307
|
+
has_uncommitted=$(git status --porcelain 2>/dev/null | head -1)
|
|
1308
|
+
if [[ "$current_sha" == "$last_sha" && -z "$has_uncommitted" ]]; then
|
|
1309
|
+
return 1
|
|
1310
|
+
fi
|
|
1311
|
+
fi
|
|
1312
|
+
return 0
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
# Build review findings context for injection into the next implementation loop
|
|
1316
|
+
# Returns a compact string (max 500 chars) with unresolved findings
|
|
1317
|
+
build_review_context() {
|
|
1318
|
+
if [[ ! -f "$REVIEW_FINDINGS_FILE" ]]; then
|
|
1319
|
+
echo ""
|
|
1320
|
+
return
|
|
1321
|
+
fi
|
|
1322
|
+
|
|
1323
|
+
local severity issues_found summary
|
|
1324
|
+
severity=$(jq -r '.severity // ""' "$REVIEW_FINDINGS_FILE" 2>/dev/null)
|
|
1325
|
+
issues_found=$(jq -r '.issues_found // 0' "$REVIEW_FINDINGS_FILE" 2>/dev/null)
|
|
1326
|
+
summary=$(jq -r '.summary // ""' "$REVIEW_FINDINGS_FILE" 2>/dev/null | head -c 300)
|
|
1327
|
+
|
|
1328
|
+
if [[ "$issues_found" == "0" || -z "$severity" || "$severity" == "null" ]]; then
|
|
1329
|
+
echo ""
|
|
1330
|
+
return
|
|
1331
|
+
fi
|
|
1332
|
+
|
|
1333
|
+
local context="REVIEW FINDINGS ($severity, $issues_found issues): $summary"
|
|
1334
|
+
# Include top details if space allows
|
|
1335
|
+
local top_details
|
|
1336
|
+
top_details=$(jq -r '(.details[:2] // []) | map("- [\(.severity)] \(.file): \(.issue)") | join("; ")' "$REVIEW_FINDINGS_FILE" 2>/dev/null | head -c 150)
|
|
1337
|
+
if [[ -n "$top_details" && "$top_details" != "null" ]]; then
|
|
1338
|
+
context+=" Details: $top_details"
|
|
1339
|
+
fi
|
|
1340
|
+
|
|
1341
|
+
echo "${context:0:500}"
|
|
1342
|
+
}
|
|
1343
|
+
|
|
1344
|
+
# Execute a periodic code review loop (read-only, no file modifications)
|
|
1345
|
+
# Uses a fresh ephemeral session with restricted tool permissions
|
|
1346
|
+
run_review_loop() {
|
|
1347
|
+
local loop_count=$1
|
|
1348
|
+
|
|
1349
|
+
log_status "INFO" "Starting periodic code review (loop #$loop_count)"
|
|
1350
|
+
|
|
1351
|
+
# Get diff context (committed + uncommitted changes)
|
|
1352
|
+
local last_sha=""
|
|
1353
|
+
[[ -f "$REVIEW_LAST_SHA_FILE" ]] && last_sha=$(cat "$REVIEW_LAST_SHA_FILE" 2>/dev/null)
|
|
1354
|
+
local diff_context=""
|
|
1355
|
+
if command -v git &>/dev/null && git rev-parse --git-dir &>/dev/null 2>&1; then
|
|
1356
|
+
local committed_diff="" uncommitted_diff=""
|
|
1357
|
+
if [[ -n "$last_sha" ]]; then
|
|
1358
|
+
committed_diff=$(git diff "$last_sha"..HEAD --stat 2>/dev/null | head -20 || true)
|
|
1359
|
+
else
|
|
1360
|
+
committed_diff=$(git diff HEAD~5..HEAD --stat 2>/dev/null | head -20 || true)
|
|
1361
|
+
fi
|
|
1362
|
+
uncommitted_diff=$(git diff --stat 2>/dev/null | head -10 || true)
|
|
1363
|
+
diff_context="${committed_diff}"
|
|
1364
|
+
if [[ -n "$uncommitted_diff" ]]; then
|
|
1365
|
+
diff_context+=$'\nUncommitted:\n'"${uncommitted_diff}"
|
|
1366
|
+
fi
|
|
1367
|
+
[[ -z "$diff_context" ]] && diff_context="No recent changes"
|
|
1368
|
+
fi
|
|
1369
|
+
|
|
1370
|
+
# Check review prompt exists
|
|
1371
|
+
if [[ ! -f "$REVIEW_PROMPT_FILE" ]]; then
|
|
1372
|
+
log_status "WARN" "Review prompt file not found: $REVIEW_PROMPT_FILE — skipping review"
|
|
1373
|
+
return 0
|
|
1374
|
+
fi
|
|
1375
|
+
|
|
1376
|
+
# Build review-specific context
|
|
1377
|
+
local review_context="CODE REVIEW LOOP (read-only). Analyze changes since last review. Recent changes: $diff_context"
|
|
1378
|
+
|
|
1379
|
+
# Save and override CLAUDE_ALLOWED_TOOLS for read-only mode
|
|
1380
|
+
local saved_tools="$CLAUDE_ALLOWED_TOOLS"
|
|
1381
|
+
CLAUDE_ALLOWED_TOOLS="Read,Glob,Grep"
|
|
1382
|
+
|
|
1383
|
+
local timeout_seconds=$((CLAUDE_TIMEOUT_MINUTES * 60))
|
|
1384
|
+
local review_output_file="$LOG_DIR/review_loop_${loop_count}.log"
|
|
1385
|
+
|
|
1386
|
+
# Build command with review prompt and NO session resume (ephemeral)
|
|
1387
|
+
if driver_build_command "$REVIEW_PROMPT_FILE" "$review_context" ""; then
|
|
1388
|
+
# Execute review (capture output)
|
|
1389
|
+
portable_timeout "${timeout_seconds}s" "${CLAUDE_CMD_ARGS[@]}" \
|
|
1390
|
+
< /dev/null > "$review_output_file" 2>&1 || true
|
|
1391
|
+
fi
|
|
1392
|
+
|
|
1393
|
+
# Restore CLAUDE_ALLOWED_TOOLS
|
|
1394
|
+
CLAUDE_ALLOWED_TOOLS="$saved_tools"
|
|
1395
|
+
|
|
1396
|
+
# Parse review findings from output
|
|
1397
|
+
if [[ -f "$review_output_file" ]]; then
|
|
1398
|
+
# Review ran successfully — save SHA so we don't re-review the same state
|
|
1399
|
+
git rev-parse HEAD > "$REVIEW_LAST_SHA_FILE" 2>/dev/null || true
|
|
1400
|
+
|
|
1401
|
+
local findings_json=""
|
|
1402
|
+
# Extract JSON between ---REVIEW_FINDINGS--- and ---END_REVIEW_FINDINGS--- markers
|
|
1403
|
+
findings_json=$(sed -n '/---REVIEW_FINDINGS---/,/---END_REVIEW_FINDINGS---/{//!p;}' "$review_output_file" 2>/dev/null | tr -d '\n' | head -c 5000)
|
|
1404
|
+
|
|
1405
|
+
# If output is JSON format, try extracting from result field first
|
|
1406
|
+
if [[ -z "$findings_json" ]]; then
|
|
1407
|
+
local raw_text
|
|
1408
|
+
raw_text=$(jq -r '.result // .content // ""' "$review_output_file" 2>/dev/null || cat "$review_output_file" 2>/dev/null)
|
|
1409
|
+
findings_json=$(echo "$raw_text" | sed -n '/---REVIEW_FINDINGS---/,/---END_REVIEW_FINDINGS---/{//!p;}' 2>/dev/null | tr -d '\n' | head -c 5000)
|
|
1410
|
+
fi
|
|
1411
|
+
|
|
1412
|
+
if [[ -n "$findings_json" ]]; then
|
|
1413
|
+
# Validate it's valid JSON before writing
|
|
1414
|
+
if echo "$findings_json" | jq . > /dev/null 2>&1; then
|
|
1415
|
+
local tmp_findings="$REVIEW_FINDINGS_FILE.tmp"
|
|
1416
|
+
echo "$findings_json" > "$tmp_findings"
|
|
1417
|
+
mv "$tmp_findings" "$REVIEW_FINDINGS_FILE"
|
|
1418
|
+
local issue_count
|
|
1419
|
+
issue_count=$(echo "$findings_json" | jq -r '.issues_found // 0' 2>/dev/null)
|
|
1420
|
+
log_status "INFO" "Code review complete. $issue_count issue(s) found."
|
|
1421
|
+
else
|
|
1422
|
+
log_status "WARN" "Review findings JSON is malformed — skipping"
|
|
1423
|
+
fi
|
|
1424
|
+
else
|
|
1425
|
+
log_status "INFO" "Code review complete. No structured findings extracted."
|
|
1426
|
+
fi
|
|
1427
|
+
fi
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1000
1430
|
# Get session file age in seconds (cross-platform)
|
|
1001
1431
|
# Returns: age in seconds on stdout, or -1 if stat fails
|
|
1002
1432
|
get_session_file_age_seconds() {
|
|
@@ -1102,7 +1532,15 @@ save_claude_session() {
|
|
|
1102
1532
|
# Try to extract session ID from structured output
|
|
1103
1533
|
if [[ -f "$output_file" ]]; then
|
|
1104
1534
|
local session_id
|
|
1105
|
-
|
|
1535
|
+
if declare -F driver_extract_session_id_from_output >/dev/null; then
|
|
1536
|
+
session_id=$(driver_extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
|
|
1537
|
+
fi
|
|
1538
|
+
if [[ -z "$session_id" || "$session_id" == "null" ]]; then
|
|
1539
|
+
session_id=$(extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
|
|
1540
|
+
fi
|
|
1541
|
+
if [[ -z "$session_id" || "$session_id" == "null" ]] && declare -F driver_fallback_session_id >/dev/null; then
|
|
1542
|
+
session_id=$(driver_fallback_session_id "$output_file" 2>/dev/null || echo "")
|
|
1543
|
+
fi
|
|
1106
1544
|
if [[ -n "$session_id" && "$session_id" != "null" ]]; then
|
|
1107
1545
|
echo "$session_id" > "$CLAUDE_SESSION_FILE"
|
|
1108
1546
|
sync_ralph_session_with_driver "$session_id"
|
|
@@ -1523,6 +1961,13 @@ execute_claude_code() {
|
|
|
1523
1961
|
if build_claude_command "$PROMPT_FILE" "$loop_context" "$session_id"; then
|
|
1524
1962
|
use_modern_cli=true
|
|
1525
1963
|
log_status "INFO" "Using modern CLI mode (${CLAUDE_OUTPUT_FORMAT} output)"
|
|
1964
|
+
|
|
1965
|
+
# Build review findings context (separate from loop context)
|
|
1966
|
+
local review_context=""
|
|
1967
|
+
review_context=$(build_review_context)
|
|
1968
|
+
if [[ -n "$review_context" ]]; then
|
|
1969
|
+
CLAUDE_CMD_ARGS+=("--append-system-prompt" "$review_context")
|
|
1970
|
+
fi
|
|
1526
1971
|
else
|
|
1527
1972
|
log_status "WARN" "Failed to build modern CLI command, falling back to legacy mode"
|
|
1528
1973
|
if [[ "$LIVE_OUTPUT" == "true" ]]; then
|
|
@@ -1741,12 +2186,32 @@ EOF
|
|
|
1741
2186
|
read -r fix_plan_completed_after _ _ < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
|
|
1742
2187
|
enforce_fix_plan_progress_tracking "$RESPONSE_ANALYSIS_FILE" "$fix_plan_completed_before" "$fix_plan_completed_after"
|
|
1743
2188
|
|
|
2189
|
+
# Run quality gates
|
|
2190
|
+
local exit_signal_for_gates
|
|
2191
|
+
exit_signal_for_gates=$(jq -r '.analysis.exit_signal // false' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null || echo "false")
|
|
2192
|
+
local qg_result
|
|
2193
|
+
qg_result=$(run_quality_gates "$loop_count" "$exit_signal_for_gates")
|
|
2194
|
+
|
|
2195
|
+
# Block mode: suppress exit signals so the loop keeps running
|
|
2196
|
+
if [[ "$qg_result" == "1" ]]; then
|
|
2197
|
+
log_status "WARN" "Quality gate block: suppressing completion signals"
|
|
2198
|
+
local qg_tmp="$RESPONSE_ANALYSIS_FILE.qg_tmp"
|
|
2199
|
+
if jq '.analysis.has_completion_signal = false | .analysis.exit_signal = false' \
|
|
2200
|
+
"$RESPONSE_ANALYSIS_FILE" > "$qg_tmp" 2>/dev/null; then
|
|
2201
|
+
mv "$qg_tmp" "$RESPONSE_ANALYSIS_FILE"
|
|
2202
|
+
else
|
|
2203
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
2204
|
+
fi
|
|
2205
|
+
fi
|
|
2206
|
+
|
|
1744
2207
|
# Update exit signals based on analysis
|
|
1745
2208
|
update_exit_signals
|
|
1746
2209
|
|
|
1747
2210
|
# Log analysis summary
|
|
1748
2211
|
log_analysis_summary
|
|
1749
2212
|
|
|
2213
|
+
PENDING_EXIT_REASON=$(should_exit_gracefully)
|
|
2214
|
+
|
|
1750
2215
|
# Get file change count for circuit breaker
|
|
1751
2216
|
# Fix #141: Detect both uncommitted changes AND committed changes
|
|
1752
2217
|
local files_changed=0
|
|
@@ -1807,6 +2272,13 @@ EOF
|
|
|
1807
2272
|
fi
|
|
1808
2273
|
local output_length=$(wc -c < "$output_file" 2>/dev/null || echo 0)
|
|
1809
2274
|
|
|
2275
|
+
# Circuit-breaker mode: override progress signals so circuit breaker sees no-progress
|
|
2276
|
+
if [[ "$qg_result" == "2" ]]; then
|
|
2277
|
+
log_status "WARN" "Quality gate circuit-breaker: overriding progress signals"
|
|
2278
|
+
files_changed=0
|
|
2279
|
+
has_errors="true"
|
|
2280
|
+
fi
|
|
2281
|
+
|
|
1810
2282
|
# Record result in circuit breaker
|
|
1811
2283
|
record_loop_result "$loop_count" "$files_changed" "$has_errors" "$output_length"
|
|
1812
2284
|
local circuit_result=$?
|
|
@@ -1854,6 +2326,18 @@ main() {
|
|
|
1854
2326
|
exit 1
|
|
1855
2327
|
fi
|
|
1856
2328
|
|
|
2329
|
+
if [[ -n "$QUALITY_GATES" || -n "$TEST_COMMAND" ]]; then
|
|
2330
|
+
if ! validate_quality_gate_mode "$QUALITY_GATE_MODE"; then
|
|
2331
|
+
exit 1
|
|
2332
|
+
fi
|
|
2333
|
+
if ! validate_quality_gate_timeout "$QUALITY_GATE_TIMEOUT"; then
|
|
2334
|
+
exit 1
|
|
2335
|
+
fi
|
|
2336
|
+
if ! has_timeout_command; then
|
|
2337
|
+
log_status "WARN" "No timeout command available. Quality gate and test commands will fail. Install coreutils to enable timeout support."
|
|
2338
|
+
fi
|
|
2339
|
+
fi
|
|
2340
|
+
|
|
1857
2341
|
if [[ "$(driver_name)" == "claude-code" ]]; then
|
|
1858
2342
|
normalize_claude_permission_mode
|
|
1859
2343
|
|
|
@@ -1998,8 +2482,28 @@ main() {
|
|
|
1998
2482
|
continue
|
|
1999
2483
|
fi
|
|
2000
2484
|
|
|
2485
|
+
if [[ -n "$PENDING_EXIT_REASON" ]]; then
|
|
2486
|
+
local exit_reason="$PENDING_EXIT_REASON"
|
|
2487
|
+
PENDING_EXIT_REASON=""
|
|
2488
|
+
|
|
2489
|
+
log_status "SUCCESS" "🏁 Graceful exit triggered: $exit_reason"
|
|
2490
|
+
reset_session "project_complete"
|
|
2491
|
+
update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "graceful_exit" "completed" "$exit_reason"
|
|
2492
|
+
|
|
2493
|
+
log_status "SUCCESS" "🎉 Ralph has completed the project! Final stats:"
|
|
2494
|
+
log_status "INFO" " - Total loops: $loop_count"
|
|
2495
|
+
log_status "INFO" " - API calls used: $(cat "$CALL_COUNT_FILE")"
|
|
2496
|
+
log_status "INFO" " - Exit reason: $exit_reason"
|
|
2497
|
+
break
|
|
2498
|
+
fi
|
|
2499
|
+
|
|
2001
2500
|
update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "completed" "success"
|
|
2002
2501
|
|
|
2502
|
+
# Periodic code review check
|
|
2503
|
+
if should_run_review "$loop_count"; then
|
|
2504
|
+
run_review_loop "$loop_count"
|
|
2505
|
+
fi
|
|
2506
|
+
|
|
2003
2507
|
# Brief pause between successful executions
|
|
2004
2508
|
sleep 5
|
|
2005
2509
|
elif [ $exec_result -eq 3 ]; then
|
|
@@ -2083,7 +2587,7 @@ Options:
|
|
|
2083
2587
|
Modern CLI Options (Phase 1.1):
|
|
2084
2588
|
--output-format FORMAT Set driver output format: json or text (default: $CLAUDE_OUTPUT_FORMAT)
|
|
2085
2589
|
Note: --live mode requires JSON and will auto-switch
|
|
2086
|
-
--allowed-tools TOOLS Claude Code only. Ignored by codex, cursor, and copilot
|
|
2590
|
+
--allowed-tools TOOLS Claude Code only. Ignored by codex, opencode, cursor, and copilot
|
|
2087
2591
|
--no-continue Disable session continuity across loops
|
|
2088
2592
|
--session-expiry HOURS Set session expiration time in hours (default: $CLAUDE_SESSION_EXPIRY_HOURS)
|
|
2089
2593
|
|
|
@@ -50,6 +50,18 @@ You are Ralph, an autonomous AI development agent working on a [YOUR PROJECT NAM
|
|
|
50
50
|
- prefer small, reversible changes when requirements are ambiguous
|
|
51
51
|
- surface blockers in the Ralph status block instead of starting a conversation
|
|
52
52
|
|
|
53
|
+
## Self-Review Checklist (Before Reporting Status)
|
|
54
|
+
|
|
55
|
+
Before writing your RALPH_STATUS block, review your own work:
|
|
56
|
+
|
|
57
|
+
1. Re-read the diff of files you modified this loop — check for obvious bugs, typos, missing error handling
|
|
58
|
+
2. Verify you did not introduce regressions in existing functionality
|
|
59
|
+
3. Confirm your changes match the spec in .ralph/specs/ for the story you worked on
|
|
60
|
+
4. Check that new functions have proper error handling and edge case coverage
|
|
61
|
+
5. Ensure you did not leave TODO/FIXME/HACK comments without justification
|
|
62
|
+
|
|
63
|
+
If you find issues, fix them before reporting status. This self-check costs nothing extra.
|
|
64
|
+
|
|
53
65
|
## 🎯 Status Reporting (CRITICAL - Ralph needs this!)
|
|
54
66
|
|
|
55
67
|
**IMPORTANT**: At the end of your response, ALWAYS include this status block:
|