bmad-fh 6.0.0-alpha.052779ef
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 +54 -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 +400 -0
- package/src/core/lib/scope/index.js +30 -0
- package/src/core/lib/scope/scope-context.js +301 -0
- package/src/core/lib/scope/scope-initializer.js +456 -0
- package/src/core/lib/scope/scope-manager.js +512 -0
- package/src/core/lib/scope/scope-migrator.js +434 -0
- package/src/core/lib/scope/scope-sync.js +483 -0
- package/src/core/lib/scope/scope-validator.js +294 -0
- package/src/core/lib/scope/state-lock.js +336 -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 +439 -0
- package/test/test-scope-system.js +781 -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 +273 -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,163 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const { getSourcePath } = require('./project-root');
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Builds activation blocks from fragments based on agent profile
|
|
7
|
+
*/
|
|
8
|
+
class ActivationBuilder {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.agentComponents = getSourcePath('utility', 'agent-components');
|
|
11
|
+
this.fragmentCache = new Map();
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Load a fragment file
|
|
16
|
+
* @param {string} fragmentName - Name of fragment file (e.g., 'activation-init.txt')
|
|
17
|
+
* @returns {string} Fragment content
|
|
18
|
+
*/
|
|
19
|
+
async loadFragment(fragmentName) {
|
|
20
|
+
// Check cache first
|
|
21
|
+
if (this.fragmentCache.has(fragmentName)) {
|
|
22
|
+
return this.fragmentCache.get(fragmentName);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const fragmentPath = path.join(this.agentComponents, fragmentName);
|
|
26
|
+
|
|
27
|
+
if (!(await fs.pathExists(fragmentPath))) {
|
|
28
|
+
throw new Error(`Fragment not found: ${fragmentName}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const content = await fs.readFile(fragmentPath, 'utf8');
|
|
32
|
+
this.fragmentCache.set(fragmentName, content);
|
|
33
|
+
return content;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Build complete activation block based on agent profile
|
|
38
|
+
* @param {Object} profile - Agent profile from AgentAnalyzer
|
|
39
|
+
* @param {Object} metadata - Agent metadata (module, name, etc.)
|
|
40
|
+
* @param {Array} agentSpecificActions - Optional agent-specific critical actions
|
|
41
|
+
* @param {boolean} forWebBundle - Whether this is for a web bundle
|
|
42
|
+
* @returns {string} Complete activation block XML
|
|
43
|
+
*/
|
|
44
|
+
async buildActivation(profile, metadata = {}, agentSpecificActions = [], forWebBundle = false) {
|
|
45
|
+
let activation = '<activation critical="MANDATORY">\n';
|
|
46
|
+
|
|
47
|
+
// 1. Build sequential steps (use web-specific steps for web bundles)
|
|
48
|
+
const steps = await this.buildSteps(metadata, agentSpecificActions, forWebBundle);
|
|
49
|
+
activation += this.indent(steps, 2) + '\n';
|
|
50
|
+
|
|
51
|
+
// 2. Build menu handlers section with dynamic handlers
|
|
52
|
+
const menuHandlers = await this.loadFragment('menu-handlers.txt');
|
|
53
|
+
|
|
54
|
+
// Build handlers (load only needed handlers)
|
|
55
|
+
const handlers = await this.buildHandlers(profile);
|
|
56
|
+
|
|
57
|
+
// Remove the extract line from the final output - it's just build metadata
|
|
58
|
+
// The extract list tells us which attributes to look for during processing
|
|
59
|
+
// but shouldn't appear in the final agent file
|
|
60
|
+
const processedHandlers = menuHandlers
|
|
61
|
+
.replace('<extract>{DYNAMIC_EXTRACT_LIST}</extract>\n', '') // Remove the entire extract line
|
|
62
|
+
.replace('{DYNAMIC_HANDLERS}', handlers);
|
|
63
|
+
|
|
64
|
+
activation += '\n' + this.indent(processedHandlers, 2) + '\n';
|
|
65
|
+
|
|
66
|
+
const rules = await this.loadFragment('activation-rules.txt');
|
|
67
|
+
activation += this.indent(rules, 2) + '\n';
|
|
68
|
+
|
|
69
|
+
activation += '</activation>';
|
|
70
|
+
|
|
71
|
+
return activation;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Build handlers section based on profile
|
|
76
|
+
* @param {Object} profile - Agent profile
|
|
77
|
+
* @returns {string} Handlers XML
|
|
78
|
+
*/
|
|
79
|
+
async buildHandlers(profile) {
|
|
80
|
+
const handlerFragments = [];
|
|
81
|
+
|
|
82
|
+
for (const attrType of profile.usedAttributes) {
|
|
83
|
+
const fragmentName = `handler-${attrType}.txt`;
|
|
84
|
+
try {
|
|
85
|
+
const handler = await this.loadFragment(fragmentName);
|
|
86
|
+
handlerFragments.push(handler);
|
|
87
|
+
} catch {
|
|
88
|
+
console.warn(`Warning: Handler fragment not found: ${fragmentName}`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return handlerFragments.join('\n');
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Build sequential activation steps
|
|
97
|
+
* @param {Object} metadata - Agent metadata
|
|
98
|
+
* @param {Array} agentSpecificActions - Optional agent-specific actions
|
|
99
|
+
* @param {boolean} forWebBundle - Whether this is for a web bundle
|
|
100
|
+
* @returns {string} Steps XML
|
|
101
|
+
*/
|
|
102
|
+
async buildSteps(metadata = {}, agentSpecificActions = [], forWebBundle = false) {
|
|
103
|
+
const stepsTemplate = await this.loadFragment('activation-steps.txt');
|
|
104
|
+
|
|
105
|
+
// Extract basename from agent ID (e.g., "bmad/bmm/agents/pm.md" → "pm")
|
|
106
|
+
const agentBasename = metadata.id ? metadata.id.split('/').pop().replace('.md', '') : metadata.name || 'agent';
|
|
107
|
+
|
|
108
|
+
// Build agent-specific steps
|
|
109
|
+
let agentStepsXml = '';
|
|
110
|
+
let currentStepNum = 4; // Steps 1-3 are standard
|
|
111
|
+
|
|
112
|
+
if (agentSpecificActions && agentSpecificActions.length > 0) {
|
|
113
|
+
agentStepsXml = agentSpecificActions
|
|
114
|
+
.map((action) => {
|
|
115
|
+
const step = `<step n="${currentStepNum}">${action}</step>`;
|
|
116
|
+
currentStepNum++;
|
|
117
|
+
return step;
|
|
118
|
+
})
|
|
119
|
+
.join('\n');
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Calculate final step numbers
|
|
123
|
+
const menuStep = currentStepNum;
|
|
124
|
+
const haltStep = currentStepNum + 1;
|
|
125
|
+
const inputStep = currentStepNum + 2;
|
|
126
|
+
const executeStep = currentStepNum + 3;
|
|
127
|
+
|
|
128
|
+
// Replace placeholders
|
|
129
|
+
const processed = stepsTemplate
|
|
130
|
+
.replace('{agent-file-basename}', agentBasename)
|
|
131
|
+
.replace('{{module}}', metadata.module || 'core') // Fixed to use {{module}}
|
|
132
|
+
.replace('{AGENT_SPECIFIC_STEPS}', agentStepsXml)
|
|
133
|
+
.replace('{MENU_STEP}', menuStep.toString())
|
|
134
|
+
.replace('{HALT_STEP}', haltStep.toString())
|
|
135
|
+
.replace('{INPUT_STEP}', inputStep.toString())
|
|
136
|
+
.replace('{EXECUTE_STEP}', executeStep.toString());
|
|
137
|
+
|
|
138
|
+
return processed;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Indent XML content
|
|
143
|
+
* @param {string} content - Content to indent
|
|
144
|
+
* @param {number} spaces - Number of spaces to indent
|
|
145
|
+
* @returns {string} Indented content
|
|
146
|
+
*/
|
|
147
|
+
indent(content, spaces) {
|
|
148
|
+
const indentation = ' '.repeat(spaces);
|
|
149
|
+
return content
|
|
150
|
+
.split('\n')
|
|
151
|
+
.map((line) => (line ? indentation + line : line))
|
|
152
|
+
.join('\n');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Clear fragment cache (useful for testing or hot reload)
|
|
157
|
+
*/
|
|
158
|
+
clearCache() {
|
|
159
|
+
this.fragmentCache.clear();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
module.exports = { ActivationBuilder };
|
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BMAD Agent Compiler
|
|
3
|
+
* Transforms agent YAML to compiled XML (.md) format
|
|
4
|
+
* Uses the existing BMAD builder infrastructure for proper formatting
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const yaml = require('yaml');
|
|
8
|
+
const fs = require('node:fs');
|
|
9
|
+
const path = require('node:path');
|
|
10
|
+
const { processAgentYaml, extractInstallConfig, stripInstallConfig, getDefaultValues } = require('./template-engine');
|
|
11
|
+
const { escapeXml } = require('../../../lib/xml-utils');
|
|
12
|
+
const { ActivationBuilder } = require('../activation-builder');
|
|
13
|
+
const { AgentAnalyzer } = require('../agent-analyzer');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Build frontmatter for agent
|
|
17
|
+
* @param {Object} metadata - Agent metadata
|
|
18
|
+
* @param {string} agentName - Final agent name
|
|
19
|
+
* @returns {string} YAML frontmatter
|
|
20
|
+
*/
|
|
21
|
+
function buildFrontmatter(metadata, agentName) {
|
|
22
|
+
const nameFromFile = agentName.replaceAll('-', ' ');
|
|
23
|
+
const description = metadata.title || 'BMAD Agent';
|
|
24
|
+
|
|
25
|
+
return `---
|
|
26
|
+
name: "${nameFromFile}"
|
|
27
|
+
description: "${description}"
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.
|
|
31
|
+
|
|
32
|
+
`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// buildSimpleActivation function removed - replaced by ActivationBuilder for proper fragment loading from src/utility/agent-components/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Build persona XML section
|
|
39
|
+
* @param {Object} persona - Persona object
|
|
40
|
+
* @returns {string} Persona XML
|
|
41
|
+
*/
|
|
42
|
+
function buildPersonaXml(persona) {
|
|
43
|
+
if (!persona) return '';
|
|
44
|
+
|
|
45
|
+
let xml = ' <persona>\n';
|
|
46
|
+
|
|
47
|
+
if (persona.role) {
|
|
48
|
+
const roleText = persona.role.trim().replaceAll(/\n+/g, ' ').replaceAll(/\s+/g, ' ');
|
|
49
|
+
xml += ` <role>${escapeXml(roleText)}</role>\n`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (persona.identity) {
|
|
53
|
+
const identityText = persona.identity.trim().replaceAll(/\n+/g, ' ').replaceAll(/\s+/g, ' ');
|
|
54
|
+
xml += ` <identity>${escapeXml(identityText)}</identity>\n`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (persona.communication_style) {
|
|
58
|
+
const styleText = persona.communication_style.trim().replaceAll(/\n+/g, ' ').replaceAll(/\s+/g, ' ');
|
|
59
|
+
xml += ` <communication_style>${escapeXml(styleText)}</communication_style>\n`;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (persona.principles) {
|
|
63
|
+
let principlesText;
|
|
64
|
+
if (Array.isArray(persona.principles)) {
|
|
65
|
+
principlesText = persona.principles.join(' ');
|
|
66
|
+
} else {
|
|
67
|
+
principlesText = persona.principles.trim().replaceAll(/\n+/g, ' ');
|
|
68
|
+
}
|
|
69
|
+
xml += ` <principles>${escapeXml(principlesText)}</principles>\n`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
xml += ' </persona>\n';
|
|
73
|
+
|
|
74
|
+
return xml;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Build prompts XML section
|
|
79
|
+
* @param {Array} prompts - Prompts array
|
|
80
|
+
* @returns {string} Prompts XML
|
|
81
|
+
*/
|
|
82
|
+
function buildPromptsXml(prompts) {
|
|
83
|
+
if (!prompts || prompts.length === 0) return '';
|
|
84
|
+
|
|
85
|
+
let xml = ' <prompts>\n';
|
|
86
|
+
|
|
87
|
+
for (const prompt of prompts) {
|
|
88
|
+
xml += ` <prompt id="${prompt.id || ''}">\n`;
|
|
89
|
+
xml += ` <content>\n`;
|
|
90
|
+
// Don't escape prompt content - it's meant to be read as-is
|
|
91
|
+
xml += `${prompt.content || ''}\n`;
|
|
92
|
+
xml += ` </content>\n`;
|
|
93
|
+
xml += ` </prompt>\n`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
xml += ' </prompts>\n';
|
|
97
|
+
|
|
98
|
+
return xml;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Build memories XML section
|
|
103
|
+
* @param {Array} memories - Memories array
|
|
104
|
+
* @returns {string} Memories XML
|
|
105
|
+
*/
|
|
106
|
+
function buildMemoriesXml(memories) {
|
|
107
|
+
if (!memories || memories.length === 0) return '';
|
|
108
|
+
|
|
109
|
+
let xml = ' <memories>\n';
|
|
110
|
+
|
|
111
|
+
for (const memory of memories) {
|
|
112
|
+
xml += ` <memory>${escapeXml(String(memory))}</memory>\n`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
xml += ' </memories>\n';
|
|
116
|
+
|
|
117
|
+
return xml;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Build menu XML section
|
|
122
|
+
* Supports both legacy and multi format menu items
|
|
123
|
+
* Multi items display as a single menu item with nested handlers
|
|
124
|
+
* @param {Array} menuItems - Menu items
|
|
125
|
+
* @returns {string} Menu XML
|
|
126
|
+
*/
|
|
127
|
+
function buildMenuXml(menuItems) {
|
|
128
|
+
let xml = ' <menu>\n';
|
|
129
|
+
|
|
130
|
+
// Always inject menu display option first
|
|
131
|
+
xml += ` <item cmd="MH or fuzzy match on menu or help">[MH] Redisplay Menu Help</item>\n`;
|
|
132
|
+
xml += ` <item cmd="CH or fuzzy match on chat">[CH] Chat with the Agent about anything</item>\n`;
|
|
133
|
+
|
|
134
|
+
// Add user-defined menu items
|
|
135
|
+
if (menuItems && menuItems.length > 0) {
|
|
136
|
+
for (const item of menuItems) {
|
|
137
|
+
// Handle multi format menu items with nested handlers
|
|
138
|
+
if (item.multi && item.triggers && Array.isArray(item.triggers)) {
|
|
139
|
+
xml += ` <item type="multi">${escapeXml(item.multi)}\n`;
|
|
140
|
+
xml += buildNestedHandlers(item.triggers);
|
|
141
|
+
xml += ` </item>\n`;
|
|
142
|
+
}
|
|
143
|
+
// Handle legacy format menu items
|
|
144
|
+
else if (item.trigger) {
|
|
145
|
+
let trigger = item.trigger || '';
|
|
146
|
+
|
|
147
|
+
const attrs = [`cmd="${trigger}"`];
|
|
148
|
+
|
|
149
|
+
// Add handler attributes
|
|
150
|
+
if (item.workflow) attrs.push(`workflow="${item.workflow}"`);
|
|
151
|
+
if (item.exec) attrs.push(`exec="${item.exec}"`);
|
|
152
|
+
if (item.tmpl) attrs.push(`tmpl="${item.tmpl}"`);
|
|
153
|
+
if (item.data) attrs.push(`data="${item.data}"`);
|
|
154
|
+
if (item.action) attrs.push(`action="${item.action}"`);
|
|
155
|
+
|
|
156
|
+
xml += ` <item ${attrs.join(' ')}>${escapeXml(item.description || '')}</item>\n`;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
xml += ` <item cmd="PM or fuzzy match on party-mode" exec="{project-root}/_bmad/core/workflows/party-mode/workflow.md">[PM] Start Party Mode</item>\n`;
|
|
162
|
+
xml += ` <item cmd="DA or fuzzy match on exit, leave, goodbye or dismiss agent">[DA] Dismiss Agent</item>\n`;
|
|
163
|
+
|
|
164
|
+
xml += ' </menu>\n';
|
|
165
|
+
|
|
166
|
+
return xml;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Build nested handlers for multi format menu items
|
|
171
|
+
* @param {Array} triggers - Triggers array from multi format
|
|
172
|
+
* @returns {string} Handler XML
|
|
173
|
+
*/
|
|
174
|
+
function buildNestedHandlers(triggers) {
|
|
175
|
+
let xml = '';
|
|
176
|
+
|
|
177
|
+
for (const triggerGroup of triggers) {
|
|
178
|
+
for (const [triggerName, execArray] of Object.entries(triggerGroup)) {
|
|
179
|
+
// Build trigger with * prefix
|
|
180
|
+
let trigger = triggerName.startsWith('*') ? triggerName : '*' + triggerName;
|
|
181
|
+
|
|
182
|
+
// Extract the relevant execution data
|
|
183
|
+
const execData = processExecArray(execArray);
|
|
184
|
+
|
|
185
|
+
// For nested handlers in multi items, we use match attribute for fuzzy matching
|
|
186
|
+
const attrs = [`match="${escapeXml(execData.description || '')}"`];
|
|
187
|
+
|
|
188
|
+
// Add handler attributes based on exec data
|
|
189
|
+
if (execData.route) attrs.push(`exec="${execData.route}"`);
|
|
190
|
+
if (execData.workflow) attrs.push(`workflow="${execData.workflow}"`);
|
|
191
|
+
if (execData['validate-workflow']) attrs.push(`validate-workflow="${execData['validate-workflow']}"`);
|
|
192
|
+
if (execData.action) attrs.push(`action="${execData.action}"`);
|
|
193
|
+
if (execData.data) attrs.push(`data="${execData.data}"`);
|
|
194
|
+
if (execData.tmpl) attrs.push(`tmpl="${execData.tmpl}"`);
|
|
195
|
+
// Only add type if it's not 'exec' (exec is already implied by the exec attribute)
|
|
196
|
+
if (execData.type && execData.type !== 'exec') attrs.push(`type="${execData.type}"`);
|
|
197
|
+
|
|
198
|
+
xml += ` <handler ${attrs.join(' ')}></handler>\n`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
return xml;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Process the execution array from multi format triggers
|
|
207
|
+
* Extracts relevant data for XML attributes
|
|
208
|
+
* @param {Array} execArray - Array of execution objects
|
|
209
|
+
* @returns {Object} Processed execution data
|
|
210
|
+
*/
|
|
211
|
+
function processExecArray(execArray) {
|
|
212
|
+
const result = {
|
|
213
|
+
description: '',
|
|
214
|
+
route: null,
|
|
215
|
+
workflow: null,
|
|
216
|
+
data: null,
|
|
217
|
+
action: null,
|
|
218
|
+
type: null,
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
if (!Array.isArray(execArray)) {
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
for (const exec of execArray) {
|
|
226
|
+
if (exec.input) {
|
|
227
|
+
// Use input as description if no explicit description is provided
|
|
228
|
+
result.description = exec.input;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (exec.route) {
|
|
232
|
+
// Determine if it's a workflow or exec based on file extension or context
|
|
233
|
+
if (exec.route.endsWith('.yaml') || exec.route.endsWith('.yml')) {
|
|
234
|
+
result.workflow = exec.route;
|
|
235
|
+
} else {
|
|
236
|
+
result.route = exec.route;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (exec.data !== null && exec.data !== undefined) {
|
|
241
|
+
result.data = exec.data;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
if (exec.action) {
|
|
245
|
+
result.action = exec.action;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (exec.type) {
|
|
249
|
+
result.type = exec.type;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return result;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Compile agent YAML to proper XML format
|
|
258
|
+
* @param {Object} agentYaml - Parsed and processed agent YAML
|
|
259
|
+
* @param {string} agentName - Final agent name (for ID and frontmatter)
|
|
260
|
+
* @param {string} targetPath - Target path for agent ID
|
|
261
|
+
* @returns {Promise<string>} Compiled XML string with frontmatter
|
|
262
|
+
*/
|
|
263
|
+
async function compileToXml(agentYaml, agentName = '', targetPath = '') {
|
|
264
|
+
const agent = agentYaml.agent;
|
|
265
|
+
const meta = agent.metadata;
|
|
266
|
+
|
|
267
|
+
let xml = '';
|
|
268
|
+
|
|
269
|
+
// Build frontmatter
|
|
270
|
+
xml += buildFrontmatter(meta, agentName || meta.name || 'agent');
|
|
271
|
+
|
|
272
|
+
// Start code fence
|
|
273
|
+
xml += '```xml\n';
|
|
274
|
+
|
|
275
|
+
// Agent opening tag
|
|
276
|
+
const agentAttrs = [
|
|
277
|
+
`id="${targetPath || meta.id || ''}"`,
|
|
278
|
+
`name="${meta.name || ''}"`,
|
|
279
|
+
`title="${meta.title || ''}"`,
|
|
280
|
+
`icon="${meta.icon || '🤖'}"`,
|
|
281
|
+
];
|
|
282
|
+
|
|
283
|
+
xml += `<agent ${agentAttrs.join(' ')}>\n`;
|
|
284
|
+
|
|
285
|
+
// Activation block - use ActivationBuilder for proper fragment loading
|
|
286
|
+
const activationBuilder = new ActivationBuilder();
|
|
287
|
+
const analyzer = new AgentAnalyzer();
|
|
288
|
+
const profile = analyzer.analyzeAgentObject(agentYaml);
|
|
289
|
+
xml += await activationBuilder.buildActivation(
|
|
290
|
+
profile,
|
|
291
|
+
meta,
|
|
292
|
+
agent.critical_actions || [],
|
|
293
|
+
false, // forWebBundle - set to false for IDE deployment
|
|
294
|
+
);
|
|
295
|
+
|
|
296
|
+
// Persona section
|
|
297
|
+
xml += buildPersonaXml(agent.persona);
|
|
298
|
+
|
|
299
|
+
// Prompts section (if present)
|
|
300
|
+
if (agent.prompts && agent.prompts.length > 0) {
|
|
301
|
+
xml += buildPromptsXml(agent.prompts);
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
// Memories section (if present)
|
|
305
|
+
if (agent.memories && agent.memories.length > 0) {
|
|
306
|
+
xml += buildMemoriesXml(agent.memories);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Menu section
|
|
310
|
+
xml += buildMenuXml(agent.menu || []);
|
|
311
|
+
|
|
312
|
+
// Closing agent tag
|
|
313
|
+
xml += '</agent>\n';
|
|
314
|
+
|
|
315
|
+
// Close code fence
|
|
316
|
+
xml += '```\n';
|
|
317
|
+
|
|
318
|
+
return xml;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* Full compilation pipeline
|
|
323
|
+
* @param {string} yamlContent - Raw YAML string
|
|
324
|
+
* @param {Object} answers - Answers from install_config questions (or defaults)
|
|
325
|
+
* @param {string} agentName - Optional final agent name (user's custom persona name)
|
|
326
|
+
* @param {string} targetPath - Optional target path for agent ID
|
|
327
|
+
* @param {Object} options - Additional options including config
|
|
328
|
+
* @returns {Promise<Object>} { xml: string, metadata: Object }
|
|
329
|
+
*/
|
|
330
|
+
async function compileAgent(yamlContent, answers = {}, agentName = '', targetPath = '', options = {}) {
|
|
331
|
+
// Parse YAML
|
|
332
|
+
let agentYaml = yaml.parse(yamlContent);
|
|
333
|
+
|
|
334
|
+
// Apply customization merges before template processing
|
|
335
|
+
// Handle metadata overrides (like name)
|
|
336
|
+
if (answers.metadata) {
|
|
337
|
+
// Filter out empty values from metadata
|
|
338
|
+
const filteredMetadata = filterCustomizationData(answers.metadata);
|
|
339
|
+
if (Object.keys(filteredMetadata).length > 0) {
|
|
340
|
+
agentYaml.agent.metadata = { ...agentYaml.agent.metadata, ...filteredMetadata };
|
|
341
|
+
}
|
|
342
|
+
// Remove from answers so it doesn't get processed as template variables
|
|
343
|
+
const { metadata, ...templateAnswers } = answers;
|
|
344
|
+
answers = templateAnswers;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Handle other customization properties
|
|
348
|
+
// These should be merged into the agent structure, not processed as template variables
|
|
349
|
+
const customizationKeys = ['persona', 'critical_actions', 'memories', 'menu', 'prompts'];
|
|
350
|
+
const customizations = {};
|
|
351
|
+
const remainingAnswers = { ...answers };
|
|
352
|
+
|
|
353
|
+
for (const key of customizationKeys) {
|
|
354
|
+
if (answers[key]) {
|
|
355
|
+
let filtered;
|
|
356
|
+
|
|
357
|
+
// Handle different data types
|
|
358
|
+
if (Array.isArray(answers[key])) {
|
|
359
|
+
// For arrays, filter out empty/null/undefined values
|
|
360
|
+
filtered = answers[key].filter((item) => item !== null && item !== undefined && item !== '');
|
|
361
|
+
} else {
|
|
362
|
+
// For objects, use filterCustomizationData
|
|
363
|
+
filtered = filterCustomizationData(answers[key]);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Check if we have valid content
|
|
367
|
+
const hasContent = Array.isArray(filtered) ? filtered.length > 0 : Object.keys(filtered).length > 0;
|
|
368
|
+
|
|
369
|
+
if (hasContent) {
|
|
370
|
+
customizations[key] = filtered;
|
|
371
|
+
}
|
|
372
|
+
delete remainingAnswers[key];
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Merge customizations into agentYaml
|
|
377
|
+
if (Object.keys(customizations).length > 0) {
|
|
378
|
+
// For persona: replace entire section
|
|
379
|
+
if (customizations.persona) {
|
|
380
|
+
agentYaml.agent.persona = customizations.persona;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// For critical_actions: append to existing or create new
|
|
384
|
+
if (customizations.critical_actions) {
|
|
385
|
+
const existing = agentYaml.agent.critical_actions || [];
|
|
386
|
+
agentYaml.agent.critical_actions = [...existing, ...customizations.critical_actions];
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// For memories: append to existing or create new
|
|
390
|
+
if (customizations.memories) {
|
|
391
|
+
const existing = agentYaml.agent.memories || [];
|
|
392
|
+
agentYaml.agent.memories = [...existing, ...customizations.memories];
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// For menu: append to existing or create new
|
|
396
|
+
if (customizations.menu) {
|
|
397
|
+
const existing = agentYaml.agent.menu || [];
|
|
398
|
+
agentYaml.agent.menu = [...existing, ...customizations.menu];
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// For prompts: append to existing or create new (by id)
|
|
402
|
+
if (customizations.prompts) {
|
|
403
|
+
const existing = agentYaml.agent.prompts || [];
|
|
404
|
+
// Merge by id, with customizations taking precedence
|
|
405
|
+
const mergedPrompts = [...existing];
|
|
406
|
+
for (const customPrompt of customizations.prompts) {
|
|
407
|
+
const existingIndex = mergedPrompts.findIndex((p) => p.id === customPrompt.id);
|
|
408
|
+
if (existingIndex === -1) {
|
|
409
|
+
mergedPrompts.push(customPrompt);
|
|
410
|
+
} else {
|
|
411
|
+
mergedPrompts[existingIndex] = customPrompt;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
agentYaml.agent.prompts = mergedPrompts;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Use remaining answers for template processing
|
|
419
|
+
answers = remainingAnswers;
|
|
420
|
+
|
|
421
|
+
// Extract install_config
|
|
422
|
+
const installConfig = extractInstallConfig(agentYaml);
|
|
423
|
+
|
|
424
|
+
// Merge defaults with provided answers
|
|
425
|
+
let finalAnswers = answers;
|
|
426
|
+
if (installConfig) {
|
|
427
|
+
const defaults = getDefaultValues(installConfig);
|
|
428
|
+
finalAnswers = { ...defaults, ...answers };
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
// Process templates with answers
|
|
432
|
+
const processedYaml = processAgentYaml(agentYaml, finalAnswers);
|
|
433
|
+
|
|
434
|
+
// Strip install_config from output
|
|
435
|
+
const cleanYaml = stripInstallConfig(processedYaml);
|
|
436
|
+
|
|
437
|
+
let xml = await compileToXml(cleanYaml, agentName, targetPath);
|
|
438
|
+
|
|
439
|
+
// Ensure xml is a string before attempting replaceAll
|
|
440
|
+
if (typeof xml !== 'string') {
|
|
441
|
+
throw new TypeError('compileToXml did not return a string');
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
return {
|
|
445
|
+
xml,
|
|
446
|
+
metadata: cleanYaml.agent.metadata,
|
|
447
|
+
processedYaml: cleanYaml,
|
|
448
|
+
};
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Filter customization data to remove empty/null values
|
|
453
|
+
* @param {Object} data - Raw customization data
|
|
454
|
+
* @returns {Object} Filtered customization data
|
|
455
|
+
*/
|
|
456
|
+
function filterCustomizationData(data) {
|
|
457
|
+
const filtered = {};
|
|
458
|
+
|
|
459
|
+
for (const [key, value] of Object.entries(data)) {
|
|
460
|
+
if (value === null || value === undefined || value === '') {
|
|
461
|
+
continue; // Skip null/undefined/empty values
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if (Array.isArray(value)) {
|
|
465
|
+
if (value.length > 0) {
|
|
466
|
+
filtered[key] = value;
|
|
467
|
+
}
|
|
468
|
+
} else if (typeof value === 'object') {
|
|
469
|
+
const nested = filterCustomizationData(value);
|
|
470
|
+
if (Object.keys(nested).length > 0) {
|
|
471
|
+
filtered[key] = nested;
|
|
472
|
+
}
|
|
473
|
+
} else {
|
|
474
|
+
filtered[key] = value;
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return filtered;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Compile agent file to .md
|
|
483
|
+
* @param {string} yamlPath - Path to agent YAML file
|
|
484
|
+
* @param {Object} options - { answers: {}, outputPath: string }
|
|
485
|
+
* @returns {Object} Compilation result
|
|
486
|
+
*/
|
|
487
|
+
function compileAgentFile(yamlPath, options = {}) {
|
|
488
|
+
const yamlContent = fs.readFileSync(yamlPath, 'utf8');
|
|
489
|
+
const result = compileAgent(yamlContent, options.answers || {});
|
|
490
|
+
|
|
491
|
+
// Determine output path
|
|
492
|
+
let outputPath = options.outputPath;
|
|
493
|
+
if (!outputPath) {
|
|
494
|
+
// Default: same directory, same name, .md extension
|
|
495
|
+
const dir = path.dirname(yamlPath);
|
|
496
|
+
const basename = path.basename(yamlPath, '.agent.yaml');
|
|
497
|
+
outputPath = path.join(dir, `${basename}.md`);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
// Write compiled XML
|
|
501
|
+
fs.writeFileSync(outputPath, xml, 'utf8');
|
|
502
|
+
|
|
503
|
+
return {
|
|
504
|
+
...result,
|
|
505
|
+
xml,
|
|
506
|
+
outputPath,
|
|
507
|
+
sourcePath: yamlPath,
|
|
508
|
+
};
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
module.exports = {
|
|
512
|
+
compileToXml,
|
|
513
|
+
compileAgent,
|
|
514
|
+
compileAgentFile,
|
|
515
|
+
escapeXml,
|
|
516
|
+
buildFrontmatter,
|
|
517
|
+
buildPersonaXml,
|
|
518
|
+
buildPromptsXml,
|
|
519
|
+
buildMemoriesXml,
|
|
520
|
+
buildMenuXml,
|
|
521
|
+
filterCustomizationData,
|
|
522
|
+
};
|