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