ma-agents 3.12.2 → 3.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/bin/cli.js +11 -6
  2. package/docs/architecture.md +18 -0
  3. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +1 -1
  4. package/lib/bmad-cache/bmb/_git_preserved/hooks/commit-msg.sample +52 -2
  5. package/lib/bmad-cache/bmb/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  6. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  7. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.idx +0 -0
  8. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.pack +0 -0
  9. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-8f8b045fef5af6911495cf3b2a89f1ed75e120f7.rev +0 -0
  10. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  11. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  12. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  13. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  14. package/lib/bmad-cache/bmb/package.json +1 -1
  15. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/assets/module-help.csv +1 -1
  16. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-config.py +33 -0
  17. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/scripts/merge-help-csv.py +28 -0
  18. package/lib/bmad-cache/bmb/samples/sample-module-setup/assets/module-help.csv +1 -1
  19. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/cleanup-legacy.py +28 -0
  20. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-config.py +33 -0
  21. package/lib/bmad-cache/bmb/samples/sample-module-setup/scripts/merge-help-csv.py +28 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/assets/module-help.csv +1 -1
  23. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/cleanup-legacy.py +28 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-config.py +33 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-bmb-setup/scripts/merge-help-csv.py +28 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/assets/Dockerfile +29 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/docker_setup.py +115 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/generate_report.py +184 -0
  29. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/pty_runner.py +171 -0
  30. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_evals.py +492 -0
  31. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/run_triggers.py +366 -0
  32. package/lib/bmad-cache/bmb/skills/bmad-eval-runner/scripts/utils.py +260 -0
  33. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/assets/module-help.csv +1 -1
  34. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/cleanup-legacy.py +28 -0
  35. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-config.py +33 -0
  36. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/setup-skill-template/scripts/merge-help-csv.py +28 -0
  37. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-config.py +33 -0
  38. package/lib/bmad-cache/bmb/skills/bmad-module-builder/assets/standalone-module-template/merge-help-csv.py +28 -0
  39. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/tests/test-validate-module.py +74 -1
  40. package/lib/bmad-cache/bmb/skills/bmad-module-builder/scripts/validate-module.py +24 -13
  41. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/assets/sample-customize-product-brief.toml +48 -33
  42. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/extract-report-json.py +287 -0
  43. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +57 -8
  44. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +7 -7
  45. package/lib/bmad-cache/bmb/skills/module-help.csv +1 -1
  46. package/lib/bmad-cache/bmb/website/public/img/eval-test-types.png +0 -0
  47. package/lib/bmad-cache/cache-manifest.json +17 -18
  48. package/lib/bmad-cache/cis/_git_preserved/hooks/commit-msg.sample +52 -2
  49. package/lib/bmad-cache/cis/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  50. package/lib/bmad-cache/cis/_git_preserved/index +0 -0
  51. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.idx +0 -0
  52. package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.pack → pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.pack} +0 -0
  53. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-18c8290560a98bcb7bf0676e6cc9b2ac5ca2823e.rev +0 -0
  54. package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
  55. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  56. package/lib/bmad-cache/cis/_git_preserved/refs/tags/v0.2.1 +1 -0
  57. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  58. package/lib/bmad-cache/cis/package-lock.json +2 -2
  59. package/lib/bmad-cache/cis/package.json +1 -1
  60. package/lib/bmad-cache/cis/src/module-help.csv +1 -1
  61. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +4 -7
  62. package/lib/bmad-cache/gds/README.md +3 -1
  63. package/lib/bmad-cache/gds/_git_preserved/hooks/commit-msg.sample +52 -2
  64. package/lib/bmad-cache/gds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  65. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  66. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.idx +0 -0
  67. package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-9427a146a90c00bb542cba038874bf9671ba4dc0.pack → pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.pack} +0 -0
  68. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-dcb7c556d9bb6b6b70d2301e094eaac6d7300552.rev +0 -0
  69. package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
  70. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  71. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  72. package/lib/bmad-cache/gds/package.json +1 -1
  73. package/lib/bmad-cache/gds/src/agents/gds-agent-game-designer/customize.toml +5 -5
  74. package/lib/bmad-cache/gds/src/agents/gds-agent-game-dev/customize.toml +5 -5
  75. package/lib/bmad-cache/gds/src/agents/gds-agent-game-solo-dev/customize.toml +0 -5
  76. package/lib/bmad-cache/gds/src/module-help.csv +6 -12
  77. package/lib/bmad-cache/gds/src/module.yaml +1 -1
  78. package/lib/bmad-cache/gds/src/workflows/1-preproduction/gds-create-game-brief/customize.toml +97 -22
  79. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/assets/validation-report-template.html +190 -0
  80. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/customize.toml +99 -0
  81. package/lib/bmad-cache/gds/src/workflows/2-design/gds-gdd/scripts/render-validation-html.py +290 -0
  82. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/assets/validation-report-template.html +190 -0
  83. package/lib/bmad-cache/gds/src/workflows/2-design/gds-prd/customize.toml +84 -0
  84. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/assets/validation-report-template.html +319 -0
  85. package/lib/bmad-cache/gds/src/workflows/2-design/gds-ux/customize.toml +101 -0
  86. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/architecture-patterns.yaml +1 -0
  87. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/decision-catalog.yaml +88 -0
  88. package/lib/bmad-cache/gds/src/workflows/3-technical/gds-game-architecture/engine-mcps.yaml +124 -2
  89. package/lib/bmad-cache/gds/src/workflows/4-production/gds-investigate/customize.toml +62 -0
  90. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +1 -1
  91. package/lib/bmad-cache/tea/.github/workflows/docs.yaml +3 -3
  92. package/lib/bmad-cache/tea/.github/workflows/quality.yaml +10 -10
  93. package/lib/bmad-cache/tea/AGENTS.md +31 -0
  94. package/lib/bmad-cache/tea/CHANGELOG.md +42 -1
  95. package/lib/bmad-cache/tea/README.md +8 -5
  96. package/lib/bmad-cache/tea/_git_preserved/hooks/commit-msg.sample +52 -2
  97. package/lib/bmad-cache/tea/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  98. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  99. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.idx +0 -0
  100. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-f0df537f2649464ff6c5aee241165eb9c8664227.pack → pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.pack} +0 -0
  101. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-9e4197e37df7763dd7a05c2965ee921dfd2eb617.rev +0 -0
  102. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  103. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  104. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.19.0 +1 -0
  105. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  106. package/lib/bmad-cache/tea/docs/explanation/engagement-models.md +15 -16
  107. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +2 -0
  108. package/lib/bmad-cache/tea/docs/explanation/risk-based-testing.md +1 -1
  109. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +88 -52
  110. package/lib/bmad-cache/tea/docs/explanation/testing-as-engineering.md +13 -12
  111. package/lib/bmad-cache/tea/docs/glossary/index.md +2 -2
  112. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-for-enterprise.md +19 -18
  113. package/lib/bmad-cache/tea/docs/how-to/brownfield/use-tea-with-existing-tests.md +1 -1
  114. package/lib/bmad-cache/tea/docs/how-to/workflows/run-nfr-assess.md +32 -26
  115. package/lib/bmad-cache/tea/docs/how-to/workflows/run-test-design.md +20 -14
  116. package/lib/bmad-cache/tea/docs/how-to/workflows/run-trace.md +3 -3
  117. package/lib/bmad-cache/tea/docs/index.md +13 -11
  118. package/lib/bmad-cache/tea/docs/reference/commands.md +37 -13
  119. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +2 -2
  120. package/lib/bmad-cache/tea/package-lock.json +2 -2
  121. package/lib/bmad-cache/tea/package.json +1 -1
  122. package/lib/bmad-cache/tea/src/agents/bmad-tea/customize.toml +20 -15
  123. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/confidence-gate.md +73 -0
  124. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/knowledge/test-quality.md +1 -0
  125. package/lib/bmad-cache/tea/src/agents/bmad-tea/resources/tea-index.csv +2 -1
  126. package/lib/bmad-cache/tea/src/module-help.csv +2 -2
  127. package/lib/bmad-cache/tea/src/workflows/testarch/README.md +5 -4
  128. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/role-paths.yaml +1 -1
  129. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +1 -1
  130. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +2 -2
  131. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +1 -1
  132. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +1 -1
  133. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/resources/tea-index.csv +1 -1
  134. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/resources/tea-index.csv +1 -1
  135. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/resources/tea-index.csv +1 -1
  136. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/resources/tea-index.csv +1 -1
  137. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/SKILL.md +3 -3
  138. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/checklist.md +11 -11
  139. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/instructions.md +4 -2
  140. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/nfr-report-template.md +5 -5
  141. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/resources/tea-index.csv +1 -1
  142. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
  143. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01b-resume.md +1 -1
  144. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-02-define-thresholds.md +14 -3
  145. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04-evaluate-and-score.md +7 -7
  146. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04a-subagent-security.md +4 -4
  147. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04b-subagent-performance.md +4 -4
  148. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04c-subagent-reliability.md +4 -4
  149. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04d-subagent-scalability.md +4 -4
  150. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-04e-aggregate-nfr.md +4 -4
  151. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-05-generate-report.md +1 -1
  152. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow-plan.md +1 -1
  153. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/workflow.yaml +3 -3
  154. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/checklist.md +23 -3
  155. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/resources/tea-index.csv +1 -1
  156. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +7 -0
  157. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-03-risk-and-testability.md +16 -2
  158. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-04-coverage-plan.md +20 -4
  159. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-05-generate-output.md +2 -0
  160. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-architecture-template.md +17 -0
  161. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-qa-template.md +15 -0
  162. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/test-design-template.md +16 -0
  163. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/resources/tea-index.csv +1 -1
  164. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/checklist.md +1 -1
  165. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/resources/tea-index.csv +1 -1
  166. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/trace-template.md +1 -1
  167. package/lib/bmad-cache/tea/test/test-installation-components.js +49 -0
  168. package/lib/bmad-cache/tea/website/astro.config.mjs +2 -2
  169. package/lib/bmad-cache/wds/README.md +1 -1
  170. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +52 -2
  171. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +2 -8
  172. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  173. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.idx +0 -0
  174. package/lib/bmad-cache/wds/_git_preserved/objects/pack/{pack-96877c1c09123cccb1f91c1412184b11d2b492ad.pack → pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.pack} +0 -0
  175. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-656c3d8d5426e73043b6a7f45eedaab74e3c419e.rev +0 -0
  176. package/lib/bmad-cache/wds/_git_preserved/packed-refs +1 -1
  177. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -1
  178. package/lib/bmad-cache/wds/_git_preserved/refs/tags/v0.4.3 +1 -0
  179. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -1
  180. package/lib/bmad-cache/wds/eslint.config.mjs +1 -1
  181. package/lib/bmad-cache/wds/package.json +1 -1
  182. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/customize.toml +80 -0
  183. package/lib/bmad-cache/wds/src/agents/wds-agent-mimir-builder/customize.toml +52 -0
  184. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/customize.toml +70 -0
  185. package/lib/bmad-cache/wds/src/module-help.csv +19 -19
  186. package/lib/bmad-cache/wds/src/module.yaml +28 -0
  187. package/lib/bmad-cache/wds/src/scripts/README.md +155 -0
  188. package/lib/bmad-cache/wds/src/scripts/wds-add-object.js +202 -0
  189. package/lib/bmad-cache/wds/src/scripts/wds-add-spacing.js +158 -0
  190. package/lib/bmad-cache/wds/src/scripts/wds-init-page.js +229 -0
  191. package/lib/bmad-cache/wds/src/scripts/wds-init-scenario.js +120 -0
  192. package/lib/bmad-cache/wds/src/scripts/wds-nav.js +201 -0
  193. package/lib/bmad-cache/wds/src/scripts/wds-validate.js +301 -0
  194. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/workflow.xml +450 -0
  195. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/workflow-specify.xml +387 -0
  196. package/lib/bmad-extension/.claude-plugin/marketplace.json.template +1 -1
  197. package/lib/bmad-extension-plugin/.claude-plugin/marketplace.json +2 -2
  198. package/lib/bmad.js +91 -7
  199. package/lib/installer.js +28 -6
  200. package/lib/mil498-templates/OCD.md +169 -169
  201. package/lib/mil498-templates/README.md +4 -4
  202. package/lib/mil498-templates/SDD.md +163 -163
  203. package/lib/mil498-templates/SDP.md +307 -307
  204. package/lib/mil498-templates/SRS.md +219 -219
  205. package/lib/mil498-templates/SSDD.md +154 -154
  206. package/lib/mil498-templates/SSS.md +225 -225
  207. package/lib/mil498-templates/STD.md +188 -188
  208. package/lib/templates/instruction-block-git.template.md +25 -0
  209. package/package.json +5 -4
  210. package/scripts/build-bmad-cache.js +143 -42
  211. package/skills/git-workflow-skill/skill.json +21 -21
  212. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.idx +0 -0
  213. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.pack +0 -0
  214. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-6ecd9fc6445b1281449c5ec49a6c5794708e662e.rev +0 -0
  215. package/lib/bmad-cache/bmb/_git_preserved/refs/remotes/origin/HEAD +0 -1
  216. package/lib/bmad-cache/bmb/_git_preserved/refs/tags/v1.7.0 +0 -1
  217. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-convert-report.py +0 -406
  218. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/tests/test_generate_convert_report.py +0 -243
  219. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.idx +0 -0
  220. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-42ffc048f54e58ce94c6331bc6be97ebbb7936f2.rev +0 -0
  221. package/lib/bmad-cache/cis/_git_preserved/refs/remotes/origin/HEAD +0 -1
  222. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.idx +0 -0
  223. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-9427a146a90c00bb542cba038874bf9671ba4dc0.rev +0 -0
  224. package/lib/bmad-cache/gds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  225. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-gdd/customize.toml +0 -41
  226. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/customize.toml +0 -41
  227. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/domain-complexity.csv +0 -15
  228. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-prd/data/project-types.csv +0 -11
  229. package/lib/bmad-cache/gds/src/workflows/2-design/gds-create-ux-design/customize.toml +0 -41
  230. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-gdd/customize.toml +0 -41
  231. package/lib/bmad-cache/gds/src/workflows/2-design/gds-edit-prd/customize.toml +0 -41
  232. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-gdd/customize.toml +0 -41
  233. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/customize.toml +0 -41
  234. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/domain-complexity.csv +0 -15
  235. package/lib/bmad-cache/gds/src/workflows/2-design/gds-validate-prd/data/project-types.csv +0 -11
  236. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.idx +0 -0
  237. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-f0df537f2649464ff6c5aee241165eb9c8664227.rev +0 -0
  238. package/lib/bmad-cache/tea/_git_preserved/refs/remotes/origin/HEAD +0 -1
  239. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.idx +0 -0
  240. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-96877c1c09123cccb1f91c1412184b11d2b492ad.rev +0 -0
  241. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +0 -1
  242. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +0 -12
  243. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +0 -12
  244. package/lib/bmad-cache/wds/src/workflows/wds-0-alignment-signoff/bmad-skill-manifest.yaml +0 -1
  245. package/lib/bmad-cache/wds/src/workflows/wds-0-project-setup/bmad-skill-manifest.yaml +0 -1
  246. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +0 -1
  247. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +0 -1
  248. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +0 -1
  249. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +0 -1
  250. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +0 -1
  251. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +0 -1
  252. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +0 -1
  253. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +0 -1
  254. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-create-gdd → gds-gdd/assets}/game-types.csv +0 -0
  255. /package/lib/bmad-cache/gds/src/workflows/2-design/{gds-validate-gdd/data → gds-gdd/assets}/genre-complexity.csv +0 -0
@@ -0,0 +1,387 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <workflow id="wds-4-specify" name="WDS Phase 4 — Specify Page" version="1.0">
3
+ <description>
4
+ Create a complete, implementation-ready page specification: layout, components with Object IDs,
5
+ multilingual content, interactions, states, validation, spacing, and typography.
6
+ All 9 steps must be completed in sequence before the specification is considered done.
7
+ Validation runs at step 9 before the spec is written to disk.
8
+ </description>
9
+
10
+ <prerequisites>
11
+ <require file="{output_folder}/C-UX-Scenarios/{scenario-slug}/{scenario-slug}.md" label="Scenario outline"/>
12
+ <require file="{output_folder}/C-UX-Scenarios/{scenario-slug}/pages/{NN}.{step}-{page-slug}/" label="Page folder from Phase 3 or design activity"/>
13
+ <require file="{output_folder}/_progress/00-design-log.md" label="Design log"/>
14
+ </prerequisites>
15
+
16
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
17
+ <!-- INITIALIZATION — runs before step 1 -->
18
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
19
+
20
+ <initialization>
21
+ <instruction>
22
+ Read the design log at {output_folder}/_progress/00-design-log.md before starting.
23
+ Check Current table for any in-progress work from a previous session.
24
+ </instruction>
25
+ <instruction>
26
+ Load page context from the existing page folder:
27
+ {output_folder}/C-UX-Scenarios/[NN-slug]/pages/[NN].[step]-[page-slug]/
28
+ The page boilerplate created in Phase 3 contains scenario, page number, platform,
29
+ page purpose, entry context, exit action, and on-page interactions.
30
+ </instruction>
31
+ <instruction>
32
+ Update the design log Current table: add this page with status "specifying".
33
+ </instruction>
34
+ <gate type="file-exists" path="{output_folder}/C-UX-Scenarios/{scenario-slug}/{scenario-slug}.md"
35
+ failure-message="Scenario outline must exist. Select a scenario from the design log before running Specify."/>
36
+ <gate type="folder-exists" path="{output_folder}/C-UX-Scenarios/{scenario-slug}/pages/{NN}.{step}-{page-slug}/"
37
+ failure-message="Page folder must exist. Run Phase 3 or a design activity (Suggest/Dream) to create the page structure before specifying."/>
38
+ </initialization>
39
+
40
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
41
+ <!-- STEP 1 — Page Basics -->
42
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
43
+
44
+ <step id="1-page-basics" name="Capture page metadata and entry/exit points" step-file="steps-p/step-01-page-basics.md">
45
+ <instruction>
46
+ Present the page basics form to the user and collect all required fields:
47
+ - Page name/title
48
+ - URL/route (if applicable)
49
+ - Main user goal (one sentence)
50
+ - Entry points (where users come from)
51
+ - Exit points (where users go next)
52
+
53
+ For public pages, also collect SEO data — check the project brief's SEO Strategy for target keywords:
54
+ - Primary keyword
55
+ - Secondary keywords
56
+ - URL slug (from keyword map)
57
+ </instruction>
58
+ <instruction>
59
+ Store all captured values as page_basics:
60
+ page_title, url_route, user_goal, entry_points, exit_points,
61
+ primary_keyword (public pages), secondary_keywords (public pages), url_slug (public pages).
62
+ </instruction>
63
+
64
+ <gate type="data-captured" required="page_title url_route user_goal entry_points exit_points"
65
+ failure-message="All basic page fields must be captured before proceeding. Do not skip any field."/>
66
+ <gate type="seo-data-captured" condition="page-is-public"
67
+ required="primary_keyword secondary_keywords url_slug"
68
+ failure-message="SEO data is mandatory for public pages. Check the project brief's SEO Strategy section."/>
69
+ <gate type="user-confirms" prompt="All page basics captured and confirmed by user?"/>
70
+
71
+ <output>page_basics stored — title, route, goal, entry/exit points, and SEO data (if public page).</output>
72
+ </step>
73
+
74
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
75
+ <!-- STEP 2 — Layout Sections -->
76
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
77
+
78
+ <step id="2-layout-sections" name="Define major page sections" step-file="steps-p/step-02-layout-sections.md">
79
+ <instruction>
80
+ Ask the user to describe the major areas of the page (header, hero, main content, sidebar,
81
+ footer, etc.). Do not define individual components yet — only high-level sections.
82
+ </instruction>
83
+ <instruction>
84
+ For each section described, store:
85
+ - section_name
86
+ - section_purpose
87
+ - section_priority (primary / secondary)
88
+ </instruction>
89
+ <instruction>
90
+ Confirm the section list with the user before proceeding.
91
+ </instruction>
92
+
93
+ <gate type="data-captured" required="layout_sections" minimum-count="1"
94
+ failure-message="At least one layout section must be defined. Do not proceed to components without a section structure."/>
95
+ <gate type="section-attributes-complete" required-per-section="name purpose priority"
96
+ failure-message="Each section must have a name, purpose, and priority before proceeding."/>
97
+ <gate type="user-confirms" prompt="Layout sections defined and confirmed?"/>
98
+
99
+ <output>layout_sections stored — section names, purposes, and priorities captured.</output>
100
+ </step>
101
+
102
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
103
+ <!-- STEP 3 — Components and Object IDs -->
104
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
105
+
106
+ <step id="3-components-objects" name="Identify components and assign Object IDs" step-file="steps-p/step-03-components-objects.md">
107
+ <instruction>
108
+ Work through each section identified in step 2. For each section, go top-to-bottom,
109
+ left-to-right. Ask the user to describe the next object in the section.
110
+ </instruction>
111
+ <instruction>
112
+ For each object described, load and execute the object router:
113
+ data/object-types/object-router.md
114
+ The router will: ask for object type, load the correct object-type template, guide through
115
+ complete documentation, generate a specification with an Object ID, then return here.
116
+ </instruction>
117
+ <instruction>
118
+ After each component specification is complete, check project config:
119
+ if design system is enabled, run workflows/wds-7-design-system/design-system-router.md
120
+ to check for similar components and extract component-level info. Update page spec with
121
+ the reference. If design system is disabled, keep the full specification on the page.
122
+ </instruction>
123
+ <instruction>
124
+ Continue until the user confirms all objects in the section are documented.
125
+ Move to the next section. Continue until all sections are complete.
126
+ Present a summary: sections processed, total components, components by type, all Object IDs assigned.
127
+ </instruction>
128
+
129
+ <gate type="all-sections-processed" rule="every-layout-section-has-been-worked-through"
130
+ failure-message="All sections from step 2 must be processed. Do not skip any section."/>
131
+ <gate type="object-ids-assigned" rule="every-component-has-an-object-id"
132
+ failure-message="Every documented component must have an Object ID before proceeding to content. Missing IDs block downstream steps."/>
133
+ <gate type="object-router-used" rule="every-component-routed-through-object-router"
134
+ failure-message="Object-type routing must be used for every component. Do not document components without using the router."/>
135
+ <gate type="design-system-check-performed" condition="design-system-enabled"
136
+ failure-message="Design system check must be performed after every component when design system is enabled."/>
137
+ <gate type="user-confirms" prompt="All components documented with Object IDs, design system checks complete?"/>
138
+
139
+ <output>Component registry complete — all Object IDs assigned, design system references updated where applicable.</output>
140
+ </step>
141
+
142
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
143
+ <!-- STEP 4 — Content and Languages -->
144
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
145
+
146
+ <step id="4-content-languages" name="Specify all text content in all languages" step-file="steps-p/step-04-content-languages.md">
147
+ <instruction>
148
+ Ask the user what languages this page supports. Store as supported_languages array.
149
+ </instruction>
150
+ <instruction>
151
+ For every text element on the page (labels, buttons, headings, messages, placeholders,
152
+ error text — derived from the component list), ask the user to provide content in every
153
+ supported language. Primary language first, then each additional language.
154
+ </instruction>
155
+ <instruction>
156
+ Store multilingual_content keyed by element and language.
157
+ No text element may have content in only a subset of languages — full coverage is required.
158
+ </instruction>
159
+
160
+ <gate type="languages-defined" required="supported_languages-array-not-empty"
161
+ failure-message="Supported languages must be defined before collecting content. Ask the user for the language list first."/>
162
+ <gate type="multilingual-coverage" rule="every-text-element-has-content-in-every-language"
163
+ failure-message="Every text element must have content in ALL supported languages. Do not proceed with incomplete language coverage."/>
164
+ <gate type="user-confirms" prompt="All text content specified in all supported languages?"/>
165
+
166
+ <output>multilingual_content stored — all text elements captured in all supported languages.</output>
167
+ </step>
168
+
169
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
170
+ <!-- STEP 5 — Interactions -->
171
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
172
+
173
+ <step id="5-interactions" name="Define interaction behaviors per component" step-file="steps-p/step-05-interactions.md">
174
+ <instruction>
175
+ For each interactive component in the registry (from step 3), ask the user what happens
176
+ when the user interacts with it. Cover: on click / on input / on focus,
177
+ immediate response, state changes, navigation (if applicable), data sent/received.
178
+ </instruction>
179
+ <instruction>
180
+ Store interaction_behavior keyed by Object ID. Do not generate behaviors without
181
+ user input — ask for each component individually.
182
+ </instruction>
183
+ <instruction>
184
+ Do not define visual states in this step — that is step 6.
185
+ </instruction>
186
+
187
+ <gate type="all-interactive-components-covered" rule="every-interactive-object-id-has-interaction-behavior"
188
+ failure-message="Every interactive component must have defined behaviors. Do not skip any."/>
189
+ <gate type="interaction-types-covered" rule="click-input-focus-navigation-data-considered-per-component"
190
+ failure-message="Consider all relevant interaction types for each component before moving on."/>
191
+ <gate type="user-confirms" prompt="All interaction behaviors defined for every interactive component?"/>
192
+
193
+ <output>interaction_behavior stored per Object ID — all interactive components covered.</output>
194
+ </step>
195
+
196
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
197
+ <!-- STEP 6 — States -->
198
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
199
+
200
+ <step id="6-states" name="Define page-level and component-level states" step-file="steps-p/step-06-states.md">
201
+ <instruction>
202
+ Define page-level states first. Ask the user to describe each situation:
203
+ default/loaded, empty (no data), loading (fetching), error (something went wrong),
204
+ success (after action completes). For each: when it occurs, what user sees, available actions.
205
+ </instruction>
206
+ <instruction>
207
+ For each component with multiple possible appearances, ask the user to define applicable states:
208
+ default, hover, active/pressed, focus, disabled, loading, error, success.
209
+ Only specify states that actually apply to each component.
210
+ </instruction>
211
+ <instruction>
212
+ Store page_states and component_states.
213
+ Do not define validation rules in this step — that is step 7.
214
+ </instruction>
215
+
216
+ <gate type="page-states-defined" required="default-state-minimum"
217
+ failure-message="At minimum, the default page state must be defined."/>
218
+ <gate type="component-states-defined" rule="multi-state-components-have-all-applicable-states"
219
+ failure-message="Components with multiple appearances must have all applicable states documented. Do not skip multi-state components."/>
220
+ <gate type="user-confirms" prompt="All page-level and component-level states defined?"/>
221
+
222
+ <output>page_states and component_states stored — all state variations documented.</output>
223
+ </step>
224
+
225
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
226
+ <!-- STEP 7 — Validation -->
227
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
228
+
229
+ <step id="7-validation" name="Define validation rules and error messages" step-file="steps-p/step-07-validation.md">
230
+ <instruction>
231
+ Identify all fields and inputs that require validation. For each, ask:
232
+ - What makes it valid / invalid?
233
+ - Required or optional?
234
+ - Format rules and length limits?
235
+ - Custom rules?
236
+ - Validation timing: on blur, on submit, or real-time?
237
+ </instruction>
238
+ <instruction>
239
+ For each validation rule, define error messages in ALL supported languages.
240
+ Assign an error code (e.g., ERR_EMAIL_INVALID) to every message.
241
+ </instruction>
242
+ <instruction>
243
+ Store validation_rules and error_messages per field, with codes and translations.
244
+ Do not generate the specification document yet — that is step 9.
245
+ </instruction>
246
+
247
+ <check-if condition="page-has-input-fields-or-forms">
248
+ <then>
249
+ Proceed with full validation definition. Every input field must have rules and error messages.
250
+ </then>
251
+ <else>
252
+ No validated fields on this page. Store an empty validation_rules object and note
253
+ "No form inputs on this page" before proceeding to step 8.
254
+ </else>
255
+ </check-if>
256
+
257
+ <gate type="validation-rules-complete" rule="every-input-field-has-rules"
258
+ condition="page-has-input-fields"
259
+ failure-message="Every input field must have validation rules defined. Do not skip any field."/>
260
+ <gate type="error-messages-translated" rule="every-error-code-has-message-in-every-language"
261
+ condition="page-has-input-fields"
262
+ failure-message="Error messages must be provided in ALL supported languages. Incomplete translations block step 9."/>
263
+ <gate type="error-codes-assigned" rule="every-error-message-has-a-code"
264
+ condition="page-has-input-fields"
265
+ failure-message="Every error message must have an error code (e.g., ERR_EMAIL_INVALID)."/>
266
+ <gate type="user-confirms" prompt="Validation rules and error messages complete?"/>
267
+
268
+ <output>validation_rules and error_messages stored — all fields covered, all languages translated, all codes assigned.</output>
269
+ </step>
270
+
271
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
272
+ <!-- STEP 8 — Spacing and Typography -->
273
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
274
+
275
+ <step id="8-spacing-typography" name="Define spacing objects and typography tokens" step-file="steps-p/step-08-spacing-typography.md">
276
+ <instruction>
277
+ Walk through adjacent section pairs top-to-bottom. For each pair, ask the user which
278
+ spacing token applies. Present the full table of gaps at once for efficiency.
279
+
280
+ Available tokens: zero, sm, md, lg, xl, 2xl, 3xl.
281
+ Zero-spacing is an intentional design choice — document it, never skip it.
282
+
283
+ Store spacing objects using naming convention:
284
+ - {page-slug}-v-space-{size} for vertical spacing
285
+ - {page-slug}-v-separator-{size} for lines/dividers with spacing
286
+
287
+ Also capture grid gaps for sections with repeated items (card grids, lists).
288
+ </instruction>
289
+ <instruction>
290
+ For each heading in the content (from step 4), define typography tokens.
291
+ Collect from the user: semantic tag (h1/h2/h3) and visual size per breakpoint
292
+ (mobile / tablet / desktop).
293
+
294
+ Available heading tokens: heading-xxs (14px), heading-xs (16px), heading-sm (18px),
295
+ heading-md (20px), heading-lg (24px), heading-xl (30px), heading-2xl (36px),
296
+ heading-3xl (44px), heading-4xl (56px).
297
+
298
+ Rule: use token names only — never arbitrary pixel values.
299
+ Rule: step up one token size per breakpoint (mobile → tablet → desktop) as a guide.
300
+
301
+ Store typography_tokens with Object ID, tag, and visual size per breakpoint.
302
+ </instruction>
303
+ <instruction>
304
+ Present the complete invisible layer to the user — spacing objects and typography tokens.
305
+ Ask if anything needs adjusting before generating the specification.
306
+ </instruction>
307
+
308
+ <gate type="spacing-complete" rule="every-section-boundary-has-spacing-object"
309
+ failure-message="Every adjacent section pair must have a spacing object. Including zero-spacing decisions."/>
310
+ <gate type="no-pixel-values" rule="only-token-names-used-in-spacing-and-typography"
311
+ failure-message="Only token names are allowed (zero, sm, md, lg, xl, 2xl, 3xl for spacing; heading-xxs through heading-4xl for typography). No pixel values."/>
312
+ <gate type="typography-complete" rule="every-heading-has-tag-and-responsive-token"
313
+ failure-message="Every heading must have a semantic tag and visual token for all three breakpoints."/>
314
+ <gate type="grid-gaps-documented" condition="page-has-card-grids-or-repeated-items"
315
+ failure-message="Grid gaps must be documented for sections containing repeated items (card grids, lists)."/>
316
+ <gate type="user-confirms" prompt="Spacing objects and typography tokens reviewed and approved?"/>
317
+
318
+ <output>spacing_objects and typography_tokens stored — every section boundary and heading documented with tokens.</output>
319
+ </step>
320
+
321
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
322
+ <!-- STEP 9 — Generate Specification -->
323
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
324
+
325
+ <step id="9-generate-spec" name="Compile and save the complete page specification" step-file="steps-p/step-09-generate-spec.md">
326
+ <instruction>
327
+ Verify all data from steps 1-8 is present before generating:
328
+ page_basics, layout_sections, component registry with Object IDs, multilingual_content,
329
+ interaction_behavior, page_states, component_states, validation_rules, error_messages,
330
+ spacing_objects, typography_tokens.
331
+ If any section is missing, return to the relevant step to complete it first.
332
+ </instruction>
333
+ <instruction>
334
+ Generate the complete specification document using the template at:
335
+ templates/page-specification.template.md
336
+
337
+ Fill ALL sections with data from steps 1-8. Do not invent new formats —
338
+ the template defines the structure.
339
+ </instruction>
340
+ <instruction>
341
+ Run the validation script before saving:
342
+ wds-validate.js --page {current-page-path}
343
+ Review any errors or warnings reported. Fix issues in the relevant data sections
344
+ and re-run until validation passes.
345
+ </instruction>
346
+ <instruction>
347
+ Save the complete specification to:
348
+ {output_folder}/C-UX-Scenarios/{scenario-slug}/pages/{NN}.{step}-{page-slug}/{NN}.{step}-{page-slug}.md
349
+
350
+ Present the summary to the user: sections, components, languages, interactions, states,
351
+ validation rules, spacing objects, typography tokens — with counts.
352
+ </instruction>
353
+ <instruction>
354
+ Update the design log: append a row to the Design Loop Status table with status "specified":
355
+ | [scenario-slug] | [NN.step] | [page-name] | specified | [YYYY-MM-DD] |
356
+
357
+ Remove this page from the Current table. Do NOT skip this — the design log drives the
358
+ adaptive dashboard across sessions.
359
+ </instruction>
360
+
361
+ <gate type="all-data-sections-present" required="page_basics layout_sections components multilingual_content interaction_behavior page_states validation_rules spacing_objects typography_tokens"
362
+ failure-message="All data sections from steps 1-8 must be present before generating the specification. Return to incomplete steps."/>
363
+ <gate type="script-run" script="src/scripts/wds-validate.js" args="--page {current-page-path}"
364
+ failure-message="Validation script must pass before saving the specification. Fix reported issues and re-run."/>
365
+ <gate type="file-saved" path="{output_folder}/C-UX-Scenarios/{scenario-slug}/pages/{NN}.{step}-{page-slug}/{NN}.{step}-{page-slug}.md"
366
+ failure-message="Specification file must be saved to the correct path before this step is complete."/>
367
+ <gate type="design-log-updated" rule="design-loop-status-row-appended-with-status-specified"
368
+ failure-message="Design log must be updated with 'specified' status before this step is complete. This is not optional."/>
369
+
370
+ <output>Complete page specification generated, validated, saved, and design log updated with 'specified' status.</output>
371
+ </step>
372
+
373
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
374
+ <!-- COMPLETION -->
375
+ <!-- ═══════════════════════════════════════════════════════════════════ -->
376
+
377
+ <completion>
378
+ <require step="all" failure-message="All 9 steps must be completed. The specification is not valid until step 9 passes validation and saves the file."/>
379
+ <output-file>{output_folder}/C-UX-Scenarios/{scenario-slug}/pages/{NN}.{step}-{page-slug}/{NN}.{step}-{page-slug}.md</output-file>
380
+ <post-completion>
381
+ Return to the calling workflow's transition logic. If called from step-01-exploration.md (Discuss)
382
+ or workflow-suggest.md (Suggest), the calling step determines what comes next.
383
+ The design log status "specified" is the signal that this page is done.
384
+ </post-completion>
385
+ </completion>
386
+
387
+ </workflow>
@@ -39,7 +39,7 @@
39
39
  "roo-code",
40
40
  "kilocode"
41
41
  ],
42
- "bmad_min_version": "6.6.0",
42
+ "bmad_min_version": "6.8.0",
43
43
  "plugins": [
44
44
  {
45
45
  "name": "ma-skills",
@@ -31,13 +31,13 @@
31
31
  "roo-code",
32
32
  "kilocode"
33
33
  ],
34
- "bmad_min_version": "6.6.0",
34
+ "bmad_min_version": "6.8.0",
35
35
  "plugins": [
36
36
  {
37
37
  "name": "ma-skills",
38
38
  "source": "./",
39
39
  "description": "ma-agents extension module providing enterprise SDLC personas and operational workflow skills.",
40
- "version": "3.12.2",
40
+ "version": "3.13.0",
41
41
  "author": {
42
42
  "name": "Alon Mayaffit"
43
43
  },
package/lib/bmad.js CHANGED
@@ -1,7 +1,8 @@
1
1
  const fs = require('fs-extra');
2
2
  const path = require('path');
3
3
  const os = require('os');
4
- const { execSync } = require('child_process');
4
+ const { execSync, execFileSync } = require('child_process');
5
+ const { pathToFileURL } = require('url');
5
6
  const chalk = require('chalk');
6
7
  const yaml = require('yaml');
7
8
  const jsYaml = require('js-yaml');
@@ -471,7 +472,7 @@ const BMAD_MODULE_DESCRIPTIONS = Object.freeze({
471
472
  cis: 'Creative Intelligence Suite — innovation and ideation toolkit',
472
473
  gds: 'Game Dev Studio — game development workflows',
473
474
  tea: 'Test Architecture Enterprise — Test Architect (Murat) + 9 testarch workflows',
474
- wds: 'Web Dev Studio — retired upstream',
475
+ wds: 'Whiteport Design Studio — strategic UX and design-first planning',
475
476
  });
476
477
 
477
478
  /**
@@ -481,7 +482,9 @@ const BMAD_MODULE_DESCRIPTIONS = Object.freeze({
481
482
  * the optional external modules (bmb, cis, gds, tea, wds, ...).
482
483
  *
483
484
  * Each entry carries a `retired` flag so the caller can hide modules that
484
- * have been retired upstream (e.g. wds).
485
+ * have been retired upstream (driven by the manifest's `retiredUpstream`
486
+ * marker; at v6.8.0 the bundled set — tea, bmb, cis, gds, wds — are all
487
+ * active `type: bmad-org` clones, so none are flagged).
485
488
  *
486
489
  * If the cache manifest is missing or unreadable, falls back to a list
487
490
  * containing only `bmm` — that's the minimum a successful install needs.
@@ -1472,10 +1475,42 @@ async function deployMethodology(projectRoot = process.cwd(), force = false) {
1472
1475
  console.log(chalk.gray(' Tip: Use /open-presentation to open the slides (install via npx ma-agents install open-presentation)'));
1473
1476
  }
1474
1477
 
1478
+ /**
1479
+ * Detect whether a `.clinerules/workflows/*.md` file is a ma-agents-generated
1480
+ * Cline workflow wrapper (as opposed to a user-authored file that happens to
1481
+ * live in the same directory).
1482
+ *
1483
+ * Reconciliation (Story 27.4) deletes stale wrappers, so the matcher must be
1484
+ * conservative: it returns `true` ONLY for the exact shape this function emits.
1485
+ * Every generated wrapper contains a line that points the reader back into the
1486
+ * backing skill via a `.cline/skills/<name>/` reference (either `SKILL.md` or
1487
+ * `workflow.md`). User files under `.clinerules/` will not carry that marker,
1488
+ * so they are never mistaken for wrappers and never deleted.
1489
+ *
1490
+ * @param {string} content - Raw UTF-8 contents of the candidate `.md` file.
1491
+ * @returns {boolean} `true` if the content matches the generated-wrapper shape.
1492
+ */
1493
+ function isGeneratedClineWrapper(content) {
1494
+ if (typeof content !== 'string' || content.length === 0) return false;
1495
+ // The generated-wrapper fingerprint: a body line that instructs the reader
1496
+ // to read a file under `.cline/skills/<name>/` (SKILL.md or workflow.md).
1497
+ // Matches forward-slashed paths only — that is exactly what we emit.
1498
+ return /\.cline\/skills\/[^/\s`]+\/(?:SKILL|workflow)\.md/.test(content);
1499
+ }
1500
+
1475
1501
  /**
1476
1502
  * Generate Cline workflow wrappers for all BMAD skills installed to .cline/skills/.
1477
1503
  * Creates .clinerules/workflows/<skill-name>.md for each installed skill so they
1478
1504
  * can be invoked via / commands in Cline chat.
1505
+ *
1506
+ * Reconciliation (Story 27.4): after (re)generating wrappers for all current
1507
+ * skills, any stale wrapper under `.clinerules/workflows/` whose backing
1508
+ * `.cline/skills/<name>/` directory no longer exists is removed. This keeps
1509
+ * `/`-invocation in Cline from offering workflows for skills BMAD renamed away
1510
+ * or retired. Deletion is scoped strictly to ma-agents-generated wrapper files
1511
+ * (see {@link isGeneratedClineWrapper}); user-authored files elsewhere under
1512
+ * `.clinerules/` are never touched, and the operation is idempotent.
1513
+ *
1479
1514
  * No-op when 'cline' is not in the selected tools list.
1480
1515
  */
1481
1516
  async function deployClineWorkflows(projectRoot, tools = []) {
@@ -1502,6 +1537,10 @@ async function deployClineWorkflows(projectRoot, tools = []) {
1502
1537
  const entries = await fs.readdir(clineSkillsDir, { withFileTypes: true });
1503
1538
  const skillDirs = entries.filter(e => e.isDirectory());
1504
1539
 
1540
+ // Live skill-name set: every `.cline/skills/<name>/` that backs a wrapper
1541
+ // (i.e. contains a SKILL.md). Used below to reconcile stale wrappers.
1542
+ const liveSkillNames = new Set();
1543
+
1505
1544
  let generated = 0;
1506
1545
  for (const entry of skillDirs) {
1507
1546
  const skillName = entry.name;
@@ -1510,6 +1549,7 @@ async function deployClineWorkflows(projectRoot, tools = []) {
1510
1549
  const workflowMdPath = path.join(skillDir, 'workflow.md');
1511
1550
 
1512
1551
  if (!(await fs.pathExists(skillMdPath))) continue;
1552
+ liveSkillNames.add(skillName);
1513
1553
 
1514
1554
  const skillMdContent = await fs.readFile(skillMdPath, 'utf8');
1515
1555
  let displayName = skillName.replace(/-/g, ' ').replace(/\b\w/g, c => c.toUpperCase());
@@ -1546,10 +1586,47 @@ async function deployClineWorkflows(projectRoot, tools = []) {
1546
1586
  generated++;
1547
1587
  }
1548
1588
 
1589
+ // Reconciliation (Story 27.4): remove stale wrappers whose backing skill
1590
+ // dir no longer exists. Scope is strictly the generated-wrapper `.md` files
1591
+ // directly inside `workflows/` — subdirectories and non-wrapper user files
1592
+ // are left untouched.
1593
+ let removed = 0;
1594
+ const workflowEntries = await fs.readdir(workflowsDir, { withFileTypes: true });
1595
+ for (const wf of workflowEntries) {
1596
+ // Only top-level `.md` files are candidate wrappers. Skip directories
1597
+ // and any non-markdown file outright.
1598
+ if (!wf.isFile()) continue;
1599
+ if (!wf.name.endsWith('.md')) continue;
1600
+
1601
+ const wrapperName = wf.name.slice(0, -'.md'.length);
1602
+ // A wrapper whose name is still in the live set is current — keep it.
1603
+ // (It was just (re)written above.)
1604
+ if (liveSkillNames.has(wrapperName)) continue;
1605
+
1606
+ // Name is not backed by a live skill. Before deleting, confirm the file
1607
+ // actually matches the ma-agents generated-wrapper shape so we never
1608
+ // remove a user-authored `.md` that happens to share a stale name.
1609
+ const wrapperPath = path.join(workflowsDir, wf.name);
1610
+ let wrapperContent;
1611
+ try {
1612
+ wrapperContent = await fs.readFile(wrapperPath, 'utf8');
1613
+ } catch {
1614
+ // Unreadable (e.g. vanished mid-run) — nothing to reconcile.
1615
+ continue;
1616
+ }
1617
+ if (!isGeneratedClineWrapper(wrapperContent)) continue;
1618
+
1619
+ await fs.remove(wrapperPath);
1620
+ removed++;
1621
+ }
1622
+
1549
1623
  if (generated > 0) {
1550
1624
  console.log(chalk.green(` ✓ Generated ${generated} Cline workflow wrappers in .clinerules/workflows/`));
1551
1625
  console.log(chalk.gray(' Tip: In Cline, type / to browse and invoke BMAD skills'));
1552
1626
  }
1627
+ if (removed > 0) {
1628
+ console.log(chalk.green(` ✓ Removed ${removed} stale Cline workflow wrapper${removed === 1 ? '' : 's'} (backing skill no longer present)`));
1629
+ }
1553
1630
  }
1554
1631
 
1555
1632
  /**
@@ -1793,7 +1870,7 @@ function ensureCanonicalConfigLocation(projectRoot) {
1793
1870
 
1794
1871
  // ── Migration constants ─────────────────────────────────────────────────────
1795
1872
 
1796
- const BMAD_TARGET_VERSION = '6.6.0';
1873
+ const BMAD_TARGET_VERSION = '6.8.0';
1797
1874
  const BMAD_MIGRATION_THRESHOLD = '6.2.0'; // versions below this need migration
1798
1875
  const BACKUP_DIR_NAME = '.backup-pre-migration';
1799
1876
 
@@ -2733,10 +2810,15 @@ function restoreGitDir(moduleDir) {
2733
2810
  }
2734
2811
  fs.renameSync(preserved, gitDir);
2735
2812
 
2736
- // Point origin at the local directory so `git fetch origin` succeeds offline
2813
+ // Point origin at the local directory so `git fetch origin` succeeds offline.
2814
+ // Use pathToFileURL so a Windows absolute path becomes a well-formed
2815
+ // `file:///C:/...` URL (three slashes) rather than `file://C:/...`, and so
2816
+ // paths containing spaces or other reserved characters are percent-encoded.
2817
+ // execFileSync (arg array) avoids shell interpolation — matching the rest of
2818
+ // the codebase's git calls (see scripts/build-bmad-cache.js).
2737
2819
  try {
2738
- const localUrl = 'file://' + moduleDir.replace(/\\/g, '/');
2739
- execSync(`git remote set-url origin "${localUrl}"`, {
2820
+ const localUrl = pathToFileURL(moduleDir).href;
2821
+ execFileSync('git', ['remote', 'set-url', 'origin', localUrl], {
2740
2822
  cwd: moduleDir,
2741
2823
  stdio: 'pipe'
2742
2824
  });
@@ -2754,6 +2836,8 @@ module.exports = {
2754
2836
  prePopulateBmadCache,
2755
2837
  deployMethodology,
2756
2838
  deployClineWorkflows,
2839
+ // Story 27.4 — exported for unit tests of stale-wrapper reconciliation
2840
+ isGeneratedClineWrapper,
2757
2841
  // Story 22.7 — canonical config (_bmad/bmm/config.yaml) helpers
2758
2842
  readCanonicalBmadConfig,
2759
2843
  ensureCanonicalConfigLocation,
package/lib/installer.js CHANGED
@@ -12,6 +12,7 @@ const MANIFEST_VERSION = '1.2.0';
12
12
  const MA_AGENTS_SOURCE = 'ma-agents';
13
13
  const TEMPLATE_PATH = path.join(__dirname, 'templates', 'project-context.template.md');
14
14
  const UNIVERSAL_INSTRUCTION_TEMPLATE_PATH = path.join(__dirname, 'templates', 'instruction-block-universal.template.md');
15
+ const GIT_INSTRUCTION_TEMPLATE_PATH = path.join(__dirname, 'templates', 'instruction-block-git.template.md');
15
16
  const ONPREM_INSTRUCTION_TEMPLATE_PATH = path.join(__dirname, 'templates', 'instruction-block-onprem.template.md');
16
17
  const CLINERULES_TEMPLATE_PATH = path.join(__dirname, 'templates', 'clinerules.template.md');
17
18
  const EXTRA_TEMPLATE_DIR = path.join(__dirname, 'templates');
@@ -133,19 +134,39 @@ function composeInstructionBlock({ profile, projectRoot } = {}) {
133
134
  );
134
135
  }
135
136
 
137
+ // Story 26.1 — the git workflow guardrail block is appended to EVERY profile
138
+ // (standard and on-prem), so this read must be as robust as the universal
139
+ // read above. Any failure to load a non-empty git template surfaces as a
140
+ // clear, path-identifying error — the guardrails must never silently vanish.
141
+ let git;
142
+ try {
143
+ git = fs.readFileSync(GIT_INSTRUCTION_TEMPLATE_PATH, 'utf-8');
144
+ } catch (err) {
145
+ throw new Error(
146
+ `git instruction template not found or unreadable at ${GIT_INSTRUCTION_TEMPLATE_PATH} — ma-agents installation may be corrupted: ${err.message}`
147
+ );
148
+ }
149
+ if (git.trim() === '') {
150
+ throw new Error(
151
+ `git instruction template at ${GIT_INSTRUCTION_TEMPLATE_PATH} is empty — ma-agents installation may be corrupted`
152
+ );
153
+ }
154
+
155
+ // Compose in the exact order universal + git (+ on-prem). Each piece is
156
+ // trailing-whitespace-normalized and joined by exactly one blank line so that
157
+ // first-insert and in-place-replace produce byte-identical marker content
158
+ // (FR176 / NFR46 idempotency).
159
+ let composed = universal.replace(/\s+$/, '') + '\n\n' + git.replace(/\s+$/, '');
160
+
136
161
  if (profile === 'on-prem') {
137
162
  if (!fs.existsSync(ONPREM_INSTRUCTION_TEMPLATE_PATH)) {
138
163
  throw new Error('on-prem profile selected but instruction-block-onprem.template.md is missing');
139
164
  }
140
165
  const onprem = fs.readFileSync(ONPREM_INSTRUCTION_TEMPLATE_PATH, 'utf-8');
141
- // Normalize both pieces so the concatenation has exactly one blank line between them
142
- // and no trailing whitespace — feeds NFR46 byte-identity.
143
- return universal.replace(/\s+$/, '') + '\n\n' + onprem.replace(/\s+$/, '') + '\n';
166
+ composed += '\n\n' + onprem.replace(/\s+$/, '');
144
167
  }
145
168
 
146
- // Normalize trailing whitespace so first-insert and in-place-replace both
147
- // produce byte-identical content inside the markers (NFR46, AC #6).
148
- return universal.replace(/\s+$/, '') + '\n';
169
+ return composed + '\n';
149
170
  }
150
171
 
151
172
  /**
@@ -2000,6 +2021,7 @@ module.exports = {
2000
2021
  buildBackupFilename,
2001
2022
  formatBackupTimestamp,
2002
2023
  UNIVERSAL_INSTRUCTION_TEMPLATE_PATH,
2024
+ GIT_INSTRUCTION_TEMPLATE_PATH,
2003
2025
  ONPREM_INSTRUCTION_TEMPLATE_PATH,
2004
2026
  // Story 21.4 — AGENTS.md template, markdown-markers merger, extraInstructionTemplates processor.
2005
2027
  // Story 21.3 (rebased) — yaml-customModes merger dispatch is integrated into stampExtraInstructionTemplates.