observer-ggboy-bmad-method 6.0.0-alpha.23
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 +40 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/FUNDING.yaml +15 -0
- package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
- package/.github/ISSUE_TEMPLATE/issue.md +32 -0
- package/.github/scripts/discord-helpers.sh +34 -0
- package/.github/workflows/bundle-latest.yaml +330 -0
- package/.github/workflows/discord.yaml +90 -0
- package/.github/workflows/docs.yaml +63 -0
- package/.github/workflows/manual-release.yaml +190 -0
- package/.github/workflows/quality.yaml +115 -0
- package/.health-status.json +7 -0
- package/.husky/pre-commit +20 -0
- package/.markdownlint-cli2.yaml +41 -0
- package/.nvmrc +1 -0
- package/.prettierignore +9 -0
- package/.vscode/settings.json +97 -0
- package/CHANGELOG.md +1394 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +167 -0
- package/CONTRIBUTORS.md +32 -0
- package/LICENSE +30 -0
- package/README.md +100 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/bmad-method-6.0.0-alpha.23.tgz +0 -0
- package/docs/404.md +9 -0
- package/docs/_README_WORKFLOW_DIAGRAMS.md +40 -0
- package/docs/_STYLE_GUIDE.md +367 -0
- package/docs/_archive/customize-workflows.md +30 -0
- package/docs/_archive/getting-started-bmadv4.md +247 -0
- package/docs/_archive/vendor-workflows.md +52 -0
- package/docs/downloads.md +72 -0
- package/docs/explanation/agents/barry-quick-flow.md +328 -0
- package/docs/explanation/agents/index.md +19 -0
- package/docs/explanation/architecture/four-phases.md +107 -0
- package/docs/explanation/architecture/preventing-agent-conflicts.md +111 -0
- package/docs/explanation/architecture/why-solutioning-matters.md +75 -0
- package/docs/explanation/bmm/index.md +131 -0
- package/docs/explanation/core/index.md +18 -0
- package/docs/explanation/core-concepts/agent-roles.md +179 -0
- package/docs/explanation/core-concepts/index.md +35 -0
- package/docs/explanation/core-concepts/what-are-agents.md +97 -0
- package/docs/explanation/core-concepts/what-are-modules.md +85 -0
- package/docs/explanation/core-concepts/what-are-workflows.md +204 -0
- package/docs/explanation/faq/brownfield-faq.md +73 -0
- package/docs/explanation/faq/getting-started-faq.md +67 -0
- package/docs/explanation/faq/implementation-faq.md +52 -0
- package/docs/explanation/faq/index.md +16 -0
- package/docs/explanation/faq/levels-and-tracks-faq.md +52 -0
- package/docs/explanation/faq/planning-faq.md +41 -0
- package/docs/explanation/faq/tools-faq.md +277 -0
- package/docs/explanation/faq/workflows-faq.md +61 -0
- package/docs/explanation/features/advanced-elicitation.md +95 -0
- package/docs/explanation/features/brainstorming-techniques.md +92 -0
- package/docs/explanation/features/party-mode.md +95 -0
- package/docs/explanation/features/quick-flow.md +149 -0
- package/docs/explanation/features/tea-overview.md +410 -0
- package/docs/explanation/features/web-bundles.md +34 -0
- package/docs/explanation/philosophy/facilitation-over-generation.md +333 -0
- package/docs/explanation/philosophy/testing-as-engineering.md +112 -0
- package/docs/explanation/tea/engagement-models.md +710 -0
- package/docs/explanation/tea/fixture-architecture.md +457 -0
- package/docs/explanation/tea/knowledge-base-system.md +554 -0
- package/docs/explanation/tea/network-first-patterns.md +853 -0
- package/docs/explanation/tea/risk-based-testing.md +586 -0
- package/docs/explanation/tea/test-quality-standards.md +907 -0
- package/docs/how-to/brownfield/add-feature-to-existing.md +74 -0
- package/docs/how-to/brownfield/document-existing-project.md +66 -0
- package/docs/how-to/brownfield/index.md +84 -0
- package/docs/how-to/brownfield/quick-fix-in-brownfield.md +77 -0
- package/docs/how-to/brownfield/use-tea-for-enterprise.md +525 -0
- package/docs/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
- package/docs/how-to/customization/customize-agents.md +212 -0
- package/docs/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
- package/docs/how-to/customization/index.md +23 -0
- package/docs/how-to/customization/integrate-playwright-utils.md +813 -0
- package/docs/how-to/customization/shard-large-documents.md +101 -0
- package/docs/how-to/get-answers-about-bmad.md +102 -0
- package/docs/how-to/installation/index.md +12 -0
- package/docs/how-to/installation/install-bmad.md +111 -0
- package/docs/how-to/installation/install-custom-modules.md +118 -0
- package/docs/how-to/installation/upgrade-to-v6.md +131 -0
- package/docs/how-to/workflows/bmgd-quick-flow.md +156 -0
- package/docs/how-to/workflows/conduct-research.md +97 -0
- package/docs/how-to/workflows/create-architecture.md +119 -0
- package/docs/how-to/workflows/create-epics-and-stories.md +109 -0
- package/docs/how-to/workflows/create-prd.md +91 -0
- package/docs/how-to/workflows/create-product-brief.md +94 -0
- package/docs/how-to/workflows/create-story.md +102 -0
- package/docs/how-to/workflows/create-ux-design.md +100 -0
- package/docs/how-to/workflows/implement-story.md +97 -0
- package/docs/how-to/workflows/quick-spec.md +122 -0
- package/docs/how-to/workflows/run-atdd.md +436 -0
- package/docs/how-to/workflows/run-automate.md +653 -0
- package/docs/how-to/workflows/run-brainstorming-session.md +73 -0
- package/docs/how-to/workflows/run-code-review.md +89 -0
- package/docs/how-to/workflows/run-implementation-readiness.md +125 -0
- package/docs/how-to/workflows/run-nfr-assess.md +679 -0
- package/docs/how-to/workflows/run-sprint-planning.md +94 -0
- package/docs/how-to/workflows/run-test-design.md +135 -0
- package/docs/how-to/workflows/run-test-review.md +605 -0
- package/docs/how-to/workflows/run-trace.md +883 -0
- package/docs/how-to/workflows/setup-ci.md +712 -0
- package/docs/how-to/workflows/setup-party-mode.md +89 -0
- package/docs/how-to/workflows/setup-test-framework.md +98 -0
- package/docs/index.md +63 -0
- package/docs/reference/agents/index.md +109 -0
- package/docs/reference/configuration/core-tasks.md +67 -0
- package/docs/reference/configuration/global-config.md +28 -0
- package/docs/reference/glossary/index.md +159 -0
- package/docs/reference/tea/commands.md +276 -0
- package/docs/reference/tea/configuration.md +678 -0
- package/docs/reference/tea/knowledge-base.md +340 -0
- package/docs/reference/workflows/core-workflows.md +32 -0
- package/docs/reference/workflows/document-project.md +73 -0
- package/docs/reference/workflows/index.md +12 -0
- package/docs/tutorials/getting-started/getting-started-bmadv6.md +246 -0
- package/docs/tutorials/getting-started/images/workflow-method-greenfield.excalidraw +5034 -0
- package/docs/tutorials/getting-started/images/workflow-method-greenfield.svg +4 -0
- package/docs/tutorials/getting-started/images/workflow-overview.jpg +0 -0
- package/docs/tutorials/getting-started/tea-lite-quickstart.md +444 -0
- package/docs/tutorials/getting-started/workflow-overview.jpg +0 -0
- package/eslint.config.mjs +152 -0
- package/package.json +117 -0
- package/prettier.config.mjs +32 -0
- package/src/bmm/_module-installer/installer.js +48 -0
- package/src/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
- package/src/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
- package/src/bmm/agents/analyst.agent.yaml +36 -0
- package/src/bmm/agents/architect.agent.yaml +28 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/pm.agent.yaml +46 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +36 -0
- package/src/bmm/agents/tea.agent.yaml +63 -0
- package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
- package/src/bmm/agents/ux-designer.agent.yaml +26 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/module-help.csv +32 -0
- package/src/bmm/module.yaml +44 -0
- package/src/bmm/sub-modules/claude-code/config.yaml +4 -0
- package/src/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/src/bmm/sub-modules/claude-code/readme.md +87 -0
- package/src/bmm/teams/default-party.csv +21 -0
- package/src/bmm/teams/team-fullstack.yaml +12 -0
- package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
- package/src/bmm/testarch/knowledge/api-request.md +442 -0
- package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
- package/src/bmm/testarch/knowledge/auth-session.md +552 -0
- package/src/bmm/testarch/knowledge/burn-in.md +273 -0
- package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/bmm/testarch/knowledge/file-utils.md +463 -0
- package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
- package/src/bmm/testarch/knowledge/log.md +429 -0
- package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
- package/src/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
- package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/bmm/testarch/knowledge/overview.md +286 -0
- package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/bmm/testarch/knowledge/recurse.md +421 -0
- package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/bmm/testarch/tea-index.csv +35 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
- package/src/bmm/workflows/2-plan-workflows/prd/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/2-plan-workflows/prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01-init.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-01b-continue.md +153 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-02-discovery.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-03-success.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-04-journeys.md +213 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-05-domain.md +207 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-06-innovation.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-07-project-type.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-08-scoping.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-09-functional.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-10-nonfunctional.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-11-polish.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-c/step-12-complete.md +124 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01-discovery.md +247 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-02-review.md +249 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-03-edit.md +253 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-e/step-e-04-complete.md +168 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-01-discovery.md +218 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02-format-detection.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-03-density-validation.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/prd/steps-v/step-v-13-report-complete.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/prd/validation-report-prd-workflow.md +433 -0
- package/src/bmm/workflows/2-plan-workflows/prd/workflow.md +150 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
- package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/data/project-levels.yaml +59 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +156 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +140 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +191 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/src/bmm/workflows/document-project/checklist.md +245 -0
- package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/bmm/workflows/document-project/instructions.md +221 -0
- package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/bmm/workflows/document-project/workflow.yaml +30 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
- package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
- package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
- package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
- package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
- package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
- package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
- package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
- package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
- package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
- package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
- package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
- package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
- package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
- package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
- package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
- package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
- package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
- package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
- package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
- package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
- package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
- package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
- package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
- package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
- package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
- package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/core/_module-installer/installer.js +60 -0
- package/src/core/agents/bmad-master.agent.yaml +29 -0
- package/src/core/module-help.csv +9 -0
- package/src/core/module.yaml +25 -0
- package/src/core/resources/excalidraw/README.md +160 -0
- package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
- package/src/core/resources/excalidraw/library-loader.md +50 -0
- package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
- package/src/core/tasks/editorial-review-prose.xml +100 -0
- package/src/core/tasks/editorial-review-structure.xml +209 -0
- package/src/core/tasks/help.md +62 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +48 -0
- package/src/core/tasks/shard-doc.xml +109 -0
- package/src/core/tasks/workflow.xml +235 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +15 -0
- package/src/core/workflows/brainstorming/workflow.md +58 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/utility/agent-components/activation-rules.txt +6 -0
- package/src/utility/agent-components/activation-steps.txt +14 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/agent-components/agent.customize.template.yaml +41 -0
- package/src/utility/agent-components/handler-action.txt +4 -0
- package/src/utility/agent-components/handler-data.txt +5 -0
- package/src/utility/agent-components/handler-exec.txt +6 -0
- package/src/utility/agent-components/handler-multi.txt +14 -0
- package/src/utility/agent-components/handler-tmpl.txt +5 -0
- package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
- package/src/utility/agent-components/handler-workflow.txt +10 -0
- package/src/utility/agent-components/menu-handlers.txt +6 -0
- package/test/README.md +295 -0
- package/test/adversarial-review-tests/README.md +56 -0
- package/test/adversarial-review-tests/sample-content.md +46 -0
- package/test/adversarial-review-tests/test-cases.yaml +103 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
- package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-installation-components.js +214 -0
- package/test/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/build-docs.js +577 -0
- package/tools/cli/README.md +7 -0
- package/tools/cli/bmad-cli.js +58 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/external-official-modules.yaml +56 -0
- package/tools/cli/installers/install-messages.yaml +58 -0
- package/tools/cli/installers/lib/core/config-collector.js +1079 -0
- package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
- package/tools/cli/installers/lib/core/detector.js +223 -0
- package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
- package/tools/cli/installers/lib/core/installer.js +2826 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
- package/tools/cli/installers/lib/core/manifest.js +1036 -0
- package/tools/cli/installers/lib/custom/handler.js +363 -0
- package/tools/cli/installers/lib/ide/STANDARDIZATION_PLAN.md +208 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
- package/tools/cli/installers/lib/ide/antigravity.js +474 -0
- package/tools/cli/installers/lib/ide/auggie.js +244 -0
- package/tools/cli/installers/lib/ide/claude-code.js +506 -0
- package/tools/cli/installers/lib/ide/cline.js +272 -0
- package/tools/cli/installers/lib/ide/codex.js +412 -0
- package/tools/cli/installers/lib/ide/crush.js +149 -0
- package/tools/cli/installers/lib/ide/cursor.js +160 -0
- package/tools/cli/installers/lib/ide/gemini.js +301 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
- package/tools/cli/installers/lib/ide/iflow.js +191 -0
- package/tools/cli/installers/lib/ide/kilo.js +250 -0
- package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
- package/tools/cli/installers/lib/ide/manager.js +244 -0
- package/tools/cli/installers/lib/ide/opencode.js +257 -0
- package/tools/cli/installers/lib/ide/qwen.js +372 -0
- package/tools/cli/installers/lib/ide/roo.js +273 -0
- package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +165 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +165 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +268 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +293 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/ide/trae.js +313 -0
- package/tools/cli/installers/lib/ide/windsurf.js +258 -0
- package/tools/cli/installers/lib/message-loader.js +85 -0
- package/tools/cli/installers/lib/modules/external-manager.js +135 -0
- package/tools/cli/installers/lib/modules/manager.js +1375 -0
- package/tools/cli/lib/activation-builder.js +163 -0
- package/tools/cli/lib/agent/compiler.js +522 -0
- package/tools/cli/lib/agent/installer.js +716 -0
- package/tools/cli/lib/agent/template-engine.js +152 -0
- package/tools/cli/lib/agent-analyzer.js +109 -0
- package/tools/cli/lib/agent-party-generator.js +194 -0
- package/tools/cli/lib/cli-utils.js +227 -0
- package/tools/cli/lib/config.js +213 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +77 -0
- package/tools/cli/lib/prompts.js +433 -0
- package/tools/cli/lib/ui.js +1716 -0
- package/tools/cli/lib/xml-handler.js +177 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/cli/lib/yaml-format.js +245 -0
- package/tools/cli/lib/yaml-xml-builder.js +587 -0
- package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/tools/docs/index.md +2 -0
- package/tools/fix-doc-links.js +288 -0
- package/tools/flattener/aggregate.js +76 -0
- package/tools/flattener/binary.js +80 -0
- package/tools/flattener/discovery.js +71 -0
- package/tools/flattener/files.js +35 -0
- package/tools/flattener/ignoreRules.js +172 -0
- package/tools/flattener/main.js +483 -0
- package/tools/flattener/projectRoot.js +201 -0
- package/tools/flattener/prompts.js +44 -0
- package/tools/flattener/stats.helpers.js +368 -0
- package/tools/flattener/stats.js +75 -0
- package/tools/flattener/test-matrix.js +409 -0
- package/tools/flattener/xml.js +82 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/lib/xml-utils.js +13 -0
- 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/platform-codes.yaml +157 -0
- package/tools/schema/agent.js +491 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +363 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/website/README.md +76 -0
- package/website/astro.config.mjs +228 -0
- package/website/public/favicon.ico +0 -0
- package/website/public/img/bmad-dark.png +0 -0
- package/website/public/img/bmad-light.png +0 -0
- package/website/public/img/logo.svg +4 -0
- package/website/public/robots.txt +37 -0
- package/website/src/components/Banner.astro +59 -0
- package/website/src/components/Header.astro +121 -0
- package/website/src/components/MobileMenuFooter.astro +53 -0
- package/website/src/content/config.ts +6 -0
- package/website/src/lib/site-url.js +25 -0
- package/website/src/rehype-markdown-links.js +102 -0
- package/website/src/styles/custom.css +485 -0
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
5
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
6
|
+
const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
|
|
7
|
+
const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Rovo Dev IDE setup handler
|
|
11
|
+
*
|
|
12
|
+
* Installs BMAD agents as Rovo Dev subagents in .rovodev/subagents/
|
|
13
|
+
* Installs workflows and tasks/tools as reference guides in .rovodev/
|
|
14
|
+
* Rovo Dev automatically discovers agents and integrates with BMAD like other IDEs
|
|
15
|
+
*/
|
|
16
|
+
class RovoDevSetup extends BaseIdeSetup {
|
|
17
|
+
constructor() {
|
|
18
|
+
super('rovo-dev', 'Atlassian Rovo Dev', false);
|
|
19
|
+
this.configDir = '.rovodev';
|
|
20
|
+
this.subagentsDir = 'subagents';
|
|
21
|
+
this.workflowsDir = 'workflows';
|
|
22
|
+
this.referencesDir = 'references';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Cleanup old BMAD installation before reinstalling
|
|
27
|
+
* @param {string} projectDir - Project directory
|
|
28
|
+
*/
|
|
29
|
+
async cleanup(projectDir) {
|
|
30
|
+
const rovoDevDir = path.join(projectDir, this.configDir);
|
|
31
|
+
|
|
32
|
+
if (!(await fs.pathExists(rovoDevDir))) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Clean BMAD agents from subagents directory
|
|
37
|
+
const subagentsDir = path.join(rovoDevDir, this.subagentsDir);
|
|
38
|
+
if (await fs.pathExists(subagentsDir)) {
|
|
39
|
+
const entries = await fs.readdir(subagentsDir);
|
|
40
|
+
const bmadFiles = entries.filter((file) => file.startsWith('bmad') && file.endsWith('.md'));
|
|
41
|
+
|
|
42
|
+
for (const file of bmadFiles) {
|
|
43
|
+
await fs.remove(path.join(subagentsDir, file));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Clean BMAD workflows from workflows directory
|
|
48
|
+
const workflowsDir = path.join(rovoDevDir, this.workflowsDir);
|
|
49
|
+
if (await fs.pathExists(workflowsDir)) {
|
|
50
|
+
const entries = await fs.readdir(workflowsDir);
|
|
51
|
+
const bmadFiles = entries.filter((file) => file.startsWith('bmad') && file.endsWith('.md'));
|
|
52
|
+
|
|
53
|
+
for (const file of bmadFiles) {
|
|
54
|
+
await fs.remove(path.join(workflowsDir, file));
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Clean BMAD tasks/tools from references directory
|
|
59
|
+
const referencesDir = path.join(rovoDevDir, this.referencesDir);
|
|
60
|
+
if (await fs.pathExists(referencesDir)) {
|
|
61
|
+
const entries = await fs.readdir(referencesDir);
|
|
62
|
+
const bmadFiles = entries.filter((file) => file.startsWith('bmad') && file.endsWith('.md'));
|
|
63
|
+
|
|
64
|
+
for (const file of bmadFiles) {
|
|
65
|
+
await fs.remove(path.join(referencesDir, file));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Setup Rovo Dev configuration
|
|
72
|
+
* @param {string} projectDir - Project directory
|
|
73
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
74
|
+
* @param {Object} options - Setup options
|
|
75
|
+
*/
|
|
76
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
77
|
+
console.log(chalk.cyan(`Setting up ${this.name}...`));
|
|
78
|
+
|
|
79
|
+
// Clean up old BMAD installation first
|
|
80
|
+
await this.cleanup(projectDir);
|
|
81
|
+
|
|
82
|
+
// Create .rovodev directory structure
|
|
83
|
+
const rovoDevDir = path.join(projectDir, this.configDir);
|
|
84
|
+
const subagentsDir = path.join(rovoDevDir, this.subagentsDir);
|
|
85
|
+
const workflowsDir = path.join(rovoDevDir, this.workflowsDir);
|
|
86
|
+
const referencesDir = path.join(rovoDevDir, this.referencesDir);
|
|
87
|
+
|
|
88
|
+
await this.ensureDir(subagentsDir);
|
|
89
|
+
await this.ensureDir(workflowsDir);
|
|
90
|
+
await this.ensureDir(referencesDir);
|
|
91
|
+
|
|
92
|
+
// Generate and install agents
|
|
93
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
94
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
95
|
+
|
|
96
|
+
let agentCount = 0;
|
|
97
|
+
for (const artifact of agentArtifacts) {
|
|
98
|
+
const subagentFilename = `bmad-${artifact.module}-${artifact.name}.md`;
|
|
99
|
+
const targetPath = path.join(subagentsDir, subagentFilename);
|
|
100
|
+
const subagentContent = this.convertToRovoDevSubagent(artifact.content, artifact.name, artifact.module);
|
|
101
|
+
await this.writeFile(targetPath, subagentContent);
|
|
102
|
+
agentCount++;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Generate and install workflows
|
|
106
|
+
const workflowGen = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
107
|
+
const { artifacts: workflowArtifacts, counts: workflowCounts } = await workflowGen.collectWorkflowArtifacts(bmadDir);
|
|
108
|
+
|
|
109
|
+
let workflowCount = 0;
|
|
110
|
+
for (const artifact of workflowArtifacts) {
|
|
111
|
+
if (artifact.type === 'workflow-command') {
|
|
112
|
+
const workflowFilename = path.basename(artifact.relativePath);
|
|
113
|
+
const targetPath = path.join(workflowsDir, workflowFilename);
|
|
114
|
+
await this.writeFile(targetPath, artifact.content);
|
|
115
|
+
workflowCount++;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Generate and install tasks and tools
|
|
120
|
+
const taskToolGen = new TaskToolCommandGenerator();
|
|
121
|
+
const { tasks: taskCount, tools: toolCount } = await this.generateTaskToolReferences(bmadDir, referencesDir, taskToolGen);
|
|
122
|
+
|
|
123
|
+
// Summary output
|
|
124
|
+
console.log(chalk.green(`✓ ${this.name} configured:`));
|
|
125
|
+
console.log(chalk.dim(` - ${agentCount} agents installed to .rovodev/subagents/`));
|
|
126
|
+
if (workflowCount > 0) {
|
|
127
|
+
console.log(chalk.dim(` - ${workflowCount} workflows installed to .rovodev/workflows/`));
|
|
128
|
+
}
|
|
129
|
+
if (taskCount + toolCount > 0) {
|
|
130
|
+
console.log(
|
|
131
|
+
chalk.dim(` - ${taskCount + toolCount} tasks/tools installed to .rovodev/references/ (${taskCount} tasks, ${toolCount} tools)`),
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
console.log(chalk.yellow(`\n Note: Agents are automatically discovered by Rovo Dev`));
|
|
135
|
+
console.log(chalk.dim(` - Access agents by typing @ in Rovo Dev to see available options`));
|
|
136
|
+
console.log(chalk.dim(` - Workflows and references are available in .rovodev/ directory`));
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
success: true,
|
|
140
|
+
agents: agentCount,
|
|
141
|
+
workflows: workflowCount,
|
|
142
|
+
tasks: taskCount,
|
|
143
|
+
tools: toolCount,
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Generate task and tool reference guides
|
|
149
|
+
* @param {string} bmadDir - BMAD directory
|
|
150
|
+
* @param {string} referencesDir - References directory
|
|
151
|
+
* @param {TaskToolCommandGenerator} taskToolGen - Generator instance
|
|
152
|
+
*/
|
|
153
|
+
async generateTaskToolReferences(bmadDir, referencesDir, taskToolGen) {
|
|
154
|
+
const tasks = await taskToolGen.loadTaskManifest(bmadDir);
|
|
155
|
+
const tools = await taskToolGen.loadToolManifest(bmadDir);
|
|
156
|
+
|
|
157
|
+
const standaloneTasks = tasks ? tasks.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
|
|
158
|
+
const standaloneTools = tools ? tools.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
|
|
159
|
+
|
|
160
|
+
let taskCount = 0;
|
|
161
|
+
for (const task of standaloneTasks) {
|
|
162
|
+
const commandContent = taskToolGen.generateCommandContent(task, 'task');
|
|
163
|
+
const targetPath = path.join(referencesDir, `bmad-task-${task.module}-${task.name}.md`);
|
|
164
|
+
await this.writeFile(targetPath, commandContent);
|
|
165
|
+
taskCount++;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
let toolCount = 0;
|
|
169
|
+
for (const tool of standaloneTools) {
|
|
170
|
+
const commandContent = taskToolGen.generateCommandContent(tool, 'tool');
|
|
171
|
+
const targetPath = path.join(referencesDir, `bmad-tool-${tool.module}-${tool.name}.md`);
|
|
172
|
+
await this.writeFile(targetPath, commandContent);
|
|
173
|
+
toolCount++;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return { tasks: taskCount, tools: toolCount };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Convert BMAD agent launcher to Rovo Dev subagent format
|
|
181
|
+
*
|
|
182
|
+
* Rovo Dev subagents use Markdown files with YAML frontmatter containing:
|
|
183
|
+
* - name: Unique identifier for the subagent
|
|
184
|
+
* - description: One-line description of the subagent's purpose
|
|
185
|
+
* - tools: Array of tools the subagent can use (optional)
|
|
186
|
+
* - model: Specific model for this subagent (optional)
|
|
187
|
+
* - load_memory: Whether to load memory files (optional, defaults to true)
|
|
188
|
+
*
|
|
189
|
+
* @param {string} launcherContent - Original agent launcher content
|
|
190
|
+
* @param {string} agentName - Name of the agent
|
|
191
|
+
* @param {string} moduleName - Name of the module
|
|
192
|
+
* @returns {string} Rovo Dev subagent-formatted content
|
|
193
|
+
*/
|
|
194
|
+
convertToRovoDevSubagent(launcherContent, agentName, moduleName) {
|
|
195
|
+
// Extract metadata from the launcher XML
|
|
196
|
+
const titleMatch = launcherContent.match(/title="([^"]+)"/);
|
|
197
|
+
const title = titleMatch ? titleMatch[1] : this.formatTitle(agentName);
|
|
198
|
+
|
|
199
|
+
const descriptionMatch = launcherContent.match(/description="([^"]+)"/);
|
|
200
|
+
const description = descriptionMatch ? descriptionMatch[1] : `BMAD agent: ${title}`;
|
|
201
|
+
|
|
202
|
+
const roleDefinitionMatch = launcherContent.match(/roleDefinition="([^"]+)"/);
|
|
203
|
+
const roleDefinition = roleDefinitionMatch ? roleDefinitionMatch[1] : `You are a specialized agent for ${title.toLowerCase()} tasks.`;
|
|
204
|
+
|
|
205
|
+
// Extract the main system prompt from the launcher (content after closing tags)
|
|
206
|
+
let systemPrompt = roleDefinition;
|
|
207
|
+
|
|
208
|
+
// Try to extract additional instructions from the launcher content
|
|
209
|
+
const instructionsMatch = launcherContent.match(/<instructions>([\s\S]*?)<\/instructions>/);
|
|
210
|
+
if (instructionsMatch) {
|
|
211
|
+
systemPrompt += '\n\n' + instructionsMatch[1].trim();
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Build YAML frontmatter for Rovo Dev subagent
|
|
215
|
+
const frontmatter = {
|
|
216
|
+
name: `bmad-${moduleName}-${agentName}`,
|
|
217
|
+
description: description,
|
|
218
|
+
// Note: tools and model can be added by users in their .rovodev/subagents/*.md files
|
|
219
|
+
// We don't enforce specific tools since BMAD agents are flexible
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// Create YAML frontmatter string with proper quoting for special characters
|
|
223
|
+
let yamlContent = '---\n';
|
|
224
|
+
yamlContent += `name: ${frontmatter.name}\n`;
|
|
225
|
+
// Quote description to handle colons and other special characters in YAML
|
|
226
|
+
yamlContent += `description: "${frontmatter.description.replaceAll('"', String.raw`\"`)}"\n`;
|
|
227
|
+
yamlContent += '---\n';
|
|
228
|
+
|
|
229
|
+
// Combine frontmatter with system prompt
|
|
230
|
+
const subagentContent = yamlContent + systemPrompt;
|
|
231
|
+
|
|
232
|
+
return subagentContent;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
* Detect whether Rovo Dev is already configured in the project
|
|
237
|
+
* @param {string} projectDir - Project directory
|
|
238
|
+
* @returns {boolean}
|
|
239
|
+
*/
|
|
240
|
+
async detect(projectDir) {
|
|
241
|
+
const rovoDevDir = path.join(projectDir, this.configDir);
|
|
242
|
+
|
|
243
|
+
if (!(await fs.pathExists(rovoDevDir))) {
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Check for BMAD agents in subagents directory
|
|
248
|
+
const subagentsDir = path.join(rovoDevDir, this.subagentsDir);
|
|
249
|
+
if (await fs.pathExists(subagentsDir)) {
|
|
250
|
+
try {
|
|
251
|
+
const entries = await fs.readdir(subagentsDir);
|
|
252
|
+
if (entries.some((entry) => entry.startsWith('bmad') && entry.endsWith('.md'))) {
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
} catch {
|
|
256
|
+
// Continue checking other directories
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// Check for BMAD workflows in workflows directory
|
|
261
|
+
const workflowsDir = path.join(rovoDevDir, this.workflowsDir);
|
|
262
|
+
if (await fs.pathExists(workflowsDir)) {
|
|
263
|
+
try {
|
|
264
|
+
const entries = await fs.readdir(workflowsDir);
|
|
265
|
+
if (entries.some((entry) => entry.startsWith('bmad') && entry.endsWith('.md'))) {
|
|
266
|
+
return true;
|
|
267
|
+
}
|
|
268
|
+
} catch {
|
|
269
|
+
// Continue checking other directories
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Check for BMAD tasks/tools in references directory
|
|
274
|
+
const referencesDir = path.join(rovoDevDir, this.referencesDir);
|
|
275
|
+
if (await fs.pathExists(referencesDir)) {
|
|
276
|
+
try {
|
|
277
|
+
const entries = await fs.readdir(referencesDir);
|
|
278
|
+
if (entries.some((entry) => entry.startsWith('bmad') && entry.endsWith('.md'))) {
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
} catch {
|
|
282
|
+
// Continue
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
module.exports = { RovoDevSetup };
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const { toColonPath, toDashPath, customAgentColonName, customAgentDashName } = require('./path-utils');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generates launcher command files for each agent
|
|
8
|
+
* Similar to WorkflowCommandGenerator but for agents
|
|
9
|
+
*/
|
|
10
|
+
class AgentCommandGenerator {
|
|
11
|
+
constructor(bmadFolderName = 'bmad') {
|
|
12
|
+
this.templatePath = path.join(__dirname, '../templates/agent-command-template.md');
|
|
13
|
+
this.bmadFolderName = bmadFolderName;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Collect agent artifacts for IDE installation
|
|
18
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
19
|
+
* @param {Array} selectedModules - Modules to include
|
|
20
|
+
* @returns {Object} Artifacts array with metadata
|
|
21
|
+
*/
|
|
22
|
+
async collectAgentArtifacts(bmadDir, selectedModules = []) {
|
|
23
|
+
const { getAgentsFromBmad } = require('./bmad-artifacts');
|
|
24
|
+
|
|
25
|
+
// Get agents from INSTALLED bmad/ directory
|
|
26
|
+
const agents = await getAgentsFromBmad(bmadDir, selectedModules);
|
|
27
|
+
|
|
28
|
+
const artifacts = [];
|
|
29
|
+
|
|
30
|
+
for (const agent of agents) {
|
|
31
|
+
const launcherContent = await this.generateLauncherContent(agent);
|
|
32
|
+
// Use relativePath if available (for nested agents), otherwise just name with .md
|
|
33
|
+
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
|
|
34
|
+
artifacts.push({
|
|
35
|
+
type: 'agent-launcher',
|
|
36
|
+
module: agent.module,
|
|
37
|
+
name: agent.name,
|
|
38
|
+
relativePath: path.join(agent.module, 'agents', agentPathInModule),
|
|
39
|
+
content: launcherContent,
|
|
40
|
+
sourcePath: agent.path,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
artifacts,
|
|
46
|
+
counts: {
|
|
47
|
+
agents: agents.length,
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Generate launcher content for an agent
|
|
54
|
+
* @param {Object} agent - Agent metadata
|
|
55
|
+
* @returns {string} Launcher file content
|
|
56
|
+
*/
|
|
57
|
+
async generateLauncherContent(agent) {
|
|
58
|
+
// Load the template
|
|
59
|
+
const template = await fs.readFile(this.templatePath, 'utf8');
|
|
60
|
+
|
|
61
|
+
// Replace template variables
|
|
62
|
+
// Use relativePath if available (for nested agents), otherwise just name with .md
|
|
63
|
+
const agentPathInModule = agent.relativePath || `${agent.name}.md`;
|
|
64
|
+
return template
|
|
65
|
+
.replaceAll('{{name}}', agent.name)
|
|
66
|
+
.replaceAll('{{module}}', agent.module)
|
|
67
|
+
.replaceAll('{{path}}', agentPathInModule)
|
|
68
|
+
.replaceAll('{{description}}', agent.description || `${agent.name} agent`)
|
|
69
|
+
.replaceAll('_bmad', this.bmadFolderName)
|
|
70
|
+
.replaceAll('_bmad', '_bmad');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Write agent launcher artifacts to IDE commands directory
|
|
75
|
+
* @param {string} baseCommandsDir - Base commands directory for the IDE
|
|
76
|
+
* @param {Array} artifacts - Agent launcher artifacts
|
|
77
|
+
* @returns {number} Count of launchers written
|
|
78
|
+
*/
|
|
79
|
+
async writeAgentLaunchers(baseCommandsDir, artifacts) {
|
|
80
|
+
let writtenCount = 0;
|
|
81
|
+
|
|
82
|
+
for (const artifact of artifacts) {
|
|
83
|
+
if (artifact.type === 'agent-launcher') {
|
|
84
|
+
const moduleAgentsDir = path.join(baseCommandsDir, artifact.module, 'agents');
|
|
85
|
+
await fs.ensureDir(moduleAgentsDir);
|
|
86
|
+
|
|
87
|
+
const launcherPath = path.join(moduleAgentsDir, `${artifact.name}.md`);
|
|
88
|
+
await fs.writeFile(launcherPath, artifact.content);
|
|
89
|
+
writtenCount++;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return writtenCount;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Write agent launcher artifacts using underscore format (Windows-compatible)
|
|
98
|
+
* Creates flat files like: bmad_bmm_pm.md
|
|
99
|
+
*
|
|
100
|
+
* @param {string} baseCommandsDir - Base commands directory for the IDE
|
|
101
|
+
* @param {Array} artifacts - Agent launcher artifacts
|
|
102
|
+
* @returns {number} Count of launchers written
|
|
103
|
+
*/
|
|
104
|
+
async writeColonArtifacts(baseCommandsDir, artifacts) {
|
|
105
|
+
let writtenCount = 0;
|
|
106
|
+
|
|
107
|
+
for (const artifact of artifacts) {
|
|
108
|
+
if (artifact.type === 'agent-launcher') {
|
|
109
|
+
// Convert relativePath to underscore format: bmm/agents/pm.md → bmad_bmm_pm.md
|
|
110
|
+
const flatName = toColonPath(artifact.relativePath);
|
|
111
|
+
const launcherPath = path.join(baseCommandsDir, flatName);
|
|
112
|
+
await fs.ensureDir(path.dirname(launcherPath));
|
|
113
|
+
await fs.writeFile(launcherPath, artifact.content);
|
|
114
|
+
writtenCount++;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return writtenCount;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Write agent launcher artifacts using underscore format (Windows-compatible)
|
|
123
|
+
* Creates flat files like: bmad_bmm_pm.md
|
|
124
|
+
*
|
|
125
|
+
* @param {string} baseCommandsDir - Base commands directory for the IDE
|
|
126
|
+
* @param {Array} artifacts - Agent launcher artifacts
|
|
127
|
+
* @returns {number} Count of launchers written
|
|
128
|
+
*/
|
|
129
|
+
async writeDashArtifacts(baseCommandsDir, artifacts) {
|
|
130
|
+
let writtenCount = 0;
|
|
131
|
+
|
|
132
|
+
for (const artifact of artifacts) {
|
|
133
|
+
if (artifact.type === 'agent-launcher') {
|
|
134
|
+
// Convert relativePath to underscore format: bmm/agents/pm.md → bmad_bmm_pm.md
|
|
135
|
+
const flatName = toDashPath(artifact.relativePath);
|
|
136
|
+
const launcherPath = path.join(baseCommandsDir, flatName);
|
|
137
|
+
await fs.ensureDir(path.dirname(launcherPath));
|
|
138
|
+
await fs.writeFile(launcherPath, artifact.content);
|
|
139
|
+
writtenCount++;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return writtenCount;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get the custom agent name in underscore format (Windows-compatible)
|
|
148
|
+
* @param {string} agentName - Custom agent name
|
|
149
|
+
* @returns {string} Underscore-formatted filename
|
|
150
|
+
*/
|
|
151
|
+
getCustomAgentColonName(agentName) {
|
|
152
|
+
return customAgentColonName(agentName);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Get the custom agent name in underscore format (Windows-compatible)
|
|
157
|
+
* @param {string} agentName - Custom agent name
|
|
158
|
+
* @returns {string} Underscore-formatted filename
|
|
159
|
+
*/
|
|
160
|
+
getCustomAgentDashName(agentName) {
|
|
161
|
+
return customAgentDashName(agentName);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
module.exports = { AgentCommandGenerator };
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Helpers for gathering BMAD agents/tasks from the installed tree.
|
|
6
|
+
* Shared by installers that need Claude-style exports.
|
|
7
|
+
*/
|
|
8
|
+
async function getAgentsFromBmad(bmadDir, selectedModules = []) {
|
|
9
|
+
const agents = [];
|
|
10
|
+
|
|
11
|
+
// Get core agents
|
|
12
|
+
if (await fs.pathExists(path.join(bmadDir, 'core', 'agents'))) {
|
|
13
|
+
const coreAgents = await getAgentsFromDir(path.join(bmadDir, 'core', 'agents'), 'core');
|
|
14
|
+
agents.push(...coreAgents);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Get module agents
|
|
18
|
+
for (const moduleName of selectedModules) {
|
|
19
|
+
const agentsPath = path.join(bmadDir, moduleName, 'agents');
|
|
20
|
+
|
|
21
|
+
if (await fs.pathExists(agentsPath)) {
|
|
22
|
+
const moduleAgents = await getAgentsFromDir(agentsPath, moduleName);
|
|
23
|
+
agents.push(...moduleAgents);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Get standalone agents from bmad/agents/ directory
|
|
28
|
+
const standaloneAgentsDir = path.join(bmadDir, 'agents');
|
|
29
|
+
if (await fs.pathExists(standaloneAgentsDir)) {
|
|
30
|
+
const agentDirs = await fs.readdir(standaloneAgentsDir, { withFileTypes: true });
|
|
31
|
+
|
|
32
|
+
for (const agentDir of agentDirs) {
|
|
33
|
+
if (!agentDir.isDirectory()) continue;
|
|
34
|
+
|
|
35
|
+
const agentDirPath = path.join(standaloneAgentsDir, agentDir.name);
|
|
36
|
+
const agentFiles = await fs.readdir(agentDirPath);
|
|
37
|
+
|
|
38
|
+
for (const file of agentFiles) {
|
|
39
|
+
if (!file.endsWith('.md')) continue;
|
|
40
|
+
if (file.includes('.customize.')) continue;
|
|
41
|
+
|
|
42
|
+
const filePath = path.join(agentDirPath, file);
|
|
43
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
44
|
+
|
|
45
|
+
if (content.includes('localskip="true"')) continue;
|
|
46
|
+
|
|
47
|
+
agents.push({
|
|
48
|
+
path: filePath,
|
|
49
|
+
name: file.replace('.md', ''),
|
|
50
|
+
module: 'standalone', // Mark as standalone agent
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return agents;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function getTasksFromBmad(bmadDir, selectedModules = []) {
|
|
60
|
+
const tasks = [];
|
|
61
|
+
|
|
62
|
+
if (await fs.pathExists(path.join(bmadDir, 'core', 'tasks'))) {
|
|
63
|
+
const coreTasks = await getTasksFromDir(path.join(bmadDir, 'core', 'tasks'), 'core');
|
|
64
|
+
tasks.push(...coreTasks);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
for (const moduleName of selectedModules) {
|
|
68
|
+
const tasksPath = path.join(bmadDir, moduleName, 'tasks');
|
|
69
|
+
|
|
70
|
+
if (await fs.pathExists(tasksPath)) {
|
|
71
|
+
const moduleTasks = await getTasksFromDir(tasksPath, moduleName);
|
|
72
|
+
tasks.push(...moduleTasks);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return tasks;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async function getAgentsFromDir(dirPath, moduleName, relativePath = '') {
|
|
80
|
+
const agents = [];
|
|
81
|
+
|
|
82
|
+
if (!(await fs.pathExists(dirPath))) {
|
|
83
|
+
return agents;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const entries = await fs.readdir(dirPath, { withFileTypes: true });
|
|
87
|
+
|
|
88
|
+
for (const entry of entries) {
|
|
89
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
90
|
+
const newRelativePath = relativePath ? `${relativePath}/${entry.name}` : entry.name;
|
|
91
|
+
|
|
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
|
+
}
|
|
101
|
+
|
|
102
|
+
if (entry.name.includes('.customize.')) {
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const content = await fs.readFile(fullPath, 'utf8');
|
|
107
|
+
|
|
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
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return agents;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
async function getTasksFromDir(dirPath, moduleName) {
|
|
130
|
+
const tasks = [];
|
|
131
|
+
|
|
132
|
+
if (!(await fs.pathExists(dirPath))) {
|
|
133
|
+
return tasks;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const files = await fs.readdir(dirPath);
|
|
137
|
+
|
|
138
|
+
for (const file of files) {
|
|
139
|
+
if (!file.endsWith('.md')) {
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
tasks.push({
|
|
144
|
+
path: path.join(dirPath, file),
|
|
145
|
+
name: file.replace('.md', ''),
|
|
146
|
+
module: moduleName,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return tasks;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
module.exports = {
|
|
154
|
+
getAgentsFromBmad,
|
|
155
|
+
getTasksFromBmad,
|
|
156
|
+
getAgentsFromDir,
|
|
157
|
+
getTasksFromDir,
|
|
158
|
+
};
|