bmad-method 5.1.3 → 6.0.0-Beta.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 (739) hide show
  1. package/.coderabbit.yaml +40 -0
  2. package/.github/CODE_OF_CONDUCT.md +128 -0
  3. package/.github/FUNDING.yaml +2 -2
  4. package/.github/ISSUE_TEMPLATE/config.yaml +8 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +11 -11
  6. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  7. package/.github/scripts/discord-helpers.sh +34 -0
  8. package/.github/workflows/discord.yaml +82 -17
  9. package/.github/workflows/docs.yaml +63 -0
  10. package/.github/workflows/manual-release.yaml +40 -20
  11. package/.github/workflows/quality.yaml +115 -0
  12. package/.husky/pre-commit +17 -0
  13. package/.markdownlint-cli2.yaml +41 -0
  14. package/.nvmrc +1 -0
  15. package/.prettierignore +9 -0
  16. package/.vscode/settings.json +38 -10
  17. package/CHANGELOG.md +1167 -372
  18. package/CNAME +1 -0
  19. package/CONTRIBUTING.md +100 -142
  20. package/CONTRIBUTORS.md +32 -0
  21. package/LICENSE +10 -1
  22. package/README.md +67 -170
  23. package/SECURITY.md +85 -0
  24. package/TRADEMARK.md +55 -0
  25. package/Wordmark.png +0 -0
  26. package/banner-bmad-method.png +0 -0
  27. package/docs/404.md +9 -0
  28. package/docs/_STYLE_GUIDE.md +367 -0
  29. package/docs/downloads.md +74 -0
  30. package/docs/explanation/advanced-elicitation.md +24 -0
  31. package/docs/explanation/adversarial-review.md +57 -0
  32. package/docs/explanation/brainstorming.md +31 -0
  33. package/docs/explanation/brownfield-faq.md +55 -0
  34. package/docs/explanation/party-mode.md +57 -0
  35. package/docs/explanation/preventing-agent-conflicts.md +110 -0
  36. package/docs/explanation/quick-flow.md +27 -0
  37. package/docs/explanation/why-solutioning-matters.md +75 -0
  38. package/docs/how-to/brownfield/index.md +84 -0
  39. package/docs/how-to/brownfield/quick-fix-in-brownfield.md +76 -0
  40. package/docs/how-to/customize-bmad.md +158 -0
  41. package/docs/how-to/get-answers-about-bmad.md +102 -0
  42. package/docs/how-to/install-bmad.md +82 -0
  43. package/docs/how-to/shard-large-documents.md +101 -0
  44. package/docs/how-to/upgrade-to-v6.md +131 -0
  45. package/docs/index.md +56 -0
  46. package/docs/reference/workflow-map.md +83 -0
  47. package/docs/tea/explanation/engagement-models.md +710 -0
  48. package/docs/tea/explanation/fixture-architecture.md +457 -0
  49. package/docs/tea/explanation/knowledge-base-system.md +554 -0
  50. package/docs/tea/explanation/network-first-patterns.md +853 -0
  51. package/docs/tea/explanation/risk-based-testing.md +586 -0
  52. package/docs/tea/explanation/tea-overview.md +410 -0
  53. package/docs/tea/explanation/test-quality-standards.md +907 -0
  54. package/docs/tea/explanation/testing-as-engineering.md +112 -0
  55. package/docs/tea/glossary/index.md +159 -0
  56. package/docs/tea/how-to/brownfield/use-tea-for-enterprise.md +525 -0
  57. package/docs/tea/how-to/brownfield/use-tea-with-existing-tests.md +577 -0
  58. package/docs/tea/how-to/customization/enable-tea-mcp-enhancements.md +424 -0
  59. package/docs/tea/how-to/customization/integrate-playwright-utils.md +813 -0
  60. package/docs/tea/how-to/workflows/run-atdd.md +436 -0
  61. package/docs/tea/how-to/workflows/run-automate.md +653 -0
  62. package/docs/tea/how-to/workflows/run-nfr-assess.md +679 -0
  63. package/docs/tea/how-to/workflows/run-test-design.md +135 -0
  64. package/docs/tea/how-to/workflows/run-test-review.md +605 -0
  65. package/docs/tea/how-to/workflows/run-trace.md +883 -0
  66. package/docs/tea/how-to/workflows/setup-ci.md +712 -0
  67. package/docs/tea/how-to/workflows/setup-test-framework.md +98 -0
  68. package/docs/tea/reference/commands.md +276 -0
  69. package/docs/tea/reference/configuration.md +678 -0
  70. package/docs/tea/reference/knowledge-base.md +340 -0
  71. package/docs/tea/tutorials/tea-lite-quickstart.md +444 -0
  72. package/docs/tutorials/getting-started.md +205 -0
  73. package/eslint.config.mjs +42 -9
  74. package/package.json +50 -38
  75. package/prettier.config.mjs +1 -1
  76. package/src/bmm/_module-installer/installer.js +48 -0
  77. package/src/bmm/agents/analyst.agent.yaml +36 -0
  78. package/src/bmm/agents/architect.agent.yaml +28 -0
  79. package/src/bmm/agents/dev.agent.yaml +38 -0
  80. package/src/bmm/agents/pm.agent.yaml +46 -0
  81. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  82. package/src/bmm/agents/sm.agent.yaml +36 -0
  83. package/src/bmm/agents/tea.agent.yaml +63 -0
  84. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  85. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +45 -0
  86. package/src/bmm/agents/ux-designer.agent.yaml +26 -0
  87. package/src/bmm/data/project-context-template.md +26 -0
  88. package/src/bmm/module-help.csv +32 -0
  89. package/src/bmm/module.yaml +44 -0
  90. package/src/bmm/teams/default-party.csv +21 -0
  91. package/src/bmm/teams/team-fullstack.yaml +12 -0
  92. package/src/bmm/testarch/knowledge/adr-quality-readiness-checklist.md +350 -0
  93. package/src/bmm/testarch/knowledge/api-request.md +442 -0
  94. package/src/bmm/testarch/knowledge/api-testing-patterns.md +843 -0
  95. package/src/bmm/testarch/knowledge/auth-session.md +552 -0
  96. package/src/bmm/testarch/knowledge/burn-in.md +273 -0
  97. package/src/bmm/testarch/knowledge/ci-burn-in.md +675 -0
  98. package/src/bmm/testarch/knowledge/component-tdd.md +486 -0
  99. package/src/bmm/testarch/knowledge/contract-testing.md +957 -0
  100. package/src/bmm/testarch/knowledge/data-factories.md +500 -0
  101. package/src/bmm/testarch/knowledge/email-auth.md +721 -0
  102. package/src/bmm/testarch/knowledge/error-handling.md +725 -0
  103. package/src/bmm/testarch/knowledge/feature-flags.md +750 -0
  104. package/src/bmm/testarch/knowledge/file-utils.md +463 -0
  105. package/src/bmm/testarch/knowledge/fixture-architecture.md +401 -0
  106. package/src/bmm/testarch/knowledge/fixtures-composition.md +382 -0
  107. package/src/bmm/testarch/knowledge/intercept-network-call.md +430 -0
  108. package/src/bmm/testarch/knowledge/log.md +429 -0
  109. package/src/bmm/testarch/knowledge/network-error-monitor.md +405 -0
  110. package/src/bmm/testarch/knowledge/network-first.md +486 -0
  111. package/src/bmm/testarch/knowledge/network-recorder.md +527 -0
  112. package/src/bmm/testarch/knowledge/nfr-criteria.md +670 -0
  113. package/src/bmm/testarch/knowledge/overview.md +286 -0
  114. package/src/bmm/testarch/knowledge/playwright-config.md +730 -0
  115. package/src/bmm/testarch/knowledge/probability-impact.md +601 -0
  116. package/src/bmm/testarch/knowledge/recurse.md +421 -0
  117. package/src/bmm/testarch/knowledge/risk-governance.md +615 -0
  118. package/src/bmm/testarch/knowledge/selective-testing.md +732 -0
  119. package/src/bmm/testarch/knowledge/selector-resilience.md +527 -0
  120. package/src/bmm/testarch/knowledge/test-healing-patterns.md +644 -0
  121. package/src/bmm/testarch/knowledge/test-levels-framework.md +473 -0
  122. package/src/bmm/testarch/knowledge/test-priorities-matrix.md +373 -0
  123. package/src/bmm/testarch/knowledge/test-quality.md +664 -0
  124. package/src/bmm/testarch/knowledge/timing-debugging.md +372 -0
  125. package/src/bmm/testarch/knowledge/visual-debugging.md +524 -0
  126. package/src/bmm/testarch/tea-index.csv +35 -0
  127. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  128. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  129. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  130. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  131. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  132. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  133. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  134. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
  135. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +58 -0
  136. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  137. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  138. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  139. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  140. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  141. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +443 -0
  142. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  143. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  144. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +200 -0
  145. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  146. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  147. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  148. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +475 -0
  149. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  150. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  151. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  152. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  153. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  154. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +239 -0
  155. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +486 -0
  156. package/src/bmm/workflows/1-analysis/research/workflow.md +173 -0
  157. package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +13 -0
  158. package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  159. package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  160. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
  161. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +153 -0
  162. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
  163. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
  164. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
  165. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
  166. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
  167. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
  168. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
  169. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
  170. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
  171. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
  172. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
  173. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
  174. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  175. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
  176. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
  177. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
  178. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +218 -0
  179. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  180. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  181. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  182. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  183. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  184. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  185. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  186. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  187. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  188. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  189. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  190. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  191. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
  192. package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
  193. package/src/bmm/workflows/2-plan-workflows/create-prd/validation-report-prd-workflow.md +433 -0
  194. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow.md +150 -0
  195. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  196. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  197. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  198. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  199. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  200. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  201. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  202. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  203. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  204. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  205. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  206. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  207. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  208. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  209. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
  210. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  211. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +43 -0
  212. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +190 -0
  213. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +178 -0
  214. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +179 -0
  215. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +139 -0
  216. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +252 -0
  217. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +135 -0
  218. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  219. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +55 -0
  220. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  221. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +11 -0
  222. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  223. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  224. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +164 -0
  225. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  226. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +331 -0
  227. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  228. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  229. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  230. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  231. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
  232. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +50 -0
  233. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  234. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  235. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  236. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
  237. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  238. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +59 -0
  239. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  240. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  241. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +51 -0
  242. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  243. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +206 -0
  244. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +60 -0
  245. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  246. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +345 -0
  247. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  248. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +61 -0
  249. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  250. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  251. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +27 -0
  252. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1443 -0
  253. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +58 -0
  254. package/src/bmm/workflows/4-implementation/sprint-planning/checklist.md +33 -0
  255. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +225 -0
  256. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  257. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +54 -0
  258. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +229 -0
  259. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +36 -0
  260. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +176 -0
  261. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +120 -0
  262. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +113 -0
  263. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +113 -0
  264. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +106 -0
  265. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +149 -0
  266. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
  267. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +192 -0
  268. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +145 -0
  269. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +128 -0
  270. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +201 -0
  271. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  272. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  273. package/src/bmm/workflows/document-project/checklist.md +245 -0
  274. package/src/bmm/workflows/document-project/documentation-requirements.csv +12 -0
  275. package/src/bmm/workflows/document-project/instructions.md +221 -0
  276. package/src/bmm/workflows/document-project/templates/deep-dive-template.md +345 -0
  277. package/src/bmm/workflows/document-project/templates/index-template.md +169 -0
  278. package/src/bmm/workflows/document-project/templates/project-overview-template.md +103 -0
  279. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  280. package/src/bmm/workflows/document-project/templates/source-tree-template.md +135 -0
  281. package/src/bmm/workflows/document-project/workflow.yaml +30 -0
  282. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  283. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  284. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  285. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  286. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-library.json +90 -0
  287. package/src/bmm/workflows/excalidraw-diagrams/_shared/excalidraw-templates.yaml +127 -0
  288. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/checklist.md +39 -0
  289. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/instructions.md +130 -0
  290. package/src/bmm/workflows/excalidraw-diagrams/create-dataflow/workflow.yaml +27 -0
  291. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/checklist.md +43 -0
  292. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/instructions.md +141 -0
  293. package/src/bmm/workflows/excalidraw-diagrams/create-diagram/workflow.yaml +27 -0
  294. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/checklist.md +49 -0
  295. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/instructions.md +241 -0
  296. package/src/bmm/workflows/excalidraw-diagrams/create-flowchart/workflow.yaml +27 -0
  297. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/checklist.md +38 -0
  298. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/instructions.md +133 -0
  299. package/src/bmm/workflows/excalidraw-diagrams/create-wireframe/workflow.yaml +27 -0
  300. package/src/bmm/workflows/testarch/atdd/atdd-checklist-template.md +363 -0
  301. package/src/bmm/workflows/testarch/atdd/checklist.md +374 -0
  302. package/src/bmm/workflows/testarch/atdd/instructions.md +806 -0
  303. package/src/bmm/workflows/testarch/atdd/workflow.yaml +47 -0
  304. package/src/bmm/workflows/testarch/automate/checklist.md +582 -0
  305. package/src/bmm/workflows/testarch/automate/instructions.md +1324 -0
  306. package/src/bmm/workflows/testarch/automate/workflow.yaml +54 -0
  307. package/src/bmm/workflows/testarch/ci/checklist.md +247 -0
  308. package/src/bmm/workflows/testarch/ci/github-actions-template.yaml +198 -0
  309. package/src/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +149 -0
  310. package/src/bmm/workflows/testarch/ci/instructions.md +536 -0
  311. package/src/bmm/workflows/testarch/ci/workflow.yaml +47 -0
  312. package/src/bmm/workflows/testarch/framework/checklist.md +320 -0
  313. package/src/bmm/workflows/testarch/framework/instructions.md +481 -0
  314. package/src/bmm/workflows/testarch/framework/workflow.yaml +49 -0
  315. package/src/bmm/workflows/testarch/nfr-assess/checklist.md +407 -0
  316. package/src/bmm/workflows/testarch/nfr-assess/instructions.md +726 -0
  317. package/src/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +461 -0
  318. package/src/bmm/workflows/testarch/nfr-assess/workflow.yaml +49 -0
  319. package/src/bmm/workflows/testarch/test-design/checklist.md +407 -0
  320. package/src/bmm/workflows/testarch/test-design/instructions.md +1158 -0
  321. package/src/bmm/workflows/testarch/test-design/test-design-architecture-template.md +213 -0
  322. package/src/bmm/workflows/testarch/test-design/test-design-qa-template.md +286 -0
  323. package/src/bmm/workflows/testarch/test-design/test-design-template.md +294 -0
  324. package/src/bmm/workflows/testarch/test-design/workflow.yaml +71 -0
  325. package/src/bmm/workflows/testarch/test-review/checklist.md +472 -0
  326. package/src/bmm/workflows/testarch/test-review/instructions.md +628 -0
  327. package/src/bmm/workflows/testarch/test-review/test-review-template.md +390 -0
  328. package/src/bmm/workflows/testarch/test-review/workflow.yaml +48 -0
  329. package/src/bmm/workflows/testarch/trace/checklist.md +642 -0
  330. package/src/bmm/workflows/testarch/trace/instructions.md +1030 -0
  331. package/src/bmm/workflows/testarch/trace/trace-template.md +675 -0
  332. package/src/bmm/workflows/testarch/trace/workflow.yaml +57 -0
  333. package/src/core/_module-installer/installer.js +60 -0
  334. package/src/core/agents/bmad-master.agent.yaml +29 -0
  335. package/src/core/module-help.csv +9 -0
  336. package/src/core/module.yaml +25 -0
  337. package/src/core/resources/excalidraw/README.md +160 -0
  338. package/src/core/resources/excalidraw/excalidraw-helpers.md +127 -0
  339. package/src/core/resources/excalidraw/library-loader.md +50 -0
  340. package/src/core/resources/excalidraw/validate-json-instructions.md +79 -0
  341. package/src/core/tasks/editorial-review-prose.xml +100 -0
  342. package/src/core/tasks/editorial-review-structure.xml +209 -0
  343. package/src/core/tasks/help.md +62 -0
  344. package/src/core/tasks/index-docs.xml +65 -0
  345. package/src/core/tasks/review-adversarial-general.xml +48 -0
  346. package/src/core/tasks/shard-doc.xml +109 -0
  347. package/src/core/tasks/workflow.xml +235 -0
  348. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  349. package/src/core/workflows/advanced-elicitation/workflow.xml +117 -0
  350. package/src/core/workflows/brainstorming/brain-methods.csv +62 -0
  351. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  352. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  353. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  354. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  355. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  356. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  357. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  358. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  359. package/src/core/workflows/brainstorming/template.md +15 -0
  360. package/src/core/workflows/brainstorming/workflow.md +58 -0
  361. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  362. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  363. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +157 -0
  364. package/src/core/workflows/party-mode/workflow.md +194 -0
  365. package/src/utility/agent-components/activation-rules.txt +6 -0
  366. package/src/utility/agent-components/activation-steps.txt +14 -0
  367. package/src/utility/agent-components/agent-command-header.md +1 -0
  368. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  369. package/src/utility/agent-components/handler-action.txt +4 -0
  370. package/src/utility/agent-components/handler-data.txt +5 -0
  371. package/src/utility/agent-components/handler-exec.txt +6 -0
  372. package/src/utility/agent-components/handler-multi.txt +14 -0
  373. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  374. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  375. package/src/utility/agent-components/handler-workflow.txt +10 -0
  376. package/src/utility/agent-components/menu-handlers.txt +6 -0
  377. package/test/README.md +295 -0
  378. package/test/adversarial-review-tests/README.md +56 -0
  379. package/test/adversarial-review-tests/sample-content.md +46 -0
  380. package/test/adversarial-review-tests/test-cases.yaml +103 -0
  381. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +27 -0
  382. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +30 -0
  383. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +22 -0
  384. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +20 -0
  385. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +25 -0
  386. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +24 -0
  387. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +25 -0
  388. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  389. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  390. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +31 -0
  391. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +25 -0
  392. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +25 -0
  393. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +25 -0
  394. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +25 -0
  395. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +26 -0
  396. package/test/fixtures/agent-schema/invalid/metadata/empty-name.agent.yaml +24 -0
  397. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +27 -0
  398. package/test/fixtures/agent-schema/invalid/metadata/missing-id.agent.yaml +23 -0
  399. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +24 -0
  400. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +27 -0
  401. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +27 -0
  402. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +24 -0
  403. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +29 -0
  404. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +31 -0
  405. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +28 -0
  406. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +28 -0
  407. package/test/fixtures/agent-schema/invalid/top-level/empty-file.agent.yaml +5 -0
  408. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +28 -0
  409. package/test/fixtures/agent-schema/invalid/top-level/missing-agent-key.agent.yaml +11 -0
  410. package/test/fixtures/agent-schema/invalid/yaml-errors/invalid-indentation.agent.yaml +19 -0
  411. package/test/fixtures/agent-schema/invalid/yaml-errors/malformed-yaml.agent.yaml +18 -0
  412. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +24 -0
  413. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +22 -0
  414. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +27 -0
  415. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +31 -0
  416. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +22 -0
  417. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +38 -0
  418. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +24 -0
  419. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  420. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +34 -0
  421. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  422. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +24 -0
  423. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +24 -0
  424. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +24 -0
  425. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  426. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  427. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +24 -0
  428. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +24 -0
  429. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +22 -0
  430. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +28 -0
  431. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +30 -0
  432. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +24 -0
  433. package/test/test-agent-schema.js +387 -0
  434. package/test/test-cli-integration.sh +159 -0
  435. package/test/test-installation-components.js +214 -0
  436. package/test/unit-test-schema.js +133 -0
  437. package/tools/bmad-npx-wrapper.js +11 -12
  438. package/tools/build-docs.js +577 -0
  439. package/tools/cli/README.md +7 -0
  440. package/tools/cli/bmad-cli.js +58 -0
  441. package/tools/cli/commands/install.js +87 -0
  442. package/tools/cli/commands/status.js +65 -0
  443. package/tools/cli/external-official-modules.yaml +44 -0
  444. package/tools/cli/installers/install-messages.yaml +58 -0
  445. package/tools/cli/installers/lib/core/config-collector.js +1079 -0
  446. package/tools/cli/installers/lib/core/custom-module-cache.js +259 -0
  447. package/tools/cli/installers/lib/core/dependency-resolver.js +739 -0
  448. package/tools/cli/installers/lib/core/detector.js +223 -0
  449. package/tools/cli/installers/lib/core/ide-config-manager.js +156 -0
  450. package/tools/cli/installers/lib/core/installer.js +2826 -0
  451. package/tools/cli/installers/lib/core/manifest-generator.js +1054 -0
  452. package/tools/cli/installers/lib/core/manifest.js +1036 -0
  453. package/tools/cli/installers/lib/custom/handler.js +363 -0
  454. package/tools/cli/installers/lib/ide/STANDARDIZATION_PLAN.md +208 -0
  455. package/tools/cli/installers/lib/ide/_base-ide.js +655 -0
  456. package/tools/cli/installers/lib/ide/antigravity.js +474 -0
  457. package/tools/cli/installers/lib/ide/auggie.js +244 -0
  458. package/tools/cli/installers/lib/ide/claude-code.js +506 -0
  459. package/tools/cli/installers/lib/ide/cline.js +272 -0
  460. package/tools/cli/installers/lib/ide/codex.js +412 -0
  461. package/tools/cli/installers/lib/ide/crush.js +149 -0
  462. package/tools/cli/installers/lib/ide/cursor.js +160 -0
  463. package/tools/cli/installers/lib/ide/gemini.js +301 -0
  464. package/tools/cli/installers/lib/ide/github-copilot.js +383 -0
  465. package/tools/cli/installers/lib/ide/iflow.js +191 -0
  466. package/tools/cli/installers/lib/ide/kilo.js +250 -0
  467. package/tools/cli/installers/lib/ide/kiro-cli.js +326 -0
  468. package/tools/cli/installers/lib/ide/manager.js +244 -0
  469. package/tools/cli/installers/lib/ide/opencode.js +257 -0
  470. package/tools/cli/installers/lib/ide/qwen.js +372 -0
  471. package/tools/cli/installers/lib/ide/roo.js +273 -0
  472. package/tools/cli/installers/lib/ide/rovo-dev.js +290 -0
  473. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +165 -0
  474. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +158 -0
  475. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  476. package/tools/cli/installers/lib/ide/shared/path-utils.js +165 -0
  477. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +268 -0
  478. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +293 -0
  479. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  480. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +14 -0
  481. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +12 -0
  482. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +13 -0
  483. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  484. package/tools/cli/installers/lib/ide/trae.js +313 -0
  485. package/tools/cli/installers/lib/ide/windsurf.js +258 -0
  486. package/tools/cli/installers/lib/message-loader.js +85 -0
  487. package/tools/cli/installers/lib/modules/external-manager.js +135 -0
  488. package/tools/cli/installers/lib/modules/manager.js +1375 -0
  489. package/tools/cli/lib/activation-builder.js +163 -0
  490. package/tools/cli/lib/agent/compiler.js +522 -0
  491. package/tools/cli/lib/agent/installer.js +716 -0
  492. package/tools/cli/lib/agent/template-engine.js +152 -0
  493. package/tools/cli/lib/agent-analyzer.js +109 -0
  494. package/tools/cli/lib/agent-party-generator.js +194 -0
  495. package/tools/cli/lib/cli-utils.js +227 -0
  496. package/tools/cli/lib/config.js +213 -0
  497. package/tools/cli/lib/file-ops.js +204 -0
  498. package/tools/cli/lib/platform-codes.js +116 -0
  499. package/tools/cli/lib/project-root.js +77 -0
  500. package/tools/cli/lib/prompts.js +433 -0
  501. package/tools/cli/lib/ui.js +1716 -0
  502. package/tools/cli/lib/xml-handler.js +177 -0
  503. package/tools/cli/lib/xml-to-markdown.js +82 -0
  504. package/tools/{yaml-format.js → cli/lib/yaml-format.js} +9 -17
  505. package/tools/cli/lib/yaml-xml-builder.js +587 -0
  506. package/tools/docs/BUNDLE_DISTRIBUTION_SETUP.md +95 -0
  507. package/tools/docs/fix-refs.md +91 -0
  508. package/tools/docs/index.md +2 -0
  509. package/tools/fix-doc-links.js +288 -0
  510. package/tools/flattener/ignoreRules.js +2 -6
  511. package/tools/flattener/main.js +31 -121
  512. package/tools/flattener/projectRoot.js +3 -8
  513. package/tools/flattener/stats.helpers.js +8 -35
  514. package/tools/flattener/stats.js +1 -6
  515. package/tools/flattener/test-matrix.js +1 -5
  516. package/tools/flattener/xml.js +1 -7
  517. package/tools/format-workflow-md.js +263 -0
  518. package/tools/lib/xml-utils.js +13 -0
  519. package/tools/maintainer/review-pr-README.md +55 -0
  520. package/tools/maintainer/review-pr.md +242 -0
  521. package/tools/migrate-custom-module-paths.js +124 -0
  522. package/tools/platform-codes.yaml +157 -0
  523. package/tools/schema/agent.js +491 -0
  524. package/tools/validate-agent-schema.js +110 -0
  525. package/tools/validate-doc-links.js +371 -0
  526. package/tools/validate-svg-changes.sh +356 -0
  527. package/website/README.md +76 -0
  528. package/website/_basement/components/WorkflowGuide.astro +444 -0
  529. package/website/_basement/pages/workflow-guide.astro +17 -0
  530. package/website/astro.config.mjs +169 -0
  531. package/website/public/favicon.ico +0 -0
  532. package/website/public/img/bmad-dark.png +0 -0
  533. package/website/public/img/bmad-light.png +0 -0
  534. package/website/public/img/logo.svg +4 -0
  535. package/website/public/img/workflow-map.png +0 -0
  536. package/website/public/robots.txt +37 -0
  537. package/website/public/workflow-map-diagram.html +361 -0
  538. package/website/src/components/Banner.astro +59 -0
  539. package/website/src/components/Header.astro +121 -0
  540. package/website/src/components/MobileMenuFooter.astro +53 -0
  541. package/website/src/content/config.ts +6 -0
  542. package/website/src/lib/site-url.js +25 -0
  543. package/website/src/pages/404.astro +11 -0
  544. package/website/src/rehype-base-paths.js +89 -0
  545. package/website/src/rehype-markdown-links.js +117 -0
  546. package/website/src/styles/custom.css +500 -0
  547. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  548. package/.github/workflows/format-check.yaml +0 -42
  549. package/bmad-core/agent-teams/team-all.yaml +0 -14
  550. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  551. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  552. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  553. package/bmad-core/agents/analyst.md +0 -81
  554. package/bmad-core/agents/architect.md +0 -83
  555. package/bmad-core/agents/bmad-master.md +0 -107
  556. package/bmad-core/agents/bmad-orchestrator.md +0 -149
  557. package/bmad-core/agents/dev.md +0 -75
  558. package/bmad-core/agents/pm.md +0 -81
  559. package/bmad-core/agents/po.md +0 -76
  560. package/bmad-core/agents/qa.md +0 -88
  561. package/bmad-core/agents/sm.md +0 -62
  562. package/bmad-core/agents/ux-expert.md +0 -66
  563. package/bmad-core/checklists/architect-checklist.md +0 -438
  564. package/bmad-core/checklists/change-checklist.md +0 -182
  565. package/bmad-core/checklists/pm-checklist.md +0 -370
  566. package/bmad-core/checklists/po-master-checklist.md +0 -432
  567. package/bmad-core/checklists/story-dod-checklist.md +0 -94
  568. package/bmad-core/checklists/story-draft-checklist.md +0 -153
  569. package/bmad-core/core-config.yaml +0 -20
  570. package/bmad-core/data/bmad-kb.md +0 -806
  571. package/bmad-core/data/brainstorming-techniques.md +0 -36
  572. package/bmad-core/data/elicitation-methods.md +0 -154
  573. package/bmad-core/data/technical-preferences.md +0 -3
  574. package/bmad-core/data/test-levels-framework.md +0 -146
  575. package/bmad-core/data/test-priorities-matrix.md +0 -172
  576. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  577. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  578. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  579. package/bmad-core/tasks/correct-course.md +0 -70
  580. package/bmad-core/tasks/create-brownfield-story.md +0 -312
  581. package/bmad-core/tasks/create-deep-research-prompt.md +0 -278
  582. package/bmad-core/tasks/create-next-story.md +0 -112
  583. package/bmad-core/tasks/document-project.md +0 -343
  584. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  585. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  586. package/bmad-core/tasks/index-docs.md +0 -173
  587. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  588. package/bmad-core/tasks/nfr-assess.md +0 -343
  589. package/bmad-core/tasks/qa-gate.md +0 -159
  590. package/bmad-core/tasks/review-story.md +0 -314
  591. package/bmad-core/tasks/risk-profile.md +0 -353
  592. package/bmad-core/tasks/shard-doc.md +0 -185
  593. package/bmad-core/tasks/test-design.md +0 -174
  594. package/bmad-core/tasks/trace-requirements.md +0 -264
  595. package/bmad-core/tasks/validate-next-story.md +0 -134
  596. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  597. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  598. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  599. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  600. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -306
  601. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -218
  602. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  603. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -823
  604. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  605. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  606. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  607. package/bmad-core/templates/qa-gate-tmpl.yaml +0 -102
  608. package/bmad-core/templates/story-tmpl.yaml +0 -137
  609. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  610. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  611. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  612. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  613. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  614. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  615. package/common/tasks/create-doc.md +0 -101
  616. package/common/tasks/execute-checklist.md +0 -86
  617. package/common/utils/bmad-doc-template.md +0 -325
  618. package/common/utils/workflow-management.md +0 -69
  619. package/dist/agents/analyst.txt +0 -2889
  620. package/dist/agents/architect.txt +0 -3552
  621. package/dist/agents/bmad-master.txt +0 -8769
  622. package/dist/agents/bmad-orchestrator.txt +0 -1513
  623. package/dist/agents/dev.txt +0 -414
  624. package/dist/agents/pm.txt +0 -2204
  625. package/dist/agents/po.txt +0 -1346
  626. package/dist/agents/qa.txt +0 -1987
  627. package/dist/agents/sm.txt +0 -658
  628. package/dist/agents/ux-expert.txt +0 -694
  629. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2371
  630. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1620
  631. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -815
  632. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10952
  633. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4012
  634. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3698
  635. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -450
  636. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -973
  637. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15376
  638. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2075
  639. package/dist/teams/team-all.txt +0 -12682
  640. package/dist/teams/team-fullstack.txt +0 -10421
  641. package/dist/teams/team-ide-minimal.txt +0 -5103
  642. package/dist/teams/team-no-ui.txt +0 -8980
  643. package/docs/GUIDING-PRINCIPLES.md +0 -91
  644. package/docs/core-architecture.md +0 -219
  645. package/docs/enhanced-ide-development-workflow.md +0 -248
  646. package/docs/expansion-packs.md +0 -280
  647. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  648. package/docs/user-guide.md +0 -504
  649. package/docs/versioning-and-releases.md +0 -147
  650. package/docs/versions.md +0 -48
  651. package/docs/working-in-the-brownfield.md +0 -597
  652. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  653. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
  654. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
  655. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
  656. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
  657. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
  658. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
  659. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  660. package/expansion-packs/README.md +0 -3
  661. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  662. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  663. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  664. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  665. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  666. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  667. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  668. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -250
  669. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -647
  670. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -110
  671. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  672. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -290
  673. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  674. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  675. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  676. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  677. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  678. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  679. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  680. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  681. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  682. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  683. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  684. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  685. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -391
  686. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  687. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  688. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -124
  689. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  690. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -769
  691. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -586
  692. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -110
  693. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -141
  694. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  695. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -290
  696. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  697. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  698. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  699. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  700. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  701. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  702. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  703. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  704. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  705. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  706. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  707. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  708. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -305
  709. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -159
  710. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -153
  711. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  712. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  713. package/release_notes.md +0 -33
  714. package/tools/builders/web-builder.js +0 -675
  715. package/tools/bump-all-versions.js +0 -115
  716. package/tools/bump-expansion-version.js +0 -90
  717. package/tools/cli.js +0 -152
  718. package/tools/installer/README.md +0 -8
  719. package/tools/installer/bin/bmad.js +0 -585
  720. package/tools/installer/config/ide-agent-config.yaml +0 -58
  721. package/tools/installer/config/install.config.yaml +0 -123
  722. package/tools/installer/lib/config-loader.js +0 -257
  723. package/tools/installer/lib/file-manager.js +0 -389
  724. package/tools/installer/lib/ide-base-setup.js +0 -228
  725. package/tools/installer/lib/ide-setup.js +0 -1441
  726. package/tools/installer/lib/installer.js +0 -1995
  727. package/tools/installer/lib/memory-profiler.js +0 -225
  728. package/tools/installer/lib/module-manager.js +0 -114
  729. package/tools/installer/lib/resource-locator.js +0 -308
  730. package/tools/installer/package.json +0 -44
  731. package/tools/lib/dependency-resolver.js +0 -175
  732. package/tools/lib/yaml-utils.js +0 -29
  733. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  734. package/tools/preview-release-notes.js +0 -66
  735. package/tools/shared/bannerArt.js +0 -105
  736. package/tools/sync-installer-version.js +0 -32
  737. package/tools/update-expansion-version.js +0 -53
  738. package/tools/upgraders/v3-to-v4-upgrader.js +0 -672
  739. package/tools/version-bump.js +0 -94
@@ -1,1995 +0,0 @@
1
- const path = require('node:path');
2
- const fs = require('fs-extra');
3
- const chalk = require('chalk');
4
- const ora = require('ora');
5
- const inquirer = require('inquirer');
6
- const fileManager = require('./file-manager');
7
- const configLoader = require('./config-loader');
8
- const ideSetup = require('./ide-setup');
9
- const { extractYamlFromAgent } = require('../../lib/yaml-utils');
10
- const resourceLocator = require('./resource-locator');
11
-
12
- class Installer {
13
- async getCoreVersion() {
14
- try {
15
- // Always use package.json version
16
- const packagePath = path.join(__dirname, '..', '..', '..', 'package.json');
17
- const packageJson = require(packagePath);
18
- return packageJson.version;
19
- } catch {
20
- console.warn("Could not read version from package.json, using 'unknown'");
21
- return 'unknown';
22
- }
23
- }
24
-
25
- async install(config) {
26
- const spinner = ora('Analyzing installation directory...').start();
27
-
28
- try {
29
- // Store the original CWD where npx was executed
30
- const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
31
-
32
- // Resolve installation directory relative to where the user ran the command
33
- let installDir = path.isAbsolute(config.directory)
34
- ? config.directory
35
- : path.resolve(originalCwd, config.directory);
36
-
37
- if (path.basename(installDir) === '.bmad-core') {
38
- // If user points directly to .bmad-core, treat its parent as the project root
39
- installDir = path.dirname(installDir);
40
- }
41
-
42
- // Log resolved path for clarity
43
- if (!path.isAbsolute(config.directory)) {
44
- spinner.text = `Resolving "${config.directory}" to: ${installDir}`;
45
- }
46
-
47
- // Check if directory exists and handle non-existent directories
48
- if (!(await fileManager.pathExists(installDir))) {
49
- spinner.stop();
50
- console.log(`\nThe directory ${installDir} does not exist.`);
51
-
52
- const { action } = await inquirer.prompt([
53
- {
54
- type: 'list',
55
- name: 'action',
56
- message: 'What would you like to do?',
57
- choices: [
58
- {
59
- name: 'Create the directory and continue',
60
- value: 'create',
61
- },
62
- {
63
- name: 'Choose a different directory',
64
- value: 'change',
65
- },
66
- {
67
- name: 'Cancel installation',
68
- value: 'cancel',
69
- },
70
- ],
71
- },
72
- ]);
73
-
74
- switch (action) {
75
- case 'cancel': {
76
- console.log('Installation cancelled.');
77
- process.exit(0);
78
-
79
- break;
80
- }
81
- case 'change': {
82
- const { newDirectory } = await inquirer.prompt([
83
- {
84
- type: 'input',
85
- name: 'newDirectory',
86
- message: 'Enter the new directory path:',
87
- validate: (input) => {
88
- if (!input.trim()) {
89
- return 'Please enter a valid directory path';
90
- }
91
- return true;
92
- },
93
- },
94
- ]);
95
- // Preserve the original CWD for the recursive call
96
- config.directory = newDirectory;
97
- return await this.install(config); // Recursive call with new directory
98
- }
99
- case 'create': {
100
- try {
101
- await fileManager.ensureDirectory(installDir);
102
- console.log(`✓ Created directory: ${installDir}`);
103
- } catch (error) {
104
- console.error(`Failed to create directory: ${error.message}`);
105
- console.error('You may need to check permissions or use a different path.');
106
- process.exit(1);
107
- }
108
-
109
- break;
110
- }
111
- // No default
112
- }
113
-
114
- spinner.start('Analyzing installation directory...');
115
- }
116
-
117
- // If this is an update request from early detection, handle it directly
118
- if (config.installType === 'update') {
119
- const state = await this.detectInstallationState(installDir);
120
- if (state.type === 'v4_existing') {
121
- return await this.performUpdate(config, installDir, state.manifest, spinner);
122
- } else {
123
- spinner.fail('No existing v4 installation found to update');
124
- throw new Error('No existing v4 installation found');
125
- }
126
- }
127
-
128
- // Detect current state
129
- const state = await this.detectInstallationState(installDir);
130
-
131
- // Handle different states
132
- switch (state.type) {
133
- case 'clean': {
134
- return await this.performFreshInstall(config, installDir, spinner);
135
- }
136
-
137
- case 'v4_existing': {
138
- return await this.handleExistingV4Installation(config, installDir, state, spinner);
139
- }
140
-
141
- case 'v3_existing': {
142
- return await this.handleV3Installation(config, installDir, state, spinner);
143
- }
144
-
145
- case 'unknown_existing': {
146
- return await this.handleUnknownInstallation(config, installDir, state, spinner);
147
- }
148
- }
149
- } catch (error) {
150
- // Check if modules were initialized
151
- if (spinner) {
152
- spinner.fail('Installation failed');
153
- } else {
154
- console.error('Installation failed:', error.message);
155
- }
156
- throw error;
157
- }
158
- }
159
-
160
- async detectInstallationState(installDir) {
161
- const state = {
162
- type: 'clean',
163
- hasV4Manifest: false,
164
- hasV3Structure: false,
165
- hasBmadCore: false,
166
- hasOtherFiles: false,
167
- manifest: null,
168
- expansionPacks: {},
169
- };
170
-
171
- // Check if directory exists
172
- if (!(await fileManager.pathExists(installDir))) {
173
- return state; // clean install
174
- }
175
-
176
- // Check for V4 installation (has .bmad-core with manifest)
177
- const bmadCorePath = path.join(installDir, '.bmad-core');
178
- const manifestPath = path.join(bmadCorePath, 'install-manifest.yaml');
179
-
180
- if (await fileManager.pathExists(manifestPath)) {
181
- state.type = 'v4_existing';
182
- state.hasV4Manifest = true;
183
- state.hasBmadCore = true;
184
- state.manifest = await fileManager.readManifest(installDir);
185
- return state;
186
- }
187
-
188
- // Check for V3 installation (has bmad-agent directory)
189
- const bmadAgentPath = path.join(installDir, 'bmad-agent');
190
- if (await fileManager.pathExists(bmadAgentPath)) {
191
- state.type = 'v3_existing';
192
- state.hasV3Structure = true;
193
- return state;
194
- }
195
-
196
- // Check for .bmad-core without manifest (broken V4 or manual copy)
197
- if (await fileManager.pathExists(bmadCorePath)) {
198
- state.type = 'unknown_existing';
199
- state.hasBmadCore = true;
200
- return state;
201
- }
202
-
203
- // Check if directory has other files
204
- const files = await resourceLocator.findFiles('**/*', {
205
- cwd: installDir,
206
- nodir: true,
207
- ignore: ['**/.git/**', '**/node_modules/**'],
208
- });
209
-
210
- if (files.length > 0) {
211
- // Directory has other files, but no BMad installation.
212
- // Treat as clean install but record that it isn't empty.
213
- state.hasOtherFiles = true;
214
- }
215
-
216
- // Check for expansion packs (folders starting with .)
217
- const expansionPacks = await this.detectExpansionPacks(installDir);
218
- state.expansionPacks = expansionPacks;
219
-
220
- return state; // clean install
221
- }
222
-
223
- async performFreshInstall(config, installDir, spinner, options = {}) {
224
- spinner.text = 'Installing BMad Method...';
225
-
226
- let files = [];
227
-
228
- switch (config.installType) {
229
- case 'full': {
230
- // Full installation - copy entire .bmad-core folder as a subdirectory
231
- spinner.text = 'Copying complete .bmad-core folder...';
232
- const sourceDir = resourceLocator.getBmadCorePath();
233
- const bmadCoreDestDir = path.join(installDir, '.bmad-core');
234
- await fileManager.copyDirectoryWithRootReplacement(
235
- sourceDir,
236
- bmadCoreDestDir,
237
- '.bmad-core',
238
- );
239
-
240
- // Copy common/ items to .bmad-core
241
- spinner.text = 'Copying common utilities...';
242
- await this.copyCommonItems(installDir, '.bmad-core', spinner);
243
-
244
- // Copy documentation files from docs/ to .bmad-core
245
- spinner.text = 'Copying documentation files...';
246
- await this.copyDocsItems(installDir, '.bmad-core', spinner);
247
-
248
- // Get list of all files for manifest
249
- const foundFiles = await resourceLocator.findFiles('**/*', {
250
- cwd: bmadCoreDestDir,
251
- nodir: true,
252
- ignore: ['**/.git/**', '**/node_modules/**'],
253
- });
254
- files = foundFiles.map((file) => path.join('.bmad-core', file));
255
-
256
- break;
257
- }
258
- case 'single-agent': {
259
- // Single agent installation
260
- spinner.text = `Installing ${config.agent} agent...`;
261
-
262
- // Copy agent file with {root} replacement
263
- const agentPath = configLoader.getAgentPath(config.agent);
264
- const destinationAgentPath = path.join(
265
- installDir,
266
- '.bmad-core',
267
- 'agents',
268
- `${config.agent}.md`,
269
- );
270
- await fileManager.copyFileWithRootReplacement(
271
- agentPath,
272
- destinationAgentPath,
273
- '.bmad-core',
274
- );
275
- files.push(`.bmad-core/agents/${config.agent}.md`);
276
-
277
- // Copy dependencies
278
- const { all: dependencies } = await resourceLocator.getAgentDependencies(config.agent);
279
- const sourceBase = resourceLocator.getBmadCorePath();
280
-
281
- for (const dep of dependencies) {
282
- spinner.text = `Copying dependency: ${dep}`;
283
-
284
- if (dep.includes('*')) {
285
- // Handle glob patterns with {root} replacement
286
- const copiedFiles = await fileManager.copyGlobPattern(
287
- dep.replace('.bmad-core/', ''),
288
- sourceBase,
289
- path.join(installDir, '.bmad-core'),
290
- '.bmad-core',
291
- );
292
- files.push(...copiedFiles.map((f) => `.bmad-core/${f}`));
293
- } else {
294
- // Handle single files with {root} replacement if needed
295
- const sourcePath = path.join(sourceBase, dep.replace('.bmad-core/', ''));
296
- const destinationPath = path.join(installDir, dep);
297
-
298
- const needsRootReplacement =
299
- dep.endsWith('.md') || dep.endsWith('.yaml') || dep.endsWith('.yml');
300
- let success = false;
301
-
302
- success = await (needsRootReplacement
303
- ? fileManager.copyFileWithRootReplacement(sourcePath, destinationPath, '.bmad-core')
304
- : fileManager.copyFile(sourcePath, destinationPath));
305
-
306
- if (success) {
307
- files.push(dep);
308
- }
309
- }
310
- }
311
-
312
- // Copy common/ items to .bmad-core
313
- spinner.text = 'Copying common utilities...';
314
- const commonFiles = await this.copyCommonItems(installDir, '.bmad-core', spinner);
315
- files.push(...commonFiles);
316
-
317
- // Copy documentation files from docs/ to .bmad-core
318
- spinner.text = 'Copying documentation files...';
319
- const documentFiles = await this.copyDocsItems(installDir, '.bmad-core', spinner);
320
- files.push(...documentFiles);
321
-
322
- break;
323
- }
324
- case 'team': {
325
- // Team installation
326
- spinner.text = `Installing ${config.team} team...`;
327
-
328
- // Get team dependencies
329
- const teamDependencies = await configLoader.getTeamDependencies(config.team);
330
- const sourceBase = resourceLocator.getBmadCorePath();
331
-
332
- // Install all team dependencies
333
- for (const dep of teamDependencies) {
334
- spinner.text = `Copying team dependency: ${dep}`;
335
-
336
- if (dep.includes('*')) {
337
- // Handle glob patterns with {root} replacement
338
- const copiedFiles = await fileManager.copyGlobPattern(
339
- dep.replace('.bmad-core/', ''),
340
- sourceBase,
341
- path.join(installDir, '.bmad-core'),
342
- '.bmad-core',
343
- );
344
- files.push(...copiedFiles.map((f) => `.bmad-core/${f}`));
345
- } else {
346
- // Handle single files with {root} replacement if needed
347
- const sourcePath = path.join(sourceBase, dep.replace('.bmad-core/', ''));
348
- const destinationPath = path.join(installDir, dep);
349
-
350
- const needsRootReplacement =
351
- dep.endsWith('.md') || dep.endsWith('.yaml') || dep.endsWith('.yml');
352
- let success = false;
353
-
354
- success = await (needsRootReplacement
355
- ? fileManager.copyFileWithRootReplacement(sourcePath, destinationPath, '.bmad-core')
356
- : fileManager.copyFile(sourcePath, destinationPath));
357
-
358
- if (success) {
359
- files.push(dep);
360
- }
361
- }
362
- }
363
-
364
- // Copy common/ items to .bmad-core
365
- spinner.text = 'Copying common utilities...';
366
- const commonFiles = await this.copyCommonItems(installDir, '.bmad-core', spinner);
367
- files.push(...commonFiles);
368
-
369
- // Copy documentation files from docs/ to .bmad-core
370
- spinner.text = 'Copying documentation files...';
371
- const documentFiles = await this.copyDocsItems(installDir, '.bmad-core', spinner);
372
- files.push(...documentFiles);
373
-
374
- break;
375
- }
376
- case 'expansion-only': {
377
- // Expansion-only installation - DO NOT create .bmad-core
378
- // Only install expansion packs
379
- spinner.text = 'Installing expansion packs only...';
380
-
381
- break;
382
- }
383
- // No default
384
- }
385
-
386
- // Install expansion packs if requested
387
- const expansionFiles = await this.installExpansionPacks(
388
- installDir,
389
- config.expansionPacks,
390
- spinner,
391
- config,
392
- );
393
- files.push(...expansionFiles);
394
-
395
- // Install web bundles if requested
396
- if (config.includeWebBundles && config.webBundlesDirectory) {
397
- spinner.text = 'Installing web bundles...';
398
- // Resolve web bundles directory using the same logic as the main installation directory
399
- const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
400
- let resolvedWebBundlesDir = path.isAbsolute(config.webBundlesDirectory)
401
- ? config.webBundlesDirectory
402
- : path.resolve(originalCwd, config.webBundlesDirectory);
403
- await this.installWebBundles(resolvedWebBundlesDir, config, spinner);
404
- }
405
-
406
- // Set up IDE integration if requested
407
- const ides = config.ides || (config.ide ? [config.ide] : []);
408
- if (ides.length > 0) {
409
- for (const ide of ides) {
410
- spinner.text = `Setting up ${ide} integration...`;
411
- const preConfiguredSettings = ide === 'github-copilot' ? config.githubCopilotConfig : null;
412
- await ideSetup.setup(ide, installDir, config.agent, spinner, preConfiguredSettings);
413
- }
414
- }
415
-
416
- // Modify core-config.yaml if sharding preferences were provided
417
- if (
418
- config.installType !== 'expansion-only' &&
419
- (config.prdSharded !== undefined || config.architectureSharded !== undefined)
420
- ) {
421
- spinner.text = 'Configuring document sharding settings...';
422
- await fileManager.modifyCoreConfig(installDir, config);
423
- }
424
-
425
- // Create manifest (skip for expansion-only installations)
426
- if (config.installType !== 'expansion-only') {
427
- spinner.text = 'Creating installation manifest...';
428
- await fileManager.createManifest(installDir, config, files);
429
- }
430
-
431
- spinner.succeed('Installation complete!');
432
- this.showSuccessMessage(config, installDir, options);
433
- }
434
-
435
- async handleExistingV4Installation(config, installDir, state, spinner) {
436
- spinner.stop();
437
-
438
- const currentVersion = state.manifest.version;
439
- const newVersion = await this.getCoreVersion();
440
- const versionCompare = this.compareVersions(currentVersion, newVersion);
441
-
442
- console.log(chalk.yellow('\n🔍 Found existing BMad v4 installation'));
443
- console.log(` Directory: ${installDir}`);
444
- console.log(` Current version: ${currentVersion}`);
445
- console.log(` Available version: ${newVersion}`);
446
- console.log(` Installed: ${new Date(state.manifest.installed_at).toLocaleDateString()}`);
447
-
448
- // Check file integrity
449
- spinner.start('Checking installation integrity...');
450
- const integrity = await fileManager.checkFileIntegrity(installDir, state.manifest);
451
- spinner.stop();
452
-
453
- const hasMissingFiles = integrity.missing.length > 0;
454
- const hasModifiedFiles = integrity.modified.length > 0;
455
- const hasIntegrityIssues = hasMissingFiles || hasModifiedFiles;
456
-
457
- if (hasIntegrityIssues) {
458
- console.log(chalk.red('\n⚠️ Installation issues detected:'));
459
- if (hasMissingFiles) {
460
- console.log(chalk.red(` Missing files: ${integrity.missing.length}`));
461
- if (integrity.missing.length <= 5) {
462
- for (const file of integrity.missing) console.log(chalk.dim(` - ${file}`));
463
- }
464
- }
465
- if (hasModifiedFiles) {
466
- console.log(chalk.yellow(` Modified files: ${integrity.modified.length}`));
467
- if (integrity.modified.length <= 5) {
468
- for (const file of integrity.modified) console.log(chalk.dim(` - ${file}`));
469
- }
470
- }
471
- }
472
-
473
- // Show existing expansion packs
474
- if (Object.keys(state.expansionPacks).length > 0) {
475
- console.log(chalk.cyan('\n📦 Installed expansion packs:'));
476
- for (const [packId, packInfo] of Object.entries(state.expansionPacks)) {
477
- if (packInfo.hasManifest && packInfo.manifest) {
478
- console.log(` - ${packId} (v${packInfo.manifest.version || 'unknown'})`);
479
- } else {
480
- console.log(` - ${packId} (no manifest)`);
481
- }
482
- }
483
- }
484
-
485
- let choices = [];
486
-
487
- if (versionCompare < 0) {
488
- console.log(chalk.cyan('\n⬆️ Upgrade available for BMad core'));
489
- choices.push({
490
- name: `Upgrade BMad core (v${currentVersion} → v${newVersion})`,
491
- value: 'upgrade',
492
- });
493
- } else if (versionCompare === 0) {
494
- if (hasIntegrityIssues) {
495
- // Offer repair option when files are missing or modified
496
- choices.push({
497
- name: 'Repair installation (restore missing/modified files)',
498
- value: 'repair',
499
- });
500
- }
501
- console.log(chalk.yellow('\n⚠️ Same version already installed'));
502
- choices.push({
503
- name: `Force reinstall BMad core (v${currentVersion} - reinstall)`,
504
- value: 'reinstall',
505
- });
506
- } else {
507
- console.log(chalk.yellow('\n⬇️ Installed version is newer than available'));
508
- choices.push({
509
- name: `Downgrade BMad core (v${currentVersion} → v${newVersion})`,
510
- value: 'reinstall',
511
- });
512
- }
513
-
514
- choices.push(
515
- { name: 'Add/update expansion packs only', value: 'expansions' },
516
- { name: 'Cancel', value: 'cancel' },
517
- );
518
-
519
- const { action } = await inquirer.prompt([
520
- {
521
- type: 'list',
522
- name: 'action',
523
- message: 'What would you like to do?',
524
- choices: choices,
525
- },
526
- ]);
527
-
528
- switch (action) {
529
- case 'upgrade': {
530
- return await this.performUpdate(config, installDir, state.manifest, spinner);
531
- }
532
- case 'repair': {
533
- // For repair, restore missing/modified files while backing up modified ones
534
- return await this.performRepair(config, installDir, state.manifest, integrity, spinner);
535
- }
536
- case 'reinstall': {
537
- // For reinstall, don't check for modifications - just overwrite
538
- return await this.performReinstall(config, installDir, spinner);
539
- }
540
- case 'expansions': {
541
- // Ask which expansion packs to install
542
- const availableExpansionPacks = await resourceLocator.getExpansionPacks();
543
-
544
- if (availableExpansionPacks.length === 0) {
545
- console.log(chalk.yellow('No expansion packs available.'));
546
- return;
547
- }
548
-
549
- const { selectedPacks } = await inquirer.prompt([
550
- {
551
- type: 'checkbox',
552
- name: 'selectedPacks',
553
- message: 'Select expansion packs to install/update:',
554
- choices: availableExpansionPacks.map((pack) => ({
555
- name: `${pack.name} (v${pack.version}) .${pack.id}`,
556
- value: pack.id,
557
- checked: state.expansionPacks[pack.id] !== undefined,
558
- })),
559
- },
560
- ]);
561
-
562
- if (selectedPacks.length === 0) {
563
- console.log(chalk.yellow('No expansion packs selected.'));
564
- return;
565
- }
566
-
567
- spinner.start('Installing expansion packs...');
568
- const expansionFiles = await this.installExpansionPacks(
569
- installDir,
570
- selectedPacks,
571
- spinner,
572
- { ides: config.ides || [] },
573
- );
574
- spinner.succeed('Expansion packs installed successfully!');
575
-
576
- console.log(chalk.green('\n✓ Installation complete!'));
577
- console.log(chalk.green(`✓ Expansion packs installed/updated:`));
578
- for (const packId of selectedPacks) {
579
- console.log(chalk.green(` - ${packId} → .${packId}/`));
580
- }
581
- return;
582
- }
583
- case 'cancel': {
584
- console.log('Installation cancelled.');
585
- return;
586
- }
587
- }
588
- }
589
-
590
- async handleV3Installation(config, installDir, state, spinner) {
591
- spinner.stop();
592
-
593
- console.log(chalk.yellow('\n🔍 Found BMad v3 installation (bmad-agent/ directory)'));
594
- console.log(` Directory: ${installDir}`);
595
-
596
- const { action } = await inquirer.prompt([
597
- {
598
- type: 'list',
599
- name: 'action',
600
- message: 'What would you like to do?',
601
- choices: [
602
- { name: 'Upgrade from v3 to v4 (recommended)', value: 'upgrade' },
603
- { name: 'Install v4 alongside v3', value: 'alongside' },
604
- { name: 'Cancel', value: 'cancel' },
605
- ],
606
- },
607
- ]);
608
-
609
- switch (action) {
610
- case 'upgrade': {
611
- console.log(chalk.cyan('\n📦 Starting v3 to v4 upgrade process...'));
612
- const V3ToV4Upgrader = require('../../upgraders/v3-to-v4-upgrader');
613
- const upgrader = new V3ToV4Upgrader();
614
- return await upgrader.upgrade({
615
- projectPath: installDir,
616
- ides: config.ides || [], // Pass IDE selections from initial config
617
- });
618
- }
619
- case 'alongside': {
620
- return await this.performFreshInstall(config, installDir, spinner);
621
- }
622
- case 'cancel': {
623
- console.log('Installation cancelled.');
624
- return;
625
- }
626
- }
627
- }
628
-
629
- async handleUnknownInstallation(config, installDir, state, spinner) {
630
- spinner.stop();
631
-
632
- console.log(chalk.yellow('\n⚠️ Directory contains existing files'));
633
- console.log(` Directory: ${installDir}`);
634
-
635
- if (state.hasBmadCore) {
636
- console.log(' Found: .bmad-core directory (but no manifest)');
637
- }
638
- if (state.hasOtherFiles) {
639
- console.log(' Found: Other files in directory');
640
- }
641
-
642
- const { action } = await inquirer.prompt([
643
- {
644
- type: 'list',
645
- name: 'action',
646
- message: 'What would you like to do?',
647
- choices: [
648
- { name: 'Install anyway (may overwrite files)', value: 'force' },
649
- { name: 'Choose different directory', value: 'different' },
650
- { name: 'Cancel', value: 'cancel' },
651
- ],
652
- },
653
- ]);
654
-
655
- switch (action) {
656
- case 'force': {
657
- return await this.performFreshInstall(config, installDir, spinner);
658
- }
659
- case 'different': {
660
- const { newDir } = await inquirer.prompt([
661
- {
662
- type: 'input',
663
- name: 'newDir',
664
- message: 'Enter new installation directory:',
665
- default: path.join(path.dirname(installDir), 'bmad-project'),
666
- },
667
- ]);
668
- config.directory = newDir;
669
- return await this.install(config);
670
- }
671
- case 'cancel': {
672
- console.log('Installation cancelled.');
673
- return;
674
- }
675
- }
676
- }
677
-
678
- async performUpdate(newConfig, installDir, manifest, spinner) {
679
- spinner.start('Checking for updates...');
680
-
681
- try {
682
- // Get current and new versions
683
- const currentVersion = manifest.version;
684
- const newVersion = await this.getCoreVersion();
685
- const versionCompare = this.compareVersions(currentVersion, newVersion);
686
-
687
- // Only check for modified files if it's an actual version upgrade
688
- let modifiedFiles = [];
689
- if (versionCompare !== 0) {
690
- spinner.text = 'Checking for modified files...';
691
- modifiedFiles = await fileManager.checkModifiedFiles(installDir, manifest);
692
- }
693
-
694
- if (modifiedFiles.length > 0) {
695
- spinner.warn('Found modified files');
696
- console.log(chalk.yellow('\nThe following files have been modified:'));
697
- for (const file of modifiedFiles) {
698
- console.log(` - ${file}`);
699
- }
700
-
701
- const { action } = await inquirer.prompt([
702
- {
703
- type: 'list',
704
- name: 'action',
705
- message: 'How would you like to proceed?',
706
- choices: [
707
- { name: 'Backup and overwrite modified files', value: 'backup' },
708
- { name: 'Skip modified files', value: 'skip' },
709
- { name: 'Cancel update', value: 'cancel' },
710
- ],
711
- },
712
- ]);
713
-
714
- if (action === 'cancel') {
715
- console.log('Update cancelled.');
716
- return;
717
- }
718
-
719
- if (action === 'backup') {
720
- spinner.start('Backing up modified files...');
721
- for (const file of modifiedFiles) {
722
- const filePath = path.join(installDir, file);
723
- const backupPath = await fileManager.backupFile(filePath);
724
- console.log(chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`));
725
- }
726
- }
727
- }
728
-
729
- // Perform update by re-running installation
730
- spinner.text = versionCompare === 0 ? 'Reinstalling files...' : 'Updating files...';
731
- const config = {
732
- installType: manifest.install_type,
733
- agent: manifest.agent,
734
- directory: installDir,
735
- ides: newConfig?.ides || manifest.ides_setup || [],
736
- };
737
-
738
- await this.performFreshInstall(config, installDir, spinner, { isUpdate: true });
739
-
740
- // Clean up .yml files that now have .yaml counterparts
741
- spinner.text = 'Cleaning up legacy .yml files...';
742
- await this.cleanupLegacyYmlFiles(installDir, spinner);
743
- } catch (error) {
744
- spinner.fail('Update failed');
745
- throw error;
746
- }
747
- }
748
-
749
- async performRepair(config, installDir, manifest, integrity, spinner) {
750
- spinner.start('Preparing to repair installation...');
751
-
752
- try {
753
- // Back up modified files
754
- if (integrity.modified.length > 0) {
755
- spinner.text = 'Backing up modified files...';
756
- for (const file of integrity.modified) {
757
- const filePath = path.join(installDir, file);
758
- if (await fileManager.pathExists(filePath)) {
759
- const backupPath = await fileManager.backupFile(filePath);
760
- console.log(chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`));
761
- }
762
- }
763
- }
764
-
765
- // Restore missing and modified files
766
- spinner.text = 'Restoring files...';
767
- const sourceBase = resourceLocator.getBmadCorePath();
768
- const filesToRestore = [...integrity.missing, ...integrity.modified];
769
-
770
- for (const file of filesToRestore) {
771
- // Skip the manifest file itself
772
- if (file.endsWith('install-manifest.yaml')) continue;
773
-
774
- const relativePath = file.replace('.bmad-core/', '');
775
- const destinationPath = path.join(installDir, file);
776
-
777
- // Check if this is a common/ file that needs special processing
778
- const commonBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename))));
779
- const commonSourcePath = path.join(commonBase, 'common', relativePath);
780
-
781
- if (await fileManager.pathExists(commonSourcePath)) {
782
- // This is a common/ file - needs template processing
783
- const fs = require('node:fs').promises;
784
- const content = await fs.readFile(commonSourcePath, 'utf8');
785
- const updatedContent = content.replaceAll('{root}', '.bmad-core');
786
- await fileManager.ensureDirectory(path.dirname(destinationPath));
787
- await fs.writeFile(destinationPath, updatedContent, 'utf8');
788
- spinner.text = `Restored: ${file}`;
789
- } else {
790
- // Regular file from bmad-core
791
- const sourcePath = path.join(sourceBase, relativePath);
792
- if (await fileManager.pathExists(sourcePath)) {
793
- await fileManager.copyFile(sourcePath, destinationPath);
794
- spinner.text = `Restored: ${file}`;
795
-
796
- // If this is a .yaml file, check for and remove corresponding .yml file
797
- if (file.endsWith('.yaml')) {
798
- const ymlFile = file.replace(/\.yaml$/, '.yml');
799
- const ymlPath = path.join(installDir, ymlFile);
800
- if (await fileManager.pathExists(ymlPath)) {
801
- const fs = require('node:fs').promises;
802
- await fs.unlink(ymlPath);
803
- console.log(chalk.dim(` Removed legacy: ${ymlFile} (replaced by ${file})`));
804
- }
805
- }
806
- } else {
807
- console.warn(chalk.yellow(` Warning: Source file not found: ${file}`));
808
- }
809
- }
810
- }
811
-
812
- // Clean up .yml files that now have .yaml counterparts
813
- spinner.text = 'Cleaning up legacy .yml files...';
814
- await this.cleanupLegacyYmlFiles(installDir, spinner);
815
-
816
- spinner.succeed('Repair completed successfully!');
817
-
818
- // Show summary
819
- console.log(chalk.green('\n✓ Installation repaired!'));
820
- if (integrity.missing.length > 0) {
821
- console.log(chalk.green(` Restored ${integrity.missing.length} missing files`));
822
- }
823
- if (integrity.modified.length > 0) {
824
- console.log(
825
- chalk.green(` Restored ${integrity.modified.length} modified files (backups created)`),
826
- );
827
- }
828
-
829
- // Warning for Cursor custom modes if agents were repaired
830
- const ides = manifest.ides_setup || [];
831
- if (ides.includes('cursor')) {
832
- console.log(chalk.yellow.bold('\n⚠️ IMPORTANT: Cursor Custom Modes Update Required'));
833
- console.log(
834
- chalk.yellow(
835
- 'Since agent files have been repaired, you need to update any custom agent modes configured in the Cursor custom agent GUI per the Cursor docs.',
836
- ),
837
- );
838
- }
839
- } catch (error) {
840
- spinner.fail('Repair failed');
841
- throw error;
842
- }
843
- }
844
-
845
- async performReinstall(config, installDir, spinner) {
846
- spinner.start('Preparing to reinstall BMad Method...');
847
-
848
- // Remove existing .bmad-core
849
- const bmadCorePath = path.join(installDir, '.bmad-core');
850
- if (await fileManager.pathExists(bmadCorePath)) {
851
- spinner.text = 'Removing existing installation...';
852
- await fileManager.removeDirectory(bmadCorePath);
853
- }
854
-
855
- spinner.text = 'Installing fresh copy...';
856
- const result = await this.performFreshInstall(config, installDir, spinner, { isUpdate: true });
857
-
858
- // Clean up .yml files that now have .yaml counterparts
859
- spinner.text = 'Cleaning up legacy .yml files...';
860
- await this.cleanupLegacyYmlFiles(installDir, spinner);
861
-
862
- return result;
863
- }
864
-
865
- showSuccessMessage(config, installDir, options = {}) {
866
- console.log(chalk.green('\n✓ BMad Method installed successfully!\n'));
867
-
868
- const ides = config.ides || (config.ide ? [config.ide] : []);
869
- if (ides.length > 0) {
870
- for (const ide of ides) {
871
- const ideConfig = configLoader.getIdeConfiguration(ide);
872
- if (ideConfig?.instructions) {
873
- console.log(chalk.bold(`To use BMad agents in ${ideConfig.name}:`));
874
- console.log(ideConfig.instructions);
875
- }
876
- }
877
- } else {
878
- console.log(chalk.yellow('No IDE configuration was set up.'));
879
- console.log('You can manually configure your IDE using the agent files in:', installDir);
880
- }
881
-
882
- // Information about installation components
883
- console.log(chalk.bold('\n🎯 Installation Summary:'));
884
- if (config.installType !== 'expansion-only') {
885
- console.log(chalk.green('✓ .bmad-core framework installed with all agents and workflows'));
886
- }
887
-
888
- if (config.expansionPacks && config.expansionPacks.length > 0) {
889
- console.log(chalk.green(`✓ Expansion packs installed:`));
890
- for (const packId of config.expansionPacks) {
891
- console.log(chalk.green(` - ${packId} → .${packId}/`));
892
- }
893
- }
894
-
895
- if (config.includeWebBundles && config.webBundlesDirectory) {
896
- const bundleInfo = this.getWebBundleInfo(config);
897
- // Resolve the web bundles directory for display
898
- const originalCwd = process.env.INIT_CWD || process.env.PWD || process.cwd();
899
- const resolvedWebBundlesDir = path.isAbsolute(config.webBundlesDirectory)
900
- ? config.webBundlesDirectory
901
- : path.resolve(originalCwd, config.webBundlesDirectory);
902
- console.log(
903
- chalk.green(`✓ Web bundles (${bundleInfo}) installed to: ${resolvedWebBundlesDir}`),
904
- );
905
- }
906
-
907
- if (ides.length > 0) {
908
- const ideNames = ides
909
- .map((ide) => {
910
- const ideConfig = configLoader.getIdeConfiguration(ide);
911
- return ideConfig?.name || ide;
912
- })
913
- .join(', ');
914
- console.log(chalk.green(`✓ IDE rules and configurations set up for: ${ideNames}`));
915
- }
916
-
917
- // Information about web bundles
918
- if (!config.includeWebBundles) {
919
- console.log(chalk.bold('\n📦 Web Bundles Available:'));
920
- console.log('Pre-built web bundles are available and can be added later:');
921
- console.log(chalk.cyan(' Run the installer again to add them to your project'));
922
- console.log('These bundles work independently and can be shared, moved, or used');
923
- console.log('in other projects as standalone files.');
924
- }
925
-
926
- if (config.installType === 'single-agent') {
927
- console.log(chalk.dim('\nNeed other agents? Run: npx bmad-method install --agent=<name>'));
928
- console.log(chalk.dim('Need everything? Run: npx bmad-method install --full'));
929
- }
930
-
931
- // Warning for Cursor custom modes if agents were updated
932
- if (options.isUpdate && ides.includes('cursor')) {
933
- console.log(chalk.yellow.bold('\n⚠️ IMPORTANT: Cursor Custom Modes Update Required'));
934
- console.log(
935
- chalk.yellow(
936
- 'Since agents have been updated, you need to update any custom agent modes configured in the Cursor custom agent GUI per the Cursor docs.',
937
- ),
938
- );
939
- }
940
-
941
- // Important notice to read the user guide
942
- console.log(
943
- chalk.red.bold(
944
- '\n📖 IMPORTANT: Please read the user guide at docs/user-guide.md (also installed at .bmad-core/user-guide.md)',
945
- ),
946
- );
947
- console.log(
948
- chalk.red(
949
- 'This guide contains essential information about the BMad workflow and how to use the agents effectively.',
950
- ),
951
- );
952
- }
953
-
954
- // Legacy method for backward compatibility
955
- async update() {
956
- console.log(chalk.yellow('The "update" command is deprecated.'));
957
- console.log(
958
- 'Please use "install" instead - it will detect and offer to update existing installations.',
959
- );
960
-
961
- const installDir = await this.findInstallation();
962
- if (installDir) {
963
- const config = {
964
- installType: 'full',
965
- directory: path.dirname(installDir),
966
- ide: null,
967
- };
968
- return await this.install(config);
969
- }
970
- console.log(chalk.red('No BMad installation found.'));
971
- }
972
-
973
- async listAgents() {
974
- const agents = await resourceLocator.getAvailableAgents();
975
-
976
- console.log(chalk.bold('\nAvailable BMad Agents:\n'));
977
-
978
- for (const agent of agents) {
979
- console.log(chalk.cyan(` ${agent.id.padEnd(20)}`), agent.description);
980
- }
981
-
982
- console.log(chalk.dim('\nInstall with: npx bmad-method install --agent=<id>\n'));
983
- }
984
-
985
- async listExpansionPacks() {
986
- const expansionPacks = await resourceLocator.getExpansionPacks();
987
-
988
- console.log(chalk.bold('\nAvailable BMad Expansion Packs:\n'));
989
-
990
- if (expansionPacks.length === 0) {
991
- console.log(chalk.yellow('No expansion packs found.'));
992
- return;
993
- }
994
-
995
- for (const pack of expansionPacks) {
996
- console.log(chalk.cyan(` ${pack.id.padEnd(20)}`), `${pack.name} v${pack.version}`);
997
- console.log(chalk.dim(` ${' '.repeat(22)}${pack.description}`));
998
- if (pack.author && pack.author !== 'Unknown') {
999
- console.log(chalk.dim(` ${' '.repeat(22)}by ${pack.author}`));
1000
- }
1001
- console.log();
1002
- }
1003
-
1004
- console.log(chalk.dim('Install with: npx bmad-method install --full --expansion-packs <id>\n'));
1005
- }
1006
-
1007
- async showStatus() {
1008
- const installDir = await this.findInstallation();
1009
-
1010
- if (!installDir) {
1011
- console.log(chalk.yellow('No BMad installation found in current directory tree'));
1012
- return;
1013
- }
1014
-
1015
- const manifest = await fileManager.readManifest(installDir);
1016
-
1017
- if (!manifest) {
1018
- console.log(chalk.red('Invalid installation - manifest not found'));
1019
- return;
1020
- }
1021
-
1022
- console.log(chalk.bold('\nBMad Installation Status:\n'));
1023
- console.log(` Directory: ${installDir}`);
1024
- console.log(` Version: ${manifest.version}`);
1025
- console.log(` Installed: ${new Date(manifest.installed_at).toLocaleDateString()}`);
1026
- console.log(` Type: ${manifest.install_type}`);
1027
-
1028
- if (manifest.agent) {
1029
- console.log(` Agent: ${manifest.agent}`);
1030
- }
1031
-
1032
- if (manifest.ides_setup && manifest.ides_setup.length > 0) {
1033
- console.log(` IDE Setup: ${manifest.ides_setup.join(', ')}`);
1034
- }
1035
-
1036
- console.log(` Total Files: ${manifest.files.length}`);
1037
-
1038
- // Check for modifications
1039
- const modifiedFiles = await fileManager.checkModifiedFiles(installDir, manifest);
1040
- if (modifiedFiles.length > 0) {
1041
- console.log(chalk.yellow(` Modified Files: ${modifiedFiles.length}`));
1042
- }
1043
-
1044
- console.log('');
1045
- }
1046
-
1047
- async getAvailableAgents() {
1048
- return resourceLocator.getAvailableAgents();
1049
- }
1050
-
1051
- async getAvailableExpansionPacks() {
1052
- return resourceLocator.getExpansionPacks();
1053
- }
1054
-
1055
- async getAvailableTeams() {
1056
- return configLoader.getAvailableTeams();
1057
- }
1058
-
1059
- async installExpansionPacks(installDir, selectedPacks, spinner, config = {}) {
1060
- if (!selectedPacks || selectedPacks.length === 0) {
1061
- return [];
1062
- }
1063
-
1064
- const installedFiles = [];
1065
-
1066
- for (const packId of selectedPacks) {
1067
- spinner.text = `Installing expansion pack: ${packId}...`;
1068
-
1069
- try {
1070
- const expansionPacks = await resourceLocator.getExpansionPacks();
1071
- const pack = expansionPacks.find((p) => p.id === packId);
1072
-
1073
- if (!pack) {
1074
- console.warn(`Expansion pack ${packId} not found, skipping...`);
1075
- continue;
1076
- }
1077
-
1078
- // Check if expansion pack already exists
1079
- let expansionDotFolder = path.join(installDir, `.${packId}`);
1080
- const existingManifestPath = path.join(expansionDotFolder, 'install-manifest.yaml');
1081
-
1082
- if (await fileManager.pathExists(existingManifestPath)) {
1083
- spinner.stop();
1084
- const existingManifest = await fileManager.readExpansionPackManifest(installDir, packId);
1085
-
1086
- console.log(chalk.yellow(`\n🔍 Found existing ${pack.name} installation`));
1087
- console.log(` Current version: ${existingManifest.version || 'unknown'}`);
1088
- console.log(` New version: ${pack.version}`);
1089
-
1090
- // Check integrity of existing expansion pack
1091
- const packIntegrity = await fileManager.checkFileIntegrity(installDir, existingManifest);
1092
- const hasPackIntegrityIssues =
1093
- packIntegrity.missing.length > 0 || packIntegrity.modified.length > 0;
1094
-
1095
- if (hasPackIntegrityIssues) {
1096
- console.log(chalk.red(' ⚠️ Installation issues detected:'));
1097
- if (packIntegrity.missing.length > 0) {
1098
- console.log(chalk.red(` Missing files: ${packIntegrity.missing.length}`));
1099
- }
1100
- if (packIntegrity.modified.length > 0) {
1101
- console.log(chalk.yellow(` Modified files: ${packIntegrity.modified.length}`));
1102
- }
1103
- }
1104
-
1105
- const versionCompare = this.compareVersions(
1106
- existingManifest.version || '0.0.0',
1107
- pack.version,
1108
- );
1109
-
1110
- if (versionCompare === 0) {
1111
- console.log(chalk.yellow(' ⚠️ Same version already installed'));
1112
-
1113
- const choices = [];
1114
- if (hasPackIntegrityIssues) {
1115
- choices.push({ name: 'Repair (restore missing/modified files)', value: 'repair' });
1116
- }
1117
- choices.push(
1118
- { name: 'Force reinstall (overwrite)', value: 'overwrite' },
1119
- { name: 'Skip this expansion pack', value: 'skip' },
1120
- { name: 'Cancel installation', value: 'cancel' },
1121
- );
1122
-
1123
- const { action } = await inquirer.prompt([
1124
- {
1125
- type: 'list',
1126
- name: 'action',
1127
- message: `${pack.name} v${pack.version} is already installed. What would you like to do?`,
1128
- choices: choices,
1129
- },
1130
- ]);
1131
-
1132
- switch (action) {
1133
- case 'skip': {
1134
- spinner.start();
1135
- continue;
1136
-
1137
- break;
1138
- }
1139
- case 'cancel': {
1140
- console.log('Installation cancelled.');
1141
- process.exit(0);
1142
-
1143
- break;
1144
- }
1145
- case 'repair': {
1146
- // Repair the expansion pack
1147
- await this.repairExpansionPack(installDir, packId, pack, packIntegrity, spinner);
1148
- continue;
1149
-
1150
- break;
1151
- }
1152
- // No default
1153
- }
1154
- } else if (versionCompare < 0) {
1155
- console.log(chalk.cyan(' ⬆️ Upgrade available'));
1156
-
1157
- const { proceed } = await inquirer.prompt([
1158
- {
1159
- type: 'confirm',
1160
- name: 'proceed',
1161
- message: `Upgrade ${pack.name} from v${existingManifest.version} to v${pack.version}?`,
1162
- default: true,
1163
- },
1164
- ]);
1165
-
1166
- if (!proceed) {
1167
- spinner.start();
1168
- continue;
1169
- }
1170
- } else {
1171
- console.log(chalk.yellow(' ⬇️ Installed version is newer than available version'));
1172
-
1173
- const { action } = await inquirer.prompt([
1174
- {
1175
- type: 'list',
1176
- name: 'action',
1177
- message: 'What would you like to do?',
1178
- choices: [
1179
- { name: 'Keep current version', value: 'skip' },
1180
- { name: 'Downgrade to available version', value: 'downgrade' },
1181
- { name: 'Cancel installation', value: 'cancel' },
1182
- ],
1183
- },
1184
- ]);
1185
-
1186
- if (action === 'skip') {
1187
- spinner.start();
1188
- continue;
1189
- } else if (action === 'cancel') {
1190
- console.log('Installation cancelled.');
1191
- process.exit(0);
1192
- }
1193
- }
1194
-
1195
- // If we get here, we're proceeding with installation
1196
- spinner.start(`Removing old ${pack.name} installation...`);
1197
- await fileManager.removeDirectory(expansionDotFolder);
1198
- }
1199
-
1200
- const expansionPackDir = pack.path;
1201
-
1202
- // Ensure dedicated dot folder exists for this expansion pack
1203
- expansionDotFolder = path.join(installDir, `.${packId}`);
1204
- await fileManager.ensureDirectory(expansionDotFolder);
1205
-
1206
- // Define the folders to copy from expansion packs
1207
- const foldersToSync = [
1208
- 'agents',
1209
- 'agent-teams',
1210
- 'templates',
1211
- 'tasks',
1212
- 'checklists',
1213
- 'workflows',
1214
- 'data',
1215
- 'utils',
1216
- 'schemas',
1217
- ];
1218
-
1219
- // Copy each folder if it exists
1220
- for (const folder of foldersToSync) {
1221
- const sourceFolder = path.join(expansionPackDir, folder);
1222
-
1223
- // Check if folder exists in expansion pack
1224
- if (await fileManager.pathExists(sourceFolder)) {
1225
- // Get all files in this folder
1226
- const files = await resourceLocator.findFiles('**/*', {
1227
- cwd: sourceFolder,
1228
- nodir: true,
1229
- });
1230
-
1231
- // Copy each file to the expansion pack's dot folder with {root} replacement
1232
- for (const file of files) {
1233
- const sourcePath = path.join(sourceFolder, file);
1234
- const destinationPath = path.join(expansionDotFolder, folder, file);
1235
-
1236
- const needsRootReplacement =
1237
- file.endsWith('.md') || file.endsWith('.yaml') || file.endsWith('.yml');
1238
- let success = false;
1239
-
1240
- success = await (needsRootReplacement
1241
- ? fileManager.copyFileWithRootReplacement(sourcePath, destinationPath, `.${packId}`)
1242
- : fileManager.copyFile(sourcePath, destinationPath));
1243
-
1244
- if (success) {
1245
- installedFiles.push(path.join(`.${packId}`, folder, file));
1246
- }
1247
- }
1248
- }
1249
- }
1250
-
1251
- // Copy config.yaml with {root} replacement
1252
- const configPath = path.join(expansionPackDir, 'config.yaml');
1253
- if (await fileManager.pathExists(configPath)) {
1254
- const configDestinationPath = path.join(expansionDotFolder, 'config.yaml');
1255
- if (
1256
- await fileManager.copyFileWithRootReplacement(
1257
- configPath,
1258
- configDestinationPath,
1259
- `.${packId}`,
1260
- )
1261
- ) {
1262
- installedFiles.push(path.join(`.${packId}`, 'config.yaml'));
1263
- }
1264
- }
1265
-
1266
- // Copy README if it exists with {root} replacement
1267
- const readmePath = path.join(expansionPackDir, 'README.md');
1268
- if (await fileManager.pathExists(readmePath)) {
1269
- const readmeDestinationPath = path.join(expansionDotFolder, 'README.md');
1270
- if (
1271
- await fileManager.copyFileWithRootReplacement(
1272
- readmePath,
1273
- readmeDestinationPath,
1274
- `.${packId}`,
1275
- )
1276
- ) {
1277
- installedFiles.push(path.join(`.${packId}`, 'README.md'));
1278
- }
1279
- }
1280
-
1281
- // Copy common/ items to expansion pack folder
1282
- spinner.text = `Copying common utilities to ${packId}...`;
1283
- await this.copyCommonItems(installDir, `.${packId}`, spinner);
1284
-
1285
- // Check and resolve core dependencies
1286
- await this.resolveExpansionPackCoreDependencies(
1287
- installDir,
1288
- expansionDotFolder,
1289
- packId,
1290
- pack,
1291
- spinner,
1292
- );
1293
-
1294
- // Check and resolve core agents referenced by teams
1295
- await this.resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner);
1296
-
1297
- // Create manifest for this expansion pack
1298
- spinner.text = `Creating manifest for ${packId}...`;
1299
- const expansionConfig = {
1300
- installType: 'expansion-pack',
1301
- expansionPackId: packId,
1302
- expansionPackName: pack.name,
1303
- expansionPackVersion: pack.version,
1304
- ides: config.ides || [], // Use ides_setup instead of ide_setup
1305
- };
1306
-
1307
- // Get all files installed in this expansion pack
1308
- const foundFiles = await resourceLocator.findFiles('**/*', {
1309
- cwd: expansionDotFolder,
1310
- nodir: true,
1311
- });
1312
- const expansionPackFiles = foundFiles.map((f) => path.join(`.${packId}`, f));
1313
-
1314
- await fileManager.createExpansionPackManifest(
1315
- installDir,
1316
- packId,
1317
- expansionConfig,
1318
- expansionPackFiles,
1319
- );
1320
-
1321
- console.log(chalk.green(`✓ Installed expansion pack: ${pack.name} to ${`.${packId}`}`));
1322
- } catch (error) {
1323
- console.error(`Failed to install expansion pack ${packId}: ${error.message}`);
1324
- console.error(`Stack trace: ${error.stack}`);
1325
- }
1326
- }
1327
-
1328
- return installedFiles;
1329
- }
1330
-
1331
- async resolveExpansionPackCoreDependencies(
1332
- installDir,
1333
- expansionDotFolder,
1334
- packId,
1335
- pack,
1336
- spinner,
1337
- ) {
1338
- const yaml = require('js-yaml');
1339
- const fs = require('node:fs').promises;
1340
-
1341
- // Find all agent files in the expansion pack
1342
- const agentFiles = await resourceLocator.findFiles('agents/*.md', {
1343
- cwd: expansionDotFolder,
1344
- });
1345
-
1346
- for (const agentFile of agentFiles) {
1347
- const agentPath = path.join(expansionDotFolder, agentFile);
1348
- const agentContent = await fs.readFile(agentPath, 'utf8');
1349
-
1350
- // Extract YAML frontmatter to check dependencies
1351
- const yamlContent = extractYamlFromAgent(agentContent);
1352
- if (yamlContent) {
1353
- try {
1354
- const agentConfig = yaml.load(yamlContent);
1355
- const dependencies = agentConfig.dependencies || {};
1356
-
1357
- // Check for core dependencies (those that don't exist in the expansion pack)
1358
- for (const depType of [
1359
- 'tasks',
1360
- 'templates',
1361
- 'checklists',
1362
- 'workflows',
1363
- 'utils',
1364
- 'data',
1365
- ]) {
1366
- const deps = dependencies[depType] || [];
1367
-
1368
- for (const dep of deps) {
1369
- const depFileName =
1370
- dep.endsWith('.md') || dep.endsWith('.yaml')
1371
- ? dep
1372
- : depType === 'templates'
1373
- ? `${dep}.yaml`
1374
- : `${dep}.md`;
1375
- const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
1376
-
1377
- // Check if dependency exists in expansion pack dot folder
1378
- if (!(await fileManager.pathExists(expansionDepPath))) {
1379
- // Try to find it in expansion pack source
1380
- const sourceDepPath = path.join(pack.path, depType, depFileName);
1381
-
1382
- if (await fileManager.pathExists(sourceDepPath)) {
1383
- // Copy from expansion pack source
1384
- spinner.text = `Copying ${packId} dependency ${dep}...`;
1385
- const destinationPath = path.join(expansionDotFolder, depType, depFileName);
1386
- await fileManager.copyFileWithRootReplacement(
1387
- sourceDepPath,
1388
- destinationPath,
1389
- `.${packId}`,
1390
- );
1391
- console.log(chalk.dim(` Added ${packId} dependency: ${depType}/${depFileName}`));
1392
- } else {
1393
- // Try to find it in core
1394
- const coreDepPath = path.join(
1395
- resourceLocator.getBmadCorePath(),
1396
- depType,
1397
- depFileName,
1398
- );
1399
-
1400
- if (await fileManager.pathExists(coreDepPath)) {
1401
- spinner.text = `Copying core dependency ${dep} for ${packId}...`;
1402
-
1403
- // Copy from core to expansion pack dot folder with {root} replacement
1404
- const destinationPath = path.join(expansionDotFolder, depType, depFileName);
1405
- await fileManager.copyFileWithRootReplacement(
1406
- coreDepPath,
1407
- destinationPath,
1408
- `.${packId}`,
1409
- );
1410
-
1411
- console.log(chalk.dim(` Added core dependency: ${depType}/${depFileName}`));
1412
- } else {
1413
- console.warn(
1414
- chalk.yellow(
1415
- ` Warning: Dependency ${depType}/${dep} not found in core or expansion pack`,
1416
- ),
1417
- );
1418
- }
1419
- }
1420
- }
1421
- }
1422
- }
1423
- } catch (error) {
1424
- console.warn(` Warning: Could not parse agent dependencies: ${error.message}`);
1425
- }
1426
- }
1427
- }
1428
- }
1429
-
1430
- async resolveExpansionPackCoreAgents(installDir, expansionDotFolder, packId, spinner) {
1431
- const yaml = require('js-yaml');
1432
- const fs = require('node:fs').promises;
1433
-
1434
- // Find all team files in the expansion pack
1435
- const teamFiles = await resourceLocator.findFiles('agent-teams/*.yaml', {
1436
- cwd: expansionDotFolder,
1437
- });
1438
-
1439
- // Also get existing agents in the expansion pack
1440
- const existingAgents = new Set();
1441
- const agentFiles = await resourceLocator.findFiles('agents/*.md', {
1442
- cwd: expansionDotFolder,
1443
- });
1444
- for (const agentFile of agentFiles) {
1445
- const agentName = path.basename(agentFile, '.md');
1446
- existingAgents.add(agentName);
1447
- }
1448
-
1449
- // Process each team file
1450
- for (const teamFile of teamFiles) {
1451
- const teamPath = path.join(expansionDotFolder, teamFile);
1452
- const teamContent = await fs.readFile(teamPath, 'utf8');
1453
-
1454
- try {
1455
- const teamConfig = yaml.load(teamContent);
1456
- const agents = teamConfig.agents || [];
1457
-
1458
- // Add bmad-orchestrator if not present (required for all teams)
1459
- if (!agents.includes('bmad-orchestrator')) {
1460
- agents.unshift('bmad-orchestrator');
1461
- }
1462
-
1463
- // Check each agent in the team
1464
- for (const agentId of agents) {
1465
- if (!existingAgents.has(agentId)) {
1466
- // Agent not in expansion pack, try to get from core
1467
- const coreAgentPath = path.join(
1468
- resourceLocator.getBmadCorePath(),
1469
- 'agents',
1470
- `${agentId}.md`,
1471
- );
1472
-
1473
- if (await fileManager.pathExists(coreAgentPath)) {
1474
- spinner.text = `Copying core agent ${agentId} for ${packId}...`;
1475
-
1476
- // Copy agent file with {root} replacement
1477
- const destinationPath = path.join(expansionDotFolder, 'agents', `${agentId}.md`);
1478
- await fileManager.copyFileWithRootReplacement(
1479
- coreAgentPath,
1480
- destinationPath,
1481
- `.${packId}`,
1482
- );
1483
- existingAgents.add(agentId);
1484
-
1485
- console.log(chalk.dim(` Added core agent: ${agentId}`));
1486
-
1487
- // Now resolve this agent's dependencies too
1488
- const agentContent = await fs.readFile(coreAgentPath, 'utf8');
1489
- const yamlContent = extractYamlFromAgent(agentContent, true);
1490
-
1491
- if (yamlContent) {
1492
- try {
1493
- const agentConfig = yaml.load(yamlContent);
1494
- const dependencies = agentConfig.dependencies || {};
1495
-
1496
- // Copy all dependencies for this agent
1497
- for (const depType of [
1498
- 'tasks',
1499
- 'templates',
1500
- 'checklists',
1501
- 'workflows',
1502
- 'utils',
1503
- 'data',
1504
- ]) {
1505
- const deps = dependencies[depType] || [];
1506
-
1507
- for (const dep of deps) {
1508
- const depFileName =
1509
- dep.endsWith('.md') || dep.endsWith('.yaml')
1510
- ? dep
1511
- : depType === 'templates'
1512
- ? `${dep}.yaml`
1513
- : `${dep}.md`;
1514
- const expansionDepPath = path.join(expansionDotFolder, depType, depFileName);
1515
-
1516
- // Check if dependency exists in expansion pack
1517
- if (!(await fileManager.pathExists(expansionDepPath))) {
1518
- // Try to find it in core
1519
- const coreDepPath = path.join(
1520
- resourceLocator.getBmadCorePath(),
1521
- depType,
1522
- depFileName,
1523
- );
1524
-
1525
- if (await fileManager.pathExists(coreDepPath)) {
1526
- const destinationDepPath = path.join(
1527
- expansionDotFolder,
1528
- depType,
1529
- depFileName,
1530
- );
1531
- await fileManager.copyFileWithRootReplacement(
1532
- coreDepPath,
1533
- destinationDepPath,
1534
- `.${packId}`,
1535
- );
1536
- console.log(
1537
- chalk.dim(` Added agent dependency: ${depType}/${depFileName}`),
1538
- );
1539
- } else {
1540
- // Try common folder
1541
- const sourceBase = path.dirname(
1542
- path.dirname(path.dirname(path.dirname(__filename))),
1543
- ); // Go up to project root
1544
- const commonDepPath = path.join(
1545
- sourceBase,
1546
- 'common',
1547
- depType,
1548
- depFileName,
1549
- );
1550
- if (await fileManager.pathExists(commonDepPath)) {
1551
- const destinationDepPath = path.join(
1552
- expansionDotFolder,
1553
- depType,
1554
- depFileName,
1555
- );
1556
- await fileManager.copyFile(commonDepPath, destinationDepPath);
1557
- console.log(
1558
- chalk.dim(
1559
- ` Added agent dependency from common: ${depType}/${depFileName}`,
1560
- ),
1561
- );
1562
- }
1563
- }
1564
- }
1565
- }
1566
- }
1567
- } catch (error) {
1568
- console.warn(
1569
- ` Warning: Could not parse agent ${agentId} dependencies: ${error.message}`,
1570
- );
1571
- }
1572
- }
1573
- } else {
1574
- console.warn(
1575
- chalk.yellow(
1576
- ` Warning: Core agent ${agentId} not found for team ${path.basename(teamFile, '.yaml')}`,
1577
- ),
1578
- );
1579
- }
1580
- }
1581
- }
1582
- } catch (error) {
1583
- console.warn(` Warning: Could not parse team file ${teamFile}: ${error.message}`);
1584
- }
1585
- }
1586
- }
1587
-
1588
- getWebBundleInfo(config) {
1589
- const webBundleType = config.webBundleType || 'all';
1590
-
1591
- switch (webBundleType) {
1592
- case 'all': {
1593
- return 'all bundles';
1594
- }
1595
- case 'agents': {
1596
- return 'individual agents only';
1597
- }
1598
- case 'teams': {
1599
- return config.selectedWebBundleTeams
1600
- ? `teams: ${config.selectedWebBundleTeams.join(', ')}`
1601
- : 'selected teams';
1602
- }
1603
- case 'custom': {
1604
- const parts = [];
1605
- if (config.selectedWebBundleTeams && config.selectedWebBundleTeams.length > 0) {
1606
- parts.push(`teams: ${config.selectedWebBundleTeams.join(', ')}`);
1607
- }
1608
- if (config.includeIndividualAgents) {
1609
- parts.push('individual agents');
1610
- }
1611
- return parts.length > 0 ? parts.join(' + ') : 'custom selection';
1612
- }
1613
- default: {
1614
- return 'selected bundles';
1615
- }
1616
- }
1617
- }
1618
-
1619
- async installWebBundles(webBundlesDirectory, config, spinner) {
1620
- try {
1621
- // Find the dist directory in the BMad installation
1622
- const distDir = configLoader.getDistPath();
1623
-
1624
- if (!(await fileManager.pathExists(distDir))) {
1625
- console.warn('Web bundles not found. Run "npm run build" to generate them.');
1626
- return;
1627
- }
1628
-
1629
- // Ensure web bundles directory exists
1630
- await fileManager.ensureDirectory(webBundlesDirectory);
1631
-
1632
- const webBundleType = config.webBundleType || 'all';
1633
-
1634
- if (webBundleType === 'all') {
1635
- // Copy the entire dist directory structure
1636
- await fileManager.copyDirectory(distDir, webBundlesDirectory);
1637
- console.log(chalk.green(`✓ Installed all web bundles to: ${webBundlesDirectory}`));
1638
- } else {
1639
- let copiedCount = 0;
1640
-
1641
- // Copy specific selections based on type
1642
- if (
1643
- webBundleType === 'agents' ||
1644
- (webBundleType === 'custom' && config.includeIndividualAgents)
1645
- ) {
1646
- const agentsSource = path.join(distDir, 'agents');
1647
- const agentsTarget = path.join(webBundlesDirectory, 'agents');
1648
- if (await fileManager.pathExists(agentsSource)) {
1649
- await fileManager.copyDirectory(agentsSource, agentsTarget);
1650
- console.log(chalk.green(`✓ Copied individual agent bundles`));
1651
- copiedCount += 10; // Approximate count for agents
1652
- }
1653
- }
1654
-
1655
- if (
1656
- (webBundleType === 'teams' || webBundleType === 'custom') &&
1657
- config.selectedWebBundleTeams &&
1658
- config.selectedWebBundleTeams.length > 0
1659
- ) {
1660
- const teamsSource = path.join(distDir, 'teams');
1661
- const teamsTarget = path.join(webBundlesDirectory, 'teams');
1662
- await fileManager.ensureDirectory(teamsTarget);
1663
-
1664
- for (const teamId of config.selectedWebBundleTeams) {
1665
- const teamFile = `${teamId}.txt`;
1666
- const sourcePath = path.join(teamsSource, teamFile);
1667
- const targetPath = path.join(teamsTarget, teamFile);
1668
-
1669
- if (await fileManager.pathExists(sourcePath)) {
1670
- await fileManager.copyFile(sourcePath, targetPath);
1671
- copiedCount++;
1672
- console.log(chalk.green(`✓ Copied team bundle: ${teamId}`));
1673
- }
1674
- }
1675
- }
1676
-
1677
- // Always copy expansion packs if they exist
1678
- const expansionSource = path.join(distDir, 'expansion-packs');
1679
- const expansionTarget = path.join(webBundlesDirectory, 'expansion-packs');
1680
- if (await fileManager.pathExists(expansionSource)) {
1681
- await fileManager.copyDirectory(expansionSource, expansionTarget);
1682
- console.log(chalk.green(`✓ Copied expansion pack bundles`));
1683
- }
1684
-
1685
- console.log(
1686
- chalk.green(`✓ Installed ${copiedCount} selected web bundles to: ${webBundlesDirectory}`),
1687
- );
1688
- }
1689
- } catch (error) {
1690
- console.error(`Failed to install web bundles: ${error.message}`);
1691
- }
1692
- }
1693
-
1694
- async copyCommonItems(installDir, targetSubdir, spinner) {
1695
- const fs = require('node:fs').promises;
1696
- const sourceBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename)))); // Go up to project root
1697
- const commonPath = path.join(sourceBase, 'common');
1698
- const targetPath = path.join(installDir, targetSubdir);
1699
- const copiedFiles = [];
1700
-
1701
- // Check if common/ exists
1702
- if (!(await fileManager.pathExists(commonPath))) {
1703
- console.warn('Warning: common/ folder not found');
1704
- return copiedFiles;
1705
- }
1706
-
1707
- // Copy all items from common/ to target
1708
- const commonItems = await resourceLocator.findFiles('**/*', {
1709
- cwd: commonPath,
1710
- nodir: true,
1711
- });
1712
-
1713
- for (const item of commonItems) {
1714
- const sourcePath = path.join(commonPath, item);
1715
- const destinationPath = path.join(targetPath, item);
1716
-
1717
- // Read the file content
1718
- const content = await fs.readFile(sourcePath, 'utf8');
1719
-
1720
- // Replace {root} with the target subdirectory
1721
- const updatedContent = content.replaceAll('{root}', targetSubdir);
1722
-
1723
- // Ensure directory exists
1724
- await fileManager.ensureDirectory(path.dirname(destinationPath));
1725
-
1726
- // Write the updated content
1727
- await fs.writeFile(destinationPath, updatedContent, 'utf8');
1728
- copiedFiles.push(path.join(targetSubdir, item));
1729
- }
1730
-
1731
- console.log(chalk.dim(` Added ${commonItems.length} common utilities`));
1732
- return copiedFiles;
1733
- }
1734
-
1735
- async copyDocsItems(installDir, targetSubdir, spinner) {
1736
- const fs = require('node:fs').promises;
1737
- const sourceBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename)))); // Go up to project root
1738
- const docsPath = path.join(sourceBase, 'docs');
1739
- const targetPath = path.join(installDir, targetSubdir);
1740
- const copiedFiles = [];
1741
-
1742
- // Specific documentation files to copy
1743
- const documentFiles = [
1744
- 'enhanced-ide-development-workflow.md',
1745
- 'user-guide.md',
1746
- 'working-in-the-brownfield.md',
1747
- ];
1748
-
1749
- // Check if docs/ exists
1750
- if (!(await fileManager.pathExists(docsPath))) {
1751
- console.warn('Warning: docs/ folder not found');
1752
- return copiedFiles;
1753
- }
1754
-
1755
- // Copy specific documentation files from docs/ to target
1756
- for (const documentFile of documentFiles) {
1757
- const sourcePath = path.join(docsPath, documentFile);
1758
- const destinationPath = path.join(targetPath, documentFile);
1759
-
1760
- // Check if the source file exists
1761
- if (await fileManager.pathExists(sourcePath)) {
1762
- // Read the file content
1763
- const content = await fs.readFile(sourcePath, 'utf8');
1764
-
1765
- // Replace {root} with the target subdirectory
1766
- const updatedContent = content.replaceAll('{root}', targetSubdir);
1767
-
1768
- // Ensure directory exists
1769
- await fileManager.ensureDirectory(path.dirname(destinationPath));
1770
-
1771
- // Write the updated content
1772
- await fs.writeFile(destinationPath, updatedContent, 'utf8');
1773
- copiedFiles.push(path.join(targetSubdir, documentFile));
1774
- }
1775
- }
1776
-
1777
- if (copiedFiles.length > 0) {
1778
- console.log(chalk.dim(` Added ${copiedFiles.length} documentation files`));
1779
- }
1780
- return copiedFiles;
1781
- }
1782
-
1783
- async detectExpansionPacks(installDir) {
1784
- const expansionPacks = {};
1785
- const glob = require('glob');
1786
-
1787
- // Find all dot folders that might be expansion packs
1788
- const dotFolders = glob.sync('.*', {
1789
- cwd: installDir,
1790
- ignore: ['.git', '.git/**', '.bmad-core', '.bmad-core/**'],
1791
- });
1792
-
1793
- for (const folder of dotFolders) {
1794
- const folderPath = path.join(installDir, folder);
1795
- const stats = await fileManager.pathExists(folderPath);
1796
-
1797
- if (stats) {
1798
- // Check if it has a manifest
1799
- const manifestPath = path.join(folderPath, 'install-manifest.yaml');
1800
- if (await fileManager.pathExists(manifestPath)) {
1801
- const manifest = await fileManager.readExpansionPackManifest(installDir, folder.slice(1));
1802
- if (manifest) {
1803
- expansionPacks[folder.slice(1)] = {
1804
- path: folderPath,
1805
- manifest: manifest,
1806
- hasManifest: true,
1807
- };
1808
- }
1809
- } else {
1810
- // Check if it has a config.yaml (expansion pack without manifest)
1811
- const configPath = path.join(folderPath, 'config.yaml');
1812
- if (await fileManager.pathExists(configPath)) {
1813
- expansionPacks[folder.slice(1)] = {
1814
- path: folderPath,
1815
- manifest: null,
1816
- hasManifest: false,
1817
- };
1818
- }
1819
- }
1820
- }
1821
- }
1822
-
1823
- return expansionPacks;
1824
- }
1825
-
1826
- async repairExpansionPack(installDir, packId, pack, integrity, spinner) {
1827
- spinner.start(`Repairing ${pack.name}...`);
1828
-
1829
- try {
1830
- const expansionDotFolder = path.join(installDir, `.${packId}`);
1831
-
1832
- // Back up modified files
1833
- if (integrity.modified.length > 0) {
1834
- spinner.text = 'Backing up modified files...';
1835
- for (const file of integrity.modified) {
1836
- const filePath = path.join(installDir, file);
1837
- if (await fileManager.pathExists(filePath)) {
1838
- const backupPath = await fileManager.backupFile(filePath);
1839
- console.log(chalk.dim(` Backed up: ${file} → ${path.basename(backupPath)}`));
1840
- }
1841
- }
1842
- }
1843
-
1844
- // Restore missing and modified files
1845
- spinner.text = 'Restoring files...';
1846
- const filesToRestore = [...integrity.missing, ...integrity.modified];
1847
-
1848
- for (const file of filesToRestore) {
1849
- // Skip the manifest file itself
1850
- if (file.endsWith('install-manifest.yaml')) continue;
1851
-
1852
- const relativePath = file.replace(`.${packId}/`, '');
1853
- const sourcePath = path.join(pack.path, relativePath);
1854
- const destinationPath = path.join(installDir, file);
1855
-
1856
- // Check if this is a common/ file that needs special processing
1857
- const commonBase = path.dirname(path.dirname(path.dirname(path.dirname(__filename))));
1858
- const commonSourcePath = path.join(commonBase, 'common', relativePath);
1859
-
1860
- if (await fileManager.pathExists(commonSourcePath)) {
1861
- // This is a common/ file - needs template processing
1862
- const fs = require('node:fs').promises;
1863
- const content = await fs.readFile(commonSourcePath, 'utf8');
1864
- const updatedContent = content.replaceAll('{root}', `.${packId}`);
1865
- await fileManager.ensureDirectory(path.dirname(destinationPath));
1866
- await fs.writeFile(destinationPath, updatedContent, 'utf8');
1867
- spinner.text = `Restored: ${file}`;
1868
- } else if (await fileManager.pathExists(sourcePath)) {
1869
- // Regular file from expansion pack
1870
- await fileManager.copyFile(sourcePath, destinationPath);
1871
- spinner.text = `Restored: ${file}`;
1872
- } else {
1873
- console.warn(chalk.yellow(` Warning: Source file not found: ${file}`));
1874
- }
1875
- }
1876
-
1877
- spinner.succeed(`${pack.name} repaired successfully!`);
1878
-
1879
- // Show summary
1880
- console.log(chalk.green(`\n✓ ${pack.name} repaired!`));
1881
- if (integrity.missing.length > 0) {
1882
- console.log(chalk.green(` Restored ${integrity.missing.length} missing files`));
1883
- }
1884
- if (integrity.modified.length > 0) {
1885
- console.log(
1886
- chalk.green(` Restored ${integrity.modified.length} modified files (backups created)`),
1887
- );
1888
- }
1889
- } catch (error) {
1890
- if (spinner) spinner.fail(`Failed to repair ${pack.name}`);
1891
- console.error(`Error: ${error.message}`);
1892
- }
1893
- }
1894
-
1895
- compareVersions(v1, v2) {
1896
- // Simple semver comparison
1897
- const parts1 = v1.split('.').map(Number);
1898
- const parts2 = v2.split('.').map(Number);
1899
-
1900
- for (let index = 0; index < 3; index++) {
1901
- const part1 = parts1[index] || 0;
1902
- const part2 = parts2[index] || 0;
1903
-
1904
- if (part1 > part2) return 1;
1905
- if (part1 < part2) return -1;
1906
- }
1907
-
1908
- return 0;
1909
- }
1910
-
1911
- async cleanupLegacyYmlFiles(installDir, spinner) {
1912
- const glob = require('glob');
1913
- const fs = require('node:fs').promises;
1914
-
1915
- try {
1916
- // Find all .yml files in the installation directory
1917
- const ymlFiles = glob.sync('**/*.yml', {
1918
- cwd: installDir,
1919
- ignore: ['**/node_modules/**', '**/.git/**'],
1920
- });
1921
-
1922
- let deletedCount = 0;
1923
-
1924
- for (const ymlFile of ymlFiles) {
1925
- // Check if corresponding .yaml file exists
1926
- const yamlFile = ymlFile.replace(/\.yml$/, '.yaml');
1927
- const ymlPath = path.join(installDir, ymlFile);
1928
- const yamlPath = path.join(installDir, yamlFile);
1929
-
1930
- if (await fileManager.pathExists(yamlPath)) {
1931
- // .yaml counterpart exists, delete the .yml file
1932
- await fs.unlink(ymlPath);
1933
- deletedCount++;
1934
- console.log(chalk.dim(` Removed legacy: ${ymlFile} (replaced by ${yamlFile})`));
1935
- }
1936
- }
1937
-
1938
- if (deletedCount > 0) {
1939
- console.log(chalk.green(`✓ Cleaned up ${deletedCount} legacy .yml files`));
1940
- }
1941
- } catch (error) {
1942
- console.warn(`Warning: Could not cleanup legacy .yml files: ${error.message}`);
1943
- }
1944
- }
1945
-
1946
- async findInstallation() {
1947
- // Look for .bmad-core in current directory or parent directories
1948
- let currentDir = process.cwd();
1949
-
1950
- while (currentDir !== path.dirname(currentDir)) {
1951
- const bmadDir = path.join(currentDir, '.bmad-core');
1952
- const manifestPath = path.join(bmadDir, 'install-manifest.yaml');
1953
-
1954
- if (await fileManager.pathExists(manifestPath)) {
1955
- return currentDir; // Return parent directory, not .bmad-core itself
1956
- }
1957
-
1958
- currentDir = path.dirname(currentDir);
1959
- }
1960
-
1961
- // Also check if we're inside a .bmad-core directory
1962
- if (path.basename(process.cwd()) === '.bmad-core') {
1963
- const manifestPath = path.join(process.cwd(), 'install-manifest.yaml');
1964
- if (await fileManager.pathExists(manifestPath)) {
1965
- return path.dirname(process.cwd()); // Return parent directory
1966
- }
1967
- }
1968
-
1969
- return null;
1970
- }
1971
-
1972
- async flatten(options) {
1973
- const { spawn } = require('node:child_process');
1974
- const flattenerPath = path.join(__dirname, '..', '..', 'flattener', 'main.js');
1975
-
1976
- const arguments_ = [];
1977
- if (options.input) {
1978
- arguments_.push('--input', options.input);
1979
- }
1980
- if (options.output) {
1981
- arguments_.push('--output', options.output);
1982
- }
1983
-
1984
- const child = spawn('node', [flattenerPath, ...arguments_], {
1985
- stdio: 'inherit',
1986
- cwd: process.cwd(),
1987
- });
1988
-
1989
- child.on('exit', (code) => {
1990
- process.exit(code);
1991
- });
1992
- }
1993
- }
1994
-
1995
- module.exports = new Installer();