bmad-method 4.37.0 → 4.39.1

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 (251) hide show
  1. package/.github/ISSUE_TEMPLATE/bug_report.md +3 -3
  2. package/.github/ISSUE_TEMPLATE/feature_request.md +3 -3
  3. package/.github/workflows/discord.yaml +11 -2
  4. package/.github/workflows/format-check.yaml +42 -0
  5. package/.github/workflows/manual-release.yaml +173 -0
  6. package/.husky/pre-commit +3 -0
  7. package/.vscode/settings.json +26 -1
  8. package/CHANGELOG.md +2 -23
  9. package/README.md +2 -0
  10. package/bmad-core/agent-teams/team-all.yaml +1 -1
  11. package/bmad-core/agents/analyst.md +16 -15
  12. package/bmad-core/agents/architect.md +11 -11
  13. package/bmad-core/agents/bmad-master.md +23 -22
  14. package/bmad-core/agents/bmad-orchestrator.md +13 -17
  15. package/bmad-core/agents/dev.md +14 -11
  16. package/bmad-core/agents/pm.md +15 -14
  17. package/bmad-core/agents/po.md +9 -8
  18. package/bmad-core/agents/qa.md +42 -22
  19. package/bmad-core/agents/sm.md +7 -6
  20. package/bmad-core/agents/ux-expert.md +6 -5
  21. package/bmad-core/core-config.yaml +2 -0
  22. package/bmad-core/data/bmad-kb.md +1 -1
  23. package/bmad-core/data/test-levels-framework.md +146 -0
  24. package/bmad-core/data/test-priorities-matrix.md +172 -0
  25. package/bmad-core/tasks/apply-qa-fixes.md +148 -0
  26. package/bmad-core/tasks/facilitate-brainstorming-session.md +1 -1
  27. package/bmad-core/tasks/nfr-assess.md +343 -0
  28. package/bmad-core/tasks/qa-gate.md +161 -0
  29. package/bmad-core/tasks/review-story.md +234 -74
  30. package/bmad-core/tasks/risk-profile.md +353 -0
  31. package/bmad-core/tasks/test-design.md +174 -0
  32. package/bmad-core/tasks/trace-requirements.md +264 -0
  33. package/bmad-core/templates/architecture-tmpl.yaml +49 -49
  34. package/bmad-core/templates/brainstorming-output-tmpl.yaml +5 -5
  35. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +31 -31
  36. package/bmad-core/templates/brownfield-prd-tmpl.yaml +13 -13
  37. package/bmad-core/templates/competitor-analysis-tmpl.yaml +19 -6
  38. package/bmad-core/templates/front-end-architecture-tmpl.yaml +21 -9
  39. package/bmad-core/templates/front-end-spec-tmpl.yaml +24 -24
  40. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +122 -104
  41. package/bmad-core/templates/market-research-tmpl.yaml +2 -2
  42. package/bmad-core/templates/prd-tmpl.yaml +9 -9
  43. package/bmad-core/templates/project-brief-tmpl.yaml +4 -4
  44. package/bmad-core/templates/qa-gate-tmpl.yaml +102 -0
  45. package/bmad-core/templates/story-tmpl.yaml +12 -12
  46. package/bmad-core/workflows/brownfield-fullstack.yaml +9 -9
  47. package/bmad-core/workflows/brownfield-service.yaml +1 -1
  48. package/bmad-core/workflows/brownfield-ui.yaml +1 -1
  49. package/bmad-core/workflows/greenfield-fullstack.yaml +1 -1
  50. package/bmad-core/workflows/greenfield-service.yaml +1 -1
  51. package/bmad-core/workflows/greenfield-ui.yaml +1 -1
  52. package/common/utils/bmad-doc-template.md +5 -5
  53. package/dist/agents/analyst.txt +1086 -1079
  54. package/dist/agents/architect.txt +1534 -1526
  55. package/dist/agents/bmad-master.txt +646 -632
  56. package/dist/agents/bmad-orchestrator.txt +40 -18
  57. package/dist/agents/dev.txt +158 -19
  58. package/dist/agents/pm.txt +1082 -1107
  59. package/dist/agents/po.txt +314 -332
  60. package/dist/agents/qa.txt +1754 -151
  61. package/dist/agents/sm.txt +88 -98
  62. package/dist/agents/ux-expert.txt +80 -87
  63. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +109 -146
  64. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +75 -86
  65. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +41 -48
  66. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +1903 -1941
  67. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +15 -50
  68. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +149 -195
  69. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -15
  70. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +20 -37
  71. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +2660 -2752
  72. package/dist/expansion-packs/bmad-creative-writing/agents/beta-reader.txt +871 -0
  73. package/dist/expansion-packs/bmad-creative-writing/agents/book-critic.txt +78 -0
  74. package/dist/expansion-packs/bmad-creative-writing/agents/character-psychologist.txt +839 -0
  75. package/dist/expansion-packs/bmad-creative-writing/agents/cover-designer.txt +85 -0
  76. package/dist/expansion-packs/bmad-creative-writing/agents/dialog-specialist.txt +861 -0
  77. package/dist/expansion-packs/bmad-creative-writing/agents/editor.txt +796 -0
  78. package/dist/expansion-packs/bmad-creative-writing/agents/genre-specialist.txt +927 -0
  79. package/dist/expansion-packs/bmad-creative-writing/agents/narrative-designer.txt +842 -0
  80. package/dist/expansion-packs/bmad-creative-writing/agents/plot-architect.txt +1126 -0
  81. package/dist/expansion-packs/bmad-creative-writing/agents/world-builder.txt +864 -0
  82. package/dist/expansion-packs/bmad-creative-writing/teams/agent-team.txt +5917 -0
  83. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +25 -27
  84. package/dist/teams/team-all.txt +5541 -3768
  85. package/dist/teams/team-fullstack.txt +3014 -2987
  86. package/dist/teams/team-ide-minimal.txt +2219 -469
  87. package/dist/teams/team-no-ui.txt +2993 -2966
  88. package/docs/enhanced-ide-development-workflow.md +220 -15
  89. package/docs/user-guide.md +271 -18
  90. package/docs/versioning-and-releases.md +122 -44
  91. package/docs/working-in-the-brownfield.md +264 -31
  92. package/eslint.config.mjs +119 -0
  93. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +4 -4
  94. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +1 -1
  95. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +1 -1
  96. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +26 -28
  97. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +50 -50
  98. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +23 -23
  99. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +24 -24
  100. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +42 -42
  101. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  102. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  103. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +1 -1
  104. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +3 -3
  105. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +1 -1
  106. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +1 -1
  107. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +23 -23
  108. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +63 -63
  109. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +20 -20
  110. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  111. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  112. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +1 -1
  113. package/expansion-packs/bmad-creative-writing/README.md +132 -0
  114. package/expansion-packs/bmad-creative-writing/agent-teams/agent-team.yaml +19 -0
  115. package/expansion-packs/bmad-creative-writing/agents/beta-reader.md +91 -0
  116. package/expansion-packs/bmad-creative-writing/agents/book-critic.md +35 -0
  117. package/expansion-packs/bmad-creative-writing/agents/character-psychologist.md +90 -0
  118. package/expansion-packs/bmad-creative-writing/agents/cover-designer.md +41 -0
  119. package/expansion-packs/bmad-creative-writing/agents/dialog-specialist.md +89 -0
  120. package/expansion-packs/bmad-creative-writing/agents/editor.md +90 -0
  121. package/expansion-packs/bmad-creative-writing/agents/genre-specialist.md +92 -0
  122. package/expansion-packs/bmad-creative-writing/agents/narrative-designer.md +90 -0
  123. package/expansion-packs/bmad-creative-writing/agents/plot-architect.md +92 -0
  124. package/expansion-packs/bmad-creative-writing/agents/world-builder.md +91 -0
  125. package/expansion-packs/bmad-creative-writing/checklists/beta-feedback-closure-checklist.md +16 -0
  126. package/expansion-packs/bmad-creative-writing/checklists/character-consistency-checklist.md +16 -0
  127. package/expansion-packs/bmad-creative-writing/checklists/comedic-timing-checklist.md +16 -0
  128. package/expansion-packs/bmad-creative-writing/checklists/cyberpunk-aesthetic-checklist.md +16 -0
  129. package/expansion-packs/bmad-creative-writing/checklists/ebook-formatting-checklist.md +15 -0
  130. package/expansion-packs/bmad-creative-writing/checklists/epic-poetry-meter-checklist.md +16 -0
  131. package/expansion-packs/bmad-creative-writing/checklists/fantasy-magic-system-checklist.md +16 -0
  132. package/expansion-packs/bmad-creative-writing/checklists/foreshadowing-payoff-checklist.md +15 -0
  133. package/expansion-packs/bmad-creative-writing/checklists/genre-tropes-checklist.md +15 -0
  134. package/expansion-packs/bmad-creative-writing/checklists/historical-accuracy-checklist.md +16 -0
  135. package/expansion-packs/bmad-creative-writing/checklists/horror-suspense-checklist.md +16 -0
  136. package/expansion-packs/bmad-creative-writing/checklists/kdp-cover-ready-checklist.md +18 -0
  137. package/expansion-packs/bmad-creative-writing/checklists/line-edit-quality-checklist.md +16 -0
  138. package/expansion-packs/bmad-creative-writing/checklists/marketing-copy-checklist.md +16 -0
  139. package/expansion-packs/bmad-creative-writing/checklists/mystery-clue-trail-checklist.md +16 -0
  140. package/expansion-packs/bmad-creative-writing/checklists/orbital-mechanics-checklist.md +16 -0
  141. package/expansion-packs/bmad-creative-writing/checklists/plot-structure-checklist.md +49 -0
  142. package/expansion-packs/bmad-creative-writing/checklists/publication-readiness-checklist.md +16 -0
  143. package/expansion-packs/bmad-creative-writing/checklists/romance-emotional-beats-checklist.md +16 -0
  144. package/expansion-packs/bmad-creative-writing/checklists/scene-quality-checklist.md +16 -0
  145. package/expansion-packs/bmad-creative-writing/checklists/scifi-technology-plausibility-checklist.md +15 -0
  146. package/expansion-packs/bmad-creative-writing/checklists/sensitivity-representation-checklist.md +16 -0
  147. package/expansion-packs/bmad-creative-writing/checklists/steampunk-gadget-checklist.md +16 -0
  148. package/expansion-packs/bmad-creative-writing/checklists/thriller-pacing-stakes-checklist.md +16 -0
  149. package/expansion-packs/bmad-creative-writing/checklists/timeline-continuity-checklist.md +16 -0
  150. package/expansion-packs/bmad-creative-writing/checklists/world-building-continuity-checklist.md +16 -0
  151. package/expansion-packs/bmad-creative-writing/checklists/ya-appropriateness-checklist.md +16 -0
  152. package/expansion-packs/bmad-creative-writing/config.yaml +11 -0
  153. package/expansion-packs/bmad-creative-writing/data/bmad-kb.md +197 -0
  154. package/expansion-packs/bmad-creative-writing/data/story-structures.md +58 -0
  155. package/expansion-packs/bmad-creative-writing/docs/brief.md +183 -0
  156. package/expansion-packs/bmad-creative-writing/tasks/advanced-elicitation.md +117 -0
  157. package/expansion-packs/bmad-creative-writing/tasks/analyze-reader-feedback.md +16 -0
  158. package/expansion-packs/bmad-creative-writing/tasks/analyze-story-structure.md +55 -0
  159. package/expansion-packs/bmad-creative-writing/tasks/assemble-kdp-package.md +22 -0
  160. package/expansion-packs/bmad-creative-writing/tasks/brainstorm-premise.md +16 -0
  161. package/expansion-packs/bmad-creative-writing/tasks/build-world.md +17 -0
  162. package/expansion-packs/bmad-creative-writing/tasks/character-depth-pass.md +15 -0
  163. package/expansion-packs/bmad-creative-writing/tasks/create-doc.md +101 -0
  164. package/expansion-packs/bmad-creative-writing/tasks/create-draft-section.md +19 -0
  165. package/expansion-packs/bmad-creative-writing/tasks/critical-review.md +19 -0
  166. package/expansion-packs/bmad-creative-writing/tasks/develop-character.md +17 -0
  167. package/expansion-packs/bmad-creative-writing/tasks/execute-checklist.md +93 -0
  168. package/expansion-packs/bmad-creative-writing/tasks/expand-premise.md +16 -0
  169. package/expansion-packs/bmad-creative-writing/tasks/expand-synopsis.md +16 -0
  170. package/expansion-packs/bmad-creative-writing/tasks/final-polish.md +16 -0
  171. package/expansion-packs/bmad-creative-writing/tasks/generate-cover-brief.md +18 -0
  172. package/expansion-packs/bmad-creative-writing/tasks/generate-cover-prompts.md +19 -0
  173. package/expansion-packs/bmad-creative-writing/tasks/generate-scene-list.md +16 -0
  174. package/expansion-packs/bmad-creative-writing/tasks/incorporate-feedback.md +18 -0
  175. package/expansion-packs/bmad-creative-writing/tasks/outline-scenes.md +16 -0
  176. package/expansion-packs/bmad-creative-writing/tasks/provide-feedback.md +17 -0
  177. package/expansion-packs/bmad-creative-writing/tasks/publish-chapter.md +16 -0
  178. package/expansion-packs/bmad-creative-writing/tasks/quick-feedback.md +15 -0
  179. package/expansion-packs/bmad-creative-writing/tasks/select-next-arc.md +16 -0
  180. package/expansion-packs/bmad-creative-writing/tasks/workshop-dialog.md +51 -0
  181. package/expansion-packs/bmad-creative-writing/templates/beta-feedback-form.yaml +96 -0
  182. package/expansion-packs/bmad-creative-writing/templates/chapter-draft-tmpl.yaml +81 -0
  183. package/expansion-packs/bmad-creative-writing/templates/character-profile-tmpl.yaml +92 -0
  184. package/expansion-packs/bmad-creative-writing/templates/cover-design-brief-tmpl.yaml +97 -0
  185. package/expansion-packs/bmad-creative-writing/templates/premise-brief-tmpl.yaml +77 -0
  186. package/expansion-packs/bmad-creative-writing/templates/scene-list-tmpl.yaml +54 -0
  187. package/expansion-packs/bmad-creative-writing/templates/story-outline-tmpl.yaml +96 -0
  188. package/expansion-packs/bmad-creative-writing/templates/world-guide-tmpl.yaml +88 -0
  189. package/expansion-packs/bmad-creative-writing/workflows/book-cover-design-workflow.md +176 -0
  190. package/expansion-packs/bmad-creative-writing/workflows/novel-greenfield-workflow.yaml +58 -0
  191. package/expansion-packs/bmad-creative-writing/workflows/novel-serial-workflow.yaml +51 -0
  192. package/expansion-packs/bmad-creative-writing/workflows/novel-snowflake-workflow.yaml +69 -0
  193. package/expansion-packs/bmad-creative-writing/workflows/novel-writing.yaml +92 -0
  194. package/expansion-packs/bmad-creative-writing/workflows/screenplay-development.yaml +86 -0
  195. package/expansion-packs/bmad-creative-writing/workflows/series-planning.yaml +79 -0
  196. package/expansion-packs/bmad-creative-writing/workflows/short-story-creation.yaml +65 -0
  197. package/expansion-packs/bmad-infrastructure-devops/config.yaml +1 -1
  198. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +20 -20
  199. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +7 -7
  200. package/package.json +62 -39
  201. package/prettier.config.mjs +32 -0
  202. package/sync-version.sh +23 -0
  203. package/tools/bmad-npx-wrapper.js +10 -10
  204. package/tools/builders/web-builder.js +124 -130
  205. package/tools/bump-all-versions.js +42 -33
  206. package/tools/bump-expansion-version.js +23 -16
  207. package/tools/cli.js +10 -12
  208. package/tools/flattener/aggregate.js +10 -10
  209. package/tools/flattener/binary.js +44 -17
  210. package/tools/flattener/discovery.js +19 -18
  211. package/tools/flattener/files.js +6 -6
  212. package/tools/flattener/ignoreRules.js +125 -125
  213. package/tools/flattener/main.js +426 -70
  214. package/tools/flattener/projectRoot.js +186 -25
  215. package/tools/flattener/prompts.js +9 -9
  216. package/tools/flattener/stats.helpers.js +395 -0
  217. package/tools/flattener/stats.js +64 -14
  218. package/tools/flattener/test-matrix.js +413 -0
  219. package/tools/flattener/xml.js +33 -31
  220. package/tools/installer/bin/bmad.js +156 -113
  221. package/tools/installer/config/ide-agent-config.yaml +1 -1
  222. package/tools/installer/config/install.config.yaml +13 -3
  223. package/tools/installer/lib/config-loader.js +46 -42
  224. package/tools/installer/lib/file-manager.js +91 -113
  225. package/tools/installer/lib/ide-base-setup.js +57 -56
  226. package/tools/installer/lib/ide-setup.js +545 -399
  227. package/tools/installer/lib/installer.js +875 -714
  228. package/tools/installer/lib/memory-profiler.js +54 -53
  229. package/tools/installer/lib/module-manager.js +19 -15
  230. package/tools/installer/lib/resource-locator.js +26 -28
  231. package/tools/installer/package.json +19 -19
  232. package/tools/lib/dependency-resolver.js +26 -30
  233. package/tools/lib/yaml-utils.js +7 -7
  234. package/tools/preview-release-notes.js +66 -0
  235. package/tools/shared/bannerArt.js +3 -3
  236. package/tools/sync-installer-version.js +7 -9
  237. package/tools/update-expansion-version.js +14 -15
  238. package/tools/upgraders/v3-to-v4-upgrader.js +203 -294
  239. package/tools/version-bump.js +41 -26
  240. package/tools/yaml-format.js +56 -43
  241. package/.github/workflows/release.yaml +0 -60
  242. package/.releaserc.json +0 -21
  243. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  244. 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
  245. 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
  246. 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
  247. 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
  248. 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
  249. 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
  250. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  251. package/tools/semantic-release-sync-installer.js +0 -30
@@ -1,5 +1,5 @@
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
4
  const { extractYamlFromAgent } = require('./yaml-utils');
5
5
 
@@ -14,23 +14,23 @@ class DependencyResolver {
14
14
  async resolveAgentDependencies(agentId) {
15
15
  const agentPath = path.join(this.bmadCore, 'agents', `${agentId}.md`);
16
16
  const agentContent = await fs.readFile(agentPath, 'utf8');
17
-
17
+
18
18
  // Extract YAML from markdown content with command cleaning
19
19
  const yamlContent = extractYamlFromAgent(agentContent, true);
20
20
  if (!yamlContent) {
21
21
  throw new Error(`No YAML configuration found in agent ${agentId}`);
22
22
  }
23
-
23
+
24
24
  const agentConfig = yaml.load(yamlContent);
25
-
25
+
26
26
  const dependencies = {
27
27
  agent: {
28
28
  id: agentId,
29
29
  path: agentPath,
30
30
  content: agentContent,
31
- config: agentConfig
31
+ config: agentConfig,
32
32
  },
33
- resources: []
33
+ resources: [],
34
34
  };
35
35
 
36
36
  // Personas are now embedded in agent configs, no need to resolve separately
@@ -52,49 +52,49 @@ class DependencyResolver {
52
52
  const teamPath = path.join(this.bmadCore, 'agent-teams', `${teamId}.yaml`);
53
53
  const teamContent = await fs.readFile(teamPath, 'utf8');
54
54
  const teamConfig = yaml.load(teamContent);
55
-
55
+
56
56
  const dependencies = {
57
57
  team: {
58
58
  id: teamId,
59
59
  path: teamPath,
60
60
  content: teamContent,
61
- config: teamConfig
61
+ config: teamConfig,
62
62
  },
63
63
  agents: [],
64
- resources: new Map() // Use Map to deduplicate resources
64
+ resources: new Map(), // Use Map to deduplicate resources
65
65
  };
66
66
 
67
67
  // Always add bmad-orchestrator agent first if it's a team
68
68
  const bmadAgent = await this.resolveAgentDependencies('bmad-orchestrator');
69
69
  dependencies.agents.push(bmadAgent.agent);
70
- bmadAgent.resources.forEach(res => {
70
+ for (const res of bmadAgent.resources) {
71
71
  dependencies.resources.set(res.path, res);
72
- });
72
+ }
73
73
 
74
74
  // Resolve all agents in the team
75
75
  let agentsToResolve = teamConfig.agents || [];
76
-
76
+
77
77
  // Handle wildcard "*" - include all agents except bmad-master
78
78
  if (agentsToResolve.includes('*')) {
79
79
  const allAgents = await this.listAgents();
80
80
  // Remove wildcard and add all agents except those already in the list and bmad-master
81
- agentsToResolve = agentsToResolve.filter(a => a !== '*');
81
+ agentsToResolve = agentsToResolve.filter((a) => a !== '*');
82
82
  for (const agent of allAgents) {
83
83
  if (!agentsToResolve.includes(agent) && agent !== 'bmad-master') {
84
84
  agentsToResolve.push(agent);
85
85
  }
86
86
  }
87
87
  }
88
-
88
+
89
89
  for (const agentId of agentsToResolve) {
90
90
  if (agentId === 'bmad-orchestrator' || agentId === 'bmad-master') continue; // Already added or excluded
91
91
  const agentDeps = await this.resolveAgentDependencies(agentId);
92
92
  dependencies.agents.push(agentDeps.agent);
93
-
93
+
94
94
  // Add resources with deduplication
95
- agentDeps.resources.forEach(res => {
95
+ for (const res of agentDeps.resources) {
96
96
  dependencies.resources.set(res.path, res);
97
- });
97
+ }
98
98
  }
99
99
 
100
100
  // Resolve workflows
@@ -104,7 +104,7 @@ class DependencyResolver {
104
104
  }
105
105
 
106
106
  // Convert Map back to array
107
- dependencies.resources = Array.from(dependencies.resources.values());
107
+ dependencies.resources = [...dependencies.resources.values()];
108
108
 
109
109
  return dependencies;
110
110
  }
@@ -123,12 +123,12 @@ class DependencyResolver {
123
123
  try {
124
124
  filePath = path.join(this.bmadCore, type, id);
125
125
  content = await fs.readFile(filePath, 'utf8');
126
- } catch (e) {
126
+ } catch {
127
127
  // If not found in bmad-core, try common folder
128
128
  try {
129
129
  filePath = path.join(this.common, type, id);
130
130
  content = await fs.readFile(filePath, 'utf8');
131
- } catch (e2) {
131
+ } catch {
132
132
  // File not found in either location
133
133
  }
134
134
  }
@@ -142,7 +142,7 @@ class DependencyResolver {
142
142
  type,
143
143
  id,
144
144
  path: filePath,
145
- content
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,10 +165,8 @@ 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('.yaml'))
172
- .map(f => f.replace('.yaml', ''));
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
  }
@@ -10,20 +10,20 @@
10
10
  */
11
11
  function extractYamlFromAgent(agentContent, cleanCommands = false) {
12
12
  // Remove carriage returns and match YAML block
13
- const yamlMatch = agentContent.replace(/\r/g, "").match(/```ya?ml\n([\s\S]*?)\n```/);
13
+ const yamlMatch = agentContent.replaceAll('\r', '').match(/```ya?ml\n([\s\S]*?)\n```/);
14
14
  if (!yamlMatch) return null;
15
-
15
+
16
16
  let yamlContent = yamlMatch[1].trim();
17
-
17
+
18
18
  // Clean up command descriptions if requested
19
19
  // Converts "- command - description" to just "- command"
20
20
  if (cleanCommands) {
21
- yamlContent = yamlContent.replace(/^(\s*-)(\s*"[^"]+")(\s*-\s*.*)$/gm, '$1$2');
21
+ yamlContent = yamlContent.replaceAll(/^(\s*-)(\s*"[^"]+")(\s*-\s*.*)$/gm, '$1$2');
22
22
  }
23
-
23
+
24
24
  return yamlContent;
25
25
  }
26
26
 
27
27
  module.exports = {
28
- extractYamlFromAgent
29
- };
28
+ extractYamlFromAgent,
29
+ };
@@ -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)`);
@@ -1,8 +1,8 @@
1
1
  // ASCII banner art definitions extracted from banners.js to separate art from logic
2
2
 
3
- const BMAD_TITLE = "BMAD-METHOD";
4
- const FLATTENER_TITLE = "FLATTENER";
5
- const INSTALLER_TITLE = "INSTALLER";
3
+ const BMAD_TITLE = 'BMAD-METHOD';
4
+ const FLATTENER_TITLE = 'FLATTENER';
5
+ const INSTALLER_TITLE = 'INSTALLER';
6
6
 
7
7
  // Large ASCII blocks (block-style fonts)
8
8
  const BMAD_LARGE = `
@@ -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 };
@@ -1,18 +1,16 @@
1
- #!/usr/bin/env node
2
-
3
- const fs = require('fs');
4
- const path = require('path');
1
+ const fs = require('node:fs');
2
+ const path = require('node:path');
5
3
  const yaml = require('js-yaml');
6
4
 
7
- const args = process.argv.slice(2);
5
+ const arguments_ = process.argv.slice(2);
8
6
 
9
- if (args.length < 2) {
7
+ if (arguments_.length < 2) {
10
8
  console.log('Usage: node update-expansion-version.js <expansion-pack-id> <new-version>');
11
9
  console.log('Example: node update-expansion-version.js bmad-creator-tools 1.1.0');
12
10
  process.exit(1);
13
11
  }
14
12
 
15
- const [packId, newVersion] = args;
13
+ const [packId, newVersion] = arguments_;
16
14
 
17
15
  // Validate version format
18
16
  if (!/^\d+\.\d+\.\d+$/.test(newVersion)) {
@@ -24,31 +22,32 @@ async function updateVersion() {
24
22
  try {
25
23
  // Update in config.yaml
26
24
  const configPath = path.join(__dirname, '..', 'expansion-packs', packId, 'config.yaml');
27
-
25
+
28
26
  if (!fs.existsSync(configPath)) {
29
27
  console.error(`Error: Expansion pack '${packId}' not found`);
30
28
  process.exit(1);
31
29
  }
32
-
30
+
33
31
  const configContent = fs.readFileSync(configPath, 'utf8');
34
32
  const config = yaml.load(configContent);
35
33
  const oldVersion = config.version || 'unknown';
36
-
34
+
37
35
  config.version = newVersion;
38
-
36
+
39
37
  const updatedYaml = yaml.dump(config, { indent: 2 });
40
38
  fs.writeFileSync(configPath, updatedYaml);
41
-
39
+
42
40
  console.log(`āœ“ Updated ${packId}/config.yaml: ${oldVersion} → ${newVersion}`);
43
41
  console.log(`\nāœ“ Successfully updated ${packId} to version ${newVersion}`);
44
42
  console.log('\nNext steps:');
45
43
  console.log('1. Test the changes');
46
- console.log('2. Commit: git add -A && git commit -m "chore: bump ' + packId + ' to v' + newVersion + '"');
47
-
44
+ console.log(
45
+ '2. Commit: git add -A && git commit -m "chore: bump ' + packId + ' to v' + newVersion + '"',
46
+ );
48
47
  } catch (error) {
49
48
  console.error('Error updating version:', error.message);
50
49
  process.exit(1);
51
50
  }
52
51
  }
53
52
 
54
- updateVersion();
53
+ updateVersion();