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