ma-agents 3.12.2 → 3.13.0

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 (255) hide show
  1. package/bin/cli.js +11 -6
  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 +91 -7
  199. package/lib/installer.js +28 -6
  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/templates/instruction-block-git.template.md +25 -0
  209. package/package.json +5 -4
  210. package/scripts/build-bmad-cache.js +143 -42
  211. package/skills/git-workflow-skill/skill.json +21 -21
  212. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
  213. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack +0 -0
  214. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
  215. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +0 -1
  216. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
  217. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
  218. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
  219. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
  220. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
  221. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
  222. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
  223. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
  224. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  225. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
  226. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
  227. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
  228. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
  229. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
  230. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
  231. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
  232. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
  235. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
  236. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
  237. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
  238. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
  239. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
  240. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
  241. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  242. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
  243. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
  244. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
  245. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
  246. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
  247. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
  248. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
  249. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
  250. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
  251. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
  252. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
  253. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
  254. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
  255. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
@@ -339,9 +339,42 @@ def write_config(config: dict, config_path: str, verbose: bool = False) -> None:
339
339
  )
340
340
 
341
341
 
342
+ def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
343
+ """Exit with a clear error if any path argument still contains the literal
344
+ ``{project-root}`` token. That token is meaningful only inside config
345
+ values; filesystem path arguments must be resolved by the caller. Failing
346
+ loudly here prevents silently creating a junk ``{project-root}/`` directory.
347
+ """
348
+ for name, value in named_paths:
349
+ if value and "{project-root}" in value:
350
+ print(
351
+ json.dumps(
352
+ {
353
+ "status": "error",
354
+ "error": (
355
+ f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
356
+ "Resolve '{project-root}' to the actual project root before running "
357
+ "this script — it is a filesystem path, not a config value."
358
+ ),
359
+ },
360
+ indent=2,
361
+ ),
362
+ file=sys.stderr,
363
+ )
364
+ sys.exit(1)
365
+
366
+
342
367
  def main():
343
368
  args = parse_args()
344
369
 
370
+ reject_unresolved_paths(
371
+ [
372
+ ("--config-path", args.config_path),
373
+ ("--user-config-path", args.user_config_path),
374
+ ("--legacy-dir", args.legacy_dir),
375
+ ]
376
+ )
377
+
345
378
  # Load inputs
346
379
  module_yaml = load_yaml_file(args.module_yaml)
347
380
  if not module_yaml:
@@ -139,9 +139,37 @@ def cleanup_legacy_csvs(
139
139
  return deleted
140
140
 
141
141
 
142
+ def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
143
+ """Exit with a clear error if any path argument still contains the literal
144
+ ``{project-root}`` token. That token is meaningful only inside config
145
+ values; filesystem path arguments must be resolved by the caller. Failing
146
+ loudly here prevents silently creating a junk ``{project-root}/`` directory.
147
+ """
148
+ for name, value in named_paths:
149
+ if value and "{project-root}" in value:
150
+ print(
151
+ json.dumps(
152
+ {
153
+ "status": "error",
154
+ "error": (
155
+ f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
156
+ "Resolve '{project-root}' to the actual project root before running "
157
+ "this script — it is a filesystem path, not a config value."
158
+ ),
159
+ },
160
+ indent=2,
161
+ )
162
+ )
163
+ sys.exit(1)
164
+
165
+
142
166
  def main():
143
167
  args = parse_args()
144
168
 
169
+ reject_unresolved_paths(
170
+ [("--target", args.target), ("--legacy-dir", args.legacy_dir)]
171
+ )
172
+
145
173
  # Read source entries
146
174
  source_header, source_rows = read_csv_rows(args.source)
147
175
  if not source_rows:
@@ -339,9 +339,42 @@ def write_config(config: dict, config_path: str, verbose: bool = False) -> None:
339
339
  )
340
340
 
341
341
 
342
+ def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
343
+ """Exit with a clear error if any path argument still contains the literal
344
+ ``{project-root}`` token. That token is meaningful only inside config
345
+ values; filesystem path arguments must be resolved by the caller. Failing
346
+ loudly here prevents silently creating a junk ``{project-root}/`` directory.
347
+ """
348
+ for name, value in named_paths:
349
+ if value and "{project-root}" in value:
350
+ print(
351
+ json.dumps(
352
+ {
353
+ "status": "error",
354
+ "error": (
355
+ f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
356
+ "Resolve '{project-root}' to the actual project root before running "
357
+ "this script — it is a filesystem path, not a config value."
358
+ ),
359
+ },
360
+ indent=2,
361
+ ),
362
+ file=sys.stderr,
363
+ )
364
+ sys.exit(1)
365
+
366
+
342
367
  def main():
343
368
  args = parse_args()
344
369
 
370
+ reject_unresolved_paths(
371
+ [
372
+ ("--config-path", args.config_path),
373
+ ("--user-config-path", args.user_config_path),
374
+ ("--legacy-dir", args.legacy_dir),
375
+ ]
376
+ )
377
+
345
378
  # Load inputs
346
379
  module_yaml = load_yaml_file(args.module_yaml)
347
380
  if not module_yaml:
@@ -139,9 +139,37 @@ def cleanup_legacy_csvs(
139
139
  return deleted
140
140
 
141
141
 
142
+ def reject_unresolved_paths(named_paths: list[tuple[str, str]]) -> None:
143
+ """Exit with a clear error if any path argument still contains the literal
144
+ ``{project-root}`` token. That token is meaningful only inside config
145
+ values; filesystem path arguments must be resolved by the caller. Failing
146
+ loudly here prevents silently creating a junk ``{project-root}/`` directory.
147
+ """
148
+ for name, value in named_paths:
149
+ if value and "{project-root}" in value:
150
+ print(
151
+ json.dumps(
152
+ {
153
+ "status": "error",
154
+ "error": (
155
+ f"Unresolved '{{project-root}}' token in {name} path: {value!r}. "
156
+ "Resolve '{project-root}' to the actual project root before running "
157
+ "this script — it is a filesystem path, not a config value."
158
+ ),
159
+ },
160
+ indent=2,
161
+ )
162
+ )
163
+ sys.exit(1)
164
+
165
+
142
166
  def main():
143
167
  args = parse_args()
144
168
 
169
+ reject_unresolved_paths(
170
+ [("--target", args.target), ("--legacy-dir", args.legacy_dir)]
171
+ )
172
+
145
173
  # Read source entries
146
174
  source_header, source_rows = read_csv_rows(args.source)
147
175
  if not source_rows:
@@ -12,7 +12,8 @@ from pathlib import Path
12
12
 
13
13
  SCRIPT = Path(__file__).resolve().parent.parent / "validate-module.py"
14
14
 
15
- CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs\n"
15
+ CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs\n"
16
+ LEGACY_CSV_HEADER = "module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs\n"
16
17
 
17
18
 
18
19
  def create_module(tmp: Path, skills: list[str] | None = None, csv_rows: str = "",
@@ -162,6 +163,75 @@ def test_empty_csv():
162
163
  assert len(empty) == 1
163
164
 
164
165
 
166
+ def test_canonical_header_accepted():
167
+ """The canonical preceded-by/followed-by header must NOT produce a header finding."""
168
+ with tempfile.TemporaryDirectory() as tmp:
169
+ tmp = Path(tmp)
170
+ csv_rows = 'Test Module,tst-foo,Do Foo,DF,Does foo,run,,anytime,,,false,output_folder,report\n'
171
+ module_dir = create_module(tmp, skills=["tst-foo"], csv_rows=csv_rows)
172
+
173
+ code, data = run_validate(module_dir)
174
+ assert code == 0, f"expected a clean pass: {data}"
175
+ assert data["status"] == "pass"
176
+ header_findings = [f for f in data["findings"] if f["category"] == "csv-header"]
177
+ assert header_findings == [], f"unexpected header findings: {header_findings}"
178
+
179
+
180
+ def test_legacy_after_before_header_flagged():
181
+ """A module-help.csv using the old after/before column names must be flagged as
182
+ a header mismatch — canonical is preceded-by/followed-by (matches the templates
183
+ and bmad-help). Regression for the CSV_HEADER drift in validate-module.py."""
184
+ with tempfile.TemporaryDirectory() as tmp:
185
+ tmp = Path(tmp)
186
+ module_dir = tmp / "module"
187
+ module_dir.mkdir()
188
+ setup = module_dir / "tst-setup"
189
+ setup.mkdir()
190
+ (setup / "SKILL.md").write_text("---\nname: tst-setup\n---\n# Setup\n")
191
+ (setup / "assets").mkdir()
192
+ (setup / "assets" / "module.yaml").write_text(
193
+ 'code: tst\nname: "Test Module"\ndescription: "A test module"\n'
194
+ )
195
+ (setup / "assets" / "module-help.csv").write_text(
196
+ LEGACY_CSV_HEADER
197
+ + 'Test Module,tst-foo,Do Foo,DF,Does foo,run,,anytime,,,false,output_folder,report\n'
198
+ )
199
+ (module_dir / "tst-foo").mkdir()
200
+ (module_dir / "tst-foo" / "SKILL.md").write_text("---\nname: tst-foo\n---\n# tst-foo\n")
201
+
202
+ code, data = run_validate(module_dir)
203
+ assert code == 1, f"expected fail (high-severity header finding): {data}"
204
+ assert data["status"] == "fail"
205
+ header_findings = [f for f in data["findings"] if f["category"] == "csv-header"]
206
+ assert len(header_findings) == 1, f"expected a csv-header finding: {data['findings']}"
207
+ msg = header_findings[0]["message"]
208
+ # missing the new names, has the legacy ones
209
+ assert "preceded-by" in msg and "followed-by" in msg
210
+ assert "after" in msg and "before" in msg
211
+
212
+
213
+ def test_short_row_does_not_crash():
214
+ """A CSV row with fewer fields than the header must not crash the validator and
215
+ must be reported as a column-count mismatch. DictReader fills the missing
216
+ columns with None by default, so the validator's `.strip()` calls would raise
217
+ AttributeError on a short row — restval="" keeps them safe. Regression test."""
218
+ with tempfile.TemporaryDirectory() as tmp:
219
+ tmp = Path(tmp)
220
+ # Only 5 of the 13 columns present (the remaining 8 are missing entirely).
221
+ csv_rows = 'Test Module,tst-foo,Do Foo,DF,Does foo\n'
222
+ module_dir = create_module(tmp, skills=["tst-foo"], csv_rows=csv_rows)
223
+
224
+ code, data = run_validate(module_dir)
225
+ # Valid JSON with findings means the script completed instead of crashing
226
+ # with an uncaught traceback (which run_validate would surface as raw_*).
227
+ assert "findings" in data, f"validator crashed instead of reporting: {data}"
228
+ # A short row is a medium-severity finding: reported, but non-fatal.
229
+ assert code == 0 and data["status"] == "pass", f"expected non-fatal pass: {data}"
230
+ col_findings = [f for f in data["findings"] if f["category"] == "csv-columns"]
231
+ assert len(col_findings) == 1, f"expected a csv-columns finding: {data['findings']}"
232
+ assert "5 columns" in col_findings[0]["message"]
233
+
234
+
165
235
  def create_standalone_module(tmp: Path, skill_name: str = "my-skill",
166
236
  csv_rows: str = "", yaml_content: str = "",
167
237
  include_setup_md: bool = True,
@@ -290,6 +360,9 @@ if __name__ == "__main__":
290
360
  test_invalid_before_after_ref,
291
361
  test_missing_yaml_fields,
292
362
  test_empty_csv,
363
+ test_canonical_header_accepted,
364
+ test_legacy_after_before_header_flagged,
365
+ test_short_row_does_not_crash,
293
366
  test_valid_standalone_module,
294
367
  test_standalone_missing_module_setup_md,
295
368
  test_standalone_missing_merge_scripts,
@@ -13,7 +13,7 @@ Performs deterministic structural checks:
13
13
  - All skill folders have at least one capability entry in the CSV
14
14
  - No orphan CSV entries pointing to nonexistent skills
15
15
  - Menu codes are unique
16
- - Before/after references point to real capability entries
16
+ - preceded-by/followed-by references point to real capability entries
17
17
  - Required module.yaml fields are present
18
18
  - CSV column count is consistent
19
19
  """
@@ -28,7 +28,7 @@ from pathlib import Path
28
28
  REQUIRED_YAML_FIELDS = {"code", "name", "description"}
29
29
  CSV_HEADER = [
30
30
  "module", "skill", "display-name", "menu-code", "description",
31
- "action", "args", "phase", "after", "before", "required",
31
+ "action", "args", "phase", "preceded-by", "followed-by", "required",
32
32
  "output-location", "outputs",
33
33
  ]
34
34
 
@@ -77,12 +77,22 @@ def parse_yaml_minimal(text: str) -> dict[str, str]:
77
77
  return result
78
78
 
79
79
 
80
- def parse_csv_rows(csv_text: str) -> tuple[list[str], list[dict[str, str]]]:
81
- """Parse CSV text into header and list of row dicts."""
82
- reader = csv.DictReader(StringIO(csv_text))
80
+ def parse_csv_rows(csv_text: str) -> tuple[list[str], list[dict[str, str]], list[int]]:
81
+ """Parse CSV text into (header, row dicts, raw column count per data row).
82
+
83
+ ``restval=""`` fills missing trailing fields in a short row with empty strings
84
+ instead of ``None``, so downstream ``.strip()`` calls stay safe on malformed
85
+ rows. DictReader pads short rows to the header width, so ``len(row)`` cannot
86
+ reveal a field shortfall; the raw per-row column counts from ``csv.reader``
87
+ (blank lines skipped, to stay aligned with DictReader) are returned separately
88
+ for the column-count consistency check.
89
+ """
90
+ reader = csv.DictReader(StringIO(csv_text), restval="")
83
91
  header = reader.fieldnames or []
84
92
  rows = list(reader)
85
- return header, rows
93
+ raw_rows = list(csv.reader(StringIO(csv_text)))
94
+ col_counts = [len(r) for r in raw_rows[1:] if r != []]
95
+ return header, rows, col_counts
86
96
 
87
97
 
88
98
  def validate(module_dir: Path, verbose: bool = False) -> dict:
@@ -163,7 +173,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
163
173
 
164
174
  # 4. Parse and validate CSV
165
175
  csv_text = (csv_dir / "assets" / "module-help.csv").read_text(encoding="utf-8")
166
- header, rows = parse_csv_rows(csv_text)
176
+ header, rows, col_counts = parse_csv_rows(csv_text)
167
177
 
168
178
  # Check header
169
179
  if header != CSV_HEADER:
@@ -182,11 +192,12 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
182
192
 
183
193
  info["csv_entries"] = len(rows)
184
194
 
185
- # 5. Check column count consistency
195
+ # 5. Check column count consistency (using raw field counts: DictReader pads
196
+ # short rows to the header width, so len(row) alone can't detect a shortfall)
186
197
  expected_cols = len(CSV_HEADER)
187
- for i, row in enumerate(rows):
188
- if len(row) != expected_cols:
189
- finding("medium", "csv-columns", f"Row {i + 2} has {len(row)} columns, expected {expected_cols}",
198
+ for i, (row, n_cols) in enumerate(zip(rows, col_counts)):
199
+ if n_cols != expected_cols:
200
+ finding("medium", "csv-columns", f"Row {i + 2} has {n_cols} columns, expected {expected_cols}",
190
201
  f"skill={row.get('skill', '?')}")
191
202
 
192
203
  # 6. Collect skills from CSV and filesystem
@@ -220,7 +231,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
220
231
  if len(names) > 1:
221
232
  finding("high", "duplicate-menu-code", f"Menu code '{code}' used by multiple entries: {', '.join(names)}")
222
233
 
223
- # 10. Before/after reference validation
234
+ # 10. preceded-by/followed-by reference validation
224
235
  # Build set of valid capability references (skill:action)
225
236
  valid_refs = set()
226
237
  for row in rows:
@@ -231,7 +242,7 @@ def validate(module_dir: Path, verbose: bool = False) -> dict:
231
242
 
232
243
  for row in rows:
233
244
  display = row.get("display-name", "?")
234
- for field in ("after", "before"):
245
+ for field in ("preceded-by", "followed-by"):
235
246
  value = row.get(field, "").strip()
236
247
  if not value:
237
248
  continue
@@ -1,51 +1,66 @@
1
- # SAMPLE -- reference copy of bmad-product-brief's customize.toml (from bmm).
2
- # Use as a worked example when lifting configurables during Configurability Discovery.
3
- # This is NOT emitted into built skills; it's ground-truth reference for authors.
4
-
5
1
  # DO NOT EDIT -- overwritten on every update.
6
2
  #
7
- # Workflow customization surface for bmad-product-brief. Mirrors the
8
- # agent customization shape under the [workflow] namespace.
3
+ # Workflow customization surface for bmad-product-brief.
4
+ #
5
+ # Override files (not edited here):
6
+ # {project-root}/_bmad/custom/bmad-product-brief.toml (team)
7
+ # {project-root}/_bmad/custom/bmad-product-brief.user.toml (personal)
9
8
 
10
9
  [workflow]
11
10
 
12
11
  # --- Configurable below. Overrides merge per BMad structural rules: ---
13
- # scalars: override wins • arrays (persistent_facts, activation_steps_*): append
14
- # arrays-of-tables with `code`/`id`: replace matching items, append new ones.
12
+ # scalars: override wins • arrays: append
15
13
 
16
14
  # Steps to run before the standard activation (config load, greet).
17
- # Overrides append. Use for pre-flight loads, compliance checks, etc.
18
-
15
+ # Use for pre-flight loads, compliance checks, etc.
19
16
  activation_steps_prepend = []
20
17
 
21
- # Steps to run after greet but before Stage 1 of the workflow.
22
- # Overrides append. Use for context-heavy setup that should happen
23
- # once the user has been acknowledged.
24
-
18
+ # Steps to run after greet but before the workflow begins.
19
+ # Use for context-heavy setup that should happen once the user has been acknowledged.
25
20
  activation_steps_append = []
26
21
 
27
22
  # Persistent facts the workflow keeps in mind for the whole run
28
23
  # (standards, compliance constraints, stylistic guardrails).
29
- # Distinct from the runtime memory sidecar -- these are static context
30
- # loaded on activation. Overrides append.
31
- #
32
- # Each entry is either:
33
- # - a literal sentence, e.g. "All briefs must include a regulatory-risk section."
34
- # - a file reference prefixed with `file:`, e.g. "file:{project-root}/docs/standards.md"
35
- # (glob patterns are supported; the file's contents are loaded and treated as facts).
36
-
37
- persistent_facts = [
38
- "file:{project-root}/**/project-context.md",
39
- ]
24
+ # Each entry is either a literal sentence, a skill prefixed with `skill:`, or a `file:`-prefixed path/glob
25
+ # whose contents are loaded as facts.
26
+ # Default is empty. Common opt-ins (set in your team/user override TOML):
27
+ # "file:{project-root}/_bmad-output/planning-artifacts/project-context.md" # bmad-generate-project-context output
28
+ # "skill:acme-co:terms-and-conditions" # a skill that contains some relevant info to the documents that may be generated
29
+ # "Elvis has left the building" # generic agent instructions
30
+ persistent_facts = []
40
31
 
41
- # Path to the brief structure template used in Stage 4 drafting.
42
- # Bare paths resolve from the skill root; use `{project-root}/...` to
43
- # point at an org-owned template elsewhere in the repo. Override wins.
32
+ # Executed when the workflow completes (after the user has been told the
33
+ # brief is ready). Accepts either a string scalar (single instruction)
34
+ # or an array of instructions executed in order. Empty for none.
35
+ on_complete = ""
44
36
 
45
- brief_template = "resources/brief-template.md"
37
+ # Default brief structure. Treated as a starting point — the LLM adapts it
38
+ # to the product, purpose, and domain. Override the path in team/user TOML
39
+ # to enforce a different structure (e.g. regulated-industry, investor-deck).
40
+ brief_template = "assets/brief-template.md"
46
41
 
47
- # Scalar: executed when the workflow reaches its terminal stage, after
48
- # the main output has been delivered. Override wins. Leave empty for
49
- # no custom post-completion behavior.
42
+ # Run folder location. The brief, optional addendum, and optional distillate
43
+ # all land inside `{output_dir}/{output_folder_name}/`.
44
+ output_dir = "{planning_artifacts}/briefs"
45
+ output_folder_name = "brief-{project_name}-{date}"
50
46
 
51
- on_complete = ""
47
+ # Document standards applied to human-consumed docs at finalize. Each entry is
48
+ # a `skill:`, `file:`, or plain-text directive; the parent LLM applies the
49
+ # findings before the user sees the draft. Encodes standards, not options.
50
+ #
51
+ # Examples:
52
+ # "skill:bmad-editorial-review-prose"
53
+ # "file:{project-root}/_bmad/style-guides/company-voice.md"
54
+ # "Convert all dates to ISO 8601 format."
55
+ #
56
+ # Suggested order (broader passes first, narrower last):
57
+ # 1. Structural (cuts, reorganization, section sizing)
58
+ # 2. Content/voice/conventions (org standards, tone, terminology, compliance)
59
+ # 3. Prose mechanics (grammar, clarity, typos)
60
+ #
61
+ # Override the array in team/user TOML to add additional standards. Append-only:
62
+ # base entries cannot be removed or replaced (resolver has no removal mechanism).
63
+ doc_standards = [
64
+ "skill:bmad-editorial-review-structure",
65
+ "skill:bmad-editorial-review-prose",
66
+ ]