From cc-arsenal
Scan codebase for environment variables, generate .env.example, validate .env completeness, and detect leaked secrets.
npx claudepluginhub mgiovani/cc-arsenal --plugin cc-arsenal-teamsThis skill is limited to using the following tools:
> **Cross-Platform AI Agent Skill**
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Cross-Platform AI Agent Skill This skill works with any AI agent platform that supports the skills.sh standard.
Scan the codebase for environment variable usage, generate or update .env.example, validate .env completeness, and detect leaked secrets.
CRITICAL: Only report variables that are actually found in the code:
.env.example must only contain placeholder values (e.g., your_api_key_here).env is ignoredGrep for environment variable patterns per language/framework:
Node.js / TypeScript:
grep -rE "process\.env\.([A-Z_][A-Z0-9_]*)" --include="*.ts" --include="*.js" --include="*.mjs" -h . \
| grep -oE "process\.env\.[A-Z_][A-Z0-9_]*" | sort -u
Python:
grep -rE 'os\.environ\[["'"'"']([A-Z_][A-Z0-9_]*)["'"'"']\]|os\.getenv\(["'"'"']([A-Z_][A-Z0-9_]*)["'"'"']' \
--include="*.py" -h . | grep -oE '[A-Z_][A-Z0-9_]+' | sort -u
Ruby:
grep -rE 'ENV\[["'"'"']([A-Z_][A-Z0-9_]*)["'"'"']\]' --include="*.rb" -h . \
| grep -oE 'ENV\["[^"]*"\]' | grep -oE '"[^"]+"' | tr -d '"' | sort -u
Rust:
grep -rE 'env::var\("([A-Z_][A-Z0-9_]*)"\)' --include="*.rs" -h . \
| grep -oE '"[A-Z_][A-Z0-9_]*"' | tr -d '"' | sort -u
Java / Kotlin:
grep -rE 'System\.getenv\("([A-Z_][A-Z0-9_]*)"\)' --include="*.java" --include="*.kt" -h . \
| grep -oE '"[A-Z_][A-Z0-9_]*"' | tr -d '"' | sort -u
Framework-specific prefixes (scan for these in config files):
NEXT_PUBLIC_* — Next.js client-exposed variablesVITE_* — Vite client-exposed variablesREACT_APP_* — Create React App client-exposed variablesNUXT_PUBLIC_* — Nuxt.js public variablesDocker Compose:
grep -rE "^\s+- [A-Z_][A-Z0-9_]*=" docker-compose.yml docker-compose.*.yml 2>/dev/null \
| grep -oE "[A-Z_][A-Z0-9_]*=" | tr -d "=" | sort -u
Also scan:
.env.example (existing entries to preserve)config/ directory for config files referencing env varsnext.config.js, vite.config.ts, etc.)Group discovered variables by prefix/service:
Database: DATABASE_URL, DB_HOST, DB_PORT, DB_NAME, DB_USER, DB_PASSWORD
Cache: REDIS_URL, REDIS_HOST, REDIS_PORT
Auth: JWT_SECRET, AUTH_SECRET, NEXTAUTH_SECRET, SESSION_SECRET
OAuth: GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, GITHUB_CLIENT_ID
Stripe: STRIPE_SECRET_KEY, STRIPE_PUBLISHABLE_KEY, STRIPE_WEBHOOK_SECRET
AWS: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET
Email: SMTP_HOST, SMTP_PORT, SENDGRID_API_KEY, RESEND_API_KEY
App config: NODE_ENV, PORT, BASE_URL, APP_URL
Client vars: NEXT_PUBLIC_*, VITE_*, REACT_APP_*
Classify each variable:
NEXT_PUBLIC_*, VITE_* — flag if contains secrets)Read existing .env.example (if it exists):
# Variables in code but NOT in .env.example (missing)
# Variables in .env.example but NOT in code (undocumented/stale)
# Variables in both (up to date)
Report:
.env.example).env.example but no longer used)For scan or sync operations:
Generate .env.example with:
Example output format:
# =============================================================================
# Database
# =============================================================================
DATABASE_URL=postgresql://user:password@localhost:5432/app_development
DB_HOST=localhost
DB_PORT=5432
# =============================================================================
# Authentication
# =============================================================================
# Generate with: openssl rand -hex 32
JWT_SECRET=your_jwt_secret_here
NEXTAUTH_SECRET=your_nextauth_secret_here
# =============================================================================
# Stripe (https://dashboard.stripe.com/apikeys)
# =============================================================================
STRIPE_SECRET_KEY=sk_test_your_key_here
STRIPE_PUBLISHABLE_KEY=pk_test_your_key_here
STRIPE_WEBHOOK_SECRET=whsec_your_webhook_secret_here
# =============================================================================
# App Config
# =============================================================================
NODE_ENV=development
PORT=3000
BASE_URL=http://localhost:3000
Rules:
.env — only placeholders.env.examplevalidate subcommand or .env exists)Read .env and check:
VAR= with no value is suspicious for required vars.env but not found in codebase scan.gitignore check: Verify .env (and .env.local) are in .gitignoregrep -E "^\.env" .gitignore 2>/dev/null
Warn clearly if .env is NOT in .gitignore.
--check-secrets)Scan .env for high-entropy strings and known secret patterns:
# Check for common secret patterns
grep -iE "(password|secret|api_key|private_key|token|auth_key)\s*=\s*['\"]?[a-zA-Z0-9+/]{20,}" .env 2>/dev/null
Check git history for leaked secrets:
git log --all --full-history --diff-filter=A -p -- .env 2>/dev/null | grep -iE "(password|secret|key)\s*=" | head -20
Flag client-exposed secrets:
NEXT_PUBLIC_*, VITE_*, REACT_APP_* variablesRecommend pre-commit tools:
detect-secrets (Python): pip install detect-secrets && detect-secrets scan > .secrets.baselinegitleaks: gitleaks detect --source=.scan (default): Scan codebase, generate/update .env.examplevalidate: Validate .env against discovered variablessync: Sync .env.example to match current codebase (add missing, mark stale)--check-secrets: Enable secret detection in .env and git history.env.example — only placeholder valuesNEXT_PUBLIC_*, VITE_*) are bundled into the frontend — never put secrets there.env must be gitignored — always verify and warn if not.env is gitignored now, it may have been committed in the past.env can be security risks — document and remove unused ones# Scan codebase and generate .env.example
/env-setup
# Scan with explicit subcommand
/env-setup scan
# Validate existing .env completeness
/env-setup validate
# Sync .env.example with current codebase
/env-setup sync
# Full scan + secret detection
/env-setup scan --check-secrets