bmad-method 6.0.0-alpha.13 → 6.0.0-alpha.15

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 (355) hide show
  1. package/.coderabbit.yaml +36 -0
  2. package/.github/CODE_OF_CONDUCT.md +128 -0
  3. package/.github/ISSUE_TEMPLATE/idea_submission.md +1 -1
  4. package/.github/scripts/discord-helpers.sh +15 -0
  5. package/.github/workflows/discord.yaml +278 -8
  6. package/.github/workflows/quality.yaml +19 -0
  7. package/.markdownlint-cli2.yaml +42 -0
  8. package/.prettierignore +3 -0
  9. package/CHANGELOG.md +183 -360
  10. package/README.md +4 -1
  11. package/docs/agent-customization-guide.md +2 -2
  12. package/docs/custom-content-installation.md +245 -0
  13. package/docs/document-sharding-guide.md +1 -1
  14. package/docs/index.md +2 -2
  15. package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
  16. package/docs/web-bundles-gemini-gpt-guide.md +1 -1
  17. package/eslint.config.mjs +14 -0
  18. package/example-custom-content/README.md +8 -0
  19. package/{custom/src → example-custom-content}/agents/commit-poet/commit-poet.agent.yaml +1 -1
  20. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/instructions.md +5 -5
  21. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
  22. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
  23. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
  24. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/memories.md +1 -1
  25. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith.agent.yaml +18 -17
  26. package/example-custom-content/module.yaml +4 -0
  27. package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +168 -0
  28. package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +155 -0
  29. package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +89 -0
  30. package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +36 -0
  31. package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +36 -0
  32. package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +36 -0
  33. package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +36 -0
  34. package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +36 -0
  35. package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +36 -0
  36. package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +36 -0
  37. package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +36 -0
  38. package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +150 -0
  39. package/example-custom-content/workflows/quiz-master/templates/csv-headers.template +1 -0
  40. package/example-custom-content/workflows/quiz-master/workflow.md +54 -0
  41. package/example-custom-content/workflows/wassup/workflow.md +26 -0
  42. package/example-custom-module/mwm/README.md +9 -0
  43. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md +47 -0
  44. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md +17 -0
  45. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +151 -0
  46. package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +138 -0
  47. package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +138 -0
  48. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md +13 -0
  49. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md +30 -0
  50. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md +13 -0
  51. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md +17 -0
  52. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +125 -0
  53. package/example-custom-module/mwm/module.yaml +28 -0
  54. package/example-custom-module/mwm/workflows/cbt-thought-record/README.md +31 -0
  55. package/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md +45 -0
  56. package/example-custom-module/mwm/workflows/crisis-support/README.md +31 -0
  57. package/example-custom-module/mwm/workflows/crisis-support/workflow.md +45 -0
  58. package/example-custom-module/mwm/workflows/daily-checkin/README.md +32 -0
  59. package/example-custom-module/mwm/workflows/daily-checkin/workflow.md +45 -0
  60. package/example-custom-module/mwm/workflows/guided-meditation/README.md +31 -0
  61. package/example-custom-module/mwm/workflows/guided-meditation/workflow.md +45 -0
  62. package/example-custom-module/mwm/workflows/wellness-journal/README.md +31 -0
  63. package/example-custom-module/mwm/workflows/wellness-journal/workflow.md +45 -0
  64. package/package.json +9 -4
  65. package/src/core/_module-installer/installer.js +1 -1
  66. package/src/core/{_module-installer/install-config.yaml → module.yaml} +5 -1
  67. package/src/core/resources/excalidraw/library-loader.md +2 -2
  68. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +1 -1
  69. package/src/core/workflows/brainstorming/workflow.md +1 -1
  70. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +0 -1
  71. package/src/core/workflows/party-mode/workflow.md +2 -3
  72. package/src/modules/bmb/README.md +1 -1
  73. package/src/modules/bmb/_module-installer/installer.js +76 -0
  74. package/src/modules/bmb/agents/bmad-builder.agent.yaml +32 -9
  75. package/src/modules/bmb/docs/agents/agent-menu-patterns.md +5 -5
  76. package/src/modules/bmb/docs/agents/expert-agent-architecture.md +20 -20
  77. package/src/modules/bmb/docs/agents/index.md +1 -1
  78. package/src/modules/bmb/docs/agents/module-agent-architecture.md +45 -45
  79. package/src/modules/bmb/docs/agents/simple-agent-architecture.md +7 -3
  80. package/src/modules/bmb/docs/workflows/architecture.md +1 -1
  81. package/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -0
  82. package/src/modules/bmb/docs/workflows/templates/step-1b-template.md +223 -0
  83. package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/step-file.md +4 -4
  84. package/src/modules/bmb/docs/workflows/{step-template.md → templates/step-template.md} +40 -33
  85. package/src/modules/bmb/docs/workflows/templates/workflow-template.md +104 -0
  86. package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/workflow.md +1 -1
  87. package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +4 -9
  88. package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md +4 -4
  89. package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +8 -8
  90. package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +6 -6
  91. package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
  92. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +2 -3
  93. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +10 -40
  94. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +1 -1
  95. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +1 -0
  96. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +2 -2
  97. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +2 -2
  98. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +2 -2
  99. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
  100. package/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +16 -4
  101. package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +4 -4
  102. package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +7 -7
  103. package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +1 -1
  104. package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +3 -3
  105. package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +3 -3
  106. package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +3 -3
  107. package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +3 -3
  108. package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +6 -6
  109. package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +2 -2
  110. package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +3 -3
  111. package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +3 -3
  112. package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +2 -2
  113. package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +3 -3
  114. package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +2 -2
  115. package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +2 -2
  116. package/src/modules/bmb/workflows/create-agent/workflow.md +11 -11
  117. package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +155 -0
  118. package/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +169 -0
  119. package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +217 -0
  120. package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +267 -0
  121. package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +228 -0
  122. package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +233 -0
  123. package/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +296 -0
  124. package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +228 -0
  125. package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +186 -0
  126. package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +309 -0
  127. package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +337 -0
  128. package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +335 -0
  129. package/src/modules/bmb/workflows/create-module/templates/agent.template.md +317 -0
  130. package/src/modules/bmb/workflows/create-module/templates/installer.template.js +47 -0
  131. package/src/modules/bmb/workflows/create-module/templates/module-plan.template.md +5 -0
  132. package/src/modules/bmb/workflows/create-module/templates/module.template.yaml +53 -0
  133. package/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -0
  134. package/src/modules/bmb/workflows/create-module/validation.md +126 -0
  135. package/src/modules/bmb/workflows/create-module/workflow.md +55 -0
  136. package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +45 -56
  137. package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +9 -31
  138. package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +250 -0
  139. package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +216 -0
  140. package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +289 -0
  141. package/src/modules/bmb/workflows/create-workflow/steps/{step-09-design.md → step-06-design.md} +76 -44
  142. package/src/modules/bmb/workflows/create-workflow/steps/{step-11-build.md → step-07-build.md} +71 -25
  143. package/src/modules/bmb/workflows/create-workflow/steps/{step-12-review.md → step-08-review.md} +30 -16
  144. package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +187 -0
  145. package/src/modules/bmb/workflows/create-workflow/workflow.md +2 -2
  146. package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +2 -2
  147. package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +14 -14
  148. package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +4 -4
  149. package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +2 -2
  150. package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +4 -4
  151. package/src/modules/bmb/workflows/edit-agent/workflow.md +1 -1
  152. package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +2 -6
  153. package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +2 -2
  154. package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +1 -1
  155. package/src/modules/bmb/workflows/edit-workflow/workflow.md +1 -1
  156. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +2 -2
  157. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +5 -5
  158. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +7 -7
  159. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +3 -3
  160. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +3 -3
  161. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +3 -3
  162. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +3 -3
  163. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +2 -2
  164. package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +1 -1
  165. package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +0 -1
  166. package/src/modules/bmgd/README.md +2 -1
  167. package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +8 -8
  168. package/src/modules/bmm/_module-installer/installer.js +1 -1
  169. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
  170. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
  171. package/src/modules/bmm/agents/analyst.agent.yaml +11 -8
  172. package/src/modules/bmm/agents/architect.agent.yaml +1 -5
  173. package/src/modules/bmm/agents/pm.agent.yaml +5 -5
  174. package/src/modules/bmm/docs/README.md +23 -1
  175. package/src/modules/bmm/docs/agents-guide.md +16 -35
  176. package/src/modules/bmm/docs/brownfield-guide.md +17 -30
  177. package/src/modules/bmm/docs/enterprise-agentic-development.md +2 -2
  178. package/src/modules/bmm/docs/faq.md +6 -39
  179. package/src/modules/bmm/docs/glossary.md +11 -24
  180. package/src/modules/bmm/docs/images/README.md +37 -0
  181. package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +62 -202
  182. package/src/modules/bmm/docs/images/workflow-method-greenfield.svg +3 -1
  183. package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
  184. package/src/modules/bmm/docs/quick-start.md +9 -25
  185. package/src/modules/bmm/docs/test-architecture.md +6 -6
  186. package/src/modules/bmm/docs/troubleshooting.md +680 -0
  187. package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
  188. package/src/modules/bmm/docs/workflows-implementation.md +143 -3
  189. package/src/modules/bmm/docs/workflows-solutioning.md +2 -2
  190. package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +1 -1
  191. package/src/modules/bmm/tasks/daily-standup.xml +85 -0
  192. package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +1 -1
  193. package/src/modules/bmm/testarch/knowledge/overview.md +1 -1
  194. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +2 -2
  195. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +2 -2
  196. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +2 -2
  197. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +2 -2
  198. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.md +1 -1
  199. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +8 -8
  200. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +18 -18
  201. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +18 -18
  202. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +18 -18
  203. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +17 -17
  204. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +35 -36
  205. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +5 -6
  206. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +20 -19
  207. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +21 -20
  208. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +20 -19
  209. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +21 -20
  210. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +16 -15
  211. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +36 -37
  212. package/src/modules/bmm/workflows/1-analysis/research/research.template.md +0 -1
  213. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +8 -8
  214. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +19 -18
  215. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +20 -19
  216. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +21 -20
  217. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +19 -18
  218. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +38 -39
  219. package/src/modules/bmm/workflows/1-analysis/research/workflow.md +14 -8
  220. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +6 -0
  221. package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +7 -0
  222. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +138 -56
  223. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +93 -51
  224. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +223 -78
  225. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +20 -2
  226. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +18 -0
  227. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +21 -0
  228. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +21 -0
  229. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +21 -0
  230. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +18 -0
  231. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +18 -0
  232. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +18 -0
  233. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +13 -0
  234. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +2 -2
  235. package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +14 -14
  236. package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +7 -7
  237. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +2 -1
  238. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +258 -0
  239. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +232 -0
  240. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +271 -0
  241. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +144 -0
  242. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  243. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
  244. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-01-document-discovery.md +189 -0
  245. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-02-prd-analysis.md +177 -0
  246. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-03-epic-coverage-validation.md +178 -0
  247. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-04-ux-alignment.md +138 -0
  248. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-05-epic-quality-review.md +251 -0
  249. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-06-final-assessment.md +132 -0
  250. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/templates/readiness-report-template.md +4 -0
  251. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.md +54 -0
  252. package/src/modules/{bmgd/workflows/4-production → bmm/workflows/4-implementation}/code-review/checklist.md +2 -1
  253. package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +51 -3
  254. package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +1 -1
  255. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +32 -2
  256. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +3 -3
  257. package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +19 -21
  258. package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +10 -10
  259. package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +174 -0
  260. package/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +35 -0
  261. package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/instructions.md +104 -7
  262. package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +4 -0
  263. package/src/modules/bmm/workflows/document-project/instructions.md +1 -1
  264. package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +2 -2
  265. package/src/modules/bmm/workflows/generate-project-context/workflow.md +1 -1
  266. package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +1 -1
  267. package/src/modules/bmm/workflows/testarch/ci/checklist.md +1 -1
  268. package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +36 -3
  269. package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +25 -4
  270. package/src/modules/bmm/workflows/testarch/ci/instructions.md +2 -2
  271. package/src/modules/bmm/workflows/testarch/test-review/instructions.md +1 -1
  272. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +1 -6
  273. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +1 -6
  274. package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +1 -6
  275. package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +1 -7
  276. package/src/modules/cis/_module-installer/installer.js +1 -1
  277. package/tools/cli/README.md +7 -7
  278. package/tools/cli/commands/build.js +9 -184
  279. package/tools/cli/commands/install.js +1 -6
  280. package/tools/cli/installers/lib/core/config-collector.js +80 -12
  281. package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
  282. package/tools/cli/installers/lib/core/detector.js +8 -4
  283. package/tools/cli/installers/lib/core/installer.js +933 -376
  284. package/tools/cli/installers/lib/core/manifest-generator.js +265 -41
  285. package/tools/cli/installers/lib/core/manifest.js +47 -0
  286. package/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +79 -0
  287. package/tools/cli/installers/lib/custom/handler.js +396 -0
  288. package/tools/cli/installers/lib/ide/_base-ide.js +10 -0
  289. package/tools/cli/installers/lib/ide/auggie.js +19 -7
  290. package/tools/cli/installers/lib/ide/crush.js +19 -6
  291. package/tools/cli/installers/lib/ide/cursor.js +29 -13
  292. package/tools/cli/installers/lib/ide/gemini.js +49 -1
  293. package/tools/cli/installers/lib/ide/iflow.js +20 -1
  294. package/tools/cli/installers/lib/ide/kiro-cli.js +327 -0
  295. package/tools/cli/installers/lib/ide/opencode.js +3 -3
  296. package/tools/cli/installers/lib/ide/roo.js +120 -184
  297. package/tools/cli/installers/lib/ide/rovo-dev.js +1 -1
  298. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +8 -2
  299. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +34 -19
  300. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +18 -14
  301. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
  302. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  303. package/tools/cli/installers/lib/modules/manager.js +535 -56
  304. package/tools/cli/lib/agent/compiler.js +57 -16
  305. package/tools/cli/lib/agent/installer.js +129 -28
  306. package/tools/cli/lib/cli-utils.js +21 -4
  307. package/tools/cli/lib/config.js +2 -1
  308. package/tools/cli/lib/ui.js +561 -12
  309. package/tools/cli/lib/yaml-xml-builder.js +0 -15
  310. package/tools/maintainer/review-pr-README.md +55 -0
  311. package/tools/maintainer/review-pr.md +242 -0
  312. package/tools/migrate-custom-module-paths.js +124 -0
  313. package/tools/schema/agent.js +149 -89
  314. package/tools/validate-svg-changes.sh +356 -0
  315. package/custom/src/agents/commit-poet/installation-guide.md +0 -36
  316. package/custom/src/agents/toolsmith/installation-guide.md +0 -36
  317. package/docs/custom-agent-installation.md +0 -183
  318. package/src/modules/bmb/docs/workflows/workflow-template.md +0 -152
  319. package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-overview.md +0 -127
  320. package/src/modules/bmb/workflows/create-workflow/steps/step-04-core-tools.md +0 -145
  321. package/src/modules/bmb/workflows/create-workflow/steps/step-05-memory-requirements.md +0 -136
  322. package/src/modules/bmb/workflows/create-workflow/steps/step-06-external-tools.md +0 -154
  323. package/src/modules/bmb/workflows/create-workflow/steps/step-07-installation-guidance.md +0 -159
  324. package/src/modules/bmb/workflows/create-workflow/steps/step-08-tools-summary.md +0 -167
  325. package/src/modules/bmb/workflows/create-workflow/steps/step-10-plan-review.md +0 -215
  326. package/src/modules/bmb/workflows/create-workflow/templates/build-summary.md +0 -36
  327. package/src/modules/bmb/workflows/create-workflow/templates/completion-section.md +0 -39
  328. package/src/modules/bmb/workflows/create-workflow/templates/content-template.md +0 -21
  329. package/src/modules/bmb/workflows/create-workflow/templates/design-section.md +0 -53
  330. package/src/modules/bmb/workflows/create-workflow/templates/project-info.md +0 -18
  331. package/src/modules/bmb/workflows/create-workflow/templates/requirements-section.md +0 -47
  332. package/src/modules/bmb/workflows/create-workflow/templates/review-section.md +0 -56
  333. package/src/modules/bmb/workflows/create-workflow/templates/workflow-plan.md +0 -54
  334. package/src/modules/bmb/workflows-legacy/create-module/README.md +0 -229
  335. package/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md +0 -137
  336. package/src/modules/bmb/workflows-legacy/create-module/checklist.md +0 -235
  337. package/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml +0 -92
  338. package/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js +0 -231
  339. package/src/modules/bmb/workflows-legacy/create-module/instructions.md +0 -577
  340. package/src/modules/bmb/workflows-legacy/create-module/module-structure.md +0 -400
  341. package/src/modules/bmb/workflows-legacy/create-module/workflow.yaml +0 -52
  342. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/epics-template.md +0 -80
  343. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/instructions.md +0 -387
  344. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.yaml +0 -53
  345. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +0 -169
  346. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +0 -332
  347. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +0 -146
  348. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +0 -64
  349. package/tools/cli/commands/agent-install.js +0 -409
  350. package/tools/cli/commands/cleanup.js +0 -141
  351. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -0
  352. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -0
  353. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -0
  354. /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
  355. /package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -0
@@ -15,6 +15,8 @@ variables:
15
15
  npm_config_cache: "$CI_PROJECT_DIR/.npm"
16
16
  # Playwright browser cache
17
17
  PLAYWRIGHT_BROWSERS_PATH: "$CI_PROJECT_DIR/.cache/ms-playwright"
18
+ # Default Node version when .nvmrc is missing
19
+ DEFAULT_NODE_VERSION: "24"
18
20
 
19
21
  # Caching configuration
20
22
  cache:
@@ -29,19 +31,32 @@ cache:
29
31
  # Lint stage - Code quality checks
30
32
  lint:
31
33
  stage: lint
32
- image: node:20
33
- script:
34
+ image: node:$DEFAULT_NODE_VERSION
35
+ before_script:
36
+ - |
37
+ NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
38
+ echo "Using Node $NODE_VERSION"
39
+ npm install -g n
40
+ n "$NODE_VERSION"
41
+ node -v
34
42
  - npm ci
43
+ script:
35
44
  - npm run lint
36
45
  timeout: 5 minutes
37
46
 
38
47
  # Test stage - Parallel execution with sharding
39
48
  .test-template: &test-template
40
49
  stage: test
41
- image: node:20
50
+ image: node:$DEFAULT_NODE_VERSION
42
51
  needs:
43
52
  - lint
44
53
  before_script:
54
+ - |
55
+ NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
56
+ echo "Using Node $NODE_VERSION"
57
+ npm install -g n
58
+ n "$NODE_VERSION"
59
+ node -v
45
60
  - npm ci
46
61
  - npx playwright install --with-deps chromium
47
62
  artifacts:
@@ -75,7 +90,7 @@ test:shard-4:
75
90
  # Burn-in stage - Flaky test detection
76
91
  burn-in:
77
92
  stage: burn-in
78
- image: node:20
93
+ image: node:$DEFAULT_NODE_VERSION
79
94
  needs:
80
95
  - test:shard-1
81
96
  - test:shard-2
@@ -86,6 +101,12 @@ burn-in:
86
101
  - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
87
102
  - if: '$CI_PIPELINE_SOURCE == "schedule"'
88
103
  before_script:
104
+ - |
105
+ NODE_VERSION=$(cat .nvmrc 2>/dev/null || echo "$DEFAULT_NODE_VERSION")
106
+ echo "Using Node $NODE_VERSION"
107
+ npm install -g n
108
+ n "$NODE_VERSION"
109
+ node -v
89
110
  - npm ci
90
111
  - npx playwright install --with-deps chromium
91
112
  script:
@@ -61,8 +61,8 @@ Scaffolds a production-ready CI/CD quality pipeline with test execution, burn-in
61
61
  - Ask user if unable to auto-detect
62
62
 
63
63
  5. **Read Environment Configuration**
64
- - Check for `.nvmrc` to determine Node version
65
- - Default to Node 20 LTS if not found
64
+ - Use `.nvmrc` for Node version if present
65
+ - If missing, default to a current LTS (Node 24) or newer instead of a fixed old version
66
66
  - Read `package.json` to identify dependencies (affects caching strategy)
67
67
 
68
68
  **Halt Condition:** If preflight checks fail, stop immediately and report which requirement failed.
@@ -524,7 +524,7 @@ await expect(page.locator('[data-testid="user-menu"]')).toBeVisible({ timeout: 1
524
524
  ### 1. Use Data Factory for Test User (Lines 23, 32, 41)
525
525
 
526
526
  **Severity**: P1 (High)
527
- **Issue**: Hardcoded email 'test@example.com' - maintainability risk
527
+ **Issue**: Hardcoded email `test@example.com` - maintainability risk
528
528
  **Fix**: Create factory function for test users
529
529
  **Knowledge**: See data-factories.md
530
530
 
@@ -56,11 +56,6 @@ phases:
56
56
  output: "Enterprise PRD with compliance requirements"
57
57
  note: "Must address existing system constraints and migration strategy"
58
58
 
59
- - id: "validate-prd"
60
- recommended: true
61
- agent: "pm"
62
- command: "validate-prd"
63
-
64
59
  - id: "create-ux-design"
65
60
  recommended: true
66
61
  agent: "ux-designer"
@@ -114,7 +109,7 @@ phases:
114
109
  required: true
115
110
  agent: "architect"
116
111
  command: "implementation-readiness"
117
- note: "Critical gate - validates all planning + Epics before touching production system"
112
+ note: "Validates PRD + Architecture + Epics + UX (optional)"
118
113
 
119
114
  - phase: 3
120
115
  name: "Implementation"
@@ -44,11 +44,6 @@ phases:
44
44
  output: "Comprehensive Product Requirements Document"
45
45
  note: "Enterprise-level requirements with compliance considerations"
46
46
 
47
- - id: "validate-prd"
48
- recommended: true
49
- agent: "pm"
50
- command: "validate-prd"
51
-
52
47
  - id: "create-ux-design"
53
48
  recommended: true
54
49
  agent: "ux-designer"
@@ -102,7 +97,7 @@ phases:
102
97
  required: true
103
98
  agent: "architect"
104
99
  command: "implementation-readiness"
105
- note: "Validates all planning artifacts + Epics + testability align before implementation"
100
+ note: "Validates PRD + Architecture + Epics + UX (optional)"
106
101
 
107
102
  - phase: 3
108
103
  name: "Implementation"
@@ -55,11 +55,6 @@ phases:
55
55
  output: "PRD focused on new features/changes"
56
56
  note: "Must consider existing system constraints"
57
57
 
58
- - id: "validate-prd"
59
- optional: true
60
- agent: "pm"
61
- command: "validate-prd"
62
-
63
58
  - id: "create-ux-design"
64
59
  conditional: "if_has_ui"
65
60
  agent: "ux-designer"
@@ -98,7 +93,7 @@ phases:
98
93
  required: true
99
94
  agent: "architect"
100
95
  command: "implementation-readiness"
101
- note: "Validates PRD + UX + Architecture + Epics cohesion before implementation"
96
+ note: "Validates PRD + Architecture + Epics + UX (optional)"
102
97
 
103
98
  - phase: 3
104
99
  name: "Implementation"
@@ -43,12 +43,6 @@ phases:
43
43
  command: "prd"
44
44
  output: "Product Requirements Document with FRs and NFRs"
45
45
 
46
- - id: "validate-prd"
47
- optional: true
48
- agent: "pm"
49
- command: "validate-prd"
50
- note: "Quality check for PRD completeness"
51
-
52
46
  - id: "create-ux-design"
53
47
  conditional: "if_has_ui"
54
48
  agent: "ux-designer"
@@ -89,7 +83,7 @@ phases:
89
83
  required: true
90
84
  agent: "architect"
91
85
  command: "implementation-readiness"
92
- note: "Validates PRD + UX + Architecture + Epics + Testability cohesion before implementation"
86
+ note: "Validates PRD + Architecture + Epics + UX (optional)"
93
87
 
94
88
  - phase: 3
95
89
  name: "Implementation"
@@ -8,7 +8,7 @@ const chalk = require('chalk');
8
8
  *
9
9
  * @param {Object} options - Installation options
10
10
  * @param {string} options.projectRoot - The root directory of the target project
11
- * @param {Object} options.config - Module configuration from install-config.yaml
11
+ * @param {Object} options.config - Module configuration from module.yaml
12
12
  * @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
13
13
  * @param {Object} options.logger - Logger instance for output
14
14
  * @returns {Promise<boolean>} - Success status
@@ -98,7 +98,7 @@ The installer is a multi-stage system that handles agent compilation, IDE integr
98
98
  ```
99
99
  1. Collect User Input
100
100
  - Target directory, modules, IDEs
101
- - Custom module configuration (via install-config.yaml)
101
+ - Custom module configuration (via module.yaml)
102
102
 
103
103
  2. Pre-Installation
104
104
  - Validate target, check conflicts, backup existing installations
@@ -183,12 +183,12 @@ The installer supports **15 IDE environments** through a base-derived architectu
183
183
 
184
184
  ### Custom Module Configuration
185
185
 
186
- Modules define interactive configuration menus via `install-config.yaml` files in their `_module-installer/` directories.
186
+ Modules define interactive configuration menus via `module.yaml` files in their `_module-installer/` directories.
187
187
 
188
188
  **Config File Location**:
189
189
 
190
- - Core: `src/core/_module-installer/install-config.yaml`
191
- - Modules: `src/modules/{module}/_module-installer/install-config.yaml`
190
+ - Core: `src/core/module.yaml`
191
+ - Modules: `src/modules/{module}/module.yaml`
192
192
 
193
193
  **Configuration Types**:
194
194
 
@@ -604,6 +604,6 @@ node tools/cli/regenerate-manifests.js
604
604
 
605
605
  ## Support
606
606
 
607
- - **Issues**: https://github.com/bmad-code-org/BMAD-METHOD/issues
608
- - **Discord**: https://discord.gg/gk8jAdXWmj (#general-dev, #bugs-issues)
609
- - **YouTube**: https://www.youtube.com/@BMadCode
607
+ - **Issues**: <https://github.com/bmad-code-org/BMAD-METHOD/issues>
608
+ - **Discord**: <https://discord.gg/gk8jAdXWmj> (#general-dev, #bugs-issues)
609
+ - **YouTube**: <https://www.youtube.com/@BMadCode>
@@ -28,9 +28,8 @@ module.exports = {
28
28
  command: 'build [agent]',
29
29
  description: 'Build agent XML files from YAML sources',
30
30
  options: [
31
- ['-a, --all', 'Rebuild all agents'],
31
+ ['-a, --all', 'Build all agents'],
32
32
  ['-d, --directory <path>', 'Project directory', '.'],
33
- ['--force', 'Force rebuild even if up to date'],
34
33
  ],
35
34
  action: async (agentName, options) => {
36
35
  try {
@@ -54,13 +53,15 @@ module.exports = {
54
53
 
55
54
  if (options.all) {
56
55
  // Build all agents
57
- await buildAllAgents(projectDir, options.force);
56
+ await buildAllAgents(projectDir);
58
57
  } else if (agentName) {
59
58
  // Build specific agent
60
- await buildAgent(projectDir, agentName, options.force);
59
+ await buildAgent(projectDir, agentName);
61
60
  } else {
62
- // No agent specified, check what needs rebuilding
63
- await checkBuildStatus(projectDir);
61
+ // No agent specified, list available agents
62
+ console.log(chalk.yellow('No agent specified. Use --all to build all agents or specify an agent name.'));
63
+ console.log(chalk.dim('\nAvailable agents:'));
64
+ await listAvailableAgents(projectDir);
64
65
  }
65
66
 
66
67
  process.exit(0);
@@ -77,7 +78,7 @@ module.exports = {
77
78
  /**
78
79
  * Build a specific agent
79
80
  */
80
- async function buildAgent(projectDir, agentName, force = false) {
81
+ async function buildAgent(projectDir, agentName) {
81
82
  // First check standalone agents in bmad/agents/{agentname}/
82
83
  const standaloneAgentDir = path.join(projectDir, 'bmad', 'agents', agentName);
83
84
  let standaloneYamlPath = path.join(standaloneAgentDir, `${agentName}.agent.yaml`);
@@ -95,15 +96,6 @@ async function buildAgent(projectDir, agentName, force = false) {
95
96
  const yamlFileName = path.basename(standaloneYamlPath, '.agent.yaml');
96
97
  const outputPath = path.join(standaloneAgentDir, `${yamlFileName}.md`);
97
98
 
98
- // Check if rebuild needed
99
- if (!force && (await fs.pathExists(outputPath))) {
100
- const needsRebuild = await checkIfNeedsRebuild(standaloneYamlPath, outputPath, projectDir, agentName);
101
- if (!needsRebuild) {
102
- console.log(chalk.dim(` ${agentName}: already up to date`));
103
- return;
104
- }
105
- }
106
-
107
99
  // Build the standalone agent
108
100
  console.log(chalk.cyan(` Building standalone agent ${agentName}...`));
109
101
 
@@ -130,15 +122,6 @@ async function buildAgent(projectDir, agentName, force = false) {
130
122
  if (await fs.pathExists(agentYamlPath)) {
131
123
  found = true;
132
124
 
133
- // Check if rebuild needed
134
- if (!force && (await fs.pathExists(outputPath))) {
135
- const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
136
- if (!needsRebuild) {
137
- console.log(chalk.dim(` ${agentName}: already up to date`));
138
- return;
139
- }
140
- }
141
-
142
125
  // Build the agent
143
126
  console.log(chalk.cyan(` Building ${agentName}...`));
144
127
 
@@ -162,9 +145,8 @@ async function buildAgent(projectDir, agentName, force = false) {
162
145
  /**
163
146
  * Build all agents
164
147
  */
165
- async function buildAllAgents(projectDir, force = false) {
148
+ async function buildAllAgents(projectDir) {
166
149
  let builtCount = 0;
167
- let skippedCount = 0;
168
150
 
169
151
  // First, build standalone agents in bmad/agents/
170
152
  const standaloneAgentsDir = path.join(projectDir, 'bmad', 'agents');
@@ -193,16 +175,6 @@ async function buildAllAgents(projectDir, force = false) {
193
175
  const agentName = path.basename(agentFile, '.agent.yaml');
194
176
  const outputPath = path.join(agentDir, `${agentName}.md`);
195
177
 
196
- // Check if rebuild needed
197
- if (!force && (await fs.pathExists(outputPath))) {
198
- const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
199
- if (!needsRebuild) {
200
- console.log(chalk.dim(` ${agentName}: up to date`));
201
- skippedCount++;
202
- continue;
203
- }
204
- }
205
-
206
178
  console.log(chalk.cyan(` Building standalone agent ${agentName}...`));
207
179
 
208
180
  const customizePath = path.join(projectDir, 'bmad', '_cfg', 'agents', `${agentName}.customize.yaml`);
@@ -239,16 +211,6 @@ async function buildAllAgents(projectDir, force = false) {
239
211
  const agentYamlPath = path.join(agentsDir, file);
240
212
  const outputPath = path.join(agentsDir, `${agentName}.md`);
241
213
 
242
- // Check if rebuild needed
243
- if (!force && (await fs.pathExists(outputPath))) {
244
- const needsRebuild = await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName);
245
- if (!needsRebuild) {
246
- console.log(chalk.dim(` ${agentName}: up to date`));
247
- skippedCount++;
248
- continue;
249
- }
250
- }
251
-
252
214
  console.log(chalk.cyan(` Building ${agentName}...`));
253
215
 
254
216
  const customizePath = path.join(projectDir, '.claude', '_cfg', 'agents', `${agentName}.customize.yaml`);
@@ -263,143 +225,6 @@ async function buildAllAgents(projectDir, force = false) {
263
225
  }
264
226
 
265
227
  console.log(chalk.green(`\n✓ Built ${builtCount} agent(s)`));
266
- if (skippedCount > 0) {
267
- console.log(chalk.dim(` Skipped ${skippedCount} (already up to date)`));
268
- }
269
- }
270
-
271
- /**
272
- * Check what needs rebuilding
273
- */
274
- async function checkBuildStatus(projectDir) {
275
- const needsRebuild = [];
276
- const upToDate = [];
277
-
278
- // Check standalone agents in bmad/agents/
279
- const standaloneAgentsDir = path.join(projectDir, 'bmad', 'agents');
280
- if (await fs.pathExists(standaloneAgentsDir)) {
281
- const agentDirs = await fs.readdir(standaloneAgentsDir);
282
-
283
- for (const agentDirName of agentDirs) {
284
- const agentDir = path.join(standaloneAgentsDir, agentDirName);
285
-
286
- // Skip if not a directory
287
- const stat = await fs.stat(agentDir);
288
- if (!stat.isDirectory()) {
289
- continue;
290
- }
291
-
292
- // Find any .agent.yaml file in the directory
293
- const files = await fs.readdir(agentDir);
294
- const agentFile = files.find((f) => f.endsWith('.agent.yaml'));
295
-
296
- if (!agentFile) {
297
- continue;
298
- }
299
-
300
- const agentYamlPath = path.join(agentDir, agentFile);
301
- const agentName = path.basename(agentFile, '.agent.yaml');
302
- const outputPath = path.join(agentDir, `${agentName}.md`);
303
-
304
- if (!(await fs.pathExists(outputPath))) {
305
- needsRebuild.push(`${agentName} (standalone)`);
306
- } else if (await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName)) {
307
- needsRebuild.push(`${agentName} (standalone)`);
308
- } else {
309
- upToDate.push(`${agentName} (standalone)`);
310
- }
311
- }
312
- }
313
-
314
- // Check module agents in .claude/commands/bmad/
315
- const bmadCommandsDir = path.join(projectDir, '.claude', 'commands', 'bmad');
316
- if (await fs.pathExists(bmadCommandsDir)) {
317
- const modules = await fs.readdir(bmadCommandsDir);
318
-
319
- for (const module of modules) {
320
- const agentsDir = path.join(bmadCommandsDir, module, 'agents');
321
-
322
- if (!(await fs.pathExists(agentsDir))) {
323
- continue;
324
- }
325
-
326
- const files = await fs.readdir(agentsDir);
327
-
328
- for (const file of files) {
329
- if (!file.endsWith('.agent.yaml')) {
330
- continue;
331
- }
332
-
333
- const agentName = file.replace('.agent.yaml', '');
334
- const agentYamlPath = path.join(agentsDir, file);
335
- const outputPath = path.join(agentsDir, `${agentName}.md`);
336
-
337
- if (!(await fs.pathExists(outputPath))) {
338
- needsRebuild.push(`${agentName} (${module})`);
339
- } else if (await checkIfNeedsRebuild(agentYamlPath, outputPath, projectDir, agentName)) {
340
- needsRebuild.push(`${agentName} (${module})`);
341
- } else {
342
- upToDate.push(`${agentName} (${module})`);
343
- }
344
- }
345
- }
346
- }
347
-
348
- if (needsRebuild.length === 0) {
349
- console.log(chalk.green('✓ All agents are up to date'));
350
- } else {
351
- console.log(chalk.yellow(`${needsRebuild.length} agent(s) need rebuilding:`));
352
- for (const agent of needsRebuild) {
353
- console.log(chalk.dim(` - ${agent}`));
354
- }
355
- console.log(chalk.dim('\nRun "bmad build --all" to rebuild all agents'));
356
- }
357
-
358
- if (upToDate.length > 0) {
359
- console.log(chalk.dim(`\n${upToDate.length} agent(s) up to date`));
360
- }
361
- }
362
-
363
- /**
364
- * Check if an agent needs rebuilding by comparing hashes
365
- */
366
- async function checkIfNeedsRebuild(yamlPath, outputPath, projectDir, agentName) {
367
- // Read the output file to check its metadata
368
- const outputContent = await fs.readFile(outputPath, 'utf8');
369
-
370
- // Extract hash from BUILD-META comment
371
- const metaMatch = outputContent.match(/source:.*\(hash: ([a-f0-9]+)\)/);
372
- if (!metaMatch) {
373
- // No metadata, needs rebuild
374
- return true;
375
- }
376
-
377
- const storedHash = metaMatch[1];
378
-
379
- // Calculate current hash
380
- const currentHash = await builder.calculateFileHash(yamlPath);
381
-
382
- if (storedHash !== currentHash) {
383
- return true;
384
- }
385
-
386
- // Check customize file if it exists
387
- const customizePath = path.join(projectDir, '.claude', '_cfg', 'agents', `${agentName}.customize.yaml`);
388
- if (await fs.pathExists(customizePath)) {
389
- const customizeMetaMatch = outputContent.match(/customize:.*\(hash: ([a-f0-9]+)\)/);
390
- if (!customizeMetaMatch) {
391
- return true;
392
- }
393
-
394
- const storedCustomizeHash = customizeMetaMatch[1];
395
- const currentCustomizeHash = await builder.calculateFileHash(customizePath);
396
-
397
- if (storedCustomizeHash !== currentCustomizeHash) {
398
- return true;
399
- }
400
- }
401
-
402
- return false;
403
228
  }
404
229
 
405
230
  /**
@@ -9,7 +9,7 @@ const ui = new UI();
9
9
  module.exports = {
10
10
  command: 'install',
11
11
  description: 'Install BMAD Core agents and tools',
12
- options: [['--skip-cleanup', 'Skip automatic cleanup of legacy files']],
12
+ options: [],
13
13
  action: async (options) => {
14
14
  try {
15
15
  const config = await ui.promptInstall();
@@ -44,11 +44,6 @@ module.exports = {
44
44
  config._requestedReinstall = true;
45
45
  }
46
46
 
47
- // Add skip cleanup flag if option provided
48
- if (options && options.skipCleanup) {
49
- config.skipCleanup = true;
50
- }
51
-
52
47
  // Regular install/update flow
53
48
  const result = await installer.install(config);
54
49
 
@@ -182,15 +182,47 @@ class ConfigCollector {
182
182
  }
183
183
 
184
184
  // Load module's install config schema
185
- const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
186
- const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
185
+ // First, try the standard src/modules location
186
+ let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
187
+ let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
188
+
189
+ // If not found in src/modules, we need to find it by searching the project
190
+ if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
191
+ // Use the module manager to find the module source
192
+ const { ModuleManager } = require('../modules/manager');
193
+ const moduleManager = new ModuleManager();
194
+ const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
195
+
196
+ if (moduleSourcePath) {
197
+ installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'module.yaml');
198
+ moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
199
+ }
200
+ }
187
201
 
188
202
  let configPath = null;
189
- if (await fs.pathExists(installerConfigPath)) {
203
+ let isCustomModule = false;
204
+
205
+ if (await fs.pathExists(moduleConfigPath)) {
206
+ configPath = moduleConfigPath;
207
+ } else if (await fs.pathExists(installerConfigPath)) {
190
208
  configPath = installerConfigPath;
191
- } else if (await fs.pathExists(legacyConfigPath)) {
192
- configPath = legacyConfigPath;
193
209
  } else {
210
+ // Check if this is a custom module with custom.yaml
211
+ const { ModuleManager } = require('../modules/manager');
212
+ const moduleManager = new ModuleManager();
213
+ const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
214
+
215
+ if (moduleSourcePath) {
216
+ const rootCustomConfigPath = path.join(moduleSourcePath, 'custom.yaml');
217
+ const moduleInstallerCustomPath = path.join(moduleSourcePath, '_module-installer', 'custom.yaml');
218
+
219
+ if ((await fs.pathExists(rootCustomConfigPath)) || (await fs.pathExists(moduleInstallerCustomPath))) {
220
+ isCustomModule = true;
221
+ // For custom modules, we don't have an install-config schema, so just use existing values
222
+ // The custom.yaml values will be loaded and merged during installation
223
+ }
224
+ }
225
+
194
226
  // No config schema for this module - use existing values
195
227
  if (this.existingConfig && this.existingConfig[moduleName]) {
196
228
  if (!this.collectedConfig[moduleName]) {
@@ -226,9 +258,31 @@ class ConfigCollector {
226
258
  }
227
259
  this.collectedConfig[moduleName] = { ...this.existingConfig[moduleName] };
228
260
 
261
+ // Special handling for user_name: ensure it has a value
262
+ if (
263
+ moduleName === 'core' &&
264
+ (!this.collectedConfig[moduleName].user_name || this.collectedConfig[moduleName].user_name === '[USER_NAME]')
265
+ ) {
266
+ this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
267
+ }
268
+
229
269
  // Also populate allAnswers for cross-referencing
230
270
  for (const [key, value] of Object.entries(this.existingConfig[moduleName])) {
231
- this.allAnswers[`${moduleName}_${key}`] = value;
271
+ // Ensure user_name is properly set in allAnswers too
272
+ let finalValue = value;
273
+ if (moduleName === 'core' && key === 'user_name' && (!value || value === '[USER_NAME]')) {
274
+ finalValue = this.getDefaultUsername();
275
+ }
276
+ this.allAnswers[`${moduleName}_${key}`] = finalValue;
277
+ }
278
+ } else if (moduleName === 'core') {
279
+ // No existing core config - ensure we at least have user_name
280
+ if (!this.collectedConfig[moduleName]) {
281
+ this.collectedConfig[moduleName] = {};
282
+ }
283
+ if (!this.collectedConfig[moduleName].user_name) {
284
+ this.collectedConfig[moduleName].user_name = this.getDefaultUsername();
285
+ this.allAnswers[`${moduleName}_user_name`] = this.getDefaultUsername();
232
286
  }
233
287
  }
234
288
  // Show "no config" message for modules with no new questions
@@ -396,15 +450,29 @@ class ConfigCollector {
396
450
  if (!this.allAnswers) {
397
451
  this.allAnswers = {};
398
452
  }
399
- // Load module's config.yaml (check new location first, then fallback)
400
- const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
401
- const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
453
+ // Load module's config
454
+ // First, try the standard src/modules location
455
+ let installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'module.yaml');
456
+ let moduleConfigPath = path.join(getModulePath(moduleName), 'module.yaml');
457
+
458
+ // If not found in src/modules, we need to find it by searching the project
459
+ if (!(await fs.pathExists(installerConfigPath)) && !(await fs.pathExists(moduleConfigPath))) {
460
+ // Use the module manager to find the module source
461
+ const { ModuleManager } = require('../modules/manager');
462
+ const moduleManager = new ModuleManager();
463
+ const moduleSourcePath = await moduleManager.findModuleSource(moduleName);
464
+
465
+ if (moduleSourcePath) {
466
+ installerConfigPath = path.join(moduleSourcePath, '_module-installer', 'module.yaml');
467
+ moduleConfigPath = path.join(moduleSourcePath, 'module.yaml');
468
+ }
469
+ }
402
470
 
403
471
  let configPath = null;
404
- if (await fs.pathExists(installerConfigPath)) {
472
+ if (await fs.pathExists(moduleConfigPath)) {
473
+ configPath = moduleConfigPath;
474
+ } else if (await fs.pathExists(installerConfigPath)) {
405
475
  configPath = installerConfigPath;
406
- } else if (await fs.pathExists(legacyConfigPath)) {
407
- configPath = legacyConfigPath;
408
476
  } else {
409
477
  // No config for this module
410
478
  return;