agentic-qe 3.4.0 → 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/CHANGELOG.md +23 -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 +11853 -5316
- 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/mcp/bundle.js +10043 -3630
- 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,931 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# AQE API Testing Patterns Skill Validator v1.0.0
|
|
4
|
+
# Validates output from the api-testing-patterns 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="api-testing-patterns"
|
|
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 API 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=("node" "supertest" "pact" "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.testingLevel" "output.endpointCoverage")
|
|
88
|
+
|
|
89
|
+
# Fields that must have non-null, non-empty values
|
|
90
|
+
REQUIRED_NON_EMPTY_FIELDS=("output.summary" "output.testingLevel")
|
|
91
|
+
|
|
92
|
+
# Terms that MUST appear somewhere in output (case-insensitive)
|
|
93
|
+
# API testing outputs should mention these concepts
|
|
94
|
+
MUST_CONTAIN_TERMS=("api" "test")
|
|
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.testingLevel:contract,component,integration,e2e,load,mixed"
|
|
103
|
+
".output.apiType:rest,graphql,grpc,websocket,mixed"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
# Minimum array lengths
|
|
107
|
+
MIN_ARRAY_LENGTHS=(
|
|
108
|
+
".output.endpointCoverage.totalEndpoints:0"
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
# =============================================================================
|
|
112
|
+
# Argument Parsing
|
|
113
|
+
# =============================================================================
|
|
114
|
+
|
|
115
|
+
OUTPUT_FILE=""
|
|
116
|
+
SELF_TEST=false
|
|
117
|
+
VERBOSE=false
|
|
118
|
+
JSON_ONLY=false
|
|
119
|
+
LIST_TOOLS=false
|
|
120
|
+
|
|
121
|
+
while [[ $# -gt 0 ]]; do
|
|
122
|
+
case "$1" in
|
|
123
|
+
--self-test)
|
|
124
|
+
SELF_TEST=true
|
|
125
|
+
shift
|
|
126
|
+
;;
|
|
127
|
+
--verbose|-v)
|
|
128
|
+
VERBOSE=true
|
|
129
|
+
export AQE_DEBUG=1
|
|
130
|
+
shift
|
|
131
|
+
;;
|
|
132
|
+
--json)
|
|
133
|
+
JSON_ONLY=true
|
|
134
|
+
shift
|
|
135
|
+
;;
|
|
136
|
+
--list-tools)
|
|
137
|
+
LIST_TOOLS=true
|
|
138
|
+
shift
|
|
139
|
+
;;
|
|
140
|
+
-h|--help)
|
|
141
|
+
cat << 'HELP_EOF'
|
|
142
|
+
AQE API Testing Patterns Skill Validator
|
|
143
|
+
|
|
144
|
+
Usage: ./validate.sh <output-file> [options]
|
|
145
|
+
./validate.sh --self-test [--verbose]
|
|
146
|
+
./validate.sh --list-tools
|
|
147
|
+
|
|
148
|
+
Arguments:
|
|
149
|
+
<output-file> Path to skill output JSON file to validate
|
|
150
|
+
|
|
151
|
+
Options:
|
|
152
|
+
--self-test Run validator self-test mode
|
|
153
|
+
--verbose, -v Enable verbose/debug output
|
|
154
|
+
--json Output results as JSON only (for CI integration)
|
|
155
|
+
--list-tools Show available validation tools and exit
|
|
156
|
+
--help, -h Show this help message
|
|
157
|
+
|
|
158
|
+
Exit Codes:
|
|
159
|
+
0 - Validation passed
|
|
160
|
+
1 - Validation failed
|
|
161
|
+
2 - Validation skipped (missing required tools)
|
|
162
|
+
|
|
163
|
+
Examples:
|
|
164
|
+
./validate.sh output.json # Validate output file
|
|
165
|
+
./validate.sh output.json --json # JSON output for CI
|
|
166
|
+
./validate.sh --self-test --verbose # Self-test with debug
|
|
167
|
+
./validate.sh --list-tools # Show available tools
|
|
168
|
+
|
|
169
|
+
API Testing Specific Validations:
|
|
170
|
+
- Validates endpoint coverage structure
|
|
171
|
+
- Checks for valid HTTP methods (GET, POST, PUT, PATCH, DELETE)
|
|
172
|
+
- Verifies contract testing specifications
|
|
173
|
+
- Validates test recommendation structure
|
|
174
|
+
- Checks for proper status code coverage
|
|
175
|
+
|
|
176
|
+
HELP_EOF
|
|
177
|
+
exit 0
|
|
178
|
+
;;
|
|
179
|
+
-*)
|
|
180
|
+
error "Unknown option: $1"
|
|
181
|
+
echo "Use --help for usage information"
|
|
182
|
+
exit 1
|
|
183
|
+
;;
|
|
184
|
+
*)
|
|
185
|
+
OUTPUT_FILE="$1"
|
|
186
|
+
shift
|
|
187
|
+
;;
|
|
188
|
+
esac
|
|
189
|
+
done
|
|
190
|
+
|
|
191
|
+
# Handle --list-tools mode
|
|
192
|
+
if [[ "$LIST_TOOLS" == "true" ]]; then
|
|
193
|
+
echo "=============================================="
|
|
194
|
+
echo "Available Validation Tools for $SKILL_NAME"
|
|
195
|
+
echo "=============================================="
|
|
196
|
+
echo ""
|
|
197
|
+
echo "Required tools:"
|
|
198
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
199
|
+
if command_exists "$tool"; then
|
|
200
|
+
echo " [OK] $tool"
|
|
201
|
+
else
|
|
202
|
+
echo " [MISSING] $tool"
|
|
203
|
+
fi
|
|
204
|
+
done
|
|
205
|
+
echo ""
|
|
206
|
+
echo "Optional tools (enhance validation):"
|
|
207
|
+
for tool in "${OPTIONAL_TOOLS[@]}"; do
|
|
208
|
+
if command_exists "$tool"; then
|
|
209
|
+
echo " [OK] $tool"
|
|
210
|
+
else
|
|
211
|
+
echo " [MISSING] $tool"
|
|
212
|
+
fi
|
|
213
|
+
done
|
|
214
|
+
echo ""
|
|
215
|
+
echo "Tool purposes:"
|
|
216
|
+
echo " - jq: JSON parsing and validation (required)"
|
|
217
|
+
echo " - node: JavaScript runtime for test execution"
|
|
218
|
+
echo " - supertest: HTTP assertion library for integration tests"
|
|
219
|
+
echo " - pact: Consumer-driven contract testing"
|
|
220
|
+
echo " - ajv: JSON Schema validation"
|
|
221
|
+
echo " - jsonschema: Alternative JSON Schema validation"
|
|
222
|
+
echo " - python3: Fallback JSON parsing"
|
|
223
|
+
exit 0
|
|
224
|
+
fi
|
|
225
|
+
|
|
226
|
+
# =============================================================================
|
|
227
|
+
# Self-Test Mode
|
|
228
|
+
# =============================================================================
|
|
229
|
+
|
|
230
|
+
if [[ "$SELF_TEST" == "true" ]]; then
|
|
231
|
+
echo "=============================================="
|
|
232
|
+
info "Running $SKILL_NAME Validator Self-Test"
|
|
233
|
+
echo "=============================================="
|
|
234
|
+
echo ""
|
|
235
|
+
echo "Validator version: $AQE_VALIDATOR_VERSION"
|
|
236
|
+
echo "Skill version: $SKILL_VERSION"
|
|
237
|
+
echo ""
|
|
238
|
+
|
|
239
|
+
self_test_passed=true
|
|
240
|
+
self_test_warnings=0
|
|
241
|
+
|
|
242
|
+
# -------------------------------------------
|
|
243
|
+
# Step 1: Check Required Tools
|
|
244
|
+
# -------------------------------------------
|
|
245
|
+
echo "--- Step 1: Required Tools ---"
|
|
246
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
247
|
+
if command_exists "$tool"; then
|
|
248
|
+
success "Required tool available: $tool"
|
|
249
|
+
else
|
|
250
|
+
error "Required tool MISSING: $tool"
|
|
251
|
+
self_test_passed=false
|
|
252
|
+
fi
|
|
253
|
+
done
|
|
254
|
+
echo ""
|
|
255
|
+
|
|
256
|
+
# -------------------------------------------
|
|
257
|
+
# Step 2: Check Optional Tools
|
|
258
|
+
# -------------------------------------------
|
|
259
|
+
echo "--- Step 2: Optional Tools ---"
|
|
260
|
+
available_optional=0
|
|
261
|
+
for tool in "${OPTIONAL_TOOLS[@]}"; do
|
|
262
|
+
if command_exists "$tool"; then
|
|
263
|
+
success "Optional tool available: $tool"
|
|
264
|
+
((available_optional++)) || true
|
|
265
|
+
else
|
|
266
|
+
warn "Optional tool missing: $tool"
|
|
267
|
+
((self_test_warnings++)) || true
|
|
268
|
+
fi
|
|
269
|
+
done
|
|
270
|
+
|
|
271
|
+
if [[ $available_optional -eq 0 ]]; then
|
|
272
|
+
warn "No optional tools available - validation capabilities limited"
|
|
273
|
+
((self_test_warnings++)) || true
|
|
274
|
+
fi
|
|
275
|
+
echo ""
|
|
276
|
+
|
|
277
|
+
# -------------------------------------------
|
|
278
|
+
# Step 3: Check Schema File
|
|
279
|
+
# -------------------------------------------
|
|
280
|
+
echo "--- Step 3: Schema File ---"
|
|
281
|
+
if [[ -f "$SCHEMA_PATH" ]]; then
|
|
282
|
+
success "Schema file exists: $SCHEMA_PATH"
|
|
283
|
+
if validate_json "$SCHEMA_PATH" 2>/dev/null; then
|
|
284
|
+
success "Schema file is valid JSON"
|
|
285
|
+
else
|
|
286
|
+
error "Schema file is NOT valid JSON"
|
|
287
|
+
self_test_passed=false
|
|
288
|
+
fi
|
|
289
|
+
else
|
|
290
|
+
error "Schema file not found: $SCHEMA_PATH"
|
|
291
|
+
self_test_passed=false
|
|
292
|
+
fi
|
|
293
|
+
echo ""
|
|
294
|
+
|
|
295
|
+
# -------------------------------------------
|
|
296
|
+
# Step 4: Validate API-Specific Structures
|
|
297
|
+
# -------------------------------------------
|
|
298
|
+
echo "--- Step 4: API Testing Schema Definitions ---"
|
|
299
|
+
if [[ -f "$SCHEMA_PATH" ]]; then
|
|
300
|
+
# Check for API-specific schema definitions
|
|
301
|
+
has_endpoint=$(jq 'has("$defs") and (."$defs" | has("endpoint"))' "$SCHEMA_PATH" 2>/dev/null)
|
|
302
|
+
has_contract=$(jq 'has("$defs") and (."$defs" | has("contract"))' "$SCHEMA_PATH" 2>/dev/null)
|
|
303
|
+
has_coverage=$(jq 'has("$defs") and (."$defs" | has("endpointCoverage"))' "$SCHEMA_PATH" 2>/dev/null)
|
|
304
|
+
|
|
305
|
+
if [[ "$has_endpoint" == "true" ]]; then
|
|
306
|
+
success "Schema has endpoint definition"
|
|
307
|
+
else
|
|
308
|
+
warn "Schema missing endpoint definition"
|
|
309
|
+
((self_test_warnings++)) || true
|
|
310
|
+
fi
|
|
311
|
+
|
|
312
|
+
if [[ "$has_contract" == "true" ]]; then
|
|
313
|
+
success "Schema has contract definition"
|
|
314
|
+
else
|
|
315
|
+
warn "Schema missing contract definition"
|
|
316
|
+
((self_test_warnings++)) || true
|
|
317
|
+
fi
|
|
318
|
+
|
|
319
|
+
if [[ "$has_coverage" == "true" ]]; then
|
|
320
|
+
success "Schema has endpointCoverage definition"
|
|
321
|
+
else
|
|
322
|
+
warn "Schema missing endpointCoverage definition"
|
|
323
|
+
((self_test_warnings++)) || true
|
|
324
|
+
fi
|
|
325
|
+
fi
|
|
326
|
+
echo ""
|
|
327
|
+
|
|
328
|
+
# -------------------------------------------
|
|
329
|
+
# Step 5: Run Library Self-Test
|
|
330
|
+
# -------------------------------------------
|
|
331
|
+
echo "--- Step 5: Validator Library Self-Test ---"
|
|
332
|
+
if [[ "$VERBOSE" == "true" ]]; then
|
|
333
|
+
if run_self_test --verbose; then
|
|
334
|
+
success "Library self-test passed"
|
|
335
|
+
else
|
|
336
|
+
error "Library self-test FAILED"
|
|
337
|
+
self_test_passed=false
|
|
338
|
+
fi
|
|
339
|
+
else
|
|
340
|
+
if run_self_test 2>/dev/null; then
|
|
341
|
+
success "Library self-test passed"
|
|
342
|
+
else
|
|
343
|
+
error "Library self-test FAILED"
|
|
344
|
+
self_test_passed=false
|
|
345
|
+
fi
|
|
346
|
+
fi
|
|
347
|
+
echo ""
|
|
348
|
+
|
|
349
|
+
# -------------------------------------------
|
|
350
|
+
# Self-Test Summary
|
|
351
|
+
# -------------------------------------------
|
|
352
|
+
echo "=============================================="
|
|
353
|
+
echo "Self-Test Summary for $SKILL_NAME"
|
|
354
|
+
echo "=============================================="
|
|
355
|
+
|
|
356
|
+
if [[ "$self_test_passed" == "true" ]]; then
|
|
357
|
+
if [[ $self_test_warnings -gt 0 ]]; then
|
|
358
|
+
warn "Self-test PASSED with $self_test_warnings warning(s)"
|
|
359
|
+
echo ""
|
|
360
|
+
echo "The validator is functional but has reduced capabilities."
|
|
361
|
+
echo "Consider installing missing tools for full validation:"
|
|
362
|
+
echo " npm install -g supertest pact ajv"
|
|
363
|
+
exit 0
|
|
364
|
+
else
|
|
365
|
+
success "Self-test PASSED (all checks successful)"
|
|
366
|
+
exit 0
|
|
367
|
+
fi
|
|
368
|
+
else
|
|
369
|
+
error "Self-test FAILED"
|
|
370
|
+
exit 1
|
|
371
|
+
fi
|
|
372
|
+
fi
|
|
373
|
+
|
|
374
|
+
# =============================================================================
|
|
375
|
+
# Validation Functions - API Testing Specific
|
|
376
|
+
# =============================================================================
|
|
377
|
+
|
|
378
|
+
# Check that all required tools are available
|
|
379
|
+
validate_tools() {
|
|
380
|
+
local missing=()
|
|
381
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
382
|
+
if ! command_exists "$tool"; then
|
|
383
|
+
missing+=("$tool")
|
|
384
|
+
fi
|
|
385
|
+
done
|
|
386
|
+
|
|
387
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
388
|
+
error "Missing required tools: ${missing[*]}"
|
|
389
|
+
echo ""
|
|
390
|
+
echo "Install missing tools and retry:"
|
|
391
|
+
for tool in "${missing[@]}"; do
|
|
392
|
+
echo " - $tool"
|
|
393
|
+
done
|
|
394
|
+
return 1
|
|
395
|
+
fi
|
|
396
|
+
|
|
397
|
+
debug "All required tools available"
|
|
398
|
+
return 0
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
# Validate output against JSON schema
|
|
402
|
+
validate_schema() {
|
|
403
|
+
local output_file="$1"
|
|
404
|
+
|
|
405
|
+
if [[ -z "$SCHEMA_PATH" ]]; then
|
|
406
|
+
debug "No schema path configured, skipping schema validation"
|
|
407
|
+
return 2
|
|
408
|
+
fi
|
|
409
|
+
|
|
410
|
+
if [[ ! -f "$SCHEMA_PATH" ]]; then
|
|
411
|
+
warn "Schema file not found: $SCHEMA_PATH"
|
|
412
|
+
return 2
|
|
413
|
+
fi
|
|
414
|
+
|
|
415
|
+
debug "Validating against schema: $SCHEMA_PATH"
|
|
416
|
+
|
|
417
|
+
local result
|
|
418
|
+
result=$(validate_json_schema "$SCHEMA_PATH" "$output_file" 2>&1)
|
|
419
|
+
local status=$?
|
|
420
|
+
|
|
421
|
+
case $status in
|
|
422
|
+
0) success "Schema validation passed"; return 0 ;;
|
|
423
|
+
1)
|
|
424
|
+
error "Schema validation failed"
|
|
425
|
+
if [[ "$VERBOSE" == "true" ]]; then
|
|
426
|
+
echo "$result" | while read -r line; do
|
|
427
|
+
echo " $line"
|
|
428
|
+
done
|
|
429
|
+
fi
|
|
430
|
+
return 1
|
|
431
|
+
;;
|
|
432
|
+
2) warn "Schema validation skipped (no validator available)"; return 2 ;;
|
|
433
|
+
esac
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
# Validate required fields exist and have values
|
|
437
|
+
validate_required_fields() {
|
|
438
|
+
local output_file="$1"
|
|
439
|
+
local missing=()
|
|
440
|
+
local empty=()
|
|
441
|
+
|
|
442
|
+
for field in "${REQUIRED_FIELDS[@]}"; do
|
|
443
|
+
local value
|
|
444
|
+
value=$(json_get "$output_file" ".$field" 2>/dev/null)
|
|
445
|
+
if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
|
|
446
|
+
missing+=("$field")
|
|
447
|
+
fi
|
|
448
|
+
done
|
|
449
|
+
|
|
450
|
+
for field in "${REQUIRED_NON_EMPTY_FIELDS[@]}"; do
|
|
451
|
+
local value
|
|
452
|
+
value=$(json_get "$output_file" ".$field" 2>/dev/null)
|
|
453
|
+
if [[ -z "$value" ]] || [[ "$value" == "null" ]] || [[ "$value" == "" ]] || [[ "$value" == "[]" ]] || [[ "$value" == "{}" ]]; then
|
|
454
|
+
empty+=("$field")
|
|
455
|
+
fi
|
|
456
|
+
done
|
|
457
|
+
|
|
458
|
+
local has_errors=false
|
|
459
|
+
|
|
460
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
461
|
+
error "Missing required fields: ${missing[*]}"
|
|
462
|
+
has_errors=true
|
|
463
|
+
fi
|
|
464
|
+
|
|
465
|
+
if [[ ${#empty[@]} -gt 0 ]]; then
|
|
466
|
+
error "Empty required fields: ${empty[*]}"
|
|
467
|
+
has_errors=true
|
|
468
|
+
fi
|
|
469
|
+
|
|
470
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
471
|
+
return 1
|
|
472
|
+
fi
|
|
473
|
+
|
|
474
|
+
success "All required fields present and valid"
|
|
475
|
+
return 0
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
# Validate enum fields have allowed values
|
|
479
|
+
validate_enum_fields() {
|
|
480
|
+
local output_file="$1"
|
|
481
|
+
local has_errors=false
|
|
482
|
+
|
|
483
|
+
for validation in "${ENUM_VALIDATIONS[@]}"; do
|
|
484
|
+
local field_path="${validation%%:*}"
|
|
485
|
+
local allowed_values="${validation#*:}"
|
|
486
|
+
|
|
487
|
+
local actual_value
|
|
488
|
+
actual_value=$(json_get "$output_file" "$field_path" 2>/dev/null)
|
|
489
|
+
|
|
490
|
+
if [[ -z "$actual_value" ]] || [[ "$actual_value" == "null" ]]; then
|
|
491
|
+
debug "Enum field $field_path is empty/null (may be optional)"
|
|
492
|
+
continue
|
|
493
|
+
fi
|
|
494
|
+
|
|
495
|
+
local found=false
|
|
496
|
+
IFS=',' read -ra allowed_array <<< "$allowed_values"
|
|
497
|
+
for allowed in "${allowed_array[@]}"; do
|
|
498
|
+
if [[ "$actual_value" == "$allowed" ]]; then
|
|
499
|
+
found=true
|
|
500
|
+
break
|
|
501
|
+
fi
|
|
502
|
+
done
|
|
503
|
+
|
|
504
|
+
if [[ "$found" == "false" ]]; then
|
|
505
|
+
error "Invalid value for $field_path: '$actual_value' (allowed: $allowed_values)"
|
|
506
|
+
has_errors=true
|
|
507
|
+
else
|
|
508
|
+
debug "Enum field $field_path='$actual_value' is valid"
|
|
509
|
+
fi
|
|
510
|
+
done
|
|
511
|
+
|
|
512
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
513
|
+
return 1
|
|
514
|
+
fi
|
|
515
|
+
|
|
516
|
+
success "All enum fields have valid values"
|
|
517
|
+
return 0
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
# Validate content contains expected terms
|
|
521
|
+
validate_content_terms() {
|
|
522
|
+
local output_file="$1"
|
|
523
|
+
local content
|
|
524
|
+
content=$(cat "$output_file")
|
|
525
|
+
|
|
526
|
+
local has_errors=false
|
|
527
|
+
|
|
528
|
+
if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]]; then
|
|
529
|
+
local missing_terms=()
|
|
530
|
+
for term in "${MUST_CONTAIN_TERMS[@]}"; do
|
|
531
|
+
if ! grep -qi "$term" <<< "$content"; then
|
|
532
|
+
missing_terms+=("$term")
|
|
533
|
+
fi
|
|
534
|
+
done
|
|
535
|
+
|
|
536
|
+
if [[ ${#missing_terms[@]} -gt 0 ]]; then
|
|
537
|
+
error "Output missing required terms: ${missing_terms[*]}"
|
|
538
|
+
has_errors=true
|
|
539
|
+
else
|
|
540
|
+
success "All required terms found"
|
|
541
|
+
fi
|
|
542
|
+
fi
|
|
543
|
+
|
|
544
|
+
if [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
|
|
545
|
+
local found_forbidden=()
|
|
546
|
+
for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
|
|
547
|
+
if grep -qi "$term" <<< "$content"; then
|
|
548
|
+
found_forbidden+=("$term")
|
|
549
|
+
fi
|
|
550
|
+
done
|
|
551
|
+
|
|
552
|
+
if [[ ${#found_forbidden[@]} -gt 0 ]]; then
|
|
553
|
+
error "Output contains forbidden terms: ${found_forbidden[*]}"
|
|
554
|
+
has_errors=true
|
|
555
|
+
else
|
|
556
|
+
success "No forbidden terms found"
|
|
557
|
+
fi
|
|
558
|
+
fi
|
|
559
|
+
|
|
560
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
561
|
+
return 1
|
|
562
|
+
fi
|
|
563
|
+
|
|
564
|
+
return 0
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
# =============================================================================
|
|
568
|
+
# SKILL-SPECIFIC VALIDATION - API Testing Patterns
|
|
569
|
+
# =============================================================================
|
|
570
|
+
|
|
571
|
+
validate_skill_specific() {
|
|
572
|
+
local output_file="$1"
|
|
573
|
+
local has_errors=false
|
|
574
|
+
local has_warnings=false
|
|
575
|
+
|
|
576
|
+
debug "Running API testing specific validations..."
|
|
577
|
+
|
|
578
|
+
# ==========================================================================
|
|
579
|
+
# Validation 1: Check endpoint coverage structure
|
|
580
|
+
# ==========================================================================
|
|
581
|
+
local total_endpoints covered_endpoints
|
|
582
|
+
total_endpoints=$(json_get "$output_file" ".output.endpointCoverage.totalEndpoints" 2>/dev/null)
|
|
583
|
+
covered_endpoints=$(json_get "$output_file" ".output.endpointCoverage.coveredEndpoints" 2>/dev/null)
|
|
584
|
+
|
|
585
|
+
if [[ -n "$total_endpoints" ]] && [[ "$total_endpoints" != "null" ]] && [[ -n "$covered_endpoints" ]] && [[ "$covered_endpoints" != "null" ]]; then
|
|
586
|
+
if [[ "$covered_endpoints" -gt "$total_endpoints" ]]; then
|
|
587
|
+
error "Covered endpoints ($covered_endpoints) cannot exceed total endpoints ($total_endpoints)"
|
|
588
|
+
has_errors=true
|
|
589
|
+
else
|
|
590
|
+
debug "Endpoint coverage valid: $covered_endpoints / $total_endpoints"
|
|
591
|
+
fi
|
|
592
|
+
fi
|
|
593
|
+
|
|
594
|
+
# ==========================================================================
|
|
595
|
+
# Validation 2: Validate HTTP methods in endpoints
|
|
596
|
+
# ==========================================================================
|
|
597
|
+
local valid_methods=("GET" "POST" "PUT" "PATCH" "DELETE" "OPTIONS" "HEAD")
|
|
598
|
+
local uncovered_endpoints
|
|
599
|
+
uncovered_endpoints=$(jq -r '.output.endpointCoverage.uncoveredEndpoints[]?.method // empty' "$output_file" 2>/dev/null)
|
|
600
|
+
|
|
601
|
+
if [[ -n "$uncovered_endpoints" ]]; then
|
|
602
|
+
while IFS= read -r method; do
|
|
603
|
+
local is_valid=false
|
|
604
|
+
for valid in "${valid_methods[@]}"; do
|
|
605
|
+
if [[ "$method" == "$valid" ]]; then
|
|
606
|
+
is_valid=true
|
|
607
|
+
break
|
|
608
|
+
fi
|
|
609
|
+
done
|
|
610
|
+
if [[ "$is_valid" == "false" ]]; then
|
|
611
|
+
error "Invalid HTTP method in uncovered endpoints: $method"
|
|
612
|
+
has_errors=true
|
|
613
|
+
fi
|
|
614
|
+
done <<< "$uncovered_endpoints"
|
|
615
|
+
fi
|
|
616
|
+
|
|
617
|
+
# ==========================================================================
|
|
618
|
+
# Validation 3: Check test recommendations have proper structure
|
|
619
|
+
# ==========================================================================
|
|
620
|
+
local rec_count
|
|
621
|
+
rec_count=$(json_count "$output_file" ".output.testRecommendations" 2>/dev/null)
|
|
622
|
+
|
|
623
|
+
if [[ -n "$rec_count" ]] && [[ "$rec_count" != "null" ]] && [[ "$rec_count" -gt 0 ]]; then
|
|
624
|
+
# Check each recommendation has required fields
|
|
625
|
+
local invalid_recs
|
|
626
|
+
invalid_recs=$(jq '[.output.testRecommendations[]? | select(.id == null or .testType == null or .endpoint == null or .description == null)] | length' "$output_file" 2>/dev/null)
|
|
627
|
+
|
|
628
|
+
if [[ "$invalid_recs" -gt 0 ]]; then
|
|
629
|
+
warn "$invalid_recs test recommendation(s) missing required fields (id, testType, endpoint, description)"
|
|
630
|
+
has_warnings=true
|
|
631
|
+
else
|
|
632
|
+
debug "All test recommendations have required structure"
|
|
633
|
+
fi
|
|
634
|
+
fi
|
|
635
|
+
|
|
636
|
+
# ==========================================================================
|
|
637
|
+
# Validation 4: Validate contract testing structure if present
|
|
638
|
+
# ==========================================================================
|
|
639
|
+
local has_contracts
|
|
640
|
+
has_contracts=$(jq 'has("output") and (.output | has("contractTests"))' "$output_file" 2>/dev/null)
|
|
641
|
+
|
|
642
|
+
if [[ "$has_contracts" == "true" ]]; then
|
|
643
|
+
local can_deploy
|
|
644
|
+
can_deploy=$(json_get "$output_file" ".output.contractTests.canIDeploy" 2>/dev/null)
|
|
645
|
+
|
|
646
|
+
# If there are breaking changes, canIDeploy should be false
|
|
647
|
+
local breaking_count
|
|
648
|
+
breaking_count=$(json_count "$output_file" ".output.contractTests.breakingChanges" 2>/dev/null)
|
|
649
|
+
|
|
650
|
+
if [[ -n "$breaking_count" ]] && [[ "$breaking_count" -gt 0 ]] && [[ "$can_deploy" == "true" ]]; then
|
|
651
|
+
warn "canIDeploy is true but breaking changes detected - verify deployment safety"
|
|
652
|
+
has_warnings=true
|
|
653
|
+
fi
|
|
654
|
+
|
|
655
|
+
debug "Contract testing structure validated"
|
|
656
|
+
fi
|
|
657
|
+
|
|
658
|
+
# ==========================================================================
|
|
659
|
+
# Validation 5: Check API finding IDs follow pattern
|
|
660
|
+
# ==========================================================================
|
|
661
|
+
local invalid_finding_ids
|
|
662
|
+
invalid_finding_ids=$(jq '[.output.findings[]?.id // empty | select(test("^API-[0-9]{3,6}$") | not)] | length' "$output_file" 2>/dev/null)
|
|
663
|
+
|
|
664
|
+
if [[ -n "$invalid_finding_ids" ]] && [[ "$invalid_finding_ids" -gt 0 ]]; then
|
|
665
|
+
warn "$invalid_finding_ids finding(s) have invalid ID format (should be API-NNN)"
|
|
666
|
+
has_warnings=true
|
|
667
|
+
fi
|
|
668
|
+
|
|
669
|
+
# ==========================================================================
|
|
670
|
+
# Validation 6: Validate test scenario categories
|
|
671
|
+
# ==========================================================================
|
|
672
|
+
local valid_categories=("happy-path" "error-handling" "auth" "validation" "idempotency" "concurrency" "rate-limiting" "pagination" "filtering" "sorting")
|
|
673
|
+
local invalid_categories
|
|
674
|
+
invalid_categories=$(jq -r '[.output.testRecommendations[]?.scenarios[]?.category // empty] | unique[]' "$output_file" 2>/dev/null)
|
|
675
|
+
|
|
676
|
+
if [[ -n "$invalid_categories" ]]; then
|
|
677
|
+
while IFS= read -r category; do
|
|
678
|
+
local is_valid=false
|
|
679
|
+
for valid in "${valid_categories[@]}"; do
|
|
680
|
+
if [[ "$category" == "$valid" ]]; then
|
|
681
|
+
is_valid=true
|
|
682
|
+
break
|
|
683
|
+
fi
|
|
684
|
+
done
|
|
685
|
+
if [[ "$is_valid" == "false" ]] && [[ -n "$category" ]]; then
|
|
686
|
+
warn "Unrecognized test scenario category: $category"
|
|
687
|
+
has_warnings=true
|
|
688
|
+
fi
|
|
689
|
+
done <<< "$invalid_categories"
|
|
690
|
+
fi
|
|
691
|
+
|
|
692
|
+
# ==========================================================================
|
|
693
|
+
# Return Result
|
|
694
|
+
# ==========================================================================
|
|
695
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
696
|
+
return 1
|
|
697
|
+
fi
|
|
698
|
+
|
|
699
|
+
if [[ "$has_warnings" == "true" ]]; then
|
|
700
|
+
warn "API testing validation passed with warnings"
|
|
701
|
+
else
|
|
702
|
+
success "API testing specific validation passed"
|
|
703
|
+
fi
|
|
704
|
+
|
|
705
|
+
return 0
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
# =============================================================================
|
|
709
|
+
# Main Validation Flow
|
|
710
|
+
# =============================================================================
|
|
711
|
+
|
|
712
|
+
main() {
|
|
713
|
+
# Validate arguments
|
|
714
|
+
if [[ -z "$OUTPUT_FILE" ]]; then
|
|
715
|
+
error "No output file specified"
|
|
716
|
+
echo "Usage: $0 <output-file> [options]"
|
|
717
|
+
echo "Use --help for more information"
|
|
718
|
+
exit 1
|
|
719
|
+
fi
|
|
720
|
+
|
|
721
|
+
if [[ ! -f "$OUTPUT_FILE" ]]; then
|
|
722
|
+
error "Output file not found: $OUTPUT_FILE"
|
|
723
|
+
exit 1
|
|
724
|
+
fi
|
|
725
|
+
|
|
726
|
+
# Print header (unless JSON-only mode)
|
|
727
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
728
|
+
echo "=============================================="
|
|
729
|
+
info "Validating $SKILL_NAME Output"
|
|
730
|
+
echo "=============================================="
|
|
731
|
+
echo ""
|
|
732
|
+
echo " Skill: $SKILL_NAME v$SKILL_VERSION"
|
|
733
|
+
echo " File: $OUTPUT_FILE"
|
|
734
|
+
echo " Schema: ${SCHEMA_PATH:-none}"
|
|
735
|
+
echo ""
|
|
736
|
+
fi
|
|
737
|
+
|
|
738
|
+
# Track validation status
|
|
739
|
+
local tool_status="passed"
|
|
740
|
+
local json_status="passed"
|
|
741
|
+
local schema_status="passed"
|
|
742
|
+
local fields_status="passed"
|
|
743
|
+
local enums_status="passed"
|
|
744
|
+
local content_status="passed"
|
|
745
|
+
local specific_status="passed"
|
|
746
|
+
|
|
747
|
+
local error_count=0
|
|
748
|
+
local warning_count=0
|
|
749
|
+
|
|
750
|
+
# =========================================
|
|
751
|
+
# Step 1: Check Required Tools
|
|
752
|
+
# =========================================
|
|
753
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
754
|
+
echo "--- Step 1: Tool Availability ---"
|
|
755
|
+
fi
|
|
756
|
+
|
|
757
|
+
if ! validate_tools; then
|
|
758
|
+
tool_status="failed"
|
|
759
|
+
((error_count++)) || true
|
|
760
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
761
|
+
output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
|
|
762
|
+
else
|
|
763
|
+
echo ""
|
|
764
|
+
error "Validation cannot proceed without required tools"
|
|
765
|
+
fi
|
|
766
|
+
exit $EXIT_SKIP
|
|
767
|
+
fi
|
|
768
|
+
|
|
769
|
+
[[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
|
|
770
|
+
|
|
771
|
+
# =========================================
|
|
772
|
+
# Step 2: Validate JSON Syntax
|
|
773
|
+
# =========================================
|
|
774
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
775
|
+
echo "--- Step 2: JSON Syntax ---"
|
|
776
|
+
fi
|
|
777
|
+
|
|
778
|
+
if ! validate_json "$OUTPUT_FILE"; then
|
|
779
|
+
json_status="failed"
|
|
780
|
+
((error_count++)) || true
|
|
781
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
782
|
+
error "File is not valid JSON - cannot proceed"
|
|
783
|
+
fi
|
|
784
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
785
|
+
output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
|
|
786
|
+
fi
|
|
787
|
+
exit $EXIT_FAIL
|
|
788
|
+
fi
|
|
789
|
+
|
|
790
|
+
[[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
|
|
791
|
+
|
|
792
|
+
# =========================================
|
|
793
|
+
# Step 3: Validate Against Schema
|
|
794
|
+
# =========================================
|
|
795
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
796
|
+
echo "--- Step 3: Schema Validation ---"
|
|
797
|
+
fi
|
|
798
|
+
|
|
799
|
+
local schema_exit_code
|
|
800
|
+
validate_schema "$OUTPUT_FILE" && schema_exit_code=0 || schema_exit_code=$?
|
|
801
|
+
|
|
802
|
+
case $schema_exit_code in
|
|
803
|
+
0) [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
804
|
+
1) schema_status="failed"; ((error_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
805
|
+
2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
806
|
+
esac
|
|
807
|
+
|
|
808
|
+
# =========================================
|
|
809
|
+
# Step 4: Validate Required Fields
|
|
810
|
+
# =========================================
|
|
811
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
812
|
+
echo "--- Step 4: Required Fields ---"
|
|
813
|
+
fi
|
|
814
|
+
|
|
815
|
+
if ! validate_required_fields "$OUTPUT_FILE"; then
|
|
816
|
+
fields_status="failed"
|
|
817
|
+
((error_count++)) || true
|
|
818
|
+
fi
|
|
819
|
+
|
|
820
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
821
|
+
|
|
822
|
+
# =========================================
|
|
823
|
+
# Step 5: Validate Enum Values
|
|
824
|
+
# =========================================
|
|
825
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
826
|
+
echo "--- Step 5: Enum Validation ---"
|
|
827
|
+
fi
|
|
828
|
+
|
|
829
|
+
if ! validate_enum_fields "$OUTPUT_FILE"; then
|
|
830
|
+
enums_status="failed"
|
|
831
|
+
((error_count++)) || true
|
|
832
|
+
fi
|
|
833
|
+
|
|
834
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
835
|
+
|
|
836
|
+
# =========================================
|
|
837
|
+
# Step 6: Validate Content Terms
|
|
838
|
+
# =========================================
|
|
839
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
840
|
+
echo "--- Step 6: Content Terms ---"
|
|
841
|
+
fi
|
|
842
|
+
|
|
843
|
+
if ! validate_content_terms "$OUTPUT_FILE"; then
|
|
844
|
+
content_status="failed"
|
|
845
|
+
((error_count++)) || true
|
|
846
|
+
fi
|
|
847
|
+
|
|
848
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
849
|
+
|
|
850
|
+
# =========================================
|
|
851
|
+
# Step 7: API Testing Specific Validation
|
|
852
|
+
# =========================================
|
|
853
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
854
|
+
echo "--- Step 7: API Testing Specific Validation ---"
|
|
855
|
+
fi
|
|
856
|
+
|
|
857
|
+
if ! validate_skill_specific "$OUTPUT_FILE"; then
|
|
858
|
+
specific_status="failed"
|
|
859
|
+
((error_count++)) || true
|
|
860
|
+
fi
|
|
861
|
+
|
|
862
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
863
|
+
|
|
864
|
+
# =========================================
|
|
865
|
+
# Determine Overall Status
|
|
866
|
+
# =========================================
|
|
867
|
+
local overall_status="passed"
|
|
868
|
+
local content_overall="passed"
|
|
869
|
+
|
|
870
|
+
if [[ "$fields_status" == "failed" ]] || \
|
|
871
|
+
[[ "$enums_status" == "failed" ]] || \
|
|
872
|
+
[[ "$content_status" == "failed" ]] || \
|
|
873
|
+
[[ "$specific_status" == "failed" ]]; then
|
|
874
|
+
content_overall="failed"
|
|
875
|
+
fi
|
|
876
|
+
|
|
877
|
+
if [[ "$json_status" == "failed" ]] || \
|
|
878
|
+
[[ "$schema_status" == "failed" ]] || \
|
|
879
|
+
[[ "$content_overall" == "failed" ]]; then
|
|
880
|
+
overall_status="failed"
|
|
881
|
+
elif [[ "$schema_status" == "skipped" ]]; then
|
|
882
|
+
overall_status="partial"
|
|
883
|
+
fi
|
|
884
|
+
|
|
885
|
+
# =========================================
|
|
886
|
+
# Output Results
|
|
887
|
+
# =========================================
|
|
888
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
889
|
+
output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
|
|
890
|
+
else
|
|
891
|
+
echo "=============================================="
|
|
892
|
+
echo "Validation Summary for $SKILL_NAME"
|
|
893
|
+
echo "=============================================="
|
|
894
|
+
echo ""
|
|
895
|
+
echo " Tools: $tool_status"
|
|
896
|
+
echo " JSON Syntax: $json_status"
|
|
897
|
+
echo " Schema: $schema_status"
|
|
898
|
+
echo " Fields: $fields_status"
|
|
899
|
+
echo " Enums: $enums_status"
|
|
900
|
+
echo " Content: $content_status"
|
|
901
|
+
echo " API-specific: $specific_status"
|
|
902
|
+
echo ""
|
|
903
|
+
echo " ------------------------------"
|
|
904
|
+
echo " Overall: $overall_status"
|
|
905
|
+
echo " Errors: $error_count"
|
|
906
|
+
echo " Warnings: $warning_count"
|
|
907
|
+
echo "=============================================="
|
|
908
|
+
echo ""
|
|
909
|
+
fi
|
|
910
|
+
|
|
911
|
+
# =========================================
|
|
912
|
+
# Exit with appropriate code
|
|
913
|
+
# =========================================
|
|
914
|
+
case "$overall_status" in
|
|
915
|
+
"passed")
|
|
916
|
+
[[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
|
|
917
|
+
exit $EXIT_PASS
|
|
918
|
+
;;
|
|
919
|
+
"partial")
|
|
920
|
+
[[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
|
|
921
|
+
exit $EXIT_PASS
|
|
922
|
+
;;
|
|
923
|
+
"failed")
|
|
924
|
+
[[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
|
|
925
|
+
exit $EXIT_FAIL
|
|
926
|
+
;;
|
|
927
|
+
esac
|
|
928
|
+
}
|
|
929
|
+
|
|
930
|
+
# Run main function
|
|
931
|
+
main
|