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
@@ -0,0 +1,245 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tests for Story 15-3: Convert 4 Custom Agents to BMAD 6.2.0 Skill Folders
4
+ *
5
+ * Verifies:
6
+ * - Each agent has SKILL.md and bmad-skill-manifest.yaml
7
+ * - SKILL.md contains Persona, Menu, Critical Actions sections
8
+ * - bmad-skill-manifest.yaml has all required fields
9
+ * - Menu items reference new skill names (not old paths)
10
+ */
11
+ 'use strict';
12
+
13
+ const assert = require('assert');
14
+ const path = require('path');
15
+ const fs = require('fs');
16
+
17
+ const PROJECT_ROOT = path.join(__dirname, '..');
18
+ const SKILLS_DIR = path.join(PROJECT_ROOT, 'lib', 'bmad-extension', 'skills');
19
+
20
+ let passed = 0;
21
+ let failed = 0;
22
+ const errors = [];
23
+
24
+ function test(name, fn) {
25
+ try {
26
+ fn();
27
+ console.log(` \u2713 ${name}`);
28
+ passed++;
29
+ } catch (err) {
30
+ console.error(` \u2717 ${name}: ${err.message}`);
31
+ failed++;
32
+ errors.push({ name, error: err.message });
33
+ }
34
+ }
35
+
36
+ // ─── Agent definitions ───────────────────────────────────────────────────────
37
+ const AGENTS = [
38
+ {
39
+ folder: 'bmad-ma-agent-sre',
40
+ name: 'bmad-ma-agent-sre',
41
+ displayName: 'Alex',
42
+ title: 'SRE Agent',
43
+ skillNames: ['sre-health-check', 'sre-fix-deployments', 'sre-performance-opt'],
44
+ oldPaths: ['bmm/workflows/sre/', '_bmad/bmm/workflows/sre/'],
45
+ chatTopic: 'reliability',
46
+ menuItemCount: 6 // MH, CH, HC, FD, PO, DA
47
+ },
48
+ {
49
+ folder: 'bmad-ma-agent-devops',
50
+ name: 'bmad-ma-agent-devops',
51
+ displayName: 'Amit',
52
+ title: 'DevOps Agent',
53
+ skillNames: ['devops-configure-infrastructure', 'devops-optimize-pipelines', 'devops-manage-helm'],
54
+ oldPaths: ['bmm/workflows/devops/', '_bmad/bmm/workflows/devops/'],
55
+ chatTopic: 'DevOps',
56
+ menuItemCount: 6 // MH, CH, CO, PL, MH(helm), DA
57
+ },
58
+ {
59
+ folder: 'bmad-ma-agent-cyber',
60
+ name: 'bmad-ma-agent-cyber',
61
+ displayName: 'Yael',
62
+ title: 'Cyber Analyst',
63
+ skillNames: ['cyber-vulnerability-scan', 'cyber-security-audit', 'cyber-threat-modeling'],
64
+ oldPaths: ['bmm/workflows/cyber/', '_bmad/custom/workflows/cyber/'],
65
+ chatTopic: 'security',
66
+ menuItemCount: 6 // MH, CH, VS, SA, TM, DA
67
+ },
68
+ {
69
+ folder: 'bmad-ma-agent-mil498',
70
+ name: 'bmad-ma-agent-mil498',
71
+ displayName: 'Joseph',
72
+ title: 'MIL-STD-498 Expert',
73
+ skillNames: ['mil498-srs', 'mil498-sdd', 'mil498-sdp', 'mil498-ocd', 'mil498-sss', 'mil498-std', 'mil498-ssdd'],
74
+ oldPaths: ['bmm/workflows/mil498/', '_bmad/bmm/workflows/mil498/'],
75
+ chatTopic: 'MIL-STD-498',
76
+ menuItemCount: 10 // MH, CH, GS, GD, GP, GO, SS, GT, SD, DA
77
+ }
78
+ ];
79
+
80
+ const REQUIRED_MANIFEST_FIELDS = [
81
+ 'type', 'name', 'displayName', 'title', 'capabilities',
82
+ 'role', 'identity', 'communicationStyle', 'principles', 'module'
83
+ ];
84
+
85
+ // ─── File existence tests ────────────────────────────────────────────────────
86
+ console.log('\n File existence tests\n');
87
+
88
+ for (const agent of AGENTS) {
89
+ const skillDir = path.join(SKILLS_DIR, agent.folder);
90
+
91
+ test(`${agent.folder}: SKILL.md exists`, () => {
92
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
93
+ assert.ok(fs.existsSync(skillMdPath), `Missing: ${skillMdPath}`);
94
+ });
95
+
96
+ test(`${agent.folder}: bmad-skill-manifest.yaml exists`, () => {
97
+ const manifestPath = path.join(skillDir, 'bmad-skill-manifest.yaml');
98
+ assert.ok(fs.existsSync(manifestPath), `Missing: ${manifestPath}`);
99
+ });
100
+ }
101
+
102
+ // ─── SKILL.md content tests ─────────────────────────────────────────────────
103
+ console.log('\n SKILL.md content tests\n');
104
+
105
+ for (const agent of AGENTS) {
106
+ const skillDir = path.join(SKILLS_DIR, agent.folder);
107
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
108
+
109
+ let content = '';
110
+ try {
111
+ content = fs.readFileSync(skillMdPath, 'utf8');
112
+ } catch (e) {
113
+ // File not found — tests will fail naturally
114
+ }
115
+
116
+ test(`${agent.folder}: SKILL.md contains Persona section`, () => {
117
+ assert.ok(content.includes('## Persona'), 'Missing ## Persona section');
118
+ });
119
+
120
+ test(`${agent.folder}: SKILL.md contains Menu section`, () => {
121
+ assert.ok(content.includes('## Menu'), 'Missing ## Menu section');
122
+ });
123
+
124
+ test(`${agent.folder}: SKILL.md contains Critical Actions section`, () => {
125
+ assert.ok(content.includes('## Critical Actions'), 'Missing ## Critical Actions section');
126
+ });
127
+
128
+ test(`${agent.folder}: SKILL.md contains Activation Sequence section`, () => {
129
+ assert.ok(content.includes('## Activation Sequence'), 'Missing ## Activation Sequence section');
130
+ });
131
+
132
+ test(`${agent.folder}: SKILL.md contains agent display name (${agent.displayName})`, () => {
133
+ assert.ok(content.includes(agent.displayName), `Missing display name: ${agent.displayName}`);
134
+ });
135
+
136
+ test(`${agent.folder}: SKILL.md contains Role field`, () => {
137
+ assert.ok(content.includes('**Role:**'), 'Missing **Role:** field');
138
+ });
139
+
140
+ test(`${agent.folder}: SKILL.md contains Identity field`, () => {
141
+ assert.ok(content.includes('**Identity:**'), 'Missing **Identity:** field');
142
+ });
143
+
144
+ test(`${agent.folder}: SKILL.md contains Communication Style field`, () => {
145
+ assert.ok(content.includes('**Communication Style:**'), 'Missing **Communication Style:** field');
146
+ });
147
+
148
+ test(`${agent.folder}: SKILL.md contains Principles field`, () => {
149
+ assert.ok(content.includes('**Principles:**'), 'Missing **Principles:** field');
150
+ });
151
+
152
+ // Verify menu references new skill names
153
+ for (const skillName of agent.skillNames) {
154
+ test(`${agent.folder}: Menu references skill "${skillName}"`, () => {
155
+ assert.ok(content.includes(skillName), `Missing skill reference: ${skillName}`);
156
+ });
157
+ }
158
+
159
+ // Verify NO old workflow paths remain in menu
160
+ for (const oldPath of agent.oldPaths) {
161
+ test(`${agent.folder}: No old path references "${oldPath}" in SKILL.md`, () => {
162
+ assert.ok(!content.includes(oldPath), `Old path still referenced: ${oldPath}`);
163
+ });
164
+ }
165
+ }
166
+
167
+ // ─── bmad-skill-manifest.yaml content tests ──────────────────────────────────
168
+ console.log('\n bmad-skill-manifest.yaml content tests\n');
169
+
170
+ for (const agent of AGENTS) {
171
+ const skillDir = path.join(SKILLS_DIR, agent.folder);
172
+ const manifestPath = path.join(skillDir, 'bmad-skill-manifest.yaml');
173
+
174
+ let content = '';
175
+ try {
176
+ content = fs.readFileSync(manifestPath, 'utf8');
177
+ } catch (e) {
178
+ // File not found — tests will fail naturally
179
+ }
180
+
181
+ // Parse simple YAML key-value pairs (no nested structures expected)
182
+ const fields = {};
183
+ for (const line of content.split('\n')) {
184
+ const match = line.match(/^(\w+):\s*(.+)$/);
185
+ if (match) {
186
+ fields[match[1]] = match[2].replace(/^["']|["']$/g, '');
187
+ }
188
+ }
189
+
190
+ for (const field of REQUIRED_MANIFEST_FIELDS) {
191
+ test(`${agent.folder}: manifest has required field "${field}"`, () => {
192
+ assert.ok(fields[field], `Missing or empty field: ${field}`);
193
+ });
194
+ }
195
+
196
+ test(`${agent.folder}: manifest type is "agent"`, () => {
197
+ assert.strictEqual(fields.type, 'agent', `Expected type: agent, got: ${fields.type}`);
198
+ });
199
+
200
+ test(`${agent.folder}: manifest name matches "${agent.name}"`, () => {
201
+ assert.strictEqual(fields.name, agent.name, `Expected name: ${agent.name}, got: ${fields.name}`);
202
+ });
203
+
204
+ test(`${agent.folder}: manifest displayName is "${agent.displayName}"`, () => {
205
+ assert.strictEqual(fields.displayName, agent.displayName, `Expected displayName: ${agent.displayName}, got: ${fields.displayName}`);
206
+ });
207
+
208
+ test(`${agent.folder}: manifest module is "ma-skills"`, () => {
209
+ assert.strictEqual(fields.module, 'ma-skills', `Expected module: ma-skills, got: ${fields.module}`);
210
+ });
211
+ }
212
+
213
+ // ─── Cross-validation: Critical Actions match extension customize.yaml ────────
214
+ console.log('\n Critical Actions cross-validation\n');
215
+
216
+ for (const agent of AGENTS) {
217
+ const skillDir = path.join(SKILLS_DIR, agent.folder);
218
+ const skillMdPath = path.join(skillDir, 'SKILL.md');
219
+
220
+ let content = '';
221
+ try {
222
+ content = fs.readFileSync(skillMdPath, 'utf8');
223
+ } catch (e) {
224
+ // File not found
225
+ }
226
+
227
+ test(`${agent.folder}: Critical Actions includes MANIFEST reading`, () => {
228
+ assert.ok(content.includes('Read the skills MANIFEST'), 'Missing MANIFEST reading action');
229
+ });
230
+
231
+ test(`${agent.folder}: Critical Actions includes always_load skill reading`, () => {
232
+ assert.ok(content.includes('always_load: true'), 'Missing always_load skill reading action');
233
+ });
234
+
235
+ test(`${agent.folder}: Critical Actions includes project-context check`, () => {
236
+ assert.ok(content.includes('project-context.md'), 'Missing project-context check');
237
+ });
238
+ }
239
+
240
+ // ─── Results ──────────────────────────────────────────────────────────────────
241
+ console.log(`\n ${passed} passed, ${failed} failed\n`);
242
+ if (failed > 0) {
243
+ errors.forEach(e => console.error(` \u2717 ${e.name}: ${e.error}`));
244
+ process.exit(1);
245
+ }
@@ -0,0 +1,359 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Tests for extension module restructure (Story 15-2)
4
+ *
5
+ * Verifies:
6
+ * - module.yaml has all required fields for BMAD 6.2.0 conventions
7
+ * - skills/ directory exists with correct subdirectories
8
+ * - module-help.csv has entries for all skills
9
+ * - Old agents/ and workflows/ directories still exist (preserved for 15.3-15.6)
10
+ */
11
+ 'use strict';
12
+
13
+ const assert = require('assert');
14
+ const path = require('path');
15
+ const fs = require('fs');
16
+
17
+ const PROJECT_ROOT = path.join(__dirname, '..');
18
+ const EXTENSION_DIR = path.join(PROJECT_ROOT, 'lib', 'bmad-extension');
19
+
20
+ let passed = 0;
21
+ let failed = 0;
22
+ const errors = [];
23
+
24
+ function test(name, fn) {
25
+ try {
26
+ fn();
27
+ console.log(` \u2713 ${name}`);
28
+ passed++;
29
+ } catch (err) {
30
+ console.error(` \u2717 ${name}: ${err.message}`);
31
+ failed++;
32
+ errors.push({ name, error: err.message });
33
+ }
34
+ }
35
+
36
+ // ─── Helper: parse simple YAML (key: value pairs) ──────────────────────────
37
+ function parseSimpleYaml(content) {
38
+ const result = {};
39
+ for (const line of content.split('\n')) {
40
+ const trimmed = line.trim();
41
+ if (!trimmed || trimmed.startsWith('#')) continue;
42
+ const colonIdx = trimmed.indexOf(':');
43
+ if (colonIdx === -1) continue;
44
+ const key = trimmed.slice(0, colonIdx).trim();
45
+ let val = trimmed.slice(colonIdx + 1).trim();
46
+ // Strip surrounding quotes
47
+ if ((val.startsWith('"') && val.endsWith('"')) || (val.startsWith("'") && val.endsWith("'"))) {
48
+ val = val.slice(1, -1);
49
+ }
50
+ result[key] = val;
51
+ }
52
+ return result;
53
+ }
54
+
55
+ // ─── Helper: parse CSV ──────────────────────────────────────────────────────
56
+ function parseCsv(content) {
57
+ const lines = content.trim().split('\n').filter(l => l.trim());
58
+ if (lines.length === 0) return { headers: [], rows: [] };
59
+ const headers = lines[0].split(',').map(h => h.trim());
60
+ const rows = lines.slice(1).map(line => {
61
+ // Handle quoted fields with commas
62
+ const fields = [];
63
+ let current = '';
64
+ let inQuotes = false;
65
+ for (const ch of line) {
66
+ if (ch === '"') {
67
+ inQuotes = !inQuotes;
68
+ } else if (ch === ',' && !inQuotes) {
69
+ fields.push(current.trim());
70
+ current = '';
71
+ } else {
72
+ current += ch;
73
+ }
74
+ }
75
+ fields.push(current.trim());
76
+ return fields;
77
+ });
78
+ return { headers, rows };
79
+ }
80
+
81
+ // ═══════════════════════════════════════════════════════════════════════════════
82
+ // Task 1: module.yaml validation
83
+ // ═══════════════════════════════════════════════════════════════════════════════
84
+ console.log('\n--- Task 1: module.yaml ---');
85
+
86
+ const moduleYamlPath = path.join(EXTENSION_DIR, 'module.yaml');
87
+
88
+ test('module.yaml file exists', () => {
89
+ assert.ok(fs.existsSync(moduleYamlPath), 'module.yaml must exist');
90
+ });
91
+
92
+ let moduleYaml = {};
93
+ test('module.yaml is parseable', () => {
94
+ const content = fs.readFileSync(moduleYamlPath, 'utf8');
95
+ moduleYaml = parseSimpleYaml(content);
96
+ assert.ok(Object.keys(moduleYaml).length > 0, 'module.yaml must have fields');
97
+ });
98
+
99
+ test('module.yaml has code: ma-skills', () => {
100
+ assert.strictEqual(moduleYaml.code, 'ma-skills', 'code field must be ma-skills');
101
+ });
102
+
103
+ test('module.yaml has name field', () => {
104
+ assert.ok(moduleYaml.name, 'name field must be present');
105
+ assert.strictEqual(moduleYaml.name, 'MA-Agents Skills & Agents');
106
+ });
107
+
108
+ test('module.yaml has description field', () => {
109
+ assert.ok(moduleYaml.description, 'description field must be present');
110
+ assert.strictEqual(
111
+ moduleYaml.description,
112
+ 'Enterprise methodology enforcement, specialized agents, and operational workflows'
113
+ );
114
+ });
115
+
116
+ test('module.yaml has extends-module: bmm', () => {
117
+ assert.strictEqual(moduleYaml['extends-module'], 'bmm', 'extends-module must be bmm');
118
+ });
119
+
120
+ test('module.yaml has default_selected: false', () => {
121
+ assert.strictEqual(moduleYaml['default_selected'], 'false', 'default_selected must be false');
122
+ });
123
+
124
+ // ═══════════════════════════════════════════════════════════════════════════════
125
+ // Task 2: skills/ directory structure
126
+ // ═══════════════════════════════════════════════════════════════════════════════
127
+ console.log('\n--- Task 2: skills/ directory ---');
128
+
129
+ const skillsDir = path.join(EXTENSION_DIR, 'skills');
130
+
131
+ test('skills/ directory exists', () => {
132
+ assert.ok(fs.existsSync(skillsDir), 'skills/ directory must exist');
133
+ assert.ok(fs.statSync(skillsDir).isDirectory(), 'skills/ must be a directory');
134
+ });
135
+
136
+ // Expected skill directories based on ACTUAL file inventory
137
+ const expectedAgentSkills = [
138
+ 'bmad-ma-agent-sre',
139
+ 'bmad-ma-agent-devops',
140
+ 'bmad-ma-agent-cyber',
141
+ 'bmad-ma-agent-mil498',
142
+ ];
143
+
144
+ const expectedMil498Skills = [
145
+ 'mil498-sss', 'mil498-ssdd', 'mil498-ocd', 'mil498-sdp',
146
+ 'mil498-srs', 'mil498-sdd', 'mil498-std',
147
+ ];
148
+
149
+ const expectedSreSkills = [
150
+ 'sre-check-deployment-status', 'sre-check-secrets', 'sre-check-system-status',
151
+ 'sre-day-2-ops', 'sre-deployment-strategies', 'sre-fix-deployments',
152
+ 'sre-gitops-status',
153
+ ];
154
+
155
+ const expectedDevopsSkills = [
156
+ 'devops-configure-infrastructure', 'devops-disconnected-deployment',
157
+ 'devops-docker-compose-setup', 'devops-manage-helm', 'devops-sign-docker-image',
158
+ ];
159
+
160
+ const expectedCyberSkills = [
161
+ 'cyber-generate-certs', 'cyber-immunity-estimation', 'cyber-security-audit',
162
+ 'cyber-vault-secrets', 'cyber-verify-docker-users', 'cyber-verify-image-signature',
163
+ 'cyber-vulnerability-scan',
164
+ ];
165
+
166
+ const expectedExtensionSkills = [
167
+ 'create-bug-story', 'add-sprint', 'modify-sprint',
168
+ 'add-to-sprint', 'project-context-expansion', 'sprint-status-view',
169
+ ];
170
+
171
+ const allExpectedSkills = [
172
+ ...expectedAgentSkills,
173
+ ...expectedMil498Skills,
174
+ ...expectedSreSkills,
175
+ ...expectedDevopsSkills,
176
+ ...expectedCyberSkills,
177
+ ...expectedExtensionSkills,
178
+ ];
179
+
180
+ test('skills/ has exactly 36 subdirectories', () => {
181
+ const entries = fs.readdirSync(skillsDir).filter(e =>
182
+ fs.statSync(path.join(skillsDir, e)).isDirectory()
183
+ );
184
+ assert.strictEqual(entries.length, 36, `Expected 36 skill dirs, found ${entries.length}`);
185
+ });
186
+
187
+ test('all 4 agent skill directories exist', () => {
188
+ for (const skill of expectedAgentSkills) {
189
+ const p = path.join(skillsDir, skill);
190
+ assert.ok(fs.existsSync(p), `Missing agent skill dir: ${skill}`);
191
+ }
192
+ });
193
+
194
+ test('all 7 MIL-498 skill directories exist', () => {
195
+ for (const skill of expectedMil498Skills) {
196
+ const p = path.join(skillsDir, skill);
197
+ assert.ok(fs.existsSync(p), `Missing MIL-498 skill dir: ${skill}`);
198
+ }
199
+ });
200
+
201
+ test('all 7 SRE skill directories exist', () => {
202
+ for (const skill of expectedSreSkills) {
203
+ const p = path.join(skillsDir, skill);
204
+ assert.ok(fs.existsSync(p), `Missing SRE skill dir: ${skill}`);
205
+ }
206
+ });
207
+
208
+ test('all 5 DevOps skill directories exist', () => {
209
+ for (const skill of expectedDevopsSkills) {
210
+ const p = path.join(skillsDir, skill);
211
+ assert.ok(fs.existsSync(p), `Missing DevOps skill dir: ${skill}`);
212
+ }
213
+ });
214
+
215
+ test('all 7 Cyber skill directories exist', () => {
216
+ for (const skill of expectedCyberSkills) {
217
+ const p = path.join(skillsDir, skill);
218
+ assert.ok(fs.existsSync(p), `Missing Cyber skill dir: ${skill}`);
219
+ }
220
+ });
221
+
222
+ test('all 6 extension workflow skill directories exist', () => {
223
+ for (const skill of expectedExtensionSkills) {
224
+ const p = path.join(skillsDir, skill);
225
+ assert.ok(fs.existsSync(p), `Missing extension skill dir: ${skill}`);
226
+ }
227
+ });
228
+
229
+ test('every skill directory contains a .gitkeep file', () => {
230
+ for (const skill of allExpectedSkills) {
231
+ const gk = path.join(skillsDir, skill, '.gitkeep');
232
+ assert.ok(fs.existsSync(gk), `Missing .gitkeep in ${skill}`);
233
+ }
234
+ });
235
+
236
+ // ═══════════════════════════════════════════════════════════════════════════════
237
+ // Task 3: module-help.csv validation
238
+ // ═══════════════════════════════════════════════════════════════════════════════
239
+ console.log('\n--- Task 3: module-help.csv ---');
240
+
241
+ const csvPath = path.join(EXTENSION_DIR, 'module-help.csv');
242
+
243
+ test('module-help.csv exists', () => {
244
+ assert.ok(fs.existsSync(csvPath), 'module-help.csv must exist');
245
+ });
246
+
247
+ let csvData = { headers: [], rows: [] };
248
+ test('module-help.csv is parseable', () => {
249
+ const content = fs.readFileSync(csvPath, 'utf8');
250
+ csvData = parseCsv(content);
251
+ assert.ok(csvData.headers.length > 0, 'CSV must have headers');
252
+ assert.ok(csvData.rows.length > 0, 'CSV must have data rows');
253
+ });
254
+
255
+ test('module-help.csv has correct header columns', () => {
256
+ const expected = ['module', 'phase', 'name', 'code'];
257
+ for (const col of expected) {
258
+ assert.ok(csvData.headers.includes(col), `Missing header column: ${col}`);
259
+ }
260
+ });
261
+
262
+ test('module-help.csv has 36 skill entries (excluding header)', () => {
263
+ assert.strictEqual(csvData.rows.length, 36, `Expected 36 rows, found ${csvData.rows.length}`);
264
+ });
265
+
266
+ test('all CSV entries use module code ma-skills', () => {
267
+ const moduleIdx = csvData.headers.indexOf('module');
268
+ for (const row of csvData.rows) {
269
+ assert.strictEqual(row[moduleIdx], 'ma-skills', `Row has wrong module: ${row[moduleIdx]}`);
270
+ }
271
+ });
272
+
273
+ test('CSV has entries for all 4 agent skills', () => {
274
+ const codeIdx = csvData.headers.indexOf('code');
275
+ const codes = csvData.rows.map(r => r[codeIdx]);
276
+ for (const skill of expectedAgentSkills) {
277
+ assert.ok(codes.includes(skill), `Missing CSV entry for agent skill: ${skill}`);
278
+ }
279
+ });
280
+
281
+ test('CSV has entries for all 7 MIL-498 skills', () => {
282
+ const codeIdx = csvData.headers.indexOf('code');
283
+ const codes = csvData.rows.map(r => r[codeIdx]);
284
+ for (const skill of expectedMil498Skills) {
285
+ assert.ok(codes.includes(skill), `Missing CSV entry for MIL-498 skill: ${skill}`);
286
+ }
287
+ });
288
+
289
+ test('CSV has entries for all 7 SRE skills', () => {
290
+ const codeIdx = csvData.headers.indexOf('code');
291
+ const codes = csvData.rows.map(r => r[codeIdx]);
292
+ for (const skill of expectedSreSkills) {
293
+ assert.ok(codes.includes(skill), `Missing CSV entry for SRE skill: ${skill}`);
294
+ }
295
+ });
296
+
297
+ test('CSV has entries for all 5 DevOps skills', () => {
298
+ const codeIdx = csvData.headers.indexOf('code');
299
+ const codes = csvData.rows.map(r => r[codeIdx]);
300
+ for (const skill of expectedDevopsSkills) {
301
+ assert.ok(codes.includes(skill), `Missing CSV entry for DevOps skill: ${skill}`);
302
+ }
303
+ });
304
+
305
+ test('CSV has entries for all 7 Cyber skills', () => {
306
+ const codeIdx = csvData.headers.indexOf('code');
307
+ const codes = csvData.rows.map(r => r[codeIdx]);
308
+ for (const skill of expectedCyberSkills) {
309
+ assert.ok(codes.includes(skill), `Missing CSV entry for Cyber skill: ${skill}`);
310
+ }
311
+ });
312
+
313
+ test('CSV has entries for all 6 extension workflow skills', () => {
314
+ const codeIdx = csvData.headers.indexOf('code');
315
+ const codes = csvData.rows.map(r => r[codeIdx]);
316
+ for (const skill of expectedExtensionSkills) {
317
+ assert.ok(codes.includes(skill), `Missing CSV entry for extension skill: ${skill}`);
318
+ }
319
+ });
320
+
321
+ // ═══════════════════════════════════════════════════════════════════════════════
322
+ // Task 4: Directory state after Story 15.6 migration
323
+ // ═══════════════════════════════════════════════════════════════════════════════
324
+ console.log('\n--- Task 4: Directory state after Story 15.6 ---');
325
+
326
+ test('agents/ directory is empty or absent (Story 15.6 moved files to bmad-customize/)', () => {
327
+ const agentsDir = path.join(EXTENSION_DIR, 'agents');
328
+ if (fs.existsSync(agentsDir)) {
329
+ const files = fs.readdirSync(agentsDir).filter(f => f.endsWith('.customize.yaml'));
330
+ assert.strictEqual(files.length, 0, `agents/ must have 0 .customize.yaml files after 15.6, found ${files.length}`);
331
+ }
332
+ // If directory doesn't exist, that's also correct
333
+ });
334
+
335
+ test('workflows/ directory still exists', () => {
336
+ const workflowsDir = path.join(EXTENSION_DIR, 'workflows');
337
+ assert.ok(fs.existsSync(workflowsDir), 'workflows/ directory must be preserved');
338
+ assert.ok(fs.statSync(workflowsDir).isDirectory(), 'workflows/ must be a directory');
339
+ });
340
+
341
+ test('workflows/ directory contains workflow subdirs', () => {
342
+ const workflowsDir = path.join(EXTENSION_DIR, 'workflows');
343
+ const dirs = fs.readdirSync(workflowsDir).filter(e =>
344
+ fs.statSync(path.join(workflowsDir, e)).isDirectory()
345
+ );
346
+ assert.ok(dirs.length >= 6, `Expected at least 6 workflow dirs, found ${dirs.length}`);
347
+ });
348
+
349
+ // ═══════════════════════════════════════════════════════════════════════════════
350
+ // Summary
351
+ // ═══════════════════════════════════════════════════════════════════════════════
352
+ console.log(`\n--- Results: ${passed} passed, ${failed} failed ---`);
353
+ if (errors.length > 0) {
354
+ console.error('\nFailures:');
355
+ for (const { name, error } of errors) {
356
+ console.error(` ${name}: ${error}`);
357
+ }
358
+ }
359
+ process.exit(failed > 0 ? 1 : 0);