ma-agents 3.12.3 → 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 (254) hide show
  1. package/docs/architecture.md +18 -0
  2. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +1 -1
  3. package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +52 -2
  4. package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  5. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  6. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack +0 -0
  8. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  9. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  10. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  11. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  12. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  13. package/lib/bmad-cache/bmb/package.json +1 -1
  14. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +1 -1
  15. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +33 -0
  16. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +28 -0
  17. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +1 -1
  18. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +28 -0
  19. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +33 -0
  20. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +28 -0
  21. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +1 -1
  22. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +28 -0
  23. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +33 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +28 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +29 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +115 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +184 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +171 -0
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +492 -0
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +366 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +260 -0
  32. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
  33. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +28 -0
  34. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +33 -0
  35. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +28 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +33 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +28 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +74 -1
  39. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +24 -13
  40. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +48 -33
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +287 -0
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +57 -8
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +7 -7
  44. package/lib/bmad-cache/bmb/skills/module-help.csv +1 -1
  45. package/lib/bmad-cache/bmb/website/public/img/eval-test-types.png +0 -0
  46. package/lib/bmad-cache/cache-manifest.json +17 -18
  47. package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +52 -2
  48. package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  49. package/lib/bmad-cache/cis/_git_preserved/index +0 -0
  50. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.idx +0 -0
  51. package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.pack → pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.pack} +0 -0
  52. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.rev +0 -0
  53. package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
  54. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  55. package/lib/bmad-cache/cis/_git_preserved/refs/tags/v0.2.1 +1 -0
  56. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  57. package/lib/bmad-cache/cis/package-lock.json +2 -2
  58. package/lib/bmad-cache/cis/package.json +1 -1
  59. package/lib/bmad-cache/cis/src/module-help.csv +1 -1
  60. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +4 -7
  61. package/lib/bmad-cache/gds/README.md +3 -1
  62. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +52 -2
  63. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  64. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  65. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  66. package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-9427a146a90c00bb542cba038874bf9671ba4dc0.pack → pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack} +0 -0
  67. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  68. package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
  69. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  70. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  71. package/lib/bmad-cache/gds/package.json +1 -1
  72. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +5 -5
  73. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +5 -5
  74. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -5
  75. package/lib/bmad-cache/gds/src/module-help.csv +6 -12
  76. package/lib/bmad-cache/gds/src/module.yaml +1 -1
  77. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +97 -22
  78. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +190 -0
  79. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +99 -0
  80. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +290 -0
  81. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +190 -0
  82. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +84 -0
  83. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +319 -0
  84. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +101 -0
  85. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +1 -0
  86. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +88 -0
  87. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +124 -2
  88. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +62 -0
  89. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
  90. package/lib/bmad-cache/tea/.github/workflows/docs.yaml +3 -3
  91. package/lib/bmad-cache/tea/.github/workflows/quality.yaml +10 -10
  92. package/lib/bmad-cache/tea/AGENTS.md +31 -0
  93. package/lib/bmad-cache/tea/CHANGELOG.md +42 -1
  94. package/lib/bmad-cache/tea/README.md +8 -5
  95. package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +52 -2
  96. package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  97. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  98. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.idx +0 -0
  99. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-f0df537f2649464ff6c5aee241165eb9c8664227.pack → pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.pack} +0 -0
  100. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.rev +0 -0
  101. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  102. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  103. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.19.0 +1 -0
  104. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  105. package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +15 -16
  106. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +2 -0
  107. package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +1 -1
  108. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +88 -52
  109. package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +13 -12
  110. package/lib/bmad-cache/tea/docs/glossary/index.md +2 -2
  111. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +19 -18
  112. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +1 -1
  113. package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +32 -26
  114. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +20 -14
  115. package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +3 -3
  116. package/lib/bmad-cache/tea/docs/index.md +13 -11
  117. package/lib/bmad-cache/tea/docs/reference/commands.md +37 -13
  118. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +2 -2
  119. package/lib/bmad-cache/tea/package-lock.json +2 -2
  120. package/lib/bmad-cache/tea/package.json +1 -1
  121. package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +20 -15
  122. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/confidence-gate.md +73 -0
  123. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +1 -0
  124. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +2 -1
  125. package/lib/bmad-cache/tea/src/module-help.csv +2 -2
  126. package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -4
  127. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +1 -1
  128. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +1 -1
  129. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +2 -2
  130. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +1 -1
  131. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +1 -1
  132. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +1 -1
  133. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +1 -1
  134. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +1 -1
  135. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +1 -1
  136. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +3 -3
  137. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +11 -11
  138. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +4 -2
  139. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +5 -5
  140. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +1 -1
  141. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
  142. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01b-resume.md +1 -1
  143. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +14 -3
  144. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +7 -7
  145. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +4 -4
  146. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +4 -4
  147. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +4 -4
  148. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +4 -4
  149. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +4 -4
  150. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +1 -1
  151. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +1 -1
  152. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +3 -3
  153. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +23 -3
  154. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +1 -1
  155. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -0
  156. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +16 -2
  157. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +20 -4
  158. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +2 -0
  159. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +17 -0
  160. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +15 -0
  161. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +16 -0
  162. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +1 -1
  163. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +1 -1
  164. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +1 -1
  165. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +1 -1
  166. package/lib/bmad-cache/tea/test/test-installation-components.js +49 -0
  167. package/lib/bmad-cache/tea/website/astro.config.mjs +2 -2
  168. package/lib/bmad-cache/wds/README.md +1 -1
  169. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +52 -2
  170. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  171. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  172. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  173. package/lib/bmad-cache/wds/_git_preserved/objects/pack/{pack-96877c1c09123cccb1f91c1412184b11d2b492ad.pack → pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack} +0 -0
  174. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  175. package/lib/bmad-cache/wds/_git_preserved/packed-refs +1 -1
  176. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
  177. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +1 -0
  178. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
  179. package/lib/bmad-cache/wds/eslint.config.mjs +1 -1
  180. package/lib/bmad-cache/wds/package.json +1 -1
  181. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +80 -0
  182. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +52 -0
  183. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +70 -0
  184. package/lib/bmad-cache/wds/src/module-help.csv +19 -19
  185. package/lib/bmad-cache/wds/src/module.yaml +28 -0
  186. package/lib/bmad-cache/wds/src/scripts/README.md +155 -0
  187. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +202 -0
  188. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +158 -0
  189. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +229 -0
  190. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +120 -0
  191. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +201 -0
  192. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +301 -0
  193. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +450 -0
  194. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +387 -0
  195. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
  196. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
  197. package/lib/bmad.js +91 -7
  198. package/lib/installer.js +28 -6
  199. package/lib/mil498-templates/OCD.md +169 -169
  200. package/lib/mil498-templates/README.md +4 -4
  201. package/lib/mil498-templates/SDD.md +163 -163
  202. package/lib/mil498-templates/SDP.md +307 -307
  203. package/lib/mil498-templates/SRS.md +219 -219
  204. package/lib/mil498-templates/SSDD.md +154 -154
  205. package/lib/mil498-templates/SSS.md +225 -225
  206. package/lib/mil498-templates/STD.md +188 -188
  207. package/lib/templates/instruction-block-git.template.md +25 -0
  208. package/package.json +5 -4
  209. package/scripts/build-bmad-cache.js +143 -42
  210. package/skills/git-workflow-skill/skill.json +21 -21
  211. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
  212. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack +0 -0
  213. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
  214. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +0 -1
  215. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
  216. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
  217. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
  218. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
  219. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
  220. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
  221. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
  222. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
  223. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  224. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
  225. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
  226. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
  227. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
  228. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
  229. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
  230. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
  231. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
  232. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
  235. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
  236. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
  237. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
  238. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
  239. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
  240. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  241. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
  242. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
  243. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
  244. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
  245. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
  246. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
  247. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
  248. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
  249. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
  250. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
  251. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
  252. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
  253. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
  254. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
@@ -0,0 +1,287 @@
1
+ #!/usr/bin/env python3
2
+ """Deterministic extraction of report-data.json from analysis outputs.
3
+
4
+ Reads scanner outputs (markdown + JSON) and extracts structured data without
5
+ LLM synthesis. Ensures no data loss and completes in <10 seconds.
6
+
7
+ Usage:
8
+ python3 extract-report-json.py {skill-path} {quality-report-dir} -o {output-file}
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+ import json
15
+ import re
16
+ import sys
17
+ from datetime import datetime, timezone
18
+ from pathlib import Path
19
+
20
+
21
+ def extract_section(content: str, section_name: str, level: int = 2) -> str | None:
22
+ """Extract a section from markdown by heading name."""
23
+ pattern = r'^#{' + str(level) + r'}\s+' + re.escape(section_name) + r'\s*\n(.*?)(?=^#{1,' + str(level) + r'}\s|\Z)'
24
+ match = re.search(pattern, content, re.MULTILINE | re.DOTALL)
25
+ return match.group(1).strip() if match else None
26
+
27
+
28
+ def extract_journeys(content: str) -> list[dict]:
29
+ """Extract user journey archetypes from enhancement-analysis.md."""
30
+ journeys = []
31
+ # Match ### N. {Name}: {Description}
32
+ pattern = r'^###\s+\d+\.\s+([^:]+):\s+(.+?)(?=^###|\Z)'
33
+ for match in re.finditer(pattern, content, re.MULTILINE | re.DOTALL):
34
+ name = match.group(1).strip()
35
+ section = match.group(2)
36
+
37
+ # Extract narrative (after "Narrative." or "Narrative\n")
38
+ narrative_match = re.search(r'(?:Narrative[:.]\s*)?([^\n]+(?:\n[^*\n][^\n]*)*?)(?=\n\*\*|\n[A-Z])', section)
39
+ summary = narrative_match.group(1).strip() if narrative_match else ""
40
+
41
+ # Extract friction points
42
+ friction_points = []
43
+ friction_section = re.search(r'\*\*Friction points?[:\*]*\*\*\s*\n(.*?)(?=\n\*\*|\n[A-Z]|$)', section, re.DOTALL)
44
+ if friction_section:
45
+ for line in friction_section.group(1).split('\n'):
46
+ line = line.strip()
47
+ if line.startswith('- '):
48
+ friction_points.append(line[2:].strip())
49
+
50
+ # Extract bright spots
51
+ bright_spots = []
52
+ bright_section = re.search(r'\*\*Bright spots?[:\*]*\*\*\s*\n(.*?)(?=\n\*\*|\n[A-Z]|$)', section, re.DOTALL)
53
+ if bright_section:
54
+ for line in bright_section.group(1).split('\n'):
55
+ line = line.strip()
56
+ if line.startswith('- '):
57
+ bright_spots.append(line[2:].strip())
58
+
59
+ journeys.append({
60
+ 'archetype': name,
61
+ 'summary': summary,
62
+ 'friction_points': friction_points,
63
+ 'bright_spots': bright_spots
64
+ })
65
+
66
+ return journeys
67
+
68
+
69
+ def extract_autonomous(content: str) -> dict:
70
+ """Extract headless/automation assessment from enhancement-analysis.md."""
71
+ assessment_section = extract_section(content, 'Headless Assessment', level=2)
72
+ if not assessment_section:
73
+ return {}
74
+
75
+ # Look for "Current Level:" or "Potential:" pattern
76
+ potential_match = re.search(r'(?:Current Level|Potential)[:\*]*\s*([^\n.]+)', assessment_section)
77
+ potential = potential_match.group(1).strip() if potential_match else "unknown"
78
+
79
+ # Get the rest as notes
80
+ notes = assessment_section
81
+ if potential_match:
82
+ notes = assessment_section[potential_match.end():].strip()
83
+
84
+ return {
85
+ 'potential': potential,
86
+ 'notes': notes[:200] if notes else "" # Truncate to 200 chars
87
+ }
88
+
89
+
90
+ def extract_findings_from_md(content: str, source_scanner: str) -> list[dict]:
91
+ """Extract individual findings from analysis markdown.
92
+
93
+ Handles multiple formats:
94
+ - Architecture: level 4 headings under severity sections (### HIGH, etc)
95
+ - Determinism: bold headings with severity markers [HIGH], [LOW]
96
+ - Customization: bold headings with opportunity markers (HIGH-OPPORTUNITY, etc)
97
+ - Enhancement: numbered findings with severity/opportunity markers
98
+ """
99
+ findings = []
100
+
101
+ if source_scanner == 'architecture':
102
+ # Architecture format: ### SEVERITY followed by #### N. Title
103
+ severity_pattern = r'^###\s+(CRITICAL|HIGH|MEDIUM|LOW)\s*$'
104
+ severity_sections = re.split(severity_pattern, content, flags=re.MULTILINE)
105
+
106
+ for i in range(1, len(severity_sections), 2):
107
+ severity = severity_sections[i].lower() if i < len(severity_sections) else "medium"
108
+ section_content = severity_sections[i + 1] if i + 1 < len(severity_sections) else ""
109
+
110
+ if not section_content.strip() or section_content.strip() == "None":
111
+ continue
112
+
113
+ # Extract level 4 findings (#### N. Title)
114
+ finding_pattern = r'^####\s+(\d+\.\s+)?(.+?)$'
115
+ for match in re.finditer(finding_pattern, section_content, re.MULTILINE):
116
+ finding_title = match.group(2).strip()
117
+ if finding_title:
118
+ findings.append({
119
+ 'title': finding_title,
120
+ 'severity': severity,
121
+ 'source': source_scanner
122
+ })
123
+
124
+ elif source_scanner == 'determinism':
125
+ # Determinism format: ### **[SEVERITY] Title**
126
+ pattern = r'###\s+\*\*\[([A-Z]+)\]\s+([^*]+)\*\*'
127
+ for match in re.finditer(pattern, content, re.MULTILINE):
128
+ severity = match.group(1).lower()
129
+ title = match.group(2).strip()
130
+ if title:
131
+ findings.append({
132
+ 'title': title,
133
+ 'severity': severity,
134
+ 'source': source_scanner
135
+ })
136
+
137
+ elif source_scanner == 'customization':
138
+ # Customization format: ### N. **Title** (OPPORTUNITY-TYPE)
139
+ pattern = r'###\s+\d+\.\s+\*\*([^*]+)\*\*\s+\(([A-Z-]+)\)'
140
+ for match in re.finditer(pattern, content, re.MULTILINE):
141
+ title = match.group(1).strip()
142
+ opportunity = match.group(2).lower()
143
+ # Map opportunity to severity
144
+ severity = 'high' if 'high' in opportunity else 'medium' if 'medium' in opportunity else 'low'
145
+ if title:
146
+ findings.append({
147
+ 'title': title,
148
+ 'severity': severity,
149
+ 'source': source_scanner
150
+ })
151
+
152
+ elif source_scanner == 'enhancement':
153
+ # Enhancement format: ### LEVEL Findings section followed by #### N. Title
154
+ # Extract opportunity sections (HIGH-OPPORTUNITY, SECONDARY-OPPORTUNITY, etc)
155
+ opportunity_pattern = r'^###\s+([A-Z-]+)\s+(?:Findings|Opportunities?)'
156
+ opportunity_sections = re.split(opportunity_pattern, content, flags=re.MULTILINE)
157
+
158
+ for i in range(1, len(opportunity_sections), 2):
159
+ opportunity = opportunity_sections[i].lower() if i < len(opportunity_sections) else "medium"
160
+ section_content = opportunity_sections[i + 1] if i + 1 < len(opportunity_sections) else ""
161
+
162
+ if not section_content.strip():
163
+ continue
164
+
165
+ # Map opportunity to severity
166
+ severity = 'high' if 'high' in opportunity else 'medium' if 'secondary' in opportunity else 'low'
167
+
168
+ # Extract level 4 findings (#### N. Title)
169
+ finding_pattern = r'^####\s+(\d+\.\s+)?(.+?)$'
170
+ for match in re.finditer(finding_pattern, section_content, re.MULTILINE):
171
+ finding_title = match.group(2).strip()
172
+ if finding_title:
173
+ findings.append({
174
+ 'title': finding_title,
175
+ 'severity': severity,
176
+ 'source': source_scanner
177
+ })
178
+
179
+ return findings
180
+
181
+
182
+ def merge_prepass_data(report_dir: Path) -> dict:
183
+ """Load and merge all prepass JSON data."""
184
+ merged = {}
185
+
186
+ for json_file in report_dir.glob('*-prepass.json'):
187
+ try:
188
+ data = json.loads(json_file.read_text(encoding='utf-8'))
189
+ merged.update(data)
190
+ except Exception:
191
+ pass # Skip if not valid JSON
192
+
193
+ return merged
194
+
195
+
196
+ def build_report_json(skill_path: str, quality_report_dir: str) -> dict:
197
+ """Extract and build complete report-data.json."""
198
+ report_dir = Path(quality_report_dir)
199
+ skill_name = Path(skill_path).name
200
+ timestamp = datetime.now(timezone.utc).isoformat()
201
+
202
+ # Read all analysis files
203
+ architecture_content = (report_dir / 'architecture-analysis.md').read_text(encoding='utf-8') if (report_dir / 'architecture-analysis.md').exists() else ""
204
+ determinism_content = (report_dir / 'determinism-analysis.md').read_text(encoding='utf-8') if (report_dir / 'determinism-analysis.md').exists() else ""
205
+ customization_content = (report_dir / 'customization-analysis.md').read_text(encoding='utf-8') if (report_dir / 'customization-analysis.md').exists() else ""
206
+ enhancement_content = (report_dir / 'enhancement-analysis.md').read_text(encoding='utf-8') if (report_dir / 'enhancement-analysis.md').exists() else ""
207
+
208
+ # Extract assessments
209
+ arch_assessment = extract_section(architecture_content, 'Assessment', level=2) or ""
210
+ det_assessment = extract_section(determinism_content, 'Assessment', level=2) or ""
211
+ cust_assessment = extract_section(customization_content, 'Overall Assessment', level=2) or ""
212
+ enh_assessment = extract_section(enhancement_content, 'Summary', level=2) or ""
213
+
214
+ # Extract journeys and autonomous from enhancement
215
+ journeys = extract_journeys(enhancement_content)
216
+ autonomous = extract_autonomous(enhancement_content)
217
+
218
+ # Build detailed_analysis
219
+ detailed_analysis = {
220
+ 'architecture': {
221
+ 'assessment': arch_assessment[:500], # First 500 chars
222
+ 'findings': extract_findings_from_md(architecture_content, 'architecture')
223
+ },
224
+ 'determinism': {
225
+ 'assessment': det_assessment[:500],
226
+ 'findings': extract_findings_from_md(determinism_content, 'determinism')
227
+ },
228
+ 'customization': {
229
+ 'assessment': cust_assessment[:500],
230
+ 'posture': 'not-opted-in', # From content
231
+ 'findings': extract_findings_from_md(customization_content, 'customization')
232
+ },
233
+ 'enhancement': {
234
+ 'assessment': enh_assessment[:500],
235
+ 'journeys': journeys,
236
+ 'autonomous': autonomous,
237
+ 'findings': extract_findings_from_md(enhancement_content, 'enhancement')
238
+ }
239
+ }
240
+
241
+ # Build basic structure - minimal for now, will be expanded by report creator if needed
242
+ report_data = {
243
+ 'meta': {
244
+ 'skill_name': skill_name,
245
+ 'skill_path': skill_path,
246
+ 'timestamp': timestamp,
247
+ 'scanner_count': 4
248
+ },
249
+ 'narrative': enh_assessment[:150] if enh_assessment else "", # Placeholder
250
+ 'grade': 'Good', # Placeholder - report creator sets this
251
+ 'broken': [],
252
+ 'opportunities': [],
253
+ 'strengths': [],
254
+ 'recommendations': [],
255
+ 'detailed_analysis': detailed_analysis
256
+ }
257
+
258
+ return report_data
259
+
260
+
261
+ def main():
262
+ parser = argparse.ArgumentParser(description='Extract report-data.json from analysis outputs')
263
+ parser.add_argument('skill_path', help='Path to the skill being analyzed')
264
+ parser.add_argument('quality_report_dir', help='Directory with analysis outputs and where to write report')
265
+ parser.add_argument('-o', '--output', help='Output file path (default: {quality_report_dir}/report-data.json)')
266
+
267
+ args = parser.parse_args()
268
+
269
+ output_path = args.output or str(Path(args.quality_report_dir) / 'report-data.json')
270
+
271
+ try:
272
+ report_json = build_report_json(args.skill_path, args.quality_report_dir)
273
+
274
+ # Write output
275
+ output_file = Path(output_path)
276
+ output_file.write_text(json.dumps(report_json, indent=2, ensure_ascii=False), encoding='utf-8')
277
+
278
+ print(f'Report JSON written to {output_path}', file=sys.stderr)
279
+ print(json.dumps({'status': 'success', 'output': output_path}, indent=2))
280
+
281
+ except Exception as e:
282
+ print(f'Error: {e}', file=sys.stderr)
283
+ sys.exit(1)
284
+
285
+
286
+ if __name__ == '__main__':
287
+ main()
@@ -179,6 +179,7 @@ h1 { font-size: 1.5rem; margin-bottom: 0.25rem; }
179
179
  <div id="broken-section"></div>
180
180
  <div id="opportunities-section"></div>
181
181
  <div id="strengths-section"></div>
182
+ <div id="user-experience-section"></div>
182
183
  <div id="recommendations-section"></div>
183
184
  <div id="detailed-section"></div>
184
185
 
@@ -227,8 +228,10 @@ function normalize(d) {
227
228
  r.rank = r.rank || i + 1;
228
229
  });
229
230
  // Fix journeys: persona→archetype, friction→friction_points
230
- if (d.detailed_analysis && d.detailed_analysis.experience) {
231
- d.detailed_analysis.experience.journeys = (d.detailed_analysis.experience.journeys || []).map(j => ({
231
+ // Accept both `enhancement` (new) and `experience` (legacy) section keys
232
+ const expSection = d.detailed_analysis && (d.detailed_analysis.enhancement || d.detailed_analysis.experience);
233
+ if (expSection) {
234
+ expSection.journeys = (expSection.journeys || []).map(j => ({
232
235
  archetype: j.archetype || j.persona || j.name || 'Unknown',
233
236
  summary: j.summary || j.journey_summary || j.description || j.friction || '',
234
237
  friction_points: j.friction_points || (j.friction ? [j.friction] : []),
@@ -258,6 +261,7 @@ function init() {
258
261
  renderBroken();
259
262
  renderOpportunities();
260
263
  renderStrengths();
264
+ renderUserExperience();
261
265
  renderRecommendations();
262
266
  renderDetailed();
263
267
  }
@@ -348,16 +352,61 @@ function renderRecommendations() {
348
352
  document.getElementById('recommendations-section').innerHTML = html;
349
353
  }
350
354
 
355
+ function renderUserExperience() {
356
+ const ux = DATA.detailed_analysis && DATA.detailed_analysis.enhancement;
357
+ if (!ux) return;
358
+ let html = `<div class="section"><div class="section-header open" onclick="toggleSection(this)">`;
359
+ html += `<span class="arrow">&#9654;</span><span class="label">User Experience</span>`;
360
+ html += `</div><div class="section-body open">`;
361
+ if (ux.assessment) html += `<p>${esc(ux.assessment)}</p>`;
362
+ if (ux.journeys && ux.journeys.length) {
363
+ html += `<div style="margin:1rem 0"><strong>User Journeys:</strong></div>`;
364
+ ux.journeys.forEach(j => {
365
+ html += `<div style="margin:0.75rem 0;padding:0.75rem;border-left:3px solid var(--accent);background:var(--surface2);">`;
366
+ html += `<div style="font-weight:600;margin-bottom:0.5rem">${esc(j.archetype)}</div>`;
367
+ html += `<p style="margin:0 0 0.5rem 0;font-size:0.95rem">${esc(j.summary || '')}</p>`;
368
+ if (j.friction_points && j.friction_points.length) {
369
+ html += `<div style="color:var(--high);font-size:0.85rem;margin:0.25rem 0"><strong>Friction Points:</strong></div>`;
370
+ html += `<ul style="margin:0.25rem 0 0.5rem 1.25rem;color:var(--high);font-size:0.85rem">`;
371
+ j.friction_points.forEach(fp => { html += `<li>${esc(fp)}</li>`; });
372
+ html += `</ul>`;
373
+ }
374
+ if (j.bright_spots && j.bright_spots.length) {
375
+ html += `<div style="color:var(--strength);font-size:0.85rem;margin:0.25rem 0"><strong>Bright Spots:</strong></div>`;
376
+ html += `<ul style="margin:0.25rem 0 0 1.25rem;color:var(--strength);font-size:0.85rem">`;
377
+ j.bright_spots.forEach(bs => { html += `<li>${esc(bs)}</li>`; });
378
+ html += `</ul>`;
379
+ }
380
+ html += `</div>`;
381
+ });
382
+ }
383
+ if (ux.autonomous) {
384
+ const a = ux.autonomous;
385
+ html += `<div style="margin:1rem 0;padding:0.75rem;background:var(--surface2);border-left:3px solid var(--suggestion);">`;
386
+ html += `<div style="font-weight:600;margin-bottom:0.5rem">Headless / Automation Potential</div>`;
387
+ html += `<div><strong>${esc(a.potential || '')}</strong>`;
388
+ if (a.notes) html += `: ${esc(a.notes)}`;
389
+ html += `</div></div>`;
390
+ }
391
+ (ux.findings || []).forEach(f => {
392
+ const loc = f.file ? `${f.file}${f.line ? ':'+f.line : ''}` : '';
393
+ html += `<div class="analysis-finding">`;
394
+ if (f.severity) html += `<span class="badge badge-${f.severity}">${esc(f.severity)}</span> `;
395
+ html += `${esc(f.title)}`;
396
+ if (loc) html += ` <span class="item-file">${esc(loc)}</span>`;
397
+ html += `</div>`;
398
+ });
399
+ html += `</div></div>`;
400
+ document.getElementById('user-experience-section').innerHTML = html;
401
+ }
402
+
351
403
  function renderDetailed() {
352
404
  const da = DATA.detailed_analysis;
353
405
  if (!da) return;
354
406
  const dims = [
355
- ['structure', 'Structure & Integrity'],
356
- ['craft', 'Craft & Writing Quality'],
357
- ['cohesion', 'Cohesion & Design'],
358
- ['efficiency', 'Execution Efficiency'],
359
- ['experience', 'User Experience'],
360
- ['scripts', 'Script Opportunities']
407
+ ['architecture', 'Architecture (Structure, Craft, Cohesion)'],
408
+ ['determinism', 'Determinism & Distribution'],
409
+ ['customization', 'Customization Surface']
361
410
  ];
362
411
  let html = `<div class="section"><div class="section-header" onclick="toggleSection(this)">`;
363
412
  html += `<span class="arrow">&#9654;</span><span class="label">Detailed Analysis</span>`;
@@ -193,14 +193,14 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
193
193
  data['is_skill_md'] = False
194
194
  files_data.append(data)
195
195
 
196
- # Resources (just sizes, for progressive disclosure assessment)
197
- resources_dir = skill_path / 'resources'
198
- resource_sizes = {}
199
- if resources_dir.exists():
200
- for f in sorted(resources_dir.iterdir()):
196
+ # References (just sizes, for progressive disclosure assessment)
197
+ references_dir = skill_path / 'references'
198
+ reference_sizes = {}
199
+ if references_dir.exists():
200
+ for f in sorted(references_dir.iterdir()):
201
201
  if f.is_file() and f.suffix in ('.md', '.json', '.yaml', '.yml'):
202
202
  content = f.read_text(encoding='utf-8')
203
- resource_sizes[f.name] = {
203
+ reference_sizes[f.name] = {
204
204
  'lines': len(content.split('\n')),
205
205
  'tokens': len(content) // 4,
206
206
  }
@@ -243,7 +243,7 @@ def scan_prompt_metrics(skill_path: Path) -> dict:
243
243
  'total_waste_patterns': total_waste,
244
244
  'total_back_references': total_backrefs,
245
245
  },
246
- 'resource_sizes': resource_sizes,
246
+ 'reference_sizes': reference_sizes,
247
247
  'files': files_data,
248
248
  }
249
249
 
@@ -1,4 +1,4 @@
1
- module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs
1
+ module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
2
2
  BMad Builder,_meta,,,,,,,,,false,https://bmad-builder-docs.bmad-method.org/llms.txt,
3
3
  BMad Builder,bmad-bmb-setup,Setup Builder Module,SB,"Install or update BMad Builder module config and help entries.",configure,"{-H: headless mode}|{inline values: skip prompts with provided values}",anytime,,,false,{project-root}/_bmad,config.yaml and config.user.yaml
4
4
  BMad Builder,bmad-agent-builder,Build an Agent,BA,"Create, edit, or rebuild an agent skill through conversational discovery.",build-process,"{-H: headless mode}|{description: initial agent concept}|{path: existing agent to edit or rebuild}",anytime,,bmad-agent-builder:quality-analysis,false,bmad_builder_output_folder,agent skill
@@ -1,38 +1,37 @@
1
1
  {
2
- "generated": "2026-05-01T12:48:59.888Z",
3
- "bmadMethodVersion": "6.6.0",
4
- "registrySchema": "v63",
2
+ "generated": "2026-06-13T15:11:45.601Z",
3
+ "bmadMethodVersion": "6.8.0",
4
+ "registrySchema": "package-root-v68",
5
5
  "modules": {
6
+ "tea": {
7
+ "url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
8
+ "branch": "main",
9
+ "commitSha": "8734d51f24071ddbcb3617390b5fcddb4128ef77",
10
+ "clonedAt": "2026-06-13T15:11:39.614Z"
11
+ },
6
12
  "bmb": {
7
13
  "url": "https://github.com/bmad-code-org/bmad-builder",
8
14
  "branch": "main",
9
- "commitSha": "86033fc9aeae2ca6d52c7cdb675c1f4bf17fc1c1",
10
- "clonedAt": "2026-04-23T17:33:49.456Z"
15
+ "commitSha": "7cfa7711778f04c5df56f7ae895fabc942fd920c",
16
+ "clonedAt": "2026-06-13T15:11:41.069Z"
11
17
  },
12
18
  "cis": {
13
19
  "url": "https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite",
14
20
  "branch": "main",
15
- "commitSha": "c2ad6c49b311651b0fa1d243f74d87e85167171f",
16
- "clonedAt": "2026-05-01T12:48:43.446Z"
21
+ "commitSha": "07a8dd03d196a762f21c241d985293fe5b0f90e7",
22
+ "clonedAt": "2026-06-13T15:11:42.507Z"
17
23
  },
18
24
  "gds": {
19
25
  "url": "https://github.com/bmad-code-org/bmad-module-game-dev-studio.git",
20
26
  "branch": "main",
21
- "commitSha": "943bd180af9ad7204b9b11f582fbd31225aa8534",
22
- "clonedAt": "2026-05-01T12:48:47.339Z"
23
- },
24
- "tea": {
25
- "url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
26
- "branch": "main",
27
- "commitSha": "b0ee2a5128d0f0b9f32c30a0017722a846518349",
28
- "clonedAt": "2026-05-01T12:48:59.888Z"
27
+ "commitSha": "46c3a6cddf882af1f918187d6e5748c1edfd9c52",
28
+ "clonedAt": "2026-06-13T15:11:43.930Z"
29
29
  },
30
30
  "wds": {
31
31
  "url": "https://github.com/bmad-code-org/bmad-method-wds-expansion",
32
32
  "branch": "main",
33
- "commitSha": "430c824ffe3845b2211d7a36707c66abe1b20b8c",
34
- "clonedAt": "2026-04-08T10:04:51.323Z",
35
- "retiredUpstream": true
33
+ "commitSha": "cc16f09fcfab26d35635af1491f36a38a8431c8d",
34
+ "clonedAt": "2026-06-13T15:11:45.601Z"
36
35
  }
37
36
  }
38
37
  }
@@ -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
- c2ad6c49b311651b0fa1d243f74d87e85167171f refs/remotes/origin/main
2
+ 07a8dd03d196a762f21c241d985293fe5b0f90e7 refs/remotes/origin/main
@@ -1 +1 @@
1
- c2ad6c49b311651b0fa1d243f74d87e85167171f
1
+ 07a8dd03d196a762f21c241d985293fe5b0f90e7
@@ -0,0 +1 @@
1
+ 8d7511f8945632987feb14819bddad309df22250
@@ -1 +1 @@
1
- c2ad6c49b311651b0fa1d243f74d87e85167171f
1
+ 07a8dd03d196a762f21c241d985293fe5b0f90e7
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "bmad-creative-intelligence-suite",
3
- "version": "0.1.9",
3
+ "version": "0.2.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "bmad-creative-intelligence-suite",
9
- "version": "0.1.9",
9
+ "version": "0.2.1",
10
10
  "license": "MIT",
11
11
  "devDependencies": {
12
12
  "@astrojs/sitemap": "^3.6.0",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "bmad-creative-intelligence-suite",
4
- "version": "0.2.0",
4
+ "version": "0.2.1",
5
5
  "private": true,
6
6
  "description": "A BMad MEthod Core Module that offers a suite of very creative agents and workflows",
7
7
  "keywords": [
@@ -1,4 +1,4 @@
1
- module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs
1
+ module,skill,display-name,menu-code,description,action,args,phase,preceded-by,followed-by,required,output-location,outputs
2
2
  Creative Intelligence Suite,_meta,,,,,,,,,false,https://cis-docs.bmad-method.org/llms.txt,
3
3
  Creative Intelligence Suite,bmad-cis-innovation-strategy,Innovation Strategy,IS,Identify disruption opportunities and architect business model innovation.,,,anytime,,,false,output_folder,innovation strategy
4
4
  Creative Intelligence Suite,bmad-cis-problem-solving,Problem Solving,PS,Apply systematic problem-solving methodologies to crack complex challenges.,,,anytime,,,false,output_folder,problem solution