ma-agents 2.22.1 → 3.0.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 (480) hide show
  1. package/.opencode/skills/.ma-agents.json +99 -99
  2. package/lib/bmad-cache/bmb/.claude-plugin/marketplace.json +22 -0
  3. package/lib/bmad-cache/bmb/.markdownlint-cli2.yaml +1 -0
  4. package/lib/bmad-cache/bmb/_git_preserved/index +0 -0
  5. package/lib/bmad-cache/bmb/_git_preserved/logs/HEAD +1 -1
  6. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/heads/main +1 -1
  7. package/lib/bmad-cache/bmb/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
  8. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.idx +0 -0
  9. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.pack +0 -0
  10. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-0de89e0854d5b2b3b3b0c1ee56eee73a739f15e7.rev +0 -0
  11. package/lib/bmad-cache/bmb/_git_preserved/packed-refs +1 -1
  12. package/lib/bmad-cache/bmb/_git_preserved/refs/heads/main +1 -1
  13. package/lib/bmad-cache/bmb/_git_preserved/shallow +1 -1
  14. package/lib/bmad-cache/bmb/package-lock.json +2 -2
  15. package/lib/bmad-cache/bmb/package.json +7 -4
  16. package/lib/bmad-cache/bmb/skills/bmad-agent-builder/scripts/generate-html-report.py +534 -0
  17. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-execution-deps.py +4 -35
  18. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-prompt-metrics.py +2 -75
  19. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/prepass-structure-capabilities.py +3 -194
  20. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/scan-path-standards.py +104 -18
  21. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/assets/module-help.csv +6 -0
  22. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/assets/module.yaml +20 -0
  23. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/cleanup-legacy.py +259 -0
  24. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/merge-config.py +408 -0
  25. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/merge-help-csv.py +220 -0
  26. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-cleanup-legacy.py +429 -0
  27. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-merge-config.py +644 -0
  28. package/lib/bmad-cache/bmb/skills/bmad-builder-setup/scripts/tests/test-merge-help-csv.py +237 -0
  29. package/lib/bmad-cache/bmb/skills/bmad-workflow-builder/scripts/generate-html-report.py +539 -0
  30. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-execution-deps.py +5 -30
  31. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-workflow-integrity.py +0 -5
  32. package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/scan-path-standards.py +103 -16
  33. package/lib/bmad-cache/bmb/skills/module-help.csv +6 -0
  34. package/lib/bmad-cache/bmb/skills/module.yaml +20 -0
  35. package/lib/bmad-cache/bmb/tools/validate-doc-links.cjs +407 -0
  36. package/lib/bmad-cache/bmb/tools/validate-file-refs.mjs +1 -1
  37. package/lib/bmad-cache/cache-manifest.json +16 -10
  38. package/lib/bmad-cache/cis/.claude-plugin/marketplace.json +33 -0
  39. package/lib/bmad-cache/cis/_git_preserved/index +0 -0
  40. package/lib/bmad-cache/cis/_git_preserved/logs/HEAD +1 -1
  41. package/lib/bmad-cache/cis/_git_preserved/logs/refs/heads/main +1 -1
  42. package/lib/bmad-cache/cis/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
  43. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.idx +0 -0
  44. package/lib/bmad-cache/cis/_git_preserved/objects/pack/{pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.pack → pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.pack} +0 -0
  45. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-9d60aae6b09bbea0d0c5e79fdbe96e8f66de84e6.rev +0 -0
  46. package/lib/bmad-cache/cis/_git_preserved/packed-refs +1 -1
  47. package/lib/bmad-cache/cis/_git_preserved/refs/heads/main +1 -1
  48. package/lib/bmad-cache/cis/_git_preserved/shallow +1 -1
  49. package/lib/bmad-cache/cis/package-lock.json +17015 -0
  50. package/lib/bmad-cache/cis/package.json +3 -4
  51. package/lib/bmad-cache/cis/src/module-help.csv +6 -6
  52. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-brainstorming-coach/bmad-skill-manifest.yaml +11 -0
  53. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-creative-problem-solver/bmad-skill-manifest.yaml +11 -0
  54. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-design-thinking-coach/bmad-skill-manifest.yaml +11 -0
  55. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-innovation-strategist/bmad-skill-manifest.yaml +11 -0
  56. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-presentation-master/bmad-skill-manifest.yaml +11 -0
  57. package/lib/bmad-cache/cis/src/skills/bmad-cis-agent-storyteller/bmad-skill-manifest.yaml +11 -0
  58. package/lib/bmad-cache/gds/.claude-plugin/marketplace.json +58 -0
  59. package/lib/bmad-cache/gds/_git_preserved/index +0 -0
  60. package/lib/bmad-cache/gds/_git_preserved/logs/HEAD +1 -1
  61. package/lib/bmad-cache/gds/_git_preserved/logs/refs/heads/main +1 -1
  62. package/lib/bmad-cache/gds/_git_preserved/logs/refs/remotes/origin/HEAD +1 -1
  63. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-8099a88fca0ad946a573316a00887a2921ca1712.idx +0 -0
  64. package/lib/bmad-cache/gds/_git_preserved/objects/pack/{pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.pack → pack-8099a88fca0ad946a573316a00887a2921ca1712.pack} +0 -0
  65. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-8099a88fca0ad946a573316a00887a2921ca1712.rev +0 -0
  66. package/lib/bmad-cache/gds/_git_preserved/packed-refs +1 -1
  67. package/lib/bmad-cache/gds/_git_preserved/refs/heads/main +1 -1
  68. package/lib/bmad-cache/gds/_git_preserved/shallow +1 -1
  69. package/lib/bmad-cache/gds/package.json +1 -0
  70. package/lib/bmad-cache/gds/src/module-help.csv +35 -35
  71. package/lib/bmad-cache/tea/.claude-plugin/marketplace.json +33 -0
  72. package/lib/bmad-cache/tea/CHANGELOG.md +2 -14
  73. package/lib/bmad-cache/tea/README.md +31 -18
  74. package/lib/bmad-cache/tea/_git_preserved/index +0 -0
  75. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-d243f64f83b36190434d68872a69a40870c53030.idx +0 -0
  76. package/lib/bmad-cache/tea/_git_preserved/objects/pack/{pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.pack → pack-d243f64f83b36190434d68872a69a40870c53030.pack} +0 -0
  77. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-d243f64f83b36190434d68872a69a40870c53030.rev +0 -0
  78. package/lib/bmad-cache/tea/_git_preserved/packed-refs +1 -1
  79. package/lib/bmad-cache/tea/_git_preserved/refs/heads/main +1 -1
  80. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.7.3 +1 -0
  81. package/lib/bmad-cache/tea/_git_preserved/shallow +1 -1
  82. package/lib/bmad-cache/tea/docs/explanation/knowledge-base-system.md +5 -5
  83. package/lib/bmad-cache/tea/docs/explanation/step-file-architecture.md +2 -2
  84. package/lib/bmad-cache/tea/docs/explanation/tea-overview.md +3 -3
  85. package/lib/bmad-cache/tea/docs/glossary/index.md +1 -1
  86. package/lib/bmad-cache/tea/docs/how-to/customization/extend-tea-with-custom-workflows.md +73 -0
  87. package/lib/bmad-cache/tea/docs/how-to/workflows/teach-me-testing.md +7 -7
  88. package/lib/bmad-cache/tea/docs/index.md +2 -1
  89. package/lib/bmad-cache/tea/docs/reference/commands.md +4 -1
  90. package/lib/bmad-cache/tea/docs/reference/configuration.md +37 -15
  91. package/lib/bmad-cache/tea/docs/reference/knowledge-base.md +75 -73
  92. package/lib/bmad-cache/tea/docs/reference/troubleshooting.md +32 -19
  93. package/lib/bmad-cache/tea/docs/tutorials/learn-testing-tea-academy.md +3 -3
  94. package/lib/bmad-cache/tea/package-lock.json +2 -2
  95. package/lib/bmad-cache/tea/package.json +2 -1
  96. package/lib/bmad-cache/tea/src/agents/bmad-tea/SKILL.md +70 -0
  97. package/lib/bmad-cache/tea/src/agents/bmad-tea/bmad-skill-manifest.yaml +14 -0
  98. package/lib/bmad-cache/tea/src/module-help.csv +10 -10
  99. package/lib/bmad-cache/tea/src/module.yaml +8 -8
  100. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/checklist.md +1 -1
  101. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/curriculum.yaml +1 -1
  102. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/session-content-map.yaml +26 -14
  103. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/data/tea-resources-index.yaml +108 -73
  104. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/instructions.md +2 -2
  105. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-03-session-menu.md +1 -1
  106. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-01.md +3 -3
  107. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-04-session-07.md +14 -6
  108. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/steps-c/step-05-completion.md +3 -3
  109. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/templates/certificate-template.md +1 -1
  110. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-teach-me-testing/workflow-plan-teach-me-testing.md +8 -8
  111. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/atdd-checklist-template.md +1 -1
  112. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-01-preflight-and-context.md +3 -3
  113. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-atdd/steps-c/step-04a-subagent-api-failing.md +9 -1
  114. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-01-preflight-and-context.md +1 -1
  115. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-automate/steps-c/step-03b-subagent-e2e.md +2 -2
  116. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-02-generate-pipeline.md +6 -0
  117. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-ci/steps-c/step-03-configure-quality-gates.md +6 -1
  118. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-framework/steps-c/step-03-scaffold-framework.md +3 -2
  119. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-nfr/steps-c/step-01-load-context.md +1 -1
  120. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-design/steps-c/step-02-load-context.md +1 -1
  121. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/steps-c/step-01-load-context.md +1 -1
  122. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-test-review/test-review-template.md +11 -11
  123. package/lib/bmad-cache/tea/src/workflows/testarch/bmad-testarch-trace/steps-c/step-01-load-context.md +1 -1
  124. package/lib/bmad-cache/tea/test/test-installation-components.js +85 -21
  125. package/lib/bmad-cache/tea/test/test-knowledge-base.js +1 -1
  126. package/lib/bmad-cache/tea/tools/validate-agent-schema.js +105 -5
  127. package/lib/bmad-cache/wds/.claude-plugin/marketplace.json +35 -0
  128. package/lib/bmad-cache/wds/.markdownlint-cli2.yaml +38 -0
  129. package/lib/bmad-cache/wds/.nvmrc +1 -0
  130. package/lib/bmad-cache/wds/.prettierignore +9 -0
  131. package/lib/bmad-cache/wds/LICENSE +27 -0
  132. package/lib/bmad-cache/wds/README.md +126 -0
  133. package/lib/bmad-cache/wds/_git_preserved/HEAD +1 -0
  134. package/lib/bmad-cache/wds/_git_preserved/config +13 -0
  135. package/lib/bmad-cache/wds/_git_preserved/description +1 -0
  136. package/lib/bmad-cache/wds/_git_preserved/hooks/applypatch-msg.sample +15 -0
  137. package/lib/bmad-cache/wds/_git_preserved/hooks/commit-msg.sample +24 -0
  138. package/lib/bmad-cache/wds/_git_preserved/hooks/fsmonitor-watchman.sample +174 -0
  139. package/lib/bmad-cache/wds/_git_preserved/hooks/post-update.sample +8 -0
  140. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-applypatch.sample +14 -0
  141. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-commit.sample +49 -0
  142. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-merge-commit.sample +13 -0
  143. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-push.sample +53 -0
  144. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-rebase.sample +169 -0
  145. package/lib/bmad-cache/wds/_git_preserved/hooks/pre-receive.sample +24 -0
  146. package/lib/bmad-cache/wds/_git_preserved/hooks/prepare-commit-msg.sample +42 -0
  147. package/lib/bmad-cache/wds/_git_preserved/hooks/push-to-checkout.sample +78 -0
  148. package/lib/bmad-cache/wds/_git_preserved/hooks/sendemail-validate.sample +77 -0
  149. package/lib/bmad-cache/wds/_git_preserved/hooks/update.sample +128 -0
  150. package/lib/bmad-cache/wds/_git_preserved/index +0 -0
  151. package/lib/bmad-cache/wds/_git_preserved/info/exclude +6 -0
  152. package/lib/bmad-cache/wds/_git_preserved/logs/HEAD +1 -0
  153. package/lib/bmad-cache/wds/_git_preserved/logs/refs/heads/main +1 -0
  154. package/lib/bmad-cache/wds/_git_preserved/logs/refs/remotes/origin/HEAD +1 -0
  155. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.idx +0 -0
  156. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.pack +0 -0
  157. package/lib/bmad-cache/wds/_git_preserved/objects/pack/pack-92d32f26e3a97a0786dcea5cb2c24bf90384521c.rev +0 -0
  158. package/lib/bmad-cache/wds/_git_preserved/packed-refs +2 -0
  159. package/lib/bmad-cache/wds/_git_preserved/refs/heads/main +1 -0
  160. package/lib/bmad-cache/wds/_git_preserved/refs/remotes/origin/HEAD +1 -0
  161. package/lib/bmad-cache/wds/_git_preserved/shallow +1 -0
  162. package/lib/bmad-cache/wds/eslint.config.mjs +152 -0
  163. package/lib/bmad-cache/wds/package.json +82 -0
  164. package/lib/bmad-cache/wds/prettier.config.mjs +32 -0
  165. package/lib/bmad-cache/wds/src/agents/wds-agent-freya-ux/bmad-skill-manifest.yaml +12 -0
  166. package/lib/bmad-cache/wds/src/agents/wds-agent-saga-analyst/bmad-skill-manifest.yaml +12 -0
  167. package/lib/bmad-cache/wds/src/module-help.csv +18 -0
  168. package/lib/bmad-cache/wds/src/module.yaml +148 -0
  169. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/bmad-skill-manifest.yaml +1 -0
  170. package/lib/bmad-cache/wds/src/workflows/wds-1-project-brief/templates/platform-requirements.template.yaml +69 -0
  171. package/lib/bmad-cache/wds/src/workflows/wds-2-trigger-mapping/bmad-skill-manifest.yaml +1 -0
  172. package/lib/bmad-cache/wds/src/workflows/wds-3-scenarios/bmad-skill-manifest.yaml +1 -0
  173. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/bmad-skill-manifest.yaml +1 -0
  174. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/design-delivery.template.yaml +104 -0
  175. package/lib/bmad-cache/wds/src/workflows/wds-4-ux-design/templates/test-scenario.template.yaml +192 -0
  176. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/bmad-skill-manifest.yaml +1 -0
  177. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.css +164 -0
  178. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.html +18 -0
  179. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/components/dev-mode.js +430 -0
  180. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/demo-data-template.json +63 -0
  181. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/page-template.html +465 -0
  182. package/lib/bmad-cache/wds/src/workflows/wds-5-agentic-development/templates/work-file-template.yaml +264 -0
  183. package/lib/bmad-cache/wds/src/workflows/wds-6-asset-generation/bmad-skill-manifest.yaml +1 -0
  184. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/bmad-skill-manifest.yaml +1 -0
  185. package/lib/bmad-cache/wds/src/workflows/wds-7-design-system/templates/catalog.template.html +363 -0
  186. package/lib/bmad-cache/wds/src/workflows/wds-8-product-evolution/bmad-skill-manifest.yaml +1 -0
  187. package/lib/bmad-customize/bmm-architect.customize.yaml +6 -0
  188. package/lib/bmad-customize/bmm-bmad-master.customize.yaml +6 -0
  189. package/lib/bmad-customize/bmm-dev.customize.yaml +6 -0
  190. package/lib/bmad-customize/bmm-pm.customize.yaml +6 -0
  191. package/lib/bmad-customize/bmm-qa.customize.yaml +6 -0
  192. package/lib/bmad-customize/bmm-sm.customize.yaml +6 -0
  193. package/lib/bmad-customize/bmm-tech-writer.customize.yaml +6 -0
  194. package/lib/bmad-customize/bmm-ux-designer.customize.yaml +6 -0
  195. package/lib/bmad-extension/module-help.csv +37 -7
  196. package/lib/bmad-extension/module.yaml +4 -2
  197. package/lib/bmad-extension/skills/add-sprint/.gitkeep +0 -0
  198. package/lib/bmad-extension/skills/add-sprint/SKILL.md +121 -0
  199. package/lib/bmad-extension/skills/add-sprint/bmad-skill-manifest.yaml +3 -0
  200. package/lib/bmad-extension/skills/add-to-sprint/.gitkeep +0 -0
  201. package/lib/bmad-extension/skills/add-to-sprint/SKILL.md +215 -0
  202. package/lib/bmad-extension/skills/add-to-sprint/bmad-skill-manifest.yaml +3 -0
  203. package/lib/bmad-extension/skills/bmad-ma-agent-cyber/.gitkeep +0 -0
  204. package/lib/bmad-extension/skills/bmad-ma-agent-cyber/SKILL.md +44 -0
  205. package/lib/bmad-extension/skills/bmad-ma-agent-cyber/bmad-skill-manifest.yaml +11 -0
  206. package/lib/bmad-extension/skills/bmad-ma-agent-devops/.gitkeep +0 -0
  207. package/lib/bmad-extension/skills/bmad-ma-agent-devops/SKILL.md +44 -0
  208. package/lib/bmad-extension/skills/bmad-ma-agent-devops/bmad-skill-manifest.yaml +11 -0
  209. package/lib/bmad-extension/skills/bmad-ma-agent-mil498/.gitkeep +0 -0
  210. package/lib/bmad-extension/skills/bmad-ma-agent-mil498/SKILL.md +48 -0
  211. package/lib/bmad-extension/skills/bmad-ma-agent-mil498/bmad-skill-manifest.yaml +11 -0
  212. package/lib/bmad-extension/skills/bmad-ma-agent-sre/.gitkeep +0 -0
  213. package/lib/bmad-extension/skills/bmad-ma-agent-sre/SKILL.md +44 -0
  214. package/lib/bmad-extension/skills/bmad-ma-agent-sre/bmad-skill-manifest.yaml +11 -0
  215. package/lib/bmad-extension/skills/create-bug-story/.gitkeep +0 -0
  216. package/lib/bmad-extension/skills/create-bug-story/SKILL.md +195 -0
  217. package/lib/bmad-extension/skills/create-bug-story/bmad-skill-manifest.yaml +3 -0
  218. package/lib/bmad-extension/skills/cyber-generate-certs/.gitkeep +0 -0
  219. package/lib/bmad-extension/skills/cyber-generate-certs/SKILL.md +27 -0
  220. package/lib/bmad-extension/skills/cyber-generate-certs/bmad-skill-manifest.yaml +3 -0
  221. package/lib/bmad-extension/skills/cyber-immunity-estimation/.gitkeep +0 -0
  222. package/lib/bmad-extension/skills/cyber-immunity-estimation/SKILL.md +29 -0
  223. package/lib/bmad-extension/skills/cyber-immunity-estimation/bmad-skill-manifest.yaml +3 -0
  224. package/lib/bmad-extension/skills/cyber-security-audit/.gitkeep +0 -0
  225. package/lib/bmad-extension/skills/cyber-security-audit/SKILL.md +27 -0
  226. package/lib/bmad-extension/skills/cyber-security-audit/bmad-skill-manifest.yaml +3 -0
  227. package/lib/bmad-extension/skills/cyber-vault-secrets/.gitkeep +0 -0
  228. package/lib/bmad-extension/skills/cyber-vault-secrets/SKILL.md +28 -0
  229. package/lib/bmad-extension/skills/cyber-vault-secrets/bmad-skill-manifest.yaml +3 -0
  230. package/lib/bmad-extension/skills/cyber-verify-docker-users/.gitkeep +0 -0
  231. package/lib/bmad-extension/skills/cyber-verify-docker-users/SKILL.md +23 -0
  232. package/lib/bmad-extension/skills/cyber-verify-docker-users/bmad-skill-manifest.yaml +3 -0
  233. package/lib/bmad-extension/skills/cyber-verify-image-signature/.gitkeep +0 -0
  234. package/lib/bmad-extension/skills/cyber-verify-image-signature/SKILL.md +22 -0
  235. package/lib/bmad-extension/skills/cyber-verify-image-signature/bmad-skill-manifest.yaml +3 -0
  236. package/lib/bmad-extension/skills/cyber-vulnerability-scan/.gitkeep +0 -0
  237. package/lib/bmad-extension/skills/cyber-vulnerability-scan/SKILL.md +28 -0
  238. package/lib/bmad-extension/skills/cyber-vulnerability-scan/bmad-skill-manifest.yaml +3 -0
  239. package/lib/bmad-extension/skills/devops-configure-infrastructure/.gitkeep +0 -0
  240. package/lib/bmad-extension/skills/devops-configure-infrastructure/SKILL.md +27 -0
  241. package/lib/bmad-extension/skills/devops-configure-infrastructure/bmad-skill-manifest.yaml +3 -0
  242. package/lib/bmad-extension/skills/devops-disconnected-deployment/.gitkeep +0 -0
  243. package/lib/bmad-extension/skills/devops-disconnected-deployment/SKILL.md +27 -0
  244. package/lib/bmad-extension/skills/devops-disconnected-deployment/bmad-skill-manifest.yaml +3 -0
  245. package/lib/bmad-extension/skills/devops-docker-compose-setup/.gitkeep +0 -0
  246. package/lib/bmad-extension/skills/devops-docker-compose-setup/SKILL.md +26 -0
  247. package/lib/bmad-extension/skills/devops-docker-compose-setup/bmad-skill-manifest.yaml +3 -0
  248. package/lib/bmad-extension/skills/devops-manage-helm/.gitkeep +0 -0
  249. package/lib/bmad-extension/skills/devops-manage-helm/SKILL.md +28 -0
  250. package/lib/bmad-extension/skills/devops-manage-helm/bmad-skill-manifest.yaml +3 -0
  251. package/lib/bmad-extension/skills/devops-sign-docker-image/.gitkeep +0 -0
  252. package/lib/bmad-extension/skills/devops-sign-docker-image/SKILL.md +24 -0
  253. package/lib/bmad-extension/skills/devops-sign-docker-image/bmad-skill-manifest.yaml +3 -0
  254. package/lib/bmad-extension/skills/mil498-ocd/.gitkeep +0 -0
  255. package/lib/bmad-extension/skills/mil498-ocd/SKILL.md +30 -0
  256. package/lib/bmad-extension/skills/mil498-ocd/bmad-skill-manifest.yaml +5 -0
  257. package/lib/bmad-extension/skills/mil498-ocd/prompts/01-discover-project-artifacts.md +26 -0
  258. package/lib/bmad-extension/skills/mil498-ocd/prompts/02-load-template.md +10 -0
  259. package/lib/bmad-extension/skills/mil498-ocd/prompts/03-generate-document.md +90 -0
  260. package/lib/bmad-extension/skills/mil498-ocd/prompts/04-validate.md +14 -0
  261. package/lib/bmad-extension/skills/mil498-ocd/prompts/05-review.md +15 -0
  262. package/lib/bmad-extension/skills/mil498-ocd/prompts/06-save.md +15 -0
  263. package/lib/bmad-extension/skills/mil498-ocd/template.md +169 -0
  264. package/lib/bmad-extension/skills/mil498-sdd/.gitkeep +0 -0
  265. package/lib/bmad-extension/skills/mil498-sdd/SKILL.md +30 -0
  266. package/lib/bmad-extension/skills/mil498-sdd/bmad-skill-manifest.yaml +5 -0
  267. package/lib/bmad-extension/skills/mil498-sdd/prompts/01-discover-project-artifacts.md +50 -0
  268. package/lib/bmad-extension/skills/mil498-sdd/prompts/02-load-template.md +10 -0
  269. package/lib/bmad-extension/skills/mil498-sdd/prompts/03-generate-document.md +98 -0
  270. package/lib/bmad-extension/skills/mil498-sdd/prompts/04-validate.md +16 -0
  271. package/lib/bmad-extension/skills/mil498-sdd/prompts/05-review.md +15 -0
  272. package/lib/bmad-extension/skills/mil498-sdd/prompts/06-save.md +19 -0
  273. package/lib/bmad-extension/skills/mil498-sdd/template.md +163 -0
  274. package/lib/bmad-extension/skills/mil498-sdp/.gitkeep +0 -0
  275. package/lib/bmad-extension/skills/mil498-sdp/SKILL.md +30 -0
  276. package/lib/bmad-extension/skills/mil498-sdp/bmad-skill-manifest.yaml +5 -0
  277. package/lib/bmad-extension/skills/mil498-sdp/prompts/01-discover-project-artifacts.md +32 -0
  278. package/lib/bmad-extension/skills/mil498-sdp/prompts/02-load-template.md +10 -0
  279. package/lib/bmad-extension/skills/mil498-sdp/prompts/03-generate-document.md +187 -0
  280. package/lib/bmad-extension/skills/mil498-sdp/prompts/04-validate.md +13 -0
  281. package/lib/bmad-extension/skills/mil498-sdp/prompts/05-review.md +15 -0
  282. package/lib/bmad-extension/skills/mil498-sdp/prompts/06-save.md +14 -0
  283. package/lib/bmad-extension/skills/mil498-sdp/template.md +307 -0
  284. package/lib/bmad-extension/skills/mil498-srs/.gitkeep +0 -0
  285. package/lib/bmad-extension/skills/mil498-srs/SKILL.md +30 -0
  286. package/lib/bmad-extension/skills/mil498-srs/bmad-skill-manifest.yaml +5 -0
  287. package/lib/bmad-extension/skills/mil498-srs/prompts/01-discover-project-artifacts.md +42 -0
  288. package/lib/bmad-extension/skills/mil498-srs/prompts/02-load-template.md +10 -0
  289. package/lib/bmad-extension/skills/mil498-srs/prompts/03-generate-document.md +100 -0
  290. package/lib/bmad-extension/skills/mil498-srs/prompts/04-validate.md +16 -0
  291. package/lib/bmad-extension/skills/mil498-srs/prompts/05-review.md +15 -0
  292. package/lib/bmad-extension/skills/mil498-srs/prompts/06-save.md +18 -0
  293. package/lib/bmad-extension/skills/mil498-srs/template.md +219 -0
  294. package/lib/bmad-extension/skills/mil498-ssdd/.gitkeep +0 -0
  295. package/lib/bmad-extension/skills/mil498-ssdd/SKILL.md +32 -0
  296. package/lib/bmad-extension/skills/mil498-ssdd/bmad-skill-manifest.yaml +5 -0
  297. package/lib/bmad-extension/skills/mil498-ssdd/prompts/01-discover-project-artifacts.md +32 -0
  298. package/lib/bmad-extension/skills/mil498-ssdd/prompts/02-load-template.md +10 -0
  299. package/lib/bmad-extension/skills/mil498-ssdd/prompts/03-csci-discovery-interview.md +43 -0
  300. package/lib/bmad-extension/skills/mil498-ssdd/prompts/04-generate-document.md +96 -0
  301. package/lib/bmad-extension/skills/mil498-ssdd/prompts/05-validate.md +14 -0
  302. package/lib/bmad-extension/skills/mil498-ssdd/prompts/06-review.md +16 -0
  303. package/lib/bmad-extension/skills/mil498-ssdd/prompts/07-save.md +16 -0
  304. package/lib/bmad-extension/skills/mil498-ssdd/template.md +154 -0
  305. package/lib/bmad-extension/skills/mil498-sss/.gitkeep +0 -0
  306. package/lib/bmad-extension/skills/mil498-sss/SKILL.md +31 -0
  307. package/lib/bmad-extension/skills/mil498-sss/bmad-skill-manifest.yaml +5 -0
  308. package/lib/bmad-extension/skills/mil498-sss/prompts/01-discover-project-artifacts.md +31 -0
  309. package/lib/bmad-extension/skills/mil498-sss/prompts/02-load-template.md +10 -0
  310. package/lib/bmad-extension/skills/mil498-sss/prompts/03-generate-document.md +108 -0
  311. package/lib/bmad-extension/skills/mil498-sss/prompts/04-validate.md +16 -0
  312. package/lib/bmad-extension/skills/mil498-sss/prompts/05-review.md +15 -0
  313. package/lib/bmad-extension/skills/mil498-sss/prompts/06-save.md +15 -0
  314. package/lib/bmad-extension/skills/mil498-sss/template.md +225 -0
  315. package/lib/bmad-extension/skills/mil498-std/.gitkeep +0 -0
  316. package/lib/bmad-extension/skills/mil498-std/SKILL.md +30 -0
  317. package/lib/bmad-extension/skills/mil498-std/bmad-skill-manifest.yaml +5 -0
  318. package/lib/bmad-extension/skills/mil498-std/prompts/01-discover-project-artifacts.md +42 -0
  319. package/lib/bmad-extension/skills/mil498-std/prompts/02-load-template.md +10 -0
  320. package/lib/bmad-extension/skills/mil498-std/prompts/03-generate-document.md +117 -0
  321. package/lib/bmad-extension/skills/mil498-std/prompts/04-validate.md +15 -0
  322. package/lib/bmad-extension/skills/mil498-std/prompts/05-review.md +15 -0
  323. package/lib/bmad-extension/skills/mil498-std/prompts/06-save.md +15 -0
  324. package/lib/bmad-extension/skills/mil498-std/template.md +188 -0
  325. package/lib/bmad-extension/skills/modify-sprint/.gitkeep +0 -0
  326. package/lib/bmad-extension/skills/modify-sprint/SKILL.md +259 -0
  327. package/lib/bmad-extension/skills/modify-sprint/bmad-skill-manifest.yaml +3 -0
  328. package/lib/bmad-extension/skills/project-context-expansion/.gitkeep +0 -0
  329. package/lib/bmad-extension/skills/project-context-expansion/SKILL.md +238 -0
  330. package/lib/bmad-extension/skills/project-context-expansion/bmad-skill-manifest.yaml +3 -0
  331. package/lib/bmad-extension/skills/sprint-status-view/.gitkeep +0 -0
  332. package/lib/bmad-extension/skills/sprint-status-view/SKILL.md +202 -0
  333. package/lib/bmad-extension/skills/sprint-status-view/bmad-skill-manifest.yaml +3 -0
  334. package/lib/bmad-extension/skills/sre-check-deployment-status/.gitkeep +0 -0
  335. package/lib/bmad-extension/skills/sre-check-deployment-status/SKILL.md +32 -0
  336. package/lib/bmad-extension/skills/sre-check-deployment-status/bmad-skill-manifest.yaml +3 -0
  337. package/lib/bmad-extension/skills/sre-check-secrets/.gitkeep +0 -0
  338. package/lib/bmad-extension/skills/sre-check-secrets/SKILL.md +23 -0
  339. package/lib/bmad-extension/skills/sre-check-secrets/bmad-skill-manifest.yaml +3 -0
  340. package/lib/bmad-extension/skills/sre-check-system-status/.gitkeep +0 -0
  341. package/lib/bmad-extension/skills/sre-check-system-status/SKILL.md +27 -0
  342. package/lib/bmad-extension/skills/sre-check-system-status/bmad-skill-manifest.yaml +3 -0
  343. package/lib/bmad-extension/skills/sre-day-2-ops/.gitkeep +0 -0
  344. package/lib/bmad-extension/skills/sre-day-2-ops/SKILL.md +26 -0
  345. package/lib/bmad-extension/skills/sre-day-2-ops/bmad-skill-manifest.yaml +3 -0
  346. package/lib/bmad-extension/skills/sre-deployment-strategies/.gitkeep +0 -0
  347. package/lib/bmad-extension/skills/sre-deployment-strategies/SKILL.md +28 -0
  348. package/lib/bmad-extension/skills/sre-deployment-strategies/bmad-skill-manifest.yaml +3 -0
  349. package/lib/bmad-extension/skills/sre-fix-deployments/.gitkeep +0 -0
  350. package/lib/bmad-extension/skills/sre-fix-deployments/SKILL.md +25 -0
  351. package/lib/bmad-extension/skills/sre-fix-deployments/bmad-skill-manifest.yaml +3 -0
  352. package/lib/bmad-extension/skills/sre-gitops-status/.gitkeep +0 -0
  353. package/lib/bmad-extension/skills/sre-gitops-status/SKILL.md +25 -0
  354. package/lib/bmad-extension/skills/sre-gitops-status/bmad-skill-manifest.yaml +3 -0
  355. package/lib/bmad.js +541 -1
  356. package/lib/installer.js +12 -8
  357. package/opencode.json +1 -4
  358. package/package.json +3 -3
  359. package/test/bmad-extension.test.js +115 -69
  360. package/test/bmad-version-bump.test.js +313 -0
  361. package/test/convert-agents-to-skills.test.js +245 -0
  362. package/test/extension-module-restructure.test.js +359 -0
  363. package/test/integration-verification.test.js +71 -40
  364. package/test/migration-validation.test.js +499 -0
  365. package/test/migration.test.js +832 -0
  366. package/test/opencode-json-injection.test.js +25 -17
  367. package/test/opencode-json-merge.test.js +52 -33
  368. package/test/story-15-5-workflow-skills.test.js +311 -0
  369. package/test/yes-flag.test.js +8 -1
  370. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.idx +0 -0
  371. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.pack +0 -0
  372. package/lib/bmad-cache/bmb/_git_preserved/objects/pack/pack-c6e539e2308f8ed764c5b54b6ab68a67f8a3796b.rev +0 -0
  373. package/lib/bmad-cache/bmb/samples/bmad-agent-dream-weaver/bmad-manifest.json +0 -62
  374. package/lib/bmad-cache/bmb/samples/bmad-excalidraw/bmad-manifest.json +0 -18
  375. package/lib/bmad-cache/bmb/src/module-help.csv +0 -7
  376. package/lib/bmad-cache/bmb/src/module.yaml +0 -20
  377. package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/bmad-manifest.json +0 -24
  378. package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/bmad-manifest-schema.json +0 -103
  379. package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/generate-html-report.py +0 -1002
  380. package/lib/bmad-cache/bmb/src/skills/bmad-agent-builder/scripts/manifest.py +0 -420
  381. package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/bmad-manifest.json +0 -23
  382. package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/bmad-manifest-schema.json +0 -103
  383. package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/generate-html-report.py +0 -1002
  384. package/lib/bmad-cache/bmb/src/skills/bmad-workflow-builder/scripts/manifest.py +0 -420
  385. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.idx +0 -0
  386. package/lib/bmad-cache/cis/_git_preserved/objects/pack/pack-157d7eb8d527233a8607d926fc74ebf87f2ae0d3.rev +0 -0
  387. package/lib/bmad-cache/cis/src/agents/brainstorming-coach.agent.yaml +0 -21
  388. package/lib/bmad-cache/cis/src/agents/creative-problem-solver.agent.yaml +0 -21
  389. package/lib/bmad-cache/cis/src/agents/design-thinking-coach.agent.yaml +0 -21
  390. package/lib/bmad-cache/cis/src/agents/innovation-strategist.agent.yaml +0 -21
  391. package/lib/bmad-cache/cis/src/agents/presentation-master.agent.yaml +0 -53
  392. package/lib/bmad-cache/cis/src/agents/storyteller/storyteller.agent.yaml +0 -25
  393. package/lib/bmad-cache/cis/src/teams/creative-squad.yaml +0 -7
  394. package/lib/bmad-cache/cis/src/teams/default-party.csv +0 -12
  395. package/lib/bmad-cache/cis/src/workflows/README.md +0 -175
  396. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.idx +0 -0
  397. package/lib/bmad-cache/gds/_git_preserved/objects/pack/pack-44faafb9245b4ca17ad81bd6c9e6fc52fb5915a1.rev +0 -0
  398. package/lib/bmad-cache/gds/_git_preserved/refs/tags/v0.2.2 +0 -1
  399. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.idx +0 -0
  400. package/lib/bmad-cache/tea/_git_preserved/objects/pack/pack-96ec1ce3a9ef4c891e00e060795b4434ba8f7163.rev +0 -0
  401. package/lib/bmad-cache/tea/_git_preserved/refs/tags/v1.7.0 +0 -1
  402. package/lib/bmad-cache/tea/docs/MIGRATION.md +0 -488
  403. package/lib/bmad-cache/tea/src/agents/tea.agent.yaml +0 -67
  404. package/lib/bmad-cache/tea/src/teams/default-party.csv +0 -2
  405. package/lib/bmad-customizations/bmm-cyber.customize.yaml +0 -24
  406. package/lib/bmad-customizations/bmm-devops.customize.yaml +0 -24
  407. package/lib/bmad-customizations/bmm-mil498.customize.yaml +0 -36
  408. package/lib/bmad-customizations/bmm-sre.customize.yaml +0 -24
  409. package/lib/bmad-customizations/cyber.md +0 -71
  410. package/lib/bmad-customizations/devops.md +0 -71
  411. package/lib/bmad-customizations/mil498.md +0 -75
  412. package/lib/bmad-customizations/sre.md +0 -71
  413. package/lib/bmad-extension/agents/bmm-architect.customize.yaml +0 -5
  414. package/lib/bmad-extension/agents/bmm-bmad-master.customize.yaml +0 -5
  415. package/lib/bmad-extension/agents/bmm-cyber.customize.yaml +0 -30
  416. package/lib/bmad-extension/agents/bmm-dev.customize.yaml +0 -5
  417. package/lib/bmad-extension/agents/bmm-devops.customize.yaml +0 -30
  418. package/lib/bmad-extension/agents/bmm-mil498.customize.yaml +0 -42
  419. package/lib/bmad-extension/agents/bmm-pm.customize.yaml +0 -5
  420. package/lib/bmad-extension/agents/bmm-qa.customize.yaml +0 -5
  421. package/lib/bmad-extension/agents/bmm-sm.customize.yaml +0 -5
  422. package/lib/bmad-extension/agents/bmm-sre.customize.yaml +0 -30
  423. package/lib/bmad-extension/agents/bmm-tech-writer.customize.yaml +0 -5
  424. package/lib/bmad-extension/agents/bmm-ux-designer.customize.yaml +0 -5
  425. /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-agent-builder/scripts/scan-scripts.py +0 -0
  426. /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/prepass-prompt-metrics.py +0 -0
  427. /package/lib/bmad-cache/bmb/{src/skills → skills}/bmad-workflow-builder/scripts/scan-scripts.py +0 -0
  428. /package/lib/bmad-cache/{bmb/src/skills/bmad-agent-builder → cis/src/skills/bmad-cis-design-thinking}/bmad-skill-manifest.yaml +0 -0
  429. /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-design-thinking/design-methods.csv +0 -0
  430. /package/lib/bmad-cache/{bmb/src/skills/bmad-workflow-builder → cis/src/skills/bmad-cis-innovation-strategy}/bmad-skill-manifest.yaml +0 -0
  431. /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-innovation-strategy/innovation-frameworks.csv +0 -0
  432. /package/lib/bmad-cache/cis/src/{workflows/bmad-cis-design-thinking → skills/bmad-cis-problem-solving}/bmad-skill-manifest.yaml +0 -0
  433. /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-problem-solving/solving-methods.csv +0 -0
  434. /package/lib/bmad-cache/cis/src/{workflows/bmad-cis-innovation-strategy → skills/bmad-cis-storytelling}/bmad-skill-manifest.yaml +0 -0
  435. /package/lib/bmad-cache/cis/src/{workflows → skills}/bmad-cis-storytelling/story-types.csv +0 -0
  436. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/adr-quality-readiness-checklist.md +0 -0
  437. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/api-request.md +0 -0
  438. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/api-testing-patterns.md +0 -0
  439. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/auth-session.md +0 -0
  440. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/burn-in.md +0 -0
  441. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/ci-burn-in.md +0 -0
  442. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/component-tdd.md +0 -0
  443. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/contract-testing.md +0 -0
  444. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/data-factories.md +0 -0
  445. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/email-auth.md +0 -0
  446. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/error-handling.md +0 -0
  447. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/feature-flags.md +0 -0
  448. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/file-utils.md +0 -0
  449. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/fixture-architecture.md +0 -0
  450. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/fixtures-composition.md +0 -0
  451. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/intercept-network-call.md +0 -0
  452. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/log.md +0 -0
  453. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-error-monitor.md +0 -0
  454. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-first.md +0 -0
  455. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/network-recorder.md +0 -0
  456. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/nfr-criteria.md +0 -0
  457. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/overview.md +0 -0
  458. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-consumer-di.md +0 -0
  459. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-consumer-framework-setup.md +0 -0
  460. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pact-mcp.md +0 -0
  461. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-consumer-helpers.md +0 -0
  462. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-overview.md +0 -0
  463. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-provider-verifier.md +0 -0
  464. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/pactjs-utils-request-filter.md +0 -0
  465. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/playwright-cli.md +0 -0
  466. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/playwright-config.md +0 -0
  467. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/probability-impact.md +0 -0
  468. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/recurse.md +0 -0
  469. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/risk-governance.md +0 -0
  470. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/selective-testing.md +0 -0
  471. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/selector-resilience.md +0 -0
  472. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-healing-patterns.md +0 -0
  473. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-levels-framework.md +0 -0
  474. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-priorities-matrix.md +0 -0
  475. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/test-quality.md +0 -0
  476. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/timing-debugging.md +0 -0
  477. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/knowledge/visual-debugging.md +0 -0
  478. /package/lib/bmad-cache/tea/src/{testarch → agents/bmad-tea/resources}/tea-index.csv +0 -0
  479. /package/lib/bmad-cache/{cis/src/workflows/bmad-cis-problem-solving → wds/src/workflows/wds-0-alignment-signoff}/bmad-skill-manifest.yaml +0 -0
  480. /package/lib/bmad-cache/{cis/src/workflows/bmad-cis-storytelling → wds/src/workflows/wds-0-project-setup}/bmad-skill-manifest.yaml +0 -0
@@ -1,12 +1,15 @@
1
1
  #!/usr/bin/env python3
2
2
  """Deterministic path standards scanner for BMad skills.
3
3
 
4
- Validates all .md files against BMad path conventions:
4
+ Validates all .md and .json files against BMad path conventions:
5
5
  1. {project-root} only valid before /_bmad
6
6
  2. Bare _bmad references must have {project-root} prefix
7
7
  3. Config variables used directly (no double-prefix)
8
- 4. No ./ or ../ relative prefixes
9
- 5. No absolute paths
8
+ 4. Skill-internal paths must use ./ prefix (references/, scripts/, assets/)
9
+ 5. No ../ parent directory references
10
+ 6. No absolute paths
11
+ 7. Frontmatter allows only name and description
12
+ 8. No .md files at skill root except SKILL.md
10
13
  """
11
14
 
12
15
  # /// script
@@ -32,13 +35,18 @@ BARE_BMAD_RE = re.compile(r'(?<!\{project-root\}/)_bmad[/\s]')
32
35
  # Absolute paths
33
36
  ABSOLUTE_PATH_RE = re.compile(r'(?:^|[\s"`\'(])(/(?:Users|home|opt|var|tmp|etc|usr)/\S+)', re.MULTILINE)
34
37
  HOME_PATH_RE = re.compile(r'(?:^|[\s"`\'(])(~/\S+)', re.MULTILINE)
35
- # Relative prefixes
38
+ # Parent directory reference (still invalid)
36
39
  RELATIVE_DOT_RE = re.compile(r'(?:^|[\s"`\'(])(\.\./\S+)', re.MULTILINE)
37
- RELATIVE_DOTSLASH_RE = re.compile(r'(?:^|[\s"`\'(])(\./\S+)', re.MULTILINE)
40
+ # Bare skill-internal paths without ./ prefix
41
+ # Match references/, scripts/, assets/ when NOT preceded by ./
42
+ BARE_INTERNAL_RE = re.compile(r'(?:^|[\s"`\'(])(?<!\./)((?:references|scripts|assets)/\S+)', re.MULTILINE)
38
43
 
39
44
  # Fenced code block detection (to skip examples showing wrong patterns)
40
45
  FENCE_RE = re.compile(r'^```', re.MULTILINE)
41
46
 
47
+ # Valid frontmatter keys
48
+ VALID_FRONTMATTER_KEYS = {'name', 'description'}
49
+
42
50
 
43
51
  def is_in_fenced_block(content: str, pos: int) -> bool:
44
52
  """Check if a position is inside a fenced code block."""
@@ -52,6 +60,76 @@ def get_line_number(content: str, pos: int) -> int:
52
60
  return content[:pos].count('\n') + 1
53
61
 
54
62
 
63
+ def check_frontmatter(content: str, filepath: Path) -> list[dict]:
64
+ """Validate SKILL.md frontmatter contains only allowed keys."""
65
+ findings = []
66
+ if filepath.name != 'SKILL.md':
67
+ return findings
68
+
69
+ if not content.startswith('---'):
70
+ findings.append({
71
+ 'file': filepath.name,
72
+ 'line': 1,
73
+ 'severity': 'critical',
74
+ 'category': 'frontmatter',
75
+ 'title': 'SKILL.md missing frontmatter block',
76
+ 'detail': 'SKILL.md must start with --- frontmatter containing name and description',
77
+ 'action': 'Add frontmatter with name and description fields',
78
+ })
79
+ return findings
80
+
81
+ # Find closing ---
82
+ end = content.find('\n---', 3)
83
+ if end == -1:
84
+ findings.append({
85
+ 'file': filepath.name,
86
+ 'line': 1,
87
+ 'severity': 'critical',
88
+ 'category': 'frontmatter',
89
+ 'title': 'SKILL.md frontmatter block not closed',
90
+ 'detail': 'Missing closing --- for frontmatter',
91
+ 'action': 'Add closing --- after frontmatter fields',
92
+ })
93
+ return findings
94
+
95
+ frontmatter = content[4:end]
96
+ for i, line in enumerate(frontmatter.split('\n'), start=2):
97
+ line = line.strip()
98
+ if not line or line.startswith('#'):
99
+ continue
100
+ if ':' in line:
101
+ key = line.split(':', 1)[0].strip()
102
+ if key not in VALID_FRONTMATTER_KEYS:
103
+ findings.append({
104
+ 'file': filepath.name,
105
+ 'line': i,
106
+ 'severity': 'high',
107
+ 'category': 'frontmatter',
108
+ 'title': f'Invalid frontmatter key: {key}',
109
+ 'detail': f'Only {", ".join(sorted(VALID_FRONTMATTER_KEYS))} are allowed in frontmatter',
110
+ 'action': f'Remove {key} from frontmatter — use as content field in SKILL.md body instead',
111
+ })
112
+
113
+ return findings
114
+
115
+
116
+ def check_root_md_files(skill_path: Path) -> list[dict]:
117
+ """Check that no .md files exist at skill root except SKILL.md."""
118
+ findings = []
119
+ for md_file in skill_path.glob('*.md'):
120
+ if md_file.name != 'SKILL.md':
121
+ findings.append({
122
+ 'file': md_file.name,
123
+ 'line': 0,
124
+ 'severity': 'high',
125
+ 'category': 'structure',
126
+ 'title': f'Prompt file at skill root: {md_file.name}',
127
+ 'detail': 'All progressive disclosure content must be in ./references/ — only SKILL.md belongs at root',
128
+ 'action': f'Move {md_file.name} to references/{md_file.name}',
129
+ })
130
+ return findings
131
+
132
+
55
133
  def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
56
134
  """Scan a single file for path standard violations."""
57
135
  findings = []
@@ -65,10 +143,10 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
65
143
  'Absolute path found — not portable across machines'),
66
144
  (HOME_PATH_RE, 'absolute-path', 'high',
67
145
  'Home directory path (~/) found — environment-specific'),
68
- (RELATIVE_DOT_RE, 'relative-prefix', 'medium',
146
+ (RELATIVE_DOT_RE, 'relative-prefix', 'high',
69
147
  'Parent directory reference (../) found — fragile, breaks with reorganization'),
70
- (RELATIVE_DOTSLASH_RE, 'relative-prefix', 'medium',
71
- 'Relative prefix (./) foundbreaks when execution directory changes'),
148
+ (BARE_INTERNAL_RE, 'bare-internal-path', 'high',
149
+ 'Bare skill-internal path without ./ prefixuse ./references/, ./scripts/, ./assets/ to distinguish from {project-root} paths'),
72
150
  ]
73
151
 
74
152
  for pattern, category, severity, message in checks:
@@ -94,9 +172,6 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
94
172
  pos = match.start()
95
173
  if skip_fenced and is_in_fenced_block(content, pos):
96
174
  continue
97
- # Check that this isn't part of {project-root}/_bmad
98
- # The negative lookbehind handles this, but double-check
99
- # the broader context
100
175
  start = max(0, pos - 30)
101
176
  before = content[start:pos]
102
177
  if '{project-root}/' in before:
@@ -117,13 +192,22 @@ def scan_file(filepath: Path, skip_fenced: bool = True) -> list[dict]:
117
192
 
118
193
 
119
194
  def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
120
- """Scan all .md files in a skill directory."""
195
+ """Scan all .md and .json files in a skill directory."""
121
196
  all_findings = []
122
197
 
123
- # Find all .md files
124
- md_files = sorted(skill_path.rglob('*.md'))
198
+ # Check for .md files at root that aren't SKILL.md
199
+ all_findings.extend(check_root_md_files(skill_path))
200
+
201
+ # Check SKILL.md frontmatter
202
+ skill_md = skill_path / 'SKILL.md'
203
+ if skill_md.exists():
204
+ content = skill_md.read_text(encoding='utf-8')
205
+ all_findings.extend(check_frontmatter(content, skill_md))
206
+
207
+ # Find all .md and .json files
208
+ md_files = sorted(list(skill_path.rglob('*.md')) + list(skill_path.rglob('*.json')))
125
209
  if not md_files:
126
- print(f"Warning: No .md files found in {skill_path}", file=sys.stderr)
210
+ print(f"Warning: No .md or .json files found in {skill_path}", file=sys.stderr)
127
211
 
128
212
  files_scanned = []
129
213
  for md_file in md_files:
@@ -142,6 +226,9 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
142
226
  'double_prefix': 0,
143
227
  'absolute_path': 0,
144
228
  'relative_prefix': 0,
229
+ 'bare_internal_path': 0,
230
+ 'frontmatter': 0,
231
+ 'structure': 0,
145
232
  }
146
233
 
147
234
  for f in all_findings:
@@ -155,7 +242,7 @@ def scan_skill(skill_path: Path, skip_fenced: bool = True) -> dict:
155
242
  return {
156
243
  'scanner': 'path-standards',
157
244
  'script': 'scan-path-standards.py',
158
- 'version': '1.0.0',
245
+ 'version': '2.0.0',
159
246
  'skill_path': str(skill_path),
160
247
  'timestamp': datetime.now(timezone.utc).isoformat(),
161
248
  'files_scanned': files_scanned,
@@ -0,0 +1,6 @@
1
+ module,skill,display-name,menu-code,description,action,args,phase,after,before,required,output-location,outputs
2
+ BMad Builder,bmad-builder-setup,Setup Builder Module,SB,"Install or update BMad Builder module config and help entries. Collects user preferences, writes config.yaml, and migrates legacy configs.",configure,,anytime,,,false,{project-root}/_bmad,config.yaml and config.user.yaml
3
+ BMad Builder,bmad-agent-builder,Build an Agent,BA,"Create, edit, convert, or fix an agent skill.",build-process,"[-H] [description | path]",anytime,,bmad-agent-builder:quality-optimizer,false,output_folder,agent skill
4
+ BMad Builder,bmad-agent-builder,Optimize an Agent,OA,Validate and optimize an existing agent skill. Produces a quality report.,quality-optimizer,[-H] [path],anytime,bmad-agent-builder:build-process,,false,bmad_builder_reports,quality report
5
+ BMad Builder,bmad-workflow-builder,Build a Workflow,BW,"Create, edit, convert, or fix a workflow or utility skill.",build-process,"[-H] [description | path]",anytime,,bmad-workflow-builder:quality-optimizer,false,output_folder,workflow skill
6
+ BMad Builder,bmad-workflow-builder,Optimize a Workflow,OW,Validate and optimize an existing workflow or utility skill. Produces a quality report.,quality-optimizer,[-H] [path],anytime,bmad-workflow-builder:build-process,,false,bmad_builder_reports,quality report
@@ -0,0 +1,20 @@
1
+ code: bmb
2
+ name: "BMad Builder"
3
+ description: "Standard Skill Compliant Factory for BMad Agents, Workflows and Modules"
4
+ module_version: 1.0.0
5
+ default_selected: false
6
+ module_greeting: >
7
+ Enjoy making your dream creations with the BMad Builder Module!
8
+ Run this again at any time if you want to reconfigure a setting or have updated the module, (or optionally just update _bmad/config.yaml and config.user.yaml to change existing values)
9
+
10
+ For questions, suggestions and support - check us on Discord at https://discord.gg/gk8jAdXWmj
11
+
12
+ bmad_builder_output_folder:
13
+ prompt: "Where should your custom output (agent, workflow, module config) be saved?"
14
+ default: "{project-root}/skills"
15
+ result: "{project-root}/{value}"
16
+
17
+ bmad_builder_reports:
18
+ prompt: "Output for Evals, Test, Quality and Planning Reports?"
19
+ default: "{project-root}/skills/reports"
20
+ result: "{project-root}/{value}"
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Documentation Link Validator
3
+ *
4
+ * Validates site-relative links in markdown files and attempts to fix broken ones.
5
+ *
6
+ * What it checks:
7
+ * - All site-relative links (starting with /) point to existing .md files
8
+ * - Anchor links (#section) point to valid headings
9
+ *
10
+ * What it fixes:
11
+ * - Broken links where the target file can be found elsewhere in /docs
12
+ *
13
+ * Usage:
14
+ * node tools/validate-doc-links.js # Dry run (validate and show issues)
15
+ * node tools/validate-doc-links.js --write # Fix auto-fixable issues
16
+ */
17
+
18
+ const fs = require('node:fs');
19
+ const path = require('node:path');
20
+
21
+ const DOCS_ROOT = path.resolve(__dirname, '../docs');
22
+ const DRY_RUN = !process.argv.includes('--write');
23
+
24
+ // Regex to match markdown links with site-relative paths or bare .md references
25
+ const LINK_REGEX = /\[([^\]]*)\]\(((?:\.{1,2}\/|\/)[^)]+|[\w][^)\s]*\.md(?:[?#][^)]*)?)\)/g;
26
+
27
+ // File extensions that are static assets, not markdown docs
28
+ const STATIC_ASSET_EXTENSIONS = ['.zip', '.txt', '.pdf', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.webp', '.ico'];
29
+
30
+ // Custom Astro page routes (not part of the docs content collection)
31
+ const CUSTOM_PAGE_ROUTES = new Set([]);
32
+
33
+ // Regex to extract headings for anchor validation
34
+ const HEADING_PATTERN = /^#{1,6}\s+(.+)$/gm;
35
+
36
+ /**
37
+ * Get all markdown files in docs directory, excluding _* directories/files
38
+ */
39
+ function getMarkdownFiles(dir) {
40
+ const files = [];
41
+
42
+ function walk(currentDir) {
43
+ const entries = fs.readdirSync(currentDir, { withFileTypes: true });
44
+
45
+ for (const entry of entries) {
46
+ const fullPath = path.join(currentDir, entry.name);
47
+
48
+ if (entry.name.startsWith('_')) {
49
+ continue;
50
+ }
51
+
52
+ if (entry.isDirectory()) {
53
+ walk(fullPath);
54
+ } else if (entry.isFile() && (entry.name.endsWith('.md') || entry.name.endsWith('.mdx'))) {
55
+ files.push(fullPath);
56
+ }
57
+ }
58
+ }
59
+
60
+ walk(dir);
61
+ return files;
62
+ }
63
+
64
+ /**
65
+ * Strip fenced code blocks from content
66
+ */
67
+ function stripCodeBlocks(content) {
68
+ return content.replaceAll(/```[\s\S]*?```/g, '');
69
+ }
70
+
71
+ /**
72
+ * Convert a heading to its anchor slug
73
+ */
74
+ function headingToAnchor(heading) {
75
+ return heading
76
+ .toLowerCase()
77
+ .replaceAll(/[\u{1F300}-\u{1F9FF}]/gu, '') // Remove emojis
78
+ .replaceAll(/[^\w\s-]/g, '') // Remove special chars
79
+ .replaceAll(/\s+/g, '-') // Spaces to hyphens
80
+ .replaceAll(/-+/g, '-') // Collapse hyphens
81
+ .replaceAll(/^-+|-+$/g, ''); // Trim hyphens
82
+ }
83
+
84
+ /**
85
+ * Extract anchor slugs from a markdown file
86
+ */
87
+ function extractAnchors(content) {
88
+ const anchors = new Set();
89
+ let match;
90
+
91
+ HEADING_PATTERN.lastIndex = 0;
92
+ while ((match = HEADING_PATTERN.exec(content)) !== null) {
93
+ const headingText = match[1]
94
+ .trim()
95
+ .replaceAll(/`[^`]+`/g, '')
96
+ .replaceAll(/\*\*([^*]+)\*\*/g, '$1')
97
+ .replaceAll(/\*([^*]+)\*/g, '$1')
98
+ .replaceAll(/\[([^\]]+)\]\([^)]+\)/g, '$1')
99
+ .trim();
100
+ anchors.add(headingToAnchor(headingText));
101
+ }
102
+
103
+ return anchors;
104
+ }
105
+
106
+ /**
107
+ * Resolve a site-relative link to a file path
108
+ * /docs/how-to/installation/install-bmad.md -> docs/how-to/installation/install-bmad.md
109
+ * /how-to/installation/install-bmad/ -> docs/how-to/installation/install-bmad.md or .../index.md
110
+ */
111
+ function resolveLink(siteRelativePath, sourceFile) {
112
+ // Strip anchor and query
113
+ let checkPath = siteRelativePath.split('#')[0].split('?')[0];
114
+
115
+ // Handle relative paths (including bare .md): resolve from source file's directory
116
+ if (checkPath.startsWith('./') || checkPath.startsWith('../') || (!checkPath.startsWith('/') && checkPath.endsWith('.md'))) {
117
+ const sourceDir = path.dirname(sourceFile);
118
+ const resolved = path.resolve(sourceDir, checkPath);
119
+ // Ensure the resolved path stays within DOCS_ROOT
120
+ if (!resolved.startsWith(DOCS_ROOT + path.sep) && resolved !== DOCS_ROOT) return null;
121
+ if (fs.existsSync(resolved) && fs.statSync(resolved).isFile()) return resolved;
122
+ if (fs.existsSync(resolved + '.md')) return resolved + '.md';
123
+ if (fs.existsSync(resolved + '.mdx')) return resolved + '.mdx';
124
+ // Directory: check for index.md or index.mdx
125
+ if (fs.existsSync(resolved) && fs.statSync(resolved).isDirectory()) {
126
+ const indexFile = path.join(resolved, 'index.md');
127
+ const indexMdxFile = path.join(resolved, 'index.mdx');
128
+ if (fs.existsSync(indexFile)) return indexFile;
129
+ if (fs.existsSync(indexMdxFile)) return indexMdxFile;
130
+ }
131
+ return null;
132
+ }
133
+
134
+ // Strip /docs/ prefix if present (legacy absolute links)
135
+ if (checkPath.startsWith('/docs/')) {
136
+ checkPath = checkPath.slice(5); // Remove '/docs' but keep leading '/'
137
+ }
138
+
139
+ if (checkPath.endsWith('/')) {
140
+ // Could be file.md, file.mdx, or directory/index.md/mdx
141
+ const baseName = checkPath.slice(0, -1);
142
+ const asMd = path.join(DOCS_ROOT, baseName + '.md');
143
+ const asMdx = path.join(DOCS_ROOT, baseName + '.mdx');
144
+ const asIndex = path.join(DOCS_ROOT, checkPath, 'index.md');
145
+ const asIndexMdx = path.join(DOCS_ROOT, checkPath, 'index.mdx');
146
+
147
+ if (fs.existsSync(asMd)) return asMd;
148
+ if (fs.existsSync(asMdx)) return asMdx;
149
+ if (fs.existsSync(asIndex)) return asIndex;
150
+ if (fs.existsSync(asIndexMdx)) return asIndexMdx;
151
+ return null;
152
+ }
153
+
154
+ // Direct path (e.g., /path/file.md)
155
+ const direct = path.join(DOCS_ROOT, checkPath);
156
+ if (fs.existsSync(direct) && fs.statSync(direct).isFile()) return direct;
157
+
158
+ // Try with .md extension
159
+ const withMd = direct + '.md';
160
+ if (fs.existsSync(withMd)) return withMd;
161
+
162
+ // Try with .mdx extension
163
+ const withMdx = direct + '.mdx';
164
+ if (fs.existsSync(withMdx)) return withMdx;
165
+
166
+ // Directory without trailing slash: check for index.md or index.mdx
167
+ if (fs.existsSync(direct) && fs.statSync(direct).isDirectory()) {
168
+ const indexFile = path.join(direct, 'index.md');
169
+ const indexMdxFile = path.join(direct, 'index.mdx');
170
+ if (fs.existsSync(indexFile)) return indexFile;
171
+ if (fs.existsSync(indexMdxFile)) return indexMdxFile;
172
+ }
173
+
174
+ return null;
175
+ }
176
+
177
+ /**
178
+ * Search for a file with directory context
179
+ */
180
+ function findFileWithContext(brokenPath) {
181
+ // Extract filename and parent directory from the broken path
182
+ // e.g., /tutorials/getting-started/foo/ -> parent: getting-started, file: foo.md
183
+ const cleanPath = brokenPath.replace(/\/$/, '').replace(/^(\.\.\/|\.\/|\/)+/, '');
184
+ const parts = cleanPath.split('/');
185
+ const fileName = parts.at(-1) + '.md';
186
+ const parentDir = parts.length > 1 ? parts.at(-2) : null;
187
+
188
+ const allFiles = getMarkdownFiles(DOCS_ROOT);
189
+ const matches = [];
190
+
191
+ for (const file of allFiles) {
192
+ const fileBaseName = path.basename(file);
193
+ const fileParentDir = path.basename(path.dirname(file));
194
+
195
+ // Exact filename match with parent directory context
196
+ if (fileBaseName === fileName) {
197
+ if (parentDir && fileParentDir === parentDir) {
198
+ // Strong match: both filename and parent dir match
199
+ return [file];
200
+ }
201
+ matches.push(file);
202
+ }
203
+
204
+ // Also check for index.md in a matching directory
205
+ if (fileBaseName === 'index.md' && fileParentDir === fileName.replace('.md', '')) {
206
+ matches.push(file);
207
+ }
208
+ }
209
+
210
+ return matches;
211
+ }
212
+
213
+ /**
214
+ * Convert absolute file path to site-relative URL
215
+ */
216
+ function fileToSiteRelative(filePath) {
217
+ let relative = '/' + path.relative(DOCS_ROOT, filePath);
218
+ relative = relative.split(path.sep).join('/');
219
+
220
+ if (relative.endsWith('/index.md')) {
221
+ return relative.replace(/\/index\.md$/, '/');
222
+ }
223
+ return relative.replace(/\.md$/, '/');
224
+ }
225
+
226
+ /**
227
+ * Process a single file and find issues
228
+ */
229
+ function processFile(filePath) {
230
+ const content = fs.readFileSync(filePath, 'utf-8');
231
+ const strippedContent = stripCodeBlocks(content);
232
+ const issues = [];
233
+
234
+ let match;
235
+ LINK_REGEX.lastIndex = 0;
236
+
237
+ while ((match = LINK_REGEX.exec(strippedContent)) !== null) {
238
+ const linkText = match[1];
239
+ const href = match[2];
240
+
241
+ // Extract path and anchor
242
+ const hashIndex = href.indexOf('#');
243
+ const linkPath = hashIndex === -1 ? href : href.slice(0, hashIndex);
244
+ const anchor = hashIndex === -1 ? null : href.slice(hashIndex + 1);
245
+
246
+ // Skip static asset links (zip, txt, images, etc.)
247
+ const linkLower = linkPath.toLowerCase();
248
+ if (STATIC_ASSET_EXTENSIONS.some((ext) => linkLower.endsWith(ext))) {
249
+ continue;
250
+ }
251
+
252
+ // Skip custom Astro page routes
253
+ if (CUSTOM_PAGE_ROUTES.has(linkPath)) {
254
+ continue;
255
+ }
256
+
257
+ // Validate the link target exists
258
+ const targetFile = resolveLink(linkPath, filePath);
259
+
260
+ if (!targetFile) {
261
+ // Link is broken - try to find the file
262
+ const candidates = findFileWithContext(linkPath);
263
+
264
+ const issue = {
265
+ type: 'broken-link',
266
+ linkText,
267
+ href,
268
+ linkPath,
269
+ fullMatch: match[0],
270
+ };
271
+
272
+ if (candidates.length === 1) {
273
+ issue.status = 'auto-fixable';
274
+ issue.suggestedFix = fileToSiteRelative(candidates[0]) + (anchor ? '#' + anchor : '');
275
+ issue.foundAt = path.relative(DOCS_ROOT, candidates[0]);
276
+ } else if (candidates.length > 1) {
277
+ issue.status = 'needs-review';
278
+ issue.candidates = candidates.map((c) => path.relative(DOCS_ROOT, c));
279
+ } else {
280
+ issue.status = 'manual-check';
281
+ }
282
+
283
+ issues.push(issue);
284
+ continue;
285
+ }
286
+
287
+ // Validate anchor if present
288
+ if (anchor) {
289
+ const targetContent = fs.readFileSync(targetFile, 'utf-8');
290
+ const anchors = extractAnchors(targetContent);
291
+
292
+ if (!anchors.has(anchor)) {
293
+ issues.push({
294
+ type: 'broken-anchor',
295
+ linkText,
296
+ href,
297
+ anchor,
298
+ status: 'manual-check',
299
+ message: `Anchor "#${anchor}" not found`,
300
+ });
301
+ }
302
+ }
303
+ }
304
+
305
+ return { content, issues };
306
+ }
307
+
308
+ /**
309
+ * Apply fixes to file content
310
+ */
311
+ function applyFixes(content, issues) {
312
+ let updated = content;
313
+
314
+ for (const issue of issues) {
315
+ if (issue.status === 'auto-fixable' && issue.suggestedFix) {
316
+ const oldLink = `[${issue.linkText}](${issue.href})`;
317
+ const newLink = `[${issue.linkText}](${issue.suggestedFix})`;
318
+ updated = updated.replace(oldLink, newLink);
319
+ }
320
+ }
321
+
322
+ return updated;
323
+ }
324
+
325
+ // Main execution
326
+ console.log(`\nValidating docs in: ${DOCS_ROOT}`);
327
+ console.log(`Mode: ${DRY_RUN ? 'DRY RUN (use --write to fix)' : 'WRITE MODE'}\n`);
328
+
329
+ const files = getMarkdownFiles(DOCS_ROOT);
330
+ console.log(`Found ${files.length} markdown files\n`);
331
+
332
+ let totalIssues = 0;
333
+ let autoFixable = 0;
334
+ let needsReview = 0;
335
+ let manualCheck = 0;
336
+ let filesWithIssues = 0;
337
+
338
+ const allIssues = [];
339
+
340
+ for (const filePath of files) {
341
+ const relativePath = path.relative(DOCS_ROOT, filePath);
342
+ const { content, issues } = processFile(filePath);
343
+
344
+ if (issues.length > 0) {
345
+ filesWithIssues++;
346
+ totalIssues += issues.length;
347
+
348
+ console.log(`\n${relativePath}`);
349
+
350
+ for (const issue of issues) {
351
+ if (issue.status === 'auto-fixable') {
352
+ autoFixable++;
353
+ console.log(` [FIX] ${issue.href}`);
354
+ console.log(` -> ${issue.suggestedFix}`);
355
+ } else if (issue.status === 'needs-review') {
356
+ needsReview++;
357
+ console.log(` [REVIEW] ${issue.href}`);
358
+ console.log(` Multiple matches found:`);
359
+ for (const candidate of issue.candidates) {
360
+ console.log(` - ${candidate}`);
361
+ }
362
+ } else if (issue.type === 'broken-anchor') {
363
+ manualCheck++;
364
+ console.log(` [MANUAL] ${issue.href}`);
365
+ console.log(` ${issue.message}`);
366
+ } else {
367
+ manualCheck++;
368
+ console.log(` [MANUAL] ${issue.href}`);
369
+ console.log(` File not found anywhere - may need to remove link`);
370
+ }
371
+
372
+ allIssues.push({ file: relativePath, ...issue });
373
+ }
374
+
375
+ // Apply fixes if not dry run
376
+ if (!DRY_RUN) {
377
+ const fixableIssues = issues.filter((i) => i.status === 'auto-fixable');
378
+ if (fixableIssues.length > 0) {
379
+ const updated = applyFixes(content, fixableIssues);
380
+ fs.writeFileSync(filePath, updated, 'utf-8');
381
+ }
382
+ }
383
+ }
384
+ }
385
+
386
+ console.log(`\n${'─'.repeat(60)}`);
387
+ console.log(`\nSummary:`);
388
+ console.log(` Files scanned: ${files.length}`);
389
+ console.log(` Files with issues: ${filesWithIssues}`);
390
+ console.log(` Total issues: ${totalIssues}`);
391
+
392
+ if (totalIssues > 0) {
393
+ console.log(`\n Breakdown:`);
394
+ console.log(` Auto-fixable: ${autoFixable}`);
395
+ console.log(` Needs review: ${needsReview}`);
396
+ console.log(` Manual check: ${manualCheck}`);
397
+ }
398
+
399
+ if (totalIssues === 0) {
400
+ console.log(`\n All links valid!`);
401
+ } else if (DRY_RUN && autoFixable > 0) {
402
+ console.log(`\nRun with --write to auto-fix ${autoFixable} issue(s)`);
403
+ }
404
+
405
+ console.log('');
406
+
407
+ process.exit(totalIssues > 0 ? 1 : 0);
@@ -223,7 +223,7 @@ function isExternalRef(refStr, moduleCode) {
223
223
  const match = refStr.match(/\{project-root\}\/_bmad\/([^/]+)\//);
224
224
  if (!match) return false;
225
225
  const refModule = match[1];
226
- // _memory, _config are special framework paths, not external modules
226
+ // .memory, _config are special framework paths, not external modules
227
227
  if (refModule.startsWith('_')) return false;
228
228
  return refModule !== moduleCode;
229
229
  }
@@ -1,30 +1,36 @@
1
1
  {
2
- "generated": "2026-03-17T12:12:36.622Z",
3
- "bmadMethodVersion": "6.0.4",
2
+ "generated": "2026-03-28T12:59:06.172Z",
3
+ "bmadMethodVersion": "6.2.1",
4
4
  "modules": {
5
5
  "bmb": {
6
6
  "url": "https://github.com/bmad-code-org/bmad-builder",
7
7
  "branch": "main",
8
- "commitSha": "4a790580a7812415bf7122c0e5680679af0527a9",
9
- "clonedAt": "2026-03-17T12:11:16.328Z"
8
+ "commitSha": "9a4ae856c2370fbee3d7e6e1b856725d809f7b53",
9
+ "clonedAt": "2026-03-28T12:58:52.327Z"
10
10
  },
11
11
  "cis": {
12
12
  "url": "https://github.com/bmad-code-org/bmad-module-creative-intelligence-suite",
13
13
  "branch": "main",
14
- "commitSha": "e6f643917d5493f097fd04b2b79644b16d7890dc",
15
- "clonedAt": "2026-03-17T12:11:26.877Z"
14
+ "commitSha": "1384f150290b63ec3d03b3a09413e5111ee0aebb",
15
+ "clonedAt": "2026-03-28T12:58:54.202Z"
16
16
  },
17
17
  "gds": {
18
18
  "url": "https://github.com/bmad-code-org/bmad-module-game-dev-studio.git",
19
19
  "branch": "main",
20
- "commitSha": "de35f329fd0583066c3f18909162fa55301cba47",
21
- "clonedAt": "2026-03-17T12:11:42.947Z"
20
+ "commitSha": "4744dea5fbfd5d23f3604aa9e83904b99473f6b7",
21
+ "clonedAt": "2026-03-28T12:58:56.135Z"
22
22
  },
23
23
  "tea": {
24
24
  "url": "https://github.com/bmad-code-org/bmad-method-test-architecture-enterprise",
25
25
  "branch": "main",
26
- "commitSha": "494044af3cb1723c2f32ca06cc5f5adaddfa24a7",
27
- "clonedAt": "2026-03-17T12:12:36.622Z"
26
+ "commitSha": "bd2ac72a4def9e8b0881407827293d66d9b009d5",
27
+ "clonedAt": "2026-03-28T12:59:03.930Z"
28
+ },
29
+ "wds": {
30
+ "url": "https://github.com/bmad-code-org/bmad-method-wds-expansion",
31
+ "branch": "main",
32
+ "commitSha": "ecb05128973f2a8c6f7da4eead6c682fb1b413bc",
33
+ "clonedAt": "2026-03-28T12:59:06.172Z"
28
34
  }
29
35
  }
30
36
  }