mdan-cli 2.5.1 → 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,699 @@
|
|
|
1
|
+
const path = require('node:path');
|
|
2
|
+
const { BaseIdeSetup } = require('./_base-ide');
|
|
3
|
+
const prompts = require('../../../lib/prompts');
|
|
4
|
+
const { AgentCommandGenerator } = require('./shared/agent-command-generator');
|
|
5
|
+
const { BMAD_FOLDER_NAME, toDashPath } = require('./shared/path-utils');
|
|
6
|
+
const fs = require('fs-extra');
|
|
7
|
+
const csv = require('csv-parse/sync');
|
|
8
|
+
const yaml = require('yaml');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* GitHub Copilot setup handler
|
|
12
|
+
* Creates agents in .github/agents/, prompts in .github/prompts/,
|
|
13
|
+
* copilot-instructions.md, and configures VS Code settings
|
|
14
|
+
*/
|
|
15
|
+
class GitHubCopilotSetup extends BaseIdeSetup {
|
|
16
|
+
constructor() {
|
|
17
|
+
super('github-copilot', 'GitHub Copilot', false);
|
|
18
|
+
// Don't set configDir to '.github' — nearly every GitHub repo has that directory,
|
|
19
|
+
// which would cause the base detect() to false-positive. Use detectionPaths instead.
|
|
20
|
+
this.configDir = null;
|
|
21
|
+
this.githubDir = '.github';
|
|
22
|
+
this.agentsDir = 'agents';
|
|
23
|
+
this.promptsDir = 'prompts';
|
|
24
|
+
this.detectionPaths = ['.github/copilot-instructions.md', '.github/agents'];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Setup GitHub Copilot configuration
|
|
29
|
+
* @param {string} projectDir - Project directory
|
|
30
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
31
|
+
* @param {Object} options - Setup options
|
|
32
|
+
*/
|
|
33
|
+
async setup(projectDir, bmadDir, options = {}) {
|
|
34
|
+
if (!options.silent) await prompts.log.info(`Setting up ${this.name}...`);
|
|
35
|
+
|
|
36
|
+
// Create .github/agents and .github/prompts directories
|
|
37
|
+
const githubDir = path.join(projectDir, this.githubDir);
|
|
38
|
+
const agentsDir = path.join(githubDir, this.agentsDir);
|
|
39
|
+
const promptsDir = path.join(githubDir, this.promptsDir);
|
|
40
|
+
await this.ensureDir(agentsDir);
|
|
41
|
+
await this.ensureDir(promptsDir);
|
|
42
|
+
|
|
43
|
+
// Preserve any customised tool permissions from existing files before cleanup
|
|
44
|
+
this.existingToolPermissions = await this.collectExistingToolPermissions(projectDir);
|
|
45
|
+
|
|
46
|
+
// Clean up any existing BMAD files before reinstalling
|
|
47
|
+
await this.cleanup(projectDir);
|
|
48
|
+
|
|
49
|
+
// Load agent manifest for enriched descriptions
|
|
50
|
+
const agentManifest = await this.loadAgentManifest(bmadDir);
|
|
51
|
+
|
|
52
|
+
// Generate agent launchers
|
|
53
|
+
const agentGen = new AgentCommandGenerator(this.bmadFolderName);
|
|
54
|
+
const { artifacts: agentArtifacts } = await agentGen.collectAgentArtifacts(bmadDir, options.selectedModules || []);
|
|
55
|
+
|
|
56
|
+
// Create agent .agent.md files
|
|
57
|
+
let agentCount = 0;
|
|
58
|
+
for (const artifact of agentArtifacts) {
|
|
59
|
+
const agentMeta = agentManifest.get(artifact.name);
|
|
60
|
+
|
|
61
|
+
// Compute fileName first so we can look up any existing tool permissions
|
|
62
|
+
const dashName = toDashPath(artifact.relativePath);
|
|
63
|
+
const fileName = dashName.replace(/\.md$/, '.agent.md');
|
|
64
|
+
const toolsStr = this.getToolsForFile(fileName);
|
|
65
|
+
const agentContent = this.createAgentContent(artifact, agentMeta, toolsStr);
|
|
66
|
+
const targetPath = path.join(agentsDir, fileName);
|
|
67
|
+
await this.writeFile(targetPath, agentContent);
|
|
68
|
+
agentCount++;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Generate prompt files from bmad-help.csv
|
|
72
|
+
const promptCount = await this.generatePromptFiles(projectDir, bmadDir, agentArtifacts, agentManifest);
|
|
73
|
+
|
|
74
|
+
// Generate copilot-instructions.md
|
|
75
|
+
await this.generateCopilotInstructions(projectDir, bmadDir, agentManifest, options);
|
|
76
|
+
|
|
77
|
+
if (!options.silent) await prompts.log.success(`${this.name} configured: ${agentCount} agents, ${promptCount} prompts → .github/`);
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
results: {
|
|
82
|
+
agents: agentCount,
|
|
83
|
+
workflows: promptCount,
|
|
84
|
+
tasks: 0,
|
|
85
|
+
tools: 0,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Load agent manifest CSV into a Map keyed by agent name
|
|
92
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
93
|
+
* @returns {Map} Agent metadata keyed by name
|
|
94
|
+
*/
|
|
95
|
+
async loadAgentManifest(bmadDir) {
|
|
96
|
+
const manifestPath = path.join(bmadDir, '_config', 'agent-manifest.csv');
|
|
97
|
+
const agents = new Map();
|
|
98
|
+
|
|
99
|
+
if (!(await fs.pathExists(manifestPath))) {
|
|
100
|
+
return agents;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const csvContent = await fs.readFile(manifestPath, 'utf8');
|
|
105
|
+
const records = csv.parse(csvContent, {
|
|
106
|
+
columns: true,
|
|
107
|
+
skip_empty_lines: true,
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
for (const record of records) {
|
|
111
|
+
agents.set(record.name, record);
|
|
112
|
+
}
|
|
113
|
+
} catch {
|
|
114
|
+
// Gracefully degrade if manifest is unreadable/malformed
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return agents;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Load bmad-help.csv to drive prompt generation
|
|
122
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
123
|
+
* @returns {Array|null} Parsed CSV rows
|
|
124
|
+
*/
|
|
125
|
+
async loadBmadHelp(bmadDir) {
|
|
126
|
+
const helpPath = path.join(bmadDir, '_config', 'bmad-help.csv');
|
|
127
|
+
|
|
128
|
+
if (!(await fs.pathExists(helpPath))) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
try {
|
|
133
|
+
const csvContent = await fs.readFile(helpPath, 'utf8');
|
|
134
|
+
return csv.parse(csvContent, {
|
|
135
|
+
columns: true,
|
|
136
|
+
skip_empty_lines: true,
|
|
137
|
+
});
|
|
138
|
+
} catch {
|
|
139
|
+
// Gracefully degrade if help CSV is unreadable/malformed
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Create agent .agent.md content with enriched description
|
|
146
|
+
* @param {Object} artifact - Agent artifact from AgentCommandGenerator
|
|
147
|
+
* @param {Object|undefined} manifestEntry - Agent manifest entry with metadata
|
|
148
|
+
* @returns {string} Agent file content
|
|
149
|
+
*/
|
|
150
|
+
createAgentContent(artifact, manifestEntry, toolsStr) {
|
|
151
|
+
// Build enriched description from manifest metadata
|
|
152
|
+
let description;
|
|
153
|
+
if (manifestEntry) {
|
|
154
|
+
const persona = manifestEntry.displayName || artifact.name;
|
|
155
|
+
const title = manifestEntry.title || this.formatTitle(artifact.name);
|
|
156
|
+
const capabilities = manifestEntry.capabilities || 'agent capabilities';
|
|
157
|
+
description = `${persona} — ${title}: ${capabilities}`;
|
|
158
|
+
} else {
|
|
159
|
+
description = `Activates the ${this.formatTitle(artifact.name)} agent persona.`;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Build the agent file path for the activation block
|
|
163
|
+
const agentPath = artifact.agentPath || artifact.relativePath;
|
|
164
|
+
const agentFilePath = `{project-root}/${this.bmadFolderName}/${agentPath}`;
|
|
165
|
+
|
|
166
|
+
return `---
|
|
167
|
+
description: '${description.replaceAll("'", "''")}'
|
|
168
|
+
tools: ${toolsStr}
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
You must fully embody this agent's persona and follow all activation instructions exactly as specified.
|
|
172
|
+
|
|
173
|
+
<agent-activation CRITICAL="TRUE">
|
|
174
|
+
1. LOAD the FULL agent file from ${agentFilePath}
|
|
175
|
+
2. READ its entire contents - this contains the complete agent persona, menu, and instructions
|
|
176
|
+
3. FOLLOW every step in the <activation> section precisely
|
|
177
|
+
4. DISPLAY the welcome/greeting as instructed
|
|
178
|
+
5. PRESENT the numbered menu
|
|
179
|
+
6. WAIT for user input before proceeding
|
|
180
|
+
</agent-activation>
|
|
181
|
+
`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Generate .prompt.md files for workflows, tasks, tech-writer commands, and agent activators
|
|
186
|
+
* @param {string} projectDir - Project directory
|
|
187
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
188
|
+
* @param {Array} agentArtifacts - Agent artifacts for activator generation
|
|
189
|
+
* @param {Map} agentManifest - Agent manifest data
|
|
190
|
+
* @returns {number} Count of prompts generated
|
|
191
|
+
*/
|
|
192
|
+
async generatePromptFiles(projectDir, bmadDir, agentArtifacts, agentManifest) {
|
|
193
|
+
const promptsDir = path.join(projectDir, this.githubDir, this.promptsDir);
|
|
194
|
+
let promptCount = 0;
|
|
195
|
+
|
|
196
|
+
// Load bmad-help.csv to drive workflow/task prompt generation
|
|
197
|
+
const helpEntries = await this.loadBmadHelp(bmadDir);
|
|
198
|
+
|
|
199
|
+
if (helpEntries) {
|
|
200
|
+
for (const entry of helpEntries) {
|
|
201
|
+
const command = entry.command;
|
|
202
|
+
if (!command) continue; // Skip entries without a command (tech-writer commands have no command column)
|
|
203
|
+
|
|
204
|
+
const workflowFile = entry['workflow-file'];
|
|
205
|
+
if (!workflowFile) continue; // Skip entries with no workflow file path
|
|
206
|
+
const promptFileName = `${command}.prompt.md`;
|
|
207
|
+
const toolsStr = this.getToolsForFile(promptFileName);
|
|
208
|
+
const promptContent = this.createWorkflowPromptContent(entry, workflowFile, toolsStr);
|
|
209
|
+
const promptPath = path.join(promptsDir, promptFileName);
|
|
210
|
+
await this.writeFile(promptPath, promptContent);
|
|
211
|
+
promptCount++;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Generate tech-writer command prompts (entries with no command column)
|
|
215
|
+
for (const entry of helpEntries) {
|
|
216
|
+
if (entry.command) continue; // Already handled above
|
|
217
|
+
const techWriterPrompt = this.createTechWriterPromptContent(entry);
|
|
218
|
+
if (techWriterPrompt) {
|
|
219
|
+
const promptFileName = `${techWriterPrompt.fileName}.prompt.md`;
|
|
220
|
+
const promptPath = path.join(promptsDir, promptFileName);
|
|
221
|
+
await this.writeFile(promptPath, techWriterPrompt.content);
|
|
222
|
+
promptCount++;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// Generate agent activator prompts (Pattern D)
|
|
228
|
+
for (const artifact of agentArtifacts) {
|
|
229
|
+
const agentMeta = agentManifest.get(artifact.name);
|
|
230
|
+
const fileName = `bmad-${artifact.name}.prompt.md`;
|
|
231
|
+
const toolsStr = this.getToolsForFile(fileName);
|
|
232
|
+
const promptContent = this.createAgentActivatorPromptContent(artifact, agentMeta, toolsStr);
|
|
233
|
+
const promptPath = path.join(promptsDir, fileName);
|
|
234
|
+
await this.writeFile(promptPath, promptContent);
|
|
235
|
+
promptCount++;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return promptCount;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
/**
|
|
242
|
+
* Create prompt content for a workflow/task entry from bmad-help.csv
|
|
243
|
+
* Determines the pattern (A, B, or A for .xml tasks) based on file extension
|
|
244
|
+
* @param {Object} entry - bmad-help.csv row
|
|
245
|
+
* @param {string} workflowFile - Workflow file path
|
|
246
|
+
* @returns {string} Prompt file content
|
|
247
|
+
*/
|
|
248
|
+
createWorkflowPromptContent(entry, workflowFile, toolsStr) {
|
|
249
|
+
const description = this.escapeYamlSingleQuote(this.createPromptDescription(entry.name));
|
|
250
|
+
// bmm/config.yaml is safe to hardcode here: these prompts are only generated when
|
|
251
|
+
// bmad-help.csv exists (bmm module data), so bmm is guaranteed to be installed.
|
|
252
|
+
const configLine = `1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables`;
|
|
253
|
+
|
|
254
|
+
let body;
|
|
255
|
+
if (workflowFile.endsWith('.yaml')) {
|
|
256
|
+
// Pattern B: YAML-based workflows — use workflow engine
|
|
257
|
+
body = `${configLine}
|
|
258
|
+
2. Load the workflow engine at {project-root}/${this.bmadFolderName}/core/tasks/workflow.xml
|
|
259
|
+
3. Load and execute the workflow configuration at {project-root}/${workflowFile} using the engine from step 2`;
|
|
260
|
+
} else if (workflowFile.endsWith('.xml')) {
|
|
261
|
+
// Pattern A variant: XML tasks — load and execute directly
|
|
262
|
+
body = `${configLine}
|
|
263
|
+
2. Load and execute the task at {project-root}/${workflowFile}`;
|
|
264
|
+
} else {
|
|
265
|
+
// Pattern A: MD workflows — load and follow directly
|
|
266
|
+
body = `${configLine}
|
|
267
|
+
2. Load and follow the workflow at {project-root}/${workflowFile}`;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return `---
|
|
271
|
+
description: '${description}'
|
|
272
|
+
agent: 'agent'
|
|
273
|
+
tools: ${toolsStr}
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
${body}
|
|
277
|
+
`;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Create a short 2-5 word description for a prompt from the entry name
|
|
282
|
+
* @param {string} name - Entry name from bmad-help.csv
|
|
283
|
+
* @returns {string} Short description
|
|
284
|
+
*/
|
|
285
|
+
createPromptDescription(name) {
|
|
286
|
+
const descriptionMap = {
|
|
287
|
+
'Brainstorm Project': 'Brainstorm ideas',
|
|
288
|
+
'Market Research': 'Market research',
|
|
289
|
+
'Domain Research': 'Domain research',
|
|
290
|
+
'Technical Research': 'Technical research',
|
|
291
|
+
'Create Brief': 'Create product brief',
|
|
292
|
+
'Create PRD': 'Create PRD',
|
|
293
|
+
'Validate PRD': 'Validate PRD',
|
|
294
|
+
'Edit PRD': 'Edit PRD',
|
|
295
|
+
'Create UX': 'Create UX design',
|
|
296
|
+
'Create Architecture': 'Create architecture',
|
|
297
|
+
'Create Epics and Stories': 'Create epics and stories',
|
|
298
|
+
'Check Implementation Readiness': 'Check implementation readiness',
|
|
299
|
+
'Sprint Planning': 'Sprint planning',
|
|
300
|
+
'Sprint Status': 'Sprint status',
|
|
301
|
+
'Create Story': 'Create story',
|
|
302
|
+
'Validate Story': 'Validate story',
|
|
303
|
+
'Dev Story': 'Dev story',
|
|
304
|
+
'QA Automation Test': 'QA automation',
|
|
305
|
+
'Code Review': 'Code review',
|
|
306
|
+
Retrospective: 'Retrospective',
|
|
307
|
+
'Document Project': 'Document project',
|
|
308
|
+
'Generate Project Context': 'Generate project context',
|
|
309
|
+
'Quick Spec': 'Quick spec',
|
|
310
|
+
'Quick Dev': 'Quick dev',
|
|
311
|
+
'Correct Course': 'Correct course',
|
|
312
|
+
Brainstorming: 'Brainstorm ideas',
|
|
313
|
+
'Party Mode': 'Party mode',
|
|
314
|
+
'bmad-help': 'BMAD help',
|
|
315
|
+
'Index Docs': 'Index documents',
|
|
316
|
+
'Shard Document': 'Shard document',
|
|
317
|
+
'Editorial Review - Prose': 'Editorial review prose',
|
|
318
|
+
'Editorial Review - Structure': 'Editorial review structure',
|
|
319
|
+
'Adversarial Review (General)': 'Adversarial review',
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
return descriptionMap[name] || name;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Create prompt content for tech-writer agent-only commands (Pattern C)
|
|
327
|
+
* @param {Object} entry - bmad-help.csv row
|
|
328
|
+
* @returns {Object|null} { fileName, content } or null if not a tech-writer command
|
|
329
|
+
*/
|
|
330
|
+
createTechWriterPromptContent(entry) {
|
|
331
|
+
if (entry['agent-name'] !== 'tech-writer') return null;
|
|
332
|
+
|
|
333
|
+
const techWriterCommands = {
|
|
334
|
+
'Write Document': { code: 'WD', file: 'bmad-bmm-write-document', description: 'Write document' },
|
|
335
|
+
'Update Standards': { code: 'US', file: 'bmad-bmm-update-standards', description: 'Update standards' },
|
|
336
|
+
'Mermaid Generate': { code: 'MG', file: 'bmad-bmm-mermaid-generate', description: 'Mermaid generate' },
|
|
337
|
+
'Validate Document': { code: 'VD', file: 'bmad-bmm-validate-document', description: 'Validate document' },
|
|
338
|
+
'Explain Concept': { code: 'EC', file: 'bmad-bmm-explain-concept', description: 'Explain concept' },
|
|
339
|
+
};
|
|
340
|
+
|
|
341
|
+
const cmd = techWriterCommands[entry.name];
|
|
342
|
+
if (!cmd) return null;
|
|
343
|
+
|
|
344
|
+
const safeDescription = this.escapeYamlSingleQuote(cmd.description);
|
|
345
|
+
const toolsStr = this.getToolsForFile(`${cmd.file}.prompt.md`);
|
|
346
|
+
|
|
347
|
+
const content = `---
|
|
348
|
+
description: '${safeDescription}'
|
|
349
|
+
agent: 'agent'
|
|
350
|
+
tools: ${toolsStr}
|
|
351
|
+
---
|
|
352
|
+
|
|
353
|
+
1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables
|
|
354
|
+
2. Load the full agent file from {project-root}/${this.bmadFolderName}/bmm/agents/tech-writer/tech-writer.md and activate the Paige (Technical Writer) persona
|
|
355
|
+
3. Execute the ${entry.name} menu command (${cmd.code})
|
|
356
|
+
`;
|
|
357
|
+
|
|
358
|
+
return { fileName: cmd.file, content };
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Create agent activator prompt content (Pattern D)
|
|
363
|
+
* @param {Object} artifact - Agent artifact
|
|
364
|
+
* @param {Object|undefined} manifestEntry - Agent manifest entry
|
|
365
|
+
* @returns {string} Prompt file content
|
|
366
|
+
*/
|
|
367
|
+
createAgentActivatorPromptContent(artifact, manifestEntry, toolsStr) {
|
|
368
|
+
let description;
|
|
369
|
+
if (manifestEntry) {
|
|
370
|
+
description = manifestEntry.title || this.formatTitle(artifact.name);
|
|
371
|
+
} else {
|
|
372
|
+
description = this.formatTitle(artifact.name);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const safeDescription = this.escapeYamlSingleQuote(description);
|
|
376
|
+
const agentPath = artifact.agentPath || artifact.relativePath;
|
|
377
|
+
const agentFilePath = `{project-root}/${this.bmadFolderName}/${agentPath}`;
|
|
378
|
+
|
|
379
|
+
// bmm/config.yaml is safe to hardcode: agent activators are only generated from
|
|
380
|
+
// bmm agent artifacts, so bmm is guaranteed to be installed.
|
|
381
|
+
return `---
|
|
382
|
+
description: '${safeDescription}'
|
|
383
|
+
agent: 'agent'
|
|
384
|
+
tools: ${toolsStr}
|
|
385
|
+
---
|
|
386
|
+
|
|
387
|
+
1. Load {project-root}/${this.bmadFolderName}/bmm/config.yaml and store ALL fields as session variables
|
|
388
|
+
2. Load the full agent file from ${agentFilePath}
|
|
389
|
+
3. Follow ALL activation instructions in the agent file
|
|
390
|
+
4. Display the welcome/greeting as instructed
|
|
391
|
+
5. Present the numbered menu
|
|
392
|
+
6. Wait for user input before proceeding
|
|
393
|
+
`;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Generate copilot-instructions.md from module config
|
|
398
|
+
* @param {string} projectDir - Project directory
|
|
399
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
400
|
+
* @param {Map} agentManifest - Agent manifest data
|
|
401
|
+
*/
|
|
402
|
+
async generateCopilotInstructions(projectDir, bmadDir, agentManifest, options = {}) {
|
|
403
|
+
const configVars = await this.loadModuleConfig(bmadDir);
|
|
404
|
+
|
|
405
|
+
// Build the agents table from the manifest
|
|
406
|
+
let agentsTable = '| Agent | Persona | Title | Capabilities |\n|---|---|---|---|\n';
|
|
407
|
+
const agentOrder = [
|
|
408
|
+
'bmad-master',
|
|
409
|
+
'analyst',
|
|
410
|
+
'architect',
|
|
411
|
+
'dev',
|
|
412
|
+
'pm',
|
|
413
|
+
'qa',
|
|
414
|
+
'quick-flow-solo-dev',
|
|
415
|
+
'sm',
|
|
416
|
+
'tech-writer',
|
|
417
|
+
'ux-designer',
|
|
418
|
+
];
|
|
419
|
+
|
|
420
|
+
for (const agentName of agentOrder) {
|
|
421
|
+
const meta = agentManifest.get(agentName);
|
|
422
|
+
if (meta) {
|
|
423
|
+
const capabilities = meta.capabilities || 'agent capabilities';
|
|
424
|
+
const cleanTitle = (meta.title || '').replaceAll('""', '"');
|
|
425
|
+
agentsTable += `| ${agentName} | ${meta.displayName} | ${cleanTitle} | ${capabilities} |\n`;
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const bmad = this.bmadFolderName;
|
|
430
|
+
const bmadSection = `# BMAD Method — Project Instructions
|
|
431
|
+
|
|
432
|
+
## Project Configuration
|
|
433
|
+
|
|
434
|
+
- **Project**: ${configVars.project_name || '{{project_name}}'}
|
|
435
|
+
- **User**: ${configVars.user_name || '{{user_name}}'}
|
|
436
|
+
- **Communication Language**: ${configVars.communication_language || '{{communication_language}}'}
|
|
437
|
+
- **Document Output Language**: ${configVars.document_output_language || '{{document_output_language}}'}
|
|
438
|
+
- **User Skill Level**: ${configVars.user_skill_level || '{{user_skill_level}}'}
|
|
439
|
+
- **Output Folder**: ${configVars.output_folder || '{{output_folder}}'}
|
|
440
|
+
- **Planning Artifacts**: ${configVars.planning_artifacts || '{{planning_artifacts}}'}
|
|
441
|
+
- **Implementation Artifacts**: ${configVars.implementation_artifacts || '{{implementation_artifacts}}'}
|
|
442
|
+
- **Project Knowledge**: ${configVars.project_knowledge || '{{project_knowledge}}'}
|
|
443
|
+
|
|
444
|
+
## BMAD Runtime Structure
|
|
445
|
+
|
|
446
|
+
- **Agent definitions**: \`${bmad}/bmm/agents/\` (BMM module) and \`${bmad}/core/agents/\` (core)
|
|
447
|
+
- **Workflow definitions**: \`${bmad}/bmm/workflows/\` (organized by phase)
|
|
448
|
+
- **Core tasks**: \`${bmad}/core/tasks/\` (help, editorial review, indexing, sharding, adversarial review)
|
|
449
|
+
- **Core workflows**: \`${bmad}/core/workflows/\` (brainstorming, party-mode, advanced-elicitation)
|
|
450
|
+
- **Workflow engine**: \`${bmad}/core/tasks/workflow.xml\` (executes YAML-based workflows)
|
|
451
|
+
- **Module configuration**: \`${bmad}/bmm/config.yaml\`
|
|
452
|
+
- **Core configuration**: \`${bmad}/core/config.yaml\`
|
|
453
|
+
- **Agent manifest**: \`${bmad}/_config/agent-manifest.csv\`
|
|
454
|
+
- **Workflow manifest**: \`${bmad}/_config/workflow-manifest.csv\`
|
|
455
|
+
- **Help manifest**: \`${bmad}/_config/bmad-help.csv\`
|
|
456
|
+
- **Agent memory**: \`${bmad}/_memory/\`
|
|
457
|
+
|
|
458
|
+
## Key Conventions
|
|
459
|
+
|
|
460
|
+
- Always load \`${bmad}/bmm/config.yaml\` before any agent activation or workflow execution
|
|
461
|
+
- Store all config fields as session variables: \`{user_name}\`, \`{communication_language}\`, \`{output_folder}\`, \`{planning_artifacts}\`, \`{implementation_artifacts}\`, \`{project_knowledge}\`
|
|
462
|
+
- MD-based workflows execute directly — load and follow the \`.md\` file
|
|
463
|
+
- YAML-based workflows require the workflow engine — load \`workflow.xml\` first, then pass the \`.yaml\` config
|
|
464
|
+
- Follow step-based workflow execution: load steps JIT, never multiple at once
|
|
465
|
+
- Save outputs after EACH step when using the workflow engine
|
|
466
|
+
- The \`{project-root}\` variable resolves to the workspace root at runtime
|
|
467
|
+
|
|
468
|
+
## Available Agents
|
|
469
|
+
|
|
470
|
+
${agentsTable}
|
|
471
|
+
## Slash Commands
|
|
472
|
+
|
|
473
|
+
Type \`/bmad-\` in Copilot Chat to see all available BMAD workflows and agent activators. Agents are also available in the agents dropdown.`;
|
|
474
|
+
|
|
475
|
+
const instructionsPath = path.join(projectDir, this.githubDir, 'copilot-instructions.md');
|
|
476
|
+
const markerStart = '<!-- BMAD:START -->';
|
|
477
|
+
const markerEnd = '<!-- BMAD:END -->';
|
|
478
|
+
const markedContent = `${markerStart}\n${bmadSection}\n${markerEnd}`;
|
|
479
|
+
|
|
480
|
+
if (await fs.pathExists(instructionsPath)) {
|
|
481
|
+
const existing = await fs.readFile(instructionsPath, 'utf8');
|
|
482
|
+
const startIdx = existing.indexOf(markerStart);
|
|
483
|
+
const endIdx = existing.indexOf(markerEnd);
|
|
484
|
+
|
|
485
|
+
if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
|
|
486
|
+
// Replace only the BMAD section between markers
|
|
487
|
+
const before = existing.slice(0, startIdx);
|
|
488
|
+
const after = existing.slice(endIdx + markerEnd.length);
|
|
489
|
+
const merged = `${before}${markedContent}${after}`;
|
|
490
|
+
await this.writeFile(instructionsPath, merged);
|
|
491
|
+
} else {
|
|
492
|
+
// Existing file without markers — back it up before overwriting
|
|
493
|
+
const backupPath = `${instructionsPath}.bak`;
|
|
494
|
+
await fs.copy(instructionsPath, backupPath);
|
|
495
|
+
if (!options.silent) await prompts.log.warn(` Backed up copilot-instructions.md → .bak`);
|
|
496
|
+
await this.writeFile(instructionsPath, `${markedContent}\n`);
|
|
497
|
+
}
|
|
498
|
+
} else {
|
|
499
|
+
// No existing file — create fresh with markers
|
|
500
|
+
await this.writeFile(instructionsPath, `${markedContent}\n`);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
/**
|
|
505
|
+
* Load module config.yaml for template variables
|
|
506
|
+
* @param {string} bmadDir - BMAD installation directory
|
|
507
|
+
* @returns {Object} Config variables
|
|
508
|
+
*/
|
|
509
|
+
async loadModuleConfig(bmadDir) {
|
|
510
|
+
const bmmConfigPath = path.join(bmadDir, 'bmm', 'config.yaml');
|
|
511
|
+
const coreConfigPath = path.join(bmadDir, 'core', 'config.yaml');
|
|
512
|
+
|
|
513
|
+
for (const configPath of [bmmConfigPath, coreConfigPath]) {
|
|
514
|
+
if (await fs.pathExists(configPath)) {
|
|
515
|
+
try {
|
|
516
|
+
const content = await fs.readFile(configPath, 'utf8');
|
|
517
|
+
return yaml.parse(content) || {};
|
|
518
|
+
} catch {
|
|
519
|
+
// Fall through to next config
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
return {};
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
/**
|
|
528
|
+
* Escape a string for use inside YAML single-quoted values.
|
|
529
|
+
* In YAML, the only escape inside single quotes is '' for a literal '.
|
|
530
|
+
* @param {string} value - Raw string
|
|
531
|
+
* @returns {string} Escaped string safe for YAML single-quoted context
|
|
532
|
+
*/
|
|
533
|
+
escapeYamlSingleQuote(value) {
|
|
534
|
+
return (value || '').replaceAll("'", "''");
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Scan existing agent and prompt files for customised tool permissions before cleanup.
|
|
539
|
+
* Returns a Map<filename, toolsArray> so permissions can be preserved across reinstalls.
|
|
540
|
+
* @param {string} projectDir - Project directory
|
|
541
|
+
* @returns {Map} Existing tool permissions keyed by filename
|
|
542
|
+
*/
|
|
543
|
+
async collectExistingToolPermissions(projectDir) {
|
|
544
|
+
const permissions = new Map();
|
|
545
|
+
const dirs = [
|
|
546
|
+
[path.join(projectDir, this.githubDir, this.agentsDir), /^bmad.*\.agent\.md$/],
|
|
547
|
+
[path.join(projectDir, this.githubDir, this.promptsDir), /^bmad-.*\.prompt\.md$/],
|
|
548
|
+
];
|
|
549
|
+
|
|
550
|
+
for (const [dir, pattern] of dirs) {
|
|
551
|
+
if (!(await fs.pathExists(dir))) continue;
|
|
552
|
+
const files = await fs.readdir(dir);
|
|
553
|
+
|
|
554
|
+
for (const file of files) {
|
|
555
|
+
if (!pattern.test(file)) continue;
|
|
556
|
+
|
|
557
|
+
try {
|
|
558
|
+
const content = await fs.readFile(path.join(dir, file), 'utf8');
|
|
559
|
+
const fmMatch = content.match(/^---\n([\s\S]*?)\n---/);
|
|
560
|
+
if (!fmMatch) continue;
|
|
561
|
+
|
|
562
|
+
const frontmatter = yaml.parse(fmMatch[1]);
|
|
563
|
+
if (frontmatter && Array.isArray(frontmatter.tools)) {
|
|
564
|
+
permissions.set(file, frontmatter.tools);
|
|
565
|
+
}
|
|
566
|
+
} catch {
|
|
567
|
+
// Skip unreadable files
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
return permissions;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Get the tools array string for a file, preserving any existing customisation.
|
|
577
|
+
* Falls back to the default tools if no prior customisation exists.
|
|
578
|
+
* @param {string} fileName - Target filename (e.g. 'bmad-agent-bmm-pm.agent.md')
|
|
579
|
+
* @returns {string} YAML inline array string
|
|
580
|
+
*/
|
|
581
|
+
getToolsForFile(fileName) {
|
|
582
|
+
const defaultTools = ['read', 'edit', 'search', 'execute'];
|
|
583
|
+
const tools = (this.existingToolPermissions && this.existingToolPermissions.get(fileName)) || defaultTools;
|
|
584
|
+
return '[' + tools.map((t) => `'${t}'`).join(', ') + ']';
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
/**
|
|
588
|
+
* Format name as title
|
|
589
|
+
*/
|
|
590
|
+
formatTitle(name) {
|
|
591
|
+
return name
|
|
592
|
+
.split('-')
|
|
593
|
+
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
594
|
+
.join(' ');
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
/**
|
|
598
|
+
* Cleanup GitHub Copilot configuration - surgically remove only BMAD files
|
|
599
|
+
*/
|
|
600
|
+
async cleanup(projectDir, options = {}) {
|
|
601
|
+
// Clean up agents directory
|
|
602
|
+
const agentsDir = path.join(projectDir, this.githubDir, this.agentsDir);
|
|
603
|
+
if (await fs.pathExists(agentsDir)) {
|
|
604
|
+
const files = await fs.readdir(agentsDir);
|
|
605
|
+
let removed = 0;
|
|
606
|
+
|
|
607
|
+
for (const file of files) {
|
|
608
|
+
if (file.startsWith('bmad') && (file.endsWith('.agent.md') || file.endsWith('.md'))) {
|
|
609
|
+
await fs.remove(path.join(agentsDir, file));
|
|
610
|
+
removed++;
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
if (removed > 0 && !options.silent) {
|
|
615
|
+
await prompts.log.message(` Cleaned up ${removed} existing BMAD agents`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
// Clean up prompts directory
|
|
620
|
+
const promptsDir = path.join(projectDir, this.githubDir, this.promptsDir);
|
|
621
|
+
if (await fs.pathExists(promptsDir)) {
|
|
622
|
+
const files = await fs.readdir(promptsDir);
|
|
623
|
+
let removed = 0;
|
|
624
|
+
|
|
625
|
+
for (const file of files) {
|
|
626
|
+
if (file.startsWith('bmad-') && file.endsWith('.prompt.md')) {
|
|
627
|
+
await fs.remove(path.join(promptsDir, file));
|
|
628
|
+
removed++;
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
if (removed > 0 && !options.silent) {
|
|
633
|
+
await prompts.log.message(` Cleaned up ${removed} existing BMAD prompts`);
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
// During uninstall, also strip BMAD markers from copilot-instructions.md.
|
|
638
|
+
// During reinstall (default), this is skipped because generateCopilotInstructions()
|
|
639
|
+
// handles marker-based replacement in a single read-modify-write pass,
|
|
640
|
+
// which correctly preserves user content outside the markers.
|
|
641
|
+
if (options.isUninstall) {
|
|
642
|
+
await this.cleanupCopilotInstructions(projectDir, options);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/**
|
|
647
|
+
* Strip BMAD marker section from copilot-instructions.md
|
|
648
|
+
* If file becomes empty after stripping, delete it.
|
|
649
|
+
* If a .bak backup exists and the main file was deleted, restore the backup.
|
|
650
|
+
* @param {string} projectDir - Project directory
|
|
651
|
+
* @param {Object} [options] - Options (e.g. { silent: true })
|
|
652
|
+
*/
|
|
653
|
+
async cleanupCopilotInstructions(projectDir, options = {}) {
|
|
654
|
+
const instructionsPath = path.join(projectDir, this.githubDir, 'copilot-instructions.md');
|
|
655
|
+
const backupPath = `${instructionsPath}.bak`;
|
|
656
|
+
|
|
657
|
+
if (!(await fs.pathExists(instructionsPath))) {
|
|
658
|
+
return;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
const content = await fs.readFile(instructionsPath, 'utf8');
|
|
662
|
+
const markerStart = '<!-- BMAD:START -->';
|
|
663
|
+
const markerEnd = '<!-- BMAD:END -->';
|
|
664
|
+
const startIdx = content.indexOf(markerStart);
|
|
665
|
+
const endIdx = content.indexOf(markerEnd);
|
|
666
|
+
|
|
667
|
+
if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
|
|
668
|
+
return; // No valid markers found
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
// Strip the marker section (including markers)
|
|
672
|
+
const before = content.slice(0, startIdx);
|
|
673
|
+
const after = content.slice(endIdx + markerEnd.length);
|
|
674
|
+
const cleaned = before + after;
|
|
675
|
+
|
|
676
|
+
if (cleaned.trim().length === 0) {
|
|
677
|
+
// File is empty after stripping — delete it
|
|
678
|
+
await fs.remove(instructionsPath);
|
|
679
|
+
|
|
680
|
+
// If backup exists, restore it
|
|
681
|
+
if (await fs.pathExists(backupPath)) {
|
|
682
|
+
await fs.rename(backupPath, instructionsPath);
|
|
683
|
+
if (!options.silent) {
|
|
684
|
+
await prompts.log.message(' Restored copilot-instructions.md from backup');
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
} else {
|
|
688
|
+
// Write cleaned content back (preserve original whitespace)
|
|
689
|
+
await fs.writeFile(instructionsPath, cleaned, 'utf8');
|
|
690
|
+
|
|
691
|
+
// If backup exists, it's stale now — remove it
|
|
692
|
+
if (await fs.pathExists(backupPath)) {
|
|
693
|
+
await fs.remove(backupPath);
|
|
694
|
+
}
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
module.exports = { GitHubCopilotSetup };
|