bmad-method 4.18.0 → 4.19.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 (22) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/bmad-core/core-config.yml +0 -1
  3. package/expansion-packs/bmad-2d-phaser-game-dev/config.yml +5 -0
  4. package/expansion-packs/bmad-creator-tools/config.yml +5 -0
  5. package/expansion-packs/bmad-infrastructure-devops/config.yml +5 -0
  6. package/package.json +1 -1
  7. package/test-ide-paths.js +41 -0
  8. package/tools/installer/config/ide-agent-config.yml +58 -0
  9. package/tools/installer/lib/config-loader.js +32 -11
  10. package/tools/installer/lib/ide-setup.js +122 -106
  11. package/tools/installer/lib/installer.js +17 -5
  12. package/tools/installer/package.json +1 -1
  13. package/expansion-packs/bmad-2d-phaser-game-dev/manifest.yml +0 -45
  14. package/expansion-packs/bmad-infrastructure-devops/manifest.yml +0 -23
  15. package/expansion-packs/expansion-creator/manifest.yml +0 -12
  16. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/README.md +0 -0
  17. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/agents/bmad-the-creator.md +0 -0
  18. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/create-agent.md +0 -0
  19. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/generate-expansion-pack.md +0 -0
  20. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-teams-tmpl.md +0 -0
  21. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-tmpl.md +0 -0
  22. /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/expansion-pack-plan-tmpl.md +0 -0
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ # [4.19.0](https://github.com/bmadcode/BMAD-METHOD/compare/v4.18.0...v4.19.0) (2025-06-28)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * expansion install config ([50d17ed](https://github.com/bmadcode/BMAD-METHOD/commit/50d17ed65d40f6688f3b6e62732fb2280b6b116e))
7
+
8
+
9
+ ### Features
10
+
11
+ * install for ide now sets up rules also for expansion agents! ([b82978f](https://github.com/bmadcode/BMAD-METHOD/commit/b82978fd38ea789a799ccc1373cfb61a2001c1e0))
12
+
1
13
  # [4.18.0](https://github.com/bmadcode/BMAD-METHOD/compare/v4.17.0...v4.18.0) (2025-06-28)
2
14
 
3
15
 
@@ -17,4 +17,3 @@ devLoadAlwaysFiles:
17
17
  - docs/architecture/source-tree.md
18
18
  devDebugLog: .ai/debug-log.md
19
19
  devStoryLocation: docs/stories
20
- agentCoreDump: .ai/core-dump{n}.md
@@ -0,0 +1,5 @@
1
+ name: bmad-2d-phaser-game-dev
2
+ version: 1.1.0
3
+ short-title: 2D game development with Phaser 3 & TypeScript
4
+ description: 2D Game Development expansion pack for BMAD Method - Phaser 3 & TypeScript focused
5
+ author: Brian (BMad)
@@ -0,0 +1,5 @@
1
+ name: bmad-creator-tools
2
+ version: 1.0.0
3
+ short-title: Tools for creating BMAD framework components
4
+ description: Tools for creating and extending BMAD framework components.
5
+ author: Brian (BMad)
@@ -0,0 +1,5 @@
1
+ name: bmad-infrastructure-devops
2
+ version: 1.0.0
3
+ short-title: Infrastructure and DevOps capabilities
4
+ description: This expansion pack extends BMAD Method with comprehensive infrastructure and DevOps capabilities. It's designed for teams that need to define, implement, and manage cloud infrastructure alongside their application development.
5
+ author: Brian (BMad)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-method",
3
- "version": "4.18.0",
3
+ "version": "4.19.0",
4
4
  "description": "Breakthrough Method of Agile AI-driven Development",
5
5
  "main": "tools/cli.js",
6
6
  "bin": {
@@ -0,0 +1,41 @@
1
+ // Test script to verify IDE setup paths for expansion pack agents
2
+ const path = require('path');
3
+ const fs = require('fs-extra');
4
+
5
+ // Simulate the findAgentPath logic
6
+ function simulateFindAgentPath(agentId, installDir) {
7
+ const possiblePaths = [
8
+ path.join(installDir, ".bmad-core", "agents", `${agentId}.md`),
9
+ path.join(installDir, "agents", `${agentId}.md`),
10
+ // Expansion pack paths
11
+ path.join(installDir, ".bmad-2d-phaser-game-dev", "agents", `${agentId}.md`),
12
+ path.join(installDir, ".bmad-infrastructure-devops", "agents", `${agentId}.md`),
13
+ path.join(installDir, ".bmad-creator-tools", "agents", `${agentId}.md`)
14
+ ];
15
+
16
+ // Simulate finding the agent in an expansion pack
17
+ if (agentId === 'game-developer') {
18
+ return path.join(installDir, ".bmad-2d-phaser-game-dev", "agents", `${agentId}.md`);
19
+ }
20
+
21
+ // Default to core
22
+ return path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
23
+ }
24
+
25
+ // Test different scenarios
26
+ const testDir = '/project';
27
+ const agents = ['dev', 'game-developer', 'infra-devops-platform'];
28
+
29
+ console.log('Testing IDE path references:\n');
30
+
31
+ agents.forEach(agentId => {
32
+ const agentPath = simulateFindAgentPath(agentId, testDir);
33
+ const relativePath = path.relative(testDir, agentPath).replace(/\\/g, '/');
34
+
35
+ console.log(`Agent: ${agentId}`);
36
+ console.log(` Full path: ${agentPath}`);
37
+ console.log(` Relative path: ${relativePath}`);
38
+ console.log(` Roo customInstructions: CRITICAL Read the full YML from ${relativePath} ...`);
39
+ console.log(` Cursor MDC reference: [${relativePath}](mdc:${relativePath})`);
40
+ console.log('');
41
+ });
@@ -0,0 +1,58 @@
1
+ # IDE-specific agent configurations
2
+ # This file defines agent-specific settings for different IDEs
3
+
4
+ # Roo Code file permissions
5
+ # Each agent can have restricted file access based on regex patterns
6
+ # If an agent is not listed here, it gets full edit access
7
+ roo-permissions:
8
+ # Core agents
9
+ analyst:
10
+ fileRegex: "\\.(md|txt)$"
11
+ description: "Documentation and text files"
12
+ pm:
13
+ fileRegex: "\\.(md|txt)$"
14
+ description: "Product documentation"
15
+ architect:
16
+ fileRegex: "\\.(md|txt|yml|yaml|json)$"
17
+ description: "Architecture docs and configs"
18
+ qa:
19
+ fileRegex: "\\.(test|spec)\\.(js|ts|jsx|tsx)$|\\.md$"
20
+ description: "Test files and documentation"
21
+ ux-expert:
22
+ fileRegex: "\\.(md|css|scss|html|jsx|tsx)$"
23
+ description: "Design-related files"
24
+ po:
25
+ fileRegex: "\\.(md|txt)$"
26
+ description: "Story and requirement docs"
27
+ sm:
28
+ fileRegex: "\\.(md|txt)$"
29
+ description: "Process and planning docs"
30
+ # Expansion pack agents
31
+ game-designer:
32
+ fileRegex: "\\.(md|txt|json|yaml|yml)$"
33
+ description: "Game design documents and configs"
34
+ game-sm:
35
+ fileRegex: "\\.(md|txt)$"
36
+ description: "Game project management docs"
37
+
38
+ # Cline agent ordering
39
+ # Lower numbers appear first in the list
40
+ # Agents not listed get order 99
41
+ cline-order:
42
+ # Core agents
43
+ bmad-master: 1
44
+ bmad-orchestrator: 2
45
+ pm: 3
46
+ analyst: 4
47
+ architect: 5
48
+ po: 6
49
+ sm: 7
50
+ dev: 8
51
+ qa: 9
52
+ ux-expert: 10
53
+ # Expansion pack agents
54
+ bmad-the-creator: 11
55
+ game-designer: 12
56
+ game-developer: 13
57
+ game-sm: 14
58
+ infra-devops-platform: 15
@@ -77,24 +77,45 @@ class ConfigLoader {
77
77
  const expansionPacks = [];
78
78
 
79
79
  for (const entry of entries) {
80
- if (entry.isDirectory()) {
81
- const manifestPath = path.join(expansionPacksDir, entry.name, 'manifest.yml');
80
+ if (entry.isDirectory() && !entry.name.startsWith('.')) {
81
+ const packPath = path.join(expansionPacksDir, entry.name);
82
+ const configPath = path.join(packPath, 'config.yml');
82
83
 
83
84
  try {
84
- const manifestContent = await fs.readFile(manifestPath, 'utf8');
85
- const manifest = yaml.load(manifestContent);
85
+ // Read config.yml
86
+ const configContent = await fs.readFile(configPath, 'utf8');
87
+ const config = yaml.load(configContent);
86
88
 
87
89
  expansionPacks.push({
88
90
  id: entry.name,
89
- name: manifest.name || entry.name,
90
- description: manifest.description || 'No description available',
91
- version: manifest.version || '1.0.0',
92
- author: manifest.author || 'Unknown',
93
- manifestPath: manifestPath,
94
- dependencies: manifest.dependencies || []
91
+ name: config.name || entry.name,
92
+ description: config['short-title'] || config.description || 'No description available',
93
+ fullDescription: config.description || config['short-title'] || 'No description available',
94
+ version: config.version || '1.0.0',
95
+ author: config.author || 'BMAD Team',
96
+ packPath: packPath,
97
+ dependencies: config.dependencies?.agents || []
95
98
  });
96
99
  } catch (error) {
97
- console.warn(`Failed to read manifest for expansion pack ${entry.name}: ${error.message}`);
100
+ // Fallback if config.yml doesn't exist or can't be read
101
+ console.warn(`Failed to read config for expansion pack ${entry.name}: ${error.message}`);
102
+
103
+ // Try to derive info from directory name as fallback
104
+ const name = entry.name
105
+ .split('-')
106
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
107
+ .join(' ');
108
+
109
+ expansionPacks.push({
110
+ id: entry.name,
111
+ name: name,
112
+ description: 'No description available',
113
+ fullDescription: 'No description available',
114
+ version: '1.0.0',
115
+ author: 'BMAD Team',
116
+ packPath: packPath,
117
+ dependencies: []
118
+ });
98
119
  }
99
120
  }
100
121
  }
@@ -1,4 +1,6 @@
1
1
  const path = require("path");
2
+ const fs = require("fs-extra");
3
+ const yaml = require("js-yaml");
2
4
  const fileManager = require("./file-manager");
3
5
  const configLoader = require("./config-loader");
4
6
 
@@ -13,6 +15,27 @@ async function initializeModules() {
13
15
  }
14
16
 
15
17
  class IdeSetup {
18
+ constructor() {
19
+ this.ideAgentConfig = null;
20
+ }
21
+
22
+ async loadIdeAgentConfig() {
23
+ if (this.ideAgentConfig) return this.ideAgentConfig;
24
+
25
+ try {
26
+ const configPath = path.join(__dirname, '..', 'config', 'ide-agent-config.yml');
27
+ const configContent = await fs.readFile(configPath, 'utf8');
28
+ this.ideAgentConfig = yaml.load(configContent);
29
+ return this.ideAgentConfig;
30
+ } catch (error) {
31
+ console.warn('Failed to load IDE agent configuration, using defaults');
32
+ return {
33
+ 'roo-permissions': {},
34
+ 'cline-order': {}
35
+ };
36
+ }
37
+ }
38
+
16
39
  async setup(ide, installDir, selectedAgent = null) {
17
40
  await initializeModules();
18
41
  const ideConfig = await configLoader.getIdeConfiguration(ide);
@@ -48,13 +71,10 @@ class IdeSetup {
48
71
  await fileManager.ensureDirectory(cursorRulesDir);
49
72
 
50
73
  for (const agentId of agents) {
51
- // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
52
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
53
- if (!(await fileManager.pathExists(agentPath))) {
54
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
55
- }
74
+ // Find the agent file
75
+ const agentPath = await this.findAgentPath(agentId, installDir);
56
76
 
57
- if (await fileManager.pathExists(agentPath)) {
77
+ if (agentPath) {
58
78
  const agentContent = await fileManager.readFile(agentPath);
59
79
  const mdcPath = path.join(cursorRulesDir, `${agentId}.mdc`);
60
80
 
@@ -83,7 +103,8 @@ class IdeSetup {
83
103
  }
84
104
  mdcContent += "\n```\n\n";
85
105
  mdcContent += "## File Reference\n\n";
86
- mdcContent += `The complete agent definition is available in [.bmad-core/agents/${agentId}.md](mdc:.bmad-core/agents/${agentId}.md).\n\n`;
106
+ const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
107
+ mdcContent += `The complete agent definition is available in [${relativePath}](mdc:${relativePath}).\n\n`;
87
108
  mdcContent += "## Usage\n\n";
88
109
  mdcContent += `When the user types \`@${agentId}\`, activate this ${await this.getAgentTitle(
89
110
  agentId,
@@ -107,14 +128,11 @@ class IdeSetup {
107
128
  await fileManager.ensureDirectory(commandsDir);
108
129
 
109
130
  for (const agentId of agents) {
110
- // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
111
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
112
- if (!(await fileManager.pathExists(agentPath))) {
113
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
114
- }
131
+ // Find the agent file
132
+ const agentPath = await this.findAgentPath(agentId, installDir);
115
133
  const commandPath = path.join(commandsDir, `${agentId}.md`);
116
134
 
117
- if (await fileManager.pathExists(agentPath)) {
135
+ if (agentPath) {
118
136
  // Create command file with agent content
119
137
  const agentContent = await fileManager.readFile(agentPath);
120
138
 
@@ -140,13 +158,10 @@ class IdeSetup {
140
158
  await fileManager.ensureDirectory(windsurfRulesDir);
141
159
 
142
160
  for (const agentId of agents) {
143
- // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
144
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
145
- if (!(await fileManager.pathExists(agentPath))) {
146
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
147
- }
161
+ // Find the agent file
162
+ const agentPath = await this.findAgentPath(agentId, installDir);
148
163
 
149
- if (await fileManager.pathExists(agentPath)) {
164
+ if (agentPath) {
150
165
  const agentContent = await fileManager.readFile(agentPath);
151
166
  const mdPath = path.join(windsurfRulesDir, `${agentId}.md`);
152
167
 
@@ -170,7 +185,8 @@ class IdeSetup {
170
185
  }
171
186
  mdContent += "\n```\n\n";
172
187
  mdContent += "## File Reference\n\n";
173
- mdContent += `The complete agent definition is available in [.bmad-core/agents/${agentId}.md](.bmad-core/agents/${agentId}.md).\n\n`;
188
+ const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
189
+ mdContent += `The complete agent definition is available in [${relativePath}](${relativePath}).\n\n`;
174
190
  mdContent += "## Usage\n\n";
175
191
  mdContent += `When the user types \`@${agentId}\`, activate this ${await this.getAgentTitle(
176
192
  agentId,
@@ -187,39 +203,86 @@ class IdeSetup {
187
203
  return true;
188
204
  }
189
205
 
206
+ async findAgentPath(agentId, installDir) {
207
+ // Try to find the agent file in various locations
208
+ const possiblePaths = [
209
+ path.join(installDir, ".bmad-core", "agents", `${agentId}.md`),
210
+ path.join(installDir, "agents", `${agentId}.md`)
211
+ ];
212
+
213
+ // Also check expansion pack directories
214
+ const glob = require("glob");
215
+ const expansionDirs = glob.sync(".*/agents", { cwd: installDir });
216
+ for (const expDir of expansionDirs) {
217
+ possiblePaths.push(path.join(installDir, expDir, `${agentId}.md`));
218
+ }
219
+
220
+ for (const agentPath of possiblePaths) {
221
+ if (await fileManager.pathExists(agentPath)) {
222
+ return agentPath;
223
+ }
224
+ }
225
+
226
+ return null;
227
+ }
228
+
190
229
  async getAllAgentIds(installDir) {
191
- // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
230
+ const glob = require("glob");
231
+ const allAgentIds = [];
232
+
233
+ // Check core agents in .bmad-core or root
192
234
  let agentsDir = path.join(installDir, ".bmad-core", "agents");
193
235
  if (!(await fileManager.pathExists(agentsDir))) {
194
236
  agentsDir = path.join(installDir, "agents");
195
237
  }
196
-
197
- const glob = require("glob");
198
- const agentFiles = glob.sync("*.md", { cwd: agentsDir });
199
- return agentFiles.map((file) => path.basename(file, ".md"));
238
+
239
+ if (await fileManager.pathExists(agentsDir)) {
240
+ const agentFiles = glob.sync("*.md", { cwd: agentsDir });
241
+ allAgentIds.push(...agentFiles.map((file) => path.basename(file, ".md")));
242
+ }
243
+
244
+ // Also check for expansion pack agents in dot folders
245
+ const expansionDirs = glob.sync(".*/agents", { cwd: installDir });
246
+ for (const expDir of expansionDirs) {
247
+ const fullExpDir = path.join(installDir, expDir);
248
+ const expAgentFiles = glob.sync("*.md", { cwd: fullExpDir });
249
+ allAgentIds.push(...expAgentFiles.map((file) => path.basename(file, ".md")));
250
+ }
251
+
252
+ // Remove duplicates
253
+ return [...new Set(allAgentIds)];
200
254
  }
201
255
 
202
256
  async getAgentTitle(agentId, installDir) {
203
- // Try to read the actual agent file to get the title
204
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
205
- if (!(await fileManager.pathExists(agentPath))) {
206
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
257
+ // Try to find the agent file in various locations
258
+ const possiblePaths = [
259
+ path.join(installDir, ".bmad-core", "agents", `${agentId}.md`),
260
+ path.join(installDir, "agents", `${agentId}.md`)
261
+ ];
262
+
263
+ // Also check expansion pack directories
264
+ const glob = require("glob");
265
+ const expansionDirs = glob.sync(".*/agents", { cwd: installDir });
266
+ for (const expDir of expansionDirs) {
267
+ possiblePaths.push(path.join(installDir, expDir, `${agentId}.md`));
207
268
  }
208
269
 
209
- if (await fileManager.pathExists(agentPath)) {
210
- try {
211
- const agentContent = await fileManager.readFile(agentPath);
212
- const yamlMatch = agentContent.match(/```ya?ml\n([\s\S]*?)```/);
213
-
214
- if (yamlMatch) {
215
- const yaml = yamlMatch[1];
216
- const titleMatch = yaml.match(/title:\s*(.+)/);
217
- if (titleMatch) {
218
- return titleMatch[1].trim();
270
+ for (const agentPath of possiblePaths) {
271
+ if (await fileManager.pathExists(agentPath)) {
272
+ try {
273
+ const agentContent = await fileManager.readFile(agentPath);
274
+ const yamlMatch = agentContent.match(/```ya?ml\n([\s\S]*?)```/);
275
+
276
+ if (yamlMatch) {
277
+ const yaml = yamlMatch[1];
278
+ const titleMatch = yaml.match(/title:\s*(.+)/);
279
+ if (titleMatch) {
280
+ return titleMatch[1].trim();
281
+ }
219
282
  }
283
+ } catch (error) {
284
+ console.warn(`Failed to read agent title for ${agentId}: ${error.message}`);
220
285
  }
221
- } catch (error) {
222
- console.warn(`Failed to read agent title for ${agentId}: ${error.message}`);
223
286
  }
224
287
  }
225
288
 
@@ -250,40 +313,9 @@ class IdeSetup {
250
313
  // Create new modes content
251
314
  let newModesContent = "";
252
315
 
253
- // Define file permissions for each agent type
254
- const agentPermissions = {
255
- analyst: {
256
- fileRegex: "\\.(md|txt)$",
257
- description: "Documentation and text files",
258
- },
259
- pm: {
260
- fileRegex: "\\.(md|txt)$",
261
- description: "Product documentation",
262
- },
263
- architect: {
264
- fileRegex: "\\.(md|txt|yml|yaml|json)$",
265
- description: "Architecture docs and configs",
266
- },
267
- dev: null, // Full edit access
268
- qa: {
269
- fileRegex: "\\.(test|spec)\\.(js|ts|jsx|tsx)$|\\.md$",
270
- description: "Test files and documentation",
271
- },
272
- "ux-expert": {
273
- fileRegex: "\\.(md|css|scss|html|jsx|tsx)$",
274
- description: "Design-related files",
275
- },
276
- po: {
277
- fileRegex: "\\.(md|txt)$",
278
- description: "Story and requirement docs",
279
- },
280
- sm: {
281
- fileRegex: "\\.(md|txt)$",
282
- description: "Process and planning docs",
283
- },
284
- "bmad-orchestrator": null, // Full edit access
285
- "bmad-master": null, // Full edit access
286
- };
316
+ // Load dynamic agent permissions from configuration
317
+ const config = await this.loadIdeAgentConfig();
318
+ const agentPermissions = config['roo-permissions'] || {};
287
319
 
288
320
  for (const agentId of agents) {
289
321
  // Skip if already exists
@@ -293,12 +325,9 @@ class IdeSetup {
293
325
  }
294
326
 
295
327
  // Read agent file to extract all information
296
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
297
- if (!(await fileManager.pathExists(agentPath))) {
298
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
299
- }
328
+ const agentPath = await this.findAgentPath(agentId, installDir);
300
329
 
301
- if (await fileManager.pathExists(agentPath)) {
330
+ if (agentPath) {
302
331
  const agentContent = await fileManager.readFile(agentPath);
303
332
 
304
333
  // Extract YAML content
@@ -324,7 +353,9 @@ class IdeSetup {
324
353
  newModesContent += ` name: '${icon} ${title}'\n`;
325
354
  newModesContent += ` roleDefinition: ${roleDefinition}\n`;
326
355
  newModesContent += ` whenToUse: ${whenToUse}\n`;
327
- newModesContent += ` customInstructions: CRITICAL Read the full YML from .bmad-core/agents/${agentId}.md start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`;
356
+ // Get relative path from installDir to agent file
357
+ const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
358
+ newModesContent += ` customInstructions: CRITICAL Read the full YML from ${relativePath} start activation to alter your state of being follow startup section instructions stay in this being until told to exit this mode\n`;
328
359
  newModesContent += ` groups:\n`;
329
360
  newModesContent += ` - read\n`;
330
361
 
@@ -369,28 +400,15 @@ class IdeSetup {
369
400
 
370
401
  await fileManager.ensureDirectory(clineRulesDir);
371
402
 
372
- // Define agent order for numeric prefixes
373
- const agentOrder = {
374
- 'bmad-master': 1,
375
- 'bmad-orchestrator': 2,
376
- 'pm': 3,
377
- 'analyst': 4,
378
- 'architect': 5,
379
- 'po': 6,
380
- 'sm': 7,
381
- 'dev': 8,
382
- 'qa': 9,
383
- 'ux-expert': 10
384
- };
403
+ // Load dynamic agent ordering from configuration
404
+ const config = await this.loadIdeAgentConfig();
405
+ const agentOrder = config['cline-order'] || {};
385
406
 
386
407
  for (const agentId of agents) {
387
- // Check if .bmad-core is a subdirectory (full install) or if agents are in root (single agent install)
388
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
389
- if (!(await fileManager.pathExists(agentPath))) {
390
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
391
- }
408
+ // Find the agent file
409
+ const agentPath = await this.findAgentPath(agentId, installDir);
392
410
 
393
- if (await fileManager.pathExists(agentPath)) {
411
+ if (agentPath) {
394
412
  const agentContent = await fileManager.readFile(agentPath);
395
413
 
396
414
  // Get numeric prefix for ordering
@@ -418,7 +436,8 @@ class IdeSetup {
418
436
  mdContent += `- Always maintain consistency with project documentation in .bmad-core/\n`;
419
437
  mdContent += `- Follow the agent's specific guidelines and constraints\n`;
420
438
  mdContent += `- Update relevant project files when making changes\n`;
421
- mdContent += `- Reference the complete agent definition in [.bmad-core/agents/${agentId}.md](.bmad-core/agents/${agentId}.md)\n\n`;
439
+ const relativePath = path.relative(installDir, agentPath).replace(/\\/g, '/');
440
+ mdContent += `- Reference the complete agent definition in [${relativePath}](${relativePath})\n\n`;
422
441
  mdContent += "## Usage\n\n";
423
442
  mdContent += `Type \`@${agentId}\` to activate this ${await this.getAgentTitle(agentId, installDir)} persona.\n`;
424
443
 
@@ -444,12 +463,9 @@ class IdeSetup {
444
463
 
445
464
  for (const agentId of agents) {
446
465
  // Find the source agent file
447
- let agentPath = path.join(installDir, ".bmad-core", "agents", `${agentId}.md`);
448
- if (!(await fileManager.pathExists(agentPath))) {
449
- agentPath = path.join(installDir, "agents", `${agentId}.md`);
450
- }
466
+ const agentPath = await this.findAgentPath(agentId, installDir);
451
467
 
452
- if (await fileManager.pathExists(agentPath)) {
468
+ if (agentPath) {
453
469
  const agentContent = await fileManager.readFile(agentPath);
454
470
  const contextFilePath = path.join(agentsContextDir, `${agentId}.md`);
455
471
 
@@ -817,7 +817,7 @@ class Installer {
817
817
  continue;
818
818
  }
819
819
 
820
- const expansionPackDir = path.dirname(pack.manifestPath);
820
+ const expansionPackDir = pack.packPath;
821
821
 
822
822
  // Create dedicated dot folder for this expansion pack
823
823
  const expansionDotFolder = path.join(installDir, `.${packId}`);
@@ -860,10 +860,22 @@ class Installer {
860
860
  }
861
861
  }
862
862
 
863
- // Copy manifest to the expansion pack's dot folder
864
- const manifestDestPath = path.join(expansionDotFolder, 'manifest.yml');
865
- if (await fileManager.copyFile(pack.manifestPath, manifestDestPath)) {
866
- installedFiles.push(path.join(`.${packId}`, 'manifest.yml'));
863
+ // Copy config.yml
864
+ const configPath = path.join(expansionPackDir, 'config.yml');
865
+ if (await fileManager.pathExists(configPath)) {
866
+ const configDestPath = path.join(expansionDotFolder, 'config.yml');
867
+ if (await fileManager.copyFile(configPath, configDestPath)) {
868
+ installedFiles.push(path.join(`.${packId}`, 'config.yml'));
869
+ }
870
+ }
871
+
872
+ // Copy README if it exists
873
+ const readmePath = path.join(expansionPackDir, 'README.md');
874
+ if (await fileManager.pathExists(readmePath)) {
875
+ const readmeDestPath = path.join(expansionDotFolder, 'README.md');
876
+ if (await fileManager.copyFile(readmePath, readmeDestPath)) {
877
+ installedFiles.push(path.join(`.${packId}`, 'README.md'));
878
+ }
867
879
  }
868
880
 
869
881
  // Copy common/ items to expansion pack folder
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bmad-method",
3
- "version": "4.18.0",
3
+ "version": "4.19.0",
4
4
  "description": "BMAD Method installer - AI-powered Agile development framework",
5
5
  "main": "lib/installer.js",
6
6
  "bin": {
@@ -1,45 +0,0 @@
1
- name: bmad-2d-phaser-game-dev
2
- version: 1.0.0
3
- description: 2D Game Development expansion pack for BMAD Method - Phaser 3 & TypeScript focused
4
- author: BMAD Team
5
- files:
6
- - source: agents/game-designer.md
7
- destination: .bmad-core/agents/game-designer.md
8
- - source: agents/game-developer.md
9
- destination: .bmad-core/agents/game-developer.md
10
- - source: agents/game-sm.md
11
- destination: .bmad-core/agents/game-sm.md
12
- - source: team-game-dev.yml
13
- destination: .bmad-core/agent-teams/team-game-dev.yml
14
- - source: templates/game-design-doc-tmpl.md
15
- destination: .bmad-core/templates/game-design-doc-tmpl.md
16
- - source: templates/game-architecture-tmpl.md
17
- destination: .bmad-core/templates/game-architecture-tmpl.md
18
- - source: templates/level-design-doc-tmpl.md
19
- destination: .bmad-core/templates/level-design-doc-tmpl.md
20
- - source: templates/game-story-tmpl.md
21
- destination: .bmad-core/templates/game-story-tmpl.md
22
- - source: templates/game-brief-tmpl.md
23
- destination: .bmad-core/templates/game-brief-tmpl.md
24
- - source: tasks/create-game-story.md
25
- destination: .bmad-core/tasks/create-game-story.md
26
- - source: tasks/game-design-brainstorming.md
27
- destination: .bmad-core/tasks/game-design-brainstorming.md
28
- - source: tasks/advanced-elicitation.md
29
- destination: .bmad-core/tasks/advanced-elicitation.md
30
- - source: checklists/game-story-dod-checklist.md
31
- destination: .bmad-core/checklists/game-story-dod-checklist.md
32
- - source: checklists/game-design-checklist.md
33
- destination: .bmad-core/checklists/game-design-checklist.md
34
- - source: data/bmad-kb.md
35
- destination: .bmad-core/data/bmad-kb.md
36
- - source: data/development-guidelines.md
37
- destination: .bmad-core/data/development-guidelines.md
38
- - source: workflows/game-dev-greenfield.yml
39
- destination: .bmad-core/workflows/game-dev-greenfield.yml
40
- - source: workflows/game-prototype.yml
41
- destination: .bmad-core/workflows/game-prototype.yml
42
- dependencies:
43
- - architect
44
- - developer
45
- - sm
@@ -1,23 +0,0 @@
1
- name: bmad-infrastructure-devops
2
- version: 1.0.0
3
- description: Infrastructure & DevOps expansion pack for BMAD Method - Platform engineering and cloud infrastructure focused
4
- author: BMAD Team
5
- files:
6
- - source: agents/infra-devops-platform.md
7
- destination: .bmad-core/agents/infra-devops-platform.md
8
- - source: templates/infrastructure-architecture-tmpl.md
9
- destination: .bmad-core/templates/infrastructure-architecture-tmpl.md
10
- - source: templates/infrastructure-platform-from-arch-tmpl.md
11
- destination: .bmad-core/templates/infrastructure-platform-from-arch-tmpl.md
12
- - source: tasks/create-doc.md
13
- destination: .bmad-core/tasks/create-doc.md
14
- - source: tasks/review-infrastructure.md
15
- destination: .bmad-core/tasks/review-infrastructure.md
16
- - source: tasks/validate-infrastructure.md
17
- destination: .bmad-core/tasks/validate-infrastructure.md
18
- - source: checklists/infrastructure-checklist.md
19
- destination: .bmad-core/checklists/infrastructure-checklist.md
20
- dependencies:
21
- - architect
22
- - operations-specialist
23
- - security-specialist
@@ -1,12 +0,0 @@
1
- name: bmad-creator-tools
2
- version: 1.0.0
3
- description: Tools for creating and extending BMAD framework components
4
- type: creator-tools
5
- compatibility:
6
- bmad-version: '>=4.0.0'
7
- components:
8
- agents:
9
- - bmad-the-creator
10
- tasks:
11
- - create-agent
12
- - generate-expansion-pack