bmad-method 6.0.0-alpha.7 → 6.0.0-alpha.9
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/idea_submission.md +1 -1
- package/.github/workflows/bundle-latest.yaml +277 -0
- package/.github/workflows/manual-release.yaml +55 -16
- package/.vscode/settings.json +2 -1
- package/CHANGELOG.md +439 -1
- package/README.md +12 -4
- package/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
- package/docs/agent-customization-guide.md +208 -0
- 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 +1 -1
- package/docs/index.md +3 -1
- package/docs/installers-bundlers/ide-injections.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +23 -23
- package/docs/v4-to-v6-upgrade.md +12 -12
- package/docs/web-bundles-gemini-gpt-guide.md +473 -0
- package/package.json +1 -1
- package/src/core/_module-installer/install-config.yaml +17 -10
- package/src/core/_module-installer/installer.js +0 -8
- package/src/core/agents/bmad-master.agent.yaml +5 -5
- package/src/core/agents/bmad-web-orchestrator.agent.xml +8 -17
- package/src/core/tasks/{adv-elicit.xml → advanced-elicitation.xml} +6 -4
- package/src/core/tasks/index-docs.xml +1 -1
- package/src/core/tasks/validate-workflow.xml +1 -1
- package/src/core/tasks/workflow.xml +125 -11
- package/src/core/tools/shard-doc.xml +45 -1
- package/src/core/workflows/brainstorming/README.md +6 -16
- package/src/core/workflows/brainstorming/instructions.md +6 -5
- package/src/core/workflows/brainstorming/template.md +4 -0
- package/src/core/workflows/brainstorming/workflow.yaml +8 -8
- package/src/core/workflows/party-mode/instructions.md +2 -7
- package/src/core/workflows/party-mode/workflow.yaml +10 -6
- package/src/modules/bmb/_module-installer/install-config.yaml +9 -4
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +11 -10
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +5 -6
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +5 -5
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +2 -2
- package/src/modules/bmb/workflows/convert-legacy/README.md +5 -5
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +2 -2
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +17 -17
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +6 -6
- package/src/modules/bmb/workflows/create-agent/README.md +5 -5
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +15 -19
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +28 -28
- package/src/modules/bmb/workflows/create-agent/agent-types.md +15 -15
- package/src/modules/bmb/workflows/create-agent/checklist.md +3 -3
- package/src/modules/bmb/workflows/create-agent/instructions.md +24 -27
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +12 -12
- package/src/modules/bmb/workflows/create-module/README.md +1 -1
- package/src/modules/bmb/workflows/create-module/checklist.md +1 -10
- package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +1 -1
- package/src/modules/bmb/workflows/create-module/instructions.md +12 -17
- package/src/modules/bmb/workflows/create-module/module-structure.md +7 -7
- package/src/modules/bmb/workflows/create-module/workflow.yaml +9 -9
- package/src/modules/bmb/workflows/create-workflow/README.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/checklist.md +1 -1
- package/src/modules/bmb/workflows/create-workflow/instructions.md +29 -29
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +40 -42
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +2 -2
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +12 -12
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +5 -5
- package/src/modules/bmb/workflows/edit-agent/checklist.md +1 -1
- package/src/modules/bmb/workflows/edit-agent/instructions.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +8 -8
- package/src/modules/bmb/workflows/edit-module/README.md +2 -2
- package/src/modules/bmb/workflows/edit-module/checklist.md +2 -2
- package/src/modules/bmb/workflows/edit-module/instructions.md +4 -4
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +10 -10
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +4 -4
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +5 -5
- package/src/modules/bmb/workflows/module-brief/README.md +2 -2
- package/src/modules/bmb/workflows/module-brief/checklist.md +2 -2
- package/src/modules/bmb/workflows/module-brief/instructions.md +2 -2
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +4 -4
- package/src/modules/bmb/workflows/redoc/README.md +5 -5
- package/src/modules/bmb/workflows/redoc/instructions.md +1 -1
- package/src/modules/bmb/workflows/redoc/workflow.yaml +1 -1
- package/src/modules/bmgd/README.md +1 -1
- package/src/modules/bmgd/_module-installer/install-config.yaml +12 -24
- package/src/modules/bmgd/agents/game-architect.agent.yaml +15 -10
- package/src/modules/bmgd/agents/game-designer.agent.yaml +16 -11
- package/src/modules/bmgd/agents/game-dev.agent.yaml +18 -12
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +30 -25
- package/src/modules/bmgd/teams/default-party.csv +10 -0
- package/src/modules/bmgd/teams/team-gamedev.yaml +2 -0
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +1 -1
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +9 -9
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +1 -1
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +8 -8
- package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +5 -10
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +30 -30
- package/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md +1 -6
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +5 -5
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +0 -26
- package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +2 -6
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +2 -7
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +25 -47
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +13 -32
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +7 -2
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +32 -25
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +20 -47
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +16 -24
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +8 -3
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +30 -5
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +10 -35
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +16 -24
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +18 -36
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +16 -37
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +11 -15
- package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +1 -1
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +8 -7
- package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +1 -1
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +20 -45
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +15 -17
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +1 -1
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +5 -4
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +6 -6
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +5 -7
- package/src/modules/bmm/_module-installer/install-config.yaml +9 -28
- package/src/modules/bmm/_module-installer/installer.js +2 -2
- package/src/modules/bmm/agents/analyst.agent.yaml +20 -15
- package/src/modules/bmm/agents/architect.agent.yaml +17 -12
- package/src/modules/bmm/agents/dev.agent.yaml +9 -12
- package/src/modules/bmm/agents/pm.agent.yaml +24 -23
- package/src/modules/bmm/agents/sm.agent.yaml +24 -19
- package/src/modules/bmm/agents/tea.agent.yaml +23 -17
- package/src/modules/bmm/agents/tech-writer.agent.yaml +15 -11
- package/src/modules/bmm/agents/ux-designer.agent.yaml +16 -11
- package/src/modules/bmm/docs/agents-guide.md +4 -4
- package/src/modules/bmm/docs/brownfield-guide.md +4 -4
- package/src/modules/bmm/docs/enterprise-agentic-development.md +3 -3
- package/src/modules/bmm/docs/faq.md +1 -1
- package/src/modules/bmm/docs/party-mode.md +3 -3
- package/src/modules/bmm/docs/quick-start.md +1 -1
- package/src/modules/bmm/docs/test-architecture.md +1 -1
- package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
- package/src/modules/bmm/teams/default-party.csv +19 -0
- package/src/modules/bmm/teams/team-fullstack.yaml +1 -0
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +8 -8
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +8 -21
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +10 -12
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +13 -9
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +1 -3
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +2 -7
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +1 -6
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +14 -14
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +7 -2
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +16 -10
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +8 -12
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/epics-template.md +28 -0
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/instructions.md +146 -23
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/workflow.yaml +7 -9
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +152 -35
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +2 -2
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +20 -16
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +12 -9
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -6
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +434 -0
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +129 -266
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +15 -37
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +0 -26
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +3 -7
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +30 -38
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +25 -43
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +7 -13
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +57 -60
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +12 -12
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +25 -47
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +13 -32
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +7 -2
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +32 -25
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +20 -47
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +16 -24
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +8 -3
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +30 -5
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +10 -35
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +16 -24
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +18 -36
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +16 -37
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +11 -15
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +1 -1
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +8 -7
- 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 +20 -45
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +15 -17
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +5 -4
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +6 -6
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +5 -7
- package/src/modules/bmm/workflows/document-project/checklist.md +1 -1
- package/src/modules/bmm/workflows/document-project/instructions.md +5 -5
- package/src/modules/bmm/workflows/document-project/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +4 -4
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +5 -5
- package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +13 -13
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +5 -5
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +4 -4
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/framework/checklist.md +4 -4
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +2 -2
- package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +1 -1
- package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +4 -4
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +175 -14
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +4 -4
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +7 -3
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +1 -1
- package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/trace/instructions.md +9 -9
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +33 -31
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +5 -4
- package/src/modules/bmm/workflows/workflow-status/instructions.md +5 -4
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +9 -16
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +11 -18
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +8 -1
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +9 -2
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +1 -1
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +2 -9
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +2 -2
- package/src/modules/cis/README.md +1 -1
- package/src/modules/cis/_module-installer/install-config.yaml +6 -4
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +13 -8
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +13 -8
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +13 -8
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +13 -8
- package/src/modules/cis/agents/storyteller.agent.yaml +13 -8
- 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 +1 -1
- package/src/modules/cis/workflows/design-thinking/instructions.md +2 -2
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +7 -7
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +2 -2
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +7 -7
- package/src/modules/cis/workflows/problem-solving/instructions.md +2 -2
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +7 -7
- package/src/modules/cis/workflows/storytelling/instructions.md +2 -2
- package/src/modules/cis/workflows/storytelling/workflow.yaml +7 -7
- package/src/utility/models/action-command-header.md +0 -0
- package/src/utility/models/agent-activation-ide.xml +3 -3
- package/src/utility/models/agent-activation-web.xml +4 -4
- package/src/utility/models/agent-command-header.md +1 -0
- package/src/utility/models/fragments/activation-steps.xml +3 -2
- package/src/utility/models/fragments/handler-validate-workflow.xml +1 -1
- package/src/utility/models/fragments/handler-workflow.xml +1 -1
- package/src/utility/models/fragments/web-bundle-activation-steps.xml +3 -3
- package/tools/cli/README.md +50 -32
- package/tools/cli/bundlers/web-bundler.js +86 -17
- package/tools/cli/commands/install.js +1 -4
- package/tools/cli/installers/lib/core/config-collector.js +201 -28
- package/tools/cli/installers/lib/core/detector.js +62 -7
- package/tools/cli/installers/lib/core/installer.js +175 -33
- package/tools/cli/installers/lib/core/manifest-generator.js +26 -115
- package/tools/cli/installers/lib/ide/_base-ide.js +57 -3
- package/tools/cli/installers/lib/ide/auggie.js +78 -224
- package/tools/cli/installers/lib/ide/claude-code.js +14 -22
- package/tools/cli/installers/lib/ide/cline.js +15 -18
- package/tools/cli/installers/lib/ide/codex.js +17 -48
- package/tools/cli/installers/lib/ide/crush.js +14 -50
- package/tools/cli/installers/lib/ide/cursor.js +51 -8
- package/tools/cli/installers/lib/ide/gemini.js +87 -37
- package/tools/cli/installers/lib/ide/github-copilot.js +47 -35
- 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 +15 -0
- package/tools/cli/installers/lib/ide/opencode.js +16 -17
- package/tools/cli/installers/lib/ide/qwen.js +39 -11
- 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/{task-tool-command-generator.js → shared/task-tool-command-generator.js} +1 -1
- package/tools/cli/installers/lib/ide/{workflow-command-generator.js → shared/workflow-command-generator.js} +11 -9
- 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} +3 -5
- package/tools/cli/installers/lib/ide/trae.js +20 -32
- package/tools/cli/installers/lib/ide/windsurf.js +18 -8
- package/tools/cli/installers/lib/modules/manager.js +89 -17
- package/tools/cli/lib/cli-utils.js +52 -50
- package/tools/cli/lib/ui.js +29 -12
- package/tools/cli/lib/yaml-xml-builder.js +20 -2
- package/tools/schema/agent.js +7 -3
- package/.claude/commands/bmad/bmb/agents/bmad-builder.md +0 -70
- package/.claude/commands/bmad/bmb/workflows/audit-workflow.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/convert-legacy.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/create-agent.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/create-module.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/create-workflow.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/edit-agent.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/edit-module.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/edit-workflow.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/module-brief.md +0 -15
- package/.claude/commands/bmad/bmb/workflows/redoc.md +0 -15
- package/.claude/commands/bmad/core/agents/bmad-master.md +0 -71
- package/.claude/commands/bmad/core/tasks/index-docs.md +0 -9
- package/.claude/commands/bmad/core/tools/shard-doc.md +0 -9
- package/.claude/commands/bmad/core/workflows/brainstorming.md +0 -15
- package/.claude/commands/bmad/core/workflows/party-mode.md +0 -15
- package/.claude/settings.local.json +0 -22
- package/bmad/_cfg/agent-manifest.csv +0 -5
- package/bmad/_cfg/agents/bmb-bmad-builder.customize.yaml +0 -42
- package/bmad/_cfg/agents/core-bmad-master.customize.yaml +0 -42
- package/bmad/_cfg/files-manifest.csv +0 -82
- package/bmad/_cfg/ides/claude-code.yaml +0 -6
- package/bmad/_cfg/manifest.yaml +0 -11
- package/bmad/_cfg/task-manifest.csv +0 -13
- package/bmad/_cfg/tool-manifest.csv +0 -4
- package/bmad/_cfg/workflow-manifest.csv +0 -17
- package/bmad/bmb/README.md +0 -194
- package/bmad/bmb/agents/bmad-builder.md +0 -70
- package/bmad/bmb/config.yaml +0 -14
- package/bmad/bmb/workflows/audit-workflow/checklist.md +0 -143
- package/bmad/bmb/workflows/audit-workflow/instructions.md +0 -341
- package/bmad/bmb/workflows/audit-workflow/template.md +0 -118
- package/bmad/bmb/workflows/audit-workflow/workflow.yaml +0 -23
- package/bmad/bmb/workflows/convert-legacy/README.md +0 -262
- package/bmad/bmb/workflows/convert-legacy/checklist.md +0 -205
- package/bmad/bmb/workflows/convert-legacy/instructions.md +0 -377
- package/bmad/bmb/workflows/convert-legacy/workflow.yaml +0 -32
- package/bmad/bmb/workflows/create-agent/README.md +0 -203
- package/bmad/bmb/workflows/create-agent/agent-architecture.md +0 -419
- package/bmad/bmb/workflows/create-agent/agent-command-patterns.md +0 -759
- package/bmad/bmb/workflows/create-agent/agent-types.md +0 -292
- package/bmad/bmb/workflows/create-agent/brainstorm-context.md +0 -174
- package/bmad/bmb/workflows/create-agent/checklist.md +0 -62
- package/bmad/bmb/workflows/create-agent/communication-styles.md +0 -202
- package/bmad/bmb/workflows/create-agent/instructions.md +0 -459
- package/bmad/bmb/workflows/create-agent/workflow.yaml +0 -37
- package/bmad/bmb/workflows/create-module/README.md +0 -229
- package/bmad/bmb/workflows/create-module/brainstorm-context.md +0 -137
- package/bmad/bmb/workflows/create-module/checklist.md +0 -244
- package/bmad/bmb/workflows/create-module/installer-templates/install-config.yaml +0 -92
- package/bmad/bmb/workflows/create-module/installer-templates/installer.js +0 -231
- package/bmad/bmb/workflows/create-module/instructions.md +0 -581
- package/bmad/bmb/workflows/create-module/module-structure.md +0 -400
- package/bmad/bmb/workflows/create-module/workflow.yaml +0 -42
- package/bmad/bmb/workflows/create-workflow/README.md +0 -277
- package/bmad/bmb/workflows/create-workflow/brainstorm-context.md +0 -197
- package/bmad/bmb/workflows/create-workflow/checklist.md +0 -94
- package/bmad/bmb/workflows/create-workflow/instructions.md +0 -724
- package/bmad/bmb/workflows/create-workflow/workflow-creation-guide.md +0 -1308
- package/bmad/bmb/workflows/create-workflow/workflow-template/checklist.md +0 -24
- package/bmad/bmb/workflows/create-workflow/workflow-template/instructions.md +0 -13
- package/bmad/bmb/workflows/create-workflow/workflow-template/template.md +0 -9
- package/bmad/bmb/workflows/create-workflow/workflow-template/workflow.yaml +0 -39
- package/bmad/bmb/workflows/create-workflow/workflow.yaml +0 -40
- package/bmad/bmb/workflows/edit-agent/README.md +0 -112
- package/bmad/bmb/workflows/edit-agent/checklist.md +0 -112
- package/bmad/bmb/workflows/edit-agent/instructions.md +0 -290
- package/bmad/bmb/workflows/edit-agent/workflow.yaml +0 -33
- package/bmad/bmb/workflows/edit-module/README.md +0 -187
- package/bmad/bmb/workflows/edit-module/checklist.md +0 -165
- package/bmad/bmb/workflows/edit-module/instructions.md +0 -339
- package/bmad/bmb/workflows/edit-module/workflow.yaml +0 -34
- package/bmad/bmb/workflows/edit-workflow/README.md +0 -119
- package/bmad/bmb/workflows/edit-workflow/checklist.md +0 -70
- package/bmad/bmb/workflows/edit-workflow/instructions.md +0 -342
- package/bmad/bmb/workflows/edit-workflow/workflow.yaml +0 -27
- package/bmad/bmb/workflows/module-brief/README.md +0 -264
- package/bmad/bmb/workflows/module-brief/checklist.md +0 -116
- package/bmad/bmb/workflows/module-brief/instructions.md +0 -267
- package/bmad/bmb/workflows/module-brief/template.md +0 -275
- package/bmad/bmb/workflows/module-brief/workflow.yaml +0 -29
- package/bmad/bmb/workflows/redoc/README.md +0 -87
- package/bmad/bmb/workflows/redoc/checklist.md +0 -99
- package/bmad/bmb/workflows/redoc/instructions.md +0 -265
- package/bmad/bmb/workflows/redoc/workflow.yaml +0 -32
- package/bmad/core/agents/bmad-master.md +0 -71
- package/bmad/core/agents/bmad-web-orchestrator.agent.xml +0 -122
- package/bmad/core/config.yaml +0 -9
- package/bmad/core/tasks/adv-elicit-methods.csv +0 -39
- package/bmad/core/tasks/adv-elicit.xml +0 -104
- package/bmad/core/tasks/index-docs.xml +0 -65
- package/bmad/core/tasks/validate-workflow.xml +0 -89
- package/bmad/core/tasks/workflow.xml +0 -156
- package/bmad/core/tools/shard-doc.xml +0 -65
- package/bmad/core/workflows/brainstorming/README.md +0 -271
- package/bmad/core/workflows/brainstorming/brain-methods.csv +0 -36
- package/bmad/core/workflows/brainstorming/instructions.md +0 -314
- package/bmad/core/workflows/brainstorming/template.md +0 -102
- package/bmad/core/workflows/brainstorming/workflow.yaml +0 -43
- package/bmad/core/workflows/party-mode/instructions.md +0 -188
- package/bmad/core/workflows/party-mode/workflow.yaml +0 -23
- package/bmad/docs/claude-code-instructions.md +0 -25
- package/bmd/README.md +0 -193
- package/bmd/agents/cli-chief-sidecar/instructions.md +0 -102
- package/bmd/agents/cli-chief-sidecar/knowledge/README.md +0 -68
- package/bmd/agents/cli-chief-sidecar/knowledge/cli-reference.md +0 -123
- package/bmd/agents/cli-chief-sidecar/memories.md +0 -53
- package/bmd/agents/cli-chief.agent.yaml +0 -126
- package/bmd/agents/doc-keeper-sidecar/instructions.md +0 -177
- package/bmd/agents/doc-keeper-sidecar/knowledge/README.md +0 -81
- package/bmd/agents/doc-keeper-sidecar/memories.md +0 -88
- package/bmd/agents/doc-keeper.agent.yaml +0 -137
- package/bmd/agents/release-chief-sidecar/instructions.md +0 -164
- package/bmd/agents/release-chief-sidecar/knowledge/README.md +0 -82
- package/bmd/agents/release-chief-sidecar/memories.md +0 -73
- package/bmd/agents/release-chief.agent.yaml +0 -127
- package/bmd/bmad-custom-module-installer-plan.md +0 -1176
- package/bmd/config.yaml +0 -12
- package/src/modules/bmgd/workflows/4-production/dev-story/AUDIT-REPORT.md +0 -367
- package/src/modules/bmm/sub-modules/claude-code/README.md +0 -87
- 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/sub-agents/bmad-analysis/api-documenter.md +0 -102
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/codebase-analyzer.md +0 -82
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/data-analyst.md +0 -101
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-analysis/pattern-detector.md +0 -84
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/dependency-mapper.md +0 -83
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/epic-optimizer.md +0 -81
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/requirements-analyst.md +0 -61
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/technical-decisions-curator.md +0 -168
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/trend-spotter.md +0 -115
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-journey-mapper.md +0 -123
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-planning/user-researcher.md +0 -72
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/market-researcher.md +0 -51
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-research/tech-debt-auditor.md +0 -106
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/document-reviewer.md +0 -102
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/technical-evaluator.md +0 -68
- package/src/modules/bmm/sub-modules/claude-code/sub-agents/bmad-review/test-coverage-analyzer.md +0 -108
- package/src/modules/bmm/tasks/daily-standup.xml +0 -85
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level0-story.md +0 -200
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-level1-stories.md +0 -451
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/validation-criteria.yaml +0 -189
- package/src/modules/bmm/workflows/4-implementation/dev-story/AUDIT-REPORT.md +0 -367
- package/src/modules/bmm/workflows/workflow-status/sample-level-3-workflow.yaml +0 -49
- package/test/fixtures/agent-schema/invalid/persona/principles-as-string.agent.yaml +0 -23
- package/web-bundles/bmm/agents/analyst.xml +0 -5028
- package/web-bundles/bmm/agents/architect.xml +0 -2047
- package/web-bundles/bmm/agents/dev.xml +0 -68
- package/web-bundles/bmm/agents/pm.xml +0 -3808
- package/web-bundles/bmm/agents/sm.xml +0 -77
- package/web-bundles/bmm/agents/tea.xml +0 -66
- package/web-bundles/bmm/agents/tech-writer.xml +0 -84
- package/web-bundles/bmm/agents/ux-designer.xml +0 -2018
- package/web-bundles/bmm/teams/team-fullstack.xml +0 -12039
|
@@ -13,14 +13,56 @@ class ConfigCollector {
|
|
|
13
13
|
this.currentProjectDir = null;
|
|
14
14
|
}
|
|
15
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
|
+
|
|
16
51
|
/**
|
|
17
52
|
* Load existing config if it exists from module config files
|
|
18
53
|
* @param {string} projectDir - Target project directory
|
|
19
54
|
*/
|
|
20
55
|
async loadExistingConfig(projectDir) {
|
|
21
|
-
const bmadDir = path.join(projectDir, 'bmad');
|
|
22
56
|
this.existingConfig = {};
|
|
23
57
|
|
|
58
|
+
// Check if project directory exists first
|
|
59
|
+
if (!(await fs.pathExists(projectDir))) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// Find the actual bmad directory (handles custom folder names)
|
|
64
|
+
const bmadDir = await this.findBmadDir(projectDir);
|
|
65
|
+
|
|
24
66
|
// Check if bmad directory exists
|
|
25
67
|
if (!(await fs.pathExists(bmadDir))) {
|
|
26
68
|
return false;
|
|
@@ -159,27 +201,25 @@ class ConfigCollector {
|
|
|
159
201
|
this.allAnswers[`${moduleName}_${key}`] = value;
|
|
160
202
|
}
|
|
161
203
|
}
|
|
204
|
+
// Show "no config" message for modules with no new questions
|
|
205
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
162
206
|
return false; // No new fields
|
|
163
207
|
}
|
|
164
208
|
|
|
165
|
-
// If we have new fields,
|
|
209
|
+
// If we have new fields, build questions first
|
|
166
210
|
if (newKeys.length > 0) {
|
|
167
|
-
console.log(chalk.yellow(`\n📋 New configuration options available for ${moduleName}`));
|
|
168
|
-
if (moduleConfig.prompt) {
|
|
169
|
-
const prompts = Array.isArray(moduleConfig.prompt) ? moduleConfig.prompt : [moduleConfig.prompt];
|
|
170
|
-
CLIUtils.displayPromptSection(prompts);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
211
|
const questions = [];
|
|
174
212
|
for (const key of newKeys) {
|
|
175
213
|
const item = moduleConfig[key];
|
|
176
|
-
const question = await this.buildQuestion(moduleName, key, item);
|
|
214
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
177
215
|
if (question) {
|
|
178
216
|
questions.push(question);
|
|
179
217
|
}
|
|
180
218
|
}
|
|
181
219
|
|
|
182
220
|
if (questions.length > 0) {
|
|
221
|
+
// Only show header if we actually have questions
|
|
222
|
+
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
183
223
|
console.log(); // Line break before questions
|
|
184
224
|
const answers = await inquirer.prompt(questions);
|
|
185
225
|
|
|
@@ -206,6 +246,9 @@ class ConfigCollector {
|
|
|
206
246
|
}
|
|
207
247
|
this.collectedConfig[moduleName][originalKey] = result;
|
|
208
248
|
}
|
|
249
|
+
} else {
|
|
250
|
+
// New keys exist but no questions generated - show no config message
|
|
251
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
209
252
|
}
|
|
210
253
|
}
|
|
211
254
|
|
|
@@ -325,12 +368,6 @@ class ConfigCollector {
|
|
|
325
368
|
return;
|
|
326
369
|
}
|
|
327
370
|
|
|
328
|
-
// Display module prompts using better formatting
|
|
329
|
-
if (moduleConfig.prompt) {
|
|
330
|
-
const prompts = Array.isArray(moduleConfig.prompt) ? moduleConfig.prompt : [moduleConfig.prompt];
|
|
331
|
-
CLIUtils.displayPromptSection(prompts);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
371
|
// Process each config item
|
|
335
372
|
const questions = [];
|
|
336
373
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
@@ -343,13 +380,15 @@ class ConfigCollector {
|
|
|
343
380
|
continue;
|
|
344
381
|
}
|
|
345
382
|
|
|
346
|
-
const question = await this.buildQuestion(moduleName, key, item);
|
|
383
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
347
384
|
if (question) {
|
|
348
385
|
questions.push(question);
|
|
349
386
|
}
|
|
350
387
|
}
|
|
351
388
|
|
|
389
|
+
// Display appropriate header based on whether there are questions
|
|
352
390
|
if (questions.length > 0) {
|
|
391
|
+
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
353
392
|
console.log(); // Line break before questions
|
|
354
393
|
const answers = await inquirer.prompt(questions);
|
|
355
394
|
|
|
@@ -450,20 +489,68 @@ class ConfigCollector {
|
|
|
450
489
|
this.collectedConfig[moduleName][originalKey] = result;
|
|
451
490
|
}
|
|
452
491
|
|
|
453
|
-
//
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
492
|
+
// No longer display completion boxes - keep output clean
|
|
493
|
+
} else {
|
|
494
|
+
// No questions for this module - show completion message
|
|
495
|
+
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
457
496
|
}
|
|
458
497
|
}
|
|
459
498
|
|
|
499
|
+
/**
|
|
500
|
+
* Replace placeholders in a string with collected config values
|
|
501
|
+
* @param {string} str - String with placeholders
|
|
502
|
+
* @param {string} currentModule - Current module name (to look up defaults in same module)
|
|
503
|
+
* @param {Object} moduleConfig - Current module's config schema (to look up defaults)
|
|
504
|
+
* @returns {string} String with placeholders replaced
|
|
505
|
+
*/
|
|
506
|
+
replacePlaceholders(str, currentModule = null, moduleConfig = null) {
|
|
507
|
+
if (typeof str !== 'string') {
|
|
508
|
+
return str;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
return str.replaceAll(/{([^}]+)}/g, (match, configKey) => {
|
|
512
|
+
// Preserve special placeholders
|
|
513
|
+
if (configKey === 'project-root' || configKey === 'value' || configKey === 'directory_name') {
|
|
514
|
+
return match;
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
// Look for the config value in allAnswers (already answered questions)
|
|
518
|
+
let configValue = this.allAnswers[configKey] || this.allAnswers[`core_${configKey}`];
|
|
519
|
+
|
|
520
|
+
// Check in already collected config
|
|
521
|
+
if (!configValue) {
|
|
522
|
+
for (const mod of Object.keys(this.collectedConfig)) {
|
|
523
|
+
if (mod !== '_meta' && this.collectedConfig[mod] && this.collectedConfig[mod][configKey]) {
|
|
524
|
+
configValue = this.collectedConfig[mod][configKey];
|
|
525
|
+
// Remove {project-root}/ prefix if present for cleaner display
|
|
526
|
+
if (typeof configValue === 'string' && configValue.includes('{project-root}/')) {
|
|
527
|
+
configValue = configValue.replace('{project-root}/', '');
|
|
528
|
+
}
|
|
529
|
+
break;
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
// If still not found and we're in the same module, use the default from the config schema
|
|
535
|
+
if (!configValue && currentModule && moduleConfig && moduleConfig[configKey]) {
|
|
536
|
+
const referencedItem = moduleConfig[configKey];
|
|
537
|
+
if (referencedItem && referencedItem.default !== undefined) {
|
|
538
|
+
configValue = referencedItem.default;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
return configValue || match;
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
|
|
460
546
|
/**
|
|
461
547
|
* Build an inquirer question from a config item
|
|
462
548
|
* @param {string} moduleName - Module name
|
|
463
549
|
* @param {string} key - Config key
|
|
464
550
|
* @param {Object} item - Config item definition
|
|
551
|
+
* @param {Object} moduleConfig - Full module config schema (for resolving defaults)
|
|
465
552
|
*/
|
|
466
|
-
async buildQuestion(moduleName, key, item) {
|
|
553
|
+
async buildQuestion(moduleName, key, item, moduleConfig = null) {
|
|
467
554
|
const questionName = `${moduleName}_${key}`;
|
|
468
555
|
|
|
469
556
|
// Check for existing value
|
|
@@ -483,9 +570,42 @@ class ConfigCollector {
|
|
|
483
570
|
let defaultValue = item.default;
|
|
484
571
|
let choices = null;
|
|
485
572
|
|
|
486
|
-
if
|
|
487
|
-
|
|
488
|
-
|
|
573
|
+
// Check if default contains references to other fields in the same module
|
|
574
|
+
const hasSameModuleReference = typeof defaultValue === 'string' && defaultValue.match(/{([^}]+)}/);
|
|
575
|
+
let dynamicDefault = false;
|
|
576
|
+
|
|
577
|
+
// Replace placeholders in default value with collected config values
|
|
578
|
+
if (typeof defaultValue === 'string') {
|
|
579
|
+
if (defaultValue.includes('{directory_name}') && this.currentProjectDir) {
|
|
580
|
+
const dirName = path.basename(this.currentProjectDir);
|
|
581
|
+
defaultValue = defaultValue.replaceAll('{directory_name}', dirName);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// Check if this references another field in the same module (for dynamic defaults)
|
|
585
|
+
if (hasSameModuleReference && moduleConfig) {
|
|
586
|
+
const matches = defaultValue.match(/{([^}]+)}/g);
|
|
587
|
+
if (matches) {
|
|
588
|
+
for (const match of matches) {
|
|
589
|
+
const fieldName = match.slice(1, -1); // Remove { }
|
|
590
|
+
// Check if this field exists in the same module config
|
|
591
|
+
if (moduleConfig[fieldName]) {
|
|
592
|
+
dynamicDefault = true;
|
|
593
|
+
break;
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// If not dynamic, replace placeholders now
|
|
600
|
+
if (!dynamicDefault) {
|
|
601
|
+
defaultValue = this.replacePlaceholders(defaultValue, moduleName, moduleConfig);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
// Strip {project-root}/ from defaults since it will be added back by result template
|
|
605
|
+
// This makes the display cleaner and user input simpler
|
|
606
|
+
if (defaultValue.includes('{project-root}/')) {
|
|
607
|
+
defaultValue = defaultValue.replace('{project-root}/', '');
|
|
608
|
+
}
|
|
489
609
|
}
|
|
490
610
|
|
|
491
611
|
// Handle different question types
|
|
@@ -548,31 +668,67 @@ class ConfigCollector {
|
|
|
548
668
|
message = item.prompt;
|
|
549
669
|
}
|
|
550
670
|
|
|
671
|
+
// Replace placeholders in prompt message with collected config values
|
|
672
|
+
if (typeof message === 'string') {
|
|
673
|
+
message = this.replacePlaceholders(message, moduleName, moduleConfig);
|
|
674
|
+
}
|
|
675
|
+
|
|
551
676
|
// Add current value indicator for existing configs
|
|
552
677
|
if (existingValue !== null && existingValue !== undefined) {
|
|
553
678
|
if (typeof existingValue === 'boolean') {
|
|
554
679
|
message += chalk.dim(` (current: ${existingValue ? 'true' : 'false'})`);
|
|
555
|
-
defaultValue = existingValue;
|
|
556
680
|
} else if (Array.isArray(existingValue)) {
|
|
557
681
|
message += chalk.dim(` (current: ${existingValue.join(', ')})`);
|
|
558
682
|
} else if (questionType !== 'list') {
|
|
559
683
|
// Show the cleaned value (without {project-root}/) for display
|
|
560
684
|
message += chalk.dim(` (current: ${existingValue})`);
|
|
561
|
-
defaultValue = existingValue;
|
|
562
685
|
}
|
|
563
686
|
} else if (item.example && questionType === 'input') {
|
|
564
687
|
// Show example for input fields
|
|
565
|
-
|
|
688
|
+
let exampleText = typeof item.example === 'string' ? item.example : JSON.stringify(item.example);
|
|
689
|
+
// Replace placeholders in example
|
|
690
|
+
if (typeof exampleText === 'string') {
|
|
691
|
+
exampleText = this.replacePlaceholders(exampleText, moduleName, moduleConfig);
|
|
692
|
+
exampleText = exampleText.replace('{project-root}/', '');
|
|
693
|
+
}
|
|
566
694
|
message += chalk.dim(` (e.g., ${exampleText})`);
|
|
567
695
|
}
|
|
568
696
|
|
|
697
|
+
// Build the question object
|
|
569
698
|
const question = {
|
|
570
699
|
type: questionType,
|
|
571
700
|
name: questionName,
|
|
572
701
|
message: message,
|
|
573
|
-
default: defaultValue,
|
|
574
702
|
};
|
|
575
703
|
|
|
704
|
+
// Set default - if it's dynamic, use a function that inquirer will evaluate with current answers
|
|
705
|
+
// But if we have an existing value, always use that instead
|
|
706
|
+
if (existingValue !== null && existingValue !== undefined && questionType !== 'list') {
|
|
707
|
+
question.default = existingValue;
|
|
708
|
+
} else if (dynamicDefault && typeof item.default === 'string') {
|
|
709
|
+
const originalDefault = item.default;
|
|
710
|
+
question.default = (answers) => {
|
|
711
|
+
// Replace placeholders using answers from previous questions in the same batch
|
|
712
|
+
let resolved = originalDefault;
|
|
713
|
+
resolved = resolved.replaceAll(/{([^}]+)}/g, (match, fieldName) => {
|
|
714
|
+
// Look for the answer in the current batch (prefixed with module name)
|
|
715
|
+
const answerKey = `${moduleName}_${fieldName}`;
|
|
716
|
+
if (answers[answerKey] !== undefined) {
|
|
717
|
+
return answers[answerKey];
|
|
718
|
+
}
|
|
719
|
+
// Fall back to collected config
|
|
720
|
+
return this.collectedConfig[moduleName]?.[fieldName] || match;
|
|
721
|
+
});
|
|
722
|
+
// Strip {project-root}/ for cleaner display
|
|
723
|
+
if (resolved.includes('{project-root}/')) {
|
|
724
|
+
resolved = resolved.replace('{project-root}/', '');
|
|
725
|
+
}
|
|
726
|
+
return resolved;
|
|
727
|
+
};
|
|
728
|
+
} else {
|
|
729
|
+
question.default = defaultValue;
|
|
730
|
+
}
|
|
731
|
+
|
|
576
732
|
// Add choices for select types
|
|
577
733
|
if (choices) {
|
|
578
734
|
question.choices = choices;
|
|
@@ -584,6 +740,23 @@ class ConfigCollector {
|
|
|
584
740
|
if (!input && item.required) {
|
|
585
741
|
return 'This field is required';
|
|
586
742
|
}
|
|
743
|
+
// Validate against regex pattern if provided
|
|
744
|
+
if (input && item.regex) {
|
|
745
|
+
const regex = new RegExp(item.regex);
|
|
746
|
+
if (!regex.test(input)) {
|
|
747
|
+
return `Invalid format. Must match pattern: ${item.regex}`;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
return true;
|
|
751
|
+
};
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
// Add validation for checkbox (multi-select) fields
|
|
755
|
+
if (questionType === 'checkbox' && item.required) {
|
|
756
|
+
question.validate = (answers) => {
|
|
757
|
+
if (!answers || answers.length === 0) {
|
|
758
|
+
return 'At least one option must be selected';
|
|
759
|
+
}
|
|
587
760
|
return true;
|
|
588
761
|
};
|
|
589
762
|
}
|
|
@@ -199,6 +199,8 @@ class Detector {
|
|
|
199
199
|
|
|
200
200
|
/**
|
|
201
201
|
* Detect legacy BMAD v4 footprints (case-sensitive path checks)
|
|
202
|
+
* V4 used .bmad-method as default folder name
|
|
203
|
+
* V6+ uses configurable folder names and ALWAYS has _cfg/manifest.yaml with installation.version
|
|
202
204
|
* @param {string} projectDir - Project directory to check
|
|
203
205
|
* @returns {{ hasLegacyV4: boolean, offenders: string[] }}
|
|
204
206
|
*/
|
|
@@ -223,18 +225,62 @@ class Detector {
|
|
|
223
225
|
return true;
|
|
224
226
|
};
|
|
225
227
|
|
|
228
|
+
// Helper: check if a directory is a V6+ installation
|
|
229
|
+
const isV6Installation = async (dirPath) => {
|
|
230
|
+
const manifestPath = path.join(dirPath, '_cfg', 'manifest.yaml');
|
|
231
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
232
|
+
return false;
|
|
233
|
+
}
|
|
234
|
+
try {
|
|
235
|
+
const yaml = require('js-yaml');
|
|
236
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf8');
|
|
237
|
+
const manifest = yaml.load(manifestContent);
|
|
238
|
+
// V6+ manifest has installation.version
|
|
239
|
+
return manifest && manifest.installation && manifest.installation.version;
|
|
240
|
+
} catch {
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
|
|
226
245
|
const offenders = [];
|
|
227
246
|
|
|
228
|
-
//
|
|
247
|
+
// Strategy:
|
|
248
|
+
// 1. First scan for ANY V6+ installation (_cfg/manifest.yaml)
|
|
249
|
+
// 2. If V6+ found → don't flag anything (user is already on V6+)
|
|
250
|
+
// 3. If NO V6+ found → flag folders with "bmad" in name as potential V4 legacy
|
|
251
|
+
|
|
252
|
+
let hasV6Installation = false;
|
|
253
|
+
const potentialV4Folders = [];
|
|
254
|
+
|
|
229
255
|
try {
|
|
230
256
|
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
257
|
+
|
|
231
258
|
for (const entry of entries) {
|
|
232
259
|
if (entry.isDirectory()) {
|
|
233
260
|
const name = entry.name;
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if
|
|
237
|
-
|
|
261
|
+
const fullPath = path.join(projectDir, entry.name);
|
|
262
|
+
|
|
263
|
+
// Check if directory is empty (skip empty leftover folders)
|
|
264
|
+
const dirContents = await fs.readdir(fullPath);
|
|
265
|
+
if (dirContents.length === 0) {
|
|
266
|
+
continue; // Skip empty folders
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Check if it's a V6+ installation by looking for _cfg/manifest.yaml
|
|
270
|
+
// This works for ANY folder name (not just bmad-prefixed)
|
|
271
|
+
const isV6 = await isV6Installation(fullPath);
|
|
272
|
+
|
|
273
|
+
if (isV6) {
|
|
274
|
+
// Found a V6+ installation - user is already on V6+
|
|
275
|
+
hasV6Installation = true;
|
|
276
|
+
// Don't break - continue scanning to be thorough
|
|
277
|
+
} else {
|
|
278
|
+
// Not V6+, check if folder name contains "bmad" (case insensitive)
|
|
279
|
+
const nameLower = name.toLowerCase();
|
|
280
|
+
if (nameLower.includes('bmad')) {
|
|
281
|
+
// Potential V4 legacy folder
|
|
282
|
+
potentialV4Folders.push(fullPath);
|
|
283
|
+
}
|
|
238
284
|
}
|
|
239
285
|
}
|
|
240
286
|
}
|
|
@@ -242,8 +288,15 @@ class Detector {
|
|
|
242
288
|
// Ignore errors reading directory
|
|
243
289
|
}
|
|
244
290
|
|
|
291
|
+
// Only flag V4 folders if NO V6+ installation was found
|
|
292
|
+
if (!hasV6Installation && potentialV4Folders.length > 0) {
|
|
293
|
+
offenders.push(...potentialV4Folders);
|
|
294
|
+
}
|
|
295
|
+
|
|
245
296
|
// Check inside various IDE command folders for legacy bmad folders
|
|
246
|
-
//
|
|
297
|
+
// V4 used folders like 'bmad-method' or custom names in IDE commands
|
|
298
|
+
// V6+ uses 'bmad' in IDE commands (hardcoded in IDE handlers)
|
|
299
|
+
// Legacy V4 IDE command folders won't have a corresponding V6+ installation
|
|
247
300
|
const ideConfigFolders = ['.opencode', '.claude', '.crush', '.continue', '.cursor', '.windsurf', '.cline', '.roo-cline'];
|
|
248
301
|
|
|
249
302
|
for (const ideFolder of ideConfigFolders) {
|
|
@@ -255,7 +308,9 @@ class Detector {
|
|
|
255
308
|
for (const entry of commandEntries) {
|
|
256
309
|
if (entry.isDirectory()) {
|
|
257
310
|
const name = entry.name;
|
|
258
|
-
//
|
|
311
|
+
// V4 used 'bmad-method' or similar in IDE commands folders
|
|
312
|
+
// V6+ uses 'bmad' (hardcoded)
|
|
313
|
+
// So anything that's NOT 'bmad' but starts with bmad/Bmad is likely V4
|
|
259
314
|
if ((name.startsWith('bmad') || name.startsWith('Bmad') || name === 'BMad') && name !== 'bmad') {
|
|
260
315
|
offenders.push(path.join(commandsPath, entry.name));
|
|
261
316
|
}
|