agentic-qe 3.4.1 → 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 (496) 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/README.md +39 -2
  244. package/package.json +4 -1
  245. package/scripts/run-skill-eval.ts +1097 -0
  246. package/scripts/test-schema-validation.js +301 -0
  247. package/scripts/update-skill-manifest.ts +751 -0
  248. package/scripts/validate-skill-frontmatter.js +141 -0
  249. package/v3/CHANGELOG.md +21 -0
  250. package/v3/README.md +43 -3
  251. package/v3/assets/agents/v3/qe-test-idea-rewriter.md +375 -375
  252. package/v3/assets/skills/.validation/README.md +111 -0
  253. package/v3/assets/skills/.validation/examples/chaos-engineering-output.example.json +530 -0
  254. package/v3/assets/skills/.validation/examples/performance-testing-output.example.json +252 -0
  255. package/v3/assets/skills/.validation/examples/security-testing-output.example.json +413 -0
  256. package/v3/assets/skills/.validation/examples/testability-scoring-output.example.json +350 -0
  257. package/v3/assets/skills/.validation/schemas/skill-eval.schema.json +452 -0
  258. package/v3/assets/skills/.validation/schemas/skill-frontmatter.schema.json +341 -0
  259. package/v3/assets/skills/.validation/schemas/skill-output-meta.schema.json +199 -0
  260. package/v3/assets/skills/.validation/schemas/skill-output.template.json +610 -0
  261. package/v3/assets/skills/.validation/skill-validation-mcp-integration.md +250 -0
  262. package/v3/assets/skills/.validation/templates/eval.template.yaml +366 -0
  263. package/v3/assets/skills/.validation/templates/schemas/output.json +145 -0
  264. package/v3/assets/skills/.validation/templates/security-testing-eval.template.yaml +725 -0
  265. package/v3/assets/skills/.validation/templates/skill-frontmatter.example.yaml +225 -0
  266. package/v3/assets/skills/.validation/templates/validate.template.sh +1060 -0
  267. package/v3/assets/skills/.validation/templates/validator-lib.sh +1031 -0
  268. package/v3/assets/skills/.validation/test-data/invalid-output.json +5 -0
  269. package/v3/assets/skills/.validation/test-data/minimal-output.json +9 -0
  270. package/v3/assets/skills/.validation/test-data/sample-output.json +73 -0
  271. package/v3/assets/skills/accessibility-testing/SKILL.md +8 -1
  272. package/v3/assets/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -0
  273. package/v3/assets/skills/accessibility-testing/schemas/output.json +776 -0
  274. package/v3/assets/skills/accessibility-testing/scripts/validate.sh +943 -0
  275. package/v3/assets/skills/accessibility-testing/test-data/sample-output.json +191 -0
  276. package/v3/assets/skills/agentic-quality-engineering/SKILL.md +4 -0
  277. package/v3/assets/skills/agentic-quality-engineering/schemas/output.json +577 -0
  278. package/v3/assets/skills/api-testing-patterns/SKILL.md +5 -0
  279. package/v3/assets/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -0
  280. package/v3/assets/skills/api-testing-patterns/schemas/output.json +845 -0
  281. package/v3/assets/skills/api-testing-patterns/scripts/validate.sh +931 -0
  282. package/v3/assets/skills/aqe-v2-v3-migration/schemas/output.json +513 -0
  283. package/v3/assets/skills/aqe-v2-v3-migration/skill.md +20 -16
  284. package/v3/assets/skills/bug-reporting-excellence/SKILL.md +5 -0
  285. package/v3/assets/skills/bug-reporting-excellence/schemas/output.json +288 -0
  286. package/v3/assets/skills/bug-reporting-excellence/scripts/validate.sh +108 -0
  287. package/v3/assets/skills/chaos-engineering-resilience/SKILL.md +5 -0
  288. package/v3/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -0
  289. package/v3/assets/skills/chaos-engineering-resilience/schemas/output.json +1205 -0
  290. package/v3/assets/skills/chaos-engineering-resilience/scripts/validate.sh +1107 -0
  291. package/v3/assets/skills/code-review-quality/SKILL.md +5 -0
  292. package/v3/assets/skills/code-review-quality/schemas/output.json +264 -0
  293. package/v3/assets/skills/code-review-quality/scripts/validate.sh +113 -0
  294. package/v3/assets/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -0
  295. package/v3/assets/skills/compatibility-testing/schemas/output.json +551 -0
  296. package/v3/assets/skills/compatibility-testing/scripts/validate.sh +605 -0
  297. package/v3/assets/skills/compliance-testing/SKILL.md +7 -0
  298. package/v3/assets/skills/compliance-testing/evals/compliance-testing.yaml +1107 -0
  299. package/v3/assets/skills/compliance-testing/schemas/output.json +845 -0
  300. package/v3/assets/skills/compliance-testing/scripts/validate.sh +888 -0
  301. package/v3/assets/skills/consultancy-practices/SKILL.md +4 -0
  302. package/v3/assets/skills/consultancy-practices/schemas/output.json +282 -0
  303. package/v3/assets/skills/context-driven-testing/SKILL.md +3 -0
  304. package/v3/assets/skills/contract-testing/SKILL.md +5 -0
  305. package/v3/assets/skills/contract-testing/evals/contract-testing.yaml +748 -0
  306. package/v3/assets/skills/contract-testing/schemas/output.json +638 -0
  307. package/v3/assets/skills/contract-testing/scripts/validate.sh +1033 -0
  308. package/v3/assets/skills/database-testing/SKILL.md +5 -0
  309. package/v3/assets/skills/database-testing/evals/database-testing.yaml +968 -0
  310. package/v3/assets/skills/database-testing/schemas/output.json +1446 -0
  311. package/v3/assets/skills/database-testing/scripts/validate.sh +1099 -0
  312. package/v3/assets/skills/exploratory-testing-advanced/SKILL.md +3 -0
  313. package/v3/assets/skills/holistic-testing-pact/SKILL.md +3 -0
  314. package/v3/assets/skills/localization-testing/SKILL.md +6 -0
  315. package/v3/assets/skills/localization-testing/evals/localization-testing.yaml +544 -0
  316. package/v3/assets/skills/localization-testing/schemas/output.json +325 -0
  317. package/v3/assets/skills/localization-testing/scripts/validate.sh +131 -0
  318. package/v3/assets/skills/mobile-testing/SKILL.md +6 -0
  319. package/v3/assets/skills/mobile-testing/evals/mobile-testing.yaml +537 -0
  320. package/v3/assets/skills/mobile-testing/schemas/output.json +318 -0
  321. package/v3/assets/skills/mobile-testing/scripts/validate.sh +127 -0
  322. package/v3/assets/skills/mutation-testing/SKILL.md +8 -1
  323. package/v3/assets/skills/mutation-testing/evals/mutation-testing.yaml +652 -0
  324. package/v3/assets/skills/mutation-testing/schemas/output.json +707 -0
  325. package/v3/assets/skills/mutation-testing/scripts/validate.sh +992 -0
  326. package/v3/assets/skills/mutation-testing/test-data/sample-output.json +295 -0
  327. package/v3/assets/skills/n8n-expression-testing/scripts/validate.sh +162 -0
  328. package/v3/assets/skills/n8n-integration-testing-patterns/scripts/validate.sh +104 -0
  329. package/v3/assets/skills/n8n-security-testing/scripts/validate.sh +120 -0
  330. package/v3/assets/skills/n8n-trigger-testing-strategies/scripts/validate.sh +121 -0
  331. package/v3/assets/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +126 -0
  332. package/v3/assets/skills/performance-testing/SKILL.md +5 -0
  333. package/v3/assets/skills/performance-testing/evals/performance-testing.yaml +772 -0
  334. package/v3/assets/skills/performance-testing/schemas/output.json +1184 -0
  335. package/v3/assets/skills/performance-testing/scripts/validate.sh +1090 -0
  336. package/v3/assets/skills/qe-chaos-resilience/SKILL.md +6 -0
  337. package/v3/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -0
  338. package/v3/assets/skills/qe-chaos-resilience/schemas/output.json +314 -0
  339. package/v3/assets/skills/qe-chaos-resilience/scripts/validate.sh +401 -0
  340. package/v3/assets/skills/qe-code-intelligence/SKILL.md +6 -0
  341. package/v3/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -0
  342. package/v3/assets/skills/qe-code-intelligence/schemas/output.json +315 -0
  343. package/v3/assets/skills/qe-code-intelligence/scripts/validate.sh +408 -0
  344. package/v3/assets/skills/qe-contract-testing/SKILL.md +6 -0
  345. package/v3/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -0
  346. package/v3/assets/skills/qe-contract-testing/schemas/output.json +295 -0
  347. package/v3/assets/skills/qe-contract-testing/scripts/validate.sh +421 -0
  348. package/v3/assets/skills/qe-coverage-analysis/SKILL.md +6 -0
  349. package/v3/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
  350. package/v3/assets/skills/qe-coverage-analysis/schemas/output.json +286 -0
  351. package/v3/assets/skills/qe-coverage-analysis/scripts/validate.sh +453 -0
  352. package/v3/assets/skills/qe-defect-intelligence/SKILL.md +6 -0
  353. package/v3/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -0
  354. package/v3/assets/skills/qe-defect-intelligence/schemas/output.json +283 -0
  355. package/v3/assets/skills/qe-defect-intelligence/scripts/validate.sh +466 -0
  356. package/v3/assets/skills/qe-iterative-loop/SKILL.md +445 -443
  357. package/v3/assets/skills/qe-iterative-loop/schemas/output.json +264 -0
  358. package/v3/assets/skills/qe-iterative-loop/scripts/validate.sh +474 -0
  359. package/v3/assets/skills/qe-learning-optimization/SKILL.md +6 -0
  360. package/v3/assets/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -0
  361. package/v3/assets/skills/qe-learning-optimization/schemas/output.json +288 -0
  362. package/v3/assets/skills/qe-learning-optimization/scripts/validate.sh +56 -0
  363. package/v3/assets/skills/qe-quality-assessment/SKILL.md +6 -0
  364. package/v3/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -0
  365. package/v3/assets/skills/qe-quality-assessment/schemas/output.json +550 -0
  366. package/v3/assets/skills/qe-quality-assessment/scripts/validate.sh +352 -0
  367. package/v3/assets/skills/qe-requirements-validation/SKILL.md +6 -0
  368. package/v3/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
  369. package/v3/assets/skills/qe-requirements-validation/schemas/output.json +587 -0
  370. package/v3/assets/skills/qe-requirements-validation/scripts/validate.sh +275 -0
  371. package/v3/assets/skills/qe-security-compliance/SKILL.md +6 -0
  372. package/v3/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -0
  373. package/v3/assets/skills/qe-security-compliance/schemas/output.json +498 -0
  374. package/v3/assets/skills/qe-security-compliance/scripts/validate.sh +305 -0
  375. package/v3/assets/skills/qe-test-execution/SKILL.md +6 -0
  376. package/v3/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -0
  377. package/v3/assets/skills/qe-test-execution/schemas/output.json +529 -0
  378. package/v3/assets/skills/qe-test-execution/scripts/validate.sh +323 -0
  379. package/v3/assets/skills/qe-test-generation/SKILL.md +6 -0
  380. package/v3/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -0
  381. package/v3/assets/skills/qe-test-generation/schemas/output.json +439 -0
  382. package/v3/assets/skills/qe-test-generation/scripts/validate.sh +56 -0
  383. package/v3/assets/skills/qe-visual-accessibility/SKILL.md +6 -0
  384. package/v3/assets/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -0
  385. package/v3/assets/skills/qe-visual-accessibility/schemas/output.json +491 -0
  386. package/v3/assets/skills/qe-visual-accessibility/scripts/validate.sh +56 -0
  387. package/v3/assets/skills/quality-metrics/SKILL.md +6 -0
  388. package/v3/assets/skills/quality-metrics/evals/quality-metrics.yaml +494 -0
  389. package/v3/assets/skills/quality-metrics/schemas/output.json +403 -0
  390. package/v3/assets/skills/quality-metrics/scripts/validate.sh +434 -0
  391. package/v3/assets/skills/refactoring-patterns/SKILL.md +5 -0
  392. package/v3/assets/skills/refactoring-patterns/schemas/output.json +475 -0
  393. package/v3/assets/skills/refactoring-patterns/scripts/validate.sh +241 -0
  394. package/v3/assets/skills/regression-testing/SKILL.md +6 -0
  395. package/v3/assets/skills/regression-testing/evals/regression-testing.yaml +504 -0
  396. package/v3/assets/skills/regression-testing/schemas/output.json +311 -0
  397. package/v3/assets/skills/regression-testing/scripts/validate.sh +130 -0
  398. package/v3/assets/skills/risk-based-testing/SKILL.md +6 -0
  399. package/v3/assets/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -0
  400. package/v3/assets/skills/risk-based-testing/schemas/output.json +480 -0
  401. package/v3/assets/skills/risk-based-testing/scripts/validate.sh +56 -0
  402. package/v3/assets/skills/security-testing/SKILL.md +5 -0
  403. package/v3/assets/skills/security-testing/evals/security-testing.yaml +789 -0
  404. package/v3/assets/skills/security-testing/schemas/output.json +879 -0
  405. package/v3/assets/skills/security-testing/scripts/validate.sh +967 -0
  406. package/v3/assets/skills/shift-left-testing/SKILL.md +6 -0
  407. package/v3/assets/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -0
  408. package/v3/assets/skills/shift-left-testing/schemas/output.json +459 -0
  409. package/v3/assets/skills/shift-left-testing/scripts/validate.sh +56 -0
  410. package/v3/assets/skills/shift-right-testing/SKILL.md +6 -0
  411. package/v3/assets/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -0
  412. package/v3/assets/skills/shift-right-testing/schemas/output.json +418 -0
  413. package/v3/assets/skills/shift-right-testing/scripts/validate.sh +56 -0
  414. package/v3/assets/skills/six-thinking-hats/SKILL.md +3 -0
  415. package/v3/assets/skills/tdd-london-chicago/SKILL.md +5 -0
  416. package/v3/assets/skills/tdd-london-chicago/schemas/output.json +444 -0
  417. package/v3/assets/skills/tdd-london-chicago/scripts/validate.sh +214 -0
  418. package/v3/assets/skills/technical-writing/SKILL.md +4 -0
  419. package/v3/assets/skills/technical-writing/schemas/output.json +268 -0
  420. package/v3/assets/skills/test-automation-strategy/SKILL.md +6 -0
  421. package/v3/assets/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -0
  422. package/v3/assets/skills/test-automation-strategy/schemas/output.json +444 -0
  423. package/v3/assets/skills/test-automation-strategy/scripts/validate.sh +195 -0
  424. package/v3/assets/skills/test-data-management/SKILL.md +6 -0
  425. package/v3/assets/skills/test-data-management/evals/test-data-management.yaml +504 -0
  426. package/v3/assets/skills/test-data-management/schemas/output.json +284 -0
  427. package/v3/assets/skills/test-data-management/scripts/validate.sh +137 -0
  428. package/v3/assets/skills/test-design-techniques/SKILL.md +6 -0
  429. package/v3/assets/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -0
  430. package/v3/assets/skills/test-design-techniques/schemas/output.json +295 -0
  431. package/v3/assets/skills/test-design-techniques/scripts/validate.sh +91 -0
  432. package/v3/assets/skills/test-environment-management/SKILL.md +4 -0
  433. package/v3/assets/skills/test-environment-management/schemas/output.json +310 -0
  434. package/v3/assets/skills/test-reporting-analytics/SKILL.md +6 -0
  435. package/v3/assets/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -0
  436. package/v3/assets/skills/test-reporting-analytics/schemas/output.json +329 -0
  437. package/v3/assets/skills/test-reporting-analytics/scripts/validate.sh +77 -0
  438. package/v3/assets/skills/verification-quality/SKILL.md +6 -0
  439. package/v3/assets/skills/verification-quality/evals/verification-quality.yaml +150 -0
  440. package/v3/assets/skills/verification-quality/schemas/output.json +432 -0
  441. package/v3/assets/skills/verification-quality/scripts/validate.sh +77 -0
  442. package/v3/assets/skills/visual-testing-advanced/SKILL.md +6 -0
  443. package/v3/assets/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -0
  444. package/v3/assets/skills/visual-testing-advanced/schemas/output.json +294 -0
  445. package/v3/assets/skills/visual-testing-advanced/scripts/validate.sh +77 -0
  446. package/v3/assets/skills/xp-practices/SKILL.md +3 -0
  447. package/v3/assets/templates/validation-report.md.hbs +139 -0
  448. package/v3/assets/templates/validation-summary.json +56 -0
  449. package/v3/dist/cli/bundle.js +7368 -3418
  450. package/v3/dist/cli/commands/eval.d.ts +18 -0
  451. package/v3/dist/cli/commands/eval.d.ts.map +1 -0
  452. package/v3/dist/cli/commands/eval.js +505 -0
  453. package/v3/dist/cli/commands/eval.js.map +1 -0
  454. package/v3/dist/cli/commands/validate-swarm.d.ts +16 -0
  455. package/v3/dist/cli/commands/validate-swarm.d.ts.map +1 -0
  456. package/v3/dist/cli/commands/validate-swarm.js +251 -0
  457. package/v3/dist/cli/commands/validate-swarm.js.map +1 -0
  458. package/v3/dist/cli/commands/validate.d.ts +14 -0
  459. package/v3/dist/cli/commands/validate.d.ts.map +1 -0
  460. package/v3/dist/cli/commands/validate.js +408 -0
  461. package/v3/dist/cli/commands/validate.js.map +1 -0
  462. package/v3/dist/cli/index.js +6 -0
  463. package/v3/dist/cli/index.js.map +1 -1
  464. package/v3/dist/index.d.ts +2 -0
  465. package/v3/dist/index.d.ts.map +1 -1
  466. package/v3/dist/index.js +10 -0
  467. package/v3/dist/index.js.map +1 -1
  468. package/v3/dist/init/skills-installer.d.ts +6 -0
  469. package/v3/dist/init/skills-installer.d.ts.map +1 -1
  470. package/v3/dist/init/skills-installer.js +48 -0
  471. package/v3/dist/init/skills-installer.js.map +1 -1
  472. package/v3/dist/learning/index.d.ts +2 -0
  473. package/v3/dist/learning/index.d.ts.map +1 -1
  474. package/v3/dist/learning/index.js +4 -0
  475. package/v3/dist/learning/index.js.map +1 -1
  476. package/v3/dist/learning/skill-validation-learner.d.ts +264 -0
  477. package/v3/dist/learning/skill-validation-learner.d.ts.map +1 -0
  478. package/v3/dist/learning/skill-validation-learner.js +515 -0
  479. package/v3/dist/learning/skill-validation-learner.js.map +1 -0
  480. package/v3/dist/validation/index.d.ts +19 -0
  481. package/v3/dist/validation/index.d.ts.map +1 -0
  482. package/v3/dist/validation/index.js +31 -0
  483. package/v3/dist/validation/index.js.map +1 -0
  484. package/v3/dist/validation/parallel-eval-runner.d.ts +307 -0
  485. package/v3/dist/validation/parallel-eval-runner.d.ts.map +1 -0
  486. package/v3/dist/validation/parallel-eval-runner.js +566 -0
  487. package/v3/dist/validation/parallel-eval-runner.js.map +1 -0
  488. package/v3/dist/validation/swarm-skill-validator.d.ts +282 -0
  489. package/v3/dist/validation/swarm-skill-validator.d.ts.map +1 -0
  490. package/v3/dist/validation/swarm-skill-validator.js +460 -0
  491. package/v3/dist/validation/swarm-skill-validator.js.map +1 -0
  492. package/v3/dist/validation/validation-result-aggregator.d.ts +232 -0
  493. package/v3/dist/validation/validation-result-aggregator.d.ts.map +1 -0
  494. package/v3/dist/validation/validation-result-aggregator.js +630 -0
  495. package/v3/dist/validation/validation-result-aggregator.js.map +1 -0
  496. package/v3/package.json +1 -1
@@ -0,0 +1,1060 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # AQE Skill Validator Template v2.0.0
4
+ # Copy this template to: .claude/skills/{skill-name}/scripts/validate.sh
5
+ # =============================================================================
6
+ #
7
+ # This template provides a comprehensive validation framework for AQE skills.
8
+ # It validates skill outputs against schemas, checks required content, and
9
+ # provides graceful degradation when validation tools are unavailable.
10
+ #
11
+ # Usage: ./validate.sh <output-file> [options]
12
+ #
13
+ # Options:
14
+ # --self-test Run validator self-test mode
15
+ # --verbose Enable verbose output
16
+ # --json Output results as JSON only
17
+ # --list-tools Show available validation tools
18
+ # --help Show this help message
19
+ #
20
+ # Exit Codes:
21
+ # 0 - Validation passed (all checks successful)
22
+ # 1 - Validation failed (one or more checks failed)
23
+ # 2 - Validation skipped (missing required tools)
24
+ #
25
+ # Self-Test Mode:
26
+ # When called with --self-test, the validator will:
27
+ # 1. Check all required tools are available
28
+ # 2. Check all optional tools and report availability
29
+ # 3. Validate the schema file exists and is valid JSON
30
+ # 4. Run a basic validation with sample test data
31
+ # 5. Report overall self-test status
32
+ #
33
+ # Graceful Degradation:
34
+ # - If required tools are missing, validation exits with code 2
35
+ # - If optional tools are missing, validation continues with reduced checks
36
+ # - Schema validation falls back: ajv -> jsonschema -> python3
37
+ # - JSON parsing falls back: jq -> python3 -> node
38
+ #
39
+ # =============================================================================
40
+
41
+ set -euo pipefail
42
+
43
+ # Get script directory (works even when sourced)
44
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
45
+
46
+ # Determine paths based on where the script is located
47
+ # If this is the template in docs/templates, use local paths
48
+ # If this is copied to a skill, navigate to project root
49
+ if [[ "$SCRIPT_DIR" == *"/docs/templates"* ]]; then
50
+ # Running as template from docs/templates
51
+ PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
52
+ SKILL_DIR="$SCRIPT_DIR"
53
+ else
54
+ # Running as installed validator in .claude/skills/{skill}/scripts
55
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
56
+ PROJECT_ROOT="$(cd "$SKILL_DIR/../../../.." && pwd)"
57
+ fi
58
+
59
+ # Source shared library - try multiple locations
60
+ VALIDATOR_LIB=""
61
+ for lib_path in \
62
+ "$SCRIPT_DIR/validator-lib.sh" \
63
+ "$PROJECT_ROOT/docs/templates/validator-lib.sh" \
64
+ "$SKILL_DIR/scripts/validator-lib.sh"; do
65
+ if [[ -f "$lib_path" ]]; then
66
+ VALIDATOR_LIB="$lib_path"
67
+ break
68
+ fi
69
+ done
70
+
71
+ if [[ -n "$VALIDATOR_LIB" ]]; then
72
+ # shellcheck source=/dev/null
73
+ source "$VALIDATOR_LIB"
74
+ else
75
+ echo "ERROR: Validator library not found"
76
+ echo "Searched:"
77
+ echo " - $SCRIPT_DIR/validator-lib.sh"
78
+ echo " - $PROJECT_ROOT/docs/templates/validator-lib.sh"
79
+ echo " - $SKILL_DIR/scripts/validator-lib.sh"
80
+ echo ""
81
+ echo "Make sure the validator-lib.sh file exists in one of these locations."
82
+ exit 1
83
+ fi
84
+
85
+ # =============================================================================
86
+ # SKILL-SPECIFIC CONFIGURATION - MODIFY THIS SECTION
87
+ # =============================================================================
88
+
89
+ # Skill name (should match SKILL.md name)
90
+ # Example: "security-testing", "accessibility-testing"
91
+ SKILL_NAME="REPLACE_WITH_SKILL_NAME"
92
+
93
+ # Skill version (for output metadata)
94
+ SKILL_VERSION="1.0.0"
95
+
96
+ # Required tools (validation FAILS with exit 2 if missing)
97
+ # These tools are essential for the skill to function
98
+ # Example: ("playwright" "axe-core")
99
+ REQUIRED_TOOLS=()
100
+
101
+ # Optional tools (validation continues with warnings if missing)
102
+ # These tools enable additional validation capabilities
103
+ # Default tools for JSON parsing and schema validation
104
+ OPTIONAL_TOOLS=("jq" "ajv" "jsonschema" "python3")
105
+
106
+ # Path to output JSON schema (relative to skill directory)
107
+ # Set to empty string if no schema exists (trust_tier < 1)
108
+ SCHEMA_PATH="$SKILL_DIR/schemas/output.json"
109
+
110
+ # Path to sample test data for self-test mode
111
+ # If provided, self-test will validate this file against the schema
112
+ # Should be a valid example output from the skill
113
+ SAMPLE_OUTPUT_PATH="$PROJECT_ROOT/docs/templates/test-data/sample-output.json"
114
+
115
+ # =============================================================================
116
+ # CONTENT VALIDATION CONFIGURATION
117
+ # =============================================================================
118
+
119
+ # Minimum required fields in output (basic structural validation)
120
+ # These fields are checked even if schema validation is unavailable
121
+ REQUIRED_FIELDS=("skillName" "status" "output")
122
+
123
+ # Fields that must have non-null, non-empty values
124
+ # Example: ("output.summary" "output.findings")
125
+ REQUIRED_NON_EMPTY_FIELDS=()
126
+
127
+ # Terms that MUST appear somewhere in output (case-insensitive)
128
+ # Use for skill-specific domain terminology
129
+ # Example: ("WCAG" "accessibility") for accessibility-testing
130
+ MUST_CONTAIN_TERMS=()
131
+
132
+ # Terms that must NOT appear in output (indicates failure/hallucination)
133
+ # Use to catch common LLM errors or invalid outputs
134
+ # Example: ("TODO" "placeholder" "example.com")
135
+ MUST_NOT_CONTAIN_TERMS=()
136
+
137
+ # Enum fields and their allowed values
138
+ # Format: "field_path:value1,value2,value3"
139
+ # Example: (".status:success,partial,failed,skipped")
140
+ ENUM_VALIDATIONS=(
141
+ ".status:success,partial,failed,skipped"
142
+ )
143
+
144
+ # Minimum array lengths
145
+ # Format: "field_path:min_count"
146
+ # Example: (".output.findings:0" means findings array must exist but can be empty)
147
+ MIN_ARRAY_LENGTHS=()
148
+
149
+ # =============================================================================
150
+ # Argument Parsing
151
+ # =============================================================================
152
+
153
+ OUTPUT_FILE=""
154
+ SELF_TEST=false
155
+ VERBOSE=false
156
+ JSON_ONLY=false
157
+ LIST_TOOLS=false
158
+
159
+ while [[ $# -gt 0 ]]; do
160
+ case "$1" in
161
+ --self-test)
162
+ SELF_TEST=true
163
+ shift
164
+ ;;
165
+ --verbose|-v)
166
+ VERBOSE=true
167
+ export AQE_DEBUG=1
168
+ shift
169
+ ;;
170
+ --json)
171
+ JSON_ONLY=true
172
+ shift
173
+ ;;
174
+ --list-tools)
175
+ LIST_TOOLS=true
176
+ shift
177
+ ;;
178
+ -h|--help)
179
+ cat << 'HELP_EOF'
180
+ AQE Skill Validator
181
+
182
+ Usage: ./validate.sh <output-file> [options]
183
+ ./validate.sh --self-test [--verbose]
184
+ ./validate.sh --list-tools
185
+
186
+ Arguments:
187
+ <output-file> Path to skill output JSON file to validate
188
+
189
+ Options:
190
+ --self-test Run validator self-test mode
191
+ --verbose, -v Enable verbose/debug output
192
+ --json Output results as JSON only (for CI integration)
193
+ --list-tools Show available validation tools and exit
194
+ --help, -h Show this help message
195
+
196
+ Exit Codes:
197
+ 0 - Validation passed
198
+ 1 - Validation failed
199
+ 2 - Validation skipped (missing required tools)
200
+
201
+ Examples:
202
+ ./validate.sh output.json # Validate output file
203
+ ./validate.sh output.json --json # JSON output for CI
204
+ ./validate.sh --self-test --verbose # Self-test with debug
205
+ ./validate.sh --list-tools # Show available tools
206
+
207
+ HELP_EOF
208
+ exit 0
209
+ ;;
210
+ -*)
211
+ error "Unknown option: $1"
212
+ echo "Use --help for usage information"
213
+ exit 1
214
+ ;;
215
+ *)
216
+ OUTPUT_FILE="$1"
217
+ shift
218
+ ;;
219
+ esac
220
+ done
221
+
222
+ # Handle --list-tools mode
223
+ if [[ "$LIST_TOOLS" == "true" ]]; then
224
+ echo "=============================================="
225
+ echo "Available Validation Tools for $SKILL_NAME"
226
+ echo "=============================================="
227
+ echo ""
228
+ echo "Required tools:"
229
+ if [[ ${#REQUIRED_TOOLS[@]} -eq 0 ]]; then
230
+ echo " (none specified)"
231
+ else
232
+ for tool in "${REQUIRED_TOOLS[@]}"; do
233
+ if command_exists "$tool"; then
234
+ echo " [OK] $tool"
235
+ else
236
+ echo " [MISSING] $tool"
237
+ fi
238
+ done
239
+ fi
240
+ echo ""
241
+ echo "Optional tools:"
242
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
243
+ if command_exists "$tool"; then
244
+ echo " [OK] $tool"
245
+ else
246
+ echo " [MISSING] $tool"
247
+ fi
248
+ done
249
+ echo ""
250
+ echo "Schema validation support:"
251
+ if command_exists "ajv"; then
252
+ echo " [OK] ajv (preferred)"
253
+ elif command_exists "jsonschema"; then
254
+ echo " [OK] jsonschema CLI"
255
+ elif command_exists "python3" && python3 -c "import jsonschema" 2>/dev/null; then
256
+ echo " [OK] python3 + jsonschema module"
257
+ else
258
+ echo " [MISSING] No schema validator available"
259
+ fi
260
+ exit 0
261
+ fi
262
+
263
+ # =============================================================================
264
+ # Self-Test Mode
265
+ # =============================================================================
266
+
267
+ if [[ "$SELF_TEST" == "true" ]]; then
268
+ echo "=============================================="
269
+ info "Running $SKILL_NAME Validator Self-Test"
270
+ echo "=============================================="
271
+ echo ""
272
+ echo "Validator version: $AQE_VALIDATOR_VERSION"
273
+ echo "Skill version: $SKILL_VERSION"
274
+ echo ""
275
+
276
+ self_test_passed=true
277
+ self_test_warnings=0
278
+
279
+ # -------------------------------------------
280
+ # Step 1: Check Required Tools
281
+ # -------------------------------------------
282
+ echo "--- Step 1: Required Tools ---"
283
+ if [[ ${#REQUIRED_TOOLS[@]} -eq 0 ]]; then
284
+ success "No required tools specified"
285
+ else
286
+ for tool in "${REQUIRED_TOOLS[@]}"; do
287
+ if command_exists "$tool"; then
288
+ success "Required tool available: $tool"
289
+ else
290
+ error "Required tool MISSING: $tool"
291
+ self_test_passed=false
292
+ fi
293
+ done
294
+ fi
295
+ echo ""
296
+
297
+ # -------------------------------------------
298
+ # Step 2: Check Optional Tools
299
+ # -------------------------------------------
300
+ echo "--- Step 2: Optional Tools ---"
301
+ available_optional=0
302
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
303
+ if command_exists "$tool"; then
304
+ success "Optional tool available: $tool"
305
+ ((available_optional++)) || true
306
+ else
307
+ warn "Optional tool missing: $tool"
308
+ ((self_test_warnings++)) || true
309
+ fi
310
+ done
311
+
312
+ if [[ $available_optional -eq 0 ]]; then
313
+ warn "No optional tools available - validation capabilities limited"
314
+ ((self_test_warnings++)) || true
315
+ fi
316
+ echo ""
317
+
318
+ # -------------------------------------------
319
+ # Step 3: Check Schema Validation Capability
320
+ # -------------------------------------------
321
+ echo "--- Step 3: Schema Validation Capability ---"
322
+ schema_validator_available=false
323
+
324
+ if command_exists "ajv"; then
325
+ success "Schema validator: ajv (preferred)"
326
+ schema_validator_available=true
327
+ elif command_exists "jsonschema"; then
328
+ success "Schema validator: jsonschema CLI"
329
+ schema_validator_available=true
330
+ elif command_exists "python3"; then
331
+ if python3 -c "import jsonschema" 2>/dev/null; then
332
+ success "Schema validator: python3 + jsonschema module"
333
+ schema_validator_available=true
334
+ else
335
+ warn "python3 available but jsonschema module not installed"
336
+ ((self_test_warnings++)) || true
337
+ fi
338
+ fi
339
+
340
+ if [[ "$schema_validator_available" == "false" ]]; then
341
+ warn "No schema validator available - schema validation will be skipped"
342
+ ((self_test_warnings++)) || true
343
+ fi
344
+ echo ""
345
+
346
+ # -------------------------------------------
347
+ # Step 4: Check Schema File
348
+ # -------------------------------------------
349
+ echo "--- Step 4: Schema File ---"
350
+ if [[ -n "$SCHEMA_PATH" ]] && [[ -f "$SCHEMA_PATH" ]]; then
351
+ success "Schema file exists: $SCHEMA_PATH"
352
+
353
+ # Validate schema is valid JSON
354
+ if validate_json "$SCHEMA_PATH" 2>/dev/null; then
355
+ success "Schema file is valid JSON"
356
+
357
+ # Check for basic schema structure
358
+ if validate_schema_syntax "$SCHEMA_PATH" 2>/dev/null; then
359
+ success "Schema file has valid structure"
360
+ else
361
+ warn "Schema file may have structural issues"
362
+ ((self_test_warnings++)) || true
363
+ fi
364
+ else
365
+ error "Schema file is NOT valid JSON"
366
+ self_test_passed=false
367
+ fi
368
+ elif [[ -n "$SCHEMA_PATH" ]]; then
369
+ warn "Schema file not found: $SCHEMA_PATH"
370
+ warn "This skill has trust_tier < 1 (no schema validation)"
371
+ ((self_test_warnings++)) || true
372
+ else
373
+ info "No schema path configured (trust_tier 0)"
374
+ fi
375
+ echo ""
376
+
377
+ # -------------------------------------------
378
+ # Step 5: Test with Sample Data
379
+ # -------------------------------------------
380
+ echo "--- Step 5: Sample Data Validation ---"
381
+ if [[ -n "$SAMPLE_OUTPUT_PATH" ]] && [[ -f "$SAMPLE_OUTPUT_PATH" ]]; then
382
+ success "Sample output file exists: $SAMPLE_OUTPUT_PATH"
383
+
384
+ # Validate sample is valid JSON
385
+ if validate_json "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
386
+ success "Sample output is valid JSON"
387
+
388
+ # Test schema validation if available
389
+ if [[ "$schema_validator_available" == "true" ]] && [[ -f "$SCHEMA_PATH" ]]; then
390
+ if validate_json_schema "$SCHEMA_PATH" "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
391
+ success "Sample output passes schema validation"
392
+ else
393
+ error "Sample output FAILS schema validation"
394
+ self_test_passed=false
395
+ fi
396
+ else
397
+ info "Skipping schema validation test (no validator or schema)"
398
+ fi
399
+
400
+ # Test required fields
401
+ missing_fields=()
402
+ for field in "${REQUIRED_FIELDS[@]}"; do
403
+ field_value=$(json_get "$SAMPLE_OUTPUT_PATH" ".$field" 2>/dev/null)
404
+ if [[ -z "$field_value" ]] || [[ "$field_value" == "null" ]]; then
405
+ missing_fields+=("$field")
406
+ fi
407
+ done
408
+
409
+ if [[ ${#missing_fields[@]} -eq 0 ]]; then
410
+ success "Sample output has all required fields"
411
+ else
412
+ error "Sample output missing fields: ${missing_fields[*]}"
413
+ self_test_passed=false
414
+ fi
415
+ else
416
+ error "Sample output is NOT valid JSON"
417
+ self_test_passed=false
418
+ fi
419
+ else
420
+ info "No sample output file configured or found"
421
+ info "Skipping sample data validation test"
422
+ fi
423
+ echo ""
424
+
425
+ # -------------------------------------------
426
+ # Step 6: Run Library Self-Test
427
+ # -------------------------------------------
428
+ echo "--- Step 6: Validator Library Self-Test ---"
429
+ if [[ "$VERBOSE" == "true" ]]; then
430
+ if run_self_test --verbose; then
431
+ success "Library self-test passed"
432
+ else
433
+ error "Library self-test FAILED"
434
+ self_test_passed=false
435
+ fi
436
+ else
437
+ if run_self_test 2>/dev/null; then
438
+ success "Library self-test passed"
439
+ else
440
+ error "Library self-test FAILED"
441
+ self_test_passed=false
442
+ fi
443
+ fi
444
+ echo ""
445
+
446
+ # -------------------------------------------
447
+ # Self-Test Summary
448
+ # -------------------------------------------
449
+ echo "=============================================="
450
+ echo "Self-Test Summary for $SKILL_NAME"
451
+ echo "=============================================="
452
+
453
+ if [[ "$self_test_passed" == "true" ]]; then
454
+ if [[ $self_test_warnings -gt 0 ]]; then
455
+ warn "Self-test PASSED with $self_test_warnings warning(s)"
456
+ echo ""
457
+ echo "The validator is functional but has reduced capabilities."
458
+ echo "Consider installing missing tools for full validation."
459
+ exit 0
460
+ else
461
+ success "Self-test PASSED (all checks successful)"
462
+ exit 0
463
+ fi
464
+ else
465
+ error "Self-test FAILED"
466
+ echo ""
467
+ echo "Required actions:"
468
+ if [[ ${#REQUIRED_TOOLS[@]} -gt 0 ]]; then
469
+ echo " 1. Install missing required tools"
470
+ fi
471
+ echo " 2. Ensure schema file is valid JSON"
472
+ echo " 3. Ensure sample output matches schema"
473
+ exit 1
474
+ fi
475
+ fi
476
+
477
+ # =============================================================================
478
+ # Validation Functions - CUSTOMIZE THESE FOR YOUR SKILL
479
+ # =============================================================================
480
+
481
+ # Check that all required tools are available
482
+ # Returns: 0 if all present, 1 if any missing
483
+ validate_tools() {
484
+ if [[ ${#REQUIRED_TOOLS[@]} -eq 0 ]]; then
485
+ debug "No required tools specified"
486
+ return 0
487
+ fi
488
+
489
+ local missing=()
490
+ for tool in "${REQUIRED_TOOLS[@]}"; do
491
+ if ! command_exists "$tool"; then
492
+ missing+=("$tool")
493
+ fi
494
+ done
495
+
496
+ if [[ ${#missing[@]} -gt 0 ]]; then
497
+ error "Missing required tools: ${missing[*]}"
498
+ echo ""
499
+ echo "Install missing tools and retry:"
500
+ for tool in "${missing[@]}"; do
501
+ echo " - $tool"
502
+ done
503
+ return 1
504
+ fi
505
+
506
+ debug "All required tools available"
507
+ return 0
508
+ }
509
+
510
+ # Validate output against JSON schema
511
+ # Returns: 0=passed, 1=failed, 2=skipped
512
+ validate_schema() {
513
+ local output_file="$1"
514
+
515
+ # Check if schema validation is configured
516
+ if [[ -z "$SCHEMA_PATH" ]]; then
517
+ debug "No schema path configured, skipping schema validation"
518
+ return 2
519
+ fi
520
+
521
+ if [[ ! -f "$SCHEMA_PATH" ]]; then
522
+ warn "Schema file not found: $SCHEMA_PATH"
523
+ warn "Skipping schema validation (trust_tier < 1)"
524
+ return 2
525
+ fi
526
+
527
+ debug "Validating against schema: $SCHEMA_PATH"
528
+
529
+ local result
530
+ result=$(validate_json_schema "$SCHEMA_PATH" "$output_file" 2>&1)
531
+ local status=$?
532
+
533
+ case $status in
534
+ 0)
535
+ success "Schema validation passed"
536
+ return 0
537
+ ;;
538
+ 1)
539
+ error "Schema validation failed"
540
+ if [[ "$VERBOSE" == "true" ]]; then
541
+ echo "$result" | while read -r line; do
542
+ echo " $line"
543
+ done
544
+ fi
545
+ return 1
546
+ ;;
547
+ 2)
548
+ warn "Schema validation skipped (no validator available)"
549
+ return 2
550
+ ;;
551
+ esac
552
+ }
553
+
554
+ # Validate required fields exist and have values
555
+ # Returns: 0 if all present, 1 if any missing
556
+ validate_required_fields() {
557
+ local output_file="$1"
558
+ local missing=()
559
+ local empty=()
560
+
561
+ # Check required fields exist
562
+ for field in "${REQUIRED_FIELDS[@]}"; do
563
+ local value
564
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
565
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
566
+ missing+=("$field")
567
+ fi
568
+ done
569
+
570
+ # Check required non-empty fields
571
+ for field in "${REQUIRED_NON_EMPTY_FIELDS[@]}"; do
572
+ local value
573
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
574
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]] || [[ "$value" == "" ]] || [[ "$value" == "[]" ]] || [[ "$value" == "{}" ]]; then
575
+ empty+=("$field")
576
+ fi
577
+ done
578
+
579
+ local has_errors=false
580
+
581
+ if [[ ${#missing[@]} -gt 0 ]]; then
582
+ error "Missing required fields: ${missing[*]}"
583
+ has_errors=true
584
+ fi
585
+
586
+ if [[ ${#empty[@]} -gt 0 ]]; then
587
+ error "Empty required fields: ${empty[*]}"
588
+ has_errors=true
589
+ fi
590
+
591
+ if [[ "$has_errors" == "true" ]]; then
592
+ return 1
593
+ fi
594
+
595
+ success "All required fields present and valid"
596
+ return 0
597
+ }
598
+
599
+ # Validate enum fields have allowed values
600
+ # Returns: 0 if all valid, 1 if any invalid
601
+ validate_enum_fields() {
602
+ local output_file="$1"
603
+
604
+ if [[ ${#ENUM_VALIDATIONS[@]} -eq 0 ]]; then
605
+ return 0
606
+ fi
607
+
608
+ local has_errors=false
609
+
610
+ for validation in "${ENUM_VALIDATIONS[@]}"; do
611
+ local field_path="${validation%%:*}"
612
+ local allowed_values="${validation#*:}"
613
+
614
+ local actual_value
615
+ actual_value=$(json_get "$output_file" "$field_path" 2>/dev/null)
616
+
617
+ if [[ -z "$actual_value" ]] || [[ "$actual_value" == "null" ]]; then
618
+ debug "Enum field $field_path is empty/null (may be optional)"
619
+ continue
620
+ fi
621
+
622
+ # Convert comma-separated to array and check
623
+ local found=false
624
+ IFS=',' read -ra allowed_array <<< "$allowed_values"
625
+ for allowed in "${allowed_array[@]}"; do
626
+ if [[ "$actual_value" == "$allowed" ]]; then
627
+ found=true
628
+ break
629
+ fi
630
+ done
631
+
632
+ if [[ "$found" == "false" ]]; then
633
+ error "Invalid value for $field_path: '$actual_value' (allowed: $allowed_values)"
634
+ has_errors=true
635
+ else
636
+ debug "Enum field $field_path='$actual_value' is valid"
637
+ fi
638
+ done
639
+
640
+ if [[ "$has_errors" == "true" ]]; then
641
+ return 1
642
+ fi
643
+
644
+ success "All enum fields have valid values"
645
+ return 0
646
+ }
647
+
648
+ # Validate array fields have minimum lengths
649
+ # Returns: 0 if all valid, 1 if any too short
650
+ validate_array_lengths() {
651
+ local output_file="$1"
652
+
653
+ if [[ ${#MIN_ARRAY_LENGTHS[@]} -eq 0 ]]; then
654
+ return 0
655
+ fi
656
+
657
+ local has_errors=false
658
+
659
+ for validation in "${MIN_ARRAY_LENGTHS[@]}"; do
660
+ local field_path="${validation%%:*}"
661
+ local min_length="${validation#*:}"
662
+
663
+ local actual_count
664
+ actual_count=$(json_count "$output_file" "$field_path" 2>/dev/null)
665
+
666
+ if [[ -z "$actual_count" ]] || [[ "$actual_count" == "null" ]]; then
667
+ actual_count=0
668
+ fi
669
+
670
+ if [[ "$actual_count" -lt "$min_length" ]]; then
671
+ error "Array $field_path has $actual_count items (minimum: $min_length)"
672
+ has_errors=true
673
+ else
674
+ debug "Array $field_path has $actual_count items (>= $min_length)"
675
+ fi
676
+ done
677
+
678
+ if [[ "$has_errors" == "true" ]]; then
679
+ return 1
680
+ fi
681
+
682
+ return 0
683
+ }
684
+
685
+ # Validate content contains expected terms
686
+ # Returns: 0 if valid, 1 if invalid
687
+ validate_content_terms() {
688
+ local output_file="$1"
689
+ local content
690
+ content=$(cat "$output_file")
691
+
692
+ local has_errors=false
693
+
694
+ # Check must-contain terms
695
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]]; then
696
+ local missing_terms=()
697
+ for term in "${MUST_CONTAIN_TERMS[@]}"; do
698
+ if ! grep -qi "$term" <<< "$content"; then
699
+ missing_terms+=("$term")
700
+ fi
701
+ done
702
+
703
+ if [[ ${#missing_terms[@]} -gt 0 ]]; then
704
+ error "Output missing required terms: ${missing_terms[*]}"
705
+ has_errors=true
706
+ else
707
+ success "All required terms found"
708
+ fi
709
+ fi
710
+
711
+ # Check must-not-contain terms
712
+ if [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
713
+ local found_forbidden=()
714
+ for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
715
+ if grep -qi "$term" <<< "$content"; then
716
+ found_forbidden+=("$term")
717
+ fi
718
+ done
719
+
720
+ if [[ ${#found_forbidden[@]} -gt 0 ]]; then
721
+ error "Output contains forbidden terms: ${found_forbidden[*]}"
722
+ has_errors=true
723
+ else
724
+ success "No forbidden terms found"
725
+ fi
726
+ fi
727
+
728
+ if [[ "$has_errors" == "true" ]]; then
729
+ return 1
730
+ fi
731
+
732
+ return 0
733
+ }
734
+
735
+ # =============================================================================
736
+ # SKILL-SPECIFIC VALIDATION - CUSTOMIZE THIS FUNCTION
737
+ # =============================================================================
738
+
739
+ # Add your skill-specific validation logic here
740
+ # This function is called after all standard validations pass
741
+ #
742
+ # Example validations:
743
+ # - Check specific field values make sense
744
+ # - Validate relationships between fields
745
+ # - Check business logic constraints
746
+ # - Verify output completeness
747
+ #
748
+ # Returns: 0 if valid, 1 if invalid
749
+ validate_skill_specific() {
750
+ local output_file="$1"
751
+
752
+ debug "Running skill-specific validations..."
753
+
754
+ # ==========================================================================
755
+ # EXAMPLE 1: Check that findings array has at least one item
756
+ # ==========================================================================
757
+ # local finding_count
758
+ # finding_count=$(json_count "$output_file" ".output.findings")
759
+ # if [[ -z "$finding_count" ]] || [[ "$finding_count" -lt 1 ]]; then
760
+ # warn "No findings in output - is this expected?"
761
+ # fi
762
+
763
+ # ==========================================================================
764
+ # EXAMPLE 2: Validate severity levels are consistent
765
+ # ==========================================================================
766
+ # local critical_count high_count
767
+ # critical_count=$(json_count "$output_file" '.output.findings | map(select(.severity == "critical"))')
768
+ # high_count=$(json_count "$output_file" '.output.findings | map(select(.severity == "high"))')
769
+ # if [[ "$critical_count" -gt 0 ]] && [[ "$high_count" -eq 0 ]]; then
770
+ # warn "Critical findings exist but no high-severity findings - review classification"
771
+ # fi
772
+
773
+ # ==========================================================================
774
+ # EXAMPLE 3: Check for specific domain terms based on skill
775
+ # ==========================================================================
776
+ # local summary
777
+ # summary=$(json_get "$output_file" ".output.summary")
778
+ # if [[ "$SKILL_NAME" == "security-testing" ]]; then
779
+ # if ! grep -qi "security\|vulnerability\|risk" <<< "$summary"; then
780
+ # warn "Security testing output should mention security concepts"
781
+ # fi
782
+ # fi
783
+
784
+ # ==========================================================================
785
+ # EXAMPLE 4: Validate cross-field relationships
786
+ # ==========================================================================
787
+ # local status findings_count
788
+ # status=$(json_get "$output_file" ".status")
789
+ # findings_count=$(json_count "$output_file" ".output.findings")
790
+ # if [[ "$status" == "success" ]] && [[ "$findings_count" -gt 10 ]]; then
791
+ # warn "Status is 'success' but many findings exist - should status be 'partial'?"
792
+ # fi
793
+
794
+ # ==========================================================================
795
+ # ADD YOUR SKILL-SPECIFIC VALIDATIONS BELOW THIS LINE
796
+ # ==========================================================================
797
+
798
+ return 0
799
+ }
800
+
801
+ # =============================================================================
802
+ # Main Validation Flow
803
+ # =============================================================================
804
+
805
+ main() {
806
+ # Validate arguments
807
+ if [[ -z "$OUTPUT_FILE" ]]; then
808
+ error "No output file specified"
809
+ echo "Usage: $0 <output-file> [options]"
810
+ echo "Use --help for more information"
811
+ exit 1
812
+ fi
813
+
814
+ if [[ ! -f "$OUTPUT_FILE" ]]; then
815
+ error "Output file not found: $OUTPUT_FILE"
816
+ exit 1
817
+ fi
818
+
819
+ # Print header (unless JSON-only mode)
820
+ if [[ "$JSON_ONLY" != "true" ]]; then
821
+ echo "=============================================="
822
+ info "Validating $SKILL_NAME Output"
823
+ echo "=============================================="
824
+ echo ""
825
+ echo " Skill: $SKILL_NAME v$SKILL_VERSION"
826
+ echo " File: $OUTPUT_FILE"
827
+ echo " Schema: ${SCHEMA_PATH:-none}"
828
+ echo ""
829
+ fi
830
+
831
+ # Track validation status for each category
832
+ local tool_status="passed"
833
+ local json_status="passed"
834
+ local schema_status="passed"
835
+ local fields_status="passed"
836
+ local enums_status="passed"
837
+ local arrays_status="passed"
838
+ local content_status="passed"
839
+ local specific_status="passed"
840
+
841
+ # Track errors and warnings
842
+ local error_count=0
843
+ local warning_count=0
844
+
845
+ # =========================================
846
+ # Step 1: Check Required Tools
847
+ # =========================================
848
+ if [[ "$JSON_ONLY" != "true" ]]; then
849
+ echo "--- Step 1: Tool Availability ---"
850
+ fi
851
+
852
+ if ! validate_tools; then
853
+ tool_status="failed"
854
+ ((error_count++)) || true
855
+ if [[ "$JSON_ONLY" == "true" ]]; then
856
+ output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
857
+ else
858
+ echo ""
859
+ error "Validation cannot proceed without required tools"
860
+ fi
861
+ exit $EXIT_SKIP
862
+ fi
863
+
864
+ [[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
865
+
866
+ # =========================================
867
+ # Step 2: Validate JSON Syntax
868
+ # =========================================
869
+ if [[ "$JSON_ONLY" != "true" ]]; then
870
+ echo "--- Step 2: JSON Syntax ---"
871
+ fi
872
+
873
+ if ! validate_json "$OUTPUT_FILE"; then
874
+ json_status="failed"
875
+ ((error_count++)) || true
876
+ if [[ "$JSON_ONLY" != "true" ]]; then
877
+ error "File is not valid JSON - cannot proceed"
878
+ fi
879
+ # Can't continue if JSON is invalid
880
+ if [[ "$JSON_ONLY" == "true" ]]; then
881
+ output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
882
+ fi
883
+ exit $EXIT_FAIL
884
+ fi
885
+
886
+ [[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
887
+
888
+ # =========================================
889
+ # Step 3: Validate Against Schema
890
+ # =========================================
891
+ if [[ "$JSON_ONLY" != "true" ]]; then
892
+ echo "--- Step 3: Schema Validation ---"
893
+ fi
894
+
895
+ # Call validate_schema and capture exit code (|| true prevents set -e from exiting)
896
+ local schema_exit_code
897
+ validate_schema "$OUTPUT_FILE" && schema_exit_code=0 || schema_exit_code=$?
898
+
899
+ case $schema_exit_code in
900
+ 0) [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
901
+ 1) schema_status="failed"; ((error_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
902
+ 2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
903
+ esac
904
+
905
+ # =========================================
906
+ # Step 4: Validate Required Fields
907
+ # =========================================
908
+ if [[ "$JSON_ONLY" != "true" ]]; then
909
+ echo "--- Step 4: Required Fields ---"
910
+ fi
911
+
912
+ if ! validate_required_fields "$OUTPUT_FILE"; then
913
+ fields_status="failed"
914
+ ((error_count++)) || true
915
+ fi
916
+
917
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
918
+
919
+ # =========================================
920
+ # Step 5: Validate Enum Values
921
+ # =========================================
922
+ if [[ ${#ENUM_VALIDATIONS[@]} -gt 0 ]]; then
923
+ if [[ "$JSON_ONLY" != "true" ]]; then
924
+ echo "--- Step 5: Enum Validation ---"
925
+ fi
926
+
927
+ if ! validate_enum_fields "$OUTPUT_FILE"; then
928
+ enums_status="failed"
929
+ ((error_count++)) || true
930
+ fi
931
+
932
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
933
+ fi
934
+
935
+ # =========================================
936
+ # Step 6: Validate Array Lengths
937
+ # =========================================
938
+ if [[ ${#MIN_ARRAY_LENGTHS[@]} -gt 0 ]]; then
939
+ if [[ "$JSON_ONLY" != "true" ]]; then
940
+ echo "--- Step 6: Array Validation ---"
941
+ fi
942
+
943
+ if ! validate_array_lengths "$OUTPUT_FILE"; then
944
+ arrays_status="failed"
945
+ ((error_count++)) || true
946
+ fi
947
+
948
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
949
+ fi
950
+
951
+ # =========================================
952
+ # Step 7: Validate Content Terms
953
+ # =========================================
954
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]] || [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
955
+ if [[ "$JSON_ONLY" != "true" ]]; then
956
+ echo "--- Step 7: Content Terms ---"
957
+ fi
958
+
959
+ if ! validate_content_terms "$OUTPUT_FILE"; then
960
+ content_status="failed"
961
+ ((error_count++)) || true
962
+ fi
963
+
964
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
965
+ fi
966
+
967
+ # =========================================
968
+ # Step 8: Skill-Specific Validation
969
+ # =========================================
970
+ if [[ "$JSON_ONLY" != "true" ]]; then
971
+ echo "--- Step 8: Skill-Specific Validation ---"
972
+ fi
973
+
974
+ if ! validate_skill_specific "$OUTPUT_FILE"; then
975
+ specific_status="failed"
976
+ ((error_count++)) || true
977
+ else
978
+ [[ "$JSON_ONLY" != "true" ]] && success "Skill-specific validation passed"
979
+ fi
980
+
981
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
982
+
983
+ # =========================================
984
+ # Determine Overall Status
985
+ # =========================================
986
+ local overall_status="passed"
987
+ local content_overall="passed"
988
+
989
+ # Aggregate content validations
990
+ if [[ "$fields_status" == "failed" ]] || \
991
+ [[ "$enums_status" == "failed" ]] || \
992
+ [[ "$arrays_status" == "failed" ]] || \
993
+ [[ "$content_status" == "failed" ]] || \
994
+ [[ "$specific_status" == "failed" ]]; then
995
+ content_overall="failed"
996
+ fi
997
+
998
+ # Determine overall
999
+ if [[ "$json_status" == "failed" ]] || \
1000
+ [[ "$schema_status" == "failed" ]] || \
1001
+ [[ "$content_overall" == "failed" ]]; then
1002
+ overall_status="failed"
1003
+ elif [[ "$schema_status" == "skipped" ]]; then
1004
+ overall_status="partial"
1005
+ fi
1006
+
1007
+ # =========================================
1008
+ # Output Results
1009
+ # =========================================
1010
+ if [[ "$JSON_ONLY" == "true" ]]; then
1011
+ output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
1012
+ else
1013
+ echo "=============================================="
1014
+ echo "Validation Summary for $SKILL_NAME"
1015
+ echo "=============================================="
1016
+ echo ""
1017
+ echo " Tools: $tool_status"
1018
+ echo " JSON Syntax: $json_status"
1019
+ echo " Schema: $schema_status"
1020
+ echo " Fields: $fields_status"
1021
+ if [[ ${#ENUM_VALIDATIONS[@]} -gt 0 ]]; then
1022
+ echo " Enums: $enums_status"
1023
+ fi
1024
+ if [[ ${#MIN_ARRAY_LENGTHS[@]} -gt 0 ]]; then
1025
+ echo " Arrays: $arrays_status"
1026
+ fi
1027
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]] || [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
1028
+ echo " Content: $content_status"
1029
+ fi
1030
+ echo " Skill-specific: $specific_status"
1031
+ echo ""
1032
+ echo " ------------------------------"
1033
+ echo " Overall: $overall_status"
1034
+ echo " Errors: $error_count"
1035
+ echo " Warnings: $warning_count"
1036
+ echo "=============================================="
1037
+ echo ""
1038
+ fi
1039
+
1040
+ # =========================================
1041
+ # Exit with appropriate code
1042
+ # =========================================
1043
+ case "$overall_status" in
1044
+ "passed")
1045
+ [[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
1046
+ exit $EXIT_PASS
1047
+ ;;
1048
+ "partial")
1049
+ [[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
1050
+ exit $EXIT_PASS # Partial is still success
1051
+ ;;
1052
+ "failed")
1053
+ [[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
1054
+ exit $EXIT_FAIL
1055
+ ;;
1056
+ esac
1057
+ }
1058
+
1059
+ # Run main function
1060
+ main