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,1031 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # AQE Skill Validator Library v2.0.0
4
+ # Shared functions for skill validation scripts
5
+ # =============================================================================
6
+ #
7
+ # This library provides a comprehensive set of utilities for skill validation:
8
+ # - Colored logging (info, warn, error, success, debug)
9
+ # - Tool detection with graceful degradation
10
+ # - JSON Schema validation (ajv, jsonschema, python3 fallbacks)
11
+ # - JSON parsing utilities (jq, python3 fallbacks)
12
+ # - Content validation (term matching, regex)
13
+ # - Result output in JSON format
14
+ # - File format handling
15
+ # - Self-test capabilities
16
+ #
17
+ # Exit Codes:
18
+ # 0 - Validation passed
19
+ # 1 - Validation failed
20
+ # 2 - Validation skipped (missing tools)
21
+ #
22
+ # Usage:
23
+ # source /path/to/validator-lib.sh
24
+ # check_required_tools "jq" "curl" || exit 2
25
+ # validate_json "$file" || exit 1
26
+ #
27
+ # =============================================================================
28
+
29
+ # Prevent multiple inclusion
30
+ if [[ -n "${_AQE_VALIDATOR_LIB_LOADED:-}" ]]; then
31
+ return 0 2>/dev/null || true
32
+ fi
33
+ export _AQE_VALIDATOR_LIB_LOADED=1
34
+
35
+ # =============================================================================
36
+ # Configuration
37
+ # =============================================================================
38
+ export AQE_VALIDATOR_VERSION="2.0.0"
39
+ export AQE_VALIDATION_LOG="${AQE_VALIDATION_LOG:-/tmp/aqe-validation.log}"
40
+
41
+ # Exit codes
42
+ export EXIT_PASS=0
43
+ export EXIT_FAIL=1
44
+ export EXIT_SKIP=2
45
+
46
+ # Colors (disable if not in terminal)
47
+ if [[ -t 1 ]]; then
48
+ RED='\033[0;31m'
49
+ GREEN='\033[0;32m'
50
+ YELLOW='\033[1;33m'
51
+ BLUE='\033[0;34m'
52
+ CYAN='\033[0;36m'
53
+ NC='\033[0m' # No Color
54
+ else
55
+ RED=''
56
+ GREEN=''
57
+ YELLOW=''
58
+ BLUE=''
59
+ CYAN=''
60
+ NC=''
61
+ fi
62
+
63
+ # =============================================================================
64
+ # Logging Functions
65
+ # =============================================================================
66
+
67
+ # Helper function to log to file if available
68
+ _log_to_file() {
69
+ if [[ -n "${AQE_VALIDATION_LOG:-}" ]] && [[ "$AQE_VALIDATION_LOG" != "/dev/null" ]]; then
70
+ echo "$*" >> "$AQE_VALIDATION_LOG" 2>/dev/null || true
71
+ fi
72
+ }
73
+
74
+ info() {
75
+ echo -e "${BLUE}[INFO]${NC} $*"
76
+ _log_to_file "[INFO] $*"
77
+ }
78
+
79
+ success() {
80
+ echo -e "${GREEN}[PASS]${NC} $*"
81
+ _log_to_file "[PASS] $*"
82
+ }
83
+
84
+ warn() {
85
+ echo -e "${YELLOW}[WARN]${NC} $*"
86
+ _log_to_file "[WARN] $*"
87
+ }
88
+
89
+ error() {
90
+ echo -e "${RED}[FAIL]${NC} $*" >&2
91
+ _log_to_file "[FAIL] $*"
92
+ }
93
+
94
+ debug() {
95
+ if [[ -n "${AQE_DEBUG:-}" ]]; then
96
+ echo -e "${CYAN}[DEBUG]${NC} $*"
97
+ _log_to_file "[DEBUG] $*"
98
+ fi
99
+ }
100
+
101
+ # =============================================================================
102
+ # Tool Detection Functions
103
+ # =============================================================================
104
+
105
+ # Check if a command exists
106
+ # Usage: command_exists "jq"
107
+ command_exists() {
108
+ command -v "$1" >/dev/null 2>&1
109
+ }
110
+
111
+ # Check a single tool with reporting
112
+ # Usage: check_tool "jq" true # required tool
113
+ # check_tool "jq" false # optional tool
114
+ # Returns: 0=found, 1=required+missing, 2=optional+missing
115
+ check_tool() {
116
+ local tool="$1"
117
+ local required="${2:-false}"
118
+
119
+ if command_exists "$tool"; then
120
+ debug "Tool available: $tool"
121
+ return 0
122
+ else
123
+ if [[ "$required" == "true" ]]; then
124
+ error "Required tool missing: $tool"
125
+ return 1
126
+ else
127
+ warn "Optional tool missing: $tool"
128
+ return 2
129
+ fi
130
+ fi
131
+ }
132
+
133
+ # Check multiple required tools at once
134
+ # Usage: check_required_tools "jq" "curl" "node"
135
+ # Returns: 0 if all present, 1 if any missing (with details)
136
+ check_required_tools() {
137
+ local tools=("$@")
138
+ local missing=()
139
+ local found=()
140
+
141
+ for tool in "${tools[@]}"; do
142
+ if command_exists "$tool"; then
143
+ found+=("$tool")
144
+ else
145
+ missing+=("$tool")
146
+ fi
147
+ done
148
+
149
+ if [[ ${#found[@]} -gt 0 ]]; then
150
+ debug "Found required tools: ${found[*]}"
151
+ fi
152
+
153
+ if [[ ${#missing[@]} -gt 0 ]]; then
154
+ error "Missing required tools: ${missing[*]}"
155
+ return 1
156
+ fi
157
+
158
+ success "All required tools present: ${found[*]}"
159
+ return 0
160
+ }
161
+
162
+ # Check multiple optional tools, report which are available
163
+ # Usage: available=$(check_optional_tools "ajv" "jsonschema" "yq")
164
+ # Returns: space-separated list of available tools
165
+ check_optional_tools() {
166
+ local tools=("$@")
167
+ local available=()
168
+ local missing=()
169
+
170
+ for tool in "${tools[@]}"; do
171
+ if command_exists "$tool"; then
172
+ available+=("$tool")
173
+ else
174
+ missing+=("$tool")
175
+ fi
176
+ done
177
+
178
+ if [[ ${#available[@]} -gt 0 ]]; then
179
+ debug "Available optional tools: ${available[*]}"
180
+ fi
181
+
182
+ if [[ ${#missing[@]} -gt 0 ]]; then
183
+ debug "Missing optional tools: ${missing[*]}"
184
+ fi
185
+
186
+ # Return available tools as space-separated string
187
+ echo "${available[*]}"
188
+ }
189
+
190
+ # Get list of available tools from a set
191
+ # Usage: get_available_tools "jq" "python3" "node"
192
+ get_available_tools() {
193
+ local tools=("$@")
194
+ local available=()
195
+
196
+ for tool in "${tools[@]}"; do
197
+ if command_exists "$tool"; then
198
+ available+=("$tool")
199
+ fi
200
+ done
201
+
202
+ echo "${available[@]}"
203
+ }
204
+
205
+ # Check if any of the given tools is available
206
+ # Usage: has_any_tool "ajv" "jsonschema" "python3"
207
+ # Returns: 0 if at least one is available, 1 if none
208
+ has_any_tool() {
209
+ local tools=("$@")
210
+
211
+ for tool in "${tools[@]}"; do
212
+ if command_exists "$tool"; then
213
+ return 0
214
+ fi
215
+ done
216
+
217
+ return 1
218
+ }
219
+
220
+ # =============================================================================
221
+ # JSON Validation Functions
222
+ # =============================================================================
223
+
224
+ # Validate that a file contains valid JSON
225
+ # Usage: validate_json "$file"
226
+ # Returns: 0=valid, 1=invalid, 2=skipped (no tools)
227
+ validate_json() {
228
+ local file="$1"
229
+
230
+ if [[ ! -f "$file" ]]; then
231
+ error "File not found: $file"
232
+ return 1
233
+ fi
234
+
235
+ if command_exists "jq"; then
236
+ if jq empty "$file" 2>/dev/null; then
237
+ debug "JSON syntax valid (jq): $file"
238
+ return 0
239
+ else
240
+ error "Invalid JSON syntax in: $file"
241
+ return 1
242
+ fi
243
+ elif command_exists "python3"; then
244
+ if python3 -c "import json; json.load(open('$file'))" 2>/dev/null; then
245
+ debug "JSON syntax valid (python3): $file"
246
+ return 0
247
+ else
248
+ error "Invalid JSON syntax in: $file"
249
+ return 1
250
+ fi
251
+ elif command_exists "node"; then
252
+ if node -e "JSON.parse(require('fs').readFileSync('$file'))" 2>/dev/null; then
253
+ debug "JSON syntax valid (node): $file"
254
+ return 0
255
+ else
256
+ error "Invalid JSON syntax in: $file"
257
+ return 1
258
+ fi
259
+ else
260
+ warn "No JSON parser available (jq, python3, node)"
261
+ return 2
262
+ fi
263
+ }
264
+
265
+ # =============================================================================
266
+ # JSON Schema Validation Functions
267
+ # =============================================================================
268
+
269
+ # Validate data against JSON Schema with graceful degradation
270
+ # Usage: validate_json_schema "$schema_path" "$data_path"
271
+ # Returns: 0=valid, 1=invalid, 2=skipped (no validator available)
272
+ validate_json_schema() {
273
+ local schema_path="$1"
274
+ local data_path="$2"
275
+
276
+ if [[ ! -f "$schema_path" ]]; then
277
+ error "Schema file not found: $schema_path"
278
+ return 1
279
+ fi
280
+
281
+ if [[ ! -f "$data_path" ]]; then
282
+ error "Data file not found: $data_path"
283
+ return 1
284
+ fi
285
+
286
+ # First, validate both files are valid JSON
287
+ if ! validate_json "$schema_path"; then
288
+ error "Schema file is not valid JSON: $schema_path"
289
+ return 1
290
+ fi
291
+
292
+ if ! validate_json "$data_path"; then
293
+ error "Data file is not valid JSON: $data_path"
294
+ return 1
295
+ fi
296
+
297
+ # Try multiple JSON schema validators in order of preference
298
+ if command_exists "ajv"; then
299
+ debug "Using ajv for schema validation"
300
+ local result
301
+ result=$(ajv validate -s "$schema_path" -d "$data_path" 2>&1)
302
+ local status=$?
303
+ if [[ $status -eq 0 ]]; then
304
+ debug "Schema validation passed (ajv)"
305
+ return 0
306
+ else
307
+ error "Schema validation failed (ajv): $result"
308
+ return 1
309
+ fi
310
+ elif command_exists "jsonschema"; then
311
+ debug "Using jsonschema CLI for validation"
312
+ local result
313
+ result=$(jsonschema -i "$data_path" "$schema_path" 2>&1)
314
+ local status=$?
315
+ if [[ $status -eq 0 ]]; then
316
+ debug "Schema validation passed (jsonschema)"
317
+ return 0
318
+ else
319
+ error "Schema validation failed (jsonschema): $result"
320
+ return 1
321
+ fi
322
+ elif command_exists "python3"; then
323
+ debug "Attempting Python jsonschema validation"
324
+ local result
325
+ result=$(python3 -c "
326
+ import json
327
+ import sys
328
+ try:
329
+ from jsonschema import validate, ValidationError, Draft202012Validator
330
+ with open('$schema_path') as f:
331
+ schema = json.load(f)
332
+ with open('$data_path') as f:
333
+ data = json.load(f)
334
+ # Use Draft 2020-12 for modern schemas
335
+ try:
336
+ Draft202012Validator.check_schema(schema)
337
+ validate(instance=data, schema=schema, cls=Draft202012Validator)
338
+ except:
339
+ # Fallback to default validator
340
+ validate(instance=data, schema=schema)
341
+ print('Schema validation passed')
342
+ sys.exit(0)
343
+ except ImportError:
344
+ print('SKIP: Python jsonschema not installed')
345
+ sys.exit(2)
346
+ except ValidationError as e:
347
+ print(f'FAIL: {e.message}')
348
+ if e.path:
349
+ print(f' Path: {\".\".join(str(p) for p in e.path)}')
350
+ sys.exit(1)
351
+ except Exception as e:
352
+ print(f'ERROR: {e}')
353
+ sys.exit(1)
354
+ " 2>&1)
355
+ local status=$?
356
+ case $status in
357
+ 0) debug "Schema validation passed (python3)"; return 0 ;;
358
+ 2) warn "Python jsonschema not installed, skipping schema validation"; return 2 ;;
359
+ *) error "Schema validation failed (python3): $result"; return 1 ;;
360
+ esac
361
+ else
362
+ warn "No JSON schema validator available (ajv, jsonschema, python3+jsonschema)"
363
+ return 2 # Skip
364
+ fi
365
+ }
366
+
367
+ # Validate schema file itself is a valid JSON Schema
368
+ # Usage: validate_schema_syntax "$schema_path"
369
+ # Returns: 0=valid, 1=invalid, 2=skipped
370
+ validate_schema_syntax() {
371
+ local schema_path="$1"
372
+
373
+ if [[ ! -f "$schema_path" ]]; then
374
+ error "Schema file not found: $schema_path"
375
+ return 1
376
+ fi
377
+
378
+ # First check it's valid JSON
379
+ if ! validate_json "$schema_path"; then
380
+ return 1
381
+ fi
382
+
383
+ # Check for required schema fields
384
+ local has_schema has_type
385
+ has_schema=$(json_get "$schema_path" '."$schema"')
386
+ has_type=$(json_get "$schema_path" '.type')
387
+
388
+ if [[ -z "$has_schema" ]] && [[ -z "$has_type" ]]; then
389
+ warn "Schema file may not be a valid JSON Schema (missing \$schema and type)"
390
+ return 0 # Still allow as it might be valid
391
+ fi
392
+
393
+ debug "Schema file appears valid: $schema_path"
394
+ return 0
395
+ }
396
+
397
+ # =============================================================================
398
+ # JSON Parsing Functions
399
+ # =============================================================================
400
+
401
+ json_get() {
402
+ local json_file="$1"
403
+ local path="$2"
404
+
405
+ if command_exists "jq"; then
406
+ jq -r "$path" "$json_file" 2>/dev/null
407
+ elif command_exists "python3"; then
408
+ python3 -c "
409
+ import json
410
+ import sys
411
+ with open('$json_file') as f:
412
+ data = json.load(f)
413
+ path = '$path'.strip('.')
414
+ for key in path.split('.'):
415
+ if key.startswith('[') and key.endswith(']'):
416
+ idx = int(key[1:-1])
417
+ data = data[idx]
418
+ else:
419
+ data = data.get(key, '')
420
+ print(data)
421
+ " 2>/dev/null
422
+ else
423
+ error "No JSON parser available (jq or python3)"
424
+ return 1
425
+ fi
426
+ }
427
+
428
+ json_count() {
429
+ local json_file="$1"
430
+ local path="$2"
431
+
432
+ if command_exists "jq"; then
433
+ jq "$path | length" "$json_file" 2>/dev/null
434
+ elif command_exists "python3"; then
435
+ python3 -c "
436
+ import json
437
+ with open('$json_file') as f:
438
+ data = json.load(f)
439
+ path = '$path'.strip('.')
440
+ for key in path.split('.'):
441
+ if key:
442
+ data = data.get(key, [])
443
+ print(len(data) if isinstance(data, list) else 0)
444
+ " 2>/dev/null
445
+ else
446
+ return 1
447
+ fi
448
+ }
449
+
450
+ # =============================================================================
451
+ # Content Validation Functions
452
+ # =============================================================================
453
+
454
+ # Check if content contains ALL specified terms (case-insensitive)
455
+ # Usage: contains_all "$content" "term1" "term2" "term3"
456
+ # Returns: 0 if all found, 1 if any missing
457
+ contains_all() {
458
+ local content="$1"
459
+ shift
460
+ local terms=("$@")
461
+ local missing=()
462
+
463
+ for term in "${terms[@]}"; do
464
+ if ! grep -qi "$term" <<< "$content"; then
465
+ missing+=("$term")
466
+ fi
467
+ done
468
+
469
+ if [[ ${#missing[@]} -gt 0 ]]; then
470
+ debug "Missing required terms: ${missing[*]}"
471
+ return 1
472
+ fi
473
+
474
+ return 0
475
+ }
476
+
477
+ # Check if content contains NONE of the specified terms (case-insensitive)
478
+ # Usage: contains_none "$content" "forbidden1" "forbidden2"
479
+ # Returns: 0 if none found, 1 if any found
480
+ contains_none() {
481
+ local content="$1"
482
+ shift
483
+ local terms=("$@")
484
+ local found=()
485
+
486
+ for term in "${terms[@]}"; do
487
+ if grep -qi "$term" <<< "$content"; then
488
+ found+=("$term")
489
+ fi
490
+ done
491
+
492
+ if [[ ${#found[@]} -gt 0 ]]; then
493
+ debug "Found forbidden terms: ${found[*]}"
494
+ return 1
495
+ fi
496
+
497
+ return 0
498
+ }
499
+
500
+ # Check if content matches a regex pattern
501
+ # Usage: matches_regex "$content" "pattern"
502
+ # Returns: 0 if matches, 1 if not
503
+ matches_regex() {
504
+ local content="$1"
505
+ local pattern="$2"
506
+
507
+ grep -qE "$pattern" <<< "$content"
508
+ }
509
+
510
+ # Check if a JSON field contains expected value
511
+ # Usage: field_equals "$file" ".status" "success"
512
+ # Returns: 0 if matches, 1 if not
513
+ field_equals() {
514
+ local file="$1"
515
+ local path="$2"
516
+ local expected="$3"
517
+
518
+ local actual
519
+ actual=$(json_get "$file" "$path")
520
+
521
+ if [[ "$actual" == "$expected" ]]; then
522
+ debug "Field $path equals expected: $expected"
523
+ return 0
524
+ else
525
+ debug "Field $path: expected '$expected', got '$actual'"
526
+ return 1
527
+ fi
528
+ }
529
+
530
+ # Check if a JSON array field has minimum count
531
+ # Usage: array_min_count "$file" ".findings" 1
532
+ # Returns: 0 if count >= min, 1 if less
533
+ array_min_count() {
534
+ local file="$1"
535
+ local path="$2"
536
+ local min="${3:-1}"
537
+
538
+ local count
539
+ count=$(json_count "$file" "$path")
540
+
541
+ if [[ -z "$count" ]] || [[ "$count" == "null" ]]; then
542
+ count=0
543
+ fi
544
+
545
+ if [[ "$count" -ge "$min" ]]; then
546
+ debug "Array $path has $count items (>= $min)"
547
+ return 0
548
+ else
549
+ debug "Array $path has $count items (< $min required)"
550
+ return 1
551
+ fi
552
+ }
553
+
554
+ # Validate enum value is in allowed list
555
+ # Usage: validate_enum "$value" "success" "partial" "failed"
556
+ # Returns: 0 if valid, 1 if not
557
+ validate_enum() {
558
+ local value="$1"
559
+ shift
560
+ local allowed=("$@")
561
+
562
+ for v in "${allowed[@]}"; do
563
+ if [[ "$value" == "$v" ]]; then
564
+ return 0
565
+ fi
566
+ done
567
+
568
+ debug "Invalid enum value: '$value' (allowed: ${allowed[*]})"
569
+ return 1
570
+ }
571
+
572
+ # =============================================================================
573
+ # Result Output Functions
574
+ # =============================================================================
575
+
576
+ output_result() {
577
+ local status="$1"
578
+ local message="$2"
579
+ local details="${3:-}"
580
+
581
+ local timestamp
582
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
583
+
584
+ if command_exists "jq"; then
585
+ jq -n \
586
+ --arg status "$status" \
587
+ --arg message "$message" \
588
+ --arg details "$details" \
589
+ --arg timestamp "$timestamp" \
590
+ --arg version "$AQE_VALIDATOR_VERSION" \
591
+ '{
592
+ status: $status,
593
+ message: $message,
594
+ details: $details,
595
+ timestamp: $timestamp,
596
+ validatorVersion: $version
597
+ }'
598
+ else
599
+ cat <<EOF
600
+ {
601
+ "status": "$status",
602
+ "message": "$message",
603
+ "details": "$details",
604
+ "timestamp": "$timestamp",
605
+ "validatorVersion": "$AQE_VALIDATOR_VERSION"
606
+ }
607
+ EOF
608
+ fi
609
+ }
610
+
611
+ output_validation_report() {
612
+ local skill_name="$1"
613
+ local schema_status="$2"
614
+ local content_status="$3"
615
+ local tool_status="$4"
616
+
617
+ local timestamp
618
+ timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
619
+
620
+ local overall_status="passed"
621
+ if [[ "$schema_status" == "failed" ]] || [[ "$content_status" == "failed" ]] || [[ "$tool_status" == "failed" ]]; then
622
+ overall_status="failed"
623
+ elif [[ "$schema_status" == "skipped" ]] || [[ "$content_status" == "skipped" ]] || [[ "$tool_status" == "skipped" ]]; then
624
+ overall_status="partial"
625
+ fi
626
+
627
+ if command_exists "jq"; then
628
+ jq -n \
629
+ --arg skill "$skill_name" \
630
+ --arg overall "$overall_status" \
631
+ --arg schema "$schema_status" \
632
+ --arg content "$content_status" \
633
+ --arg tools "$tool_status" \
634
+ --arg timestamp "$timestamp" \
635
+ '{
636
+ skillName: $skill,
637
+ overallStatus: $overall,
638
+ validations: {
639
+ schema: $schema,
640
+ content: $content,
641
+ tools: $tools
642
+ },
643
+ timestamp: $timestamp
644
+ }'
645
+ else
646
+ cat <<EOF
647
+ {
648
+ "skillName": "$skill_name",
649
+ "overallStatus": "$overall_status",
650
+ "validations": {
651
+ "schema": "$schema_status",
652
+ "content": "$content_status",
653
+ "tools": "$tool_status"
654
+ },
655
+ "timestamp": "$timestamp"
656
+ }
657
+ EOF
658
+ fi
659
+ }
660
+
661
+ # =============================================================================
662
+ # File Handling Functions
663
+ # =============================================================================
664
+
665
+ get_file_extension() {
666
+ local file="$1"
667
+ echo "${file##*.}"
668
+ }
669
+
670
+ is_json_file() {
671
+ local file="$1"
672
+ [[ "$(get_file_extension "$file")" == "json" ]]
673
+ }
674
+
675
+ is_yaml_file() {
676
+ local file="$1"
677
+ local ext
678
+ ext=$(get_file_extension "$file")
679
+ [[ "$ext" == "yaml" ]] || [[ "$ext" == "yml" ]]
680
+ }
681
+
682
+ ensure_json() {
683
+ local file="$1"
684
+ local output="${2:-/tmp/converted.json}"
685
+
686
+ if is_json_file "$file"; then
687
+ cat "$file" > "$output"
688
+ return 0
689
+ elif is_yaml_file "$file"; then
690
+ if command_exists "yq"; then
691
+ yq -o json "$file" > "$output"
692
+ return $?
693
+ elif command_exists "python3"; then
694
+ python3 -c "
695
+ import yaml
696
+ import json
697
+ import sys
698
+ with open('$file') as f:
699
+ data = yaml.safe_load(f)
700
+ with open('$output', 'w') as f:
701
+ json.dump(data, f, indent=2)
702
+ " 2>/dev/null
703
+ return $?
704
+ else
705
+ error "Cannot convert YAML to JSON (need yq or python3+pyyaml)"
706
+ return 1
707
+ fi
708
+ else
709
+ error "Unknown file format: $file"
710
+ return 1
711
+ fi
712
+ }
713
+
714
+ # =============================================================================
715
+ # Self-Test Function
716
+ # =============================================================================
717
+
718
+ # Run comprehensive self-test of validator library
719
+ # Usage: run_self_test [--verbose]
720
+ # Returns: 0 if all tests pass, 1 if any fail
721
+ run_self_test() {
722
+ local verbose=false
723
+ [[ "${1:-}" == "--verbose" ]] && verbose=true
724
+
725
+ info "Running validator library self-test (v$AQE_VALIDATOR_VERSION)..."
726
+ echo ""
727
+
728
+ local tests_passed=0
729
+ local tests_failed=0
730
+ local tests_skipped=0
731
+
732
+ # Create temporary test files
733
+ local temp_dir
734
+ temp_dir=$(mktemp -d)
735
+ local test_json="$temp_dir/test.json"
736
+ local test_schema="$temp_dir/schema.json"
737
+ local invalid_json="$temp_dir/invalid.json"
738
+
739
+ # Create valid test JSON
740
+ cat > "$test_json" << 'EOF'
741
+ {
742
+ "skillName": "test-skill",
743
+ "version": "1.0.0",
744
+ "timestamp": "2026-02-02T12:00:00Z",
745
+ "status": "success",
746
+ "output": {
747
+ "summary": "Test output",
748
+ "findings": []
749
+ }
750
+ }
751
+ EOF
752
+
753
+ # Create test schema (using draft-07 for broader ajv compatibility)
754
+ cat > "$test_schema" << 'EOF'
755
+ {
756
+ "$schema": "http://json-schema.org/draft-07/schema#",
757
+ "type": "object",
758
+ "required": ["skillName", "status"],
759
+ "properties": {
760
+ "skillName": { "type": "string" },
761
+ "status": { "type": "string", "enum": ["success", "partial", "failed"] }
762
+ }
763
+ }
764
+ EOF
765
+
766
+ # Create invalid JSON
767
+ echo "{ invalid json" > "$invalid_json"
768
+
769
+ echo "=== Tool Detection Tests ==="
770
+
771
+ # Test command_exists
772
+ if command_exists "bash"; then
773
+ ((tests_passed++)) || true
774
+ success "command_exists('bash'): found"
775
+ else
776
+ ((tests_failed++)) || true
777
+ error "command_exists('bash'): not found"
778
+ fi
779
+
780
+ if ! command_exists "nonexistent_tool_xyz"; then
781
+ ((tests_passed++)) || true
782
+ success "command_exists('nonexistent'): correctly not found"
783
+ else
784
+ ((tests_failed++)) || true
785
+ error "command_exists('nonexistent'): incorrectly found"
786
+ fi
787
+
788
+ echo ""
789
+ echo "=== Logging Tests ==="
790
+
791
+ # Test logging functions (suppress output)
792
+ if info "Test info" >/dev/null 2>&1; then
793
+ ((tests_passed++)) || true
794
+ success "info(): works"
795
+ else
796
+ ((tests_failed++)) || true
797
+ error "info(): failed"
798
+ fi
799
+
800
+ if warn "Test warn" >/dev/null 2>&1; then
801
+ ((tests_passed++)) || true
802
+ success "warn(): works"
803
+ else
804
+ ((tests_failed++)) || true
805
+ error "warn(): failed"
806
+ fi
807
+
808
+ echo ""
809
+ echo "=== JSON Validation Tests ==="
810
+
811
+ # Test validate_json
812
+ if validate_json "$test_json" 2>/dev/null; then
813
+ ((tests_passed++)) || true
814
+ success "validate_json(valid): passed"
815
+ else
816
+ ((tests_failed++)) || true
817
+ error "validate_json(valid): failed"
818
+ fi
819
+
820
+ if ! validate_json "$invalid_json" 2>/dev/null; then
821
+ ((tests_passed++)) || true
822
+ success "validate_json(invalid): correctly rejected"
823
+ else
824
+ ((tests_failed++)) || true
825
+ error "validate_json(invalid): incorrectly accepted"
826
+ fi
827
+
828
+ echo ""
829
+ echo "=== JSON Parsing Tests ==="
830
+
831
+ # Test json_get
832
+ local skill_name
833
+ skill_name=$(json_get "$test_json" ".skillName" 2>/dev/null)
834
+ if [[ "$skill_name" == "test-skill" ]]; then
835
+ ((tests_passed++)) || true
836
+ success "json_get('.skillName'): got '$skill_name'"
837
+ else
838
+ ((tests_failed++)) || true
839
+ error "json_get('.skillName'): expected 'test-skill', got '$skill_name'"
840
+ fi
841
+
842
+ # Test json_count
843
+ local count
844
+ count=$(json_count "$test_json" ".output.findings" 2>/dev/null)
845
+ if [[ "$count" == "0" ]]; then
846
+ ((tests_passed++)) || true
847
+ success "json_count('.output.findings'): got $count"
848
+ else
849
+ ((tests_failed++)) || true
850
+ error "json_count('.output.findings'): expected 0, got '$count'"
851
+ fi
852
+
853
+ echo ""
854
+ echo "=== Content Validation Tests ==="
855
+
856
+ # Test contains_all
857
+ if contains_all "hello world" "hello" "world"; then
858
+ ((tests_passed++)) || true
859
+ success "contains_all('hello world', 'hello', 'world'): passed"
860
+ else
861
+ ((tests_failed++)) || true
862
+ error "contains_all: failed"
863
+ fi
864
+
865
+ if ! contains_all "hello world" "hello" "foo"; then
866
+ ((tests_passed++)) || true
867
+ success "contains_all('hello world', 'hello', 'foo'): correctly failed"
868
+ else
869
+ ((tests_failed++)) || true
870
+ error "contains_all: should have failed with 'foo'"
871
+ fi
872
+
873
+ # Test contains_none
874
+ if contains_none "hello world" "foo" "bar"; then
875
+ ((tests_passed++)) || true
876
+ success "contains_none('hello world', 'foo', 'bar'): passed"
877
+ else
878
+ ((tests_failed++)) || true
879
+ error "contains_none: failed"
880
+ fi
881
+
882
+ if ! contains_none "hello world" "hello" "bar"; then
883
+ ((tests_passed++)) || true
884
+ success "contains_none('hello world', 'hello', 'bar'): correctly failed"
885
+ else
886
+ ((tests_failed++)) || true
887
+ error "contains_none: should have failed with 'hello'"
888
+ fi
889
+
890
+ # Test validate_enum
891
+ if validate_enum "success" "success" "partial" "failed"; then
892
+ ((tests_passed++)) || true
893
+ success "validate_enum('success'): passed"
894
+ else
895
+ ((tests_failed++)) || true
896
+ error "validate_enum('success'): failed"
897
+ fi
898
+
899
+ if ! validate_enum "invalid" "success" "partial" "failed"; then
900
+ ((tests_passed++)) || true
901
+ success "validate_enum('invalid'): correctly rejected"
902
+ else
903
+ ((tests_failed++)) || true
904
+ error "validate_enum('invalid'): should have failed"
905
+ fi
906
+
907
+ echo ""
908
+ echo "=== Schema Validation Tests ==="
909
+
910
+ # Test schema validation (may skip if no validator)
911
+ local schema_result
912
+ schema_result=$(validate_json_schema "$test_schema" "$test_json" 2>&1)
913
+ local schema_status=$?
914
+
915
+ case $schema_status in
916
+ 0)
917
+ ((tests_passed++)) || true
918
+ success "validate_json_schema(): passed"
919
+ ;;
920
+ 2)
921
+ ((tests_skipped++)) || true
922
+ warn "validate_json_schema(): skipped (no validator available)"
923
+ ;;
924
+ *)
925
+ ((tests_failed++)) || true
926
+ error "validate_json_schema(): failed - $schema_result"
927
+ ;;
928
+ esac
929
+
930
+ echo ""
931
+ echo "=== Output Functions Tests ==="
932
+
933
+ # Test output_result
934
+ local result
935
+ result=$(output_result "passed" "Self-test complete" "details here" 2>/dev/null)
936
+ if [[ -n "$result" ]] && echo "$result" | validate_json /dev/stdin 2>/dev/null; then
937
+ ((tests_passed++)) || true
938
+ success "output_result(): generates valid JSON"
939
+ elif [[ -n "$result" ]]; then
940
+ ((tests_passed++)) || true
941
+ success "output_result(): generates output"
942
+ else
943
+ ((tests_failed++)) || true
944
+ error "output_result(): failed"
945
+ fi
946
+
947
+ # Test output_validation_report
948
+ local report
949
+ report=$(output_validation_report "test-skill" "passed" "passed" "passed" 2>/dev/null)
950
+ if [[ -n "$report" ]]; then
951
+ ((tests_passed++)) || true
952
+ success "output_validation_report(): generates output"
953
+ else
954
+ ((tests_failed++)) || true
955
+ error "output_validation_report(): failed"
956
+ fi
957
+
958
+ # Cleanup
959
+ rm -rf "$temp_dir"
960
+
961
+ echo ""
962
+ echo "=============================================="
963
+ info "Self-test complete:"
964
+ echo " Passed: $tests_passed"
965
+ echo " Failed: $tests_failed"
966
+ echo " Skipped: $tests_skipped"
967
+ echo "=============================================="
968
+
969
+ if [[ $tests_failed -gt 0 ]]; then
970
+ error "Self-test FAILED"
971
+ return 1
972
+ fi
973
+
974
+ success "Self-test PASSED"
975
+ return 0
976
+ }
977
+
978
+ # List available validation tools and their versions
979
+ # Usage: list_available_tools
980
+ list_available_tools() {
981
+ info "Checking available validation tools..."
982
+ echo ""
983
+
984
+ local tools=("jq" "ajv" "jsonschema" "python3" "node" "yq")
985
+
986
+ for tool in "${tools[@]}"; do
987
+ if command_exists "$tool"; then
988
+ local version=""
989
+ case "$tool" in
990
+ jq) version=$($tool --version 2>&1 | head -1) ;;
991
+ ajv) version=$($tool --version 2>&1 | head -1) ;;
992
+ python3) version=$($tool --version 2>&1 | head -1) ;;
993
+ node) version=$($tool --version 2>&1 | head -1) ;;
994
+ yq) version=$($tool --version 2>&1 | head -1) ;;
995
+ *) version="installed" ;;
996
+ esac
997
+ success "$tool: $version"
998
+ else
999
+ warn "$tool: not installed"
1000
+ fi
1001
+ done
1002
+
1003
+ # Check for Python jsonschema module
1004
+ if command_exists "python3"; then
1005
+ if python3 -c "import jsonschema" 2>/dev/null; then
1006
+ local py_version
1007
+ py_version=$(python3 -c "import jsonschema; print(jsonschema.__version__)" 2>/dev/null)
1008
+ success "python3 jsonschema module: $py_version"
1009
+ else
1010
+ warn "python3 jsonschema module: not installed"
1011
+ fi
1012
+ fi
1013
+
1014
+ echo ""
1015
+ }
1016
+
1017
+ # Run self-test if script is executed directly
1018
+ if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
1019
+ case "${1:-}" in
1020
+ --list-tools)
1021
+ list_available_tools
1022
+ ;;
1023
+ --version)
1024
+ echo "AQE Validator Library v$AQE_VALIDATOR_VERSION"
1025
+ ;;
1026
+ *)
1027
+ run_self_test "$@"
1028
+ ;;
1029
+ esac
1030
+ exit $?
1031
+ fi