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
|
@@ -5,34 +5,13 @@ const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Roo IDE setup handler
|
|
8
|
-
* Creates custom
|
|
8
|
+
* Creates custom commands in .roo/commands directory
|
|
9
9
|
*/
|
|
10
10
|
class RooSetup extends BaseIdeSetup {
|
|
11
11
|
constructor() {
|
|
12
12
|
super('roo', 'Roo Code');
|
|
13
|
-
this.
|
|
14
|
-
this.
|
|
15
|
-
dev: {
|
|
16
|
-
description: 'Development files',
|
|
17
|
-
fileRegex: String.raw`.*\.(js|jsx|ts|tsx|py|java|cpp|c|h|cs|go|rs|php|rb|swift)$`,
|
|
18
|
-
},
|
|
19
|
-
config: {
|
|
20
|
-
description: 'Configuration files',
|
|
21
|
-
fileRegex: String.raw`.*\.(json|yaml|yml|toml|xml|ini|env|config)$`,
|
|
22
|
-
},
|
|
23
|
-
docs: {
|
|
24
|
-
description: 'Documentation files',
|
|
25
|
-
fileRegex: String.raw`.*\.(md|mdx|rst|txt|doc|docx)$`,
|
|
26
|
-
},
|
|
27
|
-
styles: {
|
|
28
|
-
description: 'Style and design files',
|
|
29
|
-
fileRegex: String.raw`.*\.(css|scss|sass|less|stylus)$`,
|
|
30
|
-
},
|
|
31
|
-
all: {
|
|
32
|
-
description: 'All files',
|
|
33
|
-
fileRegex: '.*',
|
|
34
|
-
},
|
|
35
|
-
};
|
|
13
|
+
this.configDir = '.roo';
|
|
14
|
+
this.commandsDir = 'commands';
|
|
36
15
|
}
|
|
37
16
|
|
|
38
17
|
/**
|
|
@@ -44,94 +23,96 @@ class RooSetup extends BaseIdeSetup {
|
|
|
44
23
|
async setup(projectDir, bmadDir, options = {}) {
|
|
45
24
|
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
46
25
|
|
|
47
|
-
//
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
let existingContent = '';
|
|
51
|
-
|
|
52
|
-
if (await this.pathExists(roomodesPath)) {
|
|
53
|
-
existingContent = await this.readFile(roomodesPath);
|
|
54
|
-
// Parse existing modes to avoid duplicates
|
|
55
|
-
const modeMatches = existingContent.matchAll(/- slug: ([\w-]+)/g);
|
|
56
|
-
for (const match of modeMatches) {
|
|
57
|
-
existingModes.push(match[1]);
|
|
58
|
-
}
|
|
59
|
-
console.log(chalk.yellow(`Found existing .roomodes file with ${existingModes.length} modes`));
|
|
60
|
-
}
|
|
26
|
+
// Create .roo/commands directory
|
|
27
|
+
const rooCommandsDir = path.join(projectDir, this.configDir, this.commandsDir);
|
|
28
|
+
await this.ensureDir(rooCommandsDir);
|
|
61
29
|
|
|
62
|
-
// Generate agent launchers
|
|
30
|
+
// Generate agent launchers
|
|
63
31
|
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
64
32
|
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
65
33
|
|
|
66
|
-
// Always use 'all' permissions - users can customize in .roomodes file
|
|
67
|
-
const permissionChoice = 'all';
|
|
68
|
-
|
|
69
|
-
// Create modes content
|
|
70
|
-
let newModesContent = '';
|
|
71
34
|
let addedCount = 0;
|
|
72
35
|
let skippedCount = 0;
|
|
73
36
|
|
|
74
37
|
for (const artifact of agentArtifacts) {
|
|
75
|
-
const
|
|
38
|
+
const commandName = `bmad-${artifact.module}-agent-${artifact.name}`;
|
|
39
|
+
const commandPath = path.join(rooCommandsDir, `${commandName}.md`);
|
|
76
40
|
|
|
77
41
|
// Skip if already exists
|
|
78
|
-
if (
|
|
79
|
-
console.log(chalk.dim(` Skipping ${
|
|
42
|
+
if (await this.pathExists(commandPath)) {
|
|
43
|
+
console.log(chalk.dim(` Skipping ${commandName} - already exists`));
|
|
80
44
|
skippedCount++;
|
|
81
45
|
continue;
|
|
82
46
|
}
|
|
83
47
|
|
|
84
|
-
// Read the actual agent file from .bmad for metadata extraction
|
|
48
|
+
// Read the actual agent file from .bmad for metadata extraction (installed agents are .md files)
|
|
85
49
|
const agentPath = path.join(bmadDir, artifact.module, 'agents', `${artifact.name}.md`);
|
|
86
50
|
const content = await this.readFile(agentPath);
|
|
87
51
|
|
|
88
|
-
// Create
|
|
89
|
-
|
|
90
|
-
{ module: artifact.module, name: artifact.name, path: agentPath },
|
|
91
|
-
content,
|
|
92
|
-
permissionChoice,
|
|
93
|
-
projectDir,
|
|
94
|
-
);
|
|
52
|
+
// Create command file that references the actual .bmad agent
|
|
53
|
+
await this.createCommandFile({ module: artifact.module, name: artifact.name, path: agentPath }, content, commandPath, projectDir);
|
|
95
54
|
|
|
96
|
-
newModesContent += modeEntry;
|
|
97
55
|
addedCount++;
|
|
98
|
-
console.log(chalk.green(` ✓ Added
|
|
56
|
+
console.log(chalk.green(` ✓ Added command: ${commandName}`));
|
|
99
57
|
}
|
|
100
58
|
|
|
101
|
-
// Build final content
|
|
102
|
-
let finalContent = '';
|
|
103
|
-
if (existingContent) {
|
|
104
|
-
// Append to existing content
|
|
105
|
-
finalContent = existingContent.trim() + '\n' + newModesContent;
|
|
106
|
-
} else {
|
|
107
|
-
// Create new .roomodes file
|
|
108
|
-
finalContent = 'customModes:\n' + newModesContent;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Write .roomodes file
|
|
112
|
-
await this.writeFile(roomodesPath, finalContent);
|
|
113
|
-
|
|
114
59
|
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
115
|
-
console.log(chalk.dim(` - ${addedCount}
|
|
60
|
+
console.log(chalk.dim(` - ${addedCount} commands added`));
|
|
116
61
|
if (skippedCount > 0) {
|
|
117
|
-
console.log(chalk.dim(` - ${skippedCount}
|
|
62
|
+
console.log(chalk.dim(` - ${skippedCount} commands skipped (already exist)`));
|
|
118
63
|
}
|
|
119
|
-
console.log(chalk.dim(` -
|
|
120
|
-
console.log(chalk.dim(`
|
|
121
|
-
console.log(chalk.yellow(`\n 💡 Tip: Edit ${this.configFile} to customize file permissions per agent`));
|
|
122
|
-
console.log(chalk.dim(` Modes will be available when you open this project in Roo Code`));
|
|
64
|
+
console.log(chalk.dim(` - Commands directory: ${this.configDir}/${this.commandsDir}/bmad/`));
|
|
65
|
+
console.log(chalk.dim(` Commands will be available when you open this project in Roo Code`));
|
|
123
66
|
|
|
124
67
|
return {
|
|
125
68
|
success: true,
|
|
126
|
-
|
|
69
|
+
commands: addedCount,
|
|
127
70
|
skipped: skippedCount,
|
|
128
71
|
};
|
|
129
72
|
}
|
|
130
73
|
|
|
131
74
|
/**
|
|
132
|
-
* Create a
|
|
75
|
+
* Create a unified command file for agents
|
|
76
|
+
* @param {string} commandPath - Path where to write the command file
|
|
77
|
+
* @param {Object} options - Command options
|
|
78
|
+
* @param {string} options.name - Display name for the command
|
|
79
|
+
* @param {string} options.description - Description for the command
|
|
80
|
+
* @param {string} options.agentPath - Path to the agent file (relative to project root)
|
|
81
|
+
* @param {string} [options.icon] - Icon emoji (defaults to 🤖)
|
|
82
|
+
* @param {string} [options.extraContent] - Additional content to include before activation
|
|
133
83
|
*/
|
|
134
|
-
async
|
|
84
|
+
async createAgentCommandFile(commandPath, options) {
|
|
85
|
+
const { name, description, agentPath, icon = '🤖', extraContent = '' } = options;
|
|
86
|
+
|
|
87
|
+
// Build command content with YAML frontmatter
|
|
88
|
+
let commandContent = `---\n`;
|
|
89
|
+
commandContent += `name: '${icon} ${name}'\n`;
|
|
90
|
+
commandContent += `description: '${description}'\n`;
|
|
91
|
+
commandContent += `---\n\n`;
|
|
92
|
+
|
|
93
|
+
commandContent += `You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.\n\n`;
|
|
94
|
+
|
|
95
|
+
// Add any extra content (e.g., warnings for custom agents)
|
|
96
|
+
if (extraContent) {
|
|
97
|
+
commandContent += `${extraContent}\n\n`;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
commandContent += `<agent-activation CRITICAL="TRUE">\n`;
|
|
101
|
+
commandContent += `1. LOAD the FULL agent file from @${agentPath}\n`;
|
|
102
|
+
commandContent += `2. READ its entire contents - this contains the complete agent persona, menu, and instructions\n`;
|
|
103
|
+
commandContent += `3. Execute ALL activation steps exactly as written in the agent file\n`;
|
|
104
|
+
commandContent += `4. Follow the agent's persona and menu system precisely\n`;
|
|
105
|
+
commandContent += `5. Stay in character throughout the session\n`;
|
|
106
|
+
commandContent += `</agent-activation>\n`;
|
|
107
|
+
|
|
108
|
+
// Write command file
|
|
109
|
+
await this.writeFile(commandPath, commandContent);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Create a command file for an agent
|
|
114
|
+
*/
|
|
115
|
+
async createCommandFile(agent, content, commandPath, projectDir) {
|
|
135
116
|
// Extract metadata from agent content
|
|
136
117
|
const titleMatch = content.match(/title="([^"]+)"/);
|
|
137
118
|
const title = titleMatch ? titleMatch[1] : this.formatTitle(agent.name);
|
|
@@ -142,66 +123,16 @@ class RooSetup extends BaseIdeSetup {
|
|
|
142
123
|
const whenToUseMatch = content.match(/whenToUse="([^"]+)"/);
|
|
143
124
|
const whenToUse = whenToUseMatch ? whenToUseMatch[1] : `Use for ${title} tasks`;
|
|
144
125
|
|
|
145
|
-
// Get the activation header from central template
|
|
146
|
-
const activationHeader = await this.getAgentCommandHeader();
|
|
147
|
-
|
|
148
|
-
const roleDefinitionMatch = content.match(/roleDefinition="([^"]+)"/);
|
|
149
|
-
const roleDefinition = roleDefinitionMatch
|
|
150
|
-
? roleDefinitionMatch[1]
|
|
151
|
-
: `You are a ${title} specializing in ${title.toLowerCase()} tasks and responsibilities.`;
|
|
152
|
-
|
|
153
126
|
// Get relative path
|
|
154
127
|
const relativePath = path.relative(projectDir, agent.path).replaceAll('\\', '/');
|
|
155
128
|
|
|
156
|
-
//
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
if (permissions && permissions.description) {
|
|
165
|
-
modeEntry += ` description: '${permissions.description}'\n`;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
modeEntry += ` roleDefinition: ${roleDefinition}\n`;
|
|
169
|
-
modeEntry += ` whenToUse: ${whenToUse}\n`;
|
|
170
|
-
modeEntry += ` customInstructions: ${activationHeader} Read the full YAML from ${relativePath} start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`;
|
|
171
|
-
modeEntry += ` groups:\n`;
|
|
172
|
-
modeEntry += ` - read\n`;
|
|
173
|
-
|
|
174
|
-
if (permissions && permissions.fileRegex) {
|
|
175
|
-
modeEntry += ` - - edit\n`;
|
|
176
|
-
modeEntry += ` - fileRegex: ${permissions.fileRegex}\n`;
|
|
177
|
-
modeEntry += ` description: ${permissions.description}\n`;
|
|
178
|
-
} else {
|
|
179
|
-
modeEntry += ` - edit\n`;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return modeEntry;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Get permissions configuration for an agent
|
|
187
|
-
*/
|
|
188
|
-
getPermissionsForAgent(agent, permissionChoice) {
|
|
189
|
-
if (permissionChoice === 'custom') {
|
|
190
|
-
// Custom logic based on agent name/module
|
|
191
|
-
if (agent.name.includes('dev') || agent.name.includes('code')) {
|
|
192
|
-
return this.defaultPermissions.dev;
|
|
193
|
-
} else if (agent.name.includes('doc') || agent.name.includes('write')) {
|
|
194
|
-
return this.defaultPermissions.docs;
|
|
195
|
-
} else if (agent.name.includes('config') || agent.name.includes('setup')) {
|
|
196
|
-
return this.defaultPermissions.config;
|
|
197
|
-
} else if (agent.name.includes('style') || agent.name.includes('css')) {
|
|
198
|
-
return this.defaultPermissions.styles;
|
|
199
|
-
}
|
|
200
|
-
// Default to all for custom agents
|
|
201
|
-
return this.defaultPermissions.all;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
return this.defaultPermissions[permissionChoice] || null;
|
|
129
|
+
// Use unified method
|
|
130
|
+
await this.createAgentCommandFile(commandPath, {
|
|
131
|
+
name: title,
|
|
132
|
+
description: whenToUse,
|
|
133
|
+
agentPath: relativePath,
|
|
134
|
+
icon: icon,
|
|
135
|
+
});
|
|
205
136
|
}
|
|
206
137
|
|
|
207
138
|
/**
|
|
@@ -219,8 +150,26 @@ class RooSetup extends BaseIdeSetup {
|
|
|
219
150
|
*/
|
|
220
151
|
async cleanup(projectDir) {
|
|
221
152
|
const fs = require('fs-extra');
|
|
222
|
-
const
|
|
153
|
+
const rooCommandsDir = path.join(projectDir, this.configDir, this.commandsDir);
|
|
154
|
+
|
|
155
|
+
if (await fs.pathExists(rooCommandsDir)) {
|
|
156
|
+
const files = await fs.readdir(rooCommandsDir);
|
|
157
|
+
let removedCount = 0;
|
|
158
|
+
|
|
159
|
+
for (const file of files) {
|
|
160
|
+
if (file.startsWith('bmad-') && file.endsWith('.md')) {
|
|
161
|
+
await fs.remove(path.join(rooCommandsDir, file));
|
|
162
|
+
removedCount++;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
223
165
|
|
|
166
|
+
if (removedCount > 0) {
|
|
167
|
+
console.log(chalk.dim(`Removed ${removedCount} BMAD commands from .roo/commands/`));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// Also clean up old .roomodes file if it exists
|
|
172
|
+
const roomodesPath = path.join(projectDir, '.roomodes');
|
|
224
173
|
if (await fs.pathExists(roomodesPath)) {
|
|
225
174
|
const content = await fs.readFile(roomodesPath, 'utf8');
|
|
226
175
|
|
|
@@ -245,7 +194,9 @@ class RooSetup extends BaseIdeSetup {
|
|
|
245
194
|
|
|
246
195
|
// Write back filtered content
|
|
247
196
|
await fs.writeFile(roomodesPath, filteredLines.join('\n'));
|
|
248
|
-
|
|
197
|
+
if (removedCount > 0) {
|
|
198
|
+
console.log(chalk.dim(`Removed ${removedCount} BMAD modes from legacy .roomodes file`));
|
|
199
|
+
}
|
|
249
200
|
}
|
|
250
201
|
}
|
|
251
202
|
|
|
@@ -254,68 +205,53 @@ class RooSetup extends BaseIdeSetup {
|
|
|
254
205
|
* @param {string} projectDir - Project directory
|
|
255
206
|
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
256
207
|
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
257
|
-
* @param {Object} metadata - Agent metadata
|
|
208
|
+
* @param {Object} metadata - Agent metadata (unused, kept for compatibility)
|
|
258
209
|
* @returns {Object} Installation result
|
|
259
210
|
*/
|
|
260
211
|
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
261
|
-
const
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
// Read existing .roomodes file
|
|
265
|
-
if (await this.pathExists(roomodesPath)) {
|
|
266
|
-
existingContent = await this.readFile(roomodesPath);
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
// Create custom agent mode entry
|
|
270
|
-
const slug = `bmad-custom-${agentName.toLowerCase()}`;
|
|
271
|
-
const modeEntry = ` - slug: ${slug}
|
|
272
|
-
name: 'BMAD Custom: ${agentName}'
|
|
273
|
-
description: |
|
|
274
|
-
Custom BMAD agent: ${agentName}
|
|
212
|
+
const rooCommandsDir = path.join(projectDir, this.configDir, this.commandsDir);
|
|
213
|
+
await this.ensureDir(rooCommandsDir);
|
|
275
214
|
|
|
276
|
-
|
|
215
|
+
const commandName = `bmad-custom-agent-${agentName.toLowerCase()}`;
|
|
216
|
+
const commandPath = path.join(rooCommandsDir, `${commandName}.md`);
|
|
277
217
|
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
@${agentPath}
|
|
281
|
-
always: false
|
|
282
|
-
permissions: all
|
|
283
|
-
`;
|
|
284
|
-
|
|
285
|
-
// Check if mode already exists
|
|
286
|
-
if (existingContent.includes(slug)) {
|
|
218
|
+
// Check if command already exists
|
|
219
|
+
if (await this.pathExists(commandPath)) {
|
|
287
220
|
return {
|
|
288
221
|
ide: 'roo',
|
|
289
|
-
path: this.
|
|
290
|
-
command:
|
|
222
|
+
path: path.join(this.configDir, this.commandsDir, `${commandName}.md`),
|
|
223
|
+
command: commandName,
|
|
291
224
|
type: 'custom-agent-launcher',
|
|
292
225
|
alreadyExists: true,
|
|
293
226
|
};
|
|
294
227
|
}
|
|
295
228
|
|
|
296
|
-
//
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
finalContent = 'customModes:\n' + modeEntry;
|
|
310
|
-
}
|
|
229
|
+
// Read the custom agent file to extract metadata (same as regular agents)
|
|
230
|
+
const fullAgentPath = path.join(projectDir, agentPath);
|
|
231
|
+
const content = await this.readFile(fullAgentPath);
|
|
232
|
+
|
|
233
|
+
// Extract metadata from agent content
|
|
234
|
+
const titleMatch = content.match(/title="([^"]+)"/);
|
|
235
|
+
const title = titleMatch ? titleMatch[1] : this.formatTitle(agentName);
|
|
236
|
+
|
|
237
|
+
const iconMatch = content.match(/icon="([^"]+)"/);
|
|
238
|
+
const icon = iconMatch ? iconMatch[1] : '🤖';
|
|
239
|
+
|
|
240
|
+
const whenToUseMatch = content.match(/whenToUse="([^"]+)"/);
|
|
241
|
+
const whenToUse = whenToUseMatch ? whenToUseMatch[1] : `Use for ${title} tasks`;
|
|
311
242
|
|
|
312
|
-
//
|
|
313
|
-
await this.
|
|
243
|
+
// Use unified method without extra content (clean)
|
|
244
|
+
await this.createAgentCommandFile(commandPath, {
|
|
245
|
+
name: title,
|
|
246
|
+
description: whenToUse,
|
|
247
|
+
agentPath: agentPath,
|
|
248
|
+
icon: icon,
|
|
249
|
+
});
|
|
314
250
|
|
|
315
251
|
return {
|
|
316
252
|
ide: 'roo',
|
|
317
|
-
path: this.
|
|
318
|
-
command:
|
|
253
|
+
path: path.join(this.configDir, this.commandsDir, `${commandName}.md`),
|
|
254
|
+
command: commandName,
|
|
319
255
|
type: 'custom-agent-launcher',
|
|
320
256
|
};
|
|
321
257
|
}
|
|
@@ -15,7 +15,7 @@ const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generat
|
|
|
15
15
|
*/
|
|
16
16
|
class RovoDevSetup extends BaseIdeSetup {
|
|
17
17
|
constructor() {
|
|
18
|
-
super('rovo-dev', 'Atlassian Rovo Dev',
|
|
18
|
+
super('rovo-dev', 'Atlassian Rovo Dev', false);
|
|
19
19
|
this.configDir = '.rovodev';
|
|
20
20
|
this.subagentsDir = 'subagents';
|
|
21
21
|
this.workflowsDir = 'workflows';
|
|
@@ -28,11 +28,13 @@ class AgentCommandGenerator {
|
|
|
28
28
|
|
|
29
29
|
for (const agent of agents) {
|
|
30
30
|
const launcherContent = await this.generateLauncherContent(agent);
|
|
31
|
+
// Use relativePath if available (for nested agents), otherwise just name with .md
|
|
32
|
+
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
|
|
31
33
|
artifacts.push({
|
|
32
34
|
type: 'agent-launcher',
|
|
33
35
|
module: agent.module,
|
|
34
36
|
name: agent.name,
|
|
35
|
-
relativePath: path.join(agent.module, 'agents',
|
|
37
|
+
relativePath: path.join(agent.module, 'agents', agentPathInModule),
|
|
36
38
|
content: launcherContent,
|
|
37
39
|
sourcePath: agent.path,
|
|
38
40
|
});
|
|
@@ -56,11 +58,15 @@ class AgentCommandGenerator {
|
|
|
56
58
|
const template = await fs.readFile(this.templatePath, 'utf8');
|
|
57
59
|
|
|
58
60
|
// Replace template variables
|
|
61
|
+
// Use relativePath if available (for nested agents), otherwise just name with .md
|
|
62
|
+
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
|
|
59
63
|
return template
|
|
60
64
|
.replaceAll('{{name}}', agent.name)
|
|
61
65
|
.replaceAll('{{module}}', agent.module)
|
|
66
|
+
.replaceAll('{{path}}', agentPathInModule)
|
|
62
67
|
.replaceAll('{{description}}', agent.description || `${agent.name} agent`)
|
|
63
|
-
.replaceAll('{bmad_folder}', this.bmadFolderName)
|
|
68
|
+
.replaceAll('{bmad_folder}', this.bmadFolderName)
|
|
69
|
+
.replaceAll('{*bmad_folder*}', '{bmad_folder}');
|
|
64
70
|
}
|
|
65
71
|
|
|
66
72
|
/**
|
|
@@ -76,36 +76,51 @@ async function getTasksFromBmad(bmadDir, selectedModules = []) {
|
|
|
76
76
|
return tasks;
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
async function getAgentsFromDir(dirPath, moduleName) {
|
|
79
|
+
async function getAgentsFromDir(dirPath, moduleName, relativePath = '') {
|
|
80
80
|
const agents = [];
|
|
81
81
|
|
|
82
82
|
if (!(await fs.pathExists(dirPath))) {
|
|
83
83
|
return agents;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
const
|
|
86
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
87
87
|
|
|
88
|
-
for (const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
88
|
+
for (const entry of entries) {
|
|
89
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
90
|
+
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
92
91
|
|
|
93
|
-
if (
|
|
94
|
-
|
|
95
|
-
|
|
92
|
+
if (entry.isDirectory()) {
|
|
93
|
+
// Recurse into subdirectories
|
|
94
|
+
const subDirAgents = await getAgentsFromDir(fullPath, moduleName, newRelativePath);
|
|
95
|
+
agents.push(...subDirAgents);
|
|
96
|
+
} else if (entry.name.endsWith('.md')) {
|
|
97
|
+
// Skip README files and other non-agent files
|
|
98
|
+
if (entry.name.toLowerCase() === 'readme.md' || entry.name.toLowerCase().startsWith('readme-')) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
96
101
|
|
|
97
|
-
|
|
98
|
-
|
|
102
|
+
if (entry.name.includes('.customize.')) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
99
105
|
|
|
100
|
-
|
|
101
|
-
continue;
|
|
102
|
-
}
|
|
106
|
+
const content = await fs.readFile(fullPath, 'utf8');
|
|
103
107
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
if (content.includes('localskip="true"')) {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Only include files that have agent-specific content (compiled agents have <agent> tag)
|
|
113
|
+
if (!content.includes('<agent')) {
|
|
114
|
+
continue;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
agents.push({
|
|
118
|
+
path: fullPath,
|
|
119
|
+
name: entry.name.replace('.md', ''),
|
|
120
|
+
module: moduleName,
|
|
121
|
+
relativePath: newRelativePath, // Keep the .md extension for the full path
|
|
122
|
+
});
|
|
123
|
+
}
|
|
109
124
|
}
|
|
110
125
|
|
|
111
126
|
return agents;
|
|
@@ -25,16 +25,16 @@ class WorkflowCommandGenerator {
|
|
|
25
25
|
return { generated: 0 };
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
//
|
|
29
|
-
const
|
|
28
|
+
// ALL workflows now generate commands - no standalone filtering
|
|
29
|
+
const allWorkflows = workflows;
|
|
30
30
|
|
|
31
31
|
// Base commands directory
|
|
32
32
|
const baseCommandsDir = path.join(projectDir, '.claude', 'commands', 'bmad');
|
|
33
33
|
|
|
34
34
|
let generatedCount = 0;
|
|
35
35
|
|
|
36
|
-
// Generate a command file for each
|
|
37
|
-
for (const workflow of
|
|
36
|
+
// Generate a command file for each workflow, organized by module
|
|
37
|
+
for (const workflow of allWorkflows) {
|
|
38
38
|
const moduleWorkflowsDir = path.join(baseCommandsDir, workflow.module, 'workflows');
|
|
39
39
|
await fs.ensureDir(moduleWorkflowsDir);
|
|
40
40
|
|
|
@@ -46,7 +46,7 @@ class WorkflowCommandGenerator {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
// Also create a workflow launcher README in each module
|
|
49
|
-
const groupedWorkflows = this.groupWorkflowsByModule(
|
|
49
|
+
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
|
|
50
50
|
await this.createModuleWorkflowLaunchers(baseCommandsDir, groupedWorkflows);
|
|
51
51
|
|
|
52
52
|
return { generated: generatedCount };
|
|
@@ -59,12 +59,12 @@ class WorkflowCommandGenerator {
|
|
|
59
59
|
return { artifacts: [], counts: { commands: 0, launchers: 0 } };
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
//
|
|
63
|
-
const
|
|
62
|
+
// ALL workflows now generate commands - no standalone filtering
|
|
63
|
+
const allWorkflows = workflows;
|
|
64
64
|
|
|
65
65
|
const artifacts = [];
|
|
66
66
|
|
|
67
|
-
for (const workflow of
|
|
67
|
+
for (const workflow of allWorkflows) {
|
|
68
68
|
const commandContent = await this.generateCommandContent(workflow, bmadDir);
|
|
69
69
|
artifacts.push({
|
|
70
70
|
type: 'workflow-command',
|
|
@@ -75,7 +75,7 @@ class WorkflowCommandGenerator {
|
|
|
75
75
|
});
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
const groupedWorkflows = this.groupWorkflowsByModule(
|
|
78
|
+
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
|
|
79
79
|
for (const [module, launcherContent] of Object.entries(this.buildModuleWorkflowLaunchers(groupedWorkflows))) {
|
|
80
80
|
artifacts.push({
|
|
81
81
|
type: 'workflow-launcher',
|
|
@@ -89,7 +89,7 @@ class WorkflowCommandGenerator {
|
|
|
89
89
|
return {
|
|
90
90
|
artifacts,
|
|
91
91
|
counts: {
|
|
92
|
-
commands:
|
|
92
|
+
commands: allWorkflows.length,
|
|
93
93
|
launchers: Object.keys(groupedWorkflows).length,
|
|
94
94
|
},
|
|
95
95
|
};
|
|
@@ -99,8 +99,13 @@ class WorkflowCommandGenerator {
|
|
|
99
99
|
* Generate command content for a workflow
|
|
100
100
|
*/
|
|
101
101
|
async generateCommandContent(workflow, bmadDir) {
|
|
102
|
-
//
|
|
103
|
-
const
|
|
102
|
+
// Determine template based on workflow file type
|
|
103
|
+
const isMarkdownWorkflow = workflow.path.endsWith('workflow.md');
|
|
104
|
+
const templateName = isMarkdownWorkflow ? 'workflow-commander.md' : 'workflow-command-template.md';
|
|
105
|
+
const templatePath = path.join(path.dirname(this.templatePath), templateName);
|
|
106
|
+
|
|
107
|
+
// Load the appropriate template
|
|
108
|
+
const template = await fs.readFile(templatePath, 'utf8');
|
|
104
109
|
|
|
105
110
|
// Convert source path to installed path
|
|
106
111
|
// From: /Users/.../src/modules/bmm/workflows/.../workflow.yaml
|
|
@@ -127,8 +132,7 @@ class WorkflowCommandGenerator {
|
|
|
127
132
|
.replaceAll('{{description}}', workflow.description)
|
|
128
133
|
.replaceAll('{{workflow_path}}', workflowPath)
|
|
129
134
|
.replaceAll('{bmad_folder}', this.bmadFolderName)
|
|
130
|
-
.replaceAll('{
|
|
131
|
-
.replaceAll('{{author}}', workflow.author || 'BMAD');
|
|
135
|
+
.replaceAll('{*bmad_folder*}', '{bmad_folder}');
|
|
132
136
|
}
|
|
133
137
|
|
|
134
138
|
/**
|
|
@@ -6,7 +6,7 @@ description: '{{description}}'
|
|
|
6
6
|
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
|
|
7
7
|
|
|
8
8
|
<agent-activation CRITICAL="TRUE">
|
|
9
|
-
1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{
|
|
9
|
+
1. LOAD the FULL agent file from @{bmad_folder}/{{module}}/agents/{{path}}
|
|
10
10
|
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
11
11
|
3. Execute ALL activation steps exactly as written in the agent file
|
|
12
12
|
4. Follow the agent's persona and menu system precisely
|