bmad-method 5.1.2 → 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 -32
- 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,721 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const glob = require('glob');
|
|
4
|
+
const chalk = require('chalk');
|
|
5
|
+
const yaml = require('js-yaml');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Dependency Resolver for BMAD modules
|
|
9
|
+
* Handles cross-module dependencies and ensures all required files are included
|
|
10
|
+
*/
|
|
11
|
+
class DependencyResolver {
|
|
12
|
+
constructor() {
|
|
13
|
+
this.dependencies = new Map();
|
|
14
|
+
this.resolvedFiles = new Set();
|
|
15
|
+
this.missingDependencies = new Set();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Resolve all dependencies for selected modules
|
|
20
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
21
|
+
* @param {Array} selectedModules - Modules explicitly selected by user
|
|
22
|
+
* @param {Object} options - Resolution options
|
|
23
|
+
* @returns {Object} Resolution results with all required files
|
|
24
|
+
*/
|
|
25
|
+
async resolve(bmadDir, selectedModules = [], options = {}) {
|
|
26
|
+
if (options.verbose) {
|
|
27
|
+
console.log(chalk.cyan('Resolving module dependencies...'));
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Always include core as base
|
|
31
|
+
const modulesToProcess = new Set(['core', ...selectedModules]);
|
|
32
|
+
|
|
33
|
+
// First pass: collect all explicitly selected files
|
|
34
|
+
const primaryFiles = await this.collectPrimaryFiles(bmadDir, modulesToProcess);
|
|
35
|
+
|
|
36
|
+
// Second pass: parse and resolve dependencies
|
|
37
|
+
const allDependencies = await this.parseDependencies(primaryFiles);
|
|
38
|
+
|
|
39
|
+
// Third pass: resolve dependency paths and collect files
|
|
40
|
+
const resolvedDeps = await this.resolveDependencyPaths(bmadDir, allDependencies);
|
|
41
|
+
|
|
42
|
+
// Fourth pass: check for transitive dependencies
|
|
43
|
+
const transitiveDeps = await this.resolveTransitiveDependencies(bmadDir, resolvedDeps);
|
|
44
|
+
|
|
45
|
+
// Combine all files
|
|
46
|
+
const allFiles = new Set([...primaryFiles.map((f) => f.path), ...resolvedDeps, ...transitiveDeps]);
|
|
47
|
+
|
|
48
|
+
// Organize by module
|
|
49
|
+
const organizedFiles = this.organizeByModule(bmadDir, allFiles);
|
|
50
|
+
|
|
51
|
+
// Report results (only in verbose mode)
|
|
52
|
+
if (options.verbose) {
|
|
53
|
+
this.reportResults(organizedFiles, selectedModules);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
primaryFiles,
|
|
58
|
+
dependencies: resolvedDeps,
|
|
59
|
+
transitiveDependencies: transitiveDeps,
|
|
60
|
+
allFiles: [...allFiles],
|
|
61
|
+
byModule: organizedFiles,
|
|
62
|
+
missing: [...this.missingDependencies],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Collect primary files from selected modules
|
|
68
|
+
*/
|
|
69
|
+
async collectPrimaryFiles(bmadDir, modules) {
|
|
70
|
+
const files = [];
|
|
71
|
+
|
|
72
|
+
for (const module of modules) {
|
|
73
|
+
// Handle both source (src/) and installed (bmad/) directory structures
|
|
74
|
+
let moduleDir;
|
|
75
|
+
|
|
76
|
+
// Check if this is a source directory (has 'src' subdirectory)
|
|
77
|
+
const srcDir = path.join(bmadDir, 'src');
|
|
78
|
+
if (await fs.pathExists(srcDir)) {
|
|
79
|
+
// Source directory structure: src/core or src/modules/xxx
|
|
80
|
+
moduleDir = module === 'core' ? path.join(srcDir, 'core') : path.join(srcDir, 'modules', module);
|
|
81
|
+
} else {
|
|
82
|
+
// Installed directory structure: bmad/core or bmad/modules/xxx
|
|
83
|
+
moduleDir = module === 'core' ? path.join(bmadDir, 'core') : path.join(bmadDir, 'modules', module);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (!(await fs.pathExists(moduleDir))) {
|
|
87
|
+
console.warn(chalk.yellow(`Module directory not found: ${moduleDir}`));
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Collect agents
|
|
92
|
+
const agentsDir = path.join(moduleDir, 'agents');
|
|
93
|
+
if (await fs.pathExists(agentsDir)) {
|
|
94
|
+
const agentFiles = await glob.glob('*.md', { cwd: agentsDir });
|
|
95
|
+
for (const file of agentFiles) {
|
|
96
|
+
const agentPath = path.join(agentsDir, file);
|
|
97
|
+
|
|
98
|
+
// Check for localskip attribute
|
|
99
|
+
const content = await fs.readFile(agentPath, 'utf8');
|
|
100
|
+
const hasLocalSkip = content.match(/<agent[^>]*\slocalskip="true"[^>]*>/);
|
|
101
|
+
if (hasLocalSkip) {
|
|
102
|
+
continue; // Skip agents marked for web-only
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
files.push({
|
|
106
|
+
path: agentPath,
|
|
107
|
+
type: 'agent',
|
|
108
|
+
module,
|
|
109
|
+
name: path.basename(file, '.md'),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Collect tasks
|
|
115
|
+
const tasksDir = path.join(moduleDir, 'tasks');
|
|
116
|
+
if (await fs.pathExists(tasksDir)) {
|
|
117
|
+
const taskFiles = await glob.glob('*.md', { cwd: tasksDir });
|
|
118
|
+
for (const file of taskFiles) {
|
|
119
|
+
files.push({
|
|
120
|
+
path: path.join(tasksDir, file),
|
|
121
|
+
type: 'task',
|
|
122
|
+
module,
|
|
123
|
+
name: path.basename(file, '.md'),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return files;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Parse dependencies from file content
|
|
134
|
+
*/
|
|
135
|
+
async parseDependencies(files) {
|
|
136
|
+
const allDeps = new Set();
|
|
137
|
+
|
|
138
|
+
for (const file of files) {
|
|
139
|
+
const content = await fs.readFile(file.path, 'utf8');
|
|
140
|
+
|
|
141
|
+
// Parse YAML frontmatter for explicit dependencies
|
|
142
|
+
const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
143
|
+
if (frontmatterMatch) {
|
|
144
|
+
try {
|
|
145
|
+
// Pre-process to handle backticks in YAML values
|
|
146
|
+
let yamlContent = frontmatterMatch[1];
|
|
147
|
+
// Quote values with backticks to make them valid YAML
|
|
148
|
+
yamlContent = yamlContent.replaceAll(/: `([^`]+)`/g, ': "$1"');
|
|
149
|
+
|
|
150
|
+
const frontmatter = yaml.load(yamlContent);
|
|
151
|
+
if (frontmatter.dependencies) {
|
|
152
|
+
const deps = Array.isArray(frontmatter.dependencies) ? frontmatter.dependencies : [frontmatter.dependencies];
|
|
153
|
+
|
|
154
|
+
for (const dep of deps) {
|
|
155
|
+
allDeps.add({
|
|
156
|
+
from: file.path,
|
|
157
|
+
dependency: dep,
|
|
158
|
+
type: 'explicit',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Check for template dependencies
|
|
164
|
+
if (frontmatter.template) {
|
|
165
|
+
const templates = Array.isArray(frontmatter.template) ? frontmatter.template : [frontmatter.template];
|
|
166
|
+
for (const template of templates) {
|
|
167
|
+
allDeps.add({
|
|
168
|
+
from: file.path,
|
|
169
|
+
dependency: template,
|
|
170
|
+
type: 'template',
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} catch (error) {
|
|
175
|
+
console.warn(chalk.yellow(`Failed to parse frontmatter in ${file.name}: ${error.message}`));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Parse content for command references (cross-module dependencies)
|
|
180
|
+
const commandRefs = this.parseCommandReferences(content);
|
|
181
|
+
for (const ref of commandRefs) {
|
|
182
|
+
allDeps.add({
|
|
183
|
+
from: file.path,
|
|
184
|
+
dependency: ref,
|
|
185
|
+
type: 'command',
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Parse for file path references
|
|
190
|
+
const fileRefs = this.parseFileReferences(content);
|
|
191
|
+
for (const ref of fileRefs) {
|
|
192
|
+
// Determine type based on path format
|
|
193
|
+
// Paths starting with bmad/ are absolute references to the bmad installation
|
|
194
|
+
const depType = ref.startsWith('bmad/') ? 'bmad-path' : 'file';
|
|
195
|
+
allDeps.add({
|
|
196
|
+
from: file.path,
|
|
197
|
+
dependency: ref,
|
|
198
|
+
type: depType,
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return allDeps;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Parse command references from content
|
|
208
|
+
*/
|
|
209
|
+
parseCommandReferences(content) {
|
|
210
|
+
const refs = new Set();
|
|
211
|
+
|
|
212
|
+
// Match @task-{name} or @agent-{name} or @{module}-{type}-{name}
|
|
213
|
+
const commandPattern = /@(task-|agent-|bmad-)([a-z0-9-]+)/g;
|
|
214
|
+
let match;
|
|
215
|
+
|
|
216
|
+
while ((match = commandPattern.exec(content)) !== null) {
|
|
217
|
+
refs.add(match[0]);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Match file paths like bmad/core/agents/analyst
|
|
221
|
+
const pathPattern = /bmad\/(core|bmm|cis)\/(agents|tasks)\/([a-z0-9-]+)/g;
|
|
222
|
+
|
|
223
|
+
while ((match = pathPattern.exec(content)) !== null) {
|
|
224
|
+
refs.add(match[0]);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return [...refs];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Parse file path references from content
|
|
232
|
+
*/
|
|
233
|
+
parseFileReferences(content) {
|
|
234
|
+
const refs = new Set();
|
|
235
|
+
|
|
236
|
+
// Match relative paths like ../templates/file.yaml or ./data/file.md
|
|
237
|
+
const relativePattern = /['"](\.\.?\/[^'"]+\.(md|yaml|yml|xml|json|txt|csv))['"]/g;
|
|
238
|
+
let match;
|
|
239
|
+
|
|
240
|
+
while ((match = relativePattern.exec(content)) !== null) {
|
|
241
|
+
refs.add(match[1]);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Parse exec attributes in command tags
|
|
245
|
+
const execPattern = /exec="([^"]+)"/g;
|
|
246
|
+
while ((match = execPattern.exec(content)) !== null) {
|
|
247
|
+
let execPath = match[1];
|
|
248
|
+
if (execPath && execPath !== '*') {
|
|
249
|
+
// Remove {project-root} prefix to get the actual path
|
|
250
|
+
// Usage is like {project-root}/bmad/core/tasks/foo.md
|
|
251
|
+
if (execPath.includes('{project-root}')) {
|
|
252
|
+
execPath = execPath.replace('{project-root}', '');
|
|
253
|
+
}
|
|
254
|
+
refs.add(execPath);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Parse tmpl attributes in command tags
|
|
259
|
+
const tmplPattern = /tmpl="([^"]+)"/g;
|
|
260
|
+
while ((match = tmplPattern.exec(content)) !== null) {
|
|
261
|
+
let tmplPath = match[1];
|
|
262
|
+
if (tmplPath && tmplPath !== '*') {
|
|
263
|
+
// Remove {project-root} prefix to get the actual path
|
|
264
|
+
// Usage is like {project-root}/bmad/core/tasks/foo.md
|
|
265
|
+
if (tmplPath.includes('{project-root}')) {
|
|
266
|
+
tmplPath = tmplPath.replace('{project-root}', '');
|
|
267
|
+
}
|
|
268
|
+
refs.add(tmplPath);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
return [...refs];
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/**
|
|
276
|
+
* Resolve dependency paths to actual files
|
|
277
|
+
*/
|
|
278
|
+
async resolveDependencyPaths(bmadDir, dependencies) {
|
|
279
|
+
const resolved = new Set();
|
|
280
|
+
|
|
281
|
+
for (const dep of dependencies) {
|
|
282
|
+
const resolvedPaths = await this.resolveSingleDependency(bmadDir, dep);
|
|
283
|
+
for (const path of resolvedPaths) {
|
|
284
|
+
resolved.add(path);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
return resolved;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Resolve a single dependency to file paths
|
|
293
|
+
*/
|
|
294
|
+
async resolveSingleDependency(bmadDir, dep) {
|
|
295
|
+
const paths = [];
|
|
296
|
+
|
|
297
|
+
switch (dep.type) {
|
|
298
|
+
case 'explicit':
|
|
299
|
+
case 'file': {
|
|
300
|
+
let depPath = dep.dependency;
|
|
301
|
+
|
|
302
|
+
// Handle {project-root} prefix if present
|
|
303
|
+
if (depPath.includes('{project-root}')) {
|
|
304
|
+
// Remove {project-root} and resolve as bmad path
|
|
305
|
+
depPath = depPath.replace('{project-root}', '');
|
|
306
|
+
|
|
307
|
+
if (depPath.startsWith('bmad/')) {
|
|
308
|
+
const bmadPath = depPath.replace(/^bmad\//, '');
|
|
309
|
+
|
|
310
|
+
// Handle glob patterns
|
|
311
|
+
if (depPath.includes('*')) {
|
|
312
|
+
// Extract the base path and pattern
|
|
313
|
+
const pathParts = bmadPath.split('/');
|
|
314
|
+
const module = pathParts[0];
|
|
315
|
+
const filePattern = pathParts.at(-1);
|
|
316
|
+
const middlePath = pathParts.slice(1, -1).join('/');
|
|
317
|
+
|
|
318
|
+
let basePath;
|
|
319
|
+
if (module === 'core') {
|
|
320
|
+
basePath = path.join(bmadDir, 'core', middlePath);
|
|
321
|
+
} else {
|
|
322
|
+
basePath = path.join(bmadDir, 'modules', module, middlePath);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
if (await fs.pathExists(basePath)) {
|
|
326
|
+
const files = await glob.glob(filePattern, { cwd: basePath });
|
|
327
|
+
for (const file of files) {
|
|
328
|
+
paths.push(path.join(basePath, file));
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
} else {
|
|
332
|
+
// Direct path
|
|
333
|
+
if (bmadPath.startsWith('core/')) {
|
|
334
|
+
const corePath = path.join(bmadDir, bmadPath);
|
|
335
|
+
if (await fs.pathExists(corePath)) {
|
|
336
|
+
paths.push(corePath);
|
|
337
|
+
}
|
|
338
|
+
} else {
|
|
339
|
+
const parts = bmadPath.split('/');
|
|
340
|
+
const module = parts[0];
|
|
341
|
+
const rest = parts.slice(1).join('/');
|
|
342
|
+
const modulePath = path.join(bmadDir, 'modules', module, rest);
|
|
343
|
+
|
|
344
|
+
if (await fs.pathExists(modulePath)) {
|
|
345
|
+
paths.push(modulePath);
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
} else {
|
|
351
|
+
// Regular relative path handling
|
|
352
|
+
const sourceDir = path.dirname(dep.from);
|
|
353
|
+
|
|
354
|
+
// Handle glob patterns
|
|
355
|
+
if (depPath.includes('*')) {
|
|
356
|
+
const basePath = path.resolve(sourceDir, path.dirname(depPath));
|
|
357
|
+
const pattern = path.basename(depPath);
|
|
358
|
+
|
|
359
|
+
if (await fs.pathExists(basePath)) {
|
|
360
|
+
const files = await glob.glob(pattern, { cwd: basePath });
|
|
361
|
+
for (const file of files) {
|
|
362
|
+
paths.push(path.join(basePath, file));
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
} else {
|
|
366
|
+
// Direct file reference
|
|
367
|
+
const fullPath = path.resolve(sourceDir, depPath);
|
|
368
|
+
if (await fs.pathExists(fullPath)) {
|
|
369
|
+
paths.push(fullPath);
|
|
370
|
+
} else {
|
|
371
|
+
this.missingDependencies.add(`${depPath} (referenced by ${path.basename(dep.from)})`);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
break;
|
|
377
|
+
}
|
|
378
|
+
case 'command': {
|
|
379
|
+
// Resolve command references to actual files
|
|
380
|
+
const commandPath = await this.resolveCommandToPath(bmadDir, dep.dependency);
|
|
381
|
+
if (commandPath) {
|
|
382
|
+
paths.push(commandPath);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
case 'bmad-path': {
|
|
388
|
+
// Resolve bmad/ paths (from {project-root}/bmad/... references)
|
|
389
|
+
// These are paths relative to the src directory structure
|
|
390
|
+
const bmadPath = dep.dependency.replace(/^bmad\//, '');
|
|
391
|
+
|
|
392
|
+
// Try to resolve as if it's in src structure
|
|
393
|
+
// bmad/core/tasks/foo.md -> src/core/tasks/foo.md
|
|
394
|
+
// bmad/bmm/tasks/bar.md -> src/modules/bmm/tasks/bar.md
|
|
395
|
+
|
|
396
|
+
if (bmadPath.startsWith('core/')) {
|
|
397
|
+
const corePath = path.join(bmadDir, bmadPath);
|
|
398
|
+
if (await fs.pathExists(corePath)) {
|
|
399
|
+
paths.push(corePath);
|
|
400
|
+
} else {
|
|
401
|
+
// Not found, but don't report as missing since it might be installed later
|
|
402
|
+
}
|
|
403
|
+
} else {
|
|
404
|
+
// It's a module path like bmm/tasks/foo.md or cis/agents/bar.md
|
|
405
|
+
const parts = bmadPath.split('/');
|
|
406
|
+
const module = parts[0];
|
|
407
|
+
const rest = parts.slice(1).join('/');
|
|
408
|
+
const modulePath = path.join(bmadDir, 'modules', module, rest);
|
|
409
|
+
|
|
410
|
+
if (await fs.pathExists(modulePath)) {
|
|
411
|
+
paths.push(modulePath);
|
|
412
|
+
} else {
|
|
413
|
+
// Not found, but don't report as missing since it might be installed later
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
break;
|
|
418
|
+
}
|
|
419
|
+
case 'template': {
|
|
420
|
+
// Resolve template references
|
|
421
|
+
let templateDep = dep.dependency;
|
|
422
|
+
|
|
423
|
+
// Handle {project-root} prefix if present
|
|
424
|
+
if (templateDep.includes('{project-root}')) {
|
|
425
|
+
// Remove {project-root} and treat as bmad-path
|
|
426
|
+
templateDep = templateDep.replace('{project-root}', '');
|
|
427
|
+
|
|
428
|
+
// Now resolve as a bmad path
|
|
429
|
+
if (templateDep.startsWith('bmad/')) {
|
|
430
|
+
const bmadPath = templateDep.replace(/^bmad\//, '');
|
|
431
|
+
|
|
432
|
+
if (bmadPath.startsWith('core/')) {
|
|
433
|
+
const corePath = path.join(bmadDir, bmadPath);
|
|
434
|
+
if (await fs.pathExists(corePath)) {
|
|
435
|
+
paths.push(corePath);
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
// Module path like cis/templates/brainstorm.md
|
|
439
|
+
const parts = bmadPath.split('/');
|
|
440
|
+
const module = parts[0];
|
|
441
|
+
const rest = parts.slice(1).join('/');
|
|
442
|
+
const modulePath = path.join(bmadDir, 'modules', module, rest);
|
|
443
|
+
|
|
444
|
+
if (await fs.pathExists(modulePath)) {
|
|
445
|
+
paths.push(modulePath);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
} else {
|
|
450
|
+
// Regular relative template path
|
|
451
|
+
const sourceDir = path.dirname(dep.from);
|
|
452
|
+
const templatePath = path.resolve(sourceDir, templateDep);
|
|
453
|
+
|
|
454
|
+
if (await fs.pathExists(templatePath)) {
|
|
455
|
+
paths.push(templatePath);
|
|
456
|
+
} else {
|
|
457
|
+
this.missingDependencies.add(`Template: ${dep.dependency}`);
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
break;
|
|
462
|
+
}
|
|
463
|
+
// No default
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
return paths;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/**
|
|
470
|
+
* Resolve command reference to file path
|
|
471
|
+
*/
|
|
472
|
+
async resolveCommandToPath(bmadDir, command) {
|
|
473
|
+
// Parse command format: @task-name or @agent-name or bmad/module/type/name
|
|
474
|
+
|
|
475
|
+
if (command.startsWith('@task-')) {
|
|
476
|
+
const taskName = command.slice(6);
|
|
477
|
+
// Search all modules for this task
|
|
478
|
+
for (const module of ['core', 'bmm', 'cis']) {
|
|
479
|
+
const taskPath =
|
|
480
|
+
module === 'core'
|
|
481
|
+
? path.join(bmadDir, 'core', 'tasks', `${taskName}.md`)
|
|
482
|
+
: path.join(bmadDir, 'modules', module, 'tasks', `${taskName}.md`);
|
|
483
|
+
if (await fs.pathExists(taskPath)) {
|
|
484
|
+
return taskPath;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
} else if (command.startsWith('@agent-')) {
|
|
488
|
+
const agentName = command.slice(7);
|
|
489
|
+
// Search all modules for this agent
|
|
490
|
+
for (const module of ['core', 'bmm', 'cis']) {
|
|
491
|
+
const agentPath =
|
|
492
|
+
module === 'core'
|
|
493
|
+
? path.join(bmadDir, 'core', 'agents', `${agentName}.md`)
|
|
494
|
+
: path.join(bmadDir, 'modules', module, 'agents', `${agentName}.md`);
|
|
495
|
+
if (await fs.pathExists(agentPath)) {
|
|
496
|
+
return agentPath;
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
} else if (command.startsWith('bmad/')) {
|
|
500
|
+
// Direct path reference
|
|
501
|
+
const parts = command.split('/');
|
|
502
|
+
if (parts.length >= 4) {
|
|
503
|
+
const [, module, type, ...nameParts] = parts;
|
|
504
|
+
const name = nameParts.join('/'); // Handle nested paths
|
|
505
|
+
|
|
506
|
+
// Check if name already has extension
|
|
507
|
+
const fileName = name.endsWith('.md') ? name : `${name}.md`;
|
|
508
|
+
|
|
509
|
+
const filePath =
|
|
510
|
+
module === 'core' ? path.join(bmadDir, 'core', type, fileName) : path.join(bmadDir, 'modules', module, type, fileName);
|
|
511
|
+
if (await fs.pathExists(filePath)) {
|
|
512
|
+
return filePath;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Don't report as missing if it's a self-reference within the module being installed
|
|
518
|
+
if (!command.includes('cis') || command.includes('brain')) {
|
|
519
|
+
// Only report missing if it's a true external dependency
|
|
520
|
+
// this.missingDependencies.add(`Command: ${command}`);
|
|
521
|
+
}
|
|
522
|
+
return null;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
/**
|
|
526
|
+
* Resolve transitive dependencies (dependencies of dependencies)
|
|
527
|
+
*/
|
|
528
|
+
async resolveTransitiveDependencies(bmadDir, directDeps) {
|
|
529
|
+
const transitive = new Set();
|
|
530
|
+
const processed = new Set();
|
|
531
|
+
|
|
532
|
+
// Process each direct dependency
|
|
533
|
+
for (const depPath of directDeps) {
|
|
534
|
+
if (processed.has(depPath)) continue;
|
|
535
|
+
processed.add(depPath);
|
|
536
|
+
|
|
537
|
+
// Only process markdown and YAML files for transitive deps
|
|
538
|
+
if ((depPath.endsWith('.md') || depPath.endsWith('.yaml') || depPath.endsWith('.yml')) && (await fs.pathExists(depPath))) {
|
|
539
|
+
const content = await fs.readFile(depPath, 'utf8');
|
|
540
|
+
const subDeps = await this.parseDependencies([
|
|
541
|
+
{
|
|
542
|
+
path: depPath,
|
|
543
|
+
type: 'dependency',
|
|
544
|
+
module: this.getModuleFromPath(bmadDir, depPath),
|
|
545
|
+
name: path.basename(depPath),
|
|
546
|
+
},
|
|
547
|
+
]);
|
|
548
|
+
|
|
549
|
+
const resolvedSubDeps = await this.resolveDependencyPaths(bmadDir, subDeps);
|
|
550
|
+
for (const subDep of resolvedSubDeps) {
|
|
551
|
+
if (!directDeps.has(subDep)) {
|
|
552
|
+
transitive.add(subDep);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
return transitive;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Get module name from file path
|
|
563
|
+
*/
|
|
564
|
+
getModuleFromPath(bmadDir, filePath) {
|
|
565
|
+
const relative = path.relative(bmadDir, filePath);
|
|
566
|
+
const parts = relative.split(path.sep);
|
|
567
|
+
|
|
568
|
+
// Handle source directory structure (src/core or src/modules/xxx)
|
|
569
|
+
if (parts[0] === 'src') {
|
|
570
|
+
if (parts[1] === 'core') {
|
|
571
|
+
return 'core';
|
|
572
|
+
} else if (parts[1] === 'modules' && parts.length > 2) {
|
|
573
|
+
return parts[2];
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
// Check if it's in modules directory (installed structure)
|
|
578
|
+
if (parts[0] === 'modules' && parts.length > 1) {
|
|
579
|
+
return parts[1];
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
// Otherwise return the first part (core, etc.)
|
|
583
|
+
// But don't return 'src' as a module name
|
|
584
|
+
if (parts[0] === 'src') {
|
|
585
|
+
return 'unknown';
|
|
586
|
+
}
|
|
587
|
+
return parts[0] || 'unknown';
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Organize files by module
|
|
592
|
+
*/
|
|
593
|
+
organizeByModule(bmadDir, files) {
|
|
594
|
+
const organized = {};
|
|
595
|
+
|
|
596
|
+
for (const file of files) {
|
|
597
|
+
const module = this.getModuleFromPath(bmadDir, file);
|
|
598
|
+
if (!organized[module]) {
|
|
599
|
+
organized[module] = {
|
|
600
|
+
agents: [],
|
|
601
|
+
tasks: [],
|
|
602
|
+
templates: [],
|
|
603
|
+
data: [],
|
|
604
|
+
other: [],
|
|
605
|
+
};
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
// Get relative path correctly based on module structure
|
|
609
|
+
let moduleBase;
|
|
610
|
+
|
|
611
|
+
// Check if file is in source directory structure
|
|
612
|
+
if (file.includes('/src/core/') || file.includes('/src/modules/')) {
|
|
613
|
+
moduleBase = module === 'core' ? path.join(bmadDir, 'src', 'core') : path.join(bmadDir, 'src', 'modules', module);
|
|
614
|
+
} else {
|
|
615
|
+
// Installed structure
|
|
616
|
+
moduleBase = module === 'core' ? path.join(bmadDir, 'core') : path.join(bmadDir, 'modules', module);
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
const relative = path.relative(moduleBase, file);
|
|
620
|
+
|
|
621
|
+
// Check file path for categorization
|
|
622
|
+
// Brain-tech files are data, not tasks (even though they're in tasks/brain-tech/)
|
|
623
|
+
if (file.includes('/brain-tech/')) {
|
|
624
|
+
organized[module].data.push(file);
|
|
625
|
+
} else if (relative.startsWith('agents/') || file.includes('/agents/')) {
|
|
626
|
+
organized[module].agents.push(file);
|
|
627
|
+
} else if (relative.startsWith('tasks/') || file.includes('/tasks/')) {
|
|
628
|
+
organized[module].tasks.push(file);
|
|
629
|
+
} else if (relative.includes('template') || file.includes('/templates/')) {
|
|
630
|
+
organized[module].templates.push(file);
|
|
631
|
+
} else if (relative.includes('data/')) {
|
|
632
|
+
organized[module].data.push(file);
|
|
633
|
+
} else {
|
|
634
|
+
organized[module].other.push(file);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
return organized;
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
/**
|
|
642
|
+
* Report resolution results
|
|
643
|
+
*/
|
|
644
|
+
reportResults(organized, selectedModules) {
|
|
645
|
+
console.log(chalk.green('\n✓ Dependency resolution complete'));
|
|
646
|
+
|
|
647
|
+
for (const [module, files] of Object.entries(organized)) {
|
|
648
|
+
const isSelected = selectedModules.includes(module) || module === 'core';
|
|
649
|
+
const totalFiles = files.agents.length + files.tasks.length + files.templates.length + files.data.length + files.other.length;
|
|
650
|
+
|
|
651
|
+
if (totalFiles > 0) {
|
|
652
|
+
console.log(chalk.cyan(`\n ${module.toUpperCase()} module:`));
|
|
653
|
+
console.log(chalk.dim(` Status: ${isSelected ? 'Selected' : 'Dependencies only'}`));
|
|
654
|
+
|
|
655
|
+
if (files.agents.length > 0) {
|
|
656
|
+
console.log(chalk.dim(` Agents: ${files.agents.length}`));
|
|
657
|
+
}
|
|
658
|
+
if (files.tasks.length > 0) {
|
|
659
|
+
console.log(chalk.dim(` Tasks: ${files.tasks.length}`));
|
|
660
|
+
}
|
|
661
|
+
if (files.templates.length > 0) {
|
|
662
|
+
console.log(chalk.dim(` Templates: ${files.templates.length}`));
|
|
663
|
+
}
|
|
664
|
+
if (files.data.length > 0) {
|
|
665
|
+
console.log(chalk.dim(` Data files: ${files.data.length}`));
|
|
666
|
+
}
|
|
667
|
+
if (files.other.length > 0) {
|
|
668
|
+
console.log(chalk.dim(` Other files: ${files.other.length}`));
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
if (this.missingDependencies.size > 0) {
|
|
674
|
+
console.log(chalk.yellow('\n ⚠ Missing dependencies:'));
|
|
675
|
+
for (const missing of this.missingDependencies) {
|
|
676
|
+
console.log(chalk.yellow(` - ${missing}`));
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
/**
|
|
682
|
+
* Create a bundle for web deployment
|
|
683
|
+
* @param {Object} resolution - Resolution results from resolve()
|
|
684
|
+
* @returns {Object} Bundle data ready for web
|
|
685
|
+
*/
|
|
686
|
+
async createWebBundle(resolution) {
|
|
687
|
+
const bundle = {
|
|
688
|
+
metadata: {
|
|
689
|
+
created: new Date().toISOString(),
|
|
690
|
+
modules: Object.keys(resolution.byModule),
|
|
691
|
+
totalFiles: resolution.allFiles.length,
|
|
692
|
+
},
|
|
693
|
+
agents: {},
|
|
694
|
+
tasks: {},
|
|
695
|
+
templates: {},
|
|
696
|
+
data: {},
|
|
697
|
+
};
|
|
698
|
+
|
|
699
|
+
// Bundle all files by type
|
|
700
|
+
for (const filePath of resolution.allFiles) {
|
|
701
|
+
if (!(await fs.pathExists(filePath))) continue;
|
|
702
|
+
|
|
703
|
+
const content = await fs.readFile(filePath, 'utf8');
|
|
704
|
+
const relative = path.relative(path.dirname(resolution.primaryFiles[0]?.path || '.'), filePath);
|
|
705
|
+
|
|
706
|
+
if (filePath.includes('/agents/')) {
|
|
707
|
+
bundle.agents[relative] = content;
|
|
708
|
+
} else if (filePath.includes('/tasks/')) {
|
|
709
|
+
bundle.tasks[relative] = content;
|
|
710
|
+
} else if (filePath.includes('template')) {
|
|
711
|
+
bundle.templates[relative] = content;
|
|
712
|
+
} else {
|
|
713
|
+
bundle.data[relative] = content;
|
|
714
|
+
}
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
return bundle;
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
module.exports = { DependencyResolver };
|