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.
- package/.claude/skills/.validation/README.md +111 -0
- package/.claude/skills/.validation/examples/chaos-engineering-output.example.json +530 -0
- package/.claude/skills/.validation/examples/performance-testing-output.example.json +252 -0
- package/.claude/skills/.validation/examples/security-testing-output.example.json +413 -0
- package/.claude/skills/.validation/examples/testability-scoring-output.example.json +350 -0
- package/.claude/skills/.validation/schemas/skill-eval.schema.json +452 -0
- package/.claude/skills/.validation/schemas/skill-frontmatter.schema.json +341 -0
- package/.claude/skills/.validation/schemas/skill-output-meta.schema.json +199 -0
- package/.claude/skills/.validation/schemas/skill-output.template.json +610 -0
- package/.claude/skills/.validation/skill-validation-mcp-integration.md +250 -0
- package/.claude/skills/.validation/templates/eval.template.yaml +366 -0
- package/.claude/skills/.validation/templates/schemas/output.json +145 -0
- package/.claude/skills/.validation/templates/security-testing-eval.template.yaml +725 -0
- package/.claude/skills/.validation/templates/skill-frontmatter.example.yaml +225 -0
- package/.claude/skills/.validation/templates/validate.template.sh +1060 -0
- package/.claude/skills/.validation/templates/validator-lib.sh +1031 -0
- package/.claude/skills/.validation/test-data/invalid-output.json +5 -0
- package/.claude/skills/.validation/test-data/minimal-output.json +9 -0
- package/.claude/skills/.validation/test-data/sample-output.json +73 -0
- package/.claude/skills/TRUST-TIERS.md +158 -0
- package/.claude/skills/a11y-ally/SKILL.md +1664 -1658
- package/.claude/skills/a11y-ally/evals/a11y-ally.yaml +376 -0
- package/.claude/skills/a11y-ally/schemas/output.json +549 -0
- package/.claude/skills/a11y-ally/scripts/validate.sh +690 -0
- package/.claude/skills/accessibility-testing/SKILL.md +8 -1
- package/.claude/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -0
- package/.claude/skills/accessibility-testing/schemas/output.json +776 -0
- package/.claude/skills/accessibility-testing/scripts/validate.sh +943 -0
- package/.claude/skills/accessibility-testing/test-data/sample-output.json +191 -0
- package/.claude/skills/agentic-quality-engineering/SKILL.md +4 -0
- package/.claude/skills/agentic-quality-engineering/schemas/output.json +577 -0
- package/.claude/skills/api-testing-patterns/SKILL.md +5 -0
- package/.claude/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -0
- package/.claude/skills/api-testing-patterns/schemas/output.json +845 -0
- package/.claude/skills/api-testing-patterns/scripts/validate.sh +931 -0
- package/.claude/skills/aqe-v2-v3-migration/schemas/output.json +513 -0
- package/.claude/skills/aqe-v2-v3-migration/skill.md +4 -0
- package/.claude/skills/brutal-honesty-review/SKILL.md +5 -0
- package/.claude/skills/brutal-honesty-review/schemas/output.json +291 -0
- package/.claude/skills/brutal-honesty-review/scripts/validate.sh +130 -0
- package/.claude/skills/bug-reporting-excellence/SKILL.md +5 -0
- package/.claude/skills/bug-reporting-excellence/schemas/output.json +288 -0
- package/.claude/skills/bug-reporting-excellence/scripts/validate.sh +108 -0
- package/.claude/skills/chaos-engineering-resilience/SKILL.md +5 -0
- package/.claude/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -0
- package/.claude/skills/chaos-engineering-resilience/schemas/output.json +1205 -0
- package/.claude/skills/chaos-engineering-resilience/scripts/validate.sh +1107 -0
- package/.claude/skills/cicd-pipeline-qe-orchestrator/SKILL.md +6 -0
- package/.claude/skills/cicd-pipeline-qe-orchestrator/evals/cicd-pipeline-qe-orchestrator.yaml +157 -0
- package/.claude/skills/cicd-pipeline-qe-orchestrator/schemas/output.json +542 -0
- package/.claude/skills/cicd-pipeline-qe-orchestrator/scripts/validate.sh +310 -0
- package/.claude/skills/code-review-quality/SKILL.md +5 -0
- package/.claude/skills/code-review-quality/schemas/output.json +264 -0
- package/.claude/skills/code-review-quality/scripts/validate.sh +113 -0
- package/.claude/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -0
- package/.claude/skills/compatibility-testing/schemas/output.json +551 -0
- package/.claude/skills/compatibility-testing/scripts/validate.sh +605 -0
- package/.claude/skills/compliance-testing/SKILL.md +7 -0
- package/.claude/skills/compliance-testing/evals/compliance-testing.yaml +1107 -0
- package/.claude/skills/compliance-testing/schemas/output.json +845 -0
- package/.claude/skills/compliance-testing/scripts/validate.sh +888 -0
- package/.claude/skills/consultancy-practices/SKILL.md +4 -0
- package/.claude/skills/consultancy-practices/schemas/output.json +282 -0
- package/.claude/skills/context-driven-testing/SKILL.md +3 -0
- package/.claude/skills/contract-testing/SKILL.md +5 -0
- package/.claude/skills/contract-testing/evals/contract-testing.yaml +748 -0
- package/.claude/skills/contract-testing/schemas/output.json +638 -0
- package/.claude/skills/contract-testing/scripts/validate.sh +1033 -0
- package/.claude/skills/database-testing/SKILL.md +5 -0
- package/.claude/skills/database-testing/evals/database-testing.yaml +968 -0
- package/.claude/skills/database-testing/schemas/output.json +1446 -0
- package/.claude/skills/database-testing/scripts/validate.sh +1099 -0
- package/.claude/skills/exploratory-testing-advanced/SKILL.md +3 -0
- package/.claude/skills/holistic-testing-pact/SKILL.md +3 -0
- package/.claude/skills/localization-testing/SKILL.md +6 -0
- package/.claude/skills/localization-testing/evals/localization-testing.yaml +544 -0
- package/.claude/skills/localization-testing/schemas/output.json +325 -0
- package/.claude/skills/localization-testing/scripts/validate.sh +131 -0
- package/.claude/skills/mobile-testing/SKILL.md +6 -0
- package/.claude/skills/mobile-testing/evals/mobile-testing.yaml +537 -0
- package/.claude/skills/mobile-testing/schemas/output.json +318 -0
- package/.claude/skills/mobile-testing/scripts/validate.sh +127 -0
- package/.claude/skills/mutation-testing/SKILL.md +8 -1
- package/.claude/skills/mutation-testing/evals/mutation-testing.yaml +652 -0
- package/.claude/skills/mutation-testing/schemas/output.json +707 -0
- package/.claude/skills/mutation-testing/scripts/validate.sh +992 -0
- package/.claude/skills/mutation-testing/test-data/sample-output.json +295 -0
- package/.claude/skills/n8n-expression-testing/SKILL.md +6 -0
- package/.claude/skills/n8n-expression-testing/evals/n8n-expression-testing.yaml +450 -0
- package/.claude/skills/n8n-expression-testing/schemas/output.json +369 -0
- package/.claude/skills/n8n-expression-testing/scripts/validate.sh +162 -0
- package/.claude/skills/n8n-integration-testing-patterns/SKILL.md +6 -0
- package/.claude/skills/n8n-integration-testing-patterns/evals/n8n-integration-testing-patterns.yaml +522 -0
- package/.claude/skills/n8n-integration-testing-patterns/schemas/output.json +291 -0
- package/.claude/skills/n8n-integration-testing-patterns/scripts/validate.sh +104 -0
- package/.claude/skills/n8n-security-testing/SKILL.md +6 -0
- package/.claude/skills/n8n-security-testing/evals/n8n-security-testing.yaml +493 -0
- package/.claude/skills/n8n-security-testing/schemas/output.json +293 -0
- package/.claude/skills/n8n-security-testing/scripts/validate.sh +120 -0
- package/.claude/skills/n8n-trigger-testing-strategies/SKILL.md +6 -0
- package/.claude/skills/n8n-trigger-testing-strategies/evals/n8n-trigger-testing-strategies.yaml +500 -0
- package/.claude/skills/n8n-trigger-testing-strategies/schemas/output.json +295 -0
- package/.claude/skills/n8n-trigger-testing-strategies/scripts/validate.sh +121 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/SKILL.md +6 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/evals/n8n-workflow-testing-fundamentals.yaml +497 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/schemas/output.json +254 -0
- package/.claude/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +126 -0
- package/.claude/skills/performance-analysis/SKILL.md +6 -0
- package/.claude/skills/performance-analysis/evals/performance-analysis.yaml +144 -0
- package/.claude/skills/performance-analysis/schemas/output.json +588 -0
- package/.claude/skills/performance-analysis/scripts/validate.sh +63 -0
- package/.claude/skills/performance-testing/SKILL.md +5 -0
- package/.claude/skills/performance-testing/evals/performance-testing.yaml +772 -0
- package/.claude/skills/performance-testing/schemas/output.json +1184 -0
- package/.claude/skills/performance-testing/scripts/validate.sh +1090 -0
- package/.claude/skills/qcsd-ideation-swarm/SKILL.md +1759 -1753
- package/.claude/skills/qcsd-ideation-swarm/evals/qcsd-ideation-swarm.yaml +138 -0
- package/.claude/skills/qcsd-ideation-swarm/schemas/output.json +568 -0
- package/.claude/skills/qcsd-ideation-swarm/scripts/validate.sh +56 -0
- package/.claude/skills/qe-chaos-resilience/SKILL.md +6 -0
- package/.claude/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -0
- package/.claude/skills/qe-chaos-resilience/schemas/output.json +314 -0
- package/.claude/skills/qe-chaos-resilience/scripts/validate.sh +401 -0
- package/.claude/skills/qe-code-intelligence/SKILL.md +6 -0
- package/.claude/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -0
- package/.claude/skills/qe-code-intelligence/schemas/output.json +315 -0
- package/.claude/skills/qe-code-intelligence/scripts/validate.sh +408 -0
- package/.claude/skills/qe-contract-testing/SKILL.md +6 -0
- package/.claude/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -0
- package/.claude/skills/qe-contract-testing/schemas/output.json +295 -0
- package/.claude/skills/qe-contract-testing/scripts/validate.sh +421 -0
- package/.claude/skills/qe-coverage-analysis/SKILL.md +6 -0
- package/.claude/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
- package/.claude/skills/qe-coverage-analysis/schemas/output.json +286 -0
- package/.claude/skills/qe-coverage-analysis/scripts/validate.sh +453 -0
- package/.claude/skills/qe-defect-intelligence/SKILL.md +6 -0
- package/.claude/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -0
- package/.claude/skills/qe-defect-intelligence/schemas/output.json +283 -0
- package/.claude/skills/qe-defect-intelligence/scripts/validate.sh +466 -0
- package/.claude/skills/qe-iterative-loop/SKILL.md +445 -440
- package/.claude/skills/qe-iterative-loop/schemas/output.json +264 -0
- package/.claude/skills/qe-iterative-loop/scripts/validate.sh +474 -0
- package/.claude/skills/qe-learning-optimization/SKILL.md +6 -0
- package/.claude/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -0
- package/.claude/skills/qe-learning-optimization/schemas/output.json +288 -0
- package/.claude/skills/qe-learning-optimization/scripts/validate.sh +56 -0
- package/.claude/skills/qe-quality-assessment/SKILL.md +6 -0
- package/.claude/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -0
- package/.claude/skills/qe-quality-assessment/schemas/output.json +550 -0
- package/.claude/skills/qe-quality-assessment/scripts/validate.sh +352 -0
- package/.claude/skills/qe-requirements-validation/SKILL.md +6 -0
- package/.claude/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
- package/.claude/skills/qe-requirements-validation/schemas/output.json +587 -0
- package/.claude/skills/qe-requirements-validation/scripts/validate.sh +275 -0
- package/.claude/skills/qe-security-compliance/SKILL.md +6 -0
- package/.claude/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -0
- package/.claude/skills/qe-security-compliance/schemas/output.json +498 -0
- package/.claude/skills/qe-security-compliance/scripts/validate.sh +305 -0
- package/.claude/skills/qe-test-execution/SKILL.md +6 -0
- package/.claude/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -0
- package/.claude/skills/qe-test-execution/schemas/output.json +529 -0
- package/.claude/skills/qe-test-execution/scripts/validate.sh +323 -0
- package/.claude/skills/qe-test-generation/SKILL.md +6 -0
- package/.claude/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -0
- package/.claude/skills/qe-test-generation/schemas/output.json +439 -0
- package/.claude/skills/qe-test-generation/scripts/validate.sh +56 -0
- package/.claude/skills/qe-visual-accessibility/SKILL.md +6 -0
- package/.claude/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -0
- package/.claude/skills/qe-visual-accessibility/schemas/output.json +491 -0
- package/.claude/skills/qe-visual-accessibility/scripts/validate.sh +56 -0
- package/.claude/skills/quality-metrics/SKILL.md +6 -0
- package/.claude/skills/quality-metrics/evals/quality-metrics.yaml +494 -0
- package/.claude/skills/quality-metrics/schemas/output.json +403 -0
- package/.claude/skills/quality-metrics/scripts/validate.sh +434 -0
- package/.claude/skills/refactoring-patterns/SKILL.md +5 -0
- package/.claude/skills/refactoring-patterns/schemas/output.json +475 -0
- package/.claude/skills/refactoring-patterns/scripts/validate.sh +241 -0
- package/.claude/skills/regression-testing/SKILL.md +6 -0
- package/.claude/skills/regression-testing/evals/regression-testing.yaml +504 -0
- package/.claude/skills/regression-testing/schemas/output.json +311 -0
- package/.claude/skills/regression-testing/scripts/validate.sh +130 -0
- package/.claude/skills/risk-based-testing/SKILL.md +6 -0
- package/.claude/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -0
- package/.claude/skills/risk-based-testing/schemas/output.json +480 -0
- package/.claude/skills/risk-based-testing/scripts/validate.sh +56 -0
- package/.claude/skills/security-testing/SKILL.md +5 -0
- package/.claude/skills/security-testing/evals/security-testing.yaml +789 -0
- package/.claude/skills/security-testing/schemas/output.json +879 -0
- package/.claude/skills/security-testing/scripts/validate.sh +967 -0
- package/.claude/skills/security-visual-testing/SKILL.md +223 -217
- package/.claude/skills/security-visual-testing/evals/security-visual-testing.yaml +163 -0
- package/.claude/skills/security-visual-testing/schemas/output.json +486 -0
- package/.claude/skills/security-visual-testing/scripts/validate.sh +748 -0
- package/.claude/skills/sherlock-review/SKILL.md +5 -0
- package/.claude/skills/sherlock-review/schemas/output.json +297 -0
- package/.claude/skills/sherlock-review/scripts/validate.sh +115 -0
- package/.claude/skills/shift-left-testing/SKILL.md +6 -0
- package/.claude/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -0
- package/.claude/skills/shift-left-testing/schemas/output.json +459 -0
- package/.claude/skills/shift-left-testing/scripts/validate.sh +56 -0
- package/.claude/skills/shift-right-testing/SKILL.md +6 -0
- package/.claude/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -0
- package/.claude/skills/shift-right-testing/schemas/output.json +418 -0
- package/.claude/skills/shift-right-testing/scripts/validate.sh +56 -0
- package/.claude/skills/six-thinking-hats/SKILL.md +3 -0
- package/.claude/skills/tdd-london-chicago/SKILL.md +5 -0
- package/.claude/skills/tdd-london-chicago/schemas/output.json +444 -0
- package/.claude/skills/tdd-london-chicago/scripts/validate.sh +214 -0
- package/.claude/skills/technical-writing/SKILL.md +4 -0
- package/.claude/skills/technical-writing/schemas/output.json +268 -0
- package/.claude/skills/test-automation-strategy/SKILL.md +6 -0
- package/.claude/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -0
- package/.claude/skills/test-automation-strategy/schemas/output.json +444 -0
- package/.claude/skills/test-automation-strategy/scripts/validate.sh +195 -0
- package/.claude/skills/test-data-management/SKILL.md +6 -0
- package/.claude/skills/test-data-management/evals/test-data-management.yaml +504 -0
- package/.claude/skills/test-data-management/schemas/output.json +284 -0
- package/.claude/skills/test-data-management/scripts/validate.sh +137 -0
- package/.claude/skills/test-design-techniques/SKILL.md +6 -0
- package/.claude/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -0
- package/.claude/skills/test-design-techniques/schemas/output.json +295 -0
- package/.claude/skills/test-design-techniques/scripts/validate.sh +91 -0
- package/.claude/skills/test-environment-management/SKILL.md +4 -0
- package/.claude/skills/test-environment-management/schemas/output.json +310 -0
- package/.claude/skills/test-reporting-analytics/SKILL.md +6 -0
- package/.claude/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -0
- package/.claude/skills/test-reporting-analytics/schemas/output.json +329 -0
- package/.claude/skills/test-reporting-analytics/scripts/validate.sh +77 -0
- package/.claude/skills/testability-scoring/SKILL.md +5 -0
- package/.claude/skills/testability-scoring/evals/testability-scoring.yaml +814 -0
- package/.claude/skills/testability-scoring/schemas/output.json +606 -0
- package/.claude/skills/testability-scoring/scripts/validate.sh +891 -0
- package/.claude/skills/trust-tier-manifest.json +2333 -0
- package/.claude/skills/verification-quality/SKILL.md +6 -0
- package/.claude/skills/verification-quality/evals/verification-quality.yaml +150 -0
- package/.claude/skills/verification-quality/schemas/output.json +432 -0
- package/.claude/skills/verification-quality/scripts/validate.sh +77 -0
- package/.claude/skills/visual-testing-advanced/SKILL.md +6 -0
- package/.claude/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -0
- package/.claude/skills/visual-testing-advanced/schemas/output.json +294 -0
- package/.claude/skills/visual-testing-advanced/scripts/validate.sh +77 -0
- package/.claude/skills/xp-practices/SKILL.md +3 -0
- package/README.md +39 -2
- package/package.json +4 -1
- package/scripts/run-skill-eval.ts +1097 -0
- package/scripts/test-schema-validation.js +301 -0
- package/scripts/update-skill-manifest.ts +751 -0
- package/scripts/validate-skill-frontmatter.js +141 -0
- package/v3/CHANGELOG.md +21 -0
- package/v3/README.md +43 -3
- package/v3/assets/agents/v3/qe-test-idea-rewriter.md +375 -375
- package/v3/assets/skills/.validation/README.md +111 -0
- package/v3/assets/skills/.validation/examples/chaos-engineering-output.example.json +530 -0
- package/v3/assets/skills/.validation/examples/performance-testing-output.example.json +252 -0
- package/v3/assets/skills/.validation/examples/security-testing-output.example.json +413 -0
- package/v3/assets/skills/.validation/examples/testability-scoring-output.example.json +350 -0
- package/v3/assets/skills/.validation/schemas/skill-eval.schema.json +452 -0
- package/v3/assets/skills/.validation/schemas/skill-frontmatter.schema.json +341 -0
- package/v3/assets/skills/.validation/schemas/skill-output-meta.schema.json +199 -0
- package/v3/assets/skills/.validation/schemas/skill-output.template.json +610 -0
- package/v3/assets/skills/.validation/skill-validation-mcp-integration.md +250 -0
- package/v3/assets/skills/.validation/templates/eval.template.yaml +366 -0
- package/v3/assets/skills/.validation/templates/schemas/output.json +145 -0
- package/v3/assets/skills/.validation/templates/security-testing-eval.template.yaml +725 -0
- package/v3/assets/skills/.validation/templates/skill-frontmatter.example.yaml +225 -0
- package/v3/assets/skills/.validation/templates/validate.template.sh +1060 -0
- package/v3/assets/skills/.validation/templates/validator-lib.sh +1031 -0
- package/v3/assets/skills/.validation/test-data/invalid-output.json +5 -0
- package/v3/assets/skills/.validation/test-data/minimal-output.json +9 -0
- package/v3/assets/skills/.validation/test-data/sample-output.json +73 -0
- package/v3/assets/skills/accessibility-testing/SKILL.md +8 -1
- package/v3/assets/skills/accessibility-testing/evals/accessibility-testing.yaml +719 -0
- package/v3/assets/skills/accessibility-testing/schemas/output.json +776 -0
- package/v3/assets/skills/accessibility-testing/scripts/validate.sh +943 -0
- package/v3/assets/skills/accessibility-testing/test-data/sample-output.json +191 -0
- package/v3/assets/skills/agentic-quality-engineering/SKILL.md +4 -0
- package/v3/assets/skills/agentic-quality-engineering/schemas/output.json +577 -0
- package/v3/assets/skills/api-testing-patterns/SKILL.md +5 -0
- package/v3/assets/skills/api-testing-patterns/evals/api-testing-patterns.yaml +696 -0
- package/v3/assets/skills/api-testing-patterns/schemas/output.json +845 -0
- package/v3/assets/skills/api-testing-patterns/scripts/validate.sh +931 -0
- package/v3/assets/skills/aqe-v2-v3-migration/schemas/output.json +513 -0
- package/v3/assets/skills/aqe-v2-v3-migration/skill.md +20 -16
- package/v3/assets/skills/bug-reporting-excellence/SKILL.md +5 -0
- package/v3/assets/skills/bug-reporting-excellence/schemas/output.json +288 -0
- package/v3/assets/skills/bug-reporting-excellence/scripts/validate.sh +108 -0
- package/v3/assets/skills/chaos-engineering-resilience/SKILL.md +5 -0
- package/v3/assets/skills/chaos-engineering-resilience/evals/chaos-engineering-resilience.yaml +761 -0
- package/v3/assets/skills/chaos-engineering-resilience/schemas/output.json +1205 -0
- package/v3/assets/skills/chaos-engineering-resilience/scripts/validate.sh +1107 -0
- package/v3/assets/skills/code-review-quality/SKILL.md +5 -0
- package/v3/assets/skills/code-review-quality/schemas/output.json +264 -0
- package/v3/assets/skills/code-review-quality/scripts/validate.sh +113 -0
- package/v3/assets/skills/compatibility-testing/evals/compatibility-testing.yaml +410 -0
- package/v3/assets/skills/compatibility-testing/schemas/output.json +551 -0
- package/v3/assets/skills/compatibility-testing/scripts/validate.sh +605 -0
- package/v3/assets/skills/compliance-testing/SKILL.md +7 -0
- package/v3/assets/skills/compliance-testing/evals/compliance-testing.yaml +1107 -0
- package/v3/assets/skills/compliance-testing/schemas/output.json +845 -0
- package/v3/assets/skills/compliance-testing/scripts/validate.sh +888 -0
- package/v3/assets/skills/consultancy-practices/SKILL.md +4 -0
- package/v3/assets/skills/consultancy-practices/schemas/output.json +282 -0
- package/v3/assets/skills/context-driven-testing/SKILL.md +3 -0
- package/v3/assets/skills/contract-testing/SKILL.md +5 -0
- package/v3/assets/skills/contract-testing/evals/contract-testing.yaml +748 -0
- package/v3/assets/skills/contract-testing/schemas/output.json +638 -0
- package/v3/assets/skills/contract-testing/scripts/validate.sh +1033 -0
- package/v3/assets/skills/database-testing/SKILL.md +5 -0
- package/v3/assets/skills/database-testing/evals/database-testing.yaml +968 -0
- package/v3/assets/skills/database-testing/schemas/output.json +1446 -0
- package/v3/assets/skills/database-testing/scripts/validate.sh +1099 -0
- package/v3/assets/skills/exploratory-testing-advanced/SKILL.md +3 -0
- package/v3/assets/skills/holistic-testing-pact/SKILL.md +3 -0
- package/v3/assets/skills/localization-testing/SKILL.md +6 -0
- package/v3/assets/skills/localization-testing/evals/localization-testing.yaml +544 -0
- package/v3/assets/skills/localization-testing/schemas/output.json +325 -0
- package/v3/assets/skills/localization-testing/scripts/validate.sh +131 -0
- package/v3/assets/skills/mobile-testing/SKILL.md +6 -0
- package/v3/assets/skills/mobile-testing/evals/mobile-testing.yaml +537 -0
- package/v3/assets/skills/mobile-testing/schemas/output.json +318 -0
- package/v3/assets/skills/mobile-testing/scripts/validate.sh +127 -0
- package/v3/assets/skills/mutation-testing/SKILL.md +8 -1
- package/v3/assets/skills/mutation-testing/evals/mutation-testing.yaml +652 -0
- package/v3/assets/skills/mutation-testing/schemas/output.json +707 -0
- package/v3/assets/skills/mutation-testing/scripts/validate.sh +992 -0
- package/v3/assets/skills/mutation-testing/test-data/sample-output.json +295 -0
- package/v3/assets/skills/n8n-expression-testing/scripts/validate.sh +162 -0
- package/v3/assets/skills/n8n-integration-testing-patterns/scripts/validate.sh +104 -0
- package/v3/assets/skills/n8n-security-testing/scripts/validate.sh +120 -0
- package/v3/assets/skills/n8n-trigger-testing-strategies/scripts/validate.sh +121 -0
- package/v3/assets/skills/n8n-workflow-testing-fundamentals/scripts/validate.sh +126 -0
- package/v3/assets/skills/performance-testing/SKILL.md +5 -0
- package/v3/assets/skills/performance-testing/evals/performance-testing.yaml +772 -0
- package/v3/assets/skills/performance-testing/schemas/output.json +1184 -0
- package/v3/assets/skills/performance-testing/scripts/validate.sh +1090 -0
- package/v3/assets/skills/qe-chaos-resilience/SKILL.md +6 -0
- package/v3/assets/skills/qe-chaos-resilience/evals/qe-chaos-resilience.yaml +443 -0
- package/v3/assets/skills/qe-chaos-resilience/schemas/output.json +314 -0
- package/v3/assets/skills/qe-chaos-resilience/scripts/validate.sh +401 -0
- package/v3/assets/skills/qe-code-intelligence/SKILL.md +6 -0
- package/v3/assets/skills/qe-code-intelligence/evals/qe-code-intelligence.yaml +459 -0
- package/v3/assets/skills/qe-code-intelligence/schemas/output.json +315 -0
- package/v3/assets/skills/qe-code-intelligence/scripts/validate.sh +408 -0
- package/v3/assets/skills/qe-contract-testing/SKILL.md +6 -0
- package/v3/assets/skills/qe-contract-testing/evals/qe-contract-testing.yaml +513 -0
- package/v3/assets/skills/qe-contract-testing/schemas/output.json +295 -0
- package/v3/assets/skills/qe-contract-testing/scripts/validate.sh +421 -0
- package/v3/assets/skills/qe-coverage-analysis/SKILL.md +6 -0
- package/v3/assets/skills/qe-coverage-analysis/evals/qe-coverage-analysis.yaml +494 -0
- package/v3/assets/skills/qe-coverage-analysis/schemas/output.json +286 -0
- package/v3/assets/skills/qe-coverage-analysis/scripts/validate.sh +453 -0
- package/v3/assets/skills/qe-defect-intelligence/SKILL.md +6 -0
- package/v3/assets/skills/qe-defect-intelligence/evals/qe-defect-intelligence.yaml +511 -0
- package/v3/assets/skills/qe-defect-intelligence/schemas/output.json +283 -0
- package/v3/assets/skills/qe-defect-intelligence/scripts/validate.sh +466 -0
- package/v3/assets/skills/qe-iterative-loop/SKILL.md +445 -443
- package/v3/assets/skills/qe-iterative-loop/schemas/output.json +264 -0
- package/v3/assets/skills/qe-iterative-loop/scripts/validate.sh +474 -0
- package/v3/assets/skills/qe-learning-optimization/SKILL.md +6 -0
- package/v3/assets/skills/qe-learning-optimization/evals/qe-learning-optimization.yaml +144 -0
- package/v3/assets/skills/qe-learning-optimization/schemas/output.json +288 -0
- package/v3/assets/skills/qe-learning-optimization/scripts/validate.sh +56 -0
- package/v3/assets/skills/qe-quality-assessment/SKILL.md +6 -0
- package/v3/assets/skills/qe-quality-assessment/evals/qe-quality-assessment.yaml +506 -0
- package/v3/assets/skills/qe-quality-assessment/schemas/output.json +550 -0
- package/v3/assets/skills/qe-quality-assessment/scripts/validate.sh +352 -0
- package/v3/assets/skills/qe-requirements-validation/SKILL.md +6 -0
- package/v3/assets/skills/qe-requirements-validation/evals/qe-requirements-validation.yaml +598 -0
- package/v3/assets/skills/qe-requirements-validation/schemas/output.json +587 -0
- package/v3/assets/skills/qe-requirements-validation/scripts/validate.sh +275 -0
- package/v3/assets/skills/qe-security-compliance/SKILL.md +6 -0
- package/v3/assets/skills/qe-security-compliance/evals/qe-security-compliance.yaml +595 -0
- package/v3/assets/skills/qe-security-compliance/schemas/output.json +498 -0
- package/v3/assets/skills/qe-security-compliance/scripts/validate.sh +305 -0
- package/v3/assets/skills/qe-test-execution/SKILL.md +6 -0
- package/v3/assets/skills/qe-test-execution/evals/qe-test-execution.yaml +607 -0
- package/v3/assets/skills/qe-test-execution/schemas/output.json +529 -0
- package/v3/assets/skills/qe-test-execution/scripts/validate.sh +323 -0
- package/v3/assets/skills/qe-test-generation/SKILL.md +6 -0
- package/v3/assets/skills/qe-test-generation/evals/qe-test-generation.yaml +148 -0
- package/v3/assets/skills/qe-test-generation/schemas/output.json +439 -0
- package/v3/assets/skills/qe-test-generation/scripts/validate.sh +56 -0
- package/v3/assets/skills/qe-visual-accessibility/SKILL.md +6 -0
- package/v3/assets/skills/qe-visual-accessibility/evals/qe-visual-accessibility.yaml +142 -0
- package/v3/assets/skills/qe-visual-accessibility/schemas/output.json +491 -0
- package/v3/assets/skills/qe-visual-accessibility/scripts/validate.sh +56 -0
- package/v3/assets/skills/quality-metrics/SKILL.md +6 -0
- package/v3/assets/skills/quality-metrics/evals/quality-metrics.yaml +494 -0
- package/v3/assets/skills/quality-metrics/schemas/output.json +403 -0
- package/v3/assets/skills/quality-metrics/scripts/validate.sh +434 -0
- package/v3/assets/skills/refactoring-patterns/SKILL.md +5 -0
- package/v3/assets/skills/refactoring-patterns/schemas/output.json +475 -0
- package/v3/assets/skills/refactoring-patterns/scripts/validate.sh +241 -0
- package/v3/assets/skills/regression-testing/SKILL.md +6 -0
- package/v3/assets/skills/regression-testing/evals/regression-testing.yaml +504 -0
- package/v3/assets/skills/regression-testing/schemas/output.json +311 -0
- package/v3/assets/skills/regression-testing/scripts/validate.sh +130 -0
- package/v3/assets/skills/risk-based-testing/SKILL.md +6 -0
- package/v3/assets/skills/risk-based-testing/evals/risk-based-testing.yaml +141 -0
- package/v3/assets/skills/risk-based-testing/schemas/output.json +480 -0
- package/v3/assets/skills/risk-based-testing/scripts/validate.sh +56 -0
- package/v3/assets/skills/security-testing/SKILL.md +5 -0
- package/v3/assets/skills/security-testing/evals/security-testing.yaml +789 -0
- package/v3/assets/skills/security-testing/schemas/output.json +879 -0
- package/v3/assets/skills/security-testing/scripts/validate.sh +967 -0
- package/v3/assets/skills/shift-left-testing/SKILL.md +6 -0
- package/v3/assets/skills/shift-left-testing/evals/shift-left-testing.yaml +145 -0
- package/v3/assets/skills/shift-left-testing/schemas/output.json +459 -0
- package/v3/assets/skills/shift-left-testing/scripts/validate.sh +56 -0
- package/v3/assets/skills/shift-right-testing/SKILL.md +6 -0
- package/v3/assets/skills/shift-right-testing/evals/shift-right-testing.yaml +147 -0
- package/v3/assets/skills/shift-right-testing/schemas/output.json +418 -0
- package/v3/assets/skills/shift-right-testing/scripts/validate.sh +56 -0
- package/v3/assets/skills/six-thinking-hats/SKILL.md +3 -0
- package/v3/assets/skills/tdd-london-chicago/SKILL.md +5 -0
- package/v3/assets/skills/tdd-london-chicago/schemas/output.json +444 -0
- package/v3/assets/skills/tdd-london-chicago/scripts/validate.sh +214 -0
- package/v3/assets/skills/technical-writing/SKILL.md +4 -0
- package/v3/assets/skills/technical-writing/schemas/output.json +268 -0
- package/v3/assets/skills/test-automation-strategy/SKILL.md +6 -0
- package/v3/assets/skills/test-automation-strategy/evals/test-automation-strategy.yaml +148 -0
- package/v3/assets/skills/test-automation-strategy/schemas/output.json +444 -0
- package/v3/assets/skills/test-automation-strategy/scripts/validate.sh +195 -0
- package/v3/assets/skills/test-data-management/SKILL.md +6 -0
- package/v3/assets/skills/test-data-management/evals/test-data-management.yaml +504 -0
- package/v3/assets/skills/test-data-management/schemas/output.json +284 -0
- package/v3/assets/skills/test-data-management/scripts/validate.sh +137 -0
- package/v3/assets/skills/test-design-techniques/SKILL.md +6 -0
- package/v3/assets/skills/test-design-techniques/evals/test-design-techniques.yaml +142 -0
- package/v3/assets/skills/test-design-techniques/schemas/output.json +295 -0
- package/v3/assets/skills/test-design-techniques/scripts/validate.sh +91 -0
- package/v3/assets/skills/test-environment-management/SKILL.md +4 -0
- package/v3/assets/skills/test-environment-management/schemas/output.json +310 -0
- package/v3/assets/skills/test-reporting-analytics/SKILL.md +6 -0
- package/v3/assets/skills/test-reporting-analytics/evals/test-reporting-analytics.yaml +155 -0
- package/v3/assets/skills/test-reporting-analytics/schemas/output.json +329 -0
- package/v3/assets/skills/test-reporting-analytics/scripts/validate.sh +77 -0
- package/v3/assets/skills/verification-quality/SKILL.md +6 -0
- package/v3/assets/skills/verification-quality/evals/verification-quality.yaml +150 -0
- package/v3/assets/skills/verification-quality/schemas/output.json +432 -0
- package/v3/assets/skills/verification-quality/scripts/validate.sh +77 -0
- package/v3/assets/skills/visual-testing-advanced/SKILL.md +6 -0
- package/v3/assets/skills/visual-testing-advanced/evals/visual-testing-advanced.yaml +154 -0
- package/v3/assets/skills/visual-testing-advanced/schemas/output.json +294 -0
- package/v3/assets/skills/visual-testing-advanced/scripts/validate.sh +77 -0
- package/v3/assets/skills/xp-practices/SKILL.md +3 -0
- package/v3/assets/templates/validation-report.md.hbs +139 -0
- package/v3/assets/templates/validation-summary.json +56 -0
- package/v3/dist/cli/bundle.js +7368 -3418
- package/v3/dist/cli/commands/eval.d.ts +18 -0
- package/v3/dist/cli/commands/eval.d.ts.map +1 -0
- package/v3/dist/cli/commands/eval.js +505 -0
- package/v3/dist/cli/commands/eval.js.map +1 -0
- package/v3/dist/cli/commands/validate-swarm.d.ts +16 -0
- package/v3/dist/cli/commands/validate-swarm.d.ts.map +1 -0
- package/v3/dist/cli/commands/validate-swarm.js +251 -0
- package/v3/dist/cli/commands/validate-swarm.js.map +1 -0
- package/v3/dist/cli/commands/validate.d.ts +14 -0
- package/v3/dist/cli/commands/validate.d.ts.map +1 -0
- package/v3/dist/cli/commands/validate.js +408 -0
- package/v3/dist/cli/commands/validate.js.map +1 -0
- package/v3/dist/cli/index.js +6 -0
- package/v3/dist/cli/index.js.map +1 -1
- package/v3/dist/index.d.ts +2 -0
- package/v3/dist/index.d.ts.map +1 -1
- package/v3/dist/index.js +10 -0
- package/v3/dist/index.js.map +1 -1
- package/v3/dist/init/skills-installer.d.ts +6 -0
- package/v3/dist/init/skills-installer.d.ts.map +1 -1
- package/v3/dist/init/skills-installer.js +48 -0
- package/v3/dist/init/skills-installer.js.map +1 -1
- package/v3/dist/learning/index.d.ts +2 -0
- package/v3/dist/learning/index.d.ts.map +1 -1
- package/v3/dist/learning/index.js +4 -0
- package/v3/dist/learning/index.js.map +1 -1
- package/v3/dist/learning/skill-validation-learner.d.ts +264 -0
- package/v3/dist/learning/skill-validation-learner.d.ts.map +1 -0
- package/v3/dist/learning/skill-validation-learner.js +515 -0
- package/v3/dist/learning/skill-validation-learner.js.map +1 -0
- package/v3/dist/validation/index.d.ts +19 -0
- package/v3/dist/validation/index.d.ts.map +1 -0
- package/v3/dist/validation/index.js +31 -0
- package/v3/dist/validation/index.js.map +1 -0
- package/v3/dist/validation/parallel-eval-runner.d.ts +307 -0
- package/v3/dist/validation/parallel-eval-runner.d.ts.map +1 -0
- package/v3/dist/validation/parallel-eval-runner.js +566 -0
- package/v3/dist/validation/parallel-eval-runner.js.map +1 -0
- package/v3/dist/validation/swarm-skill-validator.d.ts +282 -0
- package/v3/dist/validation/swarm-skill-validator.d.ts.map +1 -0
- package/v3/dist/validation/swarm-skill-validator.js +460 -0
- package/v3/dist/validation/swarm-skill-validator.js.map +1 -0
- package/v3/dist/validation/validation-result-aggregator.d.ts +232 -0
- package/v3/dist/validation/validation-result-aggregator.d.ts.map +1 -0
- package/v3/dist/validation/validation-result-aggregator.js +630 -0
- package/v3/dist/validation/validation-result-aggregator.js.map +1 -0
- 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
|