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