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,1033 @@
1
+ #!/bin/bash
2
+ # =============================================================================
3
+ # AQE Contract Testing Skill Validator v1.0.0
4
+ # Validates output from the contract-testing skill per ADR-056
5
+ # =============================================================================
6
+ #
7
+ # Usage: ./validate.sh <output-file> [options]
8
+ #
9
+ # Options:
10
+ # --self-test Run validator self-test mode
11
+ # --verbose Enable verbose output
12
+ # --json Output results as JSON only
13
+ # --list-tools Show available validation tools
14
+ # --help Show this help message
15
+ #
16
+ # Exit Codes:
17
+ # 0 - Validation passed (all checks successful)
18
+ # 1 - Validation failed (one or more checks failed)
19
+ # 2 - Validation skipped (missing required tools)
20
+ #
21
+ # =============================================================================
22
+
23
+ set -euo pipefail
24
+
25
+ # Get script directory (works even when sourced)
26
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
27
+
28
+ # Navigate to skill directory and project root
29
+ SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
30
+ PROJECT_ROOT="$(cd "$SKILL_DIR/../../../.." && pwd)"
31
+
32
+ # Source shared library - try multiple locations
33
+ VALIDATOR_LIB=""
34
+ for lib_path in \
35
+ "$PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh" \
36
+ "$SKILL_DIR/../.validation/templates/validator-lib.sh" \
37
+ "$SCRIPT_DIR/validator-lib.sh"; do
38
+ if [[ -f "$lib_path" ]]; then
39
+ VALIDATOR_LIB="$lib_path"
40
+ break
41
+ fi
42
+ done
43
+
44
+ if [[ -n "$VALIDATOR_LIB" ]]; then
45
+ # shellcheck source=/dev/null
46
+ source "$VALIDATOR_LIB"
47
+ else
48
+ echo "ERROR: Validator library not found"
49
+ echo "Searched:"
50
+ echo " - $PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh"
51
+ echo " - $SKILL_DIR/../.validation/templates/validator-lib.sh"
52
+ echo " - $SCRIPT_DIR/validator-lib.sh"
53
+ echo ""
54
+ echo "Make sure the validator-lib.sh file exists in one of these locations."
55
+ exit 1
56
+ fi
57
+
58
+ # =============================================================================
59
+ # SKILL-SPECIFIC CONFIGURATION
60
+ # =============================================================================
61
+
62
+ # Skill name (must match SKILL.md name)
63
+ SKILL_NAME="contract-testing"
64
+
65
+ # Skill version
66
+ SKILL_VERSION="1.0.0"
67
+
68
+ # Required tools (validation FAILS with exit 2 if missing)
69
+ # jq is essential for JSON parsing in contract testing validation
70
+ REQUIRED_TOOLS=("jq")
71
+
72
+ # Optional tools (validation continues with warnings if missing)
73
+ # These enable enhanced validation capabilities
74
+ OPTIONAL_TOOLS=("pact" "spring-cloud-contract" "node" "ajv" "jsonschema" "python3")
75
+
76
+ # Path to output JSON schema
77
+ SCHEMA_PATH="$SKILL_DIR/schemas/output.json"
78
+
79
+ # Path to sample test data for self-test mode
80
+ SAMPLE_OUTPUT_PATH="$PROJECT_ROOT/.claude/skills/.validation/test-data/sample-output.json"
81
+
82
+ # =============================================================================
83
+ # CONTENT VALIDATION CONFIGURATION
84
+ # =============================================================================
85
+
86
+ # Minimum required fields in output (basic structural validation)
87
+ REQUIRED_FIELDS=("skillName" "status" "output" "output.contractType" "output.verificationResult")
88
+
89
+ # Fields that must have non-null, non-empty values
90
+ REQUIRED_NON_EMPTY_FIELDS=("output.summary" "output.contractType")
91
+
92
+ # Terms that MUST appear somewhere in output (case-insensitive)
93
+ # Contract testing outputs should mention these concepts
94
+ MUST_CONTAIN_TERMS=("contract" "consumer" "provider")
95
+
96
+ # Terms that must NOT appear in output (indicates failure/hallucination)
97
+ MUST_NOT_CONTAIN_TERMS=("TODO" "FIXME" "placeholder" "example.com" "lorem ipsum")
98
+
99
+ # Enum fields and their allowed values
100
+ ENUM_VALIDATIONS=(
101
+ ".status:success,partial,failed,skipped"
102
+ ".output.contractType:consumer-driven,provider,bidirectional,schema-first"
103
+ ".output.verificationResult.status:passed,failed,pending,partial"
104
+ )
105
+
106
+ # Minimum array lengths (contracts can have 0 interactions for analysis-only runs)
107
+ MIN_ARRAY_LENGTHS=()
108
+
109
+ # =============================================================================
110
+ # Argument Parsing
111
+ # =============================================================================
112
+
113
+ OUTPUT_FILE=""
114
+ SELF_TEST=false
115
+ VERBOSE=false
116
+ JSON_ONLY=false
117
+ LIST_TOOLS=false
118
+
119
+ while [[ $# -gt 0 ]]; do
120
+ case "$1" in
121
+ --self-test)
122
+ SELF_TEST=true
123
+ shift
124
+ ;;
125
+ --verbose|-v)
126
+ VERBOSE=true
127
+ export AQE_DEBUG=1
128
+ shift
129
+ ;;
130
+ --json)
131
+ JSON_ONLY=true
132
+ shift
133
+ ;;
134
+ --list-tools)
135
+ LIST_TOOLS=true
136
+ shift
137
+ ;;
138
+ -h|--help)
139
+ cat << 'HELP_EOF'
140
+ AQE Contract Testing Skill Validator
141
+
142
+ Usage: ./validate.sh <output-file> [options]
143
+ ./validate.sh --self-test [--verbose]
144
+ ./validate.sh --list-tools
145
+
146
+ Arguments:
147
+ <output-file> Path to skill output JSON file to validate
148
+
149
+ Options:
150
+ --self-test Run validator self-test mode
151
+ --verbose, -v Enable verbose/debug output
152
+ --json Output results as JSON only (for CI integration)
153
+ --list-tools Show available validation tools and exit
154
+ --help, -h Show this help message
155
+
156
+ Exit Codes:
157
+ 0 - Validation passed
158
+ 1 - Validation failed
159
+ 2 - Validation skipped (missing required tools)
160
+
161
+ Examples:
162
+ ./validate.sh output.json # Validate output file
163
+ ./validate.sh output.json --json # JSON output for CI
164
+ ./validate.sh --self-test --verbose # Self-test with debug
165
+ ./validate.sh --list-tools # Show available tools
166
+
167
+ Contract Testing Specific Validations:
168
+ - Validates Pact file structure (consumer, provider, interactions)
169
+ - Checks breaking change detection completeness
170
+ - Verifies canIDeploy logic against verification results
171
+ - Validates contract interaction structure
172
+ - Checks provider state definitions
173
+ - Validates semver versioning recommendations
174
+
175
+ HELP_EOF
176
+ exit 0
177
+ ;;
178
+ -*)
179
+ error "Unknown option: $1"
180
+ echo "Use --help for usage information"
181
+ exit 1
182
+ ;;
183
+ *)
184
+ OUTPUT_FILE="$1"
185
+ shift
186
+ ;;
187
+ esac
188
+ done
189
+
190
+ # Handle --list-tools mode
191
+ if [[ "$LIST_TOOLS" == "true" ]]; then
192
+ echo "=============================================="
193
+ echo "Available Validation Tools for $SKILL_NAME"
194
+ echo "=============================================="
195
+ echo ""
196
+ echo "Required tools:"
197
+ for tool in "${REQUIRED_TOOLS[@]}"; do
198
+ if command_exists "$tool"; then
199
+ echo " [OK] $tool"
200
+ else
201
+ echo " [MISSING] $tool"
202
+ fi
203
+ done
204
+ echo ""
205
+ echo "Optional tools (enhance validation):"
206
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
207
+ if command_exists "$tool"; then
208
+ echo " [OK] $tool"
209
+ else
210
+ echo " [MISSING] $tool"
211
+ fi
212
+ done
213
+ echo ""
214
+ echo "Tool purposes:"
215
+ echo " - jq: JSON parsing and validation (required)"
216
+ echo " - pact: Consumer-driven contract testing CLI"
217
+ echo " - spring-cloud-contract: Spring Cloud Contract CLI"
218
+ echo " - node: JavaScript runtime for contract tests"
219
+ echo " - ajv: JSON Schema validation"
220
+ echo " - jsonschema: Alternative JSON Schema validation"
221
+ echo " - python3: Fallback JSON parsing"
222
+ exit 0
223
+ fi
224
+
225
+ # =============================================================================
226
+ # Self-Test Mode
227
+ # =============================================================================
228
+
229
+ if [[ "$SELF_TEST" == "true" ]]; then
230
+ echo "=============================================="
231
+ info "Running $SKILL_NAME Validator Self-Test"
232
+ echo "=============================================="
233
+ echo ""
234
+ echo "Validator version: $AQE_VALIDATOR_VERSION"
235
+ echo "Skill version: $SKILL_VERSION"
236
+ echo ""
237
+
238
+ self_test_passed=true
239
+ self_test_warnings=0
240
+
241
+ # -------------------------------------------
242
+ # Step 1: Check Required Tools
243
+ # -------------------------------------------
244
+ echo "--- Step 1: Required Tools ---"
245
+ for tool in "${REQUIRED_TOOLS[@]}"; do
246
+ if command_exists "$tool"; then
247
+ success "Required tool available: $tool"
248
+ else
249
+ error "Required tool MISSING: $tool"
250
+ self_test_passed=false
251
+ fi
252
+ done
253
+ echo ""
254
+
255
+ # -------------------------------------------
256
+ # Step 2: Check Optional Tools
257
+ # -------------------------------------------
258
+ echo "--- Step 2: Optional Tools ---"
259
+ available_optional=0
260
+ for tool in "${OPTIONAL_TOOLS[@]}"; do
261
+ if command_exists "$tool"; then
262
+ success "Optional tool available: $tool"
263
+ ((available_optional++)) || true
264
+ else
265
+ warn "Optional tool missing: $tool"
266
+ ((self_test_warnings++)) || true
267
+ fi
268
+ done
269
+
270
+ if [[ $available_optional -eq 0 ]]; then
271
+ warn "No optional tools available - validation capabilities limited"
272
+ ((self_test_warnings++)) || true
273
+ fi
274
+ echo ""
275
+
276
+ # -------------------------------------------
277
+ # Step 3: Check Schema File
278
+ # -------------------------------------------
279
+ echo "--- Step 3: Schema File ---"
280
+ if [[ -f "$SCHEMA_PATH" ]]; then
281
+ success "Schema file exists: $SCHEMA_PATH"
282
+ if validate_json "$SCHEMA_PATH" 2>/dev/null; then
283
+ success "Schema file is valid JSON"
284
+ else
285
+ error "Schema file is NOT valid JSON"
286
+ self_test_passed=false
287
+ fi
288
+ else
289
+ error "Schema file not found: $SCHEMA_PATH"
290
+ self_test_passed=false
291
+ fi
292
+ echo ""
293
+
294
+ # -------------------------------------------
295
+ # Step 4: Validate Contract-Specific Structures
296
+ # -------------------------------------------
297
+ echo "--- Step 4: Contract Testing Schema Definitions ---"
298
+ if [[ -f "$SCHEMA_PATH" ]]; then
299
+ # Check for contract-specific schema definitions (support both draft-07 "definitions" and draft-2020 "$defs")
300
+ has_contract=$(jq '(has("definitions") and (.definitions | has("contract"))) or (has("$defs") and (."$defs" | has("contract")))' "$SCHEMA_PATH" 2>/dev/null)
301
+ has_interaction=$(jq '(has("definitions") and (.definitions | has("interaction"))) or (has("$defs") and (."$defs" | has("interaction")))' "$SCHEMA_PATH" 2>/dev/null)
302
+ has_breaking_change=$(jq '(has("definitions") and (.definitions | has("breakingChange"))) or (has("$defs") and (."$defs" | has("breakingChange")))' "$SCHEMA_PATH" 2>/dev/null)
303
+ has_pact_file=$(jq '(has("definitions") and (.definitions | has("pactFile"))) or (has("$defs") and (."$defs" | has("pactFile")))' "$SCHEMA_PATH" 2>/dev/null)
304
+ has_verification=$(jq '(has("definitions") and (.definitions | has("verificationResult"))) or (has("$defs") and (."$defs" | has("verificationResult")))' "$SCHEMA_PATH" 2>/dev/null)
305
+
306
+ if [[ "$has_contract" == "true" ]]; then
307
+ success "Schema has contract definition"
308
+ else
309
+ warn "Schema missing contract definition"
310
+ ((self_test_warnings++)) || true
311
+ fi
312
+
313
+ if [[ "$has_interaction" == "true" ]]; then
314
+ success "Schema has interaction definition"
315
+ else
316
+ warn "Schema missing interaction definition"
317
+ ((self_test_warnings++)) || true
318
+ fi
319
+
320
+ if [[ "$has_breaking_change" == "true" ]]; then
321
+ success "Schema has breakingChange definition"
322
+ else
323
+ warn "Schema missing breakingChange definition"
324
+ ((self_test_warnings++)) || true
325
+ fi
326
+
327
+ if [[ "$has_pact_file" == "true" ]]; then
328
+ success "Schema has pactFile definition"
329
+ else
330
+ warn "Schema missing pactFile definition"
331
+ ((self_test_warnings++)) || true
332
+ fi
333
+
334
+ if [[ "$has_verification" == "true" ]]; then
335
+ success "Schema has verificationResult definition"
336
+ else
337
+ warn "Schema missing verificationResult definition"
338
+ ((self_test_warnings++)) || true
339
+ fi
340
+ fi
341
+ echo ""
342
+
343
+ # -------------------------------------------
344
+ # Step 5: Run Library Self-Test
345
+ # -------------------------------------------
346
+ echo "--- Step 5: Validator Library Self-Test ---"
347
+ if [[ "$VERBOSE" == "true" ]]; then
348
+ if run_self_test --verbose; then
349
+ success "Library self-test passed"
350
+ else
351
+ error "Library self-test FAILED"
352
+ self_test_passed=false
353
+ fi
354
+ else
355
+ if run_self_test 2>/dev/null; then
356
+ success "Library self-test passed"
357
+ else
358
+ error "Library self-test FAILED"
359
+ self_test_passed=false
360
+ fi
361
+ fi
362
+ echo ""
363
+
364
+ # -------------------------------------------
365
+ # Self-Test Summary
366
+ # -------------------------------------------
367
+ echo "=============================================="
368
+ echo "Self-Test Summary for $SKILL_NAME"
369
+ echo "=============================================="
370
+
371
+ if [[ "$self_test_passed" == "true" ]]; then
372
+ if [[ $self_test_warnings -gt 0 ]]; then
373
+ warn "Self-test PASSED with $self_test_warnings warning(s)"
374
+ echo ""
375
+ echo "The validator is functional but has reduced capabilities."
376
+ echo "Consider installing missing tools for full validation:"
377
+ echo " npm install -g @pact-foundation/pact-cli"
378
+ exit 0
379
+ else
380
+ success "Self-test PASSED (all checks successful)"
381
+ exit 0
382
+ fi
383
+ else
384
+ error "Self-test FAILED"
385
+ exit 1
386
+ fi
387
+ fi
388
+
389
+ # =============================================================================
390
+ # Validation Functions - Contract Testing Specific
391
+ # =============================================================================
392
+
393
+ # Check that all required tools are available
394
+ validate_tools() {
395
+ local missing=()
396
+ for tool in "${REQUIRED_TOOLS[@]}"; do
397
+ if ! command_exists "$tool"; then
398
+ missing+=("$tool")
399
+ fi
400
+ done
401
+
402
+ if [[ ${#missing[@]} -gt 0 ]]; then
403
+ error "Missing required tools: ${missing[*]}"
404
+ echo ""
405
+ echo "Install missing tools and retry:"
406
+ for tool in "${missing[@]}"; do
407
+ echo " - $tool"
408
+ done
409
+ return 1
410
+ fi
411
+
412
+ debug "All required tools available"
413
+ return 0
414
+ }
415
+
416
+ # Validate output against JSON schema
417
+ validate_schema() {
418
+ local output_file="$1"
419
+
420
+ if [[ -z "$SCHEMA_PATH" ]]; then
421
+ debug "No schema path configured, skipping schema validation"
422
+ return 2
423
+ fi
424
+
425
+ if [[ ! -f "$SCHEMA_PATH" ]]; then
426
+ warn "Schema file not found: $SCHEMA_PATH"
427
+ return 2
428
+ fi
429
+
430
+ debug "Validating against schema: $SCHEMA_PATH"
431
+
432
+ local result
433
+ result=$(validate_json_schema "$SCHEMA_PATH" "$output_file" 2>&1)
434
+ local status=$?
435
+
436
+ case $status in
437
+ 0) success "Schema validation passed"; return 0 ;;
438
+ 1)
439
+ error "Schema validation failed"
440
+ if [[ "$VERBOSE" == "true" ]]; then
441
+ echo "$result" | while read -r line; do
442
+ echo " $line"
443
+ done
444
+ fi
445
+ return 1
446
+ ;;
447
+ 2) warn "Schema validation skipped (no validator available)"; return 2 ;;
448
+ esac
449
+ }
450
+
451
+ # Validate required fields exist and have values
452
+ validate_required_fields() {
453
+ local output_file="$1"
454
+ local missing=()
455
+ local empty=()
456
+
457
+ for field in "${REQUIRED_FIELDS[@]}"; do
458
+ local value
459
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
460
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
461
+ missing+=("$field")
462
+ fi
463
+ done
464
+
465
+ for field in "${REQUIRED_NON_EMPTY_FIELDS[@]}"; do
466
+ local value
467
+ value=$(json_get "$output_file" ".$field" 2>/dev/null)
468
+ if [[ -z "$value" ]] || [[ "$value" == "null" ]] || [[ "$value" == "" ]] || [[ "$value" == "[]" ]] || [[ "$value" == "{}" ]]; then
469
+ empty+=("$field")
470
+ fi
471
+ done
472
+
473
+ local has_errors=false
474
+
475
+ if [[ ${#missing[@]} -gt 0 ]]; then
476
+ error "Missing required fields: ${missing[*]}"
477
+ has_errors=true
478
+ fi
479
+
480
+ if [[ ${#empty[@]} -gt 0 ]]; then
481
+ error "Empty required fields: ${empty[*]}"
482
+ has_errors=true
483
+ fi
484
+
485
+ if [[ "$has_errors" == "true" ]]; then
486
+ return 1
487
+ fi
488
+
489
+ success "All required fields present and valid"
490
+ return 0
491
+ }
492
+
493
+ # Validate enum fields have allowed values
494
+ validate_enum_fields() {
495
+ local output_file="$1"
496
+ local has_errors=false
497
+
498
+ for validation in "${ENUM_VALIDATIONS[@]}"; do
499
+ local field_path="${validation%%:*}"
500
+ local allowed_values="${validation#*:}"
501
+
502
+ local actual_value
503
+ actual_value=$(json_get "$output_file" "$field_path" 2>/dev/null)
504
+
505
+ if [[ -z "$actual_value" ]] || [[ "$actual_value" == "null" ]]; then
506
+ debug "Enum field $field_path is empty/null (may be optional)"
507
+ continue
508
+ fi
509
+
510
+ local found=false
511
+ IFS=',' read -ra allowed_array <<< "$allowed_values"
512
+ for allowed in "${allowed_array[@]}"; do
513
+ if [[ "$actual_value" == "$allowed" ]]; then
514
+ found=true
515
+ break
516
+ fi
517
+ done
518
+
519
+ if [[ "$found" == "false" ]]; then
520
+ error "Invalid value for $field_path: '$actual_value' (allowed: $allowed_values)"
521
+ has_errors=true
522
+ else
523
+ debug "Enum field $field_path='$actual_value' is valid"
524
+ fi
525
+ done
526
+
527
+ if [[ "$has_errors" == "true" ]]; then
528
+ return 1
529
+ fi
530
+
531
+ success "All enum fields have valid values"
532
+ return 0
533
+ }
534
+
535
+ # Validate content contains expected terms
536
+ validate_content_terms() {
537
+ local output_file="$1"
538
+ local content
539
+ content=$(cat "$output_file")
540
+
541
+ local has_errors=false
542
+
543
+ if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]]; then
544
+ local missing_terms=()
545
+ for term in "${MUST_CONTAIN_TERMS[@]}"; do
546
+ if ! grep -qi "$term" <<< "$content"; then
547
+ missing_terms+=("$term")
548
+ fi
549
+ done
550
+
551
+ if [[ ${#missing_terms[@]} -gt 0 ]]; then
552
+ error "Output missing required terms: ${missing_terms[*]}"
553
+ has_errors=true
554
+ else
555
+ success "All required terms found"
556
+ fi
557
+ fi
558
+
559
+ if [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
560
+ local found_forbidden=()
561
+ for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
562
+ if grep -qi "$term" <<< "$content"; then
563
+ found_forbidden+=("$term")
564
+ fi
565
+ done
566
+
567
+ if [[ ${#found_forbidden[@]} -gt 0 ]]; then
568
+ error "Output contains forbidden terms: ${found_forbidden[*]}"
569
+ has_errors=true
570
+ else
571
+ success "No forbidden terms found"
572
+ fi
573
+ fi
574
+
575
+ if [[ "$has_errors" == "true" ]]; then
576
+ return 1
577
+ fi
578
+
579
+ return 0
580
+ }
581
+
582
+ # =============================================================================
583
+ # SKILL-SPECIFIC VALIDATION - Contract Testing
584
+ # =============================================================================
585
+
586
+ validate_skill_specific() {
587
+ local output_file="$1"
588
+ local has_errors=false
589
+ local has_warnings=false
590
+
591
+ debug "Running contract testing specific validations..."
592
+
593
+ # ==========================================================================
594
+ # Validation 1: Check verification result consistency
595
+ # ==========================================================================
596
+ local total_interactions passed_interactions failed_interactions
597
+ total_interactions=$(json_get "$output_file" ".output.verificationResult.totalInteractions" 2>/dev/null)
598
+ passed_interactions=$(json_get "$output_file" ".output.verificationResult.passedInteractions" 2>/dev/null)
599
+ failed_interactions=$(json_get "$output_file" ".output.verificationResult.failedInteractions" 2>/dev/null)
600
+
601
+ if [[ -n "$total_interactions" ]] && [[ "$total_interactions" != "null" ]] && \
602
+ [[ -n "$passed_interactions" ]] && [[ "$passed_interactions" != "null" ]]; then
603
+ if [[ "$passed_interactions" -gt "$total_interactions" ]]; then
604
+ error "Passed interactions ($passed_interactions) cannot exceed total interactions ($total_interactions)"
605
+ has_errors=true
606
+ else
607
+ debug "Interaction counts valid: $passed_interactions / $total_interactions"
608
+ fi
609
+
610
+ # Check that passed + failed <= total (allowing for pending)
611
+ if [[ -n "$failed_interactions" ]] && [[ "$failed_interactions" != "null" ]]; then
612
+ local sum=$((passed_interactions + failed_interactions))
613
+ if [[ $sum -gt $total_interactions ]]; then
614
+ error "Passed ($passed_interactions) + Failed ($failed_interactions) exceeds total ($total_interactions)"
615
+ has_errors=true
616
+ fi
617
+ fi
618
+ fi
619
+
620
+ # ==========================================================================
621
+ # Validation 2: Validate canIDeploy consistency with verification result
622
+ # ==========================================================================
623
+ local can_deploy verification_status
624
+ can_deploy=$(json_get "$output_file" ".output.canIDeploy" 2>/dev/null)
625
+ verification_status=$(json_get "$output_file" ".output.verificationResult.status" 2>/dev/null)
626
+
627
+ if [[ -n "$can_deploy" ]] && [[ "$can_deploy" != "null" ]] && \
628
+ [[ -n "$verification_status" ]] && [[ "$verification_status" != "null" ]]; then
629
+ # If verification failed, canIDeploy should be false
630
+ if [[ "$verification_status" == "failed" ]] && [[ "$can_deploy" == "true" ]]; then
631
+ warn "canIDeploy is true but verification status is 'failed' - verify deployment safety"
632
+ has_warnings=true
633
+ fi
634
+
635
+ # If there are breaking changes, canIDeploy should typically be false
636
+ local breaking_count
637
+ breaking_count=$(json_count "$output_file" ".output.breakingChanges" 2>/dev/null)
638
+ if [[ -n "$breaking_count" ]] && [[ "$breaking_count" -gt 0 ]] && [[ "$can_deploy" == "true" ]]; then
639
+ warn "canIDeploy is true but $breaking_count breaking change(s) detected - verify deployment safety"
640
+ has_warnings=true
641
+ fi
642
+
643
+ debug "canIDeploy consistency validated"
644
+ fi
645
+
646
+ # ==========================================================================
647
+ # Validation 3: Check Pact file structure if present
648
+ # ==========================================================================
649
+ local has_pact_files
650
+ has_pact_files=$(jq 'has("output") and (.output | has("pactFiles"))' "$output_file" 2>/dev/null)
651
+
652
+ if [[ "$has_pact_files" == "true" ]]; then
653
+ # Check each Pact file has required consumer/provider
654
+ local invalid_pacts
655
+ invalid_pacts=$(jq '[.output.pactFiles[]? | select(.consumer.name == null or .provider.name == null)] | length' "$output_file" 2>/dev/null)
656
+
657
+ if [[ -n "$invalid_pacts" ]] && [[ "$invalid_pacts" -gt 0 ]]; then
658
+ warn "$invalid_pacts Pact file(s) missing consumer or provider name"
659
+ has_warnings=true
660
+ else
661
+ debug "All Pact files have required consumer/provider structure"
662
+ fi
663
+ fi
664
+
665
+ # ==========================================================================
666
+ # Validation 4: Validate contract interaction structure
667
+ # ==========================================================================
668
+ local has_interactions
669
+ has_interactions=$(jq 'has("output") and (.output | has("interactions"))' "$output_file" 2>/dev/null)
670
+
671
+ if [[ "$has_interactions" == "true" ]]; then
672
+ # Check each interaction has required description
673
+ local invalid_interactions
674
+ invalid_interactions=$(jq '[.output.interactions[]? | select(.description == null or .description == "")] | length' "$output_file" 2>/dev/null)
675
+
676
+ if [[ -n "$invalid_interactions" ]] && [[ "$invalid_interactions" -gt 0 ]]; then
677
+ warn "$invalid_interactions interaction(s) missing description"
678
+ has_warnings=true
679
+ fi
680
+
681
+ # Check HTTP methods are valid
682
+ local valid_methods=("GET" "POST" "PUT" "PATCH" "DELETE" "OPTIONS" "HEAD")
683
+ local request_methods
684
+ request_methods=$(jq -r '.output.interactions[]?.request?.method // empty' "$output_file" 2>/dev/null)
685
+
686
+ if [[ -n "$request_methods" ]]; then
687
+ while IFS= read -r method; do
688
+ local is_valid=false
689
+ for valid in "${valid_methods[@]}"; do
690
+ if [[ "$method" == "$valid" ]]; then
691
+ is_valid=true
692
+ break
693
+ fi
694
+ done
695
+ if [[ "$is_valid" == "false" ]] && [[ -n "$method" ]]; then
696
+ error "Invalid HTTP method in interaction: $method"
697
+ has_errors=true
698
+ fi
699
+ done <<< "$request_methods"
700
+ fi
701
+
702
+ debug "Contract interaction structure validated"
703
+ fi
704
+
705
+ # ==========================================================================
706
+ # Validation 5: Check breaking change structure
707
+ # ==========================================================================
708
+ local has_breaking_changes
709
+ has_breaking_changes=$(jq 'has("output") and (.output | has("breakingChanges"))' "$output_file" 2>/dev/null)
710
+
711
+ if [[ "$has_breaking_changes" == "true" ]]; then
712
+ # Validate breaking change types
713
+ local valid_types=("removed-endpoint" "removed-field" "type-change" "required-field-added" "response-change" "status-code-change" "removed-enum-value" "narrowed-type" "removed-parameter" "changed-path")
714
+ local breaking_types
715
+ breaking_types=$(jq -r '.output.breakingChanges[]?.type // empty' "$output_file" 2>/dev/null)
716
+
717
+ if [[ -n "$breaking_types" ]]; then
718
+ while IFS= read -r btype; do
719
+ local is_valid=false
720
+ for valid in "${valid_types[@]}"; do
721
+ if [[ "$btype" == "$valid" ]]; then
722
+ is_valid=true
723
+ break
724
+ fi
725
+ done
726
+ if [[ "$is_valid" == "false" ]] && [[ -n "$btype" ]]; then
727
+ warn "Unrecognized breaking change type: $btype"
728
+ has_warnings=true
729
+ fi
730
+ done <<< "$breaking_types"
731
+ fi
732
+
733
+ # Check that all breaking changes have descriptions
734
+ local missing_descriptions
735
+ missing_descriptions=$(jq '[.output.breakingChanges[]? | select(.description == null or .description == "")] | length' "$output_file" 2>/dev/null)
736
+
737
+ if [[ -n "$missing_descriptions" ]] && [[ "$missing_descriptions" -gt 0 ]]; then
738
+ warn "$missing_descriptions breaking change(s) missing description"
739
+ has_warnings=true
740
+ fi
741
+
742
+ debug "Breaking change structure validated"
743
+ fi
744
+
745
+ # ==========================================================================
746
+ # Validation 6: Check finding IDs follow pattern
747
+ # ==========================================================================
748
+ local invalid_finding_ids
749
+ invalid_finding_ids=$(jq '[.output.findings[]?.id // empty | select(test("^CT-[0-9]{3,6}$") | not)] | length' "$output_file" 2>/dev/null)
750
+
751
+ if [[ -n "$invalid_finding_ids" ]] && [[ "$invalid_finding_ids" -gt 0 ]]; then
752
+ warn "$invalid_finding_ids finding(s) have invalid ID format (should be CT-NNN)"
753
+ has_warnings=true
754
+ fi
755
+
756
+ # ==========================================================================
757
+ # Validation 7: Version recommendation consistency
758
+ # ==========================================================================
759
+ local has_version_rec
760
+ has_version_rec=$(jq 'has("output") and (.output | has("versionRecommendation"))' "$output_file" 2>/dev/null)
761
+
762
+ if [[ "$has_version_rec" == "true" ]]; then
763
+ local change_type breaking_count
764
+ change_type=$(json_get "$output_file" ".output.versionRecommendation.changeType" 2>/dev/null)
765
+ breaking_count=$(json_get "$output_file" ".output.versionRecommendation.breakingChangeCount" 2>/dev/null)
766
+
767
+ if [[ "$breaking_count" -gt 0 ]] && [[ "$change_type" != "major" ]]; then
768
+ warn "Breaking changes detected ($breaking_count) but recommended change type is '$change_type' (expected 'major')"
769
+ has_warnings=true
770
+ fi
771
+
772
+ debug "Version recommendation validated"
773
+ fi
774
+
775
+ # ==========================================================================
776
+ # Validation 8: Consumer/Provider consistency
777
+ # ==========================================================================
778
+ local has_contracts
779
+ has_contracts=$(jq 'has("output") and (.output | has("contracts"))' "$output_file" 2>/dev/null)
780
+
781
+ if [[ "$has_contracts" == "true" ]]; then
782
+ # Check that all contracts have consumer and provider
783
+ local invalid_contracts
784
+ invalid_contracts=$(jq '[.output.contracts[]? | select(.consumer == null or .provider == null)] | length' "$output_file" 2>/dev/null)
785
+
786
+ if [[ -n "$invalid_contracts" ]] && [[ "$invalid_contracts" -gt 0 ]]; then
787
+ error "$invalid_contracts contract(s) missing consumer or provider"
788
+ has_errors=true
789
+ fi
790
+
791
+ debug "Contract consumer/provider consistency validated"
792
+ fi
793
+
794
+ # ==========================================================================
795
+ # Return Result
796
+ # ==========================================================================
797
+ if [[ "$has_errors" == "true" ]]; then
798
+ return 1
799
+ fi
800
+
801
+ if [[ "$has_warnings" == "true" ]]; then
802
+ warn "Contract testing validation passed with warnings"
803
+ else
804
+ success "Contract testing specific validation passed"
805
+ fi
806
+
807
+ return 0
808
+ }
809
+
810
+ # =============================================================================
811
+ # Main Validation Flow
812
+ # =============================================================================
813
+
814
+ main() {
815
+ # Validate arguments
816
+ if [[ -z "$OUTPUT_FILE" ]]; then
817
+ error "No output file specified"
818
+ echo "Usage: $0 <output-file> [options]"
819
+ echo "Use --help for more information"
820
+ exit 1
821
+ fi
822
+
823
+ if [[ ! -f "$OUTPUT_FILE" ]]; then
824
+ error "Output file not found: $OUTPUT_FILE"
825
+ exit 1
826
+ fi
827
+
828
+ # Print header (unless JSON-only mode)
829
+ if [[ "$JSON_ONLY" != "true" ]]; then
830
+ echo "=============================================="
831
+ info "Validating $SKILL_NAME Output"
832
+ echo "=============================================="
833
+ echo ""
834
+ echo " Skill: $SKILL_NAME v$SKILL_VERSION"
835
+ echo " File: $OUTPUT_FILE"
836
+ echo " Schema: ${SCHEMA_PATH:-none}"
837
+ echo ""
838
+ fi
839
+
840
+ # Track validation status
841
+ local tool_status="passed"
842
+ local json_status="passed"
843
+ local schema_status="passed"
844
+ local fields_status="passed"
845
+ local enums_status="passed"
846
+ local content_status="passed"
847
+ local specific_status="passed"
848
+
849
+ local error_count=0
850
+ local warning_count=0
851
+
852
+ # =========================================
853
+ # Step 1: Check Required Tools
854
+ # =========================================
855
+ if [[ "$JSON_ONLY" != "true" ]]; then
856
+ echo "--- Step 1: Tool Availability ---"
857
+ fi
858
+
859
+ if ! validate_tools; then
860
+ tool_status="failed"
861
+ ((error_count++)) || true
862
+ if [[ "$JSON_ONLY" == "true" ]]; then
863
+ output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
864
+ else
865
+ echo ""
866
+ error "Validation cannot proceed without required tools"
867
+ fi
868
+ exit $EXIT_SKIP
869
+ fi
870
+
871
+ [[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
872
+
873
+ # =========================================
874
+ # Step 2: Validate JSON Syntax
875
+ # =========================================
876
+ if [[ "$JSON_ONLY" != "true" ]]; then
877
+ echo "--- Step 2: JSON Syntax ---"
878
+ fi
879
+
880
+ if ! validate_json "$OUTPUT_FILE"; then
881
+ json_status="failed"
882
+ ((error_count++)) || true
883
+ if [[ "$JSON_ONLY" != "true" ]]; then
884
+ error "File is not valid JSON - cannot proceed"
885
+ fi
886
+ if [[ "$JSON_ONLY" == "true" ]]; then
887
+ output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
888
+ fi
889
+ exit $EXIT_FAIL
890
+ fi
891
+
892
+ [[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
893
+
894
+ # =========================================
895
+ # Step 3: Validate Against Schema
896
+ # =========================================
897
+ if [[ "$JSON_ONLY" != "true" ]]; then
898
+ echo "--- Step 3: Schema Validation ---"
899
+ fi
900
+
901
+ local schema_exit_code
902
+ validate_schema "$OUTPUT_FILE" && schema_exit_code=0 || schema_exit_code=$?
903
+
904
+ case $schema_exit_code in
905
+ 0) [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
906
+ 1) schema_status="failed"; ((error_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
907
+ 2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
908
+ esac
909
+
910
+ # =========================================
911
+ # Step 4: Validate Required Fields
912
+ # =========================================
913
+ if [[ "$JSON_ONLY" != "true" ]]; then
914
+ echo "--- Step 4: Required Fields ---"
915
+ fi
916
+
917
+ if ! validate_required_fields "$OUTPUT_FILE"; then
918
+ fields_status="failed"
919
+ ((error_count++)) || true
920
+ fi
921
+
922
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
923
+
924
+ # =========================================
925
+ # Step 5: Validate Enum Values
926
+ # =========================================
927
+ if [[ "$JSON_ONLY" != "true" ]]; then
928
+ echo "--- Step 5: Enum Validation ---"
929
+ fi
930
+
931
+ if ! validate_enum_fields "$OUTPUT_FILE"; then
932
+ enums_status="failed"
933
+ ((error_count++)) || true
934
+ fi
935
+
936
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
937
+
938
+ # =========================================
939
+ # Step 6: Validate Content Terms
940
+ # =========================================
941
+ if [[ "$JSON_ONLY" != "true" ]]; then
942
+ echo "--- Step 6: Content Terms ---"
943
+ fi
944
+
945
+ if ! validate_content_terms "$OUTPUT_FILE"; then
946
+ content_status="failed"
947
+ ((error_count++)) || true
948
+ fi
949
+
950
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
951
+
952
+ # =========================================
953
+ # Step 7: Contract Testing Specific Validation
954
+ # =========================================
955
+ if [[ "$JSON_ONLY" != "true" ]]; then
956
+ echo "--- Step 7: Contract Testing Specific Validation ---"
957
+ fi
958
+
959
+ if ! validate_skill_specific "$OUTPUT_FILE"; then
960
+ specific_status="failed"
961
+ ((error_count++)) || true
962
+ fi
963
+
964
+ [[ "$JSON_ONLY" != "true" ]] && echo ""
965
+
966
+ # =========================================
967
+ # Determine Overall Status
968
+ # =========================================
969
+ local overall_status="passed"
970
+ local content_overall="passed"
971
+
972
+ if [[ "$fields_status" == "failed" ]] || \
973
+ [[ "$enums_status" == "failed" ]] || \
974
+ [[ "$content_status" == "failed" ]] || \
975
+ [[ "$specific_status" == "failed" ]]; then
976
+ content_overall="failed"
977
+ fi
978
+
979
+ if [[ "$json_status" == "failed" ]] || \
980
+ [[ "$schema_status" == "failed" ]] || \
981
+ [[ "$content_overall" == "failed" ]]; then
982
+ overall_status="failed"
983
+ elif [[ "$schema_status" == "skipped" ]]; then
984
+ overall_status="partial"
985
+ fi
986
+
987
+ # =========================================
988
+ # Output Results
989
+ # =========================================
990
+ if [[ "$JSON_ONLY" == "true" ]]; then
991
+ output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
992
+ else
993
+ echo "=============================================="
994
+ echo "Validation Summary for $SKILL_NAME"
995
+ echo "=============================================="
996
+ echo ""
997
+ echo " Tools: $tool_status"
998
+ echo " JSON Syntax: $json_status"
999
+ echo " Schema: $schema_status"
1000
+ echo " Fields: $fields_status"
1001
+ echo " Enums: $enums_status"
1002
+ echo " Content: $content_status"
1003
+ echo " Contract-specific: $specific_status"
1004
+ echo ""
1005
+ echo " ------------------------------"
1006
+ echo " Overall: $overall_status"
1007
+ echo " Errors: $error_count"
1008
+ echo " Warnings: $warning_count"
1009
+ echo "=============================================="
1010
+ echo ""
1011
+ fi
1012
+
1013
+ # =========================================
1014
+ # Exit with appropriate code
1015
+ # =========================================
1016
+ case "$overall_status" in
1017
+ "passed")
1018
+ [[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
1019
+ exit $EXIT_PASS
1020
+ ;;
1021
+ "partial")
1022
+ [[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
1023
+ exit $EXIT_PASS
1024
+ ;;
1025
+ "failed")
1026
+ [[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
1027
+ exit $EXIT_FAIL
1028
+ ;;
1029
+ esac
1030
+ }
1031
+
1032
+ # Run main function
1033
+ main