bmad-method 6.0.0-alpha.13 → 6.0.0-alpha.15
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/.coderabbit.yaml +36 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +1 -1
- package/.github/scripts/discord-helpers.sh +15 -0
- package/.github/workflows/discord.yaml +278 -8
- package/.github/workflows/quality.yaml +19 -0
- package/.markdownlint-cli2.yaml +42 -0
- package/.prettierignore +3 -0
- package/CHANGELOG.md +183 -360
- package/README.md +4 -1
- package/docs/agent-customization-guide.md +2 -2
- package/docs/custom-content-installation.md +245 -0
- package/docs/document-sharding-guide.md +1 -1
- package/docs/index.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
- package/docs/web-bundles-gemini-gpt-guide.md +1 -1
- package/eslint.config.mjs +14 -0
- package/example-custom-content/README.md +8 -0
- package/{custom/src → example-custom-content}/agents/commit-poet/commit-poet.agent.yaml +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/instructions.md +5 -5
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/memories.md +1 -1
- package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith.agent.yaml +18 -17
- package/example-custom-content/module.yaml +4 -0
- package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +168 -0
- package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +155 -0
- package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +89 -0
- package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +36 -0
- package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +150 -0
- package/example-custom-content/workflows/quiz-master/templates/csv-headers.template +1 -0
- package/example-custom-content/workflows/quiz-master/workflow.md +54 -0
- package/example-custom-content/workflows/wassup/workflow.md +26 -0
- package/example-custom-module/mwm/README.md +9 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md +47 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md +17 -0
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +151 -0
- package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +138 -0
- package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +138 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md +13 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md +30 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md +13 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md +17 -0
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +125 -0
- package/example-custom-module/mwm/module.yaml +28 -0
- package/example-custom-module/mwm/workflows/cbt-thought-record/README.md +31 -0
- package/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/crisis-support/README.md +31 -0
- package/example-custom-module/mwm/workflows/crisis-support/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/daily-checkin/README.md +32 -0
- package/example-custom-module/mwm/workflows/daily-checkin/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/guided-meditation/README.md +31 -0
- package/example-custom-module/mwm/workflows/guided-meditation/workflow.md +45 -0
- package/example-custom-module/mwm/workflows/wellness-journal/README.md +31 -0
- package/example-custom-module/mwm/workflows/wellness-journal/workflow.md +45 -0
- package/package.json +9 -4
- package/src/core/_module-installer/installer.js +1 -1
- package/src/core/{_module-installer/install-config.yaml → module.yaml} +5 -1
- package/src/core/resources/excalidraw/library-loader.md +2 -2
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +1 -1
- package/src/core/workflows/brainstorming/workflow.md +1 -1
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +0 -1
- package/src/core/workflows/party-mode/workflow.md +2 -3
- package/src/modules/bmb/README.md +1 -1
- package/src/modules/bmb/_module-installer/installer.js +76 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +32 -9
- package/src/modules/bmb/docs/agents/agent-menu-patterns.md +5 -5
- package/src/modules/bmb/docs/agents/expert-agent-architecture.md +20 -20
- package/src/modules/bmb/docs/agents/index.md +1 -1
- package/src/modules/bmb/docs/agents/module-agent-architecture.md +45 -45
- package/src/modules/bmb/docs/agents/simple-agent-architecture.md +7 -3
- package/src/modules/bmb/docs/workflows/architecture.md +1 -1
- package/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -0
- package/src/modules/bmb/docs/workflows/templates/step-1b-template.md +223 -0
- package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/step-file.md +4 -4
- package/src/modules/bmb/docs/workflows/{step-template.md → templates/step-template.md} +40 -33
- package/src/modules/bmb/docs/workflows/templates/workflow-template.md +104 -0
- package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/workflow.md +1 -1
- package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +4 -9
- package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md +4 -4
- package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +8 -8
- package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +6 -6
- package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +2 -3
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +10 -40
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +1 -0
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +2 -2
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
- package/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +16 -4
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +4 -4
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +7 -7
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +1 -1
- package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +6 -6
- package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +2 -2
- package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +2 -2
- package/src/modules/bmb/workflows/create-agent/workflow.md +11 -11
- package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +155 -0
- package/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +169 -0
- package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +217 -0
- package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +267 -0
- package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +228 -0
- package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +233 -0
- package/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +296 -0
- package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +228 -0
- package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +186 -0
- package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +309 -0
- package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +337 -0
- package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +335 -0
- package/src/modules/bmb/workflows/create-module/templates/agent.template.md +317 -0
- package/src/modules/bmb/workflows/create-module/templates/installer.template.js +47 -0
- package/src/modules/bmb/workflows/create-module/templates/module-plan.template.md +5 -0
- package/src/modules/bmb/workflows/create-module/templates/module.template.yaml +53 -0
- package/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -0
- package/src/modules/bmb/workflows/create-module/validation.md +126 -0
- package/src/modules/bmb/workflows/create-module/workflow.md +55 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +45 -56
- package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +9 -31
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +250 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +216 -0
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +289 -0
- package/src/modules/bmb/workflows/create-workflow/steps/{step-09-design.md → step-06-design.md} +76 -44
- package/src/modules/bmb/workflows/create-workflow/steps/{step-11-build.md → step-07-build.md} +71 -25
- package/src/modules/bmb/workflows/create-workflow/steps/{step-12-review.md → step-08-review.md} +30 -16
- package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +187 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +14 -14
- package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +4 -4
- package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +4 -4
- package/src/modules/bmb/workflows/edit-agent/workflow.md +1 -1
- package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +2 -6
- package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +2 -2
- package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +1 -1
- package/src/modules/bmb/workflows/edit-workflow/workflow.md +1 -1
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +2 -2
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +5 -5
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +7 -7
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +2 -2
- package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +1 -1
- package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +0 -1
- package/src/modules/bmgd/README.md +2 -1
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +8 -8
- package/src/modules/bmm/_module-installer/installer.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +11 -8
- package/src/modules/bmm/agents/architect.agent.yaml +1 -5
- package/src/modules/bmm/agents/pm.agent.yaml +5 -5
- package/src/modules/bmm/docs/README.md +23 -1
- package/src/modules/bmm/docs/agents-guide.md +16 -35
- package/src/modules/bmm/docs/brownfield-guide.md +17 -30
- package/src/modules/bmm/docs/enterprise-agentic-development.md +2 -2
- package/src/modules/bmm/docs/faq.md +6 -39
- package/src/modules/bmm/docs/glossary.md +11 -24
- package/src/modules/bmm/docs/images/README.md +37 -0
- package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +62 -202
- package/src/modules/bmm/docs/images/workflow-method-greenfield.svg +3 -1
- package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
- package/src/modules/bmm/docs/quick-start.md +9 -25
- package/src/modules/bmm/docs/test-architecture.md +6 -6
- package/src/modules/bmm/docs/troubleshooting.md +680 -0
- package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
- package/src/modules/bmm/docs/workflows-implementation.md +143 -3
- package/src/modules/bmm/docs/workflows-solutioning.md +2 -2
- package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +1 -1
- package/src/modules/bmm/tasks/daily-standup.xml +85 -0
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +1 -1
- package/src/modules/bmm/testarch/knowledge/overview.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +8 -8
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +18 -18
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +17 -17
- package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +35 -36
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +5 -6
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +16 -15
- package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +36 -37
- package/src/modules/bmm/workflows/1-analysis/research/research.template.md +0 -1
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +8 -8
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +19 -18
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +20 -19
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +21 -20
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +19 -18
- package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +38 -39
- package/src/modules/bmm/workflows/1-analysis/research/workflow.md +14 -8
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +6 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +7 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +138 -56
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +93 -51
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +223 -78
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +20 -2
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +21 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +18 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +13 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +14 -14
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +7 -7
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +2 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +258 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +232 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +271 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +144 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-01-document-discovery.md +189 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-02-prd-analysis.md +177 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-03-epic-coverage-validation.md +178 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-04-ux-alignment.md +138 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-05-epic-quality-review.md +251 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-06-final-assessment.md +132 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.md +54 -0
- package/src/modules/{bmgd/workflows/4-production → bmm/workflows/4-implementation}/code-review/checklist.md +2 -1
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +51 -3
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +1 -1
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +32 -2
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +3 -3
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +19 -21
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +10 -10
- package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +174 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +35 -0
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/instructions.md +104 -7
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +4 -0
- package/src/modules/bmm/workflows/document-project/instructions.md +1 -1
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +2 -2
- package/src/modules/bmm/workflows/generate-project-context/workflow.md +1 -1
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +1 -1
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +1 -1
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +36 -3
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +25 -4
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +1 -1
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +1 -6
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +1 -7
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/tools/cli/README.md +7 -7
- package/tools/cli/commands/build.js +9 -184
- package/tools/cli/commands/install.js +1 -6
- package/tools/cli/installers/lib/core/config-collector.js +80 -12
- package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
- package/tools/cli/installers/lib/core/detector.js +8 -4
- package/tools/cli/installers/lib/core/installer.js +933 -376
- package/tools/cli/installers/lib/core/manifest-generator.js +265 -41
- package/tools/cli/installers/lib/core/manifest.js +47 -0
- package/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +79 -0
- package/tools/cli/installers/lib/custom/handler.js +396 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +10 -0
- package/tools/cli/installers/lib/ide/auggie.js +19 -7
- package/tools/cli/installers/lib/ide/crush.js +19 -6
- package/tools/cli/installers/lib/ide/cursor.js +29 -13
- package/tools/cli/installers/lib/ide/gemini.js +49 -1
- package/tools/cli/installers/lib/ide/iflow.js +20 -1
- package/tools/cli/installers/lib/ide/kiro-cli.js +327 -0
- package/tools/cli/installers/lib/ide/opencode.js +3 -3
- package/tools/cli/installers/lib/ide/roo.js +120 -184
- package/tools/cli/installers/lib/ide/rovo-dev.js +1 -1
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +8 -2
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +34 -19
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +18 -14
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/modules/manager.js +535 -56
- package/tools/cli/lib/agent/compiler.js +57 -16
- package/tools/cli/lib/agent/installer.js +129 -28
- package/tools/cli/lib/cli-utils.js +21 -4
- package/tools/cli/lib/config.js +2 -1
- package/tools/cli/lib/ui.js +561 -12
- package/tools/cli/lib/yaml-xml-builder.js +0 -15
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/schema/agent.js +149 -89
- package/tools/validate-svg-changes.sh +356 -0
- package/custom/src/agents/commit-poet/installation-guide.md +0 -36
- package/custom/src/agents/toolsmith/installation-guide.md +0 -36
- package/docs/custom-agent-installation.md +0 -183
- package/src/modules/bmb/docs/workflows/workflow-template.md +0 -152
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-overview.md +0 -127
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-core-tools.md +0 -145
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-memory-requirements.md +0 -136
- package/src/modules/bmb/workflows/create-workflow/steps/step-06-external-tools.md +0 -154
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-installation-guidance.md +0 -159
- package/src/modules/bmb/workflows/create-workflow/steps/step-08-tools-summary.md +0 -167
- package/src/modules/bmb/workflows/create-workflow/steps/step-10-plan-review.md +0 -215
- package/src/modules/bmb/workflows/create-workflow/templates/build-summary.md +0 -36
- package/src/modules/bmb/workflows/create-workflow/templates/completion-section.md +0 -39
- package/src/modules/bmb/workflows/create-workflow/templates/content-template.md +0 -21
- package/src/modules/bmb/workflows/create-workflow/templates/design-section.md +0 -53
- package/src/modules/bmb/workflows/create-workflow/templates/project-info.md +0 -18
- package/src/modules/bmb/workflows/create-workflow/templates/requirements-section.md +0 -47
- package/src/modules/bmb/workflows/create-workflow/templates/review-section.md +0 -56
- package/src/modules/bmb/workflows/create-workflow/templates/workflow-plan.md +0 -54
- package/src/modules/bmb/workflows-legacy/create-module/README.md +0 -229
- package/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md +0 -137
- package/src/modules/bmb/workflows-legacy/create-module/checklist.md +0 -235
- package/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml +0 -92
- package/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js +0 -231
- package/src/modules/bmb/workflows-legacy/create-module/instructions.md +0 -577
- package/src/modules/bmb/workflows-legacy/create-module/module-structure.md +0 -400
- package/src/modules/bmb/workflows-legacy/create-module/workflow.yaml +0 -52
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/epics-template.md +0 -80
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/instructions.md +0 -387
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.yaml +0 -53
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +0 -169
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +0 -332
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +0 -64
- package/tools/cli/commands/agent-install.js +0 -409
- package/tools/cli/commands/cleanup.js +0 -141
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -0
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -0
- /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -0
- /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
- /package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -0
|
@@ -15,6 +15,8 @@ variables:
|
|
|
15
15
|
npm_config_cache: "$CI_PROJECT_DIR/.npm"
|
|
16
16
|
# Playwright browser cache
|
|
17
17
|
PLAYWRIGHT_BROWSERS_PATH: "$CI_PROJECT_DIR/.cache/ms-playwright"
|
|
18
|
+
# Default Node version when .nvmrc is missing
|
|
19
|
+
DEFAULT_NODE_VERSION: "24"
|
|
18
20
|
|
|
19
21
|
# Caching configuration
|
|
20
22
|
cache:
|
|
@@ -29,19 +31,32 @@ cache:
|
|
|
29
31
|
# Lint stage - Code quality checks
|
|
30
32
|
lint:
|
|
31
33
|
stage: lint
|
|
32
|
-
image: node
|
|
33
|
-
|
|
34
|
+
image: node:$DEFAULT_NODE_VERSION
|
|
35
|
+
before_script:
|
|
36
|
+
- |
|
|
37
|
+
NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
|
|
38
|
+
echo "Using Node $NODE_VERSION"
|
|
39
|
+
npm install -g n
|
|
40
|
+
n "$NODE_VERSION"
|
|
41
|
+
node -v
|
|
34
42
|
- npm ci
|
|
43
|
+
script:
|
|
35
44
|
- npm run lint
|
|
36
45
|
timeout: 5 minutes
|
|
37
46
|
|
|
38
47
|
# Test stage - Parallel execution with sharding
|
|
39
48
|
.test-template: &test-template
|
|
40
49
|
stage: test
|
|
41
|
-
image: node
|
|
50
|
+
image: node:$DEFAULT_NODE_VERSION
|
|
42
51
|
needs:
|
|
43
52
|
- lint
|
|
44
53
|
before_script:
|
|
54
|
+
- |
|
|
55
|
+
NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
|
|
56
|
+
echo "Using Node $NODE_VERSION"
|
|
57
|
+
npm install -g n
|
|
58
|
+
n "$NODE_VERSION"
|
|
59
|
+
node -v
|
|
45
60
|
- npm ci
|
|
46
61
|
- npx playwright install --with-deps chromium
|
|
47
62
|
artifacts:
|
|
@@ -75,7 +90,7 @@ test:shard-4:
|
|
|
75
90
|
# Burn-in stage - Flaky test detection
|
|
76
91
|
burn-in:
|
|
77
92
|
stage: burn-in
|
|
78
|
-
image: node
|
|
93
|
+
image: node:$DEFAULT_NODE_VERSION
|
|
79
94
|
needs:
|
|
80
95
|
- test:shard-1
|
|
81
96
|
- test:shard-2
|
|
@@ -86,6 +101,12 @@ burn-in:
|
|
|
86
101
|
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
|
|
87
102
|
- if: '$CI_PIPELINE_SOURCE == "schedule"'
|
|
88
103
|
before_script:
|
|
104
|
+
- |
|
|
105
|
+
NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
|
|
106
|
+
echo "Using Node $NODE_VERSION"
|
|
107
|
+
npm install -g n
|
|
108
|
+
n "$NODE_VERSION"
|
|
109
|
+
node -v
|
|
89
110
|
- npm ci
|
|
90
111
|
- npx playwright install --with-deps chromium
|
|
91
112
|
script:
|
|
@@ -61,8 +61,8 @@ Scaffolds a production-ready CI/CD quality pipeline with test execution, burn-in
|
|
|
61
61
|
- Ask user if unable to auto-detect
|
|
62
62
|
|
|
63
63
|
5. **Read Environment Configuration**
|
|
64
|
-
-
|
|
65
|
-
-
|
|
64
|
+
- Use `.nvmrc` for Node version if present
|
|
65
|
+
- If missing, default to a current LTS (Node 24) or newer instead of a fixed old version
|
|
66
66
|
- Read `package.json` to identify dependencies (affects caching strategy)
|
|
67
67
|
|
|
68
68
|
**Halt Condition:** If preflight checks fail, stop immediately and report which requirement failed.
|
|
@@ -524,7 +524,7 @@ await expect(page.locator('[data-testid="user-menu"]')).toBeVisible({ timeout: 1
|
|
|
524
524
|
### 1. Use Data Factory for Test User (Lines 23, 32, 41)
|
|
525
525
|
|
|
526
526
|
**Severity**: P1 (High)
|
|
527
|
-
**Issue**: Hardcoded email
|
|
527
|
+
**Issue**: Hardcoded email `test@example.com` - maintainability risk
|
|
528
528
|
**Fix**: Create factory function for test users
|
|
529
529
|
**Knowledge**: See data-factories.md
|
|
530
530
|
|
|
@@ -56,11 +56,6 @@ phases:
|
|
|
56
56
|
output: "Enterprise PRD with compliance requirements"
|
|
57
57
|
note: "Must address existing system constraints and migration strategy"
|
|
58
58
|
|
|
59
|
-
- id: "validate-prd"
|
|
60
|
-
recommended: true
|
|
61
|
-
agent: "pm"
|
|
62
|
-
command: "validate-prd"
|
|
63
|
-
|
|
64
59
|
- id: "create-ux-design"
|
|
65
60
|
recommended: true
|
|
66
61
|
agent: "ux-designer"
|
|
@@ -114,7 +109,7 @@ phases:
|
|
|
114
109
|
required: true
|
|
115
110
|
agent: "architect"
|
|
116
111
|
command: "implementation-readiness"
|
|
117
|
-
note: "
|
|
112
|
+
note: "Validates PRD + Architecture + Epics + UX (optional)"
|
|
118
113
|
|
|
119
114
|
- phase: 3
|
|
120
115
|
name: "Implementation"
|
|
@@ -44,11 +44,6 @@ phases:
|
|
|
44
44
|
output: "Comprehensive Product Requirements Document"
|
|
45
45
|
note: "Enterprise-level requirements with compliance considerations"
|
|
46
46
|
|
|
47
|
-
- id: "validate-prd"
|
|
48
|
-
recommended: true
|
|
49
|
-
agent: "pm"
|
|
50
|
-
command: "validate-prd"
|
|
51
|
-
|
|
52
47
|
- id: "create-ux-design"
|
|
53
48
|
recommended: true
|
|
54
49
|
agent: "ux-designer"
|
|
@@ -102,7 +97,7 @@ phases:
|
|
|
102
97
|
required: true
|
|
103
98
|
agent: "architect"
|
|
104
99
|
command: "implementation-readiness"
|
|
105
|
-
note: "Validates
|
|
100
|
+
note: "Validates PRD + Architecture + Epics + UX (optional)"
|
|
106
101
|
|
|
107
102
|
- phase: 3
|
|
108
103
|
name: "Implementation"
|
|
@@ -55,11 +55,6 @@ phases:
|
|
|
55
55
|
output: "PRD focused on new features/changes"
|
|
56
56
|
note: "Must consider existing system constraints"
|
|
57
57
|
|
|
58
|
-
- id: "validate-prd"
|
|
59
|
-
optional: true
|
|
60
|
-
agent: "pm"
|
|
61
|
-
command: "validate-prd"
|
|
62
|
-
|
|
63
58
|
- id: "create-ux-design"
|
|
64
59
|
conditional: "if_has_ui"
|
|
65
60
|
agent: "ux-designer"
|
|
@@ -98,7 +93,7 @@ phases:
|
|
|
98
93
|
required: true
|
|
99
94
|
agent: "architect"
|
|
100
95
|
command: "implementation-readiness"
|
|
101
|
-
note: "Validates PRD +
|
|
96
|
+
note: "Validates PRD + Architecture + Epics + UX (optional)"
|
|
102
97
|
|
|
103
98
|
- phase: 3
|
|
104
99
|
name: "Implementation"
|
|
@@ -43,12 +43,6 @@ phases:
|
|
|
43
43
|
command: "prd"
|
|
44
44
|
output: "Product Requirements Document with FRs and NFRs"
|
|
45
45
|
|
|
46
|
-
- id: "validate-prd"
|
|
47
|
-
optional: true
|
|
48
|
-
agent: "pm"
|
|
49
|
-
command: "validate-prd"
|
|
50
|
-
note: "Quality check for PRD completeness"
|
|
51
|
-
|
|
52
46
|
- id: "create-ux-design"
|
|
53
47
|
conditional: "if_has_ui"
|
|
54
48
|
agent: "ux-designer"
|
|
@@ -89,7 +83,7 @@ phases:
|
|
|
89
83
|
required: true
|
|
90
84
|
agent: "architect"
|
|
91
85
|
command: "implementation-readiness"
|
|
92
|
-
note: "Validates PRD +
|
|
86
|
+
note: "Validates PRD + Architecture + Epics + UX (optional)"
|
|
93
87
|
|
|
94
88
|
- phase: 3
|
|
95
89
|
name: "Implementation"
|
|
@@ -8,7 +8,7 @@ const chalk = require('chalk');
|
|
|
8
8
|
*
|
|
9
9
|
* @param {Object} options - Installation options
|
|
10
10
|
* @param {string} options.projectRoot - The root directory of the target project
|
|
11
|
-
* @param {Object} options.config - Module configuration from
|
|
11
|
+
* @param {Object} options.config - Module configuration from module.yaml
|
|
12
12
|
* @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
|
|
13
13
|
* @param {Object} options.logger - Logger instance for output
|
|
14
14
|
* @returns {Promise<boolean>} - Success status
|
package/tools/cli/README.md
CHANGED
|
@@ -98,7 +98,7 @@ The installer is a multi-stage system that handles agent compilation, IDE integr
|
|
|
98
98
|
```
|
|
99
99
|
1. Collect User Input
|
|
100
100
|
- Target directory, modules, IDEs
|
|
101
|
-
- Custom module configuration (via
|
|
101
|
+
- Custom module configuration (via module.yaml)
|
|
102
102
|
|
|
103
103
|
2. Pre-Installation
|
|
104
104
|
- Validate target, check conflicts, backup existing installations
|
|
@@ -183,12 +183,12 @@ The installer supports **15 IDE environments** through a base-derived architectu
|
|
|
183
183
|
|
|
184
184
|
### Custom Module Configuration
|
|
185
185
|
|
|
186
|
-
Modules define interactive configuration menus via `
|
|
186
|
+
Modules define interactive configuration menus via `module.yaml` files in their `_module-installer/` directories.
|
|
187
187
|
|
|
188
188
|
**Config File Location**:
|
|
189
189
|
|
|
190
|
-
- Core: `src/core/
|
|
191
|
-
- Modules: `src/modules/{module}/
|
|
190
|
+
- Core: `src/core/module.yaml`
|
|
191
|
+
- Modules: `src/modules/{module}/module.yaml`
|
|
192
192
|
|
|
193
193
|
**Configuration Types**:
|
|
194
194
|
|
|
@@ -604,6 +604,6 @@ node tools/cli/regenerate-manifests.js
|
|
|
604
604
|
|
|
605
605
|
## Support
|
|
606
606
|
|
|
607
|
-
- **Issues**: https://github.com/bmad-code-org/BMAD-METHOD/issues
|
|
608
|
-
- **Discord**: https://discord.gg/gk8jAdXWmj (#general-dev, #bugs-issues)
|
|
609
|
-
- **YouTube**: https://www.youtube.com/@BMadCode
|
|
607
|
+
- **Issues**: <https://github.com/bmad-code-org/BMAD-METHOD/issues>
|
|
608
|
+
- **Discord**: <https://discord.gg/gk8jAdXWmj> (#general-dev, #bugs-issues)
|
|
609
|
+
- **YouTube**: <https://www.youtube.com/@BMadCode>
|
|
@@ -28,9 +28,8 @@ module.exports = {
|
|
|
28
28
|
command: 'build [agent]',
|
|
29
29
|
description: 'Build agent XML files from YAML sources',
|
|
30
30
|
options: [
|
|
31
|
-
['-a, --all', '
|
|
31
|
+
['-a, --all', 'Build all agents'],
|
|
32
32
|
['-d, --directory <path>', 'Project directory', '.'],
|
|
33
|
-
['--force', 'Force rebuild even if up to date'],
|
|
34
33
|
],
|
|
35
34
|
action: async (agentName, options) => {
|
|
36
35
|
try {
|
|
@@ -54,13 +53,15 @@ module.exports = {
|
|
|
54
53
|
|
|
55
54
|
if (options.all) {
|
|
56
55
|
// Build all agents
|
|
57
|
-
await buildAllAgents(projectDir
|
|
56
|
+
await buildAllAgents(projectDir);
|
|
58
57
|
} else if (agentName) {
|
|
59
58
|
// Build specific agent
|
|
60
|
-
await buildAgent(projectDir, agentName
|
|
59
|
+
await buildAgent(projectDir, agentName);
|
|
61
60
|
} else {
|
|
62
|
-
// No agent specified,
|
|
63
|
-
|
|
61
|
+
// No agent specified, list available agents
|
|
62
|
+
console.log(chalk.yellow('No agent specified. Use --all to build all agents or specify an agent name.'));
|
|
63
|
+
console.log(chalk.dim('\nAvailable agents:'));
|
|
64
|
+
await listAvailableAgents(projectDir);
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
process.exit(0);
|
|
@@ -77,7 +78,7 @@ module.exports = {
|
|
|
77
78
|
/**
|
|
78
79
|
* Build a specific agent
|
|
79
80
|
*/
|
|
80
|
-
async function buildAgent(projectDir, agentName
|
|
81
|
+
async function buildAgent(projectDir, agentName) {
|
|
81
82
|
// First check standalone agents in bmad/agents/{agentname}/
|
|
82
83
|
const standaloneAgentDir = path.join(projectDir, 'bmad', 'agents', agentName);
|
|
83
84
|
let standaloneYamlPath = path.join(standaloneAgentDir, `${agentName}.agent.yaml`);
|
|
@@ -95,15 +96,6 @@ async function buildAgent(projectDir, agentName, force = false) {
|
|
|
95
96
|
const yamlFileName = path.basename(standaloneYamlPath, '.agent.yaml');
|
|
96
97
|
const outputPath = path.join(standaloneAgentDir, `${yamlFileName}.md`);
|
|
97
98
|
|
|
98
|
-
// Check if rebuild needed
|
|
99
|
-
if (!force && (await fs.pathExists(outputPath))) {
|
|
100
|
-
const needsRebuild = await checkIfNeedsRebuild(standaloneYamlPath, outputPath, projectDir, agentName);
|
|
101
|
-
if (!needsRebuild) {
|
|
102
|
-
console.log(chalk.dim(` ${agentName}: already up to date`));
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
99
|
// Build the standalone agent
|
|
108
100
|
console.log(chalk.cyan(` Building standalone agent ${agentName}...`));
|
|
109
101
|
|
|
@@ -130,15 +122,6 @@ async function buildAgent(projectDir, agentName, force = false) {
|
|
|
130
122
|
if (await fs.pathExists(agentYamlPath)) {
|
|
131
123
|
found = true;
|
|
132
124
|
|
|
133
|
-
// Check if rebuild needed
|
|
134
|
-
if (!force && (await fs.pathExists(outputPath))) {
|
|
135
|
-
const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
|
|
136
|
-
if (!needsRebuild) {
|
|
137
|
-
console.log(chalk.dim(` ${agentName}: already up to date`));
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
|
|
142
125
|
// Build the agent
|
|
143
126
|
console.log(chalk.cyan(` Building ${agentName}...`));
|
|
144
127
|
|
|
@@ -162,9 +145,8 @@ async function buildAgent(projectDir, agentName, force = false) {
|
|
|
162
145
|
/**
|
|
163
146
|
* Build all agents
|
|
164
147
|
*/
|
|
165
|
-
async function buildAllAgents(projectDir
|
|
148
|
+
async function buildAllAgents(projectDir) {
|
|
166
149
|
let builtCount = 0;
|
|
167
|
-
let skippedCount = 0;
|
|
168
150
|
|
|
169
151
|
// First, build standalone agents in bmad/agents/
|
|
170
152
|
const standaloneAgentsDir = path.join(projectDir, 'bmad', 'agents');
|
|
@@ -193,16 +175,6 @@ async function buildAllAgents(projectDir, force = false) {
|
|
|
193
175
|
const agentName = path.basename(agentFile, '.agent.yaml');
|
|
194
176
|
const outputPath = path.join(agentDir, `${agentName}.md`);
|
|
195
177
|
|
|
196
|
-
// Check if rebuild needed
|
|
197
|
-
if (!force && (await fs.pathExists(outputPath))) {
|
|
198
|
-
const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
|
|
199
|
-
if (!needsRebuild) {
|
|
200
|
-
console.log(chalk.dim(` ${agentName}: up to date`));
|
|
201
|
-
skippedCount++;
|
|
202
|
-
continue;
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
|
|
206
178
|
console.log(chalk.cyan(` Building standalone agent ${agentName}...`));
|
|
207
179
|
|
|
208
180
|
const customizePath = path.join(projectDir, 'bmad', '_cfg', 'agents', `${agentName}.customize.yaml`);
|
|
@@ -239,16 +211,6 @@ async function buildAllAgents(projectDir, force = false) {
|
|
|
239
211
|
const agentYamlPath = path.join(agentsDir, file);
|
|
240
212
|
const outputPath = path.join(agentsDir, `${agentName}.md`);
|
|
241
213
|
|
|
242
|
-
// Check if rebuild needed
|
|
243
|
-
if (!force && (await fs.pathExists(outputPath))) {
|
|
244
|
-
const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
|
|
245
|
-
if (!needsRebuild) {
|
|
246
|
-
console.log(chalk.dim(` ${agentName}: up to date`));
|
|
247
|
-
skippedCount++;
|
|
248
|
-
continue;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
214
|
console.log(chalk.cyan(` Building ${agentName}...`));
|
|
253
215
|
|
|
254
216
|
const customizePath = path.join(projectDir, '.claude', '_cfg', 'agents', `${agentName}.customize.yaml`);
|
|
@@ -263,143 +225,6 @@ async function buildAllAgents(projectDir, force = false) {
|
|
|
263
225
|
}
|
|
264
226
|
|
|
265
227
|
console.log(chalk.green(`\n✓ Built ${builtCount} agent(s)`));
|
|
266
|
-
if (skippedCount > 0) {
|
|
267
|
-
console.log(chalk.dim(` Skipped ${skippedCount} (already up to date)`));
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
/**
|
|
272
|
-
* Check what needs rebuilding
|
|
273
|
-
*/
|
|
274
|
-
async function checkBuildStatus(projectDir) {
|
|
275
|
-
const needsRebuild = [];
|
|
276
|
-
const upToDate = [];
|
|
277
|
-
|
|
278
|
-
// Check standalone agents in bmad/agents/
|
|
279
|
-
const standaloneAgentsDir = path.join(projectDir, 'bmad', 'agents');
|
|
280
|
-
if (await fs.pathExists(standaloneAgentsDir)) {
|
|
281
|
-
const agentDirs = await fs.readdir(standaloneAgentsDir);
|
|
282
|
-
|
|
283
|
-
for (const agentDirName of agentDirs) {
|
|
284
|
-
const agentDir = path.join(standaloneAgentsDir, agentDirName);
|
|
285
|
-
|
|
286
|
-
// Skip if not a directory
|
|
287
|
-
const stat = await fs.stat(agentDir);
|
|
288
|
-
if (!stat.isDirectory()) {
|
|
289
|
-
continue;
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
// Find any .agent.yaml file in the directory
|
|
293
|
-
const files = await fs.readdir(agentDir);
|
|
294
|
-
const agentFile = files.find((f) => f.endsWith('.agent.yaml'));
|
|
295
|
-
|
|
296
|
-
if (!agentFile) {
|
|
297
|
-
continue;
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
const agentYamlPath = path.join(agentDir, agentFile);
|
|
301
|
-
const agentName = path.basename(agentFile, '.agent.yaml');
|
|
302
|
-
const outputPath = path.join(agentDir, `${agentName}.md`);
|
|
303
|
-
|
|
304
|
-
if (!(await fs.pathExists(outputPath))) {
|
|
305
|
-
needsRebuild.push(`${agentName} (standalone)`);
|
|
306
|
-
} else if (await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName)) {
|
|
307
|
-
needsRebuild.push(`${agentName} (standalone)`);
|
|
308
|
-
} else {
|
|
309
|
-
upToDate.push(`${agentName} (standalone)`);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// Check module agents in .claude/commands/bmad/
|
|
315
|
-
const bmadCommandsDir = path.join(projectDir, '.claude', 'commands', 'bmad');
|
|
316
|
-
if (await fs.pathExists(bmadCommandsDir)) {
|
|
317
|
-
const modules = await fs.readdir(bmadCommandsDir);
|
|
318
|
-
|
|
319
|
-
for (const module of modules) {
|
|
320
|
-
const agentsDir = path.join(bmadCommandsDir, module, 'agents');
|
|
321
|
-
|
|
322
|
-
if (!(await fs.pathExists(agentsDir))) {
|
|
323
|
-
continue;
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
const files = await fs.readdir(agentsDir);
|
|
327
|
-
|
|
328
|
-
for (const file of files) {
|
|
329
|
-
if (!file.endsWith('.agent.yaml')) {
|
|
330
|
-
continue;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
const agentName = file.replace('.agent.yaml', '');
|
|
334
|
-
const agentYamlPath = path.join(agentsDir, file);
|
|
335
|
-
const outputPath = path.join(agentsDir, `${agentName}.md`);
|
|
336
|
-
|
|
337
|
-
if (!(await fs.pathExists(outputPath))) {
|
|
338
|
-
needsRebuild.push(`${agentName} (${module})`);
|
|
339
|
-
} else if (await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName)) {
|
|
340
|
-
needsRebuild.push(`${agentName} (${module})`);
|
|
341
|
-
} else {
|
|
342
|
-
upToDate.push(`${agentName} (${module})`);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
if (needsRebuild.length === 0) {
|
|
349
|
-
console.log(chalk.green('✓ All agents are up to date'));
|
|
350
|
-
} else {
|
|
351
|
-
console.log(chalk.yellow(`${needsRebuild.length} agent(s) need rebuilding:`));
|
|
352
|
-
for (const agent of needsRebuild) {
|
|
353
|
-
console.log(chalk.dim(` - ${agent}`));
|
|
354
|
-
}
|
|
355
|
-
console.log(chalk.dim('\nRun "bmad build --all" to rebuild all agents'));
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if (upToDate.length > 0) {
|
|
359
|
-
console.log(chalk.dim(`\n${upToDate.length} agent(s) up to date`));
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
/**
|
|
364
|
-
* Check if an agent needs rebuilding by comparing hashes
|
|
365
|
-
*/
|
|
366
|
-
async function checkIfNeedsRebuild(yamlPath, outputPath, projectDir, agentName) {
|
|
367
|
-
// Read the output file to check its metadata
|
|
368
|
-
const outputContent = await fs.readFile(outputPath, 'utf8');
|
|
369
|
-
|
|
370
|
-
// Extract hash from BUILD-META comment
|
|
371
|
-
const metaMatch = outputContent.match(/source:.*\(hash: ([a-f0-9]+)\)/);
|
|
372
|
-
if (!metaMatch) {
|
|
373
|
-
// No metadata, needs rebuild
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
const storedHash = metaMatch[1];
|
|
378
|
-
|
|
379
|
-
// Calculate current hash
|
|
380
|
-
const currentHash = await builder.calculateFileHash(yamlPath);
|
|
381
|
-
|
|
382
|
-
if (storedHash !== currentHash) {
|
|
383
|
-
return true;
|
|
384
|
-
}
|
|
385
|
-
|
|
386
|
-
// Check customize file if it exists
|
|
387
|
-
const customizePath = path.join(projectDir, '.claude', '_cfg', 'agents', `${agentName}.customize.yaml`);
|
|
388
|
-
if (await fs.pathExists(customizePath)) {
|
|
389
|
-
const customizeMetaMatch = outputContent.match(/customize:.*\(hash: ([a-f0-9]+)\)/);
|
|
390
|
-
if (!customizeMetaMatch) {
|
|
391
|
-
return true;
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
const storedCustomizeHash = customizeMetaMatch[1];
|
|
395
|
-
const currentCustomizeHash = await builder.calculateFileHash(customizePath);
|
|
396
|
-
|
|
397
|
-
if (storedCustomizeHash !== currentCustomizeHash) {
|
|
398
|
-
return true;
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
return false;
|
|
403
228
|
}
|
|
404
229
|
|
|
405
230
|
/**
|
|
@@ -9,7 +9,7 @@ const ui = new UI();
|
|
|
9
9
|
module.exports = {
|
|
10
10
|
command: 'install',
|
|
11
11
|
description: 'Install BMAD Core agents and tools',
|
|
12
|
-
options: [
|
|
12
|
+
options: [],
|
|
13
13
|
action: async (options) => {
|
|
14
14
|
try {
|
|
15
15
|
const config = await ui.promptInstall();
|
|
@@ -44,11 +44,6 @@ module.exports = {
|
|
|
44
44
|
config._requestedReinstall = true;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
// Add skip cleanup flag if option provided
|
|
48
|
-
if (options && options.skipCleanup) {
|
|
49
|
-
config.skipCleanup = true;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
47
|
// Regular install/update flow
|
|
53
48
|
const result = await installer.install(config);
|
|
54
49
|
|
|
@@ -182,15 +182,47 @@ class ConfigCollector {
|
|
|
182
182
|
}
|
|
183
183
|
|
|
184
184
|
// Load module's install config schema
|
|
185
|
-
|
|
186
|
-
|
|
185
|
+
// First, try the standard src/modules location
|
|
186
|
+
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
|
|
187
|
+
let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
188
|
+
|
|
189
|
+
// If not found in src/modules, we need to find it by searching the project
|
|
190
|
+
if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
|
|
191
|
+
// Use the module manager to find the module source
|
|
192
|
+
const { ModuleManager } = require('../modules/manager');
|
|
193
|
+
const moduleManager = new ModuleManager();
|
|
194
|
+
const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
|
|
195
|
+
|
|
196
|
+
if (moduleSourcePath) {
|
|
197
|
+
installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'module.yaml');
|
|
198
|
+
moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
|
|
199
|
+
}
|
|
200
|
+
}
|
|
187
201
|
|
|
188
202
|
let configPath = null;
|
|
189
|
-
|
|
203
|
+
let isCustomModule = false;
|
|
204
|
+
|
|
205
|
+
if (await fs.pathExists(moduleConfigPath)) {
|
|
206
|
+
configPath = moduleConfigPath;
|
|
207
|
+
} else if (await fs.pathExists(installerConfigPath)) {
|
|
190
208
|
configPath = installerConfigPath;
|
|
191
|
-
} else if (await fs.pathExists(legacyConfigPath)) {
|
|
192
|
-
configPath = legacyConfigPath;
|
|
193
209
|
} else {
|
|
210
|
+
// Check if this is a custom module with custom.yaml
|
|
211
|
+
const { ModuleManager } = require('../modules/manager');
|
|
212
|
+
const moduleManager = new ModuleManager();
|
|
213
|
+
const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
|
|
214
|
+
|
|
215
|
+
if (moduleSourcePath) {
|
|
216
|
+
const rootCustomConfigPath = path.join(moduleSourcePath, 'custom.yaml');
|
|
217
|
+
const moduleInstallerCustomPath = path.join(moduleSourcePath, '_module-installer', 'custom.yaml');
|
|
218
|
+
|
|
219
|
+
if ((await fs.pathExists(rootCustomConfigPath)) || (await fs.pathExists(moduleInstallerCustomPath))) {
|
|
220
|
+
isCustomModule = true;
|
|
221
|
+
// For custom modules, we don't have an install-config schema, so just use existing values
|
|
222
|
+
// The custom.yaml values will be loaded and merged during installation
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
194
226
|
// No config schema for this module - use existing values
|
|
195
227
|
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
196
228
|
if (!this.collectedConfig[moduleName]) {
|
|
@@ -226,9 +258,31 @@ class ConfigCollector {
|
|
|
226
258
|
}
|
|
227
259
|
this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
|
|
228
260
|
|
|
261
|
+
// Special handling for user_name: ensure it has a value
|
|
262
|
+
if (
|
|
263
|
+
moduleName === 'core' &&
|
|
264
|
+
(!this.collectedConfig[moduleName].user_name || this.collectedConfig[moduleName].user_name === '[USER_NAME]')
|
|
265
|
+
) {
|
|
266
|
+
this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
|
|
267
|
+
}
|
|
268
|
+
|
|
229
269
|
// Also populate allAnswers for cross-referencing
|
|
230
270
|
for (const [key, value] of Object.entries(this.existingConfig[moduleName])) {
|
|
231
|
-
|
|
271
|
+
// Ensure user_name is properly set in allAnswers too
|
|
272
|
+
let finalValue = value;
|
|
273
|
+
if (moduleName === 'core' && key === 'user_name' && (!value || value === '[USER_NAME]')) {
|
|
274
|
+
finalValue = this.getDefaultUsername();
|
|
275
|
+
}
|
|
276
|
+
this.allAnswers[`${moduleName}_${key}`] = finalValue;
|
|
277
|
+
}
|
|
278
|
+
} else if (moduleName === 'core') {
|
|
279
|
+
// No existing core config - ensure we at least have user_name
|
|
280
|
+
if (!this.collectedConfig[moduleName]) {
|
|
281
|
+
this.collectedConfig[moduleName] = {};
|
|
282
|
+
}
|
|
283
|
+
if (!this.collectedConfig[moduleName].user_name) {
|
|
284
|
+
this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
|
|
285
|
+
this.allAnswers[`${moduleName}_user_name`] = this.getDefaultUsername();
|
|
232
286
|
}
|
|
233
287
|
}
|
|
234
288
|
// Show "no config" message for modules with no new questions
|
|
@@ -396,15 +450,29 @@ class ConfigCollector {
|
|
|
396
450
|
if (!this.allAnswers) {
|
|
397
451
|
this.allAnswers = {};
|
|
398
452
|
}
|
|
399
|
-
// Load module's config
|
|
400
|
-
|
|
401
|
-
|
|
453
|
+
// Load module's config
|
|
454
|
+
// First, try the standard src/modules location
|
|
455
|
+
let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
|
|
456
|
+
let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
457
|
+
|
|
458
|
+
// If not found in src/modules, we need to find it by searching the project
|
|
459
|
+
if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
|
|
460
|
+
// Use the module manager to find the module source
|
|
461
|
+
const { ModuleManager } = require('../modules/manager');
|
|
462
|
+
const moduleManager = new ModuleManager();
|
|
463
|
+
const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
|
|
464
|
+
|
|
465
|
+
if (moduleSourcePath) {
|
|
466
|
+
installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'module.yaml');
|
|
467
|
+
moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
|
|
468
|
+
}
|
|
469
|
+
}
|
|
402
470
|
|
|
403
471
|
let configPath = null;
|
|
404
|
-
if (await fs.pathExists(
|
|
472
|
+
if (await fs.pathExists(moduleConfigPath)) {
|
|
473
|
+
configPath = moduleConfigPath;
|
|
474
|
+
} else if (await fs.pathExists(installerConfigPath)) {
|
|
405
475
|
configPath = installerConfigPath;
|
|
406
|
-
} else if (await fs.pathExists(legacyConfigPath)) {
|
|
407
|
-
configPath = legacyConfigPath;
|
|
408
476
|
} else {
|
|
409
477
|
// No config for this module
|
|
410
478
|
return;
|