bmad-method 5.1.3 → 6.0.0-alpha.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/.github/FUNDING.yaml +2 -2
- package/.github/ISSUE_TEMPLATE/config.yaml +1 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +109 -0
- package/.github/workflows/discord.yaml +1 -10
- package/.github/workflows/format-check.yaml +3 -2
- package/.github/workflows/manual-release.yaml +2 -2
- package/.nvmrc +1 -0
- package/.vscode/settings.json +34 -9
- package/CHANGELOG.md +211 -577
- package/CONTRIBUTING.md +130 -60
- package/LICENSE +6 -1
- package/docs/codebase-flattener.md +19 -0
- package/docs/ide-info/auggie.md +31 -0
- package/docs/ide-info/claude-code.md +25 -0
- package/docs/ide-info/cline.md +31 -0
- package/docs/ide-info/codex.md +32 -0
- package/docs/ide-info/crush.md +30 -0
- package/docs/ide-info/cursor.md +25 -0
- package/docs/ide-info/gemini.md +25 -0
- package/docs/ide-info/github-copilot.md +26 -0
- package/docs/ide-info/iflow.md +33 -0
- package/docs/ide-info/kilo.md +24 -0
- package/docs/ide-info/qwen.md +25 -0
- package/docs/ide-info/roo.md +27 -0
- package/docs/ide-info/trae.md +25 -0
- package/docs/ide-info/windsurf.md +22 -0
- package/docs/installers-bundlers/ide-injections.md +196 -0
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +355 -0
- package/docs/installers-bundlers/web-bundler-usage.md +54 -0
- package/eslint.config.mjs +17 -7
- package/package.json +26 -35
- package/prettier.config.mjs +1 -1
- package/readme.md +216 -0
- package/src/core/_module-installer/install-menu-config.yaml +24 -0
- package/src/core/_module-installer/installer.js +68 -0
- package/src/core/agents/bmad-master.md +27 -0
- package/src/core/agents/bmad-web-orchestrator.md +71 -0
- package/src/core/tasks/adv-elicit-methods.csv +39 -0
- package/src/core/tasks/adv-elicit.md +109 -0
- package/src/core/tasks/index-docs.md +69 -0
- package/src/core/tasks/shard-doc.md +57 -0
- package/src/core/tasks/validate-workflow.md +92 -0
- package/src/core/tasks/workflow.md +141 -0
- package/src/core/workflows/bmad-init/instructions.md +79 -0
- package/src/core/workflows/bmad-init/workflow.yaml +24 -0
- package/src/core/workflows/party-mode/instructions.md +181 -0
- package/src/core/workflows/party-mode/workflow.yaml +24 -0
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +16 -0
- package/src/modules/bmb/agents/bmad-builder.md +30 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +262 -0
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +204 -0
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +328 -0
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-agent/README.md +268 -0
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +412 -0
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +757 -0
- package/src/modules/bmb/workflows/create-agent/agent-types.md +177 -0
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +174 -0
- package/src/modules/bmb/workflows/create-agent/checklist.md +134 -0
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +240 -0
- package/src/modules/bmb/workflows/create-agent/instructions.md +340 -0
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +39 -0
- package/src/modules/bmb/workflows/create-module/README.md +218 -0
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +137 -0
- package/src/modules/bmb/workflows/create-module/checklist.md +245 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +132 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +231 -0
- package/src/modules/bmb/workflows/create-module/instructions.md +509 -0
- package/src/modules/bmb/workflows/create-module/module-structure.md +310 -0
- package/src/modules/bmb/workflows/create-module/workflow.yaml +47 -0
- package/src/modules/bmb/workflows/create-workflow/README.md +216 -0
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +197 -0
- package/src/modules/bmb/workflows/create-workflow/checklist.md +72 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +267 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +456 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +24 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +12 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +9 -0
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +35 -0
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +42 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +63 -0
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +70 -0
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +170 -0
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/module-brief/README.md +264 -0
- package/src/modules/bmb/workflows/module-brief/checklist.md +116 -0
- package/src/modules/bmb/workflows/module-brief/instructions.md +265 -0
- package/src/modules/bmb/workflows/module-brief/template.md +275 -0
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +30 -0
- package/src/modules/bmb/workflows/redoc/README.md +87 -0
- package/src/modules/bmb/workflows/redoc/checklist.md +99 -0
- package/src/modules/bmb/workflows/redoc/instructions.md +255 -0
- package/src/modules/bmb/workflows/redoc/workflow.yaml +33 -0
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +1 -0
- package/src/modules/bmm/_module-installer/assets/technical-decisions-template.md +30 -0
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +49 -0
- package/src/modules/bmm/_module-installer/installer.js +131 -0
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +35 -0
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +32 -0
- package/src/modules/bmm/agents/analyst.md +26 -0
- package/src/modules/bmm/agents/architect.md +29 -0
- package/src/modules/bmm/agents/dev.md +61 -0
- package/src/modules/bmm/agents/game-architect.md +26 -0
- package/src/modules/bmm/agents/game-designer.md +27 -0
- package/src/modules/bmm/agents/game-dev.md +28 -0
- package/src/modules/bmm/agents/pm.md +26 -0
- package/src/modules/bmm/agents/po.md +25 -0
- package/src/modules/bmm/agents/sm.md +29 -0
- package/src/modules/bmm/agents/tea.md +32 -0
- package/src/modules/bmm/agents/ux-expert.md +24 -0
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +5 -0
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +242 -0
- package/src/modules/bmm/sub-modules/claude-code/readme.md +87 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +64 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +84 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +85 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +66 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +34 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +67 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +61 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +89 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +146 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +51 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +91 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +99 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +101 -0
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +56 -0
- package/src/modules/bmm/tasks/daily-standup.md +91 -0
- package/src/modules/bmm/tasks/retrospective.md +110 -0
- package/src/modules/bmm/teams/team-all.yaml +7 -0
- package/src/modules/bmm/teams/team-dev.yaml +14 -0
- package/src/modules/bmm/teams/team-gamedev.yaml +9 -0
- package/src/modules/bmm/testarch/atdd.md +40 -0
- package/src/modules/bmm/testarch/automate.md +38 -0
- package/src/modules/bmm/testarch/ci.md +39 -0
- package/src/modules/bmm/testarch/framework.md +41 -0
- package/src/modules/bmm/testarch/nfr-assess.md +38 -0
- package/src/modules/bmm/testarch/risk-profile.md +38 -0
- package/src/modules/bmm/testarch/tea-commands.csv +11 -0
- package/src/modules/bmm/testarch/tea-gate.md +38 -0
- package/src/modules/bmm/testarch/tea-knowledge.md +275 -0
- package/src/modules/bmm/testarch/test-design.md +39 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-levels-framework.md +2 -0
- package/{bmad-core/data → src/modules/bmm/testarch}/test-priorities-matrix.md +2 -0
- package/src/modules/bmm/testarch/trace-requirements.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-brain-methods.csv +26 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/game-context.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +47 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +38 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +25 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +21 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +221 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/checklist.md +128 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +517 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/template.md +205 -0
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +34 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +115 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +353 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +165 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +33 -0
- package/src/modules/bmm/workflows/1-analysis/research/README.md +454 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +202 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +114 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +259 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +190 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +337 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +107 -0
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +329 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +370 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +553 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +91 -0
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +442 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +94 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +311 -0
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +210 -0
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +149 -0
- package/src/modules/bmm/workflows/2-plan/README.md +203 -0
- package/src/modules/bmm/workflows/2-plan/checklist.md +369 -0
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +222 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/action-platformer.md +45 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/adventure.md +84 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/card-game.md +76 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/fighting.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/horror.md +86 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/idle-incremental.md +78 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/metroidvania.md +87 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/moba.md +74 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/party-game.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/puzzle.md +58 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/racing.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rhythm.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/roguelike.md +69 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/rpg.md +70 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sandbox.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/shooter.md +62 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/simulation.md +73 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/sports.md +75 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/strategy.md +71 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/survival.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/text-based.md +91 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/tower-defense.md +79 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/turn-based-tactics.md +88 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types/visual-novel.md +89 -0
- package/src/modules/bmm/workflows/2-plan/gdd/game-types.csv +25 -0
- package/src/modules/bmm/workflows/2-plan/gdd/gdd-template.md +159 -0
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +480 -0
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +222 -0
- package/src/modules/bmm/workflows/2-plan/narrative/instructions-narrative.md +517 -0
- package/src/modules/bmm/workflows/2-plan/narrative/narrative-template.md +195 -0
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +53 -0
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +18 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +267 -0
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +251 -0
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +73 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +137 -0
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +59 -0
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +360 -0
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +162 -0
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +74 -0
- package/src/modules/bmm/workflows/3-solutioning/README.md +565 -0
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +170 -0
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +661 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +490 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +337 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +472 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +299 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +118 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +374 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +133 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +484 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +110 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +12 -0
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +136 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +195 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/checklist.md +17 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +73 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/template.md +76 -0
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +244 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +428 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +333 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +528 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +172 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +66 -0
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +277 -0
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +65 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +279 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +190 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +35 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +42 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +39 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +81 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +57 -0
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +72 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +84 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +38 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +87 -0
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +53 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +391 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +72 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +176 -0
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +99 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +16 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +34 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +56 -0
- package/src/modules/cis/_module-installer/install-menu-config.yaml +14 -0
- package/src/modules/cis/_module-installer/installer.js +92 -0
- package/src/modules/cis/agents/README.md +104 -0
- package/src/modules/cis/agents/brainstorming-coach.md +24 -0
- package/src/modules/cis/agents/creative-problem-solver.md +24 -0
- package/src/modules/cis/agents/design-thinking-coach.md +24 -0
- package/src/modules/cis/agents/innovation-strategist.md +24 -0
- package/src/modules/cis/agents/storyteller.md +24 -0
- package/src/modules/cis/readme.md +86 -0
- package/src/modules/cis/teams/creative-squad.yaml +6 -0
- package/src/modules/cis/workflows/README.md +67 -0
- package/src/modules/cis/workflows/brainstorming/README.md +271 -0
- package/src/modules/cis/workflows/brainstorming/brain-methods.csv +36 -0
- package/src/modules/cis/workflows/brainstorming/instructions.md +310 -0
- package/src/modules/cis/workflows/brainstorming/template.md +102 -0
- package/src/modules/cis/workflows/brainstorming/workflow.yaml +30 -0
- package/src/modules/cis/workflows/design-thinking/README.md +56 -0
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +31 -0
- package/src/modules/cis/workflows/design-thinking/instructions.md +200 -0
- package/src/modules/cis/workflows/design-thinking/template.md +111 -0
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +29 -0
- package/src/modules/cis/workflows/innovation-strategy/README.md +56 -0
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +31 -0
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +274 -0
- package/src/modules/cis/workflows/innovation-strategy/template.md +189 -0
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +29 -0
- package/src/modules/cis/workflows/problem-solving/README.md +56 -0
- package/src/modules/cis/workflows/problem-solving/instructions.md +250 -0
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +31 -0
- package/src/modules/cis/workflows/problem-solving/template.md +165 -0
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +29 -0
- package/src/modules/cis/workflows/storytelling/README.md +58 -0
- package/src/modules/cis/workflows/storytelling/instructions.md +275 -0
- package/src/modules/cis/workflows/storytelling/story-types.csv +26 -0
- package/src/modules/cis/workflows/storytelling/template.md +113 -0
- package/src/modules/cis/workflows/storytelling/workflow.yaml +29 -0
- package/src/utility/models/agent-activation-ide.xml +51 -0
- package/src/utility/models/agent-config-template.md +23 -0
- package/tools/cli/bmad-cli.js +42 -0
- package/tools/cli/bundlers/bundle-web.js +157 -0
- package/tools/cli/bundlers/test-analyst.js +28 -0
- package/tools/cli/bundlers/test-bundler.js +118 -0
- package/tools/cli/bundlers/web-bundler.js +880 -0
- package/tools/cli/commands/install.js +41 -0
- package/tools/cli/commands/list.js +28 -0
- package/tools/cli/commands/status.js +47 -0
- package/tools/cli/commands/uninstall.js +44 -0
- package/tools/cli/commands/update.js +28 -0
- package/tools/cli/installers/lib/core/config-collector.js +383 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +721 -0
- package/tools/cli/installers/lib/core/detector.js +208 -0
- package/tools/cli/installers/lib/core/installer.js +1070 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +385 -0
- package/tools/cli/installers/lib/core/manifest.js +484 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +281 -0
- package/tools/cli/installers/lib/ide/auggie.js +271 -0
- package/tools/cli/installers/lib/ide/claude-code.js +625 -0
- package/tools/cli/installers/lib/ide/cline.js +301 -0
- package/tools/cli/installers/lib/ide/codex.js +267 -0
- package/tools/cli/installers/lib/ide/crush.js +204 -0
- package/tools/cli/installers/lib/ide/cursor.js +224 -0
- package/tools/cli/installers/lib/ide/gemini.js +160 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +289 -0
- package/tools/cli/installers/lib/ide/iflow.js +142 -0
- package/tools/cli/installers/lib/ide/kilo.js +171 -0
- package/tools/cli/installers/lib/ide/manager.js +203 -0
- package/tools/cli/installers/lib/ide/qwen.js +188 -0
- package/tools/cli/installers/lib/ide/roo.js +288 -0
- package/tools/cli/installers/lib/ide/trae.js +182 -0
- package/tools/cli/installers/lib/ide/windsurf.js +149 -0
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +162 -0
- package/tools/cli/installers/lib/ide/workflow-command-template.md +11 -0
- package/tools/cli/installers/lib/modules/manager.js +452 -0
- package/tools/cli/lib/agent-party-generator.js +206 -0
- package/tools/cli/lib/cli-utils.js +208 -0
- package/tools/cli/lib/config.js +210 -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 +71 -0
- package/tools/cli/lib/replace-project-root.js +239 -0
- package/tools/cli/lib/ui.js +516 -0
- package/tools/cli/lib/xml-handler.js +183 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/{yaml-format.js → cli/lib/yaml-format.js} +3 -10
- package/tools/cli/regenerate-manifests.js +28 -0
- package/tools/flattener/ignoreRules.js +2 -6
- package/tools/flattener/main.js +31 -121
- package/tools/flattener/projectRoot.js +3 -8
- package/tools/flattener/stats.helpers.js +8 -35
- package/tools/flattener/stats.js +1 -6
- package/tools/flattener/test-matrix.js +1 -5
- package/tools/platform-codes.yaml +127 -0
- package/tools/test-agents/captain-kirk-commander.md +110 -0
- package/tools/test-agents/data-operations-android.md +123 -0
- package/tools/test-agents/geordi-chief-engineer.md +135 -0
- package/tools/test-agents/isabella-martinez-ethicist.md +109 -0
- package/tools/test-agents/marcus-thompson-security.md +109 -0
- package/tools/test-agents/maya-patel-pragmatist.md +82 -0
- package/tools/test-agents/picard-diplomat-captain.md +134 -0
- package/tools/test-agents/spock-science-officer.md +124 -0
- package/tools/test-agents/william-smithers-technocrat.md +71 -0
- package/tools/test-agents/zara-chen-designer.md +94 -0
- package/tools/validate-bundles.js +87 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
- package/README.md +0 -221
- package/bmad-core/agent-teams/team-all.yaml +0 -14
- package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
- package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
- package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
- package/bmad-core/agents/analyst.md +0 -81
- package/bmad-core/agents/architect.md +0 -83
- package/bmad-core/agents/bmad-master.md +0 -107
- package/bmad-core/agents/bmad-orchestrator.md +0 -149
- package/bmad-core/agents/dev.md +0 -75
- package/bmad-core/agents/pm.md +0 -81
- package/bmad-core/agents/po.md +0 -76
- package/bmad-core/agents/qa.md +0 -88
- package/bmad-core/agents/sm.md +0 -62
- package/bmad-core/agents/ux-expert.md +0 -66
- package/bmad-core/checklists/architect-checklist.md +0 -438
- package/bmad-core/checklists/change-checklist.md +0 -182
- package/bmad-core/checklists/pm-checklist.md +0 -370
- package/bmad-core/checklists/po-master-checklist.md +0 -432
- package/bmad-core/checklists/story-dod-checklist.md +0 -94
- package/bmad-core/checklists/story-draft-checklist.md +0 -153
- package/bmad-core/core-config.yaml +0 -20
- package/bmad-core/data/bmad-kb.md +0 -806
- package/bmad-core/data/brainstorming-techniques.md +0 -36
- package/bmad-core/data/elicitation-methods.md +0 -154
- package/bmad-core/data/technical-preferences.md +0 -3
- package/bmad-core/tasks/advanced-elicitation.md +0 -117
- package/bmad-core/tasks/brownfield-create-epic.md +0 -160
- package/bmad-core/tasks/brownfield-create-story.md +0 -147
- package/bmad-core/tasks/correct-course.md +0 -70
- package/bmad-core/tasks/create-brownfield-story.md +0 -312
- package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
- package/bmad-core/tasks/create-next-story.md +0 -112
- package/bmad-core/tasks/document-project.md +0 -343
- package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
- package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
- package/bmad-core/tasks/index-docs.md +0 -173
- package/bmad-core/tasks/kb-mode-interaction.md +0 -75
- package/bmad-core/tasks/nfr-assess.md +0 -343
- package/bmad-core/tasks/qa-gate.md +0 -159
- package/bmad-core/tasks/review-story.md +0 -314
- package/bmad-core/tasks/risk-profile.md +0 -353
- package/bmad-core/tasks/shard-doc.md +0 -185
- package/bmad-core/tasks/test-design.md +0 -174
- package/bmad-core/tasks/trace-requirements.md +0 -264
- package/bmad-core/tasks/validate-next-story.md +0 -134
- package/bmad-core/templates/architecture-tmpl.yaml +0 -650
- package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
- package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
- package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
- package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
- package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
- package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
- package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
- package/bmad-core/templates/market-research-tmpl.yaml +0 -252
- package/bmad-core/templates/prd-tmpl.yaml +0 -202
- package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
- package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
- package/bmad-core/templates/story-tmpl.yaml +0 -137
- package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
- package/bmad-core/workflows/brownfield-service.yaml +0 -187
- package/bmad-core/workflows/brownfield-ui.yaml +0 -197
- package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
- package/bmad-core/workflows/greenfield-service.yaml +0 -206
- package/bmad-core/workflows/greenfield-ui.yaml +0 -235
- package/common/tasks/create-doc.md +0 -101
- package/common/tasks/execute-checklist.md +0 -86
- package/common/utils/bmad-doc-template.md +0 -325
- package/common/utils/workflow-management.md +0 -69
- package/dist/agents/analyst.txt +0 -2889
- package/dist/agents/architect.txt +0 -3552
- package/dist/agents/bmad-master.txt +0 -8769
- package/dist/agents/bmad-orchestrator.txt +0 -1513
- package/dist/agents/dev.txt +0 -414
- package/dist/agents/pm.txt +0 -2204
- package/dist/agents/po.txt +0 -1346
- package/dist/agents/qa.txt +0 -1987
- package/dist/agents/sm.txt +0 -658
- package/dist/agents/ux-expert.txt +0 -694
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
- package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
- package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
- package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
- package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
- package/dist/teams/team-all.txt +0 -12682
- package/dist/teams/team-fullstack.txt +0 -10421
- package/dist/teams/team-ide-minimal.txt +0 -5103
- package/dist/teams/team-no-ui.txt +0 -8980
- package/docs/GUIDING-PRINCIPLES.md +0 -91
- package/docs/core-architecture.md +0 -219
- package/docs/enhanced-ide-development-workflow.md +0 -248
- package/docs/expansion-packs.md +0 -280
- package/docs/how-to-contribute-with-pull-requests.md +0 -158
- package/docs/user-guide.md +0 -504
- package/docs/versioning-and-releases.md +0 -147
- package/docs/versions.md +0 -48
- package/docs/working-in-the-brownfield.md +0 -597
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
- package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
- package/expansion-packs/README.md +0 -3
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
- package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
- package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
- package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
- package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
- package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
- package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
- package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
- package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
- package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
- package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
- package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
- package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
- package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
- package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
- package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
- package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
- package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
- package/release_notes.md +0 -33
- package/tools/bmad-npx-wrapper.js +0 -39
- package/tools/builders/web-builder.js +0 -675
- package/tools/bump-all-versions.js +0 -115
- package/tools/bump-expansion-version.js +0 -90
- package/tools/cli.js +0 -152
- package/tools/installer/README.md +0 -8
- package/tools/installer/bin/bmad.js +0 -585
- package/tools/installer/config/ide-agent-config.yaml +0 -58
- package/tools/installer/config/install.config.yaml +0 -123
- package/tools/installer/lib/config-loader.js +0 -257
- package/tools/installer/lib/file-manager.js +0 -389
- package/tools/installer/lib/ide-base-setup.js +0 -228
- package/tools/installer/lib/ide-setup.js +0 -1441
- package/tools/installer/lib/installer.js +0 -1995
- package/tools/installer/lib/memory-profiler.js +0 -225
- package/tools/installer/lib/module-manager.js +0 -114
- package/tools/installer/lib/resource-locator.js +0 -308
- package/tools/installer/package.json +0 -44
- package/tools/lib/dependency-resolver.js +0 -175
- package/tools/lib/yaml-utils.js +0 -29
- package/tools/md-assets/web-agent-startup-instructions.md +0 -39
- package/tools/preview-release-notes.js +0 -66
- package/tools/shared/bannerArt.js +0 -105
- package/tools/sync-installer-version.js +0 -32
- package/tools/update-expansion-version.js +0 -53
- package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
- package/tools/version-bump.js +0 -94
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const yaml = require('js-yaml');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const { XmlHandler } = require('../../../lib/xml-handler');
|
|
6
|
+
const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Manages the installation, updating, and removal of BMAD modules.
|
|
10
|
+
* Handles module discovery, dependency resolution, configuration processing,
|
|
11
|
+
* and agent file management including XML activation block injection.
|
|
12
|
+
*
|
|
13
|
+
* @class ModuleManager
|
|
14
|
+
* @requires fs-extra
|
|
15
|
+
* @requires js-yaml
|
|
16
|
+
* @requires chalk
|
|
17
|
+
* @requires XmlHandler
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* const manager = new ModuleManager();
|
|
21
|
+
* const modules = await manager.listAvailable();
|
|
22
|
+
* await manager.install('core-module', '/path/to/bmad');
|
|
23
|
+
*/
|
|
24
|
+
class ModuleManager {
|
|
25
|
+
constructor() {
|
|
26
|
+
// Path to source modules directory
|
|
27
|
+
this.modulesSourcePath = getSourcePath('modules');
|
|
28
|
+
this.xmlHandler = new XmlHandler();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* List all available modules
|
|
33
|
+
* @returns {Array} List of available modules with metadata
|
|
34
|
+
*/
|
|
35
|
+
async listAvailable() {
|
|
36
|
+
const modules = [];
|
|
37
|
+
|
|
38
|
+
if (!(await fs.pathExists(this.modulesSourcePath))) {
|
|
39
|
+
console.warn(chalk.yellow('Warning: src/modules directory not found'));
|
|
40
|
+
return modules;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const entries = await fs.readdir(this.modulesSourcePath, { withFileTypes: true });
|
|
44
|
+
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (entry.isDirectory()) {
|
|
47
|
+
const modulePath = path.join(this.modulesSourcePath, entry.name);
|
|
48
|
+
// Check for new structure first
|
|
49
|
+
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-menu-config.yaml');
|
|
50
|
+
// Fallback to old structure
|
|
51
|
+
const configPath = path.join(modulePath, 'config.yaml');
|
|
52
|
+
|
|
53
|
+
const moduleInfo = {
|
|
54
|
+
id: entry.name,
|
|
55
|
+
path: modulePath,
|
|
56
|
+
name: entry.name.toUpperCase(),
|
|
57
|
+
description: 'BMAD Module',
|
|
58
|
+
version: '5.0.0',
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Try to read module config for metadata (prefer new location)
|
|
62
|
+
const configToRead = (await fs.pathExists(installerConfigPath)) ? installerConfigPath : configPath;
|
|
63
|
+
if (await fs.pathExists(configToRead)) {
|
|
64
|
+
try {
|
|
65
|
+
const configContent = await fs.readFile(configToRead, 'utf8');
|
|
66
|
+
const config = yaml.load(configContent);
|
|
67
|
+
|
|
68
|
+
// Use the code property as the id if available
|
|
69
|
+
if (config.code) {
|
|
70
|
+
moduleInfo.id = config.code;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
moduleInfo.name = config.name || moduleInfo.name;
|
|
74
|
+
moduleInfo.description = config.description || moduleInfo.description;
|
|
75
|
+
moduleInfo.version = config.version || moduleInfo.version;
|
|
76
|
+
moduleInfo.dependencies = config.dependencies || [];
|
|
77
|
+
moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
console.warn(`Failed to read config for ${entry.name}:`, error.message);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
modules.push(moduleInfo);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return modules;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Install a module
|
|
92
|
+
* @param {string} moduleName - Name of the module to install
|
|
93
|
+
* @param {string} bmadDir - Target bmad directory
|
|
94
|
+
* @param {Function} fileTrackingCallback - Optional callback to track installed files
|
|
95
|
+
* @param {Object} options - Additional installation options
|
|
96
|
+
* @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
|
|
97
|
+
* @param {Object} options.moduleConfig - Module configuration from config collector
|
|
98
|
+
* @param {Object} options.logger - Logger instance for output
|
|
99
|
+
*/
|
|
100
|
+
async install(moduleName, bmadDir, fileTrackingCallback = null, options = {}) {
|
|
101
|
+
const sourcePath = path.join(this.modulesSourcePath, moduleName);
|
|
102
|
+
const targetPath = path.join(bmadDir, moduleName);
|
|
103
|
+
|
|
104
|
+
// Check if source module exists
|
|
105
|
+
if (!(await fs.pathExists(sourcePath))) {
|
|
106
|
+
throw new Error(`Module '${moduleName}' not found in ${this.modulesSourcePath}`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Check if already installed
|
|
110
|
+
if (await fs.pathExists(targetPath)) {
|
|
111
|
+
console.log(chalk.yellow(`Module '${moduleName}' already installed, updating...`));
|
|
112
|
+
await fs.remove(targetPath);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Copy module files with filtering
|
|
116
|
+
await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback);
|
|
117
|
+
|
|
118
|
+
// Process agent files to inject activation block
|
|
119
|
+
await this.processAgentFiles(targetPath, moduleName);
|
|
120
|
+
|
|
121
|
+
// Call module-specific installer if it exists (unless explicitly skipped)
|
|
122
|
+
if (!options.skipModuleInstaller) {
|
|
123
|
+
await this.runModuleInstaller(moduleName, bmadDir, options);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
success: true,
|
|
128
|
+
module: moduleName,
|
|
129
|
+
path: targetPath,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Update an existing module
|
|
135
|
+
* @param {string} moduleName - Name of the module to update
|
|
136
|
+
* @param {string} bmadDir - Target bmad directory
|
|
137
|
+
* @param {boolean} force - Force update (overwrite modifications)
|
|
138
|
+
*/
|
|
139
|
+
async update(moduleName, bmadDir, force = false) {
|
|
140
|
+
const sourcePath = path.join(this.modulesSourcePath, moduleName);
|
|
141
|
+
const targetPath = path.join(bmadDir, moduleName);
|
|
142
|
+
|
|
143
|
+
// Check if source module exists
|
|
144
|
+
if (!(await fs.pathExists(sourcePath))) {
|
|
145
|
+
throw new Error(`Module '${moduleName}' not found in source`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Check if module is installed
|
|
149
|
+
if (!(await fs.pathExists(targetPath))) {
|
|
150
|
+
throw new Error(`Module '${moduleName}' is not installed`);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (force) {
|
|
154
|
+
// Force update - remove and reinstall
|
|
155
|
+
await fs.remove(targetPath);
|
|
156
|
+
return await this.install(moduleName, bmadDir);
|
|
157
|
+
} else {
|
|
158
|
+
// Selective update - preserve user modifications
|
|
159
|
+
await this.syncModule(sourcePath, targetPath);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
success: true,
|
|
164
|
+
module: moduleName,
|
|
165
|
+
path: targetPath,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Remove a module
|
|
171
|
+
* @param {string} moduleName - Name of the module to remove
|
|
172
|
+
* @param {string} bmadDir - Target bmad directory
|
|
173
|
+
*/
|
|
174
|
+
async remove(moduleName, bmadDir) {
|
|
175
|
+
const targetPath = path.join(bmadDir, moduleName);
|
|
176
|
+
|
|
177
|
+
if (!(await fs.pathExists(targetPath))) {
|
|
178
|
+
throw new Error(`Module '${moduleName}' is not installed`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
await fs.remove(targetPath);
|
|
182
|
+
|
|
183
|
+
return {
|
|
184
|
+
success: true,
|
|
185
|
+
module: moduleName,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Check if a module is installed
|
|
191
|
+
* @param {string} moduleName - Name of the module
|
|
192
|
+
* @param {string} bmadDir - Target bmad directory
|
|
193
|
+
* @returns {boolean} True if module is installed
|
|
194
|
+
*/
|
|
195
|
+
async isInstalled(moduleName, bmadDir) {
|
|
196
|
+
const targetPath = path.join(bmadDir, moduleName);
|
|
197
|
+
return await fs.pathExists(targetPath);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Get installed module info
|
|
202
|
+
* @param {string} moduleName - Name of the module
|
|
203
|
+
* @param {string} bmadDir - Target bmad directory
|
|
204
|
+
* @returns {Object|null} Module info or null if not installed
|
|
205
|
+
*/
|
|
206
|
+
async getInstalledInfo(moduleName, bmadDir) {
|
|
207
|
+
const targetPath = path.join(bmadDir, moduleName);
|
|
208
|
+
|
|
209
|
+
if (!(await fs.pathExists(targetPath))) {
|
|
210
|
+
return null;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const configPath = path.join(targetPath, 'config.yaml');
|
|
214
|
+
const moduleInfo = {
|
|
215
|
+
id: moduleName,
|
|
216
|
+
path: targetPath,
|
|
217
|
+
installed: true,
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
if (await fs.pathExists(configPath)) {
|
|
221
|
+
try {
|
|
222
|
+
const configContent = await fs.readFile(configPath, 'utf8');
|
|
223
|
+
const config = yaml.load(configContent);
|
|
224
|
+
Object.assign(moduleInfo, config);
|
|
225
|
+
} catch (error) {
|
|
226
|
+
console.warn(`Failed to read installed module config:`, error.message);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return moduleInfo;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Copy module with filtering for localskip agents
|
|
235
|
+
* @param {string} sourcePath - Source module path
|
|
236
|
+
* @param {string} targetPath - Target module path
|
|
237
|
+
*/
|
|
238
|
+
async copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback = null) {
|
|
239
|
+
// Get all files in source
|
|
240
|
+
const sourceFiles = await this.getFileList(sourcePath);
|
|
241
|
+
|
|
242
|
+
for (const file of sourceFiles) {
|
|
243
|
+
// Skip sub-modules directory - these are IDE-specific and handled separately
|
|
244
|
+
if (file.startsWith('sub-modules/')) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Skip _module-installer directory - it's only needed at install time
|
|
249
|
+
if (file.startsWith('_module-installer/')) {
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Skip config.yaml templates - we'll generate clean ones with actual values
|
|
254
|
+
if (file === 'config.yaml' || file.endsWith('/config.yaml')) {
|
|
255
|
+
continue;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
const sourceFile = path.join(sourcePath, file);
|
|
259
|
+
const targetFile = path.join(targetPath, file);
|
|
260
|
+
|
|
261
|
+
// Check if this is an agent file
|
|
262
|
+
if (file.startsWith('agents/') && file.endsWith('.md')) {
|
|
263
|
+
// Read the file to check for localskip
|
|
264
|
+
const content = await fs.readFile(sourceFile, 'utf8');
|
|
265
|
+
|
|
266
|
+
// Check for localskip="true" in the agent tag
|
|
267
|
+
const agentMatch = content.match(/<agent[^>]*\slocalskip="true"[^>]*>/);
|
|
268
|
+
if (agentMatch) {
|
|
269
|
+
console.log(chalk.dim(` Skipping web-only agent: ${path.basename(file)}`));
|
|
270
|
+
continue; // Skip this agent
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Copy the file
|
|
275
|
+
await fs.ensureDir(path.dirname(targetFile));
|
|
276
|
+
await fs.copy(sourceFile, targetFile, { overwrite: true });
|
|
277
|
+
|
|
278
|
+
// Track the file if callback provided
|
|
279
|
+
if (fileTrackingCallback) {
|
|
280
|
+
fileTrackingCallback(targetFile);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Process agent files to inject activation block
|
|
287
|
+
* @param {string} modulePath - Path to installed module
|
|
288
|
+
* @param {string} moduleName - Module name
|
|
289
|
+
*/
|
|
290
|
+
async processAgentFiles(modulePath, moduleName) {
|
|
291
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
292
|
+
|
|
293
|
+
// Check if agents directory exists
|
|
294
|
+
if (!(await fs.pathExists(agentsPath))) {
|
|
295
|
+
return; // No agents to process
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Get all agent files
|
|
299
|
+
const agentFiles = await fs.readdir(agentsPath);
|
|
300
|
+
|
|
301
|
+
for (const agentFile of agentFiles) {
|
|
302
|
+
if (!agentFile.endsWith('.md')) continue;
|
|
303
|
+
|
|
304
|
+
const agentPath = path.join(agentsPath, agentFile);
|
|
305
|
+
let content = await fs.readFile(agentPath, 'utf8');
|
|
306
|
+
|
|
307
|
+
// Check if content has agent XML and no activation block
|
|
308
|
+
if (content.includes('<agent') && !content.includes('<activation')) {
|
|
309
|
+
// Inject the activation block using XML handler
|
|
310
|
+
content = this.xmlHandler.injectActivationSimple(content);
|
|
311
|
+
await fs.writeFile(agentPath, content, 'utf8');
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Run module-specific installer if it exists
|
|
318
|
+
* @param {string} moduleName - Name of the module
|
|
319
|
+
* @param {string} bmadDir - Target bmad directory
|
|
320
|
+
* @param {Object} options - Installation options
|
|
321
|
+
*/
|
|
322
|
+
async runModuleInstaller(moduleName, bmadDir, options = {}) {
|
|
323
|
+
// Special handling for core module - it's in src/core not src/modules
|
|
324
|
+
let sourcePath;
|
|
325
|
+
if (moduleName === 'core') {
|
|
326
|
+
sourcePath = getSourcePath('core');
|
|
327
|
+
} else {
|
|
328
|
+
sourcePath = path.join(this.modulesSourcePath, moduleName);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const installerPath = path.join(sourcePath, '_module-installer', 'installer.js');
|
|
332
|
+
|
|
333
|
+
// Check if module has a custom installer
|
|
334
|
+
if (!(await fs.pathExists(installerPath))) {
|
|
335
|
+
return; // No custom installer
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
try {
|
|
339
|
+
// Load the module installer
|
|
340
|
+
const moduleInstaller = require(installerPath);
|
|
341
|
+
|
|
342
|
+
if (typeof moduleInstaller.install === 'function') {
|
|
343
|
+
// Get project root (parent of bmad directory)
|
|
344
|
+
const projectRoot = path.dirname(bmadDir);
|
|
345
|
+
|
|
346
|
+
// Prepare logger (use console if not provided)
|
|
347
|
+
const logger = options.logger || {
|
|
348
|
+
log: console.log,
|
|
349
|
+
error: console.error,
|
|
350
|
+
warn: console.warn,
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
// Call the module installer
|
|
354
|
+
const result = await moduleInstaller.install({
|
|
355
|
+
projectRoot,
|
|
356
|
+
config: options.moduleConfig || {},
|
|
357
|
+
installedIDEs: options.installedIDEs || [],
|
|
358
|
+
logger,
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
if (!result) {
|
|
362
|
+
console.warn(chalk.yellow(`Module installer for ${moduleName} returned false`));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
} catch (error) {
|
|
366
|
+
console.error(chalk.red(`Error running module installer for ${moduleName}: ${error.message}`));
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Private: Process module configuration
|
|
372
|
+
* @param {string} modulePath - Path to installed module
|
|
373
|
+
* @param {string} moduleName - Module name
|
|
374
|
+
*/
|
|
375
|
+
async processModuleConfig(modulePath, moduleName) {
|
|
376
|
+
const configPath = path.join(modulePath, 'config.yaml');
|
|
377
|
+
|
|
378
|
+
if (await fs.pathExists(configPath)) {
|
|
379
|
+
try {
|
|
380
|
+
let configContent = await fs.readFile(configPath, 'utf8');
|
|
381
|
+
|
|
382
|
+
// Replace path placeholders
|
|
383
|
+
configContent = configContent.replaceAll('{project-root}', `bmad/${moduleName}`);
|
|
384
|
+
configContent = configContent.replaceAll('{module}', moduleName);
|
|
385
|
+
|
|
386
|
+
await fs.writeFile(configPath, configContent, 'utf8');
|
|
387
|
+
} catch (error) {
|
|
388
|
+
console.warn(`Failed to process module config:`, error.message);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
/**
|
|
394
|
+
* Private: Sync module files (preserving user modifications)
|
|
395
|
+
* @param {string} sourcePath - Source module path
|
|
396
|
+
* @param {string} targetPath - Target module path
|
|
397
|
+
*/
|
|
398
|
+
async syncModule(sourcePath, targetPath) {
|
|
399
|
+
// Get list of all source files
|
|
400
|
+
const sourceFiles = await this.getFileList(sourcePath);
|
|
401
|
+
|
|
402
|
+
for (const file of sourceFiles) {
|
|
403
|
+
const sourceFile = path.join(sourcePath, file);
|
|
404
|
+
const targetFile = path.join(targetPath, file);
|
|
405
|
+
|
|
406
|
+
// Check if target file exists and has been modified
|
|
407
|
+
if (await fs.pathExists(targetFile)) {
|
|
408
|
+
const sourceStats = await fs.stat(sourceFile);
|
|
409
|
+
const targetStats = await fs.stat(targetFile);
|
|
410
|
+
|
|
411
|
+
// Skip if target is newer (user modified)
|
|
412
|
+
if (targetStats.mtime > sourceStats.mtime) {
|
|
413
|
+
continue;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// Copy file
|
|
418
|
+
await fs.ensureDir(path.dirname(targetFile));
|
|
419
|
+
await fs.copy(sourceFile, targetFile, { overwrite: true });
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/**
|
|
424
|
+
* Private: Get list of all files in a directory
|
|
425
|
+
* @param {string} dir - Directory path
|
|
426
|
+
* @param {string} baseDir - Base directory for relative paths
|
|
427
|
+
* @returns {Array} List of relative file paths
|
|
428
|
+
*/
|
|
429
|
+
async getFileList(dir, baseDir = dir) {
|
|
430
|
+
const files = [];
|
|
431
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
432
|
+
|
|
433
|
+
for (const entry of entries) {
|
|
434
|
+
const fullPath = path.join(dir, entry.name);
|
|
435
|
+
|
|
436
|
+
if (entry.isDirectory()) {
|
|
437
|
+
// Skip _module-installer directories
|
|
438
|
+
if (entry.name === '_module-installer') {
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const subFiles = await this.getFileList(fullPath, baseDir);
|
|
442
|
+
files.push(...subFiles);
|
|
443
|
+
} else {
|
|
444
|
+
files.push(path.relative(baseDir, fullPath));
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return files;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
module.exports = { ModuleManager };
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
|
|
4
|
+
const AgentPartyGenerator = {
|
|
5
|
+
/**
|
|
6
|
+
* Generate agent-party.xml content
|
|
7
|
+
* @param {Array} agentDetails - Array of agent details
|
|
8
|
+
* @param {Object} options - Generation options
|
|
9
|
+
* @returns {string} XML content
|
|
10
|
+
*/
|
|
11
|
+
generateAgentParty(agentDetails, options = {}) {
|
|
12
|
+
const { forWeb = false } = options;
|
|
13
|
+
|
|
14
|
+
// Group agents by module
|
|
15
|
+
const agentsByModule = {
|
|
16
|
+
bmm: [],
|
|
17
|
+
cis: [],
|
|
18
|
+
core: [],
|
|
19
|
+
custom: [],
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
for (const agent of agentDetails) {
|
|
23
|
+
const moduleKey = agentsByModule[agent.module] ? agent.module : 'custom';
|
|
24
|
+
agentsByModule[moduleKey].push(agent);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Build XML content
|
|
28
|
+
let xmlContent = `<!-- Powered by BMAD-CORE™ -->
|
|
29
|
+
<!-- Agent Manifest - Generated during BMAD ${forWeb ? 'bundling' : 'installation'} -->
|
|
30
|
+
<!-- This file contains a summary of all ${forWeb ? 'bundled' : 'installed'} agents for quick reference -->
|
|
31
|
+
<manifest id="bmad/_cfg/agent-party.xml" version="1.0" generated="${new Date().toISOString()}">
|
|
32
|
+
<description>
|
|
33
|
+
Complete roster of ${forWeb ? 'bundled' : 'installed'} BMAD agents with summarized personas for efficient multi-agent orchestration.
|
|
34
|
+
Used by party-mode and other multi-agent coordination features.
|
|
35
|
+
</description>
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
// Add agents by module
|
|
39
|
+
for (const [module, agents] of Object.entries(agentsByModule)) {
|
|
40
|
+
if (agents.length === 0) continue;
|
|
41
|
+
|
|
42
|
+
const moduleTitle =
|
|
43
|
+
module === 'bmm' ? 'BMM Module' : module === 'cis' ? 'CIS Module' : module === 'core' ? 'Core Module' : 'Custom Module';
|
|
44
|
+
|
|
45
|
+
xmlContent += `\n <!-- ${moduleTitle} Agents -->\n`;
|
|
46
|
+
|
|
47
|
+
for (const agent of agents) {
|
|
48
|
+
xmlContent += ` <agent id="${agent.id}" name="${agent.name}" title="${agent.title || ''}" icon="${agent.icon || ''}">
|
|
49
|
+
<persona>
|
|
50
|
+
<role>${this.escapeXml(agent.role || '')}</role>
|
|
51
|
+
<identity>${this.escapeXml(agent.identity || '')}</identity>
|
|
52
|
+
<communication_style>${this.escapeXml(agent.communicationStyle || '')}</communication_style>
|
|
53
|
+
<principles>${agent.principles || ''}</principles>
|
|
54
|
+
</persona>
|
|
55
|
+
</agent>\n`;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Add statistics
|
|
60
|
+
const totalAgents = agentDetails.length;
|
|
61
|
+
const moduleList = Object.keys(agentsByModule)
|
|
62
|
+
.filter((m) => agentsByModule[m].length > 0)
|
|
63
|
+
.join(', ');
|
|
64
|
+
|
|
65
|
+
xmlContent += `\n <statistics>
|
|
66
|
+
<total_agents>${totalAgents}</total_agents>
|
|
67
|
+
<modules>${moduleList}</modules>
|
|
68
|
+
<last_updated>${new Date().toISOString()}</last_updated>
|
|
69
|
+
</statistics>
|
|
70
|
+
</manifest>`;
|
|
71
|
+
|
|
72
|
+
return xmlContent;
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Extract agent details from XML content
|
|
77
|
+
* @param {string} content - Full agent file content (markdown with XML)
|
|
78
|
+
* @param {string} moduleName - Module name
|
|
79
|
+
* @param {string} agentName - Agent name
|
|
80
|
+
* @returns {Object} Agent details
|
|
81
|
+
*/
|
|
82
|
+
extractAgentDetails(content, moduleName, agentName) {
|
|
83
|
+
try {
|
|
84
|
+
// Extract agent XML block
|
|
85
|
+
const agentMatch = content.match(/<agent[^>]*>([\s\S]*?)<\/agent>/);
|
|
86
|
+
if (!agentMatch) return null;
|
|
87
|
+
|
|
88
|
+
const agentXml = agentMatch[0];
|
|
89
|
+
|
|
90
|
+
// Extract attributes from opening tag
|
|
91
|
+
const nameMatch = agentXml.match(/name="([^"]*)"/);
|
|
92
|
+
const titleMatch = agentXml.match(/title="([^"]*)"/);
|
|
93
|
+
const iconMatch = agentXml.match(/icon="([^"]*)"/);
|
|
94
|
+
|
|
95
|
+
// Extract persona elements - now we just copy them as-is
|
|
96
|
+
const roleMatch = agentXml.match(/<role>([\s\S]*?)<\/role>/);
|
|
97
|
+
const identityMatch = agentXml.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
98
|
+
const styleMatch = agentXml.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
99
|
+
const principlesMatch = agentXml.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
100
|
+
|
|
101
|
+
return {
|
|
102
|
+
id: `bmad/${moduleName}/agents/${agentName}.md`,
|
|
103
|
+
name: nameMatch ? nameMatch[1] : agentName,
|
|
104
|
+
title: titleMatch ? titleMatch[1] : 'Agent',
|
|
105
|
+
icon: iconMatch ? iconMatch[1] : '🤖',
|
|
106
|
+
module: moduleName,
|
|
107
|
+
role: roleMatch ? roleMatch[1].trim() : '',
|
|
108
|
+
identity: identityMatch ? identityMatch[1].trim() : '',
|
|
109
|
+
communicationStyle: styleMatch ? styleMatch[1].trim() : '',
|
|
110
|
+
principles: principlesMatch ? principlesMatch[1].trim() : '',
|
|
111
|
+
};
|
|
112
|
+
} catch (error) {
|
|
113
|
+
console.error(`Error extracting details for agent ${agentName}:`, error);
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Extract attribute from XML tag
|
|
120
|
+
*/
|
|
121
|
+
extractAttribute(xml, tagName, attrName) {
|
|
122
|
+
const regex = new RegExp(`<${tagName}[^>]*\\s${attrName}="([^"]*)"`, 'i');
|
|
123
|
+
const match = xml.match(regex);
|
|
124
|
+
return match ? match[1] : '';
|
|
125
|
+
},
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Escape XML special characters
|
|
129
|
+
*/
|
|
130
|
+
escapeXml(text) {
|
|
131
|
+
if (!text) return '';
|
|
132
|
+
return text
|
|
133
|
+
.replaceAll('&', '&')
|
|
134
|
+
.replaceAll('<', '<')
|
|
135
|
+
.replaceAll('>', '>')
|
|
136
|
+
.replaceAll('"', '"')
|
|
137
|
+
.replaceAll("'", ''');
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Apply config overrides to agent details
|
|
142
|
+
* @param {Object} details - Original agent details
|
|
143
|
+
* @param {string} configContent - Config file content
|
|
144
|
+
* @returns {Object} Agent details with overrides applied
|
|
145
|
+
*/
|
|
146
|
+
applyConfigOverrides(details, configContent) {
|
|
147
|
+
try {
|
|
148
|
+
// Extract agent-config XML block
|
|
149
|
+
const configMatch = configContent.match(/<agent-config>([\s\S]*?)<\/agent-config>/);
|
|
150
|
+
if (!configMatch) return details;
|
|
151
|
+
|
|
152
|
+
const configXml = configMatch[0];
|
|
153
|
+
|
|
154
|
+
// Extract override values
|
|
155
|
+
const nameMatch = configXml.match(/<name>([\s\S]*?)<\/name>/);
|
|
156
|
+
const titleMatch = configXml.match(/<title>([\s\S]*?)<\/title>/);
|
|
157
|
+
const roleMatch = configXml.match(/<role>([\s\S]*?)<\/role>/);
|
|
158
|
+
const identityMatch = configXml.match(/<identity>([\s\S]*?)<\/identity>/);
|
|
159
|
+
const styleMatch = configXml.match(/<communication_style>([\s\S]*?)<\/communication_style>/);
|
|
160
|
+
const principlesMatch = configXml.match(/<principles>([\s\S]*?)<\/principles>/);
|
|
161
|
+
|
|
162
|
+
// Apply overrides only if values are non-empty
|
|
163
|
+
if (nameMatch && nameMatch[1].trim()) {
|
|
164
|
+
details.name = nameMatch[1].trim();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (titleMatch && titleMatch[1].trim()) {
|
|
168
|
+
details.title = titleMatch[1].trim();
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (roleMatch && roleMatch[1].trim()) {
|
|
172
|
+
details.role = roleMatch[1].trim();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (identityMatch && identityMatch[1].trim()) {
|
|
176
|
+
details.identity = identityMatch[1].trim();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (styleMatch && styleMatch[1].trim()) {
|
|
180
|
+
details.communicationStyle = styleMatch[1].trim();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (principlesMatch && principlesMatch[1].trim()) {
|
|
184
|
+
// Principles are now just copied as-is (narrative paragraph)
|
|
185
|
+
details.principles = principlesMatch[1].trim();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return details;
|
|
189
|
+
} catch (error) {
|
|
190
|
+
console.error(`Error applying config overrides:`, error);
|
|
191
|
+
return details;
|
|
192
|
+
}
|
|
193
|
+
},
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Write agent-party.xml to file
|
|
197
|
+
*/
|
|
198
|
+
async writeAgentParty(filePath, agentDetails, options = {}) {
|
|
199
|
+
const content = this.generateAgentParty(agentDetails, options);
|
|
200
|
+
await fs.ensureDir(path.dirname(filePath));
|
|
201
|
+
await fs.writeFile(filePath, content, 'utf8');
|
|
202
|
+
return content;
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
module.exports = { AgentPartyGenerator };
|