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,809 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @clack/prompts wrapper for BMAD CLI
|
|
3
|
+
*
|
|
4
|
+
* This module provides a unified interface for CLI prompts using @clack/prompts.
|
|
5
|
+
* It replaces Inquirer.js to fix Windows arrow key navigation issues (libuv #852).
|
|
6
|
+
*
|
|
7
|
+
* @module prompts
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
let _clack = null;
|
|
11
|
+
let _clackCore = null;
|
|
12
|
+
let _picocolors = null;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Lazy-load @clack/prompts (ESM module)
|
|
16
|
+
* @returns {Promise<Object>} The clack prompts module
|
|
17
|
+
*/
|
|
18
|
+
async function getClack() {
|
|
19
|
+
if (!_clack) {
|
|
20
|
+
_clack = await import('@clack/prompts');
|
|
21
|
+
}
|
|
22
|
+
return _clack;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Lazy-load @clack/core (ESM module)
|
|
27
|
+
* @returns {Promise<Object>} The clack core module
|
|
28
|
+
*/
|
|
29
|
+
async function getClackCore() {
|
|
30
|
+
if (!_clackCore) {
|
|
31
|
+
_clackCore = await import('@clack/core');
|
|
32
|
+
}
|
|
33
|
+
return _clackCore;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Lazy-load picocolors
|
|
38
|
+
* @returns {Promise<Object>} The picocolors module
|
|
39
|
+
*/
|
|
40
|
+
async function getPicocolors() {
|
|
41
|
+
if (!_picocolors) {
|
|
42
|
+
_picocolors = (await import('picocolors')).default;
|
|
43
|
+
}
|
|
44
|
+
return _picocolors;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Handle user cancellation gracefully
|
|
49
|
+
* @param {any} value - The value to check
|
|
50
|
+
* @param {string} [message='Operation cancelled'] - Message to display
|
|
51
|
+
* @returns {boolean} True if cancelled
|
|
52
|
+
*/
|
|
53
|
+
async function handleCancel(value, message = 'Operation cancelled') {
|
|
54
|
+
const clack = await getClack();
|
|
55
|
+
if (clack.isCancel(value)) {
|
|
56
|
+
clack.cancel(message);
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Display intro message
|
|
64
|
+
* @param {string} message - The intro message
|
|
65
|
+
*/
|
|
66
|
+
async function intro(message) {
|
|
67
|
+
const clack = await getClack();
|
|
68
|
+
clack.intro(message);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* Display outro message
|
|
73
|
+
* @param {string} message - The outro message
|
|
74
|
+
*/
|
|
75
|
+
async function outro(message) {
|
|
76
|
+
const clack = await getClack();
|
|
77
|
+
clack.outro(message);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Display a note/info box
|
|
82
|
+
* @param {string} message - The note content
|
|
83
|
+
* @param {string} [title] - Optional title
|
|
84
|
+
*/
|
|
85
|
+
async function note(message, title) {
|
|
86
|
+
const clack = await getClack();
|
|
87
|
+
clack.note(message, title);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Display a spinner for async operations
|
|
92
|
+
* Wraps @clack/prompts spinner with isSpinning state tracking
|
|
93
|
+
* @returns {Object} Spinner controller with start, stop, message, error, cancel, clear, isSpinning
|
|
94
|
+
*/
|
|
95
|
+
async function spinner() {
|
|
96
|
+
const clack = await getClack();
|
|
97
|
+
const s = clack.spinner();
|
|
98
|
+
let spinning = false;
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
start: (msg) => {
|
|
102
|
+
if (spinning) {
|
|
103
|
+
s.message(msg);
|
|
104
|
+
} else {
|
|
105
|
+
spinning = true;
|
|
106
|
+
s.start(msg);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
stop: (msg) => {
|
|
110
|
+
if (spinning) {
|
|
111
|
+
spinning = false;
|
|
112
|
+
s.stop(msg);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
message: (msg) => {
|
|
116
|
+
if (spinning) s.message(msg);
|
|
117
|
+
},
|
|
118
|
+
error: (msg) => {
|
|
119
|
+
spinning = false;
|
|
120
|
+
s.error(msg);
|
|
121
|
+
},
|
|
122
|
+
cancel: (msg) => {
|
|
123
|
+
spinning = false;
|
|
124
|
+
s.cancel(msg);
|
|
125
|
+
},
|
|
126
|
+
clear: () => {
|
|
127
|
+
spinning = false;
|
|
128
|
+
s.clear();
|
|
129
|
+
},
|
|
130
|
+
get isSpinning() {
|
|
131
|
+
return spinning;
|
|
132
|
+
},
|
|
133
|
+
get isCancelled() {
|
|
134
|
+
return s.isCancelled;
|
|
135
|
+
},
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
* Single-select prompt (replaces Inquirer 'list' type)
|
|
141
|
+
* @param {Object} options - Prompt options
|
|
142
|
+
* @param {string} options.message - The question to ask
|
|
143
|
+
* @param {Array} options.choices - Array of choices [{name, value, hint?}]
|
|
144
|
+
* @param {any} [options.default] - Default selected value
|
|
145
|
+
* @returns {Promise<any>} Selected value
|
|
146
|
+
*/
|
|
147
|
+
async function select(options) {
|
|
148
|
+
const clack = await getClack();
|
|
149
|
+
|
|
150
|
+
// Convert Inquirer-style choices to clack format
|
|
151
|
+
// Handle both object choices {name, value, hint} and primitive choices (string/number)
|
|
152
|
+
const clackOptions = options.choices
|
|
153
|
+
.filter((c) => c.type !== 'separator') // Skip separators for now
|
|
154
|
+
.map((choice) => {
|
|
155
|
+
if (typeof choice === 'string' || typeof choice === 'number') {
|
|
156
|
+
return { value: choice, label: String(choice) };
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
value: choice.value === undefined ? choice.name : choice.value,
|
|
160
|
+
label: choice.name || choice.label || String(choice.value),
|
|
161
|
+
hint: choice.hint || choice.description,
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
// Find initial value
|
|
166
|
+
let initialValue;
|
|
167
|
+
if (options.default !== undefined) {
|
|
168
|
+
initialValue = options.default;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const result = await clack.select({
|
|
172
|
+
message: options.message,
|
|
173
|
+
options: clackOptions,
|
|
174
|
+
initialValue,
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
await handleCancel(result);
|
|
178
|
+
return result;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Multi-select prompt (replaces Inquirer 'checkbox' type)
|
|
183
|
+
* @param {Object} options - Prompt options
|
|
184
|
+
* @param {string} options.message - The question to ask
|
|
185
|
+
* @param {Array} options.choices - Array of choices [{name, value, checked?, hint?}]
|
|
186
|
+
* @param {boolean} [options.required=false] - Whether at least one must be selected
|
|
187
|
+
* @returns {Promise<Array>} Array of selected values
|
|
188
|
+
*/
|
|
189
|
+
async function multiselect(options) {
|
|
190
|
+
const clack = await getClack();
|
|
191
|
+
|
|
192
|
+
// Support both clack-native (options) and Inquirer-style (choices) APIs
|
|
193
|
+
let clackOptions;
|
|
194
|
+
let initialValues;
|
|
195
|
+
|
|
196
|
+
if (options.options) {
|
|
197
|
+
// Native clack format: options with label/value
|
|
198
|
+
clackOptions = options.options;
|
|
199
|
+
initialValues = options.initialValues || [];
|
|
200
|
+
} else {
|
|
201
|
+
// Convert Inquirer-style choices to clack format
|
|
202
|
+
// Handle both object choices {name, value, hint} and primitive choices (string/number)
|
|
203
|
+
clackOptions = options.choices
|
|
204
|
+
.filter((c) => c.type !== 'separator') // Skip separators
|
|
205
|
+
.map((choice) => {
|
|
206
|
+
if (typeof choice === 'string' || typeof choice === 'number') {
|
|
207
|
+
return { value: choice, label: String(choice) };
|
|
208
|
+
}
|
|
209
|
+
return {
|
|
210
|
+
value: choice.value === undefined ? choice.name : choice.value,
|
|
211
|
+
label: choice.name || choice.label || String(choice.value),
|
|
212
|
+
hint: choice.hint || choice.description,
|
|
213
|
+
};
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Find initial values (pre-checked items)
|
|
217
|
+
initialValues = options.choices
|
|
218
|
+
.filter((c) => c.checked && c.type !== 'separator')
|
|
219
|
+
.map((c) => (c.value === undefined ? c.name : c.value));
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const result = await clack.multiselect({
|
|
223
|
+
message: options.message,
|
|
224
|
+
options: clackOptions,
|
|
225
|
+
initialValues: initialValues.length > 0 ? initialValues : undefined,
|
|
226
|
+
required: options.required || false,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
await handleCancel(result);
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Default filter function for autocomplete - case-insensitive label matching
|
|
235
|
+
* @param {string} search - Search string
|
|
236
|
+
* @param {Object} option - Option object with label
|
|
237
|
+
* @returns {boolean} Whether the option matches
|
|
238
|
+
*/
|
|
239
|
+
function defaultAutocompleteFilter(search, option) {
|
|
240
|
+
const label = option.label ?? String(option.value ?? '');
|
|
241
|
+
return label.toLowerCase().includes(search.toLowerCase());
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Autocomplete multi-select prompt with type-ahead filtering
|
|
246
|
+
* Custom implementation that always shows "Space/Tab:" in the hint
|
|
247
|
+
* @param {Object} options - Prompt options
|
|
248
|
+
* @param {string} options.message - The question to ask
|
|
249
|
+
* @param {Array} options.options - Array of choices [{label, value, hint?}]
|
|
250
|
+
* @param {string} [options.placeholder] - Placeholder text for search input
|
|
251
|
+
* @param {Array} [options.initialValues] - Array of initially selected values
|
|
252
|
+
* @param {boolean} [options.required=false] - Whether at least one must be selected
|
|
253
|
+
* @param {number} [options.maxItems=5] - Maximum visible items in scrollable list
|
|
254
|
+
* @param {Function} [options.filter] - Custom filter function (search, option) => boolean
|
|
255
|
+
* @param {Array} [options.lockedValues] - Values that are always selected and cannot be toggled off
|
|
256
|
+
* @returns {Promise<Array>} Array of selected values
|
|
257
|
+
*/
|
|
258
|
+
async function autocompleteMultiselect(options) {
|
|
259
|
+
const core = await getClackCore();
|
|
260
|
+
const clack = await getClack();
|
|
261
|
+
const color = await getPicocolors();
|
|
262
|
+
|
|
263
|
+
const filterFn = options.filter ?? defaultAutocompleteFilter;
|
|
264
|
+
const lockedSet = new Set(options.lockedValues || []);
|
|
265
|
+
|
|
266
|
+
const prompt = new core.AutocompletePrompt({
|
|
267
|
+
options: options.options,
|
|
268
|
+
multiple: true,
|
|
269
|
+
filter: filterFn,
|
|
270
|
+
validate: () => {
|
|
271
|
+
if (options.required && prompt.selectedValues.length === 0) {
|
|
272
|
+
return 'Please select at least one item';
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
initialValue: [...new Set([...(options.initialValues || []), ...(options.lockedValues || [])])],
|
|
276
|
+
render() {
|
|
277
|
+
const barColor = this.state === 'error' ? color.yellow : color.cyan;
|
|
278
|
+
const bar = barColor(clack.S_BAR);
|
|
279
|
+
const barEnd = barColor(clack.S_BAR_END);
|
|
280
|
+
|
|
281
|
+
const title = `${color.gray(clack.S_BAR)}\n${clack.symbol(this.state)} ${options.message}\n`;
|
|
282
|
+
|
|
283
|
+
const userInput = this.userInput;
|
|
284
|
+
const placeholder = options.placeholder || 'Type to search...';
|
|
285
|
+
const hasPlaceholder = userInput === '' && placeholder !== undefined;
|
|
286
|
+
|
|
287
|
+
// Show placeholder or user input with cursor
|
|
288
|
+
const searchDisplay =
|
|
289
|
+
this.isNavigating || hasPlaceholder ? color.dim(hasPlaceholder ? placeholder : userInput) : this.userInputWithCursor;
|
|
290
|
+
|
|
291
|
+
const allOptions = this.options;
|
|
292
|
+
const matchCount =
|
|
293
|
+
this.filteredOptions.length === allOptions.length
|
|
294
|
+
? ''
|
|
295
|
+
: color.dim(` (${this.filteredOptions.length} match${this.filteredOptions.length === 1 ? '' : 'es'})`);
|
|
296
|
+
|
|
297
|
+
// Render option with checkbox
|
|
298
|
+
const renderOption = (opt, isHighlighted) => {
|
|
299
|
+
const isSelected = this.selectedValues.includes(opt.value);
|
|
300
|
+
const isLocked = lockedSet.has(opt.value);
|
|
301
|
+
const label = opt.label ?? String(opt.value ?? '');
|
|
302
|
+
const hintText = opt.hint && isHighlighted ? color.dim(` (${opt.hint})`) : '';
|
|
303
|
+
|
|
304
|
+
let checkbox;
|
|
305
|
+
if (isLocked) {
|
|
306
|
+
checkbox = color.green(clack.S_CHECKBOX_SELECTED);
|
|
307
|
+
const lockHint = color.dim(' (always installed)');
|
|
308
|
+
return isHighlighted ? `${checkbox} ${label}${lockHint}` : `${checkbox} ${color.dim(label)}${lockHint}`;
|
|
309
|
+
}
|
|
310
|
+
checkbox = isSelected ? color.green(clack.S_CHECKBOX_SELECTED) : color.dim(clack.S_CHECKBOX_INACTIVE);
|
|
311
|
+
return isHighlighted ? `${checkbox} ${label}${hintText}` : `${checkbox} ${color.dim(label)}`;
|
|
312
|
+
};
|
|
313
|
+
|
|
314
|
+
switch (this.state) {
|
|
315
|
+
case 'submit': {
|
|
316
|
+
return `${title}${color.gray(clack.S_BAR)} ${color.dim(`${this.selectedValues.length} items selected`)}`;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
case 'cancel': {
|
|
320
|
+
return `${title}${color.gray(clack.S_BAR)} ${color.strikethrough(color.dim(userInput))}`;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
default: {
|
|
324
|
+
// Always show "SPACE:" regardless of isNavigating state
|
|
325
|
+
const hints = [`${color.dim('↑/↓')} to navigate`, `${color.dim('TAB/SPACE:')} select`, `${color.dim('ENTER:')} confirm`];
|
|
326
|
+
|
|
327
|
+
const noMatchesLine = this.filteredOptions.length === 0 && userInput ? [`${bar} ${color.yellow('No matches found')}`] : [];
|
|
328
|
+
|
|
329
|
+
const errorLine = this.state === 'error' ? [`${bar} ${color.yellow(this.error)}`] : [];
|
|
330
|
+
|
|
331
|
+
const headerLines = [...`${title}${bar}`.split('\n'), `${bar} ${searchDisplay}${matchCount}`, ...noMatchesLine, ...errorLine];
|
|
332
|
+
|
|
333
|
+
const footerLines = [`${bar} ${color.dim(hints.join(' • '))}`, `${barEnd}`];
|
|
334
|
+
|
|
335
|
+
const optionLines = clack.limitOptions({
|
|
336
|
+
cursor: this.cursor,
|
|
337
|
+
options: this.filteredOptions,
|
|
338
|
+
style: renderOption,
|
|
339
|
+
maxItems: options.maxItems || 5,
|
|
340
|
+
output: options.output,
|
|
341
|
+
rowPadding: headerLines.length + footerLines.length,
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
return [...headerLines, ...optionLines.map((line) => `${bar} ${line}`), ...footerLines].join('\n');
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
// Prevent locked values from being toggled off
|
|
351
|
+
if (lockedSet.size > 0) {
|
|
352
|
+
const originalToggle = prompt.toggleSelected.bind(prompt);
|
|
353
|
+
prompt.toggleSelected = function (value) {
|
|
354
|
+
// If locked and already selected, skip the toggle (would deselect)
|
|
355
|
+
if (lockedSet.has(value) && this.selectedValues.includes(value)) {
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
originalToggle(value);
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// === FIX: Make SPACE always act as selection key (not search input) ===
|
|
363
|
+
// Override _isActionKey to treat SPACE like TAB - always an action key
|
|
364
|
+
// This prevents SPACE from being added to the search input
|
|
365
|
+
const originalIsActionKey = prompt._isActionKey.bind(prompt);
|
|
366
|
+
prompt._isActionKey = function (char, key) {
|
|
367
|
+
if (key && key.name === 'space') {
|
|
368
|
+
return true;
|
|
369
|
+
}
|
|
370
|
+
return originalIsActionKey(char, key);
|
|
371
|
+
};
|
|
372
|
+
|
|
373
|
+
// Handle SPACE toggle when NOT navigating (internal code only handles it when isNavigating=true)
|
|
374
|
+
prompt.on('key', (char, key) => {
|
|
375
|
+
if (key && key.name === 'space' && !prompt.isNavigating) {
|
|
376
|
+
const focused = prompt.filteredOptions[prompt.cursor];
|
|
377
|
+
if (focused) prompt.toggleSelected(focused.value);
|
|
378
|
+
}
|
|
379
|
+
});
|
|
380
|
+
// === END FIX ===
|
|
381
|
+
|
|
382
|
+
const result = await prompt.prompt();
|
|
383
|
+
await handleCancel(result);
|
|
384
|
+
return result;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
/**
|
|
388
|
+
* Confirm prompt (replaces Inquirer 'confirm' type)
|
|
389
|
+
* @param {Object} options - Prompt options
|
|
390
|
+
* @param {string} options.message - The question to ask
|
|
391
|
+
* @param {boolean} [options.default=true] - Default value
|
|
392
|
+
* @returns {Promise<boolean>} User's answer
|
|
393
|
+
*/
|
|
394
|
+
async function confirm(options) {
|
|
395
|
+
const clack = await getClack();
|
|
396
|
+
|
|
397
|
+
const result = await clack.confirm({
|
|
398
|
+
message: options.message,
|
|
399
|
+
initialValue: options.default === undefined ? true : options.default,
|
|
400
|
+
});
|
|
401
|
+
|
|
402
|
+
await handleCancel(result);
|
|
403
|
+
return result;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Text input prompt with Tab-to-fill-placeholder support (replaces Inquirer 'input' type)
|
|
408
|
+
*
|
|
409
|
+
* This custom implementation restores the Tab-to-fill-placeholder behavior that was
|
|
410
|
+
* intentionally removed in @clack/prompts v1.0.0 (placeholder became purely visual).
|
|
411
|
+
* Uses @clack/core's TextPrompt primitive with custom key handling.
|
|
412
|
+
*
|
|
413
|
+
* @param {Object} options - Prompt options
|
|
414
|
+
* @param {string} options.message - The question to ask
|
|
415
|
+
* @param {string} [options.default] - Default value
|
|
416
|
+
* @param {string} [options.placeholder] - Placeholder text (defaults to options.default if not provided)
|
|
417
|
+
* @param {Function} [options.validate] - Validation function
|
|
418
|
+
* @returns {Promise<string>} User's input
|
|
419
|
+
*/
|
|
420
|
+
async function text(options) {
|
|
421
|
+
const core = await getClackCore();
|
|
422
|
+
const color = await getPicocolors();
|
|
423
|
+
|
|
424
|
+
// Use default as placeholder if placeholder not explicitly provided
|
|
425
|
+
// This shows the default value as grayed-out hint text
|
|
426
|
+
const placeholder = options.placeholder === undefined ? options.default : options.placeholder;
|
|
427
|
+
const defaultValue = options.default;
|
|
428
|
+
|
|
429
|
+
const prompt = new core.TextPrompt({
|
|
430
|
+
defaultValue,
|
|
431
|
+
validate: options.validate,
|
|
432
|
+
render() {
|
|
433
|
+
const title = `${color.gray('◆')} ${options.message}`;
|
|
434
|
+
|
|
435
|
+
// Show placeholder as dim text when input is empty
|
|
436
|
+
let valueDisplay;
|
|
437
|
+
if (this.state === 'error') {
|
|
438
|
+
valueDisplay = color.yellow(this.userInputWithCursor);
|
|
439
|
+
} else if (this.userInput) {
|
|
440
|
+
valueDisplay = this.userInputWithCursor;
|
|
441
|
+
} else if (placeholder) {
|
|
442
|
+
// Show placeholder with cursor indicator when empty
|
|
443
|
+
valueDisplay = `${color.inverse(color.hidden('_'))}${color.dim(placeholder)}`;
|
|
444
|
+
} else {
|
|
445
|
+
valueDisplay = color.inverse(color.hidden('_'));
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
const bar = color.gray('│');
|
|
449
|
+
|
|
450
|
+
// Handle different states
|
|
451
|
+
if (this.state === 'submit') {
|
|
452
|
+
return `${color.gray('◇')} ${options.message}\n${bar} ${color.dim(this.value || defaultValue || '')}`;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (this.state === 'cancel') {
|
|
456
|
+
return `${color.gray('◇')} ${options.message}\n${bar} ${color.strikethrough(color.dim(this.userInput || ''))}`;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
if (this.state === 'error') {
|
|
460
|
+
return `${color.yellow('▲')} ${options.message}\n${bar} ${valueDisplay}\n${color.yellow('│')} ${color.yellow(this.error)}`;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
return `${title}\n${bar} ${valueDisplay}\n${bar}`;
|
|
464
|
+
},
|
|
465
|
+
});
|
|
466
|
+
|
|
467
|
+
// Add Tab key handler to fill placeholder into input
|
|
468
|
+
prompt.on('key', (char) => {
|
|
469
|
+
if (char === '\t' && placeholder && !prompt.userInput) {
|
|
470
|
+
// Use _setUserInput with write=true to populate the readline and update internal state
|
|
471
|
+
prompt._setUserInput(placeholder, true);
|
|
472
|
+
}
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
const result = await prompt.prompt();
|
|
476
|
+
await handleCancel(result);
|
|
477
|
+
|
|
478
|
+
// TextPrompt's finalize handler already applies defaultValue for empty input
|
|
479
|
+
return result;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/**
|
|
483
|
+
* Password input prompt (replaces Inquirer 'password' type)
|
|
484
|
+
* @param {Object} options - Prompt options
|
|
485
|
+
* @param {string} options.message - The question to ask
|
|
486
|
+
* @param {Function} [options.validate] - Validation function
|
|
487
|
+
* @returns {Promise<string>} User's input
|
|
488
|
+
*/
|
|
489
|
+
async function password(options) {
|
|
490
|
+
const clack = await getClack();
|
|
491
|
+
|
|
492
|
+
const result = await clack.password({
|
|
493
|
+
message: options.message,
|
|
494
|
+
validate: options.validate,
|
|
495
|
+
});
|
|
496
|
+
|
|
497
|
+
await handleCancel(result);
|
|
498
|
+
return result;
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Group multiple prompts together
|
|
503
|
+
* @param {Object} prompts - Object of prompt functions
|
|
504
|
+
* @param {Object} [options] - Group options
|
|
505
|
+
* @returns {Promise<Object>} Object with all answers
|
|
506
|
+
*/
|
|
507
|
+
async function group(prompts, options = {}) {
|
|
508
|
+
const clack = await getClack();
|
|
509
|
+
|
|
510
|
+
const result = await clack.group(prompts, {
|
|
511
|
+
onCancel: () => {
|
|
512
|
+
clack.cancel('Operation cancelled');
|
|
513
|
+
process.exit(0);
|
|
514
|
+
},
|
|
515
|
+
...options,
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
return result;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
/**
|
|
522
|
+
* Run tasks with spinner feedback
|
|
523
|
+
* @param {Array} tasks - Array of task objects [{title, task, enabled?}]
|
|
524
|
+
* @returns {Promise<void>}
|
|
525
|
+
*/
|
|
526
|
+
async function tasks(taskList) {
|
|
527
|
+
const clack = await getClack();
|
|
528
|
+
await clack.tasks(taskList);
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
/**
|
|
532
|
+
* Log messages with styling
|
|
533
|
+
*/
|
|
534
|
+
const log = {
|
|
535
|
+
async info(message) {
|
|
536
|
+
const clack = await getClack();
|
|
537
|
+
clack.log.info(message);
|
|
538
|
+
},
|
|
539
|
+
async success(message) {
|
|
540
|
+
const clack = await getClack();
|
|
541
|
+
clack.log.success(message);
|
|
542
|
+
},
|
|
543
|
+
async warn(message) {
|
|
544
|
+
const clack = await getClack();
|
|
545
|
+
clack.log.warn(message);
|
|
546
|
+
},
|
|
547
|
+
async error(message) {
|
|
548
|
+
const clack = await getClack();
|
|
549
|
+
clack.log.error(message);
|
|
550
|
+
},
|
|
551
|
+
async message(message) {
|
|
552
|
+
const clack = await getClack();
|
|
553
|
+
clack.log.message(message);
|
|
554
|
+
},
|
|
555
|
+
async step(message) {
|
|
556
|
+
const clack = await getClack();
|
|
557
|
+
clack.log.step(message);
|
|
558
|
+
},
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Display cancellation message
|
|
563
|
+
* @param {string} [message='Operation cancelled'] - The cancellation message
|
|
564
|
+
*/
|
|
565
|
+
async function cancel(message = 'Operation cancelled') {
|
|
566
|
+
const clack = await getClack();
|
|
567
|
+
clack.cancel(message);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Display content in a styled box
|
|
572
|
+
* @param {string} content - The box content
|
|
573
|
+
* @param {string} [title] - Optional title
|
|
574
|
+
* @param {Object} [options] - Box options (contentAlign, titleAlign, width, rounded, formatBorder, etc.)
|
|
575
|
+
*/
|
|
576
|
+
async function box(content, title, options) {
|
|
577
|
+
const clack = await getClack();
|
|
578
|
+
clack.box(content, title, options);
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
/**
|
|
582
|
+
* Create a progress bar for visualizing task completion
|
|
583
|
+
* @param {Object} [options] - Progress options (max, style, etc.)
|
|
584
|
+
* @returns {Promise<Object>} Progress controller with start, advance, stop methods
|
|
585
|
+
*/
|
|
586
|
+
async function progress(options) {
|
|
587
|
+
const clack = await getClack();
|
|
588
|
+
return clack.progress(options);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* Create a task log for displaying scrolling subprocess output
|
|
593
|
+
* @param {Object} options - TaskLog options (title, limit, retainLog)
|
|
594
|
+
* @returns {Promise<Object>} TaskLog controller with message, success, error methods
|
|
595
|
+
*/
|
|
596
|
+
async function taskLog(options) {
|
|
597
|
+
const clack = await getClack();
|
|
598
|
+
return clack.taskLog(options);
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* File system path prompt with autocomplete
|
|
603
|
+
* @param {Object} options - Path options
|
|
604
|
+
* @param {string} options.message - The prompt message
|
|
605
|
+
* @param {string} [options.initialValue] - Initial path value
|
|
606
|
+
* @param {boolean} [options.directory=false] - Only allow directories
|
|
607
|
+
* @param {Function} [options.validate] - Validation function
|
|
608
|
+
* @returns {Promise<string>} Selected path
|
|
609
|
+
*/
|
|
610
|
+
async function pathPrompt(options) {
|
|
611
|
+
const clack = await getClack();
|
|
612
|
+
const result = await clack.path(options);
|
|
613
|
+
await handleCancel(result);
|
|
614
|
+
return result;
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
/**
|
|
618
|
+
* Autocomplete single-select prompt with type-ahead filtering
|
|
619
|
+
* @param {Object} options - Autocomplete options
|
|
620
|
+
* @param {string} options.message - The prompt message
|
|
621
|
+
* @param {Array} options.options - Array of choices [{value, label, hint?}]
|
|
622
|
+
* @param {string} [options.placeholder] - Placeholder text
|
|
623
|
+
* @param {number} [options.maxItems] - Maximum visible items
|
|
624
|
+
* @param {Function} [options.filter] - Custom filter function
|
|
625
|
+
* @returns {Promise<any>} Selected value
|
|
626
|
+
*/
|
|
627
|
+
async function autocomplete(options) {
|
|
628
|
+
const clack = await getClack();
|
|
629
|
+
const result = await clack.autocomplete(options);
|
|
630
|
+
await handleCancel(result);
|
|
631
|
+
return result;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
/**
|
|
635
|
+
* Key-based instant selection prompt
|
|
636
|
+
* @param {Object} options - SelectKey options
|
|
637
|
+
* @param {string} options.message - The prompt message
|
|
638
|
+
* @param {Array} options.options - Array of choices [{value, label, hint?}]
|
|
639
|
+
* @returns {Promise<any>} Selected value
|
|
640
|
+
*/
|
|
641
|
+
async function selectKey(options) {
|
|
642
|
+
const clack = await getClack();
|
|
643
|
+
const result = await clack.selectKey(options);
|
|
644
|
+
await handleCancel(result);
|
|
645
|
+
return result;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
/**
|
|
649
|
+
* Stream messages with dynamic content (for LLMs, generators, etc.)
|
|
650
|
+
*/
|
|
651
|
+
const stream = {
|
|
652
|
+
async info(generator) {
|
|
653
|
+
const clack = await getClack();
|
|
654
|
+
return clack.stream.info(generator);
|
|
655
|
+
},
|
|
656
|
+
async success(generator) {
|
|
657
|
+
const clack = await getClack();
|
|
658
|
+
return clack.stream.success(generator);
|
|
659
|
+
},
|
|
660
|
+
async step(generator) {
|
|
661
|
+
const clack = await getClack();
|
|
662
|
+
return clack.stream.step(generator);
|
|
663
|
+
},
|
|
664
|
+
async warn(generator) {
|
|
665
|
+
const clack = await getClack();
|
|
666
|
+
return clack.stream.warn(generator);
|
|
667
|
+
},
|
|
668
|
+
async error(generator) {
|
|
669
|
+
const clack = await getClack();
|
|
670
|
+
return clack.stream.error(generator);
|
|
671
|
+
},
|
|
672
|
+
async message(generator, options) {
|
|
673
|
+
const clack = await getClack();
|
|
674
|
+
return clack.stream.message(generator, options);
|
|
675
|
+
},
|
|
676
|
+
};
|
|
677
|
+
|
|
678
|
+
/**
|
|
679
|
+
* Get the color utility (picocolors instance from @clack/prompts)
|
|
680
|
+
* @returns {Promise<Object>} The color utility (picocolors)
|
|
681
|
+
*/
|
|
682
|
+
async function getColor() {
|
|
683
|
+
return await getPicocolors();
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/**
|
|
687
|
+
* Execute an array of Inquirer-style questions using @clack/prompts
|
|
688
|
+
* This provides compatibility with dynamic question arrays
|
|
689
|
+
* @param {Array} questions - Array of Inquirer-style question objects
|
|
690
|
+
* @returns {Promise<Object>} Object with answers keyed by question name
|
|
691
|
+
*/
|
|
692
|
+
async function prompt(questions) {
|
|
693
|
+
const answers = {};
|
|
694
|
+
|
|
695
|
+
for (const question of questions) {
|
|
696
|
+
const { type, name, message, choices, default: defaultValue, validate, when } = question;
|
|
697
|
+
|
|
698
|
+
// Handle conditional questions via 'when' property
|
|
699
|
+
if (when !== undefined) {
|
|
700
|
+
const shouldAsk = typeof when === 'function' ? await when(answers) : when;
|
|
701
|
+
if (!shouldAsk) continue;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
let answer;
|
|
705
|
+
|
|
706
|
+
switch (type) {
|
|
707
|
+
case 'input': {
|
|
708
|
+
// Note: @clack/prompts doesn't support async validation, so validate must be sync
|
|
709
|
+
answer = await text({
|
|
710
|
+
message,
|
|
711
|
+
default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
|
|
712
|
+
validate: validate
|
|
713
|
+
? (val) => {
|
|
714
|
+
const result = validate(val, answers);
|
|
715
|
+
if (result instanceof Promise) {
|
|
716
|
+
throw new TypeError('Async validation is not supported by @clack/prompts. Please use synchronous validation.');
|
|
717
|
+
}
|
|
718
|
+
return result === true ? undefined : result;
|
|
719
|
+
}
|
|
720
|
+
: undefined,
|
|
721
|
+
});
|
|
722
|
+
break;
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
case 'confirm': {
|
|
726
|
+
answer = await confirm({
|
|
727
|
+
message,
|
|
728
|
+
default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
|
|
729
|
+
});
|
|
730
|
+
break;
|
|
731
|
+
}
|
|
732
|
+
|
|
733
|
+
case 'list': {
|
|
734
|
+
answer = await select({
|
|
735
|
+
message,
|
|
736
|
+
choices: choices || [],
|
|
737
|
+
default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
|
|
738
|
+
});
|
|
739
|
+
break;
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
case 'checkbox': {
|
|
743
|
+
answer = await multiselect({
|
|
744
|
+
message,
|
|
745
|
+
choices: choices || [],
|
|
746
|
+
required: false,
|
|
747
|
+
});
|
|
748
|
+
break;
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
case 'password': {
|
|
752
|
+
// Note: @clack/prompts doesn't support async validation, so validate must be sync
|
|
753
|
+
answer = await password({
|
|
754
|
+
message,
|
|
755
|
+
validate: validate
|
|
756
|
+
? (val) => {
|
|
757
|
+
const result = validate(val, answers);
|
|
758
|
+
if (result instanceof Promise) {
|
|
759
|
+
throw new TypeError('Async validation is not supported by @clack/prompts. Please use synchronous validation.');
|
|
760
|
+
}
|
|
761
|
+
return result === true ? undefined : result;
|
|
762
|
+
}
|
|
763
|
+
: undefined,
|
|
764
|
+
});
|
|
765
|
+
break;
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
default: {
|
|
769
|
+
// Default to text input for unknown types
|
|
770
|
+
answer = await text({
|
|
771
|
+
message,
|
|
772
|
+
default: typeof defaultValue === 'function' ? defaultValue(answers) : defaultValue,
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
answers[name] = answer;
|
|
778
|
+
}
|
|
779
|
+
|
|
780
|
+
return answers;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
module.exports = {
|
|
784
|
+
getClack,
|
|
785
|
+
getColor,
|
|
786
|
+
handleCancel,
|
|
787
|
+
intro,
|
|
788
|
+
outro,
|
|
789
|
+
cancel,
|
|
790
|
+
note,
|
|
791
|
+
box,
|
|
792
|
+
spinner,
|
|
793
|
+
progress,
|
|
794
|
+
taskLog,
|
|
795
|
+
select,
|
|
796
|
+
multiselect,
|
|
797
|
+
autocompleteMultiselect,
|
|
798
|
+
autocomplete,
|
|
799
|
+
selectKey,
|
|
800
|
+
confirm,
|
|
801
|
+
text,
|
|
802
|
+
path: pathPrompt,
|
|
803
|
+
password,
|
|
804
|
+
group,
|
|
805
|
+
tasks,
|
|
806
|
+
log,
|
|
807
|
+
stream,
|
|
808
|
+
prompt,
|
|
809
|
+
};
|