bmad-method 6.10.1-next.9 → 6.11.0
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/.claude-plugin/marketplace.json +30 -57
- package/README.md +49 -82
- package/README_CN.md +10 -10
- package/README_VN.md +11 -11
- package/bmad-modules.yaml +43 -39
- package/package.json +7 -3
- package/removals.txt +17 -0
- package/src/bmm-skills/{1-analysis → agents}/bmad-agent-analyst/SKILL.md +1 -1
- package/src/bmm-skills/{1-analysis → agents}/bmad-agent-analyst/customize.toml +22 -7
- package/src/bmm-skills/{3-solutioning → agents}/bmad-agent-architect/SKILL.md +1 -1
- package/src/bmm-skills/{3-solutioning → agents}/bmad-agent-architect/customize.toml +2 -2
- package/src/bmm-skills/{4-implementation → agents}/bmad-agent-dev/SKILL.md +1 -1
- package/src/bmm-skills/{4-implementation → agents}/bmad-agent-dev/customize.toml +7 -14
- package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-pm/SKILL.md +1 -1
- package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-pm/customize.toml +2 -2
- package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-ux-designer/SKILL.md +1 -1
- package/src/bmm-skills/module-help.csv +14 -26
- package/src/bmm-skills/module.yaml +5 -15
- package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/SKILL.md +3 -3
- package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/customize.toml +4 -2
- package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/SKILL.md +1 -1
- package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-04-final-validation.md +1 -1
- package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +10 -0
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/SKILL.md +3 -1
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/prd-template.md +1 -1
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/customize.toml +5 -3
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/references/validate.md +3 -3
- package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/SKILL.md +1 -1
- package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/bmad-manifest.json +1 -1
- package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/verdict.md +1 -1
- package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/SKILL.md +1 -1
- package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/customize.toml +5 -3
- package/src/bmm-skills/plan/bmad-project-context/SKILL.md +110 -0
- package/src/bmm-skills/plan/bmad-project-context/customize.toml +24 -0
- package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +65 -0
- package/src/bmm-skills/plan/bmad-project-context/references/template.md +55 -0
- package/src/{core-skills → bmm-skills/plan}/bmad-spec/SKILL.md +1 -1
- package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/spec-template.md +1 -1
- package/src/{core-skills → bmm-skills/plan}/bmad-spec/customize.toml +3 -4
- package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +62 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/fix-sprint-status.md +30 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/generate-tracking.md +25 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/readiness-gate.md +20 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/status-view.md +14 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/references/validate.md +10 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/sprint_plan.py +697 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
- package/src/bmm-skills/{4-implementation → plan}/bmad-sprint-planning/sprint-status-template.yaml +9 -7
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/SKILL.md +1 -1
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/color-themes.md +1 -1
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/customize.toml +4 -2
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/creative-tools.md +1 -1
- package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/validate.md +1 -1
- package/src/bmm-skills/ship/bmad-build/SKILL.md +13 -0
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/compile-epic-context.md +1 -1
- package/src/bmm-skills/ship/bmad-build/customize.toml +164 -0
- package/src/bmm-skills/ship/bmad-build/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-01-clarify-and-route.md +20 -19
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-02-plan.md +5 -9
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-03-implement.md +10 -6
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-04-review.md +9 -15
- package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-05-present.md +10 -13
- package/src/bmm-skills/ship/bmad-build/step-oneshot.md +77 -0
- package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +19 -0
- package/src/bmm-skills/ship/bmad-build/workflow.md +84 -0
- package/src/bmm-skills/ship/bmad-build-auto/SKILL.md +13 -0
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/compile-epic-context.md +1 -1
- package/src/bmm-skills/ship/bmad-build-auto/customize.toml +121 -0
- package/src/{core-skills/bmad-review-edge-case-hunter/SKILL.md → bmm-skills/ship/bmad-build-auto/review-prompts/edge-case-hunter.md} +21 -6
- package/src/{core-skills/bmad-review-verification-gap/SKILL.md → bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md} +15 -8
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/spec-template.md +2 -1
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-01-clarify-and-route.md +16 -17
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-02-plan.md +5 -9
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-03-implement.md +6 -4
- package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-04-review.md +26 -25
- package/src/bmm-skills/{4-implementation/bmad-dev-auto/SKILL.md → ship/bmad-build-auto/workflow.md} +27 -46
- package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/SKILL.md +1 -1
- package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-05-wrapup.md +1 -1
- package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/SKILL.md +1 -1
- package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/customize.toml +37 -17
- package/src/bmm-skills/ship/bmad-code-review/references/deletion-check.md +14 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +88 -0
- package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-01-gather-context.md +7 -4
- package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-02-review.md +1 -1
- package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-04-present.md +1 -1
- package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/SKILL.md +7 -8
- package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/SKILL.md +2 -2
- package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +94 -0
- package/src/bmm-skills/{4-implementation → ship}/bmad-retrospective/customize.toml +2 -2
- package/src/bmm-skills/ship/bmad-retrospective/references/acceptance-verdict.md +55 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/aggregate-views.md +17 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/evidence-gathering.md +30 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/retro-document.md +84 -0
- package/src/bmm-skills/ship/bmad-retrospective/references/team-discussion.md +22 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/git_evidence.py +304 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/sprint_status.py +746 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_git_evidence.py +750 -0
- package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_sprint_status.py +1579 -0
- package/src/bmm-skills/v6-shims/README.md +28 -0
- package/src/bmm-skills/{3-solutioning → v6-shims}/bmad-create-architecture/SKILL.md +2 -2
- package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-create-prd/SKILL.md +4 -4
- package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/SKILL.md +5 -3
- package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +19 -0
- package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/SKILL.md +5 -3
- package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/customize.toml +3 -0
- package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +14 -0
- package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-edit-prd/SKILL.md +4 -4
- package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +14 -0
- package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +19 -0
- package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +26 -0
- package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +14 -0
- package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-validate-prd/SKILL.md +4 -4
- package/src/core-skills/bmad-advanced-elicitation/SKILL.md +26 -103
- package/src/core-skills/bmad-advanced-elicitation/customize.toml +54 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/pick_methods.py +233 -0
- package/src/core-skills/bmad-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
- package/src/core-skills/bmad-brainstorming/SKILL.md +3 -3
- package/src/core-skills/bmad-brainstorming/assets/brain-selector.html +2 -0
- package/src/core-skills/bmad-brainstorming/references/mode-autonomous.md +1 -1
- package/src/core-skills/bmad-brainstorming/scripts/brain.py +36 -6
- package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +22 -0
- package/src/core-skills/bmad-customize/SKILL.md +2 -2
- package/src/core-skills/bmad-deep-recon/SKILL.md +82 -0
- package/src/core-skills/bmad-deep-recon/assets/research.template.md +18 -0
- package/src/core-skills/bmad-deep-recon/customize.toml +212 -0
- package/src/core-skills/bmad-deep-recon/references/draft.md +8 -0
- package/src/core-skills/bmad-deep-recon/references/finalize.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/html-briefing.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/lifecycle.md +11 -0
- package/src/core-skills/bmad-deep-recon/references/process.md +10 -0
- package/src/core-skills/bmad-deep-recon/references/run.md +73 -0
- package/src/core-skills/bmad-deep-recon/references/selection.md +13 -0
- package/src/core-skills/bmad-deep-recon/references/synthesis.md +16 -0
- package/src/core-skills/bmad-deep-recon/references/verification.md +29 -0
- package/src/core-skills/bmad-deep-recon/scripts/recon_kit.py +322 -0
- package/src/core-skills/bmad-deep-recon/scripts/tests/test_recon_kit.py +144 -0
- package/src/core-skills/bmad-deep-recon/types/academic-lit.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/competitive.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/domain.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/market.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/technical.md +19 -0
- package/src/core-skills/bmad-deep-recon/types/user-voice.md +19 -0
- package/src/core-skills/bmad-forge-idea/SKILL.md +2 -2
- package/src/core-skills/bmad-forge-idea/scripts/resolve_personas.py +7 -2
- package/src/core-skills/bmad-help/SKILL.md +3 -3
- package/src/core-skills/bmad-party-mode/SKILL.md +2 -2
- package/src/core-skills/bmad-party-mode/customize.toml +1 -1
- package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +14 -4
- package/src/core-skills/bmad-review/SKILL.md +49 -0
- package/src/core-skills/bmad-review/customize.toml +141 -0
- package/src/core-skills/bmad-review/references/editorial-common.md +56 -0
- package/src/core-skills/bmad-review/references/lens-adversarial.md +19 -0
- package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +54 -0
- package/src/core-skills/bmad-review/references/lens-prose.md +7 -0
- package/src/core-skills/bmad-review/references/lens-structure.md +9 -0
- package/src/core-skills/bmad-review/references/lens-verification-gap.md +92 -0
- package/src/core-skills/bmad-review/references/structure-models.md +44 -0
- package/src/core-skills/bmad-review/scripts/tests/test_word_metrics.py +62 -0
- package/src/core-skills/bmad-review/scripts/word_metrics.py +102 -0
- package/src/core-skills/module-help.csv +4 -8
- package/src/core-skills/module.yaml +5 -0
- package/src/core-skills/v6-shims/README.md +25 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review/customize.toml +31 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +6 -0
- package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +6 -0
- package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
- package/src/scripts/config_utils.py +119 -0
- package/src/scripts/render_skill.py +401 -0
- package/src/scripts/resolve_config.py +32 -136
- package/src/scripts/resolve_customization.py +43 -184
- package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
- package/src/scripts/tests/test_config_utils.py +85 -0
- package/src/scripts/tests/test_resolve_config.py +89 -0
- package/src/scripts/tests/test_resolve_customization.py +27 -0
- package/tools/installer/cli-utils.js +6 -2
- package/tools/installer/core/installer.js +31 -9
- package/tools/installer/core/manifest-generator.js +1 -1
- package/tools/installer/core/uv-check.js +122 -24
- package/tools/installer/ide/_config-driven.js +1 -1
- package/tools/installer/ide/platform-codes.yaml +7 -0
- package/tools/installer/ide/shared/path-utils.js +2 -2
- package/tools/installer/install-messages.yaml +3 -2
- package/tools/installer/modules/custom-module-manager.js +12 -6
- package/tools/installer/modules/external-manager.js +12 -8
- package/tools/installer/modules/git-env.js +47 -0
- package/tools/installer/modules/official-modules.js +1 -1
- package/tools/installer/prompts.js +41 -102
- package/tools/installer/ui.js +99 -22
- package/tools/skill-validator.md +11 -1
- package/tools/validate-published-implementation-model.mjs +68 -0
- package/tools/validate-skills.js +33 -0
- package/web-bundles/prd-coach/prd-template.md +1 -1
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/SKILL.md +0 -76
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/customize.toml +0 -81
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/explain-concept.md +0 -20
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/mermaid-gen.md +0 -20
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/validate-doc.md +0 -19
- package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/write-document.md +0 -20
- package/src/bmm-skills/1-analysis/bmad-document-project/SKILL.md +0 -62
- package/src/bmm-skills/1-analysis/bmad-document-project/checklist.md +0 -245
- package/src/bmm-skills/1-analysis/bmad-document-project/customize.toml +0 -41
- package/src/bmm-skills/1-analysis/bmad-document-project/documentation-requirements.csv +0 -12
- package/src/bmm-skills/1-analysis/bmad-document-project/instructions.md +0 -128
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/deep-dive-template.md +0 -345
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/index-template.md +0 -169
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-overview-template.md +0 -103
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-scan-report-schema.json +0 -160
- package/src/bmm-skills/1-analysis/bmad-document-project/templates/source-tree-template.md +0 -135
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-instructions.md +0 -300
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-workflow.md +0 -34
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-instructions.md +0 -1108
- package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-workflow.md +0 -34
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/SKILL.md +0 -96
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/customize.toml +0 -41
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +0 -137
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +0 -229
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +0 -238
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +0 -206
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +0 -234
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +0 -450
- package/src/bmm-skills/1-analysis/research/bmad-domain-research/research.template.md +0 -29
- package/src/bmm-skills/1-analysis/research/bmad-market-research/SKILL.md +0 -96
- package/src/bmm-skills/1-analysis/research/bmad-market-research/customize.toml +0 -41
- package/src/bmm-skills/1-analysis/research/bmad-market-research/research.template.md +0 -29
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-01-init.md +0 -184
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +0 -239
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +0 -251
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +0 -261
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +0 -173
- package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +0 -484
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/SKILL.md +0 -96
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/customize.toml +0 -41
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/research.template.md +0 -29
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +0 -137
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +0 -239
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +0 -248
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +0 -202
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +0 -233
- package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +0 -493
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/SKILL.md +0 -91
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/customize.toml +0 -41
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +0 -179
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +0 -168
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -169
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +0 -129
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +0 -241
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +0 -132
- package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +0 -4
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/SKILL.md +0 -81
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/customize.toml +0 -41
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/project-context-template.md +0 -21
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-01-discover.md +0 -186
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-02-generate.md +0 -321
- package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-03-complete.md +0 -284
- package/src/bmm-skills/4-implementation/bmad-dev-auto/customize.toml +0 -108
- package/src/bmm-skills/4-implementation/bmad-quick-dev/SKILL.md +0 -115
- package/src/bmm-skills/4-implementation/bmad-quick-dev/customize.toml +0 -83
- package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +0 -82
- package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +0 -19
- package/src/bmm-skills/4-implementation/bmad-retrospective/SKILL.md +0 -1527
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/SKILL.md +0 -319
- package/src/bmm-skills/4-implementation/bmad-sprint-planning/checklist.md +0 -34
- package/src/bmm-skills/4-implementation/bmad-sprint-status/SKILL.md +0 -311
- package/src/core-skills/bmad-brainstorming/analysis/catalog-analysis.md +0 -239
- package/src/core-skills/bmad-brainstorming/analysis/method-matrix.csv +0 -109
- package/src/core-skills/bmad-editorial-review-prose/SKILL.md +0 -86
- package/src/core-skills/bmad-editorial-review-structure/SKILL.md +0 -179
- package/src/core-skills/bmad-index-docs/SKILL.md +0 -66
- package/src/core-skills/bmad-review-adversarial-general/SKILL.md +0 -37
- package/src/core-skills/bmad-shard-doc/SKILL.md +0 -105
- /package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-ux-designer/customize.toml +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/assets/spine-template.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/references/headless.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/references/reviewer-gate.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/scripts/lint_spine.py +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/scripts/tests/test_lint_spine.py +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/customize.toml +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-02-design-epics.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-03-create-stories.md +0 -0
- /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/templates/epics-template.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/headless-schemas.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/prd-validation-checklist.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/validation-report-template.html +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/references/headless.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/agents/artifact-analyzer.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/agents/web-researcher.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/assets/prfaq-template.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/customize.toml +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/customer-faq.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/internal-faq.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/press-release.md +0 -0
- /package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/assets/brief-template.md +0 -0
- /package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/headless-schemas.md +0 -0
- /package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/stories-schema.md +0 -0
- /package/src/bmm-skills/{4-implementation → plan}/bmad-sprint-planning/customize.toml +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-directions.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-editorial.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-mobile.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-shadcn.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/excalidraw-wireframe.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/experience-example-mobile.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/experience-example-shadcn.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/headless-schemas.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/key-screens.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/validation-report-template.html +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/design-md-spec.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/headless.md +0 -0
- /package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/spec-template.md +0 -0
- /package/src/{core-skills/bmad-review-edge-case-hunter → bmm-skills/ship/bmad-build-auto}/references/deletion-check.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/customize.toml +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/generate-trail.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-01-orientation.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-02-walkthrough.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-03-detail-pass.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-04-testing.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-03-triage.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/checklist.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/customize.toml +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/checklist.md +0 -0
- /package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/customize.toml +0 -0
- /package/src/bmm-skills/{3-solutioning → v6-shims}/bmad-create-architecture/customize.toml +0 -0
- /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-create-prd/customize.toml +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/checklist.md +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/customize.toml +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/discover-inputs.md +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/template.md +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/checklist.md +0 -0
- /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-edit-prd/customize.toml +0 -0
- /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-sprint-status/customize.toml +0 -0
- /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-validate-prd/customize.toml +0 -0
- /package/src/core-skills/bmad-advanced-elicitation/{methods.csv → assets/methods.csv} +0 -0
- /package/src/core-skills/bmad-party-mode/scripts/tests/{test-resolve_party.py → test_resolve_party.py} +0 -0
|
@@ -578,10 +578,6 @@ async function autocomplete(options) {
|
|
|
578
578
|
return result;
|
|
579
579
|
}
|
|
580
580
|
|
|
581
|
-
function hasPathSeparator(value) {
|
|
582
|
-
return value.endsWith('/') || value.endsWith('\\');
|
|
583
|
-
}
|
|
584
|
-
|
|
585
581
|
function expandHome(input) {
|
|
586
582
|
if (!input) return input;
|
|
587
583
|
if (input === '~') return os.homedir();
|
|
@@ -591,91 +587,54 @@ function expandHome(input) {
|
|
|
591
587
|
return input;
|
|
592
588
|
}
|
|
593
589
|
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
return fs.existsSync(value) && fs.statSync(value).isDirectory();
|
|
601
|
-
} catch {
|
|
602
|
-
return false;
|
|
603
|
-
}
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
function listDirectoryOptions(input, options) {
|
|
590
|
+
/**
|
|
591
|
+
* Resolve raw prompt input to an absolute directory path.
|
|
592
|
+
* Mirrors UI.expandUserPath so what the prompt returns matches what the
|
|
593
|
+
* installer later resolves.
|
|
594
|
+
*/
|
|
595
|
+
function resolveDirectoryInput(input, options = {}) {
|
|
607
596
|
const cwd = options.cwd || process.cwd();
|
|
608
|
-
const rawInput = input.trim();
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
const
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
const results = [];
|
|
615
|
-
|
|
616
|
-
if (!trailingSep && isExistingDirectory(resolvedInput)) {
|
|
617
|
-
results.push(toDirectoryOption(resolvedInput, `. (use this directory)`));
|
|
618
|
-
}
|
|
619
|
-
|
|
620
|
-
if (isExistingDirectory(browseDir)) {
|
|
621
|
-
try {
|
|
622
|
-
for (const entry of fs.readdirSync(browseDir, { withFileTypes: true })) {
|
|
623
|
-
if (!entry.isDirectory()) continue;
|
|
624
|
-
if (prefix && !entry.name.toLowerCase().startsWith(prefix)) continue;
|
|
625
|
-
const fullPath = path.join(browseDir, entry.name);
|
|
626
|
-
if (!results.some((option) => option.value === fullPath)) {
|
|
627
|
-
results.push(toDirectoryOption(fullPath));
|
|
628
|
-
}
|
|
629
|
-
}
|
|
630
|
-
} catch {
|
|
631
|
-
// Skip unreadable directories; validation still reports path issues.
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
const validation = options.validate?.(rawInput);
|
|
636
|
-
const hasMatchingOption = results.some((option) => option.value === resolvedInput);
|
|
637
|
-
if (expandedInput && !validation && !hasMatchingOption) {
|
|
638
|
-
results.unshift(toDirectoryOption(resolvedInput, `Create/use: ${resolvedInput}`, true));
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
return results;
|
|
597
|
+
const rawInput = typeof input === 'string' ? input.trim() : '';
|
|
598
|
+
// An empty line means "use the default", which is resolved the same way as
|
|
599
|
+
// typed text so a `~/…` or relative default still returns an absolute path.
|
|
600
|
+
const effective = rawInput || (options.default || '').trim();
|
|
601
|
+
if (!effective) return cwd;
|
|
602
|
+
return path.resolve(cwd, expandHome(effective));
|
|
642
603
|
}
|
|
643
604
|
|
|
644
605
|
/**
|
|
645
|
-
* Directory prompt
|
|
646
|
-
*
|
|
647
|
-
*
|
|
606
|
+
* Directory prompt.
|
|
607
|
+
*
|
|
608
|
+
* A plain text entry: what is on the input line is what gets submitted,
|
|
609
|
+
* resolved to an absolute path.
|
|
610
|
+
*
|
|
611
|
+
* The line is pre-filled with the default (the current working directory,
|
|
612
|
+
* which is where installs usually run from) as real editable text rather than
|
|
613
|
+
* a placeholder, so it can be edited down or extended instead of retyped.
|
|
614
|
+
* Clearing it and pressing Enter still accepts the default.
|
|
615
|
+
*
|
|
648
616
|
* @param {Object} options - Prompt options
|
|
649
617
|
* @param {string} options.message - Prompt message
|
|
650
|
-
* @param {string} [options.default] - Default directory
|
|
651
|
-
* @param {string} [options.placeholder] - Placeholder
|
|
618
|
+
* @param {string} [options.default] - Default directory, pre-filled on the input line
|
|
619
|
+
* @param {string} [options.placeholder] - Placeholder shown only if the line is cleared
|
|
652
620
|
* @param {Function} [options.validate] - Sync validation function
|
|
653
|
-
* @
|
|
621
|
+
* @param {Object} [options.input] - Input stream (defaults to process.stdin; tests inject)
|
|
622
|
+
* @param {Object} [options.output] - Output stream (defaults to process.stdout; tests inject)
|
|
623
|
+
* @returns {Promise<string>} Resolved absolute directory path
|
|
654
624
|
*/
|
|
655
625
|
async function directory(options) {
|
|
656
626
|
const core = await getClackCore();
|
|
657
627
|
const color = await getPicocolors();
|
|
658
|
-
const tabCompletion = {
|
|
659
|
-
prefix: '',
|
|
660
|
-
index: -1,
|
|
661
|
-
options: [],
|
|
662
|
-
lastValue: '',
|
|
663
|
-
};
|
|
664
628
|
|
|
665
|
-
|
|
666
|
-
|
|
629
|
+
const prompt = new core.TextPrompt({
|
|
630
|
+
...(options.input ? { input: options.input } : {}),
|
|
631
|
+
...(options.output ? { output: options.output } : {}),
|
|
667
632
|
initialValue: options.default,
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
validate: (value) => options.validate?.(value ?? prompt.userInput),
|
|
633
|
+
defaultValue: options.default,
|
|
634
|
+
validate: options.validate,
|
|
671
635
|
render() {
|
|
672
|
-
const title = `${color.gray('◆')} ${options.message}`;
|
|
673
636
|
const bar = color.gray('│');
|
|
674
|
-
const barEnd = color.gray('└');
|
|
675
637
|
const userInput = this.userInput;
|
|
676
|
-
const placeholder = options.placeholder || options.default;
|
|
677
|
-
const inputDisplay = userInput ? this.userInputWithCursor : `${color.inverse(color.hidden('_'))}${color.dim(placeholder || '')}`;
|
|
678
|
-
const errorLine = this.state === 'error' ? [`${color.yellow('│')} ${color.yellow(this.error)}`] : [];
|
|
679
638
|
|
|
680
639
|
switch (this.state) {
|
|
681
640
|
case 'submit': {
|
|
@@ -685,42 +644,20 @@ async function directory(options) {
|
|
|
685
644
|
return `${color.gray('◇')} ${options.message}\n${bar} ${color.strikethrough(color.dim(userInput || ''))}`;
|
|
686
645
|
}
|
|
687
646
|
default: {
|
|
688
|
-
|
|
647
|
+
const placeholder = options.placeholder || options.default;
|
|
648
|
+
const inputDisplay = userInput ? this.userInputWithCursor : `${color.inverse(color.hidden('_'))}${color.dim(placeholder || '')}`;
|
|
649
|
+
const lines = [`${color.gray('◆')} ${options.message}`, `${bar} ${inputDisplay}`];
|
|
650
|
+
if (this.state === 'error') lines.push(`${color.yellow('│')} ${color.yellow(this.error)}`);
|
|
651
|
+
lines.push(color.gray('└'));
|
|
652
|
+
return lines.join('\n');
|
|
689
653
|
}
|
|
690
654
|
}
|
|
691
655
|
},
|
|
692
656
|
});
|
|
693
657
|
|
|
694
|
-
const hasSetUserInput = typeof prompt._setUserInput === 'function';
|
|
695
|
-
const hasClearUserInput = typeof prompt._clearUserInput === 'function';
|
|
696
|
-
|
|
697
|
-
prompt.on('key', (_, key) => {
|
|
698
|
-
if (key?.name !== 'tab') return;
|
|
699
|
-
if (!hasSetUserInput) return; // @clack/core API surface changed — skip Tab silently.
|
|
700
|
-
const currentInput = prompt.userInput;
|
|
701
|
-
const isContinuingCycle = tabCompletion.lastValue && currentInput === tabCompletion.lastValue;
|
|
702
|
-
const completionOptions = isContinuingCycle ? tabCompletion.options : prompt.filteredOptions.filter((option) => !option.synthetic);
|
|
703
|
-
if (completionOptions.length === 0) return;
|
|
704
|
-
|
|
705
|
-
if (isContinuingCycle) {
|
|
706
|
-
tabCompletion.index = (tabCompletion.index + 1) % completionOptions.length;
|
|
707
|
-
} else {
|
|
708
|
-
tabCompletion.prefix = currentInput;
|
|
709
|
-
tabCompletion.options = completionOptions;
|
|
710
|
-
tabCompletion.index = 0;
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
const focusedOption = completionOptions[tabCompletion.index];
|
|
714
|
-
if (!focusedOption) return;
|
|
715
|
-
const completedValue = focusedOption.value;
|
|
716
|
-
tabCompletion.lastValue = completedValue;
|
|
717
|
-
if (hasClearUserInput) prompt._clearUserInput();
|
|
718
|
-
prompt._setUserInput(completedValue, true);
|
|
719
|
-
});
|
|
720
|
-
|
|
721
658
|
const result = await prompt.prompt();
|
|
722
659
|
await handleCancel(result);
|
|
723
|
-
return result;
|
|
660
|
+
return resolveDirectoryInput(result, options);
|
|
724
661
|
}
|
|
725
662
|
|
|
726
663
|
/**
|
|
@@ -843,6 +780,8 @@ module.exports = {
|
|
|
843
780
|
autocompleteMultiselect,
|
|
844
781
|
autocomplete,
|
|
845
782
|
directory,
|
|
783
|
+
// Exported for tests
|
|
784
|
+
resolveDirectoryInput,
|
|
846
785
|
confirm,
|
|
847
786
|
text,
|
|
848
787
|
password,
|
package/tools/installer/ui.js
CHANGED
|
@@ -110,6 +110,44 @@ async function getModuleVersion(moduleCode, { repoUrl = null, registryDefault =
|
|
|
110
110
|
* UI utilities for the installer
|
|
111
111
|
*/
|
|
112
112
|
class UI {
|
|
113
|
+
/**
|
|
114
|
+
* Warn once for each selected module the registry marks deprecated.
|
|
115
|
+
*
|
|
116
|
+
* A deprecated module is never dropped from the selection — an existing
|
|
117
|
+
* install keeps working and keeps being updated on request. The warning is
|
|
118
|
+
* the only behavior change, and it is what tells CLI users (`--modules`,
|
|
119
|
+
* `--yes`) what the interactive picker shows as an option hint.
|
|
120
|
+
*
|
|
121
|
+
* @param {Array<string>} selectedModules - Module codes about to be installed
|
|
122
|
+
* @returns {Promise<Array<string>>} The deprecated codes that were warned about
|
|
123
|
+
*/
|
|
124
|
+
async _warnDeprecatedModules(selectedModules = []) {
|
|
125
|
+
const externalManager = new ExternalModuleManager();
|
|
126
|
+
let registryModules;
|
|
127
|
+
try {
|
|
128
|
+
registryModules = await externalManager.listAvailable();
|
|
129
|
+
} catch {
|
|
130
|
+
return []; // Registry unreadable — never block an install over a notice.
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const deprecatedByCode = new Map();
|
|
134
|
+
for (const mod of registryModules) {
|
|
135
|
+
if (!mod.deprecated) continue;
|
|
136
|
+
deprecatedByCode.set(mod.code, mod);
|
|
137
|
+
for (const alias of mod.aliases) deprecatedByCode.set(alias, mod);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const warned = [];
|
|
141
|
+
for (const code of selectedModules) {
|
|
142
|
+
const mod = deprecatedByCode.get(code);
|
|
143
|
+
if (!mod || warned.includes(mod.code)) continue;
|
|
144
|
+
warned.push(mod.code);
|
|
145
|
+
const detail = mod.deprecationMessage || 'It is no longer receiving updates.';
|
|
146
|
+
await prompts.log.warn(`${mod.name} (${mod.code}) is deprecated. ${detail}`);
|
|
147
|
+
}
|
|
148
|
+
return warned;
|
|
149
|
+
}
|
|
150
|
+
|
|
113
151
|
async _retainUnavailableInstalledModules(selectedModules, installedModuleIds, bmadDir, options = {}) {
|
|
114
152
|
const { OfficialModules } = require('./modules/official-modules');
|
|
115
153
|
const officialCodes = new Set(['core']);
|
|
@@ -166,13 +204,15 @@ class UI {
|
|
|
166
204
|
const messageLoader = new MessageLoader();
|
|
167
205
|
await messageLoader.displayStartMessage();
|
|
168
206
|
|
|
169
|
-
// Probe for `uv` before any other prompts: it's
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
// warn-don't-block, no ack prompt
|
|
175
|
-
//
|
|
207
|
+
// Probe for `uv` before any other prompts: it's the runner for the Python
|
|
208
|
+
// scripts BMAD skills shell out to (`uv run <script>`), and uv provisions
|
|
209
|
+
// the interpreter itself, so it's the single thing worth checking for.
|
|
210
|
+
// As of v6.11.0 `bmad-build` and `bmad-build-auto` HALT without it.
|
|
211
|
+
//
|
|
212
|
+
// Still warn-don't-block, with no ack prompt: core-only, docs-only, and
|
|
213
|
+
// CI installs never touch a rendered skill, so a missing `uv` must not
|
|
214
|
+
// fail the run. `installer.js` repeats the warning in the post-install
|
|
215
|
+
// summary so it survives the scrollback. The installer runs in the
|
|
176
216
|
// destination environment, so probing PATH here tests the right machine.
|
|
177
217
|
const { checkUvEnvironment } = require('./core/uv-check');
|
|
178
218
|
await checkUvEnvironment();
|
|
@@ -275,6 +315,9 @@ class UI {
|
|
|
275
315
|
|
|
276
316
|
// Handle quick update separately
|
|
277
317
|
if (actionType === 'quick-update') {
|
|
318
|
+
// Quick update never shows the module picker, so this is the only
|
|
319
|
+
// place an existing install of a deprecated module hears about it.
|
|
320
|
+
await this._warnDeprecatedModules(existingInstall.moduleIds || []);
|
|
278
321
|
return {
|
|
279
322
|
actionType: 'quick-update',
|
|
280
323
|
directory: confirmedDirectory,
|
|
@@ -339,6 +382,11 @@ class UI {
|
|
|
339
382
|
);
|
|
340
383
|
}
|
|
341
384
|
|
|
385
|
+
// Surface deprecation notices for whatever ended up selected. The
|
|
386
|
+
// interactive picker only hints at them in the option list, and the
|
|
387
|
+
// --modules / --yes paths never see that list at all.
|
|
388
|
+
await this._warnDeprecatedModules(selectedModules);
|
|
389
|
+
|
|
342
390
|
// For existing installs, resolve per-module update decisions BEFORE
|
|
343
391
|
// we clone anything. Reads the existing manifest's recorded channel
|
|
344
392
|
// per module and prompts the user on available upgrades (patch/minor
|
|
@@ -424,6 +472,8 @@ class UI {
|
|
|
424
472
|
selectedModules.unshift('core');
|
|
425
473
|
}
|
|
426
474
|
|
|
475
|
+
await this._warnDeprecatedModules(selectedModules);
|
|
476
|
+
|
|
427
477
|
// Interactive channel gate: "Ready to install (all stable)? [Y/n]"
|
|
428
478
|
// Only shown for fresh installs with no channel flags and an external module
|
|
429
479
|
// selected. Skipped for prerelease launches because channelOptions.global
|
|
@@ -808,9 +858,15 @@ class UI {
|
|
|
808
858
|
|
|
809
859
|
const configCollector = new OfficialModules({ channelOptions: options.channelOptions });
|
|
810
860
|
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
861
|
+
const hasCoreCliOptions =
|
|
862
|
+
options.userName || options.communicationLanguage || options.documentOutputLanguage || options.outputFolder || setOverrides.core;
|
|
863
|
+
|
|
864
|
+
// Seed core config from CLI options if provided. `--set core.<key>` seeds it
|
|
865
|
+
// too: core values are dependency-bearing — module artifact paths are built
|
|
866
|
+
// from output_folder here, and each module's config.yaml snapshots the core
|
|
867
|
+
// values — so the post-install patch alone lands too late.
|
|
868
|
+
if (hasCoreCliOptions) {
|
|
869
|
+
const coreConfig = { ...setOverrides.core };
|
|
814
870
|
if (options.userName) {
|
|
815
871
|
coreConfig.user_name = options.userName;
|
|
816
872
|
await prompts.log.info(`Using user name from command-line: ${options.userName}`);
|
|
@@ -830,8 +886,24 @@ class UI {
|
|
|
830
886
|
|
|
831
887
|
// Load existing config to merge with provided options
|
|
832
888
|
await configCollector.loadExistingConfig(directory);
|
|
833
|
-
const existingConfig = configCollector.
|
|
834
|
-
|
|
889
|
+
const existingConfig = configCollector.existingConfig.core || {};
|
|
890
|
+
let defaultConfig = {};
|
|
891
|
+
if (options.yes) {
|
|
892
|
+
let safeUsername;
|
|
893
|
+
try {
|
|
894
|
+
safeUsername = os.userInfo().username;
|
|
895
|
+
} catch {
|
|
896
|
+
safeUsername = process.env.USER || process.env.USERNAME || 'User';
|
|
897
|
+
}
|
|
898
|
+
defaultConfig = {
|
|
899
|
+
user_name: safeUsername.charAt(0).toUpperCase() + safeUsername.slice(1),
|
|
900
|
+
project_name: path.basename(directory),
|
|
901
|
+
communication_language: 'English',
|
|
902
|
+
document_output_language: 'English',
|
|
903
|
+
output_folder: '_bmad-output',
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
configCollector.collectedConfig.core = { ...defaultConfig, ...existingConfig, ...coreConfig };
|
|
835
907
|
|
|
836
908
|
// If not all options are provided, collect the missing ones interactively (unless --yes flag)
|
|
837
909
|
if (
|
|
@@ -843,7 +915,7 @@ class UI {
|
|
|
843
915
|
} else if (options.yes) {
|
|
844
916
|
// Use all defaults when --yes flag is set
|
|
845
917
|
await configCollector.loadExistingConfig(directory);
|
|
846
|
-
const existingConfig = configCollector.
|
|
918
|
+
const existingConfig = configCollector.existingConfig.core || {};
|
|
847
919
|
|
|
848
920
|
if (Object.keys(existingConfig).length === 0) {
|
|
849
921
|
let safeUsername;
|
|
@@ -879,7 +951,7 @@ class UI {
|
|
|
879
951
|
* @param {Set} installedModuleIds - Currently installed module IDs
|
|
880
952
|
* @param {Map<string, string>} installedModuleVersions - Installed module versions from the local manifest
|
|
881
953
|
* @param {Object|null} channelOptions - Parsed installer channel options
|
|
882
|
-
* @returns {Array} Selected module codes
|
|
954
|
+
* @returns {Array} Selected module codes, always including core
|
|
883
955
|
*/
|
|
884
956
|
async selectAllModules(installedModuleIds = new Set(), installedModuleVersions = new Map(), channelOptions = null) {
|
|
885
957
|
// Phase 1: Official modules
|
|
@@ -920,7 +992,6 @@ class UI {
|
|
|
920
992
|
|
|
921
993
|
const allOptions = [];
|
|
922
994
|
const initialValues = [];
|
|
923
|
-
const lockedValues = ['core'];
|
|
924
995
|
|
|
925
996
|
const buildModuleEntry = async (code, name, description, isDefault, repoUrl = null, registryDefault = null) => {
|
|
926
997
|
const isInstalled = installedModuleIds.has(code);
|
|
@@ -937,11 +1008,15 @@ class UI {
|
|
|
937
1008
|
};
|
|
938
1009
|
};
|
|
939
1010
|
|
|
940
|
-
// Add built-in modules first (always available regardless of network)
|
|
1011
|
+
// Add built-in modules first (always available regardless of network).
|
|
1012
|
+
// core is not offered as a row: it is a dependency of every module, always
|
|
1013
|
+
// installed, and was only ever rendered as a locked always-on checkbox.
|
|
1014
|
+
// It is still added back to the result below.
|
|
941
1015
|
const builtInCodes = new Set();
|
|
942
1016
|
for (const mod of builtInModules) {
|
|
943
1017
|
const code = mod.id;
|
|
944
1018
|
builtInCodes.add(code);
|
|
1019
|
+
if (code === 'core') continue;
|
|
945
1020
|
const entry = await buildModuleEntry(code, mod.name, mod.description, mod.defaultSelected);
|
|
946
1021
|
allOptions.push({ label: entry.label, value: entry.value, hint: entry.hint });
|
|
947
1022
|
if (entry.selected) {
|
|
@@ -996,22 +1071,24 @@ class UI {
|
|
|
996
1071
|
message: 'Select official modules to install:',
|
|
997
1072
|
options: allOptions,
|
|
998
1073
|
initialValues: initialValues.length > 0 ? initialValues : undefined,
|
|
999
|
-
|
|
1000
|
-
|
|
1074
|
+
// Not required: core is installed either way, so an empty selection is a
|
|
1075
|
+
// legitimate "core only" install rather than a mistake to block on.
|
|
1076
|
+
required: false,
|
|
1001
1077
|
maxItems: allOptions.length,
|
|
1002
1078
|
});
|
|
1003
1079
|
|
|
1004
|
-
const
|
|
1080
|
+
const chosen = selected ? [...selected] : [];
|
|
1005
1081
|
|
|
1006
|
-
if (
|
|
1007
|
-
const moduleLines =
|
|
1082
|
+
if (chosen.length > 0) {
|
|
1083
|
+
const moduleLines = chosen.map((moduleId) => {
|
|
1008
1084
|
const opt = allOptions.find((o) => o.value === moduleId);
|
|
1009
1085
|
return ` \u2022 ${opt?.label || moduleId}`;
|
|
1010
1086
|
});
|
|
1011
1087
|
await prompts.log.message('Selected official modules:\n' + moduleLines.join('\n'));
|
|
1012
1088
|
}
|
|
1013
1089
|
|
|
1014
|
-
|
|
1090
|
+
// core is never shown but always installed.
|
|
1091
|
+
return chosen.includes('core') ? chosen : ['core', ...chosen];
|
|
1015
1092
|
}
|
|
1016
1093
|
|
|
1017
1094
|
/**
|
package/tools/skill-validator.md
CHANGED
|
@@ -10,7 +10,7 @@ Before running inference-based validation, run the deterministic validator:
|
|
|
10
10
|
node tools/validate-skills.js --json path/to/skill-dir
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
This checks
|
|
13
|
+
This checks 13 rules deterministically: SKILL-01, SKILL-02, SKILL-03, SKILL-04, SKILL-05, SKILL-06, SKILL-07, PATH-02, STEP-01, STEP-06, STEP-07, SEQ-02, TPL-01.
|
|
14
14
|
|
|
15
15
|
Review its JSON output. For any rule that produced **zero findings** in the first pass, **skip it** during inference-based validation below — it has already been verified. If a rule produced any findings, the inference validator should still review that rule (some rules like SKILL-04 and SKILL-06 have sub-checks that benefit from judgment). Focus your inference effort on the remaining rules that require judgment (PATH-01, PATH-03, PATH-04, PATH-05, WF-03, STEP-02, STEP-03, STEP-04, STEP-05, SEQ-01, REF-01, REF-02, REF-03).
|
|
16
16
|
|
|
@@ -253,6 +253,16 @@ If no findings are generated (from either pass), the skill passes validation.
|
|
|
253
253
|
|
|
254
254
|
---
|
|
255
255
|
|
|
256
|
+
### TPL-01 — Template Files Must Not Contain Compile-Time Substitutions
|
|
257
|
+
|
|
258
|
+
- **Severity:** HIGH
|
|
259
|
+
- **Applies to:** `.md` files whose name contains `template` (case-insensitive)
|
|
260
|
+
- **Rule:** Template files seed durable, version-controlled artifacts (e.g. spec files) that execute on other machines. A `{{.var}}` compile-time substitution would be baked at render time and freeze a machine-local value into every artifact produced from the template.
|
|
261
|
+
- **Detection:** Regex `\{\{\.\w+\}\}` match anywhere in a file whose basename matches `/template/i`.
|
|
262
|
+
- **Fix:** Remove the `{{.var}}` reference. Use single-curly `{var}` if the value should be resolved at LLM runtime by the consumer of the generated artifact.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
256
266
|
### REF-01 — Variable References Must Be Defined
|
|
257
267
|
|
|
258
268
|
- **Severity:** HIGH
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
|
|
4
|
+
const CANONICAL_LLMS_ENTRY = '**[Build]';
|
|
5
|
+
const CANONICAL_LLMS_DESCRIPTION = 'Canonical implementation workflow for direct intent and fully planned work';
|
|
6
|
+
|
|
7
|
+
const FORBIDDEN_TERMS = [
|
|
8
|
+
/\bbmad-(?:quick-dev|dev-auto)\b/gi,
|
|
9
|
+
/\bQuick[ -]?Dev\b/gi,
|
|
10
|
+
/\bDev[ -]?Auto\b/gi,
|
|
11
|
+
/\bbmad-(?:create|dev)-story\b/gi,
|
|
12
|
+
/\b(?:create-story|dev-story)\b/gi,
|
|
13
|
+
/\b(?:Create Story|Dev Story)\b/g,
|
|
14
|
+
/\b(?:createStory|devStory|create_story|dev_story)\b/g,
|
|
15
|
+
/\bquick[ -]?flow\b/gi,
|
|
16
|
+
/flux rapide|parcours parallèle/gi,
|
|
17
|
+
/paralelní cesta/gi,
|
|
18
|
+
/luồng nhanh|nhánh nhanh/gi,
|
|
19
|
+
/快速流程|并行快线/g,
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
export function validatePublishedImplementationModel(siteDir) {
|
|
23
|
+
const findings = findObsoleteImplementationTerms(siteDir);
|
|
24
|
+
if (findings.length > 0) {
|
|
25
|
+
const details = findings.map(({ file, line, match }) => `${file}:${line}: ${match}`).join('\n ');
|
|
26
|
+
throw new Error(`Obsolete implementation terminology found in deployable documentation:\n ${details}`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const llmsPath = path.join(siteDir, 'llms.txt');
|
|
30
|
+
const llmsContent = fs.readFileSync(llmsPath, 'utf-8');
|
|
31
|
+
if (!llmsContent.includes(CANONICAL_LLMS_ENTRY) || !llmsContent.includes(CANONICAL_LLMS_DESCRIPTION)) {
|
|
32
|
+
throw new Error('llms.txt must describe Build as canonical for both direct intent and fully planned work');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export function findObsoleteImplementationTerms(siteDir) {
|
|
37
|
+
const findings = [];
|
|
38
|
+
|
|
39
|
+
for (const filePath of getPublishedTextFiles(siteDir)) {
|
|
40
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
41
|
+
for (const pattern of FORBIDDEN_TERMS) {
|
|
42
|
+
for (const match of content.matchAll(pattern)) {
|
|
43
|
+
findings.push({
|
|
44
|
+
file: path.relative(siteDir, filePath),
|
|
45
|
+
line: content.slice(0, match.index).split('\n').length,
|
|
46
|
+
match: match[0],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
return findings;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function getPublishedTextFiles(dir) {
|
|
56
|
+
const files = [];
|
|
57
|
+
|
|
58
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
59
|
+
const fullPath = path.join(dir, entry.name);
|
|
60
|
+
if (entry.isDirectory()) {
|
|
61
|
+
files.push(...getPublishedTextFiles(fullPath));
|
|
62
|
+
} else if (/\.(?:html|txt|xml|json|svg)$/i.test(entry.name)) {
|
|
63
|
+
files.push(fullPath);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return files;
|
|
68
|
+
}
|
package/tools/validate-skills.js
CHANGED
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
* - STEP-06: step frontmatter has no name/description
|
|
18
18
|
* - STEP-07: step count 2-10
|
|
19
19
|
* - SEQ-02: no time estimates
|
|
20
|
+
* - TPL-01: template files must not contain compile-time {{.var}} substitutions
|
|
20
21
|
*
|
|
21
22
|
* Usage:
|
|
22
23
|
* node tools/validate-skills.js # All skills, human-readable
|
|
@@ -43,6 +44,8 @@ const positionalArgs = args.filter((a) => !a.startsWith('--'));
|
|
|
43
44
|
const NAME_REGEX = /^bmad-[a-z0-9]+(-[a-z0-9]+)*$/;
|
|
44
45
|
const STEP_FILENAME_REGEX = /^step-\d{2}[a-z]?-[a-z0-9-]+\.md$/;
|
|
45
46
|
const TIME_ESTIMATE_PATTERNS = [/takes?\s+\d+\s*min/i, /~\s*\d+\s*min/i, /estimated\s+time/i, /\bETA\b/];
|
|
47
|
+
const TEMPLATE_FILENAME_REGEX = /template/i;
|
|
48
|
+
const COMPILE_TIME_SUB_REGEX = /\{\{\.\w+\}\}/;
|
|
46
49
|
|
|
47
50
|
const SEVERITY_ORDER = { CRITICAL: 0, HIGH: 1, MEDIUM: 2, LOW: 3 };
|
|
48
51
|
|
|
@@ -535,6 +538,36 @@ function validateSkill(skillDir) {
|
|
|
535
538
|
}
|
|
536
539
|
}
|
|
537
540
|
|
|
541
|
+
// --- TPL-01: template files must not contain compile-time {{.var}} substitutions ---
|
|
542
|
+
// Template files seed durable, version-controlled artifacts (spec files) that
|
|
543
|
+
// execute on other machines. Baking a {{.var}} at render time would freeze a
|
|
544
|
+
// machine-local value into every downstream artifact.
|
|
545
|
+
for (const filePath of allFiles) {
|
|
546
|
+
if (path.extname(filePath) !== '.md') continue;
|
|
547
|
+
const base = path.basename(filePath);
|
|
548
|
+
if (!TEMPLATE_FILENAME_REGEX.test(base)) continue;
|
|
549
|
+
|
|
550
|
+
const relFile = path.relative(skillDir, filePath);
|
|
551
|
+
const content = safeReadFile(filePath, findings, relFile);
|
|
552
|
+
if (content === null) continue;
|
|
553
|
+
|
|
554
|
+
const lines = content.split('\n');
|
|
555
|
+
for (const [i, line] of lines.entries()) {
|
|
556
|
+
const match = line.match(COMPILE_TIME_SUB_REGEX);
|
|
557
|
+
if (match) {
|
|
558
|
+
findings.push({
|
|
559
|
+
rule: 'TPL-01',
|
|
560
|
+
title: 'Template files must not contain compile-time substitutions',
|
|
561
|
+
severity: 'HIGH',
|
|
562
|
+
file: relFile,
|
|
563
|
+
line: i + 1,
|
|
564
|
+
detail: `Template file contains compile-time substitution \`${match[0]}\` — this would be baked at render time and leak a machine-local value into every spec produced from the template.`,
|
|
565
|
+
fix: 'Remove the `{{.var}}` reference. Use single-curly `{var}` if the value should be resolved at LLM runtime by the consumer of the generated spec.',
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
|
|
538
571
|
return findings;
|
|
539
572
|
}
|
|
540
573
|
|
|
@@ -161,5 +161,5 @@ updated: {YYYY-MM-DD}
|
|
|
161
161
|
- **Environmental and Reliability Requirements**.
|
|
162
162
|
|
|
163
163
|
### Small-scope all-inclusive *(use when scope is 1-2 stories' worth and the user wants a single captured artifact: chosen during the Right-skill check in Discovery)*
|
|
164
|
-
- **Stories**: story-level specs listed inline at the end of the doc. Each story: *"As a [persona], I can [action] [under conditions]. Acceptance: [testable criteria]."* Numbered Story-1, Story-2, ... for reference. Pair with very lean §1 Vision, §2 Target User (often just JTBD + one UJ), §3 Glossary (handful of terms), §4 Features (often a single feature), §6 MVP Scope (in/out very tight). The whole doc fits on a page or two and captures intent + implementable stories in one place. If the user doesn't want the captured artifact at all, `bmad-
|
|
164
|
+
- **Stories**: story-level specs listed inline at the end of the doc. Each story: *"As a [persona], I can [action] [under conditions]. Acceptance: [testable criteria]."* Numbered Story-1, Story-2, ... for reference. Pair with very lean §1 Vision, §2 Target User (often just JTBD + one UJ), §3 Glossary (handful of terms), §4 Features (often a single feature), §6 MVP Scope (in/out very tight). The whole doc fits on a page or two and captures intent + implementable stories in one place. If the user doesn't want the captured artifact at all, `bmad-build` is the better path; this cluster is only for "I want a doc *and* the stories."
|
|
165
165
|
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: bmad-agent-tech-writer
|
|
3
|
-
description: Technical documentation specialist and knowledge curator. Use when the user asks to talk to Paige or requests the tech writer.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Paige — Technical Writer
|
|
7
|
-
|
|
8
|
-
## Overview
|
|
9
|
-
|
|
10
|
-
You are Paige, the Technical Writer. You transform complex concepts into accessible, structured documentation — writing for the reader's task, favoring diagrams when they carry more signal than prose, and adapting depth to audience. Master of CommonMark, DITA, OpenAPI, and Mermaid.
|
|
11
|
-
|
|
12
|
-
## Conventions
|
|
13
|
-
|
|
14
|
-
- Bare paths (e.g. `references/guide.md`) resolve from the skill root.
|
|
15
|
-
- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).
|
|
16
|
-
- `{project-root}`-prefixed paths resolve from the project working directory.
|
|
17
|
-
- `{skill-name}` resolves to the skill directory's basename.
|
|
18
|
-
|
|
19
|
-
## On Activation
|
|
20
|
-
|
|
21
|
-
### Step 1: Resolve the Agent Block
|
|
22
|
-
|
|
23
|
-
Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
|
|
24
|
-
|
|
25
|
-
**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:
|
|
26
|
-
|
|
27
|
-
1. `{skill-root}/customize.toml` — defaults
|
|
28
|
-
2. `{project-root}/_bmad/custom/{skill-name}.toml` — team overrides
|
|
29
|
-
3. `{project-root}/_bmad/custom/{skill-name}.user.toml` — personal overrides
|
|
30
|
-
|
|
31
|
-
Any missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.
|
|
32
|
-
|
|
33
|
-
### Step 2: Execute Prepend Steps
|
|
34
|
-
|
|
35
|
-
Execute each entry in `{agent.activation_steps_prepend}` in order before proceeding.
|
|
36
|
-
|
|
37
|
-
### Step 3: Adopt Persona
|
|
38
|
-
|
|
39
|
-
Adopt the Paige / Technical Writer identity established in the Overview. Layer the customized persona on top: fill the additional role of `{agent.role}`, embody `{agent.identity}`, speak in the style of `{agent.communication_style}`, and follow `{agent.principles}`.
|
|
40
|
-
|
|
41
|
-
Fully embody this persona so the user gets the best experience. Do not break character until the user dismisses the persona. When the user calls a skill, this persona carries through and remains active.
|
|
42
|
-
|
|
43
|
-
### Step 4: Load Persistent Facts
|
|
44
|
-
|
|
45
|
-
Treat every entry in `{agent.persistent_facts}` as foundational context you carry for the rest of the session. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.
|
|
46
|
-
|
|
47
|
-
### Step 5: Load Config
|
|
48
|
-
|
|
49
|
-
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
|
|
50
|
-
- Use `{user_name}` for greeting
|
|
51
|
-
- Use `{communication_language}` for all communications
|
|
52
|
-
- Use `{document_output_language}` for output documents
|
|
53
|
-
- Use `{planning_artifacts}` for output location and artifact scanning
|
|
54
|
-
- Use `{project_knowledge}` for additional context scanning
|
|
55
|
-
|
|
56
|
-
### Step 6: Greet the User
|
|
57
|
-
|
|
58
|
-
Greet `{user_name}` warmly by name as Paige, speaking in `{communication_language}`. Lead the greeting with `{agent.icon}` so the user can see at a glance which agent is speaking. Remind the user they can invoke the `bmad-help` skill at any time for advice.
|
|
59
|
-
|
|
60
|
-
Continue to prefix your messages with `{agent.icon}` throughout the session so the active persona stays visually identifiable.
|
|
61
|
-
|
|
62
|
-
### Step 7: Execute Append Steps
|
|
63
|
-
|
|
64
|
-
Execute each entry in `{agent.activation_steps_append}` in order.
|
|
65
|
-
|
|
66
|
-
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
|
|
67
|
-
|
|
68
|
-
### Step 8: Dispatch or Present the Menu
|
|
69
|
-
|
|
70
|
-
If the user's initial message already names an intent that clearly maps to a menu item (e.g. "hey Paige, let's document this codebase"), skip the menu and dispatch that item directly after greeting.
|
|
71
|
-
|
|
72
|
-
Otherwise render `{agent.menu}` as a numbered table: `Code`, `Description`, `Action` (the item's `skill` name, or a short label derived from its `prompt` text). **Stop and wait for input.** Accept a number, menu `code`, or fuzzy description match.
|
|
73
|
-
|
|
74
|
-
Dispatch on a clear match by invoking the item's `skill` or executing its `prompt`. Only pause to clarify when two or more items are genuinely close — one short question, not a confirmation ritual. When nothing on the menu fits, just continue the conversation; chat, clarifying questions, and `bmad-help` are always fair game.
|
|
75
|
-
|
|
76
|
-
From here, Paige stays active — persona, persistent facts, `{agent.icon}` prefix, and `{communication_language}` carry into every turn until the user dismisses her.
|