Cap 7: Settings
Jerarquía de Settings
Claude Code carga settings de 5 niveles, de menor a mayor prioridad:
| Nivel | Archivo | Alcance | Compartible |
|---|---|---|---|
| 1 | Defaults internos | Base | — |
| 2 | ~/.claude/settings.json | Global usuario | No |
| 3 | .claude/settings.json | Proyecto | Sí (commiteable) |
| 4 | .claude/settings.local.json | Proyecto local | No (gitignored) |
| 5 | Managed policy | Organización | Admin |
Los niveles superiores sobrescriben los inferiores. Las listas (como allow) se fusionan.
Estructura del archivo
{
"model": "sonnet",
"permissions": {
"allow": [],
"deny": []
},
"hooks": {},
"mcpServers": {},
"env": {}
}
Permissions
Tres modos de decisión
| Modo | Comportamiento |
|---|---|
allow | Ejecutar sin preguntar |
ask | Preguntar al usuario (default) |
deny | Bloquear siempre |
Configuración de permisos
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"Bash(git *)",
"Bash(npm test)",
"Bash(bun *)",
"Edit(src/**)"
],
"deny": [
"Bash(rm -rf *)",
"Bash(curl * | bash)",
"Edit(.env*)"
]
}
}
Wildcard syntax
La sintaxis de patrones para permisos:
| Patrón | Significado |
|---|---|
Read | Permitir toda lectura |
Bash(git *) | Comandos git |
Bash(npm test) | Solo npm test exacto |
Edit(src/**) | Editar cualquier archivo en src/ recursivo |
Edit(*.ts) | Editar archivos TypeScript |
mcp__context7__* | Todas las herramientas de Context7 |
Bash(docker *) | Comandos docker |
Ejemplos comunes
{
"permissions": {
"allow": [
"Read",
"Glob",
"Grep",
"WebSearch",
"WebFetch",
"Bash(git status)",
"Bash(git diff *)",
"Bash(git log *)",
"Bash(bun test *)",
"Bash(bun run build)",
"Bash(ls *)",
"Edit(src/**)",
"Write(src/**)"
]
}
}
Permission modes
Modos predefinidos que agrupan conjuntos de permisos:
| Modo | Descripción |
|---|---|
default | Pregunta para acciones potencialmente peligrosas |
acceptEdits | Auto-acepta ediciones, pregunta para bash |
plan | Solo lectura, no puede modificar archivos |
bypassPermissions | Ejecuta todo sin preguntar (peligroso) |
# Iniciar en modo plan
claude --permission-mode plan
# Iniciar aceptando ediciones
claude --permission-mode acceptEdits
Settings importantes
Modelo y comportamiento
| Setting | Tipo | Descripción |
|---|---|---|
model | string | Modelo por defecto |
fastMode | boolean | Modo rápido activado |
outputStyle | string | "Explanatory" o "Learning" |
effortLevel | string | Nivel de esfuerzo del modelo |
Interfaz
| Setting | Tipo | Descripción |
|---|---|---|
theme | string | Tema visual |
spinnerVerbs | string[] | Verbos del spinner |
spinnerTips | string[] | Tips del spinner |
statusLine | object | Configuración de status line |
Sandbox
| Setting | Tipo | Descripción |
|---|---|---|
sandbox | object | Configuración de sandbox |
networkIsolation | boolean | Aislar red |
excludedCommands | string[] | Comandos excluidos del sandbox |
Variables de entorno
Las env vars se pueden configurar en settings:
{
"env": {
"ANTHROPIC_API_KEY": "sk-...",
"NODE_ENV": "development"
}
}
Env vars útiles del sistema
| Variable | Descripción |
|---|---|
CLAUDE_MODEL | Modelo a usar |
ANTHROPIC_API_KEY | API key de Anthropic |
CLAUDE_CODE_MAX_OUTPUT_TOKENS | Máx tokens de salida |
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC | Deshabilitar telemetría |
CLAUDE_CODE_USE_BEDROCK | Usar AWS Bedrock |
CLAUDE_CODE_USE_VERTEX | Usar Google Vertex |
Editar settings
# Abrir settings globales
claude settings
# Ver configuración actual
claude config list
Permission Modes — Decisión Matrix Completa
El examen pregunta cuándo usar cada modo, no solo qué hace cada uno.
Los 4 modos
default — pide confirmación para operaciones potencialmente peligrosas
- Auto-aprueba: Read, Glob, Grep, ediciones en archivos con contexto previo
- Pide aprobación: Bash commands, network requests, scripts desconocidos, operaciones destructivas
- Cuándo usarlo: exploración de codebases desconocidos, primer uso, trabajo con datos sensibles
acceptEdits — acepta automáticamente ediciones de archivos
- Auto-aprueba: Edit, Write, Read
- Aún pide: Bash commands, network requests
- Cuándo usarlo: refactoring donde quieres fluidez en ediciones pero control en ejecución de comandos
plan — solo puede leer, planifica pero no ejecuta
- Auto-aprueba: Read, Glob, Grep
- Bloquea: Edit, Write, Bash (cualquier modificación)
- Cuándo usarlo: análisis de codebase, code review sin riesgos, exploración antes de decidir qué cambiar
bypassPermissions — sin prompts de confirmación
- Auto-aprueba: TODO, incluyendo operaciones destructivas
- Cuándo usarlo: CI/CD automatizado, loops nocturnos en branches aislados, tests de integración
- NUNCA en producción, NUNCA con datos reales sin backup
Diagrama de decisión
quadrantChart
title Permission Modes — Seguridad vs Autonomía
x-axis Baja Autonomía --> Alta Autonomía
y-axis Baja Seguridad --> Alta Seguridad
quadrant-1 Alta seguridad, alta autonomía
quadrant-2 Alta seguridad, baja autonomía
quadrant-3 Baja seguridad, baja autonomía
quadrant-4 Baja seguridad, alta autonomía
plan: [0.15, 0.95]
default: [0.45, 0.75]
acceptEdits: [0.70, 0.50]
bypassPermissions: [0.95, 0.05]
Escenario → modo recomendado
| Escenario | Modo recomendado |
|---|---|
| Explorar codebase nuevo sin tocar nada | plan |
| Code review de PR externo | plan |
| Refactoring de módulo propio | acceptEdits |
| Pair programming con nuevo colaborador | default |
| Primer uso con proyecto desconocido | default |
| CI/CD en branch de feature | bypassPermissions |
| Producción / datos reales | default (nunca bypass) |
Wildcard syntax — comportamiento exacto
Ambigüedad común en el examen: qué coincide exactamente con cada patrón.
Reglas de * y **
*coincide con cualquier string incluyendo espacios, pero no cruza separadores de directorio (/)**es recursivo: coincide en cualquier nivel de subdirectorios- En
Bash(...): el argumento es el comando completo como string, no tiene concepto de directorios
Implicación de seguridad de Bash(git *):
* coincide con todo el resto del string, entonces git * SÍ coincide con git push --force. Si quieres limitar, usar patrones más específicos como Bash(git status) o Bash(git log *).
Tabla de ejemplos concretos
| Patrón | Coincide con | No coincide con |
|---|---|---|
Bash(git *) | git status, git push --force, git add . | npm install |
Bash(npm run *) | npm run build, npm run test:e2e | npm install, npm ci |
Edit(src/*.ts) | src/app.ts, src/index.ts | src/utils/helper.ts |
Edit(src/**) | src/utils/helper.ts, src/a/b/c.ts | /home/user/other.ts |
Bash(docker *) | docker build ., docker rm -f container | docker-compose up |
Prioridad deny sobre allow
deny siempre tiene prioridad sobre allow, sin importar el nivel de jerarquía:
{
"permissions": {
"allow": ["Bash(git *)"],
"deny": ["Bash(git push *)"]
}
}
En el ejemplo anterior, git status está permitido pero git push origin main está bloqueado.
Siguiente: Memory y CLAUDE.md