{"id":"1fb10f81-238c-4e27-af61-52bef4029620","shortId":"HC73eJ","kind":"skill","title":"deployment-validation-config-validate","tagline":"You are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensive validation schemas, implement configurat","description":"# Configuration Validation\n\nYou are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensive validation schemas, implement configuration testing strategies, and ensure configurations are secure, consistent, and error-free across all environments.\n\n## Use this skill when\n\n- Working on configuration validation tasks or workflows\n- Needing guidance, best practices, or checklists for configuration validation\n\n## Do not use this skill when\n\n- The task is unrelated to configuration validation\n- You need a different domain or tool outside this scope\n\n## Context\nThe user needs to validate configuration files, implement configuration schemas, ensure consistency across environments, and prevent configuration-related errors. Focus on creating robust validation rules, type safety, security checks, and automated validation processes.\n\n## Requirements\n$ARGUMENTS\n\n## Instructions\n\n### 1. Configuration Analysis\n\nAnalyze existing configuration structure and identify validation needs:\n\n```python\nimport os\nimport yaml\nimport json\nfrom pathlib import Path\nfrom typing import Dict, List, Any\n\nclass ConfigurationAnalyzer:\n    def analyze_project(self, project_path: str) -> Dict[str, Any]:\n        analysis = {\n            'config_files': self._find_config_files(project_path),\n            'security_issues': self._check_security_issues(project_path),\n            'consistency_issues': self._check_consistency(project_path),\n            'recommendations': []\n        }\n        return analysis\n\n    def _find_config_files(self, project_path: str) -> List[Dict]:\n        config_patterns = [\n            '**/*.json', '**/*.yaml', '**/*.yml', '**/*.toml',\n            '**/*.ini', '**/*.env*', '**/config.js'\n        ]\n\n        config_files = []\n        for pattern in config_patterns:\n            for file_path in Path(project_path).glob(pattern):\n                if not self._should_ignore(file_path):\n                    config_files.append({\n                        'path': str(file_path),\n                        'type': self._detect_config_type(file_path),\n                        'environment': self._detect_environment(file_path)\n                    })\n        return config_files\n\n    def _check_security_issues(self, project_path: str) -> List[Dict]:\n        issues = []\n        secret_patterns = [\n            r'(api[_-]?key|apikey)',\n            r'(secret|password|passwd)',\n            r'(token|auth)',\n            r'(aws[_-]?access)'\n        ]\n\n        for config_file in self._find_config_files(project_path):\n            content = Path(config_file['path']).read_text()\n            for pattern in secret_patterns:\n                if re.search(pattern, content, re.IGNORECASE):\n                    if self._looks_like_real_secret(content, pattern):\n                        issues.append({\n                            'file': config_file['path'],\n                            'type': 'potential_secret',\n                            'severity': 'high'\n                        })\n        return issues\n```\n\n### 2. Schema Validation\n\nImplement configuration schema validation with JSON Schema:\n\n```typescript\nimport Ajv from 'ajv';\nimport ajvFormats from 'ajv-formats';\nimport { JSONSchema7 } from 'json-schema';\n\ninterface ValidationResult {\n  valid: boolean;\n  errors?: Array<{\n    path: string;\n    message: string;\n    keyword: string;\n  }>;\n}\n\nexport class ConfigValidator {\n  private ajv: Ajv;\n\n  constructor() {\n    this.ajv = new Ajv({\n      allErrors: true,\n      strict: false,\n      coerceTypes: true\n    });\n    ajvFormats(this.ajv);\n    this.addCustomFormats();\n  }\n\n  private addCustomFormats() {\n    this.ajv.addFormat('url-https', {\n      type: 'string',\n      validate: (data: string) => {\n        try {\n          return new URL(data).protocol === 'https:';\n        } catch { return false; }\n      }\n    });\n\n    this.ajv.addFormat('port', {\n      type: 'number',\n      validate: (data: number) => data >= 1 && data <= 65535\n    });\n\n    this.ajv.addFormat('duration', {\n      type: 'string',\n      validate: /^\\d+[smhd]$/\n    });\n  }\n\n  validate(configData: any, schemaName: string): ValidationResult {\n    const validate = this.ajv.getSchema(schemaName);\n    if (!validate) throw new Error(`Schema '${schemaName}' not found`);\n\n    const valid = validate(configData);\n\n    if (!valid && validate.errors) {\n      return {\n        valid: false,\n        errors: validate.errors.map(error => ({\n          path: error.instancePath || '/',\n          message: error.message || 'Validation error',\n          keyword: error.keyword\n        }))\n      };\n    }\n    return { valid: true };\n  }\n}\n\n// Example schema\nexport const schemas = {\n  database: {\n    type: 'object',\n    properties: {\n      host: { type: 'string', format: 'hostname' },\n      port: { type: 'integer', format: 'port' },\n      database: { type: 'string', minLength: 1 },\n      user: { type: 'string', minLength: 1 },\n      password: { type: 'string', minLength: 8 },\n      ssl: {\n        type: 'object',\n        properties: {\n          enabled: { type: 'boolean' }\n        },\n        required: ['enabled']\n      }\n    },\n    required: ['host', 'port', 'database', 'user', 'password']\n  }\n};\n```\n\n### 3. Environment-Specific Validation\n\n```python\nfrom typing import Dict, List, Any\n\nclass EnvironmentValidator:\n    def __init__(self):\n        self.environments = ['development', 'staging', 'production']\n        self.environment_rules = {\n            'development': {\n                'allow_debug': True,\n                'require_https': False,\n                'min_password_length': 8\n            },\n            'production': {\n                'allow_debug': False,\n                'require_https': True,\n                'min_password_length': 16,\n                'require_encryption': True\n            }\n        }\n\n    def validate_config(self, config: Dict, environment: str) -> List[Dict]:\n        if environment not in self.environment_rules:\n            raise ValueError(f\"Unknown environment: {environment}\")\n\n        rules = self.environment_rules[environment]\n        violations = []\n\n        if not rules['allow_debug'] and config.get('debug', False):\n            violations.append({\n                'rule': 'no_debug_in_production',\n                'message': 'Debug mode not allowed in production',\n                'severity': 'critical'\n            })\n\n        if rules['require_https']:\n            urls = self._extract_urls(config)\n            for url_path, url in urls:\n                if url.startswith('http://') and 'localhost' not in url:\n                    violations.append({\n                        'rule': 'require_https',\n                        'message': f'HTTPS required for {url_path}',\n                        'severity': 'high'\n                    })\n\n        return violations\n```\n\n### 4. Configuration Testing\n\n```typescript\nimport { describe, it, expect } from '@jest/globals';\nimport { ConfigValidator } from './config-validator';\n\ndescribe('Configuration Validation', () => {\n  let validator: ConfigValidator;\n\n  beforeEach(() => {\n    validator = new ConfigValidator();\n  });\n\n  it('should validate database config', () => {\n    const config = {\n      host: 'localhost',\n      port: 5432,\n      database: 'myapp',\n      user: 'dbuser',\n      password: 'securepass123'\n    };\n\n    const result = validator.validate(config, 'database');\n    expect(result.valid).toBe(true);\n  });\n\n  it('should reject invalid port', () => {\n    const config = {\n      host: 'localhost',\n      port: 70000,\n      database: 'myapp',\n      user: 'dbuser',\n      password: 'securepass123'\n    };\n\n    const result = validator.validate(config, 'database');\n    expect(result.valid).toBe(false);\n  });\n});\n```\n\n### 5. Runtime Validation\n\n```typescript\nimport { EventEmitter } from 'events';\nimport * as chokidar from 'chokidar';\n\nexport class RuntimeConfigValidator extends EventEmitter {\n  private validator: ConfigValidator;\n  private currentConfig: any;\n\n  async initialize(configPath: string): Promise<void> {\n    this.currentConfig = await this.loadAndValidate(configPath);\n    this.watchConfig(configPath);\n  }\n\n  private async loadAndValidate(configPath: string): Promise<any> {\n    const config = await this.loadConfig(configPath);\n\n    const validationResult = this.validator.validate(\n      config,\n      this.detectEnvironment()\n    );\n\n    if (!validationResult.valid) {\n      this.emit('validation:error', {\n        path: configPath,\n        errors: validationResult.errors\n      });\n\n      if (!this.isDevelopment()) {\n        throw new Error('Configuration validation failed');\n      }\n    }\n\n    return config;\n  }\n\n  private watchConfig(configPath: string): void {\n    const watcher = chokidar.watch(configPath, {\n      persistent: true,\n      ignoreInitial: true\n    });\n\n    watcher.on('change', async () => {\n      try {\n        const newConfig = await this.loadAndValidate(configPath);\n\n        if (JSON.stringify(newConfig) !== JSON.stringify(this.currentConfig)) {\n          this.emit('config:changed', {\n            oldConfig: this.currentConfig,\n            newConfig\n          });\n          this.currentConfig = newConfig;\n        }\n      } catch (error) {\n        this.emit('config:error', { error });\n      }\n    });\n  }\n}\n```\n\n### 6. Configuration Migration\n\n```python\nfrom typing import Dict\nfrom abc import ABC, abstractmethod\nimport semver\n\nclass ConfigMigration(ABC):\n    @property\n    @abstractmethod\n    def version(self) -> str:\n        pass\n\n    @abstractmethod\n    def up(self, config: Dict) -> Dict:\n        pass\n\n    @abstractmethod\n    def down(self, config: Dict) -> Dict:\n        pass\n\nclass ConfigMigrator:\n    def __init__(self):\n        self.migrations: List[ConfigMigration] = []\n\n    def migrate(self, config: Dict, target_version: str) -> Dict:\n        current_version = config.get('_version', '0.0.0')\n\n        if semver.compare(current_version, target_version) == 0:\n            return config\n\n        result = config.copy()\n        for migration in self.migrations:\n            if (semver.compare(migration.version, current_version) > 0 and\n                semver.compare(migration.version, target_version) <= 0):\n                result = migration.up(result)\n                result['_version'] = migration.version\n\n        return result\n```\n\n### 7. Secure Configuration\n\n```typescript\nimport * as crypto from 'crypto';\n\ninterface EncryptedValue {\n  encrypted: true;\n  value: string;\n  algorithm: string;\n  iv: string;\n  authTag?: string;\n}\n\nexport class SecureConfigManager {\n  private encryptionKey: Buffer;\n\n  constructor(masterKey: string) {\n    this.encryptionKey = crypto.pbkdf2Sync(masterKey, 'config-salt', 100000, 32, 'sha256');\n  }\n\n  encrypt(value: any): EncryptedValue {\n    const algorithm = 'aes-256-gcm';\n    const iv = crypto.randomBytes(16);\n    const cipher = crypto.createCipheriv(algorithm, this.encryptionKey, iv);\n\n    let encrypted = cipher.update(JSON.stringify(value), 'utf8', 'hex');\n    encrypted += cipher.final('hex');\n\n    return {\n      encrypted: true,\n      value: encrypted,\n      algorithm,\n      iv: iv.toString('hex'),\n      authTag: cipher.getAuthTag().toString('hex')\n    };\n  }\n\n  decrypt(encryptedValue: EncryptedValue): any {\n    const decipher = crypto.createDecipheriv(\n      encryptedValue.algorithm,\n      this.encryptionKey,\n      Buffer.from(encryptedValue.iv, 'hex')\n    );\n\n    if (encryptedValue.authTag) {\n      decipher.setAuthTag(Buffer.from(encryptedValue.authTag, 'hex'));\n    }\n\n    let decrypted = decipher.update(encryptedValue.value, 'hex', 'utf8');\n    decrypted += decipher.final('utf8');\n\n    return JSON.parse(decrypted);\n  }\n\n  async processConfig(config: any): Promise<any> {\n    const processed = {};\n\n    for (const [key, value] of Object.entries(config)) {\n      if (this.isEncryptedValue(value)) {\n        processed[key] = this.decrypt(value as EncryptedValue);\n      } else if (typeof value === 'object' && value !== null) {\n        processed[key] = await this.processConfig(value);\n      } else {\n        processed[key] = value;\n      }\n    }\n\n    return processed;\n  }\n}\n```\n\n### 8. Documentation Generation\n\n```python\nfrom typing import Dict, List\nimport yaml\n\nclass ConfigDocGenerator:\n    def generate_docs(self, schema: Dict, examples: Dict) -> str:\n        docs = [\"# Configuration Reference\\n\"]\n\n        docs.append(\"## Configuration Options\\n\")\n        sections = self._generate_sections(schema.get('properties', {}), examples)\n        docs.extend(sections)\n\n        return '\\n'.join(docs)\n\n    def _generate_sections(self, properties: Dict, examples: Dict, level: int = 3) -> List[str]:\n        sections = []\n\n        for prop_name, prop_schema in properties.items():\n            sections.append(f\"{'#' * level} {prop_name}\\n\")\n\n            if 'description' in prop_schema:\n                sections.append(f\"{prop_schema['description']}\\n\")\n\n            sections.append(f\"**Type:** `{prop_schema.get('type', 'any')}`\\n\")\n\n            if 'default' in prop_schema:\n                sections.append(f\"**Default:** `{prop_schema['default']}`\\n\")\n\n            if prop_name in examples:\n                sections.append(\"**Example:**\\n```yaml\")\n                sections.append(yaml.dump({prop_name: examples[prop_name]}))\n                sections.append(\"```\\n\")\n\n        return sections\n```\n\n## Output Format\n\n1. **Configuration Analysis**: Current configuration assessment\n2. **Validation Schemas**: JSON Schema definitions\n3. **Environment Rules**: Environment-specific validation\n4. **Test Suite**: Configuration tests\n5. **Migration Scripts**: Version migrations\n6. **Security Report**: Issues and recommendations\n7. **Documentation**: Auto-generated reference\n\nFocus on preventing configuration errors, ensuring consistency, and maintaining security best practices.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["deployment","validation","config","validate","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents"],"capabilities":["skill","source-sickn33","skill-deployment-validation-config-validate","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/deployment-validation-config-validate","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34831 github stars · SKILL.md body (14,200 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-24T06:51:03.334Z","embedding":null,"createdAt":"2026-04-18T21:35:59.076Z","updatedAt":"2026-04-24T06:51:03.334Z","lastSeenAt":"2026-04-24T06:51:03.334Z","tsv":"'-256':986 '/config-validator':668 '/config.js':227 '0':911,925,931 '0.0.0':904 '1':150,419,495,500,1212 '100000':976 '16':565,991 '2':332,1218 '3':521,1143,1224 '32':977 '4':655,1231 '5':731,1236 '5432':689 '6':842,1241 '65535':421 '7':940,1247 '70000':715 '8':505,554,1092 'abc':851,853,859 'abstractmethod':854,861,867,875 'access':291 'across':66,125 'addcustomformat':391 'ae':985 'ajv':344,346,351,375,376,380 'ajv-format':350 'ajvformat':348,387 'algorithm':955,984,995,1013 'allerror':381 'allow':545,556,599,615 'analysi':152,190,208,1214 'analyz':153,181 'api':279 'apikey':281 'applic':21,46 'argument':148 'array':364 'ask':1298 'assess':1217 'async':755,767,816,1051 'auth':288 'authtag':959,1017 'auto':1250 'auto-gener':1249 'autom':144 'aw':290 'await':761,774,820,1083 'beforeeach':675 'best':82,1263 'boolean':362,512 'boundari':1306 'buffer':966 'buffer.from':1030,1036 'catch':408,836 'chang':815,830 'check':142,266 'checklist':85 'chokidar':741,743 'chokidar.watch':808 'cipher':993 'cipher.final':1006 'cipher.getauthtag':1018 'cipher.update':1000 'clarif':1300 'class':178,372,533,745,857,883,962,1103 'clear':1273 'coercetyp':385 'comprehens':24,49 'config':4,191,211,219,228,233,263,293,301,322,571,573,626,683,685,699,711,725,773,780,800,829,839,871,879,894,913,974,1053,1064 'config-salt':973 'config.copy':915 'config.get':602,902 'config_files.append':249 'configdata':430,451 'configdocgener':1104 'configmigr':858,884,890 'configpath':757,763,765,769,776,788,803,809,822 'configur':9,22,29,34,47,53,58,75,87,100,118,121,130,151,155,336,656,670,796,843,942,1115,1119,1213,1216,1234,1256 'configurat':28 'configuration-rel':129 'configurationanalyz':179 'configvalid':373,666,674,678,751 'consist':61,124,201,1259 'const':435,448,475,684,696,710,722,772,777,806,818,983,988,992,1025,1056,1059 'constructor':377,967 'content':299,314,318 'context':112 'correct':19,44 'creat':23,48,135 'criteria':1309 'critic':619 'crypto':946,948 'crypto.createcipheriv':994 'crypto.createdecipheriv':1027 'crypto.pbkdf2sync':971 'crypto.randombytes':990 'current':900,907,923,1215 'currentconfig':753 'd':427 'data':399,405,416,418,420 'databas':477,491,518,682,690,700,716,726 'dbuser':693,719 'debug':546,557,600,603,608,612 'deciph':1026 'decipher.final':1046 'decipher.setauthtag':1035 'decipher.update':1041 'decrypt':1021,1040,1045,1050 'def':180,209,265,535,569,862,868,876,885,891,1105,1133 'default':1179,1185,1188 'definit':1223 'deploy':2 'deployment-validation-config-valid':1 'describ':660,669,1277 'descript':1161,1169 'develop':539,544 'dict':175,187,218,274,530,574,578,849,872,873,880,881,895,899,1099,1110,1112,1138,1140 'differ':105 'doc':1107,1114,1132 'docs.append':1118 'docs.extend':1127 'document':1093,1248 'domain':106 'durat':423 'els':1074,1086 'enabl':510,514 'encrypt':567,951,979,999,1005,1009,1012 'encryptedvalu':950,982,1022,1023,1073 'encryptedvalue.algorithm':1028 'encryptedvalue.authtag':1034,1037 'encryptedvalue.iv':1031 'encryptedvalue.value':1042 'encryptionkey':965 'ensur':17,42,57,123,1258 'env':226 'environ':68,126,258,523,575,580,589,590,594,1225,1228,1289 'environment-specif':522,1227,1288 'environmentvalid':534 'error':64,132,363,443,458,460,466,786,789,795,837,840,841,1257 'error-fre':63 'error.instancepath':462 'error.keyword':468 'error.message':464 'event':738 'eventemitt':736,748 'exampl':472,1111,1126,1139,1194,1196,1203 'exist':154 'expect':662,701,727 'expert':11,36,1294 'export':371,474,744,961 'extend':747 'f':587,645,1155,1166,1172,1184 'fail':798 'fals':384,410,457,550,558,604,730 'file':119,192,212,229,236,247,252,256,260,264,294,302,321,323 'find':210 'focus':133,1253 'format':352,484,489,1211 'found':447 'free':65 'gcm':987 'generat':1094,1106,1134,1251 'glob':242 'guidanc':81 'hex':1004,1007,1016,1020,1032,1038,1043 'high':329,652 'host':481,516,686,712 'hostnam':485 'https':395,407,549,560,623,643,646 'identifi':158 'ignoreiniti':812 'implement':27,52,120,335 'import':162,164,166,170,174,343,347,353,529,659,665,735,739,848,852,855,944,1098,1101 'ini':225 'init':536,886 'initi':756 'input':1303 'instruct':149 'int':1142 'integ':488 'interfac':359,949 'invalid':708 'issu':197,202,268,275,331,1244 'issues.append':320 'iv':957,989,997,1014 'iv.tostring':1015 'jest/globals':664 'join':1131 'json':167,221,340,357,1221 'json-schema':356 'json.parse':1049 'json.stringify':824,826,1001 'jsonschema7':354 'key':280,1060,1069,1082,1088 'keyword':369,467 'length':553,564 'let':672,998,1039 'level':1141,1156 'limit':1265 'list':176,217,273,531,577,889,1100,1144 'loadandvalid':768 'localhost':636,687,713 'maintain':1261 'manag':10,35 'masterkey':968,972 'match':1274 'messag':367,463,611,644 'migrat':844,892,917,1237,1240 'migration.up':933 'migration.version':922,928,937 'min':551,562 'minlength':494,499,504 'miss':1311 'mode':613 'myapp':691,717 'n':1117,1121,1130,1159,1170,1177,1189,1197,1207 'name':1149,1158,1192,1202,1205 'need':80,103,115,160 'new':379,403,442,677,794 'newconfig':819,825,833,835 'null':1080 'number':414,417 'object':479,508,1078 'object.entries':1063 'oldconfig':831 'option':1120 'os':163 'output':1210,1283 'outsid':109 'pass':866,874,882 'passwd':285 'password':284,501,520,552,563,694,720 'path':171,185,195,200,205,215,237,239,241,248,250,253,257,261,271,298,300,303,324,365,461,629,650,787 'pathlib':169 'pattern':220,231,234,243,277,307,310,313,319 'permiss':1304 'persist':810 'port':412,486,490,517,688,709,714 'potenti':326 'practic':83,1264 'prevent':128,1255 'privat':374,390,749,752,766,801,964 'process':146,1057,1068,1081,1087,1091 'processconfig':1052 'product':541,555,610,617 'project':182,184,194,199,204,214,240,270,297 'promis':759,771,1055 'prop':1148,1150,1157,1163,1167,1181,1186,1191,1201,1204 'prop_schema.get':1174 'properti':480,509,860,1125,1137 'properties.items':1153 'protocol':406 'python':161,526,845,1095 'r':278,282,286,289 'rais':585 're.ignorecase':315 're.search':312 'read':304 'recommend':206,1246 'refer':1116,1252 'reject':707 'relat':131 'report':1243 'requir':147,513,515,548,559,566,622,642,647,1302 'result':697,723,914,932,934,935,939 'result.valid':702,728 'return':207,262,330,402,409,455,469,653,799,912,938,1008,1048,1090,1129,1208 'review':1295 'robust':136 'rule':138,543,584,591,593,598,606,621,641,1226 'runtim':732 'runtimeconfigvalid':746 'safeti':140,1305 'salt':975 'schema':26,51,122,333,337,341,358,444,473,476,1109,1151,1164,1168,1182,1187,1220,1222 'schema.get':1124 'schemanam':432,438,445 'scope':111,1276 'script':1238 'secret':276,283,309,327 'section':1122,1128,1135,1146,1209 'sections.append':1154,1165,1171,1183,1195,1199,1206 'secur':60,141,196,267,941,1242,1262 'secureconfigmanag':963 'securepass123':695,721 'self':183,213,269,537,572,864,870,878,887,893,1108,1136 'self._check_consistency':203 'self._check_security_issues':198 'self._detect_config_type':255 'self._detect_environment':259 'self._extract_urls':625 'self._find_config_files':193,296 'self._generate_sections':1123 'self._looks_like_real_secret':317 'self._should_ignore':246 'self.environment':542,583,592 'self.environments':538 'self.migrations':888,919 'semver':856 'semver.compare':906,921,927 'sever':328,618,651 'sha256':978 'skill':71,93,1268 'skill-deployment-validation-config-validate' 'smhd':428 'source-sickn33' 'special':12,37 'specif':524,1229,1290 'ssl':506 'stage':540 'stop':1296 'str':186,188,216,251,272,576,865,898,1113,1145 'strategi':55 'strict':383 'string':366,368,370,397,400,425,433,483,493,498,503,758,770,804,954,956,958,960,969 'structur':156 'substitut':1286 'success':1308 'suit':1233 'target':896,909,929 'task':77,96,1272 'test':15,40,54,657,1232,1235,1292 'text':305 'this.addcustomformats':389 'this.ajv':378,388 'this.ajv.addformat':392,411,422 'this.ajv.getschema':437 'this.currentconfig':760,827,832,834 'this.decrypt':1070 'this.detectenvironment':781 'this.emit':784,828,838 'this.encryptionkey':970,996,1029 'this.isdevelopment':792 'this.isencryptedvalue':1066 'this.loadandvalidate':762,821 'this.loadconfig':775 'this.processconfig':1084 'this.validator.validate':779 'this.watchconfig':764 'throw':441,793 'tobe':703,729 'token':287 'toml':224 'tool':108 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'tostr':1019 'treat':1281 'tri':401,817 'true':382,386,471,547,561,568,704,811,813,952,1010 'type':139,173,254,325,396,413,424,478,482,487,492,497,502,507,511,528,847,1097,1173,1175 'typeof':1076 'typescript':342,658,734,943 'unknown':588 'unrel':98 'url':394,404,624,628,630,632,639,649 'url-http':393 'url.startswith':634 'use':69,91,1266 'user':114,496,519,692,718 'utf8':1003,1044,1047 'valid':3,5,14,25,30,39,50,76,88,101,117,137,145,159,334,338,361,398,415,426,429,436,440,449,450,453,456,465,470,525,570,671,673,676,681,733,750,785,797,1219,1230,1291 'validate.errors':454 'validate.errors.map':459 'validationresult':360,434,778 'validationresult.errors':790 'validationresult.valid':783 'validator.validate':698,724 'valu':953,980,1002,1011,1061,1067,1071,1077,1079,1085,1089 'valueerror':586 'version':863,897,901,903,908,910,924,930,936,1239 'violat':595,654 'violations.append':605,640 'void':805 'watchconfig':802 'watcher':807 'watcher.on':814 'work':73 'workflow':79 'yaml':165,222,1102,1198 'yaml.dump':1200 'yml':223","prices":[{"id":"b871b62f-198a-4fb5-a9ec-8c0c8e000c12","listingId":"1fb10f81-238c-4e27-af61-52bef4029620","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:35:59.076Z"}],"sources":[{"listingId":"1fb10f81-238c-4e27-af61-52bef4029620","source":"github","sourceId":"sickn33/antigravity-awesome-skills/deployment-validation-config-validate","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/deployment-validation-config-validate","isPrimary":false,"firstSeenAt":"2026-04-18T21:35:59.076Z","lastSeenAt":"2026-04-24T06:51:03.334Z"}],"details":{"listingId":"1fb10f81-238c-4e27-af61-52bef4029620","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"deployment-validation-config-validate","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34831,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-24T06:41:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"193e8c36e3e8991a5abe21e0c3907764fd07d4dd","skill_md_path":"skills/deployment-validation-config-validate/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/deployment-validation-config-validate"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"deployment-validation-config-validate","description":"You are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensive validation schemas, implement configurat"},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/deployment-validation-config-validate"},"updatedAt":"2026-04-24T06:51:03.334Z"}}