Cap 7: Settings

Por: Artiko
claude-codesettingspermissionsconfiguration

Jerarquía y scope

Claude Code usa un sistema de scopes para precedencia y sharing:

ScopeLocationAplica aShareable
ManagedServer-managed, MDM/registry, system managed-settings.jsonToda la orgSí (IT)
User~/.claude/Todos tus proyectosNo
Project.claude/ en repoColaboradores del repoSí (git)
Local.claude/settings.local.jsonVos en este repoNo (gitignored)

Desde v2.1.211, las aprobaciones de tipo “Yes, don’t ask again” se guardan en .claude/settings.local.json ubicado en la raíz del repo git (resuelta a través de worktrees), y ese archivo se carga desde esa raíz aunque la sesión se inicie en un subdirectorio.

Prioridad

  1. Managed (no se puede overridear)
  2. CLI arguments (override por sesión)
  3. Local
  4. Project
  5. User

Excepción documentada: las reglas de permisos (allow/ask/deny) no siguen esta precedencia — se fusionan entre todos los scopes. Ver Permissions.

En Windows, ~/.claude resuelve a %USERPROFILE%\.claude.

Managed settings deployment

  • macOS: domain com.anthropic.claudecode (preferences) o /Library/Application Support/ClaudeCode/
  • Windows: HKLM\SOFTWARE\Policies\ClaudeCode (Settings REG_SZ), o C:\Program Files\ClaudeCode\. User-level: HKCU\SOFTWARE\Policies\ClaudeCode
  • Linux/WSL: /etc/claude-code/

Windows: la ruta histórica C:\ProgramData\ClaudeCode\managed-settings.json quedó deprecada y eliminada en v2.1.75. La vigente es C:\Program Files\ClaudeCode\managed-settings.json. Lo mismo aplica al CLAUDE.md de política y a managed-mcp.json.

Drop-in directory: managed-settings.d/ con archivos merged en orden alfabético (10-telemetry.json, 20-security.json).

Claude Code crea backups timestamped automáticamente (retiene los 5 más recientes).

Ejemplo settings.json

{
  "$schema": "https://json.schemastore.org/claude-code-settings.json",
  "permissions": {
    "allow": ["Bash(npm run lint)", "Bash(npm run test *)", "Read(~/.zshrc)"],
    "deny": ["Bash(curl *)", "Read(./.env)", "Read(./secrets/**)"]
  },
  "env": {
    "CLAUDE_CODE_ENABLE_TELEMETRY": "1"
  }
}

Settings disponibles

Modelo y comportamiento

KeyDescripción
agentCorre el main thread como un subagent (su system prompt, tools, modelo)
modelOverride del modelo default. --model y ANTHROPIC_MODEL lo overridean por sesión
modelOverridesMapear IDs Anthropic a provider IDs (ej Bedrock ARNs)
availableModelsRestringe qué modelos puede elegir el user via /model, --model, ANTHROPIC_MODEL
effortLevelPersistir effort: low/medium/high/xhigh/max (default high)
alwaysThinkingEnabledExtended thinking default para todas las sesiones
showThinkingSummariesMostrar summaries de extended thinking (default redactado)

Los niveles de esfuerzo son low | medium | high | xhigh | max. En Claude Code el menú /effort muestra además ultracode, que no es un nivel del modelo: es un ajuste de sesión que envía xhigh y hace que Claude orqueste dynamic workflows para tareas sustanciales.

UI

KeyDescripción
editorMode"normal" o "vim"
tui"fullscreen" flicker-free o "default"
viewModeDefault: "default", "verbose", o "focus"
languageIdioma preferido para respuestas
outputStyleOutput style (ej "Explanatory")
autoScrollEnabledSeguir output al fondo (fullscreen)
prefersReducedMotionReduce animaciones (a11y)
spinnerTipsEnabledTips en el spinner
spinnerTipsOverrideOverride de tips ({ "excludeDefault": true, "tips": ["..."] })
spinnerVerbsVerbos custom ({"mode": "append", "verbs": ["Pondering"]})
showTurnDurationMostrar duración de turnos (default true)
terminalProgressBarEnabledProgress bar en terminales soportadas
preferredNotifChannelauto/terminal_bell/iterm2/iterm2_with_bell/kitty/ghostty/notifications_disabled
awaySummaryEnabledRecap al volver tras estar away
syntaxHighlightingDisabledDesactivar highlighting en diffs

Skills

KeyDescripción
skillListingBudgetFractionFracción del context window para skill listing (default 0.01 = 1%). min-ver 2.1.105
maxSkillDescriptionCharsCap por skill de description + when_to_use (default 1536). min-ver 2.1.105
skillOverridesVisibility por skill: "on", "name-only", "user-invocable-only", "off". min-ver 2.1.129
disableSkillShellExecutionBloquea ejecución inline !\…“ en skills

Permissions

{
  "permissions": {
    "allow": ["Bash(npm run lint)", "Bash(npm run test *)"],
    "ask": ["Bash(git push *)"],
    "deny": ["Bash(curl *)", "Read(./.env)", "Read(./secrets/**)"],
    "additionalDirectories": ["../docs/"],
    "defaultMode": "acceptEdits",
    "disableBypassPermissionsMode": "disable",
    "skipDangerousModePermissionPrompt": true
  }
}
KeyDescripción
permissions.allowArray de reglas que permiten tool use
permissions.askArray de reglas que piden confirmación
permissions.denyArray de reglas que deniegan
permissions.additionalDirectoriesWorking dirs adicionales para file access
permissions.defaultModedefault (alias manual desde v2.1.200, etiquetado Manual en la UI), acceptEdits, plan, auto, dontAsk, bypassPermissions
permissions.disableBypassPermissionsMode"disable" para impedir bypass mode. Funciona desde cualquier scope
permissions.skipDangerousModePermissionPromptSkip confirmación antes de bypass mode
permissions.disableAutoMode"disable" para impedir auto mode
autoModeCustomize qué bloquea el classifier (environment, allow, soft_deny, hard_deny)
useAutoModeDuringPlanPlan mode usa semántica auto (default true)

En managed settings, ni permissions.disableAutoMode ni permissions.disableBypassPermissionsMode pueden sobrescribirse, tampoco con flags de CLI.

defaultMode: "auto" se ignora cuando viene de .claude/settings.json o .claude/settings.local.json (desde v2.1.142), para que un repo no pueda autoconcederse auto mode. Para fijarlo hay que ponerlo en ~/.claude/settings.json o en managed settings.

Reglas: format Tool o Tool(specifier). Evaluación en orden: deny → ask → allow. Primer match gana.

EjemploEfecto
BashTodos los Bash
Bash(npm run *)Comandos npm run ...
Read(./.env)Leer .env
WebFetch(domain:example.com)Fetch a example.com

Fusión entre scopes

Las reglas allow/ask/deny son la excepción documentada a la precedencia de scopes: se fusionan entre todos ellos. Un deny en cualquier scope bloquea un allow de cualquier otro, incluido --allowedTools.

La especificidad no altera el orden de evaluación: Bash(aws *) en deny bloquea Bash(aws s3 ls) aunque esté en allow. No hay excepciones dentro de un deny.

Los arrays de settings se fusionan y deduplican entre scopes, salvo fallbackModel (máximo 3), que no se fusiona.

Qué herramientas se evalúan por ruta

Desde v2.1.210 solo Edit(path) y Read(path) se evalúan en los chequeos de permisos de archivo. Write(path), NotebookEdit(path) y Glob(path) se aceptan en el settings pero nunca coinciden y emiten un warning de arranque.

Desde v2.1.208, un deny de Read bloquea también Edit sobre esa ruta.

Anclajes de ruta

Las rutas de las reglas siguen la especificación gitignore, con cuatro anclajes:

FormaSignificado
//pathAbsoluta desde la raíz del filesystem
~/pathRelativa al home
/pathRelativa al origen del settings (project root, ~/.claude, …)
path o ./pathRelativa al cwd

Es decir, Read(/Users/alice/file) no es una ruta absoluta: para eso se escribe Read(//Users/alice/file).

Desde v2.1.214, un patrón de un solo segmento como Edit(src/**) coincide solo con src en el directorio de trabajo; para cualquier profundidad hay que escribir Edit(**/src/**). Esto aplica también al campo if de los hooks.

Protected paths

Existen rutas cuyas escrituras nunca se auto-aprueban, salvo en bypassPermissions:

  • Directorios: .git, .config/git, .vscode, .idea, .husky, .cargo, .devcontainer, .yarn, .mvn y .claude (excepto .claude/worktrees)
  • Archivos: .bashrc, .zshrc, .envrc, .npmrc, .mcp.json, .claude.json

permissions.allow no las pre-aprueba: el chequeo de protected paths corre antes de evaluar allow.

Workspace trust y additionalDirectories

permissions.allow y permissions.additionalDirectories de un settings de proyecto solo aplican después de aceptar el diálogo de workspace trust; deny y ask no lo requieren.

additionalDirectories concede únicamente acceso a archivos: no carga skills ni subagentes, a diferencia de --add-dir.

Sandbox

{
  "sandbox": {
    "enabled": true,
    "autoAllowBashIfSandboxed": true,
    "excludedCommands": ["docker *"],
    "filesystem": {
      "allowWrite": ["/tmp/build", "~/.kube"],
      "denyRead": ["~/.aws/credentials"]
    },
    "network": {
      "allowedDomains": ["github.com", "*.npmjs.org"],
      "deniedDomains": ["uploads.github.com"]
    }
  }
}
KeyDescripción
sandbox.enabledmacOS/Linux/WSL2. Default false
sandbox.failIfUnavailableExit si el sandbox no puede iniciar. Default: falla abierto (warning + comandos sin sandbox)
sandbox.autoAllowBashIfSandboxedAuto-approve bash bajo sandbox (default true)
sandbox.excludedCommandsComandos fuera del sandbox
sandbox.allowUnsandboxedCommandsPermitir comandos fuera del sandbox (default true)
sandbox.filesystem.allowWritePaths adicionales para escritura
sandbox.filesystem.denyWritePaths bloqueados para escritura
sandbox.filesystem.denyReadPaths bloqueados para lectura
sandbox.filesystem.allowReadRe-allow lectura en zonas denyRead
sandbox.network.allowedDomainsDominios outbound permitidos
sandbox.network.deniedDomainsDominios bloqueados
sandbox.network.allowUnixSockets(macOS) sockets Unix accesibles
sandbox.network.allowAllUnixSocketsPermitir todos los Unix sockets
sandbox.network.allowLocalBinding(macOS) bind a localhost ports
sandbox.network.allowMachLookup(macOS) XPC/Mach service names
sandbox.network.httpProxyPort / socksProxyPortProxies
sandbox.enableWeakerNestedSandboxSandbox débil para Docker unprivileged. Reduce security
sandbox.enableWeakerNetworkIsolationAislamiento de red más débil. Reduce security
sandbox.filesystem.disabled(v2.1.216+) Apaga el aislamiento de filesystem manteniendo el de red. Solo se honra desde user/managed/--settings
sandbox.network.tlsTerminate(Experimental, v2.1.199+) Termina TLS, pero no filtra contenido
sandbox.credentials(v2.1.187+) Denegar o enmascarar credenciales (ver abajo)

Comportamiento por defecto

Por defecto el sandbox permite escritura solo en el cwd y en el $TMPDIR de la sesión, pero lectura de todo el equipo salvo los directorios denegados.

Si el sandbox no puede iniciarse, por defecto se emite un warning y los comandos corren sin sandbox: falla abierto. Para que falle cerrado hay que poner sandbox.failIfUnavailable: true.

Rutas: convenciones distintas a las reglas de permisos

Las rutas de sandbox.filesystem.* usan convenciones estándar, no las de las reglas Read/Edit:

FormaSignificado
/tmp/buildAbsoluta
~/.kubeRelativa al home
./dist o distRelativa a la raíz del proyecto (settings de proyecto) o a ~/.claude (settings de usuario)

Acá no se usa el prefijo // de las reglas Read/Edit. Es una fuente directa de error al copiar patrones de una sección a la otra.

Credenciales

{
  "sandbox": {
    "credentials": {
      "files": [{ "path": "~/.aws/credentials", "mode": "deny" }],
      "envVars": [
        { "name": "GITHUB_TOKEN", "mode": "mask", "injectHosts": ["api.github.com"] }
      ]
    }
  }
}
  • files[].mode: "deny" bloquea el acceso al archivo.
  • envVars[].mode acepta "deny" o "mask".
  • mask (v2.1.199+) sustituye la credencial por un sentinel por sesión y el proxy inyecta el valor real solo hacia los injectHosts. Requiere network.tlsTerminate y se ignora si viene de settings de proyecto o local.

Hooks y Statusline

KeyDescripción
hooksConfigurar hooks
disableAllHooksDeshabilita TODOS los hooks y statusline
allowedHttpHookUrlsAllowlist URL patterns para HTTP hooks (* wildcard)
httpHookAllowedEnvVarsEnv vars que pueden interpolar en HTTP hooks
allowManagedHooksOnly(Managed) Bloquea hooks de usuario, proyecto y plugin, salvo plugins force-enabled
statusLineConfigurar status line ({ "type": "command", "command": "..." })

MCP Servers

KeyDescripción
enableAllProjectMcpServersAuto-approve todos los MCP en .mcp.json del proyecto
enabledMcpjsonServersLista de MCP servers a approve
disabledMcpjsonServersLista a rechazar
allowedMcpServers(Managed) allowlist
deniedMcpServers(Managed) denylist
allowManagedMcpServersOnly(Managed) solo allowlist gestionado
allowAllClaudeAiMcps(Managed) permitir todos los conectores de claude.ai

Plugins

KeyDescripción
allowedChannelPlugins(Managed) allowlist de channel plugins
blockedMarketplaces(Managed) blocklist de marketplaces
strictKnownMarketplaces(Managed) allowlist de marketplaces
pluginTrustMessage(Managed) mensaje custom en plugin trust warning
strictPluginOnlyCustomization(Managed) Bloquea skills, agents, hooks y MCP servers de fuentes de usuario y proyecto
disableSideloadFlags(Managed) Desactiva las flags de sideload

Claves managed-only

Estas claves no tienen efecto en scope user ni project; solo se honran desde managed settings. Son las relevantes para endurecer la extensibilidad:

KeyEfecto
allowManagedPermissionRulesOnlySolo se aplican las reglas de permisos gestionadas
allowManagedHooksOnlyBloquea hooks de usuario/proyecto/plugin, salvo plugins force-enabled
allowManagedMcpServersOnlyEl allowlist de MCP se limita a fuentes gestionadas
allowAllClaudeAiMcpsPermite todos los conectores de claude.ai
strictPluginOnlyCustomizationBloquea skills, agents, hooks y MCP servers de fuentes de usuario y proyecto
disableSideloadFlagsDesactiva las flags de sideload
sandbox.filesystem.allowManagedReadPathsOnlySolo se honran los read paths gestionados
sandbox.network.allowManagedDomainsOnlySolo se honran los dominios gestionados

Worktrees

KeyDescripción
worktree.baseRef"fresh" (default) o "head"
worktree.symlinkDirectoriesDirs a symlinkear desde repo principal
worktree.sparsePathsDirs via git sparse-checkout

Agents y teams

KeyDescripción
disableAgentViewApagar background agents y agent view
teammateModeauto/in-process/tmux
disableRemoteControlDesactivar Remote Control. min-ver 2.1.128

Updates

KeyDescripción
autoUpdatesChannel"stable" (~1 semana) o "latest" (default)
minimumVersionFloor que impide auto-updates por debajo

Auth

KeyDescripción
forceLoginMethodclaudeai o console
forceLoginOrgUUIDUUID(s) requeridos para login
apiKeyHelperScript custom que genera auth value (X-Api-Key, Authorization Bearer)
awsAuthRefreshScript que modifica .aws/
awsCredentialExportScript que outputea JSON con AWS credentials
gcpAuthRefreshScript que refresca GCP ADC
otelHeadersHelperScript para OTel headers dinámicos

File/Memory

KeyDescripción
fileSuggestionCustom script para @ autocomplete
respectGitignore@ file picker respeta .gitignore (default true)
plansDirectoryDónde se guardan los plans (default ~/.claude/plans)
autoMemoryDirectoryDir custom para auto-memory
autoMemoryEnabledAuto-memory on/off (default true)
claudeMdExcludesGlobs o paths absolutos de CLAUDE.md a omitir
claudeMd(Managed) instrucciones inyectadas como org-managed memory

Attribution

{
  "attribution": {
    "commit": "🤖 Generated with Claude Code\n\nCo-Authored-By: Claude Opus 4.8 <[email protected]>",
    "pr": "🤖 Generated with Claude Code"
  }
}
KeyDescripción
attribution.commit / attribution.prTemplates de commit/PR
includeGitInstructionsBuilt-in workflow de commit/PR en system prompt (default true)
prUrlTemplateSubstituye {host}, {owner}, {repo}, {number}, {url}

Alias de modelo vigentes para armar el template: opus → Opus 4.8, sonnet → Sonnet 5.

Channels y org

KeyDescripción
channelsEnabled(Managed) Channels para la org
companyAnnouncementsArray de announcements al startup

Avanzado

KeyDescripción
defaultShell"bash" (default) o "powershell" para ! commands del input box
fastModePerSessionOptInFast mode no persiste entre sesiones
disableDeepLinkRegistration"disable" para no registrar claude-cli://
sshConfigsConexiones SSH para el dropdown del Desktop
policyHelper(min-ver 2.1.136) ejecutable que computa managed settings dinámicamente
parentSettingsBehavior(Managed, min-ver 2.1.133) "first-wins" o "merge"
forceRemoteSettingsRefresh(Managed) blockea startup hasta fetch fresh
wslInheritsWindowsSettings(Windows managed) WSL lee del policy chain
feedbackSurveyRateProbabilidad (0-1) del survey de quality
cleanupPeriodDaysBorrar session files más viejos (default 30, min 1)

Global config (~/.claude.json)

Se guarda en ~/.claude.json (no en settings.json):

KeyDescripción
autoConnectIdeAuto-conectar a IDE al iniciar
autoInstallIdeExtensionAuto-instalar extension del IDE (default true)
externalEditorContextPrepend respuesta previa como comments en editor externo
teammateDefaultModelModelo default para teammates

Cuándo usar cada scope

  • Managed: políticas org-wide, compliance, IT configs standard
  • User: preferencias personales, API keys
  • Project: settings team-shared, permissions, hooks, MCP servers
  • Local: overrides personales, testing, machine-specific

Tips

  • Agrega "$schema": "https://json.schemastore.org/claude-code-settings.json" para autocomplete y validación inline
  • Las permission rules se mergean entre scopes (los scalars siguen prioridad): un deny en cualquier scope bloquea un allow de cualquier otro, incluido --allowedTools
  • Los arrays de settings se fusionan y deduplican entre scopes, salvo fallbackModel (máx. 3), que no se fusiona
  • Sandbox y permission rules son complementarios (se combinan)
  • Backups timestamped automáticos (5 más recientes)

Siguiente: Memory y CLAUDE.md