mdan-cli 2.5.0 → 2.5.2
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-audit-file-refs/SKILL.md +6 -0
- package/.claude/skills/bmad-os-audit-file-refs/prompts/instructions.md +59 -0
- package/.claude/skills/bmad-os-changelog-social/SKILL.md +177 -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 +6 -0
- package/.claude/skills/bmad-os-diataxis-style-fix/prompts/instructions.md +229 -0
- package/.claude/skills/bmad-os-draft-changelog/SKILL.md +6 -0
- package/.claude/skills/bmad-os-draft-changelog/prompts/instructions.md +82 -0
- package/.claude/skills/bmad-os-gh-triage/SKILL.md +6 -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/SKILL.md +6 -0
- package/.claude/skills/bmad-os-release-module/prompts/instructions.md +53 -0
- package/.claude/skills/bmad-os-review-pr/SKILL.md +6 -0
- package/.claude/skills/bmad-os-review-pr/prompts/instructions.md +231 -0
- package/.claude/skills/bmad-os-root-cause-analysis/SKILL.md +12 -0
- package/.claude/skills/bmad-os-root-cause-analysis/prompts/instructions.md +74 -0
- package/.coderabbit.yaml +85 -0
- package/.github/CODE_OF_CONDUCT.md +128 -0
- package/.github/FUNDING.yaml +15 -0
- package/.github/ISSUE_TEMPLATE/bug-report.yaml +124 -0
- package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
- 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 +90 -0
- package/.github/workflows/docs.yaml +64 -0
- package/.github/workflows/quality.yaml +116 -0
- package/.husky/pre-commit +20 -0
- package/.markdownlint-cli2.yaml +41 -0
- package/.nvmrc +1 -0
- package/.prettierignore +12 -0
- package/.vscode/settings.json +96 -0
- package/AGENTS.md +227 -165
- package/AGENTS_LIST.md +946 -0
- package/ARCHITECTURE.md +590 -0
- package/CHANGELOG.md +1770 -0
- package/CNAME +1 -0
- package/CONTRIBUTING.md +512 -0
- package/CONTRIBUTORS.md +32 -0
- package/INSTALL.md +246 -0
- package/LICENSE +30 -0
- package/README.md +133 -194
- package/RELEASE_NOTES.md +246 -0
- package/SECURITY.md +85 -0
- package/TRADEMARK.md +55 -0
- package/USAGE.md +368 -0
- package/Wordmark.png +0 -0
- package/app/__init__.py +5 -0
- package/app/cis/agents/__init__.py +31 -0
- package/app/cis/agents/brainstorming-coach/__init__.py +3 -0
- package/app/cis/agents/brainstorming-coach/agent.py +162 -0
- package/app/cis/agents/brainstorming-coach/prompt.yaml +53 -0
- package/app/cis/agents/creative-problem-solver/__init__.py +3 -0
- package/app/cis/agents/creative-problem-solver/agent.py +233 -0
- package/app/cis/agents/creative-problem-solver/prompt.yaml +74 -0
- package/app/cis/agents/design-thinking-coach/__init__.py +3 -0
- package/app/cis/agents/design-thinking-coach/agent.py +241 -0
- package/app/cis/agents/design-thinking-coach/prompt.yaml +77 -0
- package/app/cis/agents/innovation-strategist/__init__.py +3 -0
- package/app/cis/agents/innovation-strategist/agent.py +271 -0
- package/app/cis/agents/innovation-strategist/prompt.yaml +70 -0
- package/app/cis/agents/presentation-master/__init__.py +3 -0
- package/app/cis/agents/presentation-master/agent.py +420 -0
- package/app/cis/agents/presentation-master/prompt.yaml +62 -0
- package/app/cis/agents/storyteller/__init__.py +3 -0
- package/app/cis/agents/storyteller/agent.py +303 -0
- package/app/cis/agents/storyteller/prompt.yaml +99 -0
- package/app/core/__init__.py +5 -0
- package/app/core/agents/__init__.py +5 -0
- package/app/core/agents/mdan-master/__init__.py +7 -0
- package/app/core/agents/mdan-master/agent.py +302 -0
- package/app/core/agents/mdan-master/prompt.yaml +105 -0
- package/app/mmb/agents/__init__.py +24 -0
- package/app/mmb/agents/agent-builder/__init__.py +5 -0
- package/app/mmb/agents/agent-builder/agent.py +261 -0
- package/app/mmb/agents/agent-builder/prompt.yaml +48 -0
- package/app/mmb/agents/module-builder/__init__.py +5 -0
- package/app/mmb/agents/module-builder/agent.py +299 -0
- package/app/mmb/agents/module-builder/prompt.yaml +50 -0
- package/app/mmb/agents/workflow-builder/__init__.py +5 -0
- package/app/mmb/agents/workflow-builder/agent.py +318 -0
- package/app/mmb/agents/workflow-builder/prompt.yaml +52 -0
- package/app/mmm/agents/__init__.py +48 -0
- package/app/mmm/agents/analyst/__init__.py +7 -0
- package/app/mmm/agents/analyst/agent.py +384 -0
- package/app/mmm/agents/analyst/prompt.yaml +62 -0
- package/app/mmm/agents/architect/__init__.py +7 -0
- package/app/mmm/agents/architect/agent.py +300 -0
- package/app/mmm/agents/architect/prompt.yaml +66 -0
- package/app/mmm/agents/dev/__init__.py +7 -0
- package/app/mmm/agents/dev/agent.py +285 -0
- package/app/mmm/agents/dev/prompt.yaml +62 -0
- package/app/mmm/agents/pm/__init__.py +7 -0
- package/app/mmm/agents/pm/agent.py +417 -0
- package/app/mmm/agents/pm/prompt.yaml +64 -0
- package/app/mmm/agents/qa/__init__.py +7 -0
- package/app/mmm/agents/qa/agent.py +267 -0
- package/app/mmm/agents/qa/prompt.yaml +67 -0
- package/app/mmm/agents/quick-flow-solo-dev/__init__.py +7 -0
- package/app/mmm/agents/quick-flow-solo-dev/agent.py +319 -0
- package/app/mmm/agents/quick-flow-solo-dev/prompt.yaml +60 -0
- package/app/mmm/agents/sm/__init__.py +7 -0
- package/app/mmm/agents/sm/agent.py +357 -0
- package/app/mmm/agents/sm/prompt.yaml +61 -0
- package/app/mmm/agents/tech-writer/__init__.py +7 -0
- package/app/mmm/agents/tech-writer/agent.py +420 -0
- package/app/mmm/agents/tech-writer/prompt.yaml +70 -0
- package/app/mmm/agents/ux-designer/__init__.py +14 -0
- package/app/mmm/agents/ux-designer/agent.py +412 -0
- package/app/mmm/agents/ux-designer/prompt.yaml +37 -0
- package/app/packs/__init__.py +32 -0
- package/app/packs/db-optimization/__init__.py +13 -0
- package/app/packs/db-optimization/agents/__init__.py +11 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/__init__.py +5 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/agent.py +559 -0
- package/app/packs/db-optimization/agents/db-performance-analyst/prompt.yaml +63 -0
- package/app/packs/db-optimization/agents/indexing-specialist/__init__.py +5 -0
- package/app/packs/db-optimization/agents/indexing-specialist/agent.py +713 -0
- package/app/packs/db-optimization/agents/indexing-specialist/prompt.yaml +92 -0
- package/app/packs/db-optimization/agents/query-optimizer/__init__.py +5 -0
- package/app/packs/db-optimization/agents/query-optimizer/agent.py +566 -0
- package/app/packs/db-optimization/agents/query-optimizer/prompt.yaml +74 -0
- package/app/packs/devops-azure/__init__.py +13 -0
- package/app/packs/devops-azure/agents/__init__.py +11 -0
- package/app/packs/devops-azure/agents/azure-specialist/__init__.py +5 -0
- package/app/packs/devops-azure/agents/azure-specialist/agent.py +584 -0
- package/app/packs/devops-azure/agents/azure-specialist/prompt.yaml +301 -0
- package/app/packs/devops-azure/agents/cicd-architect/__init__.py +5 -0
- package/app/packs/devops-azure/agents/cicd-architect/agent.py +665 -0
- package/app/packs/devops-azure/agents/cicd-architect/prompt.yaml +409 -0
- package/app/packs/devops-azure/agents/devops-engineer/__init__.py +5 -0
- package/app/packs/devops-azure/agents/devops-engineer/agent.py +545 -0
- package/app/packs/devops-azure/agents/devops-engineer/prompt.yaml +263 -0
- package/app/packs/fintech/__init__.py +13 -0
- package/app/packs/fintech/agents/__init__.py +11 -0
- package/app/packs/fintech/agents/compliance-officer/__init__.py +5 -0
- package/app/packs/fintech/agents/compliance-officer/agent.py +449 -0
- package/app/packs/fintech/agents/compliance-officer/prompt.yaml +135 -0
- package/app/packs/fintech/agents/financial-analyst/__init__.py +5 -0
- package/app/packs/fintech/agents/financial-analyst/agent.py +392 -0
- package/app/packs/fintech/agents/financial-analyst/prompt.yaml +143 -0
- package/app/packs/fintech/agents/risk-manager/__init__.py +5 -0
- package/app/packs/fintech/agents/risk-manager/agent.py +664 -0
- package/app/packs/fintech/agents/risk-manager/prompt.yaml +240 -0
- package/app/tea/agents/tea/__init__.py +9 -0
- package/app/tea/agents/tea/agent.py +689 -0
- package/app/tea/agents/tea/prompt.yaml +100 -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 +117 -0
- package/docs/how-to/get-answers-about-bmad.md +134 -0
- package/docs/how-to/install-bmad.md +97 -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 +59 -0
- package/docs/reference/agents.md +28 -0
- package/docs/reference/commands.md +151 -0
- package/docs/reference/modules.md +76 -0
- package/docs/reference/testing.md +106 -0
- package/docs/reference/workflow-map.md +89 -0
- package/docs/roadmap.mdx +136 -0
- package/docs/tutorials/getting-started.md +286 -0
- package/eslint.config.mjs +141 -0
- package/package.json +106 -37
- package/prettier.config.mjs +32 -0
- package/prompts/cis/brainstorming-coach.yaml +53 -0
- package/prompts/cis/creative-problem-solver.yaml +74 -0
- package/prompts/cis/design-thinking-coach.yaml +77 -0
- package/prompts/cis/innovation-strategist.yaml +70 -0
- package/prompts/cis/presentation-master.yaml +62 -0
- package/prompts/cis/storyteller.yaml +99 -0
- package/prompts/core/mdan-master.yaml +105 -0
- package/prompts/mmb/agent-builder.yaml +48 -0
- package/prompts/mmb/module-builder.yaml +50 -0
- package/prompts/mmb/workflow-builder.yaml +52 -0
- package/prompts/mmm/analyst.yaml +62 -0
- package/prompts/mmm/architect.yaml +66 -0
- package/prompts/mmm/dev.yaml +62 -0
- package/prompts/mmm/pm.yaml +64 -0
- package/prompts/mmm/qa.yaml +67 -0
- package/prompts/mmm/quick-flow-solo-dev.yaml +60 -0
- package/prompts/mmm/sm.yaml +61 -0
- package/prompts/mmm/tech-writer.yaml +70 -0
- package/prompts/mmm/ux-designer.yaml +33 -0
- package/prompts/packs/db-optimization/db-performance-analyst.yaml +63 -0
- package/prompts/packs/db-optimization/indexing-specialist.yaml +92 -0
- package/prompts/packs/db-optimization/query-optimizer.yaml +74 -0
- package/prompts/packs/devops-azure/azure-specialist.yaml +301 -0
- package/prompts/packs/devops-azure/cicd-architect.yaml +409 -0
- package/prompts/packs/devops-azure/devops-engineer.yaml +263 -0
- package/prompts/packs/fintech/compliance-officer.yaml +135 -0
- package/prompts/packs/fintech/financial-analyst.yaml +143 -0
- package/prompts/packs/fintech/risk-manager.yaml +240 -0
- package/prompts/tea/tea.yaml +100 -0
- package/prompts.json +237 -0
- 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/teams/team-fullstack.yaml +12 -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 +444 -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 +476 -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 +487 -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 +152 -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 +173 -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 +329 -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 +43 -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 +53 -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 +52 -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 +20 -0
- package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
- package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -0
- package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -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 +189 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +143 -0
- package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +126 -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/documentation-requirements.csv +12 -0
- package/src/bmm/workflows/document-project/instructions.md +130 -0
- package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
- package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
- package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
- package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -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-generate-e2e-tests/checklist.md +33 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -0
- package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -0
- package/src/core/agents/bmad-master.agent.yaml +30 -0
- 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 +208 -0
- package/src/core/tasks/help.md +86 -0
- package/src/core/tasks/index-docs.xml +65 -0
- package/src/core/tasks/review-adversarial-general.xml +49 -0
- package/src/core/tasks/shard-doc.xml +108 -0
- package/src/core/tasks/workflow.xml +235 -0
- package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
- package/src/core/workflows/advanced-elicitation/workflow.xml +118 -0
- package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
- 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 +15 -0
- 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-data.txt +5 -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 +295 -0
- 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 +27 -0
- package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
- package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
- package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -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 +31 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
- package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
- package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
- package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
- package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
- package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
- package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
- package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
- package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
- package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
- package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
- package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -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 +34 -0
- 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 +24 -0
- package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
- 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 +24 -0
- package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
- package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
- package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
- package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -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 +387 -0
- package/test/test-cli-integration.sh +159 -0
- package/test/test-file-refs-csv.js +133 -0
- package/test/test-installation-components.js +212 -0
- package/test/test-rehype-plugins.mjs +1050 -0
- package/test/unit-test-schema.js +133 -0
- package/tests/run_all_tests.py +80 -0
- package/tests/scenarios/cis/brainstorming-coach.test.py +150 -0
- package/tests/scenarios/cis/creative-problem-solver.test.py +167 -0
- package/tests/scenarios/cis/design-thinking-coach.test.py +177 -0
- package/tests/scenarios/cis/innovation-strategist.test.py +191 -0
- package/tests/scenarios/cis/presentation-master.test.py +240 -0
- package/tests/scenarios/cis/storyteller.test.py +324 -0
- package/tests/scenarios/core/mdan-master.test.py +281 -0
- package/tests/scenarios/mmb/agent-builder.test.py +124 -0
- package/tests/scenarios/mmb/module-builder.test.py +124 -0
- package/tests/scenarios/mmb/workflow-builder.test.py +124 -0
- package/tests/scenarios/mmm/analyst.test.py +138 -0
- package/tests/scenarios/mmm/architect.test.py +138 -0
- package/tests/scenarios/mmm/dev.test.py +138 -0
- package/tests/scenarios/mmm/pm.test.py +138 -0
- package/tests/scenarios/mmm/qa.test.py +138 -0
- package/tests/scenarios/mmm/quick-flow-solo-dev.test.py +138 -0
- package/tests/scenarios/mmm/sm.test.py +138 -0
- package/tests/scenarios/mmm/tech-writer.test.py +138 -0
- package/tests/scenarios/mmm/ux-designer.test.py +294 -0
- package/tests/scenarios/packs/db-optimization/db-performance-analyst.test.py +108 -0
- package/tests/scenarios/packs/db-optimization/indexing-specialist.test.py +108 -0
- package/tests/scenarios/packs/db-optimization/query-optimizer.test.py +106 -0
- package/tests/scenarios/packs/devops-azure/azure-specialist.test.py +125 -0
- package/tests/scenarios/packs/devops-azure/cicd-architect.test.py +122 -0
- package/tests/scenarios/packs/devops-azure/devops-engineer.test.py +128 -0
- package/tests/scenarios/packs/fintech/compliance-officer.test.py +165 -0
- package/tests/scenarios/packs/fintech/financial-analyst.test.py +184 -0
- package/tests/scenarios/packs/fintech/risk-manager.test.py +171 -0
- package/tests/scenarios/tea/tea.test.py +346 -0
- package/tests/simple_cis_test.py +285 -0
- package/tests/simple_db_optimization_test.py +199 -0
- package/tests/simple_devops_test.py +193 -0
- package/tests/simple_fintech_test.py +205 -0
- package/tests/simple_mmb_test.py +103 -0
- package/tests/simple_mmm_test.py +159 -0
- package/tests/simple_tea_test.py +80 -0
- package/tests/simple_test.py +111 -0
- package/tests/simple_ux_designer_test.py +144 -0
- package/tests/validate_yaml.py +86 -0
- package/tools/bmad-npx-wrapper.js +38 -0
- package/tools/build-docs.mjs +463 -0
- package/tools/cli/README.md +60 -0
- package/tools/cli/bmad-cli.js +106 -0
- package/tools/cli/commands/install.js +87 -0
- package/tools/cli/commands/status.js +65 -0
- package/tools/cli/commands/uninstall.js +167 -0
- 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 +1285 -0
- package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
- package/tools/cli/installers/lib/core/dependency-resolver.js +743 -0
- package/tools/cli/installers/lib/core/detector.js +223 -0
- package/tools/cli/installers/lib/core/ide-config-manager.js +157 -0
- package/tools/cli/installers/lib/core/installer.js +3162 -0
- package/tools/cli/installers/lib/core/manifest-generator.js +1081 -0
- package/tools/cli/installers/lib/core/manifest.js +1038 -0
- package/tools/cli/installers/lib/custom/handler.js +358 -0
- package/tools/cli/installers/lib/ide/_base-ide.js +665 -0
- package/tools/cli/installers/lib/ide/_config-driven.js +634 -0
- package/tools/cli/installers/lib/ide/codex.js +440 -0
- package/tools/cli/installers/lib/ide/github-copilot.js +699 -0
- package/tools/cli/installers/lib/ide/kilo.js +269 -0
- package/tools/cli/installers/lib/ide/manager.js +342 -0
- package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
- package/tools/cli/installers/lib/ide/platform-codes.yaml +243 -0
- package/tools/cli/installers/lib/ide/rovodev.js +257 -0
- package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +180 -0
- package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +174 -0
- package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
- package/tools/cli/installers/lib/ide/shared/path-utils.js +299 -0
- package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +366 -0
- package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +318 -0
- package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -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 +14 -0
- package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -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 +13 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +13 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +16 -0
- package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +16 -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/split/.gitkeep +0 -0
- package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
- package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -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 +1498 -0
- package/tools/cli/lib/activation-builder.js +165 -0
- 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 +109 -0
- package/tools/cli/lib/agent-party-generator.js +194 -0
- package/tools/cli/lib/cli-utils.js +182 -0
- package/tools/cli/lib/config.js +213 -0
- package/tools/cli/lib/file-ops.js +204 -0
- package/tools/cli/lib/platform-codes.js +116 -0
- package/tools/cli/lib/project-root.js +77 -0
- package/tools/cli/lib/prompts.js +809 -0
- package/tools/cli/lib/ui.js +1936 -0
- package/tools/cli/lib/xml-handler.js +177 -0
- package/tools/cli/lib/xml-to-markdown.js +82 -0
- package/tools/cli/lib/yaml-format.js +245 -0
- package/tools/cli/lib/yaml-xml-builder.js +587 -0
- 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/format-workflow-md.js +263 -0
- package/tools/lib/xml-utils.js +13 -0
- package/tools/migrate-custom-module-paths.js +124 -0
- package/tools/platform-codes.yaml +157 -0
- package/tools/schema/agent.js +491 -0
- package/tools/validate-agent-schema.js +110 -0
- package/tools/validate-doc-links.js +407 -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 +136 -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 +119 -0
- package/website/src/styles/custom.css +805 -0
- package/.mcp.json +0 -46
- package/agents/AGENTS-REGISTRY.md +0 -215
- package/agents/architect.md +0 -160
- package/agents/dev.md +0 -166
- package/agents/devops.md +0 -230
- package/agents/doc.md +0 -189
- package/agents/learn.md +0 -377
- package/agents/product.md +0 -124
- package/agents/security.md +0 -168
- package/agents/test.md +0 -209
- package/agents/ux.md +0 -207
- package/cli/mdan.js +0 -628
- package/cli/mdan.py +0 -316
- package/cli/mdan.sh +0 -724
- package/cli/postinstall.js +0 -4
- package/core/orchestrator.md +0 -238
- package/core/universal-envelope.md +0 -160
- package/install.sh +0 -91
- package/integrations/all-integrations.md +0 -300
- package/integrations/claude.md +0 -46
- package/integrations/cursor.md +0 -74
- package/integrations/mcp.md +0 -153
- package/integrations/windsurf.md +0 -48
- package/memory/MDAN-STATE.template.json +0 -44
- package/memory/MEMORY-SYSTEM.md +0 -197
- package/phases/01-discover.md +0 -136
- package/phases/02-design.md +0 -147
- package/phases/03-build.md +0 -113
- package/phases/04-verify.md +0 -107
- package/phases/05-ship.md +0 -156
- package/skills/find-skills/skill.md +0 -133
- package/templates/ARCHITECTURE.md +0 -186
- package/templates/CHANGELOG.md +0 -41
- package/templates/MDAN-KNOWLEDGE.md +0 -73
- package/templates/PRD.md +0 -120
- package/templates/SECURITY-REVIEW.md +0 -99
- package/templates/TEST-PLAN.md +0 -97
- package/templates/prompts/README.md +0 -108
- package/templates/prompts/dev-agent.yaml +0 -85
- package/templates/prompts/orchestrator.yaml +0 -97
- package/templates/prompts.json +0 -81
- package/templates/tests/evaluations/README.md +0 -80
- package/templates/tests/evaluations/classification_eval.md +0 -136
- package/templates/tests/evaluations/rag_eval.md +0 -116
- package/templates/tests/scenarios/README.md +0 -62
- package/templates/tests/scenarios/basic_authentication.test.md +0 -82
- package/templates/tests/scenarios/user_registration.test.md +0 -107
|
@@ -0,0 +1,634 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const fs = require('fs-extra');
|
|
3
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
4
|
+
const prompts = require('../../../lib/prompts');
|
|
5
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
6
|
+
const { WorkflowCommandGenerator } = require('./shared/workflow-command-generator');
|
|
7
|
+
const { TaskToolCommandGenerator } = require('./shared/task-tool-command-generator');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Config-driven IDE setup handler
|
|
11
|
+
*
|
|
12
|
+
* This class provides a standardized way to install BMAD artifacts to IDEs
|
|
13
|
+
* based on configuration in platform-codes.yaml. It eliminates the need for
|
|
14
|
+
* individual installer files for each IDE.
|
|
15
|
+
*
|
|
16
|
+
* Features:
|
|
17
|
+
* - Config-driven from platform-codes.yaml
|
|
18
|
+
* - Template-based content generation
|
|
19
|
+
* - Multi-target installation support (e.g., GitHub Copilot)
|
|
20
|
+
* - Artifact type filtering (agents, workflows, tasks, tools)
|
|
21
|
+
*/
|
|
22
|
+
class ConfigDrivenIdeSetup extends BaseIdeSetup {
|
|
23
|
+
constructor(platformCode, platformConfig) {
|
|
24
|
+
super(platformCode, platformConfig.name, platformConfig.preferred);
|
|
25
|
+
this.platformConfig = platformConfig;
|
|
26
|
+
this.installerConfig = platformConfig.installer || null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Main setup method - called by IdeManager
|
|
31
|
+
* @param {string} projectDir - Project directory
|
|
32
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
33
|
+
* @param {Object} options - Setup options
|
|
34
|
+
* @returns {Promise<Object>} Setup result
|
|
35
|
+
*/
|
|
36
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
37
|
+
// Check for BMAD files in ancestor directories that would cause duplicates
|
|
38
|
+
if (this.installerConfig?.ancestor_conflict_check) {
|
|
39
|
+
const conflict = await this.findAncestorConflict(projectDir);
|
|
40
|
+
if (conflict) {
|
|
41
|
+
await prompts.log.error(
|
|
42
|
+
`Found existing BMAD commands in ancestor installation: ${conflict}\n` +
|
|
43
|
+
` ${this.name} inherits commands from parent directories, so this would cause duplicates.\n` +
|
|
44
|
+
` Please remove the BMAD files from that directory first:\n` +
|
|
45
|
+
` rm -rf "${conflict}"/bmad*`,
|
|
46
|
+
);
|
|
47
|
+
return {
|
|
48
|
+
success: false,
|
|
49
|
+
reason: 'ancestor-conflict',
|
|
50
|
+
error: `Ancestor conflict: ${conflict}`,
|
|
51
|
+
conflictDir: conflict,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (!options.silent) await prompts.log.info(`Setting up ${this.name}...`);
|
|
57
|
+
|
|
58
|
+
// Clean up any old BMAD installation first
|
|
59
|
+
await this.cleanup(projectDir, options);
|
|
60
|
+
|
|
61
|
+
if (!this.installerConfig) {
|
|
62
|
+
return { success: false, reason: 'no-config' };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Handle multi-target installations (e.g., GitHub Copilot)
|
|
66
|
+
if (this.installerConfig.targets) {
|
|
67
|
+
return this.installToMultipleTargets(projectDir, bmadDir, this.installerConfig.targets, options);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Handle single-target installations
|
|
71
|
+
if (this.installerConfig.target_dir) {
|
|
72
|
+
return this.installToTarget(projectDir, bmadDir, this.installerConfig, options);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return { success: false, reason: 'invalid-config' };
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Install to a single target directory
|
|
80
|
+
* @param {string} projectDir - Project directory
|
|
81
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
82
|
+
* @param {Object} config - Installation configuration
|
|
83
|
+
* @param {Object} options - Setup options
|
|
84
|
+
* @returns {Promise<Object>} Installation result
|
|
85
|
+
*/
|
|
86
|
+
async installToTarget(projectDir, bmadDir, config, options) {
|
|
87
|
+
const { target_dir, template_type, artifact_types } = config;
|
|
88
|
+
|
|
89
|
+
// Skip targets with explicitly empty artifact_types array
|
|
90
|
+
// This prevents creating empty directories when no artifacts will be written
|
|
91
|
+
if (Array.isArray(artifact_types) && artifact_types.length === 0) {
|
|
92
|
+
return { success: true, results: { agents: 0, workflows: 0, tasks: 0, tools: 0 } };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const targetPath = path.join(projectDir, target_dir);
|
|
96
|
+
await this.ensureDir(targetPath);
|
|
97
|
+
|
|
98
|
+
const selectedModules = options.selectedModules || [];
|
|
99
|
+
const results = { agents: 0, workflows: 0, tasks: 0, tools: 0 };
|
|
100
|
+
|
|
101
|
+
// Install agents
|
|
102
|
+
if (!artifact_types || artifact_types.includes('agents')) {
|
|
103
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
104
|
+
const { artifacts } = await agentGen.collectAgentArtifacts(bmadDir, selectedModules);
|
|
105
|
+
results.agents = await this.writeAgentArtifacts(targetPath, artifacts, template_type, config);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Install workflows
|
|
109
|
+
if (!artifact_types || artifact_types.includes('workflows')) {
|
|
110
|
+
const workflowGen = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
111
|
+
const { artifacts } = await workflowGen.collectWorkflowArtifacts(bmadDir);
|
|
112
|
+
results.workflows = await this.writeWorkflowArtifacts(targetPath, artifacts, template_type, config);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Install tasks and tools using template system (supports TOML for Gemini, MD for others)
|
|
116
|
+
if (!artifact_types || artifact_types.includes('tasks') || artifact_types.includes('tools')) {
|
|
117
|
+
const taskToolGen = new TaskToolCommandGenerator(this.bmadFolderName);
|
|
118
|
+
const { artifacts } = await taskToolGen.collectTaskToolArtifacts(bmadDir);
|
|
119
|
+
const taskToolResult = await this.writeTaskToolArtifacts(targetPath, artifacts, template_type, config);
|
|
120
|
+
results.tasks = taskToolResult.tasks || 0;
|
|
121
|
+
results.tools = taskToolResult.tools || 0;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
await this.printSummary(results, target_dir, options);
|
|
125
|
+
return { success: true, results };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Install to multiple target directories
|
|
130
|
+
* @param {string} projectDir - Project directory
|
|
131
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
132
|
+
* @param {Array} targets - Array of target configurations
|
|
133
|
+
* @param {Object} options - Setup options
|
|
134
|
+
* @returns {Promise<Object>} Installation result
|
|
135
|
+
*/
|
|
136
|
+
async installToMultipleTargets(projectDir, bmadDir, targets, options) {
|
|
137
|
+
const allResults = { agents: 0, workflows: 0, tasks: 0, tools: 0 };
|
|
138
|
+
|
|
139
|
+
for (const target of targets) {
|
|
140
|
+
const result = await this.installToTarget(projectDir, bmadDir, target, options);
|
|
141
|
+
if (result.success) {
|
|
142
|
+
allResults.agents += result.results.agents || 0;
|
|
143
|
+
allResults.workflows += result.results.workflows || 0;
|
|
144
|
+
allResults.tasks += result.results.tasks || 0;
|
|
145
|
+
allResults.tools += result.results.tools || 0;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return { success: true, results: allResults };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Write agent artifacts to target directory
|
|
154
|
+
* @param {string} targetPath - Target directory path
|
|
155
|
+
* @param {Array} artifacts - Agent artifacts
|
|
156
|
+
* @param {string} templateType - Template type to use
|
|
157
|
+
* @param {Object} config - Installation configuration
|
|
158
|
+
* @returns {Promise<number>} Count of artifacts written
|
|
159
|
+
*/
|
|
160
|
+
async writeAgentArtifacts(targetPath, artifacts, templateType, config = {}) {
|
|
161
|
+
// Try to load platform-specific template, fall back to default-agent
|
|
162
|
+
const { content: template, extension } = await this.loadTemplate(templateType, 'agent', config, 'default-agent');
|
|
163
|
+
let count = 0;
|
|
164
|
+
|
|
165
|
+
for (const artifact of artifacts) {
|
|
166
|
+
const content = this.renderTemplate(template, artifact);
|
|
167
|
+
const filename = this.generateFilename(artifact, 'agent', extension);
|
|
168
|
+
const filePath = path.join(targetPath, filename);
|
|
169
|
+
await this.writeFile(filePath, content);
|
|
170
|
+
count++;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return count;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Write workflow artifacts to target directory
|
|
178
|
+
* @param {string} targetPath - Target directory path
|
|
179
|
+
* @param {Array} artifacts - Workflow artifacts
|
|
180
|
+
* @param {string} templateType - Template type to use
|
|
181
|
+
* @param {Object} config - Installation configuration
|
|
182
|
+
* @returns {Promise<number>} Count of artifacts written
|
|
183
|
+
*/
|
|
184
|
+
async writeWorkflowArtifacts(targetPath, artifacts, templateType, config = {}) {
|
|
185
|
+
let count = 0;
|
|
186
|
+
|
|
187
|
+
for (const artifact of artifacts) {
|
|
188
|
+
if (artifact.type === 'workflow-command') {
|
|
189
|
+
// Use different template based on workflow type (YAML vs MD)
|
|
190
|
+
// Default to 'default' template type, but allow override via config
|
|
191
|
+
const workflowTemplateType = artifact.isYamlWorkflow
|
|
192
|
+
? config.yaml_workflow_template || `${templateType}-workflow-yaml`
|
|
193
|
+
: config.md_workflow_template || `${templateType}-workflow`;
|
|
194
|
+
|
|
195
|
+
// Fall back to default templates if specific ones don't exist
|
|
196
|
+
const finalTemplateType = artifact.isYamlWorkflow ? 'default-workflow-yaml' : 'default-workflow';
|
|
197
|
+
// workflowTemplateType already contains full name (e.g., 'gemini-workflow-yaml'), so pass empty artifactType
|
|
198
|
+
const { content: template, extension } = await this.loadTemplate(workflowTemplateType, '', config, finalTemplateType);
|
|
199
|
+
const content = this.renderTemplate(template, artifact);
|
|
200
|
+
const filename = this.generateFilename(artifact, 'workflow', extension);
|
|
201
|
+
const filePath = path.join(targetPath, filename);
|
|
202
|
+
await this.writeFile(filePath, content);
|
|
203
|
+
count++;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
return count;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Write task/tool artifacts to target directory using templates
|
|
212
|
+
* @param {string} targetPath - Target directory path
|
|
213
|
+
* @param {Array} artifacts - Task/tool artifacts
|
|
214
|
+
* @param {string} templateType - Template type to use
|
|
215
|
+
* @param {Object} config - Installation configuration
|
|
216
|
+
* @returns {Promise<Object>} Counts of tasks and tools written
|
|
217
|
+
*/
|
|
218
|
+
async writeTaskToolArtifacts(targetPath, artifacts, templateType, config = {}) {
|
|
219
|
+
let taskCount = 0;
|
|
220
|
+
let toolCount = 0;
|
|
221
|
+
|
|
222
|
+
// Pre-load templates to avoid repeated file I/O in the loop
|
|
223
|
+
const taskTemplate = await this.loadTemplate(templateType, 'task', config, 'default-task');
|
|
224
|
+
const toolTemplate = await this.loadTemplate(templateType, 'tool', config, 'default-tool');
|
|
225
|
+
|
|
226
|
+
const { artifact_types } = config;
|
|
227
|
+
|
|
228
|
+
for (const artifact of artifacts) {
|
|
229
|
+
if (artifact.type !== 'task' && artifact.type !== 'tool') {
|
|
230
|
+
continue;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Skip if the specific artifact type is not requested in config
|
|
234
|
+
if (artifact_types) {
|
|
235
|
+
if (artifact.type === 'task' && !artifact_types.includes('tasks')) continue;
|
|
236
|
+
if (artifact.type === 'tool' && !artifact_types.includes('tools')) continue;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
// Use pre-loaded template based on artifact type
|
|
240
|
+
const { content: template, extension } = artifact.type === 'task' ? taskTemplate : toolTemplate;
|
|
241
|
+
|
|
242
|
+
const content = this.renderTemplate(template, artifact);
|
|
243
|
+
const filename = this.generateFilename(artifact, artifact.type, extension);
|
|
244
|
+
const filePath = path.join(targetPath, filename);
|
|
245
|
+
await this.writeFile(filePath, content);
|
|
246
|
+
|
|
247
|
+
if (artifact.type === 'task') {
|
|
248
|
+
taskCount++;
|
|
249
|
+
} else {
|
|
250
|
+
toolCount++;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
return { tasks: taskCount, tools: toolCount };
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* Load template based on type and configuration
|
|
259
|
+
* @param {string} templateType - Template type (claude, windsurf, etc.)
|
|
260
|
+
* @param {string} artifactType - Artifact type (agent, workflow, task, tool)
|
|
261
|
+
* @param {Object} config - Installation configuration
|
|
262
|
+
* @param {string} fallbackTemplateType - Fallback template type if requested template not found
|
|
263
|
+
* @returns {Promise<{content: string, extension: string}>} Template content and extension
|
|
264
|
+
*/
|
|
265
|
+
async loadTemplate(templateType, artifactType, config = {}, fallbackTemplateType = null) {
|
|
266
|
+
const { header_template, body_template } = config;
|
|
267
|
+
|
|
268
|
+
// Check for separate header/body templates
|
|
269
|
+
if (header_template || body_template) {
|
|
270
|
+
const content = await this.loadSplitTemplates(templateType, artifactType, header_template, body_template);
|
|
271
|
+
// Allow config to override extension, default to .md
|
|
272
|
+
const ext = config.extension || '.md';
|
|
273
|
+
const normalizedExt = ext.startsWith('.') ? ext : `.${ext}`;
|
|
274
|
+
return { content, extension: normalizedExt };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Load combined template - try multiple extensions
|
|
278
|
+
// If artifactType is empty, templateType already contains full name (e.g., 'gemini-workflow-yaml')
|
|
279
|
+
const templateBaseName = artifactType ? `${templateType}-${artifactType}` : templateType;
|
|
280
|
+
const templateDir = path.join(__dirname, 'templates', 'combined');
|
|
281
|
+
const extensions = ['.md', '.toml', '.yaml', '.yml'];
|
|
282
|
+
|
|
283
|
+
for (const ext of extensions) {
|
|
284
|
+
const templatePath = path.join(templateDir, templateBaseName + ext);
|
|
285
|
+
if (await fs.pathExists(templatePath)) {
|
|
286
|
+
const content = await fs.readFile(templatePath, 'utf8');
|
|
287
|
+
return { content, extension: ext };
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Fall back to default template (if provided)
|
|
292
|
+
if (fallbackTemplateType) {
|
|
293
|
+
for (const ext of extensions) {
|
|
294
|
+
const fallbackPath = path.join(templateDir, `${fallbackTemplateType}${ext}`);
|
|
295
|
+
if (await fs.pathExists(fallbackPath)) {
|
|
296
|
+
const content = await fs.readFile(fallbackPath, 'utf8');
|
|
297
|
+
return { content, extension: ext };
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Ultimate fallback - minimal template
|
|
303
|
+
return { content: this.getDefaultTemplate(artifactType), extension: '.md' };
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Load split templates (header + body)
|
|
308
|
+
* @param {string} templateType - Template type
|
|
309
|
+
* @param {string} artifactType - Artifact type
|
|
310
|
+
* @param {string} headerTpl - Header template name
|
|
311
|
+
* @param {string} bodyTpl - Body template name
|
|
312
|
+
* @returns {Promise<string>} Combined template content
|
|
313
|
+
*/
|
|
314
|
+
async loadSplitTemplates(templateType, artifactType, headerTpl, bodyTpl) {
|
|
315
|
+
let header = '';
|
|
316
|
+
let body = '';
|
|
317
|
+
|
|
318
|
+
// Load header template
|
|
319
|
+
if (headerTpl) {
|
|
320
|
+
const headerPath = path.join(__dirname, 'templates', 'split', headerTpl);
|
|
321
|
+
if (await fs.pathExists(headerPath)) {
|
|
322
|
+
header = await fs.readFile(headerPath, 'utf8');
|
|
323
|
+
}
|
|
324
|
+
} else {
|
|
325
|
+
// Use default header for template type
|
|
326
|
+
const defaultHeaderPath = path.join(__dirname, 'templates', 'split', templateType, 'header.md');
|
|
327
|
+
if (await fs.pathExists(defaultHeaderPath)) {
|
|
328
|
+
header = await fs.readFile(defaultHeaderPath, 'utf8');
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// Load body template
|
|
333
|
+
if (bodyTpl) {
|
|
334
|
+
const bodyPath = path.join(__dirname, 'templates', 'split', bodyTpl);
|
|
335
|
+
if (await fs.pathExists(bodyPath)) {
|
|
336
|
+
body = await fs.readFile(bodyPath, 'utf8');
|
|
337
|
+
}
|
|
338
|
+
} else {
|
|
339
|
+
// Use default body for template type
|
|
340
|
+
const defaultBodyPath = path.join(__dirname, 'templates', 'split', templateType, 'body.md');
|
|
341
|
+
if (await fs.pathExists(defaultBodyPath)) {
|
|
342
|
+
body = await fs.readFile(defaultBodyPath, 'utf8');
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Combine header and body
|
|
347
|
+
return `${header}\n${body}`;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Get default minimal template
|
|
352
|
+
* @param {string} artifactType - Artifact type
|
|
353
|
+
* @returns {string} Default template
|
|
354
|
+
*/
|
|
355
|
+
getDefaultTemplate(artifactType) {
|
|
356
|
+
if (artifactType === 'agent') {
|
|
357
|
+
return `---
|
|
358
|
+
name: '{{name}}'
|
|
359
|
+
description: '{{description}}'
|
|
360
|
+
disable-model-invocation: true
|
|
361
|
+
---
|
|
362
|
+
|
|
363
|
+
You must fully embody this agent's persona and follow all activation instructions exactly as specified.
|
|
364
|
+
|
|
365
|
+
<agent-activation CRITICAL="TRUE">
|
|
366
|
+
1. LOAD the FULL agent file from {project-root}/{{bmadFolderName}}/{{path}}
|
|
367
|
+
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
368
|
+
3. FOLLOW every step in the <activation> section precisely
|
|
369
|
+
</agent-activation>
|
|
370
|
+
`;
|
|
371
|
+
}
|
|
372
|
+
return `---
|
|
373
|
+
name: '{{name}}'
|
|
374
|
+
description: '{{description}}'
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
# {{name}}
|
|
378
|
+
|
|
379
|
+
LOAD and execute from: {project-root}/{{bmadFolderName}}/{{path}}
|
|
380
|
+
`;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Render template with artifact data
|
|
385
|
+
* @param {string} template - Template content
|
|
386
|
+
* @param {Object} artifact - Artifact data
|
|
387
|
+
* @returns {string} Rendered content
|
|
388
|
+
*/
|
|
389
|
+
renderTemplate(template, artifact) {
|
|
390
|
+
// Use the appropriate path property based on artifact type
|
|
391
|
+
let pathToUse = artifact.relativePath || '';
|
|
392
|
+
switch (artifact.type) {
|
|
393
|
+
case 'agent-launcher': {
|
|
394
|
+
pathToUse = artifact.agentPath || artifact.relativePath || '';
|
|
395
|
+
|
|
396
|
+
break;
|
|
397
|
+
}
|
|
398
|
+
case 'workflow-command': {
|
|
399
|
+
pathToUse = artifact.workflowPath || artifact.relativePath || '';
|
|
400
|
+
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
case 'task':
|
|
404
|
+
case 'tool': {
|
|
405
|
+
pathToUse = artifact.path || artifact.relativePath || '';
|
|
406
|
+
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
// No default
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
let rendered = template
|
|
413
|
+
.replaceAll('{{name}}', artifact.name || '')
|
|
414
|
+
.replaceAll('{{module}}', artifact.module || 'core')
|
|
415
|
+
.replaceAll('{{path}}', pathToUse)
|
|
416
|
+
.replaceAll('{{description}}', artifact.description || `${artifact.name} ${artifact.type || ''}`)
|
|
417
|
+
.replaceAll('{{workflow_path}}', pathToUse);
|
|
418
|
+
|
|
419
|
+
// Replace _bmad placeholder with actual folder name
|
|
420
|
+
rendered = rendered.replaceAll('_bmad', this.bmadFolderName);
|
|
421
|
+
|
|
422
|
+
// Replace {{bmadFolderName}} placeholder if present
|
|
423
|
+
rendered = rendered.replaceAll('{{bmadFolderName}}', this.bmadFolderName);
|
|
424
|
+
|
|
425
|
+
return rendered;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Generate filename for artifact
|
|
430
|
+
* @param {Object} artifact - Artifact data
|
|
431
|
+
* @param {string} artifactType - Artifact type (agent, workflow, task, tool)
|
|
432
|
+
* @param {string} extension - File extension to use (e.g., '.md', '.toml')
|
|
433
|
+
* @returns {string} Generated filename
|
|
434
|
+
*/
|
|
435
|
+
generateFilename(artifact, artifactType, extension = '.md') {
|
|
436
|
+
const { toDashPath } = require('./shared/path-utils');
|
|
437
|
+
|
|
438
|
+
// Reuse central logic to ensure consistent naming conventions
|
|
439
|
+
const standardName = toDashPath(artifact.relativePath);
|
|
440
|
+
|
|
441
|
+
// Clean up potential double extensions from source files (e.g. .yaml.md, .xml.md -> .md)
|
|
442
|
+
// This handles any extensions that might slip through toDashPath()
|
|
443
|
+
const baseName = standardName.replace(/\.(md|yaml|yml|json|xml|toml)\.md$/i, '.md');
|
|
444
|
+
|
|
445
|
+
// If using default markdown, preserve the bmad-agent- prefix for agents
|
|
446
|
+
if (extension === '.md') {
|
|
447
|
+
return baseName;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
// For other extensions (e.g., .toml), replace .md extension
|
|
451
|
+
// Note: agent prefix is preserved even with non-markdown extensions
|
|
452
|
+
return baseName.replace(/\.md$/, extension);
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Print installation summary
|
|
457
|
+
* @param {Object} results - Installation results
|
|
458
|
+
* @param {string} targetDir - Target directory (relative)
|
|
459
|
+
*/
|
|
460
|
+
async printSummary(results, targetDir, options = {}) {
|
|
461
|
+
if (options.silent) return;
|
|
462
|
+
const parts = [];
|
|
463
|
+
if (results.agents > 0) parts.push(`${results.agents} agents`);
|
|
464
|
+
if (results.workflows > 0) parts.push(`${results.workflows} workflows`);
|
|
465
|
+
if (results.tasks > 0) parts.push(`${results.tasks} tasks`);
|
|
466
|
+
if (results.tools > 0) parts.push(`${results.tools} tools`);
|
|
467
|
+
await prompts.log.success(`${this.name} configured: ${parts.join(', ')} → ${targetDir}`);
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
/**
|
|
471
|
+
* Cleanup IDE configuration
|
|
472
|
+
* @param {string} projectDir - Project directory
|
|
473
|
+
*/
|
|
474
|
+
async cleanup(projectDir, options = {}) {
|
|
475
|
+
// Migrate legacy target directories (e.g. .opencode/agent → .opencode/agents)
|
|
476
|
+
if (this.installerConfig?.legacy_targets) {
|
|
477
|
+
if (!options.silent) await prompts.log.message(' Migrating legacy directories...');
|
|
478
|
+
for (const legacyDir of this.installerConfig.legacy_targets) {
|
|
479
|
+
await this.cleanupTarget(projectDir, legacyDir, options);
|
|
480
|
+
await this.removeEmptyParents(projectDir, legacyDir);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
// Clean all target directories
|
|
485
|
+
if (this.installerConfig?.targets) {
|
|
486
|
+
const parentDirs = new Set();
|
|
487
|
+
for (const target of this.installerConfig.targets) {
|
|
488
|
+
await this.cleanupTarget(projectDir, target.target_dir, options);
|
|
489
|
+
// Track parent directories for empty-dir cleanup
|
|
490
|
+
const parentDir = path.dirname(target.target_dir);
|
|
491
|
+
if (parentDir && parentDir !== '.') {
|
|
492
|
+
parentDirs.add(parentDir);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// After all targets cleaned, remove empty parent directories (recursive up to projectDir)
|
|
496
|
+
for (const parentDir of parentDirs) {
|
|
497
|
+
await this.removeEmptyParents(projectDir, parentDir);
|
|
498
|
+
}
|
|
499
|
+
} else if (this.installerConfig?.target_dir) {
|
|
500
|
+
await this.cleanupTarget(projectDir, this.installerConfig.target_dir, options);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Cleanup a specific target directory
|
|
506
|
+
* @param {string} projectDir - Project directory
|
|
507
|
+
* @param {string} targetDir - Target directory to clean
|
|
508
|
+
*/
|
|
509
|
+
async cleanupTarget(projectDir, targetDir, options = {}) {
|
|
510
|
+
const targetPath = path.join(projectDir, targetDir);
|
|
511
|
+
|
|
512
|
+
if (!(await fs.pathExists(targetPath))) {
|
|
513
|
+
return;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// Remove all bmad* files
|
|
517
|
+
let entries;
|
|
518
|
+
try {
|
|
519
|
+
entries = await fs.readdir(targetPath);
|
|
520
|
+
} catch {
|
|
521
|
+
// Directory exists but can't be read - skip cleanup
|
|
522
|
+
return;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
if (!entries || !Array.isArray(entries)) {
|
|
526
|
+
return;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
let removedCount = 0;
|
|
530
|
+
|
|
531
|
+
for (const entry of entries) {
|
|
532
|
+
if (!entry || typeof entry !== 'string') {
|
|
533
|
+
continue;
|
|
534
|
+
}
|
|
535
|
+
if (entry.startsWith('bmad')) {
|
|
536
|
+
const entryPath = path.join(targetPath, entry);
|
|
537
|
+
try {
|
|
538
|
+
await fs.remove(entryPath);
|
|
539
|
+
removedCount++;
|
|
540
|
+
} catch {
|
|
541
|
+
// Skip entries that can't be removed (broken symlinks, permission errors)
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
if (removedCount > 0 && !options.silent) {
|
|
547
|
+
await prompts.log.message(` Cleaned ${removedCount} BMAD files from ${targetDir}`);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
// Remove empty directory after cleanup
|
|
551
|
+
if (removedCount > 0) {
|
|
552
|
+
try {
|
|
553
|
+
const remaining = await fs.readdir(targetPath);
|
|
554
|
+
if (remaining.length === 0) {
|
|
555
|
+
await fs.remove(targetPath);
|
|
556
|
+
}
|
|
557
|
+
} catch {
|
|
558
|
+
// Directory may already be gone or in use — skip
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Check ancestor directories for existing BMAD files in the same target_dir.
|
|
564
|
+
* IDEs like Claude Code inherit commands from parent directories, so an existing
|
|
565
|
+
* installation in an ancestor would cause duplicate commands.
|
|
566
|
+
* @param {string} projectDir - Project directory being installed to
|
|
567
|
+
* @returns {Promise<string|null>} Path to conflicting directory, or null if clean
|
|
568
|
+
*/
|
|
569
|
+
async findAncestorConflict(projectDir) {
|
|
570
|
+
const targetDir = this.installerConfig?.target_dir;
|
|
571
|
+
if (!targetDir) return null;
|
|
572
|
+
|
|
573
|
+
const resolvedProject = await fs.realpath(path.resolve(projectDir));
|
|
574
|
+
let current = path.dirname(resolvedProject);
|
|
575
|
+
const root = path.parse(current).root;
|
|
576
|
+
|
|
577
|
+
while (current !== root && current.length > root.length) {
|
|
578
|
+
const candidatePath = path.join(current, targetDir);
|
|
579
|
+
try {
|
|
580
|
+
if (await fs.pathExists(candidatePath)) {
|
|
581
|
+
const entries = await fs.readdir(candidatePath);
|
|
582
|
+
const hasBmad = entries.some((e) => typeof e === 'string' && e.toLowerCase().startsWith('bmad'));
|
|
583
|
+
if (hasBmad) {
|
|
584
|
+
return candidatePath;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
} catch {
|
|
588
|
+
// Can't read directory — skip
|
|
589
|
+
}
|
|
590
|
+
current = path.dirname(current);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
return null;
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
/**
|
|
597
|
+
* Walk up ancestor directories from relativeDir toward projectDir, removing each if empty
|
|
598
|
+
* Stops at projectDir boundary — never removes projectDir itself
|
|
599
|
+
* @param {string} projectDir - Project root (boundary)
|
|
600
|
+
* @param {string} relativeDir - Relative directory to start from
|
|
601
|
+
*/
|
|
602
|
+
async removeEmptyParents(projectDir, relativeDir) {
|
|
603
|
+
const resolvedProject = path.resolve(projectDir);
|
|
604
|
+
let current = relativeDir;
|
|
605
|
+
let last = null;
|
|
606
|
+
while (current && current !== '.' && current !== last) {
|
|
607
|
+
last = current;
|
|
608
|
+
const fullPath = path.resolve(projectDir, current);
|
|
609
|
+
// Boundary guard: never traverse outside projectDir
|
|
610
|
+
if (!fullPath.startsWith(resolvedProject + path.sep) && fullPath !== resolvedProject) break;
|
|
611
|
+
try {
|
|
612
|
+
if (!(await fs.pathExists(fullPath))) {
|
|
613
|
+
// Dir already gone — advance current; last is reset at top of next iteration
|
|
614
|
+
current = path.dirname(current);
|
|
615
|
+
continue;
|
|
616
|
+
}
|
|
617
|
+
const remaining = await fs.readdir(fullPath);
|
|
618
|
+
if (remaining.length > 0) break;
|
|
619
|
+
await fs.rmdir(fullPath);
|
|
620
|
+
} catch (error) {
|
|
621
|
+
// ENOTEMPTY: TOCTOU race (file added between readdir and rmdir) — skip level, continue upward
|
|
622
|
+
// ENOENT: dir removed by another process between pathExists and rmdir — skip level, continue upward
|
|
623
|
+
if (error.code === 'ENOTEMPTY' || error.code === 'ENOENT') {
|
|
624
|
+
current = path.dirname(current);
|
|
625
|
+
continue;
|
|
626
|
+
}
|
|
627
|
+
break; // fatal error (e.g. EACCES) — stop upward walk
|
|
628
|
+
}
|
|
629
|
+
current = path.dirname(current);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
module.exports = { ConfigDrivenIdeSetup };
|