ma-agents 3.4.6 → 3.4.8

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 (576) hide show
  1. package/.opencode/skills/.ma-agents.json +48 -167
  2. package/.opencode/skills/MANIFEST.yaml +0 -128
  3. package/.opencode/skills/add-sprint/.gitkeep +0 -0
  4. package/.opencode/skills/add-sprint/SKILL.md +207 -0
  5. package/.opencode/skills/add-sprint/bmad-skill-manifest.yaml +3 -0
  6. package/.opencode/skills/add-to-sprint/.gitkeep +0 -0
  7. package/.opencode/skills/add-to-sprint/SKILL.md +189 -0
  8. package/.opencode/skills/add-to-sprint/bmad-skill-manifest.yaml +3 -0
  9. package/.opencode/skills/bmad-advanced-elicitation/SKILL.md +137 -0
  10. package/.opencode/skills/bmad-advanced-elicitation/methods.csv +51 -0
  11. package/.opencode/skills/bmad-agent-analyst/SKILL.md +56 -0
  12. package/.opencode/skills/bmad-agent-analyst/bmad-skill-manifest.yaml +11 -0
  13. package/.opencode/skills/bmad-agent-architect/SKILL.md +52 -0
  14. package/.opencode/skills/bmad-agent-architect/bmad-skill-manifest.yaml +11 -0
  15. package/.opencode/skills/bmad-agent-dev/SKILL.md +62 -0
  16. package/.opencode/skills/bmad-agent-dev/bmad-skill-manifest.yaml +11 -0
  17. package/.opencode/skills/bmad-agent-pm/SKILL.md +57 -0
  18. package/.opencode/skills/bmad-agent-pm/bmad-skill-manifest.yaml +11 -0
  19. package/.opencode/skills/bmad-agent-qa/SKILL.md +59 -0
  20. package/.opencode/skills/bmad-agent-qa/bmad-skill-manifest.yaml +11 -0
  21. package/.opencode/skills/bmad-agent-quick-flow-solo-dev/SKILL.md +51 -0
  22. package/.opencode/skills/bmad-agent-quick-flow-solo-dev/bmad-skill-manifest.yaml +11 -0
  23. package/.opencode/skills/bmad-agent-sm/SKILL.md +53 -0
  24. package/.opencode/skills/bmad-agent-sm/bmad-skill-manifest.yaml +11 -0
  25. package/.opencode/skills/bmad-agent-tech-writer/SKILL.md +55 -0
  26. package/.opencode/skills/bmad-agent-tech-writer/bmad-skill-manifest.yaml +11 -0
  27. package/.opencode/skills/bmad-agent-tech-writer/explain-concept.md +20 -0
  28. package/.opencode/skills/bmad-agent-tech-writer/mermaid-gen.md +20 -0
  29. package/.opencode/skills/bmad-agent-tech-writer/validate-doc.md +19 -0
  30. package/.opencode/skills/bmad-agent-tech-writer/write-document.md +20 -0
  31. package/.opencode/skills/bmad-agent-ux-designer/SKILL.md +53 -0
  32. package/.opencode/skills/bmad-agent-ux-designer/bmad-skill-manifest.yaml +11 -0
  33. package/.opencode/skills/bmad-brainstorming/SKILL.md +6 -0
  34. package/.opencode/skills/bmad-brainstorming/brain-methods.csv +62 -0
  35. package/.opencode/skills/bmad-brainstorming/steps/step-01-session-setup.md +214 -0
  36. package/.opencode/skills/bmad-brainstorming/steps/step-01b-continue.md +124 -0
  37. package/.opencode/skills/bmad-brainstorming/steps/step-02a-user-selected.md +229 -0
  38. package/.opencode/skills/bmad-brainstorming/steps/step-02b-ai-recommended.md +239 -0
  39. package/.opencode/skills/bmad-brainstorming/steps/step-02c-random-selection.md +211 -0
  40. package/.opencode/skills/bmad-brainstorming/steps/step-02d-progressive-flow.md +266 -0
  41. package/.opencode/skills/bmad-brainstorming/steps/step-03-technique-execution.md +401 -0
  42. package/.opencode/skills/bmad-brainstorming/steps/step-04-idea-organization.md +305 -0
  43. package/.opencode/skills/bmad-brainstorming/template.md +15 -0
  44. package/.opencode/skills/bmad-brainstorming/workflow.md +53 -0
  45. package/.opencode/skills/bmad-check-implementation-readiness/SKILL.md +6 -0
  46. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
  47. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
  48. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
  49. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
  50. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
  51. package/.opencode/skills/bmad-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
  52. package/.opencode/skills/bmad-check-implementation-readiness/templates/readiness-report-template.md +4 -0
  53. package/.opencode/skills/bmad-check-implementation-readiness/workflow.md +49 -0
  54. package/.opencode/skills/bmad-cis-design-thinking/SKILL.md +6 -0
  55. package/.opencode/skills/bmad-cis-design-thinking/bmad-skill-manifest.yaml +1 -0
  56. package/.opencode/skills/bmad-cis-design-thinking/design-methods.csv +31 -0
  57. package/.opencode/skills/bmad-cis-design-thinking/template.md +111 -0
  58. package/.opencode/skills/bmad-cis-design-thinking/workflow.md +242 -0
  59. package/.opencode/skills/bmad-cis-innovation-strategy/SKILL.md +6 -0
  60. package/.opencode/skills/bmad-cis-innovation-strategy/bmad-skill-manifest.yaml +1 -0
  61. package/.opencode/skills/bmad-cis-innovation-strategy/innovation-frameworks.csv +31 -0
  62. package/.opencode/skills/bmad-cis-innovation-strategy/template.md +189 -0
  63. package/.opencode/skills/bmad-cis-innovation-strategy/workflow.md +315 -0
  64. package/.opencode/skills/bmad-cis-problem-solving/SKILL.md +6 -0
  65. package/.opencode/skills/bmad-cis-problem-solving/bmad-skill-manifest.yaml +1 -0
  66. package/.opencode/skills/bmad-cis-problem-solving/solving-methods.csv +31 -0
  67. package/.opencode/skills/bmad-cis-problem-solving/template.md +165 -0
  68. package/.opencode/skills/bmad-cis-problem-solving/workflow.md +291 -0
  69. package/.opencode/skills/bmad-cis-storytelling/SKILL.md +6 -0
  70. package/.opencode/skills/bmad-cis-storytelling/bmad-skill-manifest.yaml +1 -0
  71. package/.opencode/skills/bmad-cis-storytelling/story-types.csv +26 -0
  72. package/.opencode/skills/bmad-cis-storytelling/template.md +113 -0
  73. package/.opencode/skills/bmad-cis-storytelling/workflow.md +321 -0
  74. package/.opencode/skills/bmad-code-review/SKILL.md +6 -0
  75. package/.opencode/skills/bmad-code-review/steps/step-01-gather-context.md +62 -0
  76. package/.opencode/skills/bmad-code-review/steps/step-02-review.md +34 -0
  77. package/.opencode/skills/bmad-code-review/steps/step-03-triage.md +49 -0
  78. package/.opencode/skills/bmad-code-review/steps/step-04-present.md +129 -0
  79. package/.opencode/skills/bmad-code-review/workflow.md +55 -0
  80. package/.opencode/skills/bmad-correct-course/SKILL.md +6 -0
  81. package/.opencode/skills/bmad-correct-course/checklist.md +288 -0
  82. package/.opencode/skills/bmad-correct-course/workflow.md +267 -0
  83. package/.opencode/skills/bmad-create-architecture/SKILL.md +6 -0
  84. package/.opencode/skills/bmad-create-architecture/architecture-decision-template.md +12 -0
  85. package/.opencode/skills/bmad-create-architecture/data/domain-complexity.csv +13 -0
  86. package/.opencode/skills/bmad-create-architecture/data/project-types.csv +7 -0
  87. package/.opencode/skills/bmad-create-architecture/steps/step-01-init.md +153 -0
  88. package/.opencode/skills/bmad-create-architecture/steps/step-01b-continue.md +173 -0
  89. package/.opencode/skills/bmad-create-architecture/steps/step-02-context.md +224 -0
  90. package/.opencode/skills/bmad-create-architecture/steps/step-03-starter.md +329 -0
  91. package/.opencode/skills/bmad-create-architecture/steps/step-04-decisions.md +318 -0
  92. package/.opencode/skills/bmad-create-architecture/steps/step-05-patterns.md +359 -0
  93. package/.opencode/skills/bmad-create-architecture/steps/step-06-structure.md +379 -0
  94. package/.opencode/skills/bmad-create-architecture/steps/step-07-validation.md +359 -0
  95. package/.opencode/skills/bmad-create-architecture/steps/step-08-complete.md +76 -0
  96. package/.opencode/skills/bmad-create-architecture/workflow.md +38 -0
  97. package/.opencode/skills/bmad-create-epics-and-stories/SKILL.md +6 -0
  98. package/.opencode/skills/bmad-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
  99. package/.opencode/skills/bmad-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
  100. package/.opencode/skills/bmad-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
  101. package/.opencode/skills/bmad-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
  102. package/.opencode/skills/bmad-create-epics-and-stories/templates/epics-template.md +61 -0
  103. package/.opencode/skills/bmad-create-epics-and-stories/workflow.md +53 -0
  104. package/.opencode/skills/bmad-create-prd/SKILL.md +6 -0
  105. package/.opencode/skills/bmad-create-prd/data/domain-complexity.csv +15 -0
  106. package/.opencode/skills/bmad-create-prd/data/prd-purpose.md +197 -0
  107. package/.opencode/skills/bmad-create-prd/data/project-types.csv +11 -0
  108. package/.opencode/skills/bmad-create-prd/steps-c/step-01-init.md +178 -0
  109. package/.opencode/skills/bmad-create-prd/steps-c/step-01b-continue.md +161 -0
  110. package/.opencode/skills/bmad-create-prd/steps-c/step-02-discovery.md +208 -0
  111. package/.opencode/skills/bmad-create-prd/steps-c/step-02b-vision.md +142 -0
  112. package/.opencode/skills/bmad-create-prd/steps-c/step-02c-executive-summary.md +158 -0
  113. package/.opencode/skills/bmad-create-prd/steps-c/step-03-success.md +214 -0
  114. package/.opencode/skills/bmad-create-prd/steps-c/step-04-journeys.md +201 -0
  115. package/.opencode/skills/bmad-create-prd/steps-c/step-05-domain.md +194 -0
  116. package/.opencode/skills/bmad-create-prd/steps-c/step-06-innovation.md +211 -0
  117. package/.opencode/skills/bmad-create-prd/steps-c/step-07-project-type.md +222 -0
  118. package/.opencode/skills/bmad-create-prd/steps-c/step-08-scoping.md +216 -0
  119. package/.opencode/skills/bmad-create-prd/steps-c/step-09-functional.md +219 -0
  120. package/.opencode/skills/bmad-create-prd/steps-c/step-10-nonfunctional.md +230 -0
  121. package/.opencode/skills/bmad-create-prd/steps-c/step-11-polish.md +221 -0
  122. package/.opencode/skills/bmad-create-prd/steps-c/step-12-complete.md +115 -0
  123. package/.opencode/skills/bmad-create-prd/templates/prd-template.md +10 -0
  124. package/.opencode/skills/bmad-create-prd/workflow.md +62 -0
  125. package/.opencode/skills/bmad-create-story/SKILL.md +6 -0
  126. package/.opencode/skills/bmad-create-story/checklist.md +357 -0
  127. package/.opencode/skills/bmad-create-story/discover-inputs.md +88 -0
  128. package/.opencode/skills/bmad-create-story/template.md +49 -0
  129. package/.opencode/skills/bmad-create-story/workflow.md +380 -0
  130. package/.opencode/skills/bmad-create-ux-design/SKILL.md +6 -0
  131. package/.opencode/skills/bmad-create-ux-design/steps/step-01-init.md +135 -0
  132. package/.opencode/skills/bmad-create-ux-design/steps/step-01b-continue.md +127 -0
  133. package/.opencode/skills/bmad-create-ux-design/steps/step-02-discovery.md +190 -0
  134. package/.opencode/skills/bmad-create-ux-design/steps/step-03-core-experience.md +217 -0
  135. package/.opencode/skills/bmad-create-ux-design/steps/step-04-emotional-response.md +220 -0
  136. package/.opencode/skills/bmad-create-ux-design/steps/step-05-inspiration.md +235 -0
  137. package/.opencode/skills/bmad-create-ux-design/steps/step-06-design-system.md +253 -0
  138. package/.opencode/skills/bmad-create-ux-design/steps/step-07-defining-experience.md +255 -0
  139. package/.opencode/skills/bmad-create-ux-design/steps/step-08-visual-foundation.md +225 -0
  140. package/.opencode/skills/bmad-create-ux-design/steps/step-09-design-directions.md +225 -0
  141. package/.opencode/skills/bmad-create-ux-design/steps/step-10-user-journeys.md +242 -0
  142. package/.opencode/skills/bmad-create-ux-design/steps/step-11-component-strategy.md +249 -0
  143. package/.opencode/skills/bmad-create-ux-design/steps/step-12-ux-patterns.md +238 -0
  144. package/.opencode/skills/bmad-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
  145. package/.opencode/skills/bmad-create-ux-design/steps/step-14-complete.md +171 -0
  146. package/.opencode/skills/bmad-create-ux-design/ux-design-template.md +13 -0
  147. package/.opencode/skills/bmad-create-ux-design/workflow.md +36 -0
  148. package/.opencode/skills/bmad-dev-story/SKILL.md +6 -0
  149. package/.opencode/skills/bmad-dev-story/checklist.md +80 -0
  150. package/.opencode/skills/bmad-dev-story/workflow.md +450 -0
  151. package/.opencode/skills/bmad-distillator/SKILL.md +178 -0
  152. package/.opencode/skills/bmad-distillator/agents/distillate-compressor.md +116 -0
  153. package/.opencode/skills/bmad-distillator/agents/round-trip-reconstructor.md +68 -0
  154. package/.opencode/skills/bmad-distillator/resources/compression-rules.md +51 -0
  155. package/.opencode/skills/bmad-distillator/resources/distillate-format-reference.md +227 -0
  156. package/.opencode/skills/bmad-distillator/resources/splitting-strategy.md +78 -0
  157. package/.opencode/skills/bmad-distillator/scripts/analyze_sources.py +300 -0
  158. package/.opencode/skills/bmad-distillator/scripts/tests/test_analyze_sources.py +204 -0
  159. package/.opencode/skills/bmad-document-project/SKILL.md +6 -0
  160. package/.opencode/skills/bmad-document-project/checklist.md +245 -0
  161. package/.opencode/skills/bmad-document-project/documentation-requirements.csv +12 -0
  162. package/.opencode/skills/bmad-document-project/instructions.md +128 -0
  163. package/.opencode/skills/bmad-document-project/templates/deep-dive-template.md +345 -0
  164. package/.opencode/skills/bmad-document-project/templates/index-template.md +169 -0
  165. package/.opencode/skills/bmad-document-project/templates/project-overview-template.md +103 -0
  166. package/.opencode/skills/bmad-document-project/templates/project-scan-report-schema.json +160 -0
  167. package/.opencode/skills/bmad-document-project/templates/source-tree-template.md +135 -0
  168. package/.opencode/skills/bmad-document-project/workflow.md +27 -0
  169. package/.opencode/skills/bmad-document-project/workflows/deep-dive-instructions.md +299 -0
  170. package/.opencode/skills/bmad-document-project/workflows/deep-dive-workflow.md +34 -0
  171. package/.opencode/skills/bmad-document-project/workflows/full-scan-instructions.md +1107 -0
  172. package/.opencode/skills/bmad-document-project/workflows/full-scan-workflow.md +34 -0
  173. package/.opencode/skills/bmad-domain-research/SKILL.md +6 -0
  174. package/.opencode/skills/bmad-domain-research/domain-steps/step-01-init.md +137 -0
  175. package/.opencode/skills/bmad-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
  176. package/.opencode/skills/bmad-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
  177. package/.opencode/skills/bmad-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
  178. package/.opencode/skills/bmad-domain-research/domain-steps/step-05-technical-trends.md +234 -0
  179. package/.opencode/skills/bmad-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
  180. package/.opencode/skills/bmad-domain-research/research.template.md +29 -0
  181. package/.opencode/skills/bmad-domain-research/workflow.md +49 -0
  182. package/.opencode/skills/bmad-edit-prd/SKILL.md +6 -0
  183. package/.opencode/skills/bmad-edit-prd/steps-e/step-e-01-discovery.md +242 -0
  184. package/.opencode/skills/bmad-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
  185. package/.opencode/skills/bmad-edit-prd/steps-e/step-e-02-review.md +245 -0
  186. package/.opencode/skills/bmad-edit-prd/steps-e/step-e-03-edit.md +250 -0
  187. package/.opencode/skills/bmad-edit-prd/steps-e/step-e-04-complete.md +165 -0
  188. package/.opencode/skills/bmad-edit-prd/workflow.md +63 -0
  189. package/.opencode/skills/bmad-editorial-review-prose/SKILL.md +86 -0
  190. package/.opencode/skills/bmad-editorial-review-structure/SKILL.md +179 -0
  191. package/.opencode/skills/bmad-generate-project-context/SKILL.md +6 -0
  192. package/.opencode/skills/bmad-generate-project-context/project-context-template.md +21 -0
  193. package/.opencode/skills/bmad-generate-project-context/steps/step-01-discover.md +186 -0
  194. package/.opencode/skills/bmad-generate-project-context/steps/step-02-generate.md +321 -0
  195. package/.opencode/skills/bmad-generate-project-context/steps/step-03-complete.md +278 -0
  196. package/.opencode/skills/bmad-generate-project-context/workflow.md +43 -0
  197. package/.opencode/skills/bmad-help/SKILL.md +73 -0
  198. package/.opencode/skills/bmad-index-docs/SKILL.md +66 -0
  199. package/.opencode/skills/bmad-init/SKILL.md +100 -0
  200. package/.opencode/skills/bmad-init/resources/core-module.yaml +25 -0
  201. package/.opencode/skills/bmad-init/scripts/bmad_init.py +593 -0
  202. package/.opencode/skills/bmad-init/scripts/tests/test_bmad_init.py +329 -0
  203. package/.opencode/skills/bmad-ma-agent-cyber/.gitkeep +0 -0
  204. package/.opencode/skills/bmad-ma-agent-cyber/SKILL.md +49 -0
  205. package/.opencode/skills/bmad-ma-agent-cyber/bmad-skill-manifest.yaml +11 -0
  206. package/.opencode/skills/bmad-ma-agent-devops/.gitkeep +0 -0
  207. package/.opencode/skills/bmad-ma-agent-devops/SKILL.md +49 -0
  208. package/.opencode/skills/bmad-ma-agent-devops/bmad-skill-manifest.yaml +11 -0
  209. package/.opencode/skills/bmad-ma-agent-mil498/.gitkeep +0 -0
  210. package/.opencode/skills/bmad-ma-agent-mil498/SKILL.md +53 -0
  211. package/.opencode/skills/bmad-ma-agent-mil498/bmad-skill-manifest.yaml +11 -0
  212. package/.opencode/skills/bmad-ma-agent-ml/.gitkeep +0 -0
  213. package/.opencode/skills/bmad-ma-agent-ml/SKILL.md +59 -0
  214. package/.opencode/skills/bmad-ma-agent-ml/bmad-skill-manifest.yaml +11 -0
  215. package/.opencode/skills/bmad-ma-agent-sre/.gitkeep +0 -0
  216. package/.opencode/skills/bmad-ma-agent-sre/SKILL.md +49 -0
  217. package/.opencode/skills/bmad-ma-agent-sre/bmad-skill-manifest.yaml +11 -0
  218. package/.opencode/skills/bmad-market-research/SKILL.md +6 -0
  219. package/.opencode/skills/bmad-market-research/research.template.md +29 -0
  220. package/.opencode/skills/bmad-market-research/steps/step-01-init.md +184 -0
  221. package/.opencode/skills/bmad-market-research/steps/step-02-customer-behavior.md +239 -0
  222. package/.opencode/skills/bmad-market-research/steps/step-03-customer-pain-points.md +251 -0
  223. package/.opencode/skills/bmad-market-research/steps/step-04-customer-decisions.md +261 -0
  224. package/.opencode/skills/bmad-market-research/steps/step-05-competitive-analysis.md +173 -0
  225. package/.opencode/skills/bmad-market-research/steps/step-06-research-completion.md +478 -0
  226. package/.opencode/skills/bmad-market-research/workflow.md +49 -0
  227. package/.opencode/skills/bmad-party-mode/SKILL.md +6 -0
  228. package/.opencode/skills/bmad-party-mode/steps/step-01-agent-loading.md +138 -0
  229. package/.opencode/skills/bmad-party-mode/steps/step-02-discussion-orchestration.md +187 -0
  230. package/.opencode/skills/bmad-party-mode/steps/step-03-graceful-exit.md +167 -0
  231. package/.opencode/skills/bmad-party-mode/workflow.md +190 -0
  232. package/.opencode/skills/bmad-product-brief/SKILL.md +87 -0
  233. package/.opencode/skills/bmad-product-brief/agents/artifact-analyzer.md +60 -0
  234. package/.opencode/skills/bmad-product-brief/agents/opportunity-reviewer.md +44 -0
  235. package/.opencode/skills/bmad-product-brief/agents/skeptic-reviewer.md +44 -0
  236. package/.opencode/skills/bmad-product-brief/agents/web-researcher.md +49 -0
  237. package/.opencode/skills/bmad-product-brief/bmad-manifest.json +17 -0
  238. package/.opencode/skills/bmad-product-brief/prompts/contextual-discovery.md +57 -0
  239. package/.opencode/skills/bmad-product-brief/prompts/draft-and-review.md +86 -0
  240. package/.opencode/skills/bmad-product-brief/prompts/finalize.md +75 -0
  241. package/.opencode/skills/bmad-product-brief/prompts/guided-elicitation.md +70 -0
  242. package/.opencode/skills/bmad-product-brief/resources/brief-template.md +60 -0
  243. package/.opencode/skills/bmad-qa-generate-e2e-tests/SKILL.md +6 -0
  244. package/.opencode/skills/bmad-qa-generate-e2e-tests/checklist.md +33 -0
  245. package/.opencode/skills/bmad-qa-generate-e2e-tests/workflow.md +136 -0
  246. package/.opencode/skills/bmad-quick-dev/SKILL.md +6 -0
  247. package/.opencode/skills/bmad-quick-dev/spec-template.md +88 -0
  248. package/.opencode/skills/bmad-quick-dev/step-01-clarify-and-route.md +64 -0
  249. package/.opencode/skills/bmad-quick-dev/step-02-plan.md +35 -0
  250. package/.opencode/skills/bmad-quick-dev/step-03-implement.md +37 -0
  251. package/.opencode/skills/bmad-quick-dev/step-04-review.md +49 -0
  252. package/.opencode/skills/bmad-quick-dev/step-05-present.md +63 -0
  253. package/.opencode/skills/bmad-quick-dev/step-oneshot.md +49 -0
  254. package/.opencode/skills/bmad-quick-dev/workflow.md +79 -0
  255. package/.opencode/skills/bmad-retrospective/SKILL.md +6 -0
  256. package/.opencode/skills/bmad-retrospective/workflow.md +1479 -0
  257. package/.opencode/skills/bmad-review-adversarial-general/SKILL.md +37 -0
  258. package/.opencode/skills/bmad-review-edge-case-hunter/SKILL.md +67 -0
  259. package/.opencode/skills/bmad-shard-doc/SKILL.md +105 -0
  260. package/.opencode/skills/bmad-sprint-planning/SKILL.md +6 -0
  261. package/.opencode/skills/bmad-sprint-planning/checklist.md +33 -0
  262. package/.opencode/skills/bmad-sprint-planning/sprint-status-template.yaml +56 -0
  263. package/.opencode/skills/bmad-sprint-planning/workflow.md +263 -0
  264. package/.opencode/skills/bmad-sprint-status/SKILL.md +6 -0
  265. package/.opencode/skills/bmad-sprint-status/workflow.md +261 -0
  266. package/.opencode/skills/bmad-technical-research/SKILL.md +6 -0
  267. package/.opencode/skills/bmad-technical-research/research.template.md +29 -0
  268. package/.opencode/skills/bmad-technical-research/technical-steps/step-01-init.md +137 -0
  269. package/.opencode/skills/bmad-technical-research/technical-steps/step-02-technical-overview.md +239 -0
  270. package/.opencode/skills/bmad-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
  271. package/.opencode/skills/bmad-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
  272. package/.opencode/skills/bmad-technical-research/technical-steps/step-05-implementation-research.md +233 -0
  273. package/.opencode/skills/bmad-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
  274. package/.opencode/skills/bmad-technical-research/workflow.md +50 -0
  275. package/.opencode/skills/bmad-validate-prd/SKILL.md +6 -0
  276. package/.opencode/skills/bmad-validate-prd/data/domain-complexity.csv +15 -0
  277. package/.opencode/skills/bmad-validate-prd/data/prd-purpose.md +197 -0
  278. package/.opencode/skills/bmad-validate-prd/data/project-types.csv +11 -0
  279. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  280. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  281. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  282. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  283. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  284. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  285. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  286. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  287. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  288. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  289. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  290. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  291. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  292. package/.opencode/skills/bmad-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  293. package/.opencode/skills/bmad-validate-prd/workflow.md +62 -0
  294. package/.opencode/skills/cleanup-done/.gitkeep +0 -0
  295. package/.opencode/skills/cleanup-done/SKILL.md +159 -0
  296. package/.opencode/skills/cleanup-done/bmad-skill-manifest.yaml +3 -0
  297. package/.opencode/skills/create-bug-story/.gitkeep +0 -0
  298. package/.opencode/skills/create-bug-story/SKILL.md +263 -0
  299. package/.opencode/skills/create-bug-story/bmad-skill-manifest.yaml +3 -0
  300. package/.opencode/skills/cyber-generate-certs/.gitkeep +0 -0
  301. package/.opencode/skills/cyber-generate-certs/SKILL.md +27 -0
  302. package/.opencode/skills/cyber-generate-certs/bmad-skill-manifest.yaml +3 -0
  303. package/.opencode/skills/cyber-immunity-estimation/.gitkeep +0 -0
  304. package/.opencode/skills/cyber-immunity-estimation/SKILL.md +29 -0
  305. package/.opencode/skills/cyber-immunity-estimation/bmad-skill-manifest.yaml +3 -0
  306. package/.opencode/skills/cyber-security-audit/.gitkeep +0 -0
  307. package/.opencode/skills/cyber-security-audit/SKILL.md +27 -0
  308. package/.opencode/skills/cyber-security-audit/bmad-skill-manifest.yaml +3 -0
  309. package/.opencode/skills/cyber-vault-secrets/.gitkeep +0 -0
  310. package/.opencode/skills/cyber-vault-secrets/SKILL.md +28 -0
  311. package/.opencode/skills/cyber-vault-secrets/bmad-skill-manifest.yaml +3 -0
  312. package/.opencode/skills/cyber-verify-docker-users/.gitkeep +0 -0
  313. package/.opencode/skills/cyber-verify-docker-users/SKILL.md +23 -0
  314. package/.opencode/skills/cyber-verify-docker-users/bmad-skill-manifest.yaml +3 -0
  315. package/.opencode/skills/cyber-verify-image-signature/.gitkeep +0 -0
  316. package/.opencode/skills/cyber-verify-image-signature/SKILL.md +22 -0
  317. package/.opencode/skills/cyber-verify-image-signature/bmad-skill-manifest.yaml +3 -0
  318. package/.opencode/skills/cyber-vulnerability-scan/.gitkeep +0 -0
  319. package/.opencode/skills/cyber-vulnerability-scan/SKILL.md +28 -0
  320. package/.opencode/skills/cyber-vulnerability-scan/bmad-skill-manifest.yaml +3 -0
  321. package/.opencode/skills/devops-configure-infrastructure/.gitkeep +0 -0
  322. package/.opencode/skills/devops-configure-infrastructure/SKILL.md +27 -0
  323. package/.opencode/skills/devops-configure-infrastructure/bmad-skill-manifest.yaml +3 -0
  324. package/.opencode/skills/devops-disconnected-deployment/.gitkeep +0 -0
  325. package/.opencode/skills/devops-disconnected-deployment/SKILL.md +27 -0
  326. package/.opencode/skills/devops-disconnected-deployment/bmad-skill-manifest.yaml +3 -0
  327. package/.opencode/skills/devops-docker-compose-setup/.gitkeep +0 -0
  328. package/.opencode/skills/devops-docker-compose-setup/SKILL.md +26 -0
  329. package/.opencode/skills/devops-docker-compose-setup/bmad-skill-manifest.yaml +3 -0
  330. package/.opencode/skills/devops-manage-helm/.gitkeep +0 -0
  331. package/.opencode/skills/devops-manage-helm/SKILL.md +28 -0
  332. package/.opencode/skills/devops-manage-helm/bmad-skill-manifest.yaml +3 -0
  333. package/.opencode/skills/devops-sign-docker-image/.gitkeep +0 -0
  334. package/.opencode/skills/devops-sign-docker-image/SKILL.md +24 -0
  335. package/.opencode/skills/devops-sign-docker-image/bmad-skill-manifest.yaml +3 -0
  336. package/.opencode/skills/generate-backlog/.gitkeep +0 -0
  337. package/.opencode/skills/generate-backlog/SKILL.md +183 -0
  338. package/.opencode/skills/generate-backlog/bmad-skill-manifest.yaml +3 -0
  339. package/.opencode/skills/mil498-ocd/.gitkeep +0 -0
  340. package/.opencode/skills/mil498-ocd/SKILL.md +30 -0
  341. package/.opencode/skills/mil498-ocd/bmad-skill-manifest.yaml +5 -0
  342. package/.opencode/skills/mil498-ocd/prompts/01-discover-project-artifacts.md +26 -0
  343. package/.opencode/skills/mil498-ocd/prompts/02-load-template.md +10 -0
  344. package/.opencode/skills/mil498-ocd/prompts/03-generate-document.md +90 -0
  345. package/.opencode/skills/mil498-ocd/prompts/04-validate.md +14 -0
  346. package/.opencode/skills/mil498-ocd/prompts/05-review.md +15 -0
  347. package/.opencode/skills/mil498-ocd/prompts/06-save.md +15 -0
  348. package/.opencode/skills/mil498-ocd/template.md +169 -0
  349. package/.opencode/skills/mil498-sdd/.gitkeep +0 -0
  350. package/.opencode/skills/mil498-sdd/SKILL.md +30 -0
  351. package/.opencode/skills/mil498-sdd/bmad-skill-manifest.yaml +5 -0
  352. package/.opencode/skills/mil498-sdd/prompts/01-discover-project-artifacts.md +50 -0
  353. package/.opencode/skills/mil498-sdd/prompts/02-load-template.md +10 -0
  354. package/.opencode/skills/mil498-sdd/prompts/03-generate-document.md +98 -0
  355. package/.opencode/skills/mil498-sdd/prompts/04-validate.md +16 -0
  356. package/.opencode/skills/mil498-sdd/prompts/05-review.md +15 -0
  357. package/.opencode/skills/mil498-sdd/prompts/06-save.md +19 -0
  358. package/.opencode/skills/mil498-sdd/template.md +163 -0
  359. package/.opencode/skills/mil498-sdp/.gitkeep +0 -0
  360. package/.opencode/skills/mil498-sdp/SKILL.md +30 -0
  361. package/.opencode/skills/mil498-sdp/bmad-skill-manifest.yaml +5 -0
  362. package/.opencode/skills/mil498-sdp/prompts/01-discover-project-artifacts.md +32 -0
  363. package/.opencode/skills/mil498-sdp/prompts/02-load-template.md +10 -0
  364. package/.opencode/skills/mil498-sdp/prompts/03-generate-document.md +187 -0
  365. package/.opencode/skills/mil498-sdp/prompts/04-validate.md +13 -0
  366. package/.opencode/skills/mil498-sdp/prompts/05-review.md +15 -0
  367. package/.opencode/skills/mil498-sdp/prompts/06-save.md +14 -0
  368. package/.opencode/skills/mil498-sdp/template.md +307 -0
  369. package/.opencode/skills/mil498-srs/.gitkeep +0 -0
  370. package/.opencode/skills/mil498-srs/SKILL.md +30 -0
  371. package/.opencode/skills/mil498-srs/bmad-skill-manifest.yaml +5 -0
  372. package/.opencode/skills/mil498-srs/prompts/01-discover-project-artifacts.md +42 -0
  373. package/.opencode/skills/mil498-srs/prompts/02-load-template.md +10 -0
  374. package/.opencode/skills/mil498-srs/prompts/03-generate-document.md +100 -0
  375. package/.opencode/skills/mil498-srs/prompts/04-validate.md +16 -0
  376. package/.opencode/skills/mil498-srs/prompts/05-review.md +15 -0
  377. package/.opencode/skills/mil498-srs/prompts/06-save.md +18 -0
  378. package/.opencode/skills/mil498-srs/template.md +219 -0
  379. package/.opencode/skills/mil498-ssdd/.gitkeep +0 -0
  380. package/.opencode/skills/mil498-ssdd/SKILL.md +32 -0
  381. package/.opencode/skills/mil498-ssdd/bmad-skill-manifest.yaml +5 -0
  382. package/.opencode/skills/mil498-ssdd/prompts/01-discover-project-artifacts.md +32 -0
  383. package/.opencode/skills/mil498-ssdd/prompts/02-load-template.md +10 -0
  384. package/.opencode/skills/mil498-ssdd/prompts/03-csci-discovery-interview.md +43 -0
  385. package/.opencode/skills/mil498-ssdd/prompts/04-generate-document.md +96 -0
  386. package/.opencode/skills/mil498-ssdd/prompts/05-validate.md +14 -0
  387. package/.opencode/skills/mil498-ssdd/prompts/06-review.md +16 -0
  388. package/.opencode/skills/mil498-ssdd/prompts/07-save.md +16 -0
  389. package/.opencode/skills/mil498-ssdd/template.md +154 -0
  390. package/.opencode/skills/mil498-sss/.gitkeep +0 -0
  391. package/.opencode/skills/mil498-sss/SKILL.md +31 -0
  392. package/.opencode/skills/mil498-sss/bmad-skill-manifest.yaml +5 -0
  393. package/.opencode/skills/mil498-sss/prompts/01-discover-project-artifacts.md +31 -0
  394. package/.opencode/skills/mil498-sss/prompts/02-load-template.md +10 -0
  395. package/.opencode/skills/mil498-sss/prompts/03-generate-document.md +108 -0
  396. package/.opencode/skills/mil498-sss/prompts/04-validate.md +16 -0
  397. package/.opencode/skills/mil498-sss/prompts/05-review.md +15 -0
  398. package/.opencode/skills/mil498-sss/prompts/06-save.md +15 -0
  399. package/.opencode/skills/mil498-sss/template.md +225 -0
  400. package/.opencode/skills/mil498-std/.gitkeep +0 -0
  401. package/.opencode/skills/mil498-std/SKILL.md +30 -0
  402. package/.opencode/skills/mil498-std/bmad-skill-manifest.yaml +5 -0
  403. package/.opencode/skills/mil498-std/prompts/01-discover-project-artifacts.md +42 -0
  404. package/.opencode/skills/mil498-std/prompts/02-load-template.md +10 -0
  405. package/.opencode/skills/mil498-std/prompts/03-generate-document.md +117 -0
  406. package/.opencode/skills/mil498-std/prompts/04-validate.md +15 -0
  407. package/.opencode/skills/mil498-std/prompts/05-review.md +15 -0
  408. package/.opencode/skills/mil498-std/prompts/06-save.md +15 -0
  409. package/.opencode/skills/mil498-std/template.md +188 -0
  410. package/.opencode/skills/ml-advise/.gitkeep +0 -0
  411. package/.opencode/skills/ml-advise/SKILL.md +76 -0
  412. package/.opencode/skills/ml-advise/bmad-skill-manifest.yaml +3 -0
  413. package/.opencode/skills/ml-advise/skill.json +7 -0
  414. package/.opencode/skills/ml-analysis/.gitkeep +0 -0
  415. package/.opencode/skills/ml-analysis/SKILL.md +60 -0
  416. package/.opencode/skills/ml-analysis/bmad-skill-manifest.yaml +3 -0
  417. package/.opencode/skills/ml-analysis/skill.json +7 -0
  418. package/.opencode/skills/ml-architecture/.gitkeep +0 -0
  419. package/.opencode/skills/ml-architecture/SKILL.md +55 -0
  420. package/.opencode/skills/ml-architecture/bmad-skill-manifest.yaml +3 -0
  421. package/.opencode/skills/ml-architecture/skill.json +7 -0
  422. package/.opencode/skills/ml-detailed-design/.gitkeep +0 -0
  423. package/.opencode/skills/ml-detailed-design/SKILL.md +67 -0
  424. package/.opencode/skills/ml-detailed-design/bmad-skill-manifest.yaml +3 -0
  425. package/.opencode/skills/ml-detailed-design/skill.json +7 -0
  426. package/.opencode/skills/ml-eda/.gitkeep +0 -0
  427. package/.opencode/skills/ml-eda/SKILL.md +56 -0
  428. package/.opencode/skills/ml-eda/bmad-skill-manifest.yaml +3 -0
  429. package/.opencode/skills/ml-eda/scripts/baseline_classifier.py +522 -0
  430. package/.opencode/skills/ml-eda/scripts/class_weights_calculator.py +295 -0
  431. package/.opencode/skills/ml-eda/scripts/clustering_explorer.py +383 -0
  432. package/.opencode/skills/ml-eda/scripts/eda_analyzer.py +654 -0
  433. package/.opencode/skills/ml-eda/skill.json +7 -0
  434. package/.opencode/skills/ml-experiment/.gitkeep +0 -0
  435. package/.opencode/skills/ml-experiment/SKILL.md +74 -0
  436. package/.opencode/skills/ml-experiment/assets/advanced_trainer_configs.py +430 -0
  437. package/.opencode/skills/ml-experiment/assets/quick_trainer_setup.py +233 -0
  438. package/.opencode/skills/ml-experiment/assets/template_datamodule.py +219 -0
  439. package/.opencode/skills/ml-experiment/assets/template_gnn_module.py +341 -0
  440. package/.opencode/skills/ml-experiment/assets/template_lightning_module.py +158 -0
  441. package/.opencode/skills/ml-experiment/bmad-skill-manifest.yaml +3 -0
  442. package/.opencode/skills/ml-experiment/skill.json +7 -0
  443. package/.opencode/skills/ml-hparam/.gitkeep +0 -0
  444. package/.opencode/skills/ml-hparam/SKILL.md +81 -0
  445. package/.opencode/skills/ml-hparam/bmad-skill-manifest.yaml +3 -0
  446. package/.opencode/skills/ml-hparam/skill.json +7 -0
  447. package/.opencode/skills/ml-ideation/.gitkeep +0 -0
  448. package/.opencode/skills/ml-ideation/SKILL.md +50 -0
  449. package/.opencode/skills/ml-ideation/bmad-skill-manifest.yaml +3 -0
  450. package/.opencode/skills/ml-ideation/scripts/validate_ml_prd.py +287 -0
  451. package/.opencode/skills/ml-ideation/skill.json +7 -0
  452. package/.opencode/skills/ml-infra/.gitkeep +0 -0
  453. package/.opencode/skills/ml-infra/SKILL.md +58 -0
  454. package/.opencode/skills/ml-infra/bmad-skill-manifest.yaml +3 -0
  455. package/.opencode/skills/ml-infra/skill.json +7 -0
  456. package/.opencode/skills/ml-retrospective/.gitkeep +0 -0
  457. package/.opencode/skills/ml-retrospective/SKILL.md +63 -0
  458. package/.opencode/skills/ml-retrospective/bmad-skill-manifest.yaml +3 -0
  459. package/.opencode/skills/ml-retrospective/skill.json +7 -0
  460. package/.opencode/skills/ml-revision/.gitkeep +0 -0
  461. package/.opencode/skills/ml-revision/SKILL.md +82 -0
  462. package/.opencode/skills/ml-revision/bmad-skill-manifest.yaml +3 -0
  463. package/.opencode/skills/ml-revision/skill.json +7 -0
  464. package/.opencode/skills/ml-techspec/.gitkeep +0 -0
  465. package/.opencode/skills/ml-techspec/SKILL.md +80 -0
  466. package/.opencode/skills/ml-techspec/bmad-skill-manifest.yaml +3 -0
  467. package/.opencode/skills/ml-techspec/skill.json +7 -0
  468. package/.opencode/skills/modify-sprint/.gitkeep +0 -0
  469. package/.opencode/skills/modify-sprint/SKILL.md +322 -0
  470. package/.opencode/skills/modify-sprint/bmad-skill-manifest.yaml +3 -0
  471. package/.opencode/skills/prioritize-backlog/.gitkeep +0 -0
  472. package/.opencode/skills/prioritize-backlog/SKILL.md +195 -0
  473. package/.opencode/skills/prioritize-backlog/bmad-skill-manifest.yaml +3 -0
  474. package/.opencode/skills/project-context-expansion/.gitkeep +0 -0
  475. package/.opencode/skills/project-context-expansion/SKILL.md +238 -0
  476. package/.opencode/skills/project-context-expansion/bmad-skill-manifest.yaml +3 -0
  477. package/.opencode/skills/remove-from-sprint/.gitkeep +0 -0
  478. package/.opencode/skills/remove-from-sprint/SKILL.md +163 -0
  479. package/.opencode/skills/remove-from-sprint/bmad-skill-manifest.yaml +3 -0
  480. package/.opencode/skills/sprint-status-view/.gitkeep +0 -0
  481. package/.opencode/skills/sprint-status-view/SKILL.md +263 -0
  482. package/.opencode/skills/sprint-status-view/bmad-skill-manifest.yaml +3 -0
  483. package/.opencode/skills/sre-check-deployment-status/.gitkeep +0 -0
  484. package/.opencode/skills/sre-check-deployment-status/SKILL.md +32 -0
  485. package/.opencode/skills/sre-check-deployment-status/bmad-skill-manifest.yaml +3 -0
  486. package/.opencode/skills/sre-check-secrets/.gitkeep +0 -0
  487. package/.opencode/skills/sre-check-secrets/SKILL.md +23 -0
  488. package/.opencode/skills/sre-check-secrets/bmad-skill-manifest.yaml +3 -0
  489. package/.opencode/skills/sre-check-system-status/.gitkeep +0 -0
  490. package/.opencode/skills/sre-check-system-status/SKILL.md +27 -0
  491. package/.opencode/skills/sre-check-system-status/bmad-skill-manifest.yaml +3 -0
  492. package/.opencode/skills/sre-day-2-ops/.gitkeep +0 -0
  493. package/.opencode/skills/sre-day-2-ops/SKILL.md +26 -0
  494. package/.opencode/skills/sre-day-2-ops/bmad-skill-manifest.yaml +3 -0
  495. package/.opencode/skills/sre-deployment-strategies/.gitkeep +0 -0
  496. package/.opencode/skills/sre-deployment-strategies/SKILL.md +28 -0
  497. package/.opencode/skills/sre-deployment-strategies/bmad-skill-manifest.yaml +3 -0
  498. package/.opencode/skills/sre-fix-deployments/.gitkeep +0 -0
  499. package/.opencode/skills/sre-fix-deployments/SKILL.md +25 -0
  500. package/.opencode/skills/sre-fix-deployments/bmad-skill-manifest.yaml +3 -0
  501. package/.opencode/skills/sre-gitops-status/.gitkeep +0 -0
  502. package/.opencode/skills/sre-gitops-status/SKILL.md +25 -0
  503. package/.opencode/skills/sre-gitops-status/bmad-skill-manifest.yaml +3 -0
  504. package/.roo/skills/.ma-agents.json +48 -167
  505. package/.roo/skills/MANIFEST.yaml +0 -128
  506. package/bin/cli.js +20 -6
  507. package/lib/agents.js +5 -50
  508. package/lib/bmad.js +4 -1
  509. package/lib/installer.js +13 -5
  510. package/package.json +1 -1
  511. package/.opencode/skills/ai-audit-trail/SKILL.md +0 -23
  512. package/.opencode/skills/auto-bug-detection/SKILL.md +0 -169
  513. package/.opencode/skills/cmake-best-practices/SKILL.md +0 -64
  514. package/.opencode/skills/cmake-best-practices/examples/cmake.md +0 -59
  515. package/.opencode/skills/code-documentation/SKILL.md +0 -57
  516. package/.opencode/skills/code-documentation/examples/cpp.md +0 -29
  517. package/.opencode/skills/code-documentation/examples/csharp.md +0 -28
  518. package/.opencode/skills/code-documentation/examples/javascript_typescript.md +0 -28
  519. package/.opencode/skills/code-documentation/examples/python.md +0 -57
  520. package/.opencode/skills/code-review/SKILL.md +0 -43
  521. package/.opencode/skills/commit-message/SKILL.md +0 -79
  522. package/.opencode/skills/cpp-best-practices/SKILL.md +0 -234
  523. package/.opencode/skills/cpp-best-practices/examples/modern-idioms.md +0 -189
  524. package/.opencode/skills/cpp-best-practices/examples/naming-and-organization.md +0 -102
  525. package/.opencode/skills/cpp-concurrency-safety/SKILL.md +0 -60
  526. package/.opencode/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
  527. package/.opencode/skills/cpp-const-correctness/SKILL.md +0 -63
  528. package/.opencode/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
  529. package/.opencode/skills/cpp-memory-handling/SKILL.md +0 -42
  530. package/.opencode/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
  531. package/.opencode/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
  532. package/.opencode/skills/cpp-modern-composition/SKILL.md +0 -64
  533. package/.opencode/skills/cpp-modern-composition/examples/composition.md +0 -51
  534. package/.opencode/skills/cpp-robust-interfaces/SKILL.md +0 -55
  535. package/.opencode/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
  536. package/.opencode/skills/create-hardened-docker-skill/SKILL.md +0 -637
  537. package/.opencode/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
  538. package/.opencode/skills/csharp-best-practices/SKILL.md +0 -278
  539. package/.opencode/skills/docker-hardening-verification/SKILL.md +0 -28
  540. package/.opencode/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
  541. package/.opencode/skills/docker-image-signing/SKILL.md +0 -28
  542. package/.opencode/skills/docker-image-signing/scripts/sign-image.sh +0 -33
  543. package/.opencode/skills/document-revision-history/SKILL.md +0 -104
  544. package/.roo/skills/ai-audit-trail/SKILL.md +0 -23
  545. package/.roo/skills/auto-bug-detection/SKILL.md +0 -169
  546. package/.roo/skills/cmake-best-practices/SKILL.md +0 -64
  547. package/.roo/skills/cmake-best-practices/examples/cmake.md +0 -59
  548. package/.roo/skills/code-documentation/SKILL.md +0 -57
  549. package/.roo/skills/code-documentation/examples/cpp.md +0 -29
  550. package/.roo/skills/code-documentation/examples/csharp.md +0 -28
  551. package/.roo/skills/code-documentation/examples/javascript_typescript.md +0 -28
  552. package/.roo/skills/code-documentation/examples/python.md +0 -57
  553. package/.roo/skills/code-review/SKILL.md +0 -43
  554. package/.roo/skills/commit-message/SKILL.md +0 -79
  555. package/.roo/skills/cpp-best-practices/SKILL.md +0 -234
  556. package/.roo/skills/cpp-best-practices/examples/modern-idioms.md +0 -189
  557. package/.roo/skills/cpp-best-practices/examples/naming-and-organization.md +0 -102
  558. package/.roo/skills/cpp-concurrency-safety/SKILL.md +0 -60
  559. package/.roo/skills/cpp-concurrency-safety/examples/concurrency.md +0 -73
  560. package/.roo/skills/cpp-const-correctness/SKILL.md +0 -63
  561. package/.roo/skills/cpp-const-correctness/examples/const_correctness.md +0 -54
  562. package/.roo/skills/cpp-memory-handling/SKILL.md +0 -42
  563. package/.roo/skills/cpp-memory-handling/examples/modern-cpp.md +0 -49
  564. package/.roo/skills/cpp-memory-handling/examples/smart-pointers.md +0 -46
  565. package/.roo/skills/cpp-modern-composition/SKILL.md +0 -64
  566. package/.roo/skills/cpp-modern-composition/examples/composition.md +0 -51
  567. package/.roo/skills/cpp-robust-interfaces/SKILL.md +0 -55
  568. package/.roo/skills/cpp-robust-interfaces/examples/interfaces.md +0 -56
  569. package/.roo/skills/create-hardened-docker-skill/SKILL.md +0 -637
  570. package/.roo/skills/create-hardened-docker-skill/scripts/create-all.sh +0 -489
  571. package/.roo/skills/csharp-best-practices/SKILL.md +0 -278
  572. package/.roo/skills/docker-hardening-verification/SKILL.md +0 -28
  573. package/.roo/skills/docker-hardening-verification/scripts/verify-hardening.sh +0 -39
  574. package/.roo/skills/docker-image-signing/SKILL.md +0 -28
  575. package/.roo/skills/docker-image-signing/scripts/sign-image.sh +0 -33
  576. package/.roo/skills/document-revision-history/SKILL.md +0 -104
@@ -0,0 +1,654 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ eda_analyzer.py — BMAD DL Lifecycle (inspired by K-Dense claude-scientific-skills)
4
+ ML-focused Exploratory Data Analysis for common deep learning data formats.
5
+
6
+ Supported formats:
7
+ - Image datasets : directory of images (class-labeled subdirs or flat)
8
+ - CSV / TSV : tabular feature/label datasets
9
+ - NumPy : .npy / .npz arrays
10
+ - HDF5 : .h5 / .hdf5 files
11
+ - JSON annotations: COCO-style or flat label files
12
+
13
+ Generates a structured markdown EDA report aligned with TSK-001 requirements:
14
+ class distributions, annotation quality, missing values, split verification.
15
+
16
+ Usage:
17
+ python3 scripts/eda_analyzer.py <data_path> [--output report.md] [--splits train val test]
18
+ python3 scripts/eda_analyzer.py data/images/ --splits train val test
19
+ python3 scripts/eda_analyzer.py data/features.csv
20
+
21
+ Exit codes:
22
+ 0 — success, report written
23
+ 1 — warnings (partial data)
24
+ 2 — error
25
+ """
26
+
27
+ from __future__ import annotations
28
+
29
+ import argparse
30
+ import json
31
+ import sys
32
+ from collections import Counter, defaultdict
33
+ from dataclasses import dataclass, field
34
+ from datetime import datetime
35
+ from pathlib import Path
36
+ from typing import Any
37
+
38
+
39
+ # ── Optional imports ───────────────────────────────────────────────────────────
40
+
41
+ try:
42
+ import numpy as np
43
+ HAS_NUMPY = True
44
+ except ImportError:
45
+ HAS_NUMPY = False
46
+
47
+ try:
48
+ import csv as _csv
49
+ HAS_CSV = True
50
+ except ImportError:
51
+ HAS_CSV = False # csv is stdlib, always available
52
+
53
+ HAS_PIL = False
54
+ try:
55
+ from PIL import Image
56
+ HAS_PIL = True
57
+ except ImportError:
58
+ pass
59
+
60
+ HAS_H5PY = False
61
+ try:
62
+ import h5py
63
+ HAS_H5PY = True
64
+ except ImportError:
65
+ pass
66
+
67
+
68
+ # ── Data structures ────────────────────────────────────────────────────────────
69
+
70
+ IMAGE_EXTENSIONS = {".jpg", ".jpeg", ".png", ".bmp", ".tiff", ".tif", ".webp"}
71
+
72
+ @dataclass
73
+ class ClassInfo:
74
+ name: str
75
+ count: int
76
+ sample_files: list[str] = field(default_factory=list)
77
+
78
+
79
+ @dataclass
80
+ class EDAReport:
81
+ data_path: Path
82
+ format_detected: str
83
+ warnings: list[str] = field(default_factory=list)
84
+ errors: list[str] = field(default_factory=list)
85
+
86
+ # Image dataset
87
+ total_images: int = 0
88
+ classes: list[ClassInfo] = field(default_factory=list)
89
+ image_sizes: list[tuple[int, int]] = field(default_factory=list)
90
+ corrupt_files: list[str] = field(default_factory=list)
91
+ splits_found: dict[str, int] = field(default_factory=dict)
92
+
93
+ # Tabular
94
+ num_rows: int = 0
95
+ num_cols: int = 0
96
+ columns: list[str] = field(default_factory=list)
97
+ missing_values: dict[str, int] = field(default_factory=dict)
98
+ label_distribution: dict[str, int] = field(default_factory=dict)
99
+ numeric_stats: dict[str, dict[str, float]] = field(default_factory=dict)
100
+
101
+ # NumPy
102
+ array_shapes: list[tuple] = field(default_factory=list)
103
+ array_dtypes: list[str] = field(default_factory=list)
104
+ array_stats: dict[str, Any] = field(default_factory=dict)
105
+
106
+ # HDF5
107
+ hdf5_keys: list[str] = field(default_factory=list)
108
+ hdf5_shapes: dict[str, tuple] = field(default_factory=dict)
109
+
110
+ # Annotation JSON
111
+ annotation_classes: dict[str, int] = field(default_factory=dict)
112
+ annotation_count: int = 0
113
+ images_without_annotations: int = 0
114
+
115
+
116
+ # ── Format detection ───────────────────────────────────────────────────────────
117
+
118
+ def detect_format(path: Path) -> str:
119
+ if path.is_dir():
120
+ # Check if it's an image dataset directory
121
+ image_files = list(path.rglob("*"))
122
+ if any(f.suffix.lower() in IMAGE_EXTENSIONS for f in image_files[:50]):
123
+ return "image_dir"
124
+ return "unknown_dir"
125
+ suffix = path.suffix.lower()
126
+ if suffix in (".csv", ".tsv"):
127
+ return "csv"
128
+ if suffix in (".npy", ".npz"):
129
+ return "numpy"
130
+ if suffix in (".h5", ".hdf5"):
131
+ return "hdf5"
132
+ if suffix == ".json":
133
+ return "json_annotations"
134
+ return "unknown"
135
+
136
+
137
+ # ── Image dataset analysis ─────────────────────────────────────────────────────
138
+
139
+ def analyze_image_dir(path: Path, report: EDAReport, split_names: list[str]) -> None:
140
+ report.format_detected = "Image Dataset (directory)"
141
+
142
+ # Check for split subdirectories
143
+ subdirs = [d for d in path.iterdir() if d.is_dir()]
144
+ split_dirs = [d for d in subdirs if d.name.lower() in (s.lower() for s in split_names)]
145
+
146
+ if split_dirs:
147
+ # Split-structured dataset: path/train/class/img.jpg
148
+ for split_dir in split_dirs:
149
+ class_dirs = [d for d in split_dir.iterdir() if d.is_dir()]
150
+ split_count = sum(
151
+ len([f for f in cd.iterdir() if f.suffix.lower() in IMAGE_EXTENSIONS])
152
+ for cd in class_dirs
153
+ )
154
+ report.splits_found[split_dir.name] = split_count
155
+
156
+ # Analyze class distribution from train split (or first split)
157
+ ref_split = next((d for d in split_dirs if "train" in d.name.lower()), split_dirs[0])
158
+ _analyze_class_structure(ref_split, report)
159
+ else:
160
+ # Flat or class-labeled directory: path/class/img.jpg
161
+ _analyze_class_structure(path, report)
162
+
163
+ report.total_images = sum(c.count for c in report.classes)
164
+
165
+ # Sample image sizes
166
+ if HAS_PIL:
167
+ _sample_image_sizes(path, report)
168
+ else:
169
+ report.warnings.append(
170
+ "PIL not installed — skipping image size and corruption checks. "
171
+ "Install with: pip install Pillow"
172
+ )
173
+
174
+ # Class balance check
175
+ if report.classes:
176
+ counts = [c.count for c in report.classes]
177
+ max_c, min_c = max(counts), min(counts)
178
+ if min_c > 0 and max_c / min_c > 5:
179
+ report.warnings.append(
180
+ f"Severe class imbalance detected: ratio {max_c/min_c:.1f}:1 "
181
+ f"({report.classes[counts.index(max_c)].name} vs "
182
+ f"{report.classes[counts.index(min_c)].name}). "
183
+ f"Consider oversampling, undersampling, or weighted loss."
184
+ )
185
+ elif min_c > 0 and max_c / min_c > 2:
186
+ report.warnings.append(
187
+ f"Moderate class imbalance: ratio {max_c/min_c:.1f}:1. "
188
+ f"Monitor per-class metrics during training."
189
+ )
190
+
191
+
192
+ def _analyze_class_structure(base_dir: Path, report: EDAReport) -> None:
193
+ class_dirs = [d for d in base_dir.iterdir() if d.is_dir()]
194
+ if class_dirs:
195
+ for class_dir in sorted(class_dirs):
196
+ images = [f for f in class_dir.iterdir() if f.suffix.lower() in IMAGE_EXTENSIONS]
197
+ report.classes.append(ClassInfo(
198
+ name=class_dir.name,
199
+ count=len(images),
200
+ sample_files=[f.name for f in images[:3]],
201
+ ))
202
+ else:
203
+ # Flat directory
204
+ images = [f for f in base_dir.iterdir() if f.suffix.lower() in IMAGE_EXTENSIONS]
205
+ if images:
206
+ report.classes.append(ClassInfo(name="(unlabeled)", count=len(images)))
207
+ report.warnings.append(
208
+ "No class subdirectories found — images appear unlabeled. "
209
+ "Organize into class subdirectories for supervised training."
210
+ )
211
+
212
+
213
+ def _sample_image_sizes(base_dir: Path, report: EDAReport, max_samples: int = 100) -> None:
214
+ all_images = list(base_dir.rglob("*"))
215
+ image_files = [f for f in all_images if f.suffix.lower() in IMAGE_EXTENSIONS][:max_samples]
216
+ sizes: list[tuple[int, int]] = []
217
+
218
+ for img_path in image_files:
219
+ try:
220
+ with Image.open(img_path) as img:
221
+ sizes.append(img.size) # (width, height)
222
+ except Exception:
223
+ report.corrupt_files.append(str(img_path.relative_to(base_dir)))
224
+
225
+ report.image_sizes = sizes
226
+ if report.corrupt_files:
227
+ report.warnings.append(
228
+ f"{len(report.corrupt_files)} corrupt or unreadable image(s) found."
229
+ )
230
+
231
+ if sizes:
232
+ unique_sizes = set(sizes)
233
+ if len(unique_sizes) > 1:
234
+ report.warnings.append(
235
+ f"Inconsistent image sizes detected: {len(unique_sizes)} unique sizes in sample. "
236
+ f"Most common: {Counter(sizes).most_common(1)[0][0]}. "
237
+ f"Consider resizing to a fixed resolution."
238
+ )
239
+
240
+
241
+ # ── CSV / tabular analysis ─────────────────────────────────────────────────────
242
+
243
+ def analyze_csv(path: Path, report: EDAReport) -> None:
244
+ import csv
245
+ report.format_detected = "CSV/Tabular Dataset"
246
+
247
+ with path.open(newline="", encoding="utf-8", errors="replace") as f:
248
+ reader = csv.DictReader(f)
249
+ rows = list(reader)
250
+
251
+ if not rows:
252
+ report.errors.append("CSV file is empty.")
253
+ return
254
+
255
+ report.columns = list(rows[0].keys())
256
+ report.num_rows = len(rows)
257
+ report.num_cols = len(report.columns)
258
+
259
+ # Missing values per column
260
+ for col in report.columns:
261
+ missing = sum(1 for row in rows if not row.get(col, "").strip())
262
+ if missing:
263
+ report.missing_values[col] = missing
264
+
265
+ # Detect label column (common names)
266
+ label_col = next(
267
+ (c for c in report.columns if c.lower() in ("label", "class", "target", "y", "category")),
268
+ None,
269
+ )
270
+ if label_col:
271
+ label_counts = Counter(row[label_col].strip() for row in rows if row.get(label_col))
272
+ report.label_distribution = dict(label_counts.most_common())
273
+
274
+ counts = list(label_counts.values())
275
+ if counts and max(counts) / max(min(counts), 1) > 5:
276
+ report.warnings.append(
277
+ f"Class imbalance in '{label_col}': "
278
+ f"ratio {max(counts)/min(counts):.1f}:1"
279
+ )
280
+ else:
281
+ report.warnings.append(
282
+ "No standard label column found (tried: label, class, target, y, category). "
283
+ "Verify your column names."
284
+ )
285
+
286
+ # Numeric stats for up to 10 columns
287
+ if HAS_NUMPY:
288
+ numeric_cols = []
289
+ for col in report.columns[:20]:
290
+ try:
291
+ vals = [float(row[col]) for row in rows if row.get(col, "").strip()]
292
+ if vals:
293
+ arr = np.array(vals)
294
+ report.numeric_stats[col] = {
295
+ "mean": float(arr.mean()),
296
+ "std": float(arr.std()),
297
+ "min": float(arr.min()),
298
+ "max": float(arr.max()),
299
+ "missing": report.missing_values.get(col, 0),
300
+ }
301
+ numeric_cols.append(col)
302
+ if len(numeric_cols) >= 10:
303
+ break
304
+ except ValueError:
305
+ pass
306
+
307
+
308
+ # ── NumPy analysis ─────────────────────────────────────────────────────────────
309
+
310
+ def analyze_numpy(path: Path, report: EDAReport) -> None:
311
+ if not HAS_NUMPY:
312
+ report.errors.append("numpy not installed. Install with: pip install numpy")
313
+ return
314
+
315
+ report.format_detected = "NumPy Array"
316
+ if path.suffix == ".npz":
317
+ data = np.load(path, allow_pickle=True)
318
+ for key in data.files:
319
+ arr = data[key]
320
+ report.array_shapes.append((key, arr.shape))
321
+ report.array_dtypes.append(f"{key}: {arr.dtype}")
322
+ if arr.dtype.kind in ("f", "i", "u"):
323
+ report.array_stats[key] = {
324
+ "shape": arr.shape,
325
+ "dtype": str(arr.dtype),
326
+ "min": float(arr.min()),
327
+ "max": float(arr.max()),
328
+ "mean": float(arr.mean()),
329
+ "nan_count": int(np.isnan(arr).sum()) if arr.dtype.kind == "f" else 0,
330
+ }
331
+ else:
332
+ arr = np.load(path, allow_pickle=True)
333
+ report.array_shapes.append(("array", arr.shape))
334
+ report.array_dtypes.append(str(arr.dtype))
335
+ if arr.dtype.kind in ("f", "i", "u"):
336
+ report.array_stats["array"] = {
337
+ "shape": arr.shape,
338
+ "dtype": str(arr.dtype),
339
+ "min": float(arr.min()),
340
+ "max": float(arr.max()),
341
+ "mean": float(arr.mean()),
342
+ "nan_count": int(np.isnan(arr).sum()) if arr.dtype.kind == "f" else 0,
343
+ }
344
+
345
+
346
+ # ── HDF5 analysis ──────────────────────────────────────────────────────────────
347
+
348
+ def analyze_hdf5(path: Path, report: EDAReport) -> None:
349
+ if not HAS_H5PY:
350
+ report.errors.append("h5py not installed. Install with: pip install h5py")
351
+ return
352
+
353
+ report.format_detected = "HDF5 File"
354
+ with h5py.File(path, "r") as f:
355
+ def visitor(name, obj):
356
+ if isinstance(obj, h5py.Dataset):
357
+ report.hdf5_keys.append(name)
358
+ report.hdf5_shapes[name] = obj.shape
359
+
360
+ f.visititems(visitor)
361
+
362
+ if not report.hdf5_keys:
363
+ report.warnings.append("HDF5 file contains no datasets.")
364
+
365
+
366
+ # ── JSON annotation analysis ───────────────────────────────────────────────────
367
+
368
+ def analyze_json_annotations(path: Path, report: EDAReport) -> None:
369
+ report.format_detected = "JSON Annotations"
370
+ data = json.loads(path.read_text(encoding="utf-8"))
371
+
372
+ # COCO format detection
373
+ if isinstance(data, dict) and "annotations" in data and "categories" in data:
374
+ categories = {c["id"]: c["name"] for c in data.get("categories", [])}
375
+ ann_counts: Counter = Counter()
376
+ for ann in data.get("annotations", []):
377
+ cat_id = ann.get("category_id")
378
+ ann_counts[categories.get(cat_id, f"id_{cat_id}")] += 1
379
+
380
+ report.annotation_count = len(data["annotations"])
381
+ report.annotation_classes = dict(ann_counts)
382
+
383
+ # Images without annotations
384
+ annotated_images = {ann["image_id"] for ann in data["annotations"]}
385
+ total_images = len(data.get("images", []))
386
+ report.images_without_annotations = total_images - len(annotated_images)
387
+ if report.images_without_annotations > 0:
388
+ pct = report.images_without_annotations / max(total_images, 1) * 100
389
+ report.warnings.append(
390
+ f"{report.images_without_annotations} images ({pct:.1f}%) have no annotations."
391
+ )
392
+ return
393
+
394
+ # Flat label dict format: {"image.jpg": "class_name", ...}
395
+ if isinstance(data, dict):
396
+ counter: Counter = Counter(str(v) for v in data.values())
397
+ report.annotation_classes = dict(counter)
398
+ report.annotation_count = len(data)
399
+ return
400
+
401
+ # List of dicts: [{"image": "...", "label": "..."}, ...]
402
+ if isinstance(data, list) and data and isinstance(data[0], dict):
403
+ label_key = next(
404
+ (k for k in data[0] if k.lower() in ("label", "class", "category", "target")),
405
+ None,
406
+ )
407
+ if label_key:
408
+ counter = Counter(str(item.get(label_key, "unknown")) for item in data)
409
+ report.annotation_classes = dict(counter)
410
+ report.annotation_count = len(data)
411
+
412
+
413
+ # ── Report generation ──────────────────────────────────────────────────────────
414
+
415
+ def generate_markdown_report(report: EDAReport) -> str:
416
+ lines: list[str] = []
417
+ now = datetime.now().strftime("%Y-%m-%d %H:%M")
418
+
419
+ lines += [
420
+ f"# EDA Report: {report.data_path.name}",
421
+ f"*Generated: {now} | Format: {report.format_detected}*",
422
+ "",
423
+ "---",
424
+ "",
425
+ "## A. Dataset Overview",
426
+ "",
427
+ f"| Property | Value |",
428
+ f"| :--- | :--- |",
429
+ f"| Path | `{report.data_path}` |",
430
+ f"| Format | {report.format_detected} |",
431
+ ]
432
+
433
+ # Format-specific overview
434
+ if report.classes:
435
+ lines += [
436
+ f"| Total Images | {report.total_images:,} |",
437
+ f"| Number of Classes | {len(report.classes)} |",
438
+ ]
439
+ if report.splits_found:
440
+ for split, count in report.splits_found.items():
441
+ lines.append(f"| Split: {split} | {count:,} images |")
442
+ if report.num_rows:
443
+ lines += [
444
+ f"| Rows | {report.num_rows:,} |",
445
+ f"| Columns | {report.num_cols} |",
446
+ ]
447
+
448
+ lines += ["", "---", "", "## B. Class Distribution", ""]
449
+
450
+ if report.classes:
451
+ total = sum(c.count for c in report.classes) or 1
452
+ lines += [
453
+ "| Class | Count | % of Total |",
454
+ "| :--- | ---: | ---: |",
455
+ ]
456
+ for c in sorted(report.classes, key=lambda x: -x.count):
457
+ pct = c.count / total * 100
458
+ bar = "█" * int(pct / 5)
459
+ lines.append(f"| {c.name} | {c.count:,} | {pct:.1f}% {bar} |")
460
+
461
+ elif report.label_distribution:
462
+ total = sum(report.label_distribution.values()) or 1
463
+ lines += [
464
+ "| Label | Count | % of Total |",
465
+ "| :--- | ---: | ---: |",
466
+ ]
467
+ for label, count in report.label_distribution.items():
468
+ pct = count / total * 100
469
+ lines.append(f"| {label} | {count:,} | {pct:.1f}% |")
470
+
471
+ elif report.annotation_classes:
472
+ lines += [
473
+ f"Total annotations: {report.annotation_count:,}",
474
+ "",
475
+ "| Class | Count |",
476
+ "| :--- | ---: |",
477
+ ]
478
+ for cls, count in sorted(report.annotation_classes.items(), key=lambda x: -x[1]):
479
+ lines.append(f"| {cls} | {count:,} |")
480
+
481
+ else:
482
+ lines.append("*No class/label information available.*")
483
+
484
+ lines += ["", "---", "", "## C. Data Quality Assessment", ""]
485
+
486
+ # Image sizes
487
+ if report.image_sizes:
488
+ from collections import Counter as C
489
+ size_counts = C(report.image_sizes)
490
+ most_common_size, count = size_counts.most_common(1)[0]
491
+ pct = count / len(report.image_sizes) * 100
492
+ lines += [
493
+ f"| Property | Value |",
494
+ f"| :--- | :--- |",
495
+ f"| Most common image size | {most_common_size[0]}×{most_common_size[1]}px ({pct:.0f}% of sample) |",
496
+ f"| Unique sizes in sample | {len(size_counts)} |",
497
+ f"| Corrupt/unreadable files | {len(report.corrupt_files)} |",
498
+ "",
499
+ ]
500
+
501
+ # Missing values
502
+ if report.missing_values:
503
+ total = report.num_rows or 1
504
+ lines += [
505
+ "**Missing Values:**",
506
+ "",
507
+ "| Column | Missing | % |",
508
+ "| :--- | ---: | ---: |",
509
+ ]
510
+ for col, count in sorted(report.missing_values.items(), key=lambda x: -x[1]):
511
+ lines.append(f"| {col} | {count} | {count/total*100:.1f}% |")
512
+ lines.append("")
513
+ elif report.num_rows:
514
+ lines.append("✓ No missing values detected.")
515
+ lines.append("")
516
+
517
+ # NumPy stats
518
+ if report.array_stats:
519
+ lines += ["**Array Statistics:**", ""]
520
+ for key, stats in report.array_stats.items():
521
+ lines += [
522
+ f"*{key}*: shape={stats['shape']}, dtype={stats['dtype']} ",
523
+ f"min={stats['min']:.4f}, max={stats['max']:.4f}, mean={stats['mean']:.4f}",
524
+ f"NaN count: {stats.get('nan_count', 0)}",
525
+ "",
526
+ ]
527
+
528
+ # HDF5
529
+ if report.hdf5_keys:
530
+ lines += [
531
+ "**HDF5 Datasets:**", "",
532
+ "| Dataset | Shape |",
533
+ "| :--- | :--- |",
534
+ ]
535
+ for key in report.hdf5_keys:
536
+ lines.append(f"| {key} | {report.hdf5_shapes[key]} |")
537
+ lines.append("")
538
+
539
+ # Split verification
540
+ lines += ["---", "", "## D. Split Verification", ""]
541
+ if report.splits_found:
542
+ total_split = sum(report.splits_found.values()) or 1
543
+ lines += [
544
+ "| Split | Count | % |",
545
+ "| :--- | ---: | ---: |",
546
+ ]
547
+ for split, count in report.splits_found.items():
548
+ pct = count / total_split * 100
549
+ lines.append(f"| {split} | {count:,} | {pct:.1f}% |")
550
+
551
+ # Check for reasonable split ratios
552
+ counts = list(report.splits_found.values())
553
+ if len(counts) >= 2:
554
+ train_count = report.splits_found.get("train", counts[0])
555
+ if train_count / total_split < 0.5:
556
+ report.warnings.append(
557
+ f"Training split is only {train_count/total_split*100:.0f}% of total data. "
558
+ f"Typical splits: 70-80% train, 10-15% val, 10-15% test."
559
+ )
560
+ else:
561
+ lines.append("⚠ No explicit split directories found.")
562
+ lines.append(
563
+ "Ensure you implement train/val/test splits in your DataLoader. "
564
+ "Recommended: 70/15/15 or 80/10/10."
565
+ )
566
+
567
+ # Warnings and errors
568
+ if report.warnings or report.errors:
569
+ lines += ["", "---", "", "## E. Issues & Recommendations", ""]
570
+ for w in report.warnings:
571
+ lines.append(f"⚠ **Warning:** {w}")
572
+ for e in report.errors:
573
+ lines.append(f"✗ **Error:** {e}")
574
+ lines.append("")
575
+
576
+ lines += [
577
+ "---",
578
+ "",
579
+ "## F. EDA Summary for TSK-001",
580
+ "",
581
+ "| Check | Status |",
582
+ "| :--- | :--- |",
583
+ f"| Class distribution analyzed | {'✓' if report.classes or report.label_distribution or report.annotation_classes else '✗'} |",
584
+ f"| Missing/corrupt data checked | {'✓' if not report.errors else '⚠'} |",
585
+ f"| Class imbalance assessed | {'✓' if report.classes or report.label_distribution else 'N/A'} |",
586
+ f"| Split structure verified | {'✓' if report.splits_found else '⚠ manual check needed'} |",
587
+ f"| Issues found | {len(report.warnings)} warning(s), {len(report.errors)} error(s) |",
588
+ "",
589
+ "*Complete this EDA before proceeding to TSK-002 (DataLoader implementation).*",
590
+ ]
591
+
592
+ return "\n".join(lines)
593
+
594
+
595
+ # ── Main ───────────────────────────────────────────────────────────────────────
596
+
597
+ def analyze(data_path: Path, split_names: list[str] | None = None) -> EDAReport:
598
+ split_names = split_names or ["train", "val", "test", "validation"]
599
+ report = EDAReport(data_path=data_path, format_detected="unknown")
600
+ fmt = detect_format(data_path)
601
+
602
+ if fmt == "image_dir":
603
+ analyze_image_dir(data_path, report, split_names)
604
+ elif fmt == "csv":
605
+ analyze_csv(data_path, report)
606
+ elif fmt == "numpy":
607
+ analyze_numpy(data_path, report)
608
+ elif fmt == "hdf5":
609
+ analyze_hdf5(data_path, report)
610
+ elif fmt == "json_annotations":
611
+ analyze_json_annotations(data_path, report)
612
+ else:
613
+ report.errors.append(
614
+ f"Unrecognized format for '{data_path}'. "
615
+ f"Supported: image directory, CSV, .npy/.npz, .h5/.hdf5, .json (annotations)"
616
+ )
617
+
618
+ return report
619
+
620
+
621
+ def main() -> int:
622
+ parser = argparse.ArgumentParser(description="ML EDA Analyzer for BMAD DL Lifecycle")
623
+ parser.add_argument("data_path", type=Path, help="Path to dataset file or directory")
624
+ parser.add_argument("--output", type=Path, default=None,
625
+ help="Output markdown report path (default: <data_path>_eda_report.md)")
626
+ parser.add_argument("--splits", nargs="+", default=["train", "val", "test"],
627
+ help="Expected split directory names")
628
+ args = parser.parse_args()
629
+
630
+ if not args.data_path.exists():
631
+ print(f"Error: Path not found: {args.data_path}", file=sys.stderr)
632
+ return 2
633
+
634
+ report = analyze(args.data_path, args.splits)
635
+ markdown = generate_markdown_report(report)
636
+
637
+ output_path = args.output or args.data_path.parent / f"{args.data_path.stem}_eda_report.md"
638
+ output_path.write_text(markdown, encoding="utf-8")
639
+
640
+ print(f"\n✓ EDA report written to: {output_path}")
641
+ print(f" Format: {report.format_detected}")
642
+ if report.classes:
643
+ print(f" Classes: {len(report.classes)}, Total samples: {report.total_images:,}")
644
+ if report.warnings:
645
+ print(f" ⚠ {len(report.warnings)} warning(s) — review report for details")
646
+ if report.errors:
647
+ print(f" ✗ {len(report.errors)} error(s)")
648
+ return 1
649
+
650
+ return 0
651
+
652
+
653
+ if __name__ == "__main__":
654
+ sys.exit(main())
@@ -0,0 +1,7 @@
1
+ {
2
+ "name": "ML Exploratory Data Analysis (EDA)",
3
+ "description": "Performs statistical analysis, establishes performance baselines, and interprets results with the Scientist Demerzel.",
4
+ "version": "1.0.0",
5
+ "author": "Demerzel (ML Scientist)",
6
+ "tags": ["Machine Learning", "Exploratory Data Analysis", "EDA", "Baselines"]
7
+ }
File without changes