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.
- package/CHANGELOG.md +12 -0
- package/bmad-core/core-config.yml +0 -1
- package/expansion-packs/bmad-2d-phaser-game-dev/config.yml +5 -0
- package/expansion-packs/bmad-creator-tools/config.yml +5 -0
- package/expansion-packs/bmad-infrastructure-devops/config.yml +5 -0
- package/package.json +1 -1
- package/test-ide-paths.js +41 -0
- package/tools/installer/config/ide-agent-config.yml +58 -0
- package/tools/installer/lib/config-loader.js +32 -11
- package/tools/installer/lib/ide-setup.js +122 -106
- package/tools/installer/lib/installer.js +17 -5
- package/tools/installer/package.json +1 -1
- package/expansion-packs/bmad-2d-phaser-game-dev/manifest.yml +0 -45
- package/expansion-packs/bmad-infrastructure-devops/manifest.yml +0 -23
- package/expansion-packs/expansion-creator/manifest.yml +0 -12
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/README.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/agents/bmad-the-creator.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/create-agent.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/generate-expansion-pack.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-teams-tmpl.md +0 -0
- /package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-tmpl.md +0 -0
- /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
|
|
|
@@ -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
|
@@ -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
|
|
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
|
-
|
|
85
|
-
const
|
|
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:
|
|
90
|
-
description:
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
52
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
//
|
|
111
|
-
|
|
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 (
|
|
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
|
-
//
|
|
144
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
198
|
-
|
|
199
|
-
|
|
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
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
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
|
-
//
|
|
254
|
-
const
|
|
255
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
//
|
|
373
|
-
const
|
|
374
|
-
|
|
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
|
-
//
|
|
388
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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 =
|
|
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
|
|
864
|
-
const
|
|
865
|
-
if (await fileManager.
|
|
866
|
-
|
|
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,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
|
|
File without changes
|
/package/expansion-packs/{expansion-creator → bmad-creator-tools}/agents/bmad-the-creator.md
RENAMED
|
File without changes
|
|
File without changes
|
/package/expansion-packs/{expansion-creator → bmad-creator-tools}/tasks/generate-expansion-pack.md
RENAMED
|
File without changes
|
/package/expansion-packs/{expansion-creator → bmad-creator-tools}/templates/agent-teams-tmpl.md
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|