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,880 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const chalk = require('chalk');
|
|
4
|
+
const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
|
|
5
|
+
const { XmlHandler } = require('../lib/xml-handler');
|
|
6
|
+
const { AgentPartyGenerator } = require('../lib/agent-party-generator');
|
|
7
|
+
const xml2js = require('xml2js');
|
|
8
|
+
const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
|
|
9
|
+
|
|
10
|
+
class WebBundler {
|
|
11
|
+
constructor(sourceDir = null, outputDir = 'web-bundles') {
|
|
12
|
+
this.sourceDir = sourceDir || getSourcePath();
|
|
13
|
+
this.outputDir = path.isAbsolute(outputDir) ? outputDir : path.join(getProjectRoot(), outputDir);
|
|
14
|
+
this.modulesPath = getSourcePath('modules');
|
|
15
|
+
this.utilityPath = getSourcePath('utility');
|
|
16
|
+
|
|
17
|
+
this.dependencyResolver = new DependencyResolver();
|
|
18
|
+
this.xmlHandler = new XmlHandler();
|
|
19
|
+
|
|
20
|
+
// Cache for resolved dependencies to avoid duplicates
|
|
21
|
+
this.dependencyCache = new Map();
|
|
22
|
+
|
|
23
|
+
// Discovered agents and teams for manifest generation
|
|
24
|
+
this.discoveredAgents = [];
|
|
25
|
+
this.discoveredTeams = [];
|
|
26
|
+
|
|
27
|
+
// Temporary directory for generated manifests
|
|
28
|
+
this.tempDir = path.join(process.cwd(), '.bundler-temp');
|
|
29
|
+
this.tempManifestDir = path.join(this.tempDir, 'bmad', '_cfg');
|
|
30
|
+
|
|
31
|
+
// Bundle statistics
|
|
32
|
+
this.stats = {
|
|
33
|
+
totalAgents: 0,
|
|
34
|
+
bundledAgents: 0,
|
|
35
|
+
skippedAgents: 0,
|
|
36
|
+
failedAgents: 0,
|
|
37
|
+
invalidXml: 0,
|
|
38
|
+
warnings: [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Main entry point to bundle all modules
|
|
44
|
+
*/
|
|
45
|
+
async bundleAll() {
|
|
46
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════'));
|
|
47
|
+
console.log(chalk.cyan.bold(' 🚀 Web Bundle Generation'));
|
|
48
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
// Pre-discover all modules to generate complete manifests
|
|
52
|
+
const modules = await this.discoverModules();
|
|
53
|
+
for (const module of modules) {
|
|
54
|
+
await this.preDiscoverModule(module);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Create temporary manifest files
|
|
58
|
+
await this.createTempManifests();
|
|
59
|
+
|
|
60
|
+
// Process all modules
|
|
61
|
+
for (const module of modules) {
|
|
62
|
+
await this.bundleModule(module);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Display summary
|
|
66
|
+
this.displaySummary();
|
|
67
|
+
} finally {
|
|
68
|
+
// Clean up temp files
|
|
69
|
+
await this.cleanupTempFiles();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Bundle a specific module
|
|
75
|
+
*/
|
|
76
|
+
async bundleModule(moduleName) {
|
|
77
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
78
|
+
|
|
79
|
+
if (!(await fs.pathExists(modulePath))) {
|
|
80
|
+
console.log(chalk.yellow(`Module ${moduleName} not found`));
|
|
81
|
+
return { module: moduleName, agents: [], teams: [] };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
console.log(chalk.bold(`\n📦 Bundling module: ${moduleName}`));
|
|
85
|
+
|
|
86
|
+
const results = {
|
|
87
|
+
module: moduleName,
|
|
88
|
+
agents: [],
|
|
89
|
+
teams: [],
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
// Pre-discover all agents and teams for manifest generation
|
|
93
|
+
await this.preDiscoverModule(moduleName);
|
|
94
|
+
|
|
95
|
+
// Ensure temp manifests exist (might not exist if called directly)
|
|
96
|
+
if (!(await fs.pathExists(this.tempManifestDir))) {
|
|
97
|
+
await this.createTempManifests();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Process agents
|
|
101
|
+
const agents = await this.discoverAgents(modulePath);
|
|
102
|
+
for (const agent of agents) {
|
|
103
|
+
try {
|
|
104
|
+
await this.bundleAgent(moduleName, agent, false); // false = don't track again
|
|
105
|
+
results.agents.push(agent);
|
|
106
|
+
} catch (error) {
|
|
107
|
+
console.error(` Failed to bundle agent ${agent}:`, error.message);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Process teams (Phase 4 - to be implemented)
|
|
112
|
+
// const teams = await this.discoverTeams(modulePath);
|
|
113
|
+
// for (const team of teams) {
|
|
114
|
+
// try {
|
|
115
|
+
// await this.bundleTeam(moduleName, team);
|
|
116
|
+
// results.teams.push(team);
|
|
117
|
+
// } catch (error) {
|
|
118
|
+
// console.error(` Failed to bundle team ${team}:`, error.message);
|
|
119
|
+
// }
|
|
120
|
+
// }
|
|
121
|
+
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Bundle a single agent
|
|
127
|
+
*/
|
|
128
|
+
async bundleAgent(moduleName, agentFile, shouldTrack = true) {
|
|
129
|
+
const agentName = path.basename(agentFile, '.md');
|
|
130
|
+
this.stats.totalAgents++;
|
|
131
|
+
|
|
132
|
+
console.log(chalk.dim(` → Processing: ${agentName}`));
|
|
133
|
+
|
|
134
|
+
const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
|
|
135
|
+
|
|
136
|
+
// Check if agent file exists
|
|
137
|
+
if (!(await fs.pathExists(agentPath))) {
|
|
138
|
+
this.stats.failedAgents++;
|
|
139
|
+
console.log(chalk.red(` ✗ Agent file not found`));
|
|
140
|
+
throw new Error(`Agent file not found: ${agentPath}`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Read agent file
|
|
144
|
+
const content = await fs.readFile(agentPath, 'utf8');
|
|
145
|
+
|
|
146
|
+
// Extract agent XML from markdown
|
|
147
|
+
let agentXml = this.extractAgentXml(content);
|
|
148
|
+
|
|
149
|
+
if (!agentXml) {
|
|
150
|
+
this.stats.failedAgents++;
|
|
151
|
+
console.log(chalk.red(` ✗ No agent XML found in ${agentFile}`));
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Check if agent has bundle="false" attribute
|
|
156
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
157
|
+
this.stats.skippedAgents++;
|
|
158
|
+
console.log(chalk.gray(` ⊘ Skipped (bundle="false")`));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Process {project-root} references in agent XML
|
|
163
|
+
agentXml = this.processProjectRootReferences(agentXml);
|
|
164
|
+
|
|
165
|
+
// Track for manifest generation BEFORE generating manifests (if not pre-discovered)
|
|
166
|
+
if (shouldTrack) {
|
|
167
|
+
const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
|
|
168
|
+
if (agentDetails) {
|
|
169
|
+
this.discoveredAgents.push(agentDetails);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Resolve dependencies with warning tracking
|
|
174
|
+
const dependencyWarnings = [];
|
|
175
|
+
const dependencies = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
|
|
176
|
+
|
|
177
|
+
if (dependencyWarnings.length > 0) {
|
|
178
|
+
this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Build the bundle (no manifests for individual agents)
|
|
182
|
+
const bundle = this.buildAgentBundle(agentXml, dependencies);
|
|
183
|
+
|
|
184
|
+
// Validate XML
|
|
185
|
+
const isValid = await this.validateXml(bundle);
|
|
186
|
+
if (!isValid) {
|
|
187
|
+
this.stats.invalidXml++;
|
|
188
|
+
console.log(chalk.red(` ⚠ Invalid XML generated!`));
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Write bundle to output
|
|
192
|
+
const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
|
|
193
|
+
await fs.ensureDir(path.dirname(outputPath));
|
|
194
|
+
await fs.writeFile(outputPath, bundle, 'utf8');
|
|
195
|
+
|
|
196
|
+
this.stats.bundledAgents++;
|
|
197
|
+
const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
|
|
198
|
+
console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Pre-discover all agents and teams in a module for manifest generation
|
|
203
|
+
*/
|
|
204
|
+
async preDiscoverModule(moduleName) {
|
|
205
|
+
const modulePath = path.join(this.modulesPath, moduleName);
|
|
206
|
+
|
|
207
|
+
// Clear any previously discovered agents for this module
|
|
208
|
+
this.discoveredAgents = this.discoveredAgents.filter((a) => a.module !== moduleName);
|
|
209
|
+
|
|
210
|
+
// Discover agents
|
|
211
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
212
|
+
if (await fs.pathExists(agentsPath)) {
|
|
213
|
+
const files = await fs.readdir(agentsPath);
|
|
214
|
+
for (const file of files) {
|
|
215
|
+
if (file.endsWith('.md')) {
|
|
216
|
+
const agentPath = path.join(agentsPath, file);
|
|
217
|
+
const content = await fs.readFile(agentPath, 'utf8');
|
|
218
|
+
const agentXml = this.extractAgentXml(content);
|
|
219
|
+
|
|
220
|
+
if (agentXml) {
|
|
221
|
+
// Skip agents with bundle="false"
|
|
222
|
+
if (this.shouldSkipBundling(agentXml)) {
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const agentName = path.basename(file, '.md');
|
|
227
|
+
// Use the shared generator to extract agent details (pass full content)
|
|
228
|
+
const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
|
|
229
|
+
if (agentDetails) {
|
|
230
|
+
this.discoveredAgents.push(agentDetails);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// TODO: Discover teams when implemented
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Extract agent XML from markdown content
|
|
242
|
+
*/
|
|
243
|
+
extractAgentXml(content) {
|
|
244
|
+
// Try 4 backticks first (can contain 3 backtick blocks inside)
|
|
245
|
+
let match = content.match(/````xml\s*([\s\S]*?)````/);
|
|
246
|
+
if (!match) {
|
|
247
|
+
// Fall back to 3 backticks if no 4-backtick block found
|
|
248
|
+
match = content.match(/```xml\s*([\s\S]*?)```/);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
if (match) {
|
|
252
|
+
const xmlContent = match[1];
|
|
253
|
+
const agentMatch = xmlContent.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
|
|
254
|
+
return agentMatch ? agentMatch[0] : null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// Fall back to direct extraction
|
|
258
|
+
match = content.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
|
|
259
|
+
return match ? match[0] : null;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Resolve all dependencies for an agent
|
|
264
|
+
*/
|
|
265
|
+
async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
|
|
266
|
+
const dependencies = new Map();
|
|
267
|
+
const processed = new Set();
|
|
268
|
+
|
|
269
|
+
// Extract file references from agent XML
|
|
270
|
+
const fileRefs = this.extractFileReferences(agentXml);
|
|
271
|
+
|
|
272
|
+
// Process each file reference
|
|
273
|
+
for (const ref of fileRefs) {
|
|
274
|
+
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
return dependencies;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Extract file references from agent XML
|
|
282
|
+
*/
|
|
283
|
+
extractFileReferences(xml) {
|
|
284
|
+
const refs = new Set();
|
|
285
|
+
|
|
286
|
+
// Match various file reference patterns
|
|
287
|
+
const patterns = [
|
|
288
|
+
/exec="([^"]+)"/g, // Command exec paths
|
|
289
|
+
/tmpl="([^"]+)"/g, // Template paths
|
|
290
|
+
/data="([^"]+)"/g, // Data file paths
|
|
291
|
+
/file="([^"]+)"/g, // Generic file refs
|
|
292
|
+
/src="([^"]+)"/g, // Source paths
|
|
293
|
+
/system-prompts="([^"]+)"/g,
|
|
294
|
+
/tools="([^"]+)"/g,
|
|
295
|
+
/workflows="([^"]+)"/g,
|
|
296
|
+
/knowledge="([^"]+)"/g,
|
|
297
|
+
/{project-root}\/([^"'\s<>]+)/g,
|
|
298
|
+
];
|
|
299
|
+
|
|
300
|
+
for (const pattern of patterns) {
|
|
301
|
+
let match;
|
|
302
|
+
while ((match = pattern.exec(xml)) !== null) {
|
|
303
|
+
let filePath = match[1];
|
|
304
|
+
// Remove {project-root} prefix if present
|
|
305
|
+
filePath = filePath.replace(/^{project-root}\//, '');
|
|
306
|
+
if (filePath) {
|
|
307
|
+
refs.add(filePath);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
return [...refs];
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Process a file dependency recursively
|
|
317
|
+
*/
|
|
318
|
+
async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
|
|
319
|
+
// Skip if already processed
|
|
320
|
+
if (processed.has(filePath)) {
|
|
321
|
+
return;
|
|
322
|
+
}
|
|
323
|
+
processed.add(filePath);
|
|
324
|
+
|
|
325
|
+
// Handle wildcard patterns
|
|
326
|
+
if (filePath.includes('*')) {
|
|
327
|
+
await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Resolve actual file path
|
|
332
|
+
const actualPath = this.resolveFilePath(filePath, moduleName);
|
|
333
|
+
|
|
334
|
+
if (!actualPath || !(await fs.pathExists(actualPath))) {
|
|
335
|
+
warnings.push(filePath);
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Read file content
|
|
340
|
+
let content = await fs.readFile(actualPath, 'utf8');
|
|
341
|
+
|
|
342
|
+
// Process {project-root} references
|
|
343
|
+
content = this.processProjectRootReferences(content);
|
|
344
|
+
|
|
345
|
+
// Extract dependencies from frontmatter if present
|
|
346
|
+
const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
|
|
347
|
+
if (frontmatterMatch) {
|
|
348
|
+
const frontmatter = frontmatterMatch[1];
|
|
349
|
+
// Look for dependencies in frontmatter
|
|
350
|
+
const depMatch = frontmatter.match(/dependencies:\s*\[(.*?)\]/);
|
|
351
|
+
if (depMatch) {
|
|
352
|
+
const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
353
|
+
if (deps) {
|
|
354
|
+
for (const dep of deps) {
|
|
355
|
+
const depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
356
|
+
if (depPath && !processed.has(depPath)) {
|
|
357
|
+
await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
// Look for template references
|
|
363
|
+
const templateMatch = frontmatter.match(/template:\s*\[(.*?)\]/);
|
|
364
|
+
if (templateMatch) {
|
|
365
|
+
const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
|
|
366
|
+
if (templates) {
|
|
367
|
+
for (const template of templates) {
|
|
368
|
+
const templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
|
|
369
|
+
if (templatePath && !processed.has(templatePath)) {
|
|
370
|
+
await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Extract XML from markdown if applicable
|
|
378
|
+
const ext = path.extname(actualPath).toLowerCase();
|
|
379
|
+
let processedContent = content;
|
|
380
|
+
|
|
381
|
+
switch (ext) {
|
|
382
|
+
case '.md': {
|
|
383
|
+
// Try to extract XML from markdown - handle both 3 and 4 backtick blocks
|
|
384
|
+
// First try 4 backticks (which can contain 3 backtick blocks inside)
|
|
385
|
+
let xmlMatches = [...content.matchAll(/````xml\s*([\s\S]*?)````/g)];
|
|
386
|
+
|
|
387
|
+
// If no 4-backtick blocks, try 3 backticks
|
|
388
|
+
if (xmlMatches.length === 0) {
|
|
389
|
+
xmlMatches = [...content.matchAll(/```xml\s*([\s\S]*?)```/g)];
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const xmlBlocks = [];
|
|
393
|
+
|
|
394
|
+
for (const match of xmlMatches) {
|
|
395
|
+
if (match[1]) {
|
|
396
|
+
xmlBlocks.push(match[1].trim());
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
if (xmlBlocks.length > 0) {
|
|
401
|
+
// For XML content, just include it directly (it's already valid XML)
|
|
402
|
+
processedContent = xmlBlocks.join('\n\n');
|
|
403
|
+
} else {
|
|
404
|
+
// No XML blocks found, skip non-XML markdown files
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
break;
|
|
409
|
+
}
|
|
410
|
+
case '.csv': {
|
|
411
|
+
// CSV files need special handling - convert to XML file-index
|
|
412
|
+
const lines = content.split('\n').filter((line) => line.trim());
|
|
413
|
+
if (lines.length === 0) return;
|
|
414
|
+
|
|
415
|
+
const headers = lines[0].split(',').map((h) => h.trim());
|
|
416
|
+
const rows = lines.slice(1);
|
|
417
|
+
|
|
418
|
+
const indexParts = [`<file-index id="${filePath}">`];
|
|
419
|
+
indexParts.push(' <items>');
|
|
420
|
+
|
|
421
|
+
// Track files referenced in CSV for additional bundling
|
|
422
|
+
const referencedFiles = new Set();
|
|
423
|
+
|
|
424
|
+
for (const row of rows) {
|
|
425
|
+
const values = row.split(',').map((v) => v.trim());
|
|
426
|
+
if (values.every((v) => !v)) continue;
|
|
427
|
+
|
|
428
|
+
indexParts.push(' <item>');
|
|
429
|
+
for (const [i, header] of headers.entries()) {
|
|
430
|
+
const value = values[i] || '';
|
|
431
|
+
const tagName = header.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
|
|
432
|
+
indexParts.push(` <${tagName}>${value}</${tagName}>`);
|
|
433
|
+
|
|
434
|
+
// Track referenced files
|
|
435
|
+
if (header.toLowerCase().includes('file') && value.endsWith('.md')) {
|
|
436
|
+
// Build path relative to CSV location
|
|
437
|
+
const csvDir = path.dirname(actualPath);
|
|
438
|
+
const refPath = path.join(csvDir, value);
|
|
439
|
+
if (fs.existsSync(refPath)) {
|
|
440
|
+
const refId = filePath.replace('index.csv', value);
|
|
441
|
+
referencedFiles.add(refId);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
indexParts.push(' </item>');
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
indexParts.push(' </items>', '</file-index>');
|
|
449
|
+
|
|
450
|
+
// Store the XML version
|
|
451
|
+
dependencies.set(filePath, indexParts.join('\n'));
|
|
452
|
+
|
|
453
|
+
// Process referenced files from CSV
|
|
454
|
+
for (const refId of referencedFiles) {
|
|
455
|
+
if (!processed.has(refId)) {
|
|
456
|
+
await this.processFileDependency(refId, dependencies, processed, moduleName, warnings);
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
462
|
+
case '.xml': {
|
|
463
|
+
// XML files can be included directly
|
|
464
|
+
processedContent = content;
|
|
465
|
+
break;
|
|
466
|
+
}
|
|
467
|
+
default: {
|
|
468
|
+
// For other non-XML file types, skip them
|
|
469
|
+
return;
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Store the processed content
|
|
474
|
+
dependencies.set(filePath, processedContent);
|
|
475
|
+
|
|
476
|
+
// Recursively scan for more dependencies
|
|
477
|
+
const nestedRefs = this.extractFileReferences(processedContent);
|
|
478
|
+
for (const ref of nestedRefs) {
|
|
479
|
+
await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
/**
|
|
484
|
+
* Process wildcard dependency patterns
|
|
485
|
+
*/
|
|
486
|
+
async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
|
|
487
|
+
// Remove {project-root} prefix
|
|
488
|
+
pattern = pattern.replace(/^{project-root}\//, '');
|
|
489
|
+
|
|
490
|
+
// Get directory and file pattern
|
|
491
|
+
const lastSlash = pattern.lastIndexOf('/');
|
|
492
|
+
const dirPath = pattern.slice(0, Math.max(0, lastSlash));
|
|
493
|
+
const filePattern = pattern.slice(Math.max(0, lastSlash + 1));
|
|
494
|
+
|
|
495
|
+
// Resolve directory path without checking file existence
|
|
496
|
+
let dir;
|
|
497
|
+
if (dirPath.startsWith('bmad/')) {
|
|
498
|
+
// Remove bmad/ prefix
|
|
499
|
+
const actualPath = dirPath.replace(/^bmad\//, '');
|
|
500
|
+
|
|
501
|
+
// Try different path mappings for directories
|
|
502
|
+
const possibleDirs = [
|
|
503
|
+
// Try as module path: bmad/cis/... -> src/modules/cis/...
|
|
504
|
+
path.join(this.sourceDir, 'modules', actualPath),
|
|
505
|
+
// Try as direct path: bmad/core/... -> src/core/...
|
|
506
|
+
path.join(this.sourceDir, actualPath),
|
|
507
|
+
];
|
|
508
|
+
|
|
509
|
+
for (const testDir of possibleDirs) {
|
|
510
|
+
if (fs.existsSync(testDir)) {
|
|
511
|
+
dir = testDir;
|
|
512
|
+
break;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
if (!dir) {
|
|
518
|
+
warnings.push(`${pattern} (could not resolve directory)`);
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (!(await fs.pathExists(dir))) {
|
|
522
|
+
warnings.push(pattern);
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
// Read directory and match files
|
|
527
|
+
const files = await fs.readdir(dir);
|
|
528
|
+
let matchedFiles = [];
|
|
529
|
+
|
|
530
|
+
if (filePattern === '*.*') {
|
|
531
|
+
matchedFiles = files;
|
|
532
|
+
} else if (filePattern.startsWith('*.')) {
|
|
533
|
+
const ext = filePattern.slice(1);
|
|
534
|
+
matchedFiles = files.filter((f) => f.endsWith(ext));
|
|
535
|
+
} else {
|
|
536
|
+
// Simple glob matching
|
|
537
|
+
const regex = new RegExp('^' + filePattern.replace('*', '.*') + '$');
|
|
538
|
+
matchedFiles = files.filter((f) => regex.test(f));
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
// Process each matched file
|
|
542
|
+
for (const file of matchedFiles) {
|
|
543
|
+
const fullPath = dirPath + '/' + file;
|
|
544
|
+
if (!processed.has(fullPath)) {
|
|
545
|
+
await this.processFileDependency(fullPath, dependencies, processed, moduleName, warnings);
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* Resolve file path relative to project
|
|
552
|
+
*/
|
|
553
|
+
resolveFilePath(filePath, moduleName) {
|
|
554
|
+
// Remove {project-root} prefix
|
|
555
|
+
filePath = filePath.replace(/^{project-root}\//, '');
|
|
556
|
+
|
|
557
|
+
// Check temp directory first for _cfg files
|
|
558
|
+
if (filePath.startsWith('bmad/_cfg/')) {
|
|
559
|
+
const filename = filePath.split('/').pop();
|
|
560
|
+
const tempPath = path.join(this.tempManifestDir, filename);
|
|
561
|
+
if (fs.existsSync(tempPath)) {
|
|
562
|
+
return tempPath;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Handle different path patterns for bmad files
|
|
567
|
+
// bmad/cis/tasks/brain-session.md -> src/modules/cis/tasks/brain-session.md
|
|
568
|
+
// bmad/core/tasks/create-doc.md -> src/core/tasks/create-doc.md
|
|
569
|
+
// bmad/bmm/templates/brief.md -> src/modules/bmm/templates/brief.md
|
|
570
|
+
|
|
571
|
+
let actualPath = filePath;
|
|
572
|
+
|
|
573
|
+
if (filePath.startsWith('bmad/')) {
|
|
574
|
+
// Remove bmad/ prefix
|
|
575
|
+
actualPath = filePath.replace(/^bmad\//, '');
|
|
576
|
+
|
|
577
|
+
// Check if it's a module-specific file (cis, bmm, etc) or core file
|
|
578
|
+
const parts = actualPath.split('/');
|
|
579
|
+
const firstPart = parts[0];
|
|
580
|
+
|
|
581
|
+
// Try different path mappings
|
|
582
|
+
const possiblePaths = [
|
|
583
|
+
// Try in temp directory first
|
|
584
|
+
path.join(this.tempDir, filePath),
|
|
585
|
+
// Try as module path: bmad/cis/... -> src/modules/cis/...
|
|
586
|
+
path.join(this.sourceDir, 'modules', actualPath),
|
|
587
|
+
// Try as direct path: bmad/core/... -> src/core/...
|
|
588
|
+
path.join(this.sourceDir, actualPath),
|
|
589
|
+
// Try without any prefix in src
|
|
590
|
+
path.join(this.sourceDir, parts.slice(1).join('/')),
|
|
591
|
+
// Try in project root
|
|
592
|
+
path.join(this.sourceDir, '..', actualPath),
|
|
593
|
+
// Try original with bmad
|
|
594
|
+
path.join(this.sourceDir, '..', filePath),
|
|
595
|
+
];
|
|
596
|
+
|
|
597
|
+
for (const testPath of possiblePaths) {
|
|
598
|
+
if (fs.existsSync(testPath)) {
|
|
599
|
+
return testPath;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// Try standard paths for non-bmad files
|
|
605
|
+
const basePaths = [
|
|
606
|
+
this.sourceDir, // src directory
|
|
607
|
+
path.join(this.modulesPath, moduleName), // Current module
|
|
608
|
+
path.join(this.sourceDir, '..'), // Project root
|
|
609
|
+
];
|
|
610
|
+
|
|
611
|
+
for (const basePath of basePaths) {
|
|
612
|
+
const fullPath = path.join(basePath, actualPath);
|
|
613
|
+
if (fs.existsSync(fullPath)) {
|
|
614
|
+
return fullPath;
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
return null;
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/**
|
|
622
|
+
* Process and remove {project-root} references
|
|
623
|
+
*/
|
|
624
|
+
processProjectRootReferences(content) {
|
|
625
|
+
// Remove {project-root}/ prefix (with slash)
|
|
626
|
+
content = content.replaceAll('{project-root}/', '');
|
|
627
|
+
// Also remove {project-root} without slash
|
|
628
|
+
content = content.replaceAll('{project-root}', '');
|
|
629
|
+
return content;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Escape special XML characters in text content
|
|
634
|
+
*/
|
|
635
|
+
escapeXmlText(text) {
|
|
636
|
+
return text
|
|
637
|
+
.replaceAll('&', '&')
|
|
638
|
+
.replaceAll('<', '<')
|
|
639
|
+
.replaceAll('>', '>')
|
|
640
|
+
.replaceAll('"', '"')
|
|
641
|
+
.replaceAll("'", ''');
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* Escape XML content while preserving XML tags
|
|
646
|
+
*/
|
|
647
|
+
escapeXmlContent(content) {
|
|
648
|
+
const tagPattern = /<([^>]+)>/g;
|
|
649
|
+
const parts = [];
|
|
650
|
+
let lastIndex = 0;
|
|
651
|
+
let match;
|
|
652
|
+
|
|
653
|
+
while ((match = tagPattern.exec(content)) !== null) {
|
|
654
|
+
if (match.index > lastIndex) {
|
|
655
|
+
parts.push(this.escapeXmlText(content.slice(lastIndex, match.index)));
|
|
656
|
+
}
|
|
657
|
+
parts.push('<' + match[1] + '>');
|
|
658
|
+
lastIndex = match.index + match[0].length;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if (lastIndex < content.length) {
|
|
662
|
+
parts.push(this.escapeXmlText(content.slice(lastIndex)));
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
return parts.join('');
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
/**
|
|
669
|
+
* Build the final agent bundle XML
|
|
670
|
+
*/
|
|
671
|
+
buildAgentBundle(agentXml, dependencies) {
|
|
672
|
+
const parts = [
|
|
673
|
+
'<?xml version="1.0" encoding="UTF-8"?>',
|
|
674
|
+
'<agent-bundle>',
|
|
675
|
+
' <!-- Agent Definition -->',
|
|
676
|
+
' ' + agentXml.replaceAll('\n', '\n '),
|
|
677
|
+
];
|
|
678
|
+
|
|
679
|
+
// Add dependencies without wrapper tags
|
|
680
|
+
if (dependencies && dependencies.size > 0) {
|
|
681
|
+
parts.push('\n <!-- Dependencies -->');
|
|
682
|
+
for (const [id, content] of dependencies) {
|
|
683
|
+
// Escape XML content while preserving tags
|
|
684
|
+
const escapedContent = this.escapeXmlContent(content);
|
|
685
|
+
// Indent properly
|
|
686
|
+
const indentedContent = escapedContent
|
|
687
|
+
.split('\n')
|
|
688
|
+
.map((line) => ' ' + line)
|
|
689
|
+
.join('\n');
|
|
690
|
+
parts.push(indentedContent);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
parts.push('</agent-bundle>');
|
|
695
|
+
|
|
696
|
+
return parts.join('\n');
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
/**
|
|
700
|
+
* Discover all modules
|
|
701
|
+
*/
|
|
702
|
+
async discoverModules() {
|
|
703
|
+
const modules = [];
|
|
704
|
+
|
|
705
|
+
if (!(await fs.pathExists(this.modulesPath))) {
|
|
706
|
+
console.log(chalk.yellow('No modules directory found'));
|
|
707
|
+
return modules;
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
const entries = await fs.readdir(this.modulesPath, { withFileTypes: true });
|
|
711
|
+
|
|
712
|
+
for (const entry of entries) {
|
|
713
|
+
if (entry.isDirectory()) {
|
|
714
|
+
modules.push(entry.name);
|
|
715
|
+
}
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
return modules;
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Discover agents in a module
|
|
723
|
+
*/
|
|
724
|
+
async discoverAgents(modulePath) {
|
|
725
|
+
const agents = [];
|
|
726
|
+
const agentsPath = path.join(modulePath, 'agents');
|
|
727
|
+
|
|
728
|
+
if (!(await fs.pathExists(agentsPath))) {
|
|
729
|
+
return agents;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
const files = await fs.readdir(agentsPath);
|
|
733
|
+
|
|
734
|
+
for (const file of files) {
|
|
735
|
+
if (file.endsWith('.md')) {
|
|
736
|
+
agents.push(file);
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
return agents;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
/**
|
|
744
|
+
* Discover all teams in a module
|
|
745
|
+
*/
|
|
746
|
+
async discoverTeams(modulePath) {
|
|
747
|
+
const teams = [];
|
|
748
|
+
const teamsPath = path.join(modulePath, 'teams');
|
|
749
|
+
|
|
750
|
+
if (!(await fs.pathExists(teamsPath))) {
|
|
751
|
+
return teams;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
const files = await fs.readdir(teamsPath);
|
|
755
|
+
|
|
756
|
+
for (const file of files) {
|
|
757
|
+
if (file.endsWith('.md')) {
|
|
758
|
+
teams.push(file);
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
return teams;
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
/**
|
|
766
|
+
* Extract agent name from XML
|
|
767
|
+
*/
|
|
768
|
+
getAgentName(xml) {
|
|
769
|
+
const match = xml.match(/<agent[^>]*name="([^"]+)"/);
|
|
770
|
+
return match ? match[1] : 'Unknown';
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/**
|
|
774
|
+
* Extract agent description from XML
|
|
775
|
+
*/
|
|
776
|
+
getAgentDescription(xml) {
|
|
777
|
+
const match = xml.match(/<description>([^<]+)<\/description>/);
|
|
778
|
+
return match ? match[1] : '';
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
/**
|
|
782
|
+
* Check if agent should be skipped for bundling
|
|
783
|
+
*/
|
|
784
|
+
shouldSkipBundling(xml) {
|
|
785
|
+
// Check for bundle="false" attribute in the agent tag
|
|
786
|
+
const match = xml.match(/<agent[^>]*bundle="false"[^>]*>/);
|
|
787
|
+
return match !== null;
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
/**
|
|
791
|
+
* Create temporary manifest files
|
|
792
|
+
*/
|
|
793
|
+
async createTempManifests() {
|
|
794
|
+
// Ensure temp directory exists
|
|
795
|
+
await fs.ensureDir(this.tempManifestDir);
|
|
796
|
+
|
|
797
|
+
// Generate agent-party.xml using shared generator
|
|
798
|
+
const agentPartyPath = path.join(this.tempManifestDir, 'agent-party.xml');
|
|
799
|
+
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
|
800
|
+
|
|
801
|
+
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Clean up temporary files
|
|
806
|
+
*/
|
|
807
|
+
async cleanupTempFiles() {
|
|
808
|
+
if (await fs.pathExists(this.tempDir)) {
|
|
809
|
+
await fs.remove(this.tempDir);
|
|
810
|
+
console.log(chalk.dim('\n✓ Cleaned up temporary files'));
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
/**
|
|
815
|
+
* Validate XML content
|
|
816
|
+
*/
|
|
817
|
+
async validateXml(xmlContent) {
|
|
818
|
+
try {
|
|
819
|
+
await xml2js.parseStringPromise(xmlContent, {
|
|
820
|
+
strict: true,
|
|
821
|
+
explicitArray: false,
|
|
822
|
+
});
|
|
823
|
+
return true;
|
|
824
|
+
} catch {
|
|
825
|
+
return false;
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/**
|
|
830
|
+
* Display summary statistics
|
|
831
|
+
*/
|
|
832
|
+
displaySummary() {
|
|
833
|
+
console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════'));
|
|
834
|
+
console.log(chalk.cyan.bold(' SUMMARY'));
|
|
835
|
+
console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
|
|
836
|
+
|
|
837
|
+
console.log(chalk.bold('Bundle Statistics:'));
|
|
838
|
+
console.log(` Total agents found: ${this.stats.totalAgents}`);
|
|
839
|
+
console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
|
|
840
|
+
console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
|
|
841
|
+
|
|
842
|
+
if (this.stats.failedAgents > 0) {
|
|
843
|
+
console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
if (this.stats.invalidXml > 0) {
|
|
847
|
+
console.log(` Invalid XML bundles: ${chalk.yellow(this.stats.invalidXml)}`);
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
// Display warnings summary
|
|
851
|
+
if (this.stats.warnings.length > 0) {
|
|
852
|
+
console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
|
|
853
|
+
|
|
854
|
+
// Group and display warnings by agent
|
|
855
|
+
for (const agentWarning of this.stats.warnings) {
|
|
856
|
+
if (agentWarning.warnings.length > 0) {
|
|
857
|
+
console.log(chalk.bold(`\n ${agentWarning.agent}:`));
|
|
858
|
+
// Display unique warnings for this agent
|
|
859
|
+
const uniqueWarnings = [...new Set(agentWarning.warnings)];
|
|
860
|
+
for (const warning of uniqueWarnings) {
|
|
861
|
+
console.log(chalk.dim(` • ${warning}`));
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
// Final status
|
|
868
|
+
if (this.stats.invalidXml > 0) {
|
|
869
|
+
console.log(chalk.yellow('\n⚠ Some bundles have invalid XML. Please review the output.'));
|
|
870
|
+
} else if (this.stats.failedAgents > 0) {
|
|
871
|
+
console.log(chalk.yellow('\n⚠ Some agents failed to bundle. Please review the errors.'));
|
|
872
|
+
} else {
|
|
873
|
+
console.log(chalk.green('\n✨ All bundles generated successfully!'));
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════\n'));
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
module.exports = { WebBundler };
|