๐ Localizacao: 3 niveis
Claude Code resolve settings em tres niveis com precedencia. Coloque no nivel certo.
๐ Hierarquia de settings
1. PROJECT: .claude/settings.json (no repo atual) 2. USER: ~/.claude/settings.json (voce, cross-project) 3. GLOBAL: /etc/claude/settings.json (admin, multi-user) PRECEDENCIA: project > user > global MERGE: arrays se concatenam; objetos fazem merge profundo. .claude/settings.local.json = local-only, nao versionado (gitignore)
๐ก Regra de decisao
Identidade pessoal โ user. Hooks de projeto especifico โ project. Compliance da empresa โ global. Experimentos โ local.
๐งฑ Estrutura basica
O schema do settings.json e simples: chave 'hooks' com array por evento.
๐ Estrutura minima
{
"hooks": {
"SessionStart": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.memory/hooks/session_start.sh"
}
]
}
]
}
}
Leitura:
- "SessionStart": nome do evento (case-sensitive)
- "matcher": "" = sempre dispara
- "type": "command" = executa comando bash
- "command": o que rodarโ ๏ธ Case sensitive
SessionStart com S maiusculo. sessionstart nao funciona. Claude Code e rigoroso nos nomes de eventos.
๐ Permissoes: allow/deny/ask
Hooks executam comandos bash com suas permissoes. Precisa de allowlist para comandos sensitivos.
๐ก๏ธ Quando permissoes importam
Claude Code pede permissao para executar hooks de commands que nao estao na allowlist.
- โขallow: comandos que rodam sem perguntar. Seus scripts proprios.
- โขdeny: comandos bloqueados mesmo se Claude tentar. rm -rf, curl para dominios perigosos.
- โขask: pede confirmacao a cada execucao. Default para comandos novos.
- โขPara hooks: adicione o path completo do script em 'allow'.
๐ฏ Matchers: filtragem condicional
Matcher diz quando o hook dispara. Nao so se dispara, mas sob qual condicao.
๐ช Tipos de matcher
Por evento:
- โข'' (vazio): sempre dispara. Comum em SessionStart.
- โข'Bash': so quando a tool chamada e Bash. Comum em PreToolUse.
- โข'Write|Edit': regex para multiplos. Hooks de compliance.
- โขArray de objetos: cada objeto tem seu matcher e seus commands. Permite logica diferente por condicao.
๐ก Matcher em UserPromptSubmit
Voce pode criar matcher por keyword no prompt. Ex: matcher de 'deploy|infra' dispara hook que carrega infra.md. Trilha 4 mostra.
๐ Exemplo completo comentado
Um settings.json de producao, linha a linha.
๐ Exemplo real
{
"hooks": {
"SessionStart": [{
"matcher": "",
"hooks": [{ "type": "command",
"command": "$CLAUDE_PROJECT_DIR/hooks/start.sh" }]
}],
"PreCompact": [{
"matcher": "",
"hooks": [{ "type": "command",
"command": "$CLAUDE_PROJECT_DIR/hooks/compact.sh" }]
}],
"UserPromptSubmit": [{
"matcher": "",
"hooks": [{ "type": "command",
"command": "$CLAUDE_PROJECT_DIR/hooks/router.sh" }]
}],
"SessionEnd": [{
"matcher": "",
"hooks": [{ "type": "command",
"command": "nohup $CLAUDE_PROJECT_DIR/hooks/end.sh &" }]
}]
}
}๐ก Variaveis uteis
$CLAUDE_PROJECT_DIR resolve para o cwd do projeto atual. Use em paths para portabilidade.
โ ๏ธ Armadilhas comuns
Bugs de primeira hora que custam horas. Conheca para evitar.
โ Fazer
- โUsar $CLAUDE_PROJECT_DIR ou ~ para paths
- โTestar JSON com jq antes de salvar
- โDar +x nos scripts (chmod +x)
- โLogar stderr para debug
โ Evitar
- โPath relativo sem raiz (nao resolve)
- โTrailing comma no JSON (invalida)
- โScript sem shebang (#!/usr/bin/env bash)
- โStdout vazio em vez de {}
๐ Resumo do Modulo
Proximo:
3.4 โ Payload: stdin, stdout, additionalContext