bmad-method 6.0.0-alpha.13 → 6.0.0-alpha.15

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 (355) hide show
  1. package/.coderabbit.yaml +36 -0
  2. package/.github/CODE_OF_CONDUCT.md +128 -0
  3. package/.github/ISSUE_TEMPLATE/idea_submission.md +1 -1
  4. package/.github/scripts/discord-helpers.sh +15 -0
  5. package/.github/workflows/discord.yaml +278 -8
  6. package/.github/workflows/quality.yaml +19 -0
  7. package/.markdownlint-cli2.yaml +42 -0
  8. package/.prettierignore +3 -0
  9. package/CHANGELOG.md +183 -360
  10. package/README.md +4 -1
  11. package/docs/agent-customization-guide.md +2 -2
  12. package/docs/custom-content-installation.md +245 -0
  13. package/docs/document-sharding-guide.md +1 -1
  14. package/docs/index.md +2 -2
  15. package/docs/installers-bundlers/installers-modules-platforms-reference.md +6 -5
  16. package/docs/web-bundles-gemini-gpt-guide.md +1 -1
  17. package/eslint.config.mjs +14 -0
  18. package/example-custom-content/README.md +8 -0
  19. package/{custom/src → example-custom-content}/agents/commit-poet/commit-poet.agent.yaml +1 -1
  20. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/instructions.md +5 -5
  21. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/docs.md +1 -1
  22. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/installers.md +1 -1
  23. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/modules.md +2 -2
  24. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/memories.md +1 -1
  25. package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith.agent.yaml +18 -17
  26. package/example-custom-content/module.yaml +4 -0
  27. package/example-custom-content/workflows/quiz-master/steps/step-01-init.md +168 -0
  28. package/example-custom-content/workflows/quiz-master/steps/step-02-q1.md +155 -0
  29. package/example-custom-content/workflows/quiz-master/steps/step-03-q2.md +89 -0
  30. package/example-custom-content/workflows/quiz-master/steps/step-04-q3.md +36 -0
  31. package/example-custom-content/workflows/quiz-master/steps/step-05-q4.md +36 -0
  32. package/example-custom-content/workflows/quiz-master/steps/step-06-q5.md +36 -0
  33. package/example-custom-content/workflows/quiz-master/steps/step-07-q6.md +36 -0
  34. package/example-custom-content/workflows/quiz-master/steps/step-08-q7.md +36 -0
  35. package/example-custom-content/workflows/quiz-master/steps/step-09-q8.md +36 -0
  36. package/example-custom-content/workflows/quiz-master/steps/step-10-q9.md +36 -0
  37. package/example-custom-content/workflows/quiz-master/steps/step-11-q10.md +36 -0
  38. package/example-custom-content/workflows/quiz-master/steps/step-12-results.md +150 -0
  39. package/example-custom-content/workflows/quiz-master/templates/csv-headers.template +1 -0
  40. package/example-custom-content/workflows/quiz-master/workflow.md +54 -0
  41. package/example-custom-content/workflows/wassup/workflow.md +26 -0
  42. package/example-custom-module/mwm/README.md +9 -0
  43. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/cognitive-distortions.md +47 -0
  44. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach-sidecar/thought-records.md +17 -0
  45. package/example-custom-module/mwm/agents/cbt-coach/cbt-coach.agent.yaml +151 -0
  46. package/example-custom-module/mwm/agents/crisis-navigator.agent.yaml +138 -0
  47. package/example-custom-module/mwm/agents/meditation-guide.agent.yaml +138 -0
  48. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/insights.md +13 -0
  49. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/instructions.md +30 -0
  50. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/memories.md +13 -0
  51. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion-sidecar/patterns.md +17 -0
  52. package/example-custom-module/mwm/agents/wellness-companion/wellness-companion.agent.yaml +125 -0
  53. package/example-custom-module/mwm/module.yaml +28 -0
  54. package/example-custom-module/mwm/workflows/cbt-thought-record/README.md +31 -0
  55. package/example-custom-module/mwm/workflows/cbt-thought-record/workflow.md +45 -0
  56. package/example-custom-module/mwm/workflows/crisis-support/README.md +31 -0
  57. package/example-custom-module/mwm/workflows/crisis-support/workflow.md +45 -0
  58. package/example-custom-module/mwm/workflows/daily-checkin/README.md +32 -0
  59. package/example-custom-module/mwm/workflows/daily-checkin/workflow.md +45 -0
  60. package/example-custom-module/mwm/workflows/guided-meditation/README.md +31 -0
  61. package/example-custom-module/mwm/workflows/guided-meditation/workflow.md +45 -0
  62. package/example-custom-module/mwm/workflows/wellness-journal/README.md +31 -0
  63. package/example-custom-module/mwm/workflows/wellness-journal/workflow.md +45 -0
  64. package/package.json +9 -4
  65. package/src/core/_module-installer/installer.js +1 -1
  66. package/src/core/{_module-installer/install-config.yaml → module.yaml} +5 -1
  67. package/src/core/resources/excalidraw/library-loader.md +2 -2
  68. package/src/core/workflows/brainstorming/steps/step-01-session-setup.md +1 -1
  69. package/src/core/workflows/brainstorming/workflow.md +1 -1
  70. package/src/core/workflows/party-mode/steps/step-03-graceful-exit.md +0 -1
  71. package/src/core/workflows/party-mode/workflow.md +2 -3
  72. package/src/modules/bmb/README.md +1 -1
  73. package/src/modules/bmb/_module-installer/installer.js +76 -0
  74. package/src/modules/bmb/agents/bmad-builder.agent.yaml +32 -9
  75. package/src/modules/bmb/docs/agents/agent-menu-patterns.md +5 -5
  76. package/src/modules/bmb/docs/agents/expert-agent-architecture.md +20 -20
  77. package/src/modules/bmb/docs/agents/index.md +1 -1
  78. package/src/modules/bmb/docs/agents/module-agent-architecture.md +45 -45
  79. package/src/modules/bmb/docs/agents/simple-agent-architecture.md +7 -3
  80. package/src/modules/bmb/docs/workflows/architecture.md +1 -1
  81. package/src/modules/bmb/docs/workflows/templates/step-01-init-continuable-template.md +241 -0
  82. package/src/modules/bmb/docs/workflows/templates/step-1b-template.md +223 -0
  83. package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/step-file.md +4 -4
  84. package/src/modules/bmb/docs/workflows/{step-template.md → templates/step-template.md} +40 -33
  85. package/src/modules/bmb/docs/workflows/templates/workflow-template.md +104 -0
  86. package/src/modules/bmb/{workflows/create-workflow → docs/workflows}/templates/workflow.md +1 -1
  87. package/src/modules/bmb/{_module-installer/install-config.yaml → module.yaml} +4 -9
  88. package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/README.md +4 -4
  89. package/src/modules/bmb/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +8 -8
  90. package/src/modules/bmb/reference/agents/module-examples/security-engineer.agent.yaml +6 -6
  91. package/src/modules/bmb/reference/agents/module-examples/trend-analyst.agent.yaml +7 -7
  92. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01-init.md +2 -3
  93. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-01b-continue.md +10 -40
  94. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-02-profile.md +1 -1
  95. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-03-assessment.md +1 -0
  96. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-04-strategy.md +2 -2
  97. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +2 -2
  98. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/steps/step-06-prep-schedule.md +2 -2
  99. package/src/modules/bmb/reference/workflows/meal-prep-nutrition/workflow.md +2 -2
  100. package/src/modules/bmb/workflows/create-agent/data/info-and-installation-guide.md +16 -4
  101. package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/README.md +4 -4
  102. package/src/modules/bmb/workflows/create-agent/data/reference/agents/expert-examples/journal-keeper/journal-keeper.agent.yaml +7 -7
  103. package/src/modules/bmb/workflows/create-agent/data/reference/workflows/meal-prep-nutrition/steps/step-05-shopping.md +1 -1
  104. package/src/modules/bmb/workflows/create-agent/data/validation-complete.md +3 -3
  105. package/src/modules/bmb/workflows/create-agent/steps/step-01-brainstorm.md +3 -3
  106. package/src/modules/bmb/workflows/create-agent/steps/step-02-discover.md +3 -3
  107. package/src/modules/bmb/workflows/create-agent/steps/step-03-persona.md +3 -3
  108. package/src/modules/bmb/workflows/create-agent/steps/step-04-commands.md +6 -6
  109. package/src/modules/bmb/workflows/create-agent/steps/step-05-name.md +2 -2
  110. package/src/modules/bmb/workflows/create-agent/steps/step-06-build.md +3 -3
  111. package/src/modules/bmb/workflows/create-agent/steps/step-07-validate.md +3 -3
  112. package/src/modules/bmb/workflows/create-agent/steps/step-08-setup.md +2 -2
  113. package/src/modules/bmb/workflows/create-agent/steps/step-09-customize.md +3 -3
  114. package/src/modules/bmb/workflows/create-agent/steps/step-10-build-tools.md +2 -2
  115. package/src/modules/bmb/workflows/create-agent/steps/step-11-celebrate.md +2 -2
  116. package/src/modules/bmb/workflows/create-agent/workflow.md +11 -11
  117. package/src/modules/bmb/workflows/create-module/steps/step-01-init.md +155 -0
  118. package/src/modules/bmb/workflows/create-module/steps/step-01b-continue.md +169 -0
  119. package/src/modules/bmb/workflows/create-module/steps/step-02-concept.md +217 -0
  120. package/src/modules/bmb/workflows/create-module/steps/step-03-components.md +267 -0
  121. package/src/modules/bmb/workflows/create-module/steps/step-04-structure.md +228 -0
  122. package/src/modules/bmb/workflows/create-module/steps/step-05-config.md +233 -0
  123. package/src/modules/bmb/workflows/create-module/steps/step-06-agents.md +296 -0
  124. package/src/modules/bmb/workflows/create-module/steps/step-07-workflows.md +228 -0
  125. package/src/modules/bmb/workflows/create-module/steps/step-08-installer.md +186 -0
  126. package/src/modules/bmb/workflows/create-module/steps/step-09-documentation.md +309 -0
  127. package/src/modules/bmb/workflows/create-module/steps/step-10-roadmap.md +337 -0
  128. package/src/modules/bmb/workflows/create-module/steps/step-11-validate.md +335 -0
  129. package/src/modules/bmb/workflows/create-module/templates/agent.template.md +317 -0
  130. package/src/modules/bmb/workflows/create-module/templates/installer.template.js +47 -0
  131. package/src/modules/bmb/workflows/create-module/templates/module-plan.template.md +5 -0
  132. package/src/modules/bmb/workflows/create-module/templates/module.template.yaml +53 -0
  133. package/src/modules/bmb/workflows/create-module/templates/workflow-plan-template.md +23 -0
  134. package/src/modules/bmb/workflows/create-module/validation.md +126 -0
  135. package/src/modules/bmb/workflows/create-module/workflow.md +55 -0
  136. package/src/modules/bmb/workflows/create-workflow/steps/step-01-init.md +45 -56
  137. package/src/modules/bmb/workflows/create-workflow/steps/step-02-gather.md +9 -31
  138. package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-configuration.md +250 -0
  139. package/src/modules/bmb/workflows/create-workflow/steps/step-04-plan-review.md +216 -0
  140. package/src/modules/bmb/workflows/create-workflow/steps/step-05-output-format-design.md +289 -0
  141. package/src/modules/bmb/workflows/create-workflow/steps/{step-09-design.md → step-06-design.md} +76 -44
  142. package/src/modules/bmb/workflows/create-workflow/steps/{step-11-build.md → step-07-build.md} +71 -25
  143. package/src/modules/bmb/workflows/create-workflow/steps/{step-12-review.md → step-08-review.md} +30 -16
  144. package/src/modules/bmb/workflows/create-workflow/steps/step-09-complete.md +187 -0
  145. package/src/modules/bmb/workflows/create-workflow/workflow.md +2 -2
  146. package/src/modules/bmb/workflows/edit-agent/steps/step-01-discover-intent.md +2 -2
  147. package/src/modules/bmb/workflows/edit-agent/steps/step-02-analyze-agent.md +14 -14
  148. package/src/modules/bmb/workflows/edit-agent/steps/step-03-propose-changes.md +4 -4
  149. package/src/modules/bmb/workflows/edit-agent/steps/step-04-apply-changes.md +2 -2
  150. package/src/modules/bmb/workflows/edit-agent/steps/step-05-validate.md +4 -4
  151. package/src/modules/bmb/workflows/edit-agent/workflow.md +1 -1
  152. package/src/modules/bmb/workflows/edit-workflow/steps/step-01-analyze.md +2 -6
  153. package/src/modules/bmb/workflows/edit-workflow/steps/step-03-improve.md +2 -2
  154. package/src/modules/bmb/workflows/edit-workflow/steps/step-04-validate.md +1 -1
  155. package/src/modules/bmb/workflows/edit-workflow/workflow.md +1 -1
  156. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-01-validate-goal.md +2 -2
  157. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-02-workflow-validation.md +5 -5
  158. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-03-step-validation.md +7 -7
  159. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-04-file-validation.md +3 -3
  160. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-05-intent-spectrum-validation.md +3 -3
  161. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-06-web-subprocess-validation.md +3 -3
  162. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-07-holistic-analysis.md +3 -3
  163. package/src/modules/bmb/workflows/workflow-compliance-check/steps/step-08-generate-report.md +2 -2
  164. package/src/modules/bmb/workflows/workflow-compliance-check/workflow.md +1 -1
  165. package/src/modules/bmb/workflows-legacy/edit-module/checklist.md +0 -1
  166. package/src/modules/bmgd/README.md +2 -1
  167. package/src/modules/bmgd/workflows/3-technical/game-architecture/instructions.md +8 -8
  168. package/src/modules/bmm/_module-installer/installer.js +1 -1
  169. package/src/modules/bmm/_module-installer/platform-specifics/claude-code.js +1 -1
  170. package/src/modules/bmm/_module-installer/platform-specifics/windsurf.js +1 -1
  171. package/src/modules/bmm/agents/analyst.agent.yaml +11 -8
  172. package/src/modules/bmm/agents/architect.agent.yaml +1 -5
  173. package/src/modules/bmm/agents/pm.agent.yaml +5 -5
  174. package/src/modules/bmm/docs/README.md +23 -1
  175. package/src/modules/bmm/docs/agents-guide.md +16 -35
  176. package/src/modules/bmm/docs/brownfield-guide.md +17 -30
  177. package/src/modules/bmm/docs/enterprise-agentic-development.md +2 -2
  178. package/src/modules/bmm/docs/faq.md +6 -39
  179. package/src/modules/bmm/docs/glossary.md +11 -24
  180. package/src/modules/bmm/docs/images/README.md +37 -0
  181. package/src/modules/bmm/docs/images/workflow-method-greenfield.excalidraw +62 -202
  182. package/src/modules/bmm/docs/images/workflow-method-greenfield.svg +3 -1
  183. package/src/modules/bmm/docs/quick-spec-flow.md +652 -0
  184. package/src/modules/bmm/docs/quick-start.md +9 -25
  185. package/src/modules/bmm/docs/test-architecture.md +6 -6
  186. package/src/modules/bmm/docs/troubleshooting.md +680 -0
  187. package/src/modules/bmm/docs/workflow-document-project-reference.md +1 -1
  188. package/src/modules/bmm/docs/workflows-implementation.md +143 -3
  189. package/src/modules/bmm/docs/workflows-solutioning.md +2 -2
  190. package/src/modules/bmm/{_module-installer/install-config.yaml → module.yaml} +1 -1
  191. package/src/modules/bmm/tasks/daily-standup.xml +85 -0
  192. package/src/modules/bmm/testarch/knowledge/ci-burn-in.md +1 -1
  193. package/src/modules/bmm/testarch/knowledge/overview.md +1 -1
  194. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-02-vision.md +2 -2
  195. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-03-users.md +2 -2
  196. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-04-metrics.md +2 -2
  197. package/src/modules/bmm/workflows/1-analysis/product-brief/steps/step-05-scope.md +2 -2
  198. package/src/modules/bmm/workflows/1-analysis/product-brief/workflow.md +1 -1
  199. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-01-init.md +8 -8
  200. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-02-domain-analysis.md +18 -18
  201. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-03-competitive-landscape.md +18 -18
  202. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-04-regulatory-focus.md +18 -18
  203. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-05-technical-trends.md +17 -17
  204. package/src/modules/bmm/workflows/1-analysis/research/domain-steps/step-06-research-synthesis.md +35 -36
  205. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-01-init.md +5 -6
  206. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +20 -19
  207. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-02-customer-insights.md +21 -20
  208. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +20 -19
  209. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +21 -20
  210. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +16 -15
  211. package/src/modules/bmm/workflows/1-analysis/research/market-steps/step-06-research-completion.md +36 -37
  212. package/src/modules/bmm/workflows/1-analysis/research/research.template.md +0 -1
  213. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-01-init.md +8 -8
  214. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-02-technical-overview.md +19 -18
  215. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-03-integration-patterns.md +20 -19
  216. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-04-architectural-patterns.md +21 -20
  217. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-05-implementation-research.md +19 -18
  218. package/src/modules/bmm/workflows/1-analysis/research/technical-steps/step-06-research-synthesis.md +38 -39
  219. package/src/modules/bmm/workflows/1-analysis/research/workflow.md +14 -8
  220. package/src/modules/bmm/workflows/2-plan-workflows/create-ux-design/workflow.md +6 -0
  221. package/src/modules/bmm/workflows/2-plan-workflows/prd/prd-template.md +7 -0
  222. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01-init.md +138 -56
  223. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-01b-continue.md +93 -51
  224. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-02-discovery.md +223 -78
  225. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-03-success.md +20 -2
  226. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-04-journeys.md +18 -0
  227. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-05-domain.md +21 -0
  228. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-06-innovation.md +21 -0
  229. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-07-project-type.md +21 -0
  230. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-08-scoping.md +18 -0
  231. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-09-functional.md +18 -0
  232. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-10-nonfunctional.md +18 -0
  233. package/src/modules/bmm/workflows/2-plan-workflows/prd/steps/step-11-complete.md +13 -0
  234. package/src/modules/bmm/workflows/2-plan-workflows/prd/workflow.md +2 -2
  235. package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-03-starter.md +14 -14
  236. package/src/modules/bmm/workflows/3-solutioning/architecture/steps/step-04-decisions.md +7 -7
  237. package/src/modules/bmm/workflows/3-solutioning/architecture/workflow.md +2 -1
  238. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-01-validate-prerequisites.md +258 -0
  239. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-02-design-epics.md +232 -0
  240. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-03-create-stories.md +271 -0
  241. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/steps/step-04-final-validation.md +144 -0
  242. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/templates/epics-template.md +57 -0
  243. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.md +58 -0
  244. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-01-document-discovery.md +189 -0
  245. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-02-prd-analysis.md +177 -0
  246. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-03-epic-coverage-validation.md +178 -0
  247. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-04-ux-alignment.md +138 -0
  248. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-05-epic-quality-review.md +251 -0
  249. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/steps/step-06-final-assessment.md +132 -0
  250. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/templates/readiness-report-template.md +4 -0
  251. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.md +54 -0
  252. package/src/modules/{bmgd/workflows/4-production → bmm/workflows/4-implementation}/code-review/checklist.md +2 -1
  253. package/src/modules/bmm/workflows/4-implementation/code-review/instructions.xml +51 -3
  254. package/src/modules/bmm/workflows/4-implementation/code-review/workflow.yaml +1 -1
  255. package/src/modules/bmm/workflows/4-implementation/create-story/instructions.xml +32 -2
  256. package/src/modules/bmm/workflows/4-implementation/retrospective/instructions.md +3 -3
  257. package/src/modules/bmm/workflows/4-implementation/sprint-planning/instructions.md +19 -21
  258. package/src/modules/bmm/workflows/4-implementation/sprint-planning/sprint-status-template.yaml +10 -10
  259. package/src/modules/bmm/workflows/4-implementation/sprint-status/instructions.md +174 -0
  260. package/src/modules/bmm/workflows/4-implementation/sprint-status/workflow.yaml +35 -0
  261. package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/instructions.md +104 -7
  262. package/src/modules/bmm/workflows/bmad-quick-flow/quick-dev/workflow.yaml +4 -0
  263. package/src/modules/bmm/workflows/document-project/instructions.md +1 -1
  264. package/src/modules/bmm/workflows/document-project/workflows/deep-dive-instructions.md +2 -2
  265. package/src/modules/bmm/workflows/generate-project-context/workflow.md +1 -1
  266. package/src/modules/bmm/workflows/testarch/atdd/atdd-checklist-template.md +1 -1
  267. package/src/modules/bmm/workflows/testarch/ci/checklist.md +1 -1
  268. package/src/modules/bmm/workflows/testarch/ci/github-actions-template.yaml +36 -3
  269. package/src/modules/bmm/workflows/testarch/ci/gitlab-ci-template.yaml +25 -4
  270. package/src/modules/bmm/workflows/testarch/ci/instructions.md +2 -2
  271. package/src/modules/bmm/workflows/testarch/test-review/instructions.md +1 -1
  272. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-brownfield.yaml +1 -6
  273. package/src/modules/bmm/workflows/workflow-status/paths/enterprise-greenfield.yaml +1 -6
  274. package/src/modules/bmm/workflows/workflow-status/paths/method-brownfield.yaml +1 -6
  275. package/src/modules/bmm/workflows/workflow-status/paths/method-greenfield.yaml +1 -7
  276. package/src/modules/cis/_module-installer/installer.js +1 -1
  277. package/tools/cli/README.md +7 -7
  278. package/tools/cli/commands/build.js +9 -184
  279. package/tools/cli/commands/install.js +1 -6
  280. package/tools/cli/installers/lib/core/config-collector.js +80 -12
  281. package/tools/cli/installers/lib/core/custom-module-cache.js +239 -0
  282. package/tools/cli/installers/lib/core/detector.js +8 -4
  283. package/tools/cli/installers/lib/core/installer.js +933 -376
  284. package/tools/cli/installers/lib/core/manifest-generator.js +265 -41
  285. package/tools/cli/installers/lib/core/manifest.js +47 -0
  286. package/tools/cli/installers/lib/core/post-install-sidecar-replacement.js +79 -0
  287. package/tools/cli/installers/lib/custom/handler.js +396 -0
  288. package/tools/cli/installers/lib/ide/_base-ide.js +10 -0
  289. package/tools/cli/installers/lib/ide/auggie.js +19 -7
  290. package/tools/cli/installers/lib/ide/crush.js +19 -6
  291. package/tools/cli/installers/lib/ide/cursor.js +29 -13
  292. package/tools/cli/installers/lib/ide/gemini.js +49 -1
  293. package/tools/cli/installers/lib/ide/iflow.js +20 -1
  294. package/tools/cli/installers/lib/ide/kiro-cli.js +327 -0
  295. package/tools/cli/installers/lib/ide/opencode.js +3 -3
  296. package/tools/cli/installers/lib/ide/roo.js +120 -184
  297. package/tools/cli/installers/lib/ide/rovo-dev.js +1 -1
  298. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +8 -2
  299. package/tools/cli/installers/lib/ide/shared/bmad-artifacts.js +34 -19
  300. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +18 -14
  301. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +1 -1
  302. package/tools/cli/installers/lib/ide/templates/workflow-commander.md +5 -0
  303. package/tools/cli/installers/lib/modules/manager.js +535 -56
  304. package/tools/cli/lib/agent/compiler.js +57 -16
  305. package/tools/cli/lib/agent/installer.js +129 -28
  306. package/tools/cli/lib/cli-utils.js +21 -4
  307. package/tools/cli/lib/config.js +2 -1
  308. package/tools/cli/lib/ui.js +561 -12
  309. package/tools/cli/lib/yaml-xml-builder.js +0 -15
  310. package/tools/maintainer/review-pr-README.md +55 -0
  311. package/tools/maintainer/review-pr.md +242 -0
  312. package/tools/migrate-custom-module-paths.js +124 -0
  313. package/tools/schema/agent.js +149 -89
  314. package/tools/validate-svg-changes.sh +356 -0
  315. package/custom/src/agents/commit-poet/installation-guide.md +0 -36
  316. package/custom/src/agents/toolsmith/installation-guide.md +0 -36
  317. package/docs/custom-agent-installation.md +0 -183
  318. package/src/modules/bmb/docs/workflows/workflow-template.md +0 -152
  319. package/src/modules/bmb/workflows/create-workflow/steps/step-03-tools-overview.md +0 -127
  320. package/src/modules/bmb/workflows/create-workflow/steps/step-04-core-tools.md +0 -145
  321. package/src/modules/bmb/workflows/create-workflow/steps/step-05-memory-requirements.md +0 -136
  322. package/src/modules/bmb/workflows/create-workflow/steps/step-06-external-tools.md +0 -154
  323. package/src/modules/bmb/workflows/create-workflow/steps/step-07-installation-guidance.md +0 -159
  324. package/src/modules/bmb/workflows/create-workflow/steps/step-08-tools-summary.md +0 -167
  325. package/src/modules/bmb/workflows/create-workflow/steps/step-10-plan-review.md +0 -215
  326. package/src/modules/bmb/workflows/create-workflow/templates/build-summary.md +0 -36
  327. package/src/modules/bmb/workflows/create-workflow/templates/completion-section.md +0 -39
  328. package/src/modules/bmb/workflows/create-workflow/templates/content-template.md +0 -21
  329. package/src/modules/bmb/workflows/create-workflow/templates/design-section.md +0 -53
  330. package/src/modules/bmb/workflows/create-workflow/templates/project-info.md +0 -18
  331. package/src/modules/bmb/workflows/create-workflow/templates/requirements-section.md +0 -47
  332. package/src/modules/bmb/workflows/create-workflow/templates/review-section.md +0 -56
  333. package/src/modules/bmb/workflows/create-workflow/templates/workflow-plan.md +0 -54
  334. package/src/modules/bmb/workflows-legacy/create-module/README.md +0 -229
  335. package/src/modules/bmb/workflows-legacy/create-module/brainstorm-context.md +0 -137
  336. package/src/modules/bmb/workflows-legacy/create-module/checklist.md +0 -235
  337. package/src/modules/bmb/workflows-legacy/create-module/installer-templates/install-config.yaml +0 -92
  338. package/src/modules/bmb/workflows-legacy/create-module/installer-templates/installer.js +0 -231
  339. package/src/modules/bmb/workflows-legacy/create-module/instructions.md +0 -577
  340. package/src/modules/bmb/workflows-legacy/create-module/module-structure.md +0 -400
  341. package/src/modules/bmb/workflows-legacy/create-module/workflow.yaml +0 -52
  342. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/epics-template.md +0 -80
  343. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/instructions.md +0 -387
  344. package/src/modules/bmm/workflows/3-solutioning/create-epics-and-stories/workflow.yaml +0 -53
  345. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/checklist.md +0 -169
  346. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/instructions.md +0 -332
  347. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/template.md +0 -146
  348. package/src/modules/bmm/workflows/3-solutioning/implementation-readiness/workflow.yaml +0 -64
  349. package/tools/cli/commands/agent-install.js +0 -409
  350. package/tools/cli/commands/cleanup.js +0 -141
  351. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/bundlers.md +0 -0
  352. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/deploy.md +0 -0
  353. /package/{custom/src → example-custom-content}/agents/toolsmith/toolsmith-sidecar/knowledge/tests.md +0 -0
  354. /package/src/modules/bmgd/{_module-installer/install-config.yaml → module.yaml} +0 -0
  355. /package/src/modules/cis/{_module-installer/install-config.yaml → module.yaml} +0 -0
@@ -75,27 +75,41 @@ function agentSchema(options = {}) {
75
75
  }
76
76
  // Handle multi format with triggers array (new format)
77
77
  else if (item.triggers && Array.isArray(item.triggers)) {
78
- for (const triggerGroup of item.triggers) {
79
- for (const triggerKey of Object.keys(triggerGroup)) {
80
- if (!TRIGGER_PATTERN.test(triggerKey)) {
78
+ for (const [triggerIndex, triggerItem] of item.triggers.entries()) {
79
+ let triggerName = null;
80
+
81
+ // Extract trigger name from all three formats
82
+ if (triggerItem.trigger) {
83
+ // Format 1: Simple flat format with trigger field
84
+ triggerName = triggerItem.trigger;
85
+ } else {
86
+ // Format 2a or 2b: Object-key format
87
+ const keys = Object.keys(triggerItem);
88
+ if (keys.length === 1 && keys[0] !== 'trigger') {
89
+ triggerName = keys[0];
90
+ }
91
+ }
92
+
93
+ if (triggerName) {
94
+ if (!TRIGGER_PATTERN.test(triggerName)) {
81
95
  ctx.addIssue({
82
96
  code: 'custom',
83
- path: ['agent', 'menu', index, 'triggers'],
84
- message: `agent.menu[].triggers key must be kebab-case (lowercase words separated by hyphen) - got "${triggerKey}"`,
97
+ path: ['agent', 'menu', index, 'triggers', triggerIndex],
98
+ message: `agent.menu[].triggers[] must be kebab-case (lowercase words separated by hyphen) - got "${triggerName}"`,
85
99
  });
86
100
  return;
87
101
  }
88
102
 
89
- if (seenTriggers.has(triggerKey)) {
103
+ if (seenTriggers.has(triggerName)) {
90
104
  ctx.addIssue({
91
105
  code: 'custom',
92
- path: ['agent', 'menu', index, 'triggers'],
93
- message: `agent.menu[].triggers key duplicates "${triggerKey}" within the same agent`,
106
+ path: ['agent', 'menu', index, 'triggers', triggerIndex],
107
+ message: `agent.menu[].triggers[] duplicates "${triggerName}" within the same agent`,
94
108
  });
95
109
  return;
96
110
  }
97
111
 
98
- seenTriggers.add(triggerKey);
112
+ seenTriggers.add(triggerName);
99
113
  }
100
114
  }
101
115
  }
@@ -250,101 +264,147 @@ function buildMenuItemSchema() {
250
264
  .object({
251
265
  multi: createNonEmptyString('agent.menu[].multi'),
252
266
  triggers: z
253
- .array(z.object({}).passthrough())
254
- .refine(
255
- (triggers) => {
256
- // Each item in triggers array should be an object with exactly one key
257
- for (const trigger of triggers) {
258
- const keys = Object.keys(trigger);
259
- if (keys.length !== 1) {
260
- return false;
261
- }
267
+ .array(
268
+ z.union([
269
+ // Format 1: Simple flat format (has trigger field)
270
+ z
271
+ .object({
272
+ trigger: z.string(),
273
+ input: createNonEmptyString('agent.menu[].triggers[].input'),
274
+ route: createNonEmptyString('agent.menu[].triggers[].route').optional(),
275
+ action: createNonEmptyString('agent.menu[].triggers[].action').optional(),
276
+ data: z.string().optional(),
277
+ type: z.enum(['exec', 'action', 'workflow']).optional(),
278
+ })
279
+ .strict()
280
+ .refine((data) => data.trigger, { message: 'Must have trigger field' })
281
+ .superRefine((value, ctx) => {
282
+ // Must have either route or action (or both)
283
+ if (!value.route && !value.action) {
284
+ ctx.addIssue({
285
+ code: 'custom',
286
+ message: 'agent.menu[].triggers[] must have either route or action (or both)',
287
+ });
288
+ }
289
+ }),
290
+ // Format 2a: Object with array format (like bmad-builder.agent.yaml)
291
+ z
292
+ .object({})
293
+ .passthrough()
294
+ .refine(
295
+ (value) => {
296
+ const keys = Object.keys(value);
297
+ if (keys.length !== 1) return false;
298
+ const triggerItems = value[keys[0]];
299
+ return Array.isArray(triggerItems);
300
+ },
301
+ { message: 'Must be object with single key pointing to array' },
302
+ )
303
+ .superRefine((value, ctx) => {
304
+ const triggerName = Object.keys(value)[0];
305
+ const triggerItems = value[triggerName];
306
+
307
+ if (!Array.isArray(triggerItems)) {
308
+ ctx.addIssue({
309
+ code: 'custom',
310
+ message: `Trigger "${triggerName}" must be an array of items`,
311
+ });
312
+ return;
313
+ }
262
314
 
263
- const execArray = trigger[keys[0]];
264
- if (!Array.isArray(execArray)) {
265
- return false;
266
- }
315
+ // Check required fields in the array
316
+ const hasInput = triggerItems.some((item) => 'input' in item);
317
+ const hasRouteOrAction = triggerItems.some((item) => 'route' in item || 'action' in item);
267
318
 
268
- // Check required fields
269
- const hasInput = execArray.some((item) => 'input' in item);
270
- const hasRouteOrAction = execArray.some((item) => 'route' in item || 'action' in item);
319
+ if (!hasInput) {
320
+ ctx.addIssue({
321
+ code: 'custom',
322
+ message: `Trigger "${triggerName}" must have an input field`,
323
+ });
324
+ }
271
325
 
272
- if (!hasInput) {
273
- return false;
274
- }
326
+ if (!hasRouteOrAction) {
327
+ ctx.addIssue({
328
+ code: 'custom',
329
+ message: `Trigger "${triggerName}" must have a route or action field`,
330
+ });
331
+ }
332
+ }),
333
+ // Format 2b: Object with direct fields (like analyst.agent.yaml)
334
+ z
335
+ .object({})
336
+ .passthrough()
337
+ .refine(
338
+ (value) => {
339
+ const keys = Object.keys(value);
340
+ if (keys.length !== 1) return false;
341
+ const triggerFields = value[keys[0]];
342
+ return !Array.isArray(triggerFields) && typeof triggerFields === 'object';
343
+ },
344
+ { message: 'Must be object with single key pointing to object' },
345
+ )
346
+ .superRefine((value, ctx) => {
347
+ const triggerName = Object.keys(value)[0];
348
+ const triggerFields = value[triggerName];
349
+
350
+ // Check required fields
351
+ if (!triggerFields.input || typeof triggerFields.input !== 'string') {
352
+ ctx.addIssue({
353
+ code: 'custom',
354
+ message: `Trigger "${triggerName}" must have an input field`,
355
+ });
356
+ }
275
357
 
276
- // If not TODO, must have route or action
277
- const isTodo = execArray.some((item) => item.route === 'TODO' || item.action === 'TODO');
278
- if (!isTodo && !hasRouteOrAction) {
279
- return false;
280
- }
281
- }
282
- return true;
283
- },
284
- {
285
- message: 'agent.menu[].triggers must be an array of trigger objects with input and either route/action or TODO',
286
- },
358
+ if (!triggerFields.route && !triggerFields.action) {
359
+ ctx.addIssue({
360
+ code: 'custom',
361
+ message: `Trigger "${triggerName}" must have a route or action field`,
362
+ });
363
+ }
364
+ }),
365
+ ]),
287
366
  )
288
- .transform((triggers) => {
289
- // Validate and clean up the triggers
290
- for (const trigger of triggers) {
291
- const keys = Object.keys(trigger);
292
- if (keys.length !== 1) {
293
- throw new Error('Each trigger object must have exactly one key');
294
- }
295
-
296
- const execArray = trigger[keys[0]];
297
- if (!Array.isArray(execArray)) {
298
- throw new TypeError(`Trigger "${keys[0]}" must be an array`);
299
- }
300
-
301
- // Validate each item in the exec array
302
- for (const item of execArray) {
303
- if ('input' in item && typeof item.input !== 'string') {
304
- throw new Error('Input must be a string');
305
- }
306
- if ('route' in item && typeof item.route !== 'string' && item.route !== 'TODO') {
307
- throw new Error('Route must be a string or TODO');
308
- }
309
- if ('type' in item && !['exec', 'action', 'workflow', 'TODO'].includes(item.type)) {
310
- throw new Error('Type must be one of: exec, action, workflow, TODO');
311
- }
312
- }
313
- }
314
- return triggers;
315
- }),
367
+ .min(1, { message: 'agent.menu[].triggers must have at least one trigger' }),
316
368
  discussion: z.boolean().optional(),
317
369
  })
318
370
  .strict()
319
371
  .superRefine((value, ctx) => {
320
- // Extract all trigger keys for validation
321
- const triggerKeys = [];
322
- for (const triggerGroup of value.triggers) {
323
- for (const key of Object.keys(triggerGroup)) {
324
- triggerKeys.push(key);
325
-
326
- // Validate trigger key format
327
- if (!TRIGGER_PATTERN.test(key)) {
372
+ // Check for duplicate trigger names
373
+ const seenTriggers = new Set();
374
+ for (const [index, triggerItem] of value.triggers.entries()) {
375
+ let triggerName = null;
376
+
377
+ // Extract trigger name from either format
378
+ if (triggerItem.trigger) {
379
+ // Format 1
380
+ triggerName = triggerItem.trigger;
381
+ } else {
382
+ // Format 2
383
+ const keys = Object.keys(triggerItem);
384
+ if (keys.length === 1) {
385
+ triggerName = keys[0];
386
+ }
387
+ }
388
+
389
+ if (triggerName) {
390
+ if (seenTriggers.has(triggerName)) {
328
391
  ctx.addIssue({
329
392
  code: 'custom',
330
- path: ['agent', 'menu', 'triggers'],
331
- message: `Trigger key "${key}" must be kebab-case (lowercase words separated by hyphen)`,
393
+ path: ['agent', 'menu', 'triggers', index],
394
+ message: `Trigger name "${triggerName}" is duplicated`,
332
395
  });
333
396
  }
334
- }
335
- }
397
+ seenTriggers.add(triggerName);
336
398
 
337
- // Check for duplicates
338
- const seenTriggers = new Set();
339
- for (const triggerKey of triggerKeys) {
340
- if (seenTriggers.has(triggerKey)) {
341
- ctx.addIssue({
342
- code: 'custom',
343
- path: ['agent', 'menu', 'triggers'],
344
- message: `Trigger key "${triggerKey}" is duplicated`,
345
- });
399
+ // Validate trigger name format
400
+ if (!TRIGGER_PATTERN.test(triggerName)) {
401
+ ctx.addIssue({
402
+ code: 'custom',
403
+ path: ['agent', 'menu', 'triggers', index],
404
+ message: `Trigger name "${triggerName}" must be kebab-case (lowercase words separated by hyphen)`,
405
+ });
406
+ }
346
407
  }
347
- seenTriggers.add(triggerKey);
348
408
  }
349
409
  });
350
410
 
@@ -0,0 +1,356 @@
1
+ #!/bin/bash
2
+ #
3
+ # Visual SVG Validation Script
4
+ #
5
+ # Compares old vs new SVG files using browser-accurate rendering (Playwright)
6
+ # and pixel-level comparison (ImageMagick), then generates a prompt for AI analysis.
7
+ #
8
+ # Usage: ./tools/validate-svg-changes.sh <path-to-svg>
9
+ #
10
+
11
+ set -e
12
+
13
+ SVG_FILE="${1:-src/modules/bmm/docs/images/workflow-method-greenfield.svg}"
14
+ TMP_DIR="/tmp/svg-validation-$$"
15
+
16
+ echo "🎨 Visual SVG Validation"
17
+ echo ""
18
+
19
+ # Check if file exists
20
+ if [ ! -f "$SVG_FILE" ]; then
21
+ echo "❌ Error: SVG file not found: $SVG_FILE"
22
+ exit 1
23
+ fi
24
+
25
+ # Check for ImageMagick
26
+ if ! command -v magick &> /dev/null; then
27
+ echo "❌ ImageMagick not found"
28
+ echo ""
29
+ echo "Install with:"
30
+ echo " brew install imagemagick"
31
+ echo ""
32
+ exit 1
33
+ fi
34
+
35
+ echo "✓ ImageMagick found"
36
+
37
+ # Check for Node.js
38
+ if ! command -v node &> /dev/null; then
39
+ echo "❌ Node.js not found"
40
+ exit 1
41
+ fi
42
+
43
+ echo "✓ Node.js found ($(node -v))"
44
+
45
+ # Check for Playwright (local install)
46
+ if [ ! -d "node_modules/playwright" ]; then
47
+ echo ""
48
+ echo "📦 Playwright not found locally"
49
+ echo "Installing Playwright (local to this project, no package.json changes)..."
50
+ echo ""
51
+ npm install --no-save playwright
52
+ echo ""
53
+ echo "✓ Playwright installed"
54
+ else
55
+ echo "✓ Playwright found"
56
+ fi
57
+
58
+ echo ""
59
+ echo "🔄 Rendering SVGs to PNG..."
60
+ echo ""
61
+
62
+ # Create temp directory
63
+ mkdir -p "$TMP_DIR"
64
+
65
+ # Extract old SVG from git
66
+ git show HEAD:"$SVG_FILE" > "$TMP_DIR/old.svg" 2>/dev/null || {
67
+ echo "❌ Could not extract old SVG from git HEAD"
68
+ echo " Make sure you have uncommitted changes to compare"
69
+ exit 1
70
+ }
71
+
72
+ # Copy new SVG
73
+ cp "$SVG_FILE" "$TMP_DIR/new.svg"
74
+
75
+ # Create Node.js renderer script in project directory (so it can find node_modules)
76
+ cat > "tools/render-svg-temp.js" << 'EOJS'
77
+ const { chromium } = require('playwright');
78
+ const fs = require('fs');
79
+
80
+ async function renderSVG(svgPath, pngPath) {
81
+ const browser = await chromium.launch({ headless: true });
82
+ const page = await browser.newPage();
83
+
84
+ const svgContent = fs.readFileSync(svgPath, 'utf8');
85
+ const widthMatch = svgContent.match(/width="([^"]+)"/);
86
+ const heightMatch = svgContent.match(/height="([^"]+)"/);
87
+ const width = Math.ceil(parseFloat(widthMatch[1]));
88
+ const height = Math.ceil(parseFloat(heightMatch[1]));
89
+
90
+ const html = `
91
+ <!DOCTYPE html>
92
+ <html>
93
+ <head>
94
+ <style>
95
+ body { margin: 0; padding: 0; background: white; }
96
+ svg { display: block; }
97
+ </style>
98
+ </head>
99
+ <body>${svgContent}</body>
100
+ </html>
101
+ `;
102
+
103
+ await page.setContent(html);
104
+ await page.setViewportSize({ width, height });
105
+ await page.waitForTimeout(1000);
106
+ await page.screenshot({ path: pngPath, fullPage: true });
107
+ await browser.close();
108
+
109
+ console.log(`✓ Rendered ${pngPath}`);
110
+ }
111
+
112
+ (async () => {
113
+ await renderSVG(process.argv[2], process.argv[3]);
114
+ await renderSVG(process.argv[4], process.argv[5]);
115
+ })();
116
+ EOJS
117
+
118
+ # Render both SVGs (run from project dir so node_modules is accessible)
119
+ node tools/render-svg-temp.js \
120
+ "$TMP_DIR/old.svg" "$TMP_DIR/old.png" \
121
+ "$TMP_DIR/new.svg" "$TMP_DIR/new.png"
122
+
123
+ # Clean up temp script
124
+ rm tools/render-svg-temp.js
125
+
126
+ echo ""
127
+ echo "🔍 Comparing pixels..."
128
+ echo ""
129
+
130
+ # Compare using ImageMagick
131
+ DIFF_OUTPUT=$(magick compare -metric AE "$TMP_DIR/old.png" "$TMP_DIR/new.png" "$TMP_DIR/diff.png" 2>&1 || true)
132
+ DIFF_PIXELS=$(echo "$DIFF_OUTPUT" | awk '{print $1}')
133
+
134
+ # Get image dimensions
135
+ DIMENSIONS=$(magick identify -format "%wx%h" "$TMP_DIR/old.png")
136
+ WIDTH=$(echo "$DIMENSIONS" | cut -d'x' -f1)
137
+ HEIGHT=$(echo "$DIMENSIONS" | cut -d'x' -f2)
138
+ TOTAL_PIXELS=$((WIDTH * HEIGHT))
139
+
140
+ # Calculate percentage
141
+ DIFF_PERCENT=$(echo "scale=4; $DIFF_PIXELS / $TOTAL_PIXELS * 100" | bc)
142
+
143
+ echo "📊 Results:"
144
+ echo " Dimensions: ${WIDTH} × ${HEIGHT}"
145
+ echo " Total pixels: $(printf "%'d" $TOTAL_PIXELS)"
146
+ echo " Different pixels: $(printf "%'d" $DIFF_PIXELS)"
147
+ echo " Difference: ${DIFF_PERCENT}%"
148
+ echo ""
149
+
150
+ if (( $(echo "$DIFF_PERCENT < 0.01" | bc -l) )); then
151
+ echo "✅ ESSENTIALLY IDENTICAL (< 0.01% difference)"
152
+ VERDICT="essentially identical"
153
+ elif (( $(echo "$DIFF_PERCENT < 0.1" | bc -l) )); then
154
+ echo "⚠️ MINOR DIFFERENCES (< 0.1%)"
155
+ VERDICT="minor differences detected"
156
+ else
157
+ echo "❌ SIGNIFICANT DIFFERENCES (≥ 0.1%)"
158
+ VERDICT="significant differences detected"
159
+ fi
160
+
161
+ echo ""
162
+ echo "📁 Output files:"
163
+ echo " Old render: $TMP_DIR/old.png"
164
+ echo " New render: $TMP_DIR/new.png"
165
+ echo " Diff image: $TMP_DIR/diff.png"
166
+ echo ""
167
+
168
+ # Generate HTML comparison page
169
+ cat > "$TMP_DIR/comparison.html" << 'EOHTML'
170
+ <!DOCTYPE html>
171
+ <html>
172
+ <head>
173
+ <title>SVG Comparison</title>
174
+ <style>
175
+ * { margin: 0; padding: 0; box-sizing: border-box; }
176
+ body {
177
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
178
+ background: #f5f5f5;
179
+ padding: 20px;
180
+ }
181
+ .header {
182
+ background: white;
183
+ padding: 20px;
184
+ border-radius: 8px;
185
+ margin-bottom: 20px;
186
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
187
+ }
188
+ h1 { margin-bottom: 10px; color: #333; }
189
+ .stats {
190
+ display: grid;
191
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
192
+ gap: 10px;
193
+ margin-top: 15px;
194
+ }
195
+ .stat {
196
+ background: #f8f9fa;
197
+ padding: 10px;
198
+ border-radius: 4px;
199
+ }
200
+ .stat-label { font-size: 12px; color: #666; text-transform: uppercase; }
201
+ .stat-value { font-size: 18px; font-weight: 600; color: #333; margin-top: 4px; }
202
+ .container {
203
+ display: grid;
204
+ grid-template-columns: 1fr 1fr 1fr;
205
+ gap: 20px;
206
+ margin-bottom: 20px;
207
+ }
208
+ .panel {
209
+ background: white;
210
+ padding: 20px;
211
+ border-radius: 8px;
212
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
213
+ }
214
+ h2 {
215
+ margin: 0 0 15px 0;
216
+ color: #333;
217
+ font-size: 18px;
218
+ border-bottom: 2px solid #e0e0e0;
219
+ padding-bottom: 10px;
220
+ }
221
+ .image-container {
222
+ border: 1px solid #ddd;
223
+ background: white;
224
+ overflow: auto;
225
+ max-height: 600px;
226
+ }
227
+ img {
228
+ display: block;
229
+ max-width: 100%;
230
+ height: auto;
231
+ }
232
+ .verdict {
233
+ display: inline-block;
234
+ padding: 4px 12px;
235
+ border-radius: 12px;
236
+ font-size: 14px;
237
+ font-weight: 600;
238
+ }
239
+ .verdict.good { background: #d4edda; color: #155724; }
240
+ .verdict.warning { background: #fff3cd; color: #856404; }
241
+ .verdict.bad { background: #f8d7da; color: #721c24; }
242
+ </style>
243
+ </head>
244
+ <body>
245
+ <div class="header">
246
+ <h1>🎨 SVG Visual Comparison</h1>
247
+ <p><strong>File:</strong> FILENAME_PLACEHOLDER</p>
248
+ <div class="stats">
249
+ <div class="stat">
250
+ <div class="stat-label">Dimensions</div>
251
+ <div class="stat-value">DIMENSIONS_PLACEHOLDER</div>
252
+ </div>
253
+ <div class="stat">
254
+ <div class="stat-label">Different Pixels</div>
255
+ <div class="stat-value">DIFF_PIXELS_PLACEHOLDER</div>
256
+ </div>
257
+ <div class="stat">
258
+ <div class="stat-label">Difference</div>
259
+ <div class="stat-value">DIFF_PERCENT_PLACEHOLDER%</div>
260
+ </div>
261
+ <div class="stat">
262
+ <div class="stat-label">Verdict</div>
263
+ <div class="stat-value"><span class="verdict VERDICT_CLASS_PLACEHOLDER">VERDICT_PLACEHOLDER</span></div>
264
+ </div>
265
+ </div>
266
+ </div>
267
+
268
+ <div class="container">
269
+ <div class="panel">
270
+ <h2>📄 Old (HEAD)</h2>
271
+ <div class="image-container">
272
+ <img src="old.png" alt="Old SVG">
273
+ </div>
274
+ </div>
275
+
276
+ <div class="panel">
277
+ <h2>📝 New (Working)</h2>
278
+ <div class="image-container">
279
+ <img src="new.png" alt="New SVG">
280
+ </div>
281
+ </div>
282
+
283
+ <div class="panel">
284
+ <h2>🔍 Diff (Red = Changes)</h2>
285
+ <div class="image-container">
286
+ <img src="diff.png" alt="Diff">
287
+ </div>
288
+ </div>
289
+ </div>
290
+ </body>
291
+ </html>
292
+ EOHTML
293
+
294
+ # Determine verdict class for styling
295
+ if (( $(echo "$DIFF_PERCENT < 0.01" | bc -l) )); then
296
+ VERDICT_CLASS="good"
297
+ elif (( $(echo "$DIFF_PERCENT < 0.1" | bc -l) )); then
298
+ VERDICT_CLASS="warning"
299
+ else
300
+ VERDICT_CLASS="bad"
301
+ fi
302
+
303
+ # Replace placeholders in HTML
304
+ sed -i '' "s|FILENAME_PLACEHOLDER|$SVG_FILE|g" "$TMP_DIR/comparison.html"
305
+ sed -i '' "s|DIMENSIONS_PLACEHOLDER|${WIDTH} × ${HEIGHT}|g" "$TMP_DIR/comparison.html"
306
+ sed -i '' "s|DIFF_PIXELS_PLACEHOLDER|$(printf "%'d" $DIFF_PIXELS) / $(printf "%'d" $TOTAL_PIXELS)|g" "$TMP_DIR/comparison.html"
307
+ sed -i '' "s|DIFF_PERCENT_PLACEHOLDER|$DIFF_PERCENT|g" "$TMP_DIR/comparison.html"
308
+ sed -i '' "s|VERDICT_PLACEHOLDER|$VERDICT|g" "$TMP_DIR/comparison.html"
309
+ sed -i '' "s|VERDICT_CLASS_PLACEHOLDER|$VERDICT_CLASS|g" "$TMP_DIR/comparison.html"
310
+
311
+ echo "✓ Generated comparison page: $TMP_DIR/comparison.html"
312
+ echo ""
313
+ echo "🌐 Opening comparison in browser..."
314
+ open "$TMP_DIR/comparison.html"
315
+ echo ""
316
+
317
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
318
+ echo ""
319
+ echo "🤖 AI VISUAL ANALYSIS PROMPT"
320
+ echo ""
321
+ echo "Copy and paste this into Gemini/Claude with the diff image attached:"
322
+ echo ""
323
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
324
+ cat << PROMPT
325
+
326
+ I've made changes to an Excalidraw diagram SVG file. Please analyze the visual differences between the old and new versions.
327
+
328
+ **Automated Analysis:**
329
+ - Dimensions: ${WIDTH} × ${HEIGHT} pixels
330
+ - Different pixels: $(printf "%'d" $DIFF_PIXELS) out of $(printf "%'d" $TOTAL_PIXELS)
331
+ - Difference: ${DIFF_PERCENT}%
332
+ - Verdict: ${VERDICT}
333
+
334
+ **Attached Image:**
335
+ The attached image shows the pixel-level diff (red = differences).
336
+
337
+ **Questions:**
338
+ 1. Are the differences purely anti-aliasing/rendering artifacts, or are there actual content changes?
339
+ 2. If there are content changes, what specifically changed?
340
+ 3. Do the changes align with the intent to remove zombie Excalidraw elements (elements marked as deleted but left in the JSON)?
341
+ 4. Is this safe to commit?
342
+
343
+ **Context:**
344
+ - File: $SVG_FILE
345
+ - Changes: Removed 191 lines of zombie JSON from Excalidraw source
346
+ - Expected: Visual output should be identical (zombie elements were already marked as deleted)
347
+
348
+ PROMPT
349
+ echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
350
+ echo ""
351
+ echo "📎 Attach this file to your AI prompt:"
352
+ echo " $TMP_DIR/diff.png"
353
+ echo ""
354
+ echo "💡 To open the diff image:"
355
+ echo " open $TMP_DIR/diff.png"
356
+ echo ""
@@ -1,36 +0,0 @@
1
- # Custom Agent Installation
2
-
3
- ## Quick Install
4
-
5
- ```bash
6
- # Interactive
7
- npx bmad-method agent-install
8
-
9
- # Non-interactive
10
- npx bmad-method agent-install --defaults
11
- ```
12
-
13
- ## Install Specific Agent
14
-
15
- ```bash
16
- # From specific source file
17
- npx bmad-method agent-install --source ./my-agent.agent.yaml
18
-
19
- # With default config (no prompts)
20
- npx bmad-method agent-install --source ./my-agent.agent.yaml --defaults
21
-
22
- # To specific destination
23
- npx bmad-method agent-install --source ./my-agent.agent.yaml --destination ./my-project
24
- ```
25
-
26
- ## Batch Install
27
-
28
- 1. Copy agent YAML to `{bmad folder}/custom/src/agents/` OR `custom/src/agents` at your project folder root
29
- 2. Run `npx bmad-method install` and select `Compile Agents` or `Quick Update`
30
-
31
- ## What Happens
32
-
33
- 1. Source YAML compiled to .md
34
- 2. Installed to `custom/agents/{agent-name}/`
35
- 3. Added to agent manifest
36
- 4. Backup saved to `_cfg/custom/agents/`