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,1107 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # AQE Skill Validator: chaos-engineering-resilience v1.0.0
4
+ # Validates chaos engineering skill output per ADR-056
5
+ # =============================================================================
6
+ #
7
+ # This validator checks:
8
+ # 1. JSON schema compliance (chaos experiment types, fault injection, steady-state)
9
+ # 2. Required chaos tools availability (kubectl, litmus, gremlin)
10
+ # 3. Experiment structure and completeness
11
+ # 4. Steady-state hypothesis validation
12
+ # 5. Blast radius and safety controls
13
+ # 6. Chaos-specific content validation
14
+ #
15
+ # Usage: ./validate.sh <output-file> [options]
16
+ #
17
+ # Options:
18
+ # --self-test Run validator self-test mode
19
+ # --verbose Enable verbose output
20
+ # --json Output results as JSON only
21
+ # --list-tools Show available validation tools
22
+ # --help Show this help message
23
+ #
24
+ # Exit Codes:
25
+ # 0 - Validation passed
26
+ # 1 - Validation failed
27
+ # 2 - Validation skipped (missing required tools)
28
+ #
29
+ # =============================================================================
30
+
31
+ set -euo pipefail
32
+
33
+ # Get script directory
34
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
35
+
36
+ # Navigate to skill directory and project root
37
+ # scripts/ -> chaos-engineering-resilience/ -> skills/ -> .claude/ -> project root
38
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
39
+ PROJECT_ROOT="$(cd "$SKILL_DIR/../../.." && pwd)"
40
+
41
+ # Source validator library - check multiple locations
42
+ VALIDATOR_LIB=""
43
+ for lib_path in \
44
+ "$PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh" \
45
+ "$SKILL_DIR/scripts/validator-lib.sh" \
46
+ "$SCRIPT_DIR/validator-lib.sh"; do
47
+ if [[ -f "$lib_path" ]]; then
48
+ VALIDATOR_LIB="$lib_path"
49
+ break
50
+ fi
51
+ done
52
+
53
+ if [[ -n "$VALIDATOR_LIB" ]]; then
54
+ # shellcheck source=/dev/null
55
+ source "$VALIDATOR_LIB"
56
+ else
57
+ echo "ERROR: Validator library not found"
58
+ echo "Searched:"
59
+ echo " - $PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh"
60
+ echo " - $SKILL_DIR/scripts/validator-lib.sh"
61
+ echo " - $SCRIPT_DIR/validator-lib.sh"
62
+ exit 1
63
+ fi
64
+
65
+ # =============================================================================
66
+ # SKILL-SPECIFIC CONFIGURATION
67
+ # =============================================================================
68
+
69
+ # Skill name and version
70
+ SKILL_NAME="chaos-engineering-resilience"
71
+ SKILL_VERSION="1.0.0"
72
+
73
+ # Required tools (validation FAILS with exit 2 if missing)
74
+ # jq is essential for JSON parsing
75
+ REQUIRED_TOOLS=("jq")
76
+
77
+ # Optional tools (validation continues with warnings if missing)
78
+ # These enhance chaos engineering capabilities
79
+ OPTIONAL_TOOLS=("chaos" "litmus" "gremlin" "kubectl" "node" "ajv" "jsonschema" "python3")
80
+
81
+ # Path to output JSON schema
82
+ SCHEMA_PATH="$SKILL_DIR/schemas/output.json"
83
+
84
+ # Path to sample test data for self-test
85
+ SAMPLE_OUTPUT_PATH="$PROJECT_ROOT/.claude/skills/.validation/examples/chaos-engineering-output.example.json"
86
+
87
+ # =============================================================================
88
+ # CONTENT VALIDATION CONFIGURATION
89
+ # =============================================================================
90
+
91
+ # Required fields in output
92
+ REQUIRED_FIELDS=("skillName" "status" "output" "output.summary" "output.experiments" "output.resilienceScore")
93
+
94
+ # Fields that must have non-null, non-empty values
95
+ REQUIRED_NON_EMPTY_FIELDS=("output.summary")
96
+
97
+ # Chaos-specific terms that MUST appear in output
98
+ MUST_CONTAIN_TERMS=("chaos" "experiment" "resilience")
99
+
100
+ # Terms that must NOT appear in output (indicates failure/hallucination)
101
+ MUST_NOT_CONTAIN_TERMS=("TODO" "placeholder" "FIXME")
102
+
103
+ # Enum validations
104
+ ENUM_VALIDATIONS=(
105
+ ".status:success,partial,failed,skipped"
106
+ )
107
+
108
+ # Minimum array lengths
109
+ MIN_ARRAY_LENGTHS=(
110
+ ".output.experiments:1"
111
+ )
112
+
113
+ # =============================================================================
114
+ # Argument Parsing
115
+ # =============================================================================
116
+
117
+ OUTPUT_FILE=""
118
+ SELF_TEST=false
119
+ VERBOSE=false
120
+ JSON_ONLY=false
121
+ LIST_TOOLS=false
122
+
123
+ while [[ $# -gt 0 ]]; do
124
+ case "$1" in
125
+ --self-test)
126
+ SELF_TEST=true
127
+ shift
128
+ ;;
129
+ --verbose|-v)
130
+ VERBOSE=true
131
+ export AQE_DEBUG=1
132
+ shift
133
+ ;;
134
+ --json)
135
+ JSON_ONLY=true
136
+ shift
137
+ ;;
138
+ --list-tools)
139
+ LIST_TOOLS=true
140
+ shift
141
+ ;;
142
+ -h|--help)
143
+ cat << 'HELP_EOF'
144
+ AQE Chaos Engineering Resilience Skill Validator v1.0.0
145
+
146
+ Usage: ./validate.sh <output-file> [options]
147
+ ./validate.sh --self-test [--verbose]
148
+ ./validate.sh --list-tools
149
+
150
+ Arguments:
151
+ <output-file> Path to skill output JSON file to validate
152
+
153
+ Options:
154
+ --self-test Run validator self-test mode
155
+ --verbose, -v Enable verbose/debug output
156
+ --json Output results as JSON only (for CI integration)
157
+ --list-tools Show available validation tools and exit
158
+ --help, -h Show this help message
159
+
160
+ Exit Codes:
161
+ 0 - Validation passed
162
+ 1 - Validation failed
163
+ 2 - Validation skipped (missing required tools)
164
+
165
+ Chaos Tool Requirements:
166
+ Required: jq (JSON parsing)
167
+ Optional: chaos (Chaos Toolkit), litmus (LitmusChaos), gremlin (Gremlin),
168
+ kubectl (Kubernetes), node (Node.js)
169
+
170
+ Examples:
171
+ ./validate.sh chaos-output.json # Validate output file
172
+ ./validate.sh chaos-output.json --json # JSON output for CI
173
+ ./validate.sh --self-test --verbose # Self-test with debug
174
+ ./validate.sh --list-tools # Show available tools
175
+
176
+ HELP_EOF
177
+ exit 0
178
+ ;;
179
+ -*)
180
+ error "Unknown option: $1"
181
+ echo "Use --help for usage information"
182
+ exit 1
183
+ ;;
184
+ *)
185
+ OUTPUT_FILE="$1"
186
+ shift
187
+ ;;
188
+ esac
189
+ done
190
+
191
+ # Handle --list-tools mode
192
+ if [[ "$LIST_TOOLS" == "true" ]]; then
193
+ echo "=============================================="
194
+ echo "Available Validation Tools for $SKILL_NAME"
195
+ echo "=============================================="
196
+ echo ""
197
+ echo "Required tools (validation fails if missing):"
198
+ for tool in "${REQUIRED_TOOLS[@]}"; do
199
+ if command_exists "$tool"; then
200
+ version=$($tool --version 2>&1 | head -1 || echo "installed")
201
+ echo " [OK] $tool - $version"
202
+ else
203
+ echo " [MISSING] $tool"
204
+ fi
205
+ done
206
+ echo ""
207
+ echo "Optional tools (enhances validation):"
208
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
209
+ if command_exists "$tool"; then
210
+ version=""
211
+ case "$tool" in
212
+ chaos) version=$(chaos version 2>&1 | head -1 || echo "installed") ;;
213
+ litmus) version=$(litmusctl version 2>&1 | head -1 || echo "installed") ;;
214
+ gremlin) version=$(gremlin version 2>&1 | head -1 || echo "installed") ;;
215
+ kubectl) version=$(kubectl version --client 2>&1 | head -1 || echo "installed") ;;
216
+ node) version=$(node --version 2>&1 | head -1 || echo "installed") ;;
217
+ python3) version=$(python3 --version 2>&1 | head -1 || echo "installed") ;;
218
+ *) version="installed" ;;
219
+ esac
220
+ echo " [OK] $tool - $version"
221
+ else
222
+ echo " [MISSING] $tool"
223
+ fi
224
+ done
225
+ echo ""
226
+ echo "Chaos Engineering Capabilities:"
227
+ if command_exists "chaos"; then
228
+ echo " [OK] Chaos Toolkit - Chaos experiments and game days"
229
+ else
230
+ echo " [MISSING] Chaos Toolkit - Install: pip install chaostoolkit"
231
+ fi
232
+ if command_exists "litmus" || command_exists "litmusctl"; then
233
+ echo " [OK] LitmusChaos - Kubernetes-native chaos engineering"
234
+ else
235
+ echo " [MISSING] LitmusChaos - Install: https://litmuschaos.io"
236
+ fi
237
+ if command_exists "gremlin"; then
238
+ echo " [OK] Gremlin - Enterprise chaos engineering"
239
+ else
240
+ echo " [MISSING] Gremlin - Install: https://gremlin.com"
241
+ fi
242
+ if command_exists "kubectl"; then
243
+ echo " [OK] kubectl - Kubernetes pod/node manipulation"
244
+ else
245
+ echo " [MISSING] kubectl - Required for Kubernetes chaos"
246
+ fi
247
+ exit 0
248
+ fi
249
+
250
+ # =============================================================================
251
+ # Self-Test Mode
252
+ # =============================================================================
253
+
254
+ if [[ "$SELF_TEST" == "true" ]]; then
255
+ echo "=============================================="
256
+ info "Running $SKILL_NAME Validator Self-Test"
257
+ echo "=============================================="
258
+ echo ""
259
+ echo "Validator version: $AQE_VALIDATOR_VERSION"
260
+ echo "Skill version: $SKILL_VERSION"
261
+ echo ""
262
+
263
+ self_test_passed=true
264
+ self_test_warnings=0
265
+
266
+ # Step 1: Check Required Tools
267
+ echo "--- Step 1: Required Tools ---"
268
+ for tool in "${REQUIRED_TOOLS[@]}"; do
269
+ if command_exists "$tool"; then
270
+ success "Required tool available: $tool"
271
+ else
272
+ error "Required tool MISSING: $tool"
273
+ self_test_passed=false
274
+ fi
275
+ done
276
+ echo ""
277
+
278
+ # Step 2: Check Optional Chaos Tools
279
+ echo "--- Step 2: Chaos Engineering Tools ---"
280
+ chaos_tools=("chaos" "litmus" "litmusctl" "gremlin" "kubectl")
281
+ available_chaos=0
282
+ for tool in "${chaos_tools[@]}"; do
283
+ if command_exists "$tool"; then
284
+ success "Chaos tool available: $tool"
285
+ ((available_chaos++)) || true
286
+ else
287
+ warn "Chaos tool missing: $tool"
288
+ ((self_test_warnings++)) || true
289
+ fi
290
+ done
291
+
292
+ if [[ $available_chaos -eq 0 ]]; then
293
+ warn "No chaos engineering tools available - limited experiment execution"
294
+ ((self_test_warnings++)) || true
295
+ fi
296
+ echo ""
297
+
298
+ # Step 3: Check Schema File
299
+ echo "--- Step 3: Schema File ---"
300
+ if [[ -f "$SCHEMA_PATH" ]]; then
301
+ success "Schema file exists: $SCHEMA_PATH"
302
+ if validate_json "$SCHEMA_PATH" 2>/dev/null; then
303
+ success "Schema file is valid JSON"
304
+
305
+ # Check for chaos-specific schema elements
306
+ if grep -q "chaosExperiment" "$SCHEMA_PATH" 2>/dev/null; then
307
+ success "Schema includes chaos experiment definition"
308
+ else
309
+ warn "Schema may be missing chaos experiment definition"
310
+ ((self_test_warnings++)) || true
311
+ fi
312
+
313
+ if grep -q "steadyStateHypothesis" "$SCHEMA_PATH" 2>/dev/null; then
314
+ success "Schema includes steady-state hypothesis"
315
+ else
316
+ warn "Schema may be missing steady-state hypothesis"
317
+ ((self_test_warnings++)) || true
318
+ fi
319
+
320
+ if grep -q "blastRadius" "$SCHEMA_PATH" 2>/dev/null; then
321
+ success "Schema includes blast radius controls"
322
+ else
323
+ warn "Schema may be missing blast radius controls"
324
+ ((self_test_warnings++)) || true
325
+ fi
326
+ else
327
+ error "Schema file is NOT valid JSON"
328
+ self_test_passed=false
329
+ fi
330
+ else
331
+ error "Schema file not found: $SCHEMA_PATH"
332
+ self_test_passed=false
333
+ fi
334
+ echo ""
335
+
336
+ # Step 4: Test with Sample Data
337
+ echo "--- Step 4: Sample Data Validation ---"
338
+ if [[ -f "$SAMPLE_OUTPUT_PATH" ]]; then
339
+ success "Sample output file exists"
340
+
341
+ if validate_json "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
342
+ success "Sample output is valid JSON"
343
+
344
+ # Test chaos-specific validation
345
+ if validate_chaos_experiments "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
346
+ success "Sample output has valid chaos experiments"
347
+ else
348
+ warn "Sample output chaos validation issue"
349
+ ((self_test_warnings++)) || true
350
+ fi
351
+ else
352
+ error "Sample output is NOT valid JSON"
353
+ self_test_passed=false
354
+ fi
355
+ else
356
+ info "No sample output file found at: $SAMPLE_OUTPUT_PATH"
357
+ info "Skipping sample data validation"
358
+ fi
359
+ echo ""
360
+
361
+ # Step 5: Library Self-Test
362
+ echo "--- Step 5: Validator Library Self-Test ---"
363
+ if run_self_test 2>/dev/null; then
364
+ success "Library self-test passed"
365
+ else
366
+ error "Library self-test FAILED"
367
+ self_test_passed=false
368
+ fi
369
+ echo ""
370
+
371
+ # Summary
372
+ echo "=============================================="
373
+ echo "Self-Test Summary for $SKILL_NAME"
374
+ echo "=============================================="
375
+
376
+ if [[ "$self_test_passed" == "true" ]]; then
377
+ if [[ $self_test_warnings -gt 0 ]]; then
378
+ warn "Self-test PASSED with $self_test_warnings warning(s)"
379
+ exit 0
380
+ else
381
+ success "Self-test PASSED"
382
+ exit 0
383
+ fi
384
+ else
385
+ error "Self-test FAILED"
386
+ exit 1
387
+ fi
388
+ fi
389
+
390
+ # =============================================================================
391
+ # SKILL-SPECIFIC VALIDATION FUNCTIONS
392
+ # =============================================================================
393
+
394
+ # Validate chaos experiments structure
395
+ # Returns: 0 if valid, 1 if invalid
396
+ validate_chaos_experiments() {
397
+ local output_file="$1"
398
+
399
+ # Check experiments array exists
400
+ local experiments_data
401
+ experiments_data=$(json_get "$output_file" ".output.experiments" 2>/dev/null)
402
+
403
+ if [[ -z "$experiments_data" ]] || [[ "$experiments_data" == "null" ]]; then
404
+ warn "Missing experiments array in output"
405
+ return 1
406
+ fi
407
+
408
+ local experiment_count
409
+ experiment_count=$(json_count "$output_file" ".output.experiments" 2>/dev/null)
410
+
411
+ if [[ -z "$experiment_count" ]] || [[ "$experiment_count" == "null" ]] || [[ "$experiment_count" -lt 1 ]]; then
412
+ error "No chaos experiments found in output"
413
+ return 1
414
+ fi
415
+
416
+ debug "Found $experiment_count chaos experiments"
417
+
418
+ # Validate first experiment structure
419
+ local first_id first_type first_result
420
+ first_id=$(json_get "$output_file" ".output.experiments[0].id" 2>/dev/null)
421
+ first_type=$(json_get "$output_file" ".output.experiments[0].type" 2>/dev/null)
422
+ first_result=$(json_get "$output_file" ".output.experiments[0].result" 2>/dev/null)
423
+
424
+ if [[ -z "$first_id" ]] || [[ "$first_id" == "null" ]]; then
425
+ error "Experiment missing 'id' field"
426
+ return 1
427
+ fi
428
+
429
+ if [[ -z "$first_type" ]] || [[ "$first_type" == "null" ]]; then
430
+ error "Experiment missing 'type' field"
431
+ return 1
432
+ fi
433
+
434
+ # Validate type is valid enum
435
+ if ! validate_enum "$first_type" "network" "resource" "state" "application" "infrastructure" "byzantine"; then
436
+ error "Experiment has invalid type: $first_type"
437
+ return 1
438
+ fi
439
+
440
+ if [[ -z "$first_result" ]] || [[ "$first_result" == "null" ]]; then
441
+ error "Experiment missing 'result' field"
442
+ return 1
443
+ fi
444
+
445
+ # Validate result is valid enum
446
+ if ! validate_enum "$first_result" "passed" "failed" "partial" "expected-fail"; then
447
+ error "Experiment has invalid result: $first_result"
448
+ return 1
449
+ fi
450
+
451
+ return 0
452
+ }
453
+
454
+ # Validate steady-state hypothesis structure
455
+ # Returns: 0 if valid, 1 if invalid
456
+ validate_steady_state() {
457
+ local output_file="$1"
458
+
459
+ # Check if any experiment has steady-state hypothesis
460
+ local has_hypothesis=false
461
+
462
+ if command_exists "jq"; then
463
+ local hypothesis_count
464
+ hypothesis_count=$(jq '[.output.experiments[] | select(.steadyStateHypothesis != null)] | length' "$output_file" 2>/dev/null || echo "0")
465
+
466
+ if [[ "$hypothesis_count" -gt 0 ]]; then
467
+ has_hypothesis=true
468
+ debug "Found $hypothesis_count experiments with steady-state hypothesis"
469
+
470
+ # Validate first hypothesis structure
471
+ local first_metrics
472
+ first_metrics=$(jq '.output.experiments[] | select(.steadyStateHypothesis != null) | .steadyStateHypothesis.metrics | length' "$output_file" 2>/dev/null | head -1)
473
+
474
+ if [[ -n "$first_metrics" ]] && [[ "$first_metrics" -gt 0 ]]; then
475
+ success "Steady-state hypothesis has $first_metrics metrics defined"
476
+ else
477
+ warn "Steady-state hypothesis has no metrics defined"
478
+ fi
479
+ fi
480
+ fi
481
+
482
+ if [[ "$has_hypothesis" == "false" ]]; then
483
+ warn "No experiments have steady-state hypothesis defined"
484
+ warn "Best practice: Define steady-state before chaos injection"
485
+ fi
486
+
487
+ return 0
488
+ }
489
+
490
+ # Validate blast radius controls
491
+ # Returns: 0 if valid, 1 if invalid
492
+ validate_blast_radius() {
493
+ local output_file="$1"
494
+
495
+ local has_blast_radius=false
496
+
497
+ if command_exists "jq"; then
498
+ local blast_radius_count
499
+ blast_radius_count=$(jq '[.output.experiments[] | select(.blastRadius != null)] | length' "$output_file" 2>/dev/null || echo "0")
500
+
501
+ if [[ "$blast_radius_count" -gt 0 ]]; then
502
+ has_blast_radius=true
503
+ debug "Found $blast_radius_count experiments with blast radius controls"
504
+
505
+ # Check for emergency stop
506
+ local emergency_stop_enabled
507
+ emergency_stop_enabled=$(jq '[.output.experiments[] | select(.blastRadius.emergencyStop == true)] | length' "$output_file" 2>/dev/null || echo "0")
508
+
509
+ if [[ "$emergency_stop_enabled" -gt 0 ]]; then
510
+ success "Emergency stop enabled for $emergency_stop_enabled experiments"
511
+ else
512
+ warn "No experiments have emergency stop enabled"
513
+ fi
514
+ fi
515
+ fi
516
+
517
+ if [[ "$has_blast_radius" == "false" ]]; then
518
+ warn "No experiments have blast radius controls defined"
519
+ warn "Best practice: Always define blast radius limits for safety"
520
+ fi
521
+
522
+ return 0
523
+ }
524
+
525
+ # Validate resilience score
526
+ # Returns: 0 if valid, 1 if invalid
527
+ validate_resilience_score() {
528
+ local output_file="$1"
529
+
530
+ local score_value score_max
531
+ score_value=$(json_get "$output_file" ".output.resilienceScore.value" 2>/dev/null)
532
+ score_max=$(json_get "$output_file" ".output.resilienceScore.max" 2>/dev/null)
533
+
534
+ if [[ -z "$score_value" ]] || [[ "$score_value" == "null" ]]; then
535
+ error "Missing resilience score value"
536
+ return 1
537
+ fi
538
+
539
+ if [[ -z "$score_max" ]] || [[ "$score_max" == "null" ]]; then
540
+ error "Missing resilience score max"
541
+ return 1
542
+ fi
543
+
544
+ # Validate score is in range
545
+ if command_exists "bc"; then
546
+ if (( $(echo "$score_value < 0 || $score_value > $score_max" | bc -l 2>/dev/null || echo "0") )); then
547
+ error "Resilience score $score_value out of range (0-$score_max)"
548
+ return 1
549
+ fi
550
+ fi
551
+
552
+ debug "Resilience score: $score_value/$score_max"
553
+ return 0
554
+ }
555
+
556
+ # Validate weaknesses structure
557
+ # Returns: 0 if valid, 1 if invalid
558
+ validate_weaknesses() {
559
+ local output_file="$1"
560
+
561
+ local weakness_count
562
+ weakness_count=$(json_count "$output_file" ".output.weaknesses" 2>/dev/null)
563
+
564
+ if [[ -z "$weakness_count" ]] || [[ "$weakness_count" == "null" ]]; then
565
+ weakness_count=0
566
+ fi
567
+
568
+ debug "Found $weakness_count weaknesses"
569
+
570
+ # If there are weaknesses, validate structure
571
+ if [[ "$weakness_count" -gt 0 ]]; then
572
+ local first_severity
573
+ first_severity=$(json_get "$output_file" ".output.weaknesses[0].severity" 2>/dev/null)
574
+
575
+ if [[ -n "$first_severity" ]] && [[ "$first_severity" != "null" ]]; then
576
+ if ! validate_enum "$first_severity" "critical" "high" "medium" "low"; then
577
+ error "Weakness has invalid severity: $first_severity"
578
+ return 1
579
+ fi
580
+ fi
581
+ fi
582
+
583
+ return 0
584
+ }
585
+
586
+ # Validate recovery times
587
+ # Returns: 0 if valid, 1 if invalid
588
+ validate_recovery_times() {
589
+ local output_file="$1"
590
+
591
+ if command_exists "jq"; then
592
+ local recovery_data
593
+ recovery_data=$(jq '[.output.experiments[] | select(.recoveryTime != null) | .recoveryTime] | length' "$output_file" 2>/dev/null || echo "0")
594
+
595
+ if [[ "$recovery_data" -gt 0 ]]; then
596
+ # Check for SLA compliance
597
+ local sla_violations
598
+ sla_violations=$(jq '[.output.experiments[] | select(.recoveryTime != null and .recoveryTime.withinSla == false)] | length' "$output_file" 2>/dev/null || echo "0")
599
+
600
+ if [[ "$sla_violations" -gt 0 ]]; then
601
+ warn "Found $sla_violations experiments with SLA violations"
602
+ else
603
+ success "All experiments with recovery times are within SLA"
604
+ fi
605
+ else
606
+ debug "No experiments have recovery time data"
607
+ fi
608
+ fi
609
+
610
+ return 0
611
+ }
612
+
613
+ # Main skill-specific validation function
614
+ # Returns: 0 if valid, 1 if invalid
615
+ validate_skill_specific() {
616
+ local output_file="$1"
617
+ local has_errors=false
618
+
619
+ debug "Running chaos-engineering-resilience specific validations..."
620
+
621
+ # Validate chaos experiments structure
622
+ if ! validate_chaos_experiments "$output_file"; then
623
+ has_errors=true
624
+ else
625
+ success "Chaos experiments validation passed"
626
+ fi
627
+
628
+ # Validate resilience score
629
+ if ! validate_resilience_score "$output_file"; then
630
+ has_errors=true
631
+ else
632
+ success "Resilience score validation passed"
633
+ fi
634
+
635
+ # Validate steady-state hypothesis (warning only)
636
+ if ! validate_steady_state "$output_file"; then
637
+ # Non-fatal warning
638
+ debug "Steady-state validation issue (non-fatal)"
639
+ else
640
+ success "Steady-state hypothesis validation passed"
641
+ fi
642
+
643
+ # Validate blast radius (warning only)
644
+ if ! validate_blast_radius "$output_file"; then
645
+ # Non-fatal warning
646
+ debug "Blast radius validation issue (non-fatal)"
647
+ else
648
+ success "Blast radius controls validation passed"
649
+ fi
650
+
651
+ # Validate weaknesses
652
+ if ! validate_weaknesses "$output_file"; then
653
+ has_errors=true
654
+ else
655
+ success "Weaknesses validation passed"
656
+ fi
657
+
658
+ # Validate recovery times (warning only)
659
+ if ! validate_recovery_times "$output_file"; then
660
+ # Non-fatal warning
661
+ debug "Recovery times validation issue (non-fatal)"
662
+ else
663
+ success "Recovery times validation passed"
664
+ fi
665
+
666
+ # Check for chaos tool attribution
667
+ local tools_used
668
+ tools_used=$(json_get "$output_file" ".metadata.toolsUsed" 2>/dev/null)
669
+ if [[ -z "$tools_used" ]] || [[ "$tools_used" == "null" ]] || [[ "$tools_used" == "[]" ]]; then
670
+ warn "No chaos tools listed in metadata.toolsUsed"
671
+ else
672
+ debug "Chaos tools used: $tools_used"
673
+ fi
674
+
675
+ if [[ "$has_errors" == "true" ]]; then
676
+ return 1
677
+ fi
678
+
679
+ return 0
680
+ }
681
+
682
+ # =============================================================================
683
+ # Validation Functions (Override base template as needed)
684
+ # =============================================================================
685
+
686
+ validate_tools() {
687
+ if [[ ${#REQUIRED_TOOLS[@]} -eq 0 ]]; then
688
+ debug "No required tools specified"
689
+ return 0
690
+ fi
691
+
692
+ local missing=()
693
+ for tool in "${REQUIRED_TOOLS[@]}"; do
694
+ if ! command_exists "$tool"; then
695
+ missing+=("$tool")
696
+ fi
697
+ done
698
+
699
+ if [[ ${#missing[@]} -gt 0 ]]; then
700
+ error "Missing required tools: ${missing[*]}"
701
+ return 1
702
+ fi
703
+
704
+ debug "All required tools available"
705
+ return 0
706
+ }
707
+
708
+ validate_schema() {
709
+ local output_file="$1"
710
+
711
+ if [[ -z "$SCHEMA_PATH" ]]; then
712
+ debug "No schema path configured, skipping schema validation"
713
+ return 2
714
+ fi
715
+
716
+ if [[ ! -f "$SCHEMA_PATH" ]]; then
717
+ warn "Schema file not found: $SCHEMA_PATH"
718
+ return 2
719
+ fi
720
+
721
+ debug "Validating against schema: $SCHEMA_PATH"
722
+
723
+ local result
724
+ result=$(validate_json_schema "$SCHEMA_PATH" "$output_file" 2>&1)
725
+ local status=$?
726
+
727
+ case $status in
728
+ 0)
729
+ success "Schema validation passed"
730
+ return 0
731
+ ;;
732
+ 1)
733
+ error "Schema validation failed"
734
+ if [[ "$VERBOSE" == "true" ]]; then
735
+ echo "$result" | while read -r line; do
736
+ echo " $line"
737
+ done
738
+ fi
739
+ return 1
740
+ ;;
741
+ 2)
742
+ warn "Schema validation skipped (no validator available)"
743
+ return 2
744
+ ;;
745
+ esac
746
+ }
747
+
748
+ validate_required_fields() {
749
+ local output_file="$1"
750
+ local missing=()
751
+ local empty=()
752
+
753
+ for field in "${REQUIRED_FIELDS[@]}"; do
754
+ local value
755
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
756
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
757
+ missing+=("$field")
758
+ fi
759
+ done
760
+
761
+ for field in "${REQUIRED_NON_EMPTY_FIELDS[@]}"; do
762
+ local value
763
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
764
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]] || [[ "$value" == "" ]] || [[ "$value" == "[]" ]] || [[ "$value" == "{}" ]]; then
765
+ empty+=("$field")
766
+ fi
767
+ done
768
+
769
+ local has_errors=false
770
+
771
+ if [[ ${#missing[@]} -gt 0 ]]; then
772
+ error "Missing required fields: ${missing[*]}"
773
+ has_errors=true
774
+ fi
775
+
776
+ if [[ ${#empty[@]} -gt 0 ]]; then
777
+ error "Empty required fields: ${empty[*]}"
778
+ has_errors=true
779
+ fi
780
+
781
+ if [[ "$has_errors" == "true" ]]; then
782
+ return 1
783
+ fi
784
+
785
+ success "All required fields present and valid"
786
+ return 0
787
+ }
788
+
789
+ validate_enum_fields() {
790
+ local output_file="$1"
791
+
792
+ if [[ ${#ENUM_VALIDATIONS[@]} -eq 0 ]]; then
793
+ return 0
794
+ fi
795
+
796
+ local has_errors=false
797
+
798
+ for validation in "${ENUM_VALIDATIONS[@]}"; do
799
+ local field_path="${validation%%:*}"
800
+ local allowed_values="${validation#*:}"
801
+
802
+ local actual_value
803
+ actual_value=$(json_get "$output_file" "$field_path" 2>/dev/null)
804
+
805
+ if [[ -z "$actual_value" ]] || [[ "$actual_value" == "null" ]]; then
806
+ continue
807
+ fi
808
+
809
+ local found=false
810
+ IFS=',' read -ra allowed_array <<< "$allowed_values"
811
+ for allowed in "${allowed_array[@]}"; do
812
+ if [[ "$actual_value" == "$allowed" ]]; then
813
+ found=true
814
+ break
815
+ fi
816
+ done
817
+
818
+ if [[ "$found" == "false" ]]; then
819
+ error "Invalid value for $field_path: '$actual_value' (allowed: $allowed_values)"
820
+ has_errors=true
821
+ fi
822
+ done
823
+
824
+ if [[ "$has_errors" == "true" ]]; then
825
+ return 1
826
+ fi
827
+
828
+ success "All enum fields have valid values"
829
+ return 0
830
+ }
831
+
832
+ validate_array_lengths() {
833
+ local output_file="$1"
834
+
835
+ if [[ ${#MIN_ARRAY_LENGTHS[@]} -eq 0 ]]; then
836
+ return 0
837
+ fi
838
+
839
+ local has_errors=false
840
+
841
+ for validation in "${MIN_ARRAY_LENGTHS[@]}"; do
842
+ local field_path="${validation%%:*}"
843
+ local min_length="${validation#*:}"
844
+
845
+ local actual_count
846
+ actual_count=$(json_count "$output_file" "$field_path" 2>/dev/null)
847
+
848
+ if [[ -z "$actual_count" ]] || [[ "$actual_count" == "null" ]]; then
849
+ actual_count=0
850
+ fi
851
+
852
+ if [[ "$actual_count" -lt "$min_length" ]]; then
853
+ error "Array $field_path has $actual_count items (minimum: $min_length)"
854
+ has_errors=true
855
+ else
856
+ debug "Array $field_path has $actual_count items (>= $min_length)"
857
+ fi
858
+ done
859
+
860
+ if [[ "$has_errors" == "true" ]]; then
861
+ return 1
862
+ fi
863
+
864
+ return 0
865
+ }
866
+
867
+ validate_content_terms() {
868
+ local output_file="$1"
869
+ local content
870
+ content=$(cat "$output_file")
871
+
872
+ local has_errors=false
873
+
874
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]]; then
875
+ local missing_terms=()
876
+ for term in "${MUST_CONTAIN_TERMS[@]}"; do
877
+ if ! grep -qi "$term" <<< "$content"; then
878
+ missing_terms+=("$term")
879
+ fi
880
+ done
881
+
882
+ if [[ ${#missing_terms[@]} -gt 0 ]]; then
883
+ error "Output missing required chaos terms: ${missing_terms[*]}"
884
+ has_errors=true
885
+ else
886
+ success "All required chaos terms found"
887
+ fi
888
+ fi
889
+
890
+ if [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
891
+ local found_forbidden=()
892
+ for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
893
+ if grep -qi "$term" <<< "$content"; then
894
+ found_forbidden+=("$term")
895
+ fi
896
+ done
897
+
898
+ if [[ ${#found_forbidden[@]} -gt 0 ]]; then
899
+ error "Output contains forbidden terms: ${found_forbidden[*]}"
900
+ has_errors=true
901
+ else
902
+ success "No forbidden terms found"
903
+ fi
904
+ fi
905
+
906
+ if [[ "$has_errors" == "true" ]]; then
907
+ return 1
908
+ fi
909
+
910
+ return 0
911
+ }
912
+
913
+ # =============================================================================
914
+ # Main Validation Flow
915
+ # =============================================================================
916
+
917
+ main() {
918
+ if [[ -z "$OUTPUT_FILE" ]]; then
919
+ error "No output file specified"
920
+ echo "Usage: $0 <output-file> [options]"
921
+ echo "Use --help for more information"
922
+ exit 1
923
+ fi
924
+
925
+ if [[ ! -f "$OUTPUT_FILE" ]]; then
926
+ error "Output file not found: $OUTPUT_FILE"
927
+ exit 1
928
+ fi
929
+
930
+ if [[ "$JSON_ONLY" != "true" ]]; then
931
+ echo "=============================================="
932
+ info "Validating $SKILL_NAME Output"
933
+ echo "=============================================="
934
+ echo ""
935
+ echo " Skill: $SKILL_NAME v$SKILL_VERSION"
936
+ echo " File: $OUTPUT_FILE"
937
+ echo " Schema: ${SCHEMA_PATH:-none}"
938
+ echo ""
939
+ fi
940
+
941
+ # Track validation status
942
+ local tool_status="passed"
943
+ local json_status="passed"
944
+ local schema_status="passed"
945
+ local fields_status="passed"
946
+ local enums_status="passed"
947
+ local arrays_status="passed"
948
+ local content_status="passed"
949
+ local specific_status="passed"
950
+ local error_count=0
951
+ local warning_count=0
952
+
953
+ # Step 1: Check Required Tools
954
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 1: Tool Availability ---"
955
+
956
+ if ! validate_tools; then
957
+ tool_status="failed"
958
+ ((error_count++)) || true
959
+ if [[ "$JSON_ONLY" == "true" ]]; then
960
+ output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
961
+ fi
962
+ exit $EXIT_SKIP
963
+ fi
964
+
965
+ [[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
966
+
967
+ # Step 2: Validate JSON Syntax
968
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 2: JSON Syntax ---"
969
+
970
+ if ! validate_json "$OUTPUT_FILE"; then
971
+ json_status="failed"
972
+ ((error_count++)) || true
973
+ [[ "$JSON_ONLY" != "true" ]] && error "File is not valid JSON"
974
+ if [[ "$JSON_ONLY" == "true" ]]; then
975
+ output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
976
+ fi
977
+ exit $EXIT_FAIL
978
+ fi
979
+
980
+ [[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
981
+
982
+ # Step 3: Validate Against Schema
983
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 3: Schema Validation ---"
984
+
985
+ local schema_exit_code
986
+ validate_schema "$OUTPUT_FILE" && schema_exit_code=0 || schema_exit_code=$?
987
+
988
+ case $schema_exit_code in
989
+ 0) [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
990
+ 1) schema_status="failed"; ((error_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
991
+ 2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
992
+ esac
993
+
994
+ # Step 4: Validate Required Fields
995
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 4: Required Fields ---"
996
+
997
+ if ! validate_required_fields "$OUTPUT_FILE"; then
998
+ fields_status="failed"
999
+ ((error_count++)) || true
1000
+ fi
1001
+
1002
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
1003
+
1004
+ # Step 5: Validate Enum Values
1005
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 5: Enum Validation ---"
1006
+
1007
+ if ! validate_enum_fields "$OUTPUT_FILE"; then
1008
+ enums_status="failed"
1009
+ ((error_count++)) || true
1010
+ fi
1011
+
1012
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
1013
+
1014
+ # Step 6: Validate Array Lengths
1015
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 6: Array Validation ---"
1016
+
1017
+ if ! validate_array_lengths "$OUTPUT_FILE"; then
1018
+ arrays_status="failed"
1019
+ ((error_count++)) || true
1020
+ fi
1021
+
1022
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
1023
+
1024
+ # Step 7: Validate Chaos Content Terms
1025
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 7: Chaos Content Terms ---"
1026
+
1027
+ if ! validate_content_terms "$OUTPUT_FILE"; then
1028
+ content_status="failed"
1029
+ ((error_count++)) || true
1030
+ fi
1031
+
1032
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
1033
+
1034
+ # Step 8: Chaos-Specific Validation
1035
+ [[ "$JSON_ONLY" != "true" ]] && echo "--- Step 8: Chaos-Specific Validation ---"
1036
+
1037
+ if ! validate_skill_specific "$OUTPUT_FILE"; then
1038
+ specific_status="failed"
1039
+ ((error_count++)) || true
1040
+ fi
1041
+
1042
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
1043
+
1044
+ # Determine Overall Status
1045
+ local overall_status="passed"
1046
+ local content_overall="passed"
1047
+
1048
+ if [[ "$fields_status" == "failed" ]] || \
1049
+ [[ "$enums_status" == "failed" ]] || \
1050
+ [[ "$arrays_status" == "failed" ]] || \
1051
+ [[ "$content_status" == "failed" ]] || \
1052
+ [[ "$specific_status" == "failed" ]]; then
1053
+ content_overall="failed"
1054
+ fi
1055
+
1056
+ if [[ "$json_status" == "failed" ]] || \
1057
+ [[ "$schema_status" == "failed" ]] || \
1058
+ [[ "$content_overall" == "failed" ]]; then
1059
+ overall_status="failed"
1060
+ elif [[ "$schema_status" == "skipped" ]]; then
1061
+ overall_status="partial"
1062
+ fi
1063
+
1064
+ # Output Results
1065
+ if [[ "$JSON_ONLY" == "true" ]]; then
1066
+ output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
1067
+ else
1068
+ echo "=============================================="
1069
+ echo "Validation Summary for $SKILL_NAME"
1070
+ echo "=============================================="
1071
+ echo ""
1072
+ echo " Tools: $tool_status"
1073
+ echo " JSON Syntax: $json_status"
1074
+ echo " Schema: $schema_status"
1075
+ echo " Required Fields: $fields_status"
1076
+ echo " Enum Values: $enums_status"
1077
+ echo " Array Lengths: $arrays_status"
1078
+ echo " Content Terms: $content_status"
1079
+ echo " Chaos-Specific: $specific_status"
1080
+ echo ""
1081
+ echo " ------------------------------"
1082
+ echo " Overall: $overall_status"
1083
+ echo " Errors: $error_count"
1084
+ echo " Warnings: $warning_count"
1085
+ echo "=============================================="
1086
+ echo ""
1087
+ fi
1088
+
1089
+ # Exit with appropriate code
1090
+ case "$overall_status" in
1091
+ "passed")
1092
+ [[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
1093
+ exit $EXIT_PASS
1094
+ ;;
1095
+ "partial")
1096
+ [[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
1097
+ exit $EXIT_PASS
1098
+ ;;
1099
+ "failed")
1100
+ [[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
1101
+ exit $EXIT_FAIL
1102
+ ;;
1103
+ esac
1104
+ }
1105
+
1106
+ # Run main function
1107
+ main