bmad-method 6.0.0-alpha.14 → 6.0.0-alpha.16
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 +36 -0
- package/{CODE_OF_CONDUCT.md → .github/CODE_OF_CONDUCT.md} +4 -4
- package/CHANGELOG.md +168 -409
- package/README.md +4 -1
- package/docs/agent-customization-guide.md +7 -7
- package/docs/custom-content-installation.md +245 -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 +2 -2
- package/docs/installers-bundlers/ide-injections.md +2 -2
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +29 -28
- package/docs/v4-to-v6-upgrade.md +10 -10
- package/docs/web-bundles-gemini-gpt-guide.md +2 -2
- package/package.json +1 -1
- package/src/core/_module-installer/installer.js +1 -1
- package/src/core/agents/bmad-master.agent.yaml +5 -5
- package/src/core/agents/bmad-web-orchestrator.agent.xml +6 -6
- package/src/core/{_module-installer/install-config.yaml → module.yaml} +0 -7
- package/src/core/resources/excalidraw/README.md +4 -4
- 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 +1 -1
- package/src/core/workflows/brainstorming/workflow.md +2 -2
- 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/README.md +2 -2
- package/src/modules/bmb/_module-installer/installer.js +1 -1
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +15 -15
- package/src/modules/bmb/docs/agents/agent-compilation.md +2 -2
- package/src/modules/bmb/docs/agents/agent-menu-patterns.md +22 -22
- package/src/modules/bmb/docs/agents/expert-agent-architecture.md +1 -1
- package/src/modules/bmb/docs/agents/index.md +2 -2
- package/src/modules/bmb/docs/agents/module-agent-architecture.md +50 -51
- package/src/modules/bmb/docs/agents/understanding-agent-types.md +3 -3
- 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-installer/install-config.yaml → module.yaml} +0 -1
- package/src/modules/bmb/reference/agents/module-examples/README.md +1 -1
- 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/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 -1
- 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/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 +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +7 -7
- package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +4 -4
- package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +3 -3
- package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +3 -3
- package/src/modules/bmb/workflows/create-agent/workflow.md +13 -13
- package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +2 -2
- package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +4 -4
- package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +4 -4
- 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 +6 -6
- package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +3 -3
- package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +12 -12
- package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +6 -5
- package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +6 -5
- package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +7 -7
- package/src/modules/bmb/workflows/create-module/templates/agent.template.md +7 -7
- package/src/modules/bmb/workflows/create-module/templates/installer.template.js +1 -1
- package/src/modules/bmb/workflows/create-module/templates/{install-config.template.yaml → module.template.yaml} +1 -1
- package/src/modules/bmb/workflows/create-module/validation.md +3 -3
- package/src/modules/bmb/workflows/create-module/workflow.md +2 -2
- package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +5 -5
- package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +4 -4
- package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-06-design.md +10 -10
- package/src/modules/bmb/workflows/create-workflow/steps/step-07-build.md +13 -13
- package/src/modules/bmb/workflows/create-workflow/steps/step-08-review.md +3 -3
- package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +1 -1
- package/src/modules/bmb/workflows/create-workflow/workflow.md +1 -1
- 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 +2 -2
- package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +2 -2
- package/src/modules/bmb/workflows-legacy/edit-module/instructions.md +4 -4
- 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 +3 -2
- 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 +9 -9
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +21 -21
- package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -1
- 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 +2 -2
- 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 +1 -1
- 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/_module-installer/installer.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
- package/src/modules/bmm/agents/analyst.agent.yaml +8 -8
- package/src/modules/bmm/agents/architect.agent.yaml +8 -8
- package/src/modules/bmm/agents/dev.agent.yaml +3 -3
- 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 +9 -9
- 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 +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 +3 -3
- package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
- package/src/modules/bmm/docs/workflows-implementation.md +0 -100
- package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +1 -2
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-01-init.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-01b-continue.md +1 -1
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +3 -3
- package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-06-complete.md +5 -3
- package/src/modules/bmm/workflows/1-analysis/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 +1 -1
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-02-context.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-05-patterns.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-06-structure.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-07-validation.md +4 -4
- package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-08-complete.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-01-document-discovery.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-02-prd-analysis.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-03-epic-coverage-validation.md +6 -6
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-04-ux-alignment.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-05-epic-quality-review.md +2 -2
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-06-final-assessment.md +1 -1
- package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.md +1 -1
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +1 -1
- 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 +2 -2
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.xml +1 -1
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +2 -2
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +3 -3
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +2 -2
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +2 -2
- package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +2 -2
- 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/diagrams/create-dataflow/instructions.md +1 -1
- package/src/modules/bmm/workflows/diagrams/create-dataflow/workflow.yaml +5 -5
- package/src/modules/bmm/workflows/diagrams/create-diagram/instructions.md +2 -2
- package/src/modules/bmm/workflows/diagrams/create-diagram/workflow.yaml +5 -5
- package/src/modules/bmm/workflows/diagrams/create-flowchart/instructions.md +2 -2
- package/src/modules/bmm/workflows/diagrams/create-flowchart/workflow.yaml +5 -5
- package/src/modules/bmm/workflows/diagrams/create-wireframe/instructions.md +1 -1
- package/src/modules/bmm/workflows/diagrams/create-wireframe/workflow.yaml +5 -5
- 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/generate-project-context/steps/step-02-generate.md +2 -2
- package/src/modules/bmm/workflows/generate-project-context/workflow.md +2 -2
- 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 +2 -2
- 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/README.md +1 -1
- package/src/modules/cis/_module-installer/installer.js +1 -1
- package/src/modules/cis/agents/README.md +1 -1
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +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.agent.yaml +4 -4
- package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -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/models/agent-activation-ide.xml +3 -3
- package/src/utility/models/agent-activation-web.xml +3 -3
- package/src/utility/models/fragments/activation-steps.xml +1 -1
- 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 +23 -23
- package/tools/cli/bundlers/web-bundler.js +23 -33
- package/tools/cli/commands/build.js +5 -5
- package/tools/cli/installers/lib/core/config-collector.js +33 -20
- package/tools/cli/installers/lib/core/custom-module-cache.js +251 -0
- package/tools/cli/installers/lib/core/detector.js +8 -4
- package/tools/cli/installers/lib/core/installer.js +885 -98
- package/tools/cli/installers/lib/core/manifest-generator.js +177 -14
- package/tools/cli/installers/lib/core/manifest.js +47 -0
- package/tools/cli/installers/lib/custom/handler.js +147 -20
- package/tools/cli/installers/lib/ide/_base-ide.js +14 -14
- package/tools/cli/installers/lib/ide/gemini.js +4 -4
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +2 -2
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +3 -3
- 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 +99 -53
- package/tools/cli/lib/agent/compiler.js +6 -14
- package/tools/cli/lib/agent/installer.js +4 -3
- package/tools/cli/lib/cli-utils.js +21 -4
- package/tools/cli/lib/ui.js +496 -12
- package/tools/cli/regenerate-manifests.js +3 -4
- package/tools/maintainer/review-pr-README.md +55 -0
- package/tools/maintainer/review-pr.md +242 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/bmad-method-6.0.0-alpha.14.tgz +0 -0
- package/docs/custom-agent-installation.md +0 -137
- package/example-custom-content/README.md +0 -4
- package/example-custom-content/agents/commit-poet/commit-poet.agent.yaml +0 -129
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/instructions.md +0 -70
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -111
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -70
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +0 -114
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +0 -134
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +0 -161
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -103
- package/example-custom-content/agents/toolsmith/toolsmith-sidecar/memories.md +0 -17
- package/example-custom-content/agents/toolsmith/toolsmith.agent.yaml +0 -109
- package/example-custom-content/custom.yaml +0 -3
- package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +0 -168
- package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +0 -155
- package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +0 -89
- package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +0 -36
- package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +0 -150
- package/example-custom-content/workflows/quiz-master/templates/csv-headers.template +0 -1
- package/example-custom-content/workflows/quiz-master/workflow-plan-quiz-master.md +0 -269
- package/example-custom-content/workflows/quiz-master/workflow.md +0 -54
- package/example-custom-content/workflows/wassup/workflow.md +0 -26
- package/example-custom-module/mwm/README.md +0 -4
- package/example-custom-module/mwm/_module-installer/install-config.yaml +0 -27
- 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 -150
- package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +0 -137
- package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +0 -137
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md +0 -13
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md +0 -30
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md +0 -13
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md +0 -17
- package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +0 -124
- 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/example-custom-module/mwm/workflows/daily-checkin/README.md +0 -32
- package/example-custom-module/mwm/workflows/daily-checkin/workflow.md +0 -45
- package/example-custom-module/mwm/workflows/guided-meditation/README.md +0 -31
- package/example-custom-module/mwm/workflows/guided-meditation/workflow.md +0 -45
- package/example-custom-module/mwm/workflows/wellness-journal/README.md +0 -31
- package/example-custom-module/mwm/workflows/wellness-journal/workflow.md +0 -45
package/tools/cli/lib/ui.js
CHANGED
|
@@ -24,6 +24,7 @@ const path = require('node:path');
|
|
|
24
24
|
const os = require('node:os');
|
|
25
25
|
const fs = require('fs-extra');
|
|
26
26
|
const { CLIUtils } = require('./cli-utils');
|
|
27
|
+
const { CustomHandler } = require('../installers/lib/custom/handler');
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* UI utilities for the installer
|
|
@@ -59,6 +60,17 @@ class UI {
|
|
|
59
60
|
const bmadDir = await installer.findBmadDir(confirmedDirectory);
|
|
60
61
|
const hasExistingInstall = await fs.pathExists(bmadDir);
|
|
61
62
|
|
|
63
|
+
// Always ask for custom content, but we'll handle it differently for new installs
|
|
64
|
+
let customContentConfig = { hasCustomContent: false };
|
|
65
|
+
if (hasExistingInstall) {
|
|
66
|
+
// Existing installation - prompt to add/update custom content
|
|
67
|
+
customContentConfig = await this.promptCustomContentForExisting();
|
|
68
|
+
} else {
|
|
69
|
+
// New installation - we'll prompt after creating the directory structure
|
|
70
|
+
// For now, set a flag to indicate we should ask later
|
|
71
|
+
customContentConfig._shouldAsk = true;
|
|
72
|
+
}
|
|
73
|
+
|
|
62
74
|
// Track action type (only set if there's an existing installation)
|
|
63
75
|
let actionType;
|
|
64
76
|
|
|
@@ -85,9 +97,11 @@ class UI {
|
|
|
85
97
|
|
|
86
98
|
// Handle quick update separately
|
|
87
99
|
if (actionType === 'quick-update') {
|
|
100
|
+
// Quick update doesn't install custom content - just updates existing modules
|
|
88
101
|
return {
|
|
89
102
|
actionType: 'quick-update',
|
|
90
103
|
directory: confirmedDirectory,
|
|
104
|
+
customContent: { hasCustomContent: false },
|
|
91
105
|
};
|
|
92
106
|
}
|
|
93
107
|
|
|
@@ -117,6 +131,63 @@ class UI {
|
|
|
117
131
|
const { installedModuleIds } = await this.getExistingInstallation(confirmedDirectory);
|
|
118
132
|
const coreConfig = await this.collectCoreConfig(confirmedDirectory);
|
|
119
133
|
|
|
134
|
+
// For new installations, create the directory structure first so we can cache custom content
|
|
135
|
+
if (!hasExistingInstall && customContentConfig._shouldAsk) {
|
|
136
|
+
// Create the bmad directory based on core config
|
|
137
|
+
const path = require('node:path');
|
|
138
|
+
const fs = require('fs-extra');
|
|
139
|
+
const bmadFolderName = '.bmad';
|
|
140
|
+
const bmadDir = path.join(confirmedDirectory, bmadFolderName);
|
|
141
|
+
|
|
142
|
+
await fs.ensureDir(bmadDir);
|
|
143
|
+
await fs.ensureDir(path.join(bmadDir, '_cfg'));
|
|
144
|
+
await fs.ensureDir(path.join(bmadDir, '_cfg', 'custom'));
|
|
145
|
+
|
|
146
|
+
// Now prompt for custom content
|
|
147
|
+
customContentConfig = await this.promptCustomContentLocation();
|
|
148
|
+
|
|
149
|
+
// If custom content found, cache it
|
|
150
|
+
if (customContentConfig.hasCustomContent) {
|
|
151
|
+
const { CustomModuleCache } = require('../installers/lib/core/custom-module-cache');
|
|
152
|
+
const cache = new CustomModuleCache(bmadDir);
|
|
153
|
+
|
|
154
|
+
const customHandler = new CustomHandler();
|
|
155
|
+
const customFiles = await customHandler.findCustomContent(customContentConfig.customPath);
|
|
156
|
+
|
|
157
|
+
for (const customFile of customFiles) {
|
|
158
|
+
const customInfo = await customHandler.getCustomInfo(customFile);
|
|
159
|
+
if (customInfo && customInfo.id) {
|
|
160
|
+
// Cache the module source
|
|
161
|
+
await cache.cacheModule(customInfo.id, customInfo.path, {
|
|
162
|
+
name: customInfo.name,
|
|
163
|
+
type: 'custom',
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
console.log(chalk.dim(` Cached ${customInfo.name} to _cfg/custom/${customInfo.id}`));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// Update config to use cached modules
|
|
171
|
+
customContentConfig.cachedModules = [];
|
|
172
|
+
for (const customFile of customFiles) {
|
|
173
|
+
const customInfo = await customHandler.getCustomInfo(customFile);
|
|
174
|
+
if (customInfo && customInfo.id) {
|
|
175
|
+
customContentConfig.cachedModules.push({
|
|
176
|
+
id: customInfo.id,
|
|
177
|
+
cachePath: path.join(bmadDir, '_cfg', 'custom', customInfo.id),
|
|
178
|
+
// Store relative path from cache for the manifest
|
|
179
|
+
relativePath: path.join('_cfg', 'custom', customInfo.id),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
console.log(chalk.green(`✓ Cached ${customFiles.length} custom module(s)`));
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Clear the flag
|
|
188
|
+
delete customContentConfig._shouldAsk;
|
|
189
|
+
}
|
|
190
|
+
|
|
120
191
|
// Skip module selection during update/reinstall - keep existing modules
|
|
121
192
|
let selectedModules;
|
|
122
193
|
if (actionType === 'update' || actionType === 'reinstall') {
|
|
@@ -125,8 +196,51 @@ class UI {
|
|
|
125
196
|
console.log(chalk.cyan('\n📦 Keeping existing modules: ') + selectedModules.join(', '));
|
|
126
197
|
} else {
|
|
127
198
|
// Only show module selection for new installs
|
|
128
|
-
const moduleChoices = await this.getModuleChoices(installedModuleIds);
|
|
199
|
+
const moduleChoices = await this.getModuleChoices(installedModuleIds, customContentConfig);
|
|
129
200
|
selectedModules = await this.selectModules(moduleChoices);
|
|
201
|
+
|
|
202
|
+
// Check which custom content items were selected
|
|
203
|
+
const selectedCustomContent = selectedModules.filter((mod) => mod.startsWith('__CUSTOM_CONTENT__'));
|
|
204
|
+
|
|
205
|
+
// For cached modules (new installs), check if any cached modules were selected
|
|
206
|
+
let selectedCachedModules = [];
|
|
207
|
+
if (customContentConfig.cachedModules) {
|
|
208
|
+
selectedCachedModules = selectedModules.filter(
|
|
209
|
+
(mod) => !mod.startsWith('__CUSTOM_CONTENT__') && customContentConfig.cachedModules.some((cm) => cm.id === mod),
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
if (selectedCustomContent.length > 0 || selectedCachedModules.length > 0) {
|
|
214
|
+
customContentConfig.selected = true;
|
|
215
|
+
|
|
216
|
+
// Handle directory-based custom content (existing installs)
|
|
217
|
+
if (selectedCustomContent.length > 0) {
|
|
218
|
+
customContentConfig.selectedFiles = selectedCustomContent.map((mod) => mod.replace('__CUSTOM_CONTENT__', ''));
|
|
219
|
+
// Convert custom content to module IDs for installation
|
|
220
|
+
const customContentModuleIds = [];
|
|
221
|
+
const customHandler = new CustomHandler();
|
|
222
|
+
for (const customFile of customContentConfig.selectedFiles) {
|
|
223
|
+
// Get the module info to extract the ID
|
|
224
|
+
const customInfo = await customHandler.getCustomInfo(customFile);
|
|
225
|
+
if (customInfo) {
|
|
226
|
+
customContentModuleIds.push(customInfo.id);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Filter out custom content markers and add module IDs
|
|
230
|
+
selectedModules = [...selectedModules.filter((mod) => !mod.startsWith('__CUSTOM_CONTENT__')), ...customContentModuleIds];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// For cached modules, they're already module IDs, just mark as selected
|
|
234
|
+
if (selectedCachedModules.length > 0) {
|
|
235
|
+
customContentConfig.selectedCachedModules = selectedCachedModules;
|
|
236
|
+
// No need to filter since they're already proper module IDs
|
|
237
|
+
}
|
|
238
|
+
} else if (customContentConfig.hasCustomContent) {
|
|
239
|
+
// User provided custom content but didn't select any
|
|
240
|
+
customContentConfig.selected = false;
|
|
241
|
+
customContentConfig.selectedFiles = [];
|
|
242
|
+
customContentConfig.selectedCachedModules = [];
|
|
243
|
+
}
|
|
130
244
|
}
|
|
131
245
|
|
|
132
246
|
// Prompt for AgentVibes TTS integration
|
|
@@ -147,7 +261,9 @@ class UI {
|
|
|
147
261
|
ides: toolSelection.ides,
|
|
148
262
|
skipIde: toolSelection.skipIde,
|
|
149
263
|
coreConfig: coreConfig, // Pass collected core config to installer
|
|
150
|
-
|
|
264
|
+
// Custom content configuration
|
|
265
|
+
customContent: customContentConfig,
|
|
266
|
+
enableAgentVibes: agentVibesConfig.enabled,
|
|
151
267
|
agentVibesInstalled: agentVibesConfig.alreadyInstalled,
|
|
152
268
|
};
|
|
153
269
|
}
|
|
@@ -483,19 +599,133 @@ class UI {
|
|
|
483
599
|
/**
|
|
484
600
|
* Get module choices for selection
|
|
485
601
|
* @param {Set} installedModuleIds - Currently installed module IDs
|
|
602
|
+
* @param {Object} customContentConfig - Custom content configuration
|
|
486
603
|
* @returns {Array} Module choices for inquirer
|
|
487
604
|
*/
|
|
488
|
-
async getModuleChoices(installedModuleIds) {
|
|
605
|
+
async getModuleChoices(installedModuleIds, customContentConfig = null) {
|
|
606
|
+
const moduleChoices = [];
|
|
607
|
+
const isNewInstallation = installedModuleIds.size === 0;
|
|
608
|
+
|
|
609
|
+
const customContentItems = [];
|
|
610
|
+
const hasCustomContentItems = false;
|
|
611
|
+
|
|
612
|
+
// Add custom content items
|
|
613
|
+
if (customContentConfig && customContentConfig.hasCustomContent) {
|
|
614
|
+
if (customContentConfig.cachedModules) {
|
|
615
|
+
// New installation - show cached modules
|
|
616
|
+
for (const cachedModule of customContentConfig.cachedModules) {
|
|
617
|
+
// Get the module info from cache
|
|
618
|
+
const yaml = require('js-yaml');
|
|
619
|
+
const fs = require('fs-extra');
|
|
620
|
+
|
|
621
|
+
// Try multiple possible config file locations
|
|
622
|
+
const possibleConfigPaths = [
|
|
623
|
+
path.join(cachedModule.cachePath, 'module.yaml'),
|
|
624
|
+
path.join(cachedModule.cachePath, 'custom.yaml'),
|
|
625
|
+
path.join(cachedModule.cachePath, '_module-installer', 'module.yaml'),
|
|
626
|
+
path.join(cachedModule.cachePath, '_module-installer', 'custom.yaml'),
|
|
627
|
+
];
|
|
628
|
+
|
|
629
|
+
let moduleData = null;
|
|
630
|
+
let foundPath = null;
|
|
631
|
+
|
|
632
|
+
for (const configPath of possibleConfigPaths) {
|
|
633
|
+
if (await fs.pathExists(configPath)) {
|
|
634
|
+
try {
|
|
635
|
+
const yamlContent = await fs.readFile(configPath, 'utf8');
|
|
636
|
+
moduleData = yaml.load(yamlContent);
|
|
637
|
+
foundPath = configPath;
|
|
638
|
+
break;
|
|
639
|
+
} catch (error) {
|
|
640
|
+
throw new Error(`Failed to parse config at ${configPath}: ${error.message}`);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
if (moduleData) {
|
|
646
|
+
// Use the name from the custom info if we have it
|
|
647
|
+
const moduleName = cachedModule.name || moduleData.name || cachedModule.id;
|
|
648
|
+
|
|
649
|
+
customContentItems.push({
|
|
650
|
+
name: `${chalk.cyan('✓')} ${moduleName} ${chalk.gray('(cached)')}`,
|
|
651
|
+
value: cachedModule.id, // Use module ID directly
|
|
652
|
+
checked: true, // Default to selected
|
|
653
|
+
cached: true,
|
|
654
|
+
});
|
|
655
|
+
} else {
|
|
656
|
+
// Module config not found - skip silently (non-critical)
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
} else if (customContentConfig.customPath) {
|
|
660
|
+
// Existing installation - show from directory
|
|
661
|
+
const customHandler = new CustomHandler();
|
|
662
|
+
const customFiles = await customHandler.findCustomContent(customContentConfig.customPath);
|
|
663
|
+
|
|
664
|
+
for (const customFile of customFiles) {
|
|
665
|
+
const customInfo = await customHandler.getCustomInfo(customFile);
|
|
666
|
+
if (customInfo) {
|
|
667
|
+
customContentItems.push({
|
|
668
|
+
name: `${chalk.cyan('✓')} ${customInfo.name} ${chalk.gray(`(${customInfo.relativePath})`)}`,
|
|
669
|
+
value: `__CUSTOM_CONTENT__${customFile}`, // Unique value for each custom content
|
|
670
|
+
checked: true, // Default to selected since user chose to provide custom content
|
|
671
|
+
path: customInfo.path, // Track path to avoid duplicates
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
|
|
678
|
+
// Add official modules
|
|
489
679
|
const { ModuleManager } = require('../installers/lib/modules/manager');
|
|
490
|
-
|
|
491
|
-
|
|
680
|
+
// For new installations, don't scan project yet (will do after custom content is discovered)
|
|
681
|
+
// For existing installations, scan if user selected custom content
|
|
682
|
+
const shouldScanProject =
|
|
683
|
+
!isNewInstallation && customContentConfig && customContentConfig.hasCustomContent && customContentConfig.selected;
|
|
684
|
+
const moduleManager = new ModuleManager({
|
|
685
|
+
scanProjectForModules: shouldScanProject,
|
|
686
|
+
});
|
|
687
|
+
const { modules: availableModules, customModules: customModulesFromProject } = await moduleManager.listAvailable();
|
|
492
688
|
|
|
493
|
-
|
|
494
|
-
const
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
689
|
+
// First, add all items to appropriate sections
|
|
690
|
+
const allCustomModules = [];
|
|
691
|
+
|
|
692
|
+
// Add custom content items from directory
|
|
693
|
+
allCustomModules.push(...customContentItems);
|
|
694
|
+
|
|
695
|
+
// Add custom modules from project scan (if scanning is enabled)
|
|
696
|
+
for (const mod of customModulesFromProject) {
|
|
697
|
+
// Skip if this module is already in customContentItems (by path)
|
|
698
|
+
const isDuplicate = allCustomModules.some((item) => item.path && mod.path && path.resolve(item.path) === path.resolve(mod.path));
|
|
699
|
+
|
|
700
|
+
if (!isDuplicate) {
|
|
701
|
+
allCustomModules.push({
|
|
702
|
+
name: `${chalk.cyan('✓')} ${mod.name} ${chalk.gray(`(${mod.source})`)}`,
|
|
703
|
+
value: mod.id,
|
|
704
|
+
checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id),
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
// Add separators and modules in correct order
|
|
710
|
+
if (allCustomModules.length > 0) {
|
|
711
|
+
// Add separator for custom content, all custom modules, and official content separator
|
|
712
|
+
moduleChoices.push(
|
|
713
|
+
new inquirer.Separator('── Custom Content ──'),
|
|
714
|
+
...allCustomModules,
|
|
715
|
+
new inquirer.Separator('── Official Content ──'),
|
|
716
|
+
);
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
// Add official modules (only non-custom ones)
|
|
720
|
+
for (const mod of availableModules) {
|
|
721
|
+
if (!mod.isCustom) {
|
|
722
|
+
moduleChoices.push({
|
|
723
|
+
name: mod.name,
|
|
724
|
+
value: mod.id,
|
|
725
|
+
checked: isNewInstallation ? mod.defaultSelected || false : installedModuleIds.has(mod.id),
|
|
726
|
+
});
|
|
727
|
+
}
|
|
728
|
+
}
|
|
499
729
|
|
|
500
730
|
return moduleChoices;
|
|
501
731
|
}
|
|
@@ -574,6 +804,120 @@ class UI {
|
|
|
574
804
|
}
|
|
575
805
|
}
|
|
576
806
|
|
|
807
|
+
/**
|
|
808
|
+
* Prompt for custom content location
|
|
809
|
+
* @returns {Object} Custom content configuration
|
|
810
|
+
*/
|
|
811
|
+
async promptCustomContentLocation() {
|
|
812
|
+
try {
|
|
813
|
+
// Skip custom content installation - always return false
|
|
814
|
+
return { hasCustomContent: false };
|
|
815
|
+
|
|
816
|
+
// TODO: Custom content installation temporarily disabled
|
|
817
|
+
// CLIUtils.displaySection('Custom Content', 'Optional: Add custom agents, workflows, and modules');
|
|
818
|
+
|
|
819
|
+
// const { hasCustomContent } = await inquirer.prompt([
|
|
820
|
+
// {
|
|
821
|
+
// type: 'list',
|
|
822
|
+
// name: 'hasCustomContent',
|
|
823
|
+
// message: 'Do you have custom content to install?',
|
|
824
|
+
// choices: [
|
|
825
|
+
// { name: 'No (skip custom content)', value: 'none' },
|
|
826
|
+
// { name: 'Enter a directory path', value: 'directory' },
|
|
827
|
+
// { name: 'Enter a URL', value: 'url' },
|
|
828
|
+
// ],
|
|
829
|
+
// default: 'none',
|
|
830
|
+
// },
|
|
831
|
+
// ]);
|
|
832
|
+
|
|
833
|
+
// if (hasCustomContent === 'none') {
|
|
834
|
+
// return { hasCustomContent: false };
|
|
835
|
+
// }
|
|
836
|
+
|
|
837
|
+
// TODO: Custom content installation temporarily disabled
|
|
838
|
+
// if (hasCustomContent === 'url') {
|
|
839
|
+
// console.log(chalk.yellow('\nURL-based custom content installation is coming soon!'));
|
|
840
|
+
// console.log(chalk.cyan('For now, please download your custom content and choose "Enter a directory path".\n'));
|
|
841
|
+
// return { hasCustomContent: false };
|
|
842
|
+
// }
|
|
843
|
+
|
|
844
|
+
// if (hasCustomContent === 'directory') {
|
|
845
|
+
// let customPath;
|
|
846
|
+
// while (!customPath) {
|
|
847
|
+
// let expandedPath;
|
|
848
|
+
// const { directory } = await inquirer.prompt([
|
|
849
|
+
// {
|
|
850
|
+
// type: 'input',
|
|
851
|
+
// name: 'directory',
|
|
852
|
+
// message: 'Enter directory to search for custom content (will scan subfolders):',
|
|
853
|
+
// default: process.cwd(), // Use actual current working directory
|
|
854
|
+
// validate: async (input) => {
|
|
855
|
+
// if (!input || input.trim() === '') {
|
|
856
|
+
// return 'Please enter a directory path';
|
|
857
|
+
// }
|
|
858
|
+
|
|
859
|
+
// try {
|
|
860
|
+
// expandedPath = this.expandUserPath(input.trim());
|
|
861
|
+
// } catch (error) {
|
|
862
|
+
// return error.message;
|
|
863
|
+
// }
|
|
864
|
+
|
|
865
|
+
// // Check if the path exists
|
|
866
|
+
// const pathExists = await fs.pathExists(expandedPath);
|
|
867
|
+
// if (!pathExists) {
|
|
868
|
+
// return 'Directory does not exist';
|
|
869
|
+
// }
|
|
870
|
+
|
|
871
|
+
// return true;
|
|
872
|
+
// },
|
|
873
|
+
// },
|
|
874
|
+
// ]);
|
|
875
|
+
|
|
876
|
+
// // Now expand the path for use after the prompt
|
|
877
|
+
// expandedPath = this.expandUserPath(directory.trim());
|
|
878
|
+
|
|
879
|
+
// // Check if directory has custom content
|
|
880
|
+
// const customHandler = new CustomHandler();
|
|
881
|
+
// const customFiles = await customHandler.findCustomContent(expandedPath);
|
|
882
|
+
|
|
883
|
+
// if (customFiles.length === 0) {
|
|
884
|
+
// console.log(chalk.yellow(`\nNo custom content found in ${expandedPath}`));
|
|
885
|
+
|
|
886
|
+
// const { tryAgain } = await inquirer.prompt([
|
|
887
|
+
// {
|
|
888
|
+
// type: 'confirm',
|
|
889
|
+
// name: 'tryAgain',
|
|
890
|
+
// message: 'Try a different directory?',
|
|
891
|
+
// default: true,
|
|
892
|
+
// },
|
|
893
|
+
// ]);
|
|
894
|
+
|
|
895
|
+
// if (tryAgain) {
|
|
896
|
+
// continue;
|
|
897
|
+
// } else {
|
|
898
|
+
// return { hasCustomContent: false };
|
|
899
|
+
// }
|
|
900
|
+
// }
|
|
901
|
+
|
|
902
|
+
// customPath = expandedPath;
|
|
903
|
+
// console.log(chalk.green(`\n✓ Found ${customFiles.length} custom content item(s):`));
|
|
904
|
+
// for (const file of customFiles) {
|
|
905
|
+
// const relativePath = path.relative(expandedPath, path.dirname(file));
|
|
906
|
+
// const folderName = path.dirname(file).split(path.sep).pop();
|
|
907
|
+
// console.log(chalk.dim(` • ${folderName} ${chalk.gray(`(${relativePath})`)}`));
|
|
908
|
+
// }
|
|
909
|
+
// }
|
|
910
|
+
|
|
911
|
+
// return { hasCustomContent: true, customPath };
|
|
912
|
+
// }
|
|
913
|
+
|
|
914
|
+
// return { hasCustomContent: false };
|
|
915
|
+
} catch (error) {
|
|
916
|
+
console.error(chalk.red('Error in custom content prompt:'), error);
|
|
917
|
+
return { hasCustomContent: false };
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
|
|
577
921
|
/**
|
|
578
922
|
* Confirm directory selection
|
|
579
923
|
* @param {string} directory - The directory path
|
|
@@ -738,7 +1082,7 @@ class UI {
|
|
|
738
1082
|
* @calls checkAgentVibesInstalled(), inquirer.prompt(), chalk.green/yellow/dim()
|
|
739
1083
|
*
|
|
740
1084
|
* AI NOTE: This prompt is strategically positioned in installation flow:
|
|
741
|
-
* - AFTER core config (
|
|
1085
|
+
* - AFTER core config (user_name, etc)
|
|
742
1086
|
* - BEFORE IDE selection (which can hang on Windows/PowerShell)
|
|
743
1087
|
*
|
|
744
1088
|
* Flow Logic:
|
|
@@ -859,6 +1203,146 @@ class UI {
|
|
|
859
1203
|
|
|
860
1204
|
return (await fs.pathExists(hookPath)) && (await fs.pathExists(playTtsPath));
|
|
861
1205
|
}
|
|
1206
|
+
|
|
1207
|
+
/**
|
|
1208
|
+
* Prompt for custom content for existing installations
|
|
1209
|
+
* @returns {Object} Custom content configuration
|
|
1210
|
+
*/
|
|
1211
|
+
async promptCustomContentForExisting() {
|
|
1212
|
+
try {
|
|
1213
|
+
// Skip custom content installation - always return false
|
|
1214
|
+
return { hasCustomContent: false };
|
|
1215
|
+
|
|
1216
|
+
// TODO: Custom content installation temporarily disabled
|
|
1217
|
+
// CLIUtils.displaySection('Custom Content', 'Add new custom agents, workflows, or modules to your installation');
|
|
1218
|
+
|
|
1219
|
+
// const { hasCustomContent } = await inquirer.prompt([
|
|
1220
|
+
// {
|
|
1221
|
+
// type: 'list',
|
|
1222
|
+
// name: 'hasCustomContent',
|
|
1223
|
+
// message: 'Do you want to add or update custom content?',
|
|
1224
|
+
// choices: [
|
|
1225
|
+
// {
|
|
1226
|
+
// name: 'No, continue with current installation only',
|
|
1227
|
+
// value: false,
|
|
1228
|
+
// },
|
|
1229
|
+
// {
|
|
1230
|
+
// name: 'Yes, I have custom content to add or update',
|
|
1231
|
+
// value: true,
|
|
1232
|
+
// },
|
|
1233
|
+
// ],
|
|
1234
|
+
// default: false,
|
|
1235
|
+
// },
|
|
1236
|
+
// ]);
|
|
1237
|
+
|
|
1238
|
+
// if (!hasCustomContent) {
|
|
1239
|
+
// return { hasCustomContent: false };
|
|
1240
|
+
// }
|
|
1241
|
+
|
|
1242
|
+
// TODO: Custom content installation temporarily disabled
|
|
1243
|
+
// // Get directory path
|
|
1244
|
+
// const { customPath } = await inquirer.prompt([
|
|
1245
|
+
// {
|
|
1246
|
+
// type: 'input',
|
|
1247
|
+
// name: 'customPath',
|
|
1248
|
+
// message: 'Enter directory to search for custom content (will scan subfolders):',
|
|
1249
|
+
// default: process.cwd(),
|
|
1250
|
+
// validate: async (input) => {
|
|
1251
|
+
// if (!input || input.trim() === '') {
|
|
1252
|
+
// return 'Please enter a directory path';
|
|
1253
|
+
// }
|
|
1254
|
+
|
|
1255
|
+
// // Normalize and check if path exists
|
|
1256
|
+
// const expandedPath = CLIUtils.expandPath(input.trim());
|
|
1257
|
+
// const pathExists = await fs.pathExists(expandedPath);
|
|
1258
|
+
// if (!pathExists) {
|
|
1259
|
+
// return 'Directory does not exist';
|
|
1260
|
+
// }
|
|
1261
|
+
|
|
1262
|
+
// // Check if it's actually a directory
|
|
1263
|
+
// const stats = await fs.stat(expandedPath);
|
|
1264
|
+
// if (!stats.isDirectory()) {
|
|
1265
|
+
// return 'Path must be a directory';
|
|
1266
|
+
// }
|
|
1267
|
+
|
|
1268
|
+
// return true;
|
|
1269
|
+
// },
|
|
1270
|
+
// transformer: (input) => {
|
|
1271
|
+
// return CLIUtils.expandPath(input);
|
|
1272
|
+
// },
|
|
1273
|
+
// },
|
|
1274
|
+
// ]);
|
|
1275
|
+
|
|
1276
|
+
// const resolvedPath = CLIUtils.expandPath(customPath);
|
|
1277
|
+
|
|
1278
|
+
// // Find custom content
|
|
1279
|
+
// const customHandler = new CustomHandler();
|
|
1280
|
+
// const customFiles = await customHandler.findCustomContent(resolvedPath);
|
|
1281
|
+
|
|
1282
|
+
// if (customFiles.length === 0) {
|
|
1283
|
+
// console.log(chalk.yellow(`\nNo custom content found in ${resolvedPath}`));
|
|
1284
|
+
|
|
1285
|
+
// const { tryDifferent } = await inquirer.prompt([
|
|
1286
|
+
// {
|
|
1287
|
+
// type: 'confirm',
|
|
1288
|
+
// name: 'tryDifferent',
|
|
1289
|
+
// message: 'Try a different directory?',
|
|
1290
|
+
// default: true,
|
|
1291
|
+
// },
|
|
1292
|
+
// ]);
|
|
1293
|
+
|
|
1294
|
+
// if (tryDifferent) {
|
|
1295
|
+
// return await this.promptCustomContentForExisting();
|
|
1296
|
+
// }
|
|
1297
|
+
|
|
1298
|
+
// return { hasCustomContent: false };
|
|
1299
|
+
// }
|
|
1300
|
+
|
|
1301
|
+
// // Display found items
|
|
1302
|
+
// console.log(chalk.cyan(`\nFound ${customFiles.length} custom content file(s):`));
|
|
1303
|
+
// const customContentItems = [];
|
|
1304
|
+
|
|
1305
|
+
// for (const customFile of customFiles) {
|
|
1306
|
+
// const customInfo = await customHandler.getCustomInfo(customFile);
|
|
1307
|
+
// if (customInfo) {
|
|
1308
|
+
// customContentItems.push({
|
|
1309
|
+
// name: `${chalk.cyan('✓')} ${customInfo.name} ${chalk.gray(`(${customInfo.relativePath})`)}`,
|
|
1310
|
+
// value: `__CUSTOM_CONTENT__${customFile}`,
|
|
1311
|
+
// checked: true,
|
|
1312
|
+
// });
|
|
1313
|
+
// }
|
|
1314
|
+
// }
|
|
1315
|
+
|
|
1316
|
+
// // Add option to keep existing custom content
|
|
1317
|
+
// console.log(chalk.yellow('\nExisting custom modules will be preserved unless you remove them'));
|
|
1318
|
+
|
|
1319
|
+
// const { selectedFiles } = await inquirer.prompt([
|
|
1320
|
+
// {
|
|
1321
|
+
// type: 'checkbox',
|
|
1322
|
+
// name: 'selectedFiles',
|
|
1323
|
+
// message: 'Select custom content to add:',
|
|
1324
|
+
// choices: customContentItems,
|
|
1325
|
+
// pageSize: 15,
|
|
1326
|
+
// validate: (answer) => {
|
|
1327
|
+
// if (answer.length === 0) {
|
|
1328
|
+
// return 'You must select at least one item';
|
|
1329
|
+
// }
|
|
1330
|
+
// return true;
|
|
1331
|
+
// },
|
|
1332
|
+
// },
|
|
1333
|
+
// ]);
|
|
1334
|
+
|
|
1335
|
+
// return {
|
|
1336
|
+
// hasCustomContent: true,
|
|
1337
|
+
// customPath: resolvedPath,
|
|
1338
|
+
// selected: true,
|
|
1339
|
+
// selectedFiles: selectedFiles,
|
|
1340
|
+
// };
|
|
1341
|
+
} catch (error) {
|
|
1342
|
+
console.error(chalk.red('Error configuring custom content:'), error);
|
|
1343
|
+
return { hasCustomContent: false };
|
|
1344
|
+
}
|
|
1345
|
+
}
|
|
862
1346
|
}
|
|
863
1347
|
|
|
864
1348
|
module.exports = { UI };
|
|
@@ -3,17 +3,16 @@ const { ManifestGenerator } = require('./installers/lib/core/manifest-generator'
|
|
|
3
3
|
|
|
4
4
|
async function regenerateManifests() {
|
|
5
5
|
const generator = new ManifestGenerator();
|
|
6
|
-
const targetDir = process.argv[2]
|
|
7
|
-
const bmadDir = path.join(process.cwd(), targetDir, 'bmad');
|
|
6
|
+
const targetDir = process.argv[2];
|
|
8
7
|
|
|
9
8
|
// List of modules to include in manifests
|
|
10
9
|
const selectedModules = ['bmb', 'bmm', 'cis'];
|
|
11
10
|
|
|
12
11
|
console.log('Regenerating manifests with relative paths...');
|
|
13
|
-
console.log('Target directory:'
|
|
12
|
+
console.log('Target directory: .bmad');
|
|
14
13
|
|
|
15
14
|
try {
|
|
16
|
-
const result = await generator.generateManifests(
|
|
15
|
+
const result = await generator.generateManifests('.bmad', selectedModules, [], { ides: [] });
|
|
17
16
|
console.log('✓ Manifests generated successfully:');
|
|
18
17
|
console.log(` - ${result.workflows} workflows`);
|
|
19
18
|
console.log(` - ${result.agents} agents`);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Raven's Verdict - Deep PR Review Tool
|
|
2
|
+
|
|
3
|
+
Adversarial code review for GitHub PRs. Works with any LLM agent.
|
|
4
|
+
|
|
5
|
+
> **Status: Experimental.** We're still figuring out how to use this effectively. Expect the workflow to evolve.
|
|
6
|
+
|
|
7
|
+
## How It Works
|
|
8
|
+
|
|
9
|
+
Point your agent at `review-pr.md` and ask it to review a specific PR:
|
|
10
|
+
|
|
11
|
+
> "Read tools/maintainer/review-pr.md and apply it to PR #123"
|
|
12
|
+
|
|
13
|
+
The tool will:
|
|
14
|
+
|
|
15
|
+
1. Check out the PR branch locally
|
|
16
|
+
2. Run an adversarial review (find at least 5 issues)
|
|
17
|
+
3. Transform findings into professional tone
|
|
18
|
+
4. Preview the review and ask before posting
|
|
19
|
+
|
|
20
|
+
See `review-pr.md` for full prompt structure, severity ratings, and sandboxing rules.
|
|
21
|
+
|
|
22
|
+
## When to Use
|
|
23
|
+
|
|
24
|
+
**Good candidates:**
|
|
25
|
+
|
|
26
|
+
- PRs with meaningful logic changes
|
|
27
|
+
- Refactors touching multiple files
|
|
28
|
+
- New features or architectural changes
|
|
29
|
+
|
|
30
|
+
**Skip it for:**
|
|
31
|
+
|
|
32
|
+
- Trivial PRs (typo fixes, version bumps, single-line changes)
|
|
33
|
+
- PRs you've already reviewed manually
|
|
34
|
+
- PRs where you haven't agreed on the approach yet — fix the direction before the implementation
|
|
35
|
+
|
|
36
|
+
## Workflow Tips
|
|
37
|
+
|
|
38
|
+
**Always review before posting.** The preview step exists for a reason:
|
|
39
|
+
|
|
40
|
+
- **[y] Yes** — Post as-is (only if you're confident)
|
|
41
|
+
- **[e] Edit** — Modify findings before posting
|
|
42
|
+
- **[s] Save only** — Write to file, don't post
|
|
43
|
+
|
|
44
|
+
The save option is useful when you want to:
|
|
45
|
+
|
|
46
|
+
- Hand-edit the review before posting
|
|
47
|
+
- Use the findings as input for a second opinion ("Hey Claude, here's what Raven found — what do you think?")
|
|
48
|
+
- Cherry-pick specific findings
|
|
49
|
+
|
|
50
|
+
**Trust but verify.** LLM reviews can miss context or flag non-issues. Skim the findings before they hit the PR.
|
|
51
|
+
|
|
52
|
+
## Prerequisites
|
|
53
|
+
|
|
54
|
+
- `gh` CLI installed and authenticated (`gh auth status`)
|
|
55
|
+
- Any LLM agent capable of running bash commands
|