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,1107 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# AQE Skill Validator: chaos-engineering-resilience v1.0.0
|
|
4
|
+
# Validates chaos engineering skill output per ADR-056
|
|
5
|
+
# =============================================================================
|
|
6
|
+
#
|
|
7
|
+
# This validator checks:
|
|
8
|
+
# 1. JSON schema compliance (chaos experiment types, fault injection, steady-state)
|
|
9
|
+
# 2. Required chaos tools availability (kubectl, litmus, gremlin)
|
|
10
|
+
# 3. Experiment structure and completeness
|
|
11
|
+
# 4. Steady-state hypothesis validation
|
|
12
|
+
# 5. Blast radius and safety controls
|
|
13
|
+
# 6. Chaos-specific content validation
|
|
14
|
+
#
|
|
15
|
+
# Usage: ./validate.sh <output-file> [options]
|
|
16
|
+
#
|
|
17
|
+
# Options:
|
|
18
|
+
# --self-test Run validator self-test mode
|
|
19
|
+
# --verbose Enable verbose output
|
|
20
|
+
# --json Output results as JSON only
|
|
21
|
+
# --list-tools Show available validation tools
|
|
22
|
+
# --help Show this help message
|
|
23
|
+
#
|
|
24
|
+
# Exit Codes:
|
|
25
|
+
# 0 - Validation passed
|
|
26
|
+
# 1 - Validation failed
|
|
27
|
+
# 2 - Validation skipped (missing required tools)
|
|
28
|
+
#
|
|
29
|
+
# =============================================================================
|
|
30
|
+
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
|
|
33
|
+
# Get script directory
|
|
34
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
35
|
+
|
|
36
|
+
# Navigate to skill directory and project root
|
|
37
|
+
# scripts/ -> chaos-engineering-resilience/ -> skills/ -> .claude/ -> project root
|
|
38
|
+
SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
39
|
+
PROJECT_ROOT="$(cd "$SKILL_DIR/../../.." && pwd)"
|
|
40
|
+
|
|
41
|
+
# Source validator library - check multiple locations
|
|
42
|
+
VALIDATOR_LIB=""
|
|
43
|
+
for lib_path in \
|
|
44
|
+
"$PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh" \
|
|
45
|
+
"$SKILL_DIR/scripts/validator-lib.sh" \
|
|
46
|
+
"$SCRIPT_DIR/validator-lib.sh"; do
|
|
47
|
+
if [[ -f "$lib_path" ]]; then
|
|
48
|
+
VALIDATOR_LIB="$lib_path"
|
|
49
|
+
break
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
if [[ -n "$VALIDATOR_LIB" ]]; then
|
|
54
|
+
# shellcheck source=/dev/null
|
|
55
|
+
source "$VALIDATOR_LIB"
|
|
56
|
+
else
|
|
57
|
+
echo "ERROR: Validator library not found"
|
|
58
|
+
echo "Searched:"
|
|
59
|
+
echo " - $PROJECT_ROOT/.claude/skills/.validation/templates/validator-lib.sh"
|
|
60
|
+
echo " - $SKILL_DIR/scripts/validator-lib.sh"
|
|
61
|
+
echo " - $SCRIPT_DIR/validator-lib.sh"
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
# =============================================================================
|
|
66
|
+
# SKILL-SPECIFIC CONFIGURATION
|
|
67
|
+
# =============================================================================
|
|
68
|
+
|
|
69
|
+
# Skill name and version
|
|
70
|
+
SKILL_NAME="chaos-engineering-resilience"
|
|
71
|
+
SKILL_VERSION="1.0.0"
|
|
72
|
+
|
|
73
|
+
# Required tools (validation FAILS with exit 2 if missing)
|
|
74
|
+
# jq is essential for JSON parsing
|
|
75
|
+
REQUIRED_TOOLS=("jq")
|
|
76
|
+
|
|
77
|
+
# Optional tools (validation continues with warnings if missing)
|
|
78
|
+
# These enhance chaos engineering capabilities
|
|
79
|
+
OPTIONAL_TOOLS=("chaos" "litmus" "gremlin" "kubectl" "node" "ajv" "jsonschema" "python3")
|
|
80
|
+
|
|
81
|
+
# Path to output JSON schema
|
|
82
|
+
SCHEMA_PATH="$SKILL_DIR/schemas/output.json"
|
|
83
|
+
|
|
84
|
+
# Path to sample test data for self-test
|
|
85
|
+
SAMPLE_OUTPUT_PATH="$PROJECT_ROOT/.claude/skills/.validation/examples/chaos-engineering-output.example.json"
|
|
86
|
+
|
|
87
|
+
# =============================================================================
|
|
88
|
+
# CONTENT VALIDATION CONFIGURATION
|
|
89
|
+
# =============================================================================
|
|
90
|
+
|
|
91
|
+
# Required fields in output
|
|
92
|
+
REQUIRED_FIELDS=("skillName" "status" "output" "output.summary" "output.experiments" "output.resilienceScore")
|
|
93
|
+
|
|
94
|
+
# Fields that must have non-null, non-empty values
|
|
95
|
+
REQUIRED_NON_EMPTY_FIELDS=("output.summary")
|
|
96
|
+
|
|
97
|
+
# Chaos-specific terms that MUST appear in output
|
|
98
|
+
MUST_CONTAIN_TERMS=("chaos" "experiment" "resilience")
|
|
99
|
+
|
|
100
|
+
# Terms that must NOT appear in output (indicates failure/hallucination)
|
|
101
|
+
MUST_NOT_CONTAIN_TERMS=("TODO" "placeholder" "FIXME")
|
|
102
|
+
|
|
103
|
+
# Enum validations
|
|
104
|
+
ENUM_VALIDATIONS=(
|
|
105
|
+
".status:success,partial,failed,skipped"
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Minimum array lengths
|
|
109
|
+
MIN_ARRAY_LENGTHS=(
|
|
110
|
+
".output.experiments:1"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
# =============================================================================
|
|
114
|
+
# Argument Parsing
|
|
115
|
+
# =============================================================================
|
|
116
|
+
|
|
117
|
+
OUTPUT_FILE=""
|
|
118
|
+
SELF_TEST=false
|
|
119
|
+
VERBOSE=false
|
|
120
|
+
JSON_ONLY=false
|
|
121
|
+
LIST_TOOLS=false
|
|
122
|
+
|
|
123
|
+
while [[ $# -gt 0 ]]; do
|
|
124
|
+
case "$1" in
|
|
125
|
+
--self-test)
|
|
126
|
+
SELF_TEST=true
|
|
127
|
+
shift
|
|
128
|
+
;;
|
|
129
|
+
--verbose|-v)
|
|
130
|
+
VERBOSE=true
|
|
131
|
+
export AQE_DEBUG=1
|
|
132
|
+
shift
|
|
133
|
+
;;
|
|
134
|
+
--json)
|
|
135
|
+
JSON_ONLY=true
|
|
136
|
+
shift
|
|
137
|
+
;;
|
|
138
|
+
--list-tools)
|
|
139
|
+
LIST_TOOLS=true
|
|
140
|
+
shift
|
|
141
|
+
;;
|
|
142
|
+
-h|--help)
|
|
143
|
+
cat << 'HELP_EOF'
|
|
144
|
+
AQE Chaos Engineering Resilience Skill Validator v1.0.0
|
|
145
|
+
|
|
146
|
+
Usage: ./validate.sh <output-file> [options]
|
|
147
|
+
./validate.sh --self-test [--verbose]
|
|
148
|
+
./validate.sh --list-tools
|
|
149
|
+
|
|
150
|
+
Arguments:
|
|
151
|
+
<output-file> Path to skill output JSON file to validate
|
|
152
|
+
|
|
153
|
+
Options:
|
|
154
|
+
--self-test Run validator self-test mode
|
|
155
|
+
--verbose, -v Enable verbose/debug output
|
|
156
|
+
--json Output results as JSON only (for CI integration)
|
|
157
|
+
--list-tools Show available validation tools and exit
|
|
158
|
+
--help, -h Show this help message
|
|
159
|
+
|
|
160
|
+
Exit Codes:
|
|
161
|
+
0 - Validation passed
|
|
162
|
+
1 - Validation failed
|
|
163
|
+
2 - Validation skipped (missing required tools)
|
|
164
|
+
|
|
165
|
+
Chaos Tool Requirements:
|
|
166
|
+
Required: jq (JSON parsing)
|
|
167
|
+
Optional: chaos (Chaos Toolkit), litmus (LitmusChaos), gremlin (Gremlin),
|
|
168
|
+
kubectl (Kubernetes), node (Node.js)
|
|
169
|
+
|
|
170
|
+
Examples:
|
|
171
|
+
./validate.sh chaos-output.json # Validate output file
|
|
172
|
+
./validate.sh chaos-output.json --json # JSON output for CI
|
|
173
|
+
./validate.sh --self-test --verbose # Self-test with debug
|
|
174
|
+
./validate.sh --list-tools # Show available tools
|
|
175
|
+
|
|
176
|
+
HELP_EOF
|
|
177
|
+
exit 0
|
|
178
|
+
;;
|
|
179
|
+
-*)
|
|
180
|
+
error "Unknown option: $1"
|
|
181
|
+
echo "Use --help for usage information"
|
|
182
|
+
exit 1
|
|
183
|
+
;;
|
|
184
|
+
*)
|
|
185
|
+
OUTPUT_FILE="$1"
|
|
186
|
+
shift
|
|
187
|
+
;;
|
|
188
|
+
esac
|
|
189
|
+
done
|
|
190
|
+
|
|
191
|
+
# Handle --list-tools mode
|
|
192
|
+
if [[ "$LIST_TOOLS" == "true" ]]; then
|
|
193
|
+
echo "=============================================="
|
|
194
|
+
echo "Available Validation Tools for $SKILL_NAME"
|
|
195
|
+
echo "=============================================="
|
|
196
|
+
echo ""
|
|
197
|
+
echo "Required tools (validation fails if missing):"
|
|
198
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
199
|
+
if command_exists "$tool"; then
|
|
200
|
+
version=$($tool --version 2>&1 | head -1 || echo "installed")
|
|
201
|
+
echo " [OK] $tool - $version"
|
|
202
|
+
else
|
|
203
|
+
echo " [MISSING] $tool"
|
|
204
|
+
fi
|
|
205
|
+
done
|
|
206
|
+
echo ""
|
|
207
|
+
echo "Optional tools (enhances validation):"
|
|
208
|
+
for tool in "${OPTIONAL_TOOLS[@]}"; do
|
|
209
|
+
if command_exists "$tool"; then
|
|
210
|
+
version=""
|
|
211
|
+
case "$tool" in
|
|
212
|
+
chaos) version=$(chaos version 2>&1 | head -1 || echo "installed") ;;
|
|
213
|
+
litmus) version=$(litmusctl version 2>&1 | head -1 || echo "installed") ;;
|
|
214
|
+
gremlin) version=$(gremlin version 2>&1 | head -1 || echo "installed") ;;
|
|
215
|
+
kubectl) version=$(kubectl version --client 2>&1 | head -1 || echo "installed") ;;
|
|
216
|
+
node) version=$(node --version 2>&1 | head -1 || echo "installed") ;;
|
|
217
|
+
python3) version=$(python3 --version 2>&1 | head -1 || echo "installed") ;;
|
|
218
|
+
*) version="installed" ;;
|
|
219
|
+
esac
|
|
220
|
+
echo " [OK] $tool - $version"
|
|
221
|
+
else
|
|
222
|
+
echo " [MISSING] $tool"
|
|
223
|
+
fi
|
|
224
|
+
done
|
|
225
|
+
echo ""
|
|
226
|
+
echo "Chaos Engineering Capabilities:"
|
|
227
|
+
if command_exists "chaos"; then
|
|
228
|
+
echo " [OK] Chaos Toolkit - Chaos experiments and game days"
|
|
229
|
+
else
|
|
230
|
+
echo " [MISSING] Chaos Toolkit - Install: pip install chaostoolkit"
|
|
231
|
+
fi
|
|
232
|
+
if command_exists "litmus" || command_exists "litmusctl"; then
|
|
233
|
+
echo " [OK] LitmusChaos - Kubernetes-native chaos engineering"
|
|
234
|
+
else
|
|
235
|
+
echo " [MISSING] LitmusChaos - Install: https://litmuschaos.io"
|
|
236
|
+
fi
|
|
237
|
+
if command_exists "gremlin"; then
|
|
238
|
+
echo " [OK] Gremlin - Enterprise chaos engineering"
|
|
239
|
+
else
|
|
240
|
+
echo " [MISSING] Gremlin - Install: https://gremlin.com"
|
|
241
|
+
fi
|
|
242
|
+
if command_exists "kubectl"; then
|
|
243
|
+
echo " [OK] kubectl - Kubernetes pod/node manipulation"
|
|
244
|
+
else
|
|
245
|
+
echo " [MISSING] kubectl - Required for Kubernetes chaos"
|
|
246
|
+
fi
|
|
247
|
+
exit 0
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
# =============================================================================
|
|
251
|
+
# Self-Test Mode
|
|
252
|
+
# =============================================================================
|
|
253
|
+
|
|
254
|
+
if [[ "$SELF_TEST" == "true" ]]; then
|
|
255
|
+
echo "=============================================="
|
|
256
|
+
info "Running $SKILL_NAME Validator Self-Test"
|
|
257
|
+
echo "=============================================="
|
|
258
|
+
echo ""
|
|
259
|
+
echo "Validator version: $AQE_VALIDATOR_VERSION"
|
|
260
|
+
echo "Skill version: $SKILL_VERSION"
|
|
261
|
+
echo ""
|
|
262
|
+
|
|
263
|
+
self_test_passed=true
|
|
264
|
+
self_test_warnings=0
|
|
265
|
+
|
|
266
|
+
# Step 1: Check Required Tools
|
|
267
|
+
echo "--- Step 1: Required Tools ---"
|
|
268
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
269
|
+
if command_exists "$tool"; then
|
|
270
|
+
success "Required tool available: $tool"
|
|
271
|
+
else
|
|
272
|
+
error "Required tool MISSING: $tool"
|
|
273
|
+
self_test_passed=false
|
|
274
|
+
fi
|
|
275
|
+
done
|
|
276
|
+
echo ""
|
|
277
|
+
|
|
278
|
+
# Step 2: Check Optional Chaos Tools
|
|
279
|
+
echo "--- Step 2: Chaos Engineering Tools ---"
|
|
280
|
+
chaos_tools=("chaos" "litmus" "litmusctl" "gremlin" "kubectl")
|
|
281
|
+
available_chaos=0
|
|
282
|
+
for tool in "${chaos_tools[@]}"; do
|
|
283
|
+
if command_exists "$tool"; then
|
|
284
|
+
success "Chaos tool available: $tool"
|
|
285
|
+
((available_chaos++)) || true
|
|
286
|
+
else
|
|
287
|
+
warn "Chaos tool missing: $tool"
|
|
288
|
+
((self_test_warnings++)) || true
|
|
289
|
+
fi
|
|
290
|
+
done
|
|
291
|
+
|
|
292
|
+
if [[ $available_chaos -eq 0 ]]; then
|
|
293
|
+
warn "No chaos engineering tools available - limited experiment execution"
|
|
294
|
+
((self_test_warnings++)) || true
|
|
295
|
+
fi
|
|
296
|
+
echo ""
|
|
297
|
+
|
|
298
|
+
# Step 3: Check Schema File
|
|
299
|
+
echo "--- Step 3: Schema File ---"
|
|
300
|
+
if [[ -f "$SCHEMA_PATH" ]]; then
|
|
301
|
+
success "Schema file exists: $SCHEMA_PATH"
|
|
302
|
+
if validate_json "$SCHEMA_PATH" 2>/dev/null; then
|
|
303
|
+
success "Schema file is valid JSON"
|
|
304
|
+
|
|
305
|
+
# Check for chaos-specific schema elements
|
|
306
|
+
if grep -q "chaosExperiment" "$SCHEMA_PATH" 2>/dev/null; then
|
|
307
|
+
success "Schema includes chaos experiment definition"
|
|
308
|
+
else
|
|
309
|
+
warn "Schema may be missing chaos experiment definition"
|
|
310
|
+
((self_test_warnings++)) || true
|
|
311
|
+
fi
|
|
312
|
+
|
|
313
|
+
if grep -q "steadyStateHypothesis" "$SCHEMA_PATH" 2>/dev/null; then
|
|
314
|
+
success "Schema includes steady-state hypothesis"
|
|
315
|
+
else
|
|
316
|
+
warn "Schema may be missing steady-state hypothesis"
|
|
317
|
+
((self_test_warnings++)) || true
|
|
318
|
+
fi
|
|
319
|
+
|
|
320
|
+
if grep -q "blastRadius" "$SCHEMA_PATH" 2>/dev/null; then
|
|
321
|
+
success "Schema includes blast radius controls"
|
|
322
|
+
else
|
|
323
|
+
warn "Schema may be missing blast radius controls"
|
|
324
|
+
((self_test_warnings++)) || true
|
|
325
|
+
fi
|
|
326
|
+
else
|
|
327
|
+
error "Schema file is NOT valid JSON"
|
|
328
|
+
self_test_passed=false
|
|
329
|
+
fi
|
|
330
|
+
else
|
|
331
|
+
error "Schema file not found: $SCHEMA_PATH"
|
|
332
|
+
self_test_passed=false
|
|
333
|
+
fi
|
|
334
|
+
echo ""
|
|
335
|
+
|
|
336
|
+
# Step 4: Test with Sample Data
|
|
337
|
+
echo "--- Step 4: Sample Data Validation ---"
|
|
338
|
+
if [[ -f "$SAMPLE_OUTPUT_PATH" ]]; then
|
|
339
|
+
success "Sample output file exists"
|
|
340
|
+
|
|
341
|
+
if validate_json "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
|
|
342
|
+
success "Sample output is valid JSON"
|
|
343
|
+
|
|
344
|
+
# Test chaos-specific validation
|
|
345
|
+
if validate_chaos_experiments "$SAMPLE_OUTPUT_PATH" 2>/dev/null; then
|
|
346
|
+
success "Sample output has valid chaos experiments"
|
|
347
|
+
else
|
|
348
|
+
warn "Sample output chaos validation issue"
|
|
349
|
+
((self_test_warnings++)) || true
|
|
350
|
+
fi
|
|
351
|
+
else
|
|
352
|
+
error "Sample output is NOT valid JSON"
|
|
353
|
+
self_test_passed=false
|
|
354
|
+
fi
|
|
355
|
+
else
|
|
356
|
+
info "No sample output file found at: $SAMPLE_OUTPUT_PATH"
|
|
357
|
+
info "Skipping sample data validation"
|
|
358
|
+
fi
|
|
359
|
+
echo ""
|
|
360
|
+
|
|
361
|
+
# Step 5: Library Self-Test
|
|
362
|
+
echo "--- Step 5: Validator Library Self-Test ---"
|
|
363
|
+
if run_self_test 2>/dev/null; then
|
|
364
|
+
success "Library self-test passed"
|
|
365
|
+
else
|
|
366
|
+
error "Library self-test FAILED"
|
|
367
|
+
self_test_passed=false
|
|
368
|
+
fi
|
|
369
|
+
echo ""
|
|
370
|
+
|
|
371
|
+
# Summary
|
|
372
|
+
echo "=============================================="
|
|
373
|
+
echo "Self-Test Summary for $SKILL_NAME"
|
|
374
|
+
echo "=============================================="
|
|
375
|
+
|
|
376
|
+
if [[ "$self_test_passed" == "true" ]]; then
|
|
377
|
+
if [[ $self_test_warnings -gt 0 ]]; then
|
|
378
|
+
warn "Self-test PASSED with $self_test_warnings warning(s)"
|
|
379
|
+
exit 0
|
|
380
|
+
else
|
|
381
|
+
success "Self-test PASSED"
|
|
382
|
+
exit 0
|
|
383
|
+
fi
|
|
384
|
+
else
|
|
385
|
+
error "Self-test FAILED"
|
|
386
|
+
exit 1
|
|
387
|
+
fi
|
|
388
|
+
fi
|
|
389
|
+
|
|
390
|
+
# =============================================================================
|
|
391
|
+
# SKILL-SPECIFIC VALIDATION FUNCTIONS
|
|
392
|
+
# =============================================================================
|
|
393
|
+
|
|
394
|
+
# Validate chaos experiments structure
|
|
395
|
+
# Returns: 0 if valid, 1 if invalid
|
|
396
|
+
validate_chaos_experiments() {
|
|
397
|
+
local output_file="$1"
|
|
398
|
+
|
|
399
|
+
# Check experiments array exists
|
|
400
|
+
local experiments_data
|
|
401
|
+
experiments_data=$(json_get "$output_file" ".output.experiments" 2>/dev/null)
|
|
402
|
+
|
|
403
|
+
if [[ -z "$experiments_data" ]] || [[ "$experiments_data" == "null" ]]; then
|
|
404
|
+
warn "Missing experiments array in output"
|
|
405
|
+
return 1
|
|
406
|
+
fi
|
|
407
|
+
|
|
408
|
+
local experiment_count
|
|
409
|
+
experiment_count=$(json_count "$output_file" ".output.experiments" 2>/dev/null)
|
|
410
|
+
|
|
411
|
+
if [[ -z "$experiment_count" ]] || [[ "$experiment_count" == "null" ]] || [[ "$experiment_count" -lt 1 ]]; then
|
|
412
|
+
error "No chaos experiments found in output"
|
|
413
|
+
return 1
|
|
414
|
+
fi
|
|
415
|
+
|
|
416
|
+
debug "Found $experiment_count chaos experiments"
|
|
417
|
+
|
|
418
|
+
# Validate first experiment structure
|
|
419
|
+
local first_id first_type first_result
|
|
420
|
+
first_id=$(json_get "$output_file" ".output.experiments[0].id" 2>/dev/null)
|
|
421
|
+
first_type=$(json_get "$output_file" ".output.experiments[0].type" 2>/dev/null)
|
|
422
|
+
first_result=$(json_get "$output_file" ".output.experiments[0].result" 2>/dev/null)
|
|
423
|
+
|
|
424
|
+
if [[ -z "$first_id" ]] || [[ "$first_id" == "null" ]]; then
|
|
425
|
+
error "Experiment missing 'id' field"
|
|
426
|
+
return 1
|
|
427
|
+
fi
|
|
428
|
+
|
|
429
|
+
if [[ -z "$first_type" ]] || [[ "$first_type" == "null" ]]; then
|
|
430
|
+
error "Experiment missing 'type' field"
|
|
431
|
+
return 1
|
|
432
|
+
fi
|
|
433
|
+
|
|
434
|
+
# Validate type is valid enum
|
|
435
|
+
if ! validate_enum "$first_type" "network" "resource" "state" "application" "infrastructure" "byzantine"; then
|
|
436
|
+
error "Experiment has invalid type: $first_type"
|
|
437
|
+
return 1
|
|
438
|
+
fi
|
|
439
|
+
|
|
440
|
+
if [[ -z "$first_result" ]] || [[ "$first_result" == "null" ]]; then
|
|
441
|
+
error "Experiment missing 'result' field"
|
|
442
|
+
return 1
|
|
443
|
+
fi
|
|
444
|
+
|
|
445
|
+
# Validate result is valid enum
|
|
446
|
+
if ! validate_enum "$first_result" "passed" "failed" "partial" "expected-fail"; then
|
|
447
|
+
error "Experiment has invalid result: $first_result"
|
|
448
|
+
return 1
|
|
449
|
+
fi
|
|
450
|
+
|
|
451
|
+
return 0
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
# Validate steady-state hypothesis structure
|
|
455
|
+
# Returns: 0 if valid, 1 if invalid
|
|
456
|
+
validate_steady_state() {
|
|
457
|
+
local output_file="$1"
|
|
458
|
+
|
|
459
|
+
# Check if any experiment has steady-state hypothesis
|
|
460
|
+
local has_hypothesis=false
|
|
461
|
+
|
|
462
|
+
if command_exists "jq"; then
|
|
463
|
+
local hypothesis_count
|
|
464
|
+
hypothesis_count=$(jq '[.output.experiments[] | select(.steadyStateHypothesis != null)] | length' "$output_file" 2>/dev/null || echo "0")
|
|
465
|
+
|
|
466
|
+
if [[ "$hypothesis_count" -gt 0 ]]; then
|
|
467
|
+
has_hypothesis=true
|
|
468
|
+
debug "Found $hypothesis_count experiments with steady-state hypothesis"
|
|
469
|
+
|
|
470
|
+
# Validate first hypothesis structure
|
|
471
|
+
local first_metrics
|
|
472
|
+
first_metrics=$(jq '.output.experiments[] | select(.steadyStateHypothesis != null) | .steadyStateHypothesis.metrics | length' "$output_file" 2>/dev/null | head -1)
|
|
473
|
+
|
|
474
|
+
if [[ -n "$first_metrics" ]] && [[ "$first_metrics" -gt 0 ]]; then
|
|
475
|
+
success "Steady-state hypothesis has $first_metrics metrics defined"
|
|
476
|
+
else
|
|
477
|
+
warn "Steady-state hypothesis has no metrics defined"
|
|
478
|
+
fi
|
|
479
|
+
fi
|
|
480
|
+
fi
|
|
481
|
+
|
|
482
|
+
if [[ "$has_hypothesis" == "false" ]]; then
|
|
483
|
+
warn "No experiments have steady-state hypothesis defined"
|
|
484
|
+
warn "Best practice: Define steady-state before chaos injection"
|
|
485
|
+
fi
|
|
486
|
+
|
|
487
|
+
return 0
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
# Validate blast radius controls
|
|
491
|
+
# Returns: 0 if valid, 1 if invalid
|
|
492
|
+
validate_blast_radius() {
|
|
493
|
+
local output_file="$1"
|
|
494
|
+
|
|
495
|
+
local has_blast_radius=false
|
|
496
|
+
|
|
497
|
+
if command_exists "jq"; then
|
|
498
|
+
local blast_radius_count
|
|
499
|
+
blast_radius_count=$(jq '[.output.experiments[] | select(.blastRadius != null)] | length' "$output_file" 2>/dev/null || echo "0")
|
|
500
|
+
|
|
501
|
+
if [[ "$blast_radius_count" -gt 0 ]]; then
|
|
502
|
+
has_blast_radius=true
|
|
503
|
+
debug "Found $blast_radius_count experiments with blast radius controls"
|
|
504
|
+
|
|
505
|
+
# Check for emergency stop
|
|
506
|
+
local emergency_stop_enabled
|
|
507
|
+
emergency_stop_enabled=$(jq '[.output.experiments[] | select(.blastRadius.emergencyStop == true)] | length' "$output_file" 2>/dev/null || echo "0")
|
|
508
|
+
|
|
509
|
+
if [[ "$emergency_stop_enabled" -gt 0 ]]; then
|
|
510
|
+
success "Emergency stop enabled for $emergency_stop_enabled experiments"
|
|
511
|
+
else
|
|
512
|
+
warn "No experiments have emergency stop enabled"
|
|
513
|
+
fi
|
|
514
|
+
fi
|
|
515
|
+
fi
|
|
516
|
+
|
|
517
|
+
if [[ "$has_blast_radius" == "false" ]]; then
|
|
518
|
+
warn "No experiments have blast radius controls defined"
|
|
519
|
+
warn "Best practice: Always define blast radius limits for safety"
|
|
520
|
+
fi
|
|
521
|
+
|
|
522
|
+
return 0
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
# Validate resilience score
|
|
526
|
+
# Returns: 0 if valid, 1 if invalid
|
|
527
|
+
validate_resilience_score() {
|
|
528
|
+
local output_file="$1"
|
|
529
|
+
|
|
530
|
+
local score_value score_max
|
|
531
|
+
score_value=$(json_get "$output_file" ".output.resilienceScore.value" 2>/dev/null)
|
|
532
|
+
score_max=$(json_get "$output_file" ".output.resilienceScore.max" 2>/dev/null)
|
|
533
|
+
|
|
534
|
+
if [[ -z "$score_value" ]] || [[ "$score_value" == "null" ]]; then
|
|
535
|
+
error "Missing resilience score value"
|
|
536
|
+
return 1
|
|
537
|
+
fi
|
|
538
|
+
|
|
539
|
+
if [[ -z "$score_max" ]] || [[ "$score_max" == "null" ]]; then
|
|
540
|
+
error "Missing resilience score max"
|
|
541
|
+
return 1
|
|
542
|
+
fi
|
|
543
|
+
|
|
544
|
+
# Validate score is in range
|
|
545
|
+
if command_exists "bc"; then
|
|
546
|
+
if (( $(echo "$score_value < 0 || $score_value > $score_max" | bc -l 2>/dev/null || echo "0") )); then
|
|
547
|
+
error "Resilience score $score_value out of range (0-$score_max)"
|
|
548
|
+
return 1
|
|
549
|
+
fi
|
|
550
|
+
fi
|
|
551
|
+
|
|
552
|
+
debug "Resilience score: $score_value/$score_max"
|
|
553
|
+
return 0
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
# Validate weaknesses structure
|
|
557
|
+
# Returns: 0 if valid, 1 if invalid
|
|
558
|
+
validate_weaknesses() {
|
|
559
|
+
local output_file="$1"
|
|
560
|
+
|
|
561
|
+
local weakness_count
|
|
562
|
+
weakness_count=$(json_count "$output_file" ".output.weaknesses" 2>/dev/null)
|
|
563
|
+
|
|
564
|
+
if [[ -z "$weakness_count" ]] || [[ "$weakness_count" == "null" ]]; then
|
|
565
|
+
weakness_count=0
|
|
566
|
+
fi
|
|
567
|
+
|
|
568
|
+
debug "Found $weakness_count weaknesses"
|
|
569
|
+
|
|
570
|
+
# If there are weaknesses, validate structure
|
|
571
|
+
if [[ "$weakness_count" -gt 0 ]]; then
|
|
572
|
+
local first_severity
|
|
573
|
+
first_severity=$(json_get "$output_file" ".output.weaknesses[0].severity" 2>/dev/null)
|
|
574
|
+
|
|
575
|
+
if [[ -n "$first_severity" ]] && [[ "$first_severity" != "null" ]]; then
|
|
576
|
+
if ! validate_enum "$first_severity" "critical" "high" "medium" "low"; then
|
|
577
|
+
error "Weakness has invalid severity: $first_severity"
|
|
578
|
+
return 1
|
|
579
|
+
fi
|
|
580
|
+
fi
|
|
581
|
+
fi
|
|
582
|
+
|
|
583
|
+
return 0
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
# Validate recovery times
|
|
587
|
+
# Returns: 0 if valid, 1 if invalid
|
|
588
|
+
validate_recovery_times() {
|
|
589
|
+
local output_file="$1"
|
|
590
|
+
|
|
591
|
+
if command_exists "jq"; then
|
|
592
|
+
local recovery_data
|
|
593
|
+
recovery_data=$(jq '[.output.experiments[] | select(.recoveryTime != null) | .recoveryTime] | length' "$output_file" 2>/dev/null || echo "0")
|
|
594
|
+
|
|
595
|
+
if [[ "$recovery_data" -gt 0 ]]; then
|
|
596
|
+
# Check for SLA compliance
|
|
597
|
+
local sla_violations
|
|
598
|
+
sla_violations=$(jq '[.output.experiments[] | select(.recoveryTime != null and .recoveryTime.withinSla == false)] | length' "$output_file" 2>/dev/null || echo "0")
|
|
599
|
+
|
|
600
|
+
if [[ "$sla_violations" -gt 0 ]]; then
|
|
601
|
+
warn "Found $sla_violations experiments with SLA violations"
|
|
602
|
+
else
|
|
603
|
+
success "All experiments with recovery times are within SLA"
|
|
604
|
+
fi
|
|
605
|
+
else
|
|
606
|
+
debug "No experiments have recovery time data"
|
|
607
|
+
fi
|
|
608
|
+
fi
|
|
609
|
+
|
|
610
|
+
return 0
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
# Main skill-specific validation function
|
|
614
|
+
# Returns: 0 if valid, 1 if invalid
|
|
615
|
+
validate_skill_specific() {
|
|
616
|
+
local output_file="$1"
|
|
617
|
+
local has_errors=false
|
|
618
|
+
|
|
619
|
+
debug "Running chaos-engineering-resilience specific validations..."
|
|
620
|
+
|
|
621
|
+
# Validate chaos experiments structure
|
|
622
|
+
if ! validate_chaos_experiments "$output_file"; then
|
|
623
|
+
has_errors=true
|
|
624
|
+
else
|
|
625
|
+
success "Chaos experiments validation passed"
|
|
626
|
+
fi
|
|
627
|
+
|
|
628
|
+
# Validate resilience score
|
|
629
|
+
if ! validate_resilience_score "$output_file"; then
|
|
630
|
+
has_errors=true
|
|
631
|
+
else
|
|
632
|
+
success "Resilience score validation passed"
|
|
633
|
+
fi
|
|
634
|
+
|
|
635
|
+
# Validate steady-state hypothesis (warning only)
|
|
636
|
+
if ! validate_steady_state "$output_file"; then
|
|
637
|
+
# Non-fatal warning
|
|
638
|
+
debug "Steady-state validation issue (non-fatal)"
|
|
639
|
+
else
|
|
640
|
+
success "Steady-state hypothesis validation passed"
|
|
641
|
+
fi
|
|
642
|
+
|
|
643
|
+
# Validate blast radius (warning only)
|
|
644
|
+
if ! validate_blast_radius "$output_file"; then
|
|
645
|
+
# Non-fatal warning
|
|
646
|
+
debug "Blast radius validation issue (non-fatal)"
|
|
647
|
+
else
|
|
648
|
+
success "Blast radius controls validation passed"
|
|
649
|
+
fi
|
|
650
|
+
|
|
651
|
+
# Validate weaknesses
|
|
652
|
+
if ! validate_weaknesses "$output_file"; then
|
|
653
|
+
has_errors=true
|
|
654
|
+
else
|
|
655
|
+
success "Weaknesses validation passed"
|
|
656
|
+
fi
|
|
657
|
+
|
|
658
|
+
# Validate recovery times (warning only)
|
|
659
|
+
if ! validate_recovery_times "$output_file"; then
|
|
660
|
+
# Non-fatal warning
|
|
661
|
+
debug "Recovery times validation issue (non-fatal)"
|
|
662
|
+
else
|
|
663
|
+
success "Recovery times validation passed"
|
|
664
|
+
fi
|
|
665
|
+
|
|
666
|
+
# Check for chaos tool attribution
|
|
667
|
+
local tools_used
|
|
668
|
+
tools_used=$(json_get "$output_file" ".metadata.toolsUsed" 2>/dev/null)
|
|
669
|
+
if [[ -z "$tools_used" ]] || [[ "$tools_used" == "null" ]] || [[ "$tools_used" == "[]" ]]; then
|
|
670
|
+
warn "No chaos tools listed in metadata.toolsUsed"
|
|
671
|
+
else
|
|
672
|
+
debug "Chaos tools used: $tools_used"
|
|
673
|
+
fi
|
|
674
|
+
|
|
675
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
676
|
+
return 1
|
|
677
|
+
fi
|
|
678
|
+
|
|
679
|
+
return 0
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
# =============================================================================
|
|
683
|
+
# Validation Functions (Override base template as needed)
|
|
684
|
+
# =============================================================================
|
|
685
|
+
|
|
686
|
+
validate_tools() {
|
|
687
|
+
if [[ ${#REQUIRED_TOOLS[@]} -eq 0 ]]; then
|
|
688
|
+
debug "No required tools specified"
|
|
689
|
+
return 0
|
|
690
|
+
fi
|
|
691
|
+
|
|
692
|
+
local missing=()
|
|
693
|
+
for tool in "${REQUIRED_TOOLS[@]}"; do
|
|
694
|
+
if ! command_exists "$tool"; then
|
|
695
|
+
missing+=("$tool")
|
|
696
|
+
fi
|
|
697
|
+
done
|
|
698
|
+
|
|
699
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
700
|
+
error "Missing required tools: ${missing[*]}"
|
|
701
|
+
return 1
|
|
702
|
+
fi
|
|
703
|
+
|
|
704
|
+
debug "All required tools available"
|
|
705
|
+
return 0
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
validate_schema() {
|
|
709
|
+
local output_file="$1"
|
|
710
|
+
|
|
711
|
+
if [[ -z "$SCHEMA_PATH" ]]; then
|
|
712
|
+
debug "No schema path configured, skipping schema validation"
|
|
713
|
+
return 2
|
|
714
|
+
fi
|
|
715
|
+
|
|
716
|
+
if [[ ! -f "$SCHEMA_PATH" ]]; then
|
|
717
|
+
warn "Schema file not found: $SCHEMA_PATH"
|
|
718
|
+
return 2
|
|
719
|
+
fi
|
|
720
|
+
|
|
721
|
+
debug "Validating against schema: $SCHEMA_PATH"
|
|
722
|
+
|
|
723
|
+
local result
|
|
724
|
+
result=$(validate_json_schema "$SCHEMA_PATH" "$output_file" 2>&1)
|
|
725
|
+
local status=$?
|
|
726
|
+
|
|
727
|
+
case $status in
|
|
728
|
+
0)
|
|
729
|
+
success "Schema validation passed"
|
|
730
|
+
return 0
|
|
731
|
+
;;
|
|
732
|
+
1)
|
|
733
|
+
error "Schema validation failed"
|
|
734
|
+
if [[ "$VERBOSE" == "true" ]]; then
|
|
735
|
+
echo "$result" | while read -r line; do
|
|
736
|
+
echo " $line"
|
|
737
|
+
done
|
|
738
|
+
fi
|
|
739
|
+
return 1
|
|
740
|
+
;;
|
|
741
|
+
2)
|
|
742
|
+
warn "Schema validation skipped (no validator available)"
|
|
743
|
+
return 2
|
|
744
|
+
;;
|
|
745
|
+
esac
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
validate_required_fields() {
|
|
749
|
+
local output_file="$1"
|
|
750
|
+
local missing=()
|
|
751
|
+
local empty=()
|
|
752
|
+
|
|
753
|
+
for field in "${REQUIRED_FIELDS[@]}"; do
|
|
754
|
+
local value
|
|
755
|
+
value=$(json_get "$output_file" ".$field" 2>/dev/null)
|
|
756
|
+
if [[ -z "$value" ]] || [[ "$value" == "null" ]]; then
|
|
757
|
+
missing+=("$field")
|
|
758
|
+
fi
|
|
759
|
+
done
|
|
760
|
+
|
|
761
|
+
for field in "${REQUIRED_NON_EMPTY_FIELDS[@]}"; do
|
|
762
|
+
local value
|
|
763
|
+
value=$(json_get "$output_file" ".$field" 2>/dev/null)
|
|
764
|
+
if [[ -z "$value" ]] || [[ "$value" == "null" ]] || [[ "$value" == "" ]] || [[ "$value" == "[]" ]] || [[ "$value" == "{}" ]]; then
|
|
765
|
+
empty+=("$field")
|
|
766
|
+
fi
|
|
767
|
+
done
|
|
768
|
+
|
|
769
|
+
local has_errors=false
|
|
770
|
+
|
|
771
|
+
if [[ ${#missing[@]} -gt 0 ]]; then
|
|
772
|
+
error "Missing required fields: ${missing[*]}"
|
|
773
|
+
has_errors=true
|
|
774
|
+
fi
|
|
775
|
+
|
|
776
|
+
if [[ ${#empty[@]} -gt 0 ]]; then
|
|
777
|
+
error "Empty required fields: ${empty[*]}"
|
|
778
|
+
has_errors=true
|
|
779
|
+
fi
|
|
780
|
+
|
|
781
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
782
|
+
return 1
|
|
783
|
+
fi
|
|
784
|
+
|
|
785
|
+
success "All required fields present and valid"
|
|
786
|
+
return 0
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
validate_enum_fields() {
|
|
790
|
+
local output_file="$1"
|
|
791
|
+
|
|
792
|
+
if [[ ${#ENUM_VALIDATIONS[@]} -eq 0 ]]; then
|
|
793
|
+
return 0
|
|
794
|
+
fi
|
|
795
|
+
|
|
796
|
+
local has_errors=false
|
|
797
|
+
|
|
798
|
+
for validation in "${ENUM_VALIDATIONS[@]}"; do
|
|
799
|
+
local field_path="${validation%%:*}"
|
|
800
|
+
local allowed_values="${validation#*:}"
|
|
801
|
+
|
|
802
|
+
local actual_value
|
|
803
|
+
actual_value=$(json_get "$output_file" "$field_path" 2>/dev/null)
|
|
804
|
+
|
|
805
|
+
if [[ -z "$actual_value" ]] || [[ "$actual_value" == "null" ]]; then
|
|
806
|
+
continue
|
|
807
|
+
fi
|
|
808
|
+
|
|
809
|
+
local found=false
|
|
810
|
+
IFS=',' read -ra allowed_array <<< "$allowed_values"
|
|
811
|
+
for allowed in "${allowed_array[@]}"; do
|
|
812
|
+
if [[ "$actual_value" == "$allowed" ]]; then
|
|
813
|
+
found=true
|
|
814
|
+
break
|
|
815
|
+
fi
|
|
816
|
+
done
|
|
817
|
+
|
|
818
|
+
if [[ "$found" == "false" ]]; then
|
|
819
|
+
error "Invalid value for $field_path: '$actual_value' (allowed: $allowed_values)"
|
|
820
|
+
has_errors=true
|
|
821
|
+
fi
|
|
822
|
+
done
|
|
823
|
+
|
|
824
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
825
|
+
return 1
|
|
826
|
+
fi
|
|
827
|
+
|
|
828
|
+
success "All enum fields have valid values"
|
|
829
|
+
return 0
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
validate_array_lengths() {
|
|
833
|
+
local output_file="$1"
|
|
834
|
+
|
|
835
|
+
if [[ ${#MIN_ARRAY_LENGTHS[@]} -eq 0 ]]; then
|
|
836
|
+
return 0
|
|
837
|
+
fi
|
|
838
|
+
|
|
839
|
+
local has_errors=false
|
|
840
|
+
|
|
841
|
+
for validation in "${MIN_ARRAY_LENGTHS[@]}"; do
|
|
842
|
+
local field_path="${validation%%:*}"
|
|
843
|
+
local min_length="${validation#*:}"
|
|
844
|
+
|
|
845
|
+
local actual_count
|
|
846
|
+
actual_count=$(json_count "$output_file" "$field_path" 2>/dev/null)
|
|
847
|
+
|
|
848
|
+
if [[ -z "$actual_count" ]] || [[ "$actual_count" == "null" ]]; then
|
|
849
|
+
actual_count=0
|
|
850
|
+
fi
|
|
851
|
+
|
|
852
|
+
if [[ "$actual_count" -lt "$min_length" ]]; then
|
|
853
|
+
error "Array $field_path has $actual_count items (minimum: $min_length)"
|
|
854
|
+
has_errors=true
|
|
855
|
+
else
|
|
856
|
+
debug "Array $field_path has $actual_count items (>= $min_length)"
|
|
857
|
+
fi
|
|
858
|
+
done
|
|
859
|
+
|
|
860
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
861
|
+
return 1
|
|
862
|
+
fi
|
|
863
|
+
|
|
864
|
+
return 0
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
validate_content_terms() {
|
|
868
|
+
local output_file="$1"
|
|
869
|
+
local content
|
|
870
|
+
content=$(cat "$output_file")
|
|
871
|
+
|
|
872
|
+
local has_errors=false
|
|
873
|
+
|
|
874
|
+
if [[ ${#MUST_CONTAIN_TERMS[@]} -gt 0 ]]; then
|
|
875
|
+
local missing_terms=()
|
|
876
|
+
for term in "${MUST_CONTAIN_TERMS[@]}"; do
|
|
877
|
+
if ! grep -qi "$term" <<< "$content"; then
|
|
878
|
+
missing_terms+=("$term")
|
|
879
|
+
fi
|
|
880
|
+
done
|
|
881
|
+
|
|
882
|
+
if [[ ${#missing_terms[@]} -gt 0 ]]; then
|
|
883
|
+
error "Output missing required chaos terms: ${missing_terms[*]}"
|
|
884
|
+
has_errors=true
|
|
885
|
+
else
|
|
886
|
+
success "All required chaos terms found"
|
|
887
|
+
fi
|
|
888
|
+
fi
|
|
889
|
+
|
|
890
|
+
if [[ ${#MUST_NOT_CONTAIN_TERMS[@]} -gt 0 ]]; then
|
|
891
|
+
local found_forbidden=()
|
|
892
|
+
for term in "${MUST_NOT_CONTAIN_TERMS[@]}"; do
|
|
893
|
+
if grep -qi "$term" <<< "$content"; then
|
|
894
|
+
found_forbidden+=("$term")
|
|
895
|
+
fi
|
|
896
|
+
done
|
|
897
|
+
|
|
898
|
+
if [[ ${#found_forbidden[@]} -gt 0 ]]; then
|
|
899
|
+
error "Output contains forbidden terms: ${found_forbidden[*]}"
|
|
900
|
+
has_errors=true
|
|
901
|
+
else
|
|
902
|
+
success "No forbidden terms found"
|
|
903
|
+
fi
|
|
904
|
+
fi
|
|
905
|
+
|
|
906
|
+
if [[ "$has_errors" == "true" ]]; then
|
|
907
|
+
return 1
|
|
908
|
+
fi
|
|
909
|
+
|
|
910
|
+
return 0
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
# =============================================================================
|
|
914
|
+
# Main Validation Flow
|
|
915
|
+
# =============================================================================
|
|
916
|
+
|
|
917
|
+
main() {
|
|
918
|
+
if [[ -z "$OUTPUT_FILE" ]]; then
|
|
919
|
+
error "No output file specified"
|
|
920
|
+
echo "Usage: $0 <output-file> [options]"
|
|
921
|
+
echo "Use --help for more information"
|
|
922
|
+
exit 1
|
|
923
|
+
fi
|
|
924
|
+
|
|
925
|
+
if [[ ! -f "$OUTPUT_FILE" ]]; then
|
|
926
|
+
error "Output file not found: $OUTPUT_FILE"
|
|
927
|
+
exit 1
|
|
928
|
+
fi
|
|
929
|
+
|
|
930
|
+
if [[ "$JSON_ONLY" != "true" ]]; then
|
|
931
|
+
echo "=============================================="
|
|
932
|
+
info "Validating $SKILL_NAME Output"
|
|
933
|
+
echo "=============================================="
|
|
934
|
+
echo ""
|
|
935
|
+
echo " Skill: $SKILL_NAME v$SKILL_VERSION"
|
|
936
|
+
echo " File: $OUTPUT_FILE"
|
|
937
|
+
echo " Schema: ${SCHEMA_PATH:-none}"
|
|
938
|
+
echo ""
|
|
939
|
+
fi
|
|
940
|
+
|
|
941
|
+
# Track validation status
|
|
942
|
+
local tool_status="passed"
|
|
943
|
+
local json_status="passed"
|
|
944
|
+
local schema_status="passed"
|
|
945
|
+
local fields_status="passed"
|
|
946
|
+
local enums_status="passed"
|
|
947
|
+
local arrays_status="passed"
|
|
948
|
+
local content_status="passed"
|
|
949
|
+
local specific_status="passed"
|
|
950
|
+
local error_count=0
|
|
951
|
+
local warning_count=0
|
|
952
|
+
|
|
953
|
+
# Step 1: Check Required Tools
|
|
954
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 1: Tool Availability ---"
|
|
955
|
+
|
|
956
|
+
if ! validate_tools; then
|
|
957
|
+
tool_status="failed"
|
|
958
|
+
((error_count++)) || true
|
|
959
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
960
|
+
output_validation_report "$SKILL_NAME" "skipped" "skipped" "failed"
|
|
961
|
+
fi
|
|
962
|
+
exit $EXIT_SKIP
|
|
963
|
+
fi
|
|
964
|
+
|
|
965
|
+
[[ "$JSON_ONLY" != "true" ]] && success "Tool check passed" && echo ""
|
|
966
|
+
|
|
967
|
+
# Step 2: Validate JSON Syntax
|
|
968
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 2: JSON Syntax ---"
|
|
969
|
+
|
|
970
|
+
if ! validate_json "$OUTPUT_FILE"; then
|
|
971
|
+
json_status="failed"
|
|
972
|
+
((error_count++)) || true
|
|
973
|
+
[[ "$JSON_ONLY" != "true" ]] && error "File is not valid JSON"
|
|
974
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
975
|
+
output_validation_report "$SKILL_NAME" "failed" "failed" "$tool_status"
|
|
976
|
+
fi
|
|
977
|
+
exit $EXIT_FAIL
|
|
978
|
+
fi
|
|
979
|
+
|
|
980
|
+
[[ "$JSON_ONLY" != "true" ]] && success "JSON syntax valid" && echo ""
|
|
981
|
+
|
|
982
|
+
# Step 3: Validate Against Schema
|
|
983
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 3: Schema Validation ---"
|
|
984
|
+
|
|
985
|
+
local schema_exit_code
|
|
986
|
+
validate_schema "$OUTPUT_FILE" && schema_exit_code=0 || schema_exit_code=$?
|
|
987
|
+
|
|
988
|
+
case $schema_exit_code in
|
|
989
|
+
0) [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
990
|
+
1) schema_status="failed"; ((error_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
991
|
+
2) schema_status="skipped"; ((warning_count++)) || true; [[ "$JSON_ONLY" != "true" ]] && echo "" ;;
|
|
992
|
+
esac
|
|
993
|
+
|
|
994
|
+
# Step 4: Validate Required Fields
|
|
995
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 4: Required Fields ---"
|
|
996
|
+
|
|
997
|
+
if ! validate_required_fields "$OUTPUT_FILE"; then
|
|
998
|
+
fields_status="failed"
|
|
999
|
+
((error_count++)) || true
|
|
1000
|
+
fi
|
|
1001
|
+
|
|
1002
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
1003
|
+
|
|
1004
|
+
# Step 5: Validate Enum Values
|
|
1005
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 5: Enum Validation ---"
|
|
1006
|
+
|
|
1007
|
+
if ! validate_enum_fields "$OUTPUT_FILE"; then
|
|
1008
|
+
enums_status="failed"
|
|
1009
|
+
((error_count++)) || true
|
|
1010
|
+
fi
|
|
1011
|
+
|
|
1012
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
1013
|
+
|
|
1014
|
+
# Step 6: Validate Array Lengths
|
|
1015
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 6: Array Validation ---"
|
|
1016
|
+
|
|
1017
|
+
if ! validate_array_lengths "$OUTPUT_FILE"; then
|
|
1018
|
+
arrays_status="failed"
|
|
1019
|
+
((error_count++)) || true
|
|
1020
|
+
fi
|
|
1021
|
+
|
|
1022
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
1023
|
+
|
|
1024
|
+
# Step 7: Validate Chaos Content Terms
|
|
1025
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 7: Chaos Content Terms ---"
|
|
1026
|
+
|
|
1027
|
+
if ! validate_content_terms "$OUTPUT_FILE"; then
|
|
1028
|
+
content_status="failed"
|
|
1029
|
+
((error_count++)) || true
|
|
1030
|
+
fi
|
|
1031
|
+
|
|
1032
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
1033
|
+
|
|
1034
|
+
# Step 8: Chaos-Specific Validation
|
|
1035
|
+
[[ "$JSON_ONLY" != "true" ]] && echo "--- Step 8: Chaos-Specific Validation ---"
|
|
1036
|
+
|
|
1037
|
+
if ! validate_skill_specific "$OUTPUT_FILE"; then
|
|
1038
|
+
specific_status="failed"
|
|
1039
|
+
((error_count++)) || true
|
|
1040
|
+
fi
|
|
1041
|
+
|
|
1042
|
+
[[ "$JSON_ONLY" != "true" ]] && echo ""
|
|
1043
|
+
|
|
1044
|
+
# Determine Overall Status
|
|
1045
|
+
local overall_status="passed"
|
|
1046
|
+
local content_overall="passed"
|
|
1047
|
+
|
|
1048
|
+
if [[ "$fields_status" == "failed" ]] || \
|
|
1049
|
+
[[ "$enums_status" == "failed" ]] || \
|
|
1050
|
+
[[ "$arrays_status" == "failed" ]] || \
|
|
1051
|
+
[[ "$content_status" == "failed" ]] || \
|
|
1052
|
+
[[ "$specific_status" == "failed" ]]; then
|
|
1053
|
+
content_overall="failed"
|
|
1054
|
+
fi
|
|
1055
|
+
|
|
1056
|
+
if [[ "$json_status" == "failed" ]] || \
|
|
1057
|
+
[[ "$schema_status" == "failed" ]] || \
|
|
1058
|
+
[[ "$content_overall" == "failed" ]]; then
|
|
1059
|
+
overall_status="failed"
|
|
1060
|
+
elif [[ "$schema_status" == "skipped" ]]; then
|
|
1061
|
+
overall_status="partial"
|
|
1062
|
+
fi
|
|
1063
|
+
|
|
1064
|
+
# Output Results
|
|
1065
|
+
if [[ "$JSON_ONLY" == "true" ]]; then
|
|
1066
|
+
output_validation_report "$SKILL_NAME" "$schema_status" "$content_overall" "$tool_status"
|
|
1067
|
+
else
|
|
1068
|
+
echo "=============================================="
|
|
1069
|
+
echo "Validation Summary for $SKILL_NAME"
|
|
1070
|
+
echo "=============================================="
|
|
1071
|
+
echo ""
|
|
1072
|
+
echo " Tools: $tool_status"
|
|
1073
|
+
echo " JSON Syntax: $json_status"
|
|
1074
|
+
echo " Schema: $schema_status"
|
|
1075
|
+
echo " Required Fields: $fields_status"
|
|
1076
|
+
echo " Enum Values: $enums_status"
|
|
1077
|
+
echo " Array Lengths: $arrays_status"
|
|
1078
|
+
echo " Content Terms: $content_status"
|
|
1079
|
+
echo " Chaos-Specific: $specific_status"
|
|
1080
|
+
echo ""
|
|
1081
|
+
echo " ------------------------------"
|
|
1082
|
+
echo " Overall: $overall_status"
|
|
1083
|
+
echo " Errors: $error_count"
|
|
1084
|
+
echo " Warnings: $warning_count"
|
|
1085
|
+
echo "=============================================="
|
|
1086
|
+
echo ""
|
|
1087
|
+
fi
|
|
1088
|
+
|
|
1089
|
+
# Exit with appropriate code
|
|
1090
|
+
case "$overall_status" in
|
|
1091
|
+
"passed")
|
|
1092
|
+
[[ "$JSON_ONLY" != "true" ]] && success "Validation PASSED"
|
|
1093
|
+
exit $EXIT_PASS
|
|
1094
|
+
;;
|
|
1095
|
+
"partial")
|
|
1096
|
+
[[ "$JSON_ONLY" != "true" ]] && warn "Validation PARTIAL (some checks skipped)"
|
|
1097
|
+
exit $EXIT_PASS
|
|
1098
|
+
;;
|
|
1099
|
+
"failed")
|
|
1100
|
+
[[ "$JSON_ONLY" != "true" ]] && error "Validation FAILED"
|
|
1101
|
+
exit $EXIT_FAIL
|
|
1102
|
+
;;
|
|
1103
|
+
esac
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
# Run main function
|
|
1107
|
+
main
|