bmad-method 6.0.0-alpha.9 → 6.0.1
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/.augment/code_review_guidelines.yaml +271 -0
- package/.claude/skills/bmad-os-changelog-social/SKILL.md +178 -0
- package/.claude/skills/bmad-os-changelog-social/examples/discord-example.md +53 -0
- package/.claude/skills/bmad-os-changelog-social/examples/linkedin-example.md +49 -0
- package/.claude/skills/bmad-os-changelog-social/examples/twitter-example.md +55 -0
- package/.claude/skills/bmad-os-diataxis-style-fix/SKILL.md +7 -0
- package/.claude/skills/bmad-os-diataxis-style-fix/prompts/instructions.md +229 -0
- package/.claude/skills/bmad-os-draft-changelog/SKILL.md +7 -0
- package/.claude/skills/bmad-os-draft-changelog/prompts/instructions.md +82 -0
- package/.claude/skills/bmad-os-gh-triage/README.md +14 -0
- package/.claude/skills/bmad-os-gh-triage/SKILL.md +12 -0
- package/.claude/skills/bmad-os-gh-triage/prompts/agent-prompt.md +60 -0
- package/.claude/skills/bmad-os-gh-triage/prompts/instructions.md +74 -0
- package/.claude/skills/bmad-os-release-module/README.md +24 -0
- package/.claude/skills/bmad-os-release-module/SKILL.md +7 -0
- package/.claude/skills/bmad-os-release-module/prompts/instructions.md +53 -0
- package/.coderabbit.yaml +85 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/ISSUE_TEMPLATE/bug-report.yaml +124 -0
- package/.github/ISSUE_TEMPLATE/config.yaml +5 -2
- package/.github/ISSUE_TEMPLATE/documentation.yaml +55 -0
- package/.github/ISSUE_TEMPLATE/feature-request.md +22 -0
- package/.github/ISSUE_TEMPLATE/issue.md +32 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- package/.github/scripts/discord-helpers.sh +34 -0
- package/.github/workflows/coderabbit-review.yaml +22 -0
- package/.github/workflows/discord.yaml +82 -8
- package/.github/workflows/docs.yaml +64 -0
- package/.github/workflows/quality.yaml +40 -2
- package/.husky/pre-commit +13 -0
- package/.markdownlint-cli2.yaml +41 -0
- package/.prettierignore +7 -0
- package/.vscode/settings.json +4 -3
- package/CHANGELOG.md +1074 -674
- package/CNAME +1 -0
- package/CONTRIBUTING.md +97 -189
- package/CONTRIBUTORS.md +32 -0
- package/LICENSE +7 -3
- package/README.md +51 -396
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/Wordmark.png +0 -0
- package/banner-bmad-method.png +0 -0
- package/docs/404.md +9 -0
- package/docs/_STYLE_GUIDE.md +370 -0
- package/docs/explanation/advanced-elicitation.md +49 -0
- package/docs/explanation/adversarial-review.md +59 -0
- package/docs/explanation/brainstorming.md +33 -0
- package/docs/explanation/established-projects-faq.md +50 -0
- package/docs/explanation/party-mode.md +59 -0
- package/docs/explanation/preventing-agent-conflicts.md +112 -0
- package/docs/explanation/project-context.md +157 -0
- package/docs/explanation/quick-flow.md +73 -0
- package/docs/explanation/why-solutioning-matters.md +77 -0
- package/docs/how-to/customize-bmad.md +172 -0
- package/docs/how-to/established-projects.md +105 -0
- package/docs/how-to/get-answers-about-bmad.md +103 -0
- package/docs/how-to/install-bmad.md +88 -0
- package/docs/how-to/non-interactive-installation.md +171 -0
- package/docs/how-to/project-context.md +136 -0
- package/docs/how-to/quick-fixes.md +123 -0
- package/docs/how-to/shard-large-documents.md +78 -0
- package/docs/how-to/upgrade-to-v6.md +97 -0
- package/docs/index.md +33 -206
- package/docs/reference/agents.md +28 -0
- package/docs/reference/commands.md +131 -0
- package/docs/reference/modules.md +76 -0
- package/docs/reference/testing.md +106 -0
- package/docs/reference/workflow-map.md +122 -0
- package/docs/tutorials/getting-started.md +219 -0
- package/eslint.config.mjs +26 -16
- package/package.json +35 -28
- package/src/bmm/agents/analyst.agent.yaml +43 -0
- package/src/bmm/agents/architect.agent.yaml +29 -0
- package/src/bmm/agents/dev.agent.yaml +38 -0
- package/src/bmm/agents/pm.agent.yaml +44 -0
- package/src/bmm/agents/qa.agent.yaml +58 -0
- package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
- package/src/bmm/agents/sm.agent.yaml +37 -0
- package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
- package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +46 -0
- package/src/bmm/agents/ux-designer.agent.yaml +27 -0
- package/src/bmm/data/project-context-template.md +26 -0
- package/src/bmm/module-help.csv +31 -0
- package/src/bmm/module.yaml +50 -0
- package/src/bmm/teams/default-party.csv +20 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
- package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
- package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
- package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
- package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -0
- package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
- package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
- package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +226 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
- package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
- package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
- package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +13 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
- package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
- package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
- package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
- package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
- package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +44 -0
- package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
- package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -0
- package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +54 -0
- package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
- package/src/bmm/workflows/4-implementation/create-story/instructions.xml +346 -0
- package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
- package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +53 -0
- package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
- package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
- package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +21 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +53 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -0
- package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -0
- package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +191 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +144 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +127 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
- package/src/bmm/workflows/document-project/checklist.md +245 -0
- package/src/bmm/workflows/document-project/instructions.md +130 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/workflow.yaml +22 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
- package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
- package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
- package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
- package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
- package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
- package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
- package/src/bmm/workflows/qa/automate/checklist.md +33 -0
- package/src/bmm/workflows/qa/automate/instructions.md +110 -0
- package/src/bmm/workflows/qa/automate/workflow.yaml +44 -0
- package/src/core/agents/bmad-master.agent.yaml +12 -21
- package/src/core/module-help.csv +9 -0
- package/src/core/module.yaml +25 -0
- package/src/core/tasks/editorial-review-prose.xml +102 -0
- package/src/core/tasks/editorial-review-structure.xml +209 -0
- package/src/core/tasks/help.md +85 -0
- package/src/core/tasks/index-docs.xml +2 -2
- package/src/core/tasks/review-adversarial-general.xml +48 -0
- package/src/core/tasks/shard-doc.xml +108 -0
- package/src/core/tasks/workflow.xml +39 -74
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -36
- package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
- package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
- package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
- package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
- package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
- package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
- package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
- package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
- package/src/core/workflows/brainstorming/template.md +13 -104
- package/src/core/workflows/brainstorming/workflow.md +58 -0
- package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
- package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
- package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -0
- package/src/core/workflows/party-mode/workflow.md +194 -0
- package/src/utility/agent-components/activation-rules.txt +6 -0
- package/src/utility/agent-components/activation-steps.txt +14 -0
- package/src/utility/agent-components/agent-command-header.md +1 -0
- package/src/utility/agent-components/agent.customize.template.yaml +41 -0
- 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 +4 -4
- package/test/adversarial-review-tests/README.md +56 -0
- package/test/adversarial-review-tests/sample-content.md +46 -0
- package/test/adversarial-review-tests/test-cases.yaml +103 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +1 -1
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +1 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +2 -3
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +2 -1
- package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +2 -1
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +2 -1
- package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
- package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +1 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +1 -0
- package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +3 -0
- package/test/fixtures/file-refs-csv/invalid/empty-data.csv +1 -0
- package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +3 -0
- package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/bmm-style.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/core-style.csv +3 -0
- package/test/fixtures/file-refs-csv/valid/minimal.csv +2 -0
- package/test/test-agent-schema.js +4 -4
- package/test/test-file-refs-csv.js +133 -0
- package/test/test-installation-components.js +10 -12
- package/test/test-rehype-plugins.mjs +1050 -0
- package/test/unit-test-schema.js +2 -2
- package/tools/build-docs.mjs +463 -0
- package/tools/cli/README.md +41 -589
- package/tools/cli/bmad-cli.js +67 -1
- package/tools/cli/commands/install.js +42 -34
- package/tools/cli/commands/status.js +44 -26
- package/tools/cli/commands/uninstall.js +146 -23
- package/tools/cli/external-official-modules.yaml +53 -0
- package/tools/cli/installers/install-messages.yaml +39 -0
- package/tools/cli/installers/lib/core/config-collector.js +589 -95
- package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +57 -39
- package/tools/cli/installers/lib/core/detector.js +19 -125
- package/tools/cli/installers/lib/core/ide-config-manager.js +12 -9
- package/tools/cli/installers/lib/core/installer.js +2075 -1161
- package/tools/cli/installers/lib/core/manifest-generator.js +494 -103
- package/tools/cli/installers/lib/core/manifest.js +544 -46
- package/tools/cli/installers/lib/custom/handler.js +358 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +83 -44
- package/tools/cli/installers/lib/ide/_config-driven.js +560 -0
- package/tools/cli/installers/lib/ide/codex.js +277 -54
- package/tools/cli/installers/lib/ide/github-copilot.js +607 -209
- package/tools/cli/installers/lib/ide/kilo.js +169 -75
- package/tools/cli/installers/lib/ide/manager.js +179 -48
- package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
- package/tools/cli/installers/lib/ide/platform-codes.yaml +227 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +95 -5
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +51 -20
- package/tools/cli/installers/lib/ide/shared/module-injections.js +6 -3
- package/tools/cli/installers/lib/ide/shared/path-utils.js +299 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +262 -14
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +108 -27
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +2 -1
- package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-task.md +10 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-tool.md +10 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +7 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml +11 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml +11 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-task.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow-yaml.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md +7 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +15 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +17 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +17 -0
- package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
- package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +2 -1
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +6 -0
- package/tools/cli/installers/lib/message-loader.js +83 -0
- package/tools/cli/installers/lib/modules/external-manager.js +136 -0
- package/tools/cli/installers/lib/modules/manager.js +931 -207
- package/tools/cli/lib/activation-builder.js +13 -16
- package/tools/cli/lib/agent/compiler.js +525 -0
- package/tools/cli/lib/agent/installer.js +680 -0
- package/tools/cli/lib/agent/template-engine.js +152 -0
- package/tools/cli/lib/agent-analyzer.js +48 -20
- package/tools/cli/lib/agent-party-generator.js +5 -17
- package/tools/cli/lib/cli-utils.js +76 -104
- package/tools/cli/lib/config.js +4 -3
- package/tools/cli/lib/platform-codes.js +2 -2
- package/tools/cli/lib/project-root.js +6 -0
- package/tools/cli/lib/prompts.js +809 -0
- package/tools/cli/lib/ui.js +1600 -272
- package/tools/cli/lib/xml-handler.js +4 -55
- package/tools/cli/lib/yaml-format.js +4 -6
- package/tools/cli/lib/yaml-xml-builder.js +183 -61
- package/tools/docs/_prompt-external-modules-page.md +59 -0
- package/tools/docs/fix-refs.md +91 -0
- package/tools/fix-doc-links.js +285 -0
- package/tools/lib/xml-utils.js +13 -0
- 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/tools/platform-codes.yaml +24 -0
- package/tools/schema/agent.js +306 -53
- package/tools/validate-agent-schema.js +3 -3
- package/tools/validate-doc-links.js +393 -0
- package/tools/validate-file-refs.js +554 -0
- package/tools/validate-svg-changes.sh +356 -0
- package/website/README.md +75 -0
- package/website/astro.config.mjs +135 -0
- package/website/public/favicon.ico +0 -0
- package/website/public/img/bmad-dark.png +0 -0
- package/website/public/img/bmad-light.png +0 -0
- package/website/public/workflow-map-diagram.html +361 -0
- package/website/src/components/Banner.astro +62 -0
- package/website/src/components/Header.astro +96 -0
- package/website/src/components/MobileMenuFooter.astro +33 -0
- package/website/src/content/config.ts +6 -0
- package/website/src/lib/site-url.mjs +25 -0
- package/website/src/pages/404.astro +11 -0
- package/website/src/pages/robots.txt.ts +48 -0
- package/website/src/rehype-base-paths.js +112 -0
- package/website/src/rehype-markdown-links.js +111 -0
- package/website/src/styles/custom.css +509 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
- package/.github/ISSUE_TEMPLATE/idea_submission.md +0 -109
- package/.github/workflows/bundle-latest.yaml +0 -277
- package/.github/workflows/manual-release.yaml +0 -212
- package/docs/BUNDLE_DISTRIBUTION_SETUP.md +0 -95
- package/docs/agent-customization-guide.md +0 -208
- package/docs/document-sharding-guide.md +0 -447
- package/docs/ide-info/auggie.md +0 -31
- package/docs/ide-info/claude-code.md +0 -25
- package/docs/ide-info/cline.md +0 -31
- package/docs/ide-info/codex.md +0 -21
- package/docs/ide-info/crush.md +0 -30
- package/docs/ide-info/cursor.md +0 -25
- package/docs/ide-info/gemini.md +0 -25
- package/docs/ide-info/github-copilot.md +0 -26
- package/docs/ide-info/iflow.md +0 -33
- package/docs/ide-info/kilo.md +0 -24
- package/docs/ide-info/opencode.md +0 -24
- package/docs/ide-info/qwen.md +0 -25
- package/docs/ide-info/roo.md +0 -27
- package/docs/ide-info/trae.md +0 -25
- package/docs/ide-info/windsurf.md +0 -22
- package/docs/installers-bundlers/ide-injections.md +0 -186
- package/docs/installers-bundlers/installers-modules-platforms-reference.md +0 -388
- package/docs/installers-bundlers/web-bundler-usage.md +0 -54
- package/docs/v4-to-v6-upgrade.md +0 -227
- package/docs/web-bundles-gemini-gpt-guide.md +0 -473
- package/src/core/_module-installer/install-config.yaml +0 -35
- package/src/core/_module-installer/installer.js +0 -60
- package/src/core/agents/bmad-web-orchestrator.agent.xml +0 -113
- package/src/core/tasks/adv-elicit-methods.csv +0 -39
- package/src/core/tasks/advanced-elicitation.xml +0 -106
- package/src/core/tasks/validate-workflow.xml +0 -89
- package/src/core/tools/shard-doc.xml +0 -109
- package/src/core/workflows/brainstorming/README.md +0 -261
- package/src/core/workflows/brainstorming/instructions.md +0 -315
- package/src/core/workflows/brainstorming/workflow.yaml +0 -43
- package/src/core/workflows/party-mode/instructions.md +0 -183
- package/src/core/workflows/party-mode/workflow.yaml +0 -27
- package/src/modules/bmb/README.md +0 -194
- package/src/modules/bmb/_module-installer/install-config.yaml +0 -31
- package/src/modules/bmb/agents/bmad-builder.agent.yaml +0 -59
- package/src/modules/bmb/workflows/audit-workflow/checklist.md +0 -142
- package/src/modules/bmb/workflows/audit-workflow/instructions.md +0 -341
- package/src/modules/bmb/workflows/audit-workflow/template.md +0 -118
- package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +0 -25
- package/src/modules/bmb/workflows/convert-legacy/README.md +0 -262
- package/src/modules/bmb/workflows/convert-legacy/checklist.md +0 -205
- package/src/modules/bmb/workflows/convert-legacy/instructions.md +0 -377
- package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +0 -34
- package/src/modules/bmb/workflows/create-agent/README.md +0 -203
- package/src/modules/bmb/workflows/create-agent/agent-architecture.md +0 -415
- package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +0 -759
- package/src/modules/bmb/workflows/create-agent/agent-types.md +0 -292
- package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +0 -174
- package/src/modules/bmb/workflows/create-agent/checklist.md +0 -62
- package/src/modules/bmb/workflows/create-agent/communication-styles.md +0 -202
- package/src/modules/bmb/workflows/create-agent/instructions.md +0 -456
- package/src/modules/bmb/workflows/create-agent/workflow.yaml +0 -49
- package/src/modules/bmb/workflows/create-module/README.md +0 -229
- package/src/modules/bmb/workflows/create-module/brainstorm-context.md +0 -137
- package/src/modules/bmb/workflows/create-module/checklist.md +0 -235
- package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +0 -92
- package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +0 -231
- package/src/modules/bmb/workflows/create-module/instructions.md +0 -576
- package/src/modules/bmb/workflows/create-module/module-structure.md +0 -400
- package/src/modules/bmb/workflows/create-module/workflow.yaml +0 -44
- package/src/modules/bmb/workflows/create-workflow/README.md +0 -277
- package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +0 -197
- package/src/modules/bmb/workflows/create-workflow/checklist.md +0 -94
- package/src/modules/bmb/workflows/create-workflow/instructions.md +0 -724
- package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +0 -1306
- package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +0 -24
- package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +0 -13
- package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +0 -9
- package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +0 -65
- package/src/modules/bmb/workflows/create-workflow/workflow.yaml +0 -42
- package/src/modules/bmb/workflows/edit-agent/README.md +0 -112
- package/src/modules/bmb/workflows/edit-agent/checklist.md +0 -112
- package/src/modules/bmb/workflows/edit-agent/instructions.md +0 -290
- package/src/modules/bmb/workflows/edit-agent/workflow.yaml +0 -35
- package/src/modules/bmb/workflows/edit-module/README.md +0 -187
- package/src/modules/bmb/workflows/edit-module/checklist.md +0 -165
- package/src/modules/bmb/workflows/edit-module/instructions.md +0 -339
- package/src/modules/bmb/workflows/edit-module/workflow.yaml +0 -36
- package/src/modules/bmb/workflows/edit-workflow/README.md +0 -119
- package/src/modules/bmb/workflows/edit-workflow/checklist.md +0 -70
- package/src/modules/bmb/workflows/edit-workflow/instructions.md +0 -342
- package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +0 -29
- package/src/modules/bmb/workflows/module-brief/README.md +0 -264
- package/src/modules/bmb/workflows/module-brief/checklist.md +0 -116
- package/src/modules/bmb/workflows/module-brief/instructions.md +0 -267
- package/src/modules/bmb/workflows/module-brief/template.md +0 -275
- package/src/modules/bmb/workflows/module-brief/workflow.yaml +0 -31
- package/src/modules/bmb/workflows/redoc/README.md +0 -87
- package/src/modules/bmb/workflows/redoc/checklist.md +0 -99
- package/src/modules/bmb/workflows/redoc/instructions.md +0 -265
- package/src/modules/bmb/workflows/redoc/workflow.yaml +0 -34
- package/src/modules/bmgd/README.md +0 -208
- package/src/modules/bmgd/_module-installer/install-config.yaml +0 -54
- package/src/modules/bmgd/agents/game-architect.agent.yaml +0 -33
- package/src/modules/bmgd/agents/game-designer.agent.yaml +0 -40
- package/src/modules/bmgd/agents/game-dev.agent.yaml +0 -40
- package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +0 -75
- package/src/modules/bmgd/teams/default-party.csv +0 -10
- package/src/modules/bmgd/teams/team-gamedev.yaml +0 -18
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/game-brain-methods.csv +0 -26
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/game-context.md +0 -115
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +0 -128
- package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +0 -41
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/checklist.md +0 -128
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +0 -371
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/template.md +0 -205
- package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +0 -44
- package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +0 -148
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/action-platformer.md +0 -45
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/adventure.md +0 -84
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/card-game.md +0 -76
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/fighting.md +0 -89
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/horror.md +0 -86
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/idle-incremental.md +0 -78
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/metroidvania.md +0 -87
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/moba.md +0 -74
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/party-game.md +0 -79
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/puzzle.md +0 -58
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/racing.md +0 -88
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/rhythm.md +0 -79
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/roguelike.md +0 -69
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/rpg.md +0 -70
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/sandbox.md +0 -79
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/shooter.md +0 -62
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/simulation.md +0 -73
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/sports.md +0 -75
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/strategy.md +0 -71
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/survival.md +0 -79
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/text-based.md +0 -91
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/tower-defense.md +0 -79
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/turn-based-tactics.md +0 -88
- package/src/modules/bmgd/workflows/2-design/gdd/game-types/visual-novel.md +0 -89
- package/src/modules/bmgd/workflows/2-design/gdd/game-types.csv +0 -25
- package/src/modules/bmgd/workflows/2-design/gdd/gdd-template.md +0 -153
- package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +0 -501
- package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +0 -81
- package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +0 -139
- package/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md +0 -603
- package/src/modules/bmgd/workflows/2-design/narrative/narrative-template.md +0 -195
- package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +0 -38
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +0 -321
- package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +0 -103
- package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +0 -240
- package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +0 -222
- package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +0 -699
- package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +0 -13
- package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +0 -67
- package/src/modules/bmgd/workflows/4-production/code-review/backlog_template.md +0 -12
- package/src/modules/bmgd/workflows/4-production/code-review/checklist.md +0 -22
- package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +0 -398
- package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +0 -57
- package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +0 -279
- package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +0 -206
- package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +0 -52
- package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +0 -240
- package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +0 -256
- package/src/modules/bmgd/workflows/4-production/create-story/template.md +0 -51
- package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +0 -68
- package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +0 -38
- package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +0 -267
- package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +0 -53
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/checklist.md +0 -17
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +0 -164
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/template.md +0 -76
- package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +0 -52
- package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +0 -1442
- package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +0 -52
- package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +0 -234
- package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +0 -55
- package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +0 -50
- package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +0 -16
- package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +0 -34
- package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +0 -209
- package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +0 -57
- package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +0 -111
- package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +0 -28
- package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +0 -117
- package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +0 -25
- package/src/modules/bmm/README.md +0 -128
- package/src/modules/bmm/_module-installer/assets/bmm-kb.md +0 -1
- package/src/modules/bmm/_module-installer/assets/technical-decisions.md +0 -30
- package/src/modules/bmm/_module-installer/install-config.yaml +0 -60
- package/src/modules/bmm/_module-installer/installer.js +0 -131
- package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +0 -35
- package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +0 -32
- package/src/modules/bmm/agents/analyst.agent.yaml +0 -48
- package/src/modules/bmm/agents/architect.agent.yaml +0 -42
- package/src/modules/bmm/agents/dev.agent.yaml +0 -40
- package/src/modules/bmm/agents/pm.agent.yaml +0 -61
- package/src/modules/bmm/agents/sm.agent.yaml +0 -72
- package/src/modules/bmm/agents/tea.agent.yaml +0 -65
- package/src/modules/bmm/agents/tech-writer.agent.yaml +0 -73
- package/src/modules/bmm/agents/ux-designer.agent.yaml +0 -38
- package/src/modules/bmm/docs/README.md +0 -235
- package/src/modules/bmm/docs/agents-guide.md +0 -1056
- package/src/modules/bmm/docs/brownfield-guide.md +0 -754
- package/src/modules/bmm/docs/enterprise-agentic-development.md +0 -680
- package/src/modules/bmm/docs/faq.md +0 -587
- package/src/modules/bmm/docs/glossary.md +0 -320
- package/src/modules/bmm/docs/party-mode.md +0 -224
- package/src/modules/bmm/docs/quick-spec-flow.md +0 -652
- package/src/modules/bmm/docs/quick-start.md +0 -366
- package/src/modules/bmm/docs/scale-adaptive-system.md +0 -599
- package/src/modules/bmm/docs/test-architecture.md +0 -394
- package/src/modules/bmm/docs/workflow-architecture-reference.md +0 -371
- package/src/modules/bmm/docs/workflow-document-project-reference.md +0 -487
- package/src/modules/bmm/docs/workflows-analysis.md +0 -370
- package/src/modules/bmm/docs/workflows-implementation.md +0 -284
- package/src/modules/bmm/docs/workflows-planning.md +0 -601
- package/src/modules/bmm/docs/workflows-solutioning.md +0 -501
- package/src/modules/bmm/teams/default-party.csv +0 -19
- package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +0 -675
- package/src/modules/bmm/testarch/knowledge/component-tdd.md +0 -486
- package/src/modules/bmm/testarch/knowledge/contract-testing.md +0 -957
- package/src/modules/bmm/testarch/knowledge/data-factories.md +0 -500
- package/src/modules/bmm/testarch/knowledge/email-auth.md +0 -721
- package/src/modules/bmm/testarch/knowledge/error-handling.md +0 -725
- package/src/modules/bmm/testarch/knowledge/feature-flags.md +0 -750
- package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +0 -401
- package/src/modules/bmm/testarch/knowledge/network-first.md +0 -486
- package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +0 -670
- package/src/modules/bmm/testarch/knowledge/playwright-config.md +0 -730
- package/src/modules/bmm/testarch/knowledge/probability-impact.md +0 -601
- package/src/modules/bmm/testarch/knowledge/risk-governance.md +0 -615
- package/src/modules/bmm/testarch/knowledge/selective-testing.md +0 -732
- package/src/modules/bmm/testarch/knowledge/selector-resilience.md +0 -527
- package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
- package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +0 -473
- package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
- package/src/modules/bmm/testarch/knowledge/test-quality.md +0 -664
- package/src/modules/bmm/testarch/knowledge/timing-debugging.md +0 -372
- package/src/modules/bmm/testarch/knowledge/visual-debugging.md +0 -524
- package/src/modules/bmm/testarch/tea-index.csv +0 -22
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +0 -110
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +0 -25
- package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +0 -39
- package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +0 -423
- package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +0 -180
- package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +0 -56
- package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +0 -115
- package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +0 -522
- package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +0 -181
- package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +0 -65
- package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +0 -144
- package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +0 -249
- package/src/modules/bmm/workflows/1-analysis/research/checklist.md +0 -299
- package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +0 -114
- package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +0 -437
- package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +0 -674
- package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +0 -133
- package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +0 -533
- package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +0 -94
- package/src/modules/bmm/workflows/1-analysis/research/template-market.md +0 -347
- package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +0 -245
- package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +0 -62
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +0 -310
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +0 -1306
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +0 -145
- package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +0 -99
- package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +0 -346
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/epics-template.md +0 -80
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/instructions.md +0 -292
- package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/workflow.yaml +0 -53
- package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +0 -13
- package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +0 -525
- package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +0 -237
- package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +0 -11
- package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +0 -76
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +0 -217
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -74
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +0 -434
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +0 -978
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +0 -181
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +0 -90
- package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +0 -57
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +0 -321
- package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +0 -103
- package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +0 -240
- package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +0 -222
- package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +0 -696
- package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +0 -13
- package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +0 -96
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +0 -169
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +0 -302
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +0 -146
- package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +0 -66
- package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +0 -12
- package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +0 -22
- package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +0 -398
- package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -57
- package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +0 -279
- package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +0 -206
- package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -52
- package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +0 -240
- package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +0 -256
- package/src/modules/bmm/workflows/4-implementation/create-story/template.md +0 -51
- package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -68
- package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +0 -38
- package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +0 -267
- package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -53
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +0 -17
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +0 -164
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +0 -76
- package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +0 -52
- package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +0 -1442
- package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -52
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +0 -33
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +0 -234
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +0 -55
- package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -50
- package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +0 -16
- package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +0 -34
- package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +0 -209
- package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +0 -57
- package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +0 -111
- package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +0 -28
- package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +0 -117
- package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +0 -25
- package/src/modules/bmm/workflows/document-project/checklist.md +0 -245
- package/src/modules/bmm/workflows/document-project/instructions.md +0 -222
- package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +0 -160
- package/src/modules/bmm/workflows/document-project/workflow.yaml +0 -36
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +0 -298
- package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
- package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +0 -1106
- package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
- package/src/modules/bmm/workflows/techdoc/documentation-standards.md +0 -262
- package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
- package/src/modules/bmm/workflows/testarch/atdd/checklist.md +0 -373
- package/src/modules/bmm/workflows/testarch/atdd/instructions.md +0 -785
- package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +0 -54
- package/src/modules/bmm/workflows/testarch/automate/checklist.md +0 -580
- package/src/modules/bmm/workflows/testarch/automate/instructions.md +0 -1303
- package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +0 -63
- package/src/modules/bmm/workflows/testarch/ci/checklist.md +0 -246
- package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -165
- package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -128
- package/src/modules/bmm/workflows/testarch/ci/instructions.md +0 -517
- package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +0 -55
- package/src/modules/bmm/workflows/testarch/framework/checklist.md +0 -321
- package/src/modules/bmm/workflows/testarch/framework/instructions.md +0 -455
- package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +0 -55
- package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +0 -405
- package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +0 -722
- package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -443
- package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -58
- package/src/modules/bmm/workflows/testarch/test-design/checklist.md +0 -234
- package/src/modules/bmm/workflows/testarch/test-design/instructions.md +0 -782
- package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +0 -285
- package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +0 -58
- package/src/modules/bmm/workflows/testarch/test-review/checklist.md +0 -470
- package/src/modules/bmm/workflows/testarch/test-review/instructions.md +0 -608
- package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +0 -388
- package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +0 -55
- package/src/modules/bmm/workflows/testarch/trace/checklist.md +0 -654
- package/src/modules/bmm/workflows/testarch/trace/instructions.md +0 -1045
- package/src/modules/bmm/workflows/testarch/trace/trace-template.md +0 -673
- package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +0 -68
- package/src/modules/bmm/workflows/workflow-status/init/instructions.md +0 -823
- package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +0 -29
- package/src/modules/bmm/workflows/workflow-status/instructions.md +0 -387
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +0 -120
- package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +0 -108
- package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +0 -52
- package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +0 -104
- package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +0 -95
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +0 -58
- package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +0 -47
- package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +0 -59
- package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +0 -24
- package/src/modules/bmm/workflows/workflow-status/workflow.yaml +0 -30
- package/src/modules/cis/README.md +0 -153
- package/src/modules/cis/_module-installer/install-config.yaml +0 -16
- package/src/modules/cis/_module-installer/installer.js +0 -92
- package/src/modules/cis/agents/README.md +0 -104
- package/src/modules/cis/agents/brainstorming-coach.agent.yaml +0 -28
- package/src/modules/cis/agents/creative-problem-solver.agent.yaml +0 -28
- package/src/modules/cis/agents/design-thinking-coach.agent.yaml +0 -28
- package/src/modules/cis/agents/innovation-strategist.agent.yaml +0 -28
- package/src/modules/cis/agents/storyteller.agent.yaml +0 -28
- package/src/modules/cis/teams/creative-squad.yaml +0 -7
- package/src/modules/cis/teams/default-party.csv +0 -11
- package/src/modules/cis/workflows/README.md +0 -139
- package/src/modules/cis/workflows/design-thinking/README.md +0 -56
- package/src/modules/cis/workflows/design-thinking/design-methods.csv +0 -31
- package/src/modules/cis/workflows/design-thinking/instructions.md +0 -200
- package/src/modules/cis/workflows/design-thinking/template.md +0 -111
- package/src/modules/cis/workflows/design-thinking/workflow.yaml +0 -43
- package/src/modules/cis/workflows/innovation-strategy/README.md +0 -56
- package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +0 -31
- package/src/modules/cis/workflows/innovation-strategy/instructions.md +0 -274
- package/src/modules/cis/workflows/innovation-strategy/template.md +0 -189
- package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +0 -43
- package/src/modules/cis/workflows/problem-solving/README.md +0 -56
- package/src/modules/cis/workflows/problem-solving/instructions.md +0 -250
- package/src/modules/cis/workflows/problem-solving/solving-methods.csv +0 -31
- package/src/modules/cis/workflows/problem-solving/template.md +0 -165
- package/src/modules/cis/workflows/problem-solving/workflow.yaml +0 -43
- package/src/modules/cis/workflows/storytelling/README.md +0 -58
- package/src/modules/cis/workflows/storytelling/instructions.md +0 -291
- package/src/modules/cis/workflows/storytelling/story-types.csv +0 -26
- package/src/modules/cis/workflows/storytelling/template.md +0 -113
- package/src/modules/cis/workflows/storytelling/workflow.yaml +0 -43
- package/src/utility/models/agent-activation-ide.xml +0 -51
- package/src/utility/models/agent-activation-web.xml +0 -60
- 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 -8
- 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 -5
- 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/src/utility/templates/agent.customize.template.yaml +0 -42
- package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +0 -26
- package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +0 -25
- package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +0 -26
- 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 -1667
- package/tools/cli/commands/build.js +0 -458
- package/tools/cli/commands/list.js +0 -28
- package/tools/cli/commands/update.js +0 -28
- package/tools/cli/installers/lib/ide/auggie.js +0 -179
- package/tools/cli/installers/lib/ide/claude-code.js +0 -471
- package/tools/cli/installers/lib/ide/cline.js +0 -220
- package/tools/cli/installers/lib/ide/crush.js +0 -240
- package/tools/cli/installers/lib/ide/cursor.js +0 -352
- package/tools/cli/installers/lib/ide/gemini.js +0 -206
- package/tools/cli/installers/lib/ide/iflow.js +0 -125
- package/tools/cli/installers/lib/ide/opencode.js +0 -212
- package/tools/cli/installers/lib/ide/qwen.js +0 -318
- package/tools/cli/installers/lib/ide/roo.js +0 -253
- package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +0 -14
- package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +0 -12
- package/tools/cli/installers/lib/ide/trae.js +0 -266
- package/tools/cli/installers/lib/ide/windsurf.js +0 -211
- 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/tools/flattener/aggregate.js +0 -76
- package/tools/flattener/binary.js +0 -80
- package/tools/flattener/discovery.js +0 -71
- package/tools/flattener/files.js +0 -35
- package/tools/flattener/ignoreRules.js +0 -172
- package/tools/flattener/main.js +0 -483
- package/tools/flattener/projectRoot.js +0 -201
- package/tools/flattener/prompts.js +0 -44
- package/tools/flattener/stats.helpers.js +0 -368
- package/tools/flattener/stats.js +0 -75
- package/tools/flattener/test-matrix.js +0 -409
- package/tools/flattener/xml.js +0 -88
- package/tools/validate-bundles.js +0 -87
- package/v6-open-items.md +0 -17
- /package/src/{modules/bmm → bmm}/teams/team-fullstack.yaml +0 -0
- /package/src/{modules/bmgd/workflows/4-production → bmm/workflows/4-implementation}/sprint-planning/checklist.md +0 -0
- /package/src/{modules/bmm → bmm}/workflows/document-project/documentation-requirements.csv +0 -0
- /package/src/{modules/bmm → bmm}/workflows/document-project/templates/deep-dive-template.md +0 -0
- /package/src/{modules/bmm → bmm}/workflows/document-project/templates/index-template.md +0 -0
- /package/src/{modules/bmm → bmm}/workflows/document-project/templates/project-overview-template.md +0 -0
- /package/src/{modules/bmm → bmm}/workflows/document-project/templates/source-tree-template.md +0 -0
- /package/src/utility/{models/fragments/handler-data.xml → agent-components/handler-data.txt} +0 -0
- /package/{src/utility/models/action-command-header.md → tools/cli/installers/lib/ide/templates/split/.gitkeep} +0 -0
|
@@ -1,21 +1,33 @@
|
|
|
1
1
|
const path = require('node:path');
|
|
2
2
|
const fs = require('fs-extra');
|
|
3
|
-
const yaml = require('
|
|
4
|
-
const chalk = require('chalk');
|
|
5
|
-
const inquirer = require('inquirer');
|
|
3
|
+
const yaml = require('yaml');
|
|
6
4
|
const { getProjectRoot, getModulePath } = require('../../../lib/project-root');
|
|
7
5
|
const { CLIUtils } = require('../../../lib/cli-utils');
|
|
6
|
+
const prompts = require('../../../lib/prompts');
|
|
8
7
|
|
|
9
8
|
class ConfigCollector {
|
|
10
9
|
constructor() {
|
|
11
10
|
this.collectedConfig = {};
|
|
12
11
|
this.existingConfig = null;
|
|
13
12
|
this.currentProjectDir = null;
|
|
13
|
+
this._moduleManagerInstance = null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Get or create a cached ModuleManager instance (lazy initialization)
|
|
18
|
+
* @returns {Object} ModuleManager instance
|
|
19
|
+
*/
|
|
20
|
+
_getModuleManager() {
|
|
21
|
+
if (!this._moduleManagerInstance) {
|
|
22
|
+
const { ModuleManager } = require('../modules/manager');
|
|
23
|
+
this._moduleManagerInstance = new ModuleManager();
|
|
24
|
+
}
|
|
25
|
+
return this._moduleManagerInstance;
|
|
14
26
|
}
|
|
15
27
|
|
|
16
28
|
/**
|
|
17
29
|
* Find the bmad installation directory in a project
|
|
18
|
-
* V6+ installations can use ANY folder name but ALWAYS have
|
|
30
|
+
* V6+ installations can use ANY folder name but ALWAYS have _config/manifest.yaml
|
|
19
31
|
* @param {string} projectDir - Project directory
|
|
20
32
|
* @returns {Promise<string>} Path to bmad directory
|
|
21
33
|
*/
|
|
@@ -26,13 +38,13 @@ class ConfigCollector {
|
|
|
26
38
|
return path.join(projectDir, 'bmad');
|
|
27
39
|
}
|
|
28
40
|
|
|
29
|
-
// V6+ strategy: Look for ANY directory with
|
|
41
|
+
// V6+ strategy: Look for ANY directory with _config/manifest.yaml
|
|
30
42
|
// This is the definitive marker of a V6+ installation
|
|
31
43
|
try {
|
|
32
44
|
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
33
45
|
for (const entry of entries) {
|
|
34
46
|
if (entry.isDirectory()) {
|
|
35
|
-
const manifestPath = path.join(projectDir, entry.name, '
|
|
47
|
+
const manifestPath = path.join(projectDir, entry.name, '_config', 'manifest.yaml');
|
|
36
48
|
if (await fs.pathExists(manifestPath)) {
|
|
37
49
|
// Found a V6+ installation
|
|
38
50
|
return path.join(projectDir, entry.name);
|
|
@@ -48,6 +60,36 @@ class ConfigCollector {
|
|
|
48
60
|
return path.join(projectDir, 'bmad');
|
|
49
61
|
}
|
|
50
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Detect the existing BMAD folder name in a project
|
|
65
|
+
* @param {string} projectDir - Project directory
|
|
66
|
+
* @returns {Promise<string|null>} Folder name (just the name, not full path) or null if not found
|
|
67
|
+
*/
|
|
68
|
+
async detectExistingBmadFolder(projectDir) {
|
|
69
|
+
// Check if project directory exists
|
|
70
|
+
if (!(await fs.pathExists(projectDir))) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Look for ANY directory with _config/manifest.yaml
|
|
75
|
+
try {
|
|
76
|
+
const entries = await fs.readdir(projectDir, { withFileTypes: true });
|
|
77
|
+
for (const entry of entries) {
|
|
78
|
+
if (entry.isDirectory()) {
|
|
79
|
+
const manifestPath = path.join(projectDir, entry.name, '_config', 'manifest.yaml');
|
|
80
|
+
if (await fs.pathExists(manifestPath)) {
|
|
81
|
+
// Found a V6+ installation, return just the folder name
|
|
82
|
+
return entry.name;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} catch {
|
|
87
|
+
// Ignore errors
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
|
|
51
93
|
/**
|
|
52
94
|
* Load existing config if it exists from module config files
|
|
53
95
|
* @param {string} projectDir - Target project directory
|
|
@@ -75,11 +117,17 @@ class ConfigCollector {
|
|
|
75
117
|
|
|
76
118
|
for (const entry of entries) {
|
|
77
119
|
if (entry.isDirectory()) {
|
|
120
|
+
// Skip the _config directory - it's for system use
|
|
121
|
+
if (entry.name === '_config' || entry.name === '_memory') {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
|
|
78
125
|
const moduleConfigPath = path.join(bmadDir, entry.name, 'config.yaml');
|
|
126
|
+
|
|
79
127
|
if (await fs.pathExists(moduleConfigPath)) {
|
|
80
128
|
try {
|
|
81
129
|
const content = await fs.readFile(moduleConfigPath, 'utf8');
|
|
82
|
-
const moduleConfig = yaml.
|
|
130
|
+
const moduleConfig = yaml.parse(content);
|
|
83
131
|
if (moduleConfig) {
|
|
84
132
|
this.existingConfig[entry.name] = moduleConfig;
|
|
85
133
|
foundAny = true;
|
|
@@ -91,19 +139,86 @@ class ConfigCollector {
|
|
|
91
139
|
}
|
|
92
140
|
}
|
|
93
141
|
|
|
94
|
-
|
|
95
|
-
|
|
142
|
+
return foundAny;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Pre-scan module schemas to gather metadata for the configuration gateway prompt.
|
|
147
|
+
* Returns info about which modules have configurable options.
|
|
148
|
+
* @param {Array} modules - List of non-core module names
|
|
149
|
+
* @returns {Promise<Array>} Array of {moduleName, displayName, questionCount, hasFieldsWithoutDefaults}
|
|
150
|
+
*/
|
|
151
|
+
async scanModuleSchemas(modules) {
|
|
152
|
+
const metadataFields = new Set(['code', 'name', 'header', 'subheader', 'default_selected']);
|
|
153
|
+
const results = [];
|
|
154
|
+
|
|
155
|
+
for (const moduleName of modules) {
|
|
156
|
+
// Resolve module.yaml path - custom paths first, then standard location, then ModuleManager search
|
|
157
|
+
let moduleConfigPath = null;
|
|
158
|
+
const customPath = this.customModulePaths?.get(moduleName);
|
|
159
|
+
if (customPath) {
|
|
160
|
+
moduleConfigPath = path.join(customPath, 'module.yaml');
|
|
161
|
+
} else {
|
|
162
|
+
const standardPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
163
|
+
if (await fs.pathExists(standardPath)) {
|
|
164
|
+
moduleConfigPath = standardPath;
|
|
165
|
+
} else {
|
|
166
|
+
const moduleSourcePath = await this._getModuleManager().findModuleSource(moduleName, { silent: true });
|
|
167
|
+
if (moduleSourcePath) {
|
|
168
|
+
moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (!moduleConfigPath || !(await fs.pathExists(moduleConfigPath))) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
const content = await fs.readFile(moduleConfigPath, 'utf8');
|
|
179
|
+
const moduleConfig = yaml.parse(content);
|
|
180
|
+
if (!moduleConfig) continue;
|
|
181
|
+
|
|
182
|
+
const displayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
183
|
+
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
184
|
+
const questionKeys = configKeys.filter((key) => {
|
|
185
|
+
if (metadataFields.has(key)) return false;
|
|
186
|
+
const item = moduleConfig[key];
|
|
187
|
+
return item && typeof item === 'object' && item.prompt;
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
const hasFieldsWithoutDefaults = questionKeys.some((key) => {
|
|
191
|
+
const item = moduleConfig[key];
|
|
192
|
+
return item.default === undefined || item.default === null || item.default === '';
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
results.push({
|
|
196
|
+
moduleName,
|
|
197
|
+
displayName,
|
|
198
|
+
questionCount: questionKeys.length,
|
|
199
|
+
hasFieldsWithoutDefaults,
|
|
200
|
+
});
|
|
201
|
+
} catch (error) {
|
|
202
|
+
await prompts.log.warn(`Could not read schema for module "${moduleName}": ${error.message}`);
|
|
203
|
+
}
|
|
96
204
|
}
|
|
97
205
|
|
|
98
|
-
return
|
|
206
|
+
return results;
|
|
99
207
|
}
|
|
100
208
|
|
|
101
209
|
/**
|
|
102
210
|
* Collect configuration for all modules
|
|
103
211
|
* @param {Array} modules - List of modules to configure (including 'core')
|
|
104
212
|
* @param {string} projectDir - Target project directory
|
|
213
|
+
* @param {Object} options - Additional options
|
|
214
|
+
* @param {Map} options.customModulePaths - Map of module ID to source path for custom modules
|
|
215
|
+
* @param {boolean} options.skipPrompts - Skip prompts and use defaults (for --yes flag)
|
|
105
216
|
*/
|
|
106
|
-
async collectAllConfigurations(modules, projectDir) {
|
|
217
|
+
async collectAllConfigurations(modules, projectDir, options = {}) {
|
|
218
|
+
// Store custom module paths for use in collectModuleConfig
|
|
219
|
+
this.customModulePaths = options.customModulePaths || new Map();
|
|
220
|
+
this.skipPrompts = options.skipPrompts || false;
|
|
221
|
+
this.modulesToCustomize = undefined;
|
|
107
222
|
await this.loadExistingConfig(projectDir);
|
|
108
223
|
|
|
109
224
|
// Check if core was already collected (e.g., in early collection phase)
|
|
@@ -117,10 +232,102 @@ class ConfigCollector {
|
|
|
117
232
|
this.allAnswers = {};
|
|
118
233
|
}
|
|
119
234
|
|
|
120
|
-
|
|
235
|
+
// Split processing: core first, then gateway, then remaining modules
|
|
236
|
+
const coreModules = allModules.filter((m) => m === 'core');
|
|
237
|
+
const nonCoreModules = allModules.filter((m) => m !== 'core');
|
|
238
|
+
|
|
239
|
+
// Collect core config first (always fully prompted)
|
|
240
|
+
for (const moduleName of coreModules) {
|
|
121
241
|
await this.collectModuleConfig(moduleName, projectDir);
|
|
122
242
|
}
|
|
123
243
|
|
|
244
|
+
// Show batch configuration gateway for non-core modules
|
|
245
|
+
// Scan all non-core module schemas for display names and config metadata
|
|
246
|
+
let scannedModules = [];
|
|
247
|
+
if (!this.skipPrompts && nonCoreModules.length > 0) {
|
|
248
|
+
scannedModules = await this.scanModuleSchemas(nonCoreModules);
|
|
249
|
+
const customizableModules = scannedModules.filter((m) => m.questionCount > 0);
|
|
250
|
+
|
|
251
|
+
if (customizableModules.length > 0) {
|
|
252
|
+
const configMode = await prompts.select({
|
|
253
|
+
message: 'Module configuration',
|
|
254
|
+
choices: [
|
|
255
|
+
{ name: 'Express Setup', value: 'express', hint: 'accept all defaults (recommended)' },
|
|
256
|
+
{ name: 'Customize', value: 'customize', hint: 'choose modules to configure' },
|
|
257
|
+
],
|
|
258
|
+
default: 'express',
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
if (configMode === 'customize') {
|
|
262
|
+
const choices = customizableModules.map((m) => ({
|
|
263
|
+
name: `${m.displayName} (${m.questionCount} option${m.questionCount === 1 ? '' : 's'})`,
|
|
264
|
+
value: m.moduleName,
|
|
265
|
+
hint: m.hasFieldsWithoutDefaults ? 'has fields without defaults' : undefined,
|
|
266
|
+
checked: m.hasFieldsWithoutDefaults,
|
|
267
|
+
}));
|
|
268
|
+
const selected = await prompts.multiselect({
|
|
269
|
+
message: 'Select modules to customize:',
|
|
270
|
+
choices,
|
|
271
|
+
required: false,
|
|
272
|
+
});
|
|
273
|
+
this.modulesToCustomize = new Set(selected);
|
|
274
|
+
} else {
|
|
275
|
+
// Express mode: no modules to customize
|
|
276
|
+
this.modulesToCustomize = new Set();
|
|
277
|
+
}
|
|
278
|
+
} else {
|
|
279
|
+
// All non-core modules have zero config - no gateway needed
|
|
280
|
+
this.modulesToCustomize = new Set();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// Collect remaining non-core modules
|
|
285
|
+
if (this.modulesToCustomize === undefined) {
|
|
286
|
+
// No gateway was shown (skipPrompts, no non-core modules, or direct call) - process all normally
|
|
287
|
+
for (const moduleName of nonCoreModules) {
|
|
288
|
+
await this.collectModuleConfig(moduleName, projectDir);
|
|
289
|
+
}
|
|
290
|
+
} else {
|
|
291
|
+
// Split into default modules (tasks progress) and customized modules (interactive)
|
|
292
|
+
const defaultModules = nonCoreModules.filter((m) => !this.modulesToCustomize.has(m));
|
|
293
|
+
const customizeModules = nonCoreModules.filter((m) => this.modulesToCustomize.has(m));
|
|
294
|
+
|
|
295
|
+
// Run default modules with a single spinner
|
|
296
|
+
if (defaultModules.length > 0) {
|
|
297
|
+
// Build display name map from all scanned modules for pre-call spinner messages
|
|
298
|
+
const displayNameMap = new Map();
|
|
299
|
+
for (const m of scannedModules) {
|
|
300
|
+
displayNameMap.set(m.moduleName, m.displayName);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const configSpinner = await prompts.spinner();
|
|
304
|
+
configSpinner.start('Configuring modules...');
|
|
305
|
+
try {
|
|
306
|
+
for (const moduleName of defaultModules) {
|
|
307
|
+
const displayName = displayNameMap.get(moduleName) || moduleName.toUpperCase();
|
|
308
|
+
configSpinner.message(`Configuring ${displayName}...`);
|
|
309
|
+
try {
|
|
310
|
+
this._silentConfig = true;
|
|
311
|
+
await this.collectModuleConfig(moduleName, projectDir);
|
|
312
|
+
} finally {
|
|
313
|
+
this._silentConfig = false;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
} finally {
|
|
317
|
+
configSpinner.stop(customizeModules.length > 0 ? 'Module defaults applied' : 'Module configuration complete');
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Run customized modules individually (may show interactive prompts)
|
|
322
|
+
for (const moduleName of customizeModules) {
|
|
323
|
+
await this.collectModuleConfig(moduleName, projectDir);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
if (customizeModules.length > 0) {
|
|
327
|
+
await prompts.log.step('Module configuration complete');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
124
331
|
// Add metadata
|
|
125
332
|
this.collectedConfig._meta = {
|
|
126
333
|
version: require(path.join(getProjectRoot(), 'package.json')).version,
|
|
@@ -151,16 +358,38 @@ class ConfigCollector {
|
|
|
151
358
|
this.allAnswers = {};
|
|
152
359
|
}
|
|
153
360
|
|
|
154
|
-
// Load module's
|
|
155
|
-
|
|
156
|
-
|
|
361
|
+
// Load module's config schema from module.yaml
|
|
362
|
+
// First, try the standard src/modules location
|
|
363
|
+
let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
364
|
+
|
|
365
|
+
// If not found in src/modules, we need to find it by searching the project
|
|
366
|
+
if (!(await fs.pathExists(moduleConfigPath))) {
|
|
367
|
+
const moduleSourcePath = await this._getModuleManager().findModuleSource(moduleName, { silent: true });
|
|
368
|
+
|
|
369
|
+
if (moduleSourcePath) {
|
|
370
|
+
moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
|
|
371
|
+
}
|
|
372
|
+
}
|
|
157
373
|
|
|
158
374
|
let configPath = null;
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
configPath =
|
|
375
|
+
let isCustomModule = false;
|
|
376
|
+
|
|
377
|
+
if (await fs.pathExists(moduleConfigPath)) {
|
|
378
|
+
configPath = moduleConfigPath;
|
|
163
379
|
} else {
|
|
380
|
+
// Check if this is a custom module with custom.yaml
|
|
381
|
+
const moduleSourcePath = await this._getModuleManager().findModuleSource(moduleName, { silent: true });
|
|
382
|
+
|
|
383
|
+
if (moduleSourcePath) {
|
|
384
|
+
const rootCustomConfigPath = path.join(moduleSourcePath, 'custom.yaml');
|
|
385
|
+
|
|
386
|
+
if (await fs.pathExists(rootCustomConfigPath)) {
|
|
387
|
+
isCustomModule = true;
|
|
388
|
+
// For custom modules, we don't have an install-config schema, so just use existing values
|
|
389
|
+
// The custom.yaml values will be loaded and merged during installation
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
164
393
|
// No config schema for this module - use existing values
|
|
165
394
|
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
166
395
|
if (!this.collectedConfig[moduleName]) {
|
|
@@ -172,7 +401,7 @@ class ConfigCollector {
|
|
|
172
401
|
}
|
|
173
402
|
|
|
174
403
|
const configContent = await fs.readFile(configPath, 'utf8');
|
|
175
|
-
const moduleConfig = yaml.
|
|
404
|
+
const moduleConfig = yaml.parse(configContent);
|
|
176
405
|
|
|
177
406
|
if (!moduleConfig) {
|
|
178
407
|
return false;
|
|
@@ -182,33 +411,80 @@ class ConfigCollector {
|
|
|
182
411
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
183
412
|
const existingKeys = this.existingConfig && this.existingConfig[moduleName] ? Object.keys(this.existingConfig[moduleName]) : [];
|
|
184
413
|
|
|
414
|
+
// Check if this module has no configuration keys at all (like CIS)
|
|
415
|
+
// Filter out metadata fields and only count actual config objects
|
|
416
|
+
const metadataFields = new Set(['code', 'name', 'header', 'subheader', 'default_selected']);
|
|
417
|
+
const actualConfigKeys = configKeys.filter((key) => !metadataFields.has(key));
|
|
418
|
+
const hasNoConfig = actualConfigKeys.length === 0;
|
|
419
|
+
|
|
420
|
+
// If module has no config keys at all, handle it specially
|
|
421
|
+
if (hasNoConfig && moduleConfig.subheader) {
|
|
422
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
423
|
+
await prompts.log.step(moduleDisplayName);
|
|
424
|
+
await prompts.log.message(` \u2713 ${moduleConfig.subheader}`);
|
|
425
|
+
return false; // No new fields
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// Find new interactive fields (with prompt)
|
|
185
429
|
const newKeys = configKeys.filter((key) => {
|
|
186
430
|
const item = moduleConfig[key];
|
|
187
431
|
// Check if it's a config item and doesn't exist in existing config
|
|
188
432
|
return item && typeof item === 'object' && item.prompt && !existingKeys.includes(key);
|
|
189
433
|
});
|
|
190
434
|
|
|
191
|
-
//
|
|
192
|
-
|
|
435
|
+
// Find new static fields (without prompt, just result)
|
|
436
|
+
const newStaticKeys = configKeys.filter((key) => {
|
|
437
|
+
const item = moduleConfig[key];
|
|
438
|
+
return item && typeof item === 'object' && !item.prompt && item.result && !existingKeys.includes(key);
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
// If in silent mode and no new keys (neither interactive nor static), use existing config and skip prompts
|
|
442
|
+
if (silentMode && newKeys.length === 0 && newStaticKeys.length === 0) {
|
|
193
443
|
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
194
444
|
if (!this.collectedConfig[moduleName]) {
|
|
195
445
|
this.collectedConfig[moduleName] = {};
|
|
196
446
|
}
|
|
197
447
|
this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
|
|
198
448
|
|
|
449
|
+
// Special handling for user_name: ensure it has a value
|
|
450
|
+
if (
|
|
451
|
+
moduleName === 'core' &&
|
|
452
|
+
(!this.collectedConfig[moduleName].user_name || this.collectedConfig[moduleName].user_name === '[USER_NAME]')
|
|
453
|
+
) {
|
|
454
|
+
this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
|
|
455
|
+
}
|
|
456
|
+
|
|
199
457
|
// Also populate allAnswers for cross-referencing
|
|
200
458
|
for (const [key, value] of Object.entries(this.existingConfig[moduleName])) {
|
|
201
|
-
|
|
459
|
+
// Ensure user_name is properly set in allAnswers too
|
|
460
|
+
let finalValue = value;
|
|
461
|
+
if (moduleName === 'core' && key === 'user_name' && (!value || value === '[USER_NAME]')) {
|
|
462
|
+
finalValue = this.getDefaultUsername();
|
|
463
|
+
}
|
|
464
|
+
this.allAnswers[`${moduleName}_${key}`] = finalValue;
|
|
465
|
+
}
|
|
466
|
+
} else if (moduleName === 'core') {
|
|
467
|
+
// No existing core config - ensure we at least have user_name
|
|
468
|
+
if (!this.collectedConfig[moduleName]) {
|
|
469
|
+
this.collectedConfig[moduleName] = {};
|
|
470
|
+
}
|
|
471
|
+
if (!this.collectedConfig[moduleName].user_name) {
|
|
472
|
+
this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
|
|
473
|
+
this.allAnswers[`${moduleName}_user_name`] = this.getDefaultUsername();
|
|
202
474
|
}
|
|
203
475
|
}
|
|
204
|
-
|
|
205
|
-
|
|
476
|
+
|
|
477
|
+
// Show "no config" message for modules with no new questions (that have config keys)
|
|
478
|
+
await prompts.log.message(` \u2713 ${moduleName.toUpperCase()} module already up to date`);
|
|
206
479
|
return false; // No new fields
|
|
207
480
|
}
|
|
208
481
|
|
|
209
|
-
// If we have new fields,
|
|
210
|
-
if (newKeys.length > 0) {
|
|
482
|
+
// If we have new fields (interactive or static), process them
|
|
483
|
+
if (newKeys.length > 0 || newStaticKeys.length > 0) {
|
|
211
484
|
const questions = [];
|
|
485
|
+
const staticAnswers = {};
|
|
486
|
+
|
|
487
|
+
// Build questions for interactive fields
|
|
212
488
|
for (const key of newKeys) {
|
|
213
489
|
const item = moduleConfig[key];
|
|
214
490
|
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
@@ -217,38 +493,54 @@ class ConfigCollector {
|
|
|
217
493
|
}
|
|
218
494
|
}
|
|
219
495
|
|
|
496
|
+
// Prepare static answers (no prompt, just result)
|
|
497
|
+
for (const key of newStaticKeys) {
|
|
498
|
+
staticAnswers[`${moduleName}_${key}`] = undefined;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Collect all answers (static + prompted)
|
|
502
|
+
let allAnswers = { ...staticAnswers };
|
|
503
|
+
|
|
220
504
|
if (questions.length > 0) {
|
|
221
505
|
// Only show header if we actually have questions
|
|
222
|
-
CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
//
|
|
227
|
-
Object.assign(
|
|
228
|
-
|
|
229
|
-
//
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
const item = moduleConfig[originalKey];
|
|
233
|
-
const value = answers[key];
|
|
234
|
-
|
|
235
|
-
let result;
|
|
236
|
-
if (Array.isArray(value)) {
|
|
237
|
-
result = value;
|
|
238
|
-
} else if (item.result) {
|
|
239
|
-
result = this.processResultTemplate(item.result, value);
|
|
240
|
-
} else {
|
|
241
|
-
result = value;
|
|
242
|
-
}
|
|
506
|
+
await CLIUtils.displayModuleConfigHeader(moduleName, moduleConfig.header, moduleConfig.subheader);
|
|
507
|
+
await prompts.log.message('');
|
|
508
|
+
const promptedAnswers = await prompts.prompt(questions);
|
|
509
|
+
|
|
510
|
+
// Merge prompted answers with static answers
|
|
511
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
512
|
+
} else if (newStaticKeys.length > 0) {
|
|
513
|
+
// Only static fields, no questions - show no config message
|
|
514
|
+
await prompts.log.message(` \u2713 ${moduleName.toUpperCase()} module configuration updated`);
|
|
515
|
+
}
|
|
243
516
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
517
|
+
// Store all answers for cross-referencing
|
|
518
|
+
Object.assign(this.allAnswers, allAnswers);
|
|
519
|
+
|
|
520
|
+
// Process all answers (both static and prompted)
|
|
521
|
+
// First, copy existing config to preserve values that aren't being updated
|
|
522
|
+
if (this.existingConfig && this.existingConfig[moduleName]) {
|
|
523
|
+
this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
|
|
249
524
|
} else {
|
|
250
|
-
|
|
251
|
-
|
|
525
|
+
this.collectedConfig[moduleName] = {};
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
for (const key of Object.keys(allAnswers)) {
|
|
529
|
+
const originalKey = key.replace(`${moduleName}_`, '');
|
|
530
|
+
const item = moduleConfig[originalKey];
|
|
531
|
+
const value = allAnswers[key];
|
|
532
|
+
|
|
533
|
+
let result;
|
|
534
|
+
if (Array.isArray(value)) {
|
|
535
|
+
result = value;
|
|
536
|
+
} else if (item.result) {
|
|
537
|
+
result = this.processResultTemplate(item.result, value);
|
|
538
|
+
} else {
|
|
539
|
+
result = value;
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
// Update the collected config with new/updated values
|
|
543
|
+
this.collectedConfig[moduleName][originalKey] = result;
|
|
252
544
|
}
|
|
253
545
|
}
|
|
254
546
|
|
|
@@ -265,7 +557,9 @@ class ConfigCollector {
|
|
|
265
557
|
}
|
|
266
558
|
}
|
|
267
559
|
|
|
268
|
-
|
|
560
|
+
await this.displayModulePostConfigNotes(moduleName, moduleConfig);
|
|
561
|
+
|
|
562
|
+
return newKeys.length > 0 || newStaticKeys.length > 0; // Return true if we had any new fields (interactive or static)
|
|
269
563
|
}
|
|
270
564
|
|
|
271
565
|
/**
|
|
@@ -329,6 +623,25 @@ class ConfigCollector {
|
|
|
329
623
|
return result;
|
|
330
624
|
}
|
|
331
625
|
|
|
626
|
+
/**
|
|
627
|
+
* Get the default username from the system
|
|
628
|
+
* @returns {string} Capitalized username\
|
|
629
|
+
*/
|
|
630
|
+
getDefaultUsername() {
|
|
631
|
+
let result = 'BMad';
|
|
632
|
+
try {
|
|
633
|
+
const os = require('node:os');
|
|
634
|
+
const userInfo = os.userInfo();
|
|
635
|
+
if (userInfo && userInfo.username) {
|
|
636
|
+
const username = userInfo.username;
|
|
637
|
+
result = username.charAt(0).toUpperCase() + username.slice(1);
|
|
638
|
+
}
|
|
639
|
+
} catch {
|
|
640
|
+
// Do nothing, just return 'BMad'
|
|
641
|
+
}
|
|
642
|
+
return result;
|
|
643
|
+
}
|
|
644
|
+
|
|
332
645
|
/**
|
|
333
646
|
* Collect configuration for a single module
|
|
334
647
|
* @param {string} moduleName - Module name
|
|
@@ -347,22 +660,37 @@ class ConfigCollector {
|
|
|
347
660
|
if (!this.allAnswers) {
|
|
348
661
|
this.allAnswers = {};
|
|
349
662
|
}
|
|
350
|
-
// Load module's config
|
|
351
|
-
|
|
352
|
-
|
|
663
|
+
// Load module's config
|
|
664
|
+
// First, check if we have a custom module path for this module
|
|
665
|
+
let moduleConfigPath = null;
|
|
666
|
+
|
|
667
|
+
if (this.customModulePaths && this.customModulePaths.has(moduleName)) {
|
|
668
|
+
const customPath = this.customModulePaths.get(moduleName);
|
|
669
|
+
moduleConfigPath = path.join(customPath, 'module.yaml');
|
|
670
|
+
} else {
|
|
671
|
+
// Try the standard src/modules location
|
|
672
|
+
moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
// If not found in src/modules or custom paths, search the project
|
|
676
|
+
if (!(await fs.pathExists(moduleConfigPath))) {
|
|
677
|
+
const moduleSourcePath = await this._getModuleManager().findModuleSource(moduleName, { silent: true });
|
|
678
|
+
|
|
679
|
+
if (moduleSourcePath) {
|
|
680
|
+
moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
|
|
681
|
+
}
|
|
682
|
+
}
|
|
353
683
|
|
|
354
684
|
let configPath = null;
|
|
355
|
-
if (await fs.pathExists(
|
|
356
|
-
configPath =
|
|
357
|
-
} else if (await fs.pathExists(legacyConfigPath)) {
|
|
358
|
-
configPath = legacyConfigPath;
|
|
685
|
+
if (await fs.pathExists(moduleConfigPath)) {
|
|
686
|
+
configPath = moduleConfigPath;
|
|
359
687
|
} else {
|
|
360
688
|
// No config for this module
|
|
361
689
|
return;
|
|
362
690
|
}
|
|
363
691
|
|
|
364
692
|
const configContent = await fs.readFile(configPath, 'utf8');
|
|
365
|
-
const moduleConfig = yaml.
|
|
693
|
+
const moduleConfig = yaml.parse(configContent);
|
|
366
694
|
|
|
367
695
|
if (!moduleConfig) {
|
|
368
696
|
return;
|
|
@@ -370,30 +698,104 @@ class ConfigCollector {
|
|
|
370
698
|
|
|
371
699
|
// Process each config item
|
|
372
700
|
const questions = [];
|
|
701
|
+
const staticAnswers = {};
|
|
373
702
|
const configKeys = Object.keys(moduleConfig).filter((key) => key !== 'prompt');
|
|
374
703
|
|
|
375
704
|
for (const key of configKeys) {
|
|
376
705
|
const item = moduleConfig[key];
|
|
377
706
|
|
|
378
707
|
// Skip if not a config object
|
|
379
|
-
if (!item || typeof item !== 'object'
|
|
708
|
+
if (!item || typeof item !== 'object') {
|
|
709
|
+
continue;
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Handle static values (no prompt, just result)
|
|
713
|
+
if (!item.prompt && item.result) {
|
|
714
|
+
// Add to static answers with a marker value
|
|
715
|
+
staticAnswers[`${moduleName}_${key}`] = undefined;
|
|
380
716
|
continue;
|
|
381
717
|
}
|
|
382
718
|
|
|
383
|
-
|
|
384
|
-
if (
|
|
385
|
-
|
|
719
|
+
// Handle interactive values (with prompt)
|
|
720
|
+
if (item.prompt) {
|
|
721
|
+
const question = await this.buildQuestion(moduleName, key, item, moduleConfig);
|
|
722
|
+
if (question) {
|
|
723
|
+
questions.push(question);
|
|
724
|
+
}
|
|
386
725
|
}
|
|
387
726
|
}
|
|
388
727
|
|
|
389
|
-
//
|
|
728
|
+
// Collect all answers (static + prompted)
|
|
729
|
+
let allAnswers = { ...staticAnswers };
|
|
730
|
+
|
|
731
|
+
// If there are questions to ask, prompt for accepting defaults vs customizing
|
|
390
732
|
if (questions.length > 0) {
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
733
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
734
|
+
|
|
735
|
+
// Skip prompts mode: use all defaults without asking
|
|
736
|
+
if (this.skipPrompts) {
|
|
737
|
+
await prompts.log.info(`Using default configuration for ${moduleDisplayName}`);
|
|
738
|
+
// Use defaults for all questions
|
|
739
|
+
for (const question of questions) {
|
|
740
|
+
const hasDefault = question.default !== undefined && question.default !== null && question.default !== '';
|
|
741
|
+
if (hasDefault && typeof question.default !== 'function') {
|
|
742
|
+
allAnswers[question.name] = question.default;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
} else {
|
|
746
|
+
if (!this._silentConfig) await prompts.log.step(`Configuring ${moduleDisplayName}`);
|
|
747
|
+
let useDefaults = true;
|
|
748
|
+
if (moduleName === 'core') {
|
|
749
|
+
useDefaults = false; // Core: always show all questions
|
|
750
|
+
} else if (this.modulesToCustomize === undefined) {
|
|
751
|
+
// Fallback: original per-module confirm (backward compat for direct calls)
|
|
752
|
+
const customizeAnswer = await prompts.prompt([
|
|
753
|
+
{
|
|
754
|
+
type: 'confirm',
|
|
755
|
+
name: 'customize',
|
|
756
|
+
message: 'Accept Defaults (no to customize)?',
|
|
757
|
+
default: true,
|
|
758
|
+
},
|
|
759
|
+
]);
|
|
760
|
+
useDefaults = customizeAnswer.customize;
|
|
761
|
+
} else {
|
|
762
|
+
// Batch mode: use defaults unless module was selected for customization
|
|
763
|
+
useDefaults = !this.modulesToCustomize.has(moduleName);
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
if (useDefaults && moduleName !== 'core') {
|
|
767
|
+
// Accept defaults - only ask questions that have NO default value
|
|
768
|
+
const questionsWithoutDefaults = questions.filter((q) => q.default === undefined || q.default === null || q.default === '');
|
|
394
769
|
|
|
395
|
-
|
|
396
|
-
|
|
770
|
+
if (questionsWithoutDefaults.length > 0) {
|
|
771
|
+
await prompts.log.message(` Asking required questions for ${moduleName.toUpperCase()}...`);
|
|
772
|
+
const promptedAnswers = await prompts.prompt(questionsWithoutDefaults);
|
|
773
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
// For questions with defaults that weren't asked, we need to process them with their default values
|
|
777
|
+
const questionsWithDefaults = questions.filter((q) => q.default !== undefined && q.default !== null && q.default !== '');
|
|
778
|
+
for (const question of questionsWithDefaults) {
|
|
779
|
+
// Skip function defaults - these are dynamic and will be evaluated later
|
|
780
|
+
if (typeof question.default === 'function') {
|
|
781
|
+
continue;
|
|
782
|
+
}
|
|
783
|
+
allAnswers[question.name] = question.default;
|
|
784
|
+
}
|
|
785
|
+
} else {
|
|
786
|
+
const promptedAnswers = await prompts.prompt(questions);
|
|
787
|
+
Object.assign(allAnswers, promptedAnswers);
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
// Store all answers for cross-referencing
|
|
793
|
+
Object.assign(this.allAnswers, allAnswers);
|
|
794
|
+
|
|
795
|
+
// Process all answers (both static and prompted)
|
|
796
|
+
// Always process if we have any answers or static answers
|
|
797
|
+
if (Object.keys(allAnswers).length > 0 || Object.keys(staticAnswers).length > 0) {
|
|
798
|
+
const answers = allAnswers;
|
|
397
799
|
|
|
398
800
|
// Process answers and build result values
|
|
399
801
|
for (const key of Object.keys(answers)) {
|
|
@@ -406,8 +808,6 @@ class ConfigCollector {
|
|
|
406
808
|
|
|
407
809
|
// For arrays (multi-select), handle differently
|
|
408
810
|
if (Array.isArray(value)) {
|
|
409
|
-
// If there's a result template and it's a string, don't use it for arrays
|
|
410
|
-
// Just use the array value directly
|
|
411
811
|
result = value;
|
|
412
812
|
} else if (item.result) {
|
|
413
813
|
result = item.result;
|
|
@@ -422,11 +822,9 @@ class ConfigCollector {
|
|
|
422
822
|
if (result === '{value}') {
|
|
423
823
|
result = value;
|
|
424
824
|
} else {
|
|
425
|
-
// Otherwise replace in the string
|
|
426
825
|
result = result.replace('{value}', value);
|
|
427
826
|
}
|
|
428
827
|
} else {
|
|
429
|
-
// For non-string values, use directly
|
|
430
828
|
result = value;
|
|
431
829
|
}
|
|
432
830
|
|
|
@@ -464,10 +862,6 @@ class ConfigCollector {
|
|
|
464
862
|
for (const mod of Object.keys(this.collectedConfig)) {
|
|
465
863
|
if (mod !== '_meta' && this.collectedConfig[mod] && this.collectedConfig[mod][configKey]) {
|
|
466
864
|
configValue = this.collectedConfig[mod][configKey];
|
|
467
|
-
// Extract just the value part if it's a result template
|
|
468
|
-
if (typeof configValue === 'string' && configValue.includes('{project-root}/')) {
|
|
469
|
-
configValue = configValue.replace('{project-root}/', '');
|
|
470
|
-
}
|
|
471
865
|
break;
|
|
472
866
|
}
|
|
473
867
|
}
|
|
@@ -478,7 +872,6 @@ class ConfigCollector {
|
|
|
478
872
|
}
|
|
479
873
|
}
|
|
480
874
|
} else {
|
|
481
|
-
// No result template, use value directly
|
|
482
875
|
result = value;
|
|
483
876
|
}
|
|
484
877
|
|
|
@@ -491,9 +884,56 @@ class ConfigCollector {
|
|
|
491
884
|
|
|
492
885
|
// No longer display completion boxes - keep output clean
|
|
493
886
|
} else {
|
|
494
|
-
// No questions for this module - show completion message
|
|
495
|
-
|
|
887
|
+
// No questions for this module - show completion message with header if available
|
|
888
|
+
const moduleDisplayName = moduleConfig.header || `${moduleName.toUpperCase()} Module`;
|
|
889
|
+
|
|
890
|
+
// Check if this module has NO configuration keys at all (like CIS)
|
|
891
|
+
// Filter out metadata fields and only count actual config objects
|
|
892
|
+
const metadataFields = new Set(['code', 'name', 'header', 'subheader', 'default_selected']);
|
|
893
|
+
const actualConfigKeys = configKeys.filter((key) => !metadataFields.has(key));
|
|
894
|
+
const hasNoConfig = actualConfigKeys.length === 0;
|
|
895
|
+
|
|
896
|
+
if (!this._silentConfig) {
|
|
897
|
+
if (hasNoConfig && (moduleConfig.subheader || moduleConfig.header)) {
|
|
898
|
+
await prompts.log.step(moduleDisplayName);
|
|
899
|
+
if (moduleConfig.subheader) {
|
|
900
|
+
await prompts.log.message(` \u2713 ${moduleConfig.subheader}`);
|
|
901
|
+
} else {
|
|
902
|
+
await prompts.log.message(` \u2713 No custom configuration required`);
|
|
903
|
+
}
|
|
904
|
+
} else {
|
|
905
|
+
// Module has config but just no questions to ask
|
|
906
|
+
await prompts.log.message(` \u2713 ${moduleName.toUpperCase()} module configured`);
|
|
907
|
+
}
|
|
908
|
+
}
|
|
496
909
|
}
|
|
910
|
+
|
|
911
|
+
// If we have no collected config for this module, but we have a module schema,
|
|
912
|
+
// ensure we have at least an empty object
|
|
913
|
+
if (!this.collectedConfig[moduleName]) {
|
|
914
|
+
this.collectedConfig[moduleName] = {};
|
|
915
|
+
|
|
916
|
+
// If we accepted defaults and have no answers, we still need to check
|
|
917
|
+
// if there are any static values in the schema that should be applied
|
|
918
|
+
if (moduleConfig) {
|
|
919
|
+
for (const key of Object.keys(moduleConfig)) {
|
|
920
|
+
if (key !== 'prompt' && moduleConfig[key] && typeof moduleConfig[key] === 'object') {
|
|
921
|
+
const item = moduleConfig[key];
|
|
922
|
+
// For static items (no prompt, just result), apply the result
|
|
923
|
+
if (!item.prompt && item.result) {
|
|
924
|
+
// Apply any placeholder replacements to the result
|
|
925
|
+
let result = item.result;
|
|
926
|
+
if (typeof result === 'string') {
|
|
927
|
+
result = this.replacePlaceholders(result, moduleName, moduleConfig);
|
|
928
|
+
}
|
|
929
|
+
this.collectedConfig[moduleName][key] = result;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
|
|
936
|
+
await this.displayModulePostConfigNotes(moduleName, moduleConfig);
|
|
497
937
|
}
|
|
498
938
|
|
|
499
939
|
/**
|
|
@@ -522,10 +962,6 @@ class ConfigCollector {
|
|
|
522
962
|
for (const mod of Object.keys(this.collectedConfig)) {
|
|
523
963
|
if (mod !== '_meta' && this.collectedConfig[mod] && this.collectedConfig[mod][configKey]) {
|
|
524
964
|
configValue = this.collectedConfig[mod][configKey];
|
|
525
|
-
// Remove {project-root}/ prefix if present for cleaner display
|
|
526
|
-
if (typeof configValue === 'string' && configValue.includes('{project-root}/')) {
|
|
527
|
-
configValue = configValue.replace('{project-root}/', '');
|
|
528
|
-
}
|
|
529
965
|
break;
|
|
530
966
|
}
|
|
531
967
|
}
|
|
@@ -544,7 +980,7 @@ class ConfigCollector {
|
|
|
544
980
|
}
|
|
545
981
|
|
|
546
982
|
/**
|
|
547
|
-
* Build
|
|
983
|
+
* Build a prompt question from a config item
|
|
548
984
|
* @param {string} moduleName - Module name
|
|
549
985
|
* @param {string} key - Config key
|
|
550
986
|
* @param {Object} item - Config item definition
|
|
@@ -565,6 +1001,11 @@ class ConfigCollector {
|
|
|
565
1001
|
}
|
|
566
1002
|
}
|
|
567
1003
|
|
|
1004
|
+
// Special handling for user_name: default to system user
|
|
1005
|
+
if (moduleName === 'core' && key === 'user_name' && !existingValue) {
|
|
1006
|
+
item.default = this.getDefaultUsername();
|
|
1007
|
+
}
|
|
1008
|
+
|
|
568
1009
|
// Determine question type and default value
|
|
569
1010
|
let questionType = 'input';
|
|
570
1011
|
let defaultValue = item.default;
|
|
@@ -674,14 +1115,15 @@ class ConfigCollector {
|
|
|
674
1115
|
}
|
|
675
1116
|
|
|
676
1117
|
// Add current value indicator for existing configs
|
|
1118
|
+
const color = await prompts.getColor();
|
|
677
1119
|
if (existingValue !== null && existingValue !== undefined) {
|
|
678
1120
|
if (typeof existingValue === 'boolean') {
|
|
679
|
-
message +=
|
|
1121
|
+
message += color.dim(` (current: ${existingValue ? 'true' : 'false'})`);
|
|
680
1122
|
} else if (Array.isArray(existingValue)) {
|
|
681
|
-
message +=
|
|
1123
|
+
message += color.dim(` (current: ${existingValue.join(', ')})`);
|
|
682
1124
|
} else if (questionType !== 'list') {
|
|
683
1125
|
// Show the cleaned value (without {project-root}/) for display
|
|
684
|
-
message +=
|
|
1126
|
+
message += color.dim(` (current: ${existingValue})`);
|
|
685
1127
|
}
|
|
686
1128
|
} else if (item.example && questionType === 'input') {
|
|
687
1129
|
// Show example for input fields
|
|
@@ -691,7 +1133,7 @@ class ConfigCollector {
|
|
|
691
1133
|
exampleText = this.replacePlaceholders(exampleText, moduleName, moduleConfig);
|
|
692
1134
|
exampleText = exampleText.replace('{project-root}/', '');
|
|
693
1135
|
}
|
|
694
|
-
message +=
|
|
1136
|
+
message += color.dim(` (e.g., ${exampleText})`);
|
|
695
1137
|
}
|
|
696
1138
|
|
|
697
1139
|
// Build the question object
|
|
@@ -701,7 +1143,7 @@ class ConfigCollector {
|
|
|
701
1143
|
message: message,
|
|
702
1144
|
};
|
|
703
1145
|
|
|
704
|
-
// Set default - if it's dynamic, use a function that
|
|
1146
|
+
// Set default - if it's dynamic, use a function that the prompt will evaluate with current answers
|
|
705
1147
|
// But if we have an existing value, always use that instead
|
|
706
1148
|
if (existingValue !== null && existingValue !== undefined && questionType !== 'list') {
|
|
707
1149
|
question.default = existingValue;
|
|
@@ -764,6 +1206,58 @@ class ConfigCollector {
|
|
|
764
1206
|
return question;
|
|
765
1207
|
}
|
|
766
1208
|
|
|
1209
|
+
/**
|
|
1210
|
+
* Display post-configuration notes for a module
|
|
1211
|
+
* Shows prerequisite guidance based on collected config values
|
|
1212
|
+
* Reads notes from the module's `post-install-notes` section in module.yaml
|
|
1213
|
+
* Supports two formats:
|
|
1214
|
+
* - Simple string: always displayed
|
|
1215
|
+
* - Object keyed by config field name, with value-specific messages
|
|
1216
|
+
* @param {string} moduleName - Module name
|
|
1217
|
+
* @param {Object} moduleConfig - Parsed module.yaml content
|
|
1218
|
+
*/
|
|
1219
|
+
async displayModulePostConfigNotes(moduleName, moduleConfig) {
|
|
1220
|
+
if (this._silentConfig) return;
|
|
1221
|
+
if (!moduleConfig || !moduleConfig['post-install-notes']) return;
|
|
1222
|
+
|
|
1223
|
+
const notes = moduleConfig['post-install-notes'];
|
|
1224
|
+
const color = await prompts.getColor();
|
|
1225
|
+
|
|
1226
|
+
// Format 1: Simple string - always display
|
|
1227
|
+
if (typeof notes === 'string') {
|
|
1228
|
+
await prompts.log.message('');
|
|
1229
|
+
for (const line of notes.trim().split('\n')) {
|
|
1230
|
+
await prompts.log.message(color.dim(line));
|
|
1231
|
+
}
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1234
|
+
|
|
1235
|
+
// Format 2: Conditional on config values
|
|
1236
|
+
if (typeof notes === 'object') {
|
|
1237
|
+
const config = this.collectedConfig[moduleName];
|
|
1238
|
+
if (!config) return;
|
|
1239
|
+
|
|
1240
|
+
let hasOutput = false;
|
|
1241
|
+
for (const [configKey, valueMessages] of Object.entries(notes)) {
|
|
1242
|
+
const selectedValue = config[configKey];
|
|
1243
|
+
if (!selectedValue || !valueMessages[selectedValue]) continue;
|
|
1244
|
+
|
|
1245
|
+
if (hasOutput) await prompts.log.message('');
|
|
1246
|
+
hasOutput = true;
|
|
1247
|
+
|
|
1248
|
+
const message = valueMessages[selectedValue];
|
|
1249
|
+
for (const line of message.trim().split('\n')) {
|
|
1250
|
+
const trimmedLine = line.trim();
|
|
1251
|
+
if (trimmedLine.endsWith(':') && !trimmedLine.startsWith(' ')) {
|
|
1252
|
+
await prompts.log.info(color.bold(trimmedLine));
|
|
1253
|
+
} else {
|
|
1254
|
+
await prompts.log.message(color.dim(' ' + trimmedLine));
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
|
|
767
1261
|
/**
|
|
768
1262
|
* Deep merge two objects
|
|
769
1263
|
* @param {Object} target - Target object
|