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,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Fix Documentation References
|
|
3
|
+
description: Corrects workflow, agent, and command references in BMad documentation
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Fix Documentation References
|
|
7
|
+
|
|
8
|
+
## Scope
|
|
9
|
+
|
|
10
|
+
Fix reference patterns ONLY. Do not modify links, formatting, structure, or other content.
|
|
11
|
+
|
|
12
|
+
## Purpose
|
|
13
|
+
|
|
14
|
+
Fix incorrect references to workflows, agents, and commands in BMad documentation files.
|
|
15
|
+
|
|
16
|
+
## Step 1: Establish Target Audience
|
|
17
|
+
|
|
18
|
+
Before fixing references, determine who the document is for:
|
|
19
|
+
|
|
20
|
+
| Audience | Indicators | Style |
|
|
21
|
+
|----------|------------|-------|
|
|
22
|
+
| **Newbies** | tutorials/, getting-started, installation/, "What You'll Learn" | Keep "workflow", include platform hints |
|
|
23
|
+
| **Experienced** | reference/, explanation/ | Drop "workflow", no platform hints |
|
|
24
|
+
| **How-To** | how-to/ | **Ask** — depends on the task |
|
|
25
|
+
|
|
26
|
+
**How-To guides require judgment**: Don't assume experienced. Ask: "Does this task require prior BMad knowledge?" Early-journey tasks (first PRD, first sprint) are newbie docs. Customization and advanced features are experienced.
|
|
27
|
+
|
|
28
|
+
**If unclear**: Ask the user "Who is the target audience for this document — new users learning BMad, or experienced users who know the system?"
|
|
29
|
+
|
|
30
|
+
This determines whether helper words like "workflow" and platform hints are helpful context or just noise.
|
|
31
|
+
|
|
32
|
+
## Reference Patterns to Fix
|
|
33
|
+
|
|
34
|
+
### Always Wrong
|
|
35
|
+
|
|
36
|
+
| Pattern | Example | Problem |
|
|
37
|
+
|---------|---------|---------|
|
|
38
|
+
| `*workflow` | `*prd` | Obsolete menu shortcut notation |
|
|
39
|
+
| `/workflow` | `/workflow-init` | Platform-specific slash command |
|
|
40
|
+
| `bmad_bmm_*` | `bmad_bmm_workflow-init` | Internal slash command name, platform-specific |
|
|
41
|
+
|
|
42
|
+
### Correct Format
|
|
43
|
+
|
|
44
|
+
Use backticks with plain workflow name:
|
|
45
|
+
- **Wrong**: Run `/workflow-init`
|
|
46
|
+
- **Wrong**: Run `*prd`
|
|
47
|
+
|
|
48
|
+
**When to say "workflow"**:
|
|
49
|
+
- **Newbie docs** (getting-started): "Run the `prd` workflow" — helps them learn what it is
|
|
50
|
+
- **Other docs**: "Run `prd`" — they already know, so "workflow" is noise
|
|
51
|
+
|
|
52
|
+
**Platform hint**: Only in newbie docs, and only on the **first** workflow mention:
|
|
53
|
+
- First mention: Run the `help` workflow (`/bmad-help` on most platforms)
|
|
54
|
+
- Subsequent mentions: Run `prd` — no hint, no "workflow" needed after they've seen the pattern
|
|
55
|
+
|
|
56
|
+
In experienced docs, the hint is always noise — just use the workflow name.
|
|
57
|
+
|
|
58
|
+
### Workflow Name Changes
|
|
59
|
+
|
|
60
|
+
| Old Name | New Name | Notes |
|
|
61
|
+
|----------|----------|-------|
|
|
62
|
+
| `workflow-init` | `bmad-help` | DEPRECATED - help system replaces initialization |
|
|
63
|
+
| `workflow-status` | `bmad-help` | DEPRECATED - help system replaces status checking |
|
|
64
|
+
|
|
65
|
+
### The Help System
|
|
66
|
+
|
|
67
|
+
The `bmad-help` workflow is the modern replacement for both `workflow-init` and `workflow-status`:
|
|
68
|
+
- **Universal**: Works regardless of workflow state or module
|
|
69
|
+
- **Contextual**: Infers completion from artifacts and conversation
|
|
70
|
+
- **Adaptive**: Guides users through workflows based on phase ordering
|
|
71
|
+
- **Anytime**: Can be run at any point, no pre-initialization needed
|
|
72
|
+
|
|
73
|
+
Users can run `bmad-help` to get guidance on what to do next. It detects:
|
|
74
|
+
- What workflows have been completed (by checking for output artifacts)
|
|
75
|
+
- What module is active
|
|
76
|
+
- What the next recommended/required step is
|
|
77
|
+
|
|
78
|
+
## Lessons Learned
|
|
79
|
+
|
|
80
|
+
1. **Platform-agnostic**: Docs should never include platform-specific invocation patterns (slashes, prefixes)
|
|
81
|
+
2. **Backtick the name**: Use backticks around workflow names: `workflow-name`
|
|
82
|
+
3. **Simple names**: Just the workflow name, no `bmad_bmm_` prefix, no `/` prefix
|
|
83
|
+
|
|
84
|
+
## Self-Check
|
|
85
|
+
|
|
86
|
+
Before finishing, verify you ONLY changed reference patterns:
|
|
87
|
+
|
|
88
|
+
- [ ] Did I change any hyperlinks? **If yes, revert.**
|
|
89
|
+
- [ ] Did I change any formatting (horizontal rules, whitespace, structure)? **If yes, revert.**
|
|
90
|
+
- [ ] Did I remove or add any sections? **If yes, revert.**
|
|
91
|
+
- [ ] Did I modify anything not matching the patterns in "Reference Patterns to Fix"? **If yes, revert.**
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Documentation Links
|
|
3
|
+
*
|
|
4
|
+
* Converts relative markdown links to repo-relative paths with .md extension.
|
|
5
|
+
* This ensures links work both in GitHub and on the Astro/Starlight site
|
|
6
|
+
* (the rehype plugin transforms /docs/path/file.md → /path/file/ at build time).
|
|
7
|
+
*
|
|
8
|
+
* - ./file.md → /docs/current/path/file.md
|
|
9
|
+
* - ../other/file.md → /docs/resolved/path/file.md
|
|
10
|
+
* - /path/file/ → /docs/path/file.md (or /docs/path/file/index.md if it's a directory)
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* node tools/fix-doc-links.js # Dry run (shows what would change)
|
|
14
|
+
* node tools/fix-doc-links.js --write # Actually write changes
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
const fs = require('node:fs');
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
|
|
20
|
+
const DOCS_ROOT = path.resolve(__dirname, '../docs');
|
|
21
|
+
const DRY_RUN = !process.argv.includes('--write');
|
|
22
|
+
|
|
23
|
+
// Match all markdown links; filtering (external, anchors, assets) happens in convertToRepoRelative.
|
|
24
|
+
// This intentionally matches broadly so the handler can make context-aware decisions.
|
|
25
|
+
const ALL_MARKDOWN_LINKS_REGEX = /\[([^\]]*)\]\(([^)]+)\)/g;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Get all markdown files in docs directory, excluding _* directories/files
|
|
29
|
+
*/
|
|
30
|
+
function getMarkdownFiles(dir) {
|
|
31
|
+
const files = [];
|
|
32
|
+
|
|
33
|
+
function walk(currentDir) {
|
|
34
|
+
const entries = fs.readdirSync(currentDir, { withFileTypes: true });
|
|
35
|
+
|
|
36
|
+
for (const entry of entries) {
|
|
37
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
38
|
+
|
|
39
|
+
// Skip underscore-prefixed entries
|
|
40
|
+
if (entry.name.startsWith('_')) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (entry.isDirectory()) {
|
|
45
|
+
walk(fullPath);
|
|
46
|
+
} else if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
47
|
+
files.push(fullPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
walk(dir);
|
|
53
|
+
return files;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Convert a markdown link href to repo-relative path with .md extension
|
|
58
|
+
*
|
|
59
|
+
* @param {string} href - The original href (e.g., "./file.md", "/path/to/page/", "/path/to/page/#anchor")
|
|
60
|
+
* @param {string} currentFilePath - Absolute path to the file containing this link
|
|
61
|
+
* @returns {string|null} - Repo-relative path (e.g., "/docs/path/to/file.md"), or null if shouldn't be converted
|
|
62
|
+
*/
|
|
63
|
+
function convertToRepoRelative(href, currentFilePath) {
|
|
64
|
+
// Skip external links (including protocol-relative URLs like //cdn.example.com)
|
|
65
|
+
if (href.includes('://') || href.startsWith('//') || href.startsWith('mailto:') || href.startsWith('tel:')) {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Skip anchor-only links
|
|
70
|
+
if (href.startsWith('#')) {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Extract anchor and query string if present
|
|
75
|
+
let anchor = '';
|
|
76
|
+
let query = '';
|
|
77
|
+
let pathPortion = href;
|
|
78
|
+
|
|
79
|
+
const hashIndex = href.indexOf('#');
|
|
80
|
+
const queryIndex = href.indexOf('?');
|
|
81
|
+
|
|
82
|
+
if (hashIndex !== -1 || queryIndex !== -1) {
|
|
83
|
+
const firstDelimiter = Math.min(hashIndex === -1 ? Infinity : hashIndex, queryIndex === -1 ? Infinity : queryIndex);
|
|
84
|
+
pathPortion = href.slice(0, Math.max(0, firstDelimiter));
|
|
85
|
+
|
|
86
|
+
const suffix = href.slice(Math.max(0, firstDelimiter));
|
|
87
|
+
const anchorInSuffix = suffix.indexOf('#');
|
|
88
|
+
|
|
89
|
+
if (suffix.startsWith('?')) {
|
|
90
|
+
if (anchorInSuffix === -1) {
|
|
91
|
+
query = suffix;
|
|
92
|
+
} else {
|
|
93
|
+
query = suffix.slice(0, Math.max(0, anchorInSuffix));
|
|
94
|
+
anchor = suffix.slice(Math.max(0, anchorInSuffix));
|
|
95
|
+
}
|
|
96
|
+
} else {
|
|
97
|
+
anchor = suffix;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Skip non-documentation links (images, external assets, etc.)
|
|
102
|
+
const ext = path.extname(pathPortion).toLowerCase();
|
|
103
|
+
if (
|
|
104
|
+
ext &&
|
|
105
|
+
ext !== '.md' &&
|
|
106
|
+
!['.md'].includes(ext) && // Has an extension that's not .md - skip unless it's a trailing slash path
|
|
107
|
+
!pathPortion.endsWith('/')
|
|
108
|
+
) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Check if original path ends with / (directory reference) BEFORE path.join normalizes it
|
|
113
|
+
const isDirectoryPath = pathPortion.endsWith('/');
|
|
114
|
+
|
|
115
|
+
let absolutePath;
|
|
116
|
+
|
|
117
|
+
if (pathPortion.startsWith('/docs/')) {
|
|
118
|
+
// Already repo-relative with /docs/ prefix
|
|
119
|
+
absolutePath = path.join(path.dirname(DOCS_ROOT), pathPortion);
|
|
120
|
+
} else if (pathPortion.startsWith('/')) {
|
|
121
|
+
// Site-relative (e.g., /tutorials/getting-started/) - resolve from docs root
|
|
122
|
+
absolutePath = path.join(DOCS_ROOT, pathPortion);
|
|
123
|
+
} else {
|
|
124
|
+
// Relative path (./, ../, or bare filename) - resolve from current file's directory
|
|
125
|
+
const currentDir = path.dirname(currentFilePath);
|
|
126
|
+
absolutePath = path.resolve(currentDir, pathPortion);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Convert to repo-relative path (with /docs/ prefix)
|
|
130
|
+
let repoRelative = '/docs/' + path.relative(DOCS_ROOT, absolutePath);
|
|
131
|
+
|
|
132
|
+
// Normalize path separators for Windows
|
|
133
|
+
repoRelative = repoRelative.split(path.sep).join('/');
|
|
134
|
+
|
|
135
|
+
// If original path was a directory reference (ended with /), check for index.md or file.md
|
|
136
|
+
if (isDirectoryPath) {
|
|
137
|
+
const relativeDir = repoRelative.slice(6); // Remove '/docs/'
|
|
138
|
+
|
|
139
|
+
// Handle root path case (relativeDir is empty or just '.')
|
|
140
|
+
const normalizedDir = relativeDir === '' || relativeDir === '.' ? '' : relativeDir;
|
|
141
|
+
const indexPath = path.join(DOCS_ROOT, normalizedDir, 'index.md');
|
|
142
|
+
const filePath = normalizedDir ? path.join(DOCS_ROOT, normalizedDir + '.md') : null;
|
|
143
|
+
|
|
144
|
+
if (fs.existsSync(indexPath)) {
|
|
145
|
+
// Avoid double slash when repoRelative is '/docs/' (root case)
|
|
146
|
+
repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
|
|
147
|
+
} else if (filePath && fs.existsSync(filePath)) {
|
|
148
|
+
repoRelative = repoRelative + '.md';
|
|
149
|
+
} else {
|
|
150
|
+
// Neither exists - default to index.md and let validation catch it
|
|
151
|
+
repoRelative = repoRelative.endsWith('/') ? repoRelative + 'index.md' : repoRelative + '/index.md';
|
|
152
|
+
}
|
|
153
|
+
} else if (!repoRelative.endsWith('.md')) {
|
|
154
|
+
// Path doesn't end with .md - add .md
|
|
155
|
+
repoRelative = repoRelative + '.md';
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return repoRelative + query + anchor;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Process a single markdown file, skipping links inside fenced code blocks
|
|
163
|
+
*
|
|
164
|
+
* @param {string} filePath - Absolute path to the file
|
|
165
|
+
* @returns {Object} - { changed: boolean, original: string, updated: string, changes: Array }
|
|
166
|
+
*/
|
|
167
|
+
function processFile(filePath) {
|
|
168
|
+
const original = fs.readFileSync(filePath, 'utf-8');
|
|
169
|
+
const changes = [];
|
|
170
|
+
|
|
171
|
+
// Extract fenced code blocks and replace with placeholders
|
|
172
|
+
const codeBlocks = [];
|
|
173
|
+
const CODE_PLACEHOLDER = '\u0000CODE_BLOCK_';
|
|
174
|
+
|
|
175
|
+
let contentWithPlaceholders = original.replaceAll(/```[\s\S]*?```/g, (match) => {
|
|
176
|
+
const index = codeBlocks.length;
|
|
177
|
+
codeBlocks.push(match);
|
|
178
|
+
return `${CODE_PLACEHOLDER}${index}\u0000`;
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
// Process links only in non-code-block content
|
|
182
|
+
contentWithPlaceholders = contentWithPlaceholders.replaceAll(ALL_MARKDOWN_LINKS_REGEX, (match, linkText, href) => {
|
|
183
|
+
const newHref = convertToRepoRelative(href, filePath);
|
|
184
|
+
|
|
185
|
+
// Skip if conversion returned null (external link, anchor, etc.)
|
|
186
|
+
if (newHref === null) {
|
|
187
|
+
return match;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Only record as change if actually different
|
|
191
|
+
if (newHref !== href) {
|
|
192
|
+
changes.push({ from: href, to: newHref });
|
|
193
|
+
return `[${linkText}](${newHref})`;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return match;
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Restore code blocks
|
|
200
|
+
const updated = contentWithPlaceholders.replaceAll(
|
|
201
|
+
new RegExp(`${CODE_PLACEHOLDER}(\\d+)\u0000`, 'g'),
|
|
202
|
+
(match, index) => codeBlocks[parseInt(index, 10)],
|
|
203
|
+
);
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
changed: changes.length > 0,
|
|
207
|
+
original,
|
|
208
|
+
updated,
|
|
209
|
+
changes,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Validate that a repo-relative link points to an existing file
|
|
215
|
+
*/
|
|
216
|
+
function validateLink(repoRelativePath) {
|
|
217
|
+
// Strip anchor/query
|
|
218
|
+
const checkPath = repoRelativePath.split('#')[0].split('?')[0];
|
|
219
|
+
|
|
220
|
+
// Remove /docs/ prefix to get path relative to DOCS_ROOT
|
|
221
|
+
const relativePath = checkPath.startsWith('/docs/') ? checkPath.slice(6) : checkPath.slice(1);
|
|
222
|
+
|
|
223
|
+
return fs.existsSync(path.join(DOCS_ROOT, relativePath));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Main execution
|
|
227
|
+
console.log(`\nScanning docs in: ${DOCS_ROOT}`);
|
|
228
|
+
console.log(`Mode: ${DRY_RUN ? 'DRY RUN (use --write to apply changes)' : 'WRITE MODE'}\n`);
|
|
229
|
+
|
|
230
|
+
const files = getMarkdownFiles(DOCS_ROOT);
|
|
231
|
+
console.log(`Found ${files.length} markdown files (excluding _* paths)\n`);
|
|
232
|
+
|
|
233
|
+
let totalChanges = 0;
|
|
234
|
+
let filesChanged = 0;
|
|
235
|
+
const brokenLinks = [];
|
|
236
|
+
|
|
237
|
+
for (const filePath of files) {
|
|
238
|
+
const relativePath = path.relative(DOCS_ROOT, filePath);
|
|
239
|
+
const result = processFile(filePath);
|
|
240
|
+
|
|
241
|
+
if (result.changed) {
|
|
242
|
+
filesChanged++;
|
|
243
|
+
totalChanges += result.changes.length;
|
|
244
|
+
|
|
245
|
+
console.log(`\n${relativePath}`);
|
|
246
|
+
for (const change of result.changes) {
|
|
247
|
+
const isValid = validateLink(change.to);
|
|
248
|
+
const status = isValid ? ' ' : '! ';
|
|
249
|
+
|
|
250
|
+
console.log(`${status} ${change.from}`);
|
|
251
|
+
console.log(` -> ${change.to}`);
|
|
252
|
+
|
|
253
|
+
if (!isValid) {
|
|
254
|
+
brokenLinks.push({
|
|
255
|
+
file: relativePath,
|
|
256
|
+
link: change.to,
|
|
257
|
+
original: change.from,
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
if (!DRY_RUN) {
|
|
263
|
+
fs.writeFileSync(filePath, result.updated, 'utf-8');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
console.log(`\n${'─'.repeat(60)}`);
|
|
269
|
+
console.log(`\nSummary:`);
|
|
270
|
+
console.log(` Files scanned: ${files.length}`);
|
|
271
|
+
console.log(` Files with changes: ${filesChanged}`);
|
|
272
|
+
console.log(` Total link updates: ${totalChanges}`);
|
|
273
|
+
|
|
274
|
+
if (brokenLinks.length > 0) {
|
|
275
|
+
console.log(`\n! Potential broken links (${brokenLinks.length}):`);
|
|
276
|
+
for (const bl of brokenLinks) {
|
|
277
|
+
console.log(` ${bl.file}: ${bl.link}`);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (DRY_RUN && totalChanges > 0) {
|
|
282
|
+
console.log(`\nRun with --write to apply these changes`);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
console.log('');
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BMAD Workflow Markdown Formatter
|
|
3
|
+
*
|
|
4
|
+
* Formats mixed markdown + XML workflow instruction files with:
|
|
5
|
+
* - 2-space XML indentation
|
|
6
|
+
* - Preserved markdown content
|
|
7
|
+
* - Proper tag nesting
|
|
8
|
+
* - Consistent formatting
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const fs = require('node:fs');
|
|
12
|
+
const path = require('node:path');
|
|
13
|
+
|
|
14
|
+
class WorkflowFormatter {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.indentSize = options.indentSize || 2;
|
|
17
|
+
this.preserveMarkdown = options.preserveMarkdown !== false;
|
|
18
|
+
this.verbose = options.verbose || false;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Format a workflow markdown file
|
|
23
|
+
*/
|
|
24
|
+
format(filePath) {
|
|
25
|
+
if (this.verbose) {
|
|
26
|
+
console.log(`Formatting: ${filePath}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
30
|
+
const formatted = this.formatContent(content);
|
|
31
|
+
|
|
32
|
+
// Only write if content changed
|
|
33
|
+
if (content === formatted) {
|
|
34
|
+
if (this.verbose) {
|
|
35
|
+
console.log(`- No changes: ${filePath}`);
|
|
36
|
+
}
|
|
37
|
+
return false;
|
|
38
|
+
} else {
|
|
39
|
+
fs.writeFileSync(filePath, formatted, 'utf8');
|
|
40
|
+
if (this.verbose) {
|
|
41
|
+
console.log(`✓ Formatted: ${filePath}`);
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Format content string with stateful indentation tracking
|
|
49
|
+
*/
|
|
50
|
+
formatContent(content) {
|
|
51
|
+
const lines = content.split('\n');
|
|
52
|
+
const formatted = [];
|
|
53
|
+
let indentLevel = 0;
|
|
54
|
+
let inCodeBlock = false;
|
|
55
|
+
let checkBlockDepth = 0; // Track nested check blocks
|
|
56
|
+
|
|
57
|
+
for (let i = 0; i < lines.length; i++) {
|
|
58
|
+
const line = lines[i];
|
|
59
|
+
const trimmed = line.trim();
|
|
60
|
+
|
|
61
|
+
// Track code blocks (don't format inside them)
|
|
62
|
+
if (trimmed.startsWith('```')) {
|
|
63
|
+
if (inCodeBlock) {
|
|
64
|
+
inCodeBlock = false;
|
|
65
|
+
} else {
|
|
66
|
+
inCodeBlock = true;
|
|
67
|
+
}
|
|
68
|
+
formatted.push(line);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Don't format inside code blocks
|
|
73
|
+
if (inCodeBlock) {
|
|
74
|
+
formatted.push(line);
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Handle XML tags
|
|
79
|
+
if (this.isXMLLine(trimmed)) {
|
|
80
|
+
const result = this.formatXMLLine(trimmed, indentLevel, checkBlockDepth, i, lines);
|
|
81
|
+
formatted.push(result.line);
|
|
82
|
+
indentLevel = result.nextIndent;
|
|
83
|
+
checkBlockDepth = result.nextCheckDepth;
|
|
84
|
+
} else if (trimmed === '') {
|
|
85
|
+
// Preserve blank lines
|
|
86
|
+
formatted.push('');
|
|
87
|
+
} else {
|
|
88
|
+
// Markdown content - preserve as-is but maintain current indent if inside XML
|
|
89
|
+
formatted.push(line);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return formatted.join('\n');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Check if line contains XML tag
|
|
98
|
+
*/
|
|
99
|
+
isXMLLine(line) {
|
|
100
|
+
return /^<[a-zA-Z-]+(\s|>|\/)/.test(line) || /^<\/[a-zA-Z-]+>/.test(line);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Format a single XML line with context awareness
|
|
105
|
+
*/
|
|
106
|
+
formatXMLLine(line, currentIndent, checkDepth, lineIndex, allLines) {
|
|
107
|
+
const trimmed = line.trim();
|
|
108
|
+
let indent = currentIndent;
|
|
109
|
+
let nextIndent = currentIndent;
|
|
110
|
+
let nextCheckDepth = checkDepth;
|
|
111
|
+
|
|
112
|
+
// Get the tag name
|
|
113
|
+
const tagMatch = trimmed.match(/^<\/?([a-zA-Z-]+)/);
|
|
114
|
+
const tagName = tagMatch ? tagMatch[1] : '';
|
|
115
|
+
|
|
116
|
+
// Closing tag - decrease indent before this line
|
|
117
|
+
if (trimmed.startsWith('</')) {
|
|
118
|
+
indent = Math.max(0, currentIndent - 1);
|
|
119
|
+
nextIndent = indent;
|
|
120
|
+
|
|
121
|
+
// If closing a step, reset check depth
|
|
122
|
+
if (tagName === 'step' || tagName === 'workflow') {
|
|
123
|
+
nextCheckDepth = 0;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Self-closing tags (opens and closes on same line)
|
|
127
|
+
// EXCEPT <check> tags which create logical blocks
|
|
128
|
+
else if (this.isSelfClosingTag(trimmed) && tagName !== 'check') {
|
|
129
|
+
// These don't change indent level
|
|
130
|
+
indent = currentIndent;
|
|
131
|
+
nextIndent = currentIndent;
|
|
132
|
+
}
|
|
133
|
+
// Opening tags
|
|
134
|
+
else if (trimmed.startsWith('<')) {
|
|
135
|
+
// Check if this is a <check> tag - these create logical blocks
|
|
136
|
+
if (tagName === 'check') {
|
|
137
|
+
indent = currentIndent;
|
|
138
|
+
// Check tags increase indent for following content
|
|
139
|
+
nextIndent = currentIndent + 1;
|
|
140
|
+
nextCheckDepth = checkDepth + 1;
|
|
141
|
+
}
|
|
142
|
+
// <action> tags inside check blocks stay at current indent
|
|
143
|
+
else if (tagName === 'action' && checkDepth > 0) {
|
|
144
|
+
indent = currentIndent;
|
|
145
|
+
nextIndent = currentIndent; // Don't increase further
|
|
146
|
+
}
|
|
147
|
+
// Other tags close check blocks and return to structural level
|
|
148
|
+
else if (checkDepth > 0) {
|
|
149
|
+
// Close all check blocks - return to base structural level
|
|
150
|
+
indent = Math.max(0, currentIndent - checkDepth);
|
|
151
|
+
nextIndent = indent + 1;
|
|
152
|
+
nextCheckDepth = 0;
|
|
153
|
+
}
|
|
154
|
+
// Regular opening tags (no check blocks active)
|
|
155
|
+
else {
|
|
156
|
+
indent = currentIndent;
|
|
157
|
+
nextIndent = currentIndent + 1;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const indentStr = ' '.repeat(indent * this.indentSize);
|
|
162
|
+
return {
|
|
163
|
+
line: indentStr + trimmed,
|
|
164
|
+
nextIndent: nextIndent,
|
|
165
|
+
nextCheckDepth: nextCheckDepth,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Check if tag opens and closes on same line
|
|
171
|
+
*/
|
|
172
|
+
isSelfClosingTag(line) {
|
|
173
|
+
// Self-closing with />
|
|
174
|
+
if (line.endsWith('/>')) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
// Opens and closes on same line: <tag>content</tag>
|
|
178
|
+
const match = line.match(/^<([a-zA-Z-]+)(\s[^>]*)?>.*<\/\1>$/);
|
|
179
|
+
return match !== null;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Check if tag is a block-level structural tag
|
|
184
|
+
*/
|
|
185
|
+
isBlockLevelTag(tagName) {
|
|
186
|
+
return ['step', 'workflow', 'check'].includes(tagName);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* CLI Entry Point
|
|
192
|
+
*/
|
|
193
|
+
function main() {
|
|
194
|
+
const args = process.argv.slice(2);
|
|
195
|
+
|
|
196
|
+
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
197
|
+
console.log(`
|
|
198
|
+
BMAD Workflow Markdown Formatter
|
|
199
|
+
|
|
200
|
+
Usage:
|
|
201
|
+
node format-workflow-md.js <file-pattern> [options]
|
|
202
|
+
|
|
203
|
+
Options:
|
|
204
|
+
--verbose, -v Verbose output
|
|
205
|
+
--check, -c Check formatting without writing (exit 1 if changes needed)
|
|
206
|
+
--help, -h Show this help
|
|
207
|
+
|
|
208
|
+
Examples:
|
|
209
|
+
node format-workflow-md.js src/**/instructions.md
|
|
210
|
+
node format-workflow-md.js "src/modules/bmb/**/*.md" --verbose
|
|
211
|
+
node format-workflow-md.js file.md --check
|
|
212
|
+
`);
|
|
213
|
+
process.exit(0);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const verbose = args.includes('--verbose') || args.includes('-v');
|
|
217
|
+
const check = args.includes('--check') || args.includes('-c');
|
|
218
|
+
|
|
219
|
+
// Remove flags from args
|
|
220
|
+
const files = args.filter((arg) => !arg.startsWith('-'));
|
|
221
|
+
|
|
222
|
+
const formatter = new WorkflowFormatter({ verbose });
|
|
223
|
+
let hasChanges = false;
|
|
224
|
+
let formattedCount = 0;
|
|
225
|
+
|
|
226
|
+
// Process files
|
|
227
|
+
for (const pattern of files) {
|
|
228
|
+
// For now, treat as direct file path
|
|
229
|
+
// TODO: Add glob support for patterns
|
|
230
|
+
if (fs.existsSync(pattern)) {
|
|
231
|
+
const stat = fs.statSync(pattern);
|
|
232
|
+
if (stat.isFile()) {
|
|
233
|
+
const changed = formatter.format(pattern);
|
|
234
|
+
if (changed) {
|
|
235
|
+
hasChanges = true;
|
|
236
|
+
formattedCount++;
|
|
237
|
+
}
|
|
238
|
+
} else if (stat.isDirectory()) {
|
|
239
|
+
console.error(`Error: ${pattern} is a directory. Please specify file paths.`);
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
console.error(`Error: File not found: ${pattern}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
if (verbose || formattedCount > 0) {
|
|
247
|
+
console.log(`\nFormatted ${formattedCount} file(s)`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
if (check && hasChanges) {
|
|
251
|
+
console.error('\n❌ Some files need formatting. Run without --check to format.');
|
|
252
|
+
process.exit(1);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
process.exit(0);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// Run if called directly
|
|
259
|
+
if (require.main === module) {
|
|
260
|
+
main();
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
module.exports = { WorkflowFormatter };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Escape XML special characters in a string
|
|
3
|
+
* @param {string} text - The text to escape
|
|
4
|
+
* @returns {string} The escaped text
|
|
5
|
+
*/
|
|
6
|
+
function escapeXml(text) {
|
|
7
|
+
if (!text) return '';
|
|
8
|
+
return text.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", ''');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
module.exports = {
|
|
12
|
+
escapeXml,
|
|
13
|
+
};
|