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
@@ -68,13 +68,27 @@ Using `risk-governance.md` and `probability-impact.md` (if loaded):
68
68
 
69
69
  ---
70
70
 
71
- ## 3. Summarize Risk Findings
71
+ ## 3. NFR Planning Assessment
72
+
73
+ Using `nfr-criteria.md` when loaded:
74
+
75
+ - Identify NFR categories in scope: security, performance, reliability, scalability, maintainability, compliance, and any project-specific categories
76
+ - Extract measurable thresholds from PRD, architecture, ADRs, epics, or stories
77
+ - Mark missing thresholds as **UNKNOWN** and convert them into clarification items or risks; do not guess values
78
+ - Define planned evidence sources for later validation (tests, scans, metrics, logs, monitoring, CI reports)
79
+ - Convert NFR gaps into the existing risk register using SEC / PERF / OPS / TECH / DATA categories
80
+
81
+ **Boundary:** This workflow plans NFR validation. It does not assess final PASS/CONCERNS/FAIL from implementation evidence. Use `nfr-assess` after implementation evidence exists.
82
+
83
+ ---
84
+
85
+ ## 4. Summarize Risk Findings
72
86
 
73
87
  Summarize the highest risks and their mitigation priorities.
74
88
 
75
89
  ---
76
90
 
77
- ### 4. Save Progress
91
+ ### 5. Save Progress
78
92
 
79
93
  **Save this step's accumulated work to `{outputFile}`.**
80
94
 
@@ -44,6 +44,7 @@ For each requirement or risk-driven scenario:
44
44
  - Select **test level** (E2E / API / Component / Unit) using `test-levels-framework.md`
45
45
  - Ensure no duplicate coverage across levels
46
46
  - Assign priorities (P0–P3) using `test-priorities-matrix.md`
47
+ - Map NFR-derived risks to planned validation scenarios and evidence sources
47
48
 
48
49
  **Priority rules:**
49
50
 
@@ -54,7 +55,20 @@ For each requirement or risk-driven scenario:
54
55
 
55
56
  ---
56
57
 
57
- ## 2. Execution Strategy (Keep Simple)
58
+ ## 2. NFR Coverage and Evidence Plan
59
+
60
+ For each in-scope NFR category:
61
+
62
+ - Map the NFR to one or more planned validation scenarios
63
+ - Select the right validation level/tool (for example: API/UI tests for auth and resilience, k6 for load/performance, CI/static analysis for maintainability, monitoring/logs for reliability)
64
+ - Identify the expected evidence artifact that `nfr-assess` should consume later
65
+ - Mark missing thresholds or missing evidence sources as blockers, risks, or assumptions
66
+
67
+ Keep this concise. Do not include full NFR evidence assessment tables or final PASS/CONCERNS/FAIL decisions in test design.
68
+
69
+ ---
70
+
71
+ ## 3. Execution Strategy (Keep Simple)
58
72
 
59
73
  Use a **PR / Nightly / Weekly** model:
60
74
 
@@ -64,7 +78,7 @@ Use a **PR / Nightly / Weekly** model:
64
78
 
65
79
  ---
66
80
 
67
- ## 3. Resource Estimates (Ranges Only)
81
+ ## 4. Resource Estimates (Ranges Only)
68
82
 
69
83
  Provide intervals (no false precision):
70
84
 
@@ -76,7 +90,7 @@ Provide intervals (no false precision):
76
90
 
77
91
  ---
78
92
 
79
- ## 4. Quality Gates
93
+ ## 5. Quality Gates
80
94
 
81
95
  Define thresholds:
82
96
 
@@ -84,10 +98,12 @@ Define thresholds:
84
98
  - P1 pass rate ≥ 95%
85
99
  - High-risk mitigations complete before release
86
100
  - Coverage target ≥ 80% (adjust if justified)
101
+ - NFR validation evidence identified for each in-scope NFR category
102
+ - Full NFR PASS/CONCERNS/FAIL status deferred to `nfr-assess` when evidence exists
87
103
 
88
104
  ---
89
105
 
90
- ### 5. Save Progress
106
+ ### 6. Save Progress
91
107
 
92
108
  **Save this step's accumulated work to `{outputFile}`.**
93
109
 
@@ -130,7 +130,9 @@ Epic-level mode remains single-worker by default (one output artifact).
130
130
  Ensure the outputs include:
131
131
 
132
132
  - Risk assessment matrix
133
+ - NFR planning summary (thresholds, missing thresholds, planned evidence, and NFR-derived risks) — when NFRs are in scope
133
134
  - Coverage matrix and priorities
135
+ - NFR coverage and planned evidence mapping — when NFRs are in scope
134
136
  - Execution strategy
135
137
  - Resource estimates (ranges)
136
138
  - Quality gate criteria
@@ -121,6 +121,23 @@ inputDocuments: []
121
121
 
122
122
  ---
123
123
 
124
+ ### NFR Testability Requirements
125
+
126
+ **Purpose:** Capture what architecture must provide so NFR validation can be automated later. This is planning guidance, not final evidence assessment.
127
+
128
+ | NFR Category | Threshold / Requirement | Current Design Support | Gap / Decision Needed | Planned Evidence |
129
+ | --------------- | ------------------------------------------------- | --------------------------- | ------------------------------ | --------------------------------------- |
130
+ | Security | {Auth/authz/data protection requirement} | {Supported/partial/unknown} | {Architecture gap or decision} | {Security tests, scan, audit log} |
131
+ | Performance | {Latency/throughput/resource requirement} | {Supported/partial/unknown} | {Architecture gap or decision} | {k6/APM/load report} |
132
+ | Reliability | {Availability/error-rate/recovery requirement} | {Supported/partial/unknown} | {Architecture gap or decision} | {Burn-in, monitoring, failover report} |
133
+ | Maintainability | {Coverage/code quality/observability requirement} | {Supported/partial/unknown} | {Architecture gap or decision} | {Coverage, static analysis, docs audit} |
134
+
135
+ **Unknown thresholds:** {List any missing NFR thresholds. Unknown thresholds should become risks or clarification items, not guessed values.}
136
+
137
+ **Assessment boundary:** Final PASS/CONCERNS/FAIL status belongs in `nfr-assess` after implementation evidence exists.
138
+
139
+ ---
140
+
124
141
  ### Testability Concerns and Architectural Gaps
125
142
 
126
143
  **🚨 ACTIONABLE CONCERNS - Architecture Team Must Address**
@@ -123,6 +123,21 @@ test('example test @p0', async ({ apiRequest }) => {
123
123
 
124
124
  ---
125
125
 
126
+ ## NFR Test Coverage Plan
127
+
128
+ **Purpose:** Map NFR requirements to planned validation work. This section defines what evidence QA should create or collect; it does not assign final PASS/CONCERNS/FAIL status.
129
+
130
+ | NFR Category | Requirement / Threshold | Planned Validation | Tool / Level | Evidence Artifact | Priority |
131
+ | --------------- | ----------------------- | ------------------------------------------ | -------------------- | ----------------------------- | -------- |
132
+ | Security | {Requirement} | {Auth/authz/security validation} | {API/E2E/SAST/DAST} | {Report or test result path} | {P0-P3} |
133
+ | Performance | {Requirement} | {Load/stress/baseline validation} | {k6/APM/Lighthouse} | {Report or dashboard} | {P0-P3} |
134
+ | Reliability | {Requirement} | {Error/retry/failover validation} | {API/E2E/monitoring} | {Burn-in/log/metric evidence} | {P0-P3} |
135
+ | Maintainability | {Requirement} | {Coverage/static analysis/docs validation} | {CI/static analysis} | {Coverage or quality report} | {P0-P3} |
136
+
137
+ **Missing thresholds or evidence sources:** {List NFRs that need stakeholder clarification or tooling before `nfr-assess`.}
138
+
139
+ ---
140
+
126
141
  ## Entry Criteria
127
142
 
128
143
  **QA testing cannot begin until ALL of the following are met:**
@@ -76,6 +76,21 @@ lastSaved: ''
76
76
 
77
77
  ---
78
78
 
79
+ ## NFR Planning
80
+
81
+ **Purpose:** Capture epic-specific NFR thresholds, planned validation, and evidence expected for later `nfr-assess`. This is not a final evidence audit.
82
+
83
+ | NFR Category | Requirement / Threshold | Risk Link | Planned Validation | Evidence Needed |
84
+ | --------------- | ----------------------- | --------- | ------------------------------------------ | -------------------------------- |
85
+ | Security | {Requirement} | {R-ID} | {API/E2E/SAST/DAST validation} | {Test report, scan, audit log} |
86
+ | Performance | {Requirement} | {R-ID} | {Load/stress/baseline validation} | {k6/APM/Lighthouse report} |
87
+ | Reliability | {Requirement} | {R-ID} | {Error/retry/failover validation} | {Burn-in, logs, monitoring data} |
88
+ | Maintainability | {Requirement} | {R-ID} | {Coverage/static analysis/docs validation} | {Coverage or quality report} |
89
+
90
+ **Unknown thresholds:** {List missing NFR thresholds or mark N/A. Do not invent values.}
91
+
92
+ ---
93
+
79
94
  ## Entry Criteria
80
95
 
81
96
  - [ ] Requirements and assumptions agreed upon by QA, Dev, PM
@@ -247,6 +262,7 @@ lastSaved: ''
247
262
  - [ ] No high-risk (≥6) items unmitigated
248
263
  - [ ] Security tests (SEC category) pass 100%
249
264
  - [ ] Performance targets met (PERF category)
265
+ - [ ] Planned NFR evidence exists or `nfr-assess` has documented CONCERNS/waivers
250
266
 
251
267
  ---
252
268
 
@@ -39,7 +39,7 @@ pactjs-utils-request-filter,Pact.js Utils Request Filter,"createRequestFilter, n
39
39
  pact-mcp,Pact MCP Server,"SmartBear MCP for PactFlow: generate tests, review, can-i-deploy, provider states","pact,mcp,pactflow,contract-testing,broker",specialized,knowledge/pact-mcp.md
40
40
  pact-consumer-framework-setup,Pact Consumer CDC Framework Setup,"Directory structure, vitest config with fileParallelism:false + pool:forks + singleFork:true (FFI safety), determinism gate (check-pact-determinism.sh), jq-normalized publishing, 1:1 local/CI parity, PactV4 patterns","pactjs-utils,consumer,contract-testing,pact,ci,framework,setup,vitest,shell-scripts,determinism,jq,pactv4,ffi",specialized,knowledge/pact-consumer-framework-setup.md
41
41
  pact-broker-webhooks,Pact Broker Webhooks,"PactFlow → GitHub repository_dispatch auth via dedicated machine user + classic PAT (repo scope, no expiration) + PactFlow secret; staleness monitoring and PAT rotation runbook","pact,pactflow,broker,webhooks,github,auth,pat,ci,operations,security",specialized,knowledge/pact-broker-webhooks.md
42
- adr-quality-readiness-checklist,ADR Quality Readiness Checklist,"8-category 29-criteria framework for ADR testability and NFR assessment","nfr,testability,adr,quality,assessment,checklist",extended,knowledge/adr-quality-readiness-checklist.md
42
+ adr-quality-readiness-checklist,ADR Quality Readiness Checklist,"8-category 29-criteria framework for ADR testability and NFR evidence audit","nfr,testability,adr,quality,assessment,checklist",extended,knowledge/adr-quality-readiness-checklist.md
43
43
  playwright-cli,Playwright CLI,"Token-efficient CLI for AI coding agents: element refs, sessions, snapshots, trace analysis, debug=cli autonomous investigation","cli,browser,agent,automation,snapshot,trace,debug",core,knowledge/playwright-cli.md
44
44
  pact-consumer-di,Pact Consumer DI Pattern,"Dependency injection pattern for Pact consumer tests — call actual source code instead of raw fetch by injecting mock server URL via optional baseUrl in context type","contract-testing,pact,consumer,dependency-injection,api,backend,architecture",extended,knowledge/pact-consumer-di.md
45
45
  webhook-fundamentals,Webhook Testing Fundamentals,"Why webhook delivery is hard: async, parallel pollution, opaque timeouts, cleanup drift. playwright-utils approach with polling, typed matchers, rich errors, startedAt isolation","webhook,async,playwright-utils,event-driven,eventually-consistent",core,knowledge/webhook-testing-fundamentals.md
@@ -252,7 +252,7 @@ Knowledge fragments referenced:
252
252
  - [ ] Story/epic/release file identified and read
253
253
  - [ ] Test design document discovered or explicitly provided (if available)
254
254
  - [ ] Traceability matrix discovered or explicitly provided (available from Phase 1)
255
- - [ ] NFR assessment discovered or explicitly provided (if available)
255
+ - [ ] NFR evidence audit discovered or explicitly provided (if available)
256
256
  - [ ] Code coverage report discovered or explicitly provided (if available)
257
257
  - [ ] Burn-in results discovered or explicitly provided (if available)
258
258
 
@@ -39,7 +39,7 @@ pactjs-utils-request-filter,Pact.js Utils Request Filter,"createRequestFilter, n
39
39
  pact-mcp,Pact MCP Server,"SmartBear MCP for PactFlow: generate tests, review, can-i-deploy, provider states","pact,mcp,pactflow,contract-testing,broker",specialized,knowledge/pact-mcp.md
40
40
  pact-consumer-framework-setup,Pact Consumer CDC Framework Setup,"Directory structure, vitest config with fileParallelism:false + pool:forks + singleFork:true (FFI safety), determinism gate (check-pact-determinism.sh), jq-normalized publishing, 1:1 local/CI parity, PactV4 patterns","pactjs-utils,consumer,contract-testing,pact,ci,framework,setup,vitest,shell-scripts,determinism,jq,pactv4,ffi",specialized,knowledge/pact-consumer-framework-setup.md
41
41
  pact-broker-webhooks,Pact Broker Webhooks,"PactFlow → GitHub repository_dispatch auth via dedicated machine user + classic PAT (repo scope, no expiration) + PactFlow secret; staleness monitoring and PAT rotation runbook","pact,pactflow,broker,webhooks,github,auth,pat,ci,operations,security",specialized,knowledge/pact-broker-webhooks.md
42
- adr-quality-readiness-checklist,ADR Quality Readiness Checklist,"8-category 29-criteria framework for ADR testability and NFR assessment","nfr,testability,adr,quality,assessment,checklist",extended,knowledge/adr-quality-readiness-checklist.md
42
+ adr-quality-readiness-checklist,ADR Quality Readiness Checklist,"8-category 29-criteria framework for ADR testability and NFR evidence audit","nfr,testability,adr,quality,assessment,checklist",extended,knowledge/adr-quality-readiness-checklist.md
43
43
  playwright-cli,Playwright CLI,"Token-efficient CLI for AI coding agents: element refs, sessions, snapshots, trace analysis, debug=cli autonomous investigation","cli,browser,agent,automation,snapshot,trace,debug",core,knowledge/playwright-cli.md
44
44
  pact-consumer-di,Pact Consumer DI Pattern,"Dependency injection pattern for Pact consumer tests — call actual source code instead of raw fetch by injecting mock server URL via optional baseUrl in context type","contract-testing,pact,consumer,dependency-injection,api,backend,architecture",extended,knowledge/pact-consumer-di.md
45
45
  webhook-fundamentals,Webhook Testing Fundamentals,"Why webhook delivery is hard: async, parallel pollution, opaque timeouts, cleanup drift. playwright-utils approach with polling, typed matchers, rich errors, startedAt isolation","webhook,async,playwright-utils,event-driven,eventually-consistent",core,knowledge/webhook-testing-fundamentals.md
@@ -678,7 +678,7 @@ traceability_and_gate:
678
678
  - **Test Design:** {TEST_DESIGN_PATH} (if available)
679
679
  - **Tech Spec:** {TECH_SPEC_PATH} (if available)
680
680
  - **Test Results:** {TEST_RESULTS_PATH}
681
- - **NFR Assessment:** {NFR_FILE_PATH} (if available)
681
+ - **NFR Evidence Audit:** {NFR_FILE_PATH} (if available)
682
682
  - **Test Files:** {TEST_DIR_PATH}
683
683
 
684
684
  ---
@@ -12,6 +12,7 @@
12
12
 
13
13
  const path = require('node:path');
14
14
  const fs = require('node:fs/promises');
15
+ const { parse } = require('csv-parse/sync');
15
16
  const yaml = require('js-yaml');
16
17
 
17
18
  async function pathExists(filePath) {
@@ -23,6 +24,11 @@ async function pathExists(filePath) {
23
24
  }
24
25
  }
25
26
 
27
+ function extractFrontmatter(content) {
28
+ const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/);
29
+ return match ? match[1] : '';
30
+ }
31
+
26
32
  // ANSI colors
27
33
  const colors = {
28
34
  reset: '\u001B[0m',
@@ -253,10 +259,12 @@ async function runTests() {
253
259
  ];
254
260
 
255
261
  for (const dirName of workflowDirs) {
262
+ const workflowDir = path.join(projectRoot, `src/workflows/testarch/${dirName}`);
256
263
  const skillMdPath = path.join(projectRoot, `src/workflows/testarch/${dirName}/SKILL.md`);
257
264
  const customizeTomlPath = path.join(projectRoot, `src/workflows/testarch/${dirName}/customize.toml`);
258
265
  const workflowYamlPath = path.join(projectRoot, `src/workflows/testarch/${dirName}/workflow.yaml`);
259
266
  const instructionsMdPath = path.join(projectRoot, `src/workflows/testarch/${dirName}/instructions.md`);
267
+ let workflowKnowledgeIndexValidated = false;
260
268
 
261
269
  if (await pathExists(skillMdPath)) {
262
270
  try {
@@ -344,6 +352,7 @@ async function runTests() {
344
352
  const stepPath = path.join(stepDirPath, fileName);
345
353
  try {
346
354
  const stepContent = await fs.readFile(stepPath, 'utf8');
355
+ const frontmatter = extractFrontmatter(stepContent);
347
356
  const stepLabel = `${dirName}/${stepDir}/${fileName}`;
348
357
 
349
358
  assert(!stepContent.includes("nextStepFile: './"), `${stepLabel} has no cwd-sensitive nextStepFile`);
@@ -371,6 +380,46 @@ async function runTests() {
371
380
  if (stepContent.includes('workflowPath:')) {
372
381
  assert(stepContent.includes("workflowPath: '{skill-root}'"), `${stepLabel} anchors workflowPath to {skill-root}`);
373
382
  }
383
+
384
+ if (frontmatter.includes('knowledgeIndex:')) {
385
+ const knowledgeIndexMatch = frontmatter.match(/^knowledgeIndex:\s*['"]([^'"]+)['"]/m);
386
+ assert(Boolean(knowledgeIndexMatch), `${stepLabel} declares a parseable knowledgeIndex`);
387
+
388
+ const knowledgeIndexReference = knowledgeIndexMatch ? knowledgeIndexMatch[1] : '';
389
+ const knowledgeIndexPath = path.resolve(workflowDir, knowledgeIndexReference);
390
+ const expectedKnowledgeIndexPath = path.join(workflowDir, 'resources', 'tea-index.csv');
391
+
392
+ assert(knowledgeIndexPath === expectedKnowledgeIndexPath, `${stepLabel} uses the workflow-local knowledge index`);
393
+ assert(await pathExists(knowledgeIndexPath), `${stepLabel} knowledgeIndex target exists`);
394
+
395
+ if (!workflowKnowledgeIndexValidated && (await pathExists(knowledgeIndexPath))) {
396
+ const records = parse(await fs.readFile(knowledgeIndexPath, 'utf8'), { columns: true, skip_empty_lines: true });
397
+ const workflowKnowledgeDir = path.join(path.dirname(knowledgeIndexPath), 'knowledge');
398
+ const workflowKnowledgeFiles = (await fs.readdir(workflowKnowledgeDir)).filter((name) => name.endsWith('.md'));
399
+ const missingFragments = [];
400
+
401
+ for (const record of records) {
402
+ if (!record.fragment_file) {
403
+ missingFragments.push(`${record.id || '<missing-id>'}: missing fragment_file`);
404
+ continue;
405
+ }
406
+
407
+ const fragmentPath = path.resolve(path.dirname(knowledgeIndexPath), record.fragment_file);
408
+ if (!(await pathExists(fragmentPath))) {
409
+ missingFragments.push(record.fragment_file);
410
+ }
411
+ }
412
+
413
+ assert(
414
+ records.length === workflowKnowledgeFiles.length,
415
+ `${dirName}/resources/tea-index.csv line count matches workflow-local fragments`,
416
+ `Found ${records.length} records for ${workflowKnowledgeFiles.length} fragments`,
417
+ );
418
+ assert(missingFragments.length === 0, `${dirName}/resources/tea-index.csv fragment files exist`, missingFragments.join(', '));
419
+
420
+ workflowKnowledgeIndexValidated = true;
421
+ }
422
+ }
374
423
  } catch (error) {
375
424
  assert(false, `${dirName}/${stepDir}/${fileName} validates`, error.message);
376
425
  }
@@ -100,14 +100,14 @@ export default defineConfig({
100
100
  label: 'Workflows',
101
101
  items: [
102
102
  { label: 'Teach Me Testing', slug: 'how-to/workflows/teach-me-testing' },
103
+ { label: 'Test Design', slug: 'how-to/workflows/run-test-design' },
103
104
  { label: 'Set Up Test Framework', slug: 'how-to/workflows/setup-test-framework' },
104
105
  { label: 'Set Up CI Pipeline', slug: 'how-to/workflows/setup-ci' },
105
- { label: 'Test Design', slug: 'how-to/workflows/run-test-design' },
106
106
  { label: 'ATDD', slug: 'how-to/workflows/run-atdd' },
107
107
  { label: 'Automate', slug: 'how-to/workflows/run-automate' },
108
108
  { label: 'Test Review', slug: 'how-to/workflows/run-test-review' },
109
+ { label: 'NFR Evidence Audit', slug: 'how-to/workflows/run-nfr-assess' },
109
110
  { label: 'Trace', slug: 'how-to/workflows/run-trace' },
110
- { label: 'NFR Assessment', slug: 'how-to/workflows/run-nfr-assess' },
111
111
  ],
112
112
  },
113
113
  {
@@ -128,7 +128,7 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
128
128
 
129
129
  ## Support BMad
130
130
 
131
- BMad is free for everyone and always will be. Star this repo, [buy me a coffee](https://buymeacoffee.com/bmad), or email contact@bmadcode.com for corporate sponsorship.
131
+ BMad is free for everyone and always will be. Star this repo, [buy me a coffee](https://buymeacoffee.com/bmad), or email <contact@bmadcode.com> for corporate sponsorship.
132
132
 
133
133
  ## License
134
134
 
@@ -15,10 +15,60 @@
15
15
  # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
16
16
  # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
17
17
 
18
- # This example catches duplicate Signed-off-by lines.
18
+ # This example catches duplicate Signed-off-by lines and messages that
19
+ # would confuse 'git am'.
20
+
21
+ ret=0
19
22
 
20
23
  test "" = "$(grep '^Signed-off-by: ' "$1" |
21
24
  sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
22
25
  echo >&2 Duplicate Signed-off-by lines.
23
- exit 1
26
+ ret=1
24
27
  }
28
+
29
+ comment_re="$(
30
+ {
31
+ git config --get-regexp "^core\.comment(char|string)\$" ||
32
+ echo '#'
33
+ } | sed -n -e '
34
+ ${
35
+ s/^[^ ]* //
36
+ s|[][*./\]|\\&|g
37
+ s/^auto$/[#;@!$%^&|:]/
38
+ p
39
+ }'
40
+ )"
41
+ scissors_line="^${comment_re} -\{8,\} >8 -\{8,\}\$"
42
+ comment_line="^${comment_re}.*"
43
+ blank_line='^[ ]*$'
44
+ # Disallow lines starting with "diff -" or "Index: " in the body of the
45
+ # message. Stop looking if we see a scissors line.
46
+ line="$(sed -n -e "
47
+ # Skip comments and blank lines at the start of the file.
48
+ /${scissors_line}/q
49
+ /${comment_line}/d
50
+ /${blank_line}/d
51
+ # The first paragraph will become the subject header so
52
+ # does not need to be checked.
53
+ : subject
54
+ n
55
+ /${scissors_line}/q
56
+ /${blank_line}/!b subject
57
+ # Check the body of the message for problematic
58
+ # prefixes.
59
+ : body
60
+ n
61
+ /${scissors_line}/q
62
+ /${comment_line}/b body
63
+ /^diff -/{p;q;}
64
+ /^Index: /{p;q;}
65
+ b body
66
+ " "$1")"
67
+ if test -n "$line"
68
+ then
69
+ echo >&2 "Message contains a diff that will confuse 'git am'."
70
+ echo >&2 "To fix this indent the diff."
71
+ ret=1
72
+ fi
73
+
74
+ exit $ret
@@ -29,8 +29,6 @@ if ($version ne 2) {
29
29
 
30
30
  my $git_work_tree = get_working_dir();
31
31
 
32
- my $retry = 1;
33
-
34
32
  my $json_pkg;
35
33
  eval {
36
34
  require JSON::XS;
@@ -123,8 +121,7 @@ sub watchman_query {
123
121
  sub is_work_tree_watched {
124
122
  my ($output) = @_;
125
123
  my $error = $output->{error};
126
- if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
127
- $retry--;
124
+ if ($error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
128
125
  my $response = qx/watchman watch "$git_work_tree"/;
129
126
  die "Failed to make watchman watch '$git_work_tree'.\n" .
130
127
  "Falling back to scanning...\n" if $? != 0;
@@ -142,15 +139,12 @@ sub is_work_tree_watched {
142
139
  # Watchman query just to get it over with now so we won't pay
143
140
  # the cost in git to look up each individual file.
144
141
  my $o = watchman_clock();
145
- $error = $output->{error};
142
+ $error = $o->{error};
146
143
 
147
144
  die "Watchman: $error.\n" .
148
145
  "Falling back to scanning...\n" if $error;
149
146
 
150
147
  output_result($o->{clock}, ("/"));
151
- $last_update_token = $o->{clock};
152
-
153
- eval { launch_watchman() };
154
148
  return 0;
155
149
  }
156
150
 
@@ -1,2 +1,2 @@
1
1
  # pack-refs with: peeled fully-peeled sorted
2
- 430c824ffe3845b2211d7a36707c66abe1b20b8c refs/remotes/origin/main
2
+ cc16f09fcfab26d35635af1491f36a38a8431c8d refs/remotes/origin/main
@@ -1 +1 @@
1
- 430c824ffe3845b2211d7a36707c66abe1b20b8c
1
+ cc16f09fcfab26d35635af1491f36a38a8431c8d
@@ -0,0 +1 @@
1
+ 8ad7e713507b4acebaac632afddec6bbb909a74e
@@ -1 +1 @@
1
- 430c824ffe3845b2211d7a36707c66abe1b20b8c
1
+ cc16f09fcfab26d35635af1491f36a38a8431c8d
@@ -83,7 +83,7 @@ export default [
83
83
 
84
84
  // CLI scripts under tools/** and test/**
85
85
  {
86
- files: ['tools/**/*.js', 'tools/**/*.mjs', 'test/**/*.js'],
86
+ files: ['tools/**/*.js', 'tools/**/*.mjs', 'test/**/*.js', 'src/scripts/**/*.js'],
87
87
  rules: {
88
88
  // Allow CommonJS patterns for Node CLI scripts
89
89
  'unicorn/prefer-module': 'off',
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-wds",
4
- "version": "0.3.1",
4
+ "version": "0.4.3",
5
5
  "private": true,
6
6
  "description": "Whiteport Design Studio - BMAD expansion module for strategic design methodology",
7
7
  "keywords": [
@@ -0,0 +1,80 @@
1
+ # DO NOT EDIT -- overwritten on every update.
2
+ #
3
+ # Freya, the WDS Designer, is the hardcoded identity of this agent.
4
+ # Customize the persona and menu below to shape behavior without
5
+ # changing who the agent is.
6
+
7
+ [agent]
8
+ # non-configurable skill frontmatter, create a custom agent if you need a new name/title
9
+ name = "Freya"
10
+ title = "WDS Designer"
11
+
12
+ # --- Configurable below. Overrides merge per BMad structural rules: ---
13
+ # scalars: override wins • arrays (persistent_facts, principles, activation_steps_*): append
14
+ # arrays-of-tables with `code`/`id`: replace matching items, append new ones.
15
+
16
+ icon = "🎨"
17
+
18
+ activation_steps_prepend = []
19
+ activation_steps_append = []
20
+
21
+ persistent_facts = [
22
+ "file:{project-root}/**/project-context.md",
23
+ ]
24
+
25
+ role = "Strategic UX Designer + Design Thinking Partner"
26
+ identity = "Freya, Norse goddess of beauty, magic, and strategy. Thinks WITH you, not FOR you. Starts with WHY before HOW — design without strategy is decoration. Creates artifacts developers can trust: detailed specs, prototypes, and design systems. Core beliefs: Strategy then Design then Specification. Psychology drives design. Content is strategy — every word triggers user psychology."
27
+ communication_style = "Creative collaborator who brings strategic depth. Asks 'WHY?' before 'WHAT?' — connecting design choices to business goals and user psychology. Explores one challenge deeply rather than skimming many. Keeps responses focused and actionable — leads with decisions, follows with rationale. Suggests workshops when strategic thinking is needed."
28
+
29
+ principles = [
30
+ "Domain: Phases 3 (UX Scenarios), 4 (UX Design), 5 (Agentic Development), 6 (Asset Generation), 7 (Design System - optional), 8 (Product Evolution). Hand over other domains to specialist agents.",
31
+ "Replaces BMM Sally (UX Designer) when WDS is installed.",
32
+ "Load strategic context BEFORE designing — always connect to Trigger Map.",
33
+ "Specifications must be logical and complete — if you can't explain it, it's not ready.",
34
+ "Prototypes validate before production — show, don't tell.",
35
+ "Design systems grow organically from actual usage, not upfront planning.",
36
+ "AI-assisted design via Stitch when spec + sketch ready; Figma integration for visual refinement.",
37
+ "Load micro-guides when entering workflows: strategic-design.md, specification-quality.md, agentic-development.md, content-creation.md, design-system.md",
38
+ "HARM: Producing output that looks complete but doesn't follow the template. The user must then correct what should have been right — wasting time, money, and trust. Plausible-looking wrong output is worse than no output. Custom formats break the pipeline for every phase downstream.",
39
+ "HELP: Reading the actual template into context before writing. Discussing decisions with the user. Delivering artifacts that the next phase can consume without auditing. The user's time goes to decisions, not corrections.",
40
+ ]
41
+
42
+ [[agent.menu]]
43
+ code = "SC"
44
+ description = "Scenarios: Outline user flows and journeys (Phase 3)"
45
+ skill = "bmad-wds-outline-scenarios"
46
+
47
+ [[agent.menu]]
48
+ code = "UX"
49
+ description = "UX Design: Create pages and storyboards (Phase 4)"
50
+ skill = "bmad-wds-conceptual-sketching"
51
+
52
+ [[agent.menu]]
53
+ code = "SP"
54
+ description = "Specifications: Write content, interaction and functionality specs (Phase 4)"
55
+ skill = "bmad-wds-conceptual-specs"
56
+
57
+ [[agent.menu]]
58
+ code = "SA"
59
+ description = "Audit: Check spec completeness and quality (Phase 4)"
60
+ skill = "bmad-wds-spec-audit"
61
+
62
+ [[agent.menu]]
63
+ code = "GA"
64
+ description = "Generate Assets: Nano Banana, Stitch and other services (Phase 6)"
65
+ skill = "bmad-wds-visual-design"
66
+
67
+ [[agent.menu]]
68
+ code = "DS"
69
+ description = "Design System: Build component library with design tokens (Phase 7)"
70
+ skill = "bmad-wds-design-system"
71
+
72
+ [[agent.menu]]
73
+ code = "DD"
74
+ description = "Design Delivery: Package flows for development handoff (Phase 5)"
75
+ skill = "bmad-wds-design-delivery"
76
+
77
+ [[agent.menu]]
78
+ code = "PE"
79
+ description = "Product Evolution: Continuous improvement for living products (Phase 8)"
80
+ skill = "bmad-wds-product-evolution"
@@ -0,0 +1,52 @@
1
+ # DO NOT EDIT -- overwritten on every update.
2
+ #
3
+ # Mimir, the WDS Builder, is the hardcoded identity of this agent.
4
+ # Customize the persona and menu below to shape behavior without
5
+ # changing who the agent is.
6
+
7
+ [agent]
8
+ # non-configurable skill frontmatter, create a custom agent if you need a new name/title
9
+ name = "Mimir"
10
+ title = "WDS Builder"
11
+
12
+ # --- Configurable below. Overrides merge per BMad structural rules: ---
13
+ # scalars: override wins • arrays (persistent_facts, principles, activation_steps_*): append
14
+ # arrays-of-tables with `code`/`id`: replace matching items, append new ones.
15
+
16
+ icon = "🔨"
17
+
18
+ activation_steps_prepend = []
19
+ activation_steps_append = []
20
+
21
+ persistent_facts = [
22
+ "file:{project-root}/**/project-context.md",
23
+ ]
24
+
25
+ role = "Implementation Agent + Technical Build Partner"
26
+ identity = "Mimir, god of wisdom and deep knowledge — the well beneath the world tree. Methodical, precise, empirical. Not creative — rigorous. Creativity happened upstream. Reads the spec completely before writing a line of code. Plans before acting. Verifies before moving on. Does not embellish."
27
+ communication_style = "Technical and precise. Confirms understanding of requirements before starting. Reports progress in discrete verified steps. Flags ambiguity immediately rather than guessing. Asks one clarifying question at a time."
28
+
29
+ principles = [
30
+ "Domain: Phase 5 (Agentic Development). Receives Work Orders from Freya, produces working code.",
31
+ "Read the full spec before writing a single line of code — no shortcuts.",
32
+ "One requirement at a time. Implement, commit, verify. Never batch unverified changes.",
33
+ "The PRD is the contract. If reality diverges from PRD, stop and surface it.",
34
+ "Browser test every UI change — a sub-agent confirms the requirement passes visually.",
35
+ "HARM: Writing code without reading the spec. Batching changes without verification. Assuming what the user meant.",
36
+ "HELP: Starting from the Work Order, writing the PRD, implementing one requirement at a time with verification.",
37
+ ]
38
+
39
+ [[agent.menu]]
40
+ code = "TA"
41
+ description = "Tech Audit: Read codebase and produce living architecture document (first-time entry)"
42
+ skill = "bmad-wds-tech-audit"
43
+
44
+ [[agent.menu]]
45
+ code = "PR"
46
+ description = "PRD: Write Product Requirements Document from a Freya Work Order"
47
+ skill = "bmad-wds-prd"
48
+
49
+ [[agent.menu]]
50
+ code = "BU"
51
+ description = "Build: Implement requirements from PRD — one verified task at a time"
52
+ skill = "bmad-wds-build"