bmad-method 5.0.0-beta.2 → 5.0.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 (131) 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 +0 -11
  9. package/README.md +2 -0
  10. package/bmad-core/agent-teams/team-all.yaml +1 -1
  11. package/bmad-core/agents/bmad-orchestrator.md +1 -1
  12. package/bmad-core/agents/dev.md +4 -4
  13. package/bmad-core/data/bmad-kb.md +1 -1
  14. package/bmad-core/data/test-levels-framework.md +12 -12
  15. package/bmad-core/tasks/facilitate-brainstorming-session.md +1 -1
  16. package/bmad-core/tasks/nfr-assess.md +10 -10
  17. package/bmad-core/tasks/qa-gate.md +23 -23
  18. package/bmad-core/tasks/review-story.md +18 -18
  19. package/bmad-core/tasks/risk-profile.md +25 -25
  20. package/bmad-core/tasks/test-design.md +9 -9
  21. package/bmad-core/tasks/trace-requirements.md +21 -21
  22. package/bmad-core/templates/architecture-tmpl.yaml +49 -49
  23. package/bmad-core/templates/brainstorming-output-tmpl.yaml +5 -5
  24. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +31 -31
  25. package/bmad-core/templates/brownfield-prd-tmpl.yaml +13 -13
  26. package/bmad-core/templates/competitor-analysis-tmpl.yaml +19 -6
  27. package/bmad-core/templates/front-end-architecture-tmpl.yaml +21 -9
  28. package/bmad-core/templates/front-end-spec-tmpl.yaml +24 -24
  29. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +122 -104
  30. package/bmad-core/templates/market-research-tmpl.yaml +2 -2
  31. package/bmad-core/templates/prd-tmpl.yaml +9 -9
  32. package/bmad-core/templates/project-brief-tmpl.yaml +4 -4
  33. package/bmad-core/templates/qa-gate-tmpl.yaml +9 -9
  34. package/bmad-core/templates/story-tmpl.yaml +12 -12
  35. package/bmad-core/workflows/brownfield-fullstack.yaml +9 -9
  36. package/bmad-core/workflows/brownfield-service.yaml +1 -1
  37. package/bmad-core/workflows/brownfield-ui.yaml +1 -1
  38. package/bmad-core/workflows/greenfield-fullstack.yaml +1 -1
  39. package/bmad-core/workflows/greenfield-service.yaml +1 -1
  40. package/bmad-core/workflows/greenfield-ui.yaml +1 -1
  41. package/common/utils/bmad-doc-template.md +5 -5
  42. package/dist/agents/analyst.txt +28 -15
  43. package/dist/agents/architect.txt +220 -190
  44. package/dist/agents/bmad-master.txt +298 -255
  45. package/dist/agents/bmad-orchestrator.txt +1 -1
  46. package/dist/agents/pm.txt +20 -20
  47. package/dist/agents/po.txt +11 -11
  48. package/dist/agents/qa.txt +275 -618
  49. package/dist/agents/sm.txt +11 -11
  50. package/dist/agents/ux-expert.txt +23 -23
  51. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +109 -109
  52. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +75 -77
  53. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +41 -41
  54. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +483 -474
  55. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +1 -1
  56. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +149 -149
  57. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +20 -20
  58. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +371 -358
  59. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +25 -25
  60. package/dist/teams/team-all.txt +581 -881
  61. package/dist/teams/team-fullstack.txt +316 -273
  62. package/dist/teams/team-ide-minimal.txt +276 -619
  63. package/dist/teams/team-no-ui.txt +281 -238
  64. package/docs/versioning-and-releases.md +114 -44
  65. package/eslint.config.mjs +119 -0
  66. 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 -26
  67. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +4 -4
  68. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +1 -1
  69. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +26 -28
  70. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +50 -50
  71. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +23 -23
  72. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +24 -24
  73. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +42 -42
  74. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  75. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  76. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +1 -1
  77. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +3 -3
  78. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +1 -1
  79. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +23 -23
  80. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +63 -63
  81. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +20 -20
  82. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +65 -65
  83. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +5 -5
  84. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +1 -1
  85. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +20 -20
  86. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +7 -7
  87. package/package.json +62 -39
  88. package/prettier.config.mjs +32 -0
  89. package/release_notes.md +30 -0
  90. package/tools/bmad-npx-wrapper.js +10 -10
  91. package/tools/builders/web-builder.js +124 -130
  92. package/tools/bump-all-versions.js +42 -33
  93. package/tools/bump-expansion-version.js +23 -16
  94. package/tools/cli.js +10 -12
  95. package/tools/flattener/aggregate.js +10 -10
  96. package/tools/flattener/binary.js +44 -17
  97. package/tools/flattener/discovery.js +19 -18
  98. package/tools/flattener/files.js +6 -6
  99. package/tools/flattener/ignoreRules.js +125 -125
  100. package/tools/flattener/main.js +201 -304
  101. package/tools/flattener/projectRoot.js +75 -73
  102. package/tools/flattener/prompts.js +9 -9
  103. package/tools/flattener/stats.helpers.js +131 -67
  104. package/tools/flattener/stats.js +3 -3
  105. package/tools/flattener/test-matrix.js +201 -193
  106. package/tools/flattener/xml.js +33 -31
  107. package/tools/installer/bin/bmad.js +130 -89
  108. package/tools/installer/config/ide-agent-config.yaml +1 -1
  109. package/tools/installer/config/install.config.yaml +2 -2
  110. package/tools/installer/lib/config-loader.js +46 -42
  111. package/tools/installer/lib/file-manager.js +91 -113
  112. package/tools/installer/lib/ide-base-setup.js +57 -56
  113. package/tools/installer/lib/ide-setup.js +375 -343
  114. package/tools/installer/lib/installer.js +875 -714
  115. package/tools/installer/lib/memory-profiler.js +54 -53
  116. package/tools/installer/lib/module-manager.js +19 -15
  117. package/tools/installer/lib/resource-locator.js +26 -28
  118. package/tools/installer/package.json +19 -19
  119. package/tools/lib/dependency-resolver.js +26 -30
  120. package/tools/lib/yaml-utils.js +7 -7
  121. package/tools/preview-release-notes.js +66 -0
  122. package/tools/shared/bannerArt.js +3 -3
  123. package/tools/sync-installer-version.js +7 -9
  124. package/tools/update-expansion-version.js +14 -15
  125. package/tools/upgraders/v3-to-v4-upgrader.js +203 -294
  126. package/tools/version-bump.js +41 -26
  127. package/tools/yaml-format.js +56 -43
  128. package/.github/workflows/promote-to-stable.yml +0 -144
  129. package/.github/workflows/release.yaml +0 -60
  130. package/.releaserc.json +0 -21
  131. package/tools/semantic-release-sync-installer.js +0 -30
@@ -3,13 +3,13 @@
3
3
  * Reduces duplication and provides shared methods
4
4
  */
5
5
 
6
- const path = require("path");
7
- const fs = require("fs-extra");
8
- const yaml = require("js-yaml");
9
- const chalk = require("chalk").default || require("chalk");
10
- const fileManager = require("./file-manager");
11
- const resourceLocator = require("./resource-locator");
12
- const { extractYamlFromAgent } = require("../../lib/yaml-utils");
6
+ const path = require('node:path');
7
+ const fs = require('fs-extra');
8
+ const yaml = require('js-yaml');
9
+ const chalk = require('chalk').default || require('chalk');
10
+ const fileManager = require('./file-manager');
11
+ const resourceLocator = require('./resource-locator');
12
+ const { extractYamlFromAgent } = require('../../lib/yaml-utils');
13
13
 
14
14
  class BaseIdeSetup {
15
15
  constructor() {
@@ -27,19 +27,19 @@ class BaseIdeSetup {
27
27
  }
28
28
 
29
29
  const allAgents = new Set();
30
-
30
+
31
31
  // Get core agents
32
32
  const coreAgents = await this.getCoreAgentIds(installDir);
33
- coreAgents.forEach(id => allAgents.add(id));
34
-
33
+ for (const id of coreAgents) allAgents.add(id);
34
+
35
35
  // Get expansion pack agents
36
36
  const expansionPacks = await this.getInstalledExpansionPacks(installDir);
37
37
  for (const pack of expansionPacks) {
38
38
  const packAgents = await this.getExpansionPackAgents(pack.path);
39
- packAgents.forEach(id => allAgents.add(id));
39
+ for (const id of packAgents) allAgents.add(id);
40
40
  }
41
-
42
- const result = Array.from(allAgents);
41
+
42
+ const result = [...allAgents];
43
43
  this._agentCache.set(cacheKey, result);
44
44
  return result;
45
45
  }
@@ -50,14 +50,14 @@ class BaseIdeSetup {
50
50
  async getCoreAgentIds(installDir) {
51
51
  const coreAgents = [];
52
52
  const corePaths = [
53
- path.join(installDir, ".bmad-core", "agents"),
54
- path.join(installDir, "bmad-core", "agents")
53
+ path.join(installDir, '.bmad-core', 'agents'),
54
+ path.join(installDir, 'bmad-core', 'agents'),
55
55
  ];
56
56
 
57
57
  for (const agentsDir of corePaths) {
58
58
  if (await fileManager.pathExists(agentsDir)) {
59
- const files = await resourceLocator.findFiles("*.md", { cwd: agentsDir });
60
- coreAgents.push(...files.map(file => path.basename(file, ".md")));
59
+ const files = await resourceLocator.findFiles('*.md', { cwd: agentsDir });
60
+ coreAgents.push(...files.map((file) => path.basename(file, '.md')));
61
61
  break; // Use first found
62
62
  }
63
63
  }
@@ -76,13 +76,13 @@ class BaseIdeSetup {
76
76
 
77
77
  // Use resource locator for efficient path finding
78
78
  let agentPath = await resourceLocator.getAgentPath(agentId);
79
-
79
+
80
80
  if (!agentPath) {
81
81
  // Check installation-specific paths
82
82
  const possiblePaths = [
83
- path.join(installDir, ".bmad-core", "agents", `${agentId}.md`),
84
- path.join(installDir, "bmad-core", "agents", `${agentId}.md`),
85
- path.join(installDir, "common", "agents", `${agentId}.md`)
83
+ path.join(installDir, '.bmad-core', 'agents', `${agentId}.md`),
84
+ path.join(installDir, 'bmad-core', 'agents', `${agentId}.md`),
85
+ path.join(installDir, 'common', 'agents', `${agentId}.md`),
86
86
  ];
87
87
 
88
88
  for (const testPath of possiblePaths) {
@@ -113,7 +113,7 @@ class BaseIdeSetup {
113
113
  const metadata = yaml.load(yamlContent);
114
114
  return metadata.agent_name || agentId;
115
115
  }
116
- } catch (error) {
116
+ } catch {
117
117
  // Fallback to agent ID
118
118
  }
119
119
  return agentId;
@@ -129,31 +129,31 @@ class BaseIdeSetup {
129
129
  }
130
130
 
131
131
  const expansionPacks = [];
132
-
132
+
133
133
  // Check for dot-prefixed expansion packs
134
- const dotExpansions = await resourceLocator.findFiles(".bmad-*", { cwd: installDir });
135
-
134
+ const dotExpansions = await resourceLocator.findFiles('.bmad-*', { cwd: installDir });
135
+
136
136
  for (const dotExpansion of dotExpansions) {
137
- if (dotExpansion !== ".bmad-core") {
137
+ if (dotExpansion !== '.bmad-core') {
138
138
  const packPath = path.join(installDir, dotExpansion);
139
- const packName = dotExpansion.substring(1); // remove the dot
139
+ const packName = dotExpansion.slice(1); // remove the dot
140
140
  expansionPacks.push({
141
141
  name: packName,
142
- path: packPath
142
+ path: packPath,
143
143
  });
144
144
  }
145
145
  }
146
-
146
+
147
147
  // Check other dot folders that have config.yaml
148
- const allDotFolders = await resourceLocator.findFiles(".*", { cwd: installDir });
148
+ const allDotFolders = await resourceLocator.findFiles('.*', { cwd: installDir });
149
149
  for (const folder of allDotFolders) {
150
- if (!folder.startsWith(".bmad-") && folder !== ".bmad-core") {
150
+ if (!folder.startsWith('.bmad-') && folder !== '.bmad-core') {
151
151
  const packPath = path.join(installDir, folder);
152
- const configPath = path.join(packPath, "config.yaml");
152
+ const configPath = path.join(packPath, 'config.yaml');
153
153
  if (await fileManager.pathExists(configPath)) {
154
154
  expansionPacks.push({
155
- name: folder.substring(1), // remove the dot
156
- path: packPath
155
+ name: folder.slice(1), // remove the dot
156
+ path: packPath,
157
157
  });
158
158
  }
159
159
  }
@@ -167,13 +167,13 @@ class BaseIdeSetup {
167
167
  * Get expansion pack agents
168
168
  */
169
169
  async getExpansionPackAgents(packPath) {
170
- const agentsDir = path.join(packPath, "agents");
170
+ const agentsDir = path.join(packPath, 'agents');
171
171
  if (!(await fileManager.pathExists(agentsDir))) {
172
172
  return [];
173
173
  }
174
-
175
- const agentFiles = await resourceLocator.findFiles("*.md", { cwd: agentsDir });
176
- return agentFiles.map(file => path.basename(file, ".md"));
174
+
175
+ const agentFiles = await resourceLocator.findFiles('*.md', { cwd: agentsDir });
176
+ return agentFiles.map((file) => path.basename(file, '.md'));
177
177
  }
178
178
 
179
179
  /**
@@ -183,27 +183,28 @@ class BaseIdeSetup {
183
183
  const agentContent = await fileManager.readFile(agentPath);
184
184
  const agentTitle = await this.getAgentTitle(agentId, installDir);
185
185
  const yamlContent = extractYamlFromAgent(agentContent);
186
-
187
- let content = "";
188
-
186
+
187
+ let content = '';
188
+
189
189
  if (format === 'mdc') {
190
190
  // MDC format for Cursor
191
- content = "---\n";
192
- content += "description: \n";
193
- content += "globs: []\n";
194
- content += "alwaysApply: false\n";
195
- content += "---\n\n";
191
+ content = '---\n';
192
+ content += 'description: \n';
193
+ content += 'globs: []\n';
194
+ content += 'alwaysApply: false\n';
195
+ content += '---\n\n';
196
196
  content += `# ${agentId.toUpperCase()} Agent Rule\n\n`;
197
197
  content += `This rule is triggered when the user types \`@${agentId}\` and activates the ${agentTitle} agent persona.\n\n`;
198
- content += "## Agent Activation\n\n";
199
- content += "CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n";
200
- content += "```yaml\n";
201
- content += yamlContent || agentContent.replace(/^#.*$/m, "").trim();
202
- content += "\n```\n\n";
203
- content += "## File Reference\n\n";
204
- const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
198
+ content += '## Agent Activation\n\n';
199
+ content +=
200
+ 'CRITICAL: Read the full YAML, start activation to alter your state of being, follow startup section instructions, stay in this being until told to exit this mode:\n\n';
201
+ content += '```yaml\n';
202
+ content += yamlContent || agentContent.replace(/^#.*$/m, '').trim();
203
+ content += '\n```\n\n';
204
+ content += '## File Reference\n\n';
205
+ const relativePath = path.relative(installDir, agentPath).replaceAll('\\', '/');
205
206
  content += `The complete agent definition is available in [${relativePath}](mdc:${relativePath}).\n\n`;
206
- content += "## Usage\n\n";
207
+ content += '## Usage\n\n';
207
208
  content += `When the user types \`@${agentId}\`, activate this ${agentTitle} persona and follow all instructions defined in the YAML configuration above.\n`;
208
209
  } else if (format === 'claude') {
209
210
  // Claude Code format
@@ -211,7 +212,7 @@ class BaseIdeSetup {
211
212
  content += `When this command is used, adopt the following agent persona:\n\n`;
212
213
  content += agentContent;
213
214
  }
214
-
215
+
215
216
  return content;
216
217
  }
217
218
 
@@ -224,4 +225,4 @@ class BaseIdeSetup {
224
225
  }
225
226
  }
226
227
 
227
- module.exports = BaseIdeSetup;
228
+ module.exports = BaseIdeSetup;