bmad-fh 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/.githooks/post-checkout +129 -0
- package/.githooks/pre-commit +63 -0
- package/.githooks/pre-push +135 -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/publish-multi-artifact.yaml +50 -0
- package/.github/workflows/quality.yaml +115 -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 +306 -0
- package/CONTRIBUTORS.md +32 -0
- package/LICENSE +30 -0
- package/README.md +126 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +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 +526 -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 +98 -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/migration-guide.md +365 -0
- package/docs/multi-scope-guide.md +379 -0
- package/docs/plans/multi-scope-parallel-artifacts-plan.md +695 -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 +254 -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 +41 -0
- package/src/bmm/agents/architect.agent.yaml +33 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/pm.agent.yaml +51 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +47 -0
- package/src/bmm/agents/tea.agent.yaml +68 -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 +49 -0
- package/src/bmm/agents/ux-designer.agent.yaml +30 -0
- package/src/bmm/data/README.md +29 -0
- package/src/bmm/data/project-context-template.md +40 -0
- package/src/bmm/module.yaml +64 -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/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 +34 -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 +194 -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 +228 -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 +180 -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 +232 -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 +133 -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 +352 -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 +145 -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/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 +52 -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/generate-project-context/project-context-template.md +21 -0
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +364 -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 +248 -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 +321 -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 +722 -0
- package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +445 -0
- package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/test-design/checklist.md +235 -0
- package/src/bmm/workflows/testarch/test-design/instructions.md +788 -0
- package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/src/bmm/workflows/testarch/test-design/workflow.yaml +56 -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 +655 -0
- package/src/bmm/workflows/testarch/trace/instructions.md +1047 -0
- package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/bmm/workflows/workflow-status/init/instructions.md +346 -0
- package/src/bmm/workflows/workflow-status/init/workflow.yaml +30 -0
- package/src/bmm/workflows/workflow-status/instructions.md +397 -0
- package/src/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +103 -0
- package/src/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +100 -0
- package/src/bmm/workflows/workflow-status/paths/method-brownfield.yaml +103 -0
- package/src/bmm/workflows/workflow-status/paths/method-greenfield.yaml +100 -0
- package/src/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
- package/src/bmm/workflows/workflow-status/workflow.yaml +32 -0
- package/src/core/_module-installer/installer.js +60 -0
- package/src/core/agents/bmad-master.agent.yaml +30 -0
- package/src/core/lib/scope/artifact-resolver.js +298 -0
- package/src/core/lib/scope/event-logger.js +411 -0
- package/src/core/lib/scope/index.js +30 -0
- package/src/core/lib/scope/scope-context.js +307 -0
- package/src/core/lib/scope/scope-initializer.js +458 -0
- package/src/core/lib/scope/scope-manager.js +512 -0
- package/src/core/lib/scope/scope-migrator.js +442 -0
- package/src/core/lib/scope/scope-sync.js +489 -0
- package/src/core/lib/scope/scope-validator.js +299 -0
- package/src/core/lib/scope/state-lock.js +342 -0
- package/src/core/module.yaml +53 -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 +91 -0
- package/src/core/tasks/editorial-review-structure.xml +198 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +46 -0
- package/src/core/tasks/shard-doc.xml +109 -0
- package/src/core/tasks/workflow.xml +277 -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 +28 -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 +19 -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/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/test-scope-e2e.js +450 -0
- package/test/test-scope-system.js +787 -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/scope.js +474 -0
- package/tools/cli/external-official-modules.yaml +41 -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 +2585 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +963 -0
- package/tools/cli/installers/lib/core/manifest.js +590 -0
- package/tools/cli/installers/lib/custom/handler.js +363 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +654 -0
- package/tools/cli/installers/lib/ide/antigravity.js +486 -0
- package/tools/cli/installers/lib/ide/auggie.js +244 -0
- package/tools/cli/installers/lib/ide/claude-code.js +487 -0
- package/tools/cli/installers/lib/ide/cline.js +269 -0
- package/tools/cli/installers/lib/ide/codex.js +375 -0
- package/tools/cli/installers/lib/ide/crush.js +300 -0
- package/tools/cli/installers/lib/ide/cursor.js +169 -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 +270 -0
- package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +96 -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/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +242 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +29 -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 +30 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +45 -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 +133 -0
- package/tools/cli/installers/lib/modules/manager.js +1362 -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 +1591 -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/cli/scripts/migrate-workflows.js +281 -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 +493 -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,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
|
+
};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const yaml = require('yaml');
|
|
4
|
+
const { glob } = require('glob');
|
|
5
|
+
const { getSourcePath } = require('../../../../lib/project-root');
|
|
6
|
+
|
|
7
|
+
async function loadModuleInjectionConfig(handler, moduleName) {
|
|
8
|
+
const sourceModulesPath = getSourcePath('modules');
|
|
9
|
+
const handlerBaseDir = path.join(sourceModulesPath, moduleName, 'sub-modules', handler);
|
|
10
|
+
const configPath = path.join(handlerBaseDir, 'injections.yaml');
|
|
11
|
+
|
|
12
|
+
if (!(await fs.pathExists(configPath))) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const configContent = await fs.readFile(configPath, 'utf8');
|
|
17
|
+
const config = yaml.parse(configContent) || {};
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
config,
|
|
21
|
+
handlerBaseDir,
|
|
22
|
+
configPath,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function shouldApplyInjection(injection, subagentChoices) {
|
|
27
|
+
if (!subagentChoices || subagentChoices.install === 'none') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if (subagentChoices.install === 'all') {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (subagentChoices.install === 'selective') {
|
|
36
|
+
const selected = subagentChoices.selected || [];
|
|
37
|
+
|
|
38
|
+
if (injection.requires === 'any' && selected.length > 0) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (injection.requires) {
|
|
43
|
+
const required = `${injection.requires}.md`;
|
|
44
|
+
return selected.includes(required);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (injection.point) {
|
|
48
|
+
const selectedNames = selected.map((file) => file.replace('.md', ''));
|
|
49
|
+
return selectedNames.some((name) => injection.point.includes(name));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function filterAgentInstructions(content, selectedFiles) {
|
|
57
|
+
if (!selectedFiles || selectedFiles.length === 0) {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const selectedAgents = selectedFiles.map((file) => file.replace('.md', ''));
|
|
62
|
+
const lines = content.split('\n');
|
|
63
|
+
const filteredLines = [];
|
|
64
|
+
|
|
65
|
+
for (const line of lines) {
|
|
66
|
+
if (line.includes('<llm') || line.includes('</llm>')) {
|
|
67
|
+
filteredLines.push(line);
|
|
68
|
+
} else if (line.includes('subagent')) {
|
|
69
|
+
let shouldInclude = false;
|
|
70
|
+
for (const agent of selectedAgents) {
|
|
71
|
+
if (line.includes(agent)) {
|
|
72
|
+
shouldInclude = true;
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (shouldInclude) {
|
|
78
|
+
filteredLines.push(line);
|
|
79
|
+
}
|
|
80
|
+
} else if (line.includes('When creating PRDs') || line.includes('ACTIVELY delegate')) {
|
|
81
|
+
filteredLines.push(line);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (filteredLines.length > 2) {
|
|
86
|
+
return filteredLines.join('\n');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return '';
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function resolveSubagentFiles(handlerBaseDir, subagentConfig, subagentChoices) {
|
|
93
|
+
if (!subagentConfig || !subagentConfig.files) {
|
|
94
|
+
return [];
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (!subagentChoices || subagentChoices.install === 'none') {
|
|
98
|
+
return [];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let filesToCopy = subagentConfig.files;
|
|
102
|
+
|
|
103
|
+
if (subagentChoices.install === 'selective') {
|
|
104
|
+
filesToCopy = subagentChoices.selected || [];
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const sourceDir = path.join(handlerBaseDir, subagentConfig.source || '');
|
|
108
|
+
const resolved = [];
|
|
109
|
+
|
|
110
|
+
for (const file of filesToCopy) {
|
|
111
|
+
// Use forward slashes for glob pattern (works on both Windows and Unix)
|
|
112
|
+
// Convert backslashes to forward slashes for glob compatibility
|
|
113
|
+
const normalizedSourceDir = sourceDir.replaceAll('\\', '/');
|
|
114
|
+
const pattern = `${normalizedSourceDir}/**/${file}`;
|
|
115
|
+
const matches = await glob(pattern);
|
|
116
|
+
|
|
117
|
+
if (matches.length > 0) {
|
|
118
|
+
const absolutePath = matches[0];
|
|
119
|
+
resolved.push({
|
|
120
|
+
file,
|
|
121
|
+
absolutePath,
|
|
122
|
+
relativePath: path.relative(sourceDir, absolutePath),
|
|
123
|
+
sourceDir,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return resolved;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
module.exports = {
|
|
132
|
+
loadModuleInjectionConfig,
|
|
133
|
+
shouldApplyInjection,
|
|
134
|
+
filterAgentInstructions,
|
|
135
|
+
resolveSubagentFiles,
|
|
136
|
+
};
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const csv = require('csv-parse/sync');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generates command files for standalone tasks and tools
|
|
8
|
+
*/
|
|
9
|
+
class TaskToolCommandGenerator {
|
|
10
|
+
/**
|
|
11
|
+
* Generate task and tool commands from manifest CSVs
|
|
12
|
+
* @param {string} projectDir - Project directory
|
|
13
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
14
|
+
* @param {string} baseCommandsDir - Optional base commands directory (defaults to .claude/commands/bmad)
|
|
15
|
+
*/
|
|
16
|
+
async generateTaskToolCommands(projectDir, bmadDir, baseCommandsDir = null) {
|
|
17
|
+
const tasks = await this.loadTaskManifest(bmadDir);
|
|
18
|
+
const tools = await this.loadToolManifest(bmadDir);
|
|
19
|
+
|
|
20
|
+
// Filter to only standalone items
|
|
21
|
+
const standaloneTasks = tasks ? tasks.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
|
|
22
|
+
const standaloneTools = tools ? tools.filter((t) => t.standalone === 'true' || t.standalone === true) : [];
|
|
23
|
+
|
|
24
|
+
// Base commands directory - use provided or default to Claude Code structure
|
|
25
|
+
const commandsDir = baseCommandsDir || path.join(projectDir, '.claude', 'commands', 'bmad');
|
|
26
|
+
|
|
27
|
+
let generatedCount = 0;
|
|
28
|
+
|
|
29
|
+
// Generate command files for tasks
|
|
30
|
+
for (const task of standaloneTasks) {
|
|
31
|
+
const moduleTasksDir = path.join(commandsDir, task.module, 'tasks');
|
|
32
|
+
await fs.ensureDir(moduleTasksDir);
|
|
33
|
+
|
|
34
|
+
const commandContent = this.generateCommandContent(task, 'task');
|
|
35
|
+
const commandPath = path.join(moduleTasksDir, `${task.name}.md`);
|
|
36
|
+
|
|
37
|
+
await fs.writeFile(commandPath, commandContent);
|
|
38
|
+
generatedCount++;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Generate command files for tools
|
|
42
|
+
for (const tool of standaloneTools) {
|
|
43
|
+
const moduleToolsDir = path.join(commandsDir, tool.module, 'tools');
|
|
44
|
+
await fs.ensureDir(moduleToolsDir);
|
|
45
|
+
|
|
46
|
+
const commandContent = this.generateCommandContent(tool, 'tool');
|
|
47
|
+
const commandPath = path.join(moduleToolsDir, `${tool.name}.md`);
|
|
48
|
+
|
|
49
|
+
await fs.writeFile(commandPath, commandContent);
|
|
50
|
+
generatedCount++;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return {
|
|
54
|
+
generated: generatedCount,
|
|
55
|
+
tasks: standaloneTasks.length,
|
|
56
|
+
tools: standaloneTools.length,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Generate command content for a task or tool
|
|
62
|
+
*/
|
|
63
|
+
generateCommandContent(item, type) {
|
|
64
|
+
const description = item.description || `Execute ${item.displayName || item.name}`;
|
|
65
|
+
|
|
66
|
+
// Convert path to use {project-root} placeholder
|
|
67
|
+
let itemPath = item.path;
|
|
68
|
+
if (itemPath.startsWith('bmad/')) {
|
|
69
|
+
itemPath = `{project-root}/${itemPath}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return `---
|
|
73
|
+
description: '${description.replaceAll("'", "''")}'
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
# ${item.displayName || item.name}
|
|
77
|
+
|
|
78
|
+
LOAD and execute the ${type} at: ${itemPath}
|
|
79
|
+
|
|
80
|
+
Follow all instructions in the ${type} file exactly as written.
|
|
81
|
+
`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Load task manifest CSV
|
|
86
|
+
*/
|
|
87
|
+
async loadTaskManifest(bmadDir) {
|
|
88
|
+
const manifestPath = path.join(bmadDir, '_config', 'task-manifest.csv');
|
|
89
|
+
|
|
90
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const csvContent = await fs.readFile(manifestPath, 'utf8');
|
|
95
|
+
return csv.parse(csvContent, {
|
|
96
|
+
columns: true,
|
|
97
|
+
skip_empty_lines: true,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Load tool manifest CSV
|
|
103
|
+
*/
|
|
104
|
+
async loadToolManifest(bmadDir) {
|
|
105
|
+
const manifestPath = path.join(bmadDir, '_config', 'tool-manifest.csv');
|
|
106
|
+
|
|
107
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const csvContent = await fs.readFile(manifestPath, 'utf8');
|
|
112
|
+
return csv.parse(csvContent, {
|
|
113
|
+
columns: true,
|
|
114
|
+
skip_empty_lines: true,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
module.exports = { TaskToolCommandGenerator };
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const csv = require('csv-parse/sync');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generates command files for each workflow in the manifest
|
|
8
|
+
*/
|
|
9
|
+
class WorkflowCommandGenerator {
|
|
10
|
+
constructor(bmadFolderName = 'bmad') {
|
|
11
|
+
this.templatePath = path.join(__dirname, '../templates/workflow-command-template.md');
|
|
12
|
+
this.bmadFolderName = bmadFolderName;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generate workflow commands from the manifest CSV
|
|
17
|
+
* @param {string} projectDir - Project directory
|
|
18
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
19
|
+
*/
|
|
20
|
+
async generateWorkflowCommands(projectDir, bmadDir) {
|
|
21
|
+
const workflows = await this.loadWorkflowManifest(bmadDir);
|
|
22
|
+
|
|
23
|
+
if (!workflows) {
|
|
24
|
+
console.log(chalk.yellow('Workflow manifest not found. Skipping command generation.'));
|
|
25
|
+
return { generated: 0 };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// ALL workflows now generate commands - no standalone filtering
|
|
29
|
+
const allWorkflows = workflows;
|
|
30
|
+
|
|
31
|
+
// Base commands directory
|
|
32
|
+
const baseCommandsDir = path.join(projectDir, '.claude', 'commands', 'bmad');
|
|
33
|
+
|
|
34
|
+
let generatedCount = 0;
|
|
35
|
+
|
|
36
|
+
// Generate a command file for each workflow, organized by module
|
|
37
|
+
for (const workflow of allWorkflows) {
|
|
38
|
+
const moduleWorkflowsDir = path.join(baseCommandsDir, workflow.module, 'workflows');
|
|
39
|
+
await fs.ensureDir(moduleWorkflowsDir);
|
|
40
|
+
|
|
41
|
+
const commandContent = await this.generateCommandContent(workflow, bmadDir);
|
|
42
|
+
const commandPath = path.join(moduleWorkflowsDir, `${workflow.name}.md`);
|
|
43
|
+
|
|
44
|
+
await fs.writeFile(commandPath, commandContent);
|
|
45
|
+
generatedCount++;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Also create a workflow launcher README in each module
|
|
49
|
+
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
|
|
50
|
+
await this.createModuleWorkflowLaunchers(baseCommandsDir, groupedWorkflows);
|
|
51
|
+
|
|
52
|
+
return { generated: generatedCount };
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async collectWorkflowArtifacts(bmadDir) {
|
|
56
|
+
const workflows = await this.loadWorkflowManifest(bmadDir);
|
|
57
|
+
|
|
58
|
+
if (!workflows) {
|
|
59
|
+
return { artifacts: [], counts: { commands: 0, launchers: 0 } };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ALL workflows now generate commands - no standalone filtering
|
|
63
|
+
const allWorkflows = workflows;
|
|
64
|
+
|
|
65
|
+
const artifacts = [];
|
|
66
|
+
|
|
67
|
+
for (const workflow of allWorkflows) {
|
|
68
|
+
const commandContent = await this.generateCommandContent(workflow, bmadDir);
|
|
69
|
+
artifacts.push({
|
|
70
|
+
type: 'workflow-command',
|
|
71
|
+
module: workflow.module,
|
|
72
|
+
relativePath: path.join(workflow.module, 'workflows', `${workflow.name}.md`),
|
|
73
|
+
content: commandContent,
|
|
74
|
+
sourcePath: workflow.path,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const groupedWorkflows = this.groupWorkflowsByModule(allWorkflows);
|
|
79
|
+
for (const [module, launcherContent] of Object.entries(this.buildModuleWorkflowLaunchers(groupedWorkflows))) {
|
|
80
|
+
artifacts.push({
|
|
81
|
+
type: 'workflow-launcher',
|
|
82
|
+
module,
|
|
83
|
+
relativePath: path.join(module, 'workflows', 'README.md'),
|
|
84
|
+
content: launcherContent,
|
|
85
|
+
sourcePath: null,
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return {
|
|
90
|
+
artifacts,
|
|
91
|
+
counts: {
|
|
92
|
+
commands: allWorkflows.length,
|
|
93
|
+
launchers: Object.keys(groupedWorkflows).length,
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Generate command content for a workflow
|
|
100
|
+
*/
|
|
101
|
+
async generateCommandContent(workflow, bmadDir) {
|
|
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');
|
|
109
|
+
|
|
110
|
+
// Convert source path to installed path
|
|
111
|
+
// From: /Users/.../src/bmm/workflows/.../workflow.yaml
|
|
112
|
+
// To: {project-root}/_bmad/bmm/workflows/.../workflow.yaml
|
|
113
|
+
let workflowPath = workflow.path;
|
|
114
|
+
|
|
115
|
+
// Extract the relative path from source
|
|
116
|
+
if (workflowPath.includes('/src/bmm/')) {
|
|
117
|
+
// bmm is directly under src/
|
|
118
|
+
const match = workflowPath.match(/\/src\/bmm\/(.+)/);
|
|
119
|
+
if (match) {
|
|
120
|
+
workflowPath = `${this.bmadFolderName}/bmm/${match[1]}`;
|
|
121
|
+
}
|
|
122
|
+
} else if (workflowPath.includes('/src/core/')) {
|
|
123
|
+
const match = workflowPath.match(/\/src\/core\/(.+)/);
|
|
124
|
+
if (match) {
|
|
125
|
+
workflowPath = `${this.bmadFolderName}/core/${match[1]}`;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Replace template variables
|
|
130
|
+
return template
|
|
131
|
+
.replaceAll('{{name}}', workflow.name)
|
|
132
|
+
.replaceAll('{{module}}', workflow.module)
|
|
133
|
+
.replaceAll('{{description}}', workflow.description)
|
|
134
|
+
.replaceAll('{{workflow_path}}', workflowPath)
|
|
135
|
+
.replaceAll('_bmad', this.bmadFolderName)
|
|
136
|
+
.replaceAll('_bmad', '_bmad');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Create workflow launcher files for each module
|
|
141
|
+
*/
|
|
142
|
+
async createModuleWorkflowLaunchers(baseCommandsDir, workflowsByModule) {
|
|
143
|
+
for (const [module, moduleWorkflows] of Object.entries(workflowsByModule)) {
|
|
144
|
+
const content = this.buildLauncherContent(module, moduleWorkflows);
|
|
145
|
+
const moduleWorkflowsDir = path.join(baseCommandsDir, module, 'workflows');
|
|
146
|
+
await fs.ensureDir(moduleWorkflowsDir);
|
|
147
|
+
const launcherPath = path.join(moduleWorkflowsDir, 'README.md');
|
|
148
|
+
await fs.writeFile(launcherPath, content);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
groupWorkflowsByModule(workflows) {
|
|
153
|
+
const workflowsByModule = {};
|
|
154
|
+
|
|
155
|
+
for (const workflow of workflows) {
|
|
156
|
+
if (!workflowsByModule[workflow.module]) {
|
|
157
|
+
workflowsByModule[workflow.module] = [];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
workflowsByModule[workflow.module].push({
|
|
161
|
+
...workflow,
|
|
162
|
+
displayPath: this.transformWorkflowPath(workflow.path),
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return workflowsByModule;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
buildModuleWorkflowLaunchers(groupedWorkflows) {
|
|
170
|
+
const launchers = {};
|
|
171
|
+
|
|
172
|
+
for (const [module, moduleWorkflows] of Object.entries(groupedWorkflows)) {
|
|
173
|
+
launchers[module] = this.buildLauncherContent(module, moduleWorkflows);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return launchers;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
buildLauncherContent(module, moduleWorkflows) {
|
|
180
|
+
let content = `# ${module.toUpperCase()} Workflows
|
|
181
|
+
|
|
182
|
+
## Available Workflows in ${module}
|
|
183
|
+
|
|
184
|
+
`;
|
|
185
|
+
|
|
186
|
+
for (const workflow of moduleWorkflows) {
|
|
187
|
+
content += `**${workflow.name}**\n`;
|
|
188
|
+
content += `- Path: \`${workflow.displayPath}\`\n`;
|
|
189
|
+
content += `- ${workflow.description}\n\n`;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
content += `
|
|
193
|
+
## Execution
|
|
194
|
+
|
|
195
|
+
When running any workflow:
|
|
196
|
+
1. LOAD {project-root}/${this.bmadFolderName}/core/tasks/workflow.xml
|
|
197
|
+
2. Pass the workflow path as 'workflow-config' parameter
|
|
198
|
+
3. Follow workflow.xml instructions EXACTLY
|
|
199
|
+
4. Save outputs after EACH section
|
|
200
|
+
|
|
201
|
+
## Modes
|
|
202
|
+
- Normal: Full interaction
|
|
203
|
+
- #yolo: Skip optional steps
|
|
204
|
+
`;
|
|
205
|
+
|
|
206
|
+
return content;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
transformWorkflowPath(workflowPath) {
|
|
210
|
+
let transformed = workflowPath;
|
|
211
|
+
|
|
212
|
+
if (workflowPath.includes('/src/bmm/')) {
|
|
213
|
+
const match = workflowPath.match(/\/src\/bmm\/(.+)/);
|
|
214
|
+
if (match) {
|
|
215
|
+
transformed = `{project-root}/${this.bmadFolderName}/bmm/${match[1]}`;
|
|
216
|
+
} else if (workflowPath.includes('/src/core/')) {
|
|
217
|
+
const match = workflowPath.match(/\/src\/core\/(.+)/);
|
|
218
|
+
if (match) {
|
|
219
|
+
transformed = `{project-root}/${this.bmadFolderName}/core/${match[1]}`;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return transformed;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
async loadWorkflowManifest(bmadDir) {
|
|
228
|
+
const manifestPath = path.join(bmadDir, '_config', 'workflow-manifest.csv');
|
|
229
|
+
|
|
230
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
const csvContent = await fs.readFile(manifestPath, 'utf8');
|
|
235
|
+
return csv.parse(csvContent, {
|
|
236
|
+
columns: true,
|
|
237
|
+
skip_empty_lines: true,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
module.exports = { WorkflowCommandGenerator };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: '{{name}}'
|
|
3
|
+
description: '{{description}}'
|
|
4
|
+
---
|
|
5
|
+
|
|
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
|
+
|
|
8
|
+
<agent-activation CRITICAL="TRUE">
|
|
9
|
+
1. LOAD the FULL agent file from @_bmad/{{module}}/agents/{{path}}
|
|
10
|
+
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
11
|
+
3. Execute ALL activation steps exactly as written in the agent file
|
|
12
|
+
4. Follow the agent's persona and menu system precisely
|
|
13
|
+
5. Stay in character throughout the session
|
|
14
|
+
</agent-activation>
|
|
15
|
+
|
|
16
|
+
<scope-awareness>
|
|
17
|
+
## Multi-Scope Context
|
|
18
|
+
|
|
19
|
+
When activated, check for scope context:
|
|
20
|
+
|
|
21
|
+
1. **Session scope**: Look for `.bmad-scope` file in project root
|
|
22
|
+
2. **Load context**: If scope is active, load both:
|
|
23
|
+
- Global context: `_bmad-output/_shared/project-context.md`
|
|
24
|
+
- Scope context: `_bmad-output/{scope}/project-context.md` (if exists)
|
|
25
|
+
3. **Merge contexts**: Scope-specific context extends/overrides global
|
|
26
|
+
4. **Menu items with `scope_required: true`**: Prompt for scope before executing
|
|
27
|
+
|
|
28
|
+
For menu items that produce artifacts, ensure they go to the active scope's directory.
|
|
29
|
+
</scope-awareness>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
description = "Activates the {{title}} agent from the BMad Method."
|
|
2
|
+
prompt = """
|
|
3
|
+
CRITICAL: You are now the BMad '{{title}}' agent.
|
|
4
|
+
|
|
5
|
+
PRE-FLIGHT CHECKLIST:
|
|
6
|
+
1. [ ] IMMEDIATE ACTION: Load and parse @{_bmad}/{{module}}/config.yaml - store ALL config values in memory for use throughout the session.
|
|
7
|
+
2. [ ] IMMEDIATE ACTION: Read and internalize the full agent definition at @{_bmad}/{{module}}/agents/{{name}}.md.
|
|
8
|
+
3. [ ] CONFIRM: The user's name from config is {user_name}.
|
|
9
|
+
|
|
10
|
+
Only after all checks are complete, greet the user by name and display the menu.
|
|
11
|
+
Acknowledge this checklist is complete in your first response.
|
|
12
|
+
|
|
13
|
+
AGENT DEFINITION: @{_bmad}/{{module}}/agents/{{name}}.md
|
|
14
|
+
"""
|