# 3 presets de permisos para Claude Code (estricto, equilibrado, autónomo) y el hueco que ninguno cierra

> Source: <https://dev.to/luijhy_michaelguerraflo/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco-que-ninguno-55kk>
> Published: 2026-11-04 20:48:37+00:00

Cada "¿Permitir este comando?" de Claude Code es una pequeña interrupción. Si le das "permitir siempre" muchas veces, terminas con un `settings.json` que nadie leyó. Estos son tres presets que uso en `.claude/settings.json`, del más cuidadoso al más suelto, y lo único que ninguno puede hacer.

Las reglas se aplican en este orden: **deny** gana a **ask**, y **ask** gana a **allow**. Lo que no está en la lista usa el `defaultMode`.

Git de solo lectura va libre. Commits, push e instalaciones piden confirmación, y las herramientas de red están bloqueadas.

```
{
  "permissions": {
    "defaultMode": "default",
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(git log:*)"
    ],
    "ask": [
      "Bash(git commit:*)",
      "Bash(git push:*)",
      "Bash(npm install:*)",
      "Bash(pnpm add:*)",
      "Bash(yarn add:*)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)",
      "Bash(curl:*)",
      "Bash(wget:*)",
      "WebFetch"
    ]
  }
}
```

Las ediciones se aceptan solas (`acceptEdits`). Lint, tests y chequeo de tipos corren sin preguntar, y todo lo que sale de tu máquina o cambia dependencias sigue preguntando.

```
{
  "permissions": {
    "defaultMode": "acceptEdits",
    "allow": [
      "Bash(git status)",
      "Bash(git diff:*)",
      "Bash(git log:*)",
      "Bash(git add:*)",
      "Bash(npm run lint:*)",
      "Bash(npm run test:*)",
      "Bash(npm test:*)",
      "Bash(npx tsc --noEmit:*)"
    ],
    "ask": [
      "Bash(git push:*)",
      "Bash(npm install:*)",
      "Bash(pnpm add:*)",
      "Bash(yarn add:*)"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}
```

Todo git y npm permitido. Úsalo solo donde un comando malo te cueste una rama, no una base de datos de producción.

```
{
  "permissions": {
    "defaultMode": "acceptEdits",
    "allow": [
      "Bash(git:*)",
      "Bash(npm:*)",
      "Bash(npx:*)",
      "Bash(pnpm:*)",
      "Bash(node:*)",
      "WebFetch",
      "WebSearch"
    ],
    "deny": [
      "Read(./.env)",
      "Read(./.env.*)",
      "Read(./secrets/**)"
    ]
  }
}
```

Mira otra vez el preset autónomo: `Bash(git:*)` también permite `git push --force` y `git reset --hard`. Las reglas de permisos comparan el comando por su prefijo. No distinguen un `git push` seguro de uno destructivo.

Hay un segundo hueco. `Read(./.env)` bloquea la herramienta Read de Claude, pero no es una regla sobre la terminal. Un `cat .env` por Bash es otra herramienta y necesita su propio control.

Para eso están los **hooks**. Un hook `PreToolUse` es un script que ve el comando completo antes de que corra y puede bloquearlo con `exit 2`: puede rechazar `git push --force` y dejar pasar un push normal, o negarse a cualquier comando que toque `.env`. Dejé dos gratis (uno bloquea comandos destructivos, probado contra trucos como `git push origin +main`; otro impide escribir secretos en archivos) aquí: [https://github.com/kailucho/claude-code-hooks-seguridad](https://github.com/kailucho/claude-code-hooks-seguridad) (MIT).

Presets para la comodidad, hooks para la seguridad. Necesitas los dos.

Los tres presets, los hooks, 6 skills (`/commit`, `/pr`, `/revisar`, `/tests`, `/plan`, `/depurar`) y plantillas de `CLAUDE.md` para React, Node y GraphQL vienen juntos en el **Kit de Claude Code en español** (US$9, no oficial): [https://luijhy.gumroad.com/l/kit-claude-code-es](https://luijhy.gumroad.com/l/kit-claude-code-es)
