bmad-method 4.37.0-beta.2 → 4.37.0-beta.4

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 (206) hide show
  1. package/README.md +3 -214
  2. package/package.json +26 -63
  3. package/.github/FUNDING.yaml +0 -15
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +0 -22
  6. package/.github/workflows/discord.yaml +0 -16
  7. package/.github/workflows/release.yaml +0 -60
  8. package/.releaserc.json +0 -21
  9. package/.vscode/settings.json +0 -44
  10. package/CHANGELOG.md +0 -689
  11. package/CONTRIBUTING.md +0 -209
  12. package/LICENSE +0 -21
  13. package/bmad-core/agent-teams/team-all.yaml +0 -14
  14. package/bmad-core/agent-teams/team-fullstack.yaml +0 -18
  15. package/bmad-core/agent-teams/team-ide-minimal.yaml +0 -10
  16. package/bmad-core/agent-teams/team-no-ui.yaml +0 -13
  17. package/bmad-core/agents/analyst.md +0 -81
  18. package/bmad-core/agents/architect.md +0 -84
  19. package/bmad-core/agents/bmad-master.md +0 -108
  20. package/bmad-core/agents/bmad-orchestrator.md +0 -150
  21. package/bmad-core/agents/dev.md +0 -76
  22. package/bmad-core/agents/pm.md +0 -81
  23. package/bmad-core/agents/po.md +0 -76
  24. package/bmad-core/agents/qa.md +0 -69
  25. package/bmad-core/agents/sm.md +0 -62
  26. package/bmad-core/agents/ux-expert.md +0 -66
  27. package/bmad-core/checklists/architect-checklist.md +0 -443
  28. package/bmad-core/checklists/change-checklist.md +0 -182
  29. package/bmad-core/checklists/pm-checklist.md +0 -375
  30. package/bmad-core/checklists/po-master-checklist.md +0 -441
  31. package/bmad-core/checklists/story-dod-checklist.md +0 -101
  32. package/bmad-core/checklists/story-draft-checklist.md +0 -156
  33. package/bmad-core/core-config.yaml +0 -20
  34. package/bmad-core/data/bmad-kb.md +0 -803
  35. package/bmad-core/data/brainstorming-techniques.md +0 -36
  36. package/bmad-core/data/elicitation-methods.md +0 -134
  37. package/bmad-core/data/technical-preferences.md +0 -3
  38. package/bmad-core/tasks/advanced-elicitation.md +0 -117
  39. package/bmad-core/tasks/brownfield-create-epic.md +0 -160
  40. package/bmad-core/tasks/brownfield-create-story.md +0 -147
  41. package/bmad-core/tasks/correct-course.md +0 -70
  42. package/bmad-core/tasks/create-brownfield-story.md +0 -304
  43. package/bmad-core/tasks/create-deep-research-prompt.md +0 -289
  44. package/bmad-core/tasks/create-next-story.md +0 -112
  45. package/bmad-core/tasks/document-project.md +0 -341
  46. package/bmad-core/tasks/facilitate-brainstorming-session.md +0 -136
  47. package/bmad-core/tasks/generate-ai-frontend-prompt.md +0 -51
  48. package/bmad-core/tasks/index-docs.md +0 -179
  49. package/bmad-core/tasks/kb-mode-interaction.md +0 -75
  50. package/bmad-core/tasks/review-story.md +0 -145
  51. package/bmad-core/tasks/shard-doc.md +0 -187
  52. package/bmad-core/tasks/validate-next-story.md +0 -134
  53. package/bmad-core/templates/architecture-tmpl.yaml +0 -650
  54. package/bmad-core/templates/brainstorming-output-tmpl.yaml +0 -156
  55. package/bmad-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  56. package/bmad-core/templates/brownfield-prd-tmpl.yaml +0 -280
  57. package/bmad-core/templates/competitor-analysis-tmpl.yaml +0 -293
  58. package/bmad-core/templates/front-end-architecture-tmpl.yaml +0 -206
  59. package/bmad-core/templates/front-end-spec-tmpl.yaml +0 -349
  60. package/bmad-core/templates/fullstack-architecture-tmpl.yaml +0 -805
  61. package/bmad-core/templates/market-research-tmpl.yaml +0 -252
  62. package/bmad-core/templates/prd-tmpl.yaml +0 -202
  63. package/bmad-core/templates/project-brief-tmpl.yaml +0 -221
  64. package/bmad-core/templates/story-tmpl.yaml +0 -137
  65. package/bmad-core/workflows/brownfield-fullstack.yaml +0 -297
  66. package/bmad-core/workflows/brownfield-service.yaml +0 -187
  67. package/bmad-core/workflows/brownfield-ui.yaml +0 -197
  68. package/bmad-core/workflows/greenfield-fullstack.yaml +0 -240
  69. package/bmad-core/workflows/greenfield-service.yaml +0 -206
  70. package/bmad-core/workflows/greenfield-ui.yaml +0 -235
  71. package/common/tasks/create-doc.md +0 -101
  72. package/common/tasks/execute-checklist.md +0 -93
  73. package/common/utils/bmad-doc-template.md +0 -325
  74. package/common/utils/workflow-management.md +0 -69
  75. package/dist/agents/analyst.txt +0 -2882
  76. package/dist/agents/architect.txt +0 -3543
  77. package/dist/agents/bmad-master.txt +0 -8756
  78. package/dist/agents/bmad-orchestrator.txt +0 -1490
  79. package/dist/agents/dev.txt +0 -428
  80. package/dist/agents/pm.txt +0 -2229
  81. package/dist/agents/po.txt +0 -1364
  82. package/dist/agents/qa.txt +0 -386
  83. package/dist/agents/sm.txt +0 -668
  84. package/dist/agents/ux-expert.txt +0 -701
  85. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.txt +0 -2408
  86. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.txt +0 -1631
  87. package/dist/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.txt +0 -822
  88. package/dist/expansion-packs/bmad-2d-phaser-game-dev/teams/phaser-2d-nodejs-game-team.txt +0 -10989
  89. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.txt +0 -4047
  90. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.txt +0 -3744
  91. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.txt +0 -465
  92. package/dist/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.txt +0 -990
  93. package/dist/expansion-packs/bmad-2d-unity-game-dev/teams/unity-2d-game-team.txt +0 -15467
  94. package/dist/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.txt +0 -2077
  95. package/dist/teams/team-all.txt +0 -11062
  96. package/dist/teams/team-fullstack.txt +0 -10392
  97. package/dist/teams/team-ide-minimal.txt +0 -3507
  98. package/dist/teams/team-no-ui.txt +0 -8951
  99. package/docs/GUIDING-PRINCIPLES.md +0 -91
  100. package/docs/core-architecture.md +0 -219
  101. package/docs/enhanced-ide-development-workflow.md +0 -43
  102. package/docs/expansion-packs.md +0 -280
  103. package/docs/how-to-contribute-with-pull-requests.md +0 -158
  104. package/docs/user-guide.md +0 -251
  105. package/docs/versioning-and-releases.md +0 -77
  106. package/docs/versions.md +0 -48
  107. package/docs/working-in-the-brownfield.md +0 -364
  108. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/Complete AI Agent System - Flowchart.svg +0 -102
  109. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash copy.txt +0 -13
  110. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.1 Google Cloud Project Setup/1.1.1 - Initial Project Configuration - bash.txt +0 -13
  111. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.2 Agent Development Kit Installation/1.2.2 - Basic Project Structure - txt.txt +0 -25
  112. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.1 - settings.py +0 -34
  113. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.3 Core Configuration Files/1.3.2 - main.py - Base Application.py +0 -70
  114. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/PART 1 - Google Cloud Vertex AI Setup Documentation/1.4 Deployment Configuration/1.4.2 - cloudbuild.yaml +0 -26
  115. package/expansion-packs/Complete AI Agent System - Blank Templates & Google Cloud Setup/README.md +0 -109
  116. package/expansion-packs/README.md +0 -3
  117. package/expansion-packs/bmad-2d-phaser-game-dev/agent-teams/phaser-2d-nodejs-game-team.yaml +0 -13
  118. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-designer.md +0 -71
  119. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-developer.md +0 -78
  120. package/expansion-packs/bmad-2d-phaser-game-dev/agents/game-sm.md +0 -64
  121. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-design-checklist.md +0 -201
  122. package/expansion-packs/bmad-2d-phaser-game-dev/checklists/game-story-dod-checklist.md +0 -160
  123. package/expansion-packs/bmad-2d-phaser-game-dev/config.yaml +0 -8
  124. package/expansion-packs/bmad-2d-phaser-game-dev/data/bmad-kb.md +0 -254
  125. package/expansion-packs/bmad-2d-phaser-game-dev/data/development-guidelines.md +0 -651
  126. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/advanced-elicitation.md +0 -111
  127. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/create-game-story.md +0 -216
  128. package/expansion-packs/bmad-2d-phaser-game-dev/tasks/game-design-brainstorming.md +0 -308
  129. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-architecture-tmpl.yaml +0 -613
  130. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-brief-tmpl.yaml +0 -356
  131. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-design-doc-tmpl.yaml +0 -343
  132. package/expansion-packs/bmad-2d-phaser-game-dev/templates/game-story-tmpl.yaml +0 -253
  133. package/expansion-packs/bmad-2d-phaser-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  134. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  135. package/expansion-packs/bmad-2d-phaser-game-dev/workflows/game-prototype.yaml +0 -175
  136. package/expansion-packs/bmad-2d-unity-game-dev/agent-teams/unity-2d-game-team.yaml +0 -14
  137. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-architect.md +0 -80
  138. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-designer.md +0 -77
  139. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-developer.md +0 -78
  140. package/expansion-packs/bmad-2d-unity-game-dev/agents/game-sm.md +0 -65
  141. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-architect-checklist.md +0 -396
  142. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-change-checklist.md +0 -203
  143. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-design-checklist.md +0 -201
  144. package/expansion-packs/bmad-2d-unity-game-dev/checklists/game-story-dod-checklist.md +0 -132
  145. package/expansion-packs/bmad-2d-unity-game-dev/config.yaml +0 -6
  146. package/expansion-packs/bmad-2d-unity-game-dev/data/bmad-kb.md +0 -776
  147. package/expansion-packs/bmad-2d-unity-game-dev/data/development-guidelines.md +0 -590
  148. package/expansion-packs/bmad-2d-unity-game-dev/tasks/advanced-elicitation.md +0 -111
  149. package/expansion-packs/bmad-2d-unity-game-dev/tasks/correct-course-game.md +0 -151
  150. package/expansion-packs/bmad-2d-unity-game-dev/tasks/create-game-story.md +0 -184
  151. package/expansion-packs/bmad-2d-unity-game-dev/tasks/game-design-brainstorming.md +0 -308
  152. package/expansion-packs/bmad-2d-unity-game-dev/tasks/validate-game-story.md +0 -200
  153. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-architecture-tmpl.yaml +0 -1030
  154. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-brief-tmpl.yaml +0 -356
  155. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-design-doc-tmpl.yaml +0 -705
  156. package/expansion-packs/bmad-2d-unity-game-dev/templates/game-story-tmpl.yaml +0 -256
  157. package/expansion-packs/bmad-2d-unity-game-dev/templates/level-design-doc-tmpl.yaml +0 -484
  158. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-dev-greenfield.yaml +0 -183
  159. package/expansion-packs/bmad-2d-unity-game-dev/workflows/game-prototype.yaml +0 -175
  160. package/expansion-packs/bmad-infrastructure-devops/README.md +0 -147
  161. package/expansion-packs/bmad-infrastructure-devops/agents/infra-devops-platform.md +0 -71
  162. package/expansion-packs/bmad-infrastructure-devops/checklists/infrastructure-checklist.md +0 -484
  163. package/expansion-packs/bmad-infrastructure-devops/config.yaml +0 -9
  164. package/expansion-packs/bmad-infrastructure-devops/data/bmad-kb.md +0 -308
  165. package/expansion-packs/bmad-infrastructure-devops/tasks/review-infrastructure.md +0 -160
  166. package/expansion-packs/bmad-infrastructure-devops/tasks/validate-infrastructure.md +0 -154
  167. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-architecture-tmpl.yaml +0 -424
  168. package/expansion-packs/bmad-infrastructure-devops/templates/infrastructure-platform-from-arch-tmpl.yaml +0 -629
  169. package/tools/bmad-npx-wrapper.js +0 -39
  170. package/tools/builders/web-builder.js +0 -681
  171. package/tools/bump-all-versions.js +0 -106
  172. package/tools/bump-expansion-version.js +0 -83
  173. package/tools/cli.js +0 -154
  174. package/tools/flattener/aggregate.js +0 -76
  175. package/tools/flattener/binary.js +0 -53
  176. package/tools/flattener/discovery.js +0 -70
  177. package/tools/flattener/files.js +0 -35
  178. package/tools/flattener/ignoreRules.js +0 -176
  179. package/tools/flattener/main.js +0 -217
  180. package/tools/flattener/projectRoot.js +0 -45
  181. package/tools/flattener/prompts.js +0 -44
  182. package/tools/flattener/stats.js +0 -30
  183. package/tools/flattener/xml.js +0 -86
  184. package/tools/installer/README.md +0 -8
  185. package/tools/installer/package.json +0 -44
  186. package/tools/lib/dependency-resolver.js +0 -179
  187. package/tools/lib/yaml-utils.js +0 -29
  188. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  189. package/tools/semantic-release-sync-installer.js +0 -30
  190. package/tools/shared/bannerArt.js +0 -105
  191. package/tools/sync-installer-version.js +0 -34
  192. package/tools/update-expansion-version.js +0 -54
  193. package/tools/upgraders/v3-to-v4-upgrader.js +0 -763
  194. package/tools/version-bump.js +0 -79
  195. package/tools/yaml-format.js +0 -240
  196. /package/{tools/installer/bin → bin}/bmad.js +0 -0
  197. /package/{tools/installer/config → config}/ide-agent-config.yaml +0 -0
  198. /package/{tools/installer/config → config}/install.config.yaml +0 -0
  199. /package/{tools/installer/lib → lib}/config-loader.js +0 -0
  200. /package/{tools/installer/lib → lib}/file-manager.js +0 -0
  201. /package/{tools/installer/lib → lib}/ide-base-setup.js +0 -0
  202. /package/{tools/installer/lib → lib}/ide-setup.js +0 -0
  203. /package/{tools/installer/lib → lib}/installer.js +0 -0
  204. /package/{tools/installer/lib → lib}/memory-profiler.js +0 -0
  205. /package/{tools/installer/lib → lib}/module-manager.js +0 -0
  206. /package/{tools/installer/lib → lib}/resource-locator.js +0 -0
@@ -1,681 +0,0 @@
1
- const fs = require("node:fs").promises;
2
- const path = require("node:path");
3
- const DependencyResolver = require("../lib/dependency-resolver");
4
- const yamlUtils = require("../lib/yaml-utils");
5
-
6
- class WebBuilder {
7
- constructor(options = {}) {
8
- this.rootDir = options.rootDir || process.cwd();
9
- this.outputDirs = options.outputDirs || [path.join(this.rootDir, "dist")];
10
- this.resolver = new DependencyResolver(this.rootDir);
11
- this.templatePath = path.join(
12
- this.rootDir,
13
- "tools",
14
- "md-assets",
15
- "web-agent-startup-instructions.md"
16
- );
17
- }
18
-
19
- parseYaml(content) {
20
- const yaml = require("js-yaml");
21
- return yaml.load(content);
22
- }
23
-
24
- convertToWebPath(filePath, bundleRoot = 'bmad-core') {
25
- // Convert absolute paths to web bundle paths with dot prefix
26
- // All resources get installed under the bundle root, so use that path
27
- const relativePath = path.relative(this.rootDir, filePath);
28
- const pathParts = relativePath.split(path.sep);
29
-
30
- let resourcePath;
31
- if (pathParts[0] === 'expansion-packs') {
32
- // For expansion packs, remove 'expansion-packs/packname' and use the rest
33
- resourcePath = pathParts.slice(2).join('/');
34
- } else {
35
- // For bmad-core, common, etc., remove the first part
36
- resourcePath = pathParts.slice(1).join('/');
37
- }
38
-
39
- return `.${bundleRoot}/${resourcePath}`;
40
- }
41
-
42
- generateWebInstructions(bundleType, packName = null) {
43
- // Generate dynamic web instructions based on bundle type
44
- const rootExample = packName ? `.${packName}` : '.bmad-core';
45
- const examplePath = packName ? `.${packName}/folder/filename.md` : '.bmad-core/folder/filename.md';
46
- const personasExample = packName ? `.${packName}/personas/analyst.md` : '.bmad-core/personas/analyst.md';
47
- const tasksExample = packName ? `.${packName}/tasks/create-story.md` : '.bmad-core/tasks/create-story.md';
48
- const utilsExample = packName ? `.${packName}/utils/template-format.md` : '.bmad-core/utils/template-format.md';
49
- const tasksRef = packName ? `.${packName}/tasks/create-story.md` : '.bmad-core/tasks/create-story.md';
50
-
51
- return `# Web Agent Bundle Instructions
52
-
53
- You are now operating as a specialized AI agent from the BMad-Method framework. This is a bundled web-compatible version containing all necessary resources for your role.
54
-
55
- ## Important Instructions
56
-
57
- 1. **Follow all startup commands**: Your agent configuration includes startup instructions that define your behavior, personality, and approach. These MUST be followed exactly.
58
-
59
- 2. **Resource Navigation**: This bundle contains all resources you need. Resources are marked with tags like:
60
-
61
- - \`==================== START: ${examplePath} ====================\`
62
- - \`==================== END: ${examplePath} ====================\`
63
-
64
- When you need to reference a resource mentioned in your instructions:
65
-
66
- - Look for the corresponding START/END tags
67
- - The format is always the full path with dot prefix (e.g., \`${personasExample}\`, \`${tasksExample}\`)
68
- - If a section is specified (e.g., \`{root}/tasks/create-story.md#section-name\`), navigate to that section within the file
69
-
70
- **Understanding YAML References**: In the agent configuration, resources are referenced in the dependencies section. For example:
71
-
72
- \`\`\`yaml
73
- dependencies:
74
- utils:
75
- - template-format
76
- tasks:
77
- - create-story
78
- \`\`\`
79
-
80
- These references map directly to bundle sections:
81
-
82
- - \`utils: template-format\` → Look for \`==================== START: ${utilsExample} ====================\`
83
- - \`tasks: create-story\` → Look for \`==================== START: ${tasksRef} ====================\`
84
-
85
- 3. **Execution Context**: You are operating in a web environment. All your capabilities and knowledge are contained within this bundle. Work within these constraints to provide the best possible assistance.
86
-
87
- 4. **Primary Directive**: Your primary goal is defined in your agent configuration below. Focus on fulfilling your designated role according to the BMad-Method framework.
88
-
89
- ---
90
-
91
- `;
92
- }
93
-
94
- async cleanOutputDirs() {
95
- for (const dir of this.outputDirs) {
96
- try {
97
- await fs.rm(dir, { recursive: true, force: true });
98
- console.log(`Cleaned: ${path.relative(this.rootDir, dir)}`);
99
- } catch (error) {
100
- console.debug(`Failed to clean directory ${dir}:`, error.message);
101
- // Directory might not exist, that's fine
102
- }
103
- }
104
- }
105
-
106
- async buildAgents() {
107
- const agents = await this.resolver.listAgents();
108
-
109
- for (const agentId of agents) {
110
- console.log(` Building agent: ${agentId}`);
111
- const bundle = await this.buildAgentBundle(agentId);
112
-
113
- // Write to all output directories
114
- for (const outputDir of this.outputDirs) {
115
- const outputPath = path.join(outputDir, "agents");
116
- await fs.mkdir(outputPath, { recursive: true });
117
- const outputFile = path.join(outputPath, `${agentId}.txt`);
118
- await fs.writeFile(outputFile, bundle, "utf8");
119
- }
120
- }
121
-
122
- console.log(`Built ${agents.length} agent bundles in ${this.outputDirs.length} locations`);
123
- }
124
-
125
- async buildTeams() {
126
- const teams = await this.resolver.listTeams();
127
-
128
- for (const teamId of teams) {
129
- console.log(` Building team: ${teamId}`);
130
- const bundle = await this.buildTeamBundle(teamId);
131
-
132
- // Write to all output directories
133
- for (const outputDir of this.outputDirs) {
134
- const outputPath = path.join(outputDir, "teams");
135
- await fs.mkdir(outputPath, { recursive: true });
136
- const outputFile = path.join(outputPath, `${teamId}.txt`);
137
- await fs.writeFile(outputFile, bundle, "utf8");
138
- }
139
- }
140
-
141
- console.log(`Built ${teams.length} team bundles in ${this.outputDirs.length} locations`);
142
- }
143
-
144
- async buildAgentBundle(agentId) {
145
- const dependencies = await this.resolver.resolveAgentDependencies(agentId);
146
- const template = this.generateWebInstructions('agent');
147
-
148
- const sections = [template];
149
-
150
- // Add agent configuration
151
- const agentPath = this.convertToWebPath(dependencies.agent.path, 'bmad-core');
152
- sections.push(this.formatSection(agentPath, dependencies.agent.content, 'bmad-core'));
153
-
154
- // Add all dependencies
155
- for (const resource of dependencies.resources) {
156
- const resourcePath = this.convertToWebPath(resource.path, 'bmad-core');
157
- sections.push(this.formatSection(resourcePath, resource.content, 'bmad-core'));
158
- }
159
-
160
- return sections.join("\n");
161
- }
162
-
163
- async buildTeamBundle(teamId) {
164
- const dependencies = await this.resolver.resolveTeamDependencies(teamId);
165
- const template = this.generateWebInstructions('team');
166
-
167
- const sections = [template];
168
-
169
- // Add team configuration
170
- const teamPath = this.convertToWebPath(dependencies.team.path, 'bmad-core');
171
- sections.push(this.formatSection(teamPath, dependencies.team.content, 'bmad-core'));
172
-
173
- // Add all agents
174
- for (const agent of dependencies.agents) {
175
- const agentPath = this.convertToWebPath(agent.path, 'bmad-core');
176
- sections.push(this.formatSection(agentPath, agent.content, 'bmad-core'));
177
- }
178
-
179
- // Add all deduplicated resources
180
- for (const resource of dependencies.resources) {
181
- const resourcePath = this.convertToWebPath(resource.path, 'bmad-core');
182
- sections.push(this.formatSection(resourcePath, resource.content, 'bmad-core'));
183
- }
184
-
185
- return sections.join("\n");
186
- }
187
-
188
- processAgentContent(content) {
189
- // First, replace content before YAML with the template
190
- const yamlContent = yamlUtils.extractYamlFromAgent(content);
191
- if (!yamlContent) return content;
192
-
193
- const yamlMatch = content.match(/```ya?ml\n([\s\S]*?)\n```/);
194
- if (!yamlMatch) return content;
195
-
196
- const yamlStartIndex = content.indexOf(yamlMatch[0]);
197
- const yamlEndIndex = yamlStartIndex + yamlMatch[0].length;
198
-
199
- // Parse YAML and remove root and IDE-FILE-RESOLUTION properties
200
- try {
201
- const yaml = require("js-yaml");
202
- const parsed = yaml.load(yamlContent);
203
-
204
- // Remove the properties if they exist at root level
205
- delete parsed.root;
206
- delete parsed["IDE-FILE-RESOLUTION"];
207
- delete parsed["REQUEST-RESOLUTION"];
208
-
209
- // Also remove from activation-instructions if they exist
210
- if (parsed["activation-instructions"] && Array.isArray(parsed["activation-instructions"])) {
211
- parsed["activation-instructions"] = parsed["activation-instructions"].filter(
212
- (instruction) => {
213
- return (
214
- typeof instruction === 'string' &&
215
- !instruction.startsWith("IDE-FILE-RESOLUTION:") &&
216
- !instruction.startsWith("REQUEST-RESOLUTION:")
217
- );
218
- }
219
- );
220
- }
221
-
222
- // Reconstruct the YAML
223
- const cleanedYaml = yaml.dump(parsed, { lineWidth: -1 });
224
-
225
- // Get the agent name from the YAML for the header
226
- const agentName = parsed.agent?.id || "agent";
227
-
228
- // Build the new content with just the agent header and YAML
229
- const newHeader = `# ${agentName}\n\nCRITICAL: 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`;
230
- const afterYaml = content.substring(yamlEndIndex);
231
-
232
- return newHeader + "```yaml\n" + cleanedYaml.trim() + "\n```" + afterYaml;
233
- } catch (error) {
234
- console.warn("Failed to process agent YAML:", error.message);
235
- // If parsing fails, return original content
236
- return content;
237
- }
238
- }
239
-
240
- formatSection(path, content, bundleRoot = 'bmad-core') {
241
- const separator = "====================";
242
-
243
- // Process agent content if this is an agent file
244
- if (path.includes("/agents/")) {
245
- content = this.processAgentContent(content);
246
- }
247
-
248
- // Replace {root} references with the actual bundle root
249
- content = this.replaceRootReferences(content, bundleRoot);
250
-
251
- return [
252
- `${separator} START: ${path} ${separator}`,
253
- content.trim(),
254
- `${separator} END: ${path} ${separator}`,
255
- "",
256
- ].join("\n");
257
- }
258
-
259
- replaceRootReferences(content, bundleRoot) {
260
- // Replace {root} with the appropriate bundle root path
261
- return content.replace(/\{root\}/g, `.${bundleRoot}`);
262
- }
263
-
264
- async validate() {
265
- console.log("Validating agent configurations...");
266
- const agents = await this.resolver.listAgents();
267
- for (const agentId of agents) {
268
- try {
269
- await this.resolver.resolveAgentDependencies(agentId);
270
- console.log(` ✓ ${agentId}`);
271
- } catch (error) {
272
- console.log(` ✗ ${agentId}: ${error.message}`);
273
- throw error;
274
- }
275
- }
276
-
277
- console.log("\nValidating team configurations...");
278
- const teams = await this.resolver.listTeams();
279
- for (const teamId of teams) {
280
- try {
281
- await this.resolver.resolveTeamDependencies(teamId);
282
- console.log(` ✓ ${teamId}`);
283
- } catch (error) {
284
- console.log(` ✗ ${teamId}: ${error.message}`);
285
- throw error;
286
- }
287
- }
288
- }
289
-
290
- async buildAllExpansionPacks(options = {}) {
291
- const expansionPacks = await this.listExpansionPacks();
292
-
293
- for (const packName of expansionPacks) {
294
- console.log(` Building expansion pack: ${packName}`);
295
- await this.buildExpansionPack(packName, options);
296
- }
297
-
298
- console.log(`Built ${expansionPacks.length} expansion pack bundles`);
299
- }
300
-
301
- async buildExpansionPack(packName, options = {}) {
302
- const packDir = path.join(this.rootDir, "expansion-packs", packName);
303
- const outputDirs = [path.join(this.rootDir, "dist", "expansion-packs", packName)];
304
-
305
- // Clean output directories if requested
306
- if (options.clean !== false) {
307
- for (const outputDir of outputDirs) {
308
- try {
309
- await fs.rm(outputDir, { recursive: true, force: true });
310
- } catch (error) {
311
- // Directory might not exist, that's fine
312
- }
313
- }
314
- }
315
-
316
- // Build individual agents first
317
- const agentsDir = path.join(packDir, "agents");
318
- try {
319
- const agentFiles = await fs.readdir(agentsDir);
320
- const agentMarkdownFiles = agentFiles.filter((f) => f.endsWith(".md"));
321
-
322
- if (agentMarkdownFiles.length > 0) {
323
- console.log(` Building individual agents for ${packName}:`);
324
-
325
- for (const agentFile of agentMarkdownFiles) {
326
- const agentName = agentFile.replace(".md", "");
327
- console.log(` - ${agentName}`);
328
-
329
- // Build individual agent bundle
330
- const bundle = await this.buildExpansionAgentBundle(packName, packDir, agentName);
331
-
332
- // Write to all output directories
333
- for (const outputDir of outputDirs) {
334
- const agentsOutputDir = path.join(outputDir, "agents");
335
- await fs.mkdir(agentsOutputDir, { recursive: true });
336
- const outputFile = path.join(agentsOutputDir, `${agentName}.txt`);
337
- await fs.writeFile(outputFile, bundle, "utf8");
338
- }
339
- }
340
- }
341
- } catch (error) {
342
- console.debug(` No agents directory found for ${packName}`);
343
- }
344
-
345
- // Build team bundle
346
- const agentTeamsDir = path.join(packDir, "agent-teams");
347
- try {
348
- const teamFiles = await fs.readdir(agentTeamsDir);
349
- const teamFile = teamFiles.find((f) => f.endsWith(".yaml"));
350
-
351
- if (teamFile) {
352
- console.log(` Building team bundle for ${packName}`);
353
- const teamConfigPath = path.join(agentTeamsDir, teamFile);
354
-
355
- // Build expansion pack as a team bundle
356
- const bundle = await this.buildExpansionTeamBundle(packName, packDir, teamConfigPath);
357
-
358
- // Write to all output directories
359
- for (const outputDir of outputDirs) {
360
- const teamsOutputDir = path.join(outputDir, "teams");
361
- await fs.mkdir(teamsOutputDir, { recursive: true });
362
- const outputFile = path.join(teamsOutputDir, teamFile.replace(".yaml", ".txt"));
363
- await fs.writeFile(outputFile, bundle, "utf8");
364
- console.log(` ✓ Created bundle: ${path.relative(this.rootDir, outputFile)}`);
365
- }
366
- } else {
367
- console.warn(` ⚠ No team configuration found in ${packName}/agent-teams/`);
368
- }
369
- } catch (error) {
370
- console.warn(` ⚠ No agent-teams directory found for ${packName}`);
371
- }
372
- }
373
-
374
- async buildExpansionAgentBundle(packName, packDir, agentName) {
375
- const template = this.generateWebInstructions('expansion-agent', packName);
376
- const sections = [template];
377
-
378
- // Add agent configuration
379
- const agentPath = path.join(packDir, "agents", `${agentName}.md`);
380
- const agentContent = await fs.readFile(agentPath, "utf8");
381
- const agentWebPath = this.convertToWebPath(agentPath, packName);
382
- sections.push(this.formatSection(agentWebPath, agentContent, packName));
383
-
384
- // Resolve and add agent dependencies
385
- const yamlContent = yamlUtils.extractYamlFromAgent(agentContent);
386
- if (yamlContent) {
387
- try {
388
- const yaml = require("js-yaml");
389
- const agentConfig = yaml.load(yamlContent);
390
-
391
- if (agentConfig.dependencies) {
392
- // Add resources, first try expansion pack, then core
393
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
394
- if (Array.isArray(resources)) {
395
- for (const resourceName of resources) {
396
- let found = false;
397
-
398
- // Try expansion pack first
399
- const resourcePath = path.join(packDir, resourceType, resourceName);
400
- try {
401
- const resourceContent = await fs.readFile(resourcePath, "utf8");
402
- const resourceWebPath = this.convertToWebPath(resourcePath, packName);
403
- sections.push(
404
- this.formatSection(resourceWebPath, resourceContent, packName)
405
- );
406
- found = true;
407
- } catch (error) {
408
- // Not in expansion pack, continue
409
- }
410
-
411
- // If not found in expansion pack, try core
412
- if (!found) {
413
- const corePath = path.join(
414
- this.rootDir,
415
- "bmad-core",
416
- resourceType,
417
- resourceName
418
- );
419
- try {
420
- const coreContent = await fs.readFile(corePath, "utf8");
421
- const coreWebPath = this.convertToWebPath(corePath, packName);
422
- sections.push(
423
- this.formatSection(coreWebPath, coreContent, packName)
424
- );
425
- found = true;
426
- } catch (error) {
427
- // Not in core either, continue
428
- }
429
- }
430
-
431
- // If not found in core, try common folder
432
- if (!found) {
433
- const commonPath = path.join(
434
- this.rootDir,
435
- "common",
436
- resourceType,
437
- resourceName
438
- );
439
- try {
440
- const commonContent = await fs.readFile(commonPath, "utf8");
441
- const commonWebPath = this.convertToWebPath(commonPath, packName);
442
- sections.push(
443
- this.formatSection(commonWebPath, commonContent, packName)
444
- );
445
- found = true;
446
- } catch (error) {
447
- // Not in common either, continue
448
- }
449
- }
450
-
451
- if (!found) {
452
- console.warn(
453
- ` ⚠ Dependency ${resourceType}#${resourceName} not found in expansion pack or core`
454
- );
455
- }
456
- }
457
- }
458
- }
459
- }
460
- } catch (error) {
461
- console.debug(`Failed to parse agent YAML for ${agentName}:`, error.message);
462
- }
463
- }
464
-
465
- return sections.join("\n");
466
- }
467
-
468
- async buildExpansionTeamBundle(packName, packDir, teamConfigPath) {
469
- const template = this.generateWebInstructions('expansion-team', packName);
470
-
471
- const sections = [template];
472
-
473
- // Add team configuration and parse to get agent list
474
- const teamContent = await fs.readFile(teamConfigPath, "utf8");
475
- const teamFileName = path.basename(teamConfigPath, ".yaml");
476
- const teamConfig = this.parseYaml(teamContent);
477
- const teamWebPath = this.convertToWebPath(teamConfigPath, packName);
478
- sections.push(this.formatSection(teamWebPath, teamContent, packName));
479
-
480
- // Get list of expansion pack agents
481
- const expansionAgents = new Set();
482
- const agentsDir = path.join(packDir, "agents");
483
- try {
484
- const agentFiles = await fs.readdir(agentsDir);
485
- for (const agentFile of agentFiles.filter((f) => f.endsWith(".md"))) {
486
- const agentName = agentFile.replace(".md", "");
487
- expansionAgents.add(agentName);
488
- }
489
- } catch (error) {
490
- console.warn(` ⚠ No agents directory found in ${packName}`);
491
- }
492
-
493
- // Build a map of all available expansion pack resources for override checking
494
- const expansionResources = new Map();
495
- const resourceDirs = ["templates", "tasks", "checklists", "workflows", "data"];
496
- for (const resourceDir of resourceDirs) {
497
- const resourcePath = path.join(packDir, resourceDir);
498
- try {
499
- const resourceFiles = await fs.readdir(resourcePath);
500
- for (const resourceFile of resourceFiles.filter(
501
- (f) => f.endsWith(".md") || f.endsWith(".yaml")
502
- )) {
503
- expansionResources.set(`${resourceDir}#${resourceFile}`, true);
504
- }
505
- } catch (error) {
506
- // Directory might not exist, that's fine
507
- }
508
- }
509
-
510
- // Process all agents listed in team configuration
511
- const agentsToProcess = teamConfig.agents || [];
512
-
513
- // Ensure bmad-orchestrator is always included for teams
514
- if (!agentsToProcess.includes("bmad-orchestrator")) {
515
- console.warn(` ⚠ Team ${teamFileName} missing bmad-orchestrator, adding automatically`);
516
- agentsToProcess.unshift("bmad-orchestrator");
517
- }
518
-
519
- // Track all dependencies from all agents (deduplicated)
520
- const allDependencies = new Map();
521
-
522
- for (const agentId of agentsToProcess) {
523
- if (expansionAgents.has(agentId)) {
524
- // Use expansion pack version (override)
525
- const agentPath = path.join(agentsDir, `${agentId}.md`);
526
- const agentContent = await fs.readFile(agentPath, "utf8");
527
- const expansionAgentWebPath = this.convertToWebPath(agentPath, packName);
528
- sections.push(this.formatSection(expansionAgentWebPath, agentContent, packName));
529
-
530
- // Parse and collect dependencies from expansion agent
531
- const agentYaml = agentContent.match(/```yaml\n([\s\S]*?)\n```/);
532
- if (agentYaml) {
533
- try {
534
- const agentConfig = this.parseYaml(agentYaml[1]);
535
- if (agentConfig.dependencies) {
536
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
537
- if (Array.isArray(resources)) {
538
- for (const resourceName of resources) {
539
- const key = `${resourceType}#${resourceName}`;
540
- if (!allDependencies.has(key)) {
541
- allDependencies.set(key, { type: resourceType, name: resourceName });
542
- }
543
- }
544
- }
545
- }
546
- }
547
- } catch (error) {
548
- console.debug(`Failed to parse agent YAML for ${agentId}:`, error.message);
549
- }
550
- }
551
- } else {
552
- // Use core BMad version
553
- try {
554
- const coreAgentPath = path.join(this.rootDir, "bmad-core", "agents", `${agentId}.md`);
555
- const coreAgentContent = await fs.readFile(coreAgentPath, "utf8");
556
- const coreAgentWebPath = this.convertToWebPath(coreAgentPath, packName);
557
- sections.push(this.formatSection(coreAgentWebPath, coreAgentContent, packName));
558
-
559
- // Parse and collect dependencies from core agent
560
- const yamlContent = yamlUtils.extractYamlFromAgent(coreAgentContent, true);
561
- if (yamlContent) {
562
- try {
563
- const agentConfig = this.parseYaml(yamlContent);
564
- if (agentConfig.dependencies) {
565
- for (const [resourceType, resources] of Object.entries(agentConfig.dependencies)) {
566
- if (Array.isArray(resources)) {
567
- for (const resourceName of resources) {
568
- const key = `${resourceType}#${resourceName}`;
569
- if (!allDependencies.has(key)) {
570
- allDependencies.set(key, { type: resourceType, name: resourceName });
571
- }
572
- }
573
- }
574
- }
575
- }
576
- } catch (error) {
577
- console.debug(`Failed to parse agent YAML for ${agentId}:`, error.message);
578
- }
579
- }
580
- } catch (error) {
581
- console.warn(` ⚠ Agent ${agentId} not found in core or expansion pack`);
582
- }
583
- }
584
- }
585
-
586
- // Add all collected dependencies from agents
587
- // Always prefer expansion pack versions if they exist
588
- for (const [key, dep] of allDependencies) {
589
- let found = false;
590
-
591
- // Always check expansion pack first, even if the dependency came from a core agent
592
- if (expansionResources.has(key)) {
593
- // We know it exists in expansion pack, find and load it
594
- const expansionPath = path.join(packDir, dep.type, dep.name);
595
- try {
596
- const content = await fs.readFile(expansionPath, "utf8");
597
- const expansionWebPath = this.convertToWebPath(expansionPath, packName);
598
- sections.push(this.formatSection(expansionWebPath, content, packName));
599
- console.log(` ✓ Using expansion override for ${key}`);
600
- found = true;
601
- } catch (error) {
602
- // Try next extension
603
- }
604
- }
605
-
606
- // If not found in expansion pack (or doesn't exist there), try core
607
- if (!found) {
608
- const corePath = path.join(this.rootDir, "bmad-core", dep.type, dep.name);
609
- try {
610
- const content = await fs.readFile(corePath, "utf8");
611
- const coreWebPath = this.convertToWebPath(corePath, packName);
612
- sections.push(this.formatSection(coreWebPath, content, packName));
613
- found = true;
614
- } catch (error) {
615
- // Not in core either, continue
616
- }
617
- }
618
-
619
- // If not found in core, try common folder
620
- if (!found) {
621
- const commonPath = path.join(this.rootDir, "common", dep.type, dep.name);
622
- try {
623
- const content = await fs.readFile(commonPath, "utf8");
624
- const commonWebPath = this.convertToWebPath(commonPath, packName);
625
- sections.push(this.formatSection(commonWebPath, content, packName));
626
- found = true;
627
- } catch (error) {
628
- // Not in common either, continue
629
- }
630
- }
631
-
632
- if (!found) {
633
- console.warn(` ⚠ Dependency ${key} not found in expansion pack or core`);
634
- }
635
- }
636
-
637
- // Add remaining expansion pack resources not already included as dependencies
638
- for (const resourceDir of resourceDirs) {
639
- const resourcePath = path.join(packDir, resourceDir);
640
- try {
641
- const resourceFiles = await fs.readdir(resourcePath);
642
- for (const resourceFile of resourceFiles.filter(
643
- (f) => f.endsWith(".md") || f.endsWith(".yaml")
644
- )) {
645
- const filePath = path.join(resourcePath, resourceFile);
646
- const fileContent = await fs.readFile(filePath, "utf8");
647
- const fileName = resourceFile.replace(/\.(md|yaml)$/, "");
648
-
649
- // Only add if not already included as a dependency
650
- const resourceKey = `${resourceDir}#${fileName}`;
651
- if (!allDependencies.has(resourceKey)) {
652
- const fullResourcePath = path.join(resourcePath, resourceFile);
653
- const resourceWebPath = this.convertToWebPath(fullResourcePath, packName);
654
- sections.push(this.formatSection(resourceWebPath, fileContent, packName));
655
- }
656
- }
657
- } catch (error) {
658
- // Directory might not exist, that's fine
659
- }
660
- }
661
-
662
- return sections.join("\n");
663
- }
664
-
665
- async listExpansionPacks() {
666
- const expansionPacksDir = path.join(this.rootDir, "expansion-packs");
667
- try {
668
- const entries = await fs.readdir(expansionPacksDir, { withFileTypes: true });
669
- return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
670
- } catch (error) {
671
- console.warn("No expansion-packs directory found");
672
- return [];
673
- }
674
- }
675
-
676
- listAgents() {
677
- return this.resolver.listAgents();
678
- }
679
- }
680
-
681
- module.exports = WebBuilder;