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