bmad-method 5.0.0 → 5.1.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 (329) hide show
  1. package/.github/FUNDING.yaml +15 -0
  2. package/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  3. package/.github/ISSUE_TEMPLATE/feature_request.md +22 -0
  4. package/.github/workflows/discord.yaml +25 -0
  5. package/.github/workflows/format-check.yaml +42 -0
  6. package/.github/workflows/manual-release.yaml +173 -0
  7. package/.husky/pre-commit +3 -2
  8. package/.vscode/settings.json +67 -74
  9. package/CHANGELOG.md +564 -19
  10. package/CONTRIBUTING.md +168 -5
  11. package/LICENSE +1 -1
  12. package/README.md +146 -218
  13. package/bmad-core/agent-teams/team-all.yaml +14 -0
  14. package/bmad-core/agent-teams/team-fullstack.yaml +18 -0
  15. package/bmad-core/agent-teams/team-ide-minimal.yaml +10 -0
  16. package/bmad-core/agent-teams/team-no-ui.yaml +13 -0
  17. package/bmad-core/agents/analyst.md +81 -0
  18. package/bmad-core/agents/architect.md +83 -0
  19. package/bmad-core/agents/bmad-master.md +107 -0
  20. package/bmad-core/agents/bmad-orchestrator.md +149 -0
  21. package/bmad-core/agents/dev.md +75 -0
  22. package/bmad-core/agents/pm.md +81 -0
  23. package/bmad-core/agents/po.md +76 -0
  24. package/bmad-core/agents/qa.md +88 -0
  25. package/bmad-core/agents/sm.md +62 -0
  26. package/bmad-core/agents/ux-expert.md +66 -0
  27. package/{.bmad-core → bmad-core}/checklists/architect-checklist.md +0 -5
  28. package/{.bmad-core → bmad-core}/checklists/change-checklist.md +2 -2
  29. package/{.bmad-core → bmad-core}/checklists/pm-checklist.md +0 -5
  30. package/{.bmad-core → bmad-core}/checklists/po-master-checklist.md +0 -9
  31. package/{.bmad-core → bmad-core}/checklists/story-dod-checklist.md +0 -7
  32. package/{.bmad-core → bmad-core}/checklists/story-draft-checklist.md +1 -4
  33. package/bmad-core/core-config.yaml +20 -0
  34. package/bmad-core/data/bmad-kb.md +806 -0
  35. package/bmad-core/data/brainstorming-techniques.md +36 -0
  36. package/bmad-core/data/elicitation-methods.md +154 -0
  37. package/bmad-core/data/test-levels-framework.md +146 -0
  38. package/bmad-core/data/test-priorities-matrix.md +172 -0
  39. package/bmad-core/tasks/advanced-elicitation.md +117 -0
  40. package/{.bmad-core → bmad-core}/tasks/correct-course.md +9 -12
  41. package/bmad-core/tasks/create-brownfield-story.md +312 -0
  42. package/{.bmad-core → bmad-core}/tasks/create-deep-research-prompt.md +4 -27
  43. package/bmad-core/tasks/create-next-story.md +112 -0
  44. package/bmad-core/tasks/document-project.md +343 -0
  45. package/bmad-core/tasks/facilitate-brainstorming-session.md +136 -0
  46. package/bmad-core/tasks/generate-ai-frontend-prompt.md +51 -0
  47. package/{.bmad-core → bmad-core}/tasks/index-docs.md +3 -13
  48. package/bmad-core/tasks/kb-mode-interaction.md +75 -0
  49. package/bmad-core/tasks/nfr-assess.md +343 -0
  50. package/bmad-core/tasks/qa-gate.md +159 -0
  51. package/bmad-core/tasks/review-story.md +314 -0
  52. package/bmad-core/tasks/risk-profile.md +353 -0
  53. package/{.bmad-core → bmad-core}/tasks/shard-doc.md +27 -15
  54. package/bmad-core/tasks/test-design.md +174 -0
  55. package/bmad-core/tasks/trace-requirements.md +264 -0
  56. package/bmad-core/tasks/validate-next-story.md +134 -0
  57. package/bmad-core/templates/architecture-tmpl.yaml +650 -0
  58. package/bmad-core/templates/brainstorming-output-tmpl.yaml +156 -0
  59. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +476 -0
  60. package/bmad-core/templates/brownfield-prd-tmpl.yaml +280 -0
  61. package/bmad-core/templates/competitor-analysis-tmpl.yaml +306 -0
  62. package/bmad-core/templates/front-end-architecture-tmpl.yaml +218 -0
  63. package/bmad-core/templates/front-end-spec-tmpl.yaml +349 -0
  64. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +823 -0
  65. package/bmad-core/templates/market-research-tmpl.yaml +252 -0
  66. package/bmad-core/templates/prd-tmpl.yaml +202 -0
  67. package/bmad-core/templates/project-brief-tmpl.yaml +221 -0
  68. package/bmad-core/templates/qa-gate-tmpl.yaml +102 -0
  69. package/bmad-core/templates/story-tmpl.yaml +137 -0
  70. package/bmad-core/workflows/brownfield-fullstack.yaml +297 -0
  71. package/bmad-core/workflows/brownfield-service.yaml +187 -0
  72. package/bmad-core/workflows/brownfield-ui.yaml +197 -0
  73. package/{.bmad-core/workflows/greenfield-fullstack.yml → bmad-core/workflows/greenfield-fullstack.yaml} +140 -77
  74. package/bmad-core/workflows/greenfield-service.yaml +206 -0
  75. package/bmad-core/workflows/greenfield-ui.yaml +235 -0
  76. package/common/tasks/create-doc.md +101 -0
  77. package/{.bmad-core → common}/tasks/execute-checklist.md +2 -13
  78. package/common/utils/bmad-doc-template.md +325 -0
  79. package/common/utils/workflow-management.md +69 -0
  80. package/dist/agents/analyst.txt +2889 -0
  81. package/dist/agents/architect.txt +3552 -0
  82. package/dist/agents/bmad-master.txt +8769 -0
  83. package/dist/agents/bmad-orchestrator.txt +1513 -0
  84. package/dist/agents/dev.txt +414 -0
  85. package/{.bmad-core/web-bundles → dist}/agents/pm.txt +668 -1119
  86. package/{.bmad-core/web-bundles → dist}/agents/po.txt +341 -484
  87. package/dist/agents/qa.txt +1987 -0
  88. package/dist/agents/sm.txt +658 -0
  89. package/dist/agents/ux-expert.txt +694 -0
  90. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +2371 -0
  91. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +1620 -0
  92. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +815 -0
  93. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +10952 -0
  94. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +4012 -0
  95. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +3698 -0
  96. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +450 -0
  97. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +973 -0
  98. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +15376 -0
  99. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +2075 -0
  100. package/dist/teams/team-all.txt +12682 -0
  101. package/dist/teams/team-fullstack.txt +10421 -0
  102. package/dist/teams/team-ide-minimal.txt +5103 -0
  103. package/dist/teams/team-no-ui.txt +8980 -0
  104. package/docs/GUIDING-PRINCIPLES.md +91 -0
  105. package/docs/core-architecture.md +219 -0
  106. package/docs/enhanced-ide-development-workflow.md +248 -0
  107. package/docs/expansion-packs.md +280 -0
  108. package/docs/how-to-contribute-with-pull-requests.md +158 -0
  109. package/docs/user-guide.md +504 -0
  110. package/docs/versioning-and-releases.md +8 -16
  111. package/docs/versions.md +4 -5
  112. package/docs/working-in-the-brownfield.md +597 -0
  113. package/eslint.config.mjs +119 -0
  114. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +102 -0
  115. 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 +13 -0
  116. 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 +13 -0
  117. 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 +25 -0
  118. 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 +34 -0
  119. 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 +70 -0
  120. 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 +26 -0
  121. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +109 -0
  122. package/expansion-packs/README.md +2 -112
  123. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +13 -0
  124. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +71 -0
  125. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +78 -0
  126. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +64 -0
  127. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +201 -0
  128. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +160 -0
  129. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +8 -0
  130. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +250 -0
  131. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +647 -0
  132. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +110 -0
  133. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +216 -0
  134. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +290 -0
  135. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +613 -0
  136. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +356 -0
  137. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +343 -0
  138. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +253 -0
  139. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  140. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  141. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +175 -0
  142. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +14 -0
  143. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +80 -0
  144. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +77 -0
  145. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +78 -0
  146. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +65 -0
  147. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +391 -0
  148. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +203 -0
  149. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +201 -0
  150. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +124 -0
  151. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +6 -0
  152. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +769 -0
  153. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +586 -0
  154. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +110 -0
  155. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +141 -0
  156. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +184 -0
  157. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +290 -0
  158. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +200 -0
  159. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +1030 -0
  160. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +356 -0
  161. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +705 -0
  162. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +256 -0
  163. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +484 -0
  164. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +183 -0
  165. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +175 -0
  166. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/README.md +9 -9
  167. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/agents/infra-devops-platform.md +30 -18
  168. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/checklists/infrastructure-checklist.md +1 -1
  169. package/expansion-packs/bmad-infrastructure-devops/config.yaml +9 -0
  170. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +305 -0
  171. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/review-infrastructure.md +4 -5
  172. package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/validate-infrastructure.md +4 -5
  173. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +424 -0
  174. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +629 -0
  175. package/package.json +74 -42
  176. package/prettier.config.mjs +32 -0
  177. package/release_notes.md +25 -0
  178. package/tools/bmad-npx-wrapper.js +13 -15
  179. package/tools/builders/web-builder.js +544 -15
  180. package/tools/bump-all-versions.js +115 -0
  181. package/tools/bump-expansion-version.js +90 -0
  182. package/tools/cli.js +65 -32
  183. package/tools/flattener/aggregate.js +76 -0
  184. package/tools/flattener/binary.js +80 -0
  185. package/tools/flattener/discovery.js +71 -0
  186. package/tools/flattener/files.js +35 -0
  187. package/tools/flattener/ignoreRules.js +176 -0
  188. package/tools/flattener/main.js +573 -0
  189. package/tools/flattener/projectRoot.js +206 -0
  190. package/tools/flattener/prompts.js +44 -0
  191. package/tools/flattener/stats.helpers.js +395 -0
  192. package/tools/flattener/stats.js +80 -0
  193. package/tools/flattener/test-matrix.js +413 -0
  194. package/tools/flattener/xml.js +88 -0
  195. package/tools/installer/README.md +3 -53
  196. package/tools/installer/bin/bmad.js +475 -90
  197. package/tools/installer/config/ide-agent-config.yaml +58 -0
  198. package/tools/installer/config/install.config.yaml +123 -0
  199. package/tools/installer/lib/config-loader.js +208 -40
  200. package/tools/installer/lib/file-manager.js +258 -55
  201. package/tools/installer/lib/ide-base-setup.js +228 -0
  202. package/tools/installer/lib/ide-setup.js +1265 -253
  203. package/tools/installer/lib/installer.js +1651 -310
  204. package/tools/installer/lib/memory-profiler.js +225 -0
  205. package/tools/installer/lib/module-manager.js +114 -0
  206. package/tools/installer/lib/resource-locator.js +308 -0
  207. package/tools/installer/package.json +25 -24
  208. package/tools/lib/dependency-resolver.js +44 -48
  209. package/tools/lib/yaml-utils.js +29 -0
  210. package/tools/md-assets/web-agent-startup-instructions.md +39 -0
  211. package/tools/preview-release-notes.js +66 -0
  212. package/tools/shared/bannerArt.js +105 -0
  213. package/tools/sync-installer-version.js +7 -9
  214. package/tools/update-expansion-version.js +53 -0
  215. package/tools/upgraders/v3-to-v4-upgrader.js +221 -320
  216. package/tools/version-bump.js +42 -27
  217. package/tools/yaml-format.js +57 -44
  218. package/.bmad-core/agent-teams/team-all.yml +0 -16
  219. package/.bmad-core/agent-teams/team-fullstack.yml +0 -26
  220. package/.bmad-core/agent-teams/team-no-ui.yml +0 -15
  221. package/.bmad-core/agents/analyst.md +0 -59
  222. package/.bmad-core/agents/architect.md +0 -66
  223. package/.bmad-core/agents/bmad-master.md +0 -104
  224. package/.bmad-core/agents/bmad-orchestrator.md +0 -81
  225. package/.bmad-core/agents/dev.md +0 -70
  226. package/.bmad-core/agents/pm.md +0 -59
  227. package/.bmad-core/agents/po.md +0 -60
  228. package/.bmad-core/agents/qa.md +0 -52
  229. package/.bmad-core/agents/sm.md +0 -55
  230. package/.bmad-core/agents/ux-expert.md +0 -66
  231. package/.bmad-core/data/bmad-kb.md +0 -47
  232. package/.bmad-core/schemas/agent-team-schema.yml +0 -153
  233. package/.bmad-core/tasks/advanced-elicitation.md +0 -92
  234. package/.bmad-core/tasks/brainstorming-techniques.md +0 -238
  235. package/.bmad-core/tasks/core-dump.md +0 -74
  236. package/.bmad-core/tasks/create-agent.md +0 -202
  237. package/.bmad-core/tasks/create-doc.md +0 -74
  238. package/.bmad-core/tasks/create-expansion-pack.md +0 -425
  239. package/.bmad-core/tasks/create-next-story.md +0 -206
  240. package/.bmad-core/tasks/create-team.md +0 -229
  241. package/.bmad-core/tasks/doc-migration-task.md +0 -143
  242. package/.bmad-core/tasks/generate-ai-frontend-prompt.md +0 -58
  243. package/.bmad-core/templates/agent-tmpl.md +0 -58
  244. package/.bmad-core/templates/architecture-tmpl.md +0 -771
  245. package/.bmad-core/templates/brownfield-architecture-tmpl.md +0 -542
  246. package/.bmad-core/templates/brownfield-prd-tmpl.md +0 -240
  247. package/.bmad-core/templates/competitor-analysis-tmpl.md +0 -289
  248. package/.bmad-core/templates/expansion-pack-plan-tmpl.md +0 -91
  249. package/.bmad-core/templates/front-end-architecture-tmpl.md +0 -173
  250. package/.bmad-core/templates/front-end-spec-tmpl.md +0 -411
  251. package/.bmad-core/templates/fullstack-architecture-tmpl.md +0 -1016
  252. package/.bmad-core/templates/market-research-tmpl.md +0 -261
  253. package/.bmad-core/templates/prd-tmpl.md +0 -200
  254. package/.bmad-core/templates/project-brief-tmpl.md +0 -228
  255. package/.bmad-core/templates/simple-project-prd-tmpl.md +0 -461
  256. package/.bmad-core/templates/story-tmpl.md +0 -61
  257. package/.bmad-core/templates/web-agent-startup-instructions-template.md +0 -39
  258. package/.bmad-core/utils/agent-switcher.ide.md +0 -112
  259. package/.bmad-core/utils/template-format.md +0 -26
  260. package/.bmad-core/utils/workflow-management.md +0 -224
  261. package/.bmad-core/web-bundles/agents/analyst.txt +0 -1684
  262. package/.bmad-core/web-bundles/agents/architect.txt +0 -3584
  263. package/.bmad-core/web-bundles/agents/bmad-master.txt +0 -9491
  264. package/.bmad-core/web-bundles/agents/bmad-orchestrator.txt +0 -1466
  265. package/.bmad-core/web-bundles/agents/dev.txt +0 -316
  266. package/.bmad-core/web-bundles/agents/qa.txt +0 -129
  267. package/.bmad-core/web-bundles/agents/sm.txt +0 -658
  268. package/.bmad-core/web-bundles/agents/ux-expert.txt +0 -1099
  269. package/.bmad-core/web-bundles/teams/team-all.txt +0 -10757
  270. package/.bmad-core/web-bundles/teams/team-fullstack.txt +0 -10109
  271. package/.bmad-core/web-bundles/teams/team-no-ui.txt +0 -8950
  272. package/.bmad-core/workflows/brownfield-fullstack.yml +0 -116
  273. package/.bmad-core/workflows/brownfield-service.yml +0 -117
  274. package/.bmad-core/workflows/brownfield-ui.yml +0 -127
  275. package/.bmad-core/workflows/greenfield-service.yml +0 -143
  276. package/.bmad-core/workflows/greenfield-ui.yml +0 -172
  277. package/.claude/commands/analyst.md +0 -63
  278. package/.claude/commands/architect.md +0 -70
  279. package/.claude/commands/bmad-master.md +0 -108
  280. package/.claude/commands/bmad-orchestrator.md +0 -85
  281. package/.claude/commands/dev.md +0 -74
  282. package/.claude/commands/pm.md +0 -63
  283. package/.claude/commands/po.md +0 -64
  284. package/.claude/commands/qa.md +0 -56
  285. package/.claude/commands/sm.md +0 -59
  286. package/.claude/commands/ux-expert.md +0 -70
  287. package/.cursor/rules/analyst.mdc +0 -77
  288. package/.cursor/rules/architect.mdc +0 -84
  289. package/.cursor/rules/bmad-master.mdc +0 -122
  290. package/.cursor/rules/bmad-orchestrator.mdc +0 -99
  291. package/.cursor/rules/dev.mdc +0 -88
  292. package/.cursor/rules/pm.mdc +0 -77
  293. package/.cursor/rules/po.mdc +0 -78
  294. package/.cursor/rules/qa.mdc +0 -70
  295. package/.cursor/rules/sm.mdc +0 -73
  296. package/.cursor/rules/ux-expert.mdc +0 -84
  297. package/.github/workflows/release.yml +0 -59
  298. package/.releaserc.json +0 -18
  299. package/.roo/.roomodes +0 -95
  300. package/.roo/README.md +0 -38
  301. package/.vscode/extensions.json +0 -6
  302. package/.windsurf/rules/analyst.md +0 -71
  303. package/.windsurf/rules/architect.md +0 -78
  304. package/.windsurf/rules/bmad-master.md +0 -116
  305. package/.windsurf/rules/bmad-orchestrator.md +0 -93
  306. package/.windsurf/rules/dev.md +0 -82
  307. package/.windsurf/rules/pm.md +0 -71
  308. package/.windsurf/rules/po.md +0 -72
  309. package/.windsurf/rules/qa.md +0 -64
  310. package/.windsurf/rules/sm.md +0 -67
  311. package/.windsurf/rules/ux-expert.md +0 -78
  312. package/docs/bmad-workflow-guide.md +0 -161
  313. package/docs/claude-code-guide.md +0 -119
  314. package/docs/cursor-guide.md +0 -127
  315. package/docs/roo-code-guide.md +0 -140
  316. package/docs/sample-output/simple-fullstack-greenfield/prd.md +0 -42
  317. package/docs/windsurf-guide.md +0 -127
  318. package/expansion-packs/infrastructure-devops/manifest.yml +0 -38
  319. package/expansion-packs/infrastructure-devops/templates/infrastructure-architecture-tmpl.md +0 -415
  320. package/expansion-packs/infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.md +0 -0
  321. package/tools/installer/config/install.config.yml +0 -139
  322. package/tools/installer/package-lock.json +0 -906
  323. package/tools/installer/templates/claude-commands.md +0 -7
  324. package/tools/installer/templates/cursor-rules.md +0 -22
  325. package/tools/installer/templates/windsurf-rules.md +0 -22
  326. package/tools/semantic-release-sync-installer.js +0 -31
  327. /package/{.bmad-core → bmad-core}/data/technical-preferences.md +0 -0
  328. /package/{.bmad-core → bmad-core}/tasks/brownfield-create-epic.md +0 -0
  329. /package/{.bmad-core → bmad-core}/tasks/brownfield-create-story.md +0 -0
@@ -1,39 +1,36 @@
1
- const fs = require('fs').promises;
2
- const path = require('path');
1
+ const fs = require('node:fs').promises;
2
+ const path = require('node:path');
3
3
  const yaml = require('js-yaml');
4
+ const { extractYamlFromAgent } = require('./yaml-utils');
4
5
 
5
6
  class DependencyResolver {
6
7
  constructor(rootDir) {
7
8
  this.rootDir = rootDir;
8
- this.bmadCore = path.join(rootDir, '.bmad-core');
9
+ this.bmadCore = path.join(rootDir, 'bmad-core');
10
+ this.common = path.join(rootDir, 'common');
9
11
  this.cache = new Map();
10
12
  }
11
13
 
12
14
  async resolveAgentDependencies(agentId) {
13
15
  const agentPath = path.join(this.bmadCore, 'agents', `${agentId}.md`);
14
16
  const agentContent = await fs.readFile(agentPath, 'utf8');
15
-
16
- // Extract YAML from markdown content
17
- const yamlMatch = agentContent.match(/```ya?ml\n([\s\S]*?)\n```/);
18
- if (!yamlMatch) {
17
+
18
+ // Extract YAML from markdown content with command cleaning
19
+ const yamlContent = extractYamlFromAgent(agentContent, true);
20
+ if (!yamlContent) {
19
21
  throw new Error(`No YAML configuration found in agent ${agentId}`);
20
22
  }
21
-
22
- // Clean up the YAML to handle command descriptions after dashes
23
- let yamlContent = yamlMatch[1];
24
- // Fix commands section: convert "- command - description" to just "- command"
25
- yamlContent = yamlContent.replace(/^(\s*-)(\s*"[^"]+")(\s*-\s*.*)$/gm, '$1$2');
26
-
23
+
27
24
  const agentConfig = yaml.load(yamlContent);
28
-
25
+
29
26
  const dependencies = {
30
27
  agent: {
31
28
  id: agentId,
32
- path: `agents#${agentId}`,
29
+ path: agentPath,
33
30
  content: agentContent,
34
- config: agentConfig
31
+ config: agentConfig,
35
32
  },
36
- resources: []
33
+ resources: [],
37
34
  };
38
35
 
39
36
  // Personas are now embedded in agent configs, no need to resolve separately
@@ -52,52 +49,52 @@ class DependencyResolver {
52
49
  }
53
50
 
54
51
  async resolveTeamDependencies(teamId) {
55
- const teamPath = path.join(this.bmadCore, 'agent-teams', `${teamId}.yml`);
52
+ const teamPath = path.join(this.bmadCore, 'agent-teams', `${teamId}.yaml`);
56
53
  const teamContent = await fs.readFile(teamPath, 'utf8');
57
54
  const teamConfig = yaml.load(teamContent);
58
-
55
+
59
56
  const dependencies = {
60
57
  team: {
61
58
  id: teamId,
62
- path: `agent-teams#${teamId}`,
59
+ path: teamPath,
63
60
  content: teamContent,
64
- config: teamConfig
61
+ config: teamConfig,
65
62
  },
66
63
  agents: [],
67
- resources: new Map() // Use Map to deduplicate resources
64
+ resources: new Map(), // Use Map to deduplicate resources
68
65
  };
69
66
 
70
67
  // Always add bmad-orchestrator agent first if it's a team
71
68
  const bmadAgent = await this.resolveAgentDependencies('bmad-orchestrator');
72
69
  dependencies.agents.push(bmadAgent.agent);
73
- bmadAgent.resources.forEach(res => {
70
+ for (const res of bmadAgent.resources) {
74
71
  dependencies.resources.set(res.path, res);
75
- });
72
+ }
76
73
 
77
74
  // Resolve all agents in the team
78
75
  let agentsToResolve = teamConfig.agents || [];
79
-
76
+
80
77
  // Handle wildcard "*" - include all agents except bmad-master
81
78
  if (agentsToResolve.includes('*')) {
82
79
  const allAgents = await this.listAgents();
83
80
  // Remove wildcard and add all agents except those already in the list and bmad-master
84
- agentsToResolve = agentsToResolve.filter(a => a !== '*');
81
+ agentsToResolve = agentsToResolve.filter((a) => a !== '*');
85
82
  for (const agent of allAgents) {
86
83
  if (!agentsToResolve.includes(agent) && agent !== 'bmad-master') {
87
84
  agentsToResolve.push(agent);
88
85
  }
89
86
  }
90
87
  }
91
-
88
+
92
89
  for (const agentId of agentsToResolve) {
93
90
  if (agentId === 'bmad-orchestrator' || agentId === 'bmad-master') continue; // Already added or excluded
94
91
  const agentDeps = await this.resolveAgentDependencies(agentId);
95
92
  dependencies.agents.push(agentDeps.agent);
96
-
93
+
97
94
  // Add resources with deduplication
98
- agentDeps.resources.forEach(res => {
95
+ for (const res of agentDeps.resources) {
99
96
  dependencies.resources.set(res.path, res);
100
- });
97
+ }
101
98
  }
102
99
 
103
100
  // Resolve workflows
@@ -107,7 +104,7 @@ class DependencyResolver {
107
104
  }
108
105
 
109
106
  // Convert Map back to array
110
- dependencies.resources = Array.from(dependencies.resources.values());
107
+ dependencies.resources = [...dependencies.resources.values()];
111
108
 
112
109
  return dependencies;
113
110
  }
@@ -119,17 +116,20 @@ class DependencyResolver {
119
116
  }
120
117
 
121
118
  try {
122
- const extensions = ['.md', '.yml', '.yaml'];
123
119
  let content = null;
124
120
  let filePath = null;
125
121
 
126
- for (const ext of extensions) {
122
+ // First try bmad-core
123
+ try {
124
+ filePath = path.join(this.bmadCore, type, id);
125
+ content = await fs.readFile(filePath, 'utf8');
126
+ } catch {
127
+ // If not found in bmad-core, try common folder
127
128
  try {
128
- filePath = path.join(this.bmadCore, type, `${id}${ext}`);
129
+ filePath = path.join(this.common, type, id);
129
130
  content = await fs.readFile(filePath, 'utf8');
130
- break;
131
- } catch (e) {
132
- // Try next extension
131
+ } catch {
132
+ // File not found in either location
133
133
  }
134
134
  }
135
135
 
@@ -141,8 +141,8 @@ class DependencyResolver {
141
141
  const resource = {
142
142
  type,
143
143
  id,
144
- path: `${type}#${id}`,
145
- content
144
+ path: filePath,
145
+ content,
146
146
  };
147
147
 
148
148
  this.cache.set(cacheKey, resource);
@@ -156,10 +156,8 @@ class DependencyResolver {
156
156
  async listAgents() {
157
157
  try {
158
158
  const files = await fs.readdir(path.join(this.bmadCore, 'agents'));
159
- return files
160
- .filter(f => f.endsWith('.md'))
161
- .map(f => f.replace('.md', ''));
162
- } catch (error) {
159
+ return files.filter((f) => f.endsWith('.md')).map((f) => f.replace('.md', ''));
160
+ } catch {
163
161
  return [];
164
162
  }
165
163
  }
@@ -167,13 +165,11 @@ class DependencyResolver {
167
165
  async listTeams() {
168
166
  try {
169
167
  const files = await fs.readdir(path.join(this.bmadCore, 'agent-teams'));
170
- return files
171
- .filter(f => f.endsWith('.yml'))
172
- .map(f => f.replace('.yml', ''));
173
- } catch (error) {
168
+ return files.filter((f) => f.endsWith('.yaml')).map((f) => f.replace('.yaml', ''));
169
+ } catch {
174
170
  return [];
175
171
  }
176
172
  }
177
173
  }
178
174
 
179
- module.exports = DependencyResolver;
175
+ module.exports = DependencyResolver;
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Utility functions for YAML extraction from agent files
3
+ */
4
+
5
+ /**
6
+ * Extract YAML content from agent markdown files
7
+ * @param {string} agentContent - The full content of the agent file
8
+ * @param {boolean} cleanCommands - Whether to clean command descriptions (default: false)
9
+ * @returns {string|null} - The extracted YAML content or null if not found
10
+ */
11
+ function extractYamlFromAgent(agentContent, cleanCommands = false) {
12
+ // Remove carriage returns and match YAML block
13
+ const yamlMatch = agentContent.replaceAll('\r', '').match(/```ya?ml\n([\s\S]*?)\n```/);
14
+ if (!yamlMatch) return null;
15
+
16
+ let yamlContent = yamlMatch[1].trim();
17
+
18
+ // Clean up command descriptions if requested
19
+ // Converts "- command - description" to just "- command"
20
+ if (cleanCommands) {
21
+ yamlContent = yamlContent.replaceAll(/^(\s*-)(\s*"[^"]+")(\s*-\s*.*)$/gm, '$1$2');
22
+ }
23
+
24
+ return yamlContent;
25
+ }
26
+
27
+ module.exports = {
28
+ extractYamlFromAgent,
29
+ };
@@ -0,0 +1,39 @@
1
+ # Web Agent Bundle Instructions
2
+
3
+ You are now operating as a specialized AI agent from the BMad-Method framework. This is a bundled web-compatible version containing all necessary resources for your role.
4
+
5
+ ## Important Instructions
6
+
7
+ ### **Follow all startup commands**: Your agent configuration includes startup instructions that define your behavior, personality, and approach. These MUST be followed exactly.
8
+
9
+ ### **Resource Navigation**: This bundle contains all resources you need. Resources are marked with tags like:
10
+
11
+ - `==================== START: .bmad-core/folder/filename.md ====================`
12
+ - `==================== END: .bmad-core/folder/filename.md ====================`
13
+
14
+ When you need to reference a resource mentioned in your instructions:
15
+
16
+ - Look for the corresponding START/END tags
17
+ - The format is always the full path with dot prefix (e.g., `.bmad-core/personas/analyst.md`, `.bmad-core/tasks/create-story.md`)
18
+ - If a section is specified (e.g., `{root}/tasks/create-story.md#section-name`), navigate to that section within the file
19
+
20
+ **Understanding YAML References**: In the agent configuration, resources are referenced in the dependencies section. For example:
21
+
22
+ ```yaml
23
+ dependencies:
24
+ utils:
25
+ - template-format
26
+ tasks:
27
+ - create-story
28
+ ```
29
+
30
+ These references map directly to bundle sections:
31
+
32
+ - `dependencies.utils: template-format` → Look for `==================== START: .bmad-core/utils/template-format.md ====================`
33
+ - `dependencies.utils: create-story` → Look for `==================== START: .bmad-core/tasks/create-story.md ====================`
34
+
35
+ ### **Execution Context**: You are operating in a web environment. All your capabilities and knowledge are contained within this bundle. Work within these constraints to provide the best possible assistance. You have no file system to write to, so you will maintain document history being drafted in your memory unless a canvas feature is available and the user confirms its usage.
36
+
37
+ ## **Primary Directive**: Your primary goal is defined in your agent configuration below. Focus on fulfilling your designated role explicitly as defined.
38
+
39
+ ---
@@ -0,0 +1,66 @@
1
+ const { execSync } = require('node:child_process');
2
+ const fs = require('node:fs');
3
+
4
+ // Get the latest stable tag (exclude beta tags)
5
+ const allTags = execSync('git tag -l | sort -V', { encoding: 'utf8' }).split('\n').filter(Boolean);
6
+ const stableTags = allTags.filter((tag) => !tag.includes('beta'));
7
+ const latestTag = stableTags.at(-1) || 'v5.0.0';
8
+
9
+ // Get commits since last tag
10
+ const commits = execSync(`git log ${latestTag}..HEAD --pretty=format:"- %s" --reverse`, {
11
+ encoding: 'utf8',
12
+ })
13
+ .split('\n')
14
+ .filter(Boolean);
15
+
16
+ // Categorize commits
17
+ const features = commits.filter((commit) => /^- (feat|Feature)/.test(commit));
18
+ const fixes = commits.filter((commit) => /^- (fix|Fix)/.test(commit));
19
+ const chores = commits.filter((commit) => /^- (chore|Chore)/.test(commit));
20
+ const others = commits.filter(
21
+ (commit) => !/^- (feat|Feature|fix|Fix|chore|Chore|release:|Release:)/.test(commit),
22
+ );
23
+
24
+ // Get next version (you can modify this logic)
25
+ const currentVersion = require('../package.json').version;
26
+ const versionParts = currentVersion.split('.').map(Number);
27
+ const nextVersion = `${versionParts[0]}.${versionParts[1] + 1}.0`; // Default to minor bump
28
+
29
+ console.log(`## 🚀 What's New in v${nextVersion}\n`);
30
+
31
+ if (features.length > 0) {
32
+ console.log('### ✨ New Features');
33
+ for (const feature of features) console.log(feature);
34
+ console.log('');
35
+ }
36
+
37
+ if (fixes.length > 0) {
38
+ console.log('### 🐛 Bug Fixes');
39
+ for (const fix of fixes) console.log(fix);
40
+ console.log('');
41
+ }
42
+
43
+ if (others.length > 0) {
44
+ console.log('### 📦 Other Changes');
45
+ for (const other of others) console.log(other);
46
+ console.log('');
47
+ }
48
+
49
+ if (chores.length > 0) {
50
+ console.log('### 🔧 Maintenance');
51
+ for (const chore of chores) console.log(chore);
52
+ console.log('');
53
+ }
54
+
55
+ console.log('\n## 📦 Installation\n');
56
+ console.log('```bash');
57
+ console.log('npx bmad-method install');
58
+ console.log('```');
59
+
60
+ console.log(
61
+ `\n**Full Changelog**: https://github.com/bmadcode/BMAD-METHOD/compare/${latestTag}...v${nextVersion}`,
62
+ );
63
+
64
+ console.log(`\n---\n📊 **Summary**: ${commits.length} commits since ${latestTag}`);
65
+ console.log(`🏷️ **Previous tag**: ${latestTag}`);
66
+ console.log(`🚀 **Next version**: v${nextVersion} (estimated)`);
@@ -0,0 +1,105 @@
1
+ // ASCII banner art definitions extracted from banners.js to separate art from logic
2
+
3
+ const BMAD_TITLE = 'BMAD-METHOD';
4
+ const FLATTENER_TITLE = 'FLATTENER';
5
+ const INSTALLER_TITLE = 'INSTALLER';
6
+
7
+ // Large ASCII blocks (block-style fonts)
8
+ const BMAD_LARGE = `
9
+ ██████╗ ███╗ ███╗ █████╗ ██████╗ ███╗ ███╗███████╗████████╗██╗ ██╗ ██████╗ ██████╗
10
+ ██╔══██╗████╗ ████║██╔══██╗██╔══██╗ ████╗ ████║██╔════╝╚══██╔══╝██║ ██║██╔═══██╗██╔══██╗
11
+ ██████╔╝██╔████╔██║███████║██║ ██║█████╗██╔████╔██║█████╗ ██║ ███████║██║ ██║██║ ██║
12
+ ██╔══██╗██║╚██╔╝██║██╔══██║██║ ██║╚════╝██║╚██╔╝██║██╔══╝ ██║ ██╔══██║██║ ██║██║ ██║
13
+ ██████╔╝██║ ╚═╝ ██║██║ ██║██████╔╝ ██║ ╚═╝ ██║███████╗ ██║ ██║ ██║╚██████╔╝██████╔╝
14
+ ╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝
15
+ `;
16
+
17
+ const FLATTENER_LARGE = `
18
+ ███████╗██╗ █████╗ ████████╗████████╗███████╗███╗ ██╗███████╗██████╗
19
+ ██╔════╝██║ ██╔══██╗╚══██╔══╝╚══██╔══╝██╔════╝████╗ ██║██╔════╝██╔══██╗
20
+ █████╗ ██║ ███████║ ██║ ██║ █████╗ ██╔██╗ ██║█████╗ ██████╔╝
21
+ ██╔══╝ ██║ ██╔══██║ ██║ ██║ ██╔══╝ ██║╚██╗██║██╔══╝ ██╔══██╗
22
+ ██║ ███████║██║ ██║ ██║ ██║ ███████╗██║ ╚████║███████╗██║ ██║
23
+ ╚═╝ ╚══════╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝╚═╝ ╚═══╝╚══════╝╚═╝ ╚═╝
24
+ `;
25
+
26
+ const INSTALLER_LARGE = `
27
+ ██╗███╗ ██╗███████╗████████╗ █████╗ ██╗ ██╗ ███████╗██████╗
28
+ ██║████╗ ██║██╔════╝╚══██╔══╝██╔══██╗██║ ██║ ██╔════╝██╔══██╗
29
+ ██║██╔██╗ ██║███████╗ ██║ ███████║██║ ██║ █████╗ ██████╔╝
30
+ ██║██║╚██╗██║╚════██║ ██║ ██╔══██║██║ ██║ ██╔══╝ ██╔══██╗
31
+ ██║██║ ╚████║███████║ ██║ ██║ ██║███████╗███████╗███████╗██║ ██║
32
+ ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝ ╚═╝ ╚═╝╚══════╝╚══════╝╚══════╝╚═╝ ╚═╝
33
+ `;
34
+
35
+ // Curated medium/small/tiny variants (fixed art, no runtime scaling)
36
+ // Medium: bold framed title with heavy fill (high contrast, compact)
37
+ const BMAD_MEDIUM = `
38
+ ███╗ █╗ █╗ ██╗ ███╗ █╗ █╗███╗█████╗█╗ █╗ ██╗ ███╗
39
+ █╔═█╗██╗ ██║█╔═█╗█╔═█╗ ██╗ ██║█╔═╝╚═█╔═╝█║ █║█╔═█╗█╔═█╗
40
+ ███╔╝█╔███╔█║████║█║ █║██╗█╔███╔█║██╗ █║ ████║█║ █║█║ █║
41
+ █╔═█╗█║ █╔╝█║█╔═█║█║ █║╚═╝█║ █╔╝█║█╔╝ █║ █╔═█║█║ █║█║ █║
42
+ ███╔╝█║ ╚╝ █║█║ █║███╔╝ █║ ╚╝ █║███╗ █║ █║ █║╚██╔╝███╔╝
43
+ ╚══╝ ╚╝ ╚╝╚╝ ╚╝╚══╝ ╚╝ ╚╝╚══╝ ╚╝ ╚╝ ╚╝ ╚═╝ ╚══╝
44
+ `;
45
+
46
+ const FLATTENER_MEDIUM = `
47
+ ███╗█╗ ██╗ █████╗█████╗███╗█╗ █╗███╗███╗
48
+ █╔═╝█║ █╔═█╗╚═█╔═╝╚═█╔═╝█╔═╝██╗ █║█╔═╝█╔═█╗
49
+ ██╗ █║ ████║ █║ █║ ██╗ █╔█╗█║██╗ ███╔╝
50
+ █╔╝ █║ █╔═█║ █║ █║ █╔╝ █║ ██║█╔╝ █╔═█╗
51
+ █║ ███║█║ █║ █║ █║ ███╗█║ █║███╗█║ █║
52
+ ╚╝ ╚══╝╚╝ ╚╝ ╚╝ ╚╝ ╚══╝╚╝ ╚╝╚══╝╚╝ ╚╝
53
+ `;
54
+
55
+ const INSTALLER_MEDIUM = `
56
+ █╗█╗ █╗████╗█████╗ ██╗ █╗ █╗ ███╗███╗
57
+ █║██╗ █║█╔══╝╚═█╔═╝█╔═█╗█║ █║ █╔═╝█╔═█╗
58
+ █║█╔█╗█║████╗ █║ ████║█║ █║ ██╗ ███╔╝
59
+ █║█║ ██║╚══█║ █║ █╔═█║█║ █║ █╔╝ █╔═█╗
60
+ █║█║ █║████║ █║ █║ █║███╗███╗███╗█║ █║
61
+ ╚╝╚╝ ╚╝╚═══╝ ╚╝ ╚╝ ╚╝╚══╝╚══╝╚══╝╚╝ ╚╝
62
+ `;
63
+
64
+ // Small: rounded box with bold rule
65
+ // Width: 30 columns total (28 inner)
66
+ const BMAD_SMALL = `
67
+ ╭──────────────────────────╮
68
+ │ BMAD-METHOD │
69
+ ╰──────────────────────────╯
70
+ `;
71
+
72
+ const FLATTENER_SMALL = `
73
+ ╭──────────────────────────╮
74
+ │ FLATTENER │
75
+ ╰──────────────────────────╯
76
+ `;
77
+
78
+ const INSTALLER_SMALL = `
79
+ ╭──────────────────────────╮
80
+ │ INSTALLER │
81
+ ╰──────────────────────────╯
82
+ `;
83
+
84
+ // Tiny (compact brackets)
85
+ const BMAD_TINY = `[ BMAD-METHOD ]`;
86
+ const FLATTENER_TINY = `[ FLATTENER ]`;
87
+ const INSTALLER_TINY = `[ INSTALLER ]`;
88
+
89
+ module.exports = {
90
+ BMAD_TITLE,
91
+ FLATTENER_TITLE,
92
+ INSTALLER_TITLE,
93
+ BMAD_LARGE,
94
+ FLATTENER_LARGE,
95
+ INSTALLER_LARGE,
96
+ BMAD_MEDIUM,
97
+ FLATTENER_MEDIUM,
98
+ INSTALLER_MEDIUM,
99
+ BMAD_SMALL,
100
+ FLATTENER_SMALL,
101
+ INSTALLER_SMALL,
102
+ BMAD_TINY,
103
+ FLATTENER_TINY,
104
+ INSTALLER_TINY,
105
+ };
@@ -1,28 +1,26 @@
1
- #!/usr/bin/env node
2
-
3
1
  /**
4
2
  * Sync installer package.json version with main package.json
5
3
  * Used by semantic-release to keep versions in sync
6
4
  */
7
5
 
8
- const fs = require('fs');
9
- const path = require('path');
6
+ const fs = require('node:fs');
7
+ const path = require('node:path');
10
8
 
11
9
  function syncInstallerVersion() {
12
10
  // Read main package.json
13
11
  const mainPackagePath = path.join(__dirname, '..', 'package.json');
14
12
  const mainPackage = JSON.parse(fs.readFileSync(mainPackagePath, 'utf8'));
15
-
13
+
16
14
  // Read installer package.json
17
15
  const installerPackagePath = path.join(__dirname, 'installer', 'package.json');
18
16
  const installerPackage = JSON.parse(fs.readFileSync(installerPackagePath, 'utf8'));
19
-
17
+
20
18
  // Update installer version to match main version
21
19
  installerPackage.version = mainPackage.version;
22
-
20
+
23
21
  // Write back installer package.json
24
22
  fs.writeFileSync(installerPackagePath, JSON.stringify(installerPackage, null, 2) + '\n');
25
-
23
+
26
24
  console.log(`Synced installer version to ${mainPackage.version}`);
27
25
  }
28
26
 
@@ -31,4 +29,4 @@ if (require.main === module) {
31
29
  syncInstallerVersion();
32
30
  }
33
31
 
34
- module.exports = { syncInstallerVersion };
32
+ module.exports = { syncInstallerVersion };
@@ -0,0 +1,53 @@
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
3
+ const yaml = require('js-yaml');
4
+
5
+ const arguments_ = process.argv.slice(2);
6
+
7
+ if (arguments_.length < 2) {
8
+ console.log('Usage: node update-expansion-version.js <expansion-pack-id> <new-version>');
9
+ console.log('Example: node update-expansion-version.js bmad-creator-tools 1.1.0');
10
+ process.exit(1);
11
+ }
12
+
13
+ const [packId, newVersion] = arguments_;
14
+
15
+ // Validate version format
16
+ if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
17
+ console.error('Error: Version must be in format X.Y.Z (e.g., 1.2.3)');
18
+ process.exit(1);
19
+ }
20
+
21
+ async function updateVersion() {
22
+ try {
23
+ // Update in config.yaml
24
+ const configPath = path.join(__dirname, '..', 'expansion-packs', packId, 'config.yaml');
25
+
26
+ if (!fs.existsSync(configPath)) {
27
+ console.error(`Error: Expansion pack '${packId}' not found`);
28
+ process.exit(1);
29
+ }
30
+
31
+ const configContent = fs.readFileSync(configPath, 'utf8');
32
+ const config = yaml.load(configContent);
33
+ const oldVersion = config.version || 'unknown';
34
+
35
+ config.version = newVersion;
36
+
37
+ const updatedYaml = yaml.dump(config, { indent: 2 });
38
+ fs.writeFileSync(configPath, updatedYaml);
39
+
40
+ console.log(`✓ Updated ${packId}/config.yaml: ${oldVersion} → ${newVersion}`);
41
+ console.log(`\n✓ Successfully updated ${packId} to version ${newVersion}`);
42
+ console.log('\nNext steps:');
43
+ console.log('1. Test the changes');
44
+ console.log(
45
+ '2. Commit: git add -A && git commit -m "chore: bump ' + packId + ' to v' + newVersion + '"',
46
+ );
47
+ } catch (error) {
48
+ console.error('Error updating version:', error.message);
49
+ process.exit(1);
50
+ }
51
+ }
52
+
53
+ updateVersion();