bmad-method 4.4.0 → 4.4.2
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/.claude/commands/bmad-orchestrator.md +65 -6
- package/.cursor/rules/bmad-orchestrator.mdc +65 -6
- package/.roo/README.md +0 -11
- package/.windsurf/rules/bmad-orchestrator.md +65 -6
- package/CHANGELOG.md +15 -3
- package/README.md +6 -26
- package/{.bmad-core → bmad-core}/agent-teams/team-all.yml +2 -4
- package/bmad-core/agent-teams/team-fullstack.yml +18 -0
- package/bmad-core/agent-teams/team-ide-minimal.yml +10 -0
- package/{.bmad-core → bmad-core}/agent-teams/team-no-ui.yml +1 -3
- package/bmad-core/agents/bmad-orchestrator.md +128 -0
- package/{.bmad-core → bmad-core}/agents/qa.md +11 -17
- package/{.bmad-core → bmad-core}/agents/ux-expert.md +14 -20
- package/{.bmad-core → bmad-core}/tasks/shard-doc.md +5 -3
- package/{.bmad-core → bmad-core}/templates/architecture-tmpl.md +2 -2
- package/{.bmad-core → bmad-core}/templates/brownfield-architecture-tmpl.md +6 -6
- package/{.bmad-core → bmad-core}/templates/front-end-spec-tmpl.md +6 -6
- package/{.bmad-core → bmad-core}/utils/agent-switcher.ide.md +6 -6
- package/{.bmad-core → bmad-core}/utils/workflow-management.md +4 -4
- package/{.bmad-core → bmad-core}/web-bundles/agents/architect.txt +3 -3
- package/{.bmad-core → bmad-core}/web-bundles/agents/bmad-master.txt +10 -10
- package/{.bmad-core → bmad-core}/web-bundles/agents/bmad-orchestrator.txt +67 -8
- package/{.bmad-core → bmad-core}/web-bundles/agents/pm.txt +1 -1
- package/{.bmad-core → bmad-core}/web-bundles/agents/po.txt +1 -1
- package/{.bmad-core → bmad-core}/web-bundles/agents/qa.txt +11 -17
- package/{.bmad-core → bmad-core}/web-bundles/agents/ux-expert.txt +16 -22
- package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/team-game-dev.yml +12 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +58 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +66 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +51 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +201 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +160 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +254 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +631 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/manifest.yml +45 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +111 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +216 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +308 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.md +560 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.md +345 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.md +331 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.md +235 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.md +451 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-designer.txt +1758 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-developer.txt +1444 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/agents/game-sm.txt +674 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/team-game-dev.txt +4395 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/web-bundles/teams/team-game-dev.txt +4395 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yml +183 -0
- package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yml +175 -0
- package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/README.md +5 -5
- package/expansion-packs/bmad-infrastructure-devops/manifest.yml +23 -0
- package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/templates/infrastructure-platform-from-arch-tmpl.md +0 -0
- package/expansion-packs/bmad-infrastructure-devops/web-bundles/agents/infra-devops-platform.txt +2021 -0
- package/package.json +3 -3
- package/tools/builders/web-builder.js +191 -2
- package/tools/cli.js +55 -7
- package/tools/installer/bin/bmad.js +120 -9
- package/tools/installer/config/install.config.yml +43 -43
- package/tools/installer/lib/config-loader.js +116 -6
- package/tools/installer/lib/installer.js +194 -5
- package/tools/installer/package-lock.json +3 -3
- package/tools/installer/package.json +2 -2
- package/tools/lib/dependency-resolver.js +1 -1
- package/.bmad-core/agent-teams/team-fullstack.yml +0 -26
- package/.bmad-core/agents/bmad-orchestrator.md +0 -69
- package/.bmad-core/web-bundles/teams/team-all.txt +0 -10262
- package/.bmad-core/web-bundles/teams/team-fullstack.txt +0 -9614
- package/.bmad-core/web-bundles/teams/team-no-ui.txt +0 -8462
- package/expansion-packs/infrastructure-devops/manifest.yml +0 -38
- /package/{.bmad-core → bmad-core}/agents/analyst.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/architect.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/bmad-master.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/dev.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/pm.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/po.md +0 -0
- /package/{.bmad-core → bmad-core}/agents/sm.md +0 -0
- /package/{.bmad-core → bmad-core}/bmad-core-config.yml +0 -0
- /package/{.bmad-core → bmad-core}/checklists/architect-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/change-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/pm-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/po-master-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/story-dod-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/checklists/story-draft-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/data/bmad-kb.md +0 -0
- /package/{.bmad-core → bmad-core}/data/technical-preferences.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/advanced-elicitation.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brainstorming-techniques.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brownfield-create-epic.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/brownfield-create-story.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/core-dump.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/correct-course.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-deep-research-prompt.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-doc.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/create-next-story.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/doc-migration-task.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/document-project.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/execute-checklist.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/generate-ai-frontend-prompt.md +0 -0
- /package/{.bmad-core → bmad-core}/tasks/index-docs.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/agent-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/brownfield-prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/competitor-analysis-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/expansion-pack-plan-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/front-end-architecture-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/fullstack-architecture-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/market-research-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/project-brief-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/simple-project-prd-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/story-tmpl.md +0 -0
- /package/{.bmad-core → bmad-core}/templates/web-agent-startup-instructions-template.md +0 -0
- /package/{.bmad-core → bmad-core}/utils/template-format.md +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/analyst.txt +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/dev.txt +0 -0
- /package/{.bmad-core → bmad-core}/web-bundles/agents/sm.txt +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-fullstack.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-service.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/brownfield-ui.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-fullstack.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-service.yml +0 -0
- /package/{.bmad-core → bmad-core}/workflows/greenfield-ui.yml +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/agents/infra-devops-platform.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/checklists/infrastructure-checklist.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/create-doc.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/review-infrastructure.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/tasks/validate-infrastructure.md +0 -0
- /package/expansion-packs/{infrastructure-devops → bmad-infrastructure-devops}/templates/infrastructure-architecture-tmpl.md +0 -0
|
@@ -30,6 +30,43 @@ class ConfigLoader {
|
|
|
30
30
|
return config['available-agents'] || [];
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
+
async getAvailableExpansionPacks() {
|
|
34
|
+
const expansionPacksDir = path.join(this.getBmadCorePath(), '..', 'expansion-packs');
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const entries = await fs.readdir(expansionPacksDir, { withFileTypes: true });
|
|
38
|
+
const expansionPacks = [];
|
|
39
|
+
|
|
40
|
+
for (const entry of entries) {
|
|
41
|
+
if (entry.isDirectory()) {
|
|
42
|
+
const manifestPath = path.join(expansionPacksDir, entry.name, 'manifest.yml');
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
const manifestContent = await fs.readFile(manifestPath, 'utf8');
|
|
46
|
+
const manifest = yaml.load(manifestContent);
|
|
47
|
+
|
|
48
|
+
expansionPacks.push({
|
|
49
|
+
id: entry.name,
|
|
50
|
+
name: manifest.name || entry.name,
|
|
51
|
+
description: manifest.description || 'No description available',
|
|
52
|
+
version: manifest.version || '1.0.0',
|
|
53
|
+
author: manifest.author || 'Unknown',
|
|
54
|
+
manifestPath: manifestPath,
|
|
55
|
+
dependencies: manifest.dependencies || []
|
|
56
|
+
});
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.warn(`Failed to read manifest for expansion pack ${entry.name}: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return expansionPacks;
|
|
64
|
+
} catch (error) {
|
|
65
|
+
console.warn(`Failed to read expansion packs directory: ${error.message}`);
|
|
66
|
+
return [];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
33
70
|
async getAgentDependencies(agentId) {
|
|
34
71
|
// Use DependencyResolver to dynamically parse agent dependencies
|
|
35
72
|
const DependencyResolver = require('../../lib/dependency-resolver');
|
|
@@ -41,10 +78,7 @@ class ConfigLoader {
|
|
|
41
78
|
// Convert to flat list of file paths
|
|
42
79
|
const depPaths = [];
|
|
43
80
|
|
|
44
|
-
//
|
|
45
|
-
const config = await this.load();
|
|
46
|
-
const coreFiles = config['agent-dependencies']?.['core-files'] || [];
|
|
47
|
-
depPaths.push(...coreFiles);
|
|
81
|
+
// Core files and utilities are included automatically by DependencyResolver
|
|
48
82
|
|
|
49
83
|
// Add agent file itself is already handled by installer
|
|
50
84
|
|
|
@@ -77,13 +111,89 @@ class ConfigLoader {
|
|
|
77
111
|
}
|
|
78
112
|
|
|
79
113
|
getBmadCorePath() {
|
|
80
|
-
// Get the path to
|
|
81
|
-
return path.join(__dirname, '..', '..', '..', '
|
|
114
|
+
// Get the path to bmad-core relative to the installer (now under tools)
|
|
115
|
+
return path.join(__dirname, '..', '..', '..', 'bmad-core');
|
|
82
116
|
}
|
|
83
117
|
|
|
84
118
|
getAgentPath(agentId) {
|
|
85
119
|
return path.join(this.getBmadCorePath(), 'agents', `${agentId}.md`);
|
|
86
120
|
}
|
|
121
|
+
|
|
122
|
+
async getAvailableTeams() {
|
|
123
|
+
const teamsDir = path.join(this.getBmadCorePath(), 'agent-teams');
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
const entries = await fs.readdir(teamsDir, { withFileTypes: true });
|
|
127
|
+
const teams = [];
|
|
128
|
+
|
|
129
|
+
for (const entry of entries) {
|
|
130
|
+
if (entry.isFile() && entry.name.endsWith('.yml')) {
|
|
131
|
+
const teamPath = path.join(teamsDir, entry.name);
|
|
132
|
+
|
|
133
|
+
try {
|
|
134
|
+
const teamContent = await fs.readFile(teamPath, 'utf8');
|
|
135
|
+
const teamConfig = yaml.load(teamContent);
|
|
136
|
+
|
|
137
|
+
if (teamConfig.bundle) {
|
|
138
|
+
teams.push({
|
|
139
|
+
id: path.basename(entry.name, '.yml'),
|
|
140
|
+
name: teamConfig.bundle.name || entry.name,
|
|
141
|
+
description: teamConfig.bundle.description || 'Team configuration',
|
|
142
|
+
icon: teamConfig.bundle.icon || '📋'
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
} catch (error) {
|
|
146
|
+
console.warn(`Warning: Could not load team config ${entry.name}: ${error.message}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
return teams;
|
|
152
|
+
} catch (error) {
|
|
153
|
+
console.warn(`Warning: Could not scan teams directory: ${error.message}`);
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
getTeamPath(teamId) {
|
|
159
|
+
return path.join(this.getBmadCorePath(), 'agent-teams', `${teamId}.yml`);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
async getTeamDependencies(teamId) {
|
|
163
|
+
// Use DependencyResolver to dynamically parse team dependencies
|
|
164
|
+
const DependencyResolver = require('../../lib/dependency-resolver');
|
|
165
|
+
const resolver = new DependencyResolver(path.join(__dirname, '..', '..', '..'));
|
|
166
|
+
|
|
167
|
+
try {
|
|
168
|
+
const teamDeps = await resolver.resolveTeamDependencies(teamId);
|
|
169
|
+
|
|
170
|
+
// Convert to flat list of file paths
|
|
171
|
+
const depPaths = [];
|
|
172
|
+
|
|
173
|
+
// Add team config file
|
|
174
|
+
depPaths.push(`.bmad-core/agent-teams/${teamId}.yml`);
|
|
175
|
+
|
|
176
|
+
// Add all agents
|
|
177
|
+
for (const agent of teamDeps.agents) {
|
|
178
|
+
const filePath = `.bmad-core/agents/${agent.id}.md`;
|
|
179
|
+
if (!depPaths.includes(filePath)) {
|
|
180
|
+
depPaths.push(filePath);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Add all resolved resources
|
|
185
|
+
for (const resource of teamDeps.resources) {
|
|
186
|
+
const filePath = `.bmad-core/${resource.type}/${resource.id}.${resource.type === 'workflows' ? 'yml' : 'md'}`;
|
|
187
|
+
if (!depPaths.includes(filePath)) {
|
|
188
|
+
depPaths.push(filePath);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return depPaths;
|
|
193
|
+
} catch (error) {
|
|
194
|
+
throw new Error(`Failed to resolve team dependencies for ${teamId}: ${error.message}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
87
197
|
}
|
|
88
198
|
|
|
89
199
|
module.exports = new ConfigLoader();
|
|
@@ -220,11 +220,12 @@ class Installer {
|
|
|
220
220
|
const agentPath = configLoader.getAgentPath(config.agent);
|
|
221
221
|
const destAgentPath = path.join(
|
|
222
222
|
installDir,
|
|
223
|
+
".bmad-core",
|
|
223
224
|
"agents",
|
|
224
225
|
`${config.agent}.md`
|
|
225
226
|
);
|
|
226
227
|
await fileManager.copyFile(agentPath, destAgentPath);
|
|
227
|
-
files.push(
|
|
228
|
+
files.push(`.bmad-core/agents/${config.agent}.md`);
|
|
228
229
|
|
|
229
230
|
// Copy dependencies
|
|
230
231
|
const dependencies = await configLoader.getAgentDependencies(
|
|
@@ -240,9 +241,9 @@ class Installer {
|
|
|
240
241
|
const copiedFiles = await fileManager.copyGlobPattern(
|
|
241
242
|
dep.replace(".bmad-core/", ""),
|
|
242
243
|
sourceBase,
|
|
243
|
-
installDir
|
|
244
|
+
path.join(installDir, ".bmad-core")
|
|
244
245
|
);
|
|
245
|
-
files.push(...copiedFiles);
|
|
246
|
+
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
|
246
247
|
} else {
|
|
247
248
|
// Handle single files
|
|
248
249
|
const sourcePath = path.join(
|
|
@@ -251,16 +252,78 @@ class Installer {
|
|
|
251
252
|
);
|
|
252
253
|
const destPath = path.join(
|
|
253
254
|
installDir,
|
|
254
|
-
dep
|
|
255
|
+
dep
|
|
255
256
|
);
|
|
256
257
|
|
|
257
258
|
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
258
|
-
files.push(dep
|
|
259
|
+
files.push(dep);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
} else if (config.installType === "team") {
|
|
264
|
+
// Team installation
|
|
265
|
+
spinner.text = `Installing ${config.team} team...`;
|
|
266
|
+
|
|
267
|
+
// Get team dependencies
|
|
268
|
+
const teamDependencies = await configLoader.getTeamDependencies(config.team);
|
|
269
|
+
const sourceBase = configLoader.getBmadCorePath();
|
|
270
|
+
|
|
271
|
+
// Install all team dependencies
|
|
272
|
+
for (const dep of teamDependencies) {
|
|
273
|
+
spinner.text = `Copying team dependency: ${dep}`;
|
|
274
|
+
|
|
275
|
+
if (dep.includes("*")) {
|
|
276
|
+
// Handle glob patterns
|
|
277
|
+
const copiedFiles = await fileManager.copyGlobPattern(
|
|
278
|
+
dep.replace(".bmad-core/", ""),
|
|
279
|
+
sourceBase,
|
|
280
|
+
path.join(installDir, ".bmad-core")
|
|
281
|
+
);
|
|
282
|
+
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
|
283
|
+
} else {
|
|
284
|
+
// Handle single files
|
|
285
|
+
const sourcePath = path.join(sourceBase, dep.replace(".bmad-core/", ""));
|
|
286
|
+
const destPath = path.join(installDir, dep);
|
|
287
|
+
|
|
288
|
+
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
289
|
+
files.push(dep);
|
|
259
290
|
}
|
|
260
291
|
}
|
|
261
292
|
}
|
|
293
|
+
} else if (config.installType === "expansion-only") {
|
|
294
|
+
// Expansion-only installation - create minimal .bmad-core structure
|
|
295
|
+
spinner.text = "Creating minimal .bmad-core structure for expansion packs...";
|
|
296
|
+
|
|
297
|
+
const bmadCoreDestDir = path.join(installDir, ".bmad-core");
|
|
298
|
+
await fileManager.ensureDirectory(bmadCoreDestDir);
|
|
299
|
+
|
|
300
|
+
// Create basic directory structure
|
|
301
|
+
const dirs = ['agents', 'agent-teams', 'templates', 'tasks', 'checklists', 'workflows', 'data', 'utils', 'schemas'];
|
|
302
|
+
for (const dir of dirs) {
|
|
303
|
+
await fileManager.ensureDirectory(path.join(bmadCoreDestDir, dir));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// Copy minimal required files (schemas, utils, etc.)
|
|
307
|
+
const sourceBase = configLoader.getBmadCorePath();
|
|
308
|
+
const essentialFiles = [
|
|
309
|
+
'schemas/**/*',
|
|
310
|
+
'utils/**/*'
|
|
311
|
+
];
|
|
312
|
+
|
|
313
|
+
for (const pattern of essentialFiles) {
|
|
314
|
+
const copiedFiles = await fileManager.copyGlobPattern(
|
|
315
|
+
pattern,
|
|
316
|
+
sourceBase,
|
|
317
|
+
bmadCoreDestDir
|
|
318
|
+
);
|
|
319
|
+
files.push(...copiedFiles.map(f => `.bmad-core/${f}`));
|
|
320
|
+
}
|
|
262
321
|
}
|
|
263
322
|
|
|
323
|
+
// Install expansion packs if requested
|
|
324
|
+
const expansionFiles = await this.installExpansionPacks(installDir, config.expansionPacks, spinner);
|
|
325
|
+
files.push(...expansionFiles);
|
|
326
|
+
|
|
264
327
|
// Set up IDE integration if requested
|
|
265
328
|
const ides = config.ides || (config.ide ? [config.ide] : []);
|
|
266
329
|
if (ides.length > 0) {
|
|
@@ -505,6 +568,11 @@ class Installer {
|
|
|
505
568
|
console.log(chalk.bold("\n🎯 Installation Summary:"));
|
|
506
569
|
console.log(chalk.green("✓ .bmad-core framework installed with all agents and workflows"));
|
|
507
570
|
|
|
571
|
+
if (config.expansionPacks && config.expansionPacks.length > 0) {
|
|
572
|
+
const packNames = config.expansionPacks.join(", ");
|
|
573
|
+
console.log(chalk.green(`✓ Expansion packs installed: ${packNames}`));
|
|
574
|
+
}
|
|
575
|
+
|
|
508
576
|
if (ides.length > 0) {
|
|
509
577
|
const ideNames = ides.map(ide => {
|
|
510
578
|
const ideConfig = configLoader.getIdeConfiguration(ide);
|
|
@@ -569,6 +637,33 @@ class Installer {
|
|
|
569
637
|
);
|
|
570
638
|
}
|
|
571
639
|
|
|
640
|
+
async listExpansionPacks() {
|
|
641
|
+
// Initialize ES modules
|
|
642
|
+
await initializeModules();
|
|
643
|
+
const expansionPacks = await this.getAvailableExpansionPacks();
|
|
644
|
+
|
|
645
|
+
console.log(chalk.bold("\nAvailable BMAD Expansion Packs:\n"));
|
|
646
|
+
|
|
647
|
+
if (expansionPacks.length === 0) {
|
|
648
|
+
console.log(chalk.yellow("No expansion packs found."));
|
|
649
|
+
return;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
for (const pack of expansionPacks) {
|
|
653
|
+
console.log(chalk.cyan(` ${pack.id.padEnd(20)}`),
|
|
654
|
+
`${pack.name} v${pack.version}`);
|
|
655
|
+
console.log(chalk.dim(` ${' '.repeat(22)}${pack.description}`));
|
|
656
|
+
if (pack.author && pack.author !== 'Unknown') {
|
|
657
|
+
console.log(chalk.dim(` ${' '.repeat(22)}by ${pack.author}`));
|
|
658
|
+
}
|
|
659
|
+
console.log();
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
console.log(
|
|
663
|
+
chalk.dim("Install with: npx bmad-method install --full --expansion-packs <id>\n")
|
|
664
|
+
);
|
|
665
|
+
}
|
|
666
|
+
|
|
572
667
|
async showStatus() {
|
|
573
668
|
// Initialize ES modules
|
|
574
669
|
await initializeModules();
|
|
@@ -624,6 +719,100 @@ class Installer {
|
|
|
624
719
|
return configLoader.getAvailableAgents();
|
|
625
720
|
}
|
|
626
721
|
|
|
722
|
+
async getAvailableExpansionPacks() {
|
|
723
|
+
return configLoader.getAvailableExpansionPacks();
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
async getAvailableTeams() {
|
|
727
|
+
return configLoader.getAvailableTeams();
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
async installExpansionPacks(installDir, selectedPacks, spinner) {
|
|
731
|
+
if (!selectedPacks || selectedPacks.length === 0) {
|
|
732
|
+
return [];
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
const installedFiles = [];
|
|
736
|
+
const glob = require('glob');
|
|
737
|
+
|
|
738
|
+
for (const packId of selectedPacks) {
|
|
739
|
+
spinner.text = `Installing expansion pack: ${packId}...`;
|
|
740
|
+
|
|
741
|
+
try {
|
|
742
|
+
const expansionPacks = await this.getAvailableExpansionPacks();
|
|
743
|
+
const pack = expansionPacks.find(p => p.id === packId);
|
|
744
|
+
|
|
745
|
+
if (!pack) {
|
|
746
|
+
console.warn(`Expansion pack ${packId} not found, skipping...`);
|
|
747
|
+
continue;
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
const expansionPackDir = path.dirname(pack.manifestPath);
|
|
751
|
+
|
|
752
|
+
// Define the folders to copy from expansion packs to .bmad-core
|
|
753
|
+
const foldersToSync = [
|
|
754
|
+
'agents',
|
|
755
|
+
'agent-teams',
|
|
756
|
+
'templates',
|
|
757
|
+
'tasks',
|
|
758
|
+
'checklists',
|
|
759
|
+
'workflows',
|
|
760
|
+
'data',
|
|
761
|
+
'utils',
|
|
762
|
+
'schemas'
|
|
763
|
+
];
|
|
764
|
+
|
|
765
|
+
// Copy each folder if it exists
|
|
766
|
+
for (const folder of foldersToSync) {
|
|
767
|
+
const sourceFolder = path.join(expansionPackDir, folder);
|
|
768
|
+
|
|
769
|
+
// Check if folder exists in expansion pack
|
|
770
|
+
if (await fileManager.pathExists(sourceFolder)) {
|
|
771
|
+
// Get all files in this folder
|
|
772
|
+
const files = glob.sync('**/*', {
|
|
773
|
+
cwd: sourceFolder,
|
|
774
|
+
nodir: true
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
// Copy each file to the destination
|
|
778
|
+
for (const file of files) {
|
|
779
|
+
const sourcePath = path.join(sourceFolder, file);
|
|
780
|
+
const destPath = path.join(installDir, '.bmad-core', folder, file);
|
|
781
|
+
|
|
782
|
+
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
783
|
+
installedFiles.push(path.join('.bmad-core', folder, file));
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
// Also copy web-bundles if they exist (to a different location)
|
|
790
|
+
const webBundlesSource = path.join(expansionPackDir, 'web-bundles');
|
|
791
|
+
if (await fileManager.pathExists(webBundlesSource)) {
|
|
792
|
+
const files = glob.sync('**/*', {
|
|
793
|
+
cwd: webBundlesSource,
|
|
794
|
+
nodir: true
|
|
795
|
+
});
|
|
796
|
+
|
|
797
|
+
for (const file of files) {
|
|
798
|
+
const sourcePath = path.join(webBundlesSource, file);
|
|
799
|
+
const destPath = path.join(installDir, '.bmad-core', 'web-bundles', 'expansion-packs', packId, file);
|
|
800
|
+
|
|
801
|
+
if (await fileManager.copyFile(sourcePath, destPath)) {
|
|
802
|
+
installedFiles.push(path.join('.bmad-core', 'web-bundles', 'expansion-packs', packId, file));
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
console.log(chalk.green(`✓ Installed expansion pack: ${pack.name}`));
|
|
808
|
+
} catch (error) {
|
|
809
|
+
console.error(chalk.red(`Failed to install expansion pack ${packId}: ${error.message}`));
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
return installedFiles;
|
|
814
|
+
}
|
|
815
|
+
|
|
627
816
|
async findInstallation() {
|
|
628
817
|
// Look for .bmad-core in current directory or parent directories
|
|
629
818
|
let currentDir = process.cwd();
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmad-method",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.3.0",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "bmad-method",
|
|
9
|
-
"version": "4.0
|
|
9
|
+
"version": "4.3.0",
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"chalk": "^5.4.1",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"bmad-method": "bin/bmad.js"
|
|
22
22
|
},
|
|
23
23
|
"engines": {
|
|
24
|
-
"node": ">=
|
|
24
|
+
"node": ">=20.0.0"
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
"node_modules/@inquirer/checkbox": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bmad-method",
|
|
3
|
-
"version": "4.4.
|
|
3
|
+
"version": "4.4.2",
|
|
4
4
|
"description": "BMAD Method installer - AI-powered Agile development framework",
|
|
5
5
|
"main": "lib/installer.js",
|
|
6
6
|
"bin": {
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"ora": "^8.2.0"
|
|
31
31
|
},
|
|
32
32
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
33
|
+
"node": ">=20.0.0"
|
|
34
34
|
},
|
|
35
35
|
"repository": {
|
|
36
36
|
"type": "git",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
bundle:
|
|
2
|
-
name: Team Fullstack
|
|
3
|
-
icon: 🚀
|
|
4
|
-
description: >-
|
|
5
|
-
Comprehensive full-stack development team capable of handling both greenfield
|
|
6
|
-
application development and brownfield enhancement projects. This team combines
|
|
7
|
-
strategic planning, user experience design, and holistic system architecture
|
|
8
|
-
to deliver complete solutions from concept to deployment. Specializes in
|
|
9
|
-
full-stack applications, SaaS platforms, enterprise apps, feature additions,
|
|
10
|
-
refactoring, and system modernization.
|
|
11
|
-
|
|
12
|
-
agents:
|
|
13
|
-
- bmad-orchestrator
|
|
14
|
-
- analyst
|
|
15
|
-
- pm
|
|
16
|
-
- ux-expert
|
|
17
|
-
- architect
|
|
18
|
-
- po
|
|
19
|
-
|
|
20
|
-
workflows:
|
|
21
|
-
- brownfield-fullstack
|
|
22
|
-
- brownfield-service
|
|
23
|
-
- brownfield-ui
|
|
24
|
-
- greenfield-fullstack
|
|
25
|
-
- greenfield-service
|
|
26
|
-
- greenfield-ui
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# bmad
|
|
2
|
-
|
|
3
|
-
CRITICAL: Read the full YML to understand your operating params, start activation to alter your state of being, follow startup instructions, stay in this being until told to exit this mode:
|
|
4
|
-
|
|
5
|
-
```yaml
|
|
6
|
-
agent:
|
|
7
|
-
name: BMad Orchestrator
|
|
8
|
-
id: bmad-orchestrator
|
|
9
|
-
title: BMAD Master Orchestrator
|
|
10
|
-
icon: 🎭
|
|
11
|
-
whenToUse: Use for workflow coordination, multi-agent tasks, role switching guidance, and when unsure which specialist to consult
|
|
12
|
-
persona:
|
|
13
|
-
role: Master Orchestrator & BMAD Method Expert
|
|
14
|
-
style: Knowledgeable, guiding, adaptable, efficient, encouraging, technically brilliant yet approachable. Helps customize and use BMAD Method while orchestrating agents
|
|
15
|
-
identity: Unified interface to all BMAD-METHOD capabilities, dynamically transforms into any specialized agent
|
|
16
|
-
focus: Orchestrating the right agent/capability for each need, loading resources only when needed
|
|
17
|
-
core_principles:
|
|
18
|
-
- Become any agent on demand, loading files only when needed
|
|
19
|
-
- Never pre-load resources - discover and load at runtime
|
|
20
|
-
- Assess needs and recommend best approach/agent/workflow
|
|
21
|
-
- Track current state and guide to next logical steps
|
|
22
|
-
- When embodied, specialized persona's principles take precedence
|
|
23
|
-
- Be explicit about active persona and current task
|
|
24
|
-
- Always use numbered lists for choices
|
|
25
|
-
- Process (*) commands immediately
|
|
26
|
-
startup:
|
|
27
|
-
- Announce: Hey! I'm BMad, your BMAD-METHOD orchestrator. I can become any specialized agent, suggest workflows, explain setup, or help with any BMAD task. Type *help for options.
|
|
28
|
-
- Assess user goal, suggest agent transformation if match, offer numbered options if generic
|
|
29
|
-
- Load resources only when needed
|
|
30
|
-
commands:
|
|
31
|
-
- '*help" - Show commands/workflows/agents'
|
|
32
|
-
- '*chat-mode" - Conversational mode with advanced-elicitation'
|
|
33
|
-
- '*kb-mode" - Load knowledge base for full BMAD help'
|
|
34
|
-
- '*status" - Show current context/agent/progress'
|
|
35
|
-
- '*agent {name}" - Transform into agent (list if unspecified)'
|
|
36
|
-
- '*exit" - Return to BMad or exit (confirm if exiting BMad)'
|
|
37
|
-
- '*task {name}" - Run task (list if unspecified)'
|
|
38
|
-
- '*workflow {type}" - Start/list workflows'
|
|
39
|
-
- '*checklist {name}" - Execute checklist (list if unspecified)'
|
|
40
|
-
- '*yolo" - Toggle skip confirmations'
|
|
41
|
-
- '*party-mode" - Group chat with all agents'
|
|
42
|
-
- '*doc-out" - Output full document'
|
|
43
|
-
fuzzy-matching:
|
|
44
|
-
- 85% confidence threshold
|
|
45
|
-
- Show numbered list if unsure
|
|
46
|
-
transformation:
|
|
47
|
-
- Match name/role to agents
|
|
48
|
-
- Announce transformation
|
|
49
|
-
- Operate until exit
|
|
50
|
-
loading:
|
|
51
|
-
- KB: Only for *kb-mode or BMAD questions
|
|
52
|
-
- Agents: Only when transforming
|
|
53
|
-
- "Templates/Tasks: Only when executing"
|
|
54
|
-
- Always indicate loading
|
|
55
|
-
workflow:
|
|
56
|
-
- Ask project type (greenfield/brownfield)
|
|
57
|
-
- Ask scope (UI/service/fullstack/other)
|
|
58
|
-
- Recommend workflow, guide through stages
|
|
59
|
-
- Explain web context management if needed
|
|
60
|
-
dependencies:
|
|
61
|
-
tasks:
|
|
62
|
-
- advanced-elicitation
|
|
63
|
-
- create-doc
|
|
64
|
-
data:
|
|
65
|
-
- bmad-kb
|
|
66
|
-
utils:
|
|
67
|
-
- workflow-management
|
|
68
|
-
- template-format
|
|
69
|
-
```
|