agentic-qe 3.4.0 → 3.4.2

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 (498) hide show
  1. package/.claude/skills/.validation/README.md +111 -0
  2. package/.claude/skills/.validation/examples/chaos-engineering-output.example.json +530 -0
  3. package/.claude/skills/.validation/examples/performance-testing-output.example.json +252 -0
  4. package/.claude/skills/.validation/examples/security-testing-output.example.json +413 -0
  5. package/.claude/skills/.validation/examples/testability-scoring-output.example.json +350 -0
  6. package/.claude/skills/.validation/schemas/skill-eval.schema.json +452 -0
  7. package/.claude/skills/.validation/schemas/skill-frontmatter.schema.json +341 -0
  8. package/.claude/skills/.validation/schemas/skill-output-meta.schema.json +199 -0
  9. package/.claude/skills/.validation/schemas/skill-output.template.json +610 -0
  10. package/.claude/skills/.validation/skill-validation-mcp-integration.md +250 -0
  11. package/.claude/skills/.validation/templates/eval.template.yaml +366 -0
  12. package/.claude/skills/.validation/templates/schemas/output.json +145 -0
  13. package/.claude/skills/.validation/templates/security-testing-eval.template.yaml +725 -0
  14. package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +225 -0
  15. package/.claude/skills/.validation/templates/validate.template.sh +1060 -0
  16. package/.claude/skills/.validation/templates/validator-lib.sh +1031 -0
  17. package/.claude/skills/.validation/test-data/invalid-output.json +5 -0
  18. package/.claude/skills/.validation/test-data/minimal-output.json +9 -0
  19. package/.claude/skills/.validation/test-data/sample-output.json +73 -0
  20. package/.claude/skills/TRUST-TIERS.md +158 -0
  21. package/.claude/skills/a11y-ally/SKILL.md +1664 -1658
  22. package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +376 -0
  23. package/.claude/skills/a11y-ally/schemas/output.json +549 -0
  24. package/.claude/skills/a11y-ally/scripts/validate.sh +690 -0
  25. package/.claude/skills/accessibility-testing/SKILL.md +8 -1
  26. package/.claude/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -0
  27. package/.claude/skills/accessibility-testing/schemas/output.json +776 -0
  28. package/.claude/skills/accessibility-testing/scripts/validate.sh +943 -0
  29. package/.claude/skills/accessibility-testing/test-data/sample-output.json +191 -0
  30. package/.claude/skills/agentic-quality-engineering/SKILL.md +4 -0
  31. package/.claude/skills/agentic-quality-engineering/schemas/output.json +577 -0
  32. package/.claude/skills/api-testing-patterns/SKILL.md +5 -0
  33. package/.claude/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -0
  34. package/.claude/skills/api-testing-patterns/schemas/output.json +845 -0
  35. package/.claude/skills/api-testing-patterns/scripts/validate.sh +931 -0
  36. package/.claude/skills/aqe-v2-v3-migration/schemas/output.json +513 -0
  37. package/.claude/skills/aqe-v2-v3-migration/skill.md +4 -0
  38. package/.claude/skills/brutal-honesty-review/SKILL.md +5 -0
  39. package/.claude/skills/brutal-honesty-review/schemas/output.json +291 -0
  40. package/.claude/skills/brutal-honesty-review/scripts/validate.sh +130 -0
  41. package/.claude/skills/bug-reporting-excellence/SKILL.md +5 -0
  42. package/.claude/skills/bug-reporting-excellence/schemas/output.json +288 -0
  43. package/.claude/skills/bug-reporting-excellence/scripts/validate.sh +108 -0
  44. package/.claude/skills/chaos-engineering-resilience/SKILL.md +5 -0
  45. package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -0
  46. package/.claude/skills/chaos-engineering-resilience/schemas/output.json +1205 -0
  47. package/.claude/skills/chaos-engineering-resilience/scripts/validate.sh +1107 -0
  48. package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +6 -0
  49. package/.claude/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +157 -0
  50. package/.claude/skills/cicd-pipeline-qe-orchestrator/schemas/output.json +542 -0
  51. package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate.sh +310 -0
  52. package/.claude/skills/code-review-quality/SKILL.md +5 -0
  53. package/.claude/skills/code-review-quality/schemas/output.json +264 -0
  54. package/.claude/skills/code-review-quality/scripts/validate.sh +113 -0
  55. package/.claude/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -0
  56. package/.claude/skills/compatibility-testing/schemas/output.json +551 -0
  57. package/.claude/skills/compatibility-testing/scripts/validate.sh +605 -0
  58. package/.claude/skills/compliance-testing/SKILL.md +7 -0
  59. package/.claude/skills/compliance-testing/evals/compliance-testing.yaml +1107 -0
  60. package/.claude/skills/compliance-testing/schemas/output.json +845 -0
  61. package/.claude/skills/compliance-testing/scripts/validate.sh +888 -0
  62. package/.claude/skills/consultancy-practices/SKILL.md +4 -0
  63. package/.claude/skills/consultancy-practices/schemas/output.json +282 -0
  64. package/.claude/skills/context-driven-testing/SKILL.md +3 -0
  65. package/.claude/skills/contract-testing/SKILL.md +5 -0
  66. package/.claude/skills/contract-testing/evals/contract-testing.yaml +748 -0
  67. package/.claude/skills/contract-testing/schemas/output.json +638 -0
  68. package/.claude/skills/contract-testing/scripts/validate.sh +1033 -0
  69. package/.claude/skills/database-testing/SKILL.md +5 -0
  70. package/.claude/skills/database-testing/evals/database-testing.yaml +968 -0
  71. package/.claude/skills/database-testing/schemas/output.json +1446 -0
  72. package/.claude/skills/database-testing/scripts/validate.sh +1099 -0
  73. package/.claude/skills/exploratory-testing-advanced/SKILL.md +3 -0
  74. package/.claude/skills/holistic-testing-pact/SKILL.md +3 -0
  75. package/.claude/skills/localization-testing/SKILL.md +6 -0
  76. package/.claude/skills/localization-testing/evals/localization-testing.yaml +544 -0
  77. package/.claude/skills/localization-testing/schemas/output.json +325 -0
  78. package/.claude/skills/localization-testing/scripts/validate.sh +131 -0
  79. package/.claude/skills/mobile-testing/SKILL.md +6 -0
  80. package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +537 -0
  81. package/.claude/skills/mobile-testing/schemas/output.json +318 -0
  82. package/.claude/skills/mobile-testing/scripts/validate.sh +127 -0
  83. package/.claude/skills/mutation-testing/SKILL.md +8 -1
  84. package/.claude/skills/mutation-testing/evals/mutation-testing.yaml +652 -0
  85. package/.claude/skills/mutation-testing/schemas/output.json +707 -0
  86. package/.claude/skills/mutation-testing/scripts/validate.sh +992 -0
  87. package/.claude/skills/mutation-testing/test-data/sample-output.json +295 -0
  88. package/.claude/skills/n8n-expression-testing/SKILL.md +6 -0
  89. package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +450 -0
  90. package/.claude/skills/n8n-expression-testing/schemas/output.json +369 -0
  91. package/.claude/skills/n8n-expression-testing/scripts/validate.sh +162 -0
  92. package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +6 -0
  93. package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +522 -0
  94. package/.claude/skills/n8n-integration-testing-patterns/schemas/output.json +291 -0
  95. package/.claude/skills/n8n-integration-testing-patterns/scripts/validate.sh +104 -0
  96. package/.claude/skills/n8n-security-testing/SKILL.md +6 -0
  97. package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +493 -0
  98. package/.claude/skills/n8n-security-testing/schemas/output.json +293 -0
  99. package/.claude/skills/n8n-security-testing/scripts/validate.sh +120 -0
  100. package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +6 -0
  101. package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +500 -0
  102. package/.claude/skills/n8n-trigger-testing-strategies/schemas/output.json +295 -0
  103. package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate.sh +121 -0
  104. package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +6 -0
  105. package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +497 -0
  106. package/.claude/skills/n8n-workflow-testing-fundamentals/schemas/output.json +254 -0
  107. package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +126 -0
  108. package/.claude/skills/performance-analysis/SKILL.md +6 -0
  109. package/.claude/skills/performance-analysis/evals/performance-analysis.yaml +144 -0
  110. package/.claude/skills/performance-analysis/schemas/output.json +588 -0
  111. package/.claude/skills/performance-analysis/scripts/validate.sh +63 -0
  112. package/.claude/skills/performance-testing/SKILL.md +5 -0
  113. package/.claude/skills/performance-testing/evals/performance-testing.yaml +772 -0
  114. package/.claude/skills/performance-testing/schemas/output.json +1184 -0
  115. package/.claude/skills/performance-testing/scripts/validate.sh +1090 -0
  116. package/.claude/skills/qcsd-ideation-swarm/SKILL.md +1759 -1753
  117. package/.claude/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +138 -0
  118. package/.claude/skills/qcsd-ideation-swarm/schemas/output.json +568 -0
  119. package/.claude/skills/qcsd-ideation-swarm/scripts/validate.sh +56 -0
  120. package/.claude/skills/qe-chaos-resilience/SKILL.md +6 -0
  121. package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -0
  122. package/.claude/skills/qe-chaos-resilience/schemas/output.json +314 -0
  123. package/.claude/skills/qe-chaos-resilience/scripts/validate.sh +401 -0
  124. package/.claude/skills/qe-code-intelligence/SKILL.md +6 -0
  125. package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -0
  126. package/.claude/skills/qe-code-intelligence/schemas/output.json +315 -0
  127. package/.claude/skills/qe-code-intelligence/scripts/validate.sh +408 -0
  128. package/.claude/skills/qe-contract-testing/SKILL.md +6 -0
  129. package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -0
  130. package/.claude/skills/qe-contract-testing/schemas/output.json +295 -0
  131. package/.claude/skills/qe-contract-testing/scripts/validate.sh +421 -0
  132. package/.claude/skills/qe-coverage-analysis/SKILL.md +6 -0
  133. package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
  134. package/.claude/skills/qe-coverage-analysis/schemas/output.json +286 -0
  135. package/.claude/skills/qe-coverage-analysis/scripts/validate.sh +453 -0
  136. package/.claude/skills/qe-defect-intelligence/SKILL.md +6 -0
  137. package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -0
  138. package/.claude/skills/qe-defect-intelligence/schemas/output.json +283 -0
  139. package/.claude/skills/qe-defect-intelligence/scripts/validate.sh +466 -0
  140. package/.claude/skills/qe-iterative-loop/SKILL.md +445 -440
  141. package/.claude/skills/qe-iterative-loop/schemas/output.json +264 -0
  142. package/.claude/skills/qe-iterative-loop/scripts/validate.sh +474 -0
  143. package/.claude/skills/qe-learning-optimization/SKILL.md +6 -0
  144. package/.claude/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -0
  145. package/.claude/skills/qe-learning-optimization/schemas/output.json +288 -0
  146. package/.claude/skills/qe-learning-optimization/scripts/validate.sh +56 -0
  147. package/.claude/skills/qe-quality-assessment/SKILL.md +6 -0
  148. package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -0
  149. package/.claude/skills/qe-quality-assessment/schemas/output.json +550 -0
  150. package/.claude/skills/qe-quality-assessment/scripts/validate.sh +352 -0
  151. package/.claude/skills/qe-requirements-validation/SKILL.md +6 -0
  152. package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
  153. package/.claude/skills/qe-requirements-validation/schemas/output.json +587 -0
  154. package/.claude/skills/qe-requirements-validation/scripts/validate.sh +275 -0
  155. package/.claude/skills/qe-security-compliance/SKILL.md +6 -0
  156. package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -0
  157. package/.claude/skills/qe-security-compliance/schemas/output.json +498 -0
  158. package/.claude/skills/qe-security-compliance/scripts/validate.sh +305 -0
  159. package/.claude/skills/qe-test-execution/SKILL.md +6 -0
  160. package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -0
  161. package/.claude/skills/qe-test-execution/schemas/output.json +529 -0
  162. package/.claude/skills/qe-test-execution/scripts/validate.sh +323 -0
  163. package/.claude/skills/qe-test-generation/SKILL.md +6 -0
  164. package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -0
  165. package/.claude/skills/qe-test-generation/schemas/output.json +439 -0
  166. package/.claude/skills/qe-test-generation/scripts/validate.sh +56 -0
  167. package/.claude/skills/qe-visual-accessibility/SKILL.md +6 -0
  168. package/.claude/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -0
  169. package/.claude/skills/qe-visual-accessibility/schemas/output.json +491 -0
  170. package/.claude/skills/qe-visual-accessibility/scripts/validate.sh +56 -0
  171. package/.claude/skills/quality-metrics/SKILL.md +6 -0
  172. package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +494 -0
  173. package/.claude/skills/quality-metrics/schemas/output.json +403 -0
  174. package/.claude/skills/quality-metrics/scripts/validate.sh +434 -0
  175. package/.claude/skills/refactoring-patterns/SKILL.md +5 -0
  176. package/.claude/skills/refactoring-patterns/schemas/output.json +475 -0
  177. package/.claude/skills/refactoring-patterns/scripts/validate.sh +241 -0
  178. package/.claude/skills/regression-testing/SKILL.md +6 -0
  179. package/.claude/skills/regression-testing/evals/regression-testing.yaml +504 -0
  180. package/.claude/skills/regression-testing/schemas/output.json +311 -0
  181. package/.claude/skills/regression-testing/scripts/validate.sh +130 -0
  182. package/.claude/skills/risk-based-testing/SKILL.md +6 -0
  183. package/.claude/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -0
  184. package/.claude/skills/risk-based-testing/schemas/output.json +480 -0
  185. package/.claude/skills/risk-based-testing/scripts/validate.sh +56 -0
  186. package/.claude/skills/security-testing/SKILL.md +5 -0
  187. package/.claude/skills/security-testing/evals/security-testing.yaml +789 -0
  188. package/.claude/skills/security-testing/schemas/output.json +879 -0
  189. package/.claude/skills/security-testing/scripts/validate.sh +967 -0
  190. package/.claude/skills/security-visual-testing/SKILL.md +223 -217
  191. package/.claude/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -0
  192. package/.claude/skills/security-visual-testing/schemas/output.json +486 -0
  193. package/.claude/skills/security-visual-testing/scripts/validate.sh +748 -0
  194. package/.claude/skills/sherlock-review/SKILL.md +5 -0
  195. package/.claude/skills/sherlock-review/schemas/output.json +297 -0
  196. package/.claude/skills/sherlock-review/scripts/validate.sh +115 -0
  197. package/.claude/skills/shift-left-testing/SKILL.md +6 -0
  198. package/.claude/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -0
  199. package/.claude/skills/shift-left-testing/schemas/output.json +459 -0
  200. package/.claude/skills/shift-left-testing/scripts/validate.sh +56 -0
  201. package/.claude/skills/shift-right-testing/SKILL.md +6 -0
  202. package/.claude/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -0
  203. package/.claude/skills/shift-right-testing/schemas/output.json +418 -0
  204. package/.claude/skills/shift-right-testing/scripts/validate.sh +56 -0
  205. package/.claude/skills/six-thinking-hats/SKILL.md +3 -0
  206. package/.claude/skills/tdd-london-chicago/SKILL.md +5 -0
  207. package/.claude/skills/tdd-london-chicago/schemas/output.json +444 -0
  208. package/.claude/skills/tdd-london-chicago/scripts/validate.sh +214 -0
  209. package/.claude/skills/technical-writing/SKILL.md +4 -0
  210. package/.claude/skills/technical-writing/schemas/output.json +268 -0
  211. package/.claude/skills/test-automation-strategy/SKILL.md +6 -0
  212. package/.claude/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -0
  213. package/.claude/skills/test-automation-strategy/schemas/output.json +444 -0
  214. package/.claude/skills/test-automation-strategy/scripts/validate.sh +195 -0
  215. package/.claude/skills/test-data-management/SKILL.md +6 -0
  216. package/.claude/skills/test-data-management/evals/test-data-management.yaml +504 -0
  217. package/.claude/skills/test-data-management/schemas/output.json +284 -0
  218. package/.claude/skills/test-data-management/scripts/validate.sh +137 -0
  219. package/.claude/skills/test-design-techniques/SKILL.md +6 -0
  220. package/.claude/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -0
  221. package/.claude/skills/test-design-techniques/schemas/output.json +295 -0
  222. package/.claude/skills/test-design-techniques/scripts/validate.sh +91 -0
  223. package/.claude/skills/test-environment-management/SKILL.md +4 -0
  224. package/.claude/skills/test-environment-management/schemas/output.json +310 -0
  225. package/.claude/skills/test-reporting-analytics/SKILL.md +6 -0
  226. package/.claude/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -0
  227. package/.claude/skills/test-reporting-analytics/schemas/output.json +329 -0
  228. package/.claude/skills/test-reporting-analytics/scripts/validate.sh +77 -0
  229. package/.claude/skills/testability-scoring/SKILL.md +5 -0
  230. package/.claude/skills/testability-scoring/evals/testability-scoring.yaml +814 -0
  231. package/.claude/skills/testability-scoring/schemas/output.json +606 -0
  232. package/.claude/skills/testability-scoring/scripts/validate.sh +891 -0
  233. package/.claude/skills/trust-tier-manifest.json +2333 -0
  234. package/.claude/skills/verification-quality/SKILL.md +6 -0
  235. package/.claude/skills/verification-quality/evals/verification-quality.yaml +150 -0
  236. package/.claude/skills/verification-quality/schemas/output.json +432 -0
  237. package/.claude/skills/verification-quality/scripts/validate.sh +77 -0
  238. package/.claude/skills/visual-testing-advanced/SKILL.md +6 -0
  239. package/.claude/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -0
  240. package/.claude/skills/visual-testing-advanced/schemas/output.json +294 -0
  241. package/.claude/skills/visual-testing-advanced/scripts/validate.sh +77 -0
  242. package/.claude/skills/xp-practices/SKILL.md +3 -0
  243. package/CHANGELOG.md +23 -0
  244. package/README.md +39 -2
  245. package/package.json +4 -1
  246. package/scripts/run-skill-eval.ts +1097 -0
  247. package/scripts/test-schema-validation.js +301 -0
  248. package/scripts/update-skill-manifest.ts +751 -0
  249. package/scripts/validate-skill-frontmatter.js +141 -0
  250. package/v3/CHANGELOG.md +21 -0
  251. package/v3/README.md +43 -3
  252. package/v3/assets/agents/v3/qe-test-idea-rewriter.md +375 -375
  253. package/v3/assets/skills/.validation/README.md +111 -0
  254. package/v3/assets/skills/.validation/examples/chaos-engineering-output.example.json +530 -0
  255. package/v3/assets/skills/.validation/examples/performance-testing-output.example.json +252 -0
  256. package/v3/assets/skills/.validation/examples/security-testing-output.example.json +413 -0
  257. package/v3/assets/skills/.validation/examples/testability-scoring-output.example.json +350 -0
  258. package/v3/assets/skills/.validation/schemas/skill-eval.schema.json +452 -0
  259. package/v3/assets/skills/.validation/schemas/skill-frontmatter.schema.json +341 -0
  260. package/v3/assets/skills/.validation/schemas/skill-output-meta.schema.json +199 -0
  261. package/v3/assets/skills/.validation/schemas/skill-output.template.json +610 -0
  262. package/v3/assets/skills/.validation/skill-validation-mcp-integration.md +250 -0
  263. package/v3/assets/skills/.validation/templates/eval.template.yaml +366 -0
  264. package/v3/assets/skills/.validation/templates/schemas/output.json +145 -0
  265. package/v3/assets/skills/.validation/templates/security-testing-eval.template.yaml +725 -0
  266. package/v3/assets/skills/.validation/templates/skill-frontmatter.example.yaml +225 -0
  267. package/v3/assets/skills/.validation/templates/validate.template.sh +1060 -0
  268. package/v3/assets/skills/.validation/templates/validator-lib.sh +1031 -0
  269. package/v3/assets/skills/.validation/test-data/invalid-output.json +5 -0
  270. package/v3/assets/skills/.validation/test-data/minimal-output.json +9 -0
  271. package/v3/assets/skills/.validation/test-data/sample-output.json +73 -0
  272. package/v3/assets/skills/accessibility-testing/SKILL.md +8 -1
  273. package/v3/assets/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -0
  274. package/v3/assets/skills/accessibility-testing/schemas/output.json +776 -0
  275. package/v3/assets/skills/accessibility-testing/scripts/validate.sh +943 -0
  276. package/v3/assets/skills/accessibility-testing/test-data/sample-output.json +191 -0
  277. package/v3/assets/skills/agentic-quality-engineering/SKILL.md +4 -0
  278. package/v3/assets/skills/agentic-quality-engineering/schemas/output.json +577 -0
  279. package/v3/assets/skills/api-testing-patterns/SKILL.md +5 -0
  280. package/v3/assets/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -0
  281. package/v3/assets/skills/api-testing-patterns/schemas/output.json +845 -0
  282. package/v3/assets/skills/api-testing-patterns/scripts/validate.sh +931 -0
  283. package/v3/assets/skills/aqe-v2-v3-migration/schemas/output.json +513 -0
  284. package/v3/assets/skills/aqe-v2-v3-migration/skill.md +20 -16
  285. package/v3/assets/skills/bug-reporting-excellence/SKILL.md +5 -0
  286. package/v3/assets/skills/bug-reporting-excellence/schemas/output.json +288 -0
  287. package/v3/assets/skills/bug-reporting-excellence/scripts/validate.sh +108 -0
  288. package/v3/assets/skills/chaos-engineering-resilience/SKILL.md +5 -0
  289. package/v3/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -0
  290. package/v3/assets/skills/chaos-engineering-resilience/schemas/output.json +1205 -0
  291. package/v3/assets/skills/chaos-engineering-resilience/scripts/validate.sh +1107 -0
  292. package/v3/assets/skills/code-review-quality/SKILL.md +5 -0
  293. package/v3/assets/skills/code-review-quality/schemas/output.json +264 -0
  294. package/v3/assets/skills/code-review-quality/scripts/validate.sh +113 -0
  295. package/v3/assets/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -0
  296. package/v3/assets/skills/compatibility-testing/schemas/output.json +551 -0
  297. package/v3/assets/skills/compatibility-testing/scripts/validate.sh +605 -0
  298. package/v3/assets/skills/compliance-testing/SKILL.md +7 -0
  299. package/v3/assets/skills/compliance-testing/evals/compliance-testing.yaml +1107 -0
  300. package/v3/assets/skills/compliance-testing/schemas/output.json +845 -0
  301. package/v3/assets/skills/compliance-testing/scripts/validate.sh +888 -0
  302. package/v3/assets/skills/consultancy-practices/SKILL.md +4 -0
  303. package/v3/assets/skills/consultancy-practices/schemas/output.json +282 -0
  304. package/v3/assets/skills/context-driven-testing/SKILL.md +3 -0
  305. package/v3/assets/skills/contract-testing/SKILL.md +5 -0
  306. package/v3/assets/skills/contract-testing/evals/contract-testing.yaml +748 -0
  307. package/v3/assets/skills/contract-testing/schemas/output.json +638 -0
  308. package/v3/assets/skills/contract-testing/scripts/validate.sh +1033 -0
  309. package/v3/assets/skills/database-testing/SKILL.md +5 -0
  310. package/v3/assets/skills/database-testing/evals/database-testing.yaml +968 -0
  311. package/v3/assets/skills/database-testing/schemas/output.json +1446 -0
  312. package/v3/assets/skills/database-testing/scripts/validate.sh +1099 -0
  313. package/v3/assets/skills/exploratory-testing-advanced/SKILL.md +3 -0
  314. package/v3/assets/skills/holistic-testing-pact/SKILL.md +3 -0
  315. package/v3/assets/skills/localization-testing/SKILL.md +6 -0
  316. package/v3/assets/skills/localization-testing/evals/localization-testing.yaml +544 -0
  317. package/v3/assets/skills/localization-testing/schemas/output.json +325 -0
  318. package/v3/assets/skills/localization-testing/scripts/validate.sh +131 -0
  319. package/v3/assets/skills/mobile-testing/SKILL.md +6 -0
  320. package/v3/assets/skills/mobile-testing/evals/mobile-testing.yaml +537 -0
  321. package/v3/assets/skills/mobile-testing/schemas/output.json +318 -0
  322. package/v3/assets/skills/mobile-testing/scripts/validate.sh +127 -0
  323. package/v3/assets/skills/mutation-testing/SKILL.md +8 -1
  324. package/v3/assets/skills/mutation-testing/evals/mutation-testing.yaml +652 -0
  325. package/v3/assets/skills/mutation-testing/schemas/output.json +707 -0
  326. package/v3/assets/skills/mutation-testing/scripts/validate.sh +992 -0
  327. package/v3/assets/skills/mutation-testing/test-data/sample-output.json +295 -0
  328. package/v3/assets/skills/n8n-expression-testing/scripts/validate.sh +162 -0
  329. package/v3/assets/skills/n8n-integration-testing-patterns/scripts/validate.sh +104 -0
  330. package/v3/assets/skills/n8n-security-testing/scripts/validate.sh +120 -0
  331. package/v3/assets/skills/n8n-trigger-testing-strategies/scripts/validate.sh +121 -0
  332. package/v3/assets/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +126 -0
  333. package/v3/assets/skills/performance-testing/SKILL.md +5 -0
  334. package/v3/assets/skills/performance-testing/evals/performance-testing.yaml +772 -0
  335. package/v3/assets/skills/performance-testing/schemas/output.json +1184 -0
  336. package/v3/assets/skills/performance-testing/scripts/validate.sh +1090 -0
  337. package/v3/assets/skills/qe-chaos-resilience/SKILL.md +6 -0
  338. package/v3/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -0
  339. package/v3/assets/skills/qe-chaos-resilience/schemas/output.json +314 -0
  340. package/v3/assets/skills/qe-chaos-resilience/scripts/validate.sh +401 -0
  341. package/v3/assets/skills/qe-code-intelligence/SKILL.md +6 -0
  342. package/v3/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -0
  343. package/v3/assets/skills/qe-code-intelligence/schemas/output.json +315 -0
  344. package/v3/assets/skills/qe-code-intelligence/scripts/validate.sh +408 -0
  345. package/v3/assets/skills/qe-contract-testing/SKILL.md +6 -0
  346. package/v3/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -0
  347. package/v3/assets/skills/qe-contract-testing/schemas/output.json +295 -0
  348. package/v3/assets/skills/qe-contract-testing/scripts/validate.sh +421 -0
  349. package/v3/assets/skills/qe-coverage-analysis/SKILL.md +6 -0
  350. package/v3/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
  351. package/v3/assets/skills/qe-coverage-analysis/schemas/output.json +286 -0
  352. package/v3/assets/skills/qe-coverage-analysis/scripts/validate.sh +453 -0
  353. package/v3/assets/skills/qe-defect-intelligence/SKILL.md +6 -0
  354. package/v3/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -0
  355. package/v3/assets/skills/qe-defect-intelligence/schemas/output.json +283 -0
  356. package/v3/assets/skills/qe-defect-intelligence/scripts/validate.sh +466 -0
  357. package/v3/assets/skills/qe-iterative-loop/SKILL.md +445 -443
  358. package/v3/assets/skills/qe-iterative-loop/schemas/output.json +264 -0
  359. package/v3/assets/skills/qe-iterative-loop/scripts/validate.sh +474 -0
  360. package/v3/assets/skills/qe-learning-optimization/SKILL.md +6 -0
  361. package/v3/assets/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -0
  362. package/v3/assets/skills/qe-learning-optimization/schemas/output.json +288 -0
  363. package/v3/assets/skills/qe-learning-optimization/scripts/validate.sh +56 -0
  364. package/v3/assets/skills/qe-quality-assessment/SKILL.md +6 -0
  365. package/v3/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -0
  366. package/v3/assets/skills/qe-quality-assessment/schemas/output.json +550 -0
  367. package/v3/assets/skills/qe-quality-assessment/scripts/validate.sh +352 -0
  368. package/v3/assets/skills/qe-requirements-validation/SKILL.md +6 -0
  369. package/v3/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
  370. package/v3/assets/skills/qe-requirements-validation/schemas/output.json +587 -0
  371. package/v3/assets/skills/qe-requirements-validation/scripts/validate.sh +275 -0
  372. package/v3/assets/skills/qe-security-compliance/SKILL.md +6 -0
  373. package/v3/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -0
  374. package/v3/assets/skills/qe-security-compliance/schemas/output.json +498 -0
  375. package/v3/assets/skills/qe-security-compliance/scripts/validate.sh +305 -0
  376. package/v3/assets/skills/qe-test-execution/SKILL.md +6 -0
  377. package/v3/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -0
  378. package/v3/assets/skills/qe-test-execution/schemas/output.json +529 -0
  379. package/v3/assets/skills/qe-test-execution/scripts/validate.sh +323 -0
  380. package/v3/assets/skills/qe-test-generation/SKILL.md +6 -0
  381. package/v3/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -0
  382. package/v3/assets/skills/qe-test-generation/schemas/output.json +439 -0
  383. package/v3/assets/skills/qe-test-generation/scripts/validate.sh +56 -0
  384. package/v3/assets/skills/qe-visual-accessibility/SKILL.md +6 -0
  385. package/v3/assets/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -0
  386. package/v3/assets/skills/qe-visual-accessibility/schemas/output.json +491 -0
  387. package/v3/assets/skills/qe-visual-accessibility/scripts/validate.sh +56 -0
  388. package/v3/assets/skills/quality-metrics/SKILL.md +6 -0
  389. package/v3/assets/skills/quality-metrics/evals/quality-metrics.yaml +494 -0
  390. package/v3/assets/skills/quality-metrics/schemas/output.json +403 -0
  391. package/v3/assets/skills/quality-metrics/scripts/validate.sh +434 -0
  392. package/v3/assets/skills/refactoring-patterns/SKILL.md +5 -0
  393. package/v3/assets/skills/refactoring-patterns/schemas/output.json +475 -0
  394. package/v3/assets/skills/refactoring-patterns/scripts/validate.sh +241 -0
  395. package/v3/assets/skills/regression-testing/SKILL.md +6 -0
  396. package/v3/assets/skills/regression-testing/evals/regression-testing.yaml +504 -0
  397. package/v3/assets/skills/regression-testing/schemas/output.json +311 -0
  398. package/v3/assets/skills/regression-testing/scripts/validate.sh +130 -0
  399. package/v3/assets/skills/risk-based-testing/SKILL.md +6 -0
  400. package/v3/assets/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -0
  401. package/v3/assets/skills/risk-based-testing/schemas/output.json +480 -0
  402. package/v3/assets/skills/risk-based-testing/scripts/validate.sh +56 -0
  403. package/v3/assets/skills/security-testing/SKILL.md +5 -0
  404. package/v3/assets/skills/security-testing/evals/security-testing.yaml +789 -0
  405. package/v3/assets/skills/security-testing/schemas/output.json +879 -0
  406. package/v3/assets/skills/security-testing/scripts/validate.sh +967 -0
  407. package/v3/assets/skills/shift-left-testing/SKILL.md +6 -0
  408. package/v3/assets/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -0
  409. package/v3/assets/skills/shift-left-testing/schemas/output.json +459 -0
  410. package/v3/assets/skills/shift-left-testing/scripts/validate.sh +56 -0
  411. package/v3/assets/skills/shift-right-testing/SKILL.md +6 -0
  412. package/v3/assets/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -0
  413. package/v3/assets/skills/shift-right-testing/schemas/output.json +418 -0
  414. package/v3/assets/skills/shift-right-testing/scripts/validate.sh +56 -0
  415. package/v3/assets/skills/six-thinking-hats/SKILL.md +3 -0
  416. package/v3/assets/skills/tdd-london-chicago/SKILL.md +5 -0
  417. package/v3/assets/skills/tdd-london-chicago/schemas/output.json +444 -0
  418. package/v3/assets/skills/tdd-london-chicago/scripts/validate.sh +214 -0
  419. package/v3/assets/skills/technical-writing/SKILL.md +4 -0
  420. package/v3/assets/skills/technical-writing/schemas/output.json +268 -0
  421. package/v3/assets/skills/test-automation-strategy/SKILL.md +6 -0
  422. package/v3/assets/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -0
  423. package/v3/assets/skills/test-automation-strategy/schemas/output.json +444 -0
  424. package/v3/assets/skills/test-automation-strategy/scripts/validate.sh +195 -0
  425. package/v3/assets/skills/test-data-management/SKILL.md +6 -0
  426. package/v3/assets/skills/test-data-management/evals/test-data-management.yaml +504 -0
  427. package/v3/assets/skills/test-data-management/schemas/output.json +284 -0
  428. package/v3/assets/skills/test-data-management/scripts/validate.sh +137 -0
  429. package/v3/assets/skills/test-design-techniques/SKILL.md +6 -0
  430. package/v3/assets/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -0
  431. package/v3/assets/skills/test-design-techniques/schemas/output.json +295 -0
  432. package/v3/assets/skills/test-design-techniques/scripts/validate.sh +91 -0
  433. package/v3/assets/skills/test-environment-management/SKILL.md +4 -0
  434. package/v3/assets/skills/test-environment-management/schemas/output.json +310 -0
  435. package/v3/assets/skills/test-reporting-analytics/SKILL.md +6 -0
  436. package/v3/assets/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -0
  437. package/v3/assets/skills/test-reporting-analytics/schemas/output.json +329 -0
  438. package/v3/assets/skills/test-reporting-analytics/scripts/validate.sh +77 -0
  439. package/v3/assets/skills/verification-quality/SKILL.md +6 -0
  440. package/v3/assets/skills/verification-quality/evals/verification-quality.yaml +150 -0
  441. package/v3/assets/skills/verification-quality/schemas/output.json +432 -0
  442. package/v3/assets/skills/verification-quality/scripts/validate.sh +77 -0
  443. package/v3/assets/skills/visual-testing-advanced/SKILL.md +6 -0
  444. package/v3/assets/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -0
  445. package/v3/assets/skills/visual-testing-advanced/schemas/output.json +294 -0
  446. package/v3/assets/skills/visual-testing-advanced/scripts/validate.sh +77 -0
  447. package/v3/assets/skills/xp-practices/SKILL.md +3 -0
  448. package/v3/assets/templates/validation-report.md.hbs +139 -0
  449. package/v3/assets/templates/validation-summary.json +56 -0
  450. package/v3/dist/cli/bundle.js +11853 -5316
  451. package/v3/dist/cli/commands/eval.d.ts +18 -0
  452. package/v3/dist/cli/commands/eval.d.ts.map +1 -0
  453. package/v3/dist/cli/commands/eval.js +505 -0
  454. package/v3/dist/cli/commands/eval.js.map +1 -0
  455. package/v3/dist/cli/commands/validate-swarm.d.ts +16 -0
  456. package/v3/dist/cli/commands/validate-swarm.d.ts.map +1 -0
  457. package/v3/dist/cli/commands/validate-swarm.js +251 -0
  458. package/v3/dist/cli/commands/validate-swarm.js.map +1 -0
  459. package/v3/dist/cli/commands/validate.d.ts +14 -0
  460. package/v3/dist/cli/commands/validate.d.ts.map +1 -0
  461. package/v3/dist/cli/commands/validate.js +408 -0
  462. package/v3/dist/cli/commands/validate.js.map +1 -0
  463. package/v3/dist/cli/index.js +6 -0
  464. package/v3/dist/cli/index.js.map +1 -1
  465. package/v3/dist/index.d.ts +2 -0
  466. package/v3/dist/index.d.ts.map +1 -1
  467. package/v3/dist/index.js +10 -0
  468. package/v3/dist/index.js.map +1 -1
  469. package/v3/dist/init/skills-installer.d.ts +6 -0
  470. package/v3/dist/init/skills-installer.d.ts.map +1 -1
  471. package/v3/dist/init/skills-installer.js +48 -0
  472. package/v3/dist/init/skills-installer.js.map +1 -1
  473. package/v3/dist/learning/index.d.ts +2 -0
  474. package/v3/dist/learning/index.d.ts.map +1 -1
  475. package/v3/dist/learning/index.js +4 -0
  476. package/v3/dist/learning/index.js.map +1 -1
  477. package/v3/dist/learning/skill-validation-learner.d.ts +264 -0
  478. package/v3/dist/learning/skill-validation-learner.d.ts.map +1 -0
  479. package/v3/dist/learning/skill-validation-learner.js +515 -0
  480. package/v3/dist/learning/skill-validation-learner.js.map +1 -0
  481. package/v3/dist/mcp/bundle.js +10043 -3630
  482. package/v3/dist/validation/index.d.ts +19 -0
  483. package/v3/dist/validation/index.d.ts.map +1 -0
  484. package/v3/dist/validation/index.js +31 -0
  485. package/v3/dist/validation/index.js.map +1 -0
  486. package/v3/dist/validation/parallel-eval-runner.d.ts +307 -0
  487. package/v3/dist/validation/parallel-eval-runner.d.ts.map +1 -0
  488. package/v3/dist/validation/parallel-eval-runner.js +566 -0
  489. package/v3/dist/validation/parallel-eval-runner.js.map +1 -0
  490. package/v3/dist/validation/swarm-skill-validator.d.ts +282 -0
  491. package/v3/dist/validation/swarm-skill-validator.d.ts.map +1 -0
  492. package/v3/dist/validation/swarm-skill-validator.js +460 -0
  493. package/v3/dist/validation/swarm-skill-validator.js.map +1 -0
  494. package/v3/dist/validation/validation-result-aggregator.d.ts +232 -0
  495. package/v3/dist/validation/validation-result-aggregator.d.ts.map +1 -0
  496. package/v3/dist/validation/validation-result-aggregator.js +630 -0
  497. package/v3/dist/validation/validation-result-aggregator.js.map +1 -0
  498. package/v3/package.json +1 -1
@@ -0,0 +1,891 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # Testability Scoring Skill Validator v2.2.0
4
+ # Validates testability assessment output against schema and content rules
5
+ # =============================================================================
6
+ #
7
+ # Usage: ./validate.sh <output-file> [options]
8
+ #
9
+ # Options:
10
+ # --self-test Run validator self-test mode
11
+ # --verbose Enable verbose output
12
+ # --json Output results as JSON only
13
+ # --list-tools Show available validation tools
14
+ # --help Show this help message
15
+ #
16
+ # Exit Codes:
17
+ # 0 - Validation passed
18
+ # 1 - Validation failed
19
+ # 2 - Validation skipped (missing required tools)
20
+ #
21
+ # =============================================================================
22
+
23
+ set -euo pipefail
24
+
25
+ # Get script directory
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
28
+ # SKILL_DIR is .claude/skills/testability-scoring, so go up 3 levels for project root
29
+ PROJECT_ROOT="$(cd "$SKILL_DIR/../../.." && pwd)"
30
+
31
+ # Source shared library - try multiple locations
32
+ VALIDATOR_LIB=""
33
+ for lib_path in \
34
+ "$PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh" \
35
+ "$SKILL_DIR/scripts/validator-lib.sh" \
36
+ "$PROJECT_ROOT/docs/templates/validator-lib.sh"; do
37
+ if [[ -f "$lib_path" ]]; then
38
+ VALIDATOR_LIB="$lib_path"
39
+ break
40
+ fi
41
+ done
42
+
43
+ if [[ -n "$VALIDATOR_LIB" ]]; then
44
+ # shellcheck source=/dev/null
45
+ source "$VALIDATOR_LIB"
46
+ else
47
+ echo "ERROR: Validator library not found"
48
+ echo "Searched:"
49
+ echo " - $PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh"
50
+ echo " - $SKILL_DIR/scripts/validator-lib.sh"
51
+ echo " - $PROJECT_ROOT/docs/templates/validator-lib.sh"
52
+ exit 1
53
+ fi
54
+
55
+ # =============================================================================
56
+ # SKILL-SPECIFIC CONFIGURATION
57
+ # =============================================================================
58
+
59
+ SKILL_NAME="testability-scoring"
60
+ SKILL_VERSION="2.2.0"
61
+
62
+ # Required tools - jq is essential for JSON parsing
63
+ REQUIRED_TOOLS=("jq")
64
+
65
+ # Optional tools for enhanced validation
66
+ OPTIONAL_TOOLS=("node" "ajv" "jsonschema" "python3")
67
+
68
+ # Schema path
69
+ SCHEMA_PATH="$SKILL_DIR/schemas/output.json"
70
+
71
+ # Sample output for self-test
72
+ SAMPLE_OUTPUT_PATH="$PROJECT_ROOT/.claude/skills/.validation/examples/testability-scoring-output.example.json"
73
+
74
+ # =============================================================================
75
+ # CONTENT VALIDATION CONFIGURATION
76
+ # =============================================================================
77
+
78
+ # Required fields
79
+ REQUIRED_FIELDS=("skillName" "status" "output" "output.score" "output.categories")
80
+
81
+ # Fields that must have values
82
+ REQUIRED_NON_EMPTY_FIELDS=("output.summary" "output.score.value")
83
+
84
+ # Domain-specific terms that should appear
85
+ MUST_CONTAIN_TERMS=("testability" "score")
86
+
87
+ # Terms that indicate errors/hallucinations
88
+ MUST_NOT_CONTAIN_TERMS=("TODO" "placeholder" "REPLACE_WITH")
89
+
90
+ # Enum validations
91
+ ENUM_VALIDATIONS=(
92
+ ".status:success,partial,failed,skipped"
93
+ )
94
+
95
+ # Array minimum lengths
96
+ MIN_ARRAY_LENGTHS=()
97
+
98
+ # =============================================================================
99
+ # TESTABILITY-SPECIFIC VALIDATION FUNCTIONS
100
+ # =============================================================================
101
+
102
+ # Validate testability dimension scores are within range
103
+ validate_dimension_scores() {
104
+ local output_file="$1"
105
+ local has_errors=false
106
+
107
+ local dimensions=(
108
+ "observability"
109
+ "controllability"
110
+ "algorithmicSimplicity"
111
+ "algorithmicTransparency"
112
+ "algorithmicStability"
113
+ "explainability"
114
+ "unbugginess"
115
+ "smallness"
116
+ "decomposability"
117
+ "similarity"
118
+ )
119
+
120
+ for dim in "${dimensions[@]}"; do
121
+ local score
122
+ score=$(json_get "$output_file" ".output.categories.$dim.score" 2>/dev/null)
123
+
124
+ if [[ -z "$score" ]] || [[ "$score" == "null" ]]; then
125
+ error "Missing score for dimension: $dim"
126
+ has_errors=true
127
+ continue
128
+ fi
129
+
130
+ # Check score is within valid range (0-100)
131
+ if ! [[ "$score" =~ ^[0-9]+\.?[0-9]*$ ]]; then
132
+ error "Invalid score format for $dim: $score"
133
+ has_errors=true
134
+ elif (( $(echo "$score < 0" | bc -l 2>/dev/null || echo "0") )) || (( $(echo "$score > 100" | bc -l 2>/dev/null || echo "0") )); then
135
+ error "Score out of range for $dim: $score (must be 0-100)"
136
+ has_errors=true
137
+ else
138
+ debug "Dimension $dim score valid: $score"
139
+ fi
140
+ done
141
+
142
+ if [[ "$has_errors" == "true" ]]; then
143
+ return 1
144
+ fi
145
+
146
+ success "All testability dimension scores valid (0-100)"
147
+ return 0
148
+ }
149
+
150
+ # Validate dimension weights sum to 1.0
151
+ validate_dimension_weights() {
152
+ local output_file="$1"
153
+
154
+ local dimensions=(
155
+ "observability"
156
+ "controllability"
157
+ "algorithmicSimplicity"
158
+ "algorithmicTransparency"
159
+ "algorithmicStability"
160
+ "explainability"
161
+ "unbugginess"
162
+ "smallness"
163
+ "decomposability"
164
+ "similarity"
165
+ )
166
+
167
+ local total_weight=0
168
+ for dim in "${dimensions[@]}"; do
169
+ local weight
170
+ weight=$(json_get "$output_file" ".output.categories.$dim.weight" 2>/dev/null)
171
+
172
+ if [[ -n "$weight" ]] && [[ "$weight" != "null" ]]; then
173
+ total_weight=$(echo "$total_weight + $weight" | bc -l 2>/dev/null || echo "$total_weight")
174
+ fi
175
+ done
176
+
177
+ # Check if weights sum to approximately 1.0 (allow small floating point error)
178
+ local weight_diff
179
+ weight_diff=$(echo "scale=4; ($total_weight - 1.0)" | bc -l 2>/dev/null || echo "0")
180
+ weight_diff=${weight_diff#-} # Absolute value
181
+
182
+ if (( $(echo "$weight_diff > 0.01" | bc -l 2>/dev/null || echo "0") )); then
183
+ warn "Dimension weights sum to $total_weight (should be 1.0)"
184
+ return 0 # Warning only, not failure
185
+ fi
186
+
187
+ debug "Dimension weights sum correctly: $total_weight"
188
+ return 0
189
+ }
190
+
191
+ # Validate overall score matches weighted average of dimensions
192
+ validate_overall_score() {
193
+ local output_file="$1"
194
+
195
+ local overall_score
196
+ overall_score=$(json_get "$output_file" ".output.score.value" 2>/dev/null)
197
+
198
+ if [[ -z "$overall_score" ]] || [[ "$overall_score" == "null" ]]; then
199
+ error "Missing overall score"
200
+ return 1
201
+ fi
202
+
203
+ # Check overall score is within valid range (0-100)
204
+ if ! [[ "$overall_score" =~ ^[0-9]+\.?[0-9]*$ ]]; then
205
+ error "Invalid overall score format: $overall_score"
206
+ return 1
207
+ elif (( $(echo "$overall_score < 0" | bc -l 2>/dev/null || echo "0") )) || (( $(echo "$overall_score > 100" | bc -l 2>/dev/null || echo "0") )); then
208
+ error "Overall score out of range: $overall_score (must be 0-100)"
209
+ return 1
210
+ fi
211
+
212
+ success "Overall testability score valid: $overall_score"
213
+ return 0
214
+ }
215
+
216
+ # Validate grade matches score
217
+ validate_grade() {
218
+ local output_file="$1"
219
+
220
+ local score grade
221
+ score=$(json_get "$output_file" ".output.score.value" 2>/dev/null)
222
+ grade=$(json_get "$output_file" ".output.score.grade" 2>/dev/null)
223
+
224
+ if [[ -z "$grade" ]] || [[ "$grade" == "null" ]]; then
225
+ debug "No grade provided (optional)"
226
+ return 0
227
+ fi
228
+
229
+ # Validate grade format
230
+ if ! [[ "$grade" =~ ^[A-F][+-]?$ ]]; then
231
+ error "Invalid grade format: $grade (expected A-F with optional +/-)"
232
+ return 1
233
+ fi
234
+
235
+ # Check grade matches score - convert to integer for comparison
236
+ local score_int
237
+ score_int=$(printf "%.0f" "$score" 2>/dev/null || echo "0")
238
+
239
+ local expected_grade
240
+ if [[ "$score_int" -ge 90 ]]; then
241
+ expected_grade="A"
242
+ elif [[ "$score_int" -ge 80 ]]; then
243
+ expected_grade="B"
244
+ elif [[ "$score_int" -ge 70 ]]; then
245
+ expected_grade="C"
246
+ elif [[ "$score_int" -ge 60 ]]; then
247
+ expected_grade="D"
248
+ else
249
+ expected_grade="F"
250
+ fi
251
+
252
+ # Extract base grade (without +/-)
253
+ local base_grade="${grade:0:1}"
254
+
255
+ if [[ "$base_grade" != "$expected_grade" ]]; then
256
+ warn "Grade $grade may not match score $score (expected $expected_grade range)"
257
+ else
258
+ debug "Grade $grade matches score $score"
259
+ fi
260
+
261
+ return 0
262
+ }
263
+
264
+ # Validate findings have proper testability categories
265
+ validate_findings_categories() {
266
+ local output_file="$1"
267
+
268
+ local finding_count
269
+ finding_count=$(json_count "$output_file" ".output.findings" 2>/dev/null)
270
+
271
+ if [[ -z "$finding_count" ]] || [[ "$finding_count" == "0" ]] || [[ "$finding_count" == "null" ]]; then
272
+ debug "No findings to validate"
273
+ return 0
274
+ fi
275
+
276
+ local valid_categories=(
277
+ "observability"
278
+ "controllability"
279
+ "algorithmicSimplicity"
280
+ "algorithmicTransparency"
281
+ "algorithmicStability"
282
+ "explainability"
283
+ "unbugginess"
284
+ "smallness"
285
+ "decomposability"
286
+ "similarity"
287
+ )
288
+
289
+ local has_errors=false
290
+
291
+ # Check each finding has a valid category
292
+ for ((i=0; i<finding_count; i++)); do
293
+ local category
294
+ category=$(json_get "$output_file" ".output.findings[$i].category" 2>/dev/null)
295
+
296
+ if [[ -z "$category" ]] || [[ "$category" == "null" ]]; then
297
+ error "Finding $i missing category"
298
+ has_errors=true
299
+ continue
300
+ fi
301
+
302
+ local found=false
303
+ for valid in "${valid_categories[@]}"; do
304
+ if [[ "$category" == "$valid" ]]; then
305
+ found=true
306
+ break
307
+ fi
308
+ done
309
+
310
+ if [[ "$found" == "false" ]]; then
311
+ error "Finding $i has invalid category: $category"
312
+ has_errors=true
313
+ fi
314
+ done
315
+
316
+ if [[ "$has_errors" == "true" ]]; then
317
+ return 1
318
+ fi
319
+
320
+ success "All findings have valid testability categories"
321
+ return 0
322
+ }
323
+
324
+ # Validate recommendations have proper structure
325
+ validate_recommendations() {
326
+ local output_file="$1"
327
+
328
+ local rec_count
329
+ rec_count=$(json_count "$output_file" ".output.recommendations" 2>/dev/null)
330
+
331
+ if [[ -z "$rec_count" ]] || [[ "$rec_count" == "0" ]] || [[ "$rec_count" == "null" ]]; then
332
+ debug "No recommendations to validate"
333
+ return 0
334
+ fi
335
+
336
+ local has_errors=false
337
+
338
+ for ((i=0; i<rec_count; i++)); do
339
+ local impact
340
+ impact=$(json_get "$output_file" ".output.recommendations[$i].impact" 2>/dev/null)
341
+
342
+ if [[ -n "$impact" ]] && [[ "$impact" != "null" ]]; then
343
+ # Check impact is within valid range (1-10)
344
+ if ! [[ "$impact" =~ ^[0-9]+$ ]] || (( impact < 1 )) || (( impact > 10 )); then
345
+ error "Recommendation $i has invalid impact: $impact (must be 1-10)"
346
+ has_errors=true
347
+ fi
348
+ fi
349
+ done
350
+
351
+ if [[ "$has_errors" == "true" ]]; then
352
+ return 1
353
+ fi
354
+
355
+ success "All recommendations have valid structure"
356
+ return 0
357
+ }
358
+
359
+ # =============================================================================
360
+ # SKILL-SPECIFIC VALIDATION - Main entry point
361
+ # =============================================================================
362
+
363
+ validate_skill_specific() {
364
+ local output_file="$1"
365
+ local has_errors=false
366
+
367
+ debug "Running testability-specific validations..."
368
+
369
+ # Validate dimension scores (0-100)
370
+ if ! validate_dimension_scores "$output_file"; then
371
+ has_errors=true
372
+ fi
373
+
374
+ # Validate dimension weights sum to 1.0
375
+ if ! validate_dimension_weights "$output_file"; then
376
+ has_errors=true
377
+ fi
378
+
379
+ # Validate overall score
380
+ if ! validate_overall_score "$output_file"; then
381
+ has_errors=true
382
+ fi
383
+
384
+ # Validate grade matches score
385
+ if ! validate_grade "$output_file"; then
386
+ has_errors=true
387
+ fi
388
+
389
+ # Validate findings have valid categories
390
+ if ! validate_findings_categories "$output_file"; then
391
+ has_errors=true
392
+ fi
393
+
394
+ # Validate recommendations
395
+ if ! validate_recommendations "$output_file"; then
396
+ has_errors=true
397
+ fi
398
+
399
+ if [[ "$has_errors" == "true" ]]; then
400
+ return 1
401
+ fi
402
+
403
+ return 0
404
+ }
405
+
406
+ # =============================================================================
407
+ # Argument Parsing
408
+ # =============================================================================
409
+
410
+ OUTPUT_FILE=""
411
+ SELF_TEST=false
412
+ VERBOSE=false
413
+ JSON_ONLY=false
414
+ LIST_TOOLS=false
415
+
416
+ while [[ $# -gt 0 ]]; do
417
+ case "$1" in
418
+ --self-test)
419
+ SELF_TEST=true
420
+ shift
421
+ ;;
422
+ --verbose|-v)
423
+ VERBOSE=true
424
+ export AQE_DEBUG=1
425
+ shift
426
+ ;;
427
+ --json)
428
+ JSON_ONLY=true
429
+ shift
430
+ ;;
431
+ --list-tools)
432
+ LIST_TOOLS=true
433
+ shift
434
+ ;;
435
+ -h|--help)
436
+ cat << 'HELP_EOF'
437
+ Testability Scoring Skill Validator
438
+
439
+ Usage: ./validate.sh <output-file> [options]
440
+ ./validate.sh --self-test [--verbose]
441
+ ./validate.sh --list-tools
442
+
443
+ Arguments:
444
+ <output-file> Path to testability assessment JSON output to validate
445
+
446
+ Options:
447
+ --self-test Run validator self-test mode
448
+ --verbose, -v Enable verbose/debug output
449
+ --json Output results as JSON only (for CI integration)
450
+ --list-tools Show available validation tools
451
+ --help, -h Show this help message
452
+
453
+ Exit Codes:
454
+ 0 - Validation passed
455
+ 1 - Validation failed
456
+ 2 - Validation skipped (missing required tools)
457
+
458
+ Testability-Specific Validations:
459
+ - All 10 dimension scores must be 0-100
460
+ - Dimension weights must sum to 1.0
461
+ - Overall score must be 0-100
462
+ - Grade must match score (A=90+, B=80+, C=70+, D=60+, F=<60)
463
+ - Findings must have valid testability categories
464
+ - Recommendations impact must be 1-10
465
+
466
+ Examples:
467
+ ./validate.sh testability-output.json # Validate output file
468
+ ./validate.sh testability-output.json --json # JSON output for CI
469
+ ./validate.sh --self-test --verbose # Self-test with debug
470
+
471
+ HELP_EOF
472
+ exit 0
473
+ ;;
474
+ -*)
475
+ error "Unknown option: $1"
476
+ echo "Use --help for usage information"
477
+ exit 1
478
+ ;;
479
+ *)
480
+ OUTPUT_FILE="$1"
481
+ shift
482
+ ;;
483
+ esac
484
+ done
485
+
486
+ # Handle --list-tools mode
487
+ if [[ "$LIST_TOOLS" == "true" ]]; then
488
+ echo "=============================================="
489
+ echo "Available Validation Tools for $SKILL_NAME"
490
+ echo "=============================================="
491
+ echo ""
492
+ echo "Required tools:"
493
+ for tool in "${REQUIRED_TOOLS[@]}"; do
494
+ if command_exists "$tool"; then
495
+ echo " [OK] $tool"
496
+ else
497
+ echo " [MISSING] $tool"
498
+ fi
499
+ done
500
+ echo ""
501
+ echo "Optional tools:"
502
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
503
+ if command_exists "$tool"; then
504
+ echo " [OK] $tool"
505
+ else
506
+ echo " [MISSING] $tool"
507
+ fi
508
+ done
509
+ echo ""
510
+ echo "Schema validation support:"
511
+ if command_exists "ajv"; then
512
+ echo " [OK] ajv (preferred)"
513
+ elif command_exists "jsonschema"; then
514
+ echo " [OK] jsonschema CLI"
515
+ elif command_exists "python3" && python3 -c "import jsonschema" 2>/dev/null; then
516
+ echo " [OK] python3 + jsonschema module"
517
+ else
518
+ echo " [MISSING] No schema validator available"
519
+ fi
520
+ exit 0
521
+ fi
522
+
523
+ # =============================================================================
524
+ # Self-Test Mode
525
+ # =============================================================================
526
+
527
+ if [[ "$SELF_TEST" == "true" ]]; then
528
+ echo "=============================================="
529
+ info "Running $SKILL_NAME Validator Self-Test"
530
+ echo "=============================================="
531
+ echo ""
532
+ echo "Validator version: $SKILL_VERSION"
533
+ echo ""
534
+
535
+ self_test_passed=true
536
+ self_test_warnings=0
537
+
538
+ # Step 1: Check Required Tools
539
+ echo "--- Step 1: Required Tools ---"
540
+ for tool in "${REQUIRED_TOOLS[@]}"; do
541
+ if command_exists "$tool"; then
542
+ success "Required tool available: $tool"
543
+ else
544
+ error "Required tool MISSING: $tool"
545
+ self_test_passed=false
546
+ fi
547
+ done
548
+ echo ""
549
+
550
+ # Step 2: Check Optional Tools
551
+ echo "--- Step 2: Optional Tools ---"
552
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
553
+ if command_exists "$tool"; then
554
+ success "Optional tool available: $tool"
555
+ else
556
+ warn "Optional tool missing: $tool"
557
+ ((self_test_warnings++)) || true
558
+ fi
559
+ done
560
+ echo ""
561
+
562
+ # Step 3: Check Schema File
563
+ echo "--- Step 3: Schema File ---"
564
+ if [[ -f "$SCHEMA_PATH" ]]; then
565
+ success "Schema file exists: $SCHEMA_PATH"
566
+ if validate_json "$SCHEMA_PATH" 2>/dev/null; then
567
+ success "Schema file is valid JSON"
568
+ else
569
+ error "Schema file is NOT valid JSON"
570
+ self_test_passed=false
571
+ fi
572
+ else
573
+ error "Schema file not found: $SCHEMA_PATH"
574
+ self_test_passed=false
575
+ fi
576
+ echo ""
577
+
578
+ # Step 4: Test with Sample Data
579
+ echo "--- Step 4: Sample Data Validation ---"
580
+ if [[ -f "$SAMPLE_OUTPUT_PATH" ]]; then
581
+ success "Sample output file exists: $SAMPLE_OUTPUT_PATH"
582
+
583
+ if validate_json "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
584
+ success "Sample output is valid JSON"
585
+
586
+ # Run skill-specific validations on sample
587
+ if validate_skill_specific "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
588
+ success "Sample output passes skill-specific validation"
589
+ else
590
+ warn "Sample output has skill-specific validation issues"
591
+ ((self_test_warnings++)) || true
592
+ fi
593
+ else
594
+ error "Sample output is NOT valid JSON"
595
+ self_test_passed=false
596
+ fi
597
+ else
598
+ warn "Sample output file not found: $SAMPLE_OUTPUT_PATH"
599
+ ((self_test_warnings++)) || true
600
+ fi
601
+ echo ""
602
+
603
+ # Summary
604
+ echo "=============================================="
605
+ echo "Self-Test Summary for $SKILL_NAME"
606
+ echo "=============================================="
607
+
608
+ if [[ "$self_test_passed" == "true" ]]; then
609
+ if [[ $self_test_warnings -gt 0 ]]; then
610
+ warn "Self-test PASSED with $self_test_warnings warning(s)"
611
+ exit 0
612
+ else
613
+ success "Self-test PASSED (all checks successful)"
614
+ exit 0
615
+ fi
616
+ else
617
+ error "Self-test FAILED"
618
+ exit 1
619
+ fi
620
+ fi
621
+
622
+ # =============================================================================
623
+ # Main Validation Flow
624
+ # =============================================================================
625
+
626
+ main() {
627
+ # Validate arguments
628
+ if [[ -z "$OUTPUT_FILE" ]]; then
629
+ error "No output file specified"
630
+ echo "Usage: $0 <output-file> [options]"
631
+ echo "Use --help for more information"
632
+ exit 1
633
+ fi
634
+
635
+ if [[ ! -f "$OUTPUT_FILE" ]]; then
636
+ error "Output file not found: $OUTPUT_FILE"
637
+ exit 1
638
+ fi
639
+
640
+ # Print header
641
+ if [[ "$JSON_ONLY" != "true" ]]; then
642
+ echo "=============================================="
643
+ info "Validating $SKILL_NAME Output"
644
+ echo "=============================================="
645
+ echo ""
646
+ echo " Skill: $SKILL_NAME v$SKILL_VERSION"
647
+ echo " File: $OUTPUT_FILE"
648
+ echo " Schema: ${SCHEMA_PATH:-none}"
649
+ echo ""
650
+ fi
651
+
652
+ # Track validation status
653
+ local tool_status="passed"
654
+ local json_status="passed"
655
+ local schema_status="passed"
656
+ local fields_status="passed"
657
+ local enums_status="passed"
658
+ local content_status="passed"
659
+ local specific_status="passed"
660
+
661
+ local error_count=0
662
+ local warning_count=0
663
+
664
+ # Step 1: Check Required Tools
665
+ if [[ "$JSON_ONLY" != "true" ]]; then
666
+ echo "--- Step 1: Tool Availability ---"
667
+ fi
668
+
669
+ for tool in "${REQUIRED_TOOLS[@]}"; do
670
+ if ! command_exists "$tool"; then
671
+ tool_status="failed"
672
+ ((error_count++)) || true
673
+ if [[ "$JSON_ONLY" != "true" ]]; then
674
+ error "Required tool missing: $tool"
675
+ fi
676
+ fi
677
+ done
678
+
679
+ if [[ "$tool_status" == "failed" ]]; then
680
+ if [[ "$JSON_ONLY" == "true" ]]; then
681
+ output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
682
+ fi
683
+ exit $EXIT_SKIP
684
+ fi
685
+
686
+ [[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
687
+
688
+ # Step 2: Validate JSON Syntax
689
+ if [[ "$JSON_ONLY" != "true" ]]; then
690
+ echo "--- Step 2: JSON Syntax ---"
691
+ fi
692
+
693
+ if ! validate_json "$OUTPUT_FILE"; then
694
+ json_status="failed"
695
+ ((error_count++)) || true
696
+ if [[ "$JSON_ONLY" == "true" ]]; then
697
+ output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
698
+ fi
699
+ exit $EXIT_FAIL
700
+ fi
701
+
702
+ [[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
703
+
704
+ # Step 3: Validate Against Schema
705
+ if [[ "$JSON_ONLY" != "true" ]]; then
706
+ echo "--- Step 3: Schema Validation ---"
707
+ fi
708
+
709
+ if [[ -f "$SCHEMA_PATH" ]]; then
710
+ local schema_result
711
+ schema_result=$(validate_json_schema "$SCHEMA_PATH" "$OUTPUT_FILE" 2>&1) || true
712
+ local schema_exit=$?
713
+
714
+ case $schema_exit in
715
+ 0) [[ "$JSON_ONLY" != "true" ]] && success "Schema validation passed" ;;
716
+ 1) schema_status="failed"; ((error_count++)) || true ;;
717
+ 2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && warn "Schema validation skipped" ;;
718
+ esac
719
+ else
720
+ schema_status="skipped"
721
+ [[ "$JSON_ONLY" != "true" ]] && warn "Schema file not found, skipping"
722
+ fi
723
+
724
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
725
+
726
+ # Step 4: Validate Required Fields
727
+ if [[ "$JSON_ONLY" != "true" ]]; then
728
+ echo "--- Step 4: Required Fields ---"
729
+ fi
730
+
731
+ for field in "${REQUIRED_FIELDS[@]}"; do
732
+ local value
733
+ value=$(json_get "$OUTPUT_FILE" ".$field" 2>/dev/null)
734
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
735
+ error "Missing required field: $field"
736
+ fields_status="failed"
737
+ ((error_count++)) || true
738
+ fi
739
+ done
740
+
741
+ if [[ "$fields_status" == "passed" ]]; then
742
+ [[ "$JSON_ONLY" != "true" ]] && success "All required fields present"
743
+ fi
744
+
745
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
746
+
747
+ # Step 5: Validate Enum Values
748
+ if [[ ${#ENUM_VALIDATIONS[@]} -gt 0 ]]; then
749
+ if [[ "$JSON_ONLY" != "true" ]]; then
750
+ echo "--- Step 5: Enum Validation ---"
751
+ fi
752
+
753
+ for validation in "${ENUM_VALIDATIONS[@]}"; do
754
+ local field_path="${validation%%:*}"
755
+ local allowed_values="${validation#*:}"
756
+ local actual_value
757
+ actual_value=$(json_get "$OUTPUT_FILE" "$field_path" 2>/dev/null)
758
+
759
+ if [[ -n "$actual_value" ]] && [[ "$actual_value" != "null" ]]; then
760
+ local found=false
761
+ IFS=',' read -ra allowed_array <<< "$allowed_values"
762
+ for allowed in "${allowed_array[@]}"; do
763
+ if [[ "$actual_value" == "$allowed" ]]; then
764
+ found=true
765
+ break
766
+ fi
767
+ done
768
+
769
+ if [[ "$found" == "false" ]]; then
770
+ error "Invalid value for $field_path: '$actual_value'"
771
+ enums_status="failed"
772
+ ((error_count++)) || true
773
+ fi
774
+ fi
775
+ done
776
+
777
+ if [[ "$enums_status" == "passed" ]]; then
778
+ [[ "$JSON_ONLY" != "true" ]] && success "All enum fields valid"
779
+ fi
780
+
781
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
782
+ fi
783
+
784
+ # Step 6: Content Terms
785
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]] || [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
786
+ if [[ "$JSON_ONLY" != "true" ]]; then
787
+ echo "--- Step 6: Content Terms ---"
788
+ fi
789
+
790
+ local file_content
791
+ file_content=$(cat "$OUTPUT_FILE")
792
+
793
+ for term in "${MUST_CONTAIN_TERMS[@]}"; do
794
+ if ! grep -qi "$term" <<< "$file_content"; then
795
+ error "Missing required term: $term"
796
+ content_status="failed"
797
+ ((error_count++)) || true
798
+ fi
799
+ done
800
+
801
+ for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
802
+ if grep -qi "$term" <<< "$file_content"; then
803
+ error "Found forbidden term: $term"
804
+ content_status="failed"
805
+ ((error_count++)) || true
806
+ fi
807
+ done
808
+
809
+ if [[ "$content_status" == "passed" ]]; then
810
+ [[ "$JSON_ONLY" != "true" ]] && success "Content terms validation passed"
811
+ fi
812
+
813
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
814
+ fi
815
+
816
+ # Step 7: Skill-Specific Validation
817
+ if [[ "$JSON_ONLY" != "true" ]]; then
818
+ echo "--- Step 7: Testability-Specific Validation ---"
819
+ fi
820
+
821
+ if ! validate_skill_specific "$OUTPUT_FILE"; then
822
+ specific_status="failed"
823
+ ((error_count++)) || true
824
+ else
825
+ [[ "$JSON_ONLY" != "true" ]] && success "Testability-specific validation passed"
826
+ fi
827
+
828
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
829
+
830
+ # Determine Overall Status
831
+ local overall_status="passed"
832
+ local content_overall="passed"
833
+
834
+ if [[ "$fields_status" == "failed" ]] || \
835
+ [[ "$enums_status" == "failed" ]] || \
836
+ [[ "$content_status" == "failed" ]] || \
837
+ [[ "$specific_status" == "failed" ]]; then
838
+ content_overall="failed"
839
+ fi
840
+
841
+ if [[ "$json_status" == "failed" ]] || \
842
+ [[ "$schema_status" == "failed" ]] || \
843
+ [[ "$content_overall" == "failed" ]]; then
844
+ overall_status="failed"
845
+ elif [[ "$schema_status" == "skipped" ]]; then
846
+ overall_status="partial"
847
+ fi
848
+
849
+ # Output Results
850
+ if [[ "$JSON_ONLY" == "true" ]]; then
851
+ output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
852
+ else
853
+ echo "=============================================="
854
+ echo "Validation Summary for $SKILL_NAME"
855
+ echo "=============================================="
856
+ echo ""
857
+ echo " Tools: $tool_status"
858
+ echo " JSON Syntax: $json_status"
859
+ echo " Schema: $schema_status"
860
+ echo " Fields: $fields_status"
861
+ echo " Enums: $enums_status"
862
+ echo " Content: $content_status"
863
+ echo " Testability: $specific_status"
864
+ echo ""
865
+ echo " ------------------------------"
866
+ echo " Overall: $overall_status"
867
+ echo " Errors: $error_count"
868
+ echo " Warnings: $warning_count"
869
+ echo "=============================================="
870
+ echo ""
871
+ fi
872
+
873
+ # Exit with appropriate code
874
+ case "$overall_status" in
875
+ "passed")
876
+ [[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
877
+ exit $EXIT_PASS
878
+ ;;
879
+ "partial")
880
+ [[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
881
+ exit $EXIT_PASS
882
+ ;;
883
+ "failed")
884
+ [[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
885
+ exit $EXIT_FAIL
886
+ ;;
887
+ esac
888
+ }
889
+
890
+ # Run main function
891
+ main