# Template — Configuración de permisos para Claude Code > Setup recomendado para `.claude/settings.json` y `.claude/settings.local.json` en cualquier proyecto. > > Implementa el **Patrón D.4** (Permisos del agente versionados). --- ## Estructura final esperada en tu repo ``` repo/ ├── .claude/ │ ├── settings.json ← versionado: solo deny patterns │ └── settings.local.json ← gitignored: tus allow personales └── .gitignore ← incluye .claude/settings.local.json ``` --- ## Archivo 1: `.claude/settings.json` (versionado, compartido con el equipo) Contiene **únicamente patrones `deny`**. Son las protecciones que aplicamos a todos. ```json { "permissions": { "deny": [ "Bash(rm -rf /)", "Bash(rm -rf /*)", "Bash(rm -rf ~)", "Bash(rm -rf ~/*)", "Bash(rm -rf .git)", "Bash(rm -rf .git/*)", "Bash(git push --force *)", "Bash(git push -f *)", "Bash(git reset --hard *)", "Bash(git clean -fdx *)", "Bash(npm publish *)", "Bash(npm publish)" ] } } ``` **Si tu proyecto usa otras herramientas críticas, agregá los denies correspondientes.** Ejemplos: - Si usás Postgres: `"Bash(dropdb *)"`, `"Bash(psql * -c \"DROP DATABASE *\")"` - Si usás Docker: `"Bash(docker system prune *)"` - Si usás Terraform: `"Bash(terraform destroy *)"` - Si usás kubectl: `"Bash(kubectl delete namespace *)"` --- ## Archivo 2: `.claude/settings.local.json` (gitignored, personal) Contiene **únicamente patrones `allow`**. Son los comandos que pre-aprobás para tu propio uso. **Punto de partida recomendado (ajustá a tu workflow):** ```json { "permissions": { "allow": [ "Bash(npm install)", "Bash(npm install *)", "Bash(npm run *)", "Bash(npm test)", "Bash(npm test *)", "Bash(npm run build)", "Bash(npm run lint)", "Bash(npm run dev)", "Bash(npm run typecheck)", "Bash(npx *)", "Bash(git add *)", "Bash(git commit *)", "Bash(git status)", "Bash(git diff *)", "Bash(git log *)", "Bash(git tag *)", "Bash(git branch *)", "Bash(git checkout *)", "Bash(git stash *)", "Bash(ls *)", "Bash(cat *)", "Bash(mkdir *)", "Bash(cp *)", "Bash(mv *)", "Bash(grep *)", "Bash(find *)", "Bash(tar *)" ] } } ``` **Lo que NO incluí a propósito:** - `Bash(rm *)` — `rm` está afuera porque incluso un `rm archivo.txt` puede ser destructivo si el archivo no estaba en git. Si querés permitirlo, ponelo explícito. - `Bash(git push *)` — el push interactivo te da el momento para revisar qué estás subiendo - `Bash(curl *)` y `Bash(wget *)` — afuera porque pueden bajar y ejecutar código de internet - `Bash(chmod *)` y `Bash(chown *)` — cambios de permisos quedan fuera para no automatizar accidentalmente Si alguno de estos te resulta valioso para tu flujo, agregalo conscientemente. --- ## Archivo 3: `.gitignore` (asegurate que esté) ```gitignore # Claude Code local settings .claude/settings.local.json ``` --- ## Setup inicial (paso a paso) Desde la raíz del repo: ```bash # 1. Crear directorio mkdir -p .claude # 2. Crear settings.json (versionado) cat > .claude/settings.json << 'EOF' { "permissions": { "deny": [ "Bash(rm -rf /)", "Bash(rm -rf /*)", "Bash(rm -rf ~)", "Bash(rm -rf ~/*)", "Bash(rm -rf .git)", "Bash(rm -rf .git/*)", "Bash(git push --force *)", "Bash(git push -f *)", "Bash(git reset --hard *)", "Bash(git clean -fdx *)", "Bash(npm publish *)", "Bash(npm publish)" ] } } EOF # 3. Crear settings.local.json (personal, gitignored) # [pegar contenido del Archivo 2 arriba] # 4. Asegurar gitignore grep "settings.local.json" .gitignore || echo ".claude/settings.local.json" >> .gitignore # 5. Comitear solo el compartido git add .claude/settings.json .gitignore git commit -m "chore(claude-code): configurar permisos compartidos - settings.json: deny patterns críticos - settings.local.json en gitignore (cada dev configura sus allows) Refs: methodology/PATTERNS.md D.4" ``` --- ## Mantenimiento del archivo personal **Cuando ver que aprobás repetidamente un comando que no está en la lista:** 1. Agregalo a `.claude/settings.local.json` 2. Reiniciá la sesión de Claude Code **Cuando un comando de la lista te causó un problema:** 1. Sacalo de la lista 2. Aceptá la fricción ocasional como costo de la seguridad **Revisión periódica recomendada:** cada 4-6 semanas, abrir `settings.local.json` y verificar: - ¿Sigo usando todos los comandos de la lista? - ¿Hay alguno que ya no uso y conviene sacar para reducir superficie? --- ## Cuando empieces a transmitirle esto al equipo Para cada miembro nuevo del equipo: 1. Que clone el repo (recibe `.claude/settings.json` automáticamente) 2. Que cree su propio `.claude/settings.local.json` desde este template 3. Que **NO copie el de otro dev** — cada uno aprueba lo que usa, no lo que el otro usa 4. Verificar que entendió la diferencia entre `allow` (su decisión) y `deny` (decisión del equipo) **Errores comunes a vigilar en miembros nuevos:** - Copiar el `settings.local.json` de otro y agregarse cosas "por las dudas" - Comitear accidentalmente el `settings.local.json` (verificar gitignore antes de su primer commit) - Usar `--dangerously-skip-permissions` porque "es más rápido" (ver AP.7)