bmalph 2.7.6 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- 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/commands/doctor-checks.js +14 -5
- package/dist/commands/doctor-checks.js.map +1 -1
- package/dist/commands/doctor.js +13 -4
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +12 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/run.js +11 -2
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/status.js +3 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/watch.js +5 -0
- package/dist/commands/watch.js.map +1 -1
- package/dist/installer/commands.js +33 -15
- package/dist/installer/commands.js.map +1 -1
- package/dist/installer/install.js +1 -1
- package/dist/installer/install.js.map +1 -1
- package/dist/installer/project-files.js +4 -4
- package/dist/installer/project-files.js.map +1 -1
- package/dist/installer/template-files.js +72 -6
- package/dist/installer/template-files.js.map +1 -1
- package/dist/platform/codex.js +6 -1
- package/dist/platform/codex.js.map +1 -1
- package/dist/platform/detect.js +7 -3
- package/dist/platform/detect.js.map +1 -1
- package/dist/platform/doctor-checks.js +2 -2
- package/dist/platform/doctor-checks.js.map +1 -1
- package/dist/platform/guidance.js +66 -0
- package/dist/platform/guidance.js.map +1 -0
- package/dist/platform/instructions-snippet.js +15 -0
- package/dist/platform/instructions-snippet.js.map +1 -1
- package/dist/platform/opencode.js +20 -0
- package/dist/platform/opencode.js.map +1 -0
- package/dist/platform/registry.js +2 -0
- package/dist/platform/registry.js.map +1 -1
- package/dist/platform/types.js +1 -0
- package/dist/platform/types.js.map +1 -1
- package/dist/reset.js +3 -3
- package/dist/reset.js.map +1 -1
- package/dist/run/ralph-process.js +51 -7
- package/dist/run/ralph-process.js.map +1 -1
- package/dist/run/run-dashboard.js +22 -9
- package/dist/run/run-dashboard.js.map +1 -1
- package/dist/transition/artifact-scan.js +14 -5
- package/dist/transition/artifact-scan.js.map +1 -1
- package/dist/transition/context.js +11 -3
- package/dist/transition/context.js.map +1 -1
- package/dist/utils/constants.js +4 -2
- package/dist/utils/constants.js.map +1 -1
- package/dist/watch/dashboard.js +36 -21
- package/dist/watch/dashboard.js.map +1 -1
- package/dist/watch/frame-writer.js +83 -0
- package/dist/watch/frame-writer.js.map +1 -0
- package/dist/watch/renderer.js +179 -54
- package/dist/watch/renderer.js.map +1 -1
- package/dist/watch/state-reader.js +8 -0
- package/dist/watch/state-reader.js.map +1 -1
- package/package.json +1 -1
- package/ralph/RALPH-REFERENCE.md +4 -4
- package/ralph/drivers/claude-code.sh +4 -2
- package/ralph/drivers/opencode.sh +147 -0
- package/ralph/lib/enable_core.sh +10 -2
- package/ralph/lib/response_analyzer.sh +337 -96
- package/ralph/lib/wizard_utils.sh +4 -4
- package/ralph/ralph_import.sh +9 -1
- package/ralph/ralph_loop.sh +428 -15
- package/ralph/templates/PROMPT.md +15 -5
- package/ralph/templates/ralphrc.template +31 -5
- 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/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_import.sh
CHANGED
|
@@ -353,9 +353,17 @@ You are Ralph, an autonomous AI development agent working on a [PROJECT NAME] pr
|
|
|
353
353
|
- Search the codebase before assuming something isn't implemented
|
|
354
354
|
- Use subagents for expensive operations (file searching, analysis)
|
|
355
355
|
- Write comprehensive tests with clear documentation
|
|
356
|
-
-
|
|
356
|
+
- Toggle completed story checkboxes in @fix_plan.md without rewriting story lines
|
|
357
357
|
- Commit working changes with descriptive messages
|
|
358
358
|
|
|
359
|
+
## Progress Tracking (CRITICAL)
|
|
360
|
+
- Ralph tracks progress by counting story checkboxes in @fix_plan.md
|
|
361
|
+
- When you complete a story, change `- [ ]` to `- [x]` on that exact story line
|
|
362
|
+
- Do NOT remove, rewrite, or reorder story lines in @fix_plan.md
|
|
363
|
+
- Update the checkbox before committing so the monitor updates immediately
|
|
364
|
+
- Set `TASKS_COMPLETED_THIS_LOOP` to the exact number of story checkboxes toggled this loop
|
|
365
|
+
- Only valid values: 0 or 1
|
|
366
|
+
|
|
359
367
|
## 🧪 Testing Guidelines (CRITICAL)
|
|
360
368
|
- LIMIT testing to ~20% of your total effort per loop
|
|
361
369
|
- PRIORITIZE: Implementation > Documentation > Tests
|
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,18 +69,23 @@ _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:-}"
|
|
71
77
|
|
|
72
78
|
# Now set defaults (only if not already set by environment)
|
|
73
79
|
MAX_CALLS_PER_HOUR="${MAX_CALLS_PER_HOUR:-100}"
|
|
74
80
|
VERBOSE_PROGRESS="${VERBOSE_PROGRESS:-false}"
|
|
75
81
|
CLAUDE_TIMEOUT_MINUTES="${CLAUDE_TIMEOUT_MINUTES:-15}"
|
|
76
|
-
DEFAULT_CLAUDE_ALLOWED_TOOLS="Write,Read,Edit,MultiEdit,Glob,Grep,Task,TodoWrite,WebFetch,WebSearch,NotebookEdit,Bash"
|
|
82
|
+
DEFAULT_CLAUDE_ALLOWED_TOOLS="Write,Read,Edit,MultiEdit,Glob,Grep,Task,TodoWrite,WebFetch,WebSearch,EnterPlanMode,ExitPlanMode,NotebookEdit,Bash"
|
|
77
83
|
DEFAULT_PERMISSION_DENIAL_MODE="continue"
|
|
78
84
|
|
|
79
85
|
# Modern Claude CLI configuration (Phase 1.1)
|
|
80
86
|
CLAUDE_OUTPUT_FORMAT="${CLAUDE_OUTPUT_FORMAT:-json}"
|
|
81
87
|
CLAUDE_ALLOWED_TOOLS="${CLAUDE_ALLOWED_TOOLS:-$DEFAULT_CLAUDE_ALLOWED_TOOLS}"
|
|
82
|
-
CLAUDE_PERMISSION_MODE="${CLAUDE_PERMISSION_MODE:-
|
|
88
|
+
CLAUDE_PERMISSION_MODE="${CLAUDE_PERMISSION_MODE:-bypassPermissions}"
|
|
83
89
|
CLAUDE_USE_CONTINUE="${CLAUDE_USE_CONTINUE:-true}"
|
|
84
90
|
PERMISSION_DENIAL_MODE="${PERMISSION_DENIAL_MODE:-$DEFAULT_PERMISSION_DENIAL_MODE}"
|
|
85
91
|
CLAUDE_SESSION_FILE="$RALPH_DIR/.claude_session_id" # Session ID persistence file
|
|
@@ -93,6 +99,14 @@ RALPH_SESSION_HISTORY_FILE="$RALPH_DIR/.ralph_session_history" # Session transi
|
|
|
93
99
|
# Too short = frequent context loss; Too long = stale context causes unpredictable behavior
|
|
94
100
|
CLAUDE_SESSION_EXPIRY_HOURS=${CLAUDE_SESSION_EXPIRY_HOURS:-24}
|
|
95
101
|
|
|
102
|
+
# Quality gates configuration
|
|
103
|
+
TEST_COMMAND="${TEST_COMMAND:-}"
|
|
104
|
+
QUALITY_GATES="${QUALITY_GATES:-}"
|
|
105
|
+
QUALITY_GATE_MODE="${QUALITY_GATE_MODE:-warn}"
|
|
106
|
+
QUALITY_GATE_TIMEOUT="${QUALITY_GATE_TIMEOUT:-120}"
|
|
107
|
+
QUALITY_GATE_ON_COMPLETION_ONLY="${QUALITY_GATE_ON_COMPLETION_ONLY:-false}"
|
|
108
|
+
QUALITY_GATE_RESULTS_FILE="$RALPH_DIR/.quality_gate_results"
|
|
109
|
+
|
|
96
110
|
# Valid tool patterns for --allowed-tools validation
|
|
97
111
|
# Default: Claude Code tools. Platform driver overwrites via driver_valid_tools() in main().
|
|
98
112
|
# Validation runs in main() after load_platform_driver so the correct patterns are in effect.
|
|
@@ -108,6 +122,8 @@ VALID_TOOL_PATTERNS=(
|
|
|
108
122
|
"WebFetch"
|
|
109
123
|
"WebSearch"
|
|
110
124
|
"AskUserQuestion"
|
|
125
|
+
"EnterPlanMode"
|
|
126
|
+
"ExitPlanMode"
|
|
111
127
|
"Bash"
|
|
112
128
|
"Bash(git *)"
|
|
113
129
|
"Bash(npm *)"
|
|
@@ -235,6 +251,11 @@ load_ralphrc() {
|
|
|
235
251
|
[[ "$_CLI_VERBOSE_PROGRESS" == "true" ]] && VERBOSE_PROGRESS="$_cli_VERBOSE_PROGRESS"
|
|
236
252
|
[[ -n "$_env_CB_COOLDOWN_MINUTES" ]] && CB_COOLDOWN_MINUTES="$_env_CB_COOLDOWN_MINUTES"
|
|
237
253
|
[[ -n "$_env_CB_AUTO_RESET" ]] && CB_AUTO_RESET="$_env_CB_AUTO_RESET"
|
|
254
|
+
[[ -n "$_env_TEST_COMMAND" ]] && TEST_COMMAND="$_env_TEST_COMMAND"
|
|
255
|
+
[[ -n "$_env_QUALITY_GATES" ]] && QUALITY_GATES="$_env_QUALITY_GATES"
|
|
256
|
+
[[ -n "$_env_QUALITY_GATE_MODE" ]] && QUALITY_GATE_MODE="$_env_QUALITY_GATE_MODE"
|
|
257
|
+
[[ -n "$_env_QUALITY_GATE_TIMEOUT" ]] && QUALITY_GATE_TIMEOUT="$_env_QUALITY_GATE_TIMEOUT"
|
|
258
|
+
[[ -n "$_env_QUALITY_GATE_ON_COMPLETION_ONLY" ]] && QUALITY_GATE_ON_COMPLETION_ONLY="$_env_QUALITY_GATE_ON_COMPLETION_ONLY"
|
|
238
259
|
|
|
239
260
|
normalize_claude_permission_mode
|
|
240
261
|
RALPHRC_FILE="$config_file"
|
|
@@ -249,7 +270,7 @@ driver_supports_tool_allowlist() {
|
|
|
249
270
|
driver_permission_denial_help() {
|
|
250
271
|
echo " - Review the active driver's permission or approval settings."
|
|
251
272
|
echo " - ALLOWED_TOOLS in $RALPHRC_FILE only applies to the Claude Code driver."
|
|
252
|
-
echo " - Keep CLAUDE_PERMISSION_MODE=
|
|
273
|
+
echo " - Keep CLAUDE_PERMISSION_MODE=bypassPermissions for unattended Claude Code loops."
|
|
253
274
|
echo " - After updating permissions, reset the session and restart the loop."
|
|
254
275
|
}
|
|
255
276
|
|
|
@@ -511,6 +532,17 @@ update_status() {
|
|
|
511
532
|
exit_reason: $exit_reason,
|
|
512
533
|
next_reset: $next_reset
|
|
513
534
|
}' > "$STATUS_FILE"
|
|
535
|
+
|
|
536
|
+
# Merge quality gate status if results exist
|
|
537
|
+
if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
|
|
538
|
+
local qg_tmp="$STATUS_FILE.qg_tmp"
|
|
539
|
+
if jq -s '.[0] * {quality_gates: {overall_status: .[1].overall_status, mode: .[1].mode}}' \
|
|
540
|
+
"$STATUS_FILE" "$QUALITY_GATE_RESULTS_FILE" > "$qg_tmp" 2>/dev/null; then
|
|
541
|
+
mv "$qg_tmp" "$STATUS_FILE"
|
|
542
|
+
else
|
|
543
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
544
|
+
fi
|
|
545
|
+
fi
|
|
514
546
|
}
|
|
515
547
|
|
|
516
548
|
validate_permission_denial_mode() {
|
|
@@ -528,9 +560,34 @@ validate_permission_denial_mode() {
|
|
|
528
560
|
esac
|
|
529
561
|
}
|
|
530
562
|
|
|
563
|
+
validate_quality_gate_mode() {
|
|
564
|
+
local mode=$1
|
|
565
|
+
|
|
566
|
+
case "$mode" in
|
|
567
|
+
warn|block|circuit-breaker)
|
|
568
|
+
return 0
|
|
569
|
+
;;
|
|
570
|
+
*)
|
|
571
|
+
echo "Error: Invalid QUALITY_GATE_MODE: '$mode'"
|
|
572
|
+
echo "Valid modes: warn block circuit-breaker"
|
|
573
|
+
return 1
|
|
574
|
+
;;
|
|
575
|
+
esac
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
validate_quality_gate_timeout() {
|
|
579
|
+
local timeout=$1
|
|
580
|
+
|
|
581
|
+
if [[ ! "$timeout" =~ ^[0-9]+$ ]] || [[ "$timeout" -eq 0 ]]; then
|
|
582
|
+
echo "Error: QUALITY_GATE_TIMEOUT must be a positive integer, got: '$timeout'"
|
|
583
|
+
return 1
|
|
584
|
+
fi
|
|
585
|
+
return 0
|
|
586
|
+
}
|
|
587
|
+
|
|
531
588
|
normalize_claude_permission_mode() {
|
|
532
589
|
if [[ -z "${CLAUDE_PERMISSION_MODE:-}" ]]; then
|
|
533
|
-
CLAUDE_PERMISSION_MODE="
|
|
590
|
+
CLAUDE_PERMISSION_MODE="bypassPermissions"
|
|
534
591
|
fi
|
|
535
592
|
}
|
|
536
593
|
|
|
@@ -726,9 +783,275 @@ wait_for_reset() {
|
|
|
726
783
|
log_status "SUCCESS" "Rate limit reset! Ready for new calls."
|
|
727
784
|
}
|
|
728
785
|
|
|
786
|
+
count_fix_plan_checkboxes() {
|
|
787
|
+
local fix_plan_file="${1:-$RALPH_DIR/@fix_plan.md}"
|
|
788
|
+
local completed_items=0
|
|
789
|
+
local uncompleted_items=0
|
|
790
|
+
local total_items=0
|
|
791
|
+
|
|
792
|
+
if [[ -f "$fix_plan_file" ]]; then
|
|
793
|
+
uncompleted_items=$(grep -cE "^[[:space:]]*- \[ \]" "$fix_plan_file" 2>/dev/null || true)
|
|
794
|
+
[[ -z "$uncompleted_items" ]] && uncompleted_items=0
|
|
795
|
+
completed_items=$(grep -cE "^[[:space:]]*- \[[xX]\]" "$fix_plan_file" 2>/dev/null || true)
|
|
796
|
+
[[ -z "$completed_items" ]] && completed_items=0
|
|
797
|
+
fi
|
|
798
|
+
|
|
799
|
+
total_items=$((completed_items + uncompleted_items))
|
|
800
|
+
printf '%s %s %s\n' "$completed_items" "$uncompleted_items" "$total_items"
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
enforce_fix_plan_progress_tracking() {
|
|
804
|
+
local analysis_file=$1
|
|
805
|
+
local completed_before=$2
|
|
806
|
+
local completed_after=$3
|
|
807
|
+
|
|
808
|
+
if [[ ! -f "$analysis_file" ]]; then
|
|
809
|
+
return 0
|
|
810
|
+
fi
|
|
811
|
+
|
|
812
|
+
local claimed_tasks
|
|
813
|
+
claimed_tasks=$(jq -r '.analysis.tasks_completed_this_loop // 0' "$analysis_file" 2>/dev/null || echo "0")
|
|
814
|
+
if [[ ! "$claimed_tasks" =~ ^-?[0-9]+$ ]]; then
|
|
815
|
+
claimed_tasks=0
|
|
816
|
+
fi
|
|
817
|
+
|
|
818
|
+
local fix_plan_completed_delta=$((completed_after - completed_before))
|
|
819
|
+
local has_progress_tracking_mismatch=false
|
|
820
|
+
if [[ $claimed_tasks -ne $fix_plan_completed_delta || $claimed_tasks -gt 1 || $fix_plan_completed_delta -gt 1 || $fix_plan_completed_delta -lt 0 ]]; then
|
|
821
|
+
has_progress_tracking_mismatch=true
|
|
822
|
+
fi
|
|
823
|
+
|
|
824
|
+
local tmp_file="$analysis_file.tmp"
|
|
825
|
+
if jq \
|
|
826
|
+
--argjson claimed_tasks "$claimed_tasks" \
|
|
827
|
+
--argjson fix_plan_completed_delta "$fix_plan_completed_delta" \
|
|
828
|
+
--argjson has_progress_tracking_mismatch "$has_progress_tracking_mismatch" \
|
|
829
|
+
'
|
|
830
|
+
(.analysis //= {}) |
|
|
831
|
+
.analysis.tasks_completed_this_loop = $claimed_tasks |
|
|
832
|
+
.analysis.fix_plan_completed_delta = $fix_plan_completed_delta |
|
|
833
|
+
.analysis.has_progress_tracking_mismatch = $has_progress_tracking_mismatch |
|
|
834
|
+
if $has_progress_tracking_mismatch then
|
|
835
|
+
.analysis.has_completion_signal = false |
|
|
836
|
+
.analysis.exit_signal = false
|
|
837
|
+
else
|
|
838
|
+
.
|
|
839
|
+
end
|
|
840
|
+
' "$analysis_file" > "$tmp_file" 2>/dev/null; then
|
|
841
|
+
mv "$tmp_file" "$analysis_file"
|
|
842
|
+
else
|
|
843
|
+
rm -f "$tmp_file" 2>/dev/null
|
|
844
|
+
return 0
|
|
845
|
+
fi
|
|
846
|
+
|
|
847
|
+
if [[ "$has_progress_tracking_mismatch" == "true" ]]; then
|
|
848
|
+
log_status "WARN" "Progress tracking mismatch: claimed $claimed_tasks completed task(s) but checkbox delta was $fix_plan_completed_delta. Completion signals suppressed for this loop."
|
|
849
|
+
fi
|
|
850
|
+
|
|
851
|
+
return 0
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
# Run the built-in test gate
|
|
855
|
+
# Reads tests_status from .response_analysis. If FAILING and TEST_COMMAND is set,
|
|
856
|
+
# runs the command to verify. Returns JSON with status/verified/output on stdout.
|
|
857
|
+
run_test_gate() {
|
|
858
|
+
local analysis_file=$1
|
|
859
|
+
|
|
860
|
+
if [[ ! -f "$analysis_file" ]]; then
|
|
861
|
+
echo '{"status":"skip","tests_status_reported":"","verified":false,"output":""}'
|
|
862
|
+
return 0
|
|
863
|
+
fi
|
|
864
|
+
|
|
865
|
+
local tests_status
|
|
866
|
+
tests_status=$(jq -r '.analysis.tests_status // "UNKNOWN"' "$analysis_file" 2>/dev/null || echo "UNKNOWN")
|
|
867
|
+
|
|
868
|
+
if [[ "$tests_status" == "UNKNOWN" && -z "$TEST_COMMAND" ]]; then
|
|
869
|
+
echo '{"status":"skip","tests_status_reported":"UNKNOWN","verified":false,"output":""}'
|
|
870
|
+
return 0
|
|
871
|
+
fi
|
|
872
|
+
|
|
873
|
+
if [[ "$tests_status" == "PASSING" && -z "$TEST_COMMAND" ]]; then
|
|
874
|
+
jq -n --arg ts "$tests_status" '{"status":"pass","tests_status_reported":$ts,"verified":false,"output":""}'
|
|
875
|
+
return 0
|
|
876
|
+
fi
|
|
877
|
+
|
|
878
|
+
if [[ -n "$TEST_COMMAND" ]]; then
|
|
879
|
+
local cmd_output=""
|
|
880
|
+
local cmd_exit=0
|
|
881
|
+
cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$TEST_COMMAND" 2>&1) || cmd_exit=$?
|
|
882
|
+
cmd_output="${cmd_output:0:500}"
|
|
883
|
+
|
|
884
|
+
local verified_status="pass"
|
|
885
|
+
if [[ $cmd_exit -ne 0 ]]; then
|
|
886
|
+
verified_status="fail"
|
|
887
|
+
fi
|
|
888
|
+
|
|
889
|
+
jq -n \
|
|
890
|
+
--arg status "$verified_status" \
|
|
891
|
+
--arg ts "$tests_status" \
|
|
892
|
+
--arg out "$cmd_output" \
|
|
893
|
+
'{"status":$status,"tests_status_reported":$ts,"verified":true,"output":$out}'
|
|
894
|
+
return 0
|
|
895
|
+
fi
|
|
896
|
+
|
|
897
|
+
# No TEST_COMMAND, trust the reported status
|
|
898
|
+
local gate_status="pass"
|
|
899
|
+
if [[ "$tests_status" == "FAILING" ]]; then
|
|
900
|
+
gate_status="fail"
|
|
901
|
+
fi
|
|
902
|
+
|
|
903
|
+
jq -n \
|
|
904
|
+
--arg status "$gate_status" \
|
|
905
|
+
--arg ts "$tests_status" \
|
|
906
|
+
'{"status":$status,"tests_status_reported":$ts,"verified":false,"output":""}'
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
# Run user-defined quality gate commands
|
|
910
|
+
# Splits QUALITY_GATES on semicolons, runs each with portable_timeout.
|
|
911
|
+
# Returns JSON array of results on stdout.
|
|
912
|
+
run_custom_gates() {
|
|
913
|
+
if [[ -z "$QUALITY_GATES" ]]; then
|
|
914
|
+
echo "[]"
|
|
915
|
+
return 0
|
|
916
|
+
fi
|
|
917
|
+
|
|
918
|
+
local results="[]"
|
|
919
|
+
local gates
|
|
920
|
+
IFS=";" read -ra gates <<< "$QUALITY_GATES"
|
|
921
|
+
|
|
922
|
+
for gate_cmd in "${gates[@]}"; do
|
|
923
|
+
gate_cmd=$(echo "$gate_cmd" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
|
924
|
+
[[ -z "$gate_cmd" ]] && continue
|
|
925
|
+
|
|
926
|
+
local cmd_output=""
|
|
927
|
+
local cmd_exit=0
|
|
928
|
+
local start_time
|
|
929
|
+
start_time=$(date +%s)
|
|
930
|
+
local timed_out="false"
|
|
931
|
+
|
|
932
|
+
cmd_output=$(portable_timeout "${QUALITY_GATE_TIMEOUT}s" bash -c "$gate_cmd" 2>&1) || cmd_exit=$?
|
|
933
|
+
|
|
934
|
+
local end_time
|
|
935
|
+
end_time=$(date +%s)
|
|
936
|
+
local duration=$((end_time - start_time))
|
|
937
|
+
|
|
938
|
+
# portable_timeout returns 124 on timeout
|
|
939
|
+
if [[ $cmd_exit -eq 124 ]]; then
|
|
940
|
+
timed_out="true"
|
|
941
|
+
fi
|
|
942
|
+
|
|
943
|
+
cmd_output="${cmd_output:0:500}"
|
|
944
|
+
|
|
945
|
+
local gate_status="pass"
|
|
946
|
+
if [[ $cmd_exit -ne 0 ]]; then
|
|
947
|
+
gate_status="fail"
|
|
948
|
+
fi
|
|
949
|
+
|
|
950
|
+
results=$(echo "$results" | jq \
|
|
951
|
+
--arg cmd "$gate_cmd" \
|
|
952
|
+
--arg status "$gate_status" \
|
|
953
|
+
--argjson exit_code "$cmd_exit" \
|
|
954
|
+
--arg out "$cmd_output" \
|
|
955
|
+
--argjson dur "$duration" \
|
|
956
|
+
--argjson timed_out "$timed_out" \
|
|
957
|
+
'. += [{"command":$cmd,"status":$status,"exit_code":$exit_code,"output":$out,"duration_seconds":$dur,"timed_out":$timed_out}]'
|
|
958
|
+
)
|
|
959
|
+
done
|
|
960
|
+
|
|
961
|
+
echo "$results"
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
# Orchestrator: run all quality gates and write results file
|
|
965
|
+
# Args: loop_number exit_signal_active
|
|
966
|
+
# Returns (on stdout): 0=pass/warn, 1=block failure, 2=circuit-breaker failure
|
|
967
|
+
run_quality_gates() {
|
|
968
|
+
local loop_number=$1
|
|
969
|
+
local exit_signal_active=${2:-"false"}
|
|
970
|
+
|
|
971
|
+
# Skip if no gates configured
|
|
972
|
+
if [[ -z "$TEST_COMMAND" && -z "$QUALITY_GATES" ]]; then
|
|
973
|
+
echo "0"
|
|
974
|
+
return 0
|
|
975
|
+
fi
|
|
976
|
+
|
|
977
|
+
# Skip if completion-only mode and not completing
|
|
978
|
+
if [[ "$QUALITY_GATE_ON_COMPLETION_ONLY" == "true" && "$exit_signal_active" != "true" ]]; then
|
|
979
|
+
echo "0"
|
|
980
|
+
return 0
|
|
981
|
+
fi
|
|
982
|
+
|
|
983
|
+
local test_gate_json
|
|
984
|
+
test_gate_json=$(run_test_gate "$RESPONSE_ANALYSIS_FILE")
|
|
985
|
+
|
|
986
|
+
local custom_gates_json
|
|
987
|
+
custom_gates_json=$(run_custom_gates)
|
|
988
|
+
|
|
989
|
+
# Determine overall status
|
|
990
|
+
local overall_status="pass"
|
|
991
|
+
local test_gate_status
|
|
992
|
+
test_gate_status=$(echo "$test_gate_json" | jq -r '.status' 2>/dev/null || echo "skip")
|
|
993
|
+
if [[ "$test_gate_status" == "fail" ]]; then
|
|
994
|
+
overall_status="fail"
|
|
995
|
+
fi
|
|
996
|
+
|
|
997
|
+
local custom_fail_count
|
|
998
|
+
custom_fail_count=$(echo "$custom_gates_json" | jq '[.[] | select(.status == "fail")] | length' 2>/dev/null || echo "0")
|
|
999
|
+
if [[ $custom_fail_count -gt 0 ]]; then
|
|
1000
|
+
overall_status="fail"
|
|
1001
|
+
fi
|
|
1002
|
+
|
|
1003
|
+
# Write results file atomically (tmp+mv to avoid truncation on jq failure)
|
|
1004
|
+
local qg_tmp="$QUALITY_GATE_RESULTS_FILE.tmp"
|
|
1005
|
+
if jq -n \
|
|
1006
|
+
--arg timestamp "$(get_iso_timestamp)" \
|
|
1007
|
+
--argjson loop_number "$loop_number" \
|
|
1008
|
+
--argjson test_gate "$test_gate_json" \
|
|
1009
|
+
--argjson custom_gates "$custom_gates_json" \
|
|
1010
|
+
--arg overall_status "$overall_status" \
|
|
1011
|
+
--arg mode "$QUALITY_GATE_MODE" \
|
|
1012
|
+
'{
|
|
1013
|
+
timestamp: $timestamp,
|
|
1014
|
+
loop_number: $loop_number,
|
|
1015
|
+
test_gate: $test_gate,
|
|
1016
|
+
custom_gates: $custom_gates,
|
|
1017
|
+
overall_status: $overall_status,
|
|
1018
|
+
mode: $mode
|
|
1019
|
+
}' > "$qg_tmp" 2>/dev/null; then
|
|
1020
|
+
mv "$qg_tmp" "$QUALITY_GATE_RESULTS_FILE"
|
|
1021
|
+
else
|
|
1022
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
1023
|
+
fi
|
|
1024
|
+
|
|
1025
|
+
if [[ "$overall_status" == "fail" ]]; then
|
|
1026
|
+
log_status "WARN" "Quality gate failure (mode=$QUALITY_GATE_MODE): test_gate=$test_gate_status, custom_failures=$custom_fail_count"
|
|
1027
|
+
fi
|
|
1028
|
+
|
|
1029
|
+
# Return code based on mode
|
|
1030
|
+
if [[ "$overall_status" == "pass" ]]; then
|
|
1031
|
+
echo "0"
|
|
1032
|
+
return 0
|
|
1033
|
+
fi
|
|
1034
|
+
|
|
1035
|
+
case "$QUALITY_GATE_MODE" in
|
|
1036
|
+
block)
|
|
1037
|
+
echo "1"
|
|
1038
|
+
return 0
|
|
1039
|
+
;;
|
|
1040
|
+
circuit-breaker)
|
|
1041
|
+
echo "2"
|
|
1042
|
+
return 0
|
|
1043
|
+
;;
|
|
1044
|
+
*)
|
|
1045
|
+
# warn mode: return 0 even on failure
|
|
1046
|
+
echo "0"
|
|
1047
|
+
return 0
|
|
1048
|
+
;;
|
|
1049
|
+
esac
|
|
1050
|
+
}
|
|
1051
|
+
|
|
729
1052
|
# Check if we should gracefully exit
|
|
730
1053
|
should_exit_gracefully() {
|
|
731
|
-
|
|
1054
|
+
|
|
732
1055
|
if [[ ! -f "$EXIT_SIGNALS_FILE" ]]; then
|
|
733
1056
|
return 1 # Don't exit, file doesn't exist
|
|
734
1057
|
fi
|
|
@@ -792,11 +1115,10 @@ should_exit_gracefully() {
|
|
|
792
1115
|
# Fix #144: Only match valid markdown checkboxes, not date entries like [2026-01-29]
|
|
793
1116
|
# Valid patterns: "- [ ]" (uncompleted) and "- [x]" or "- [X]" (completed)
|
|
794
1117
|
if [[ -f "$RALPH_DIR/@fix_plan.md" ]]; then
|
|
795
|
-
local
|
|
796
|
-
|
|
797
|
-
local
|
|
798
|
-
|
|
799
|
-
local total_items=$((uncompleted_items + completed_items))
|
|
1118
|
+
local completed_items=0
|
|
1119
|
+
local uncompleted_items=0
|
|
1120
|
+
local total_items=0
|
|
1121
|
+
read -r completed_items uncompleted_items total_items < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
|
|
800
1122
|
|
|
801
1123
|
if [[ $total_items -gt 0 ]] && [[ $completed_items -eq $total_items ]]; then
|
|
802
1124
|
log_status "WARN" "Exit condition: All @fix_plan.md items completed ($completed_items/$total_items)" >&2
|
|
@@ -901,8 +1223,10 @@ build_loop_context() {
|
|
|
901
1223
|
# Extract incomplete tasks from @fix_plan.md
|
|
902
1224
|
# Bug #3 Fix: Support indented markdown checkboxes with [[:space:]]* pattern
|
|
903
1225
|
if [[ -f "$RALPH_DIR/@fix_plan.md" ]]; then
|
|
904
|
-
local
|
|
905
|
-
|
|
1226
|
+
local completed_tasks=0
|
|
1227
|
+
local incomplete_tasks=0
|
|
1228
|
+
local total_tasks=0
|
|
1229
|
+
read -r completed_tasks incomplete_tasks total_tasks < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
|
|
906
1230
|
context+="Remaining tasks: ${incomplete_tasks}. "
|
|
907
1231
|
fi
|
|
908
1232
|
|
|
@@ -918,7 +1242,28 @@ build_loop_context() {
|
|
|
918
1242
|
if [[ -f "$RESPONSE_ANALYSIS_FILE" ]]; then
|
|
919
1243
|
local prev_summary=$(jq -r '.analysis.work_summary // ""' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null | head -c 200)
|
|
920
1244
|
if [[ -n "$prev_summary" && "$prev_summary" != "null" ]]; then
|
|
921
|
-
context+="Previous: ${prev_summary}"
|
|
1245
|
+
context+="Previous: ${prev_summary}. "
|
|
1246
|
+
fi
|
|
1247
|
+
fi
|
|
1248
|
+
|
|
1249
|
+
# Add quality gate failure feedback (block and circuit-breaker modes only)
|
|
1250
|
+
if [[ -f "$QUALITY_GATE_RESULTS_FILE" ]]; then
|
|
1251
|
+
local qg_status qg_mode
|
|
1252
|
+
qg_status=$(jq -r '.overall_status // "pass"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1253
|
+
qg_mode=$(jq -r '.mode // "warn"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1254
|
+
|
|
1255
|
+
if [[ "$qg_status" == "fail" && "$qg_mode" != "warn" ]]; then
|
|
1256
|
+
local test_gate_status
|
|
1257
|
+
test_gate_status=$(jq -r '.test_gate.status // "skip"' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1258
|
+
if [[ "$test_gate_status" == "fail" ]]; then
|
|
1259
|
+
context+="TESTS FAILING. "
|
|
1260
|
+
fi
|
|
1261
|
+
|
|
1262
|
+
local failed_gates
|
|
1263
|
+
failed_gates=$(jq -r '[.custom_gates[] | select(.status == "fail") | .command | split(" ")[0:2] | join(" ")] | join(", ")' "$QUALITY_GATE_RESULTS_FILE" 2>/dev/null)
|
|
1264
|
+
if [[ -n "$failed_gates" ]]; then
|
|
1265
|
+
context+="QG fail: ${failed_gates}. "
|
|
1266
|
+
fi
|
|
922
1267
|
fi
|
|
923
1268
|
fi
|
|
924
1269
|
|
|
@@ -1031,7 +1376,15 @@ save_claude_session() {
|
|
|
1031
1376
|
# Try to extract session ID from structured output
|
|
1032
1377
|
if [[ -f "$output_file" ]]; then
|
|
1033
1378
|
local session_id
|
|
1034
|
-
|
|
1379
|
+
if declare -F driver_extract_session_id_from_output >/dev/null; then
|
|
1380
|
+
session_id=$(driver_extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
|
|
1381
|
+
fi
|
|
1382
|
+
if [[ -z "$session_id" || "$session_id" == "null" ]]; then
|
|
1383
|
+
session_id=$(extract_session_id_from_output "$output_file" 2>/dev/null || echo "")
|
|
1384
|
+
fi
|
|
1385
|
+
if [[ -z "$session_id" || "$session_id" == "null" ]] && declare -F driver_fallback_session_id >/dev/null; then
|
|
1386
|
+
session_id=$(driver_fallback_session_id "$output_file" 2>/dev/null || echo "")
|
|
1387
|
+
fi
|
|
1035
1388
|
if [[ -n "$session_id" && "$session_id" != "null" ]]; then
|
|
1036
1389
|
echo "$session_id" > "$CLAUDE_SESSION_FILE"
|
|
1037
1390
|
sync_ralph_session_with_driver "$session_id"
|
|
@@ -1410,6 +1763,8 @@ execute_claude_code() {
|
|
|
1410
1763
|
local loop_count=$1
|
|
1411
1764
|
local calls_made=$(cat "$CALL_COUNT_FILE" 2>/dev/null || echo "0")
|
|
1412
1765
|
calls_made=$((calls_made + 1))
|
|
1766
|
+
local fix_plan_completed_before=0
|
|
1767
|
+
read -r fix_plan_completed_before _ _ < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
|
|
1413
1768
|
|
|
1414
1769
|
# Fix #141: Capture git HEAD SHA at loop start to detect commits as progress
|
|
1415
1770
|
# Store in file for access by progress detection after Claude execution
|
|
@@ -1664,12 +2019,36 @@ EOF
|
|
|
1664
2019
|
analyze_response "$output_file" "$loop_count"
|
|
1665
2020
|
local analysis_exit_code=$?
|
|
1666
2021
|
|
|
2022
|
+
local fix_plan_completed_after=0
|
|
2023
|
+
read -r fix_plan_completed_after _ _ < <(count_fix_plan_checkboxes "$RALPH_DIR/@fix_plan.md")
|
|
2024
|
+
enforce_fix_plan_progress_tracking "$RESPONSE_ANALYSIS_FILE" "$fix_plan_completed_before" "$fix_plan_completed_after"
|
|
2025
|
+
|
|
2026
|
+
# Run quality gates
|
|
2027
|
+
local exit_signal_for_gates
|
|
2028
|
+
exit_signal_for_gates=$(jq -r '.analysis.exit_signal // false' "$RESPONSE_ANALYSIS_FILE" 2>/dev/null || echo "false")
|
|
2029
|
+
local qg_result
|
|
2030
|
+
qg_result=$(run_quality_gates "$loop_count" "$exit_signal_for_gates")
|
|
2031
|
+
|
|
2032
|
+
# Block mode: suppress exit signals so the loop keeps running
|
|
2033
|
+
if [[ "$qg_result" == "1" ]]; then
|
|
2034
|
+
log_status "WARN" "Quality gate block: suppressing completion signals"
|
|
2035
|
+
local qg_tmp="$RESPONSE_ANALYSIS_FILE.qg_tmp"
|
|
2036
|
+
if jq '.analysis.has_completion_signal = false | .analysis.exit_signal = false' \
|
|
2037
|
+
"$RESPONSE_ANALYSIS_FILE" > "$qg_tmp" 2>/dev/null; then
|
|
2038
|
+
mv "$qg_tmp" "$RESPONSE_ANALYSIS_FILE"
|
|
2039
|
+
else
|
|
2040
|
+
rm -f "$qg_tmp" 2>/dev/null
|
|
2041
|
+
fi
|
|
2042
|
+
fi
|
|
2043
|
+
|
|
1667
2044
|
# Update exit signals based on analysis
|
|
1668
2045
|
update_exit_signals
|
|
1669
2046
|
|
|
1670
2047
|
# Log analysis summary
|
|
1671
2048
|
log_analysis_summary
|
|
1672
2049
|
|
|
2050
|
+
PENDING_EXIT_REASON=$(should_exit_gracefully)
|
|
2051
|
+
|
|
1673
2052
|
# Get file change count for circuit breaker
|
|
1674
2053
|
# Fix #141: Detect both uncommitted changes AND committed changes
|
|
1675
2054
|
local files_changed=0
|
|
@@ -1730,6 +2109,13 @@ EOF
|
|
|
1730
2109
|
fi
|
|
1731
2110
|
local output_length=$(wc -c < "$output_file" 2>/dev/null || echo 0)
|
|
1732
2111
|
|
|
2112
|
+
# Circuit-breaker mode: override progress signals so circuit breaker sees no-progress
|
|
2113
|
+
if [[ "$qg_result" == "2" ]]; then
|
|
2114
|
+
log_status "WARN" "Quality gate circuit-breaker: overriding progress signals"
|
|
2115
|
+
files_changed=0
|
|
2116
|
+
has_errors="true"
|
|
2117
|
+
fi
|
|
2118
|
+
|
|
1733
2119
|
# Record result in circuit breaker
|
|
1734
2120
|
record_loop_result "$loop_count" "$files_changed" "$has_errors" "$output_length"
|
|
1735
2121
|
local circuit_result=$?
|
|
@@ -1777,6 +2163,18 @@ main() {
|
|
|
1777
2163
|
exit 1
|
|
1778
2164
|
fi
|
|
1779
2165
|
|
|
2166
|
+
if [[ -n "$QUALITY_GATES" || -n "$TEST_COMMAND" ]]; then
|
|
2167
|
+
if ! validate_quality_gate_mode "$QUALITY_GATE_MODE"; then
|
|
2168
|
+
exit 1
|
|
2169
|
+
fi
|
|
2170
|
+
if ! validate_quality_gate_timeout "$QUALITY_GATE_TIMEOUT"; then
|
|
2171
|
+
exit 1
|
|
2172
|
+
fi
|
|
2173
|
+
if ! has_timeout_command; then
|
|
2174
|
+
log_status "WARN" "No timeout command available. Quality gate and test commands will fail. Install coreutils to enable timeout support."
|
|
2175
|
+
fi
|
|
2176
|
+
fi
|
|
2177
|
+
|
|
1780
2178
|
if [[ "$(driver_name)" == "claude-code" ]]; then
|
|
1781
2179
|
normalize_claude_permission_mode
|
|
1782
2180
|
|
|
@@ -1921,6 +2319,21 @@ main() {
|
|
|
1921
2319
|
continue
|
|
1922
2320
|
fi
|
|
1923
2321
|
|
|
2322
|
+
if [[ -n "$PENDING_EXIT_REASON" ]]; then
|
|
2323
|
+
local exit_reason="$PENDING_EXIT_REASON"
|
|
2324
|
+
PENDING_EXIT_REASON=""
|
|
2325
|
+
|
|
2326
|
+
log_status "SUCCESS" "🏁 Graceful exit triggered: $exit_reason"
|
|
2327
|
+
reset_session "project_complete"
|
|
2328
|
+
update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "graceful_exit" "completed" "$exit_reason"
|
|
2329
|
+
|
|
2330
|
+
log_status "SUCCESS" "🎉 Ralph has completed the project! Final stats:"
|
|
2331
|
+
log_status "INFO" " - Total loops: $loop_count"
|
|
2332
|
+
log_status "INFO" " - API calls used: $(cat "$CALL_COUNT_FILE")"
|
|
2333
|
+
log_status "INFO" " - Exit reason: $exit_reason"
|
|
2334
|
+
break
|
|
2335
|
+
fi
|
|
2336
|
+
|
|
1924
2337
|
update_status "$loop_count" "$(cat "$CALL_COUNT_FILE")" "completed" "success"
|
|
1925
2338
|
|
|
1926
2339
|
# Brief pause between successful executions
|
|
@@ -2006,7 +2419,7 @@ Options:
|
|
|
2006
2419
|
Modern CLI Options (Phase 1.1):
|
|
2007
2420
|
--output-format FORMAT Set driver output format: json or text (default: $CLAUDE_OUTPUT_FORMAT)
|
|
2008
2421
|
Note: --live mode requires JSON and will auto-switch
|
|
2009
|
-
--allowed-tools TOOLS Claude Code only. Ignored by codex, cursor, and copilot
|
|
2422
|
+
--allowed-tools TOOLS Claude Code only. Ignored by codex, opencode, cursor, and copilot
|
|
2010
2423
|
--no-continue Disable session continuity across loops
|
|
2011
2424
|
--session-expiry HOURS Set session expiration time in hours (default: $CLAUDE_SESSION_EXPIRY_HOURS)
|
|
2012
2425
|
|
|
@@ -9,16 +9,24 @@ You are Ralph, an autonomous AI development agent working on a [YOUR PROJECT NAM
|
|
|
9
9
|
3. Implement the highest priority item using best practices
|
|
10
10
|
4. Use parallel subagents for complex tasks (max 100 concurrent)
|
|
11
11
|
5. Run tests after each implementation
|
|
12
|
-
6. Update documentation and @fix_plan.md
|
|
12
|
+
6. Update documentation and the completed story checkbox in @fix_plan.md
|
|
13
13
|
|
|
14
14
|
## Key Principles
|
|
15
15
|
- ONE task per loop - focus on the most important thing
|
|
16
16
|
- Search the codebase before assuming something isn't implemented
|
|
17
17
|
- Use subagents for expensive operations (file searching, analysis)
|
|
18
18
|
- Write comprehensive tests with clear documentation
|
|
19
|
-
-
|
|
19
|
+
- Toggle completed story checkboxes in .ralph/@fix_plan.md without rewriting story lines
|
|
20
20
|
- Commit working changes with descriptive messages
|
|
21
21
|
|
|
22
|
+
## Progress Tracking (CRITICAL)
|
|
23
|
+
- Ralph tracks progress by counting story checkboxes in .ralph/@fix_plan.md
|
|
24
|
+
- When you complete a story, change `- [ ]` to `- [x]` on that exact story line
|
|
25
|
+
- Do NOT remove, rewrite, or reorder story lines in .ralph/@fix_plan.md
|
|
26
|
+
- Update the checkbox before committing so the monitor updates immediately
|
|
27
|
+
- Set `TASKS_COMPLETED_THIS_LOOP` to the exact number of story checkboxes toggled this loop
|
|
28
|
+
- Only valid values: 0 or 1
|
|
29
|
+
|
|
22
30
|
## 🧪 Testing Guidelines (CRITICAL)
|
|
23
31
|
- LIMIT testing to ~20% of your total effort per loop
|
|
24
32
|
- PRIORITIZE: Implementation > Documentation > Tests
|
|
@@ -34,6 +42,8 @@ You are Ralph, an autonomous AI development agent working on a [YOUR PROJECT NAM
|
|
|
34
42
|
- Keep .ralph/@AGENT.md updated with build/run instructions
|
|
35
43
|
- Document the WHY behind tests and implementations
|
|
36
44
|
- No placeholder implementations - build it properly
|
|
45
|
+
|
|
46
|
+
## Autonomous Mode (CRITICAL)
|
|
37
47
|
- do not ask the user questions during loop execution
|
|
38
48
|
- do not use AskUserQuestion, EnterPlanMode, or ExitPlanMode during loop execution
|
|
39
49
|
- make the safest reasonable assumption and continue
|
|
@@ -47,7 +57,7 @@ You are Ralph, an autonomous AI development agent working on a [YOUR PROJECT NAM
|
|
|
47
57
|
```
|
|
48
58
|
---RALPH_STATUS---
|
|
49
59
|
STATUS: IN_PROGRESS | COMPLETE | BLOCKED
|
|
50
|
-
TASKS_COMPLETED_THIS_LOOP:
|
|
60
|
+
TASKS_COMPLETED_THIS_LOOP: 0 | 1
|
|
51
61
|
FILES_MODIFIED: <number>
|
|
52
62
|
TESTS_STATUS: PASSING | FAILING | NOT_RUN
|
|
53
63
|
WORK_TYPE: IMPLEMENTATION | TESTING | DOCUMENTATION | REFACTORING
|
|
@@ -71,7 +81,7 @@ Set EXIT_SIGNAL to **true** when ALL of these conditions are met:
|
|
|
71
81
|
```
|
|
72
82
|
---RALPH_STATUS---
|
|
73
83
|
STATUS: IN_PROGRESS
|
|
74
|
-
TASKS_COMPLETED_THIS_LOOP:
|
|
84
|
+
TASKS_COMPLETED_THIS_LOOP: 1
|
|
75
85
|
FILES_MODIFIED: 5
|
|
76
86
|
TESTS_STATUS: PASSING
|
|
77
87
|
WORK_TYPE: IMPLEMENTATION
|
|
@@ -234,7 +244,7 @@ RECOMMENDATION: No remaining work, all .ralph/specs implemented
|
|
|
234
244
|
```
|
|
235
245
|
---RALPH_STATUS---
|
|
236
246
|
STATUS: IN_PROGRESS
|
|
237
|
-
TASKS_COMPLETED_THIS_LOOP:
|
|
247
|
+
TASKS_COMPLETED_THIS_LOOP: 1
|
|
238
248
|
FILES_MODIFIED: 7
|
|
239
249
|
TESTS_STATUS: PASSING
|
|
240
250
|
WORK_TYPE: IMPLEMENTATION
|