{"slug": "3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco", "title": "3 presets de permisos para Claude Code (estricto, equilibrado, autónomo) y el hueco que ninguno cierra", "summary": "A developer published three Claude Code permission presets for `.claude/settings.json` — strict, balanced and autonomous — ordered from most cautious to most permissive, and documented the gap none of them closes: permission rules match Bash commands by prefix, so `Bash(git:*)` also allows `git push --force` and `git reset --hard`, and `Read(./.env)` does not stop a `cat .env` run through Bash. The developer released two free MIT-licensed `PreToolUse` hooks that inspect the full command before execution and can block it with `exit 2`, one rejecting destructive git commands and one preventing secrets from being written to files, arguing that \"presets for convenience, hooks for security\" are both needed.", "body_md": "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.\n\nLas 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`.\n\nGit de solo lectura va libre. Commits, push e instalaciones piden confirmación, y las herramientas de red están bloqueadas.\n\n```\n{\n  \"permissions\": {\n    \"defaultMode\": \"default\",\n    \"allow\": [\n      \"Bash(git status)\",\n      \"Bash(git diff:*)\",\n      \"Bash(git log:*)\"\n    ],\n    \"ask\": [\n      \"Bash(git commit:*)\",\n      \"Bash(git push:*)\",\n      \"Bash(npm install:*)\",\n      \"Bash(pnpm add:*)\",\n      \"Bash(yarn add:*)\"\n    ],\n    \"deny\": [\n      \"Read(./.env)\",\n      \"Read(./.env.*)\",\n      \"Read(./secrets/**)\",\n      \"Bash(curl:*)\",\n      \"Bash(wget:*)\",\n      \"WebFetch\"\n    ]\n  }\n}\n```\n\nLas 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.\n\n```\n{\n  \"permissions\": {\n    \"defaultMode\": \"acceptEdits\",\n    \"allow\": [\n      \"Bash(git status)\",\n      \"Bash(git diff:*)\",\n      \"Bash(git log:*)\",\n      \"Bash(git add:*)\",\n      \"Bash(npm run lint:*)\",\n      \"Bash(npm run test:*)\",\n      \"Bash(npm test:*)\",\n      \"Bash(npx tsc --noEmit:*)\"\n    ],\n    \"ask\": [\n      \"Bash(git push:*)\",\n      \"Bash(npm install:*)\",\n      \"Bash(pnpm add:*)\",\n      \"Bash(yarn add:*)\"\n    ],\n    \"deny\": [\n      \"Read(./.env)\",\n      \"Read(./.env.*)\",\n      \"Read(./secrets/**)\"\n    ]\n  }\n}\n```\n\nTodo git y npm permitido. Úsalo solo donde un comando malo te cueste una rama, no una base de datos de producción.\n\n```\n{\n  \"permissions\": {\n    \"defaultMode\": \"acceptEdits\",\n    \"allow\": [\n      \"Bash(git:*)\",\n      \"Bash(npm:*)\",\n      \"Bash(npx:*)\",\n      \"Bash(pnpm:*)\",\n      \"Bash(node:*)\",\n      \"WebFetch\",\n      \"WebSearch\"\n    ],\n    \"deny\": [\n      \"Read(./.env)\",\n      \"Read(./.env.*)\",\n      \"Read(./secrets/**)\"\n    ]\n  }\n}\n```\n\nMira 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.\n\nHay 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.\n\nPara 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).\n\nPresets para la comodidad, hooks para la seguridad. Necesitas los dos.\n\nLos 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)", "url": "https://wpnews.pro/news/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco", "canonical_source": "https://dev.to/luijhy_michaelguerraflo/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco-que-ninguno-55kk", "published_at": "2026-11-04 20:48:37+00:00", "updated_at": "2026-11-04 20:53:15.342418+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "ai-safety"], "entities": ["Claude Code", "Anthropic", "GitHub", "npm"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco", "markdown": "https://wpnews.pro/news/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco.md", "text": "https://wpnews.pro/news/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco.txt", "jsonld": "https://wpnews.pro/news/3-presets-de-permisos-para-claude-code-estricto-equilibrado-autonomo-y-el-hueco.jsonld"}}