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

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" ] } } Enter fullscreen mode Exit fullscreen mode 2. Equilibrado: el día a día 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/**)" ] } } Enter fullscreen mode Exit fullscreen mode 3. Autónomo: ramas desechables y pruebas rápidas 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/**)" ] } } Enter fullscreen mode Exit fullscreen mode El hueco 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 (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