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
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# OpenCode driver for Ralph
|
|
3
|
+
# Uses OpenCode's build agent with JSON event output and optional session resume.
|
|
4
|
+
|
|
5
|
+
driver_name() {
|
|
6
|
+
echo "opencode"
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
driver_display_name() {
|
|
10
|
+
echo "OpenCode"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
driver_cli_binary() {
|
|
14
|
+
echo "opencode"
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
driver_min_version() {
|
|
18
|
+
echo "0.1.0"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
driver_check_available() {
|
|
22
|
+
command -v "$(driver_cli_binary)" &>/dev/null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
driver_valid_tools() {
|
|
26
|
+
VALID_TOOL_PATTERNS=(
|
|
27
|
+
"bash"
|
|
28
|
+
"read"
|
|
29
|
+
"write"
|
|
30
|
+
"edit"
|
|
31
|
+
"grep"
|
|
32
|
+
"question"
|
|
33
|
+
)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
driver_supports_tool_allowlist() {
|
|
37
|
+
return 1
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
driver_permission_denial_help() {
|
|
41
|
+
echo " - $DRIVER_DISPLAY_NAME uses its native permission and approval model."
|
|
42
|
+
echo " - ALLOWED_TOOLS in $RALPHRC_FILE is ignored for this driver."
|
|
43
|
+
echo " - BMAD workflows can use OpenCode's native question tool when needed."
|
|
44
|
+
echo " - Review OpenCode permissions, then restart the loop."
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
driver_build_command() {
|
|
48
|
+
local prompt_file=$1
|
|
49
|
+
local loop_context=$2
|
|
50
|
+
local session_id=$3
|
|
51
|
+
|
|
52
|
+
CLAUDE_CMD_ARGS=("$(driver_cli_binary)" "run" "--agent" "build" "--format" "json")
|
|
53
|
+
|
|
54
|
+
if [[ ! -f "$prompt_file" ]]; then
|
|
55
|
+
echo "ERROR: Prompt file not found: $prompt_file" >&2
|
|
56
|
+
return 1
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if [[ "$CLAUDE_USE_CONTINUE" == "true" && -n "$session_id" ]]; then
|
|
60
|
+
CLAUDE_CMD_ARGS+=("--continue" "--session" "$session_id")
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
local prompt_content
|
|
64
|
+
prompt_content=$(cat "$prompt_file")
|
|
65
|
+
if [[ -n "$loop_context" ]]; then
|
|
66
|
+
prompt_content="$loop_context
|
|
67
|
+
|
|
68
|
+
$prompt_content"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
CLAUDE_CMD_ARGS+=("$prompt_content")
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
driver_supports_sessions() {
|
|
75
|
+
return 0
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
driver_supports_live_output() {
|
|
79
|
+
return 0
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
driver_prepare_live_command() {
|
|
83
|
+
LIVE_CMD_ARGS=("${CLAUDE_CMD_ARGS[@]}")
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
driver_stream_filter() {
|
|
87
|
+
echo 'select((.type == "message.updated" or .type == "message.completed") and .message.role == "assistant") | ([.message.parts[]? | select(.type == "text") | .text] | join("\n"))'
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
driver_extract_session_id_from_output() {
|
|
91
|
+
local output_file=$1
|
|
92
|
+
|
|
93
|
+
if [[ ! -f "$output_file" ]]; then
|
|
94
|
+
echo ""
|
|
95
|
+
return 1
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
local session_id
|
|
99
|
+
session_id=$(sed -n 's/.*"session"[^{]*{[^}]*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' "$output_file" | head -n 1 | tr -d '\r')
|
|
100
|
+
|
|
101
|
+
echo "$session_id"
|
|
102
|
+
[[ -n "$session_id" && "$session_id" != "null" ]]
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
driver_fallback_session_id() {
|
|
106
|
+
local cli_binary
|
|
107
|
+
cli_binary=$(driver_cli_binary)
|
|
108
|
+
|
|
109
|
+
local sessions_json
|
|
110
|
+
sessions_json=$("$cli_binary" session list --format json 2>/dev/null) || {
|
|
111
|
+
echo ""
|
|
112
|
+
return 1
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
local session_ids
|
|
116
|
+
if command -v jq >/dev/null 2>&1; then
|
|
117
|
+
session_ids=$(printf '%s' "$sessions_json" | jq -r '
|
|
118
|
+
if type == "array" then
|
|
119
|
+
[.[]?.id // empty]
|
|
120
|
+
elif (.sessions? | type) == "array" then
|
|
121
|
+
[.sessions[]?.id // empty]
|
|
122
|
+
else
|
|
123
|
+
[]
|
|
124
|
+
end
|
|
125
|
+
| map(select(length > 0))
|
|
126
|
+
| .[]
|
|
127
|
+
' 2>/dev/null | tr -d '\r')
|
|
128
|
+
else
|
|
129
|
+
session_ids=$(printf '%s' "$sessions_json" | grep -oE '"id"[[:space:]]*:[[:space:]]*"[^"]+"' | sed 's/.*"id"[[:space:]]*:[[:space:]]*"\([^"]*\)"/\1/' | tr -d '\r')
|
|
130
|
+
fi
|
|
131
|
+
|
|
132
|
+
local -a session_id_candidates=()
|
|
133
|
+
local session_id
|
|
134
|
+
while IFS= read -r session_id; do
|
|
135
|
+
if [[ -n "$session_id" && "$session_id" != "null" ]]; then
|
|
136
|
+
session_id_candidates+=("$session_id")
|
|
137
|
+
fi
|
|
138
|
+
done <<< "$session_ids"
|
|
139
|
+
|
|
140
|
+
if [[ ${#session_id_candidates[@]} -ne 1 ]]; then
|
|
141
|
+
echo ""
|
|
142
|
+
return 1
|
|
143
|
+
fi
|
|
144
|
+
|
|
145
|
+
echo "${session_id_candidates[0]}"
|
|
146
|
+
return 0
|
|
147
|
+
}
|
|
@@ -97,7 +97,8 @@ contains_permission_denial_signal() {
|
|
|
97
97
|
local line
|
|
98
98
|
while IFS= read -r line; do
|
|
99
99
|
local trimmed="${line#"${line%%[![:space:]]*}"}"
|
|
100
|
-
local normalized
|
|
100
|
+
local normalized
|
|
101
|
+
normalized="$(printf '%s' "$trimmed" | tr '[:upper:]' '[:lower:]')"
|
|
101
102
|
|
|
102
103
|
if permission_denial_line_matches "$normalized"; then
|
|
103
104
|
return 0
|
|
@@ -225,6 +226,35 @@ normalize_cursor_stream_json_response() {
|
|
|
225
226
|
' "$output_file" > "$normalized_file"
|
|
226
227
|
}
|
|
227
228
|
|
|
229
|
+
# Normalize OpenCode JSON event output into the object shape expected downstream.
|
|
230
|
+
normalize_opencode_jsonl_response() {
|
|
231
|
+
local output_file=$1
|
|
232
|
+
local normalized_file=$2
|
|
233
|
+
|
|
234
|
+
jq -rs '
|
|
235
|
+
def assistant_text($message):
|
|
236
|
+
[($message.parts // [])[]? | select(.type == "text") | .text]
|
|
237
|
+
| join("\n");
|
|
238
|
+
|
|
239
|
+
(map(
|
|
240
|
+
select(
|
|
241
|
+
(.type == "message.updated" or .type == "message.completed")
|
|
242
|
+
and (.message.role // "") == "assistant"
|
|
243
|
+
)
|
|
244
|
+
) | last | .message // {}) as $assistant_message
|
|
245
|
+
| {
|
|
246
|
+
result: assistant_text($assistant_message),
|
|
247
|
+
sessionId: (
|
|
248
|
+
map(.session.id // .session_id // .sessionId // empty)
|
|
249
|
+
| map(select(length > 0))
|
|
250
|
+
| first
|
|
251
|
+
// ""
|
|
252
|
+
),
|
|
253
|
+
metadata: {}
|
|
254
|
+
}
|
|
255
|
+
' "$output_file" > "$normalized_file"
|
|
256
|
+
}
|
|
257
|
+
|
|
228
258
|
# Detect whether a multi-document stream matches Codex JSONL events.
|
|
229
259
|
is_codex_jsonl_output() {
|
|
230
260
|
local output_file=$1
|
|
@@ -240,6 +270,25 @@ is_codex_jsonl_output() {
|
|
|
240
270
|
' < "$output_file" 2>/dev/null
|
|
241
271
|
}
|
|
242
272
|
|
|
273
|
+
# Detect whether a multi-document stream matches OpenCode JSON events.
|
|
274
|
+
is_opencode_jsonl_output() {
|
|
275
|
+
local output_file=$1
|
|
276
|
+
|
|
277
|
+
jq -n -j '
|
|
278
|
+
reduce inputs as $item (
|
|
279
|
+
false;
|
|
280
|
+
. or (
|
|
281
|
+
$item.type == "session.created" or
|
|
282
|
+
$item.type == "session.updated" or
|
|
283
|
+
(
|
|
284
|
+
($item.type == "message.updated" or $item.type == "message.completed")
|
|
285
|
+
and ($item.message.role? != null)
|
|
286
|
+
)
|
|
287
|
+
)
|
|
288
|
+
)
|
|
289
|
+
' < "$output_file" 2>/dev/null
|
|
290
|
+
}
|
|
291
|
+
|
|
243
292
|
# Detect whether a multi-document stream matches Cursor stream-json events.
|
|
244
293
|
is_cursor_stream_json_output() {
|
|
245
294
|
local output_file=$1
|
|
@@ -275,6 +324,14 @@ normalize_json_output() {
|
|
|
275
324
|
return $?
|
|
276
325
|
fi
|
|
277
326
|
|
|
327
|
+
local is_opencode_jsonl
|
|
328
|
+
is_opencode_jsonl=$(is_opencode_jsonl_output "$output_file") || return 1
|
|
329
|
+
|
|
330
|
+
if [[ "$is_opencode_jsonl" == "true" ]]; then
|
|
331
|
+
normalize_opencode_jsonl_response "$output_file" "$normalized_file"
|
|
332
|
+
return $?
|
|
333
|
+
fi
|
|
334
|
+
|
|
278
335
|
local is_cursor_stream_json
|
|
279
336
|
is_cursor_stream_json=$(is_cursor_stream_json_output "$output_file") || return 1
|
|
280
337
|
|
|
@@ -372,6 +429,17 @@ detect_output_format() {
|
|
|
372
429
|
return
|
|
373
430
|
fi
|
|
374
431
|
|
|
432
|
+
local is_opencode_jsonl
|
|
433
|
+
is_opencode_jsonl=$(is_opencode_jsonl_output "$output_file") || {
|
|
434
|
+
echo "text"
|
|
435
|
+
return
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
if [[ "$is_opencode_jsonl" == "true" ]]; then
|
|
439
|
+
echo "json"
|
|
440
|
+
return
|
|
441
|
+
fi
|
|
442
|
+
|
|
375
443
|
local is_cursor_stream_json
|
|
376
444
|
is_cursor_stream_json=$(is_cursor_stream_json_output "$output_file") || {
|
|
377
445
|
echo "text"
|
|
@@ -417,6 +485,7 @@ extract_ralph_status_block_json() {
|
|
|
417
485
|
local exit_signal="false"
|
|
418
486
|
local exit_signal_found="false"
|
|
419
487
|
local tasks_completed_this_loop=0
|
|
488
|
+
local tests_status="UNKNOWN"
|
|
420
489
|
local line=""
|
|
421
490
|
local trimmed=""
|
|
422
491
|
local value=""
|
|
@@ -442,6 +511,10 @@ extract_ralph_status_block_json() {
|
|
|
442
511
|
tasks_completed_this_loop=$value
|
|
443
512
|
fi
|
|
444
513
|
;;
|
|
514
|
+
TESTS_STATUS:*)
|
|
515
|
+
value=$(trim_shell_whitespace "${trimmed#TESTS_STATUS:}")
|
|
516
|
+
[[ -n "$value" ]] && tests_status="$value"
|
|
517
|
+
;;
|
|
445
518
|
esac
|
|
446
519
|
done <<< "$block"
|
|
447
520
|
|
|
@@ -450,22 +523,25 @@ extract_ralph_status_block_json() {
|
|
|
450
523
|
--argjson exit_signal_found "$exit_signal_found" \
|
|
451
524
|
--argjson exit_signal "$exit_signal" \
|
|
452
525
|
--argjson tasks_completed_this_loop "$tasks_completed_this_loop" \
|
|
526
|
+
--arg tests_status "$tests_status" \
|
|
453
527
|
'{
|
|
454
528
|
status: $status,
|
|
455
529
|
exit_signal_found: $exit_signal_found,
|
|
456
530
|
exit_signal: $exit_signal,
|
|
457
|
-
tasks_completed_this_loop: $tasks_completed_this_loop
|
|
531
|
+
tasks_completed_this_loop: $tasks_completed_this_loop,
|
|
532
|
+
tests_status: $tests_status
|
|
458
533
|
}'
|
|
459
534
|
}
|
|
460
535
|
|
|
461
536
|
# Parse JSON response and extract structured fields
|
|
462
537
|
# Creates .ralph/.json_parse_result with normalized analysis data
|
|
463
|
-
# Supports
|
|
538
|
+
# Supports SIX JSON formats:
|
|
464
539
|
# 1. Flat format: { status, exit_signal, work_type, files_modified, ... }
|
|
465
540
|
# 2. Claude CLI object format: { result, sessionId, metadata: { files_changed, has_errors, completion_status, ... } }
|
|
466
541
|
# 3. Claude CLI array format: [ {type: "system", ...}, {type: "assistant", ...}, {type: "result", ...} ]
|
|
467
542
|
# 4. Codex JSONL format: {"type":"thread.started",...}\n{"type":"item.completed","item":{...}}
|
|
468
|
-
# 5.
|
|
543
|
+
# 5. OpenCode JSON event format: {"type":"session.created",...}\n{"type":"message.updated",...}
|
|
544
|
+
# 6. Cursor stream-json format: {"type":"assistant",...}\n{"type":"result",...}
|
|
469
545
|
parse_json_response() {
|
|
470
546
|
local output_file=$1
|
|
471
547
|
local result_file="${2:-$RALPH_DIR/.json_parse_result}"
|
|
@@ -503,39 +579,143 @@ parse_json_response() {
|
|
|
503
579
|
output_file="$normalized_file"
|
|
504
580
|
|
|
505
581
|
if [[ "$response_shape" == "jsonl" ]]; then
|
|
506
|
-
if is_codex_jsonl_output "$original_output_file"
|
|
582
|
+
if [[ "$(is_codex_jsonl_output "$original_output_file")" == "true" ]]; then
|
|
507
583
|
response_shape="codex_jsonl"
|
|
584
|
+
elif [[ "$(is_opencode_jsonl_output "$original_output_file")" == "true" ]]; then
|
|
585
|
+
response_shape="opencode_jsonl"
|
|
508
586
|
else
|
|
509
587
|
response_shape="cursor_stream_jsonl"
|
|
510
588
|
fi
|
|
511
589
|
fi
|
|
512
590
|
fi
|
|
513
591
|
|
|
514
|
-
|
|
515
|
-
local
|
|
592
|
+
local has_result_field="false"
|
|
593
|
+
local status="UNKNOWN"
|
|
594
|
+
local completion_status=""
|
|
595
|
+
local exit_signal="false"
|
|
596
|
+
local explicit_exit_signal_found="false"
|
|
597
|
+
local tasks_completed_this_loop=0
|
|
598
|
+
local tests_status="UNKNOWN"
|
|
599
|
+
local result_text=""
|
|
600
|
+
local work_type="UNKNOWN"
|
|
601
|
+
local files_modified=0
|
|
602
|
+
local error_count=0
|
|
603
|
+
local has_errors="false"
|
|
604
|
+
local summary=""
|
|
605
|
+
local session_id=""
|
|
606
|
+
local loop_number=0
|
|
607
|
+
local confidence=0
|
|
608
|
+
local progress_count=0
|
|
609
|
+
local permission_denial_count=0
|
|
610
|
+
local has_permission_denials="false"
|
|
611
|
+
local denied_commands_json="[]"
|
|
612
|
+
|
|
613
|
+
if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "opencode_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]]; then
|
|
614
|
+
local driver_fields=""
|
|
615
|
+
driver_fields=$(jq -r '
|
|
616
|
+
[
|
|
617
|
+
(.result // ""),
|
|
618
|
+
(.sessionId // .metadata.session_id // .session_id // ""),
|
|
619
|
+
((.permission_denials // []) | length),
|
|
620
|
+
((.permission_denials // []) | map(
|
|
621
|
+
if .tool_name == "Bash" then
|
|
622
|
+
"Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))"
|
|
623
|
+
else
|
|
624
|
+
.tool_name // "unknown"
|
|
625
|
+
end
|
|
626
|
+
) | @json)
|
|
627
|
+
] | @tsv
|
|
628
|
+
' "$output_file" 2>/dev/null)
|
|
629
|
+
|
|
630
|
+
local denied_commands_field="[]"
|
|
631
|
+
IFS=$'\t' read -r result_text session_id permission_denial_count denied_commands_field <<< "$driver_fields"
|
|
632
|
+
|
|
633
|
+
has_result_field="true"
|
|
634
|
+
summary="$result_text"
|
|
635
|
+
denied_commands_json="${denied_commands_field:-[]}"
|
|
636
|
+
|
|
637
|
+
if [[ ! "$permission_denial_count" =~ ^-?[0-9]+$ ]]; then
|
|
638
|
+
permission_denial_count=0
|
|
639
|
+
fi
|
|
516
640
|
|
|
517
|
-
|
|
518
|
-
|
|
641
|
+
if [[ $permission_denial_count -gt 0 ]]; then
|
|
642
|
+
has_permission_denials="true"
|
|
643
|
+
fi
|
|
644
|
+
else
|
|
645
|
+
# Detect JSON format by checking for Claude CLI fields
|
|
646
|
+
has_result_field=$(jq -r -j 'has("result")' "$output_file" 2>/dev/null)
|
|
519
647
|
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
local completion_status=$(jq -r -j '.metadata.completion_status // ""' "$output_file" 2>/dev/null)
|
|
523
|
-
if [[ "$completion_status" == "complete" || "$completion_status" == "COMPLETE" ]]; then
|
|
524
|
-
status="COMPLETE"
|
|
525
|
-
fi
|
|
648
|
+
# Extract fields - support both flat format and Claude CLI format
|
|
649
|
+
# Priority: Claude CLI fields first, then flat format fields
|
|
526
650
|
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
tasks_completed_this_loop=0
|
|
534
|
-
fi
|
|
651
|
+
# Status: from flat format OR derived from metadata.completion_status
|
|
652
|
+
status=$(jq -r -j '.status // "UNKNOWN"' "$output_file" 2>/dev/null)
|
|
653
|
+
completion_status=$(jq -r -j '.metadata.completion_status // ""' "$output_file" 2>/dev/null)
|
|
654
|
+
if [[ "$completion_status" == "complete" || "$completion_status" == "COMPLETE" ]]; then
|
|
655
|
+
status="COMPLETE"
|
|
656
|
+
fi
|
|
535
657
|
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
658
|
+
# Exit signal: from flat format OR derived from completion_status
|
|
659
|
+
# Track whether EXIT_SIGNAL was explicitly provided (vs inferred from STATUS)
|
|
660
|
+
exit_signal=$(jq -r -j '.exit_signal // false' "$output_file" 2>/dev/null)
|
|
661
|
+
explicit_exit_signal_found=$(jq -r -j 'has("exit_signal")' "$output_file" 2>/dev/null)
|
|
662
|
+
tasks_completed_this_loop=$(jq -r -j '.tasks_completed_this_loop // 0' "$output_file" 2>/dev/null)
|
|
663
|
+
if [[ ! "$tasks_completed_this_loop" =~ ^-?[0-9]+$ ]]; then
|
|
664
|
+
tasks_completed_this_loop=0
|
|
665
|
+
fi
|
|
666
|
+
|
|
667
|
+
if [[ "$has_result_field" == "true" ]]; then
|
|
668
|
+
result_text=$(jq -r -j '.result // ""' "$output_file" 2>/dev/null)
|
|
669
|
+
fi
|
|
670
|
+
|
|
671
|
+
# Work type: from flat format
|
|
672
|
+
work_type=$(jq -r -j '.work_type // "UNKNOWN"' "$output_file" 2>/dev/null)
|
|
673
|
+
|
|
674
|
+
# Files modified: from flat format OR from metadata.files_changed
|
|
675
|
+
files_modified=$(jq -r -j '.metadata.files_changed // .files_modified // 0' "$output_file" 2>/dev/null)
|
|
676
|
+
|
|
677
|
+
# Error count: from flat format OR derived from metadata.has_errors
|
|
678
|
+
# Note: When only has_errors=true is present (without explicit error_count),
|
|
679
|
+
# we set error_count=1 as a minimum. This is defensive programming since
|
|
680
|
+
# the stuck detection threshold is >5 errors, so 1 error won't trigger it.
|
|
681
|
+
# Actual error count may be higher, but precise count isn't critical for our logic.
|
|
682
|
+
error_count=$(jq -r -j '.error_count // 0' "$output_file" 2>/dev/null)
|
|
683
|
+
has_errors=$(jq -r -j '.metadata.has_errors // false' "$output_file" 2>/dev/null)
|
|
684
|
+
if [[ "$has_errors" == "true" && "$error_count" == "0" ]]; then
|
|
685
|
+
error_count=1 # At least one error if has_errors is true
|
|
686
|
+
fi
|
|
687
|
+
|
|
688
|
+
# Summary: from flat format OR from result field (Claude CLI format)
|
|
689
|
+
summary=$(jq -r -j '.result // .summary // ""' "$output_file" 2>/dev/null)
|
|
690
|
+
|
|
691
|
+
# Session ID: from Claude CLI format (sessionId) OR from metadata.session_id
|
|
692
|
+
session_id=$(jq -r -j '.sessionId // .metadata.session_id // .session_id // ""' "$output_file" 2>/dev/null)
|
|
693
|
+
|
|
694
|
+
# Loop number: from metadata
|
|
695
|
+
loop_number=$(jq -r -j '.metadata.loop_number // .loop_number // 0' "$output_file" 2>/dev/null)
|
|
696
|
+
|
|
697
|
+
# Confidence: from flat format
|
|
698
|
+
confidence=$(jq -r -j '.confidence // 0' "$output_file" 2>/dev/null)
|
|
699
|
+
|
|
700
|
+
# Progress indicators: from Claude CLI metadata (optional)
|
|
701
|
+
progress_count=$(jq -r -j '.metadata.progress_indicators | if . then length else 0 end' "$output_file" 2>/dev/null)
|
|
702
|
+
|
|
703
|
+
# Permission denials: from Claude Code output (Issue #101)
|
|
704
|
+
# When Claude Code is denied permission to run commands, it outputs a permission_denials array
|
|
705
|
+
permission_denial_count=$(jq -r -j '.permission_denials | if . then length else 0 end' "$output_file" 2>/dev/null)
|
|
706
|
+
permission_denial_count=$((permission_denial_count + 0)) # Ensure integer
|
|
707
|
+
|
|
708
|
+
if [[ $permission_denial_count -gt 0 ]]; then
|
|
709
|
+
has_permission_denials="true"
|
|
710
|
+
fi
|
|
711
|
+
|
|
712
|
+
# Extract denied tool names and commands for logging/display
|
|
713
|
+
# Shows tool_name for non-Bash tools, and for Bash tools shows the command that was denied
|
|
714
|
+
# This handles both cases: AskUserQuestion denial shows "AskUserQuestion",
|
|
715
|
+
# while Bash denial shows "Bash(git commit -m ...)" with truncated command
|
|
716
|
+
if [[ $permission_denial_count -gt 0 ]]; then
|
|
717
|
+
denied_commands_json=$(jq -r -j '[.permission_denials[] | if .tool_name == "Bash" then "Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))" else .tool_name // "unknown" end]' "$output_file" 2>/dev/null || echo "[]")
|
|
718
|
+
fi
|
|
539
719
|
fi
|
|
540
720
|
|
|
541
721
|
local ralph_status_json=""
|
|
@@ -548,10 +728,15 @@ parse_json_response() {
|
|
|
548
728
|
embedded_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.status' 2>/dev/null)
|
|
549
729
|
local embedded_tasks_completed
|
|
550
730
|
embedded_tasks_completed=$(printf '%s' "$ralph_status_json" | jq -r -j '.tasks_completed_this_loop' 2>/dev/null)
|
|
731
|
+
local embedded_tests_status
|
|
732
|
+
embedded_tests_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.tests_status' 2>/dev/null)
|
|
551
733
|
|
|
552
734
|
if [[ "$embedded_tasks_completed" =~ ^-?[0-9]+$ ]]; then
|
|
553
735
|
tasks_completed_this_loop=$embedded_tasks_completed
|
|
554
736
|
fi
|
|
737
|
+
if [[ -n "$embedded_tests_status" && "$embedded_tests_status" != "null" ]]; then
|
|
738
|
+
tests_status="$embedded_tests_status"
|
|
739
|
+
fi
|
|
555
740
|
|
|
556
741
|
if [[ "$embedded_exit_signal_found" == "true" ]]; then
|
|
557
742
|
explicit_exit_signal_found="true"
|
|
@@ -563,57 +748,6 @@ parse_json_response() {
|
|
|
563
748
|
fi
|
|
564
749
|
fi
|
|
565
750
|
|
|
566
|
-
# Work type: from flat format
|
|
567
|
-
local work_type=$(jq -r -j '.work_type // "UNKNOWN"' "$output_file" 2>/dev/null)
|
|
568
|
-
|
|
569
|
-
# Files modified: from flat format OR from metadata.files_changed
|
|
570
|
-
local files_modified=$(jq -r -j '.metadata.files_changed // .files_modified // 0' "$output_file" 2>/dev/null)
|
|
571
|
-
|
|
572
|
-
# Error count: from flat format OR derived from metadata.has_errors
|
|
573
|
-
# Note: When only has_errors=true is present (without explicit error_count),
|
|
574
|
-
# we set error_count=1 as a minimum. This is defensive programming since
|
|
575
|
-
# the stuck detection threshold is >5 errors, so 1 error won't trigger it.
|
|
576
|
-
# Actual error count may be higher, but precise count isn't critical for our logic.
|
|
577
|
-
local error_count=$(jq -r -j '.error_count // 0' "$output_file" 2>/dev/null)
|
|
578
|
-
local has_errors=$(jq -r -j '.metadata.has_errors // false' "$output_file" 2>/dev/null)
|
|
579
|
-
if [[ "$has_errors" == "true" && "$error_count" == "0" ]]; then
|
|
580
|
-
error_count=1 # At least one error if has_errors is true
|
|
581
|
-
fi
|
|
582
|
-
|
|
583
|
-
# Summary: from flat format OR from result field (Claude CLI format)
|
|
584
|
-
local summary=$(jq -r -j '.result // .summary // ""' "$output_file" 2>/dev/null)
|
|
585
|
-
|
|
586
|
-
# Session ID: from Claude CLI format (sessionId) OR from metadata.session_id
|
|
587
|
-
local session_id=$(jq -r -j '.sessionId // .metadata.session_id // .session_id // ""' "$output_file" 2>/dev/null)
|
|
588
|
-
|
|
589
|
-
# Loop number: from metadata
|
|
590
|
-
local loop_number=$(jq -r -j '.metadata.loop_number // .loop_number // 0' "$output_file" 2>/dev/null)
|
|
591
|
-
|
|
592
|
-
# Confidence: from flat format
|
|
593
|
-
local confidence=$(jq -r -j '.confidence // 0' "$output_file" 2>/dev/null)
|
|
594
|
-
|
|
595
|
-
# Progress indicators: from Claude CLI metadata (optional)
|
|
596
|
-
local progress_count=$(jq -r -j '.metadata.progress_indicators | if . then length else 0 end' "$output_file" 2>/dev/null)
|
|
597
|
-
|
|
598
|
-
# Permission denials: from Claude Code output (Issue #101)
|
|
599
|
-
# When Claude Code is denied permission to run commands, it outputs a permission_denials array
|
|
600
|
-
local permission_denial_count=$(jq -r -j '.permission_denials | if . then length else 0 end' "$output_file" 2>/dev/null)
|
|
601
|
-
permission_denial_count=$((permission_denial_count + 0)) # Ensure integer
|
|
602
|
-
|
|
603
|
-
local has_permission_denials="false"
|
|
604
|
-
if [[ $permission_denial_count -gt 0 ]]; then
|
|
605
|
-
has_permission_denials="true"
|
|
606
|
-
fi
|
|
607
|
-
|
|
608
|
-
# Extract denied tool names and commands for logging/display
|
|
609
|
-
# Shows tool_name for non-Bash tools, and for Bash tools shows the command that was denied
|
|
610
|
-
# This handles both cases: AskUserQuestion denial shows "AskUserQuestion",
|
|
611
|
-
# while Bash denial shows "Bash(git commit -m ...)" with truncated command
|
|
612
|
-
local denied_commands_json="[]"
|
|
613
|
-
if [[ $permission_denial_count -gt 0 ]]; then
|
|
614
|
-
denied_commands_json=$(jq -r -j '[.permission_denials[] | if .tool_name == "Bash" then "Bash(\(.tool_input.command // "?" | split("\n")[0] | .[0:60]))" else .tool_name // "unknown" end]' "$output_file" 2>/dev/null || echo "[]")
|
|
615
|
-
fi
|
|
616
|
-
|
|
617
751
|
# Heuristic permission-denial matching is limited to the refusal-shaped
|
|
618
752
|
# response preamble, not arbitrary prose or copied logs later in the body.
|
|
619
753
|
if [[ "$has_permission_denials" != "true" ]] && contains_permission_denial_text "$summary"; then
|
|
@@ -626,7 +760,7 @@ parse_json_response() {
|
|
|
626
760
|
# completion markers are absent. This keeps JSONL analysis aligned with text mode.
|
|
627
761
|
local summary_has_completion_keyword="false"
|
|
628
762
|
local summary_has_no_work_pattern="false"
|
|
629
|
-
if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]] && [[ "$explicit_exit_signal_found" != "true" && -n "$summary" ]]; then
|
|
763
|
+
if [[ "$response_shape" == "codex_jsonl" || "$response_shape" == "opencode_jsonl" || "$response_shape" == "cursor_stream_jsonl" ]] && [[ "$explicit_exit_signal_found" != "true" && -n "$summary" ]]; then
|
|
630
764
|
for keyword in "${COMPLETION_KEYWORDS[@]}"; do
|
|
631
765
|
if echo "$summary" | grep -qi "$keyword"; then
|
|
632
766
|
summary_has_completion_keyword="true"
|
|
@@ -709,6 +843,7 @@ parse_json_response() {
|
|
|
709
843
|
--argjson has_permission_denials "$has_permission_denials" \
|
|
710
844
|
--argjson permission_denial_count "$permission_denial_count" \
|
|
711
845
|
--argjson denied_commands "$denied_commands_json" \
|
|
846
|
+
--arg tests_status "$tests_status" \
|
|
712
847
|
'{
|
|
713
848
|
status: $status,
|
|
714
849
|
exit_signal: $exit_signal,
|
|
@@ -722,6 +857,7 @@ parse_json_response() {
|
|
|
722
857
|
session_id: $session_id,
|
|
723
858
|
confidence: $confidence,
|
|
724
859
|
tasks_completed_this_loop: $tasks_completed_this_loop,
|
|
860
|
+
tests_status: $tests_status,
|
|
725
861
|
has_permission_denials: $has_permission_denials,
|
|
726
862
|
permission_denial_count: $permission_denial_count,
|
|
727
863
|
denied_commands: $denied_commands,
|
|
@@ -755,6 +891,7 @@ analyze_response() {
|
|
|
755
891
|
local work_summary=""
|
|
756
892
|
local files_modified=0
|
|
757
893
|
local tasks_completed_this_loop=0
|
|
894
|
+
local tests_status="UNKNOWN"
|
|
758
895
|
|
|
759
896
|
# Read output file
|
|
760
897
|
if [[ ! -f "$output_file" ]]; then
|
|
@@ -781,6 +918,7 @@ analyze_response() {
|
|
|
781
918
|
work_summary=$(jq -r -j '.summary' "$json_parse_result_file" 2>/dev/null || echo "")
|
|
782
919
|
files_modified=$(jq -r -j '.files_modified' "$json_parse_result_file" 2>/dev/null || echo "0")
|
|
783
920
|
tasks_completed_this_loop=$(jq -r -j '.tasks_completed_this_loop // 0' "$json_parse_result_file" 2>/dev/null || echo "0")
|
|
921
|
+
tests_status=$(jq -r -j '.tests_status // "UNKNOWN"' "$json_parse_result_file" 2>/dev/null || echo "UNKNOWN")
|
|
784
922
|
local json_confidence=$(jq -r -j '.confidence' "$json_parse_result_file" 2>/dev/null || echo "0")
|
|
785
923
|
local session_id=$(jq -r -j '.session_id' "$json_parse_result_file" 2>/dev/null || echo "")
|
|
786
924
|
|
|
@@ -863,6 +1001,7 @@ analyze_response() {
|
|
|
863
1001
|
--argjson has_permission_denials "$has_permission_denials" \
|
|
864
1002
|
--argjson permission_denial_count "$permission_denial_count" \
|
|
865
1003
|
--argjson denied_commands "$denied_commands_json" \
|
|
1004
|
+
--arg tests_status "$tests_status" \
|
|
866
1005
|
'{
|
|
867
1006
|
loop_number: $loop_number,
|
|
868
1007
|
timestamp: $timestamp,
|
|
@@ -877,6 +1016,7 @@ analyze_response() {
|
|
|
877
1016
|
confidence_score: $confidence_score,
|
|
878
1017
|
exit_signal: $exit_signal,
|
|
879
1018
|
tasks_completed_this_loop: $tasks_completed_this_loop,
|
|
1019
|
+
tests_status: $tests_status,
|
|
880
1020
|
fix_plan_completed_delta: 0,
|
|
881
1021
|
has_progress_tracking_mismatch: false,
|
|
882
1022
|
work_summary: $work_summary,
|
|
@@ -910,10 +1050,15 @@ analyze_response() {
|
|
|
910
1050
|
exit_sig=$(printf '%s' "$ralph_status_json" | jq -r -j '.exit_signal' 2>/dev/null)
|
|
911
1051
|
local parsed_tasks_completed
|
|
912
1052
|
parsed_tasks_completed=$(printf '%s' "$ralph_status_json" | jq -r -j '.tasks_completed_this_loop' 2>/dev/null)
|
|
1053
|
+
local parsed_tests_status
|
|
1054
|
+
parsed_tests_status=$(printf '%s' "$ralph_status_json" | jq -r -j '.tests_status' 2>/dev/null)
|
|
913
1055
|
|
|
914
1056
|
if [[ "$parsed_tasks_completed" =~ ^-?[0-9]+$ ]]; then
|
|
915
1057
|
tasks_completed_this_loop=$parsed_tasks_completed
|
|
916
1058
|
fi
|
|
1059
|
+
if [[ -n "$parsed_tests_status" && "$parsed_tests_status" != "null" ]]; then
|
|
1060
|
+
tests_status="$parsed_tests_status"
|
|
1061
|
+
fi
|
|
917
1062
|
|
|
918
1063
|
# If EXIT_SIGNAL is explicitly provided, respect it
|
|
919
1064
|
if [[ "$exit_sig_found" == "true" ]]; then
|
|
@@ -1095,6 +1240,7 @@ analyze_response() {
|
|
|
1095
1240
|
--argjson has_permission_denials "$has_permission_denials" \
|
|
1096
1241
|
--argjson permission_denial_count "$permission_denial_count" \
|
|
1097
1242
|
--argjson denied_commands "$denied_commands_json" \
|
|
1243
|
+
--arg tests_status "$tests_status" \
|
|
1098
1244
|
'{
|
|
1099
1245
|
loop_number: $loop_number,
|
|
1100
1246
|
timestamp: $timestamp,
|
|
@@ -1109,6 +1255,7 @@ analyze_response() {
|
|
|
1109
1255
|
confidence_score: $confidence_score,
|
|
1110
1256
|
exit_signal: $exit_signal,
|
|
1111
1257
|
tasks_completed_this_loop: $tasks_completed_this_loop,
|
|
1258
|
+
tests_status: $tests_status,
|
|
1112
1259
|
fix_plan_completed_delta: 0,
|
|
1113
1260
|
has_progress_tracking_mismatch: false,
|
|
1114
1261
|
work_summary: $work_summary,
|
|
@@ -1386,8 +1533,10 @@ export -f detect_output_format
|
|
|
1386
1533
|
export -f count_json_documents
|
|
1387
1534
|
export -f normalize_cli_array_response
|
|
1388
1535
|
export -f normalize_codex_jsonl_response
|
|
1536
|
+
export -f normalize_opencode_jsonl_response
|
|
1389
1537
|
export -f normalize_cursor_stream_json_response
|
|
1390
1538
|
export -f is_codex_jsonl_output
|
|
1539
|
+
export -f is_opencode_jsonl_output
|
|
1391
1540
|
export -f is_cursor_stream_json_output
|
|
1392
1541
|
export -f normalize_json_output
|
|
1393
1542
|
export -f extract_session_id_from_output
|
|
@@ -36,7 +36,7 @@ confirm() {
|
|
|
36
36
|
local response
|
|
37
37
|
|
|
38
38
|
local yn_hint="[y/N]"
|
|
39
|
-
if [[ "$
|
|
39
|
+
if [[ "$default" == [yY] ]]; then
|
|
40
40
|
yn_hint="[Y/n]"
|
|
41
41
|
fi
|
|
42
42
|
|
|
@@ -50,11 +50,11 @@ confirm() {
|
|
|
50
50
|
response="$default"
|
|
51
51
|
fi
|
|
52
52
|
|
|
53
|
-
case "$
|
|
54
|
-
|
|
53
|
+
case "$response" in
|
|
54
|
+
[yY]|[yY][eE][sS])
|
|
55
55
|
return 0
|
|
56
56
|
;;
|
|
57
|
-
|
|
57
|
+
[nN]|[nN][oO])
|
|
58
58
|
return 1
|
|
59
59
|
;;
|
|
60
60
|
*)
|