ma-agents 3.12.3 → 3.13.1

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 (257) hide show
  1. package/bin/cli.js +67 -13
  2. package/docs/architecture.md +18 -0
  3. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +1 -1
  4. package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +52 -2
  5. package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  6. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  8. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack +0 -0
  9. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  10. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  11. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  12. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  13. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  14. package/lib/bmad-cache/bmb/package.json +1 -1
  15. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +1 -1
  16. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +33 -0
  17. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +28 -0
  18. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +1 -1
  19. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +28 -0
  20. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +33 -0
  21. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +28 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +1 -1
  23. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +28 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +33 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +28 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +29 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +115 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +184 -0
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +171 -0
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +492 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +366 -0
  32. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +260 -0
  33. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
  34. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +28 -0
  35. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +33 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +28 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +33 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +28 -0
  39. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +74 -1
  40. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +24 -13
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +48 -33
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +287 -0
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +57 -8
  44. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +7 -7
  45. package/lib/bmad-cache/bmb/skills/module-help.csv +1 -1
  46. package/lib/bmad-cache/bmb/website/public/img/eval-test-types.png +0 -0
  47. package/lib/bmad-cache/cache-manifest.json +17 -18
  48. package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +52 -2
  49. package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  50. package/lib/bmad-cache/cis/_git_preserved/index +0 -0
  51. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.idx +0 -0
  52. package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.pack → pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.pack} +0 -0
  53. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.rev +0 -0
  54. package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
  55. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  56. package/lib/bmad-cache/cis/_git_preserved/refs/tags/v0.2.1 +1 -0
  57. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  58. package/lib/bmad-cache/cis/package-lock.json +2 -2
  59. package/lib/bmad-cache/cis/package.json +1 -1
  60. package/lib/bmad-cache/cis/src/module-help.csv +1 -1
  61. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +4 -7
  62. package/lib/bmad-cache/gds/README.md +3 -1
  63. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +52 -2
  64. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  65. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  66. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  67. package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-9427a146a90c00bb542cba038874bf9671ba4dc0.pack → pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack} +0 -0
  68. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  69. package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
  70. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  71. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  72. package/lib/bmad-cache/gds/package.json +1 -1
  73. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +5 -5
  74. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +5 -5
  75. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -5
  76. package/lib/bmad-cache/gds/src/module-help.csv +6 -12
  77. package/lib/bmad-cache/gds/src/module.yaml +1 -1
  78. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +97 -22
  79. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +190 -0
  80. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +99 -0
  81. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +290 -0
  82. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +190 -0
  83. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +84 -0
  84. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +319 -0
  85. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +101 -0
  86. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +1 -0
  87. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +88 -0
  88. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +124 -2
  89. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +62 -0
  90. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
  91. package/lib/bmad-cache/tea/.github/workflows/docs.yaml +3 -3
  92. package/lib/bmad-cache/tea/.github/workflows/quality.yaml +10 -10
  93. package/lib/bmad-cache/tea/AGENTS.md +31 -0
  94. package/lib/bmad-cache/tea/CHANGELOG.md +42 -1
  95. package/lib/bmad-cache/tea/README.md +8 -5
  96. package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +52 -2
  97. package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  98. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  99. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.idx +0 -0
  100. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-f0df537f2649464ff6c5aee241165eb9c8664227.pack → pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.pack} +0 -0
  101. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.rev +0 -0
  102. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  103. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  104. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.19.0 +1 -0
  105. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  106. package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +15 -16
  107. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +2 -0
  108. package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +1 -1
  109. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +88 -52
  110. package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +13 -12
  111. package/lib/bmad-cache/tea/docs/glossary/index.md +2 -2
  112. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +19 -18
  113. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +1 -1
  114. package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +32 -26
  115. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +20 -14
  116. package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +3 -3
  117. package/lib/bmad-cache/tea/docs/index.md +13 -11
  118. package/lib/bmad-cache/tea/docs/reference/commands.md +37 -13
  119. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +2 -2
  120. package/lib/bmad-cache/tea/package-lock.json +2 -2
  121. package/lib/bmad-cache/tea/package.json +1 -1
  122. package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +20 -15
  123. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/confidence-gate.md +73 -0
  124. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +1 -0
  125. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +2 -1
  126. package/lib/bmad-cache/tea/src/module-help.csv +2 -2
  127. package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -4
  128. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +1 -1
  129. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +1 -1
  130. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +2 -2
  131. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +1 -1
  132. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +1 -1
  133. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +1 -1
  134. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +1 -1
  135. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +1 -1
  136. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +1 -1
  137. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +3 -3
  138. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +11 -11
  139. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +4 -2
  140. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +5 -5
  141. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +1 -1
  142. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
  143. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01b-resume.md +1 -1
  144. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +14 -3
  145. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +7 -7
  146. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +4 -4
  147. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +4 -4
  148. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +4 -4
  149. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +4 -4
  150. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +4 -4
  151. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +1 -1
  152. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +1 -1
  153. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +3 -3
  154. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +23 -3
  155. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +1 -1
  156. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -0
  157. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +16 -2
  158. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +20 -4
  159. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +2 -0
  160. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +17 -0
  161. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +15 -0
  162. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +16 -0
  163. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +1 -1
  164. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +1 -1
  165. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +1 -1
  166. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +1 -1
  167. package/lib/bmad-cache/tea/test/test-installation-components.js +49 -0
  168. package/lib/bmad-cache/tea/website/astro.config.mjs +2 -2
  169. package/lib/bmad-cache/wds/README.md +1 -1
  170. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +52 -2
  171. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  172. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  173. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  174. package/lib/bmad-cache/wds/_git_preserved/objects/pack/{pack-96877c1c09123cccb1f91c1412184b11d2b492ad.pack → pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack} +0 -0
  175. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  176. package/lib/bmad-cache/wds/_git_preserved/packed-refs +1 -1
  177. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
  178. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +1 -0
  179. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
  180. package/lib/bmad-cache/wds/eslint.config.mjs +1 -1
  181. package/lib/bmad-cache/wds/package.json +1 -1
  182. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +80 -0
  183. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +52 -0
  184. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +70 -0
  185. package/lib/bmad-cache/wds/src/module-help.csv +19 -19
  186. package/lib/bmad-cache/wds/src/module.yaml +28 -0
  187. package/lib/bmad-cache/wds/src/scripts/README.md +155 -0
  188. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +202 -0
  189. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +158 -0
  190. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +229 -0
  191. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +120 -0
  192. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +201 -0
  193. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +301 -0
  194. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +450 -0
  195. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +387 -0
  196. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
  197. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
  198. package/lib/bmad.js +361 -18
  199. package/lib/installer.js +296 -26
  200. package/lib/mil498-templates/OCD.md +169 -169
  201. package/lib/mil498-templates/README.md +4 -4
  202. package/lib/mil498-templates/SDD.md +163 -163
  203. package/lib/mil498-templates/SDP.md +307 -307
  204. package/lib/mil498-templates/SRS.md +219 -219
  205. package/lib/mil498-templates/SSDD.md +154 -154
  206. package/lib/mil498-templates/SSS.md +225 -225
  207. package/lib/mil498-templates/STD.md +188 -188
  208. package/lib/profile.js +96 -5
  209. package/lib/templates/instruction-block-git.template.md +25 -0
  210. package/lib/templates/instruction-block-onprem.template.md +86 -86
  211. package/lib/templates/instruction-block-universal.template.md +29 -29
  212. package/package.json +5 -4
  213. package/scripts/build-bmad-cache.js +143 -42
  214. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
  215. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack +0 -0
  216. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
  217. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +0 -1
  218. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
  219. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
  220. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
  221. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
  222. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
  223. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
  224. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
  225. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
  226. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  227. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
  228. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
  229. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
  230. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
  231. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
  232. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
  235. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
  236. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
  237. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
  238. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
  239. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
  240. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
  241. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
  242. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
  243. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  244. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
  245. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
  246. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
  247. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
  248. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
  249. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
  250. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
  251. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
  252. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
  253. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
  254. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
  255. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
  256. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
  257. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
@@ -1,86 +1,86 @@
1
- ## On-Prem / Local-LLM Guardrails
2
-
3
- These rules apply ONLY when this project is installed with `profile: on-prem`.
4
- They are appended to the universal block by the composer in `lib/installer.js`.
5
- Local LLMs (Nemotron, Qwen, DeepSeek, Llama-3, etc. served via vLLM, Ollama, or
6
- TGI) fail in patterns cloud LLMs rarely exhibit — the rules below pin those
7
- failure modes down explicitly. Keep these rules verbatim in every response
8
- context where tool use is possible.
9
-
10
- ### Reasoning mode: `/no_think` on planning-phase prompts
11
-
12
- Local reasoning-capable models (Nemotron-variants and similar) default to
13
- chain-of-thought reasoning that bloats planning-phase prompts with internal
14
- deliberation the operator does not need to read. Prepend the literal token
15
- `/no_think` as the first line of any planning-phase system prompt or user turn
16
- you compose. The token is consumed by the serving layer and suppresses the
17
- model's reasoning trace on that turn.
18
-
19
- - Planning-phase turns (PM, Architect, Tech Lead): begin the turn with
20
- `/no_think` on its own line. Reasoning-mode OFF.
21
- - Implementation-phase turns (Dev): omit `/no_think`. Reasoning-mode ON is
22
- desirable for stepwise code synthesis and debugging.
23
- - Review / QA turns: omit `/no_think` when the review benefits from explicit
24
- reasoning (root-cause analysis). Include `/no_think` for mechanical checks
25
- (lint, style, formatting).
26
-
27
- If the downstream serving layer does not recognize `/no_think`, it is a no-op
28
- text token — safe to include unconditionally on planning turns.
29
-
30
- ### No writes to `~/.claude/` or any user home directory
31
-
32
- Local LLMs frequently hallucinate paths under `~/.claude/`, `~/.cache/`,
33
- `~/Library/`, or `%APPDATA%` — imitating patterns learned from Claude Code and
34
- Cursor training data. These paths are OUTSIDE the project and cross-contaminate
35
- other projects on the same machine.
36
-
37
- - NEVER create, write, or modify files under `~/.claude/`, `~/.cache/`,
38
- `~/Library/`, `~/AppData/`, `%APPDATA%`, or any path that resolves outside
39
- the current project directory.
40
- - All project artifacts — code, configuration, logs, scratch notes, and agent
41
- state — MUST land under the current working directory (the project root) or
42
- an explicitly-named subdirectory thereof.
43
- - When a tool call appears to target a home-directory path, refuse the write
44
- and respond in text explaining the violation. Ask the user for an explicit
45
- in-project path before proceeding.
46
-
47
- ### No `str_replace_editor` or Claude Code-specific tools
48
-
49
- Local LLMs hallucinate Anthropic-proprietary tools — most commonly
50
- `str_replace_editor`, `text_editor_20241022`, and `computer_use_preview` — that
51
- do NOT exist outside the Anthropic API. Calling them against a local-LLM
52
- serving layer produces a tool-not-found error or, worse, a silent no-op.
53
-
54
- - Do NOT emit tool calls named `str_replace_editor`, `text_editor_*`,
55
- `computer_use_*`, or any other tool whose name includes `str_replace_editor`
56
- or matches Anthropic-specific tool schemas.
57
- - Use only tools enumerated in the active tool manifest (`MANIFEST.yaml`) or
58
- the IDE's native tool surface (Roo Code, Cline, OpenCode native tools).
59
- - When you want to edit a file, use the native file-write tool of the active
60
- agent — not `str_replace_editor`. If unsure what tool is available, list
61
- available tools or ask the user before emitting a tool call.
62
-
63
- ### Per-phase reasoning and sampling guidance
64
-
65
- Local LLMs require tighter sampling control than cloud LLMs. Use these defaults
66
- unless the serving layer overrides them.
67
-
68
- - **Planning phase (PM, Architect, Tech Lead):**
69
- - Reasoning: OFF (`/no_think` prepended).
70
- - Temperature: low (0.0 – 0.3). Planning artifacts should be deterministic
71
- and reproducible.
72
- - Top-p: 0.9 or unset. Top-k: unset.
73
- - Max tokens: generous (8k+) — planning documents are long.
74
- - **Implementation phase (Dev):**
75
- - Reasoning: ON (omit `/no_think`).
76
- - Temperature: moderate (0.3 – 0.6). Code synthesis benefits from controlled
77
- exploration but not creative rewriting.
78
- - Top-p: 0.95 or unset. Top-k: unset.
79
- - Max tokens: generous (8k+) — full-file rewrites are common.
80
- - **Review / QA phase:**
81
- - Reasoning: ON for root-cause analysis; OFF for mechanical checks.
82
- - Temperature: low (0.0 – 0.2). Reviews should be deterministic.
83
-
84
- If the serving layer applies its own sampler defaults, the per-phase guidance
85
- above is advisory — but the phase boundary and `/no_think` placement are
86
- load-bearing and MUST be honored on every turn.
1
+ ## On-Prem / Local-LLM Guardrails
2
+
3
+ These rules apply ONLY when this project is installed with `profile: on-prem`.
4
+ They are appended to the universal block by the composer in `lib/installer.js`.
5
+ Local LLMs (Nemotron, Qwen, DeepSeek, Llama-3, etc. served via vLLM, Ollama, or
6
+ TGI) fail in patterns cloud LLMs rarely exhibit — the rules below pin those
7
+ failure modes down explicitly. Keep these rules verbatim in every response
8
+ context where tool use is possible.
9
+
10
+ ### Reasoning mode: `/no_think` on planning-phase prompts
11
+
12
+ Local reasoning-capable models (Nemotron-variants and similar) default to
13
+ chain-of-thought reasoning that bloats planning-phase prompts with internal
14
+ deliberation the operator does not need to read. Prepend the literal token
15
+ `/no_think` as the first line of any planning-phase system prompt or user turn
16
+ you compose. The token is consumed by the serving layer and suppresses the
17
+ model's reasoning trace on that turn.
18
+
19
+ - Planning-phase turns (PM, Architect, Tech Lead): begin the turn with
20
+ `/no_think` on its own line. Reasoning-mode OFF.
21
+ - Implementation-phase turns (Dev): omit `/no_think`. Reasoning-mode ON is
22
+ desirable for stepwise code synthesis and debugging.
23
+ - Review / QA turns: omit `/no_think` when the review benefits from explicit
24
+ reasoning (root-cause analysis). Include `/no_think` for mechanical checks
25
+ (lint, style, formatting).
26
+
27
+ If the downstream serving layer does not recognize `/no_think`, it is a no-op
28
+ text token — safe to include unconditionally on planning turns.
29
+
30
+ ### No writes to `~/.claude/` or any user home directory
31
+
32
+ Local LLMs frequently hallucinate paths under `~/.claude/`, `~/.cache/`,
33
+ `~/Library/`, or `%APPDATA%` — imitating patterns learned from Claude Code and
34
+ Cursor training data. These paths are OUTSIDE the project and cross-contaminate
35
+ other projects on the same machine.
36
+
37
+ - NEVER create, write, or modify files under `~/.claude/`, `~/.cache/`,
38
+ `~/Library/`, `~/AppData/`, `%APPDATA%`, or any path that resolves outside
39
+ the current project directory.
40
+ - All project artifacts — code, configuration, logs, scratch notes, and agent
41
+ state — MUST land under the current working directory (the project root) or
42
+ an explicitly-named subdirectory thereof.
43
+ - When a tool call appears to target a home-directory path, refuse the write
44
+ and respond in text explaining the violation. Ask the user for an explicit
45
+ in-project path before proceeding.
46
+
47
+ ### No `str_replace_editor` or Claude Code-specific tools
48
+
49
+ Local LLMs hallucinate Anthropic-proprietary tools — most commonly
50
+ `str_replace_editor`, `text_editor_20241022`, and `computer_use_preview` — that
51
+ do NOT exist outside the Anthropic API. Calling them against a local-LLM
52
+ serving layer produces a tool-not-found error or, worse, a silent no-op.
53
+
54
+ - Do NOT emit tool calls named `str_replace_editor`, `text_editor_*`,
55
+ `computer_use_*`, or any other tool whose name includes `str_replace_editor`
56
+ or matches Anthropic-specific tool schemas.
57
+ - Use only tools enumerated in the active tool manifest (`MANIFEST.yaml`) or
58
+ the IDE's native tool surface (Roo Code, Cline, OpenCode native tools).
59
+ - When you want to edit a file, use the native file-write tool of the active
60
+ agent — not `str_replace_editor`. If unsure what tool is available, list
61
+ available tools or ask the user before emitting a tool call.
62
+
63
+ ### Per-phase reasoning and sampling guidance
64
+
65
+ Local LLMs require tighter sampling control than cloud LLMs. Use these defaults
66
+ unless the serving layer overrides them.
67
+
68
+ - **Planning phase (PM, Architect, Tech Lead):**
69
+ - Reasoning: OFF (`/no_think` prepended).
70
+ - Temperature: low (0.0 – 0.3). Planning artifacts should be deterministic
71
+ and reproducible.
72
+ - Top-p: 0.9 or unset. Top-k: unset.
73
+ - Max tokens: generous (8k+) — planning documents are long.
74
+ - **Implementation phase (Dev):**
75
+ - Reasoning: ON (omit `/no_think`).
76
+ - Temperature: moderate (0.3 – 0.6). Code synthesis benefits from controlled
77
+ exploration but not creative rewriting.
78
+ - Top-p: 0.95 or unset. Top-k: unset.
79
+ - Max tokens: generous (8k+) — full-file rewrites are common.
80
+ - **Review / QA phase:**
81
+ - Reasoning: ON for root-cause analysis; OFF for mechanical checks.
82
+ - Temperature: low (0.0 – 0.2). Reviews should be deterministic.
83
+
84
+ If the serving layer applies its own sampler defaults, the per-phase guidance
85
+ above is advisory — but the phase boundary and `/no_think` placement are
86
+ load-bearing and MUST be honored on every turn.
@@ -1,29 +1,29 @@
1
- # AI Agent Skills - Planning Instruction
2
-
3
- You have access to a library of skills in your skills directory. Before starting any task:
4
-
5
- 1. Read the skill manifest at {{MANIFEST_PATH}}
6
- 2. Based on the task description, select which skills are relevant
7
- 3. Read only the selected skill files
8
- 4. Then proceed with the task
9
-
10
- Always load skills marked with always_load: true.
11
- Do not load skills that are not relevant to the current task.
12
-
13
- ## Respond in TEXT vs. create FILES
14
-
15
- Choose your response medium deliberately. Defaulting to file creation when the user asked a question is a common failure mode — especially for coding agents running in web UIs.
16
-
17
- - **Create or modify FILES when the user's request contains file-action keywords:** `create`, `write`, `generate`, `build`, `implement` (and obvious synonyms such as `add`, `produce`, `refactor`, `fix`, `update <file>`). These signal a concrete artifact is expected.
18
- - **Respond in TEXT when the request contains text-response keywords:** `what do you think`, `how should we`, `discuss`, `opinion` (and obvious synonyms such as `explain`, `why`, `should I`, `compare`, `recommend`). These signal that a conversation is expected, not a deliverable.
19
- - **If unsure, respond in TEXT.** A text answer can always be followed by file creation on confirmation; an unwanted file cannot be cleanly undone.
20
- - **Never create `response.md`, `output.md`, or any similarly named scratch file as a reply.** A reply belongs in the chat transcript, not on disk.
21
- - **Confirm file paths before writing.** When you are about to create or modify a file whose path the user has not explicitly named, state the intended path in text and wait for confirmation, unless the path is unambiguous from the task context.
22
-
23
- ## BMAD phase discipline
24
-
25
- BMAD-METHOD organizes work into declared phases (analysis, planning, architecture, story-creation, implementation, review). Respect the currently declared phase.
26
-
27
- - **Do not skip ahead to implementation during planning.** If the project is in a planning phase — or the user has asked for requirements, architecture, or a story — produce planning artifacts, not code.
28
- - **Do not retroactively plan after you have already coded.** If implementation has already started, flag the gap instead of fabricating back-dated planning documents.
29
- - The declared phase is established by the active skill, the story status, or an explicit statement from the user. When none of these is available, ask before assuming.
1
+ # AI Agent Skills - Planning Instruction
2
+
3
+ You have access to a library of skills in your skills directory. Before starting any task:
4
+
5
+ 1. Read the skill manifest at {{MANIFEST_PATH}}
6
+ 2. Based on the task description, select which skills are relevant
7
+ 3. Read only the selected skill files
8
+ 4. Then proceed with the task
9
+
10
+ Always load skills marked with always_load: true.
11
+ Do not load skills that are not relevant to the current task.
12
+
13
+ ## Respond in TEXT vs. create FILES
14
+
15
+ Choose your response medium deliberately. Defaulting to file creation when the user asked a question is a common failure mode — especially for coding agents running in web UIs.
16
+
17
+ - **Create or modify FILES when the user's request contains file-action keywords:** `create`, `write`, `generate`, `build`, `implement` (and obvious synonyms such as `add`, `produce`, `refactor`, `fix`, `update <file>`). These signal a concrete artifact is expected.
18
+ - **Respond in TEXT when the request contains text-response keywords:** `what do you think`, `how should we`, `discuss`, `opinion` (and obvious synonyms such as `explain`, `why`, `should I`, `compare`, `recommend`). These signal that a conversation is expected, not a deliverable.
19
+ - **If unsure, respond in TEXT.** A text answer can always be followed by file creation on confirmation; an unwanted file cannot be cleanly undone.
20
+ - **Never create `response.md`, `output.md`, or any similarly named scratch file as a reply.** A reply belongs in the chat transcript, not on disk.
21
+ - **Confirm file paths before writing.** When you are about to create or modify a file whose path the user has not explicitly named, state the intended path in text and wait for confirmation, unless the path is unambiguous from the task context.
22
+
23
+ ## BMAD phase discipline
24
+
25
+ BMAD-METHOD organizes work into declared phases (analysis, planning, architecture, story-creation, implementation, review). Respect the currently declared phase.
26
+
27
+ - **Do not skip ahead to implementation during planning.** If the project is in a planning phase — or the user has asked for requirements, architecture, or a story — produce planning artifacts, not code.
28
+ - **Do not retroactively plan after you have already coded.** If implementation has already started, flag the gap instead of fabricating back-dated planning documents.
29
+ - The declared phase is established by the active skill, the story status, or an explicit statement from the user. When none of these is available, ask before assuming.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ma-agents",
3
- "version": "3.12.3",
3
+ "version": "3.13.1",
4
4
  "description": "NPX tool to install skills for AI coding agents (Claude Code, Gemini, Copilot, Kilocode, Cline, Cursor, Roo Code)",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -8,10 +8,11 @@
8
8
  },
9
9
  "scripts": {
10
10
  "start": "node bin/cli.js",
11
- "test": "node test/yes-flag.test.js && node test/skill-authoring.test.js && node test/skill-validation.test.js && node test/skill-mandatory.test.js && node test/skill-customize-agent.test.js && node test/create-agent.test.js && node test/generate-project-context.test.js && node test/build-bmad-args.test.js && node test/bmad-version-bump.test.js && node test/extension-module-restructure.test.js && node test/convert-agents-to-skills.test.js && node test/migration.test.js && node test/migration-validation.test.js && node test/story-15-5-workflow-skills.test.js && node test/repo-layout.test.js && node test/config-storage.test.js && node test/cross-repo-validation.test.js && node test/config-lost-on-update.test.js && node test/portable-paths.test.js && node test/cicd-remote-mode.test.js && node test/config-layout.test.js && node test/roo-code-agent.test.js && node test/roo-code-injection.test.js && node test/profile.test.js && node test/instruction-block.test.js && node test/instruction-injection.test.js && node test/agents-md.test.js && node test/onprem-injection.test.js && node test/onprem-layer.test.js && node test/roomodes.test.js && node test/clinerules.test.js && node test/reconfigure.test.js && node test/experimental-warning.test.js && node test/bmad-persona-phase-prefix.test.js && node test/f1a-on-prem-prefix-post-install.test.js && node test/retired-skills-migration.test.js && node test/rename-migration.test.js && node test/uninstall.test.js && node test/offline-recompile.test.js && node test/plugin-manifests.test.js && node test/build-plugin.test.js && node test/config-path-migration.test.js && node test/gitignore-plugin-stage.test.js && node test/customizations-translation.test.js && node test/routing-parity.test.js && node test/bmad-extension.test.js && node test/integration-verification.test.js && node test/agent-scope.test.js && node test/obsolete-tool-dirs.test.js && node test/bmad-empty-tools-guard.test.js",
11
+ "test": "node test/yes-flag.test.js && node test/skill-authoring.test.js && node test/skill-validation.test.js && node test/skill-mandatory.test.js && node test/skill-customize-agent.test.js && node test/create-agent.test.js && node test/generate-project-context.test.js && node test/build-bmad-args.test.js && node test/build-bmad-cache-reader.test.js && node test/bmad-version-bump.test.js && node test/extension-module-restructure.test.js && node test/convert-agents-to-skills.test.js && node test/migration.test.js && node test/migration-validation.test.js && node test/story-15-5-workflow-skills.test.js && node test/repo-layout.test.js && node test/config-storage.test.js && node test/cross-repo-validation.test.js && node test/config-lost-on-update.test.js && node test/portable-paths.test.js && node test/cicd-remote-mode.test.js && node test/config-layout.test.js && node test/roo-code-agent.test.js && node test/roo-code-injection.test.js && node test/profile.test.js && node test/instruction-block.test.js && node test/instruction-injection.test.js && node test/agents-md.test.js && node test/instruction-block-git.test.js && node test/onprem-injection.test.js && node test/onprem-layer.test.js && node test/roomodes.test.js && node test/clinerules.test.js && node test/cline-workflow-reconciliation.test.js && node test/reconfigure.test.js && node test/experimental-warning.test.js && node test/bmad-persona-phase-prefix.test.js && node test/f1a-on-prem-prefix-post-install.test.js && node test/retired-skills-migration.test.js && node test/rename-migration.test.js && node test/uninstall.test.js && node test/offline-recompile.test.js && node test/plugin-manifests.test.js && node test/build-plugin.test.js && node test/config-path-migration.test.js && node test/gitignore-plugin-stage.test.js && node test/customizations-translation.test.js && node test/routing-parity.test.js && node test/bmad-extension.test.js && node test/integration-verification.test.js && node test/agent-scope.test.js && node test/obsolete-tool-dirs.test.js && node test/bmad-empty-tools-guard.test.js && node test/v68-pluginresolver-enumeration-passthrough.test.js",
12
12
  "build:bmad-cache": "node scripts/build-bmad-cache.js",
13
13
  "build:plugin": "node scripts/build-plugin.js",
14
- "prepare": "node scripts/build-plugin.js"
14
+ "prepare": "node scripts/build-plugin.js",
15
+ "version": "node scripts/build-plugin.js && git add lib/bmad-extension-plugin"
15
16
  },
16
17
  "keywords": [
17
18
  "ai",
@@ -29,7 +30,7 @@
29
30
  "author": "",
30
31
  "license": "MIT",
31
32
  "dependencies": {
32
- "bmad-method": "6.6.0",
33
+ "bmad-method": "6.8.0",
33
34
  "chalk": "^4.1.2",
34
35
  "fs-extra": "^11.1.1",
35
36
  "js-yaml": "^4.1.1",
@@ -9,22 +9,56 @@ const CACHE_DIR = path.join(__dirname, '..', 'lib', 'bmad-cache');
9
9
  const MANIFEST_PATH = path.join(CACHE_DIR, 'cache-manifest.json');
10
10
  const force = process.argv.includes('--force');
11
11
 
12
- // bmad-method 6.3.0 replaced `tools/cli/external-official-modules.yaml` with
13
- // `tools/installer/modules/registry-fallback.yaml` (the bundled fallback that
14
- // mirrors the upstream marketplace `registry/official.yaml`). We read the
15
- // fallback because (a) it is deterministic across offline builds and (b) it
16
- // matches what bmad-method itself loads when the network registry is
17
- // unreachable. The new schema uses map keys with properties — crucially, it
18
- // no longer carries a `branch` field, and non-external `built_in: true`
19
- // modules (like `core` and `bmm`) are shipped inside bmad-method itself and
20
- // must not be cached as separate git clones.
12
+ // The bundled module registry has stayed YAML throughout bmad-method's
13
+ // history, but its PATH has moved across versions (see Decision P5-5 in
14
+ // architecture.md):
15
+ //
16
+ // ≤6.2.x tools/cli/external-official-modules.yaml
17
+ // 6.3.0 tools/installer/modules/registry-fallback.yaml (retired in 6.7.0)
18
+ // 6.8.0 bmad-modules.yaml (package root)
19
+ //
20
+ // We read the bundled registry because (a) it is deterministic across offline
21
+ // builds and (b) it matches what bmad-method itself loads when the network
22
+ // registry is unreachable. The 6.8.0 file is a `modules:` map whose entries
23
+ // carry `code`/`url`/`name`/`type` — the same shape the parser already reads.
24
+ // Crucially the new schema carries no `branch` field (default to `main`) and
25
+ // it expresses the bundle decision via a `type` field rather than the old
26
+ // `built_in` flag: `type: bmad-org` modules (tea, bmb, cis, gds, wds) are
27
+ // cloned; `type: experimental` (automator) is excluded; `bmm`/`core` are
28
+ // built into the npm package itself and are absent from the registry entirely.
29
+ //
30
+ // Candidates are tried in order; the first that exists on disk wins. The
31
+ // package-root path is listed first because it is the live 6.8.0+ location.
32
+ //
33
+ // The two older paths are retained only as diagnostics: they carry the
34
+ // pre-6.8.0 `built_in` schema, which the `type: bmad-org` filter below does
35
+ // NOT understand, so they resolve zero bundled modules. If one of them is the
36
+ // only file present (i.e. someone downgraded bmad-method below 6.8.0), the
37
+ // thin-cache guard in main() aborts with an actionable message rather than
38
+ // silently shipping an empty cache. They are kept so `locateRegistry` reports
39
+ // "found <old path>" instead of a bare "nothing found", which points the
40
+ // maintainer at the version mismatch.
21
41
  const REGISTRY_CANDIDATES = [
22
- // v6.3.0+
23
- ['tools', 'installer', 'modules', 'registry-fallback.yaml'],
24
- // legacy v6.2.x fallback (kept so a partial downgrade doesn't explode)
25
- ['tools', 'cli', 'external-official-modules.yaml'],
42
+ // v6.8.0+ — relocated to the package root (the supported, filterable schema)
43
+ { parts: ['bmad-modules.yaml'], schema: 'package-root-v68' },
44
+ // v6.3.0–6.6.x bundled fallback (diagnostic only pre-`type` schema)
45
+ { parts: ['tools', 'installer', 'modules', 'registry-fallback.yaml'], schema: 'registry-fallback' },
46
+ // legacy v6.2.x fallback (diagnostic only — pre-`type` schema)
47
+ { parts: ['tools', 'cli', 'external-official-modules.yaml'], schema: 'legacy' },
26
48
  ];
27
49
 
50
+ // The set of modules ma-agents bundles for offline installs. At v6.8.0 these
51
+ // are exactly the `type: bmad-org` registry entries. The fail-loud guard
52
+ // (NFR56) treats a resolved set SMALLER than this as a thin-cache failure —
53
+ // the registry path has moved twice, so silent degradation is a recurring
54
+ // risk that must abort the build rather than ship an incomplete cache.
55
+ const KNOWN_BUNDLED_MODULES = ['tea', 'bmb', 'cis', 'gds', 'wds'];
56
+
57
+ // Registry `type` values that mark a module for bundling. `bmad-org` modules
58
+ // are first-party expansions ma-agents clones; `experimental` (e.g. automator)
59
+ // is deliberately excluded from the offline bundle.
60
+ const BUNDLED_MODULE_TYPE = 'bmad-org';
61
+
28
62
  /**
29
63
  * Locate the bmad-method package on disk. Abort cleanly if missing so the
30
64
  * caller gets an actionable "run npm install" message instead of a MODULE_NOT_FOUND
@@ -41,36 +75,54 @@ function locateBmadMethodDir() {
41
75
 
42
76
  /**
43
77
  * Locate the first registry YAML that exists on disk.
44
- * Returns { yamlPath, schema } where schema is 'v63' (new map format) or
45
- * 'legacy' (the pre-6.3 top-level map with `url`/`branch` fields).
78
+ *
79
+ * @param {string} bmadMethodDir Absolute path to the bmad-method package dir.
80
+ * @returns {{ yamlPath: string, schema: string }} The resolved registry path
81
+ * and its schema tag (`package-root-v68` for the relocated 6.8.0 YAML,
82
+ * `registry-fallback` for 6.3.0–6.6.x, or `legacy` for ≤6.2.x).
83
+ *
84
+ * Resolution is fail-loud: if no candidate exists, prints an actionable error
85
+ * and exits non-zero (NFR56) rather than returning a falsy result that a
86
+ * caller might silently treat as "zero modules".
46
87
  */
47
88
  function locateRegistry(bmadMethodDir) {
48
- for (let i = 0; i < REGISTRY_CANDIDATES.length; i++) {
49
- const parts = REGISTRY_CANDIDATES[i];
50
- const candidate = path.join(bmadMethodDir, ...parts);
51
- if (fs.existsSync(candidate)) {
52
- return { yamlPath: candidate, schema: i === 0 ? 'v63' : 'legacy' };
89
+ for (const candidate of REGISTRY_CANDIDATES) {
90
+ const candidatePath = path.join(bmadMethodDir, ...candidate.parts);
91
+ if (fs.existsSync(candidatePath)) {
92
+ return { yamlPath: candidatePath, schema: candidate.schema };
53
93
  }
54
94
  }
55
95
  console.error('Error: no module registry YAML found in bmad-method.');
56
- console.error(` Searched: ${REGISTRY_CANDIDATES.map(p => p.join('/')).join(', ')}`);
96
+ console.error(` Searched: ${REGISTRY_CANDIDATES.map(c => c.parts.join('/')).join(', ')}`);
97
+ console.error(' Expected the relocated package-root "bmad-modules.yaml" at bmad-method >= 6.8.0.');
57
98
  process.exit(1);
58
99
  }
59
100
 
60
101
  /**
61
102
  * Parse the bundled module registry YAML.
62
103
  *
63
- * Both the v6.3.0 (`registry-fallback.yaml`) and legacy
64
- * (`external-official-modules.yaml`) schemas use the same shape:
104
+ * Every registry version (legacy `external-official-modules.yaml`, the
105
+ * `registry-fallback.yaml`, and the relocated package-root `bmad-modules.yaml`
106
+ * at 6.8.0) uses the same `modules:` map shape, so a single parser serves all:
65
107
  *
66
108
  * modules:
67
109
  * <module-key>:
68
110
  * url: "..."
69
111
  * code: "..."
70
112
  * name: "..."
71
- * [branch: "..."] # legacy only
72
- * [built_in: true] # v6.3.0 only filter these out
73
- * [module-definition: "..."] # v6.3.0 only informational
113
+ * type: "..." # v6.8.0 — drives the bundle filter
114
+ * [branch: "..."] # legacy only (absent at 6.8.0 → main)
115
+ * [built_in: true] # 6.3.0–6.6.x only (superseded by `type`)
116
+ * [module-definition: "..."] # informational, ignored
117
+ *
118
+ * The parser already captures arbitrary scalar properties (including `type`),
119
+ * so the 6.8.0 relocation needed no parser change — only the docblock and the
120
+ * downstream filter were updated.
121
+ *
122
+ * @param {string} content Raw UTF-8 YAML text.
123
+ * @returns {Array<Object>} One object per module entry; keys mirror the YAML
124
+ * property names plus a synthetic `key` (the map key). No filtering is done
125
+ * here — that is normalizeModules()'s job.
74
126
  *
75
127
  * We keep a minimal line-by-line parser (no js-yaml dep) since the file is
76
128
  * flat and well-formed.
@@ -128,19 +180,20 @@ function parseModulesYaml(content) {
128
180
  * { code, url, name, branch }
129
181
  *
130
182
  * - Requires both `code` and `url`.
131
- * - Drops entries flagged `built_in: true` / `built_in: "true"` those are
132
- * first-party bmad-method modules (e.g. `core`, `bmm`) that live inside the
133
- * npm package itself and must not be cached as external git clones. The
134
- * test `'built_in' filter` under "Task 2" in bmad-version-bump.test.js pins
135
- * this invariant.
136
- * - Defaults `branch` to `main` when absent (v6.3.0 schema omits it).
183
+ * - Keeps ONLY `type: bmad-org` modules (tea, bmb, cis, gds, wds) and drops
184
+ * everything else. This replaces the pre-6.8.0 `built_in` exclusion: the
185
+ * relocated registry no longer carries a `built_in` flag and instead tags
186
+ * each module with a `type`. `type: experimental` (e.g. `automator`) is
187
+ * excluded from the offline bundle; `bmm`/`core` are first-party modules
188
+ * that ship inside the npm package and are absent from the registry, so they
189
+ * are dropped here too (no `bmad-org` type → filtered out). There is NO
190
+ * `wds`-retired/skip path — `wds` is an active `bmad-org` clone at 6.8.0.
191
+ * - Defaults `branch` to `main` when absent (the 6.8.0 schema omits it).
137
192
  * - Passes the URL through verbatim (git accepts both `repo` and `repo.git`).
193
+ *
194
+ * @param {Array<Object>} raw Entries from parseModulesYaml().
195
+ * @returns {Array<{code: string, url: string, name: string, branch: string}>}
138
196
  */
139
- // Values that YAML may use to express a truthy boolean. bmad-method uses
140
- // canonical `true`, but be generous so a future registry that emits `yes`/
141
- // `on`/`1` cannot accidentally cache a built-in module as an external clone.
142
- const TRUTHY_STRINGS = new Set(['true', 'yes', 'on', '1', 'y']);
143
-
144
197
  // Module `code` values are used as directory names under lib/bmad-cache.
145
198
  // Reject anything that could escape the cache dir or inject shell characters;
146
199
  // registry data is trusted today, but this is cheap defense-in-depth.
@@ -150,8 +203,10 @@ function normalizeModules(raw) {
150
203
  return raw
151
204
  .filter(m => m.code && m.url)
152
205
  .filter(m => {
153
- const builtIn = String(m.built_in || '').toLowerCase();
154
- return !TRUTHY_STRINGS.has(builtIn);
206
+ // Bundle only `type: bmad-org`. Compare case-insensitively and trim so
207
+ // minor upstream whitespace/casing drift cannot silently drop a module.
208
+ const type = String(m.type || '').trim().toLowerCase();
209
+ return type === BUNDLED_MODULE_TYPE;
155
210
  })
156
211
  .filter(m => {
157
212
  if (MODULE_CODE_PATTERN.test(m.code)) return true;
@@ -315,8 +370,40 @@ function main() {
315
370
  console.log('='.repeat(40));
316
371
 
317
372
  const { modules, schema } = loadModuleDefinitions();
318
- if (modules.length === 0) {
319
- console.error('Error: No modules found in registry YAML');
373
+
374
+ // Thin-cache fail-loud guard (NFR56). The registry path has moved twice;
375
+ // the real risk is no longer "zero modules" but the path moving again and
376
+ // the reader silently resolving FEWER than the known bundled set. Treat a
377
+ // deficient set as a hard error and abort BEFORE writing any manifest — a
378
+ // partial/empty cache-manifest.json would otherwise ship a broken offline
379
+ // bundle that "looks" successful.
380
+ const resolvedCodes = new Set(modules.map(m => m.code));
381
+
382
+ // Duplicate-code guard. Two registry entries sharing a `code` would clone
383
+ // into the same cache directory and silently overwrite each other's manifest
384
+ // entry (last-write-wins), and the Set above would mask the collision from
385
+ // the thin-cache check below. Fail loud instead.
386
+ if (modules.length !== resolvedCodes.size) {
387
+ const seen = new Set();
388
+ const dupes = new Set();
389
+ for (const m of modules) {
390
+ if (seen.has(m.code)) dupes.add(m.code);
391
+ seen.add(m.code);
392
+ }
393
+ console.error('Error: registry contains duplicate module codes — refusing to build an ambiguous cache.');
394
+ console.error(` Duplicated: ${[...dupes].join(', ')}`);
395
+ process.exit(1);
396
+ }
397
+
398
+ const missing = KNOWN_BUNDLED_MODULES.filter(code => !resolvedCodes.has(code));
399
+ if (missing.length > 0) {
400
+ console.error('Error: registry resolved a thin module set — refusing to build a partial cache.');
401
+ console.error(` Expected at least: ${KNOWN_BUNDLED_MODULES.join(', ')}`);
402
+ console.error(` Resolved (type: ${BUNDLED_MODULE_TYPE}): ${[...resolvedCodes].join(', ') || '(none)'}`);
403
+ console.error(` Missing: ${missing.join(', ')}`);
404
+ console.error(' Likely cause: bmad-method was downgraded below 6.8.0, the registry layout moved');
405
+ console.error(' again, or a bundled module was renamed/retired upstream. Update REGISTRY_CANDIDATES,');
406
+ console.error(' the type filter, or KNOWN_BUNDLED_MODULES in scripts/build-bmad-cache.js to match.');
320
407
  process.exit(1);
321
408
  }
322
409
  console.log(`Found ${modules.length} modules: ${modules.map(m => m.code).join(', ')}`);
@@ -491,4 +578,18 @@ function main() {
491
578
  }
492
579
  }
493
580
 
494
- main();
581
+ // Run the build only when executed directly (`node scripts/build-bmad-cache.js`).
582
+ // When required as a module (by unit tests), export the pure reader functions
583
+ // instead so they can be exercised against fixtures without cloning anything.
584
+ if (require.main === module) {
585
+ main();
586
+ } else {
587
+ module.exports = {
588
+ parseModulesYaml,
589
+ normalizeModules,
590
+ locateRegistry,
591
+ KNOWN_BUNDLED_MODULES,
592
+ BUNDLED_MODULE_TYPE,
593
+ REGISTRY_CANDIDATES,
594
+ };
595
+ }
@@ -1 +0,0 @@
1
- ref: refs/remotes/origin/main
@@ -1 +0,0 @@
1
- 6c66cf215b5ec6701d70cf2d9df968fa09433cfe