bmad-method 6.0.0-alpha.9 → 6.0.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.
Files changed (933) hide show
  1. package/.augment/code_review_guidelines.yaml +271 -0
  2. package/.claude/skills/bmad-os-audit-file-refs/SKILL.md +6 -0
  3. package/.claude/skills/bmad-os-audit-file-refs/prompts/instructions.md +59 -0
  4. package/.claude/skills/bmad-os-changelog-social/SKILL.md +177 -0
  5. package/.claude/skills/bmad-os-changelog-social/examples/discord-example.md +53 -0
  6. package/.claude/skills/bmad-os-changelog-social/examples/linkedin-example.md +49 -0
  7. package/.claude/skills/bmad-os-changelog-social/examples/twitter-example.md +55 -0
  8. package/.claude/skills/bmad-os-diataxis-style-fix/SKILL.md +6 -0
  9. package/.claude/skills/bmad-os-diataxis-style-fix/prompts/instructions.md +229 -0
  10. package/.claude/skills/bmad-os-draft-changelog/SKILL.md +6 -0
  11. package/.claude/skills/bmad-os-draft-changelog/prompts/instructions.md +82 -0
  12. package/.claude/skills/bmad-os-gh-triage/SKILL.md +6 -0
  13. package/.claude/skills/bmad-os-gh-triage/prompts/agent-prompt.md +60 -0
  14. package/.claude/skills/bmad-os-gh-triage/prompts/instructions.md +74 -0
  15. package/.claude/skills/bmad-os-release-module/SKILL.md +6 -0
  16. package/.claude/skills/bmad-os-release-module/prompts/instructions.md +53 -0
  17. package/.claude/skills/bmad-os-review-pr/SKILL.md +6 -0
  18. package/.claude/skills/bmad-os-review-pr/prompts/instructions.md +231 -0
  19. package/.coderabbit.yaml +85 -0
  20. package/.github/CODE_OF_CONDUCT.md +128 -0
  21. package/.github/ISSUE_TEMPLATE/bug-report.yaml +124 -0
  22. package/.github/ISSUE_TEMPLATE/config.yaml +5 -2
  23. package/.github/ISSUE_TEMPLATE/documentation.yaml +55 -0
  24. package/.github/ISSUE_TEMPLATE/feature-request.md +22 -0
  25. package/.github/ISSUE_TEMPLATE/issue.md +32 -0
  26. package/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  27. package/.github/scripts/discord-helpers.sh +34 -0
  28. package/.github/workflows/coderabbit-review.yaml +22 -0
  29. package/.github/workflows/discord.yaml +82 -8
  30. package/.github/workflows/docs.yaml +64 -0
  31. package/.github/workflows/quality.yaml +40 -2
  32. package/.husky/pre-commit +13 -0
  33. package/.markdownlint-cli2.yaml +41 -0
  34. package/.prettierignore +10 -0
  35. package/.vscode/settings.json +4 -3
  36. package/CHANGELOG.md +1110 -673
  37. package/CNAME +1 -0
  38. package/CONTRIBUTING.md +97 -189
  39. package/CONTRIBUTORS.md +32 -0
  40. package/LICENSE +7 -3
  41. package/README.md +55 -388
  42. package/SECURITY.md +85 -0
  43. package/TRADEMARK.md +55 -0
  44. package/Wordmark.png +0 -0
  45. package/banner-bmad-method.png +0 -0
  46. package/docs/404.md +9 -0
  47. package/docs/_STYLE_GUIDE.md +370 -0
  48. package/docs/explanation/advanced-elicitation.md +49 -0
  49. package/docs/explanation/adversarial-review.md +59 -0
  50. package/docs/explanation/brainstorming.md +33 -0
  51. package/docs/explanation/established-projects-faq.md +50 -0
  52. package/docs/explanation/party-mode.md +59 -0
  53. package/docs/explanation/preventing-agent-conflicts.md +112 -0
  54. package/docs/explanation/project-context.md +157 -0
  55. package/docs/explanation/quick-flow.md +73 -0
  56. package/docs/explanation/why-solutioning-matters.md +77 -0
  57. package/docs/how-to/customize-bmad.md +172 -0
  58. package/docs/how-to/established-projects.md +117 -0
  59. package/docs/how-to/get-answers-about-bmad.md +134 -0
  60. package/docs/how-to/install-bmad.md +97 -0
  61. package/docs/how-to/non-interactive-installation.md +171 -0
  62. package/docs/how-to/project-context.md +136 -0
  63. package/docs/how-to/quick-fixes.md +123 -0
  64. package/docs/how-to/shard-large-documents.md +78 -0
  65. package/docs/how-to/upgrade-to-v6.md +97 -0
  66. package/docs/index.md +37 -204
  67. package/docs/reference/agents.md +28 -0
  68. package/docs/reference/commands.md +151 -0
  69. package/docs/reference/modules.md +76 -0
  70. package/docs/reference/testing.md +106 -0
  71. package/docs/reference/workflow-map.md +89 -0
  72. package/docs/roadmap.mdx +136 -0
  73. package/docs/tutorials/getting-started.md +273 -0
  74. package/eslint.config.mjs +26 -16
  75. package/package.json +35 -28
  76. package/src/bmm/agents/analyst.agent.yaml +43 -0
  77. package/src/bmm/agents/architect.agent.yaml +29 -0
  78. package/src/bmm/agents/dev.agent.yaml +38 -0
  79. package/src/bmm/agents/pm.agent.yaml +44 -0
  80. package/src/bmm/agents/qa.agent.yaml +58 -0
  81. package/src/bmm/agents/quick-flow-solo-dev.agent.yaml +32 -0
  82. package/src/bmm/agents/sm.agent.yaml +37 -0
  83. package/src/bmm/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  84. package/src/bmm/agents/tech-writer/tech-writer.agent.yaml +46 -0
  85. package/src/bmm/agents/ux-designer.agent.yaml +27 -0
  86. package/src/bmm/data/project-context-template.md +26 -0
  87. package/src/bmm/module-help.csv +31 -0
  88. package/src/bmm/module.yaml +50 -0
  89. package/src/bmm/teams/default-party.csv +20 -0
  90. package/src/bmm/workflows/1-analysis/create-product-brief/product-brief.template.md +10 -0
  91. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01-init.md +177 -0
  92. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-01b-continue.md +161 -0
  93. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-02-vision.md +199 -0
  94. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-03-users.md +202 -0
  95. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-04-metrics.md +205 -0
  96. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-05-scope.md +219 -0
  97. package/src/bmm/workflows/1-analysis/create-product-brief/steps/step-06-complete.md +162 -0
  98. package/src/bmm/workflows/1-analysis/create-product-brief/workflow.md +57 -0
  99. package/src/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +137 -0
  100. package/src/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +229 -0
  101. package/src/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +238 -0
  102. package/src/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +206 -0
  103. package/src/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +234 -0
  104. package/src/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +444 -0
  105. package/src/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  106. package/src/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  107. package/src/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  108. package/src/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  109. package/src/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  110. package/src/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -0
  111. package/src/bmm/workflows/1-analysis/research/research.template.md +29 -0
  112. package/src/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +137 -0
  113. package/src/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +239 -0
  114. package/src/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +248 -0
  115. package/src/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +202 -0
  116. package/src/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +233 -0
  117. package/src/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +487 -0
  118. package/src/bmm/workflows/1-analysis/research/workflow-domain-research.md +54 -0
  119. package/src/bmm/workflows/1-analysis/research/workflow-market-research.md +54 -0
  120. package/src/bmm/workflows/1-analysis/research/workflow-technical-research.md +54 -0
  121. package/src/bmm/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
  122. package/src/bmm/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  123. package/src/bmm/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  124. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01-init.md +191 -0
  125. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-01b-continue.md +152 -0
  126. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02-discovery.md +224 -0
  127. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02b-vision.md +154 -0
  128. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-02c-executive-summary.md +170 -0
  129. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-03-success.md +226 -0
  130. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-04-journeys.md +213 -0
  131. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-05-domain.md +207 -0
  132. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-06-innovation.md +226 -0
  133. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-07-project-type.md +237 -0
  134. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-08-scoping.md +228 -0
  135. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-09-functional.md +231 -0
  136. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-10-nonfunctional.md +242 -0
  137. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-11-polish.md +217 -0
  138. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-c/step-12-complete.md +124 -0
  139. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01-discovery.md +247 -0
  140. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-01b-legacy-conversion.md +208 -0
  141. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-02-review.md +249 -0
  142. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-03-edit.md +253 -0
  143. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-e/step-e-04-complete.md +168 -0
  144. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +226 -0
  145. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  146. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  147. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  148. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  149. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  150. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  151. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  152. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  153. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  154. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  155. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  156. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  157. package/src/bmm/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +231 -0
  158. package/src/bmm/workflows/2-plan-workflows/create-prd/templates/prd-template.md +10 -0
  159. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-create-prd.md +63 -0
  160. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-edit-prd.md +65 -0
  161. package/src/bmm/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +63 -0
  162. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01-init.md +135 -0
  163. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-01b-continue.md +127 -0
  164. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-02-discovery.md +190 -0
  165. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-03-core-experience.md +216 -0
  166. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-04-emotional-response.md +219 -0
  167. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-05-inspiration.md +234 -0
  168. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-06-design-system.md +252 -0
  169. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-07-defining-experience.md +254 -0
  170. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-08-visual-foundation.md +224 -0
  171. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-09-design-directions.md +224 -0
  172. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-10-user-journeys.md +241 -0
  173. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-11-component-strategy.md +248 -0
  174. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-12-ux-patterns.md +237 -0
  175. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-13-responsive-accessibility.md +264 -0
  176. package/src/bmm/workflows/2-plan-workflows/create-ux-design/steps/step-14-complete.md +171 -0
  177. package/src/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +13 -0
  178. package/src/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +42 -0
  179. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-01-document-discovery.md +184 -0
  180. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-02-prd-analysis.md +172 -0
  181. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-03-epic-coverage-validation.md +173 -0
  182. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-04-ux-alignment.md +133 -0
  183. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-05-epic-quality-review.md +245 -0
  184. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/steps/step-06-final-assessment.md +129 -0
  185. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/templates/readiness-report-template.md +4 -0
  186. package/src/bmm/workflows/3-solutioning/check-implementation-readiness/workflow.md +54 -0
  187. package/src/bmm/workflows/3-solutioning/create-architecture/architecture-decision-template.md +12 -0
  188. package/src/bmm/workflows/3-solutioning/create-architecture/data/domain-complexity.csv +13 -0
  189. package/src/bmm/workflows/3-solutioning/create-architecture/data/project-types.csv +7 -0
  190. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01-init.md +153 -0
  191. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-01b-continue.md +173 -0
  192. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-02-context.md +224 -0
  193. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-03-starter.md +329 -0
  194. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-04-decisions.md +318 -0
  195. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-05-patterns.md +359 -0
  196. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-06-structure.md +379 -0
  197. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-07-validation.md +359 -0
  198. package/src/bmm/workflows/3-solutioning/create-architecture/steps/step-08-complete.md +76 -0
  199. package/src/bmm/workflows/3-solutioning/create-architecture/workflow.md +49 -0
  200. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +259 -0
  201. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +233 -0
  202. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +272 -0
  203. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +149 -0
  204. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  205. package/src/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
  206. package/src/bmm/workflows/4-implementation/code-review/checklist.md +23 -0
  207. package/src/bmm/workflows/4-implementation/code-review/instructions.xml +227 -0
  208. package/src/bmm/workflows/4-implementation/code-review/workflow.yaml +43 -0
  209. package/src/bmm/workflows/4-implementation/correct-course/checklist.md +288 -0
  210. package/src/bmm/workflows/4-implementation/correct-course/instructions.md +207 -0
  211. package/src/bmm/workflows/4-implementation/correct-course/workflow.yaml +53 -0
  212. package/src/bmm/workflows/4-implementation/create-story/checklist.md +358 -0
  213. package/src/bmm/workflows/4-implementation/create-story/instructions.xml +346 -0
  214. package/src/bmm/workflows/4-implementation/create-story/template.md +49 -0
  215. package/src/bmm/workflows/4-implementation/create-story/workflow.yaml +52 -0
  216. package/src/bmm/workflows/4-implementation/dev-story/checklist.md +80 -0
  217. package/src/bmm/workflows/4-implementation/dev-story/instructions.xml +410 -0
  218. package/src/bmm/workflows/4-implementation/dev-story/workflow.yaml +20 -0
  219. package/src/bmm/workflows/4-implementation/retrospective/instructions.md +1444 -0
  220. package/src/bmm/workflows/4-implementation/retrospective/workflow.yaml +52 -0
  221. package/src/bmm/workflows/4-implementation/sprint-planning/instructions.md +226 -0
  222. package/src/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +55 -0
  223. package/src/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +47 -0
  224. package/src/bmm/workflows/4-implementation/sprint-status/instructions.md +230 -0
  225. package/src/bmm/workflows/4-implementation/sprint-status/workflow.yaml +25 -0
  226. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-01-mode-detection.md +174 -0
  227. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-02-context-gathering.md +118 -0
  228. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-03-execute.md +111 -0
  229. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-04-self-check.md +111 -0
  230. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-05-adversarial-review.md +104 -0
  231. package/src/bmm/workflows/bmad-quick-flow/quick-dev/steps/step-06-resolve-findings.md +146 -0
  232. package/src/bmm/workflows/bmad-quick-flow/quick-dev/workflow.md +50 -0
  233. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-01-understand.md +189 -0
  234. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-02-investigate.md +143 -0
  235. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-03-generate.md +126 -0
  236. package/src/bmm/workflows/bmad-quick-flow/quick-spec/steps/step-04-review.md +200 -0
  237. package/src/bmm/workflows/bmad-quick-flow/quick-spec/tech-spec-template.md +74 -0
  238. package/src/bmm/workflows/bmad-quick-flow/quick-spec/workflow.md +79 -0
  239. package/src/bmm/workflows/document-project/checklist.md +245 -0
  240. package/src/bmm/workflows/document-project/instructions.md +130 -0
  241. package/src/bmm/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  242. package/src/bmm/workflows/document-project/workflow.yaml +22 -0
  243. package/src/bmm/workflows/document-project/workflows/deep-dive-instructions.md +298 -0
  244. package/src/bmm/workflows/document-project/workflows/deep-dive.yaml +31 -0
  245. package/src/bmm/workflows/document-project/workflows/full-scan-instructions.md +1106 -0
  246. package/src/bmm/workflows/document-project/workflows/full-scan.yaml +31 -0
  247. package/src/bmm/workflows/generate-project-context/project-context-template.md +21 -0
  248. package/src/bmm/workflows/generate-project-context/steps/step-01-discover.md +184 -0
  249. package/src/bmm/workflows/generate-project-context/steps/step-02-generate.md +318 -0
  250. package/src/bmm/workflows/generate-project-context/steps/step-03-complete.md +278 -0
  251. package/src/bmm/workflows/generate-project-context/workflow.md +49 -0
  252. package/src/bmm/workflows/qa-generate-e2e-tests/checklist.md +33 -0
  253. package/src/bmm/workflows/qa-generate-e2e-tests/instructions.md +110 -0
  254. package/src/bmm/workflows/qa-generate-e2e-tests/workflow.yaml +42 -0
  255. package/src/core/agents/bmad-master.agent.yaml +12 -21
  256. package/src/core/module-help.csv +9 -0
  257. package/src/core/module.yaml +25 -0
  258. package/src/core/tasks/editorial-review-prose.xml +102 -0
  259. package/src/core/tasks/editorial-review-structure.xml +208 -0
  260. package/src/core/tasks/help.md +86 -0
  261. package/src/core/tasks/index-docs.xml +2 -2
  262. package/src/core/tasks/review-adversarial-general.xml +49 -0
  263. package/src/core/tasks/shard-doc.xml +108 -0
  264. package/src/core/tasks/workflow.xml +39 -74
  265. package/src/core/workflows/advanced-elicitation/methods.csv +51 -0
  266. package/src/core/workflows/advanced-elicitation/workflow.xml +118 -0
  267. package/src/core/workflows/brainstorming/brain-methods.csv +62 -36
  268. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +197 -0
  269. package/src/core/workflows/brainstorming/steps/step-01b-continue.md +122 -0
  270. package/src/core/workflows/brainstorming/steps/step-02a-user-selected.md +225 -0
  271. package/src/core/workflows/brainstorming/steps/step-02b-ai-recommended.md +237 -0
  272. package/src/core/workflows/brainstorming/steps/step-02c-random-selection.md +209 -0
  273. package/src/core/workflows/brainstorming/steps/step-02d-progressive-flow.md +264 -0
  274. package/src/core/workflows/brainstorming/steps/step-03-technique-execution.md +399 -0
  275. package/src/core/workflows/brainstorming/steps/step-04-idea-organization.md +303 -0
  276. package/src/core/workflows/brainstorming/template.md +13 -104
  277. package/src/core/workflows/brainstorming/workflow.md +58 -0
  278. package/src/core/workflows/party-mode/steps/step-01-agent-loading.md +138 -0
  279. package/src/core/workflows/party-mode/steps/step-02-discussion-orchestration.md +187 -0
  280. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +168 -0
  281. package/src/core/workflows/party-mode/workflow.md +194 -0
  282. package/src/utility/agent-components/activation-rules.txt +6 -0
  283. package/src/utility/agent-components/activation-steps.txt +14 -0
  284. package/src/utility/agent-components/agent-command-header.md +1 -0
  285. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  286. package/src/utility/agent-components/handler-action.txt +4 -0
  287. package/src/utility/agent-components/handler-exec.txt +6 -0
  288. package/src/utility/agent-components/handler-multi.txt +14 -0
  289. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  290. package/src/utility/agent-components/handler-validate-workflow.txt +7 -0
  291. package/src/utility/agent-components/handler-workflow.txt +10 -0
  292. package/src/utility/agent-components/menu-handlers.txt +6 -0
  293. package/test/README.md +4 -4
  294. package/test/adversarial-review-tests/README.md +56 -0
  295. package/test/adversarial-review-tests/sample-content.md +46 -0
  296. package/test/adversarial-review-tests/test-cases.yaml +103 -0
  297. package/test/fixtures/agent-schema/invalid/critical-actions/actions-as-string.agent.yaml +1 -0
  298. package/test/fixtures/agent-schema/invalid/critical-actions/empty-string-in-actions.agent.yaml +1 -0
  299. package/test/fixtures/agent-schema/invalid/menu/empty-menu.agent.yaml +1 -0
  300. package/test/fixtures/agent-schema/invalid/menu/missing-menu.agent.yaml +1 -0
  301. package/test/fixtures/agent-schema/invalid/menu-commands/empty-command-target.agent.yaml +1 -0
  302. package/test/fixtures/agent-schema/invalid/menu-commands/no-command-target.agent.yaml +1 -0
  303. package/test/fixtures/agent-schema/invalid/menu-triggers/camel-case.agent.yaml +1 -0
  304. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-invalid-format.agent.yaml +25 -0
  305. package/test/fixtures/agent-schema/invalid/menu-triggers/compound-mismatched-kebab.agent.yaml +25 -0
  306. package/test/fixtures/agent-schema/invalid/menu-triggers/duplicate-triggers.agent.yaml +1 -0
  307. package/test/fixtures/agent-schema/invalid/menu-triggers/empty-trigger.agent.yaml +1 -0
  308. package/test/fixtures/agent-schema/invalid/menu-triggers/leading-asterisk.agent.yaml +1 -0
  309. package/test/fixtures/agent-schema/invalid/menu-triggers/snake-case.agent.yaml +1 -0
  310. package/test/fixtures/agent-schema/invalid/menu-triggers/trigger-with-spaces.agent.yaml +1 -0
  311. package/test/fixtures/agent-schema/invalid/metadata/empty-module-string.agent.yaml +1 -1
  312. package/test/fixtures/agent-schema/invalid/metadata/extra-metadata-fields.agent.yaml +1 -0
  313. package/test/fixtures/agent-schema/invalid/persona/empty-principles-array.agent.yaml +1 -0
  314. package/test/fixtures/agent-schema/invalid/persona/empty-string-in-principles.agent.yaml +1 -0
  315. package/test/fixtures/agent-schema/invalid/persona/extra-persona-fields.agent.yaml +1 -0
  316. package/test/fixtures/agent-schema/invalid/persona/missing-role.agent.yaml +1 -0
  317. package/test/fixtures/agent-schema/invalid/prompts/empty-content.agent.yaml +1 -0
  318. package/test/fixtures/agent-schema/invalid/prompts/extra-prompt-fields.agent.yaml +1 -0
  319. package/test/fixtures/agent-schema/invalid/prompts/missing-content.agent.yaml +1 -0
  320. package/test/fixtures/agent-schema/invalid/prompts/missing-id.agent.yaml +1 -0
  321. package/test/fixtures/agent-schema/invalid/top-level/extra-top-level-keys.agent.yaml +1 -0
  322. package/test/fixtures/agent-schema/valid/critical-actions/empty-critical-actions.agent.yaml +1 -0
  323. package/test/fixtures/agent-schema/valid/critical-actions/no-critical-actions.agent.yaml +1 -0
  324. package/test/fixtures/agent-schema/valid/critical-actions/valid-critical-actions.agent.yaml +1 -0
  325. package/test/fixtures/agent-schema/valid/menu/multiple-menu-items.agent.yaml +1 -0
  326. package/test/fixtures/agent-schema/valid/menu/single-menu-item.agent.yaml +1 -0
  327. package/test/fixtures/agent-schema/valid/menu-commands/all-command-types.agent.yaml +2 -3
  328. package/test/fixtures/agent-schema/valid/menu-commands/multiple-commands.agent.yaml +1 -0
  329. package/test/fixtures/agent-schema/valid/menu-triggers/compound-triggers.agent.yaml +31 -0
  330. package/test/fixtures/agent-schema/valid/menu-triggers/kebab-case-triggers.agent.yaml +2 -1
  331. package/test/fixtures/agent-schema/valid/metadata/core-agent-with-module.agent.yaml +24 -0
  332. package/test/fixtures/agent-schema/valid/metadata/empty-module-name-in-path.agent.yaml +1 -0
  333. package/test/fixtures/agent-schema/valid/metadata/malformed-path-treated-as-core.agent.yaml +2 -1
  334. package/test/fixtures/agent-schema/valid/metadata/module-agent-correct.agent.yaml +2 -1
  335. package/test/fixtures/agent-schema/valid/metadata/module-agent-missing-module.agent.yaml +23 -0
  336. package/test/fixtures/agent-schema/valid/metadata/wrong-module-value.agent.yaml +24 -0
  337. package/test/fixtures/agent-schema/valid/persona/complete-persona.agent.yaml +1 -0
  338. package/test/fixtures/agent-schema/valid/prompts/empty-prompts.agent.yaml +1 -0
  339. package/test/fixtures/agent-schema/valid/prompts/no-prompts.agent.yaml +1 -0
  340. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-minimal.agent.yaml +1 -0
  341. package/test/fixtures/agent-schema/valid/prompts/valid-prompts-with-description.agent.yaml +1 -0
  342. package/test/fixtures/agent-schema/valid/top-level/minimal-core-agent.agent.yaml +1 -0
  343. package/test/fixtures/file-refs-csv/invalid/all-empty-workflow.csv +3 -0
  344. package/test/fixtures/file-refs-csv/invalid/empty-data.csv +1 -0
  345. package/test/fixtures/file-refs-csv/invalid/no-workflow-column.csv +3 -0
  346. package/test/fixtures/file-refs-csv/invalid/unresolvable-vars.csv +3 -0
  347. package/test/fixtures/file-refs-csv/valid/bmm-style.csv +3 -0
  348. package/test/fixtures/file-refs-csv/valid/core-style.csv +3 -0
  349. package/test/fixtures/file-refs-csv/valid/minimal.csv +2 -0
  350. package/test/test-agent-schema.js +4 -4
  351. package/test/test-file-refs-csv.js +133 -0
  352. package/test/test-installation-components.js +10 -12
  353. package/test/test-rehype-plugins.mjs +1050 -0
  354. package/test/unit-test-schema.js +2 -2
  355. package/tools/build-docs.mjs +463 -0
  356. package/tools/cli/README.md +41 -589
  357. package/tools/cli/bmad-cli.js +67 -1
  358. package/tools/cli/commands/install.js +42 -34
  359. package/tools/cli/commands/status.js +44 -26
  360. package/tools/cli/commands/uninstall.js +146 -23
  361. package/tools/cli/external-official-modules.yaml +53 -0
  362. package/tools/cli/installers/install-messages.yaml +39 -0
  363. package/tools/cli/installers/lib/core/config-collector.js +589 -95
  364. package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
  365. package/tools/cli/installers/lib/core/dependency-resolver.js +57 -39
  366. package/tools/cli/installers/lib/core/detector.js +19 -125
  367. package/tools/cli/installers/lib/core/ide-config-manager.js +12 -9
  368. package/tools/cli/installers/lib/core/installer.js +2075 -1161
  369. package/tools/cli/installers/lib/core/manifest-generator.js +494 -103
  370. package/tools/cli/installers/lib/core/manifest.js +544 -46
  371. package/tools/cli/installers/lib/custom/handler.js +358 -0
  372. package/tools/cli/installers/lib/ide/_base-ide.js +83 -44
  373. package/tools/cli/installers/lib/ide/_config-driven.js +559 -0
  374. package/tools/cli/installers/lib/ide/codex.js +301 -64
  375. package/tools/cli/installers/lib/ide/github-copilot.js +606 -209
  376. package/tools/cli/installers/lib/ide/kilo.js +169 -75
  377. package/tools/cli/installers/lib/ide/manager.js +179 -48
  378. package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
  379. package/tools/cli/installers/lib/ide/platform-codes.yaml +234 -0
  380. package/tools/cli/installers/lib/ide/rovodev.js +257 -0
  381. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +95 -5
  382. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +51 -20
  383. package/tools/cli/installers/lib/ide/shared/module-injections.js +6 -3
  384. package/tools/cli/installers/lib/ide/shared/path-utils.js +299 -0
  385. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +261 -14
  386. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +108 -27
  387. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
  388. package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
  389. package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
  390. package/tools/cli/installers/lib/ide/templates/combined/default-task.md +10 -0
  391. package/tools/cli/installers/lib/ide/templates/combined/default-tool.md +10 -0
  392. package/tools/cli/installers/lib/ide/templates/combined/default-workflow-yaml.md +14 -0
  393. package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
  394. package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
  395. package/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml +11 -0
  396. package/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml +11 -0
  397. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
  398. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
  399. package/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md +16 -0
  400. package/tools/cli/installers/lib/ide/templates/combined/kiro-task.md +9 -0
  401. package/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md +9 -0
  402. package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow-yaml.md +15 -0
  403. package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md +7 -0
  404. package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +15 -0
  405. package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +14 -0
  406. package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +14 -0
  407. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +17 -0
  408. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +17 -0
  409. package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
  410. package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
  411. package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
  412. package/tools/cli/installers/lib/ide/templates/workflow-command-template.md +1 -1
  413. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  414. package/tools/cli/installers/lib/message-loader.js +83 -0
  415. package/tools/cli/installers/lib/modules/external-manager.js +136 -0
  416. package/tools/cli/installers/lib/modules/manager.js +931 -207
  417. package/tools/cli/lib/activation-builder.js +13 -16
  418. package/tools/cli/lib/agent/compiler.js +525 -0
  419. package/tools/cli/lib/agent/installer.js +680 -0
  420. package/tools/cli/lib/agent/template-engine.js +152 -0
  421. package/tools/cli/lib/agent-analyzer.js +48 -20
  422. package/tools/cli/lib/agent-party-generator.js +5 -17
  423. package/tools/cli/lib/cli-utils.js +76 -104
  424. package/tools/cli/lib/config.js +4 -3
  425. package/tools/cli/lib/platform-codes.js +2 -2
  426. package/tools/cli/lib/project-root.js +6 -0
  427. package/tools/cli/lib/prompts.js +809 -0
  428. package/tools/cli/lib/ui.js +1600 -272
  429. package/tools/cli/lib/xml-handler.js +4 -55
  430. package/tools/cli/lib/yaml-format.js +4 -6
  431. package/tools/cli/lib/yaml-xml-builder.js +183 -61
  432. package/tools/docs/_prompt-external-modules-page.md +59 -0
  433. package/tools/docs/fix-refs.md +91 -0
  434. package/tools/fix-doc-links.js +285 -0
  435. package/tools/lib/xml-utils.js +13 -0
  436. package/tools/migrate-custom-module-paths.js +124 -0
  437. package/tools/platform-codes.yaml +30 -6
  438. package/tools/schema/agent.js +306 -53
  439. package/tools/validate-agent-schema.js +3 -3
  440. package/tools/validate-doc-links.js +407 -0
  441. package/tools/validate-file-refs.js +554 -0
  442. package/tools/validate-svg-changes.sh +356 -0
  443. package/website/README.md +75 -0
  444. package/website/astro.config.mjs +136 -0
  445. package/website/public/favicon.ico +0 -0
  446. package/website/public/img/bmad-dark.png +0 -0
  447. package/website/public/img/bmad-light.png +0 -0
  448. package/website/public/workflow-map-diagram.html +361 -0
  449. package/website/src/components/Banner.astro +62 -0
  450. package/website/src/components/Header.astro +96 -0
  451. package/website/src/components/MobileMenuFooter.astro +33 -0
  452. package/website/src/content/config.ts +6 -0
  453. package/website/src/lib/site-url.mjs +25 -0
  454. package/website/src/pages/404.astro +11 -0
  455. package/website/src/pages/robots.txt.ts +48 -0
  456. package/website/src/rehype-base-paths.js +112 -0
  457. package/website/src/rehype-markdown-links.js +119 -0
  458. package/website/src/styles/custom.css +805 -0
  459. package/.github/ISSUE_TEMPLATE/bug_report.md +0 -32
  460. package/.github/ISSUE_TEMPLATE/idea_submission.md +0 -109
  461. package/.github/workflows/bundle-latest.yaml +0 -277
  462. package/.github/workflows/manual-release.yaml +0 -212
  463. package/docs/BUNDLE_DISTRIBUTION_SETUP.md +0 -95
  464. package/docs/agent-customization-guide.md +0 -208
  465. package/docs/document-sharding-guide.md +0 -447
  466. package/docs/ide-info/auggie.md +0 -31
  467. package/docs/ide-info/claude-code.md +0 -25
  468. package/docs/ide-info/cline.md +0 -31
  469. package/docs/ide-info/codex.md +0 -21
  470. package/docs/ide-info/crush.md +0 -30
  471. package/docs/ide-info/cursor.md +0 -25
  472. package/docs/ide-info/gemini.md +0 -25
  473. package/docs/ide-info/github-copilot.md +0 -26
  474. package/docs/ide-info/iflow.md +0 -33
  475. package/docs/ide-info/kilo.md +0 -24
  476. package/docs/ide-info/opencode.md +0 -24
  477. package/docs/ide-info/qwen.md +0 -25
  478. package/docs/ide-info/roo.md +0 -27
  479. package/docs/ide-info/trae.md +0 -25
  480. package/docs/ide-info/windsurf.md +0 -22
  481. package/docs/installers-bundlers/ide-injections.md +0 -186
  482. package/docs/installers-bundlers/installers-modules-platforms-reference.md +0 -388
  483. package/docs/installers-bundlers/web-bundler-usage.md +0 -54
  484. package/docs/v4-to-v6-upgrade.md +0 -227
  485. package/docs/web-bundles-gemini-gpt-guide.md +0 -473
  486. package/src/core/_module-installer/install-config.yaml +0 -35
  487. package/src/core/_module-installer/installer.js +0 -60
  488. package/src/core/agents/bmad-web-orchestrator.agent.xml +0 -113
  489. package/src/core/tasks/adv-elicit-methods.csv +0 -39
  490. package/src/core/tasks/advanced-elicitation.xml +0 -106
  491. package/src/core/tasks/validate-workflow.xml +0 -89
  492. package/src/core/tools/shard-doc.xml +0 -109
  493. package/src/core/workflows/brainstorming/README.md +0 -261
  494. package/src/core/workflows/brainstorming/instructions.md +0 -315
  495. package/src/core/workflows/brainstorming/workflow.yaml +0 -43
  496. package/src/core/workflows/party-mode/instructions.md +0 -183
  497. package/src/core/workflows/party-mode/workflow.yaml +0 -27
  498. package/src/modules/bmb/README.md +0 -194
  499. package/src/modules/bmb/_module-installer/install-config.yaml +0 -31
  500. package/src/modules/bmb/agents/bmad-builder.agent.yaml +0 -59
  501. package/src/modules/bmb/workflows/audit-workflow/checklist.md +0 -142
  502. package/src/modules/bmb/workflows/audit-workflow/instructions.md +0 -341
  503. package/src/modules/bmb/workflows/audit-workflow/template.md +0 -118
  504. package/src/modules/bmb/workflows/audit-workflow/workflow.yaml +0 -25
  505. package/src/modules/bmb/workflows/convert-legacy/README.md +0 -262
  506. package/src/modules/bmb/workflows/convert-legacy/checklist.md +0 -205
  507. package/src/modules/bmb/workflows/convert-legacy/instructions.md +0 -377
  508. package/src/modules/bmb/workflows/convert-legacy/workflow.yaml +0 -34
  509. package/src/modules/bmb/workflows/create-agent/README.md +0 -203
  510. package/src/modules/bmb/workflows/create-agent/agent-architecture.md +0 -415
  511. package/src/modules/bmb/workflows/create-agent/agent-command-patterns.md +0 -759
  512. package/src/modules/bmb/workflows/create-agent/agent-types.md +0 -292
  513. package/src/modules/bmb/workflows/create-agent/brainstorm-context.md +0 -174
  514. package/src/modules/bmb/workflows/create-agent/checklist.md +0 -62
  515. package/src/modules/bmb/workflows/create-agent/communication-styles.md +0 -202
  516. package/src/modules/bmb/workflows/create-agent/instructions.md +0 -456
  517. package/src/modules/bmb/workflows/create-agent/workflow.yaml +0 -49
  518. package/src/modules/bmb/workflows/create-module/README.md +0 -229
  519. package/src/modules/bmb/workflows/create-module/brainstorm-context.md +0 -137
  520. package/src/modules/bmb/workflows/create-module/checklist.md +0 -235
  521. package/src/modules/bmb/workflows/create-module/installer-templates/install-config.yaml +0 -92
  522. package/src/modules/bmb/workflows/create-module/installer-templates/installer.js +0 -231
  523. package/src/modules/bmb/workflows/create-module/instructions.md +0 -576
  524. package/src/modules/bmb/workflows/create-module/module-structure.md +0 -400
  525. package/src/modules/bmb/workflows/create-module/workflow.yaml +0 -44
  526. package/src/modules/bmb/workflows/create-workflow/README.md +0 -277
  527. package/src/modules/bmb/workflows/create-workflow/brainstorm-context.md +0 -197
  528. package/src/modules/bmb/workflows/create-workflow/checklist.md +0 -94
  529. package/src/modules/bmb/workflows/create-workflow/instructions.md +0 -724
  530. package/src/modules/bmb/workflows/create-workflow/workflow-creation-guide.md +0 -1306
  531. package/src/modules/bmb/workflows/create-workflow/workflow-template/checklist.md +0 -24
  532. package/src/modules/bmb/workflows/create-workflow/workflow-template/instructions.md +0 -13
  533. package/src/modules/bmb/workflows/create-workflow/workflow-template/template.md +0 -9
  534. package/src/modules/bmb/workflows/create-workflow/workflow-template/workflow.yaml +0 -65
  535. package/src/modules/bmb/workflows/create-workflow/workflow.yaml +0 -42
  536. package/src/modules/bmb/workflows/edit-agent/README.md +0 -112
  537. package/src/modules/bmb/workflows/edit-agent/checklist.md +0 -112
  538. package/src/modules/bmb/workflows/edit-agent/instructions.md +0 -290
  539. package/src/modules/bmb/workflows/edit-agent/workflow.yaml +0 -35
  540. package/src/modules/bmb/workflows/edit-module/README.md +0 -187
  541. package/src/modules/bmb/workflows/edit-module/checklist.md +0 -165
  542. package/src/modules/bmb/workflows/edit-module/instructions.md +0 -339
  543. package/src/modules/bmb/workflows/edit-module/workflow.yaml +0 -36
  544. package/src/modules/bmb/workflows/edit-workflow/README.md +0 -119
  545. package/src/modules/bmb/workflows/edit-workflow/checklist.md +0 -70
  546. package/src/modules/bmb/workflows/edit-workflow/instructions.md +0 -342
  547. package/src/modules/bmb/workflows/edit-workflow/workflow.yaml +0 -29
  548. package/src/modules/bmb/workflows/module-brief/README.md +0 -264
  549. package/src/modules/bmb/workflows/module-brief/checklist.md +0 -116
  550. package/src/modules/bmb/workflows/module-brief/instructions.md +0 -267
  551. package/src/modules/bmb/workflows/module-brief/template.md +0 -275
  552. package/src/modules/bmb/workflows/module-brief/workflow.yaml +0 -31
  553. package/src/modules/bmb/workflows/redoc/README.md +0 -87
  554. package/src/modules/bmb/workflows/redoc/checklist.md +0 -99
  555. package/src/modules/bmb/workflows/redoc/instructions.md +0 -265
  556. package/src/modules/bmb/workflows/redoc/workflow.yaml +0 -34
  557. package/src/modules/bmgd/README.md +0 -208
  558. package/src/modules/bmgd/_module-installer/install-config.yaml +0 -54
  559. package/src/modules/bmgd/agents/game-architect.agent.yaml +0 -33
  560. package/src/modules/bmgd/agents/game-designer.agent.yaml +0 -40
  561. package/src/modules/bmgd/agents/game-dev.agent.yaml +0 -40
  562. package/src/modules/bmgd/agents/game-scrum-master.agent.yaml +0 -75
  563. package/src/modules/bmgd/teams/default-party.csv +0 -10
  564. package/src/modules/bmgd/teams/team-gamedev.yaml +0 -18
  565. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/game-brain-methods.csv +0 -26
  566. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/game-context.md +0 -115
  567. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/instructions.md +0 -128
  568. package/src/modules/bmgd/workflows/1-preproduction/brainstorm-game/workflow.yaml +0 -41
  569. package/src/modules/bmgd/workflows/1-preproduction/game-brief/checklist.md +0 -128
  570. package/src/modules/bmgd/workflows/1-preproduction/game-brief/instructions.md +0 -371
  571. package/src/modules/bmgd/workflows/1-preproduction/game-brief/template.md +0 -205
  572. package/src/modules/bmgd/workflows/1-preproduction/game-brief/workflow.yaml +0 -44
  573. package/src/modules/bmgd/workflows/2-design/gdd/checklist.md +0 -148
  574. package/src/modules/bmgd/workflows/2-design/gdd/game-types/action-platformer.md +0 -45
  575. package/src/modules/bmgd/workflows/2-design/gdd/game-types/adventure.md +0 -84
  576. package/src/modules/bmgd/workflows/2-design/gdd/game-types/card-game.md +0 -76
  577. package/src/modules/bmgd/workflows/2-design/gdd/game-types/fighting.md +0 -89
  578. package/src/modules/bmgd/workflows/2-design/gdd/game-types/horror.md +0 -86
  579. package/src/modules/bmgd/workflows/2-design/gdd/game-types/idle-incremental.md +0 -78
  580. package/src/modules/bmgd/workflows/2-design/gdd/game-types/metroidvania.md +0 -87
  581. package/src/modules/bmgd/workflows/2-design/gdd/game-types/moba.md +0 -74
  582. package/src/modules/bmgd/workflows/2-design/gdd/game-types/party-game.md +0 -79
  583. package/src/modules/bmgd/workflows/2-design/gdd/game-types/puzzle.md +0 -58
  584. package/src/modules/bmgd/workflows/2-design/gdd/game-types/racing.md +0 -88
  585. package/src/modules/bmgd/workflows/2-design/gdd/game-types/rhythm.md +0 -79
  586. package/src/modules/bmgd/workflows/2-design/gdd/game-types/roguelike.md +0 -69
  587. package/src/modules/bmgd/workflows/2-design/gdd/game-types/rpg.md +0 -70
  588. package/src/modules/bmgd/workflows/2-design/gdd/game-types/sandbox.md +0 -79
  589. package/src/modules/bmgd/workflows/2-design/gdd/game-types/shooter.md +0 -62
  590. package/src/modules/bmgd/workflows/2-design/gdd/game-types/simulation.md +0 -73
  591. package/src/modules/bmgd/workflows/2-design/gdd/game-types/sports.md +0 -75
  592. package/src/modules/bmgd/workflows/2-design/gdd/game-types/strategy.md +0 -71
  593. package/src/modules/bmgd/workflows/2-design/gdd/game-types/survival.md +0 -79
  594. package/src/modules/bmgd/workflows/2-design/gdd/game-types/text-based.md +0 -91
  595. package/src/modules/bmgd/workflows/2-design/gdd/game-types/tower-defense.md +0 -79
  596. package/src/modules/bmgd/workflows/2-design/gdd/game-types/turn-based-tactics.md +0 -88
  597. package/src/modules/bmgd/workflows/2-design/gdd/game-types/visual-novel.md +0 -89
  598. package/src/modules/bmgd/workflows/2-design/gdd/game-types.csv +0 -25
  599. package/src/modules/bmgd/workflows/2-design/gdd/gdd-template.md +0 -153
  600. package/src/modules/bmgd/workflows/2-design/gdd/instructions-gdd.md +0 -501
  601. package/src/modules/bmgd/workflows/2-design/gdd/workflow.yaml +0 -81
  602. package/src/modules/bmgd/workflows/2-design/narrative/checklist.md +0 -139
  603. package/src/modules/bmgd/workflows/2-design/narrative/instructions-narrative.md +0 -603
  604. package/src/modules/bmgd/workflows/2-design/narrative/narrative-template.md +0 -195
  605. package/src/modules/bmgd/workflows/2-design/narrative/workflow.yaml +0 -38
  606. package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-patterns.yaml +0 -321
  607. package/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +0 -103
  608. package/src/modules/bmgd/workflows/3-technical/game-architecture/checklist.md +0 -240
  609. package/src/modules/bmgd/workflows/3-technical/game-architecture/decision-catalog.yaml +0 -222
  610. package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +0 -699
  611. package/src/modules/bmgd/workflows/3-technical/game-architecture/pattern-categories.csv +0 -13
  612. package/src/modules/bmgd/workflows/3-technical/game-architecture/workflow.yaml +0 -67
  613. package/src/modules/bmgd/workflows/4-production/code-review/backlog_template.md +0 -12
  614. package/src/modules/bmgd/workflows/4-production/code-review/checklist.md +0 -22
  615. package/src/modules/bmgd/workflows/4-production/code-review/instructions.md +0 -398
  616. package/src/modules/bmgd/workflows/4-production/code-review/workflow.yaml +0 -57
  617. package/src/modules/bmgd/workflows/4-production/correct-course/checklist.md +0 -279
  618. package/src/modules/bmgd/workflows/4-production/correct-course/instructions.md +0 -206
  619. package/src/modules/bmgd/workflows/4-production/correct-course/workflow.yaml +0 -52
  620. package/src/modules/bmgd/workflows/4-production/create-story/checklist.md +0 -240
  621. package/src/modules/bmgd/workflows/4-production/create-story/instructions.md +0 -256
  622. package/src/modules/bmgd/workflows/4-production/create-story/template.md +0 -51
  623. package/src/modules/bmgd/workflows/4-production/create-story/workflow.yaml +0 -68
  624. package/src/modules/bmgd/workflows/4-production/dev-story/checklist.md +0 -38
  625. package/src/modules/bmgd/workflows/4-production/dev-story/instructions.md +0 -267
  626. package/src/modules/bmgd/workflows/4-production/dev-story/workflow.yaml +0 -53
  627. package/src/modules/bmgd/workflows/4-production/epic-tech-context/checklist.md +0 -17
  628. package/src/modules/bmgd/workflows/4-production/epic-tech-context/instructions.md +0 -164
  629. package/src/modules/bmgd/workflows/4-production/epic-tech-context/template.md +0 -76
  630. package/src/modules/bmgd/workflows/4-production/epic-tech-context/workflow.yaml +0 -52
  631. package/src/modules/bmgd/workflows/4-production/retrospective/instructions.md +0 -1442
  632. package/src/modules/bmgd/workflows/4-production/retrospective/workflow.yaml +0 -52
  633. package/src/modules/bmgd/workflows/4-production/sprint-planning/instructions.md +0 -234
  634. package/src/modules/bmgd/workflows/4-production/sprint-planning/sprint-status-template.yaml +0 -55
  635. package/src/modules/bmgd/workflows/4-production/sprint-planning/workflow.yaml +0 -50
  636. package/src/modules/bmgd/workflows/4-production/story-context/checklist.md +0 -16
  637. package/src/modules/bmgd/workflows/4-production/story-context/context-template.xml +0 -34
  638. package/src/modules/bmgd/workflows/4-production/story-context/instructions.md +0 -209
  639. package/src/modules/bmgd/workflows/4-production/story-context/workflow.yaml +0 -57
  640. package/src/modules/bmgd/workflows/4-production/story-done/instructions.md +0 -111
  641. package/src/modules/bmgd/workflows/4-production/story-done/workflow.yaml +0 -28
  642. package/src/modules/bmgd/workflows/4-production/story-ready/instructions.md +0 -117
  643. package/src/modules/bmgd/workflows/4-production/story-ready/workflow.yaml +0 -25
  644. package/src/modules/bmm/README.md +0 -128
  645. package/src/modules/bmm/_module-installer/assets/bmm-kb.md +0 -1
  646. package/src/modules/bmm/_module-installer/assets/technical-decisions.md +0 -30
  647. package/src/modules/bmm/_module-installer/install-config.yaml +0 -60
  648. package/src/modules/bmm/_module-installer/installer.js +0 -131
  649. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +0 -35
  650. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +0 -32
  651. package/src/modules/bmm/agents/analyst.agent.yaml +0 -48
  652. package/src/modules/bmm/agents/architect.agent.yaml +0 -42
  653. package/src/modules/bmm/agents/dev.agent.yaml +0 -40
  654. package/src/modules/bmm/agents/pm.agent.yaml +0 -61
  655. package/src/modules/bmm/agents/sm.agent.yaml +0 -72
  656. package/src/modules/bmm/agents/tea.agent.yaml +0 -65
  657. package/src/modules/bmm/agents/tech-writer.agent.yaml +0 -73
  658. package/src/modules/bmm/agents/ux-designer.agent.yaml +0 -38
  659. package/src/modules/bmm/docs/README.md +0 -235
  660. package/src/modules/bmm/docs/agents-guide.md +0 -1056
  661. package/src/modules/bmm/docs/brownfield-guide.md +0 -754
  662. package/src/modules/bmm/docs/enterprise-agentic-development.md +0 -680
  663. package/src/modules/bmm/docs/faq.md +0 -587
  664. package/src/modules/bmm/docs/glossary.md +0 -320
  665. package/src/modules/bmm/docs/party-mode.md +0 -224
  666. package/src/modules/bmm/docs/quick-spec-flow.md +0 -652
  667. package/src/modules/bmm/docs/quick-start.md +0 -366
  668. package/src/modules/bmm/docs/scale-adaptive-system.md +0 -599
  669. package/src/modules/bmm/docs/test-architecture.md +0 -394
  670. package/src/modules/bmm/docs/workflow-architecture-reference.md +0 -371
  671. package/src/modules/bmm/docs/workflow-document-project-reference.md +0 -487
  672. package/src/modules/bmm/docs/workflows-analysis.md +0 -370
  673. package/src/modules/bmm/docs/workflows-implementation.md +0 -284
  674. package/src/modules/bmm/docs/workflows-planning.md +0 -601
  675. package/src/modules/bmm/docs/workflows-solutioning.md +0 -501
  676. package/src/modules/bmm/teams/default-party.csv +0 -19
  677. package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +0 -675
  678. package/src/modules/bmm/testarch/knowledge/component-tdd.md +0 -486
  679. package/src/modules/bmm/testarch/knowledge/contract-testing.md +0 -957
  680. package/src/modules/bmm/testarch/knowledge/data-factories.md +0 -500
  681. package/src/modules/bmm/testarch/knowledge/email-auth.md +0 -721
  682. package/src/modules/bmm/testarch/knowledge/error-handling.md +0 -725
  683. package/src/modules/bmm/testarch/knowledge/feature-flags.md +0 -750
  684. package/src/modules/bmm/testarch/knowledge/fixture-architecture.md +0 -401
  685. package/src/modules/bmm/testarch/knowledge/network-first.md +0 -486
  686. package/src/modules/bmm/testarch/knowledge/nfr-criteria.md +0 -670
  687. package/src/modules/bmm/testarch/knowledge/playwright-config.md +0 -730
  688. package/src/modules/bmm/testarch/knowledge/probability-impact.md +0 -601
  689. package/src/modules/bmm/testarch/knowledge/risk-governance.md +0 -615
  690. package/src/modules/bmm/testarch/knowledge/selective-testing.md +0 -732
  691. package/src/modules/bmm/testarch/knowledge/selector-resilience.md +0 -527
  692. package/src/modules/bmm/testarch/knowledge/test-healing-patterns.md +0 -644
  693. package/src/modules/bmm/testarch/knowledge/test-levels-framework.md +0 -473
  694. package/src/modules/bmm/testarch/knowledge/test-priorities-matrix.md +0 -373
  695. package/src/modules/bmm/testarch/knowledge/test-quality.md +0 -664
  696. package/src/modules/bmm/testarch/knowledge/timing-debugging.md +0 -372
  697. package/src/modules/bmm/testarch/knowledge/visual-debugging.md +0 -524
  698. package/src/modules/bmm/testarch/tea-index.csv +0 -22
  699. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/instructions.md +0 -110
  700. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/project-context.md +0 -25
  701. package/src/modules/bmm/workflows/1-analysis/brainstorm-project/workflow.yaml +0 -39
  702. package/src/modules/bmm/workflows/1-analysis/domain-research/instructions.md +0 -423
  703. package/src/modules/bmm/workflows/1-analysis/domain-research/template.md +0 -180
  704. package/src/modules/bmm/workflows/1-analysis/domain-research/workflow.yaml +0 -56
  705. package/src/modules/bmm/workflows/1-analysis/product-brief/checklist.md +0 -115
  706. package/src/modules/bmm/workflows/1-analysis/product-brief/instructions.md +0 -522
  707. package/src/modules/bmm/workflows/1-analysis/product-brief/template.md +0 -181
  708. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.yaml +0 -65
  709. package/src/modules/bmm/workflows/1-analysis/research/checklist-deep-prompt.md +0 -144
  710. package/src/modules/bmm/workflows/1-analysis/research/checklist-technical.md +0 -249
  711. package/src/modules/bmm/workflows/1-analysis/research/checklist.md +0 -299
  712. package/src/modules/bmm/workflows/1-analysis/research/claude-code/injections.yaml +0 -114
  713. package/src/modules/bmm/workflows/1-analysis/research/instructions-deep-prompt.md +0 -437
  714. package/src/modules/bmm/workflows/1-analysis/research/instructions-market.md +0 -674
  715. package/src/modules/bmm/workflows/1-analysis/research/instructions-router.md +0 -133
  716. package/src/modules/bmm/workflows/1-analysis/research/instructions-technical.md +0 -533
  717. package/src/modules/bmm/workflows/1-analysis/research/template-deep-prompt.md +0 -94
  718. package/src/modules/bmm/workflows/1-analysis/research/template-market.md +0 -347
  719. package/src/modules/bmm/workflows/1-analysis/research/template-technical.md +0 -245
  720. package/src/modules/bmm/workflows/1-analysis/research/workflow.yaml +0 -62
  721. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/checklist.md +0 -310
  722. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/instructions.md +0 -1306
  723. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/ux-design-template.md +0 -145
  724. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.yaml +0 -99
  725. package/src/modules/bmm/workflows/2-plan-workflows/prd/checklist.md +0 -346
  726. package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/epics-template.md +0 -80
  727. package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/instructions.md +0 -292
  728. package/src/modules/bmm/workflows/2-plan-workflows/prd/create-epics-and-stories/workflow.yaml +0 -53
  729. package/src/modules/bmm/workflows/2-plan-workflows/prd/domain-complexity.csv +0 -13
  730. package/src/modules/bmm/workflows/2-plan-workflows/prd/instructions.md +0 -525
  731. package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +0 -237
  732. package/src/modules/bmm/workflows/2-plan-workflows/prd/project-types.csv +0 -11
  733. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.yaml +0 -76
  734. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/checklist.md +0 -217
  735. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/epics-template.md +0 -74
  736. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions-generate-stories.md +0 -434
  737. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/instructions.md +0 -978
  738. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/tech-spec-template.md +0 -181
  739. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/user-story-template.md +0 -90
  740. package/src/modules/bmm/workflows/2-plan-workflows/tech-spec/workflow.yaml +0 -57
  741. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-patterns.yaml +0 -321
  742. package/src/modules/bmm/workflows/3-solutioning/architecture/architecture-template.md +0 -103
  743. package/src/modules/bmm/workflows/3-solutioning/architecture/checklist.md +0 -240
  744. package/src/modules/bmm/workflows/3-solutioning/architecture/decision-catalog.yaml +0 -222
  745. package/src/modules/bmm/workflows/3-solutioning/architecture/instructions.md +0 -696
  746. package/src/modules/bmm/workflows/3-solutioning/architecture/pattern-categories.csv +0 -13
  747. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.yaml +0 -96
  748. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/checklist.md +0 -169
  749. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/instructions.md +0 -302
  750. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/template.md +0 -146
  751. package/src/modules/bmm/workflows/3-solutioning/solutioning-gate-check/workflow.yaml +0 -66
  752. package/src/modules/bmm/workflows/4-implementation/code-review/backlog_template.md +0 -12
  753. package/src/modules/bmm/workflows/4-implementation/code-review/checklist.md +0 -22
  754. package/src/modules/bmm/workflows/4-implementation/code-review/instructions.md +0 -398
  755. package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +0 -57
  756. package/src/modules/bmm/workflows/4-implementation/correct-course/checklist.md +0 -279
  757. package/src/modules/bmm/workflows/4-implementation/correct-course/instructions.md +0 -206
  758. package/src/modules/bmm/workflows/4-implementation/correct-course/workflow.yaml +0 -52
  759. package/src/modules/bmm/workflows/4-implementation/create-story/checklist.md +0 -240
  760. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.md +0 -256
  761. package/src/modules/bmm/workflows/4-implementation/create-story/template.md +0 -51
  762. package/src/modules/bmm/workflows/4-implementation/create-story/workflow.yaml +0 -68
  763. package/src/modules/bmm/workflows/4-implementation/dev-story/checklist.md +0 -38
  764. package/src/modules/bmm/workflows/4-implementation/dev-story/instructions.md +0 -267
  765. package/src/modules/bmm/workflows/4-implementation/dev-story/workflow.yaml +0 -53
  766. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/checklist.md +0 -17
  767. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/instructions.md +0 -164
  768. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/template.md +0 -76
  769. package/src/modules/bmm/workflows/4-implementation/epic-tech-context/workflow.yaml +0 -52
  770. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +0 -1442
  771. package/src/modules/bmm/workflows/4-implementation/retrospective/workflow.yaml +0 -52
  772. package/src/modules/bmm/workflows/4-implementation/sprint-planning/checklist.md +0 -33
  773. package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +0 -234
  774. package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +0 -55
  775. package/src/modules/bmm/workflows/4-implementation/sprint-planning/workflow.yaml +0 -50
  776. package/src/modules/bmm/workflows/4-implementation/story-context/checklist.md +0 -16
  777. package/src/modules/bmm/workflows/4-implementation/story-context/context-template.xml +0 -34
  778. package/src/modules/bmm/workflows/4-implementation/story-context/instructions.md +0 -209
  779. package/src/modules/bmm/workflows/4-implementation/story-context/workflow.yaml +0 -57
  780. package/src/modules/bmm/workflows/4-implementation/story-done/instructions.md +0 -111
  781. package/src/modules/bmm/workflows/4-implementation/story-done/workflow.yaml +0 -28
  782. package/src/modules/bmm/workflows/4-implementation/story-ready/instructions.md +0 -117
  783. package/src/modules/bmm/workflows/4-implementation/story-ready/workflow.yaml +0 -25
  784. package/src/modules/bmm/workflows/document-project/checklist.md +0 -245
  785. package/src/modules/bmm/workflows/document-project/instructions.md +0 -222
  786. package/src/modules/bmm/workflows/document-project/templates/project-scan-report-schema.json +0 -160
  787. package/src/modules/bmm/workflows/document-project/workflow.yaml +0 -36
  788. package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +0 -298
  789. package/src/modules/bmm/workflows/document-project/workflows/deep-dive.yaml +0 -31
  790. package/src/modules/bmm/workflows/document-project/workflows/full-scan-instructions.md +0 -1106
  791. package/src/modules/bmm/workflows/document-project/workflows/full-scan.yaml +0 -31
  792. package/src/modules/bmm/workflows/techdoc/documentation-standards.md +0 -262
  793. package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +0 -363
  794. package/src/modules/bmm/workflows/testarch/atdd/checklist.md +0 -373
  795. package/src/modules/bmm/workflows/testarch/atdd/instructions.md +0 -785
  796. package/src/modules/bmm/workflows/testarch/atdd/workflow.yaml +0 -54
  797. package/src/modules/bmm/workflows/testarch/automate/checklist.md +0 -580
  798. package/src/modules/bmm/workflows/testarch/automate/instructions.md +0 -1303
  799. package/src/modules/bmm/workflows/testarch/automate/workflow.yaml +0 -63
  800. package/src/modules/bmm/workflows/testarch/ci/checklist.md +0 -246
  801. package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +0 -165
  802. package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +0 -128
  803. package/src/modules/bmm/workflows/testarch/ci/instructions.md +0 -517
  804. package/src/modules/bmm/workflows/testarch/ci/workflow.yaml +0 -55
  805. package/src/modules/bmm/workflows/testarch/framework/checklist.md +0 -321
  806. package/src/modules/bmm/workflows/testarch/framework/instructions.md +0 -455
  807. package/src/modules/bmm/workflows/testarch/framework/workflow.yaml +0 -55
  808. package/src/modules/bmm/workflows/testarch/nfr-assess/checklist.md +0 -405
  809. package/src/modules/bmm/workflows/testarch/nfr-assess/instructions.md +0 -722
  810. package/src/modules/bmm/workflows/testarch/nfr-assess/nfr-report-template.md +0 -443
  811. package/src/modules/bmm/workflows/testarch/nfr-assess/workflow.yaml +0 -58
  812. package/src/modules/bmm/workflows/testarch/test-design/checklist.md +0 -234
  813. package/src/modules/bmm/workflows/testarch/test-design/instructions.md +0 -782
  814. package/src/modules/bmm/workflows/testarch/test-design/test-design-template.md +0 -285
  815. package/src/modules/bmm/workflows/testarch/test-design/workflow.yaml +0 -58
  816. package/src/modules/bmm/workflows/testarch/test-review/checklist.md +0 -470
  817. package/src/modules/bmm/workflows/testarch/test-review/instructions.md +0 -608
  818. package/src/modules/bmm/workflows/testarch/test-review/test-review-template.md +0 -388
  819. package/src/modules/bmm/workflows/testarch/test-review/workflow.yaml +0 -55
  820. package/src/modules/bmm/workflows/testarch/trace/checklist.md +0 -654
  821. package/src/modules/bmm/workflows/testarch/trace/instructions.md +0 -1045
  822. package/src/modules/bmm/workflows/testarch/trace/trace-template.md +0 -673
  823. package/src/modules/bmm/workflows/testarch/trace/workflow.yaml +0 -68
  824. package/src/modules/bmm/workflows/workflow-status/init/instructions.md +0 -823
  825. package/src/modules/bmm/workflows/workflow-status/init/workflow.yaml +0 -29
  826. package/src/modules/bmm/workflows/workflow-status/instructions.md +0 -387
  827. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +0 -120
  828. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +0 -108
  829. package/src/modules/bmm/workflows/workflow-status/paths/game-design.yaml +0 -52
  830. package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +0 -104
  831. package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +0 -95
  832. package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-brownfield.yaml +0 -58
  833. package/src/modules/bmm/workflows/workflow-status/paths/quick-flow-greenfield.yaml +0 -47
  834. package/src/modules/bmm/workflows/workflow-status/project-levels.yaml +0 -59
  835. package/src/modules/bmm/workflows/workflow-status/workflow-status-template.yaml +0 -24
  836. package/src/modules/bmm/workflows/workflow-status/workflow.yaml +0 -30
  837. package/src/modules/cis/README.md +0 -153
  838. package/src/modules/cis/_module-installer/install-config.yaml +0 -16
  839. package/src/modules/cis/_module-installer/installer.js +0 -92
  840. package/src/modules/cis/agents/README.md +0 -104
  841. package/src/modules/cis/agents/brainstorming-coach.agent.yaml +0 -28
  842. package/src/modules/cis/agents/creative-problem-solver.agent.yaml +0 -28
  843. package/src/modules/cis/agents/design-thinking-coach.agent.yaml +0 -28
  844. package/src/modules/cis/agents/innovation-strategist.agent.yaml +0 -28
  845. package/src/modules/cis/agents/storyteller.agent.yaml +0 -28
  846. package/src/modules/cis/teams/creative-squad.yaml +0 -7
  847. package/src/modules/cis/teams/default-party.csv +0 -11
  848. package/src/modules/cis/workflows/README.md +0 -139
  849. package/src/modules/cis/workflows/design-thinking/README.md +0 -56
  850. package/src/modules/cis/workflows/design-thinking/design-methods.csv +0 -31
  851. package/src/modules/cis/workflows/design-thinking/instructions.md +0 -200
  852. package/src/modules/cis/workflows/design-thinking/template.md +0 -111
  853. package/src/modules/cis/workflows/design-thinking/workflow.yaml +0 -43
  854. package/src/modules/cis/workflows/innovation-strategy/README.md +0 -56
  855. package/src/modules/cis/workflows/innovation-strategy/innovation-frameworks.csv +0 -31
  856. package/src/modules/cis/workflows/innovation-strategy/instructions.md +0 -274
  857. package/src/modules/cis/workflows/innovation-strategy/template.md +0 -189
  858. package/src/modules/cis/workflows/innovation-strategy/workflow.yaml +0 -43
  859. package/src/modules/cis/workflows/problem-solving/README.md +0 -56
  860. package/src/modules/cis/workflows/problem-solving/instructions.md +0 -250
  861. package/src/modules/cis/workflows/problem-solving/solving-methods.csv +0 -31
  862. package/src/modules/cis/workflows/problem-solving/template.md +0 -165
  863. package/src/modules/cis/workflows/problem-solving/workflow.yaml +0 -43
  864. package/src/modules/cis/workflows/storytelling/README.md +0 -58
  865. package/src/modules/cis/workflows/storytelling/instructions.md +0 -291
  866. package/src/modules/cis/workflows/storytelling/story-types.csv +0 -26
  867. package/src/modules/cis/workflows/storytelling/template.md +0 -113
  868. package/src/modules/cis/workflows/storytelling/workflow.yaml +0 -43
  869. package/src/utility/models/agent-activation-ide.xml +0 -51
  870. package/src/utility/models/agent-activation-web.xml +0 -60
  871. package/src/utility/models/agent-command-header.md +0 -1
  872. package/src/utility/models/agent-config-template.md +0 -23
  873. package/src/utility/models/agent-in-team-activation.xml +0 -3
  874. package/src/utility/models/fragments/activation-rules.xml +0 -8
  875. package/src/utility/models/fragments/activation-steps.xml +0 -16
  876. package/src/utility/models/fragments/handler-action.xml +0 -4
  877. package/src/utility/models/fragments/handler-exec.xml +0 -5
  878. package/src/utility/models/fragments/handler-tmpl.xml +0 -5
  879. package/src/utility/models/fragments/handler-validate-workflow.xml +0 -7
  880. package/src/utility/models/fragments/handler-workflow.xml +0 -9
  881. package/src/utility/models/fragments/menu-handlers.xml +0 -6
  882. package/src/utility/models/fragments/web-bundle-activation-steps.xml +0 -32
  883. package/src/utility/templates/agent.customize.template.yaml +0 -42
  884. package/test/fixtures/agent-schema/invalid/metadata/core-agent-with-module.agent.yaml +0 -26
  885. package/test/fixtures/agent-schema/invalid/metadata/module-agent-missing-module.agent.yaml +0 -25
  886. package/test/fixtures/agent-schema/invalid/metadata/wrong-module-value.agent.yaml +0 -26
  887. package/tools/cli/bundlers/bundle-web.js +0 -179
  888. package/tools/cli/bundlers/test-analyst.js +0 -28
  889. package/tools/cli/bundlers/test-bundler.js +0 -118
  890. package/tools/cli/bundlers/web-bundler.js +0 -1667
  891. package/tools/cli/commands/build.js +0 -458
  892. package/tools/cli/commands/list.js +0 -28
  893. package/tools/cli/commands/update.js +0 -28
  894. package/tools/cli/installers/lib/ide/auggie.js +0 -179
  895. package/tools/cli/installers/lib/ide/claude-code.js +0 -471
  896. package/tools/cli/installers/lib/ide/cline.js +0 -220
  897. package/tools/cli/installers/lib/ide/crush.js +0 -240
  898. package/tools/cli/installers/lib/ide/cursor.js +0 -352
  899. package/tools/cli/installers/lib/ide/gemini.js +0 -206
  900. package/tools/cli/installers/lib/ide/iflow.js +0 -125
  901. package/tools/cli/installers/lib/ide/opencode.js +0 -212
  902. package/tools/cli/installers/lib/ide/qwen.js +0 -318
  903. package/tools/cli/installers/lib/ide/roo.js +0 -253
  904. package/tools/cli/installers/lib/ide/templates/gemini-agent-command.toml +0 -14
  905. package/tools/cli/installers/lib/ide/templates/gemini-task-command.toml +0 -12
  906. package/tools/cli/installers/lib/ide/trae.js +0 -266
  907. package/tools/cli/installers/lib/ide/windsurf.js +0 -211
  908. package/tools/cli/lib/replace-project-root.js +0 -239
  909. package/tools/cli/regenerate-manifests.js +0 -28
  910. package/tools/cli/test-yaml-builder.js +0 -43
  911. package/tools/flattener/aggregate.js +0 -76
  912. package/tools/flattener/binary.js +0 -80
  913. package/tools/flattener/discovery.js +0 -71
  914. package/tools/flattener/files.js +0 -35
  915. package/tools/flattener/ignoreRules.js +0 -172
  916. package/tools/flattener/main.js +0 -483
  917. package/tools/flattener/projectRoot.js +0 -201
  918. package/tools/flattener/prompts.js +0 -44
  919. package/tools/flattener/stats.helpers.js +0 -368
  920. package/tools/flattener/stats.js +0 -75
  921. package/tools/flattener/test-matrix.js +0 -409
  922. package/tools/flattener/xml.js +0 -88
  923. package/tools/validate-bundles.js +0 -87
  924. package/v6-open-items.md +0 -17
  925. /package/src/{modules/bmm → bmm}/teams/team-fullstack.yaml +0 -0
  926. /package/src/{modules/bmgd/workflows/4-production → bmm/workflows/4-implementation}/sprint-planning/checklist.md +0 -0
  927. /package/src/{modules/bmm → bmm}/workflows/document-project/documentation-requirements.csv +0 -0
  928. /package/src/{modules/bmm → bmm}/workflows/document-project/templates/deep-dive-template.md +0 -0
  929. /package/src/{modules/bmm → bmm}/workflows/document-project/templates/index-template.md +0 -0
  930. /package/src/{modules/bmm → bmm}/workflows/document-project/templates/project-overview-template.md +0 -0
  931. /package/src/{modules/bmm → bmm}/workflows/document-project/templates/source-tree-template.md +0 -0
  932. /package/src/utility/{models/fragments/handler-data.xml → agent-components/handler-data.txt} +0 -0
  933. /package/{src/utility/models/action-command-header.md → tools/cli/installers/lib/ide/templates/split/.gitkeep} +0 -0
@@ -1,1667 +0,0 @@
1
- const path = require('node:path');
2
- const fs = require('fs-extra');
3
- const chalk = require('chalk');
4
- const yaml = require('js-yaml');
5
- const { DependencyResolver } = require('../installers/lib/core/dependency-resolver');
6
- const { XmlHandler } = require('../lib/xml-handler');
7
- const { YamlXmlBuilder } = require('../lib/yaml-xml-builder');
8
- const { AgentPartyGenerator } = require('../lib/agent-party-generator');
9
- const xml2js = require('xml2js');
10
- const { getProjectRoot, getSourcePath, getModulePath } = require('../lib/project-root');
11
-
12
- class WebBundler {
13
- constructor(sourceDir = null, outputDir = 'web-bundles') {
14
- this.sourceDir = sourceDir || getSourcePath();
15
- this.outputDir = path.isAbsolute(outputDir) ? outputDir : path.join(getProjectRoot(), outputDir);
16
- this.modulesPath = getSourcePath('modules');
17
- this.utilityPath = getSourcePath('utility');
18
-
19
- this.dependencyResolver = new DependencyResolver();
20
- this.xmlHandler = new XmlHandler();
21
- this.yamlBuilder = new YamlXmlBuilder();
22
-
23
- // Cache for resolved dependencies to avoid duplicates
24
- this.dependencyCache = new Map();
25
-
26
- // Discovered agents and teams for manifest generation
27
- this.discoveredAgents = [];
28
- this.discoveredTeams = [];
29
-
30
- // Temporary directory for generated manifests
31
- this.tempDir = path.join(process.cwd(), '.bundler-temp');
32
- this.tempManifestDir = path.join(this.tempDir, 'bmad', '_cfg');
33
-
34
- // Bundle statistics
35
- this.stats = {
36
- totalAgents: 0,
37
- bundledAgents: 0,
38
- skippedAgents: 0,
39
- failedAgents: 0,
40
- invalidXml: 0,
41
- warnings: [],
42
- };
43
- }
44
-
45
- /**
46
- * Main entry point to bundle all modules
47
- */
48
- async bundleAll() {
49
- console.log(chalk.cyan.bold('═══════════════════════════════════════════════'));
50
- console.log(chalk.cyan.bold(' 🚀 Web Bundle Generation'));
51
- console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
52
-
53
- try {
54
- // Vendor cross-module workflows FIRST
55
- const modules = await this.discoverModules();
56
- for (const module of modules) {
57
- await this.vendorCrossModuleWorkflows(module);
58
- }
59
-
60
- // Pre-discover all modules to generate complete manifests
61
- for (const module of modules) {
62
- await this.preDiscoverModule(module);
63
- }
64
-
65
- // Create temporary manifest files
66
- await this.createTempManifests();
67
-
68
- // Process all modules
69
- for (const module of modules) {
70
- await this.bundleModule(module);
71
- }
72
-
73
- // Display summary
74
- this.displaySummary();
75
- } finally {
76
- // Clean up temp files
77
- await this.cleanupTempFiles();
78
- }
79
- }
80
-
81
- /**
82
- * Bundle a specific module
83
- */
84
- async bundleModule(moduleName) {
85
- const modulePath = path.join(this.modulesPath, moduleName);
86
-
87
- if (!(await fs.pathExists(modulePath))) {
88
- console.log(chalk.yellow(`Module ${moduleName} not found`));
89
- return { module: moduleName, agents: [], teams: [] };
90
- }
91
-
92
- console.log(chalk.bold(`\n📦 Bundling module: ${moduleName}`));
93
-
94
- const results = {
95
- module: moduleName,
96
- agents: [],
97
- teams: [],
98
- };
99
-
100
- // Vendor cross-module workflows first (if not already done by bundleAll)
101
- await this.vendorCrossModuleWorkflows(moduleName);
102
-
103
- // Pre-discover all agents and teams for manifest generation
104
- await this.preDiscoverModule(moduleName);
105
-
106
- // Ensure temp manifests exist (might not exist if called directly)
107
- if (!(await fs.pathExists(this.tempManifestDir))) {
108
- await this.createTempManifests();
109
- }
110
-
111
- // Process agents
112
- const agents = await this.discoverAgents(modulePath);
113
- for (const agent of agents) {
114
- try {
115
- await this.bundleAgent(moduleName, agent, false); // false = don't track again
116
- results.agents.push(agent);
117
- } catch (error) {
118
- console.error(` Failed to bundle agent ${agent}:`, error.message);
119
- }
120
- }
121
-
122
- // Process teams
123
- const teams = await this.discoverTeams(modulePath);
124
- for (const team of teams) {
125
- try {
126
- await this.bundleTeam(moduleName, team);
127
- results.teams.push(team);
128
- } catch (error) {
129
- console.error(` Failed to bundle team ${team}:`, error.message);
130
- }
131
- }
132
-
133
- return results;
134
- }
135
-
136
- /**
137
- * Bundle a single agent
138
- */
139
- async bundleAgent(moduleName, agentFile, shouldTrack = true) {
140
- const agentName = agentFile.endsWith('.agent.yaml') ? path.basename(agentFile, '.agent.yaml') : path.basename(agentFile, '.md');
141
- this.stats.totalAgents++;
142
-
143
- console.log(chalk.dim(` → Processing: ${agentName}`));
144
-
145
- // Vendor cross-module workflows first (if not already done)
146
- await this.vendorCrossModuleWorkflows(moduleName);
147
-
148
- const agentPath = path.join(this.modulesPath, moduleName, 'agents', agentFile);
149
-
150
- // Check if agent file exists
151
- if (!(await fs.pathExists(agentPath))) {
152
- this.stats.failedAgents++;
153
- console.log(chalk.red(` ✗ Agent file not found`));
154
- throw new Error(`Agent file not found: ${agentPath}`);
155
- }
156
-
157
- let content;
158
- let agentXml;
159
-
160
- // Handle YAML agents - build in-memory to XML
161
- if (agentFile.endsWith('.agent.yaml')) {
162
- // Build agent from YAML (no customize file for web bundles)
163
- const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
164
- includeMetadata: false, // Don't include build metadata in web bundles
165
- forWebBundle: true, // Use web-specific activation fragments
166
- });
167
-
168
- content = xmlContent;
169
- agentXml = this.extractAgentXml(xmlContent);
170
- } else {
171
- // Legacy MD format - read and extract XML
172
- content = await fs.readFile(agentPath, 'utf8');
173
- agentXml = this.extractAgentXml(content);
174
- }
175
-
176
- if (!agentXml) {
177
- this.stats.failedAgents++;
178
- console.log(chalk.red(` ✗ No agent XML found in ${agentFile}`));
179
- return;
180
- }
181
-
182
- // Check if agent has bundle="false" attribute
183
- if (this.shouldSkipBundling(agentXml)) {
184
- this.stats.skippedAgents++;
185
- console.log(chalk.gray(` ⊘ Skipped (bundle="false")`));
186
- return;
187
- }
188
-
189
- // Process {project-root} references in agent XML
190
- agentXml = this.processProjectRootReferences(agentXml);
191
-
192
- // Track for manifest generation BEFORE generating manifests (if not pre-discovered)
193
- if (shouldTrack) {
194
- const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
195
- if (agentDetails) {
196
- this.discoveredAgents.push(agentDetails);
197
- }
198
- }
199
-
200
- // Resolve dependencies with warning tracking
201
- const dependencyWarnings = [];
202
- const { dependencies, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, dependencyWarnings);
203
-
204
- if (dependencyWarnings.length > 0) {
205
- this.stats.warnings.push({ agent: agentName, warnings: dependencyWarnings });
206
- }
207
-
208
- // Check for module's default-party.csv and include it as agent manifest
209
- const defaultPartyPath = path.join(this.modulesPath, moduleName, 'teams', 'default-party.csv');
210
- if (await fs.pathExists(defaultPartyPath)) {
211
- const partyContent = await fs.readFile(defaultPartyPath, 'utf8');
212
- // Process any placeholders in the CSV content
213
- const processedPartyContent = this.processProjectRootReferences(partyContent);
214
- // Wrap as text to preserve raw CSV format in CDATA
215
- const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
216
- dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
217
- console.log(chalk.gray(` + Added party manifest from module default-party.csv`));
218
- }
219
-
220
- // Remove commands for skipped workflows from agent XML
221
- if (skippedWorkflows.length > 0) {
222
- agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
223
- }
224
-
225
- // Build the bundle (no manifests for individual agents)
226
- const bundle = this.buildAgentBundle(agentXml, dependencies);
227
-
228
- // Validate XML
229
- const isValid = await this.validateXml(bundle);
230
- if (!isValid) {
231
- this.stats.invalidXml++;
232
- console.log(chalk.red(` ⚠ Invalid XML generated!`));
233
- }
234
-
235
- // Write bundle to output
236
- const outputPath = path.join(this.outputDir, moduleName, 'agents', `${agentName}.xml`);
237
- await fs.ensureDir(path.dirname(outputPath));
238
- await fs.writeFile(outputPath, bundle, 'utf8');
239
-
240
- this.stats.bundledAgents++;
241
- const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
242
- console.log(` ${statusIcon} Bundled: ${agentName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
243
- }
244
-
245
- /**
246
- * Bundle a team - includes orchestrator and all agents with their dependencies
247
- */
248
- async bundleTeam(moduleName, teamFile) {
249
- const teamName = path.basename(teamFile, path.extname(teamFile));
250
- console.log(chalk.dim(` → Processing team: ${teamName}`));
251
-
252
- const teamPath = path.join(this.modulesPath, moduleName, 'teams', teamFile);
253
-
254
- // Check if team file exists
255
- if (!(await fs.pathExists(teamPath))) {
256
- console.log(chalk.red(` ✗ Team file not found`));
257
- throw new Error(`Team file not found: ${teamPath}`);
258
- }
259
-
260
- // Read and parse team YAML
261
- const teamContent = await fs.readFile(teamPath, 'utf8');
262
- const teamConfig = yaml.load(teamContent);
263
-
264
- if (!teamConfig || !teamConfig.bundle) {
265
- console.log(chalk.red(` ✗ Invalid team configuration`));
266
- return;
267
- }
268
-
269
- // Start building the team bundle
270
- const dependencies = new Map();
271
- const processed = new Set();
272
- const allAgentXmls = [];
273
- const warnings = [];
274
-
275
- // Check if team has a party CSV file (agent manifest)
276
- const hasPartyFile = teamConfig.party && teamConfig.party.endsWith('.csv');
277
- if (hasPartyFile) {
278
- // Load the party CSV and add it as bmad/_cfg/agent-manifest.csv
279
- const partyPath = path.join(path.dirname(teamPath), teamConfig.party.replace(/^\.\//, ''));
280
- if (await fs.pathExists(partyPath)) {
281
- const partyContent = await fs.readFile(partyPath, 'utf8');
282
- // Process any placeholders in the CSV content
283
- const processedPartyContent = this.processProjectRootReferences(partyContent);
284
- // Wrap as text/csv to preserve raw CSV format in CDATA
285
- const wrappedParty = this.wrapContentInXml(processedPartyContent, 'bmad/_cfg/agent-manifest.csv', 'text');
286
- dependencies.set('bmad/_cfg/agent-manifest.csv', wrappedParty);
287
- console.log(chalk.gray(` + Added agent manifest from: ${teamConfig.party}`));
288
- } else {
289
- console.log(chalk.yellow(` ⚠ Party file not found: ${partyPath}`));
290
- }
291
- }
292
-
293
- // 1. First, always add the bmad-web-orchestrator (XML file only, no transformation needed)
294
- const orchestratorXmlPath = path.join(this.sourceDir, 'core', 'agents', 'bmad-web-orchestrator.agent.xml');
295
-
296
- if (await fs.pathExists(orchestratorXmlPath)) {
297
- // Read the XML file directly - no transformation needed
298
- const xmlContent = await fs.readFile(orchestratorXmlPath, 'utf8');
299
- let orchestratorXml = xmlContent.trim();
300
-
301
- // Process {project-root} references
302
- orchestratorXml = this.processProjectRootReferences(orchestratorXml);
303
-
304
- // Inject help/exit menu items only (orchestrator has its own activation)
305
- orchestratorXml = this.injectHelpExitMenuItems(orchestratorXml);
306
-
307
- // Resolve orchestrator dependencies
308
- const { dependencies: orchDeps } = await this.resolveAgentDependencies(orchestratorXml, 'core', warnings);
309
-
310
- // Merge orchestrator dependencies
311
- for (const [id, content] of orchDeps) {
312
- if (!dependencies.has(id)) {
313
- dependencies.set(id, content);
314
- }
315
- }
316
-
317
- // Add orchestrator XML first
318
- allAgentXmls.push(orchestratorXml);
319
- console.log(chalk.gray(` + Added orchestrator: bmad-web-orchestrator`));
320
- } else {
321
- console.log(chalk.yellow(` ⚠ Orchestrator not found at: ${orchestratorXmlPath}`));
322
- }
323
-
324
- // 2. Determine which agents to include
325
- let agentsToBundle = [];
326
-
327
- if (teamConfig.agents === '*' || (Array.isArray(teamConfig.agents) && teamConfig.agents.includes('*'))) {
328
- // Include all agents from the module
329
- const agentsPath = path.join(this.modulesPath, moduleName, 'agents');
330
- if (await fs.pathExists(agentsPath)) {
331
- const agentFiles = await fs.readdir(agentsPath);
332
- agentsToBundle = agentFiles
333
- .filter((file) => file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme')))
334
- .map((file) => file.replace(/\.(agent\.yaml|md)$/, ''));
335
- }
336
- } else if (Array.isArray(teamConfig.agents)) {
337
- // Include specific agents listed
338
- agentsToBundle = teamConfig.agents;
339
- } else {
340
- console.log(chalk.yellow(` ⚠ No agents specified in team configuration`));
341
- }
342
-
343
- // 3. Process each agent and their dependencies
344
- for (const agentName of agentsToBundle) {
345
- // Try YAML first, then MD
346
- let agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.agent.yaml`);
347
- let isYaml = await fs.pathExists(agentPath);
348
-
349
- if (!isYaml) {
350
- agentPath = path.join(this.modulesPath, moduleName, 'agents', `${agentName}.md`);
351
- if (!(await fs.pathExists(agentPath))) {
352
- console.log(chalk.yellow(` ⚠ Agent not found: ${agentName}`));
353
- continue;
354
- }
355
- }
356
-
357
- let agentXml;
358
-
359
- if (isYaml) {
360
- // Build YAML agent in-memory - skip activation for team agents (orchestrator handles it)
361
- const xmlContent = await this.yamlBuilder.buildFromYaml(agentPath, null, {
362
- includeMetadata: false,
363
- skipActivation: true, // Skip activation for team agents
364
- });
365
- agentXml = this.extractAgentXml(xmlContent);
366
- } else {
367
- // Read legacy MD agent
368
- const agentContent = await fs.readFile(agentPath, 'utf8');
369
- agentXml = this.extractAgentXml(agentContent);
370
- }
371
-
372
- if (!agentXml) {
373
- console.log(chalk.yellow(` ⚠ No XML found in agent: ${agentName}`));
374
- continue;
375
- }
376
-
377
- // Skip agents with bundle="false"
378
- if (this.shouldSkipBundling(agentXml)) {
379
- console.log(chalk.gray(` ⊘ Skipped agent (bundle="false"): ${agentName}`));
380
- continue;
381
- }
382
-
383
- // Process {project-root} references
384
- agentXml = this.processProjectRootReferences(agentXml);
385
-
386
- // Resolve agent dependencies
387
- const agentWarnings = [];
388
- const { dependencies: agentDeps, skippedWorkflows } = await this.resolveAgentDependencies(agentXml, moduleName, agentWarnings);
389
-
390
- if (agentWarnings.length > 0) {
391
- warnings.push({ agent: agentName, warnings: agentWarnings });
392
- }
393
-
394
- // Remove commands for skipped workflows from agent XML
395
- if (skippedWorkflows.length > 0) {
396
- agentXml = this.removeSkippedWorkflowCommands(agentXml, skippedWorkflows);
397
- }
398
-
399
- // Merge agent dependencies (deduplicate)
400
- for (const [id, content] of agentDeps) {
401
- if (!dependencies.has(id)) {
402
- dependencies.set(id, content);
403
- }
404
- }
405
-
406
- // Skip web activation injection for team agents - orchestrator handles everything
407
- // Only inject help/exit menu items if missing
408
- agentXml = this.injectHelpExitMenuItems(agentXml);
409
-
410
- // Add agent XML to the collection
411
- allAgentXmls.push(agentXml);
412
- console.log(chalk.gray(` + Added agent: ${agentName}`));
413
- }
414
-
415
- // 4. Build the team bundle XML
416
- const bundle = this.buildTeamBundle(teamConfig.bundle, allAgentXmls, dependencies);
417
-
418
- // 5. Validate XML
419
- const isValid = await this.validateXml(bundle);
420
- if (!isValid) {
421
- console.log(chalk.red(` ⚠ Invalid XML generated for team!`));
422
- }
423
-
424
- // 6. Write bundle to output
425
- const outputPath = path.join(this.outputDir, moduleName, 'teams', `${teamName}.xml`);
426
- await fs.ensureDir(path.dirname(outputPath));
427
- await fs.writeFile(outputPath, bundle, 'utf8');
428
-
429
- const statusIcon = isValid ? chalk.green('✓') : chalk.yellow('⚠');
430
- console.log(` ${statusIcon} Bundled team: ${teamName}.xml${isValid ? '' : chalk.yellow(' (invalid XML)')}`);
431
-
432
- // Track warnings
433
- if (warnings.length > 0) {
434
- this.stats.warnings.push(...warnings);
435
- }
436
- }
437
-
438
- /**
439
- * Build the final team bundle XML
440
- */
441
- buildTeamBundle(teamMetadata, agentXmls, dependencies) {
442
- const parts = ['<?xml version="1.0" encoding="UTF-8"?>', '<team-bundle>', ' <!-- Agent Definitions -->', ' <agents>'];
443
-
444
- for (const agentXml of agentXmls) {
445
- // Indent each agent XML properly (add 4 spaces to each line)
446
- const indentedAgent = agentXml
447
- .split('\n')
448
- .map((line) => ' ' + line)
449
- .join('\n');
450
- parts.push(indentedAgent);
451
- }
452
-
453
- parts.push(' </agents>');
454
-
455
- // Add all dependencies
456
- if (dependencies && dependencies.size > 0) {
457
- parts.push('', ' <!-- Shared Dependencies -->', ' <dependencies>');
458
-
459
- for (const [id, content] of dependencies) {
460
- // All dependencies are now consistently wrapped in <file> elements
461
- // Indent properly (add 4 spaces to each line)
462
- const indentedContent = content
463
- .split('\n')
464
- .map((line) => ' ' + line)
465
- .join('\n');
466
- parts.push(indentedContent);
467
- }
468
-
469
- parts.push(' </dependencies>');
470
- }
471
-
472
- parts.push('</team-bundle>');
473
-
474
- return parts.join('\n');
475
- }
476
-
477
- /**
478
- * Vendor cross-module workflows for a module
479
- * Scans source agent YAML files for workflow-install attributes and copies workflows
480
- */
481
- async vendorCrossModuleWorkflows(moduleName) {
482
- const modulePath = path.join(this.modulesPath, moduleName);
483
- const agentsPath = path.join(modulePath, 'agents');
484
-
485
- if (!(await fs.pathExists(agentsPath))) {
486
- return;
487
- }
488
-
489
- // Find all agent YAML files
490
- const files = await fs.readdir(agentsPath);
491
- const yamlFiles = files.filter((f) => f.endsWith('.agent.yaml'));
492
-
493
- for (const agentFile of yamlFiles) {
494
- const agentPath = path.join(agentsPath, agentFile);
495
- const agentYaml = yaml.load(await fs.readFile(agentPath, 'utf8'));
496
-
497
- const menuItems = agentYaml?.agent?.menu || [];
498
- const workflowInstallItems = menuItems.filter((item) => item['workflow-install']);
499
-
500
- for (const item of workflowInstallItems) {
501
- const sourceWorkflowPath = item.workflow;
502
- const installWorkflowPath = item['workflow-install'];
503
-
504
- if (!sourceWorkflowPath || !installWorkflowPath) {
505
- continue;
506
- }
507
-
508
- // Parse paths to extract module and workflow location
509
- // Support both {project-root}/bmad/... and {project-root}/{bmad_folder}/... patterns
510
- const sourceMatch = sourceWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
511
- const installMatch = installWorkflowPath.match(/\{project-root\}\/(?:\{bmad_folder\}|bmad)\/([^/]+)\/workflows\/(.+)/);
512
-
513
- if (!sourceMatch || !installMatch) {
514
- continue;
515
- }
516
-
517
- const sourceModule = sourceMatch[1];
518
- const sourceWorkflowRelPath = sourceMatch[2];
519
- const installModule = installMatch[1];
520
- const installWorkflowRelPath = installMatch[2];
521
-
522
- // Build actual filesystem paths
523
- const actualSourceWorkflowPath = path.join(this.modulesPath, sourceModule, 'workflows', sourceWorkflowRelPath);
524
- const actualDestWorkflowPath = path.join(this.modulesPath, installModule, 'workflows', installWorkflowRelPath);
525
-
526
- // Check if source workflow exists
527
- if (!(await fs.pathExists(actualSourceWorkflowPath))) {
528
- console.log(chalk.yellow(` ⚠ Source workflow not found for vendoring: ${sourceWorkflowPath}`));
529
- continue;
530
- }
531
-
532
- // Check if destination already exists (skip if already vendored)
533
- if (await fs.pathExists(actualDestWorkflowPath)) {
534
- continue;
535
- }
536
-
537
- // Get workflow directory (workflow.yaml is in a directory with other files)
538
- const sourceWorkflowDir = path.dirname(actualSourceWorkflowPath);
539
- const destWorkflowDir = path.dirname(actualDestWorkflowPath);
540
-
541
- // Copy entire workflow directory
542
- await fs.copy(sourceWorkflowDir, destWorkflowDir, { overwrite: false });
543
-
544
- // Update config_source in the vendored workflow.yaml
545
- const workflowYamlPath = actualDestWorkflowPath;
546
- if (await fs.pathExists(workflowYamlPath)) {
547
- await this.updateWorkflowConfigSource(workflowYamlPath, installModule);
548
- }
549
-
550
- console.log(chalk.dim(` → Vendored workflow: ${sourceWorkflowRelPath} → ${installModule}/workflows/${installWorkflowRelPath}`));
551
- }
552
- }
553
- }
554
-
555
- /**
556
- * Update config_source in a vendored workflow YAML file
557
- */
558
- async updateWorkflowConfigSource(workflowYamlPath, newModuleName) {
559
- let yamlContent = await fs.readFile(workflowYamlPath, 'utf8');
560
-
561
- // Replace config_source with new module reference
562
- // Support both old format (bmad) and new format ({bmad_folder})
563
- const configSourcePattern = /config_source:\s*["']?\{project-root\}\/(?:\{bmad_folder\}|bmad)\/[^/]+\/config\.yaml["']?/g;
564
- const newConfigSource = `config_source: "{project-root}/{bmad_folder}/${newModuleName}/config.yaml"`;
565
-
566
- const updatedYaml = yamlContent.replaceAll(configSourcePattern, newConfigSource);
567
- await fs.writeFile(workflowYamlPath, updatedYaml, 'utf8');
568
- }
569
-
570
- /**
571
- * Pre-discover all agents and teams in a module for manifest generation
572
- */
573
- async preDiscoverModule(moduleName) {
574
- const modulePath = path.join(this.modulesPath, moduleName);
575
-
576
- // Clear any previously discovered agents for this module
577
- this.discoveredAgents = this.discoveredAgents.filter((a) => a.module !== moduleName);
578
-
579
- // Discover agents
580
- const agentsPath = path.join(modulePath, 'agents');
581
- if (await fs.pathExists(agentsPath)) {
582
- const files = await fs.readdir(agentsPath);
583
- for (const file of files) {
584
- if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
585
- const agentPath = path.join(agentsPath, file);
586
- let content;
587
-
588
- if (file.endsWith('.agent.yaml')) {
589
- // Build YAML agent in-memory
590
- content = await this.yamlBuilder.buildFromYaml(agentPath, null, {
591
- includeMetadata: false,
592
- });
593
- } else {
594
- // Read legacy MD agent
595
- content = await fs.readFile(agentPath, 'utf8');
596
- }
597
-
598
- const agentXml = this.extractAgentXml(content);
599
-
600
- if (agentXml) {
601
- // Skip agents with bundle="false"
602
- if (this.shouldSkipBundling(agentXml)) {
603
- continue;
604
- }
605
-
606
- const agentName = file.endsWith('.agent.yaml') ? path.basename(file, '.agent.yaml') : path.basename(file, '.md');
607
- // Use the shared generator to extract agent details (pass full content)
608
- const agentDetails = AgentPartyGenerator.extractAgentDetails(content, moduleName, agentName);
609
- if (agentDetails) {
610
- this.discoveredAgents.push(agentDetails);
611
- }
612
- }
613
- }
614
- }
615
- }
616
-
617
- // TODO: Discover teams when implemented
618
- }
619
-
620
- /**
621
- * Extract agent XML from markdown content
622
- */
623
- extractAgentXml(content) {
624
- // Try 4 backticks first (can contain 3 backtick blocks inside)
625
- let match = content.match(/````xml\s*([\s\S]*?)````/);
626
- if (!match) {
627
- // Fall back to 3 backticks if no 4-backtick block found
628
- match = content.match(/```xml\s*([\s\S]*?)```/);
629
- }
630
-
631
- if (match) {
632
- const xmlContent = match[1];
633
- const agentMatch = xmlContent.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
634
- return agentMatch ? agentMatch[0] : null;
635
- }
636
-
637
- // Fall back to direct extraction
638
- match = content.match(/<agent[^>]*>[\s\S]*?<\/agent>/);
639
- return match ? match[0] : null;
640
- }
641
-
642
- /**
643
- * Resolve all dependencies for an agent
644
- */
645
- async resolveAgentDependencies(agentXml, moduleName, warnings = []) {
646
- const dependencies = new Map();
647
- const processed = new Set();
648
- const skippedWorkflows = [];
649
-
650
- // Extract file references from agent XML
651
- const { refs, workflowRefs } = this.extractFileReferences(agentXml);
652
-
653
- // Process regular file references
654
- for (const ref of refs) {
655
- await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
656
- }
657
-
658
- // Process workflow references with special handling
659
- for (const workflowRef of workflowRefs) {
660
- const result = await this.processWorkflowDependency(workflowRef, dependencies, processed, moduleName, warnings);
661
- if (result && result.skipped) {
662
- skippedWorkflows.push(workflowRef);
663
- }
664
- }
665
-
666
- return { dependencies, skippedWorkflows };
667
- }
668
-
669
- /**
670
- * Extract file references from agent XML
671
- */
672
- extractFileReferences(xml) {
673
- const refs = new Set();
674
- const workflowRefs = new Set();
675
-
676
- // Match various file reference patterns
677
- const patterns = [
678
- /exec="([^"]+)"/g, // Command exec paths
679
- /tmpl="([^"]+)"/g, // Template paths
680
- /data="([^"]+)"/g, // Data file paths
681
- /file="([^"]+)"/g, // Generic file refs
682
- /src="([^"]+)"/g, // Source paths
683
- /system-prompts="([^"]+)"/g,
684
- /tools="([^"]+)"/g,
685
- /knowledge="([^"]+)"/g,
686
- /{project-root}\/([^"'\s<>]+)/g, // Legacy {project-root} paths
687
- /\bbmad\/([^"'\s<>]+)/g, // Direct bmad/ paths (after {bmad_folder} replacement)
688
- ];
689
-
690
- for (const pattern of patterns) {
691
- let match;
692
- while ((match = pattern.exec(xml)) !== null) {
693
- let filePath = match[1];
694
- // Remove {project-root} prefix if present
695
- filePath = filePath.replace(/^{project-root}\//, '');
696
- // Remove {bmad_folder} prefix if present (should be rare, mostly replaced already)
697
- filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
698
-
699
- // For bmad/ pattern, prepend 'bmad/' since it was captured without it
700
- if (pattern.source.includes(String.raw`\bbmad\/`)) {
701
- filePath = 'bmad/' + filePath;
702
- }
703
-
704
- // Skip obvious placeholder/example paths
705
- if (filePath && !filePath.includes('path/to/') && !filePath.includes('example') && !filePath.includes('...')) {
706
- refs.add(filePath);
707
- }
708
- }
709
- }
710
-
711
- // Extract workflow references - both 'workflow' and 'run-workflow' attributes
712
- const workflowPatterns = [
713
- /workflow="([^"]+)"/g, // Menu items with workflow attribute
714
- /run-workflow="([^"]+)"/g, // Commands with run-workflow attribute
715
- /validate-workflow="([^"]+)"/g, // Validation workflow references
716
- ];
717
-
718
- for (const pattern of workflowPatterns) {
719
- let match;
720
- while ((match = pattern.exec(xml)) !== null) {
721
- let workflowPath = match[1];
722
- workflowPath = workflowPath.replace(/^{project-root}\//, '');
723
- // Remove {bmad_folder} prefix if present and replace with bmad
724
- workflowPath = workflowPath.replace(/^{bmad_folder}\//, 'bmad/');
725
-
726
- // Skip obvious placeholder/example paths
727
- if (workflowPath && workflowPath.endsWith('.yaml') && !workflowPath.includes('path/to/') && !workflowPath.includes('example')) {
728
- workflowRefs.add(workflowPath);
729
- }
730
- }
731
- }
732
-
733
- return { refs: [...refs], workflowRefs: [...workflowRefs] };
734
- }
735
-
736
- /**
737
- * Remove commands from agent XML that reference skipped workflows
738
- */
739
- removeSkippedWorkflowCommands(agentXml, skippedWorkflows) {
740
- let modifiedXml = agentXml;
741
-
742
- // For each skipped workflow, find and remove menu items and commands
743
- for (const workflowPath of skippedWorkflows) {
744
- // Need to escape special regex characters in the path
745
- const escapedPath = workflowPath.replaceAll(/[.*+?^${}()|[\]\\]/g, String.raw`\$&`);
746
-
747
- // Pattern 1: Remove <item> tags with workflow attribute
748
- // Match: <item cmd="..." workflow="workflowPath">...</item>
749
- const itemWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
750
- modifiedXml = modifiedXml.replace(itemWorkflowPattern, '');
751
-
752
- // Pattern 2: Remove <item> tags with run-workflow attribute
753
- // Match: <item cmd="..." run-workflow="workflowPath">...</item>
754
- const itemRunWorkflowPattern = new RegExp(`\\s*<item\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</item>\\s*`, 'gs');
755
- modifiedXml = modifiedXml.replace(itemRunWorkflowPattern, '');
756
-
757
- // Pattern 3: Remove <c> tags with run-workflow attribute (legacy)
758
- // Match: <c cmd="..." run-workflow="workflowPath">...</c>
759
- const cPattern = new RegExp(`\\s*<c\\s+[^>]*run-workflow="[^"]*${escapedPath}"[^>]*>.*?</c>\\s*`, 'gs');
760
- modifiedXml = modifiedXml.replace(cPattern, '');
761
- }
762
-
763
- return modifiedXml;
764
- }
765
-
766
- /**
767
- * Process a file dependency recursively
768
- */
769
- async processFileDependency(filePath, dependencies, processed, moduleName, warnings = []) {
770
- // Skip workflow YAML files - they're handled by processWorkflowDependency
771
- if (filePath.includes('/workflow') && filePath.endsWith('workflow.yaml')) {
772
- return;
773
- }
774
-
775
- // Skip if already processed
776
- if (processed.has(filePath)) {
777
- return;
778
- }
779
- processed.add(filePath);
780
-
781
- // Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
782
- if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
783
- return;
784
- }
785
-
786
- // Handle wildcard patterns
787
- if (filePath.includes('*')) {
788
- await this.processWildcardDependency(filePath, dependencies, processed, moduleName, warnings);
789
- return;
790
- }
791
-
792
- // Resolve actual file path
793
- const actualPath = this.resolveFilePath(filePath, moduleName);
794
-
795
- if (!actualPath || !(await fs.pathExists(actualPath))) {
796
- warnings.push(filePath);
797
- return;
798
- }
799
-
800
- // Read file content
801
- let content = await fs.readFile(actualPath, 'utf8');
802
-
803
- // Process {project-root} references
804
- content = this.processProjectRootReferences(content);
805
-
806
- // Extract dependencies from frontmatter if present
807
- const frontmatterMatch = content.match(/^---\s*\n([\s\S]*?)\n---/);
808
- if (frontmatterMatch) {
809
- const frontmatter = frontmatterMatch[1];
810
- // Look for dependencies in frontmatter
811
- const depMatch = frontmatter.match(/dependencies:\s*\[(.*?)\]/);
812
- if (depMatch) {
813
- const deps = depMatch[1].match(/['"]([^'"]+)['"]/g);
814
- if (deps) {
815
- for (const dep of deps) {
816
- let depPath = dep.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
817
- depPath = depPath.replace(/^{bmad_folder}\//, 'bmad/');
818
- if (depPath && !processed.has(depPath)) {
819
- await this.processFileDependency(depPath, dependencies, processed, moduleName, warnings);
820
- }
821
- }
822
- }
823
- }
824
- // Look for template references
825
- const templateMatch = frontmatter.match(/template:\s*\[(.*?)\]/);
826
- if (templateMatch) {
827
- const templates = templateMatch[1].match(/['"]([^'"]+)['"]/g);
828
- if (templates) {
829
- for (const template of templates) {
830
- let templatePath = template.replaceAll(/['"]/g, '').replace(/^{project-root}\//, '');
831
- templatePath = templatePath.replace(/^{bmad_folder}\//, 'bmad/');
832
- if (templatePath && !processed.has(templatePath)) {
833
- await this.processFileDependency(templatePath, dependencies, processed, moduleName, warnings);
834
- }
835
- }
836
- }
837
- }
838
- }
839
-
840
- // Extract XML from markdown if applicable
841
- const ext = path.extname(actualPath).toLowerCase();
842
- let processedContent = content;
843
-
844
- switch (ext) {
845
- case '.md': {
846
- // Try to extract XML from markdown - handle both 3 and 4 backtick blocks
847
- // First try 4 backticks (which can contain 3 backtick blocks inside)
848
- let xmlMatches = [...content.matchAll(/````xml\s*([\s\S]*?)````/g)];
849
-
850
- // If no 4-backtick blocks, try 3 backticks
851
- if (xmlMatches.length === 0) {
852
- xmlMatches = [...content.matchAll(/```xml\s*([\s\S]*?)```/g)];
853
- }
854
-
855
- const xmlBlocks = [];
856
-
857
- for (const match of xmlMatches) {
858
- if (match[1]) {
859
- xmlBlocks.push(match[1].trim());
860
- }
861
- }
862
-
863
- if (xmlBlocks.length > 0) {
864
- // For XML content, just include it directly (it's already valid XML)
865
- processedContent = xmlBlocks.join('\n\n');
866
- } else {
867
- // No XML blocks found, skip non-XML markdown files
868
- return;
869
- }
870
-
871
- break;
872
- }
873
- case '.csv': {
874
- // CSV files need special handling - convert to XML file-index
875
- const lines = content.split('\n').filter((line) => line.trim());
876
- if (lines.length === 0) return;
877
-
878
- const headers = lines[0].split(',').map((h) => h.trim());
879
- const rows = lines.slice(1);
880
-
881
- const indexParts = [`<file-index id="${filePath}">`];
882
- indexParts.push(' <items>');
883
-
884
- // Track files referenced in CSV for additional bundling
885
- const referencedFiles = new Set();
886
-
887
- for (const row of rows) {
888
- const values = row.split(',').map((v) => v.trim());
889
- if (values.every((v) => !v)) continue;
890
-
891
- indexParts.push(' <item>');
892
- for (const [i, header] of headers.entries()) {
893
- const value = values[i] || '';
894
- const tagName = header.toLowerCase().replaceAll(/[^a-z0-9]/g, '_');
895
- indexParts.push(` <${tagName}>${value}</${tagName}>`);
896
-
897
- // Track referenced files
898
- if (header.toLowerCase().includes('file') && value.endsWith('.md')) {
899
- // Build path relative to CSV location
900
- const csvDir = path.dirname(actualPath);
901
- const refPath = path.join(csvDir, value);
902
- if (fs.existsSync(refPath)) {
903
- const refId = filePath.replace('index.csv', value);
904
- referencedFiles.add(refId);
905
- }
906
- }
907
- }
908
- indexParts.push(' </item>');
909
- }
910
-
911
- indexParts.push(' </items>', '</file-index>');
912
-
913
- // Store the XML version wrapped in a file element
914
- const csvXml = indexParts.join('\n');
915
- const wrappedCsv = `<file id="${filePath}" type="xml">\n${csvXml}\n</file>`;
916
- dependencies.set(filePath, wrappedCsv);
917
-
918
- // Process referenced files from CSV
919
- for (const refId of referencedFiles) {
920
- if (!processed.has(refId)) {
921
- await this.processFileDependency(refId, dependencies, processed, moduleName, warnings);
922
- }
923
- }
924
-
925
- return;
926
- }
927
- case '.xml': {
928
- // XML files can be included directly
929
- processedContent = content;
930
- break;
931
- }
932
- default: {
933
- // For other non-XML file types, skip them
934
- return;
935
- }
936
- }
937
-
938
- // Determine file type for wrapping
939
- let fileType = 'text';
940
- if (ext === '.xml' || (ext === '.md' && processedContent.trim().startsWith('<'))) {
941
- fileType = 'xml';
942
- } else
943
- switch (ext) {
944
- case '.yaml':
945
- case '.yml': {
946
- fileType = 'yaml';
947
-
948
- break;
949
- }
950
- case '.json': {
951
- fileType = 'json';
952
-
953
- break;
954
- }
955
- case '.md': {
956
- fileType = 'md';
957
-
958
- break;
959
- }
960
- // No default
961
- }
962
-
963
- // Wrap content in file element and store
964
- const wrappedContent = this.wrapContentInXml(processedContent, filePath, fileType);
965
- dependencies.set(filePath, wrappedContent);
966
-
967
- // Recursively scan for more dependencies
968
- const { refs: nestedRefs } = this.extractFileReferences(processedContent);
969
- for (const ref of nestedRefs) {
970
- await this.processFileDependency(ref, dependencies, processed, moduleName, warnings);
971
- }
972
- }
973
-
974
- /**
975
- * Process a workflow YAML file and its bundle files
976
- */
977
- async processWorkflowDependency(workflowPath, dependencies, processed, moduleName, warnings = []) {
978
- // Skip if already processed
979
- if (processed.has(workflowPath)) {
980
- return { skipped: false };
981
- }
982
- processed.add(workflowPath);
983
-
984
- // Resolve actual file path
985
- const actualPath = this.resolveFilePath(workflowPath, moduleName);
986
-
987
- if (!actualPath || !(await fs.pathExists(actualPath))) {
988
- warnings.push(workflowPath);
989
- return { skipped: true };
990
- }
991
-
992
- // Read and parse YAML file
993
- const yamlContent = await fs.readFile(actualPath, 'utf8');
994
- let workflowConfig;
995
-
996
- try {
997
- workflowConfig = yaml.load(yamlContent);
998
- } catch (error) {
999
- warnings.push(`${workflowPath} (invalid YAML: ${error.message})`);
1000
- return { skipped: true };
1001
- }
1002
-
1003
- // Check if web_bundle is explicitly set to false
1004
- if (workflowConfig.web_bundle === false) {
1005
- // Mark this workflow as skipped so we can remove the command from agent
1006
- return { skipped: true, workflowPath };
1007
- }
1008
-
1009
- // Create YAML content with only web_bundle section (flattened)
1010
- let bundleYamlContent;
1011
- if (workflowConfig.web_bundle && typeof workflowConfig.web_bundle === 'object') {
1012
- // Only include the web_bundle content, flattened to root level
1013
- bundleYamlContent = yaml.dump(workflowConfig.web_bundle);
1014
- } else {
1015
- // If no web_bundle section, include full YAML
1016
- bundleYamlContent = yamlContent;
1017
- }
1018
-
1019
- // Process {project-root} and {bmad_folder} references in the YAML content
1020
- bundleYamlContent = this.processProjectRootReferences(bundleYamlContent);
1021
-
1022
- // Include the YAML file with only web_bundle content, wrapped in XML
1023
- // Process the workflow path to create a clean ID
1024
- let yamlId = workflowPath.replace(/^{project-root}\//, '');
1025
- yamlId = yamlId.replace(/^{bmad_folder}\//, 'bmad/');
1026
- const wrappedYaml = this.wrapContentInXml(bundleYamlContent, yamlId, 'yaml');
1027
- dependencies.set(yamlId, wrappedYaml);
1028
-
1029
- // Always include core workflow task when processing workflows
1030
- await this.includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings);
1031
-
1032
- // Check if advanced elicitation is enabled
1033
- if (workflowConfig.web_bundle && workflowConfig.web_bundle.use_advanced_elicitation) {
1034
- await this.includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings);
1035
- }
1036
-
1037
- // Process web_bundle_files if they exist
1038
- if (workflowConfig.web_bundle && workflowConfig.web_bundle.web_bundle_files) {
1039
- const bundleFiles = workflowConfig.web_bundle.web_bundle_files;
1040
-
1041
- for (const bundleFilePath of bundleFiles) {
1042
- // Process the file path to create a clean ID for checking if already processed
1043
- let cleanFilePath = bundleFilePath.replace(/^{project-root}\//, '');
1044
- cleanFilePath = cleanFilePath.replace(/^{bmad_folder}\//, 'bmad/');
1045
-
1046
- if (processed.has(cleanFilePath)) {
1047
- continue;
1048
- }
1049
-
1050
- const bundleActualPath = this.resolveFilePath(bundleFilePath, moduleName);
1051
-
1052
- if (!bundleActualPath || !(await fs.pathExists(bundleActualPath))) {
1053
- warnings.push(bundleFilePath);
1054
- continue;
1055
- }
1056
-
1057
- // Check if this is another workflow.yaml file - if so, recursively process it
1058
- if (bundleFilePath.endsWith('workflow.yaml')) {
1059
- // Recursively process this workflow and its dependencies
1060
- await this.processWorkflowDependency(bundleFilePath, dependencies, processed, moduleName, warnings);
1061
- } else {
1062
- // Regular file - process normally
1063
- processed.add(cleanFilePath);
1064
-
1065
- // Read the file content
1066
- let fileContent = await fs.readFile(bundleActualPath, 'utf8');
1067
- const fileExt = path.extname(bundleActualPath).toLowerCase().replace('.', '');
1068
-
1069
- // Process {project-root} references before wrapping
1070
- fileContent = this.processProjectRootReferences(fileContent);
1071
-
1072
- // Wrap in XML with proper escaping
1073
- const wrappedContent = this.wrapContentInXml(fileContent, cleanFilePath, fileExt);
1074
- dependencies.set(cleanFilePath, wrappedContent);
1075
- }
1076
- }
1077
- }
1078
-
1079
- return { skipped: false };
1080
- }
1081
-
1082
- /**
1083
- * Include core workflow task files
1084
- */
1085
- async includeCoreWorkflowFiles(dependencies, processed, moduleName, warnings = []) {
1086
- const coreWorkflowPath = 'bmad/core/tasks/workflow.xml';
1087
-
1088
- if (processed.has(coreWorkflowPath)) {
1089
- return;
1090
- }
1091
- processed.add(coreWorkflowPath);
1092
-
1093
- const actualPath = this.resolveFilePath(coreWorkflowPath, moduleName);
1094
-
1095
- if (!actualPath || !(await fs.pathExists(actualPath))) {
1096
- warnings.push(coreWorkflowPath);
1097
- return;
1098
- }
1099
-
1100
- let fileContent = await fs.readFile(actualPath, 'utf8');
1101
- // Process {project-root} and {bmad_folder} references
1102
- fileContent = this.processProjectRootReferences(fileContent);
1103
- const wrappedContent = this.wrapContentInXml(fileContent, coreWorkflowPath, 'xml');
1104
- dependencies.set(coreWorkflowPath, wrappedContent);
1105
- }
1106
-
1107
- /**
1108
- * Include advanced elicitation files
1109
- */
1110
- async includeAdvancedElicitationFiles(dependencies, processed, moduleName, warnings = []) {
1111
- const elicitationFiles = ['bmad/core/tasks/advanced-elicitation.xml', 'bmad/core/tasks/advanced-elicitation-methods.csv'];
1112
-
1113
- for (const filePath of elicitationFiles) {
1114
- if (processed.has(filePath)) {
1115
- continue;
1116
- }
1117
- processed.add(filePath);
1118
-
1119
- const actualPath = this.resolveFilePath(filePath, moduleName);
1120
-
1121
- if (!actualPath || !(await fs.pathExists(actualPath))) {
1122
- warnings.push(filePath);
1123
- continue;
1124
- }
1125
-
1126
- let fileContent = await fs.readFile(actualPath, 'utf8');
1127
- // Process {project-root} and {bmad_folder} references
1128
- fileContent = this.processProjectRootReferences(fileContent);
1129
- const fileExt = path.extname(actualPath).toLowerCase().replace('.', '');
1130
- const wrappedContent = this.wrapContentInXml(fileContent, filePath, fileExt);
1131
- dependencies.set(filePath, wrappedContent);
1132
- }
1133
- }
1134
-
1135
- /**
1136
- * Wrap file content in XML with proper escaping
1137
- */
1138
- wrapContentInXml(content, id, type = 'text') {
1139
- // For XML files, include directly without CDATA (they're already valid XML)
1140
- if (type === 'xml') {
1141
- // XML files can be included directly as they're already well-formed
1142
- // Just wrap in a file element
1143
- return `<file id="${id}" type="${type}">\n${content}\n</file>`;
1144
- }
1145
-
1146
- // For all other file types, use CDATA to preserve content exactly
1147
- // Escape any ]]> sequences in the content by splitting CDATA sections
1148
- // Replace ]]> with ]]]]><![CDATA[> to properly escape it within CDATA
1149
- const escapedContent = content.replaceAll(']]>', ']]]]><![CDATA[>');
1150
-
1151
- // Use CDATA to preserve content exactly as-is, including special characters
1152
- return `<file id="${id}" type="${type}"><![CDATA[${escapedContent}]]></file>`;
1153
- }
1154
-
1155
- /**
1156
- * Process wildcard dependency patterns
1157
- */
1158
- async processWildcardDependency(pattern, dependencies, processed, moduleName, warnings = []) {
1159
- // Remove {project-root} prefix
1160
- pattern = pattern.replace(/^{project-root}\//, '');
1161
- // Replace {bmad_folder} with bmad
1162
- pattern = pattern.replace(/^{bmad_folder}\//, 'bmad/');
1163
-
1164
- // Get directory and file pattern
1165
- const lastSlash = pattern.lastIndexOf('/');
1166
- const dirPath = pattern.slice(0, Math.max(0, lastSlash));
1167
- const filePattern = pattern.slice(Math.max(0, lastSlash + 1));
1168
-
1169
- // Resolve directory path without checking file existence
1170
- let dir;
1171
- if (dirPath.startsWith('bmad/')) {
1172
- // Remove bmad/ prefix
1173
- const actualPath = dirPath.replace(/^bmad\//, '');
1174
-
1175
- // Try different path mappings for directories
1176
- const possibleDirs = [
1177
- // Try as module path: bmad/cis/... -> src/modules/cis/...
1178
- path.join(this.sourceDir, 'modules', actualPath),
1179
- // Try as direct path: bmad/core/... -> src/core/...
1180
- path.join(this.sourceDir, actualPath),
1181
- ];
1182
-
1183
- for (const testDir of possibleDirs) {
1184
- if (fs.existsSync(testDir)) {
1185
- dir = testDir;
1186
- break;
1187
- }
1188
- }
1189
- }
1190
-
1191
- if (!dir) {
1192
- warnings.push(`${pattern} (could not resolve directory)`);
1193
- return;
1194
- }
1195
- if (!(await fs.pathExists(dir))) {
1196
- warnings.push(pattern);
1197
- return;
1198
- }
1199
-
1200
- // Read directory and match files
1201
- const files = await fs.readdir(dir);
1202
- let matchedFiles = [];
1203
-
1204
- if (filePattern === '*.*') {
1205
- matchedFiles = files;
1206
- } else if (filePattern.startsWith('*.')) {
1207
- const ext = filePattern.slice(1);
1208
- matchedFiles = files.filter((f) => f.endsWith(ext));
1209
- } else {
1210
- // Simple glob matching
1211
- const regex = new RegExp('^' + filePattern.replace('*', '.*') + '$');
1212
- matchedFiles = files.filter((f) => regex.test(f));
1213
- }
1214
-
1215
- // Process each matched file
1216
- for (const file of matchedFiles) {
1217
- const fullPath = dirPath + '/' + file;
1218
- if (!processed.has(fullPath)) {
1219
- await this.processFileDependency(fullPath, dependencies, processed, moduleName, warnings);
1220
- }
1221
- }
1222
- }
1223
-
1224
- /**
1225
- * Resolve file path relative to project
1226
- */
1227
- resolveFilePath(filePath, moduleName) {
1228
- // Remove {project-root} prefix
1229
- filePath = filePath.replace(/^{project-root}\//, '');
1230
- // Replace {bmad_folder} with bmad
1231
- filePath = filePath.replace(/^{bmad_folder}\//, 'bmad/');
1232
- filePath = filePath.replace(/^{bmad_folder}$/, 'bmad');
1233
-
1234
- // Check temp directory first for _cfg files
1235
- if (filePath.startsWith('bmad/_cfg/')) {
1236
- const filename = filePath.split('/').pop();
1237
- const tempPath = path.join(this.tempManifestDir, filename);
1238
- if (fs.existsSync(tempPath)) {
1239
- return tempPath;
1240
- }
1241
- }
1242
-
1243
- // Handle different path patterns for bmad files
1244
- // bmad/cis/tasks/brain-session.md -> src/modules/cis/tasks/brain-session.md
1245
- // bmad/core/tasks/create-doc.md -> src/core/tasks/create-doc.md
1246
- // bmad/bmm/templates/brief.md -> src/modules/bmm/templates/brief.md
1247
-
1248
- let actualPath = filePath;
1249
-
1250
- if (filePath.startsWith('bmad/')) {
1251
- // Remove bmad/ prefix
1252
- actualPath = filePath.replace(/^bmad\//, '');
1253
-
1254
- // Check if it's a module-specific file (cis, bmm, etc) or core file
1255
- const parts = actualPath.split('/');
1256
- const firstPart = parts[0];
1257
-
1258
- // Try different path mappings
1259
- const possiblePaths = [
1260
- // Try in temp directory first
1261
- path.join(this.tempDir, filePath),
1262
- // Try as module path: bmad/cis/... -> src/modules/cis/...
1263
- path.join(this.sourceDir, 'modules', actualPath),
1264
- // Try as direct path: bmad/core/... -> src/core/...
1265
- path.join(this.sourceDir, actualPath),
1266
- // Try without any prefix in src
1267
- path.join(this.sourceDir, parts.slice(1).join('/')),
1268
- // Try in project root
1269
- path.join(this.sourceDir, '..', actualPath),
1270
- // Try original with bmad
1271
- path.join(this.sourceDir, '..', filePath),
1272
- ];
1273
-
1274
- for (const testPath of possiblePaths) {
1275
- if (fs.existsSync(testPath)) {
1276
- return testPath;
1277
- }
1278
- }
1279
- }
1280
-
1281
- // Try standard paths for non-bmad files
1282
- const basePaths = [
1283
- this.sourceDir, // src directory
1284
- path.join(this.modulesPath, moduleName), // Current module
1285
- path.join(this.sourceDir, '..'), // Project root
1286
- ];
1287
-
1288
- for (const basePath of basePaths) {
1289
- const fullPath = path.join(basePath, actualPath);
1290
- if (fs.existsSync(fullPath)) {
1291
- return fullPath;
1292
- }
1293
- }
1294
-
1295
- return null;
1296
- }
1297
-
1298
- /**
1299
- * Process and remove {project-root} references and replace {bmad_folder} with bmad
1300
- */
1301
- processProjectRootReferences(content) {
1302
- // Remove {project-root}/ prefix (with slash)
1303
- content = content.replaceAll('{project-root}/', '');
1304
- // Also remove {project-root} without slash
1305
- content = content.replaceAll('{project-root}', '');
1306
- // Replace {bmad_folder} with bmad
1307
- content = content.replaceAll('{bmad_folder}', 'bmad');
1308
- return content;
1309
- }
1310
-
1311
- /**
1312
- * Escape special XML characters in text content
1313
- */
1314
- escapeXmlText(text) {
1315
- return text
1316
- .replaceAll('&', '&amp;')
1317
- .replaceAll('<', '&lt;')
1318
- .replaceAll('>', '&gt;')
1319
- .replaceAll('"', '&quot;')
1320
- .replaceAll("'", '&apos;');
1321
- }
1322
-
1323
- /**
1324
- * Escape XML content while preserving XML tags
1325
- */
1326
- escapeXmlContent(content) {
1327
- const tagPattern = /<([^>]+)>/g;
1328
- const parts = [];
1329
- let lastIndex = 0;
1330
- let match;
1331
-
1332
- while ((match = tagPattern.exec(content)) !== null) {
1333
- if (match.index > lastIndex) {
1334
- parts.push(this.escapeXmlText(content.slice(lastIndex, match.index)));
1335
- }
1336
- parts.push('<' + match[1] + '>');
1337
- lastIndex = match.index + match[0].length;
1338
- }
1339
-
1340
- if (lastIndex < content.length) {
1341
- parts.push(this.escapeXmlText(content.slice(lastIndex)));
1342
- }
1343
-
1344
- return parts.join('');
1345
- }
1346
-
1347
- /**
1348
- * Inject help and exit menu items into agent XML
1349
- */
1350
- injectHelpExitMenuItems(agentXml) {
1351
- // Check if menu already has help and exit
1352
- const hasHelp = agentXml.includes('cmd="*help"') || agentXml.includes('trigger="*help"');
1353
- const hasExit = agentXml.includes('cmd="*exit"') || agentXml.includes('trigger="*exit"');
1354
-
1355
- if (hasHelp && hasExit) {
1356
- return agentXml; // Already has both, skip injection
1357
- }
1358
-
1359
- // Find the menu section
1360
- const menuMatch = agentXml.match(/(<menu>[\s\S]*?<\/menu>)/);
1361
- if (!menuMatch) {
1362
- return agentXml; // No menu found, skip injection
1363
- }
1364
-
1365
- const menuContent = menuMatch[1];
1366
- const menuClosingMatch = menuContent.match(/(\s*)<\/menu>/);
1367
- if (!menuClosingMatch) {
1368
- return agentXml;
1369
- }
1370
-
1371
- const indent = menuClosingMatch[1];
1372
- const menuItems = [];
1373
-
1374
- if (!hasHelp) {
1375
- menuItems.push(`${indent}<item cmd="*help">Show numbered menu</item>`);
1376
- }
1377
-
1378
- if (!hasExit) {
1379
- menuItems.push(`${indent}<item cmd="*exit">Exit with confirmation</item>`);
1380
- }
1381
-
1382
- if (menuItems.length === 0) {
1383
- return agentXml;
1384
- }
1385
-
1386
- // Inject menu items before closing </menu> tag
1387
- const newMenuContent = menuContent.replace(/(\s*)<\/menu>/, `\n${menuItems.join('\n')}\n${indent}</menu>`);
1388
- return agentXml.replace(menuContent, newMenuContent);
1389
- }
1390
-
1391
- /**
1392
- * Inject web activation instructions into agent XML
1393
- */
1394
- injectWebActivation(agentXml) {
1395
- // First, always inject help/exit menu items
1396
- agentXml = this.injectHelpExitMenuItems(agentXml);
1397
-
1398
- // Load the web activation template
1399
- const activationPath = path.join(this.sourceDir, 'utility', 'models', 'agent-activation-web.xml');
1400
-
1401
- if (!fs.existsSync(activationPath)) {
1402
- console.warn(chalk.yellow('Warning: agent-activation-web.xml not found, skipping activation injection'));
1403
- return agentXml;
1404
- }
1405
-
1406
- const activationXml = fs.readFileSync(activationPath, 'utf8');
1407
-
1408
- // For web bundles, ALWAYS replace existing activation with web activation
1409
- // This is because fragment-based activation assumes filesystem access which won't work in web bundles
1410
- const hasActivation = agentXml.includes('<activation');
1411
-
1412
- if (hasActivation) {
1413
- // Replace existing activation block with web activation
1414
- const injectedXml = agentXml.replace(/<activation[^>]*>[\s\S]*?<\/activation>/, activationXml);
1415
- return injectedXml;
1416
- }
1417
-
1418
- // Check for critical-actions block (legacy)
1419
- const hasCriticalActions = agentXml.includes('<critical-actions');
1420
-
1421
- if (hasCriticalActions) {
1422
- // Replace critical-actions block with activation
1423
- const injectedXml = agentXml.replace(/<critical-actions>[\s\S]*?<\/critical-actions>/, activationXml);
1424
- return injectedXml;
1425
- }
1426
-
1427
- // If no critical-actions, inject before closing </agent> tag
1428
- const closingTagMatch = agentXml.match(/(\s*)<\/agent>/);
1429
- if (!closingTagMatch) {
1430
- console.warn(chalk.yellow('Warning: Could not find </agent> tag for activation injection'));
1431
- return agentXml;
1432
- }
1433
-
1434
- // Inject the activation block before the closing </agent> tag
1435
- // Properly indent each line of the activation XML
1436
- const indent = closingTagMatch[1];
1437
- const indentedActivation = activationXml
1438
- .split('\n')
1439
- .map((line) => (line.trim() ? indent + line : ''))
1440
- .join('\n');
1441
-
1442
- const injectedXml = agentXml.replace(/(\s*)<\/agent>/, `\n${indentedActivation}\n${indent}</agent>`);
1443
-
1444
- return injectedXml;
1445
- }
1446
-
1447
- /**
1448
- * Build the final agent bundle XML
1449
- */
1450
- buildAgentBundle(agentXml, dependencies) {
1451
- // Web activation is now handled by fragments during YAML building
1452
- // agentXml = this.injectWebActivation(agentXml);
1453
-
1454
- const parts = [
1455
- '<?xml version="1.0" encoding="UTF-8"?>',
1456
- '<agent-bundle>',
1457
- ' <!-- Agent Definition -->',
1458
- ' ' + agentXml.replaceAll('\n', '\n '),
1459
- ];
1460
-
1461
- // Add dependencies (all are now consistently wrapped in <file> elements)
1462
- if (dependencies && dependencies.size > 0) {
1463
- parts.push('\n <!-- Dependencies -->');
1464
- for (const [id, content] of dependencies) {
1465
- // All dependencies are now wrapped in <file> elements
1466
- // Indent properly
1467
- const indentedContent = content
1468
- .split('\n')
1469
- .map((line) => ' ' + line)
1470
- .join('\n');
1471
- parts.push(indentedContent);
1472
- }
1473
- }
1474
-
1475
- parts.push('</agent-bundle>');
1476
-
1477
- return parts.join('\n');
1478
- }
1479
-
1480
- /**
1481
- * Discover all modules
1482
- */
1483
- async discoverModules() {
1484
- const modules = [];
1485
-
1486
- if (!(await fs.pathExists(this.modulesPath))) {
1487
- console.log(chalk.yellow('No modules directory found'));
1488
- return modules;
1489
- }
1490
-
1491
- const entries = await fs.readdir(this.modulesPath, { withFileTypes: true });
1492
-
1493
- for (const entry of entries) {
1494
- if (entry.isDirectory()) {
1495
- modules.push(entry.name);
1496
- }
1497
- }
1498
-
1499
- return modules;
1500
- }
1501
-
1502
- /**
1503
- * Discover agents in a module
1504
- */
1505
- async discoverAgents(modulePath) {
1506
- const agents = [];
1507
- const agentsPath = path.join(modulePath, 'agents');
1508
-
1509
- if (!(await fs.pathExists(agentsPath))) {
1510
- return agents;
1511
- }
1512
-
1513
- const files = await fs.readdir(agentsPath);
1514
-
1515
- for (const file of files) {
1516
- // Look for .agent.yaml files (new format) or .md files (legacy format)
1517
- if (file.endsWith('.agent.yaml') || (file.endsWith('.md') && !file.toLowerCase().includes('readme'))) {
1518
- agents.push(file);
1519
- }
1520
- }
1521
-
1522
- return agents;
1523
- }
1524
-
1525
- /**
1526
- * Discover all teams in a module
1527
- */
1528
- async discoverTeams(modulePath) {
1529
- const teams = [];
1530
- const teamsPath = path.join(modulePath, 'teams');
1531
-
1532
- if (!(await fs.pathExists(teamsPath))) {
1533
- return teams;
1534
- }
1535
-
1536
- const files = await fs.readdir(teamsPath);
1537
-
1538
- for (const file of files) {
1539
- if (file.endsWith('.yaml') || file.endsWith('.yml')) {
1540
- teams.push(file);
1541
- }
1542
- }
1543
-
1544
- return teams;
1545
- }
1546
-
1547
- /**
1548
- * Extract agent name from XML
1549
- */
1550
- getAgentName(xml) {
1551
- const match = xml.match(/<agent[^>]*name="([^"]+)"/);
1552
- return match ? match[1] : 'Unknown';
1553
- }
1554
-
1555
- /**
1556
- * Extract agent description from XML
1557
- */
1558
- getAgentDescription(xml) {
1559
- const match = xml.match(/<description>([^<]+)<\/description>/);
1560
- return match ? match[1] : '';
1561
- }
1562
-
1563
- /**
1564
- * Check if agent should be skipped for bundling
1565
- */
1566
- shouldSkipBundling(xml) {
1567
- // Check for bundle="false" attribute in the agent tag
1568
- const match = xml.match(/<agent[^>]*bundle="false"[^>]*>/);
1569
- return match !== null;
1570
- }
1571
-
1572
- /**
1573
- * Create temporary manifest files
1574
- */
1575
- async createTempManifests() {
1576
- // Ensure temp directory exists
1577
- await fs.ensureDir(this.tempManifestDir);
1578
-
1579
- // Generate agent-manifest.csv using shared generator
1580
- const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
1581
- await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
1582
-
1583
- console.log(chalk.dim(' ✓ Created temporary manifest files'));
1584
- }
1585
-
1586
- /**
1587
- * Clean up temporary files
1588
- */
1589
- async cleanupTempFiles() {
1590
- if (await fs.pathExists(this.tempDir)) {
1591
- await fs.remove(this.tempDir);
1592
- console.log(chalk.dim('\n✓ Cleaned up temporary files'));
1593
- }
1594
- }
1595
-
1596
- /**
1597
- * Validate XML content
1598
- */
1599
- async validateXml(xmlContent) {
1600
- try {
1601
- await xml2js.parseStringPromise(xmlContent, {
1602
- strict: true,
1603
- explicitArray: false,
1604
- });
1605
- return true;
1606
- } catch {
1607
- return false;
1608
- }
1609
- }
1610
-
1611
- /**
1612
- * Display summary statistics
1613
- */
1614
- displaySummary() {
1615
- console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════'));
1616
- console.log(chalk.cyan.bold(' SUMMARY'));
1617
- console.log(chalk.cyan.bold('═══════════════════════════════════════════════\n'));
1618
-
1619
- console.log(chalk.bold('Bundle Statistics:'));
1620
- console.log(` Total agents found: ${this.stats.totalAgents}`);
1621
- console.log(` Successfully bundled: ${chalk.green(this.stats.bundledAgents)}`);
1622
- console.log(` Skipped (bundle=false): ${chalk.gray(this.stats.skippedAgents)}`);
1623
-
1624
- if (this.stats.failedAgents > 0) {
1625
- console.log(` Failed to bundle: ${chalk.red(this.stats.failedAgents)}`);
1626
- }
1627
-
1628
- if (this.stats.invalidXml > 0) {
1629
- console.log(` Invalid XML bundles: ${chalk.yellow(this.stats.invalidXml)}`);
1630
- }
1631
-
1632
- // Display warnings summary
1633
- // Check if there are actually any warnings with content
1634
- const hasActualWarnings = this.stats.warnings.some((w) => w && w.warnings && w.warnings.length > 0);
1635
-
1636
- if (hasActualWarnings) {
1637
- console.log(chalk.yellow('\n⚠ Missing Dependencies by Agent:'));
1638
-
1639
- // Group and display warnings by agent
1640
- for (const agentWarning of this.stats.warnings) {
1641
- if (agentWarning && agentWarning.warnings && agentWarning.warnings.length > 0) {
1642
- console.log(chalk.bold(`\n ${agentWarning.agent}:`));
1643
- // Display unique warnings for this agent
1644
- const uniqueWarnings = [...new Set(agentWarning.warnings)];
1645
- for (const warning of uniqueWarnings) {
1646
- console.log(chalk.dim(` • ${warning}`));
1647
- }
1648
- }
1649
- }
1650
- } else {
1651
- console.log(chalk.green('\n✓ No missing dependencies'));
1652
- }
1653
-
1654
- // Final status
1655
- if (this.stats.invalidXml > 0) {
1656
- console.log(chalk.yellow('\n⚠ Some bundles have invalid XML. Please review the output.'));
1657
- } else if (this.stats.failedAgents > 0) {
1658
- console.log(chalk.yellow('\n⚠ Some agents failed to bundle. Please review the errors.'));
1659
- } else {
1660
- console.log(chalk.green('\n✨ All bundles generated successfully!'));
1661
- }
1662
-
1663
- console.log(chalk.cyan.bold('\n═══════════════════════════════════════════════\n'));
1664
- }
1665
- }
1666
-
1667
- module.exports = { WebBundler };