bmalph 1.0.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 +217 -0
- package/bin/bmalph.js +14 -0
- package/bmad/bmm/agents/analyst.agent.yaml +36 -0
- package/bmad/bmm/agents/architect.agent.yaml +28 -0
- package/bmad/bmm/agents/dev.agent.yaml +38 -0
- package/bmad/bmm/agents/pm.agent.yaml +46 -0
- package/bmad/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/bmad/bmm/agents/sm.agent.yaml +36 -0
- package/bmad/bmm/agents/tea.agent.yaml +63 -0
- package/bmad/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/bmad/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
- package/bmad/bmm/agents/ux-designer.agent.yaml +26 -0
- package/bmad/bmm/data/project-context-template.md +26 -0
- package/bmad/bmm/module-help.csv +31 -0
- package/bmad/bmm/module.yaml +44 -0
- package/bmad/bmm/sub-modules/claude-code/config.yaml +4 -0
- package/bmad/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/bmad/bmm/sub-modules/claude-code/readme.md +87 -0
- package/bmad/bmm/teams/default-party.csv +21 -0
- package/bmad/bmm/teams/team-fullstack.yaml +12 -0
- package/bmad/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
- package/bmad/bmm/testarch/knowledge/api-request.md +442 -0
- package/bmad/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
- package/bmad/bmm/testarch/knowledge/auth-session.md +552 -0
- package/bmad/bmm/testarch/knowledge/burn-in.md +273 -0
- package/bmad/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/bmad/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/bmad/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/bmad/bmm/testarch/knowledge/data-factories.md +500 -0
- package/bmad/bmm/testarch/knowledge/email-auth.md +721 -0
- package/bmad/bmm/testarch/knowledge/error-handling.md +725 -0
- package/bmad/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/bmad/bmm/testarch/knowledge/file-utils.md +463 -0
- package/bmad/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/bmad/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/bmad/bmm/testarch/knowledge/intercept-network-call.md +430 -0
- package/bmad/bmm/testarch/knowledge/log.md +429 -0
- package/bmad/bmm/testarch/knowledge/network-error-monitor.md +405 -0
- package/bmad/bmm/testarch/knowledge/network-first.md +486 -0
- package/bmad/bmm/testarch/knowledge/network-recorder.md +527 -0
- package/bmad/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/bmad/bmm/testarch/knowledge/overview.md +286 -0
- package/bmad/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/bmad/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/bmad/bmm/testarch/knowledge/recurse.md +421 -0
- package/bmad/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/bmad/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/bmad/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/bmad/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/bmad/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/bmad/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/bmad/bmm/testarch/knowledge/test-quality.md +664 -0
- package/bmad/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/bmad/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/bmad/bmm/testarch/tea-index.csv +35 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/bmad/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/bmad/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/bmad/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/bmad/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
- package/bmad/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/bmad/bmm/workflows/1-analysis/research/workflow.md +173 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/bmad/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/data/domain-complexity.csv +13 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md +197 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/data/project-types.csv +11 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md +191 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md +153 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md +224 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md +226 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md +213 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md +207 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md +226 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md +237 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md +228 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md +231 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md +217 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md +124 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md +247 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md +249 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md +253 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md +168 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md +218 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md +231 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/templates/prd-template.md +10 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +433 -0
- package/bmad/bmm/workflows/2-plan-workflows/prd/workflow.md +150 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/bmad/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/bmad/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/bmad/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
- package/bmad/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/bmad/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/bmad/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
- package/bmad/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/bmad/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
- package/bmad/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
- package/bmad/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/bmad/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
- package/bmad/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/bmad/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
- package/bmad/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/bmad/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/bmad/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
- package/bmad/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
- package/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
- package/bmad/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/bmad/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
- package/bmad/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/bmad/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
- package/bmad/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
- package/bmad/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/data/project-levels.yaml +59 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +191 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/bmad/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/bmad/bmm/workflows/document-project/checklist.md +245 -0
- package/bmad/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/bmad/bmm/workflows/document-project/instructions.md +221 -0
- package/bmad/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/bmad/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/bmad/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/bmad/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/bmad/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/bmad/bmm/workflows/document-project/workflow.yaml +30 -0
- package/bmad/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/bmad/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/bmad/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/bmad/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
- package/bmad/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
- package/bmad/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/bmad/bmm/workflows/testarch/atdd/checklist.md +374 -0
- package/bmad/bmm/workflows/testarch/atdd/instructions.md +806 -0
- package/bmad/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/bmad/bmm/workflows/testarch/automate/checklist.md +582 -0
- package/bmad/bmm/workflows/testarch/automate/instructions.md +1324 -0
- package/bmad/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/bmad/bmm/workflows/testarch/ci/checklist.md +247 -0
- package/bmad/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
- package/bmad/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
- package/bmad/bmm/workflows/testarch/ci/instructions.md +536 -0
- package/bmad/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/bmad/bmm/workflows/testarch/framework/checklist.md +320 -0
- package/bmad/bmm/workflows/testarch/framework/instructions.md +481 -0
- package/bmad/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/bmad/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
- package/bmad/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
- package/bmad/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
- package/bmad/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/bmad/bmm/workflows/testarch/test-design/checklist.md +407 -0
- package/bmad/bmm/workflows/testarch/test-design/instructions.md +1158 -0
- package/bmad/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
- package/bmad/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
- package/bmad/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/bmad/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
- package/bmad/bmm/workflows/testarch/test-review/checklist.md +472 -0
- package/bmad/bmm/workflows/testarch/test-review/instructions.md +628 -0
- package/bmad/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
- package/bmad/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/bmad/bmm/workflows/testarch/trace/checklist.md +642 -0
- package/bmad/bmm/workflows/testarch/trace/instructions.md +1030 -0
- package/bmad/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/bmad/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/bmad/core/agents/bmad-master.agent.yaml +30 -0
- package/bmad/core/module-help.csv +11 -0
- package/bmad/core/module.yaml +25 -0
- package/bmad/core/resources/excalidraw/README.md +160 -0
- package/bmad/core/resources/excalidraw/excalidraw-helpers.md +127 -0
- package/bmad/core/resources/excalidraw/library-loader.md +50 -0
- package/bmad/core/resources/excalidraw/validate-json-instructions.md +79 -0
- package/bmad/core/tasks/bmad-help.md +62 -0
- package/bmad/core/tasks/editorial-review-prose.xml +91 -0
- package/bmad/core/tasks/editorial-review-structure.xml +198 -0
- package/bmad/core/tasks/index-docs.xml +65 -0
- package/bmad/core/tasks/review-adversarial-general.xml +48 -0
- package/bmad/core/tasks/shard-doc.xml +109 -0
- package/bmad/core/tasks/workflow.xml +235 -0
- package/bmad/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/bmad/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/bmad/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/bmad/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/bmad/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/bmad/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/bmad/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/bmad/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/bmad/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/bmad/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/bmad/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/bmad/core/workflows/brainstorming/template.md +15 -0
- package/bmad/core/workflows/brainstorming/workflow.md +58 -0
- package/bmad/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/bmad/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/bmad/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
- package/bmad/core/workflows/party-mode/workflow.md +194 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +26 -0
- package/dist/commands/doctor.d.ts +1 -0
- package/dist/commands/doctor.js +168 -0
- package/dist/commands/guide.d.ts +1 -0
- package/dist/commands/guide.js +19 -0
- package/dist/commands/implement.d.ts +1 -0
- package/dist/commands/implement.js +83 -0
- package/dist/commands/init.d.ts +6 -0
- package/dist/commands/init.js +67 -0
- package/dist/commands/plan.d.ts +5 -0
- package/dist/commands/plan.js +44 -0
- package/dist/commands/reset.d.ts +5 -0
- package/dist/commands/reset.js +35 -0
- package/dist/commands/resume.d.ts +1 -0
- package/dist/commands/resume.js +44 -0
- package/dist/commands/start.d.ts +5 -0
- package/dist/commands/start.js +54 -0
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +53 -0
- package/dist/commands/upgrade.d.ts +1 -0
- package/dist/commands/upgrade.js +34 -0
- package/dist/installer.d.ts +11 -0
- package/dist/installer.js +219 -0
- package/dist/transition.d.ts +52 -0
- package/dist/transition.js +656 -0
- package/dist/utils/config.d.ts +7 -0
- package/dist/utils/config.js +14 -0
- package/dist/utils/json.d.ts +7 -0
- package/dist/utils/json.js +26 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +13 -0
- package/dist/utils/state.d.ts +29 -0
- package/dist/utils/state.js +78 -0
- package/dist/utils/validate.d.ts +4 -0
- package/dist/utils/validate.js +42 -0
- package/package.json +59 -0
- package/ralph/lib/circuit_breaker.sh +330 -0
- package/ralph/lib/date_utils.sh +53 -0
- package/ralph/lib/response_analyzer.sh +768 -0
- package/ralph/lib/timeout_utils.sh +145 -0
- package/ralph/ralph_loop.sh +1391 -0
- package/ralph/templates/AGENT.md +158 -0
- package/ralph/templates/PROMPT.md +292 -0
- package/ralph/templates/fix_plan.md +27 -0
- package/ralph/templates/specs/.gitkeep +2 -0
- package/slash-commands/advanced-elicitation.md +1 -0
- package/slash-commands/adversarial-review.md +1 -0
- package/slash-commands/analyst.md +1 -0
- package/slash-commands/architect.md +1 -0
- package/slash-commands/atdd.md +1 -0
- package/slash-commands/bmad-help.md +1 -0
- package/slash-commands/bmalph-implement.md +152 -0
- package/slash-commands/bmalph.md +1 -0
- package/slash-commands/brainstorm-project.md +1 -0
- package/slash-commands/brainstorming.md +1 -0
- package/slash-commands/continuous-integration.md +1 -0
- package/slash-commands/correct-course.md +1 -0
- package/slash-commands/create-architecture.md +1 -0
- package/slash-commands/create-brief.md +1 -0
- package/slash-commands/create-dataflow.md +1 -0
- package/slash-commands/create-diagram.md +1 -0
- package/slash-commands/create-epics-stories.md +1 -0
- package/slash-commands/create-flowchart.md +1 -0
- package/slash-commands/create-prd.md +1 -0
- package/slash-commands/create-story.md +1 -0
- package/slash-commands/create-ux.md +1 -0
- package/slash-commands/create-wireframe.md +1 -0
- package/slash-commands/dev.md +1 -0
- package/slash-commands/document-project.md +1 -0
- package/slash-commands/domain-research.md +1 -0
- package/slash-commands/editorial-prose.md +1 -0
- package/slash-commands/editorial-structure.md +1 -0
- package/slash-commands/execute-workflow.md +1 -0
- package/slash-commands/implementation-readiness.md +1 -0
- package/slash-commands/index-docs.md +1 -0
- package/slash-commands/market-research.md +1 -0
- package/slash-commands/nfr-assess.md +1 -0
- package/slash-commands/party-mode.md +1 -0
- package/slash-commands/pm.md +1 -0
- package/slash-commands/quick-dev.md +1 -0
- package/slash-commands/quick-flow-solo-dev.md +1 -0
- package/slash-commands/retrospective.md +1 -0
- package/slash-commands/shard-doc.md +1 -0
- package/slash-commands/sm.md +1 -0
- package/slash-commands/sprint-planning.md +1 -0
- package/slash-commands/sprint-status.md +1 -0
- package/slash-commands/tea.md +1 -0
- package/slash-commands/tech-spec.md +1 -0
- package/slash-commands/technical-research.md +1 -0
- package/slash-commands/test-automate.md +1 -0
- package/slash-commands/test-design.md +1 -0
- package/slash-commands/test-framework.md +1 -0
- package/slash-commands/test-review.md +1 -0
- package/slash-commands/test-trace.md +1 -0
- package/slash-commands/ux-designer.md +1 -0
- package/slash-commands/validate-architecture.md +1 -0
- package/slash-commands/validate-brief.md +1 -0
- package/slash-commands/validate-epics-stories.md +1 -0
- package/slash-commands/validate-prd.md +1 -0
- package/slash-commands/validate-story.md +1 -0
- package/slash-commands/validate-test-design.md +1 -0
- package/slash-commands/validate-ux.md +1 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import inquirer from "inquirer";
|
|
3
|
+
import { writeConfig } from "../utils/config.js";
|
|
4
|
+
import { installProject, mergeClaudeMd, isInitialized } from "../installer.js";
|
|
5
|
+
export async function initCommand(options) {
|
|
6
|
+
try {
|
|
7
|
+
await runInit(options);
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
11
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function runInit(options) {
|
|
16
|
+
const projectDir = process.cwd();
|
|
17
|
+
if (await isInitialized(projectDir)) {
|
|
18
|
+
console.log(chalk.yellow("bmalph is already initialized in this project."));
|
|
19
|
+
console.log("Use 'bmalph reset --hard' to reinitialize.");
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
let name = options.name;
|
|
23
|
+
let description = options.description;
|
|
24
|
+
if (!name || !description) {
|
|
25
|
+
const answers = await inquirer.prompt([
|
|
26
|
+
...(name
|
|
27
|
+
? []
|
|
28
|
+
: [
|
|
29
|
+
{
|
|
30
|
+
type: "input",
|
|
31
|
+
name: "name",
|
|
32
|
+
message: "Project name:",
|
|
33
|
+
default: projectDir.split(/[/\\]/).pop(),
|
|
34
|
+
},
|
|
35
|
+
]),
|
|
36
|
+
...(description
|
|
37
|
+
? []
|
|
38
|
+
: [
|
|
39
|
+
{
|
|
40
|
+
type: "input",
|
|
41
|
+
name: "description",
|
|
42
|
+
message: "Project description:",
|
|
43
|
+
},
|
|
44
|
+
]),
|
|
45
|
+
]);
|
|
46
|
+
name = name ?? answers.name;
|
|
47
|
+
description = description ?? answers.description;
|
|
48
|
+
}
|
|
49
|
+
console.log(chalk.blue("\nInstalling BMAD + Ralph..."));
|
|
50
|
+
await installProject(projectDir);
|
|
51
|
+
const config = {
|
|
52
|
+
name: name,
|
|
53
|
+
description: description ?? "",
|
|
54
|
+
createdAt: new Date().toISOString(),
|
|
55
|
+
};
|
|
56
|
+
await writeConfig(projectDir, config);
|
|
57
|
+
await mergeClaudeMd(projectDir);
|
|
58
|
+
console.log(chalk.green("\nbmalph initialized successfully!"));
|
|
59
|
+
console.log(`\n Project: ${chalk.bold(config.name)}`);
|
|
60
|
+
console.log(`\nInstalled:`);
|
|
61
|
+
console.log(` _bmad/ BMAD agents and workflows`);
|
|
62
|
+
console.log(` .ralph/ Ralph loop and templates`);
|
|
63
|
+
console.log(` .claude/commands/ Slash command (/bmalph)`);
|
|
64
|
+
console.log(` bmalph/ State management`);
|
|
65
|
+
console.log(`\nNext step:`);
|
|
66
|
+
console.log(` Use ${chalk.cyan("/bmalph")} in Claude Code to see your current phase and commands.`);
|
|
67
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { readState, writeState, getPhaseInfo } from "../utils/state.js";
|
|
3
|
+
import { isInitialized } from "../installer.js";
|
|
4
|
+
export async function planCommand(options) {
|
|
5
|
+
const projectDir = process.cwd();
|
|
6
|
+
if (!(await isInitialized(projectDir))) {
|
|
7
|
+
console.log(chalk.red("bmalph is not initialized. Run 'bmalph init' first."));
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const phase = options.phase ? parseInt(options.phase, 10) : undefined;
|
|
11
|
+
if (phase !== undefined && (phase < 1 || phase > 3)) {
|
|
12
|
+
console.log(chalk.red("Phase must be 1, 2, or 3. Use 'bmalph implement' for phase 4."));
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const state = await readState(projectDir);
|
|
16
|
+
const activePhase = phase ?? state?.currentPhase ?? 1;
|
|
17
|
+
// Update state
|
|
18
|
+
const now = new Date().toISOString();
|
|
19
|
+
const newState = {
|
|
20
|
+
currentPhase: activePhase,
|
|
21
|
+
status: "planning",
|
|
22
|
+
startedAt: state?.startedAt ?? now,
|
|
23
|
+
lastUpdated: now,
|
|
24
|
+
};
|
|
25
|
+
await writeState(projectDir, newState);
|
|
26
|
+
const info = getPhaseInfo(activePhase);
|
|
27
|
+
console.log(chalk.bold(`\nPhase ${activePhase}: ${info.name}`));
|
|
28
|
+
console.log(chalk.dim(`Agent: ${info.agent}`));
|
|
29
|
+
console.log("");
|
|
30
|
+
if (info.commands.length === 0) {
|
|
31
|
+
console.log("No commands for this phase. Use 'bmalph implement' instead.");
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log("Available commands:");
|
|
35
|
+
console.log("");
|
|
36
|
+
for (const cmd of info.commands) {
|
|
37
|
+
const required = cmd.required ? chalk.yellow(" (required)") : "";
|
|
38
|
+
console.log(` ${chalk.cyan(cmd.code.padEnd(4))} ${cmd.name}${required}`);
|
|
39
|
+
console.log(` ${chalk.dim(cmd.description)}`);
|
|
40
|
+
}
|
|
41
|
+
console.log("");
|
|
42
|
+
console.log(chalk.dim("Load the BMAD master agent, then invoke these commands in Claude Code."));
|
|
43
|
+
console.log(chalk.dim(`When done, advance with: bmalph plan --phase ${activePhase + 1}`));
|
|
44
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { rm } from "fs/promises";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { isInitialized } from "../installer.js";
|
|
5
|
+
export async function resetCommand(options) {
|
|
6
|
+
try {
|
|
7
|
+
await runReset(options);
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
11
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function runReset(options) {
|
|
16
|
+
const projectDir = process.cwd();
|
|
17
|
+
if (!(await isInitialized(projectDir))) {
|
|
18
|
+
console.log(chalk.yellow("bmalph is not initialized in this project."));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
// Always reset state
|
|
22
|
+
await rm(join(projectDir, "bmalph/state"), { recursive: true, force: true });
|
|
23
|
+
console.log(chalk.green("State reset."));
|
|
24
|
+
if (options.hard) {
|
|
25
|
+
await rm(join(projectDir, "_bmad"), { recursive: true, force: true });
|
|
26
|
+
await rm(join(projectDir, ".ralph"), { recursive: true, force: true });
|
|
27
|
+
await rm(join(projectDir, "_bmad-output"), { recursive: true, force: true });
|
|
28
|
+
await rm(join(projectDir, "bmalph"), { recursive: true, force: true });
|
|
29
|
+
console.log(chalk.green("Artifacts removed (_bmad/, .ralph/, _bmad-output/, bmalph/)."));
|
|
30
|
+
console.log("Run 'bmalph init' to reinitialize.");
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.log(chalk.dim("Use --hard to also remove _bmad/, .ralph/, and artifacts."));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function resumeCommand(): Promise<void>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { readPhaseState, getPhaseInfo } from "../utils/state.js";
|
|
5
|
+
import { isInitialized } from "../installer.js";
|
|
6
|
+
export async function resumeCommand() {
|
|
7
|
+
const projectDir = process.cwd();
|
|
8
|
+
if (!(await isInitialized(projectDir))) {
|
|
9
|
+
console.log(chalk.red("bmalph is not initialized. Run 'bmalph init' first."));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
const state = await readPhaseState(projectDir);
|
|
13
|
+
if (!state) {
|
|
14
|
+
console.log(chalk.yellow("No state found. Use 'bmalph start' to begin."));
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
if (state.status === "completed") {
|
|
18
|
+
console.log(chalk.green("All phases completed. Nothing to resume."));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const phaseInfo = getPhaseInfo(state.currentPhase);
|
|
22
|
+
console.log(chalk.blue(`\nResuming Phase ${state.currentPhase} — ${phaseInfo.name} (iteration ${state.iteration})`));
|
|
23
|
+
console.log(` Agent: ${chalk.bold(phaseInfo.agent)}`);
|
|
24
|
+
console.log(` Goal: ${phaseInfo.goal}`);
|
|
25
|
+
console.log(` Outputs: ${phaseInfo.outputs.join(", ")}`);
|
|
26
|
+
console.log(chalk.dim("\nPress Ctrl+C to interrupt.\n"));
|
|
27
|
+
const scriptPath = join(projectDir, "bmalph/bmalph.sh");
|
|
28
|
+
const child = spawn("bash", [scriptPath, String(state.currentPhase)], {
|
|
29
|
+
cwd: projectDir,
|
|
30
|
+
stdio: "inherit",
|
|
31
|
+
env: { ...process.env, BMALPH_PROJECT_DIR: projectDir },
|
|
32
|
+
});
|
|
33
|
+
child.on("close", (code) => {
|
|
34
|
+
if (code === 0) {
|
|
35
|
+
console.log(chalk.green("\nbmalph loop completed."));
|
|
36
|
+
}
|
|
37
|
+
else if (code === 130) {
|
|
38
|
+
console.log(chalk.yellow("\nbmalph loop interrupted."));
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
console.log(chalk.red(`\nbmalph loop exited with code ${code}.`));
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn } from "child_process";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import { readConfig } from "../utils/config.js";
|
|
5
|
+
import { writePhaseState, getPhaseInfo } from "../utils/state.js";
|
|
6
|
+
import { isInitialized } from "../installer.js";
|
|
7
|
+
export async function startCommand(options) {
|
|
8
|
+
const projectDir = process.cwd();
|
|
9
|
+
if (!(await isInitialized(projectDir))) {
|
|
10
|
+
console.log(chalk.red("bmalph is not initialized. Run 'bmalph init' first."));
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
|
13
|
+
const config = await readConfig(projectDir);
|
|
14
|
+
if (!config) {
|
|
15
|
+
console.log(chalk.red("Could not read config. Run 'bmalph init' to reinitialize."));
|
|
16
|
+
process.exit(1);
|
|
17
|
+
}
|
|
18
|
+
const startPhase = options.phase ? parseInt(options.phase, 10) : 1;
|
|
19
|
+
if (startPhase < 1 || startPhase > 4) {
|
|
20
|
+
console.log(chalk.red("Phase must be between 1 and 4."));
|
|
21
|
+
process.exit(1);
|
|
22
|
+
}
|
|
23
|
+
const state = {
|
|
24
|
+
currentPhase: startPhase,
|
|
25
|
+
iteration: 0,
|
|
26
|
+
status: "running",
|
|
27
|
+
startedAt: new Date().toISOString(),
|
|
28
|
+
lastUpdated: new Date().toISOString(),
|
|
29
|
+
};
|
|
30
|
+
await writePhaseState(projectDir, state);
|
|
31
|
+
const phaseInfo = getPhaseInfo(startPhase);
|
|
32
|
+
console.log(chalk.blue(`\nStarting Phase ${startPhase} — ${phaseInfo.name}`));
|
|
33
|
+
console.log(` Agent: ${chalk.bold(phaseInfo.agent)}`);
|
|
34
|
+
console.log(` Goal: ${phaseInfo.goal}`);
|
|
35
|
+
console.log(` Outputs: ${phaseInfo.outputs.join(", ")}`);
|
|
36
|
+
console.log(chalk.dim("\nPress Ctrl+C to interrupt.\n"));
|
|
37
|
+
const scriptPath = join(projectDir, "bmalph/bmalph.sh");
|
|
38
|
+
const child = spawn("bash", [scriptPath, String(startPhase)], {
|
|
39
|
+
cwd: projectDir,
|
|
40
|
+
stdio: "inherit",
|
|
41
|
+
env: { ...process.env, BMALPH_PROJECT_DIR: projectDir },
|
|
42
|
+
});
|
|
43
|
+
child.on("close", (code) => {
|
|
44
|
+
if (code === 0) {
|
|
45
|
+
console.log(chalk.green("\nbmalph loop completed."));
|
|
46
|
+
}
|
|
47
|
+
else if (code === 130) {
|
|
48
|
+
console.log(chalk.yellow("\nbmalph loop interrupted by user."));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
console.log(chalk.red(`\nbmalph loop exited with code ${code}.`));
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function statusCommand(): Promise<void>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { readConfig } from "../utils/config.js";
|
|
3
|
+
import { readState, readRalphStatus, getPhaseLabel } from "../utils/state.js";
|
|
4
|
+
import { isInitialized } from "../installer.js";
|
|
5
|
+
export async function statusCommand() {
|
|
6
|
+
try {
|
|
7
|
+
await runStatus();
|
|
8
|
+
}
|
|
9
|
+
catch (err) {
|
|
10
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
11
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
async function runStatus() {
|
|
16
|
+
const projectDir = process.cwd();
|
|
17
|
+
if (!(await isInitialized(projectDir))) {
|
|
18
|
+
console.log(chalk.red("bmalph is not initialized. Run 'bmalph init' first."));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const config = await readConfig(projectDir);
|
|
22
|
+
const state = await readState(projectDir);
|
|
23
|
+
const ralph = await readRalphStatus(projectDir);
|
|
24
|
+
const phase = state?.currentPhase ?? 1;
|
|
25
|
+
const status = state?.status ?? "planning";
|
|
26
|
+
const lastUpdated = state?.lastUpdated;
|
|
27
|
+
console.log(chalk.bold("Project:") + ` ${config.name}`);
|
|
28
|
+
console.log(chalk.bold("Phase:") + ` ${phase} — ${getPhaseLabel(phase)}`);
|
|
29
|
+
console.log(chalk.bold("Status:") + ` ${status}`);
|
|
30
|
+
if (lastUpdated) {
|
|
31
|
+
const ago = formatTimeAgo(lastUpdated);
|
|
32
|
+
console.log(chalk.bold("Updated:") + ` ${ago}`);
|
|
33
|
+
}
|
|
34
|
+
console.log("");
|
|
35
|
+
console.log(chalk.bold("Ralph:") + ` ${ralph.status}`);
|
|
36
|
+
if (ralph.status !== "not_started") {
|
|
37
|
+
console.log(chalk.dim(` iterations: ${ralph.loopCount}, tasks: ${ralph.tasksCompleted}/${ralph.tasksTotal}`));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function formatTimeAgo(iso) {
|
|
41
|
+
const diff = Date.now() - new Date(iso).getTime();
|
|
42
|
+
const seconds = Math.floor(diff / 1000);
|
|
43
|
+
if (seconds < 60)
|
|
44
|
+
return "just now";
|
|
45
|
+
const minutes = Math.floor(seconds / 60);
|
|
46
|
+
if (minutes < 60)
|
|
47
|
+
return `${minutes} minute${minutes === 1 ? "" : "s"} ago`;
|
|
48
|
+
const hours = Math.floor(minutes / 60);
|
|
49
|
+
if (hours < 24)
|
|
50
|
+
return `${hours} hour${hours === 1 ? "" : "s"} ago`;
|
|
51
|
+
const days = Math.floor(hours / 24);
|
|
52
|
+
return `${days} day${days === 1 ? "" : "s"} ago`;
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function upgradeCommand(): Promise<void>;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import { isInitialized, copyBundledAssets, mergeClaudeMd } from "../installer.js";
|
|
3
|
+
export async function upgradeCommand() {
|
|
4
|
+
try {
|
|
5
|
+
await runUpgrade();
|
|
6
|
+
}
|
|
7
|
+
catch (err) {
|
|
8
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
9
|
+
console.error(chalk.red(`Error: ${message}`));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async function runUpgrade() {
|
|
14
|
+
const projectDir = process.cwd();
|
|
15
|
+
if (!(await isInitialized(projectDir))) {
|
|
16
|
+
console.log(chalk.red("bmalph is not initialized. Run 'bmalph init' first."));
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log(chalk.blue("Upgrading bundled assets..."));
|
|
20
|
+
const result = await copyBundledAssets(projectDir);
|
|
21
|
+
await mergeClaudeMd(projectDir);
|
|
22
|
+
console.log(chalk.green("\nUpdated:"));
|
|
23
|
+
for (const path of result.updatedPaths) {
|
|
24
|
+
console.log(` ${path}`);
|
|
25
|
+
}
|
|
26
|
+
console.log(chalk.dim("\nPreserved:"));
|
|
27
|
+
console.log(" bmalph/config.json");
|
|
28
|
+
console.log(" bmalph/state/");
|
|
29
|
+
console.log(" .ralph/logs/");
|
|
30
|
+
console.log(" .ralph/@fix_plan.md");
|
|
31
|
+
console.log(" .ralph/docs/");
|
|
32
|
+
console.log(" .ralph/specs/");
|
|
33
|
+
console.log(chalk.green("\nUpgrade complete."));
|
|
34
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare function getPackageVersion(): string;
|
|
2
|
+
export declare function getBmadDir(): string;
|
|
3
|
+
export declare function getRalphDir(): string;
|
|
4
|
+
export declare function getSlashCommandsDir(): string;
|
|
5
|
+
export interface UpgradeResult {
|
|
6
|
+
updatedPaths: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function copyBundledAssets(projectDir: string): Promise<UpgradeResult>;
|
|
9
|
+
export declare function installProject(projectDir: string): Promise<void>;
|
|
10
|
+
export declare function mergeClaudeMd(projectDir: string): Promise<void>;
|
|
11
|
+
export declare function isInitialized(projectDir: string): Promise<boolean>;
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { cp, mkdir, readFile, readdir, writeFile, access } from "fs/promises";
|
|
2
|
+
import { readFileSync } from "fs";
|
|
3
|
+
import { join, basename, dirname } from "path";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
6
|
+
const __dirname = dirname(__filename);
|
|
7
|
+
export function getPackageVersion() {
|
|
8
|
+
const pkgPath = join(__dirname, "..", "package.json");
|
|
9
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
|
|
10
|
+
return pkg.version;
|
|
11
|
+
}
|
|
12
|
+
export function getBmadDir() {
|
|
13
|
+
return join(__dirname, "..", "bmad");
|
|
14
|
+
}
|
|
15
|
+
export function getRalphDir() {
|
|
16
|
+
return join(__dirname, "..", "ralph");
|
|
17
|
+
}
|
|
18
|
+
export function getSlashCommandsDir() {
|
|
19
|
+
return join(__dirname, "..", "slash-commands");
|
|
20
|
+
}
|
|
21
|
+
export async function copyBundledAssets(projectDir) {
|
|
22
|
+
const bmadDir = getBmadDir();
|
|
23
|
+
const ralphDir = getRalphDir();
|
|
24
|
+
const slashCommandsDir = getSlashCommandsDir();
|
|
25
|
+
// Validate source directories exist
|
|
26
|
+
try {
|
|
27
|
+
await access(bmadDir);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
throw new Error(`BMAD source directory not found at ${bmadDir}. Package may be corrupted.`);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
await access(ralphDir);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
throw new Error(`Ralph source directory not found at ${ralphDir}. Package may be corrupted.`);
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
await access(slashCommandsDir);
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
throw new Error(`Slash commands directory not found at ${slashCommandsDir}. Package may be corrupted.`);
|
|
43
|
+
}
|
|
44
|
+
// Copy BMAD files → _bmad/
|
|
45
|
+
await cp(bmadDir, join(projectDir, "_bmad"), { recursive: true });
|
|
46
|
+
// Generate combined manifest from module-help.csv files
|
|
47
|
+
await generateManifests(projectDir);
|
|
48
|
+
// Generate _bmad/config.yaml
|
|
49
|
+
const projectName = await deriveProjectName(projectDir);
|
|
50
|
+
await writeFile(join(projectDir, "_bmad/config.yaml"), `# BMAD Configuration - Generated by bmalph
|
|
51
|
+
platform: claude-code
|
|
52
|
+
project_name: ${projectName}
|
|
53
|
+
output_folder: _bmad-output
|
|
54
|
+
user_name: BMad
|
|
55
|
+
communication_language: English
|
|
56
|
+
document_output_language: English
|
|
57
|
+
user_skill_level: intermediate
|
|
58
|
+
planning_artifacts: _bmad-output/planning-artifacts
|
|
59
|
+
implementation_artifacts: _bmad-output/implementation-artifacts
|
|
60
|
+
project_knowledge: docs
|
|
61
|
+
modules:
|
|
62
|
+
- bmm
|
|
63
|
+
`);
|
|
64
|
+
// Copy Ralph templates → .ralph/
|
|
65
|
+
await mkdir(join(projectDir, ".ralph"), { recursive: true });
|
|
66
|
+
await cp(join(ralphDir, "templates/PROMPT.md"), join(projectDir, ".ralph/PROMPT.md"));
|
|
67
|
+
await cp(join(ralphDir, "templates/AGENT.md"), join(projectDir, ".ralph/@AGENT.md"));
|
|
68
|
+
// Copy Ralph loop and lib → .ralph/
|
|
69
|
+
// Add version marker to ralph_loop.sh
|
|
70
|
+
const loopContent = await readFile(join(ralphDir, "ralph_loop.sh"), "utf-8");
|
|
71
|
+
const markerLine = `# bmalph-version: ${getPackageVersion()}`;
|
|
72
|
+
const markedContent = loopContent.includes("# bmalph-version:")
|
|
73
|
+
? loopContent.replace(/# bmalph-version: .+/, markerLine)
|
|
74
|
+
: loopContent.replace(/^(#!.+\r?\n)/, `$1${markerLine}\n`);
|
|
75
|
+
await writeFile(join(projectDir, ".ralph/ralph_loop.sh"), markedContent);
|
|
76
|
+
await cp(join(ralphDir, "lib"), join(projectDir, ".ralph/lib"), { recursive: true });
|
|
77
|
+
// Install all slash commands → .claude/commands/
|
|
78
|
+
await mkdir(join(projectDir, ".claude/commands"), { recursive: true });
|
|
79
|
+
const slashFiles = await readdir(slashCommandsDir);
|
|
80
|
+
for (const file of slashFiles) {
|
|
81
|
+
if (file.endsWith(".md")) {
|
|
82
|
+
await cp(join(slashCommandsDir, file), join(projectDir, ".claude/commands", file));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Update .gitignore
|
|
86
|
+
await updateGitignore(projectDir);
|
|
87
|
+
return {
|
|
88
|
+
updatedPaths: [
|
|
89
|
+
"_bmad/",
|
|
90
|
+
".ralph/ralph_loop.sh",
|
|
91
|
+
".ralph/lib/",
|
|
92
|
+
".ralph/PROMPT.md",
|
|
93
|
+
".ralph/@AGENT.md",
|
|
94
|
+
".claude/commands/",
|
|
95
|
+
".gitignore",
|
|
96
|
+
],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export async function installProject(projectDir) {
|
|
100
|
+
// Create user directories (not overwritten by upgrade)
|
|
101
|
+
await mkdir(join(projectDir, "bmalph/state"), { recursive: true });
|
|
102
|
+
await mkdir(join(projectDir, ".ralph/specs"), { recursive: true });
|
|
103
|
+
await mkdir(join(projectDir, ".ralph/logs"), { recursive: true });
|
|
104
|
+
await mkdir(join(projectDir, ".ralph/docs/generated"), { recursive: true });
|
|
105
|
+
await copyBundledAssets(projectDir);
|
|
106
|
+
}
|
|
107
|
+
async function deriveProjectName(projectDir) {
|
|
108
|
+
try {
|
|
109
|
+
const configPath = join(projectDir, "bmalph/config.json");
|
|
110
|
+
const raw = await readFile(configPath, "utf-8");
|
|
111
|
+
const config = JSON.parse(raw);
|
|
112
|
+
if (config.name)
|
|
113
|
+
return config.name;
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// config.json doesn't exist or is invalid — fall through
|
|
117
|
+
}
|
|
118
|
+
return basename(projectDir);
|
|
119
|
+
}
|
|
120
|
+
async function generateManifests(projectDir) {
|
|
121
|
+
const configDir = join(projectDir, "_bmad/_config");
|
|
122
|
+
await mkdir(configDir, { recursive: true });
|
|
123
|
+
const coreHelpPath = join(projectDir, "_bmad/core/module-help.csv");
|
|
124
|
+
const bmmHelpPath = join(projectDir, "_bmad/bmm/module-help.csv");
|
|
125
|
+
const coreContent = await readFile(coreHelpPath, "utf-8");
|
|
126
|
+
const bmmContent = await readFile(bmmHelpPath, "utf-8");
|
|
127
|
+
// Extract header from core (first line) and data lines from both
|
|
128
|
+
const coreLines = coreContent.trimEnd().split(/\r?\n/);
|
|
129
|
+
const bmmLines = bmmContent.trimEnd().split(/\r?\n/);
|
|
130
|
+
const header = coreLines[0];
|
|
131
|
+
const coreData = coreLines.slice(1).filter((l) => l.trim());
|
|
132
|
+
const bmmData = bmmLines.slice(1).filter((l) => l.trim());
|
|
133
|
+
const combined = [header, ...coreData, ...bmmData].join("\n") + "\n";
|
|
134
|
+
await writeFile(join(configDir, "task-manifest.csv"), combined);
|
|
135
|
+
await writeFile(join(configDir, "workflow-manifest.csv"), combined);
|
|
136
|
+
await writeFile(join(configDir, "bmad-help.csv"), combined);
|
|
137
|
+
}
|
|
138
|
+
async function updateGitignore(projectDir) {
|
|
139
|
+
const gitignorePath = join(projectDir, ".gitignore");
|
|
140
|
+
let existing = "";
|
|
141
|
+
try {
|
|
142
|
+
existing = await readFile(gitignorePath, "utf-8");
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// File doesn't exist, start fresh
|
|
146
|
+
}
|
|
147
|
+
const entries = [".ralph/logs/", "_bmad-output/"];
|
|
148
|
+
const newEntries = entries.filter((e) => !existing.includes(e));
|
|
149
|
+
if (newEntries.length === 0)
|
|
150
|
+
return;
|
|
151
|
+
const suffix = existing.length > 0 && !existing.endsWith("\n")
|
|
152
|
+
? "\n" + newEntries.join("\n") + "\n"
|
|
153
|
+
: newEntries.join("\n") + "\n";
|
|
154
|
+
await writeFile(gitignorePath, existing + suffix);
|
|
155
|
+
}
|
|
156
|
+
export async function mergeClaudeMd(projectDir) {
|
|
157
|
+
const claudeMdPath = join(projectDir, "CLAUDE.md");
|
|
158
|
+
const snippet = `
|
|
159
|
+
## BMAD-METHOD Integration
|
|
160
|
+
|
|
161
|
+
Use \`/bmalph\` to navigate phases. Use \`/bmad-help\` to discover all commands. Use \`/bmalph-status\` for a quick overview.
|
|
162
|
+
|
|
163
|
+
### Phases
|
|
164
|
+
|
|
165
|
+
| Phase | Focus | Key Commands |
|
|
166
|
+
|-------|-------|-------------|
|
|
167
|
+
| 1. Analysis | Understand the problem | \`/create-brief\`, \`/brainstorm-project\`, \`/market-research\` |
|
|
168
|
+
| 2. Planning | Define the solution | \`/create-prd\`, \`/create-ux\` |
|
|
169
|
+
| 3. Solutioning | Design the architecture | \`/create-architecture\`, \`/create-epics-stories\`, \`/implementation-readiness\` |
|
|
170
|
+
| 4. Implementation | Build it | \`/sprint-planning\`, \`/create-story\`, then \`/bmalph-implement\` for Ralph |
|
|
171
|
+
|
|
172
|
+
### Workflow
|
|
173
|
+
|
|
174
|
+
1. Work through Phases 1-3 using BMAD agents and workflows (interactive, command-driven)
|
|
175
|
+
2. Run \`/bmalph-implement\` to transition planning artifacts into Ralph format, then start Ralph
|
|
176
|
+
|
|
177
|
+
### Management Commands
|
|
178
|
+
|
|
179
|
+
| Command | Description |
|
|
180
|
+
|---------|-------------|
|
|
181
|
+
| \`/bmalph-status\` | Show current phase, Ralph progress, version info |
|
|
182
|
+
| \`/bmalph-implement\` | Transition planning artifacts → prepare Ralph loop |
|
|
183
|
+
| \`/bmalph-upgrade\` | Update bundled assets to match current bmalph version |
|
|
184
|
+
| \`/bmalph-doctor\` | Check project health and report issues |
|
|
185
|
+
| \`/bmalph-reset\` | Reset state (soft or hard reset with confirmation) |
|
|
186
|
+
|
|
187
|
+
### Available Agents
|
|
188
|
+
|
|
189
|
+
| Command | Agent | Role |
|
|
190
|
+
|---------|-------|------|
|
|
191
|
+
| \`/analyst\` | Analyst | Research, briefs, discovery |
|
|
192
|
+
| \`/architect\` | Architect | Technical design, architecture |
|
|
193
|
+
| \`/pm\` | Product Manager | PRDs, epics, stories |
|
|
194
|
+
| \`/sm\` | Scrum Master | Sprint planning, status, coordination |
|
|
195
|
+
| \`/dev\` | Developer | Implementation, coding |
|
|
196
|
+
| \`/ux-designer\` | UX Designer | User experience, wireframes |
|
|
197
|
+
| \`/tea\` | Test Engineer | Test design, validation |
|
|
198
|
+
`;
|
|
199
|
+
let existing = "";
|
|
200
|
+
try {
|
|
201
|
+
existing = await readFile(claudeMdPath, "utf-8");
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
// File doesn't exist, that's fine
|
|
205
|
+
}
|
|
206
|
+
if (existing.includes("## BMAD-METHOD Integration")) {
|
|
207
|
+
return; // Already merged
|
|
208
|
+
}
|
|
209
|
+
await writeFile(claudeMdPath, existing + snippet);
|
|
210
|
+
}
|
|
211
|
+
export async function isInitialized(projectDir) {
|
|
212
|
+
try {
|
|
213
|
+
await access(join(projectDir, "bmalph/config.json"));
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface ProjectContext {
|
|
2
|
+
projectGoals: string;
|
|
3
|
+
successMetrics: string;
|
|
4
|
+
architectureConstraints: string;
|
|
5
|
+
technicalRisks: string;
|
|
6
|
+
scopeBoundaries: string;
|
|
7
|
+
targetUsers: string;
|
|
8
|
+
nonFunctionalRequirements: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Story {
|
|
11
|
+
epic: string;
|
|
12
|
+
epicDescription: string;
|
|
13
|
+
id: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
acceptanceCriteria: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function findArtifactsDir(projectDir: string): Promise<string | null>;
|
|
19
|
+
export declare function parseStories(content: string): Story[];
|
|
20
|
+
export declare function generateFixPlan(stories: Story[]): string;
|
|
21
|
+
export declare function generatePrompt(projectName: string): string;
|
|
22
|
+
export interface TechStack {
|
|
23
|
+
setup: string;
|
|
24
|
+
test: string;
|
|
25
|
+
build: string;
|
|
26
|
+
dev: string;
|
|
27
|
+
}
|
|
28
|
+
export declare function detectTechStack(content: string): TechStack | null;
|
|
29
|
+
export declare function customizeAgentMd(template: string, stack: TechStack): string;
|
|
30
|
+
export declare function hasFixPlanProgress(content: string): boolean;
|
|
31
|
+
export interface FixPlanItem {
|
|
32
|
+
id: string;
|
|
33
|
+
completed: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare function parseFixPlan(content: string): FixPlanItem[];
|
|
36
|
+
export declare function mergeFixPlanProgress(newFixPlan: string, completedIds: Set<string>): string;
|
|
37
|
+
export interface SpecsChange {
|
|
38
|
+
file: string;
|
|
39
|
+
status: "added" | "modified" | "removed";
|
|
40
|
+
summary?: string;
|
|
41
|
+
}
|
|
42
|
+
export declare function generateSpecsChangelog(oldSpecsDir: string, newSourceDir: string): Promise<SpecsChange[]>;
|
|
43
|
+
export declare function formatChangelog(changes: SpecsChange[], timestamp: string): string;
|
|
44
|
+
export declare function extractSection(content: string, headingPattern: RegExp, maxLength?: number): string;
|
|
45
|
+
export declare function extractProjectContext(artifacts: Map<string, string>): ProjectContext;
|
|
46
|
+
export declare function generateProjectContextMd(context: ProjectContext, projectName: string): string;
|
|
47
|
+
export declare function validateArtifacts(files: string[], artifactsDir: string): Promise<string[]>;
|
|
48
|
+
export declare function runTransition(projectDir: string): Promise<{
|
|
49
|
+
storiesCount: number;
|
|
50
|
+
warnings: string[];
|
|
51
|
+
fixPlanPreserved: boolean;
|
|
52
|
+
}>;
|