3 presets de permisos para Claude Code (estricto, equilibrado, autónomo) y el hueco que ninguno cierra 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. 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