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,269 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
3
|
+
const yaml = require('yaml');
|
|
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
|
+
* KiloCode IDE setup handler
|
|
11
|
+
* Creates custom modes in .kilocodemodes file (similar to Roo)
|
|
12
|
+
*/
|
|
13
|
+
class KiloSetup extends BaseIdeSetup {
|
|
14
|
+
constructor() {
|
|
15
|
+
super('kilo', 'Kilo Code');
|
|
16
|
+
this.configFile = '.kilocodemodes';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Setup KiloCode IDE configuration
|
|
21
|
+
* @param {string} projectDir - Project directory
|
|
22
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
23
|
+
* @param {Object} options - Setup options
|
|
24
|
+
*/
|
|
25
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
26
|
+
if (!options.silent) await prompts.log.info(`Setting up ${this.name}...`);
|
|
27
|
+
|
|
28
|
+
// Clean up any old BMAD installation first
|
|
29
|
+
await this.cleanup(projectDir, options);
|
|
30
|
+
|
|
31
|
+
// Load existing config (may contain non-BMAD modes and other settings)
|
|
32
|
+
const kiloModesPath = path.join(projectDir, this.configFile);
|
|
33
|
+
let config = {};
|
|
34
|
+
|
|
35
|
+
if (await this.pathExists(kiloModesPath)) {
|
|
36
|
+
const existingContent = await this.readFile(kiloModesPath);
|
|
37
|
+
try {
|
|
38
|
+
config = yaml.parse(existingContent) || {};
|
|
39
|
+
} catch {
|
|
40
|
+
// If parsing fails, start fresh but warn user
|
|
41
|
+
await prompts.log.warn('Warning: Could not parse existing .kilocodemodes, starting fresh');
|
|
42
|
+
config = {};
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Ensure customModes array exists
|
|
47
|
+
if (!Array.isArray(config.customModes)) {
|
|
48
|
+
config.customModes = [];
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Generate agent launchers
|
|
52
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
53
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
54
|
+
|
|
55
|
+
// Create mode objects and add to config
|
|
56
|
+
let addedCount = 0;
|
|
57
|
+
|
|
58
|
+
for (const artifact of agentArtifacts) {
|
|
59
|
+
const modeObject = await this.createModeObject(artifact, projectDir);
|
|
60
|
+
config.customModes.push(modeObject);
|
|
61
|
+
addedCount++;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Write .kilocodemodes file with proper YAML structure
|
|
65
|
+
const finalContent = yaml.stringify(config, { lineWidth: 0 });
|
|
66
|
+
await this.writeFile(kiloModesPath, finalContent);
|
|
67
|
+
|
|
68
|
+
// Generate workflow commands
|
|
69
|
+
const workflowGenerator = new WorkflowCommandGenerator(this.bmadFolderName);
|
|
70
|
+
const { artifacts: workflowArtifacts } = await workflowGenerator.collectWorkflowArtifacts(bmadDir);
|
|
71
|
+
|
|
72
|
+
// Write to .kilocode/workflows/ directory
|
|
73
|
+
const workflowsDir = path.join(projectDir, '.kilocode', 'workflows');
|
|
74
|
+
await this.ensureDir(workflowsDir);
|
|
75
|
+
|
|
76
|
+
// Clear old BMAD workflows before writing new ones
|
|
77
|
+
await this.clearBmadWorkflows(workflowsDir);
|
|
78
|
+
|
|
79
|
+
// Write workflow files
|
|
80
|
+
const workflowCount = await workflowGenerator.writeDashArtifacts(workflowsDir, workflowArtifacts);
|
|
81
|
+
|
|
82
|
+
// Generate task and tool commands
|
|
83
|
+
const taskToolGen = new TaskToolCommandGenerator(this.bmadFolderName);
|
|
84
|
+
const { artifacts: taskToolArtifacts, counts: taskToolCounts } = await taskToolGen.collectTaskToolArtifacts(bmadDir);
|
|
85
|
+
|
|
86
|
+
// Write task/tool files to workflows directory (same location as workflows)
|
|
87
|
+
await taskToolGen.writeDashArtifacts(workflowsDir, taskToolArtifacts);
|
|
88
|
+
const taskCount = taskToolCounts.tasks || 0;
|
|
89
|
+
const toolCount = taskToolCounts.tools || 0;
|
|
90
|
+
|
|
91
|
+
if (!options.silent) {
|
|
92
|
+
await prompts.log.success(
|
|
93
|
+
`${this.name} configured: ${addedCount} modes, ${workflowCount} workflows, ${taskCount} tasks, ${toolCount} tools → ${this.configFile}`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
success: true,
|
|
99
|
+
modes: addedCount,
|
|
100
|
+
workflows: workflowCount,
|
|
101
|
+
tasks: taskCount,
|
|
102
|
+
tools: toolCount,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Create a mode object for an agent
|
|
108
|
+
* @param {Object} artifact - Agent artifact
|
|
109
|
+
* @param {string} projectDir - Project directory
|
|
110
|
+
* @returns {Object} Mode object for YAML serialization
|
|
111
|
+
*/
|
|
112
|
+
async createModeObject(artifact, projectDir) {
|
|
113
|
+
// Extract metadata from launcher content
|
|
114
|
+
const titleMatch = artifact.content.match(/title="([^"]+)"/);
|
|
115
|
+
const title = titleMatch ? titleMatch[1] : this.formatTitle(artifact.name);
|
|
116
|
+
|
|
117
|
+
const iconMatch = artifact.content.match(/icon="([^"]+)"/);
|
|
118
|
+
const icon = iconMatch ? iconMatch[1] : '🤖';
|
|
119
|
+
|
|
120
|
+
const whenToUseMatch = artifact.content.match(/whenToUse="([^"]+)"/);
|
|
121
|
+
const whenToUse = whenToUseMatch ? whenToUseMatch[1] : `Use for ${title} tasks`;
|
|
122
|
+
|
|
123
|
+
// Get the activation header from central template (trim to avoid YAML formatting issues)
|
|
124
|
+
const activationHeader = (await this.getAgentCommandHeader()).trim();
|
|
125
|
+
|
|
126
|
+
const roleDefinitionMatch = artifact.content.match(/roleDefinition="([^"]+)"/);
|
|
127
|
+
const roleDefinition = roleDefinitionMatch
|
|
128
|
+
? roleDefinitionMatch[1]
|
|
129
|
+
: `You are a ${title} specializing in ${title.toLowerCase()} tasks.`;
|
|
130
|
+
|
|
131
|
+
// Get relative path
|
|
132
|
+
const relativePath = path.relative(projectDir, artifact.sourcePath).replaceAll('\\', '/');
|
|
133
|
+
|
|
134
|
+
// Build mode object (KiloCode uses same schema as Roo)
|
|
135
|
+
return {
|
|
136
|
+
slug: `bmad-${artifact.module}-${artifact.name}`,
|
|
137
|
+
name: `${icon} ${title}`,
|
|
138
|
+
roleDefinition: roleDefinition,
|
|
139
|
+
whenToUse: whenToUse,
|
|
140
|
+
customInstructions: `${activationHeader} Read the full YAML from ${relativePath} start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`,
|
|
141
|
+
groups: ['read', 'edit', 'browser', 'command', 'mcp'],
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Format name as title
|
|
147
|
+
*/
|
|
148
|
+
formatTitle(name) {
|
|
149
|
+
return name
|
|
150
|
+
.split('-')
|
|
151
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
152
|
+
.join(' ');
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Clear old BMAD workflow files from workflows directory
|
|
157
|
+
* @param {string} workflowsDir - Workflows directory path
|
|
158
|
+
*/
|
|
159
|
+
async clearBmadWorkflows(workflowsDir) {
|
|
160
|
+
const fs = require('fs-extra');
|
|
161
|
+
if (!(await fs.pathExists(workflowsDir))) return;
|
|
162
|
+
|
|
163
|
+
const entries = await fs.readdir(workflowsDir);
|
|
164
|
+
for (const entry of entries) {
|
|
165
|
+
if (entry.startsWith('bmad-') && entry.endsWith('.md')) {
|
|
166
|
+
await fs.remove(path.join(workflowsDir, entry));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Cleanup KiloCode configuration
|
|
173
|
+
*/
|
|
174
|
+
async cleanup(projectDir, options = {}) {
|
|
175
|
+
const fs = require('fs-extra');
|
|
176
|
+
const kiloModesPath = path.join(projectDir, this.configFile);
|
|
177
|
+
|
|
178
|
+
if (await fs.pathExists(kiloModesPath)) {
|
|
179
|
+
const content = await fs.readFile(kiloModesPath, 'utf8');
|
|
180
|
+
|
|
181
|
+
try {
|
|
182
|
+
const config = yaml.parse(content) || {};
|
|
183
|
+
|
|
184
|
+
if (Array.isArray(config.customModes)) {
|
|
185
|
+
const originalCount = config.customModes.length;
|
|
186
|
+
// Remove BMAD modes only (keep non-BMAD modes)
|
|
187
|
+
config.customModes = config.customModes.filter((mode) => !mode.slug || !mode.slug.startsWith('bmad-'));
|
|
188
|
+
const removedCount = originalCount - config.customModes.length;
|
|
189
|
+
|
|
190
|
+
if (removedCount > 0) {
|
|
191
|
+
await fs.writeFile(kiloModesPath, yaml.stringify(config, { lineWidth: 0 }));
|
|
192
|
+
if (!options.silent) await prompts.log.message(`Removed ${removedCount} BMAD modes from .kilocodemodes`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} catch {
|
|
196
|
+
// If parsing fails, leave file as-is
|
|
197
|
+
if (!options.silent) await prompts.log.warn('Warning: Could not parse .kilocodemodes for cleanup');
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Clean up workflow files
|
|
202
|
+
const workflowsDir = path.join(projectDir, '.kilocode', 'workflows');
|
|
203
|
+
await this.clearBmadWorkflows(workflowsDir);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Install a custom agent launcher for Kilo
|
|
208
|
+
* @param {string} projectDir - Project directory
|
|
209
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
210
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
211
|
+
* @param {Object} metadata - Agent metadata
|
|
212
|
+
* @returns {Object} Installation result
|
|
213
|
+
*/
|
|
214
|
+
async installCustomAgentLauncher(projectDir, agentName, agentPath, metadata) {
|
|
215
|
+
const kilocodemodesPath = path.join(projectDir, this.configFile);
|
|
216
|
+
let config = {};
|
|
217
|
+
|
|
218
|
+
// Read existing .kilocodemodes file
|
|
219
|
+
if (await this.pathExists(kilocodemodesPath)) {
|
|
220
|
+
const existingContent = await this.readFile(kilocodemodesPath);
|
|
221
|
+
try {
|
|
222
|
+
config = yaml.parse(existingContent) || {};
|
|
223
|
+
} catch {
|
|
224
|
+
config = {};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// Ensure customModes array exists
|
|
229
|
+
if (!Array.isArray(config.customModes)) {
|
|
230
|
+
config.customModes = [];
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Create custom agent mode object
|
|
234
|
+
const slug = `bmad-custom-${agentName.toLowerCase()}`;
|
|
235
|
+
|
|
236
|
+
// Check if mode already exists
|
|
237
|
+
if (config.customModes.some((mode) => mode.slug === slug)) {
|
|
238
|
+
return {
|
|
239
|
+
ide: 'kilo',
|
|
240
|
+
path: this.configFile,
|
|
241
|
+
command: agentName,
|
|
242
|
+
type: 'custom-agent-launcher',
|
|
243
|
+
alreadyExists: true,
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Add custom mode object
|
|
248
|
+
config.customModes.push({
|
|
249
|
+
slug: slug,
|
|
250
|
+
name: `BMAD Custom: ${agentName}`,
|
|
251
|
+
description: `Custom BMAD agent: ${agentName}\n\n**⚠️ IMPORTANT**: Run @${agentPath} first to load the complete agent!\n\nThis is a launcher for the custom BMAD agent "${agentName}". The agent will follow the persona and instructions from the main agent file.\n`,
|
|
252
|
+
prompt: `@${agentPath}\n`,
|
|
253
|
+
always: false,
|
|
254
|
+
permissions: 'all',
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
// Write .kilocodemodes file with proper YAML structure
|
|
258
|
+
await this.writeFile(kilocodemodesPath, yaml.stringify(config, { lineWidth: 0 }));
|
|
259
|
+
|
|
260
|
+
return {
|
|
261
|
+
ide: 'kilo',
|
|
262
|
+
path: this.configFile,
|
|
263
|
+
command: slug,
|
|
264
|
+
type: 'custom-agent-launcher',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
module.exports = { KiloSetup };
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const { BMAD_FOLDER_NAME } = require('./shared/path-utils');
|
|
4
|
+
const prompts = require('../../../lib/prompts');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* IDE Manager - handles IDE-specific setup
|
|
8
|
+
* Dynamically discovers and loads IDE handlers
|
|
9
|
+
*
|
|
10
|
+
* Loading strategy:
|
|
11
|
+
* 1. Custom installer files (codex.js, github-copilot.js, kilo.js, rovodev.js) - for platforms with unique installation logic
|
|
12
|
+
* 2. Config-driven handlers (from platform-codes.yaml) - for standard IDE installation patterns
|
|
13
|
+
*/
|
|
14
|
+
class IdeManager {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.handlers = new Map();
|
|
17
|
+
this._initialized = false;
|
|
18
|
+
this.bmadFolderName = BMAD_FOLDER_NAME; // Default, can be overridden
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Set the bmad folder name for all IDE handlers
|
|
23
|
+
* @param {string} bmadFolderName - The bmad folder name
|
|
24
|
+
*/
|
|
25
|
+
setBmadFolderName(bmadFolderName) {
|
|
26
|
+
this.bmadFolderName = bmadFolderName;
|
|
27
|
+
// Update all loaded handlers
|
|
28
|
+
for (const handler of this.handlers.values()) {
|
|
29
|
+
if (typeof handler.setBmadFolderName === 'function') {
|
|
30
|
+
handler.setBmadFolderName(bmadFolderName);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Ensure handlers are loaded (lazy loading)
|
|
37
|
+
*/
|
|
38
|
+
async ensureInitialized() {
|
|
39
|
+
if (!this._initialized) {
|
|
40
|
+
await this.loadHandlers();
|
|
41
|
+
this._initialized = true;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Dynamically load all IDE handlers
|
|
47
|
+
* 1. Load custom installer files first (codex.js, github-copilot.js, kilo.js, rovodev.js)
|
|
48
|
+
* 2. Load config-driven handlers from platform-codes.yaml
|
|
49
|
+
*/
|
|
50
|
+
async loadHandlers() {
|
|
51
|
+
// Load custom installer files
|
|
52
|
+
await this.loadCustomInstallerFiles();
|
|
53
|
+
|
|
54
|
+
// Load config-driven handlers from platform-codes.yaml
|
|
55
|
+
await this.loadConfigDrivenHandlers();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Load custom installer files (unique installation logic)
|
|
60
|
+
* These files have special installation patterns that don't fit the config-driven model
|
|
61
|
+
*/
|
|
62
|
+
async loadCustomInstallerFiles() {
|
|
63
|
+
const ideDir = __dirname;
|
|
64
|
+
const customFiles = ['codex.js', 'github-copilot.js', 'kilo.js', 'rovodev.js'];
|
|
65
|
+
|
|
66
|
+
for (const file of customFiles) {
|
|
67
|
+
const filePath = path.join(ideDir, file);
|
|
68
|
+
if (!fs.existsSync(filePath)) continue;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const HandlerModule = require(filePath);
|
|
72
|
+
const HandlerClass = HandlerModule.default || Object.values(HandlerModule)[0];
|
|
73
|
+
|
|
74
|
+
if (HandlerClass) {
|
|
75
|
+
const instance = new HandlerClass();
|
|
76
|
+
if (instance.name && typeof instance.name === 'string') {
|
|
77
|
+
if (typeof instance.setBmadFolderName === 'function') {
|
|
78
|
+
instance.setBmadFolderName(this.bmadFolderName);
|
|
79
|
+
}
|
|
80
|
+
this.handlers.set(instance.name, instance);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
} catch (error) {
|
|
84
|
+
await prompts.log.warn(`Warning: Could not load ${file}: ${error.message}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Load config-driven handlers from platform-codes.yaml
|
|
91
|
+
* This creates ConfigDrivenIdeSetup instances for platforms with installer config
|
|
92
|
+
*/
|
|
93
|
+
async loadConfigDrivenHandlers() {
|
|
94
|
+
const { loadPlatformCodes } = require('./platform-codes');
|
|
95
|
+
const platformConfig = await loadPlatformCodes();
|
|
96
|
+
|
|
97
|
+
const { ConfigDrivenIdeSetup } = require('./_config-driven');
|
|
98
|
+
|
|
99
|
+
for (const [platformCode, platformInfo] of Object.entries(platformConfig.platforms)) {
|
|
100
|
+
// Skip if already loaded by custom installer
|
|
101
|
+
if (this.handlers.has(platformCode)) continue;
|
|
102
|
+
|
|
103
|
+
// Skip if no installer config (platform may not need installation)
|
|
104
|
+
if (!platformInfo.installer) continue;
|
|
105
|
+
|
|
106
|
+
const handler = new ConfigDrivenIdeSetup(platformCode, platformInfo);
|
|
107
|
+
if (typeof handler.setBmadFolderName === 'function') {
|
|
108
|
+
handler.setBmadFolderName(this.bmadFolderName);
|
|
109
|
+
}
|
|
110
|
+
this.handlers.set(platformCode, handler);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Get all available IDEs with their metadata
|
|
116
|
+
* @returns {Array} Array of IDE information objects
|
|
117
|
+
*/
|
|
118
|
+
getAvailableIdes() {
|
|
119
|
+
const ides = [];
|
|
120
|
+
|
|
121
|
+
for (const [key, handler] of this.handlers) {
|
|
122
|
+
// Skip handlers without valid names
|
|
123
|
+
const name = handler.displayName || handler.name || key;
|
|
124
|
+
|
|
125
|
+
// Filter out invalid entries (undefined name, empty key, etc.)
|
|
126
|
+
if (!key || !name || typeof key !== 'string' || typeof name !== 'string') {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
ides.push({
|
|
131
|
+
value: key,
|
|
132
|
+
name: name,
|
|
133
|
+
preferred: handler.preferred || false,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Sort: preferred first, then alphabetical
|
|
138
|
+
ides.sort((a, b) => {
|
|
139
|
+
if (a.preferred && !b.preferred) return -1;
|
|
140
|
+
if (!a.preferred && b.preferred) return 1;
|
|
141
|
+
return a.name.localeCompare(b.name);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
return ides;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get preferred IDEs
|
|
149
|
+
* @returns {Array} Array of preferred IDE information
|
|
150
|
+
*/
|
|
151
|
+
getPreferredIdes() {
|
|
152
|
+
return this.getAvailableIdes().filter((ide) => ide.preferred);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Get non-preferred IDEs
|
|
157
|
+
* @returns {Array} Array of non-preferred IDE information
|
|
158
|
+
*/
|
|
159
|
+
getOtherIdes() {
|
|
160
|
+
return this.getAvailableIdes().filter((ide) => !ide.preferred);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Setup IDE configuration
|
|
165
|
+
* @param {string} ideName - Name of the IDE
|
|
166
|
+
* @param {string} projectDir - Project directory
|
|
167
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
168
|
+
* @param {Object} options - Setup options
|
|
169
|
+
*/
|
|
170
|
+
async setup(ideName, projectDir, bmadDir, options = {}) {
|
|
171
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
172
|
+
|
|
173
|
+
if (!handler) {
|
|
174
|
+
await prompts.log.warn(`IDE '${ideName}' is not yet supported`);
|
|
175
|
+
await prompts.log.message(`Supported IDEs: ${[...this.handlers.keys()].join(', ')}`);
|
|
176
|
+
return { success: false, ide: ideName, error: 'unsupported IDE' };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
try {
|
|
180
|
+
const handlerResult = await handler.setup(projectDir, bmadDir, options);
|
|
181
|
+
// Build detail string from handler-returned data
|
|
182
|
+
let detail = '';
|
|
183
|
+
if (handlerResult && handlerResult.results) {
|
|
184
|
+
// Config-driven handlers return { success, results: { agents, workflows, tasks, tools } }
|
|
185
|
+
const r = handlerResult.results;
|
|
186
|
+
const parts = [];
|
|
187
|
+
if (r.agents > 0) parts.push(`${r.agents} agents`);
|
|
188
|
+
if (r.workflows > 0) parts.push(`${r.workflows} workflows`);
|
|
189
|
+
if (r.tasks > 0) parts.push(`${r.tasks} tasks`);
|
|
190
|
+
if (r.tools > 0) parts.push(`${r.tools} tools`);
|
|
191
|
+
detail = parts.join(', ');
|
|
192
|
+
} else if (handlerResult && handlerResult.counts) {
|
|
193
|
+
// Codex handler returns { success, counts: { agents, workflows, tasks }, written }
|
|
194
|
+
const c = handlerResult.counts;
|
|
195
|
+
const parts = [];
|
|
196
|
+
if (c.agents > 0) parts.push(`${c.agents} agents`);
|
|
197
|
+
if (c.workflows > 0) parts.push(`${c.workflows} workflows`);
|
|
198
|
+
if (c.tasks > 0) parts.push(`${c.tasks} tasks`);
|
|
199
|
+
detail = parts.join(', ');
|
|
200
|
+
} else if (handlerResult && handlerResult.modes !== undefined) {
|
|
201
|
+
// Kilo handler returns { success, modes, workflows, tasks, tools }
|
|
202
|
+
const parts = [];
|
|
203
|
+
if (handlerResult.modes > 0) parts.push(`${handlerResult.modes} modes`);
|
|
204
|
+
if (handlerResult.workflows > 0) parts.push(`${handlerResult.workflows} workflows`);
|
|
205
|
+
if (handlerResult.tasks > 0) parts.push(`${handlerResult.tasks} tasks`);
|
|
206
|
+
if (handlerResult.tools > 0) parts.push(`${handlerResult.tools} tools`);
|
|
207
|
+
detail = parts.join(', ');
|
|
208
|
+
}
|
|
209
|
+
// Propagate handler's success status (default true for backward compat)
|
|
210
|
+
const success = handlerResult?.success !== false;
|
|
211
|
+
return { success, ide: ideName, detail, error: handlerResult?.error, handlerResult };
|
|
212
|
+
} catch (error) {
|
|
213
|
+
await prompts.log.error(`Failed to setup ${ideName}: ${error.message}`);
|
|
214
|
+
return { success: false, ide: ideName, error: error.message };
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Cleanup IDE configurations
|
|
220
|
+
* @param {string} projectDir - Project directory
|
|
221
|
+
* @param {Object} [options] - Cleanup options passed through to handlers
|
|
222
|
+
*/
|
|
223
|
+
async cleanup(projectDir, options = {}) {
|
|
224
|
+
const results = [];
|
|
225
|
+
|
|
226
|
+
for (const [name, handler] of this.handlers) {
|
|
227
|
+
try {
|
|
228
|
+
await handler.cleanup(projectDir, options);
|
|
229
|
+
results.push({ ide: name, success: true });
|
|
230
|
+
} catch (error) {
|
|
231
|
+
results.push({ ide: name, success: false, error: error.message });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
return results;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Cleanup only the IDEs in the provided list
|
|
240
|
+
* Falls back to cleanup() (all handlers) if ideList is empty or undefined
|
|
241
|
+
* @param {string} projectDir - Project directory
|
|
242
|
+
* @param {Array<string>} ideList - List of IDE names to clean up
|
|
243
|
+
* @param {Object} [options] - Cleanup options passed through to handlers
|
|
244
|
+
* @returns {Array} Results array
|
|
245
|
+
*/
|
|
246
|
+
async cleanupByList(projectDir, ideList, options = {}) {
|
|
247
|
+
if (!ideList || ideList.length === 0) {
|
|
248
|
+
return this.cleanup(projectDir, options);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
await this.ensureInitialized();
|
|
252
|
+
const results = [];
|
|
253
|
+
|
|
254
|
+
// Build lowercase lookup for case-insensitive matching
|
|
255
|
+
const lowercaseHandlers = new Map([...this.handlers.entries()].map(([k, v]) => [k.toLowerCase(), v]));
|
|
256
|
+
|
|
257
|
+
for (const ideName of ideList) {
|
|
258
|
+
const handler = lowercaseHandlers.get(ideName.toLowerCase());
|
|
259
|
+
if (!handler) continue;
|
|
260
|
+
|
|
261
|
+
try {
|
|
262
|
+
await handler.cleanup(projectDir, options);
|
|
263
|
+
results.push({ ide: ideName, success: true });
|
|
264
|
+
} catch (error) {
|
|
265
|
+
results.push({ ide: ideName, success: false, error: error.message });
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
return results;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Get list of supported IDEs
|
|
274
|
+
* @returns {Array} List of supported IDE names
|
|
275
|
+
*/
|
|
276
|
+
getSupportedIdes() {
|
|
277
|
+
return [...this.handlers.keys()];
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Check if an IDE is supported
|
|
282
|
+
* @param {string} ideName - Name of the IDE
|
|
283
|
+
* @returns {boolean} True if IDE is supported
|
|
284
|
+
*/
|
|
285
|
+
isSupported(ideName) {
|
|
286
|
+
return this.handlers.has(ideName.toLowerCase());
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Detect installed IDEs
|
|
291
|
+
* @param {string} projectDir - Project directory
|
|
292
|
+
* @returns {Array} List of detected IDEs
|
|
293
|
+
*/
|
|
294
|
+
async detectInstalledIdes(projectDir) {
|
|
295
|
+
const detected = [];
|
|
296
|
+
|
|
297
|
+
for (const [name, handler] of this.handlers) {
|
|
298
|
+
if (typeof handler.detect === 'function' && (await handler.detect(projectDir))) {
|
|
299
|
+
detected.push(name);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
return detected;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Install custom agent launchers for specified IDEs
|
|
308
|
+
* @param {Array} ides - List of IDE names to install for
|
|
309
|
+
* @param {string} projectDir - Project directory
|
|
310
|
+
* @param {string} agentName - Agent name (e.g., "fred-commit-poet")
|
|
311
|
+
* @param {string} agentPath - Path to compiled agent (relative to project root)
|
|
312
|
+
* @param {Object} metadata - Agent metadata
|
|
313
|
+
* @returns {Object} Results for each IDE
|
|
314
|
+
*/
|
|
315
|
+
async installCustomAgentLaunchers(ides, projectDir, agentName, agentPath, metadata) {
|
|
316
|
+
const results = {};
|
|
317
|
+
|
|
318
|
+
for (const ideName of ides) {
|
|
319
|
+
const handler = this.handlers.get(ideName.toLowerCase());
|
|
320
|
+
|
|
321
|
+
if (!handler) {
|
|
322
|
+
await prompts.log.warn(`IDE '${ideName}' is not yet supported for custom agent installation`);
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
try {
|
|
327
|
+
if (typeof handler.installCustomAgentLauncher === 'function') {
|
|
328
|
+
const result = await handler.installCustomAgentLauncher(projectDir, agentName, agentPath, metadata);
|
|
329
|
+
if (result) {
|
|
330
|
+
results[ideName] = result;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
} catch (error) {
|
|
334
|
+
await prompts.log.warn(`Failed to install ${ideName} launcher: ${error.message}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
return results;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
module.exports = { IdeManager };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
const fs = require('fs-extra');
|
|
2
|
+
const path = require('node:path');
|
|
3
|
+
const yaml = require('yaml');
|
|
4
|
+
|
|
5
|
+
const PLATFORM_CODES_PATH = path.join(__dirname, 'platform-codes.yaml');
|
|
6
|
+
|
|
7
|
+
let _cachedPlatformCodes = null;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Load the platform codes configuration from YAML
|
|
11
|
+
* @returns {Object} Platform codes configuration
|
|
12
|
+
*/
|
|
13
|
+
async function loadPlatformCodes() {
|
|
14
|
+
if (_cachedPlatformCodes) {
|
|
15
|
+
return _cachedPlatformCodes;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!(await fs.pathExists(PLATFORM_CODES_PATH))) {
|
|
19
|
+
throw new Error(`Platform codes configuration not found at: ${PLATFORM_CODES_PATH}`);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const content = await fs.readFile(PLATFORM_CODES_PATH, 'utf8');
|
|
23
|
+
_cachedPlatformCodes = yaml.parse(content);
|
|
24
|
+
return _cachedPlatformCodes;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get platform information by code
|
|
29
|
+
* @param {string} platformCode - Platform code (e.g., 'claude-code', 'cursor')
|
|
30
|
+
* @returns {Object|null} Platform info or null if not found
|
|
31
|
+
*/
|
|
32
|
+
function getPlatformInfo(platformCode) {
|
|
33
|
+
if (!_cachedPlatformCodes) {
|
|
34
|
+
throw new Error('Platform codes not loaded. Call loadPlatformCodes() first.');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return _cachedPlatformCodes.platforms[platformCode] || null;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get all preferred platforms
|
|
42
|
+
* @returns {Promise<Array>} Array of preferred platform codes
|
|
43
|
+
*/
|
|
44
|
+
async function getPreferredPlatforms() {
|
|
45
|
+
const config = await loadPlatformCodes();
|
|
46
|
+
return Object.entries(config.platforms)
|
|
47
|
+
.filter(([_, info]) => info.preferred)
|
|
48
|
+
.map(([code, _]) => code);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Get all platform codes by category
|
|
53
|
+
* @param {string} category - Category to filter by (ide, cli, tool, etc.)
|
|
54
|
+
* @returns {Promise<Array>} Array of platform codes in the category
|
|
55
|
+
*/
|
|
56
|
+
async function getPlatformsByCategory(category) {
|
|
57
|
+
const config = await loadPlatformCodes();
|
|
58
|
+
return Object.entries(config.platforms)
|
|
59
|
+
.filter(([_, info]) => info.category === category)
|
|
60
|
+
.map(([code, _]) => code);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Get all platforms with installer config
|
|
65
|
+
* @returns {Promise<Array>} Array of platform codes that have installer config
|
|
66
|
+
*/
|
|
67
|
+
async function getConfigDrivenPlatforms() {
|
|
68
|
+
const config = await loadPlatformCodes();
|
|
69
|
+
return Object.entries(config.platforms)
|
|
70
|
+
.filter(([_, info]) => info.installer)
|
|
71
|
+
.map(([code, _]) => code);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get platforms that use custom installers (no installer config)
|
|
76
|
+
* @returns {Promise<Array>} Array of platform codes with custom installers
|
|
77
|
+
*/
|
|
78
|
+
async function getCustomInstallerPlatforms() {
|
|
79
|
+
const config = await loadPlatformCodes();
|
|
80
|
+
return Object.entries(config.platforms)
|
|
81
|
+
.filter(([_, info]) => !info.installer)
|
|
82
|
+
.map(([code, _]) => code);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Clear the cached platform codes (useful for testing)
|
|
87
|
+
*/
|
|
88
|
+
function clearCache() {
|
|
89
|
+
_cachedPlatformCodes = null;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
module.exports = {
|
|
93
|
+
loadPlatformCodes,
|
|
94
|
+
getPlatformInfo,
|
|
95
|
+
getPreferredPlatforms,
|
|
96
|
+
getPlatformsByCategory,
|
|
97
|
+
getConfigDrivenPlatforms,
|
|
98
|
+
getCustomInstallerPlatforms,
|
|
99
|
+
clearCache,
|
|
100
|
+
};
|