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.
Files changed (349) hide show
  1. package/.claude-plugin/marketplace.json +30 -57
  2. package/README.md +49 -82
  3. package/README_CN.md +10 -10
  4. package/README_VN.md +11 -11
  5. package/bmad-modules.yaml +43 -39
  6. package/package.json +7 -3
  7. package/removals.txt +17 -0
  8. package/src/bmm-skills/{1-analysis → agents}/bmad-agent-analyst/SKILL.md +1 -1
  9. package/src/bmm-skills/{1-analysis → agents}/bmad-agent-analyst/customize.toml +22 -7
  10. package/src/bmm-skills/{3-solutioning → agents}/bmad-agent-architect/SKILL.md +1 -1
  11. package/src/bmm-skills/{3-solutioning → agents}/bmad-agent-architect/customize.toml +2 -2
  12. package/src/bmm-skills/{4-implementation → agents}/bmad-agent-dev/SKILL.md +1 -1
  13. package/src/bmm-skills/{4-implementation → agents}/bmad-agent-dev/customize.toml +7 -14
  14. package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-pm/SKILL.md +1 -1
  15. package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-pm/customize.toml +2 -2
  16. package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-ux-designer/SKILL.md +1 -1
  17. package/src/bmm-skills/module-help.csv +14 -26
  18. package/src/bmm-skills/module.yaml +5 -15
  19. package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/SKILL.md +3 -3
  20. package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/customize.toml +4 -2
  21. package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/SKILL.md +1 -1
  22. package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-04-final-validation.md +1 -1
  23. package/src/bmm-skills/plan/bmad-generate-project-context/SKILL.md +10 -0
  24. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/SKILL.md +3 -1
  25. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/prd-template.md +1 -1
  26. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/customize.toml +5 -3
  27. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/references/validate.md +3 -3
  28. package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/SKILL.md +1 -1
  29. package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/bmad-manifest.json +1 -1
  30. package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/verdict.md +1 -1
  31. package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/SKILL.md +1 -1
  32. package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/customize.toml +5 -3
  33. package/src/bmm-skills/plan/bmad-project-context/SKILL.md +110 -0
  34. package/src/bmm-skills/plan/bmad-project-context/customize.toml +24 -0
  35. package/src/bmm-skills/plan/bmad-project-context/references/best-practices.md +65 -0
  36. package/src/bmm-skills/plan/bmad-project-context/references/template.md +55 -0
  37. package/src/{core-skills → bmm-skills/plan}/bmad-spec/SKILL.md +1 -1
  38. package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/spec-template.md +1 -1
  39. package/src/{core-skills → bmm-skills/plan}/bmad-spec/customize.toml +3 -4
  40. package/src/bmm-skills/plan/bmad-sprint-planning/SKILL.md +62 -0
  41. package/src/bmm-skills/plan/bmad-sprint-planning/references/fix-sprint-status.md +30 -0
  42. package/src/bmm-skills/plan/bmad-sprint-planning/references/generate-tracking.md +25 -0
  43. package/src/bmm-skills/plan/bmad-sprint-planning/references/readiness-gate.md +20 -0
  44. package/src/bmm-skills/plan/bmad-sprint-planning/references/status-view.md +14 -0
  45. package/src/bmm-skills/plan/bmad-sprint-planning/references/validate.md +10 -0
  46. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/__pycache__/sprint_plan.cpython-311.pyc +0 -0
  47. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/sprint_plan.py +697 -0
  48. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-311-pytest-9.1.1.pyc +0 -0
  49. package/src/bmm-skills/plan/bmad-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
  50. package/src/bmm-skills/{4-implementation → plan}/bmad-sprint-planning/sprint-status-template.yaml +9 -7
  51. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/SKILL.md +1 -1
  52. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/color-themes.md +1 -1
  53. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/customize.toml +4 -2
  54. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/creative-tools.md +1 -1
  55. package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/validate.md +1 -1
  56. package/src/bmm-skills/ship/bmad-build/SKILL.md +13 -0
  57. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/compile-epic-context.md +1 -1
  58. package/src/bmm-skills/ship/bmad-build/customize.toml +164 -0
  59. package/src/bmm-skills/ship/bmad-build/references/deletion-check.md +14 -0
  60. package/src/bmm-skills/ship/bmad-build/review-prompts/edge-case-hunter.md +88 -0
  61. package/src/bmm-skills/ship/bmad-build/review-prompts/verification-gap.md +113 -0
  62. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-01-clarify-and-route.md +20 -19
  63. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-02-plan.md +5 -9
  64. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-03-implement.md +10 -6
  65. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-04-review.md +9 -15
  66. package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/step-05-present.md +10 -13
  67. package/src/bmm-skills/ship/bmad-build/step-oneshot.md +77 -0
  68. package/src/bmm-skills/ship/bmad-build/sync-sprint-status.md +19 -0
  69. package/src/bmm-skills/ship/bmad-build/workflow.md +84 -0
  70. package/src/bmm-skills/ship/bmad-build-auto/SKILL.md +13 -0
  71. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/compile-epic-context.md +1 -1
  72. package/src/bmm-skills/ship/bmad-build-auto/customize.toml +121 -0
  73. 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
  74. package/src/{core-skills/bmad-review-verification-gap/SKILL.md → bmm-skills/ship/bmad-build-auto/review-prompts/verification-gap.md} +15 -8
  75. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/spec-template.md +2 -1
  76. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-01-clarify-and-route.md +16 -17
  77. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-02-plan.md +5 -9
  78. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-03-implement.md +6 -4
  79. package/src/bmm-skills/{4-implementation/bmad-dev-auto → ship/bmad-build-auto}/step-04-review.md +26 -25
  80. package/src/bmm-skills/{4-implementation/bmad-dev-auto/SKILL.md → ship/bmad-build-auto/workflow.md} +27 -46
  81. package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/SKILL.md +1 -1
  82. package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-05-wrapup.md +1 -1
  83. package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/SKILL.md +1 -1
  84. package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/customize.toml +37 -17
  85. package/src/bmm-skills/ship/bmad-code-review/references/deletion-check.md +14 -0
  86. package/src/bmm-skills/ship/bmad-code-review/review-prompts/edge-case-hunter.md +88 -0
  87. package/src/bmm-skills/ship/bmad-code-review/review-prompts/verification-gap.md +113 -0
  88. package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-01-gather-context.md +7 -4
  89. package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-02-review.md +1 -1
  90. package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-04-present.md +1 -1
  91. package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/SKILL.md +7 -8
  92. package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/SKILL.md +2 -2
  93. package/src/bmm-skills/ship/bmad-retrospective/SKILL.md +94 -0
  94. package/src/bmm-skills/{4-implementation → ship}/bmad-retrospective/customize.toml +2 -2
  95. package/src/bmm-skills/ship/bmad-retrospective/references/acceptance-verdict.md +55 -0
  96. package/src/bmm-skills/ship/bmad-retrospective/references/aggregate-views.md +17 -0
  97. package/src/bmm-skills/ship/bmad-retrospective/references/evidence-gathering.md +30 -0
  98. package/src/bmm-skills/ship/bmad-retrospective/references/retro-document.md +84 -0
  99. package/src/bmm-skills/ship/bmad-retrospective/references/team-discussion.md +22 -0
  100. package/src/bmm-skills/ship/bmad-retrospective/scripts/__pycache__/sprint_status.cpython-311.pyc +0 -0
  101. package/src/bmm-skills/ship/bmad-retrospective/scripts/git_evidence.py +304 -0
  102. package/src/bmm-skills/ship/bmad-retrospective/scripts/sprint_status.py +746 -0
  103. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-311-pytest-9.1.1.pyc +0 -0
  104. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-311-pytest-9.1.1.pyc +0 -0
  105. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
  106. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_git_evidence.py +750 -0
  107. package/src/bmm-skills/ship/bmad-retrospective/scripts/tests/test_sprint_status.py +1579 -0
  108. package/src/bmm-skills/v6-shims/README.md +28 -0
  109. package/src/bmm-skills/{3-solutioning → v6-shims}/bmad-create-architecture/SKILL.md +2 -2
  110. package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-create-prd/SKILL.md +4 -4
  111. package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/SKILL.md +5 -3
  112. package/src/bmm-skills/v6-shims/bmad-dev-auto/SKILL.md +19 -0
  113. package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/SKILL.md +5 -3
  114. package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/customize.toml +3 -0
  115. package/src/bmm-skills/v6-shims/bmad-document-project/SKILL.md +14 -0
  116. package/src/bmm-skills/v6-shims/bmad-domain-research/SKILL.md +14 -0
  117. package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-edit-prd/SKILL.md +4 -4
  118. package/src/bmm-skills/v6-shims/bmad-market-research/SKILL.md +14 -0
  119. package/src/bmm-skills/v6-shims/bmad-quick-dev/SKILL.md +19 -0
  120. package/src/bmm-skills/v6-shims/bmad-sprint-status/SKILL.md +26 -0
  121. package/src/bmm-skills/v6-shims/bmad-technical-research/SKILL.md +14 -0
  122. package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-validate-prd/SKILL.md +4 -4
  123. package/src/core-skills/bmad-advanced-elicitation/SKILL.md +26 -103
  124. package/src/core-skills/bmad-advanced-elicitation/customize.toml +54 -0
  125. package/src/core-skills/bmad-advanced-elicitation/scripts/pick_methods.py +233 -0
  126. package/src/core-skills/bmad-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
  127. package/src/core-skills/bmad-brainstorming/SKILL.md +3 -3
  128. package/src/core-skills/bmad-brainstorming/assets/brain-selector.html +2 -0
  129. package/src/core-skills/bmad-brainstorming/references/mode-autonomous.md +1 -1
  130. package/src/core-skills/bmad-brainstorming/scripts/brain.py +36 -6
  131. package/src/core-skills/bmad-brainstorming/scripts/tests/test_brain.py +22 -0
  132. package/src/core-skills/bmad-customize/SKILL.md +2 -2
  133. package/src/core-skills/bmad-deep-recon/SKILL.md +82 -0
  134. package/src/core-skills/bmad-deep-recon/assets/research.template.md +18 -0
  135. package/src/core-skills/bmad-deep-recon/customize.toml +212 -0
  136. package/src/core-skills/bmad-deep-recon/references/draft.md +8 -0
  137. package/src/core-skills/bmad-deep-recon/references/finalize.md +11 -0
  138. package/src/core-skills/bmad-deep-recon/references/html-briefing.md +16 -0
  139. package/src/core-skills/bmad-deep-recon/references/lifecycle.md +11 -0
  140. package/src/core-skills/bmad-deep-recon/references/process.md +10 -0
  141. package/src/core-skills/bmad-deep-recon/references/run.md +73 -0
  142. package/src/core-skills/bmad-deep-recon/references/selection.md +13 -0
  143. package/src/core-skills/bmad-deep-recon/references/synthesis.md +16 -0
  144. package/src/core-skills/bmad-deep-recon/references/verification.md +29 -0
  145. package/src/core-skills/bmad-deep-recon/scripts/recon_kit.py +322 -0
  146. package/src/core-skills/bmad-deep-recon/scripts/tests/test_recon_kit.py +144 -0
  147. package/src/core-skills/bmad-deep-recon/types/academic-lit.md +19 -0
  148. package/src/core-skills/bmad-deep-recon/types/competitive.md +19 -0
  149. package/src/core-skills/bmad-deep-recon/types/domain.md +19 -0
  150. package/src/core-skills/bmad-deep-recon/types/market.md +19 -0
  151. package/src/core-skills/bmad-deep-recon/types/technical.md +19 -0
  152. package/src/core-skills/bmad-deep-recon/types/user-voice.md +19 -0
  153. package/src/core-skills/bmad-forge-idea/SKILL.md +2 -2
  154. package/src/core-skills/bmad-forge-idea/scripts/resolve_personas.py +7 -2
  155. package/src/core-skills/bmad-help/SKILL.md +3 -3
  156. package/src/core-skills/bmad-party-mode/SKILL.md +2 -2
  157. package/src/core-skills/bmad-party-mode/customize.toml +1 -1
  158. package/src/core-skills/bmad-party-mode/scripts/resolve_party.py +14 -4
  159. package/src/core-skills/bmad-review/SKILL.md +49 -0
  160. package/src/core-skills/bmad-review/customize.toml +141 -0
  161. package/src/core-skills/bmad-review/references/editorial-common.md +56 -0
  162. package/src/core-skills/bmad-review/references/lens-adversarial.md +19 -0
  163. package/src/core-skills/bmad-review/references/lens-edge-case-hunter.md +54 -0
  164. package/src/core-skills/bmad-review/references/lens-prose.md +7 -0
  165. package/src/core-skills/bmad-review/references/lens-structure.md +9 -0
  166. package/src/core-skills/bmad-review/references/lens-verification-gap.md +92 -0
  167. package/src/core-skills/bmad-review/references/structure-models.md +44 -0
  168. package/src/core-skills/bmad-review/scripts/tests/test_word_metrics.py +62 -0
  169. package/src/core-skills/bmad-review/scripts/word_metrics.py +102 -0
  170. package/src/core-skills/module-help.csv +4 -8
  171. package/src/core-skills/module.yaml +5 -0
  172. package/src/core-skills/v6-shims/README.md +25 -0
  173. package/src/core-skills/v6-shims/bmad-editorial-review/SKILL.md +6 -0
  174. package/src/core-skills/v6-shims/bmad-editorial-review/customize.toml +31 -0
  175. package/src/core-skills/v6-shims/bmad-editorial-review-prose/SKILL.md +6 -0
  176. package/src/core-skills/v6-shims/bmad-editorial-review-structure/SKILL.md +6 -0
  177. package/src/core-skills/v6-shims/bmad-review-adversarial-general/SKILL.md +6 -0
  178. package/src/core-skills/v6-shims/bmad-review-edge-case-hunter/SKILL.md +6 -0
  179. package/src/core-skills/v6-shims/bmad-review-verification-gap/SKILL.md +6 -0
  180. package/src/scripts/__pycache__/config_utils.cpython-311.pyc +0 -0
  181. package/src/scripts/config_utils.py +119 -0
  182. package/src/scripts/render_skill.py +401 -0
  183. package/src/scripts/resolve_config.py +32 -136
  184. package/src/scripts/resolve_customization.py +43 -184
  185. package/src/scripts/tests/__pycache__/test_config_utils.cpython-311.pyc +0 -0
  186. package/src/scripts/tests/__pycache__/test_resolve_config.cpython-311.pyc +0 -0
  187. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-311.pyc +0 -0
  188. package/src/scripts/tests/test_config_utils.py +85 -0
  189. package/src/scripts/tests/test_resolve_config.py +89 -0
  190. package/src/scripts/tests/test_resolve_customization.py +27 -0
  191. package/tools/installer/cli-utils.js +6 -2
  192. package/tools/installer/core/installer.js +31 -9
  193. package/tools/installer/core/manifest-generator.js +1 -1
  194. package/tools/installer/core/uv-check.js +122 -24
  195. package/tools/installer/ide/_config-driven.js +1 -1
  196. package/tools/installer/ide/platform-codes.yaml +7 -0
  197. package/tools/installer/ide/shared/path-utils.js +2 -2
  198. package/tools/installer/install-messages.yaml +3 -2
  199. package/tools/installer/modules/custom-module-manager.js +12 -6
  200. package/tools/installer/modules/external-manager.js +12 -8
  201. package/tools/installer/modules/git-env.js +47 -0
  202. package/tools/installer/modules/official-modules.js +1 -1
  203. package/tools/installer/prompts.js +41 -102
  204. package/tools/installer/ui.js +99 -22
  205. package/tools/skill-validator.md +11 -1
  206. package/tools/validate-published-implementation-model.mjs +68 -0
  207. package/tools/validate-skills.js +33 -0
  208. package/web-bundles/prd-coach/prd-template.md +1 -1
  209. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/SKILL.md +0 -76
  210. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/customize.toml +0 -81
  211. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/explain-concept.md +0 -20
  212. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/mermaid-gen.md +0 -20
  213. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/validate-doc.md +0 -19
  214. package/src/bmm-skills/1-analysis/bmad-agent-tech-writer/write-document.md +0 -20
  215. package/src/bmm-skills/1-analysis/bmad-document-project/SKILL.md +0 -62
  216. package/src/bmm-skills/1-analysis/bmad-document-project/checklist.md +0 -245
  217. package/src/bmm-skills/1-analysis/bmad-document-project/customize.toml +0 -41
  218. package/src/bmm-skills/1-analysis/bmad-document-project/documentation-requirements.csv +0 -12
  219. package/src/bmm-skills/1-analysis/bmad-document-project/instructions.md +0 -128
  220. package/src/bmm-skills/1-analysis/bmad-document-project/templates/deep-dive-template.md +0 -345
  221. package/src/bmm-skills/1-analysis/bmad-document-project/templates/index-template.md +0 -169
  222. package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-overview-template.md +0 -103
  223. package/src/bmm-skills/1-analysis/bmad-document-project/templates/project-scan-report-schema.json +0 -160
  224. package/src/bmm-skills/1-analysis/bmad-document-project/templates/source-tree-template.md +0 -135
  225. package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-instructions.md +0 -300
  226. package/src/bmm-skills/1-analysis/bmad-document-project/workflows/deep-dive-workflow.md +0 -34
  227. package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-instructions.md +0 -1108
  228. package/src/bmm-skills/1-analysis/bmad-document-project/workflows/full-scan-workflow.md +0 -34
  229. package/src/bmm-skills/1-analysis/research/bmad-domain-research/SKILL.md +0 -96
  230. package/src/bmm-skills/1-analysis/research/bmad-domain-research/customize.toml +0 -41
  231. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-01-init.md +0 -137
  232. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-02-domain-analysis.md +0 -229
  233. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +0 -238
  234. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +0 -206
  235. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-05-technical-trends.md +0 -234
  236. package/src/bmm-skills/1-analysis/research/bmad-domain-research/domain-steps/step-06-research-synthesis.md +0 -450
  237. package/src/bmm-skills/1-analysis/research/bmad-domain-research/research.template.md +0 -29
  238. package/src/bmm-skills/1-analysis/research/bmad-market-research/SKILL.md +0 -96
  239. package/src/bmm-skills/1-analysis/research/bmad-market-research/customize.toml +0 -41
  240. package/src/bmm-skills/1-analysis/research/bmad-market-research/research.template.md +0 -29
  241. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-01-init.md +0 -184
  242. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-02-customer-behavior.md +0 -239
  243. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-03-customer-pain-points.md +0 -251
  244. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-04-customer-decisions.md +0 -261
  245. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-05-competitive-analysis.md +0 -173
  246. package/src/bmm-skills/1-analysis/research/bmad-market-research/steps/step-06-research-completion.md +0 -484
  247. package/src/bmm-skills/1-analysis/research/bmad-technical-research/SKILL.md +0 -96
  248. package/src/bmm-skills/1-analysis/research/bmad-technical-research/customize.toml +0 -41
  249. package/src/bmm-skills/1-analysis/research/bmad-technical-research/research.template.md +0 -29
  250. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-01-init.md +0 -137
  251. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-02-technical-overview.md +0 -239
  252. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-03-integration-patterns.md +0 -248
  253. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +0 -202
  254. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-05-implementation-research.md +0 -233
  255. package/src/bmm-skills/1-analysis/research/bmad-technical-research/technical-steps/step-06-research-synthesis.md +0 -493
  256. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/SKILL.md +0 -91
  257. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/customize.toml +0 -41
  258. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +0 -179
  259. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +0 -168
  260. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +0 -169
  261. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +0 -129
  262. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +0 -241
  263. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +0 -132
  264. package/src/bmm-skills/3-solutioning/bmad-check-implementation-readiness/templates/readiness-report-template.md +0 -4
  265. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/SKILL.md +0 -81
  266. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/customize.toml +0 -41
  267. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/project-context-template.md +0 -21
  268. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-01-discover.md +0 -186
  269. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-02-generate.md +0 -321
  270. package/src/bmm-skills/3-solutioning/bmad-generate-project-context/steps/step-03-complete.md +0 -284
  271. package/src/bmm-skills/4-implementation/bmad-dev-auto/customize.toml +0 -108
  272. package/src/bmm-skills/4-implementation/bmad-quick-dev/SKILL.md +0 -115
  273. package/src/bmm-skills/4-implementation/bmad-quick-dev/customize.toml +0 -83
  274. package/src/bmm-skills/4-implementation/bmad-quick-dev/step-oneshot.md +0 -82
  275. package/src/bmm-skills/4-implementation/bmad-quick-dev/sync-sprint-status.md +0 -19
  276. package/src/bmm-skills/4-implementation/bmad-retrospective/SKILL.md +0 -1527
  277. package/src/bmm-skills/4-implementation/bmad-sprint-planning/SKILL.md +0 -319
  278. package/src/bmm-skills/4-implementation/bmad-sprint-planning/checklist.md +0 -34
  279. package/src/bmm-skills/4-implementation/bmad-sprint-status/SKILL.md +0 -311
  280. package/src/core-skills/bmad-brainstorming/analysis/catalog-analysis.md +0 -239
  281. package/src/core-skills/bmad-brainstorming/analysis/method-matrix.csv +0 -109
  282. package/src/core-skills/bmad-editorial-review-prose/SKILL.md +0 -86
  283. package/src/core-skills/bmad-editorial-review-structure/SKILL.md +0 -179
  284. package/src/core-skills/bmad-index-docs/SKILL.md +0 -66
  285. package/src/core-skills/bmad-review-adversarial-general/SKILL.md +0 -37
  286. package/src/core-skills/bmad-shard-doc/SKILL.md +0 -105
  287. /package/src/bmm-skills/{2-plan-workflows → agents}/bmad-agent-ux-designer/customize.toml +0 -0
  288. /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/assets/spine-template.md +0 -0
  289. /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/references/headless.md +0 -0
  290. /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/references/reviewer-gate.md +0 -0
  291. /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/scripts/lint_spine.py +0 -0
  292. /package/src/bmm-skills/{3-solutioning → plan}/bmad-architecture/scripts/tests/test_lint_spine.py +0 -0
  293. /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/customize.toml +0 -0
  294. /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +0 -0
  295. /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-02-design-epics.md +0 -0
  296. /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/steps/step-03-create-stories.md +0 -0
  297. /package/src/bmm-skills/{3-solutioning → plan}/bmad-create-epics-and-stories/templates/epics-template.md +0 -0
  298. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/headless-schemas.md +0 -0
  299. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/prd-validation-checklist.md +0 -0
  300. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/assets/validation-report-template.html +0 -0
  301. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-prd/references/headless.md +0 -0
  302. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/agents/artifact-analyzer.md +0 -0
  303. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/agents/web-researcher.md +0 -0
  304. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/assets/prfaq-template.md +0 -0
  305. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/customize.toml +0 -0
  306. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/customer-faq.md +0 -0
  307. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/internal-faq.md +0 -0
  308. /package/src/bmm-skills/{1-analysis → plan}/bmad-prfaq/references/press-release.md +0 -0
  309. /package/src/bmm-skills/{1-analysis → plan}/bmad-product-brief/assets/brief-template.md +0 -0
  310. /package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/headless-schemas.md +0 -0
  311. /package/src/{core-skills → bmm-skills/plan}/bmad-spec/assets/stories-schema.md +0 -0
  312. /package/src/bmm-skills/{4-implementation → plan}/bmad-sprint-planning/customize.toml +0 -0
  313. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-directions.md +0 -0
  314. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-editorial.md +0 -0
  315. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-mobile.md +0 -0
  316. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/design-example-shadcn.md +0 -0
  317. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/excalidraw-wireframe.md +0 -0
  318. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/experience-example-mobile.md +0 -0
  319. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/experience-example-shadcn.md +0 -0
  320. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/headless-schemas.md +0 -0
  321. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/key-screens.md +0 -0
  322. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/assets/validation-report-template.html +0 -0
  323. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/design-md-spec.md +0 -0
  324. /package/src/bmm-skills/{2-plan-workflows → plan}/bmad-ux/references/headless.md +0 -0
  325. /package/src/bmm-skills/{4-implementation/bmad-quick-dev → ship/bmad-build}/spec-template.md +0 -0
  326. /package/src/{core-skills/bmad-review-edge-case-hunter → bmm-skills/ship/bmad-build-auto}/references/deletion-check.md +0 -0
  327. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/customize.toml +0 -0
  328. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/generate-trail.md +0 -0
  329. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-01-orientation.md +0 -0
  330. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-02-walkthrough.md +0 -0
  331. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-03-detail-pass.md +0 -0
  332. /package/src/bmm-skills/{4-implementation → ship}/bmad-checkpoint-preview/step-04-testing.md +0 -0
  333. /package/src/bmm-skills/{4-implementation → ship}/bmad-code-review/steps/step-03-triage.md +0 -0
  334. /package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/checklist.md +0 -0
  335. /package/src/bmm-skills/{4-implementation → ship}/bmad-correct-course/customize.toml +0 -0
  336. /package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/checklist.md +0 -0
  337. /package/src/bmm-skills/{4-implementation → ship}/bmad-qa-generate-e2e-tests/customize.toml +0 -0
  338. /package/src/bmm-skills/{3-solutioning → v6-shims}/bmad-create-architecture/customize.toml +0 -0
  339. /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-create-prd/customize.toml +0 -0
  340. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/checklist.md +0 -0
  341. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/customize.toml +0 -0
  342. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/discover-inputs.md +0 -0
  343. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-create-story/template.md +0 -0
  344. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-dev-story/checklist.md +0 -0
  345. /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-edit-prd/customize.toml +0 -0
  346. /package/src/bmm-skills/{4-implementation → v6-shims}/bmad-sprint-status/customize.toml +0 -0
  347. /package/src/bmm-skills/{2-plan-workflows → v6-shims}/bmad-validate-prd/customize.toml +0 -0
  348. /package/src/core-skills/bmad-advanced-elicitation/{methods.csv → assets/methods.csv} +0 -0
  349. /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 becoming the de facto standard for
5
- // running the Python scripts BMAD workflows shell out to: `uv run <script>`
6
- // resolves the interpreter and any dependencies on demand, so skills don't
7
- // have to assume a particular `python3` is on PATH. The ecosystem is mid-
8
- // migration — some skills still call `python3` directly — so a missing `uv`
9
- // is a warning, not a blocker: BMAD installs and runs either way.
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
- * Probe the local environment for `uv`.
32
- * @returns {{version: {major: number, minor: number, patch: number, raw: string}}|null}
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 detectUv() {
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(RUNTIME_COMMAND, ['--version'], {
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 = parseUvVersion(`${result.stdout || ''}\n${result.stderr || ''}`);
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
- 'BMAD workflows increasingly run Python scripts via `uv run`, which manages',
53
- 'the interpreter and dependencies for you — no manual venv or pip needed.',
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, and no acknowledgement prompt: `uv` is on its way to being
69
- * the standard runner for BMAD's Python scripts, but the migration is still in
70
- * progress, so the install never stops on its account. The note tells the user
71
- * how to set it up (preferably by asking their agent).
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
- "uv not found on PATH. uv is becoming the de facto standard for running BMAD's Python\n" +
86
- 'scripts (`uv run <script>`), and it provisions the interpreter for you. BMAD installs\n' +
87
- 'fine without it, but setting up uv now keeps you ahead as workflows adopt it.',
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 recommended');
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-quick-dev-new-preview/SKILL.md"
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/tech-writer/tech-writer.md' → 'bmad-agent-bmm-tech-writer.md' (uses folder name)
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/tech-writer/tech-writer' → 'tech-writer' (not 'tech-writer-tech-writer')
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
- 🐍 HEADS UP: uv (https://docs.astral.sh/uv/) is becoming the de facto standard
16
- for running the Python scripts BMAD workflows rely on (`uv run <script>`).
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
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)) {