# 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)
