bmad-method 6.0.0-alpha.0 → 6.0.0-alpha.10
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/ISSUE_TEMPLATE/config.yaml +4 -0
- package/.github/ISSUE_TEMPLATE/idea_submission.md +3 -3
- package/.github/workflows/bundle-latest.yaml +277 -0
- package/.github/workflows/manual-release.yaml +64 -17
- package/.github/workflows/quality.yaml +78 -0
- package/.husky/pre-commit +4 -0
- package/.prettierignore +6 -0
- package/.vscode/settings.json +3 -1
- package/CHANGELOG.md +1211 -2
- package/CONTRIBUTING.md +2 -13
- package/README.md +442 -0
- package/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/docs/agent-customization-guide.md +208 -0
- package/docs/document-sharding-guide.md +449 -0
- package/docs/ide-info/auggie.md +2 -2
- package/docs/ide-info/claude-code.md +4 -4
- package/docs/ide-info/codex.md +9 -20
- package/docs/ide-info/crush.md +1 -1
- package/docs/ide-info/cursor.md +7 -7
- package/docs/ide-info/iflow.md +3 -3
- package/docs/ide-info/opencode.md +24 -0
- package/docs/index.md +227 -0
- package/docs/installers-bundlers/ide-injections.md +2 -12
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +100 -67
- package/docs/v4-to-v6-upgrade.md +227 -0
- package/docs/web-bundles-gemini-gpt-guide.md +473 -0
- package/eslint.config.mjs +6 -2
- package/package.json +13 -6
- package/src/core/_module-installer/install-config.yaml +35 -0
- package/src/core/_module-installer/installer.js +1 -9
- package/src/core/agents/bmad-master.agent.yaml +39 -0
- package/src/core/agents/bmad-web-orchestrator.agent.xml +113 -0
- package/src/core/tasks/advanced-elicitation-methods.csv +21 -0
- package/src/core/tasks/{adv-elicit.md → advanced-elicitation.xml} +11 -14
- package/src/core/tasks/{index-docs.md → index-docs.xml} +6 -10
- package/src/core/tasks/{validate-workflow.md → validate-workflow.xml} +4 -7
- package/src/core/tasks/workflow.xml +270 -0
- package/src/core/tools/shard-doc.xml +109 -0
- package/src/{modules/cis → core}/workflows/brainstorming/README.md +8 -18
- package/src/{modules/cis → core}/workflows/brainstorming/instructions.md +29 -24
- package/src/{modules/cis → core}/workflows/brainstorming/template.md +6 -2
- package/src/{modules/cis → core}/workflows/brainstorming/workflow.yaml +17 -9
- package/src/core/workflows/party-mode/instructions.md +27 -25
- package/src/core/workflows/party-mode/workflow.yaml +14 -10
- package/src/modules/bmb/README.md +194 -0
- package/src/modules/bmb/_module-installer/install-config.yaml +31 -0
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +57 -0
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +142 -0
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +341 -0
- package/src/modules/bmb/workflows/audit-workflow/template.md +118 -0
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +25 -0
- package/src/modules/bmb/workflows/convert-legacy/README.md +34 -34
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +22 -21
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +135 -86
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +10 -15
- package/src/modules/bmb/workflows/create-agent/README.md +144 -209
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +68 -65
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +174 -172
- package/src/modules/bmb/workflows/create-agent/agent-types.md +139 -24
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-agent/checklist.md +30 -102
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +22 -60
- package/src/modules/bmb/workflows/create-agent/instructions.md +339 -221
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +28 -19
- package/src/modules/bmb/workflows/create-module/README.md +164 -153
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +1 -1
- package/src/modules/bmb/workflows/create-module/checklist.md +21 -31
- package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +92 -0
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +1 -1
- package/src/modules/bmb/workflows/create-module/instructions.md +306 -238
- package/src/modules/bmb/workflows/create-module/module-structure.md +135 -45
- package/src/modules/bmb/workflows/create-module/workflow.yaml +32 -27
- package/src/modules/bmb/workflows/create-workflow/README.md +70 -9
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/checklist.md +22 -0
- package/src/modules/bmb/workflows/create-workflow/instructions.md +505 -47
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +939 -68
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +6 -3
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +31 -5
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +16 -17
- package/src/modules/bmb/workflows/edit-agent/README.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/checklist.md +112 -0
- package/src/modules/bmb/workflows/edit-agent/instructions.md +290 -0
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +33 -0
- package/src/modules/bmb/workflows/edit-module/README.md +187 -0
- package/src/modules/bmb/workflows/edit-module/checklist.md +165 -0
- package/src/modules/bmb/workflows/edit-module/instructions.md +341 -0
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +34 -0
- package/src/modules/bmb/workflows/edit-workflow/README.md +58 -2
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +290 -118
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +9 -16
- package/src/modules/bmb/workflows/module-brief/README.md +17 -17
- package/src/modules/bmb/workflows/module-brief/checklist.md +6 -6
- package/src/modules/bmb/workflows/module-brief/instructions.md +10 -7
- package/src/modules/bmb/workflows/module-brief/template.md +9 -9
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +16 -10
- package/src/modules/bmb/workflows/redoc/README.md +5 -5
- package/src/modules/bmb/workflows/redoc/checklist.md +2 -2
- package/src/modules/bmb/workflows/redoc/instructions.md +20 -10
- package/src/modules/bmb/workflows/redoc/workflow.yaml +6 -5
- package/src/modules/bmgd/README.md +208 -0
- package/src/modules/bmgd/_module-installer/install-config.yaml +54 -0
- package/src/modules/bmgd/agents/game-architect.agent.yaml +33 -0
- package/src/modules/bmgd/agents/game-designer.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-dev.agent.yaml +40 -0
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +75 -0
- package/src/modules/bmgd/teams/default-party.csv +10 -0
- package/src/modules/bmgd/teams/team-gamedev.yaml +18 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-context.md +3 -3
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +130 -0
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +41 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/checklist.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +373 -0
- package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/game-brief/template.md +2 -2
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +36 -0
- package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +148 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/action-platformer.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/adventure.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/card-game.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/fighting.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/horror.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/idle-incremental.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/moba.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/party-game.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/racing.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rhythm.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/roguelike.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/rpg.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sandbox.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/shooter.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/simulation.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/sports.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/strategy.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/survival.md +2 -2
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/text-based.md +3 -3
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/tower-defense.md +5 -5
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/turn-based-tactics.md +4 -4
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/visual-novel.md +1 -1
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/gdd-template.md +6 -12
- package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +502 -0
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +81 -0
- package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +139 -0
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/instructions-narrative.md +99 -12
- package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/narrative/narrative-template.md +8 -8
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +32 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +103 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +240 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +701 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +69 -0
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +398 -0
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +61 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +279 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +206 -0
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +240 -0
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +256 -0
- package/src/modules/bmgd/workflows/4-production/create-story/template.md +51 -0
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +74 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +38 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +267 -0
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +58 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +164 -0
- package/src/modules/{bmm/workflows/3-solutioning/tech-spec → bmgd/workflows/4-production/epic-tech-context}/template.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +1443 -0
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +57 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/checklist.md +33 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +234 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +16 -0
- package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +34 -0
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +209 -0
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +63 -0
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +111 -0
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +28 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +117 -0
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/README.md +128 -0
- package/src/modules/bmm/_module-installer/install-config.yaml +60 -0
- package/src/modules/bmm/_module-installer/installer.js +3 -3
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +49 -0
- package/src/modules/bmm/agents/architect.agent.yaml +42 -0
- package/src/modules/bmm/agents/dev.agent.yaml +40 -0
- package/src/modules/bmm/agents/frame-expert.agent.yaml +42 -0
- package/src/modules/bmm/agents/pm.agent.yaml +64 -0
- package/src/modules/bmm/agents/sm.agent.yaml +73 -0
- package/src/modules/bmm/agents/tea.agent.yaml +67 -0
- package/src/modules/bmm/agents/tech-writer.agent.yaml +68 -0
- package/src/modules/bmm/agents/ux-designer.agent.yaml +39 -0
- package/src/modules/bmm/docs/README.md +236 -0
- package/src/modules/bmm/docs/agents-guide.md +1058 -0
- package/src/modules/bmm/docs/brownfield-guide.md +762 -0
- package/src/modules/bmm/docs/enterprise-agentic-development.md +686 -0
- package/src/modules/bmm/docs/faq.md +588 -0
- package/src/modules/bmm/docs/glossary.md +320 -0
- package/src/modules/bmm/docs/party-mode.md +224 -0
- package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
- package/src/modules/bmm/docs/quick-start.md +376 -0
- package/src/modules/bmm/docs/scale-adaptive-system.md +612 -0
- package/src/modules/bmm/docs/test-architecture.md +396 -0
- package/src/modules/bmm/docs/workflow-architecture-reference.md +366 -0
- package/src/modules/bmm/docs/workflow-document-project-reference.md +489 -0
- package/src/modules/bmm/docs/workflows-analysis.md +370 -0
- package/src/modules/bmm/docs/workflows-implementation.md +286 -0
- package/src/modules/bmm/docs/workflows-planning.md +612 -0
- package/src/modules/bmm/docs/workflows-solutioning.md +554 -0
- package/src/modules/bmm/teams/default-party.csv +20 -0
- package/src/modules/bmm/teams/team-fullstack.yaml +13 -0
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +675 -0
- package/src/modules/bmm/testarch/knowledge/component-tdd.md +486 -0
- package/src/modules/bmm/testarch/knowledge/contract-testing.md +957 -0
- package/src/modules/bmm/testarch/knowledge/data-factories.md +500 -0
- package/src/modules/bmm/testarch/knowledge/email-auth.md +721 -0
- package/src/modules/bmm/testarch/knowledge/error-handling.md +725 -0
- package/src/modules/bmm/testarch/knowledge/feature-flags.md +750 -0
- package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +401 -0
- package/src/modules/bmm/testarch/knowledge/network-first.md +486 -0
- package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +670 -0
- package/src/modules/bmm/testarch/knowledge/playwright-config.md +730 -0
- package/src/modules/bmm/testarch/knowledge/probability-impact.md +601 -0
- package/src/modules/bmm/testarch/knowledge/risk-governance.md +615 -0
- package/src/modules/bmm/testarch/knowledge/selective-testing.md +732 -0
- package/src/modules/bmm/testarch/knowledge/selector-resilience.md +527 -0
- package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
- package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +473 -0
- package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
- package/src/modules/bmm/testarch/knowledge/test-quality.md +664 -0
- package/src/modules/bmm/testarch/knowledge/timing-debugging.md +372 -0
- package/src/modules/bmm/testarch/knowledge/visual-debugging.md +524 -0
- package/src/modules/bmm/testarch/tea-index.csv +22 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +82 -8
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +4 -4
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +23 -5
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +425 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +180 -0
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +56 -0
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +418 -247
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +93 -77
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +42 -14
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +144 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +249 -0
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +156 -59
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +115 -47
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +236 -114
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +109 -66
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +147 -55
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +38 -2
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +36 -1
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +36 -123
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/epics-template.md +80 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/instructions.md +616 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-epics-and-stories/workflow.yaml +63 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +310 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +1308 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +145 -0
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +93 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +346 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +13 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +703 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +204 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +11 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +78 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +217 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +74 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +436 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +980 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +181 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +90 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +60 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +321 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +103 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +240 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +222 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +768 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +13 -0
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +100 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +169 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +332 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +146 -0
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +64 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +12 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +22 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +398 -0
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +61 -0
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +6 -6
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +70 -54
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +44 -21
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +240 -39
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +203 -28
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +2 -8
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +43 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +220 -40
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +43 -38
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +17 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +164 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +76 -0
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +58 -0
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +1280 -228
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +41 -25
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +234 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +51 -0
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +155 -22
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +43 -36
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +111 -0
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +117 -0
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/document-project/checklist.md +245 -0
- package/src/modules/bmm/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/modules/bmm/workflows/document-project/instructions.md +222 -0
- package/src/modules/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/modules/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/modules/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/modules/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
- package/src/modules/bmm/workflows/document-project/workflow.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-helpers.md +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-library.json +90 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/excalidraw-templates.yaml +127 -0
- package/src/modules/bmm/workflows/frame-expert/_shared/validate-json-instructions.md +79 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/checklist.md +39 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/instructions.md +131 -0
- package/src/modules/bmm/workflows/frame-expert/create-dataflow/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/checklist.md +43 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/instructions.md +142 -0
- package/src/modules/bmm/workflows/frame-expert/create-diagram/workflow.yaml +25 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/checklist.md +49 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/instructions.md +242 -0
- package/src/modules/bmm/workflows/frame-expert/create-flowchart/workflow.yaml +28 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/checklist.md +38 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/instructions.md +133 -0
- package/src/modules/bmm/workflows/frame-expert/create-wireframe/workflow.yaml +24 -0
- package/src/modules/bmm/workflows/techdoc/documentation-standards.md +262 -0
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
- package/src/modules/bmm/workflows/testarch/atdd/checklist.md +373 -0
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +785 -0
- package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/automate/checklist.md +580 -0
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +1303 -0
- package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +54 -0
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +246 -0
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +165 -0
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +128 -0
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +517 -0
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +47 -0
- package/src/modules/bmm/workflows/testarch/framework/checklist.md +321 -0
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +455 -0
- package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +405 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +722 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +443 -0
- package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +234 -0
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +782 -0
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +285 -0
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +50 -0
- package/src/modules/bmm/workflows/testarch/test-review/checklist.md +470 -0
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +608 -0
- package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +388 -0
- package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
- package/src/modules/bmm/workflows/testarch/trace/checklist.md +654 -0
- package/src/modules/bmm/workflows/testarch/trace/instructions.md +1045 -0
- package/src/modules/bmm/workflows/testarch/trace/trace-template.md +673 -0
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +57 -0
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +334 -0
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +29 -0
- package/src/modules/bmm/workflows/workflow-status/instructions.md +388 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +138 -0
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +126 -0
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +52 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +122 -0
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +113 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +58 -0
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +47 -0
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +59 -0
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +24 -0
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +30 -0
- package/src/modules/cis/README.md +153 -0
- package/src/modules/cis/_module-installer/{install-menu-config.yaml → install-config.yaml} +6 -4
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +28 -0
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +28 -0
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +28 -0
- package/src/modules/cis/agents/storyteller.agent.yaml +28 -0
- package/src/modules/cis/teams/creative-squad.yaml +1 -0
- package/src/modules/cis/teams/default-party.csv +11 -0
- package/src/modules/cis/workflows/README.md +102 -30
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +1 -1
- package/src/modules/cis/workflows/design-thinking/instructions.md +4 -2
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +16 -7
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +2 -2
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +7 -5
- package/src/modules/cis/workflows/innovation-strategy/template.md +6 -6
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +16 -7
- package/src/modules/cis/workflows/problem-solving/instructions.md +4 -2
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +6 -6
- package/src/modules/cis/workflows/problem-solving/template.md +3 -3
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +16 -7
- package/src/modules/cis/workflows/storytelling/instructions.md +48 -30
- package/src/modules/cis/workflows/storytelling/template.md +2 -2
- package/src/modules/cis/workflows/storytelling/workflow.yaml +16 -7
- package/src/utility/models/action-command-header.md +0 -0
- package/src/utility/models/agent-activation-ide.xml +4 -4
- package/src/utility/models/agent-activation-web.xml +60 -0
- package/src/utility/models/agent-command-header.md +1 -0
- package/src/utility/models/agent-in-team-activation.xml +3 -0
- package/src/utility/models/fragments/activation-rules.xml +8 -0
- package/src/utility/models/fragments/activation-steps.xml +16 -0
- package/src/utility/models/fragments/handler-action.xml +4 -0
- package/src/utility/models/fragments/handler-data.xml +5 -0
- package/src/utility/models/fragments/handler-exec.xml +5 -0
- package/src/utility/models/fragments/handler-tmpl.xml +5 -0
- package/src/utility/models/fragments/handler-validate-workflow.xml +7 -0
- package/src/utility/models/fragments/handler-workflow.xml +9 -0
- package/src/utility/models/fragments/menu-handlers.xml +6 -0
- package/src/utility/models/fragments/web-bundle-activation-steps.xml +32 -0
- package/src/utility/templates/agent.customize.template.yaml +42 -0
- package/test/README.md +295 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +21 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +26 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +39 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +33 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +21 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +29 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +23 -0
- package/test/test-agent-schema.js +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-installation-components.js +214 -0
- package/test/unit-test-schema.js +133 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/cli/README.md +608 -0
- package/tools/cli/bmad-cli.js +0 -2
- package/tools/cli/bundlers/bundle-web.js +24 -2
- package/tools/cli/bundlers/test-bundler.js +1 -1
- package/tools/cli/bundlers/web-bundler.js +944 -49
- package/tools/cli/commands/build.js +458 -0
- package/tools/cli/commands/install.js +46 -8
- package/tools/cli/installers/lib/core/config-collector.js +490 -43
- package/tools/cli/installers/lib/core/dependency-resolver.js +5 -1
- package/tools/cli/installers/lib/core/detector.js +134 -13
- package/tools/cli/installers/lib/core/ide-config-manager.js +154 -0
- package/tools/cli/installers/lib/core/installer.js +1365 -167
- package/tools/cli/installers/lib/core/manifest-generator.js +388 -81
- package/tools/cli/installers/lib/core/manifest.js +100 -44
- package/tools/cli/installers/lib/ide/_base-ide.js +368 -23
- package/tools/cli/installers/lib/ide/auggie.js +100 -192
- package/tools/cli/installers/lib/ide/claude-code.js +167 -321
- package/tools/cli/installers/lib/ide/cline.js +146 -227
- package/tools/cli/installers/lib/ide/codex.js +138 -202
- package/tools/cli/installers/lib/ide/crush.js +108 -72
- package/tools/cli/installers/lib/ide/cursor.js +148 -20
- package/tools/cli/installers/lib/ide/gemini.js +109 -63
- package/tools/cli/installers/lib/ide/github-copilot.js +60 -47
- package/tools/cli/installers/lib/ide/iflow.js +13 -30
- package/tools/cli/installers/lib/ide/kilo.js +20 -16
- package/tools/cli/installers/lib/ide/manager.js +41 -35
- package/tools/cli/installers/lib/ide/opencode.js +212 -0
- package/tools/cli/installers/lib/ide/qwen.js +198 -68
- package/tools/cli/installers/lib/ide/roo.js +27 -62
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +90 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +143 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +133 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +119 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +237 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
- package/tools/cli/installers/lib/ide/{workflow-command-template.md → templates/workflow-command-template.md} +7 -5
- package/tools/cli/installers/lib/ide/trae.js +138 -54
- package/tools/cli/installers/lib/ide/windsurf.js +104 -42
- package/tools/cli/installers/lib/modules/manager.js +332 -10
- package/tools/cli/lib/activation-builder.js +168 -0
- package/tools/cli/lib/agent-analyzer.js +81 -0
- package/tools/cli/lib/agent-party-generator.js +3 -3
- package/tools/cli/lib/cli-utils.js +52 -50
- package/tools/cli/lib/config.js +3 -1
- package/tools/cli/lib/ui.js +106 -14
- package/tools/cli/lib/xml-handler.js +47 -1
- package/tools/cli/lib/yaml-format.js +2 -1
- package/tools/cli/lib/yaml-xml-builder.js +507 -0
- package/tools/cli/regenerate-manifests.js +1 -1
- package/tools/cli/test-yaml-builder.js +43 -0
- package/tools/format-workflow-md.js +263 -0
- package/tools/platform-codes.yaml +6 -0
- package/tools/schema/agent.js +240 -0
- package/tools/validate-agent-schema.js +110 -0
- package/v6-open-items.md +17 -0
- package/.github/workflows/format-check.yaml +0 -43
- package/docs/codebase-flattener.md +0 -19
- package/readme.md +0 -216
- package/src/core/_module-installer/install-menu-config.yaml +0 -24
- package/src/core/agents/bmad-master.md +0 -27
- package/src/core/agents/bmad-web-orchestrator.md +0 -71
- package/src/core/tasks/shard-doc.md +0 -57
- package/src/core/tasks/workflow.md +0 -141
- package/src/core/workflows/bmad-init/instructions.md +0 -79
- package/src/core/workflows/bmad-init/workflow.yaml +0 -24
- package/src/modules/bmb/_module-installer/install-menu-config.yaml +0 -16
- package/src/modules/bmb/agents/bmad-builder.md +0 -30
- package/src/modules/bmb/workflows/create-module/installer-templates/install-module-config.yaml +0 -132
- package/src/modules/bmm/_module-installer/install-menu-config.yaml +0 -49
- package/src/modules/bmm/agents/analyst.md +0 -26
- package/src/modules/bmm/agents/architect.md +0 -29
- package/src/modules/bmm/agents/dev.md +0 -61
- package/src/modules/bmm/agents/game-architect.md +0 -26
- package/src/modules/bmm/agents/game-designer.md +0 -27
- package/src/modules/bmm/agents/game-dev.md +0 -28
- package/src/modules/bmm/agents/pm.md +0 -26
- package/src/modules/bmm/agents/po.md +0 -25
- package/src/modules/bmm/agents/sm.md +0 -29
- package/src/modules/bmm/agents/tea.md +0 -32
- package/src/modules/bmm/agents/ux-expert.md +0 -24
- package/src/modules/bmm/sub-modules/claude-code/config.yaml +0 -5
- package/src/modules/bmm/sub-modules/claude-code/injections.yaml +0 -242
- package/src/modules/bmm/sub-modules/claude-code/readme.md +0 -87
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/api-documenter.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/codebase-analyzer.md +0 -64
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/data-analyst.md +0 -84
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/dependency-mapper.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/document-reviewer.md +0 -85
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/epic-optimizer.md +0 -66
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/market-researcher.md +0 -34
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/pattern-detector.md +0 -67
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/requirements-analyst.md +0 -61
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/tech-debt-auditor.md +0 -89
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-decisions-curator.md +0 -146
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/technical-evaluator.md +0 -51
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/test-coverage-analyzer.md +0 -91
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/trend-spotter.md +0 -99
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-journey-mapper.md +0 -101
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/user-researcher.md +0 -56
- package/src/modules/bmm/tasks/daily-standup.md +0 -91
- package/src/modules/bmm/tasks/retrospective.md +0 -110
- package/src/modules/bmm/teams/team-all.yaml +0 -7
- package/src/modules/bmm/teams/team-dev.yaml +0 -14
- package/src/modules/bmm/teams/team-gamedev.yaml +0 -9
- package/src/modules/bmm/testarch/atdd.md +0 -40
- package/src/modules/bmm/testarch/automate.md +0 -38
- package/src/modules/bmm/testarch/ci.md +0 -39
- package/src/modules/bmm/testarch/framework.md +0 -41
- package/src/modules/bmm/testarch/nfr-assess.md +0 -38
- package/src/modules/bmm/testarch/risk-profile.md +0 -38
- package/src/modules/bmm/testarch/tea-commands.csv +0 -11
- package/src/modules/bmm/testarch/tea-gate.md +0 -38
- package/src/modules/bmm/testarch/tea-knowledge.md +0 -275
- package/src/modules/bmm/testarch/test-design.md +0 -39
- package/src/modules/bmm/testarch/test-levels-framework.md +0 -148
- package/src/modules/bmm/testarch/test-priorities-matrix.md +0 -174
- package/src/modules/bmm/testarch/trace-requirements.md +0 -38
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/instructions.md +0 -47
- package/src/modules/bmm/workflows/1-analysis/brainstorm-game/workflow.yaml +0 -22
- package/src/modules/bmm/workflows/1-analysis/game-brief/README.md +0 -221
- package/src/modules/bmm/workflows/1-analysis/game-brief/instructions.md +0 -517
- package/src/modules/bmm/workflows/1-analysis/game-brief/workflow.yaml +0 -34
- package/src/modules/bmm/workflows/1-analysis/product-brief/README.md +0 -180
- package/src/modules/bmm/workflows/1-analysis/research/README.md +0 -454
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-competitor-analyzer.md +0 -259
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-data-analyst.md +0 -190
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-market-researcher.md +0 -337
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-trend-spotter.md +0 -107
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/sub-agents/bmm-user-researcher.md +0 -329
- package/src/modules/bmm/workflows/2-plan/README.md +0 -203
- package/src/modules/bmm/workflows/2-plan/checklist.md +0 -369
- package/src/modules/bmm/workflows/2-plan/gdd/README.md +0 -222
- package/src/modules/bmm/workflows/2-plan/gdd/instructions-gdd.md +0 -480
- package/src/modules/bmm/workflows/2-plan/instructions-router.md +0 -222
- package/src/modules/bmm/workflows/2-plan/prd/analysis-template.md +0 -53
- package/src/modules/bmm/workflows/2-plan/prd/epics-template.md +0 -18
- package/src/modules/bmm/workflows/2-plan/prd/instructions-lg.md +0 -267
- package/src/modules/bmm/workflows/2-plan/prd/instructions-med.md +0 -251
- package/src/modules/bmm/workflows/2-plan/prd/prd-template.md +0 -73
- package/src/modules/bmm/workflows/2-plan/tech-spec/instructions-sm.md +0 -137
- package/src/modules/bmm/workflows/2-plan/tech-spec/tech-spec-template.md +0 -59
- package/src/modules/bmm/workflows/2-plan/ux/instructions-ux.md +0 -360
- package/src/modules/bmm/workflows/2-plan/ux/ux-spec-template.md +0 -162
- package/src/modules/bmm/workflows/2-plan/workflow.yaml +0 -60
- package/src/modules/bmm/workflows/3-solutioning/ADR-template.md +0 -74
- package/src/modules/bmm/workflows/3-solutioning/README.md +0 -565
- package/src/modules/bmm/workflows/3-solutioning/checklist.md +0 -170
- package/src/modules/bmm/workflows/3-solutioning/instructions.md +0 -661
- package/src/modules/bmm/workflows/3-solutioning/project-types/backend-questions.md +0 -490
- package/src/modules/bmm/workflows/3-solutioning/project-types/cli-questions.md +0 -337
- package/src/modules/bmm/workflows/3-solutioning/project-types/data-questions.md +0 -472
- package/src/modules/bmm/workflows/3-solutioning/project-types/desktop-questions.md +0 -299
- package/src/modules/bmm/workflows/3-solutioning/project-types/embedded-questions.md +0 -118
- package/src/modules/bmm/workflows/3-solutioning/project-types/extension-questions.md +0 -374
- package/src/modules/bmm/workflows/3-solutioning/project-types/game-questions.md +0 -133
- package/src/modules/bmm/workflows/3-solutioning/project-types/infra-questions.md +0 -484
- package/src/modules/bmm/workflows/3-solutioning/project-types/library-questions.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/project-types/mobile-questions.md +0 -110
- package/src/modules/bmm/workflows/3-solutioning/project-types/project-types.csv +0 -12
- package/src/modules/bmm/workflows/3-solutioning/project-types/web-questions.md +0 -136
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/README.md +0 -195
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/instructions.md +0 -73
- package/src/modules/bmm/workflows/3-solutioning/tech-spec/workflow.yaml +0 -51
- package/src/modules/bmm/workflows/3-solutioning/templates/backend-service-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/cli-tool-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/data-pipeline-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/desktop-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/embedded-firmware-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-architecture.md +0 -244
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-godot-guide.md +0 -428
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-unity-guide.md +0 -333
- package/src/modules/bmm/workflows/3-solutioning/templates/game-engine-web-guide.md +0 -528
- package/src/modules/bmm/workflows/3-solutioning/templates/infrastructure-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/library-package-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/mobile-app-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/registry.csv +0 -172
- package/src/modules/bmm/workflows/3-solutioning/templates/web-api-architecture.md +0 -66
- package/src/modules/bmm/workflows/3-solutioning/templates/web-fullstack-architecture.md +0 -277
- package/src/modules/bmm/workflows/3-solutioning/workflow.yaml +0 -65
- package/src/modules/bmm/workflows/4-implementation/create-story/README.md +0 -42
- package/src/modules/bmm/workflows/4-implementation/dev-story/README.md +0 -84
- package/src/modules/bmm/workflows/4-implementation/review-story/README.md +0 -72
- package/src/modules/bmm/workflows/4-implementation/review-story/instructions.md +0 -176
- package/src/modules/bmm/workflows/4-implementation/review-story/workflow.yaml +0 -99
- package/src/modules/bmm/workflows/4-implementation/story-context/README.md +0 -234
- package/src/modules/cis/agents/brainstorming-coach.md +0 -24
- package/src/modules/cis/agents/creative-problem-solver.md +0 -24
- package/src/modules/cis/agents/design-thinking-coach.md +0 -24
- package/src/modules/cis/agents/innovation-strategist.md +0 -24
- package/src/modules/cis/agents/storyteller.md +0 -24
- package/src/modules/cis/readme.md +0 -86
- package/tools/cli/installers/lib/ide/workflow-command-generator.js +0 -162
- package/tools/test-agents/captain-kirk-commander.md +0 -110
- package/tools/test-agents/data-operations-android.md +0 -123
- package/tools/test-agents/geordi-chief-engineer.md +0 -135
- package/tools/test-agents/isabella-martinez-ethicist.md +0 -109
- package/tools/test-agents/marcus-thompson-security.md +0 -109
- package/tools/test-agents/maya-patel-pragmatist.md +0 -82
- package/tools/test-agents/picard-diplomat-captain.md +0 -134
- package/tools/test-agents/spock-science-officer.md +0 -124
- package/tools/test-agents/william-smithers-technocrat.md +0 -71
- package/tools/test-agents/zara-chen-designer.md +0 -94
- /package/src/{modules/cis → core}/workflows/brainstorming/brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/1-analysis → bmgd/workflows/1-preproduction}/brainstorm-game/game-brain-methods.csv +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/metroidvania.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types/puzzle.md +0 -0
- /package/src/modules/{bmm/workflows/2-plan → bmgd/workflows/2-design}/gdd/game-types.csv +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/backlog_template.md +0 -0
- /package/src/modules/{bmm/workflows/4-implementation/review-story → bmgd/workflows/4-production/code-review}/checklist.md +0 -0
- /package/src/modules/bmm/_module-installer/assets/{technical-decisions-template.md → technical-decisions.md} +0 -0
|
@@ -10,6 +10,72 @@ class ConfigCollector {
|
|
|
10
10
|
constructor() {
|
|
11
11
|
this.collectedConfig = {};
|
|
12
12
|
this.existingConfig = null;
|
|
13
|
+
this.currentProjectDir = null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Find the bmad installation directory in a project
|
|
18
|
+
* V6+ installations can use ANY folder name but ALWAYS have _cfg/manifest.yaml
|
|
19
|
+
* @param {string} projectDir - Project directory
|
|
20
|
+
* @returns {Promise<string>} Path to bmad directory
|
|
21
|
+
*/
|
|
22
|
+
async findBmadDir(projectDir) {
|
|
23
|
+
// Check if project directory exists
|
|
24
|
+
if (!(await fs.pathExists(projectDir))) {
|
|
25
|
+
// Project doesn't exist yet, return default
|
|
26
|
+
return path.join(projectDir, 'bmad');
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// V6+ strategy: Look for ANY directory with _cfg/manifest.yaml
|
|
30
|
+
// This is the definitive marker of a V6+ installation
|
|
31
|
+
try {
|
|
32
|
+
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
33
|
+
for (const entry of entries) {
|
|
34
|
+
if (entry.isDirectory()) {
|
|
35
|
+
const manifestPath = path.join(projectDir, entry.name, '_cfg', 'manifest.yaml');
|
|
36
|
+
if (await fs.pathExists(manifestPath)) {
|
|
37
|
+
// Found a V6+ installation
|
|
38
|
+
return path.join(projectDir, entry.name);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
} catch {
|
|
43
|
+
// Ignore errors, fall through to default
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// No V6+ installation found, return default
|
|
47
|
+
// This will be used for new installations
|
|
48
|
+
return path.join(projectDir, 'bmad');
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Detect the existing BMAD folder name in a project
|
|
53
|
+
* @param {string} projectDir - Project directory
|
|
54
|
+
* @returns {Promise<string|null>} Folder name (just the name, not full path) or null if not found
|
|
55
|
+
*/
|
|
56
|
+
async detectExistingBmadFolder(projectDir) {
|
|
57
|
+
// Check if project directory exists
|
|
58
|
+
if (!(await fs.pathExists(projectDir))) {
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Look for ANY directory with _cfg/manifest.yaml
|
|
63
|
+
try {
|
|
64
|
+
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
65
|
+
for (const entry of entries) {
|
|
66
|
+
if (entry.isDirectory()) {
|
|
67
|
+
const manifestPath = path.join(projectDir, entry.name, '_cfg', 'manifest.yaml');
|
|
68
|
+
if (await fs.pathExists(manifestPath)) {
|
|
69
|
+
// Found a V6+ installation, return just the folder name
|
|
70
|
+
return entry.name;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
} catch {
|
|
75
|
+
// Ignore errors
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return null;
|
|
13
79
|
}
|
|
14
80
|
|
|
15
81
|
/**
|
|
@@ -17,30 +83,40 @@ class ConfigCollector {
|
|
|
17
83
|
* @param {string} projectDir - Target project directory
|
|
18
84
|
*/
|
|
19
85
|
async loadExistingConfig(projectDir) {
|
|
20
|
-
const bmadDir = path.join(projectDir, 'bmad');
|
|
21
86
|
this.existingConfig = {};
|
|
22
87
|
|
|
88
|
+
// Check if project directory exists first
|
|
89
|
+
if (!(await fs.pathExists(projectDir))) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Find the actual bmad directory (handles custom folder names)
|
|
94
|
+
const bmadDir = await this.findBmadDir(projectDir);
|
|
95
|
+
|
|
23
96
|
// Check if bmad directory exists
|
|
24
97
|
if (!(await fs.pathExists(bmadDir))) {
|
|
25
98
|
return false;
|
|
26
99
|
}
|
|
27
100
|
|
|
28
|
-
//
|
|
29
|
-
|
|
101
|
+
// Dynamically discover all installed modules by scanning bmad directory
|
|
102
|
+
// A directory is a module ONLY if it contains a config.yaml file
|
|
30
103
|
let foundAny = false;
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
104
|
+
const entries = await fs.readdir(bmadDir, { withFileTypes: true });
|
|
105
|
+
|
|
106
|
+
for (const entry of entries) {
|
|
107
|
+
if (entry.isDirectory()) {
|
|
108
|
+
const moduleConfigPath = path.join(bmadDir, entry.name, 'config.yaml');
|
|
109
|
+
if (await fs.pathExists(moduleConfigPath)) {
|
|
110
|
+
try {
|
|
111
|
+
const content = await fs.readFile(moduleConfigPath, 'utf8');
|
|
112
|
+
const moduleConfig = yaml.load(content);
|
|
113
|
+
if (moduleConfig) {
|
|
114
|
+
this.existingConfig[entry.name] = moduleConfig;
|
|
115
|
+
foundAny = true;
|
|
116
|
+
}
|
|
117
|
+
} catch {
|
|
118
|
+
// Ignore parse errors for individual modules
|
|
41
119
|
}
|
|
42
|
-
} catch {
|
|
43
|
-
// Ignore parse errors for individual modules
|
|
44
120
|
}
|
|
45
121
|
}
|
|
46
122
|
}
|
|
@@ -85,6 +161,204 @@ class ConfigCollector {
|
|
|
85
161
|
return this.collectedConfig;
|
|
86
162
|
}
|
|
87
163
|
|
|
164
|
+
/**
|
|
165
|
+
* Collect configuration for a single module (Quick Update mode - only new fields)
|
|
166
|
+
* @param {string} moduleName - Module name
|
|
167
|
+
* @param {string} projectDir - Target project directory
|
|
168
|
+
* @param {boolean} silentMode - If true, only prompt for new/missing fields
|
|
169
|
+
* @returns {boolean} True if new fields were prompted, false if all fields existed
|
|
170
|
+
*/
|
|
171
|
+
async collectModuleConfigQuick(moduleName, projectDir, silentMode = true) {
|
|
172
|
+
this.currentProjectDir = projectDir;
|
|
173
|
+
|
|
174
|
+
// Load existing config if not already loaded
|
|
175
|
+
if (!this.existingConfig) {
|
|
176
|
+
await this.loadExistingConfig(projectDir);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Initialize allAnswers if not already initialized
|
|
180
|
+
if (!this.allAnswers) {
|
|
181
|
+
this.allAnswers = {};
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Load module's install config schema
|
|
185
|
+
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
|
|
186
|
+
const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
|
|
187
|
+
|
|
188
|
+
let configPath = null;
|
|
189
|
+
if (await fs.pathExists(installerConfigPath)) {
|
|
190
|
+
configPath = installerConfigPath;
|
|
191
|
+
} else if (await fs.pathExists(legacyConfigPath)) {
|
|
192
|
+
configPath = legacyConfigPath;
|
|
193
|
+
} else {
|
|
194
|
+
// No config schema for this module - use existing values
|
|
195
|
+
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
196
|
+
if (!this.collectedConfig[moduleName]) {
|
|
197
|
+
this.collectedConfig[moduleName] = {};
|
|
198
|
+
}
|
|
199
|
+
this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
const configContent = await fs.readFile(configPath, 'utf8');
|
|
205
|
+
const moduleConfig = yaml.load(configContent);
|
|
206
|
+
|
|
207
|
+
if (!moduleConfig) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Compare schema with existing config to find new/missing fields
|
|
212
|
+
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
213
|
+
const existingKeys = this.existingConfig && this.existingConfig[moduleName] ? Object.keys(this.existingConfig[moduleName]) : [];
|
|
214
|
+
|
|
215
|
+
const newKeys = configKeys.filter((key) => {
|
|
216
|
+
const item = moduleConfig[key];
|
|
217
|
+
// Check if it's a config item and doesn't exist in existing config
|
|
218
|
+
return item && typeof item === 'object' && item.prompt && !existingKeys.includes(key);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// If in silent mode and no new keys, use existing config and skip prompts
|
|
222
|
+
if (silentMode && newKeys.length === 0) {
|
|
223
|
+
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
224
|
+
if (!this.collectedConfig[moduleName]) {
|
|
225
|
+
this.collectedConfig[moduleName] = {};
|
|
226
|
+
}
|
|
227
|
+
this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
|
|
228
|
+
|
|
229
|
+
// Also populate allAnswers for cross-referencing
|
|
230
|
+
for (const [key, value] of Object.entries(this.existingConfig[moduleName])) {
|
|
231
|
+
this.allAnswers[`${moduleName}_${key}`] = value;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Show "no config" message for modules with no new questions
|
|
235
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
236
|
+
return false; // No new fields
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// If we have new fields, build questions first
|
|
240
|
+
if (newKeys.length > 0) {
|
|
241
|
+
const questions = [];
|
|
242
|
+
for (const key of newKeys) {
|
|
243
|
+
const item = moduleConfig[key];
|
|
244
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
245
|
+
if (question) {
|
|
246
|
+
questions.push(question);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (questions.length > 0) {
|
|
251
|
+
// Only show header if we actually have questions
|
|
252
|
+
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
253
|
+
console.log(); // Line break before questions
|
|
254
|
+
const answers = await inquirer.prompt(questions);
|
|
255
|
+
|
|
256
|
+
// Store answers for cross-referencing
|
|
257
|
+
Object.assign(this.allAnswers, answers);
|
|
258
|
+
|
|
259
|
+
// Process answers and build result values
|
|
260
|
+
for (const key of Object.keys(answers)) {
|
|
261
|
+
const originalKey = key.replace(`${moduleName}_`, '');
|
|
262
|
+
const item = moduleConfig[originalKey];
|
|
263
|
+
const value = answers[key];
|
|
264
|
+
|
|
265
|
+
let result;
|
|
266
|
+
if (Array.isArray(value)) {
|
|
267
|
+
result = value;
|
|
268
|
+
} else if (item.result) {
|
|
269
|
+
result = this.processResultTemplate(item.result, value);
|
|
270
|
+
} else {
|
|
271
|
+
result = value;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (!this.collectedConfig[moduleName]) {
|
|
275
|
+
this.collectedConfig[moduleName] = {};
|
|
276
|
+
}
|
|
277
|
+
this.collectedConfig[moduleName][originalKey] = result;
|
|
278
|
+
}
|
|
279
|
+
} else {
|
|
280
|
+
// New keys exist but no questions generated - show no config message
|
|
281
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Copy over existing values for fields that weren't prompted
|
|
286
|
+
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
287
|
+
if (!this.collectedConfig[moduleName]) {
|
|
288
|
+
this.collectedConfig[moduleName] = {};
|
|
289
|
+
}
|
|
290
|
+
for (const [key, value] of Object.entries(this.existingConfig[moduleName])) {
|
|
291
|
+
if (!this.collectedConfig[moduleName][key]) {
|
|
292
|
+
this.collectedConfig[moduleName][key] = value;
|
|
293
|
+
this.allAnswers[`${moduleName}_${key}`] = value;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return newKeys.length > 0; // Return true if we prompted for new fields
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Process a result template with value substitution
|
|
303
|
+
* @param {*} resultTemplate - The result template
|
|
304
|
+
* @param {*} value - The value to substitute
|
|
305
|
+
* @returns {*} Processed result
|
|
306
|
+
*/
|
|
307
|
+
processResultTemplate(resultTemplate, value) {
|
|
308
|
+
let result = resultTemplate;
|
|
309
|
+
|
|
310
|
+
if (typeof result === 'string' && value !== undefined) {
|
|
311
|
+
if (typeof value === 'string') {
|
|
312
|
+
result = result.replace('{value}', value);
|
|
313
|
+
} else if (typeof value === 'boolean' || typeof value === 'number') {
|
|
314
|
+
if (result === '{value}') {
|
|
315
|
+
result = value;
|
|
316
|
+
} else {
|
|
317
|
+
result = result.replace('{value}', value);
|
|
318
|
+
}
|
|
319
|
+
} else {
|
|
320
|
+
result = value;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if (typeof result === 'string') {
|
|
324
|
+
result = result.replaceAll(/{([^}]+)}/g, (match, configKey) => {
|
|
325
|
+
if (configKey === 'project-root') {
|
|
326
|
+
return '{project-root}';
|
|
327
|
+
}
|
|
328
|
+
if (configKey === 'value') {
|
|
329
|
+
return match;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
let configValue = this.allAnswers[configKey] || this.allAnswers[`${configKey}`];
|
|
333
|
+
if (!configValue) {
|
|
334
|
+
for (const [answerKey, answerValue] of Object.entries(this.allAnswers)) {
|
|
335
|
+
if (answerKey.endsWith(`_${configKey}`)) {
|
|
336
|
+
configValue = answerValue;
|
|
337
|
+
break;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (!configValue) {
|
|
343
|
+
for (const mod of Object.keys(this.collectedConfig)) {
|
|
344
|
+
if (mod !== '_meta' && this.collectedConfig[mod] && this.collectedConfig[mod][configKey]) {
|
|
345
|
+
configValue = this.collectedConfig[mod][configKey];
|
|
346
|
+
if (typeof configValue === 'string' && configValue.includes('{project-root}/')) {
|
|
347
|
+
configValue = configValue.replace('{project-root}/', '');
|
|
348
|
+
}
|
|
349
|
+
break;
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return configValue || match;
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
return result;
|
|
360
|
+
}
|
|
361
|
+
|
|
88
362
|
/**
|
|
89
363
|
* Collect configuration for a single module
|
|
90
364
|
* @param {string} moduleName - Module name
|
|
@@ -93,6 +367,7 @@ class ConfigCollector {
|
|
|
93
367
|
* @param {boolean} skipCompletion - Skip showing completion message (for early core collection)
|
|
94
368
|
*/
|
|
95
369
|
async collectModuleConfig(moduleName, projectDir, skipLoadExisting = false, skipCompletion = false) {
|
|
370
|
+
this.currentProjectDir = projectDir;
|
|
96
371
|
// Load existing config if needed and not already loaded
|
|
97
372
|
if (!skipLoadExisting && !this.existingConfig) {
|
|
98
373
|
await this.loadExistingConfig(projectDir);
|
|
@@ -103,7 +378,7 @@ class ConfigCollector {
|
|
|
103
378
|
this.allAnswers = {};
|
|
104
379
|
}
|
|
105
380
|
// Load module's config.yaml (check new location first, then fallback)
|
|
106
|
-
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-
|
|
381
|
+
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
|
|
107
382
|
const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
|
|
108
383
|
|
|
109
384
|
let configPath = null;
|
|
@@ -123,12 +398,6 @@ class ConfigCollector {
|
|
|
123
398
|
return;
|
|
124
399
|
}
|
|
125
400
|
|
|
126
|
-
// Display module prompts using better formatting
|
|
127
|
-
if (moduleConfig.prompt) {
|
|
128
|
-
const prompts = Array.isArray(moduleConfig.prompt) ? moduleConfig.prompt : [moduleConfig.prompt];
|
|
129
|
-
CLIUtils.displayPromptSection(prompts);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
401
|
// Process each config item
|
|
133
402
|
const questions = [];
|
|
134
403
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
@@ -141,13 +410,15 @@ class ConfigCollector {
|
|
|
141
410
|
continue;
|
|
142
411
|
}
|
|
143
412
|
|
|
144
|
-
const question = await this.buildQuestion(moduleName, key, item);
|
|
413
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
145
414
|
if (question) {
|
|
146
415
|
questions.push(question);
|
|
147
416
|
}
|
|
148
417
|
}
|
|
149
418
|
|
|
419
|
+
// Display appropriate header based on whether there are questions
|
|
150
420
|
if (questions.length > 0) {
|
|
421
|
+
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
151
422
|
console.log(); // Line break before questions
|
|
152
423
|
const answers = await inquirer.prompt(questions);
|
|
153
424
|
|
|
@@ -248,20 +519,68 @@ class ConfigCollector {
|
|
|
248
519
|
this.collectedConfig[moduleName][originalKey] = result;
|
|
249
520
|
}
|
|
250
521
|
|
|
251
|
-
//
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
522
|
+
// No longer display completion boxes - keep output clean
|
|
523
|
+
} else {
|
|
524
|
+
// No questions for this module - show completion message
|
|
525
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
255
526
|
}
|
|
256
527
|
}
|
|
257
528
|
|
|
529
|
+
/**
|
|
530
|
+
* Replace placeholders in a string with collected config values
|
|
531
|
+
* @param {string} str - String with placeholders
|
|
532
|
+
* @param {string} currentModule - Current module name (to look up defaults in same module)
|
|
533
|
+
* @param {Object} moduleConfig - Current module's config schema (to look up defaults)
|
|
534
|
+
* @returns {string} String with placeholders replaced
|
|
535
|
+
*/
|
|
536
|
+
replacePlaceholders(str, currentModule = null, moduleConfig = null) {
|
|
537
|
+
if (typeof str !== 'string') {
|
|
538
|
+
return str;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
return str.replaceAll(/{([^}]+)}/g, (match, configKey) => {
|
|
542
|
+
// Preserve special placeholders
|
|
543
|
+
if (configKey === 'project-root' || configKey === 'value' || configKey === 'directory_name') {
|
|
544
|
+
return match;
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
// Look for the config value in allAnswers (already answered questions)
|
|
548
|
+
let configValue = this.allAnswers[configKey] || this.allAnswers[`core_${configKey}`];
|
|
549
|
+
|
|
550
|
+
// Check in already collected config
|
|
551
|
+
if (!configValue) {
|
|
552
|
+
for (const mod of Object.keys(this.collectedConfig)) {
|
|
553
|
+
if (mod !== '_meta' && this.collectedConfig[mod] && this.collectedConfig[mod][configKey]) {
|
|
554
|
+
configValue = this.collectedConfig[mod][configKey];
|
|
555
|
+
// Remove {project-root}/ prefix if present for cleaner display
|
|
556
|
+
if (typeof configValue === 'string' && configValue.includes('{project-root}/')) {
|
|
557
|
+
configValue = configValue.replace('{project-root}/', '');
|
|
558
|
+
}
|
|
559
|
+
break;
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
// If still not found and we're in the same module, use the default from the config schema
|
|
565
|
+
if (!configValue && currentModule && moduleConfig && moduleConfig[configKey]) {
|
|
566
|
+
const referencedItem = moduleConfig[configKey];
|
|
567
|
+
if (referencedItem && referencedItem.default !== undefined) {
|
|
568
|
+
configValue = referencedItem.default;
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
return configValue || match;
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
|
|
258
576
|
/**
|
|
259
577
|
* Build an inquirer question from a config item
|
|
260
578
|
* @param {string} moduleName - Module name
|
|
261
579
|
* @param {string} key - Config key
|
|
262
580
|
* @param {Object} item - Config item definition
|
|
581
|
+
* @param {Object} moduleConfig - Full module config schema (for resolving defaults)
|
|
263
582
|
*/
|
|
264
|
-
async buildQuestion(moduleName, key, item) {
|
|
583
|
+
async buildQuestion(moduleName, key, item, moduleConfig = null) {
|
|
265
584
|
const questionName = `${moduleName}_${key}`;
|
|
266
585
|
|
|
267
586
|
// Check for existing value
|
|
@@ -276,29 +595,104 @@ class ConfigCollector {
|
|
|
276
595
|
}
|
|
277
596
|
}
|
|
278
597
|
|
|
598
|
+
// Special handling for bmad_folder: detect existing folder name
|
|
599
|
+
if (moduleName === 'core' && key === 'bmad_folder' && !existingValue && this.currentProjectDir) {
|
|
600
|
+
// Try to detect the existing BMAD folder name
|
|
601
|
+
const detectedFolder = await this.detectExistingBmadFolder(this.currentProjectDir);
|
|
602
|
+
if (detectedFolder) {
|
|
603
|
+
existingValue = detectedFolder;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
279
607
|
// Determine question type and default value
|
|
280
608
|
let questionType = 'input';
|
|
281
609
|
let defaultValue = item.default;
|
|
282
610
|
let choices = null;
|
|
283
611
|
|
|
612
|
+
// Check if default contains references to other fields in the same module
|
|
613
|
+
const hasSameModuleReference = typeof defaultValue === 'string' && defaultValue.match(/{([^}]+)}/);
|
|
614
|
+
let dynamicDefault = false;
|
|
615
|
+
|
|
616
|
+
// Replace placeholders in default value with collected config values
|
|
617
|
+
if (typeof defaultValue === 'string') {
|
|
618
|
+
if (defaultValue.includes('{directory_name}') && this.currentProjectDir) {
|
|
619
|
+
const dirName = path.basename(this.currentProjectDir);
|
|
620
|
+
defaultValue = defaultValue.replaceAll('{directory_name}', dirName);
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// Check if this references another field in the same module (for dynamic defaults)
|
|
624
|
+
if (hasSameModuleReference && moduleConfig) {
|
|
625
|
+
const matches = defaultValue.match(/{([^}]+)}/g);
|
|
626
|
+
if (matches) {
|
|
627
|
+
for (const match of matches) {
|
|
628
|
+
const fieldName = match.slice(1, -1); // Remove { }
|
|
629
|
+
// Check if this field exists in the same module config
|
|
630
|
+
if (moduleConfig[fieldName]) {
|
|
631
|
+
dynamicDefault = true;
|
|
632
|
+
break;
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
// If not dynamic, replace placeholders now
|
|
639
|
+
if (!dynamicDefault) {
|
|
640
|
+
defaultValue = this.replacePlaceholders(defaultValue, moduleName, moduleConfig);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// Strip {project-root}/ from defaults since it will be added back by result template
|
|
644
|
+
// This makes the display cleaner and user input simpler
|
|
645
|
+
if (defaultValue.includes('{project-root}/')) {
|
|
646
|
+
defaultValue = defaultValue.replace('{project-root}/', '');
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
|
|
284
650
|
// Handle different question types
|
|
285
651
|
if (item['single-select']) {
|
|
286
652
|
questionType = 'list';
|
|
287
|
-
choices = item['single-select']
|
|
288
|
-
|
|
653
|
+
choices = item['single-select'].map((choice) => {
|
|
654
|
+
// If choice is an object with label and value
|
|
655
|
+
if (typeof choice === 'object' && choice.label && choice.value !== undefined) {
|
|
656
|
+
return {
|
|
657
|
+
name: choice.label,
|
|
658
|
+
value: choice.value,
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
// Otherwise it's a simple string choice
|
|
662
|
+
return {
|
|
663
|
+
name: choice,
|
|
664
|
+
value: choice,
|
|
665
|
+
};
|
|
666
|
+
});
|
|
667
|
+
if (existingValue) {
|
|
289
668
|
defaultValue = existingValue;
|
|
290
669
|
}
|
|
291
670
|
} else if (item['multi-select']) {
|
|
292
671
|
questionType = 'checkbox';
|
|
293
|
-
choices = item['multi-select'].map((choice) =>
|
|
294
|
-
|
|
295
|
-
value
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
672
|
+
choices = item['multi-select'].map((choice) => {
|
|
673
|
+
// If choice is an object with label and value
|
|
674
|
+
if (typeof choice === 'object' && choice.label && choice.value !== undefined) {
|
|
675
|
+
return {
|
|
676
|
+
name: choice.label,
|
|
677
|
+
value: choice.value,
|
|
678
|
+
checked: existingValue
|
|
679
|
+
? existingValue.includes(choice.value)
|
|
680
|
+
: item.default && Array.isArray(item.default)
|
|
681
|
+
? item.default.includes(choice.value)
|
|
682
|
+
: false,
|
|
683
|
+
};
|
|
684
|
+
}
|
|
685
|
+
// Otherwise it's a simple string choice
|
|
686
|
+
return {
|
|
687
|
+
name: choice,
|
|
688
|
+
value: choice,
|
|
689
|
+
checked: existingValue
|
|
690
|
+
? existingValue.includes(choice)
|
|
691
|
+
: item.default && Array.isArray(item.default)
|
|
692
|
+
? item.default.includes(choice)
|
|
693
|
+
: false,
|
|
694
|
+
};
|
|
695
|
+
});
|
|
302
696
|
} else if (typeof defaultValue === 'boolean') {
|
|
303
697
|
questionType = 'confirm';
|
|
304
698
|
}
|
|
@@ -313,31 +707,67 @@ class ConfigCollector {
|
|
|
313
707
|
message = item.prompt;
|
|
314
708
|
}
|
|
315
709
|
|
|
710
|
+
// Replace placeholders in prompt message with collected config values
|
|
711
|
+
if (typeof message === 'string') {
|
|
712
|
+
message = this.replacePlaceholders(message, moduleName, moduleConfig);
|
|
713
|
+
}
|
|
714
|
+
|
|
316
715
|
// Add current value indicator for existing configs
|
|
317
716
|
if (existingValue !== null && existingValue !== undefined) {
|
|
318
717
|
if (typeof existingValue === 'boolean') {
|
|
319
718
|
message += chalk.dim(` (current: ${existingValue ? 'true' : 'false'})`);
|
|
320
|
-
defaultValue = existingValue;
|
|
321
719
|
} else if (Array.isArray(existingValue)) {
|
|
322
720
|
message += chalk.dim(` (current: ${existingValue.join(', ')})`);
|
|
323
721
|
} else if (questionType !== 'list') {
|
|
324
722
|
// Show the cleaned value (without {project-root}/) for display
|
|
325
723
|
message += chalk.dim(` (current: ${existingValue})`);
|
|
326
|
-
defaultValue = existingValue;
|
|
327
724
|
}
|
|
328
725
|
} else if (item.example && questionType === 'input') {
|
|
329
726
|
// Show example for input fields
|
|
330
|
-
|
|
727
|
+
let exampleText = typeof item.example === 'string' ? item.example : JSON.stringify(item.example);
|
|
728
|
+
// Replace placeholders in example
|
|
729
|
+
if (typeof exampleText === 'string') {
|
|
730
|
+
exampleText = this.replacePlaceholders(exampleText, moduleName, moduleConfig);
|
|
731
|
+
exampleText = exampleText.replace('{project-root}/', '');
|
|
732
|
+
}
|
|
331
733
|
message += chalk.dim(` (e.g., ${exampleText})`);
|
|
332
734
|
}
|
|
333
735
|
|
|
736
|
+
// Build the question object
|
|
334
737
|
const question = {
|
|
335
738
|
type: questionType,
|
|
336
739
|
name: questionName,
|
|
337
740
|
message: message,
|
|
338
|
-
default: defaultValue,
|
|
339
741
|
};
|
|
340
742
|
|
|
743
|
+
// Set default - if it's dynamic, use a function that inquirer will evaluate with current answers
|
|
744
|
+
// But if we have an existing value, always use that instead
|
|
745
|
+
if (existingValue !== null && existingValue !== undefined && questionType !== 'list') {
|
|
746
|
+
question.default = existingValue;
|
|
747
|
+
} else if (dynamicDefault && typeof item.default === 'string') {
|
|
748
|
+
const originalDefault = item.default;
|
|
749
|
+
question.default = (answers) => {
|
|
750
|
+
// Replace placeholders using answers from previous questions in the same batch
|
|
751
|
+
let resolved = originalDefault;
|
|
752
|
+
resolved = resolved.replaceAll(/{([^}]+)}/g, (match, fieldName) => {
|
|
753
|
+
// Look for the answer in the current batch (prefixed with module name)
|
|
754
|
+
const answerKey = `${moduleName}_${fieldName}`;
|
|
755
|
+
if (answers[answerKey] !== undefined) {
|
|
756
|
+
return answers[answerKey];
|
|
757
|
+
}
|
|
758
|
+
// Fall back to collected config
|
|
759
|
+
return this.collectedConfig[moduleName]?.[fieldName] || match;
|
|
760
|
+
});
|
|
761
|
+
// Strip {project-root}/ for cleaner display
|
|
762
|
+
if (resolved.includes('{project-root}/')) {
|
|
763
|
+
resolved = resolved.replace('{project-root}/', '');
|
|
764
|
+
}
|
|
765
|
+
return resolved;
|
|
766
|
+
};
|
|
767
|
+
} else {
|
|
768
|
+
question.default = defaultValue;
|
|
769
|
+
}
|
|
770
|
+
|
|
341
771
|
// Add choices for select types
|
|
342
772
|
if (choices) {
|
|
343
773
|
question.choices = choices;
|
|
@@ -349,6 +779,23 @@ class ConfigCollector {
|
|
|
349
779
|
if (!input && item.required) {
|
|
350
780
|
return 'This field is required';
|
|
351
781
|
}
|
|
782
|
+
// Validate against regex pattern if provided
|
|
783
|
+
if (input && item.regex) {
|
|
784
|
+
const regex = new RegExp(item.regex);
|
|
785
|
+
if (!regex.test(input)) {
|
|
786
|
+
return `Invalid format. Must match pattern: ${item.regex}`;
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
return true;
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
// Add validation for checkbox (multi-select) fields
|
|
794
|
+
if (questionType === 'checkbox' && item.required) {
|
|
795
|
+
question.validate = (answers) => {
|
|
796
|
+
if (!answers || answers.length === 0) {
|
|
797
|
+
return 'At least one option must be selected';
|
|
798
|
+
}
|
|
352
799
|
return true;
|
|
353
800
|
};
|
|
354
801
|
}
|
|
@@ -599,6 +599,7 @@ class DependencyResolver {
|
|
|
599
599
|
organized[module] = {
|
|
600
600
|
agents: [],
|
|
601
601
|
tasks: [],
|
|
602
|
+
tools: [],
|
|
602
603
|
templates: [],
|
|
603
604
|
data: [],
|
|
604
605
|
other: [],
|
|
@@ -626,6 +627,8 @@ class DependencyResolver {
|
|
|
626
627
|
organized[module].agents.push(file);
|
|
627
628
|
} else if (relative.startsWith('tasks/') || file.includes('/tasks/')) {
|
|
628
629
|
organized[module].tasks.push(file);
|
|
630
|
+
} else if (relative.startsWith('tools/') || file.includes('/tools/')) {
|
|
631
|
+
organized[module].tools.push(file);
|
|
629
632
|
} else if (relative.includes('template') || file.includes('/templates/')) {
|
|
630
633
|
organized[module].templates.push(file);
|
|
631
634
|
} else if (relative.includes('data/')) {
|
|
@@ -646,7 +649,8 @@ class DependencyResolver {
|
|
|
646
649
|
|
|
647
650
|
for (const [module, files] of Object.entries(organized)) {
|
|
648
651
|
const isSelected = selectedModules.includes(module) || module === 'core';
|
|
649
|
-
const totalFiles =
|
|
652
|
+
const totalFiles =
|
|
653
|
+
files.agents.length + files.tasks.length + files.tools.length + files.templates.length + files.data.length + files.other.length;
|
|
650
654
|
|
|
651
655
|
if (totalFiles > 0) {
|
|
652
656
|
console.log(chalk.cyan(`\n ${module.toUpperCase()} module:`));
|