bmad-method 6.0.0-alpha.15 → 6.0.0-alpha.17
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/.coderabbit.yaml +8 -4
- package/.github/scripts/discord-helpers.sh +21 -2
- package/.github/workflows/discord.yaml +31 -7
- package/.github/workflows/manual-release.yaml +12 -42
- package/.markdownlint-cli2.yaml +2 -2
- package/.prettierignore +2 -2
- package/.vscode/settings.json +1 -1
- package/CHANGELOG.md +126 -1
- package/LICENSE +1 -1
- package/README.md +29 -2
- package/docs/agent-customization-guide.md +10 -10
- package/docs/custom-content-installation.md +100 -196
- package/docs/custom-content.md +122 -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/ide-info/rovo-dev.md +1 -1
- package/docs/index.md +2 -2
- package/docs/installers-bundlers/ide-injections.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +25 -25
- package/docs/sample-custom-modules/README.md +11 -0
- package/docs/sample-custom-modules/sample-unitary-module/README.md +8 -0
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/commit-poet/commit-poet.agent.yaml +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith.agent.yaml +14 -14
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/module.yaml +5 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-01-init.md +2 -2
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-02-q1.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-03-q2.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-04-q3.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-05-q4.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-06-q5.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-07-q6.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-08-q7.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-09-q8.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-10-q9.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-11-q10.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/steps/step-12-results.md +1 -1
- package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/workflow.md +1 -1
- package/docs/sample-custom-modules/sample-wellness-module/README.md +6 -0
- package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/meditation-guide.agent.yaml +37 -39
- package/docs/sample-custom-modules/sample-wellness-module/agents/wellness-companion/foo.md +3 -0
- package/docs/sample-custom-modules/sample-wellness-module/agents/wellness-companion/wellness-companion-sidecar/addition1.md +1 -0
- package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/wellness-companion/wellness-companion.agent.yaml +8 -13
- package/docs/sample-custom-modules/sample-wellness-module/module.yaml +17 -0
- package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/wellness-journal/workflow.md +3 -3
- package/docs/v4-to-v6-upgrade.md +27 -27
- package/docs/web-bundles-gemini-gpt-guide.md +6 -458
- package/eslint.config.mjs +2 -2
- package/package.json +1 -1
- package/src/core/agents/bmad-master.agent.yaml +6 -11
- package/src/core/module.yaml +10 -24
- package/src/core/resources/excalidraw/README.md +6 -6
- package/src/core/tasks/advanced-elicitation.xml +3 -3
- package/src/core/tasks/index-docs.xml +1 -1
- package/src/core/tasks/validate-workflow.xml +1 -1
- package/src/core/tasks/workflow.xml +4 -4
- package/src/core/tools/shard-doc.xml +12 -12
- package/src/core/workflows/brainstorming/workflow.md +3 -3
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +2 -2
- package/src/core/workflows/party-mode/workflow.md +4 -4
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +15 -15
- package/src/modules/bmb/{README.md → docs/README.md} +15 -27
- package/src/modules/bmb/docs/agents/agent-compilation.md +3 -3
- package/src/modules/bmb/docs/agents/agent-menu-patterns.md +23 -24
- package/src/modules/bmb/docs/agents/expert-agent-architecture.md +21 -22
- package/src/modules/bmb/docs/agents/index.md +1 -1
- package/src/modules/bmb/docs/agents/simple-agent-architecture.md +17 -52
- package/src/modules/bmb/docs/agents/understanding-agent-types.md +6 -6
- package/src/modules/bmb/docs/workflows/architecture.md +1 -1
- package/src/modules/bmb/docs/workflows/common-workflow-tools.csv +3 -3
- package/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md +1 -1
- package/src/modules/bmb/docs/workflows/templates/step-1b-template.md +1 -1
- package/src/modules/bmb/docs/workflows/templates/step-file.md +3 -3
- package/src/modules/bmb/docs/workflows/templates/step-template.md +3 -3
- package/src/modules/bmb/docs/workflows/templates/workflow-template.md +2 -2
- package/src/modules/bmb/docs/workflows/templates/workflow.md +1 -1
- package/src/modules/bmb/module.yaml +6 -16
- package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +7 -7
- package/src/modules/bmb/reference/agents/module-examples/README.md +3 -4
- package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +5 -5
- package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
- package/src/modules/bmb/reference/agents/simple-examples/README.md +1 -1
- package/src/modules/bmb/reference/agents/simple-examples/commit-poet.agent.yaml +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +1 -1
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +3 -3
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +3 -3
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +5 -5
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +5 -5
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +5 -5
- package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/README.md +1 -3
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/security-engineer.agent.yaml +6 -6
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/simple-examples/README.md +1 -1
- package/src/modules/bmb/workflows/create-agent/data/reference/agents/simple-examples/commit-poet.agent.yaml +1 -1
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +1 -1
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +1 -1
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +3 -3
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +3 -3
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +5 -5
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +5 -5
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +5 -5
- package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
- package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +5 -5
- package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +5 -5
- package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +7 -11
- package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +7 -7
- package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +10 -10
- package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +7 -6
- package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +20 -58
- package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +6 -6
- package/src/modules/bmb/workflows/create-agent/steps/{step-11-celebrate.md → step-08-celebrate.md} +3 -7
- package/src/modules/bmb/workflows/create-agent/templates/agent-plan.template.md +3 -0
- package/src/modules/bmb/workflows/create-agent/templates/expert-agent.template.md +364 -0
- package/src/modules/bmb/workflows/create-agent/templates/simple-agent.template.md +257 -0
- package/src/modules/bmb/workflows/create-agent/workflow.md +2 -35
- package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +4 -4
- package/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +2 -2
- package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +5 -5
- package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +5 -5
- package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +6 -6
- package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +5 -5
- package/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +9 -9
- package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +5 -5
- package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +8 -8
- package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +7 -7
- package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +7 -7
- package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +6 -6
- package/src/modules/bmb/workflows/create-module/templates/agent.template.md +15 -19
- package/src/modules/bmb/workflows/create-module/templates/module.template.yaml +1 -1
- package/src/modules/bmb/workflows/create-module/workflow.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +6 -6
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +5 -5
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md +11 -11
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +14 -14
- package/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +2 -2
- package/src/modules/bmb/workflows/create-workflow/workflow.md +2 -2
- package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +3 -3
- package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +13 -13
- package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +5 -5
- package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +3 -3
- package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +5 -5
- package/src/modules/bmb/workflows/edit-agent/workflow.md +1 -1
- package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +4 -4
- package/src/modules/bmb/workflows/edit-workflow/steps/step-02-discover.md +3 -3
- package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +6 -6
- package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +3 -3
- package/src/modules/bmb/workflows/edit-workflow/steps/step-05-compliance-check.md +3 -3
- package/src/modules/bmb/workflows/edit-workflow/workflow.md +1 -1
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +5 -5
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +6 -6
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +4 -4
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +4 -4
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +4 -4
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +4 -4
- package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +3 -3
- package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +1 -1
- package/src/modules/bmb/workflows-legacy/edit-module/README.md +1 -17
- package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +3 -4
- package/src/modules/bmb/workflows-legacy/edit-module/instructions.md +4 -5
- package/src/modules/bmb/workflows-legacy/edit-module/workflow.yaml +10 -10
- package/src/modules/bmb/workflows-legacy/module-brief/README.md +2 -2
- package/src/modules/bmb/workflows-legacy/module-brief/instructions.md +2 -2
- package/src/modules/bmb/workflows-legacy/module-brief/workflow.yaml +4 -4
- package/src/modules/bmgd/README.md +1 -1
- package/src/modules/bmgd/agents/game-architect.agent.yaml +6 -6
- package/src/modules/bmgd/agents/game-designer.agent.yaml +7 -7
- package/src/modules/bmgd/agents/game-dev.agent.yaml +10 -10
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +21 -21
- package/src/modules/bmgd/module.yaml +2 -8
- 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 +4 -4
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +30 -30
- package/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md +1 -1
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +5 -5
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +1 -1
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +4 -4
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +1 -1
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +2 -2
- 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 +2 -2
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +3 -3
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +2 -2
- 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 +2 -2
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +2 -2
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +1 -1
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +2 -2
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +1 -1
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +2 -2
- package/src/modules/bmm/README.md +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +9 -9
- package/src/modules/bmm/agents/architect.agent.yaml +8 -8
- package/src/modules/bmm/agents/dev.agent.yaml +5 -5
- package/src/modules/bmm/agents/pm.agent.yaml +8 -8
- package/src/modules/bmm/agents/quick-flow-solo-dev.agent.yaml +5 -5
- package/src/modules/bmm/agents/sm.agent.yaml +11 -11
- package/src/modules/bmm/agents/tea.agent.yaml +13 -13
- package/src/modules/bmm/agents/tech-writer.agent.yaml +9 -9
- package/src/modules/bmm/agents/ux-designer.agent.yaml +6 -6
- package/src/modules/bmm/docs/README.md +0 -25
- package/src/modules/bmm/docs/agents-guide.md +16 -14
- package/src/modules/bmm/docs/brownfield-guide.md +6 -6
- package/src/modules/bmm/docs/enterprise-agentic-development.md +3 -3
- package/src/modules/bmm/docs/faq.md +5 -18
- package/src/modules/bmm/docs/glossary.md +3 -4
- package/src/modules/bmm/docs/images/README.md +1 -1
- package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +8 -8
- package/src/modules/bmm/docs/party-mode.md +3 -3
- package/src/modules/bmm/docs/quick-flow-solo-dev.md +5 -5
- package/src/modules/bmm/docs/quick-spec-flow.md +2 -16
- package/src/modules/bmm/docs/quick-start.md +3 -3
- package/src/modules/bmm/docs/test-architecture.md +15 -23
- package/src/modules/bmm/docs/troubleshooting.md +6 -25
- package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
- package/src/modules/bmm/docs/workflows-implementation.md +3 -104
- package/src/modules/bmm/module.yaml +25 -24
- package/src/modules/bmm/testarch/knowledge/overview.md +0 -1
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-01-init.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-01b-continue.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-02-vision.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-03-users.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-04-metrics.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-05-scope.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/steps/step-06-complete.md +5 -3
- package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/workflow.md +2 -2
- package/src/modules/bmm/workflows/1-analysis/research/workflow.md +2 -2
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +4 -4
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +2 -2
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +1 -1
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +1 -1
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +3 -3
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +7 -7
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +8 -8
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +12 -12
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +12 -12
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +10 -10
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +7 -7
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +9 -9
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +9 -9
- package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +1 -1
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-01-document-discovery.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-02-prd-analysis.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-03-epic-coverage-validation.md +6 -6
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-04-ux-alignment.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-05-epic-quality-review.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/steps/step-06-final-assessment.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/workflow.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-01-init.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-02-context.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-03-starter.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-04-decisions.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-05-patterns.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-06-structure.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-07-validation.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-08-complete.md +3 -3
- package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +3 -3
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +3 -3
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +3 -3
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +3 -3
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +3 -3
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +4 -3
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +2 -2
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +2 -2
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +5 -5
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +3 -5
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +2 -2
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml +11 -8
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +3 -3
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +3 -3
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +15 -22
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +4 -5
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +90 -35
- package/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/bmad-quick-flow/create-tech-spec/workflow.yaml +5 -5
- package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +7 -7
- 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.yaml +5 -5
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +5 -5
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-dataflow/instructions.md +1 -1
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-dataflow/workflow.yaml +6 -6
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-diagram/instructions.md +2 -2
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-diagram/workflow.yaml +6 -6
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-flowchart/instructions.md +2 -2
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-flowchart/workflow.yaml +6 -6
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-wireframe/instructions.md +1 -1
- package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-wireframe/workflow.yaml +6 -6
- package/src/modules/bmm/workflows/generate-project-context/steps/step-01-discover.md +2 -2
- package/src/modules/bmm/workflows/generate-project-context/steps/step-02-generate.md +3 -3
- package/src/modules/bmm/workflows/generate-project-context/steps/step-03-complete.md +2 -2
- package/src/modules/bmm/workflows/generate-project-context/workflow.md +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/instructions.md +1 -1
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +3 -3
- 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/instructions.md +3 -3
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +1 -1
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +10 -4
- 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 +6 -6
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +1 -1
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +4 -4
- package/src/modules/bmm/workflows/workflow-status/instructions.md +3 -3
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +1 -1
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +2 -2
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +4 -4
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +4 -4
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +4 -4
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +4 -4
- package/src/modules/cis/agents/presentation-master.agent.yaml +3 -3
- package/src/modules/cis/agents/storyteller/storyteller-sidecar/stories-told.md +7 -0
- package/src/modules/cis/agents/storyteller/storyteller-sidecar/story-preferences.md +7 -0
- package/src/modules/cis/agents/{storyteller.agent.yaml → storyteller/storyteller.agent.yaml} +9 -4
- package/src/modules/cis/module.yaml +3 -8
- package/src/modules/cis/{README.md → readme.md} +1 -1
- 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/agent-components/activation-rules.txt +7 -0
- package/src/utility/agent-components/activation-steps.txt +13 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/{templates → agent-components}/agent.customize.template.yaml +0 -1
- package/src/utility/agent-components/handler-action.txt +4 -0
- package/src/utility/agent-components/handler-exec.txt +6 -0
- package/src/utility/agent-components/handler-multi.txt +14 -0
- package/src/utility/agent-components/handler-tmpl.txt +5 -0
- package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
- package/src/utility/agent-components/handler-workflow.txt +10 -0
- package/src/utility/agent-components/menu-handlers.txt +6 -0
- package/test/README.md +1 -1
- package/test/test-agent-schema.js +2 -2
- package/tools/cli/README.md +1 -607
- package/tools/cli/commands/build.js +7 -7
- package/tools/cli/commands/install.js +9 -20
- package/tools/cli/commands/list.js +13 -1
- package/tools/cli/installers/lib/core/config-collector.js +243 -73
- package/tools/cli/installers/lib/core/custom-module-cache.js +36 -16
- package/tools/cli/installers/lib/core/dependency-resolver.js +2 -2
- package/tools/cli/installers/lib/core/detector.js +16 -16
- package/tools/cli/installers/lib/core/ide-config-manager.js +9 -7
- package/tools/cli/installers/lib/core/installer.js +595 -1006
- package/tools/cli/installers/lib/core/manifest-generator.js +43 -40
- package/tools/cli/installers/lib/core/manifest.js +23 -20
- package/tools/cli/installers/lib/custom/handler.js +16 -49
- package/tools/cli/installers/lib/ide/_base-ide.js +26 -33
- package/tools/cli/installers/lib/ide/antigravity.js +3 -3
- package/tools/cli/installers/lib/ide/claude-code.js +3 -3
- package/tools/cli/installers/lib/ide/codex.js +2 -2
- package/tools/cli/installers/lib/ide/gemini.js +6 -6
- package/tools/cli/installers/lib/ide/kiro-cli.js +2 -2
- package/tools/cli/installers/lib/ide/opencode.js +2 -2
- package/tools/cli/installers/lib/ide/roo.js +15 -5
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +2 -2
- package/tools/cli/installers/lib/ide/shared/module-injections.js +2 -2
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +2 -2
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +4 -4
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +3 -3
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +3 -3
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +1 -1
- package/tools/cli/installers/lib/modules/manager.js +304 -313
- package/tools/cli/lib/activation-builder.js +8 -13
- package/tools/cli/lib/agent/compiler.js +68 -168
- package/tools/cli/lib/agent/installer.js +8 -128
- package/tools/cli/lib/agent-analyzer.js +2 -2
- package/tools/cli/lib/agent-party-generator.js +5 -17
- package/tools/cli/lib/config.js +2 -2
- package/tools/cli/lib/platform-codes.js +2 -2
- package/tools/cli/lib/ui.js +610 -551
- package/tools/cli/lib/xml-handler.js +3 -55
- package/tools/cli/lib/yaml-format.js +4 -6
- package/tools/cli/lib/yaml-xml-builder.js +14 -26
- package/tools/flattener/ignoreRules.js +1 -1
- package/tools/flattener/xml.js +1 -7
- package/tools/lib/xml-utils.js +13 -0
- package/tools/migrate-custom-module-paths.js +2 -2
- package/tools/validate-agent-schema.js +2 -2
- package/docs/v6-open-items.md +0 -17
- package/example-custom-content/README.md +0 -8
- package/example-custom-module/mwm/README.md +0 -9
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md +0 -47
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md +0 -17
- package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +0 -151
- package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +0 -138
- package/example-custom-module/mwm/module.yaml +0 -28
- package/example-custom-module/mwm/workflows/cbt-thought-record/README.md +0 -31
- package/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md +0 -45
- package/example-custom-module/mwm/workflows/crisis-support/README.md +0 -31
- package/example-custom-module/mwm/workflows/crisis-support/workflow.md +0 -45
- package/src/core/agents/bmad-web-orchestrator.agent.xml +0 -113
- package/src/modules/bmb/_module-installer/installer.js +0 -76
- package/src/modules/bmb/docs/agents/module-agent-architecture.md +0 -367
- package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +0 -179
- package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +0 -197
- package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +0 -180
- package/src/modules/bmb/workflows/create-agent/templates/agent_commands.md +0 -21
- package/src/modules/bmb/workflows/create-agent/templates/agent_persona.md +0 -25
- package/src/modules/bmb/workflows/create-agent/templates/agent_purpose_and_type.md +0 -23
- package/src/modules/bmm/tasks/daily-standup.xml +0 -85
- package/src/modules/cis/agents/README.md +0 -104
- package/src/utility/models/action-command-header.md +0 -0
- package/src/utility/models/agent-activation-ide.xml +0 -51
- package/src/utility/models/agent-activation-web.xml +0 -50
- package/src/utility/models/agent-command-header.md +0 -1
- package/src/utility/models/agent-config-template.md +0 -23
- package/src/utility/models/agent-in-team-activation.xml +0 -3
- package/src/utility/models/fragments/activation-rules.xml +0 -7
- package/src/utility/models/fragments/activation-steps.xml +0 -16
- package/src/utility/models/fragments/handler-action.xml +0 -4
- package/src/utility/models/fragments/handler-exec.xml +0 -6
- package/src/utility/models/fragments/handler-multi.xml +0 -14
- package/src/utility/models/fragments/handler-tmpl.xml +0 -5
- package/src/utility/models/fragments/handler-validate-workflow.xml +0 -7
- package/src/utility/models/fragments/handler-workflow.xml +0 -9
- package/src/utility/models/fragments/menu-handlers.xml +0 -6
- package/src/utility/models/fragments/web-bundle-activation-steps.xml +0 -32
- package/tools/cli/bundlers/bundle-web.js +0 -179
- package/tools/cli/bundlers/test-analyst.js +0 -28
- package/tools/cli/bundlers/test-bundler.js +0 -118
- package/tools/cli/bundlers/web-bundler.js +0 -1764
- package/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +0 -79
- package/tools/cli/lib/replace-project-root.js +0 -239
- package/tools/cli/regenerate-manifests.js +0 -28
- package/tools/cli/test-yaml-builder.js +0 -43
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/instructions.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/agents/toolsmith/toolsmith-sidecar/memories.md +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/quiz-master/templates/csv-headers.template +0 -0
- /package/{example-custom-content → docs/sample-custom-modules/sample-unitary-module}/workflows/wassup/workflow.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/wellness-companion/wellness-companion-sidecar/insights.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/wellness-companion/wellness-companion-sidecar/instructions.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/wellness-companion/wellness-companion-sidecar/memories.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/agents/wellness-companion/wellness-companion-sidecar/patterns.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/daily-checkin/README.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/daily-checkin/workflow.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/guided-meditation/README.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/guided-meditation/workflow.md +0 -0
- /package/{example-custom-module/mwm → docs/sample-custom-modules/sample-wellness-module}/workflows/wellness-journal/README.md +0 -0
- /package/src/modules/bmgd/workflows/4-production/code-review/{backlog_template.md → backlog-template.md} +0 -0
- /package/src/modules/bmm/workflows/1-analysis/{product-brief → create-product-brief}/product-brief.template.md +0 -0
- /package/src/modules/bmm/workflows/3-solutioning/{implementation-readiness → check-implementation-readiness}/templates/readiness-report-template.md +0 -0
- /package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/architecture-decision-template.md +0 -0
- /package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/data/domain-complexity.csv +0 -0
- /package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/data/project-types.csv +0 -0
- /package/src/modules/bmm/workflows/3-solutioning/{architecture → create-architecture}/steps/step-01b-continue.md +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/_shared/excalidraw-library.json +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/_shared/excalidraw-templates.yaml +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-dataflow/checklist.md +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-diagram/checklist.md +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-flowchart/checklist.md +0 -0
- /package/src/modules/bmm/workflows/{diagrams → excalidraw-diagrams}/create-wireframe/checklist.md +0 -0
- /package/src/utility/{models/fragments/handler-data.xml → agent-components/handler-data.txt} +0 -0
|
@@ -21,29 +21,20 @@ module.exports = {
|
|
|
21
21
|
return;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
// Handle agent compilation separately
|
|
25
|
-
if (config.actionType === 'compile') {
|
|
26
|
-
const result = await installer.compileAgents(config);
|
|
27
|
-
console.log(chalk.green('\n✨ Agent compilation complete!'));
|
|
28
|
-
console.log(chalk.cyan(`Rebuilt ${result.agentCount} agents and ${result.taskCount} tasks`));
|
|
29
|
-
process.exit(0);
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
24
|
// Handle quick update separately
|
|
34
25
|
if (config.actionType === 'quick-update') {
|
|
35
26
|
const result = await installer.quickUpdate(config);
|
|
36
27
|
console.log(chalk.green('\n✨ Quick update complete!'));
|
|
37
28
|
console.log(chalk.cyan(`Updated ${result.moduleCount} modules with preserved settings`));
|
|
29
|
+
console.log(
|
|
30
|
+
chalk.magenta(
|
|
31
|
+
"\n📋 Want to see what's new? Check out the changelog: https://github.com/bmad-code-org/BMAD-METHOD/blob/main/CHANGELOG.md",
|
|
32
|
+
),
|
|
33
|
+
);
|
|
38
34
|
process.exit(0);
|
|
39
35
|
return;
|
|
40
36
|
}
|
|
41
37
|
|
|
42
|
-
// Handle reinstall by setting force flag
|
|
43
|
-
if (config.actionType === 'reinstall') {
|
|
44
|
-
config._requestedReinstall = true;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
38
|
// Regular install/update flow
|
|
48
39
|
const result = await installer.install(config);
|
|
49
40
|
|
|
@@ -55,14 +46,11 @@ module.exports = {
|
|
|
55
46
|
|
|
56
47
|
// Check if installation succeeded
|
|
57
48
|
if (result && result.success) {
|
|
58
|
-
console.log(chalk.green('\n✨ Installation complete!'));
|
|
59
|
-
console.log(chalk.cyan('BMAD Core and Selected Modules have been installed to:'), chalk.bold(result.path));
|
|
60
|
-
console.log(chalk.yellow('\nThank you for helping test the early release version of the new BMad Core and BMad Method!'));
|
|
61
|
-
console.log(chalk.cyan('Stable Beta coming soon - please read the full README.md and linked documentation to get started!'));
|
|
62
|
-
|
|
63
49
|
// Run AgentVibes installer if needed
|
|
64
50
|
if (result.needsAgentVibes) {
|
|
65
|
-
|
|
51
|
+
// Add some spacing before AgentVibes setup
|
|
52
|
+
console.log('');
|
|
53
|
+
console.log(chalk.magenta('🎙️ AgentVibes TTS Setup'));
|
|
66
54
|
console.log(chalk.cyan('AgentVibes provides voice synthesis for BMAD agents with:'));
|
|
67
55
|
console.log(chalk.dim(' • ElevenLabs AI (150+ premium voices)'));
|
|
68
56
|
console.log(chalk.dim(' • Piper TTS (50+ free voices)\n'));
|
|
@@ -91,6 +79,7 @@ module.exports = {
|
|
|
91
79
|
shell: true,
|
|
92
80
|
});
|
|
93
81
|
console.log(chalk.green('\n✓ AgentVibes installation complete'));
|
|
82
|
+
console.log(chalk.cyan('\n✨ BMAD with TTS is ready to use!'));
|
|
94
83
|
} catch {
|
|
95
84
|
console.log(chalk.yellow('\n⚠ AgentVibes installation was interrupted or failed'));
|
|
96
85
|
console.log(chalk.cyan('You can run it manually later with:'));
|
|
@@ -9,7 +9,9 @@ module.exports = {
|
|
|
9
9
|
options: [],
|
|
10
10
|
action: async () => {
|
|
11
11
|
try {
|
|
12
|
-
const
|
|
12
|
+
const result = await installer.getAvailableModules();
|
|
13
|
+
const { modules, customModules } = result;
|
|
14
|
+
|
|
13
15
|
console.log(chalk.cyan('\n📦 Available BMAD Modules:\n'));
|
|
14
16
|
|
|
15
17
|
for (const module of modules) {
|
|
@@ -19,6 +21,16 @@ module.exports = {
|
|
|
19
21
|
console.log();
|
|
20
22
|
}
|
|
21
23
|
|
|
24
|
+
if (customModules && customModules.length > 0) {
|
|
25
|
+
console.log(chalk.cyan('\n🔧 Custom Modules:\n'));
|
|
26
|
+
for (const module of customModules) {
|
|
27
|
+
console.log(chalk.bold(` ${module.id}`));
|
|
28
|
+
console.log(chalk.dim(` ${module.description}`));
|
|
29
|
+
console.log(chalk.dim(` Version: ${module.version}`));
|
|
30
|
+
console.log();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
22
34
|
process.exit(0);
|
|
23
35
|
} catch (error) {
|
|
24
36
|
console.error(chalk.red('Error:'), error.message);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
|
-
const yaml = require('
|
|
3
|
+
const yaml = require('yaml');
|
|
4
4
|
const chalk = require('chalk');
|
|
5
5
|
const inquirer = require('inquirer');
|
|
6
6
|
const { getProjectRoot, getModulePath } = require('../../../lib/project-root');
|
|
@@ -15,7 +15,7 @@ class ConfigCollector {
|
|
|
15
15
|
|
|
16
16
|
/**
|
|
17
17
|
* Find the bmad installation directory in a project
|
|
18
|
-
* V6+ installations can use ANY folder name but ALWAYS have
|
|
18
|
+
* V6+ installations can use ANY folder name but ALWAYS have _config/manifest.yaml
|
|
19
19
|
* @param {string} projectDir - Project directory
|
|
20
20
|
* @returns {Promise<string>} Path to bmad directory
|
|
21
21
|
*/
|
|
@@ -26,13 +26,13 @@ class ConfigCollector {
|
|
|
26
26
|
return path.join(projectDir, 'bmad');
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
-
// V6+ strategy: Look for ANY directory with
|
|
29
|
+
// V6+ strategy: Look for ANY directory with _config/manifest.yaml
|
|
30
30
|
// This is the definitive marker of a V6+ installation
|
|
31
31
|
try {
|
|
32
32
|
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
33
33
|
for (const entry of entries) {
|
|
34
34
|
if (entry.isDirectory()) {
|
|
35
|
-
const manifestPath = path.join(projectDir, entry.name, '
|
|
35
|
+
const manifestPath = path.join(projectDir, entry.name, '_config', 'manifest.yaml');
|
|
36
36
|
if (await fs.pathExists(manifestPath)) {
|
|
37
37
|
// Found a V6+ installation
|
|
38
38
|
return path.join(projectDir, entry.name);
|
|
@@ -59,12 +59,12 @@ class ConfigCollector {
|
|
|
59
59
|
return null;
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
// Look for ANY directory with
|
|
62
|
+
// Look for ANY directory with _config/manifest.yaml
|
|
63
63
|
try {
|
|
64
64
|
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
65
65
|
for (const entry of entries) {
|
|
66
66
|
if (entry.isDirectory()) {
|
|
67
|
-
const manifestPath = path.join(projectDir, entry.name, '
|
|
67
|
+
const manifestPath = path.join(projectDir, entry.name, '_config', 'manifest.yaml');
|
|
68
68
|
if (await fs.pathExists(manifestPath)) {
|
|
69
69
|
// Found a V6+ installation, return just the folder name
|
|
70
70
|
return entry.name;
|
|
@@ -105,11 +105,17 @@ class ConfigCollector {
|
|
|
105
105
|
|
|
106
106
|
for (const entry of entries) {
|
|
107
107
|
if (entry.isDirectory()) {
|
|
108
|
+
// Skip the _config directory - it's for system use
|
|
109
|
+
if (entry.name === '_config' || entry.name === '_memory') {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
const moduleConfigPath = path.join(bmadDir, entry.name, 'config.yaml');
|
|
114
|
+
|
|
109
115
|
if (await fs.pathExists(moduleConfigPath)) {
|
|
110
116
|
try {
|
|
111
117
|
const content = await fs.readFile(moduleConfigPath, 'utf8');
|
|
112
|
-
const moduleConfig = yaml.
|
|
118
|
+
const moduleConfig = yaml.parse(content);
|
|
113
119
|
if (moduleConfig) {
|
|
114
120
|
this.existingConfig[entry.name] = moduleConfig;
|
|
115
121
|
foundAny = true;
|
|
@@ -121,10 +127,6 @@ class ConfigCollector {
|
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
if (foundAny) {
|
|
125
|
-
console.log(chalk.cyan('\n📋 Found existing BMAD module configurations'));
|
|
126
|
-
}
|
|
127
|
-
|
|
128
130
|
return foundAny;
|
|
129
131
|
}
|
|
130
132
|
|
|
@@ -132,8 +134,12 @@ class ConfigCollector {
|
|
|
132
134
|
* Collect configuration for all modules
|
|
133
135
|
* @param {Array} modules - List of modules to configure (including 'core')
|
|
134
136
|
* @param {string} projectDir - Target project directory
|
|
137
|
+
* @param {Object} options - Additional options
|
|
138
|
+
* @param {Map} options.customModulePaths - Map of module ID to source path for custom modules
|
|
135
139
|
*/
|
|
136
|
-
async collectAllConfigurations(modules, projectDir) {
|
|
140
|
+
async collectAllConfigurations(modules, projectDir, options = {}) {
|
|
141
|
+
// Store custom module paths for use in collectModuleConfig
|
|
142
|
+
this.customModulePaths = options.customModulePaths || new Map();
|
|
137
143
|
await this.loadExistingConfig(projectDir);
|
|
138
144
|
|
|
139
145
|
// Check if core was already collected (e.g., in early collection phase)
|
|
@@ -234,7 +240,7 @@ class ConfigCollector {
|
|
|
234
240
|
}
|
|
235
241
|
|
|
236
242
|
const configContent = await fs.readFile(configPath, 'utf8');
|
|
237
|
-
const moduleConfig = yaml.
|
|
243
|
+
const moduleConfig = yaml.parse(configContent);
|
|
238
244
|
|
|
239
245
|
if (!moduleConfig) {
|
|
240
246
|
return false;
|
|
@@ -244,14 +250,41 @@ class ConfigCollector {
|
|
|
244
250
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
245
251
|
const existingKeys = this.existingConfig && this.existingConfig[moduleName] ? Object.keys(this.existingConfig[moduleName]) : [];
|
|
246
252
|
|
|
253
|
+
// Check if this module has no configuration keys at all (like CIS)
|
|
254
|
+
// Filter out metadata fields and only count actual config objects
|
|
255
|
+
const metadataFields = new Set(['code', 'name', 'header', 'subheader', 'default_selected']);
|
|
256
|
+
const actualConfigKeys = configKeys.filter((key) => !metadataFields.has(key));
|
|
257
|
+
const hasNoConfig = actualConfigKeys.length === 0;
|
|
258
|
+
|
|
259
|
+
// If module has no config keys at all, handle it specially
|
|
260
|
+
if (hasNoConfig && moduleConfig.subheader) {
|
|
261
|
+
// Add blank line for better readability (matches other modules)
|
|
262
|
+
console.log();
|
|
263
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
264
|
+
|
|
265
|
+
// Display the module name in color first (matches other modules)
|
|
266
|
+
console.log(chalk.cyan('?') + ' ' + chalk.magenta(moduleDisplayName));
|
|
267
|
+
|
|
268
|
+
// Show the subheader since there's no configuration to ask about
|
|
269
|
+
console.log(chalk.dim(` ✓ ${moduleConfig.subheader}`));
|
|
270
|
+
return false; // No new fields
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
// Find new interactive fields (with prompt)
|
|
247
274
|
const newKeys = configKeys.filter((key) => {
|
|
248
275
|
const item = moduleConfig[key];
|
|
249
276
|
// Check if it's a config item and doesn't exist in existing config
|
|
250
277
|
return item && typeof item === 'object' && item.prompt && !existingKeys.includes(key);
|
|
251
278
|
});
|
|
252
279
|
|
|
253
|
-
//
|
|
254
|
-
|
|
280
|
+
// Find new static fields (without prompt, just result)
|
|
281
|
+
const newStaticKeys = configKeys.filter((key) => {
|
|
282
|
+
const item = moduleConfig[key];
|
|
283
|
+
return item && typeof item === 'object' && !item.prompt && item.result && !existingKeys.includes(key);
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// If in silent mode and no new keys (neither interactive nor static), use existing config and skip prompts
|
|
287
|
+
if (silentMode && newKeys.length === 0 && newStaticKeys.length === 0) {
|
|
255
288
|
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
256
289
|
if (!this.collectedConfig[moduleName]) {
|
|
257
290
|
this.collectedConfig[moduleName] = {};
|
|
@@ -285,14 +318,18 @@ class ConfigCollector {
|
|
|
285
318
|
this.allAnswers[`${moduleName}_user_name`] = this.getDefaultUsername();
|
|
286
319
|
}
|
|
287
320
|
}
|
|
288
|
-
// Show "no config" message for modules with no new questions
|
|
289
|
-
CLIUtils.displayModuleNoConfig(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
290
|
-
return false; // No new fields
|
|
291
321
|
}
|
|
292
322
|
|
|
293
|
-
//
|
|
294
|
-
|
|
323
|
+
// Show "no config" message for modules with no new questions (that have config keys)
|
|
324
|
+
console.log(chalk.dim(` ✓ ${moduleName.toUpperCase()} module already up to date`));
|
|
325
|
+
return false; // No new fields
|
|
326
|
+
|
|
327
|
+
// If we have new fields (interactive or static), process them
|
|
328
|
+
if (newKeys.length > 0 || newStaticKeys.length > 0) {
|
|
295
329
|
const questions = [];
|
|
330
|
+
const staticAnswers = {};
|
|
331
|
+
|
|
332
|
+
// Build questions for interactive fields
|
|
296
333
|
for (const key of newKeys) {
|
|
297
334
|
const item = moduleConfig[key];
|
|
298
335
|
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
@@ -301,38 +338,49 @@ class ConfigCollector {
|
|
|
301
338
|
}
|
|
302
339
|
}
|
|
303
340
|
|
|
341
|
+
// Prepare static answers (no prompt, just result)
|
|
342
|
+
for (const key of newStaticKeys) {
|
|
343
|
+
staticAnswers[`${moduleName}_${key}`] = undefined;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Collect all answers (static + prompted)
|
|
347
|
+
let allAnswers = { ...staticAnswers };
|
|
348
|
+
|
|
304
349
|
if (questions.length > 0) {
|
|
305
350
|
// Only show header if we actually have questions
|
|
306
351
|
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
307
352
|
console.log(); // Line break before questions
|
|
308
|
-
const
|
|
309
|
-
|
|
310
|
-
// Store answers for cross-referencing
|
|
311
|
-
Object.assign(this.allAnswers, answers);
|
|
312
|
-
|
|
313
|
-
// Process answers and build result values
|
|
314
|
-
for (const key of Object.keys(answers)) {
|
|
315
|
-
const originalKey = key.replace(`${moduleName}_`, '');
|
|
316
|
-
const item = moduleConfig[originalKey];
|
|
317
|
-
const value = answers[key];
|
|
318
|
-
|
|
319
|
-
let result;
|
|
320
|
-
if (Array.isArray(value)) {
|
|
321
|
-
result = value;
|
|
322
|
-
} else if (item.result) {
|
|
323
|
-
result = this.processResultTemplate(item.result, value);
|
|
324
|
-
} else {
|
|
325
|
-
result = value;
|
|
326
|
-
}
|
|
353
|
+
const promptedAnswers = await inquirer.prompt(questions);
|
|
327
354
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
355
|
+
// Merge prompted answers with static answers
|
|
356
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
357
|
+
} else if (newStaticKeys.length > 0) {
|
|
358
|
+
// Only static fields, no questions - show no config message
|
|
359
|
+
console.log(chalk.dim(` ✓ ${moduleName.toUpperCase()} module configuration updated`));
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Store all answers for cross-referencing
|
|
363
|
+
Object.assign(this.allAnswers, allAnswers);
|
|
364
|
+
|
|
365
|
+
// Process all answers (both static and prompted)
|
|
366
|
+
for (const key of Object.keys(allAnswers)) {
|
|
367
|
+
const originalKey = key.replace(`${moduleName}_`, '');
|
|
368
|
+
const item = moduleConfig[originalKey];
|
|
369
|
+
const value = allAnswers[key];
|
|
370
|
+
|
|
371
|
+
let result;
|
|
372
|
+
if (Array.isArray(value)) {
|
|
373
|
+
result = value;
|
|
374
|
+
} else if (item.result) {
|
|
375
|
+
result = this.processResultTemplate(item.result, value);
|
|
376
|
+
} else {
|
|
377
|
+
result = value;
|
|
332
378
|
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
379
|
+
|
|
380
|
+
if (!this.collectedConfig[moduleName]) {
|
|
381
|
+
this.collectedConfig[moduleName] = {};
|
|
382
|
+
}
|
|
383
|
+
this.collectedConfig[moduleName][originalKey] = result;
|
|
336
384
|
}
|
|
337
385
|
}
|
|
338
386
|
|
|
@@ -349,7 +397,7 @@ class ConfigCollector {
|
|
|
349
397
|
}
|
|
350
398
|
}
|
|
351
399
|
|
|
352
|
-
return newKeys.length > 0; // Return true if we
|
|
400
|
+
return newKeys.length > 0 || newStaticKeys.length > 0; // Return true if we had any new fields (interactive or static)
|
|
353
401
|
}
|
|
354
402
|
|
|
355
403
|
/**
|
|
@@ -451,11 +499,21 @@ class ConfigCollector {
|
|
|
451
499
|
this.allAnswers = {};
|
|
452
500
|
}
|
|
453
501
|
// Load module's config
|
|
454
|
-
// First,
|
|
455
|
-
let installerConfigPath =
|
|
456
|
-
let moduleConfigPath =
|
|
502
|
+
// First, check if we have a custom module path for this module
|
|
503
|
+
let installerConfigPath = null;
|
|
504
|
+
let moduleConfigPath = null;
|
|
505
|
+
|
|
506
|
+
if (this.customModulePaths && this.customModulePaths.has(moduleName)) {
|
|
507
|
+
const customPath = this.customModulePaths.get(moduleName);
|
|
508
|
+
installerConfigPath = path.join(customPath, '_module-installer', 'module.yaml');
|
|
509
|
+
moduleConfigPath = path.join(customPath, 'module.yaml');
|
|
510
|
+
} else {
|
|
511
|
+
// Try the standard src/modules location
|
|
512
|
+
installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
|
|
513
|
+
moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
514
|
+
}
|
|
457
515
|
|
|
458
|
-
// If not found in src/modules
|
|
516
|
+
// If not found in src/modules or custom paths, search the project
|
|
459
517
|
if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
|
|
460
518
|
// Use the module manager to find the module source
|
|
461
519
|
const { ModuleManager } = require('../modules/manager');
|
|
@@ -479,7 +537,7 @@ class ConfigCollector {
|
|
|
479
537
|
}
|
|
480
538
|
|
|
481
539
|
const configContent = await fs.readFile(configPath, 'utf8');
|
|
482
|
-
const moduleConfig = yaml.
|
|
540
|
+
const moduleConfig = yaml.parse(configContent);
|
|
483
541
|
|
|
484
542
|
if (!moduleConfig) {
|
|
485
543
|
return;
|
|
@@ -487,30 +545,91 @@ class ConfigCollector {
|
|
|
487
545
|
|
|
488
546
|
// Process each config item
|
|
489
547
|
const questions = [];
|
|
548
|
+
const staticAnswers = {};
|
|
490
549
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
491
550
|
|
|
492
551
|
for (const key of configKeys) {
|
|
493
552
|
const item = moduleConfig[key];
|
|
494
553
|
|
|
495
554
|
// Skip if not a config object
|
|
496
|
-
if (!item || typeof item !== 'object'
|
|
555
|
+
if (!item || typeof item !== 'object') {
|
|
497
556
|
continue;
|
|
498
557
|
}
|
|
499
558
|
|
|
500
|
-
|
|
501
|
-
if (
|
|
502
|
-
|
|
559
|
+
// Handle static values (no prompt, just result)
|
|
560
|
+
if (!item.prompt && item.result) {
|
|
561
|
+
// Add to static answers with a marker value
|
|
562
|
+
staticAnswers[`${moduleName}_${key}`] = undefined;
|
|
563
|
+
continue;
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Handle interactive values (with prompt)
|
|
567
|
+
if (item.prompt) {
|
|
568
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
569
|
+
if (question) {
|
|
570
|
+
questions.push(question);
|
|
571
|
+
}
|
|
503
572
|
}
|
|
504
573
|
}
|
|
505
574
|
|
|
506
|
-
//
|
|
575
|
+
// Collect all answers (static + prompted)
|
|
576
|
+
let allAnswers = { ...staticAnswers };
|
|
577
|
+
|
|
578
|
+
// If there are questions to ask, prompt for accepting defaults vs customizing
|
|
507
579
|
if (questions.length > 0) {
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
580
|
+
// Get friendly module name from config or use uppercase module name
|
|
581
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
582
|
+
|
|
583
|
+
// Add blank line for better readability
|
|
584
|
+
console.log();
|
|
585
|
+
|
|
586
|
+
// Display the module name in color first
|
|
587
|
+
console.log(chalk.cyan('?') + ' ' + chalk.magenta(moduleDisplayName));
|
|
588
|
+
|
|
589
|
+
// Ask user if they want to accept defaults or customize on the next line
|
|
590
|
+
const { customize } = await inquirer.prompt([
|
|
591
|
+
{
|
|
592
|
+
type: 'confirm',
|
|
593
|
+
name: 'customize',
|
|
594
|
+
message: 'Accept Defaults (no to customize)?',
|
|
595
|
+
default: true,
|
|
596
|
+
},
|
|
597
|
+
]);
|
|
598
|
+
|
|
599
|
+
if (customize) {
|
|
600
|
+
// Accept defaults - only ask questions that have NO default value
|
|
601
|
+
const questionsWithoutDefaults = questions.filter((q) => q.default === undefined || q.default === null || q.default === '');
|
|
602
|
+
|
|
603
|
+
if (questionsWithoutDefaults.length > 0) {
|
|
604
|
+
console.log(chalk.dim(`\n Asking required questions for ${moduleName.toUpperCase()}...`));
|
|
605
|
+
const promptedAnswers = await inquirer.prompt(questionsWithoutDefaults);
|
|
606
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// For questions with defaults that weren't asked, we need to process them with their default values
|
|
610
|
+
const questionsWithDefaults = questions.filter((q) => q.default !== undefined && q.default !== null && q.default !== '');
|
|
611
|
+
for (const question of questionsWithDefaults) {
|
|
612
|
+
// Skip function defaults - these are dynamic and will be evaluated later
|
|
613
|
+
if (typeof question.default === 'function') {
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
allAnswers[question.name] = question.default;
|
|
617
|
+
}
|
|
618
|
+
} else {
|
|
619
|
+
// Customize - ask all questions
|
|
620
|
+
console.log(chalk.dim(`\n Configuring ${moduleName.toUpperCase()}...`));
|
|
621
|
+
const promptedAnswers = await inquirer.prompt(questions);
|
|
622
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Store all answers for cross-referencing
|
|
627
|
+
Object.assign(this.allAnswers, allAnswers);
|
|
511
628
|
|
|
512
|
-
|
|
513
|
-
|
|
629
|
+
// Process all answers (both static and prompted)
|
|
630
|
+
// Always process if we have any answers or static answers
|
|
631
|
+
if (Object.keys(allAnswers).length > 0 || Object.keys(staticAnswers).length > 0) {
|
|
632
|
+
const answers = allAnswers;
|
|
514
633
|
|
|
515
634
|
// Process answers and build result values
|
|
516
635
|
for (const key of Object.keys(answers)) {
|
|
@@ -608,8 +727,68 @@ class ConfigCollector {
|
|
|
608
727
|
|
|
609
728
|
// No longer display completion boxes - keep output clean
|
|
610
729
|
} else {
|
|
611
|
-
// No questions for this module - show completion message
|
|
612
|
-
|
|
730
|
+
// No questions for this module - show completion message with header if available
|
|
731
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
732
|
+
|
|
733
|
+
// Check if this module has NO configuration keys at all (like CIS)
|
|
734
|
+
// Filter out metadata fields and only count actual config objects
|
|
735
|
+
const metadataFields = new Set(['code', 'name', 'header', 'subheader', 'default_selected']);
|
|
736
|
+
const actualConfigKeys = configKeys.filter((key) => !metadataFields.has(key));
|
|
737
|
+
const hasNoConfig = actualConfigKeys.length === 0;
|
|
738
|
+
|
|
739
|
+
if (hasNoConfig && (moduleConfig.subheader || moduleConfig.header)) {
|
|
740
|
+
// Module explicitly has no configuration - show with special styling
|
|
741
|
+
// Add blank line for better readability (matches other modules)
|
|
742
|
+
console.log();
|
|
743
|
+
|
|
744
|
+
// Display the module name in color first (matches other modules)
|
|
745
|
+
console.log(chalk.cyan('?') + ' ' + chalk.magenta(moduleDisplayName));
|
|
746
|
+
|
|
747
|
+
// Ask user if they want to accept defaults or customize on the next line
|
|
748
|
+
const { customize } = await inquirer.prompt([
|
|
749
|
+
{
|
|
750
|
+
type: 'confirm',
|
|
751
|
+
name: 'customize',
|
|
752
|
+
message: 'Accept Defaults (no to customize)?',
|
|
753
|
+
default: true,
|
|
754
|
+
},
|
|
755
|
+
]);
|
|
756
|
+
|
|
757
|
+
// Show the subheader if available, otherwise show a default message
|
|
758
|
+
if (moduleConfig.subheader) {
|
|
759
|
+
console.log(chalk.dim(` ✓ ${moduleConfig.subheader}`));
|
|
760
|
+
} else {
|
|
761
|
+
console.log(chalk.dim(` ✓ No custom configuration required`));
|
|
762
|
+
}
|
|
763
|
+
} else {
|
|
764
|
+
// Module has config but just no questions to ask
|
|
765
|
+
console.log(chalk.dim(` ✓ ${moduleName.toUpperCase()} module configured`));
|
|
766
|
+
}
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// If we have no collected config for this module, but we have a module schema,
|
|
770
|
+
// ensure we have at least an empty object
|
|
771
|
+
if (!this.collectedConfig[moduleName]) {
|
|
772
|
+
this.collectedConfig[moduleName] = {};
|
|
773
|
+
|
|
774
|
+
// If we accepted defaults and have no answers, we still need to check
|
|
775
|
+
// if there are any static values in the schema that should be applied
|
|
776
|
+
if (moduleConfig) {
|
|
777
|
+
for (const key of Object.keys(moduleConfig)) {
|
|
778
|
+
if (key !== 'prompt' && moduleConfig[key] && typeof moduleConfig[key] === 'object') {
|
|
779
|
+
const item = moduleConfig[key];
|
|
780
|
+
// For static items (no prompt, just result), apply the result
|
|
781
|
+
if (!item.prompt && item.result) {
|
|
782
|
+
// Apply any placeholder replacements to the result
|
|
783
|
+
let result = item.result;
|
|
784
|
+
if (typeof result === 'string') {
|
|
785
|
+
result = this.replacePlaceholders(result, moduleName, moduleConfig);
|
|
786
|
+
}
|
|
787
|
+
this.collectedConfig[moduleName][key] = result;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
}
|
|
613
792
|
}
|
|
614
793
|
}
|
|
615
794
|
|
|
@@ -682,15 +861,6 @@ class ConfigCollector {
|
|
|
682
861
|
}
|
|
683
862
|
}
|
|
684
863
|
|
|
685
|
-
// Special handling for bmad_folder: detect existing folder name
|
|
686
|
-
if (moduleName === 'core' && key === 'bmad_folder' && !existingValue && this.currentProjectDir) {
|
|
687
|
-
// Try to detect the existing BMAD folder name
|
|
688
|
-
const detectedFolder = await this.detectExistingBmadFolder(this.currentProjectDir);
|
|
689
|
-
if (detectedFolder) {
|
|
690
|
-
existingValue = detectedFolder;
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
|
|
694
864
|
// Special handling for user_name: default to system user
|
|
695
865
|
if (moduleName === 'core' && key === 'user_name' && !existingValue) {
|
|
696
866
|
item.default = this.getDefaultUsername();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Custom Module Source Cache
|
|
3
|
-
* Caches custom module sources under
|
|
3
|
+
* Caches custom module sources under _config/custom/ to ensure they're never lost
|
|
4
4
|
* and can be checked into source control
|
|
5
5
|
*/
|
|
6
6
|
|
|
@@ -11,7 +11,7 @@ const crypto = require('node:crypto');
|
|
|
11
11
|
class CustomModuleCache {
|
|
12
12
|
constructor(bmadDir) {
|
|
13
13
|
this.bmadDir = bmadDir;
|
|
14
|
-
this.customCacheDir = path.join(bmadDir, '
|
|
14
|
+
this.customCacheDir = path.join(bmadDir, '_config', 'custom');
|
|
15
15
|
this.manifestPath = path.join(this.customCacheDir, 'cache-manifest.yaml');
|
|
16
16
|
}
|
|
17
17
|
|
|
@@ -31,19 +31,21 @@ class CustomModuleCache {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
const content = await fs.readFile(this.manifestPath, 'utf8');
|
|
34
|
-
const yaml = require('
|
|
35
|
-
return yaml.
|
|
34
|
+
const yaml = require('yaml');
|
|
35
|
+
return yaml.parse(content) || {};
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
/**
|
|
39
39
|
* Update cache manifest
|
|
40
40
|
*/
|
|
41
41
|
async updateCacheManifest(manifest) {
|
|
42
|
-
const yaml = require('
|
|
43
|
-
|
|
42
|
+
const yaml = require('yaml');
|
|
43
|
+
// Clean the manifest to remove any non-serializable values
|
|
44
|
+
const cleanManifest = structuredClone(manifest);
|
|
45
|
+
|
|
46
|
+
const content = yaml.stringify(cleanManifest, {
|
|
44
47
|
indent: 2,
|
|
45
|
-
lineWidth:
|
|
46
|
-
noRefs: true,
|
|
48
|
+
lineWidth: 0,
|
|
47
49
|
sortKeys: false,
|
|
48
50
|
});
|
|
49
51
|
|
|
@@ -51,7 +53,19 @@ class CustomModuleCache {
|
|
|
51
53
|
}
|
|
52
54
|
|
|
53
55
|
/**
|
|
54
|
-
*
|
|
56
|
+
* Stream a file into the hash to avoid loading entire file into memory
|
|
57
|
+
*/
|
|
58
|
+
async hashFileStream(filePath, hash) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const stream = require('node:fs').createReadStream(filePath);
|
|
61
|
+
stream.on('data', (chunk) => hash.update(chunk));
|
|
62
|
+
stream.on('end', resolve);
|
|
63
|
+
stream.on('error', reject);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Calculate hash of a file or directory using streaming to minimize memory usage
|
|
55
69
|
*/
|
|
56
70
|
async calculateHash(sourcePath) {
|
|
57
71
|
const hash = crypto.createHash('sha256');
|
|
@@ -76,14 +90,14 @@ class CustomModuleCache {
|
|
|
76
90
|
files.sort(); // Ensure consistent order
|
|
77
91
|
|
|
78
92
|
for (const file of files) {
|
|
79
|
-
const content = await fs.readFile(file);
|
|
80
93
|
const relativePath = path.relative(sourcePath, file);
|
|
81
|
-
|
|
94
|
+
// Hash the path first, then stream file contents
|
|
95
|
+
hash.update(relativePath + '|');
|
|
96
|
+
await this.hashFileStream(file, hash);
|
|
82
97
|
}
|
|
83
98
|
} else {
|
|
84
|
-
// For single files
|
|
85
|
-
|
|
86
|
-
hash.update(content);
|
|
99
|
+
// For single files, stream directly into hash
|
|
100
|
+
await this.hashFileStream(sourcePath, hash);
|
|
87
101
|
}
|
|
88
102
|
|
|
89
103
|
return hash.digest('hex');
|
|
@@ -133,12 +147,18 @@ class CustomModuleCache {
|
|
|
133
147
|
const sourceHash = await this.calculateHash(sourcePath);
|
|
134
148
|
const cacheHash = await this.calculateHash(cacheDir);
|
|
135
149
|
|
|
136
|
-
// Update manifest - don't store
|
|
150
|
+
// Update manifest - don't store absolute paths for portability
|
|
151
|
+
// Clean metadata to remove absolute paths
|
|
152
|
+
const cleanMetadata = { ...metadata };
|
|
153
|
+
if (cleanMetadata.sourcePath) {
|
|
154
|
+
delete cleanMetadata.sourcePath;
|
|
155
|
+
}
|
|
156
|
+
|
|
137
157
|
cacheManifest[moduleId] = {
|
|
138
158
|
originalHash: sourceHash,
|
|
139
159
|
cacheHash: cacheHash,
|
|
140
160
|
cachedAt: new Date().toISOString(),
|
|
141
|
-
...
|
|
161
|
+
...cleanMetadata,
|
|
142
162
|
};
|
|
143
163
|
|
|
144
164
|
await this.updateCacheManifest(cacheManifest);
|