bmad-elsabro 1.0.0
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/.auto-claude-security.json +209 -0
- package/.claude_settings.json +34 -0
- package/.coderabbit.yaml +40 -0
- package/.nvmrc +1 -0
- package/.prettierignore +9 -0
- package/AI_TEST_GENERATOR_VERIFICATION.md +260 -0
- package/BUDGET_ALERT_TESTING.md +325 -0
- package/CHANGELOG.md +1488 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +167 -0
- package/CONTRIBUTORS.md +32 -0
- package/LEGACY_MIGRATION_TESTING.md +428 -0
- package/LICENSE +30 -0
- package/PARTY_MODE_VERIFICATION.md +274 -0
- package/PROJECT_DETECTOR_TESTING.md +288 -0
- package/README.md +236 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/WORKFLOW_ROUTER_IMPLEMENTATION.md +379 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/build/icons/512x512.png +0 -0
- package/build-mac.sh +3 -0
- package/docs/404.md +9 -0
- package/docs/_STYLE_GUIDE.md +367 -0
- package/docs/developer/api-reference.md +945 -0
- package/docs/developer/architecture.md +563 -0
- package/docs/developer/contributing.md +831 -0
- package/docs/downloads.md +74 -0
- package/docs/explanation/advanced-elicitation.md +24 -0
- package/docs/explanation/adversarial-review.md +57 -0
- package/docs/explanation/brainstorming.md +31 -0
- package/docs/explanation/brownfield-faq.md +55 -0
- package/docs/explanation/party-mode.md +57 -0
- package/docs/explanation/preventing-agent-conflicts.md +110 -0
- package/docs/explanation/quick-flow.md +27 -0
- package/docs/explanation/why-solutioning-matters.md +75 -0
- package/docs/how-to/brownfield/index.md +84 -0
- package/docs/how-to/brownfield/quick-fix-in-brownfield.md +76 -0
- package/docs/how-to/customize-bmad.md +158 -0
- package/docs/how-to/get-answers-about-bmad.md +102 -0
- package/docs/how-to/install-bmad.md +82 -0
- package/docs/how-to/shard-large-documents.md +101 -0
- package/docs/how-to/upgrade-to-v6.md +131 -0
- package/docs/index.md +56 -0
- package/docs/reference/workflow-map.md +83 -0
- package/docs/tea/explanation/engagement-models.md +710 -0
- package/docs/tea/explanation/fixture-architecture.md +457 -0
- package/docs/tea/explanation/knowledge-base-system.md +554 -0
- package/docs/tea/explanation/network-first-patterns.md +853 -0
- package/docs/tea/explanation/risk-based-testing.md +586 -0
- package/docs/tea/explanation/tea-overview.md +410 -0
- package/docs/tea/explanation/test-quality-standards.md +907 -0
- package/docs/tea/explanation/testing-as-engineering.md +112 -0
- package/docs/tea/glossary/index.md +159 -0
- package/docs/tea/how-to/brownfield/use-tea-for-enterprise.md +525 -0
- package/docs/tea/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
- package/docs/tea/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
- package/docs/tea/how-to/customization/integrate-playwright-utils.md +813 -0
- package/docs/tea/how-to/workflows/run-atdd.md +436 -0
- package/docs/tea/how-to/workflows/run-automate.md +653 -0
- package/docs/tea/how-to/workflows/run-nfr-assess.md +679 -0
- package/docs/tea/how-to/workflows/run-test-design.md +135 -0
- package/docs/tea/how-to/workflows/run-test-review.md +605 -0
- package/docs/tea/how-to/workflows/run-trace.md +883 -0
- package/docs/tea/how-to/workflows/setup-ci.md +712 -0
- package/docs/tea/how-to/workflows/setup-test-framework.md +98 -0
- package/docs/tea/reference/commands.md +276 -0
- package/docs/tea/reference/configuration.md +678 -0
- package/docs/tea/reference/knowledge-base.md +340 -0
- package/docs/tea/tutorials/tea-lite-quickstart.md +444 -0
- package/docs/tutorials/getting-started.md +205 -0
- package/docs/user-guide/getting-started.md +348 -0
- package/docs/user-guide/token-economy.md +601 -0
- package/docs/user-guide/workflows.md +546 -0
- package/electron-builder.yml +75 -0
- package/eslint.config.mjs +152 -0
- package/package.json +162 -0
- package/prettier.config.mjs +32 -0
- package/public/monaco-workers/index.js +21 -0
- package/renderer/App.tsx +311 -0
- package/renderer/components/ChatPanel.tsx +285 -0
- package/renderer/components/CodeEditor.tsx +327 -0
- package/renderer/components/CodeEditor.types.ts +245 -0
- package/renderer/components/FlowSelector.tsx +534 -0
- package/renderer/components/MessageInput.tsx +252 -0
- package/renderer/components/MessageList.tsx +204 -0
- package/renderer/components/MigrationWizard.tsx +896 -0
- package/renderer/components/NotificationCenter.tsx +291 -0
- package/renderer/components/OnboardingWizard.tsx +112 -0
- package/renderer/components/PartyMode.tsx +555 -0
- package/renderer/components/Sidebar.module.css +258 -0
- package/renderer/components/Sidebar.tsx +157 -0
- package/renderer/components/TemplateSelector.tsx +553 -0
- package/renderer/components/Terminal.tsx +523 -0
- package/renderer/components/TestCenter.tsx +364 -0
- package/renderer/components/TokenAnalytics.tsx +607 -0
- package/renderer/components/TokenMonitor.tsx +331 -0
- package/renderer/components/TutorialOverlay.tsx +483 -0
- package/renderer/components/WorkflowEditor.tsx +470 -0
- package/renderer/components/onboarding/Step1Welcome.tsx +72 -0
- package/renderer/components/onboarding/Step2Setup.tsx +193 -0
- package/renderer/components/onboarding/Step3CreateProject.tsx +209 -0
- package/renderer/components/test-center/CoverageDashboard.tsx +588 -0
- package/renderer/components/test-center/ELI5Guide.tsx +521 -0
- package/renderer/components/test-center/TestList.tsx +381 -0
- package/renderer/components/test-center/TestRunner.tsx +431 -0
- package/renderer/components/test-center/TestStepWizard.tsx +1000 -0
- package/renderer/components/test-center/VisualTestBuilder.tsx +460 -0
- package/renderer/components/workflow/DependencyEdge.tsx +200 -0
- package/renderer/components/workflow/StepNode.tsx +234 -0
- package/renderer/components/workflow/StepPalette.tsx +412 -0
- package/renderer/context/ThemeContext.tsx +97 -0
- package/renderer/data/shortcuts.json +94 -0
- package/renderer/data/testing-guides.json +261 -0
- package/renderer/data/tutorials.json +546 -0
- package/renderer/hooks/useKeyboardShortcuts.ts +249 -0
- package/renderer/hooks/useNotifications.ts +267 -0
- package/renderer/hooks/useTheme.ts +149 -0
- package/renderer/hooks/useTokenTracking.ts +464 -0
- package/renderer/hooks/useWorkflowState.ts +309 -0
- package/renderer/index.html +16 -0
- package/renderer/index.tsx +17 -0
- package/renderer/lib/MONACO_OFFLINE_CONFIG.md +153 -0
- package/renderer/lib/chart-utils.ts +472 -0
- package/renderer/lib/file-system-provider.ts +295 -0
- package/renderer/lib/monaco-loader.ts +247 -0
- package/renderer/renderer/components/NOTIFICATION_SYSTEM.md +192 -0
- package/renderer/styles.css +55 -0
- package/renderer/types/css-modules.d.ts +21 -0
- package/renderer/types/electron.d.ts +316 -0
- package/src/bmm/_module-installer/installer.js +48 -0
- package/src/bmm/agents/analyst.agent.yaml +36 -0
- package/src/bmm/agents/architect.agent.yaml +28 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/parallel-orchestrator.agent.yaml +50 -0
- package/src/bmm/agents/pm.agent.yaml +46 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +36 -0
- package/src/bmm/agents/tea.agent.yaml +63 -0
- package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
- package/src/bmm/agents/ux-designer.agent.yaml +26 -0
- package/src/bmm/agents/yolo-dev.agent.yaml +41 -0
- package/src/bmm/data/auto-testing-config.yaml +84 -0
- package/src/bmm/data/guided-mode-instructions.yaml +112 -0
- package/src/bmm/data/parallelization-config.yaml +136 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/data/speed-profiles.yaml +127 -0
- package/src/bmm/module-help.csv +32 -0
- package/src/bmm/module.yaml +60 -0
- package/src/bmm/teams/default-party.csv +21 -0
- package/src/bmm/teams/team-fullstack.yaml +12 -0
- package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
- package/src/bmm/testarch/knowledge/api-request.md +442 -0
- package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
- package/src/bmm/testarch/knowledge/auth-session.md +552 -0
- package/src/bmm/testarch/knowledge/burn-in.md +273 -0
- package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/bmm/testarch/knowledge/file-utils.md +463 -0
- package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
- package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
- package/src/bmm/testarch/knowledge/log.md +429 -0
- package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
- package/src/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
- package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/bmm/testarch/knowledge/overview.md +286 -0
- package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/bmm/testarch/knowledge/recurse.md +421 -0
- package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/bmm/testarch/tea-index.csv +35 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +218 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/validation-report-prd-workflow.md +433 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow.md +150 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +32 -0
- package/src/bmm/workflows/4-implementation/fix-and-test/workflow.md +197 -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/brownfield-fast-track/steps/step-01-detect.md +55 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/steps/step-02-confirm.md +48 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/steps/step-03-implement.md +61 -0
- package/src/bmm/workflows/bmad-quick-flow/brownfield-fast-track/workflow.md +41 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +176 -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 +153 -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 +149 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +73 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +192 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +145 -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 +201 -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 +93 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/steps/step-01-rapid-spec.md +54 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/steps/step-02-ship-it.md +65 -0
- package/src/bmm/workflows/bmad-quick-flow/yolo-mode/workflow.md +54 -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/parallel-work/parallel-analysis/steps/step-01-parse-target.md +49 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-02-launch-streams.md +135 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-03-sync-point.md +74 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/steps/step-04-merge-insights.md +179 -0
- package/src/bmm/workflows/parallel-work/parallel-analysis/workflow.md +55 -0
- package/src/bmm/workflows/parallel-work/parallel-generation/workflow.md +109 -0
- package/src/bmm/workflows/parallel-work/parallel-reviews/workflow.md +111 -0
- package/src/bmm/workflows/parallel-work/parallel-stories/workflow.md +112 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-01-load-sprint.md +54 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-02-plan-execution.md +63 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-03-execute-stories.md +112 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-04-code-review.md +148 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-05-integration-testing.md +200 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/steps/step-06-sprint-report.md +290 -0
- package/src/bmm/workflows/parallel-work/sprint-mode/workflow.md +58 -0
- package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
- package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
- package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
- package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
- package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
- package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
- package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
- package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
- package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
- package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
- package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
- package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
- package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
- package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
- package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
- package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
- package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
- package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
- package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
- package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
- package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
- package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
- package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
- package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
- package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
- package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/core/_module-installer/installer.js +60 -0
- package/src/core/agents/bmad-master.agent.yaml +29 -0
- package/src/core/module-help.csv +9 -0
- package/src/core/module.yaml +25 -0
- package/src/core/resources/excalidraw/README.md +160 -0
- package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
- package/src/core/resources/excalidraw/library-loader.md +50 -0
- package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
- package/src/core/tasks/editorial-review-prose.xml +100 -0
- package/src/core/tasks/editorial-review-structure.xml +209 -0
- package/src/core/tasks/help.md +62 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +48 -0
- package/src/core/tasks/shard-doc.xml +109 -0
- package/src/core/tasks/workflow.xml +235 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +15 -0
- package/src/core/workflows/brainstorming/workflow.md +58 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/utility/agent-components/activation-rules.txt +6 -0
- package/src/utility/agent-components/activation-steps.txt +14 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/agent-components/agent.customize.template.yaml +41 -0
- package/src/utility/agent-components/handler-action.txt +4 -0
- package/src/utility/agent-components/handler-data.txt +5 -0
- package/src/utility/agent-components/handler-exec.txt +6 -0
- package/src/utility/agent-components/handler-multi.txt +14 -0
- package/src/utility/agent-components/handler-tmpl.txt +5 -0
- package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
- package/src/utility/agent-components/handler-workflow.txt +10 -0
- package/src/utility/agent-components/menu-handlers.txt +6 -0
- package/tools/bmad-npx-wrapper.js +69 -0
- package/tools/build-docs.js +577 -0
- package/tools/cli/README.md +7 -0
- package/tools/cli/bmad-cli.js +65 -0
- package/tools/cli/commands/diagnostics.js +303 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/module.js +210 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/commands/uninstall.js +86 -0
- package/tools/cli/external-official-modules.yaml +54 -0
- package/tools/cli/installers/install-messages.yaml +59 -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 +2812 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
- package/tools/cli/installers/lib/core/manifest.js +1036 -0
- package/tools/cli/installers/lib/custom/handler.js +363 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
- package/tools/cli/installers/lib/ide/_config-driven.js +450 -0
- package/tools/cli/installers/lib/ide/codex.js +440 -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 +271 -0
- package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
- package/tools/cli/installers/lib/ide/platform-codes.yaml +227 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +181 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +163 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +292 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +270 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +319 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
- package/tools/cli/installers/lib/ide/templates/split/opencode/body.md +10 -0
- package/tools/cli/installers/lib/ide/templates/split/opencode/header.md +4 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
- package/tools/cli/installers/lib/message-loader.js +85 -0
- package/tools/cli/installers/lib/modules/external-manager.js +135 -0
- package/tools/cli/installers/lib/modules/manager.js +1375 -0
- package/tools/cli/lib/activation-builder.js +163 -0
- package/tools/cli/lib/agent/compiler.js +522 -0
- package/tools/cli/lib/agent/compiler.ts +572 -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/types.ts +155 -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/config.ts +227 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/file-ops.ts +215 -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/prompts.ts +541 -0
- package/tools/cli/lib/types/config.types.ts +43 -0
- package/tools/cli/lib/types/xml-handler.types.ts +50 -0
- package/tools/cli/lib/ui.js +1660 -0
- package/tools/cli/lib/xml-handler.js +177 -0
- package/tools/cli/lib/xml-handler.ts +188 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/cli/lib/yaml-format.js +245 -0
- package/tools/cli/lib/yaml-xml-builder.js +587 -0
- package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/tools/docs/fix-refs.md +91 -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/aggregate.ts +78 -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/files.ts +31 -0
- package/tools/flattener/ignoreRules.js +172 -0
- package/tools/flattener/main.js +483 -0
- package/tools/flattener/main.ts +262 -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/types.ts +53 -0
- package/tools/flattener/xml.js +82 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/lib/xml-utils.js +13 -0
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/platform-codes.yaml +157 -0
- package/tools/schema/agent.js +491 -0
- package/tools/schema/agent.ts +489 -0
- package/tools/schema/agent.types.ts +31 -0
- package/tools/update-bmad.sh +24 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +371 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/vite-plugin-monaco-editor.ts +108 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
const yaml = require('yaml');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const crypto = require('node:crypto');
|
|
5
|
+
const { AgentAnalyzer } = require('./agent-analyzer');
|
|
6
|
+
const { ActivationBuilder } = require('./activation-builder');
|
|
7
|
+
const { escapeXml } = require('../../lib/xml-utils');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Converts agent YAML files to XML format with smart activation injection
|
|
11
|
+
*/
|
|
12
|
+
class YamlXmlBuilder {
|
|
13
|
+
constructor() {
|
|
14
|
+
this.analyzer = new AgentAnalyzer();
|
|
15
|
+
this.activationBuilder = new ActivationBuilder();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Deep merge two objects (for customize.yaml + agent.yaml)
|
|
20
|
+
* @param {Object} target - Target object
|
|
21
|
+
* @param {Object} source - Source object to merge in
|
|
22
|
+
* @returns {Object} Merged object
|
|
23
|
+
*/
|
|
24
|
+
deepMerge(target, source) {
|
|
25
|
+
const output = { ...target };
|
|
26
|
+
|
|
27
|
+
if (this.isObject(target) && this.isObject(source)) {
|
|
28
|
+
for (const key of Object.keys(source)) {
|
|
29
|
+
if (this.isObject(source[key])) {
|
|
30
|
+
if (key in target) {
|
|
31
|
+
output[key] = this.deepMerge(target[key], source[key]);
|
|
32
|
+
} else {
|
|
33
|
+
output[key] = source[key];
|
|
34
|
+
}
|
|
35
|
+
} else if (Array.isArray(source[key])) {
|
|
36
|
+
// For arrays, append rather than replace (for commands)
|
|
37
|
+
if (Array.isArray(target[key])) {
|
|
38
|
+
output[key] = [...target[key], ...source[key]];
|
|
39
|
+
} else {
|
|
40
|
+
output[key] = source[key];
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
output[key] = source[key];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return output;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Check if value is an object
|
|
53
|
+
*/
|
|
54
|
+
isObject(item) {
|
|
55
|
+
return item && typeof item === 'object' && !Array.isArray(item);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Load and merge agent YAML with customization
|
|
60
|
+
* @param {string} agentYamlPath - Path to base agent YAML
|
|
61
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
62
|
+
* @returns {Object} Merged agent configuration
|
|
63
|
+
*/
|
|
64
|
+
async loadAndMergeAgent(agentYamlPath, customizeYamlPath = null) {
|
|
65
|
+
// Load base agent
|
|
66
|
+
const agentContent = await fs.readFile(agentYamlPath, 'utf8');
|
|
67
|
+
const agentYaml = yaml.parse(agentContent);
|
|
68
|
+
|
|
69
|
+
// Load customization if exists
|
|
70
|
+
let merged = agentYaml;
|
|
71
|
+
if (customizeYamlPath && (await fs.pathExists(customizeYamlPath))) {
|
|
72
|
+
const customizeContent = await fs.readFile(customizeYamlPath, 'utf8');
|
|
73
|
+
const customizeYaml = yaml.parse(customizeContent);
|
|
74
|
+
|
|
75
|
+
if (customizeYaml) {
|
|
76
|
+
// Special handling: persona fields are merged, but only non-empty values override
|
|
77
|
+
if (customizeYaml.persona) {
|
|
78
|
+
const basePersona = merged.agent.persona || {};
|
|
79
|
+
const customPersona = {};
|
|
80
|
+
|
|
81
|
+
// Only copy non-empty customize values
|
|
82
|
+
for (const [key, value] of Object.entries(customizeYaml.persona)) {
|
|
83
|
+
if (value !== '' && value !== null && !(Array.isArray(value) && value.length === 0)) {
|
|
84
|
+
customPersona[key] = value;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Merge non-empty customize values over base
|
|
89
|
+
if (Object.keys(customPersona).length > 0) {
|
|
90
|
+
merged.agent.persona = { ...basePersona, ...customPersona };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Merge metadata (only non-empty values)
|
|
95
|
+
if (customizeYaml.agent && customizeYaml.agent.metadata) {
|
|
96
|
+
const nonEmptyMetadata = {};
|
|
97
|
+
for (const [key, value] of Object.entries(customizeYaml.agent.metadata)) {
|
|
98
|
+
if (value !== '' && value !== null) {
|
|
99
|
+
nonEmptyMetadata[key] = value;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
merged.agent.metadata = { ...merged.agent.metadata, ...nonEmptyMetadata };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Append menu items (support both 'menu' and legacy 'commands')
|
|
106
|
+
const customMenuItems = customizeYaml.menu || customizeYaml.commands;
|
|
107
|
+
if (customMenuItems) {
|
|
108
|
+
// Determine if base uses 'menu' or 'commands'
|
|
109
|
+
if (merged.agent.menu) {
|
|
110
|
+
merged.agent.menu = [...merged.agent.menu, ...customMenuItems];
|
|
111
|
+
} else if (merged.agent.commands) {
|
|
112
|
+
merged.agent.commands = [...merged.agent.commands, ...customMenuItems];
|
|
113
|
+
} else {
|
|
114
|
+
// Default to 'menu' for new agents
|
|
115
|
+
merged.agent.menu = customMenuItems;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Append critical actions
|
|
120
|
+
if (customizeYaml.critical_actions) {
|
|
121
|
+
merged.agent.critical_actions = [...(merged.agent.critical_actions || []), ...customizeYaml.critical_actions];
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Append prompts
|
|
125
|
+
if (customizeYaml.prompts) {
|
|
126
|
+
merged.agent.prompts = [...(merged.agent.prompts || []), ...customizeYaml.prompts];
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Append memories
|
|
130
|
+
if (customizeYaml.memories) {
|
|
131
|
+
merged.agent.memories = [...(merged.agent.memories || []), ...customizeYaml.memories];
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return merged;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Convert agent YAML to XML
|
|
141
|
+
* @param {Object} agentYaml - Parsed agent YAML object
|
|
142
|
+
* @param {Object} buildMetadata - Metadata about the build (file paths, hashes, etc.)
|
|
143
|
+
* @returns {string} XML content
|
|
144
|
+
*/
|
|
145
|
+
async convertToXml(agentYaml, buildMetadata = {}) {
|
|
146
|
+
const agent = agentYaml.agent;
|
|
147
|
+
const metadata = agent.metadata || {};
|
|
148
|
+
|
|
149
|
+
// Add module from buildMetadata if available
|
|
150
|
+
if (buildMetadata.module) {
|
|
151
|
+
metadata.module = buildMetadata.module;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// Analyze agent to determine needed handlers
|
|
155
|
+
const profile = this.analyzer.analyzeAgentObject(agentYaml);
|
|
156
|
+
|
|
157
|
+
// Build activation block only if not skipped
|
|
158
|
+
let activationBlock = '';
|
|
159
|
+
if (!buildMetadata.skipActivation) {
|
|
160
|
+
activationBlock = await this.activationBuilder.buildActivation(
|
|
161
|
+
profile,
|
|
162
|
+
metadata,
|
|
163
|
+
agent.critical_actions || [],
|
|
164
|
+
buildMetadata.forWebBundle || false, // Pass web bundle flag
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Start building XML
|
|
169
|
+
let xml = '';
|
|
170
|
+
|
|
171
|
+
if (buildMetadata.forWebBundle) {
|
|
172
|
+
// Web bundle: keep existing format
|
|
173
|
+
xml += '<!-- Powered by BMAD-CORE™ -->\n\n';
|
|
174
|
+
xml += `# ${metadata.title || 'Agent'}\n\n`;
|
|
175
|
+
} else {
|
|
176
|
+
// Installation: use YAML frontmatter + instruction
|
|
177
|
+
// Extract name from filename: "cli-chief.yaml" or "pm.agent.yaml" -> "cli chief" or "pm"
|
|
178
|
+
const filename = buildMetadata.sourceFile || 'agent.yaml';
|
|
179
|
+
let nameFromFile = path.basename(filename, path.extname(filename)); // Remove .yaml/.md extension
|
|
180
|
+
nameFromFile = nameFromFile.replace(/\.agent$/, ''); // Remove .agent suffix if present
|
|
181
|
+
nameFromFile = nameFromFile.replaceAll('-', ' '); // Replace dashes with spaces
|
|
182
|
+
|
|
183
|
+
xml += '---\n';
|
|
184
|
+
xml += `name: "${nameFromFile}"\n`;
|
|
185
|
+
xml += `description: "${metadata.title || 'BMAD Agent'}"\n`;
|
|
186
|
+
xml += '---\n\n';
|
|
187
|
+
xml +=
|
|
188
|
+
"You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.\n\n";
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
xml += '```xml\n';
|
|
192
|
+
|
|
193
|
+
// Agent opening tag
|
|
194
|
+
const agentAttrs = [
|
|
195
|
+
`id="${metadata.id || ''}"`,
|
|
196
|
+
`name="${metadata.name || ''}"`,
|
|
197
|
+
`title="${metadata.title || ''}"`,
|
|
198
|
+
`icon="${metadata.icon || '🤖'}"`,
|
|
199
|
+
];
|
|
200
|
+
|
|
201
|
+
// Add localskip attribute if present
|
|
202
|
+
if (metadata.localskip === true) {
|
|
203
|
+
agentAttrs.push('localskip="true"');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
xml += `<agent ${agentAttrs.join(' ')}>\n`;
|
|
207
|
+
|
|
208
|
+
// Activation block (only if not skipped)
|
|
209
|
+
if (activationBlock) {
|
|
210
|
+
xml += activationBlock + '\n';
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// Persona section
|
|
214
|
+
xml += this.buildPersonaXml(agent.persona);
|
|
215
|
+
|
|
216
|
+
// Memories section (if exists)
|
|
217
|
+
if (agent.memories) {
|
|
218
|
+
xml += this.buildMemoriesXml(agent.memories);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Prompts section (if exists)
|
|
222
|
+
if (agent.prompts) {
|
|
223
|
+
xml += this.buildPromptsXml(agent.prompts);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Menu section (support both 'menu' and legacy 'commands')
|
|
227
|
+
const menuItems = agent.menu || agent.commands || [];
|
|
228
|
+
xml += this.buildCommandsXml(menuItems, buildMetadata.forWebBundle);
|
|
229
|
+
|
|
230
|
+
xml += '</agent>\n';
|
|
231
|
+
xml += '```\n';
|
|
232
|
+
|
|
233
|
+
return xml;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Build persona XML section
|
|
238
|
+
*/
|
|
239
|
+
buildPersonaXml(persona) {
|
|
240
|
+
if (!persona) return '';
|
|
241
|
+
|
|
242
|
+
let xml = ' <persona>\n';
|
|
243
|
+
|
|
244
|
+
if (persona.role) {
|
|
245
|
+
xml += ` <role>${escapeXml(persona.role)}</role>\n`;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
if (persona.identity) {
|
|
249
|
+
xml += ` <identity>${escapeXml(persona.identity)}</identity>\n`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (persona.communication_style) {
|
|
253
|
+
xml += ` <communication_style>${escapeXml(persona.communication_style)}</communication_style>\n`;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
if (persona.principles) {
|
|
257
|
+
// Principles can be array or string
|
|
258
|
+
let principlesText;
|
|
259
|
+
if (Array.isArray(persona.principles)) {
|
|
260
|
+
principlesText = persona.principles.join(' ');
|
|
261
|
+
} else {
|
|
262
|
+
principlesText = persona.principles;
|
|
263
|
+
}
|
|
264
|
+
xml += ` <principles>${escapeXml(principlesText)}</principles>\n`;
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
xml += ' </persona>\n';
|
|
268
|
+
|
|
269
|
+
return xml;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Build memories XML section
|
|
274
|
+
*/
|
|
275
|
+
buildMemoriesXml(memories) {
|
|
276
|
+
if (!memories || memories.length === 0) return '';
|
|
277
|
+
|
|
278
|
+
let xml = ' <memories>\n';
|
|
279
|
+
|
|
280
|
+
for (const memory of memories) {
|
|
281
|
+
xml += ` <memory>${escapeXml(memory)}</memory>\n`;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
xml += ' </memories>\n';
|
|
285
|
+
|
|
286
|
+
return xml;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Build prompts XML section
|
|
291
|
+
* Handles both array format and object/dictionary format
|
|
292
|
+
*/
|
|
293
|
+
buildPromptsXml(prompts) {
|
|
294
|
+
if (!prompts) return '';
|
|
295
|
+
|
|
296
|
+
// Handle object/dictionary format: { promptId: 'content', ... }
|
|
297
|
+
// Convert to array format for processing
|
|
298
|
+
let promptsArray = prompts;
|
|
299
|
+
if (!Array.isArray(prompts)) {
|
|
300
|
+
// Check if it's an object with no length property (dictionary format)
|
|
301
|
+
if (typeof prompts === 'object' && prompts.length === undefined) {
|
|
302
|
+
promptsArray = Object.entries(prompts).map(([id, content]) => ({
|
|
303
|
+
id: id,
|
|
304
|
+
content: content,
|
|
305
|
+
}));
|
|
306
|
+
} else {
|
|
307
|
+
return ''; // Not a valid prompts format
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (promptsArray.length === 0) return '';
|
|
312
|
+
|
|
313
|
+
let xml = ' <prompts>\n';
|
|
314
|
+
|
|
315
|
+
for (const prompt of promptsArray) {
|
|
316
|
+
xml += ` <prompt id="${prompt.id || ''}">\n`;
|
|
317
|
+
xml += ` <content>\n`;
|
|
318
|
+
xml += `${escapeXml(prompt.content || '')}\n`;
|
|
319
|
+
xml += ` </content>\n`;
|
|
320
|
+
xml += ` </prompt>\n`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
xml += ' </prompts>\n';
|
|
324
|
+
|
|
325
|
+
return xml;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/**
|
|
329
|
+
* Build menu XML section (renamed from commands for clarity)
|
|
330
|
+
* Auto-injects *help and *exit, adds * prefix to all triggers
|
|
331
|
+
* Supports both legacy format and new multi format with nested handlers
|
|
332
|
+
* @param {Array} menuItems - Menu items from YAML
|
|
333
|
+
* @param {boolean} forWebBundle - Whether building for web bundle
|
|
334
|
+
*/
|
|
335
|
+
buildCommandsXml(menuItems, forWebBundle = false) {
|
|
336
|
+
let xml = ' <menu>\n';
|
|
337
|
+
|
|
338
|
+
// Always inject menu display option first
|
|
339
|
+
xml += ` <item cmd="*menu">[M] Redisplay Menu Options</item>\n`;
|
|
340
|
+
|
|
341
|
+
// Add user-defined menu items with * prefix
|
|
342
|
+
if (menuItems && menuItems.length > 0) {
|
|
343
|
+
for (const item of menuItems) {
|
|
344
|
+
// Skip ide-only items when building for web bundles
|
|
345
|
+
if (forWebBundle && item['ide-only'] === true) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
// Skip web-only items when NOT building for web bundles (i.e., IDE/local installation)
|
|
349
|
+
if (!forWebBundle && item['web-only'] === true) {
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Handle multi format menu items with nested handlers
|
|
354
|
+
if (item.multi && item.triggers && Array.isArray(item.triggers)) {
|
|
355
|
+
xml += ` <item type="multi">${escapeXml(item.multi)}\n`;
|
|
356
|
+
xml += this.buildNestedHandlers(item.triggers);
|
|
357
|
+
xml += ` </item>\n`;
|
|
358
|
+
}
|
|
359
|
+
// Handle legacy format menu items
|
|
360
|
+
else if (item.trigger) {
|
|
361
|
+
// For legacy items, keep using cmd with *<trigger> format
|
|
362
|
+
let trigger = item.trigger || '';
|
|
363
|
+
if (!trigger.startsWith('*')) {
|
|
364
|
+
trigger = '*' + trigger;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
const attrs = [`cmd="${trigger}"`];
|
|
368
|
+
|
|
369
|
+
// Add handler attributes
|
|
370
|
+
// If workflow-install exists, use its value for workflow attribute (vendoring)
|
|
371
|
+
// workflow-install is build-time metadata - tells installer where to copy workflows
|
|
372
|
+
// The final XML should only have workflow pointing to the install location
|
|
373
|
+
if (item['workflow-install']) {
|
|
374
|
+
attrs.push(`workflow="${item['workflow-install']}"`);
|
|
375
|
+
} else if (item.workflow) {
|
|
376
|
+
attrs.push(`workflow="${item.workflow}"`);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
if (item['validate-workflow']) attrs.push(`validate-workflow="${item['validate-workflow']}"`);
|
|
380
|
+
if (item.exec) attrs.push(`exec="${item.exec}"`);
|
|
381
|
+
if (item.tmpl) attrs.push(`tmpl="${item.tmpl}"`);
|
|
382
|
+
if (item.data) attrs.push(`data="${item.data}"`);
|
|
383
|
+
if (item.action) attrs.push(`action="${item.action}"`);
|
|
384
|
+
|
|
385
|
+
xml += ` <item ${attrs.join(' ')}>${escapeXml(item.description || '')}</item>\n`;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
// Always inject dismiss last
|
|
391
|
+
xml += ` <item cmd="*dismiss">[D] Dismiss Agent</item>\n`;
|
|
392
|
+
|
|
393
|
+
xml += ' </menu>\n';
|
|
394
|
+
|
|
395
|
+
return xml;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
/**
|
|
399
|
+
* Build nested handlers for multi format menu items
|
|
400
|
+
* @param {Array} triggers - Triggers array from multi format
|
|
401
|
+
* @returns {string} Handler XML
|
|
402
|
+
*/
|
|
403
|
+
buildNestedHandlers(triggers) {
|
|
404
|
+
let xml = '';
|
|
405
|
+
|
|
406
|
+
for (const triggerGroup of triggers) {
|
|
407
|
+
for (const [triggerName, execArray] of Object.entries(triggerGroup)) {
|
|
408
|
+
// Build trigger with * prefix
|
|
409
|
+
let trigger = triggerName.startsWith('*') ? triggerName : '*' + triggerName;
|
|
410
|
+
|
|
411
|
+
// Extract the relevant execution data
|
|
412
|
+
const execData = this.processExecArray(execArray);
|
|
413
|
+
|
|
414
|
+
// For nested handlers in multi items, we don't need cmd attribute
|
|
415
|
+
// The match attribute will handle fuzzy matching
|
|
416
|
+
const attrs = [`match="${escapeXml(execData.description || '')}"`];
|
|
417
|
+
|
|
418
|
+
// Add handler attributes based on exec data
|
|
419
|
+
if (execData.route) attrs.push(`exec="${execData.route}"`);
|
|
420
|
+
if (execData.workflow) attrs.push(`workflow="${execData.workflow}"`);
|
|
421
|
+
if (execData['validate-workflow']) attrs.push(`validate-workflow="${execData['validate-workflow']}"`);
|
|
422
|
+
if (execData.action) attrs.push(`action="${execData.action}"`);
|
|
423
|
+
if (execData.data) attrs.push(`data="${execData.data}"`);
|
|
424
|
+
if (execData.tmpl) attrs.push(`tmpl="${execData.tmpl}"`);
|
|
425
|
+
// Only add type if it's not 'exec' (exec is already implied by the exec attribute)
|
|
426
|
+
if (execData.type && execData.type !== 'exec') attrs.push(`type="${execData.type}"`);
|
|
427
|
+
|
|
428
|
+
xml += ` <handler ${attrs.join(' ')}></handler>\n`;
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return xml;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/**
|
|
436
|
+
* Process the execution array from multi format triggers
|
|
437
|
+
* Extracts relevant data for XML attributes
|
|
438
|
+
* @param {Array} execArray - Array of execution objects
|
|
439
|
+
* @returns {Object} Processed execution data
|
|
440
|
+
*/
|
|
441
|
+
processExecArray(execArray) {
|
|
442
|
+
const result = {
|
|
443
|
+
description: '',
|
|
444
|
+
route: null,
|
|
445
|
+
workflow: null,
|
|
446
|
+
data: null,
|
|
447
|
+
action: null,
|
|
448
|
+
type: null,
|
|
449
|
+
};
|
|
450
|
+
|
|
451
|
+
if (!Array.isArray(execArray)) {
|
|
452
|
+
return result;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
for (const exec of execArray) {
|
|
456
|
+
if (exec.input) {
|
|
457
|
+
// Use input as description if no explicit description is provided
|
|
458
|
+
result.description = exec.input;
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
if (exec.route) {
|
|
462
|
+
// Determine if it's a workflow or exec based on file extension or context
|
|
463
|
+
if (exec.route.endsWith('.yaml') || exec.route.endsWith('.yml')) {
|
|
464
|
+
result.workflow = exec.route;
|
|
465
|
+
} else {
|
|
466
|
+
result.route = exec.route;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
if (exec.data !== null && exec.data !== undefined) {
|
|
471
|
+
result.data = exec.data;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
if (exec.action) {
|
|
475
|
+
result.action = exec.action;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
if (exec.type) {
|
|
479
|
+
result.type = exec.type;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return result;
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
/**
|
|
487
|
+
* Calculate file hash for build tracking
|
|
488
|
+
*/
|
|
489
|
+
async calculateFileHash(filePath) {
|
|
490
|
+
if (!(await fs.pathExists(filePath))) {
|
|
491
|
+
return null;
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
495
|
+
return crypto.createHash('md5').update(content).digest('hex').slice(0, 8);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Build agent XML from YAML files and return as string (for in-memory use)
|
|
500
|
+
* @param {string} agentYamlPath - Path to agent YAML
|
|
501
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
502
|
+
* @param {Object} options - Build options
|
|
503
|
+
* @returns {Promise<string>} XML content as string
|
|
504
|
+
*/
|
|
505
|
+
async buildFromYaml(agentYamlPath, customizeYamlPath = null, options = {}) {
|
|
506
|
+
// Load and merge YAML files
|
|
507
|
+
const mergedAgent = await this.loadAndMergeAgent(agentYamlPath, customizeYamlPath);
|
|
508
|
+
|
|
509
|
+
// Calculate hashes for build tracking
|
|
510
|
+
const sourceHash = await this.calculateFileHash(agentYamlPath);
|
|
511
|
+
const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
|
|
512
|
+
|
|
513
|
+
// Extract module from path (e.g., /path/to/modules/bmm/agents/pm.yaml -> bmm)
|
|
514
|
+
// or /path/to/bmad/bmm/agents/pm.yaml -> bmm
|
|
515
|
+
// or /path/to/src/bmm/agents/pm.yaml -> bmm
|
|
516
|
+
let module = 'core'; // default to core
|
|
517
|
+
const pathParts = agentYamlPath.split(path.sep);
|
|
518
|
+
|
|
519
|
+
// Look for module indicators in the path
|
|
520
|
+
const modulesIndex = pathParts.indexOf('modules');
|
|
521
|
+
const bmadIndex = pathParts.indexOf('bmad');
|
|
522
|
+
const srcIndex = pathParts.indexOf('src');
|
|
523
|
+
|
|
524
|
+
if (modulesIndex !== -1 && pathParts[modulesIndex + 1]) {
|
|
525
|
+
// Path contains /modules/{module}/
|
|
526
|
+
module = pathParts[modulesIndex + 1];
|
|
527
|
+
} else if (bmadIndex !== -1 && pathParts[bmadIndex + 1]) {
|
|
528
|
+
// Path contains /bmad/{module}/
|
|
529
|
+
const potentialModule = pathParts[bmadIndex + 1];
|
|
530
|
+
// Check if it's a known module, not 'agents' or '_config'
|
|
531
|
+
if (['bmm', 'bmb', 'cis', 'core'].includes(potentialModule)) {
|
|
532
|
+
module = potentialModule;
|
|
533
|
+
}
|
|
534
|
+
} else if (srcIndex !== -1 && pathParts[srcIndex + 1]) {
|
|
535
|
+
// Path contains /src/{module}/ (bmm and core are directly under src/)
|
|
536
|
+
const potentialModule = pathParts[srcIndex + 1];
|
|
537
|
+
if (potentialModule === 'bmm' || potentialModule === 'core') {
|
|
538
|
+
module = potentialModule;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Build metadata
|
|
543
|
+
const buildMetadata = {
|
|
544
|
+
sourceFile: path.basename(agentYamlPath),
|
|
545
|
+
sourceHash,
|
|
546
|
+
customizeFile: customizeYamlPath ? path.basename(customizeYamlPath) : null,
|
|
547
|
+
customizeHash,
|
|
548
|
+
builderVersion: '1.0.0',
|
|
549
|
+
includeMetadata: options.includeMetadata !== false,
|
|
550
|
+
skipActivation: options.skipActivation === true,
|
|
551
|
+
forWebBundle: options.forWebBundle === true,
|
|
552
|
+
module: module, // Add module to buildMetadata
|
|
553
|
+
};
|
|
554
|
+
|
|
555
|
+
// Convert to XML and return
|
|
556
|
+
return await this.convertToXml(mergedAgent, buildMetadata);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
/**
|
|
560
|
+
* Build agent XML from YAML files
|
|
561
|
+
* @param {string} agentYamlPath - Path to agent YAML
|
|
562
|
+
* @param {string} customizeYamlPath - Path to customize YAML (optional)
|
|
563
|
+
* @param {string} outputPath - Path to write XML file
|
|
564
|
+
* @param {Object} options - Build options
|
|
565
|
+
*/
|
|
566
|
+
async buildAgent(agentYamlPath, customizeYamlPath, outputPath, options = {}) {
|
|
567
|
+
// Use buildFromYaml to get XML content
|
|
568
|
+
const xml = await this.buildFromYaml(agentYamlPath, customizeYamlPath, options);
|
|
569
|
+
|
|
570
|
+
// Write output file
|
|
571
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
572
|
+
await fs.writeFile(outputPath, xml, 'utf8');
|
|
573
|
+
|
|
574
|
+
// Calculate hashes for return value
|
|
575
|
+
const sourceHash = await this.calculateFileHash(agentYamlPath);
|
|
576
|
+
const customizeHash = customizeYamlPath ? await this.calculateFileHash(customizeYamlPath) : null;
|
|
577
|
+
|
|
578
|
+
return {
|
|
579
|
+
success: true,
|
|
580
|
+
outputPath,
|
|
581
|
+
sourceHash,
|
|
582
|
+
customizeHash,
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
module.exports = { YamlXmlBuilder };
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Bundle Distribution Setup (For Maintainers)
|
|
2
|
+
|
|
3
|
+
**Audience:** BMAD maintainers setting up bundle auto-publishing
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## One-Time Setup
|
|
8
|
+
|
|
9
|
+
Run these commands once to enable auto-publishing:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
# 1. Create bmad-bundles repo
|
|
13
|
+
gh repo create bmad-code-org/bmad-bundles --public --description "BMAD Web Bundles"
|
|
14
|
+
|
|
15
|
+
# 2. Ensure `main` exists (GitHub Pages API requires a source branch)
|
|
16
|
+
git clone git@github.com:bmad-code-org/bmad-bundles.git
|
|
17
|
+
cd bmad-bundles
|
|
18
|
+
printf '# bmad-bundles\n\nStatic bundles published from BMAD-METHOD.\n' > README.md
|
|
19
|
+
git add README.md
|
|
20
|
+
git commit -m "Initial commit"
|
|
21
|
+
git push origin main
|
|
22
|
+
cd -
|
|
23
|
+
|
|
24
|
+
# 3. Enable GitHub Pages (API replacement for removed --enable-pages flag)
|
|
25
|
+
gh api repos/bmad-code-org/bmad-bundles/pages --method POST -f source[branch]=main -f source[path]=/
|
|
26
|
+
# (Optional) confirm status
|
|
27
|
+
gh api repos/bmad-code-org/bmad-bundles/pages --jq '{status,source}'
|
|
28
|
+
|
|
29
|
+
# 4. Create GitHub PAT and add as secret
|
|
30
|
+
# Go to: https://github.com/settings/tokens/new
|
|
31
|
+
# Scopes: repo (full control)
|
|
32
|
+
# Name: bmad-bundles-ci
|
|
33
|
+
# Then add as secret:
|
|
34
|
+
gh secret set BUNDLES_PAT --repo bmad-code-org/BMAD-METHOD
|
|
35
|
+
# (paste PAT when prompted)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
If the Pages POST returns `409`, the site already exists. If it returns `422` about `main` missing, redo step 2 to push the initial commit.
|
|
39
|
+
|
|
40
|
+
**Done.** Bundles auto-publish on every main merge.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## How It Works
|
|
45
|
+
|
|
46
|
+
**On main merge:**
|
|
47
|
+
|
|
48
|
+
- `.github/workflows/bundle-latest.yaml` runs
|
|
49
|
+
- Publishes to: `https://bmad-code-org.github.io/bmad-bundles/`
|
|
50
|
+
|
|
51
|
+
**On release:**
|
|
52
|
+
|
|
53
|
+
- `npm run release:patch` runs `.github/workflows/manual-release.yaml`
|
|
54
|
+
- Attaches bundles to: `https://github.com/bmad-code-org/BMAD-METHOD/releases/latest`
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Testing
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
# Test latest channel
|
|
62
|
+
git push origin main
|
|
63
|
+
# Wait 2 min, then: curl https://bmad-code-org.github.io/bmad-bundles/
|
|
64
|
+
|
|
65
|
+
# Test stable channel
|
|
66
|
+
npm run release:patch
|
|
67
|
+
# Check: gh release view
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Troubleshooting
|
|
73
|
+
|
|
74
|
+
**"Permission denied" or auth errors**
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# Verify PAT secret exists
|
|
78
|
+
gh secret list --repo bmad-code-org/BMAD-METHOD | grep BUNDLES_PAT
|
|
79
|
+
|
|
80
|
+
# If missing, recreate PAT and add secret:
|
|
81
|
+
gh secret set BUNDLES_PAT --repo bmad-code-org/BMAD-METHOD
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**GitHub Pages not updating / need to re-check config**
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
gh api repos/bmad-code-org/bmad-bundles/pages --jq '{status,source,html_url}'
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Distribution URLs
|
|
93
|
+
|
|
94
|
+
**Stable:** `https://github.com/bmad-code-org/BMAD-METHOD/releases/latest`
|
|
95
|
+
**Latest:** `https://bmad-code-org.github.io/bmad-bundles/`
|