[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CSV45Y378TAG0WT279D58X":3,"skill-same:01M6CSV45Y378TAG0WT279D58X":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":49,"ownerHtmlUrl":50,"ownerBlogUrl":6,"ownerDescription":51,"updatedAt":52,"install":53,"resources":66},"01M6CSV45Y378TAG0WT279D58X","deployment-validation-config-validate",null,"You are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensive validation schemas, implement configurat","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fdeployment-validation-config-validate\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37],"validate","config","deployment","validation","deployment validation config validate","testing","implement","create","management","expert","community","configuration","configuration management","application","2026-11-10 10:12:30",false,"---\nname: deployment-validation-config-validate\ndescription: \"You are a configuration management expert specializing in validating, testing, and ensuring the correctness of application configurations. Create comprehensive validation schemas, implement configurat\"\nrisk: critical\nsource: community\ndate_added: \"2026-02-27\"\n---\n\n# 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            '**\u002F*.json', '**\u002F*.yaml', '**\u002F*.yml', '**\u002F*.toml',\n            '**\u002F*.ini', '**\u002F*.env*', '**\u002Fconfig.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\u003C{\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 \u003C= 65535\n    });\n\n    this.ajv.addFormat('duration', {\n      type: 'string',\n      validate: \u002F^\\d+[smhd]$\u002F\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 || '\u002F',\n          message: error.message || 'Validation error',\n          keyword: error.keyword\n        }))\n      };\n    }\n    return { valid: true };\n  }\n}\n\n\u002F\u002F 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:\u002F\u002F') 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\u002Fglobals';\nimport { ConfigValidator } from '.\u002Fconfig-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\u003Cvoid> {\n    this.currentConfig = await this.loadAndValidate(configPath);\n    this.watchConfig(configPath);\n  }\n\n  private async loadAndValidate(configPath: string): Promise\u003Cany> {\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) \u003C= 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\u003Cany> {\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","# 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            '**\u002F*.json', '**\u002F*.yaml', '**\u002F*.yml', '**\u002F*.toml',\n            '**\u002F*.ini', '**\u002F*.env*', '**\u002Fconfig.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\u003C{\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 \u003C= 65535\n    });\n\n    this.ajv.addFormat('duration', {\n      type: 'string',\n      validate: \u002F^\\d+[smhd]$\u002F\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 || '\u002F',\n          message: error.message || 'Validation error',\n          keyword: error.keyword\n        }))\n      };\n    }\n    return { valid: true };\n  }\n}\n\n\u002F\u002F 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:\u002F\u002F') 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\u002Fglobals';\nimport { ConfigValidator } from '.\u002Fconfig-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\u003Cvoid> {\n    this.currentConfig = await this.loadAndValidate(configPath);\n    this.watchConfig(configPath);\n  }\n\n  private async loadAndValidate(configPath: string): Promise\u003Cany> {\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) \u003C= 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\u003Cany> {\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",{"name":5,"risk":43,"source":34,"date_added":44,"description":7},"critical","2026-02-27","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fdeployment-validation-config-validate",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":54,"prompt":64,"zipAvailable":65},[55,58,61],{"tool":56,"command":57},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill deployment-validation-config-validate",{"tool":59,"command":60},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill deployment-validation-config-validate",{"tool":62,"command":63},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill deployment-validation-config-validate","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fdeployment-validation-config-validate\u002FSKILL.md",true,[],[68,77,92,117,136,161],{"skillNo":69,"name":70,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":74,"publishedAt":38},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[73],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[75,76],"Test Skill","test",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":38},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[84,85,86,87,88,89,90,34,31,91],"zustand store ts","zustand","store","with","types","middleware","patterns","typescript",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":101,"publishedAt":38},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[102,103,104,105,106,107,108,109,110,111,43,112,113,114,34,115,32,116],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","creation","webinars","composio","recordings","tracking",{"skillNo":118,"name":119,"nameZh":6,"description":120,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":124,"publishedAt":38},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[123],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[125,102,126,127,128,129,130,34,107,131,114,132,43,111,106,133,31,134,108,135],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":145,"publishedAt":38},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[142],{"categoryNo":143,"categoryName":144,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[33,146,147,27,148,91,149,150,151,152,153,154,87,155,156,157,158,34,159,160],"zod","zod validation expert","react","safe","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":168,"publishedAt":38},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[167],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[169,170,171,172,173,174,175,176,34,177,178,179,180,181,182,183,184,185,186,108],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","data","flow","verification","code","rust"]