bmad-method 6.10.1-next.8 → 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 +18 -3
- package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/spec-template.md +1 -1
- package/src/bmm-skills/plan/bmad-spec/assets/stories-schema.md +44 -0
- 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/ship/bmad-build-auto/step-01-clarify-and-route.md +83 -0
- package/src/bmm-skills/ship/bmad-build-auto/step-02-plan.md +27 -0
- 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/ship/bmad-build-auto/workflow.md +104 -0
- 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/SKILL.md +0 -103
- package/src/bmm-skills/4-implementation/bmad-dev-auto/customize.toml +0 -108
- package/src/bmm-skills/4-implementation/bmad-dev-auto/step-01-clarify-and-route.md +0 -66
- package/src/bmm-skills/4-implementation/bmad-dev-auto/step-02-plan.md +0 -31
- 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/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
|
@@ -1,14 +1,30 @@
|
|
|
1
1
|
const { spawnSync } = require('node:child_process');
|
|
2
2
|
const prompts = require('../prompts');
|
|
3
3
|
|
|
4
|
-
// `uv` (https://docs.astral.sh/uv/) is
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// have to assume a particular `python3` is on PATH.
|
|
8
|
-
//
|
|
9
|
-
// is a
|
|
4
|
+
// `uv` (https://docs.astral.sh/uv/) is how BMAD runs the Python scripts its
|
|
5
|
+
// skills shell out to: `uv run <script>` resolves the interpreter and any
|
|
6
|
+
// dependencies on demand from the script's own `requires-python` metadata, so
|
|
7
|
+
// skills don't have to assume a particular `python3` is on PATH.
|
|
8
|
+
//
|
|
9
|
+
// As of v6.11.0 this is a requirement, not a preference: the rendered skills
|
|
10
|
+
// (`bmad-build`, `bmad-build-auto`) render through `render_skill.py` and HALT
|
|
11
|
+
// on activation if `uv` is unavailable — there is no interpreter fallback.
|
|
12
|
+
//
|
|
13
|
+
// The check still never blocks the install. Core-only, docs-only, and CI
|
|
14
|
+
// installs are legitimate and never touch a rendered skill, so a missing `uv`
|
|
15
|
+
// must not fail the run. What it does is tell the truth about what will and
|
|
16
|
+
// will not work afterwards, here and again in the post-install summary.
|
|
10
17
|
const RUNTIME_COMMAND = 'uv';
|
|
11
18
|
|
|
19
|
+
// Probed only when `uv` is absent. Some skills still invoke the interpreter
|
|
20
|
+
// directly (`python3 .../resolve_customization.py`), and those scripts declare
|
|
21
|
+
// `requires-python = ">=3.11"` — `resolve_config.py` hard-exits below it
|
|
22
|
+
// because `tomllib` is a 3.11 stdlib addition. When `uv` is present it
|
|
23
|
+
// provisions its own interpreter and whatever `python3` resolves to on PATH is
|
|
24
|
+
// irrelevant, so probing it then would report a problem that doesn't exist.
|
|
25
|
+
const PYTHON_COMMAND = 'python3';
|
|
26
|
+
const MIN_PYTHON = { major: 3, minor: 11 };
|
|
27
|
+
|
|
12
28
|
/**
|
|
13
29
|
* Parse `uv --version` output into version parts.
|
|
14
30
|
* Example outputs: "uv 0.5.31", "uv 0.5.31 (Homebrew 2025-02-12)".
|
|
@@ -28,13 +44,44 @@ function parseUvVersion(output) {
|
|
|
28
44
|
}
|
|
29
45
|
|
|
30
46
|
/**
|
|
31
|
-
*
|
|
32
|
-
*
|
|
47
|
+
* Parse `python3 --version` output into version parts.
|
|
48
|
+
* Example outputs: "Python 3.11.7", "Python 3.13.0rc1".
|
|
49
|
+
* @param {string} output - stdout/stderr from `python3 --version`
|
|
50
|
+
* @returns {{major: number, minor: number, patch: number, raw: string}|null}
|
|
33
51
|
*/
|
|
34
|
-
function
|
|
52
|
+
function parsePythonVersion(output) {
|
|
53
|
+
if (!output) return null;
|
|
54
|
+
const match = output.match(/Python\s+(\d+)\.(\d+)(?:\.(\d+))?/i);
|
|
55
|
+
if (!match) return null;
|
|
56
|
+
return {
|
|
57
|
+
major: Number(match[1]),
|
|
58
|
+
minor: Number(match[2]),
|
|
59
|
+
patch: Number(match[3] || 0),
|
|
60
|
+
raw: `${match[1]}.${match[2]}.${match[3] || 0}`,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Whether a parsed Python version satisfies the 3.11+ floor the scripts declare.
|
|
66
|
+
* @param {{major: number, minor: number}|null} version
|
|
67
|
+
* @returns {boolean}
|
|
68
|
+
*/
|
|
69
|
+
function pythonMeetsMinimum(version) {
|
|
70
|
+
if (!version) return false;
|
|
71
|
+
if (version.major !== MIN_PYTHON.major) return version.major > MIN_PYTHON.major;
|
|
72
|
+
return version.minor >= MIN_PYTHON.minor;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Run `<command> --version` and hand the combined output to a parser.
|
|
77
|
+
* @param {string} command
|
|
78
|
+
* @param {(output: string) => Object|null} parse
|
|
79
|
+
* @returns {{version: Object}|null}
|
|
80
|
+
*/
|
|
81
|
+
function probeVersion(command, parse) {
|
|
35
82
|
let result;
|
|
36
83
|
try {
|
|
37
|
-
result = spawnSync(
|
|
84
|
+
result = spawnSync(command, ['--version'], {
|
|
38
85
|
encoding: 'utf8',
|
|
39
86
|
timeout: 5000,
|
|
40
87
|
windowsHide: true,
|
|
@@ -43,14 +90,30 @@ function detectUv() {
|
|
|
43
90
|
return null;
|
|
44
91
|
}
|
|
45
92
|
if (!result || result.error) return null;
|
|
46
|
-
const version =
|
|
93
|
+
const version = parse(`${result.stdout || ''}\n${result.stderr || ''}`);
|
|
47
94
|
return version ? { version } : null;
|
|
48
95
|
}
|
|
49
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Probe the local environment for `uv`.
|
|
99
|
+
* @returns {{version: {major: number, minor: number, patch: number, raw: string}}|null}
|
|
100
|
+
*/
|
|
101
|
+
function detectUv() {
|
|
102
|
+
return probeVersion(RUNTIME_COMMAND, parseUvVersion);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Probe the local environment for `python3`.
|
|
107
|
+
* @returns {{version: {major: number, minor: number, patch: number, raw: string}}|null}
|
|
108
|
+
*/
|
|
109
|
+
function detectPython3() {
|
|
110
|
+
return probeVersion(PYTHON_COMMAND, parsePythonVersion);
|
|
111
|
+
}
|
|
112
|
+
|
|
50
113
|
function setupHints() {
|
|
51
114
|
return [
|
|
52
|
-
'
|
|
53
|
-
'
|
|
115
|
+
'`uv run` provisions the interpreter and dependencies for you — no manual',
|
|
116
|
+
'venv or pip, and no need for a particular python3 on PATH.',
|
|
54
117
|
'',
|
|
55
118
|
'Easiest path: ask your AI agent to "install and set up uv for me".',
|
|
56
119
|
'',
|
|
@@ -62,15 +125,42 @@ function setupHints() {
|
|
|
62
125
|
].join('\n');
|
|
63
126
|
}
|
|
64
127
|
|
|
128
|
+
/**
|
|
129
|
+
* Describe what a missing `uv` leaves working, based on the `python3` fallback.
|
|
130
|
+
*
|
|
131
|
+
* With `uv` gone the rendered skills are lost either way; the only question is
|
|
132
|
+
* whether the skills that invoke the interpreter directly still run, and that
|
|
133
|
+
* turns on `python3` being 3.11+.
|
|
134
|
+
*
|
|
135
|
+
* @param {{version: Object}|null} python - result of detectPython3()
|
|
136
|
+
* @returns {string}
|
|
137
|
+
*/
|
|
138
|
+
function pythonFallbackNote(python) {
|
|
139
|
+
if (!python) {
|
|
140
|
+
return 'No python3 on PATH either, so no Python-backed skill will run.';
|
|
141
|
+
}
|
|
142
|
+
if (pythonMeetsMinimum(python.version)) {
|
|
143
|
+
return (
|
|
144
|
+
`python3 ${python.version.raw} is present, so skills that call the interpreter ` +
|
|
145
|
+
'directly still work — but the rendered skills above stay unavailable.'
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
return (
|
|
149
|
+
`python3 ${python.version.raw} is present but below the required ` +
|
|
150
|
+
`${MIN_PYTHON.major}.${MIN_PYTHON.minor}, so no Python-backed skill will run.`
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
65
154
|
/**
|
|
66
155
|
* Check whether `uv` is available and inform the user.
|
|
67
156
|
*
|
|
68
|
-
* Warn-don't-block
|
|
69
|
-
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
157
|
+
* Warn-don't-block: a missing `uv` never stops or fails the install, because
|
|
158
|
+
* core-only and CI installs are legitimate and never render a skill. But the
|
|
159
|
+
* warning names the concrete consequence — `bmad-build` and `bmad-build-auto`
|
|
160
|
+
* halt — rather than describing `uv` as a nice-to-have, and `installer.js`
|
|
161
|
+
* repeats it in the post-install summary so it isn't lost in the scrollback.
|
|
72
162
|
*
|
|
73
|
-
* @returns {Promise<{status: 'found'|'missing', detected: Object|null}>}
|
|
163
|
+
* @returns {Promise<{status: 'found'|'missing', detected: Object|null, python: Object|null}>}
|
|
74
164
|
*/
|
|
75
165
|
async function checkUvEnvironment() {
|
|
76
166
|
// Called via module.exports so tests can stub detection.
|
|
@@ -78,20 +168,28 @@ async function checkUvEnvironment() {
|
|
|
78
168
|
|
|
79
169
|
if (detected) {
|
|
80
170
|
await prompts.log.success(`✅ Python UV check pass (uv ${detected.version.raw} detected).`);
|
|
81
|
-
return { status: 'found', detected };
|
|
171
|
+
return { status: 'found', detected, python: null };
|
|
82
172
|
}
|
|
83
173
|
|
|
174
|
+
const python = module.exports.detectPython3();
|
|
175
|
+
|
|
84
176
|
await prompts.log.warn(
|
|
85
|
-
|
|
86
|
-
'
|
|
87
|
-
'
|
|
177
|
+
'uv not found on PATH. BMAD requires it to run the Python scripts its skills\n' +
|
|
178
|
+
'shell out to: bmad-build and bmad-build-auto render through `uv run` and will\n' +
|
|
179
|
+
'HALT on activation without it — there is no interpreter fallback.\n' +
|
|
180
|
+
`${pythonFallbackNote(python)}\n` +
|
|
181
|
+
'The install itself completes either way.',
|
|
88
182
|
);
|
|
89
|
-
await prompts.note(setupHints(), 'uv
|
|
90
|
-
return { status: 'missing', detected: null };
|
|
183
|
+
await prompts.note(setupHints(), 'uv required');
|
|
184
|
+
return { status: 'missing', detected: null, python };
|
|
91
185
|
}
|
|
92
186
|
|
|
93
187
|
module.exports = {
|
|
94
188
|
checkUvEnvironment,
|
|
95
189
|
detectUv,
|
|
190
|
+
detectPython3,
|
|
96
191
|
parseUvVersion,
|
|
192
|
+
parsePythonVersion,
|
|
193
|
+
pythonMeetsMinimum,
|
|
194
|
+
MIN_PYTHON,
|
|
97
195
|
};
|
|
@@ -434,7 +434,7 @@ class ConfigDrivenIdeSetup {
|
|
|
434
434
|
if (!canonicalId) continue;
|
|
435
435
|
|
|
436
436
|
// Derive source directory from path column
|
|
437
|
-
// path is like "_bmad/bmm/workflows/bmad-quick-flow/bmad-
|
|
437
|
+
// path is like "_bmad/bmm/workflows/bmad-quick-flow/bmad-build-new-preview/SKILL.md"
|
|
438
438
|
// Strip bmadFolderName prefix and join with bmadDir, then get dirname
|
|
439
439
|
const relativePath = record.path.startsWith(bmadPrefix) ? record.path.slice(bmadPrefix.length) : record.path;
|
|
440
440
|
const sourceFile = path.join(bmadDir, relativePath);
|
|
@@ -35,6 +35,13 @@ platforms:
|
|
|
35
35
|
target_dir: .agent/skills
|
|
36
36
|
global_target_dir: ~/.gemini/antigravity/skills
|
|
37
37
|
|
|
38
|
+
antigravity-cli:
|
|
39
|
+
name: "Antigravity CLI (AGY)"
|
|
40
|
+
preferred: false
|
|
41
|
+
installer:
|
|
42
|
+
target_dir: .agents/skills
|
|
43
|
+
global_target_dir: ~/.gemini/antigravity-cli/skills
|
|
44
|
+
|
|
38
45
|
auggie:
|
|
39
46
|
name: "Auggie"
|
|
40
47
|
preferred: false
|
|
@@ -53,7 +53,7 @@ function toDashName(module, type, name) {
|
|
|
53
53
|
/**
|
|
54
54
|
* Convert relative path to flat dash-separated name
|
|
55
55
|
* Converts: 'bmm/agents/pm.md' → 'bmad-agent-bmm-pm.md'
|
|
56
|
-
* Converts: 'bmm/agents/
|
|
56
|
+
* Converts: 'bmm/agents/analyst/analyst.md' → 'bmad-agent-bmm-analyst.md' (uses folder name)
|
|
57
57
|
* Converts: 'bmm/workflows/correct-course.md' → 'bmad-bmm-correct-course.md'
|
|
58
58
|
* Converts: 'core/agents/brainstorming.md' → 'bmad-agent-brainstorming.md' (core agents skip module name)
|
|
59
59
|
*
|
|
@@ -76,7 +76,7 @@ function toDashPath(relativePath) {
|
|
|
76
76
|
let name;
|
|
77
77
|
|
|
78
78
|
// For agents, if nested in a folder (more than 3 parts), use the folder name only
|
|
79
|
-
// e.g., 'bmm/agents/
|
|
79
|
+
// e.g., 'bmm/agents/analyst/analyst' → 'analyst' (not 'analyst-analyst')
|
|
80
80
|
if (type === 'agents' && parts.length > 3) {
|
|
81
81
|
// Use the folder name (parts[2]) as the name, ignore the file name
|
|
82
82
|
name = parts[2];
|
|
@@ -12,8 +12,9 @@ startMessage: |
|
|
|
12
12
|
🌟 100% free. 100% open source. Always.
|
|
13
13
|
No paywalls. No gated content. Knowledge shared, not sold.
|
|
14
14
|
|
|
15
|
-
🐍
|
|
16
|
-
|
|
15
|
+
🐍 REQUIRED: uv (https://docs.astral.sh/uv/) runs the Python scripts BMAD
|
|
16
|
+
skills rely on (`uv run <script>`) and provisions the interpreter itself.
|
|
17
|
+
Without it, bmad-build and bmad-build-auto halt on activation.
|
|
17
18
|
If it's not set up yet, ask your AI agent to "install and set up uv for me".
|
|
18
19
|
|
|
19
20
|
🌐 CONNECT:
|
|
@@ -3,6 +3,7 @@ const os = require('node:os');
|
|
|
3
3
|
const path = require('node:path');
|
|
4
4
|
const { execSync } = require('node:child_process');
|
|
5
5
|
const prompts = require('../prompts');
|
|
6
|
+
const { gitEnv } = require('./git-env');
|
|
6
7
|
|
|
7
8
|
function quoteCustomRef(ref) {
|
|
8
9
|
if (typeof ref !== 'string' || !/^[\w.\-+/]+$/.test(ref)) {
|
|
@@ -418,7 +419,7 @@ class CustomModuleManager {
|
|
|
418
419
|
execSync('git fetch origin --depth 1', {
|
|
419
420
|
cwd: repoCacheDir,
|
|
420
421
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
421
|
-
env: {
|
|
422
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
422
423
|
});
|
|
423
424
|
if (effectiveVersion) {
|
|
424
425
|
// Fetch the ref as either a tag or a branch — `origin <ref>` works
|
|
@@ -427,11 +428,12 @@ class CustomModuleManager {
|
|
|
427
428
|
execSync(`git fetch --depth 1 origin ${quoteCustomRef(effectiveVersion)} --no-tags`, {
|
|
428
429
|
cwd: repoCacheDir,
|
|
429
430
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
430
|
-
env: {
|
|
431
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
431
432
|
});
|
|
432
433
|
execSync(`git checkout --quiet FETCH_HEAD`, {
|
|
433
434
|
cwd: repoCacheDir,
|
|
434
435
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
436
|
+
env: gitEnv(),
|
|
435
437
|
});
|
|
436
438
|
} else {
|
|
437
439
|
// Resolve the default branch (origin/HEAD) and fetch it explicitly.
|
|
@@ -442,6 +444,7 @@ class CustomModuleManager {
|
|
|
442
444
|
defaultBranch = execSync('git symbolic-ref refs/remotes/origin/HEAD --short', {
|
|
443
445
|
cwd: repoCacheDir,
|
|
444
446
|
stdio: 'pipe',
|
|
447
|
+
env: gitEnv(),
|
|
445
448
|
})
|
|
446
449
|
.toString()
|
|
447
450
|
.trim()
|
|
@@ -452,11 +455,12 @@ class CustomModuleManager {
|
|
|
452
455
|
execSync(`git fetch --depth 1 origin ${quoteCustomRef(defaultBranch)}`, {
|
|
453
456
|
cwd: repoCacheDir,
|
|
454
457
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
455
|
-
env: {
|
|
458
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
456
459
|
});
|
|
457
460
|
execSync(`git reset --hard origin/${quoteCustomRef(defaultBranch)}`, {
|
|
458
461
|
cwd: repoCacheDir,
|
|
459
462
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
463
|
+
env: gitEnv(),
|
|
460
464
|
});
|
|
461
465
|
}
|
|
462
466
|
fetchSpinner.stop(`Updated ${displayName}`);
|
|
@@ -477,12 +481,12 @@ class CustomModuleManager {
|
|
|
477
481
|
if (effectiveVersion) {
|
|
478
482
|
execSync(`git clone --depth 1 --branch ${quoteCustomRef(effectiveVersion)} "${parsed.cloneUrl}" "${repoCacheDir}"`, {
|
|
479
483
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
480
|
-
env: {
|
|
484
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
481
485
|
});
|
|
482
486
|
} else {
|
|
483
487
|
execSync(`git clone --depth 1 "${parsed.cloneUrl}" "${repoCacheDir}"`, {
|
|
484
488
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
485
|
-
env: {
|
|
489
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
486
490
|
});
|
|
487
491
|
}
|
|
488
492
|
fetchSpinner.stop(`Cloned ${displayName}`);
|
|
@@ -496,7 +500,7 @@ class CustomModuleManager {
|
|
|
496
500
|
// Record the resolved SHA for the manifest writer.
|
|
497
501
|
let resolvedSha = null;
|
|
498
502
|
try {
|
|
499
|
-
resolvedSha = execSync('git rev-parse HEAD', { cwd: repoCacheDir, stdio: 'pipe' }).toString().trim();
|
|
503
|
+
resolvedSha = execSync('git rev-parse HEAD', { cwd: repoCacheDir, stdio: 'pipe', env: gitEnv() }).toString().trim();
|
|
500
504
|
} catch {
|
|
501
505
|
// swallow — a non-git repo (local path) wouldn't reach here anyway
|
|
502
506
|
}
|
|
@@ -508,6 +512,7 @@ class CustomModuleManager {
|
|
|
508
512
|
const symbolic = execSync('git symbolic-ref --short refs/remotes/origin/HEAD', {
|
|
509
513
|
cwd: repoCacheDir,
|
|
510
514
|
stdio: 'pipe',
|
|
515
|
+
env: gitEnv(),
|
|
511
516
|
})
|
|
512
517
|
.toString()
|
|
513
518
|
.trim();
|
|
@@ -558,6 +563,7 @@ class CustomModuleManager {
|
|
|
558
563
|
cwd: repoCacheDir,
|
|
559
564
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
560
565
|
timeout: 120_000,
|
|
566
|
+
env: gitEnv(), // npm shells out to git for git-URL deps; keep hook GIT_* vars away from it
|
|
561
567
|
});
|
|
562
568
|
installSpinner.stop(`Installed dependencies for ${displayName}`);
|
|
563
569
|
} catch (error_) {
|
|
@@ -5,6 +5,7 @@ const { execSync } = require('node:child_process');
|
|
|
5
5
|
const yaml = require('yaml');
|
|
6
6
|
const prompts = require('../prompts');
|
|
7
7
|
const { resolveChannel, tagExists, parseGitHubRepo } = require('./channel-resolver');
|
|
8
|
+
const { gitEnv } = require('./git-env');
|
|
8
9
|
const { decideChannelForModule } = require('./channel-plan');
|
|
9
10
|
const { getProjectRoot } = require('../project-root');
|
|
10
11
|
|
|
@@ -370,33 +371,34 @@ class ExternalModuleManager {
|
|
|
370
371
|
const fetchSpinner = await createSpinner();
|
|
371
372
|
fetchSpinner.start(`Fetching ${moduleInfo.name}...`);
|
|
372
373
|
try {
|
|
373
|
-
const currentSha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe' }).toString().trim();
|
|
374
|
+
const currentSha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe', env: gitEnv() }).toString().trim();
|
|
374
375
|
|
|
375
376
|
if (resolved.channel === 'next') {
|
|
376
377
|
execSync('git fetch origin --depth 1', {
|
|
377
378
|
cwd: moduleCacheDir,
|
|
378
379
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
379
|
-
env: {
|
|
380
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
380
381
|
});
|
|
381
382
|
execSync('git reset --hard origin/HEAD', {
|
|
382
383
|
cwd: moduleCacheDir,
|
|
383
384
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
384
|
-
env: {
|
|
385
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
385
386
|
});
|
|
386
387
|
} else {
|
|
387
388
|
// stable or pinned — fetch the specific tag and check it out.
|
|
388
389
|
execSync(`git fetch --depth 1 origin tag ${quoteShell(resolved.ref)} --no-tags`, {
|
|
389
390
|
cwd: moduleCacheDir,
|
|
390
391
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
391
|
-
env: {
|
|
392
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
392
393
|
});
|
|
393
394
|
execSync(`git checkout --quiet FETCH_HEAD`, {
|
|
394
395
|
cwd: moduleCacheDir,
|
|
395
396
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
397
|
+
env: gitEnv(),
|
|
396
398
|
});
|
|
397
399
|
}
|
|
398
400
|
|
|
399
|
-
const newSha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe' }).toString().trim();
|
|
401
|
+
const newSha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe', env: gitEnv() }).toString().trim();
|
|
400
402
|
fetchSpinner.stop(`Fetched ${moduleInfo.name}`);
|
|
401
403
|
if (currentSha !== newSha) needsDependencyInstall = true;
|
|
402
404
|
} catch {
|
|
@@ -415,12 +417,12 @@ class ExternalModuleManager {
|
|
|
415
417
|
if (resolved.channel === 'next') {
|
|
416
418
|
execSync(`git clone --depth 1 "${moduleInfo.url}" "${moduleCacheDir}"`, {
|
|
417
419
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
418
|
-
env: {
|
|
420
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
419
421
|
});
|
|
420
422
|
} else {
|
|
421
423
|
execSync(`git clone --depth 1 --branch ${quoteShell(resolved.ref)} "${moduleInfo.url}" "${moduleCacheDir}"`, {
|
|
422
424
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
423
|
-
env: {
|
|
425
|
+
env: gitEnv({ GIT_TERMINAL_PROMPT: '0' }),
|
|
424
426
|
});
|
|
425
427
|
}
|
|
426
428
|
fetchSpinner.stop(`Fetched ${moduleInfo.name}`);
|
|
@@ -431,7 +433,7 @@ class ExternalModuleManager {
|
|
|
431
433
|
}
|
|
432
434
|
|
|
433
435
|
// Record resolution (channel + tag + SHA) for the manifest writer to pick up.
|
|
434
|
-
const sha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe' }).toString().trim();
|
|
436
|
+
const sha = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe', env: gitEnv() }).toString().trim();
|
|
435
437
|
ExternalModuleManager._resolutions.set(moduleCode, {
|
|
436
438
|
channel: resolved.channel,
|
|
437
439
|
version: resolved.version,
|
|
@@ -459,6 +461,7 @@ class ExternalModuleManager {
|
|
|
459
461
|
cwd: moduleCacheDir,
|
|
460
462
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
461
463
|
timeout: 120_000, // 2 minute timeout
|
|
464
|
+
env: gitEnv(), // npm shells out to git for git-URL deps; keep hook GIT_* vars away from it
|
|
462
465
|
});
|
|
463
466
|
installSpinner.stop(`Installed dependencies for ${moduleInfo.name}`);
|
|
464
467
|
} catch (error) {
|
|
@@ -485,6 +488,7 @@ class ExternalModuleManager {
|
|
|
485
488
|
cwd: moduleCacheDir,
|
|
486
489
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
487
490
|
timeout: 120_000, // 2 minute timeout
|
|
491
|
+
env: gitEnv(), // npm shells out to git for git-URL deps; keep hook GIT_* vars away from it
|
|
488
492
|
});
|
|
489
493
|
installSpinner.stop(`Installed dependencies for ${moduleInfo.name}`);
|
|
490
494
|
} catch (error) {
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sanitized environment for spawning git subprocesses.
|
|
3
|
+
*
|
|
4
|
+
* When the installer runs inside a git hook (e.g. `npm test` from a
|
|
5
|
+
* pre-commit hook), git exports repo-targeting variables — GIT_DIR,
|
|
6
|
+
* GIT_INDEX_FILE, GIT_WORK_TREE, etc. — into the hook's environment. A
|
|
7
|
+
* spawned `git` inherits them and silently operates on the hook's repository
|
|
8
|
+
* instead of the cwd passed to execSync (GIT_DIR overrides directory
|
|
9
|
+
* discovery, and the cwd then becomes its work tree). In a worktree checkout
|
|
10
|
+
* this let a cache refresh shallow-fetch and hard-reset the developer's own
|
|
11
|
+
* repo. Strip these variables so cache-directory git commands can only ever
|
|
12
|
+
* act on the repository at their cwd.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const REPO_TARGETING_VARS = [
|
|
16
|
+
'GIT_DIR',
|
|
17
|
+
'GIT_WORK_TREE',
|
|
18
|
+
'GIT_INDEX_FILE',
|
|
19
|
+
'GIT_COMMON_DIR',
|
|
20
|
+
'GIT_OBJECT_DIRECTORY',
|
|
21
|
+
'GIT_ALTERNATE_OBJECT_DIRECTORIES',
|
|
22
|
+
'GIT_PREFIX',
|
|
23
|
+
'GIT_NAMESPACE',
|
|
24
|
+
// `git -c key=val` exports its overrides to hook subprocesses through these;
|
|
25
|
+
// a core.worktree override can retarget the work tree just like GIT_WORK_TREE.
|
|
26
|
+
'GIT_CONFIG_PARAMETERS',
|
|
27
|
+
'GIT_CONFIG_COUNT',
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
// GIT_CONFIG_KEY_0 / GIT_CONFIG_VALUE_0 ... — the enumerated form of the same mechanism.
|
|
31
|
+
const CONFIG_PAIR_VAR = /^GIT_CONFIG_(KEY|VALUE)_\d+$/;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Build the environment for a git child process.
|
|
35
|
+
* @param {Object} [extra] - Additional variables to set (e.g. GIT_TERMINAL_PROMPT)
|
|
36
|
+
* @returns {Object} process.env minus repo-targeting GIT_* vars, plus extras
|
|
37
|
+
*/
|
|
38
|
+
function gitEnv(extra = {}) {
|
|
39
|
+
const env = { ...process.env, ...extra };
|
|
40
|
+
for (const name of REPO_TARGETING_VARS) delete env[name];
|
|
41
|
+
for (const name of Object.keys(env)) {
|
|
42
|
+
if (CONFIG_PAIR_VAR.test(name)) delete env[name];
|
|
43
|
+
}
|
|
44
|
+
return env;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
module.exports = { gitEnv };
|
|
@@ -922,7 +922,7 @@ class OfficialModules {
|
|
|
922
922
|
|
|
923
923
|
// Fallback: legacy per-module config.yaml files (pre-v6 installations).
|
|
924
924
|
const entries = await fs.readdir(bmadDir, { withFileTypes: true });
|
|
925
|
-
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
925
|
+
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom', 'render']);
|
|
926
926
|
for (const entry of entries) {
|
|
927
927
|
if (entry.isDirectory()) {
|
|
928
928
|
if (nonModuleDirs.has(entry.name)) {
|