env-manager
Environment variable management, validation, and documentation.
What this skill does
# Environment Manager Skill Environment variable management, validation, and documentation. ## Instructions You are an environment configuration expert. When invoked: 1. **Analyze Environment Variables**: - Identify all environment variables used in code - Check for undefined or missing variables - Validate variable formats (URLs, numbers, booleans) - Detect hardcoded values that should be env vars 2. **Generate Documentation**: - Create .env.example template - Document required vs optional variables - Provide descriptions and examples - List default values 3. **Validate Configuration**: - Check required variables are set - Validate formats and types - Ensure no secrets in source control - Verify cross-environment consistency 4. **Provide Best Practices**: - Naming conventions - Security recommendations - Environment-specific configs - Secret management strategies ## Environment Variable Conventions ### Naming Standards ```bash # Use UPPER_SNAKE_CASE DATABASE_URL=postgresql://localhost:5432/mydb API_KEY=abc123xyz # Prefix by service/category DB_HOST=localhost DB_PORT=5432 DB_NAME=mydb DB_USER=admin REDIS_HOST=localhost REDIS_PORT=6379 AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=AKIA... AWS_SECRET_ACCESS_KEY=... # Boolean values ENABLE_LOGGING=true DEBUG_MODE=false ``` ### Environment Prefixes ```bash # Development NODE_ENV=development DEBUG=true LOG_LEVEL=debug # Staging NODE_ENV=staging DEBUG=false LOG_LEVEL=info # Production NODE_ENV=production DEBUG=false LOG_LEVEL=error ``` ## .env.example Template ```bash # ====================== # Application Settings # ====================== # Environment (development, staging, production) NODE_ENV=development # Application port PORT=3000 # Application URL APP_URL=http://localhost:3000 # ====================== # Database Configuration # ====================== # PostgreSQL connection string # Format: postgresql://username:password@host:port/database DATABASE_URL=postgresql://user:password@localhost:5432/myapp # Database connection pool DB_POOL_MIN=2 DB_POOL_MAX=10 # ====================== # Redis Configuration # ====================== # Redis connection URL REDIS_URL=redis://localhost:6379 # Redis password (optional) # REDIS_PASSWORD= # ====================== # Authentication # ====================== # JWT secret key (REQUIRED - Generate with: openssl rand -base64 32) JWT_SECRET=your-secret-key-here # JWT expiration (default: 24h) JWT_EXPIRES_IN=24h # Session secret SESSION_SECRET=your-session-secret # ====================== # External Services # ====================== # AWS Configuration AWS_REGION=us-east-1 AWS_ACCESS_KEY_ID=your-access-key AWS_SECRET_ACCESS_KEY=your-secret-key AWS_S3_BUCKET=my-app-uploads # Email Service (SendGrid) SENDGRID_API_KEY=SG.xxxxx [email protected] # Stripe STRIPE_PUBLIC_KEY=pk_test_xxxxx STRIPE_SECRET_KEY=sk_test_xxxxx # ====================== # Feature Flags # ====================== # Enable new dashboard ENABLE_NEW_DASHBOARD=false # Enable email notifications ENABLE_EMAIL_NOTIFICATIONS=true # ====================== # Logging & Monitoring # ====================== # Log level (error, warn, info, debug) LOG_LEVEL=info # Sentry DSN for error tracking # SENTRY_DSN=https://[email protected]/xxxxx # ====================== # Security # ====================== # CORS allowed origins (comma-separated) CORS_ORIGINS=http://localhost:3000,http://localhost:3001 # Rate limiting RATE_LIMIT_MAX_REQUESTS=100 RATE_LIMIT_WINDOW_MS=900000 # ====================== # Development Only # ====================== # Enable debug mode DEBUG=false # Disable SSL verification (NEVER in production!) # NODE_TLS_REJECT_UNAUTHORIZED=0 ``` ## Environment Validation ### Node.js Example ```javascript // env.js - Environment validation const envalid = require('envalid'); const env = envalid.cleanEnv(process.env, { // Application NODE_ENV: envalid.str({ choices: ['development', 'staging', 'production'] }), PORT: envalid.port({ default: 3000 }), APP_URL: envalid.url(), // Database DATABASE_URL: envalid.url({ desc: 'PostgreSQL connection URL' }), DB_POOL_MIN: envalid.num({ default: 2 }), DB_POOL_MAX: envalid.num({ default: 10 }), // Redis REDIS_URL: envalid.url(), REDIS_PASSWORD: envalid.str({ default: '' }), // Secrets JWT_SECRET: envalid.str({ desc: 'JWT signing secret' }), JWT_EXPIRES_IN: envalid.str({ default: '24h' }), // AWS AWS_REGION: envalid.str({ default: 'us-east-1' }), AWS_ACCESS_KEY_ID: envalid.str(), AWS_SECRET_ACCESS_KEY: envalid.str(), // Feature Flags ENABLE_NEW_DASHBOARD: envalid.bool({ default: false }), ENABLE_EMAIL_NOTIFICATIONS: envalid.bool({ default: true }), // Logging LOG_LEVEL: envalid.str({ choices: ['error', 'warn', 'info', 'debug'], default: 'info' }), // Security CORS_ORIGINS: envalid.str({ desc: 'Comma-separated allowed origins' }), RATE_LIMIT_MAX_REQUESTS: envalid.num({ default: 100 }), }); module.exports = env; ``` ### Python Example ```python # config.py - Environment validation import os from typing import Optional from pydantic import BaseSettings, validator, AnyHttpUrl class Settings(BaseSettings): # Application ENV: str = "development" PORT: int = 8000 APP_URL: AnyHttpUrl # Database DATABASE_URL: str DB_POOL_MIN: int = 2 DB_POOL_MAX: int = 10 # Redis REDIS_URL: str REDIS_PASSWORD: Optional[str] = None # Secrets JWT_SECRET: str JWT_EXPIRES_IN: str = "24h" # AWS AWS_REGION: str = "us-east-1" AWS_ACCESS_KEY_ID: str AWS_SECRET_ACCESS_KEY: str # Feature Flags ENABLE_NEW_DASHBOARD: bool = False ENABLE_EMAIL_NOTIFICATIONS: bool = True # Logging LOG_LEVEL: str = "info" @validator("ENV") def validate_env(cls, v): allowed = ["development", "staging", "production"] if v not in allowed: raise ValueError(f"ENV must be one of {allowed}") return v @validator("LOG_LEVEL") def validate_log_level(cls, v): allowed = ["error", "warn", "info", "debug"] if v not in allowed: raise ValueError(f"LOG_LEVEL must be one of {allowed}") return v class Config: env_file = ".env" case_sensitive = True settings = Settings() ``` ## Usage Examples ``` @env-manager @env-manager --validate @env-manager --generate-example @env-manager --check-secrets @env-manager --document ``` ## Security Best Practices ### Never Commit Secrets ```bash # .gitignore .env .env.local .env.*.local *.pem *.key secrets/ ``` ### Secret Detection ```bash # Check for accidentally committed secrets git secrets --scan # Use tools like: # - gitleaks # - truffleHog # - git-secrets ``` ### Secret Management Solutions ```bash # Development # - .env files (gitignored) # - direnv # Production # - AWS Secrets Manager # - HashiCorp Vault # - Azure Key Vault # - Google Secret Manager # - Kubernetes Secrets # - Docker Secrets ``` ### Encryption at Rest ```bash # Encrypt sensitive .env files # Using SOPS (Secrets OPerationS) sops -e .env > .env.encrypted # Using git-crypt git-crypt init echo '.env' >> .gitattributes git-crypt add-gpg-user [email protected] ``` ## Environment-Specific Configurations ### Multiple .env Files ```bash .env # Default (committed .env.example) .env.local # Local overrides (gitignored) .env.development # Development .env.staging # Staging .env.production # Production (never committed!) ``` ### Loading Priority (Node.js) ```javascript // Using dotenv with cascading require('dotenv').config({ path: '.env.local' }); require('dotenv').config({ path: `.env.${process.env.NODE_ENV}` }); require('dotenv').config({ path: '.env' }); ``` ## Common Issues & Solutions ### Missing Environment Variables ```javascript // ❌ Bad - Silent failure const apiKey = process.env.API_KEY; // ✓ Good - Explicit validation c
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.