Hook, a regra que você impõe
O CLAUDE.md orienta o Claude, mas não garante. Um hook é um comando que o próprio Claude Code executa. Veja como criar um que protege o arquivo .env e como provar que ele funciona.
- Claude Code
- hook PreToolUse
- exemplo para copiar
Publicado em
Leia antes: o limite deste hook
Este hook vale para as ferramentas de editar e criar arquivo (matcher Edit|Write). Um comando de terminal que escreve no .env, como echo oi >> .env, passa por ele.
A documentação indica dois caminhos para cobrir isso: um hook Stop, que confere a pasta uma vez por turno, ou casar também o terminal, com o matcher Edit|Write|Bash|PowerShell mais um script que liste os arquivos modificados (git status --porcelain). Este guia não traz esse segundo script. Até você criá-lo, a proteção é parcial.
O que é cada coisa
- CLAUDE.md: texto que o Claude lê como contexto. Pela documentação, ele orienta, mas não é regra imposta pelo sistema, e não há garantia de que seja seguido à risca.
- Hook: um comando (script) que o Claude Code executa em pontos fixos do funcionamento, como antes de usar uma ferramenta. Pela documentação, ele roda independentemente do que o Claude decidir.
- PreToolUse: o evento que dispara antes de a ferramenta rodar e pode bloquear a ação.
- Matcher: o filtro que diz para quais ferramentas o hook vale.
Edit|Writecobre editar e criar arquivo; não cobre comandos de terminal.
Prepare uma pasta de teste
Pré-requisitos: Claude Code instalado e a ferramenta jq, que lê o JSON que o Claude Code manda para o hook. No Mac, confira com which jq.
Use uma pasta de teste, não um projeto de verdade. Crie um arquivo .env com um conteúdo de exemplo e a pasta dos hooks:
echo "CHAVE=EXEMPLO" > .env
mkdir -p .claude/hooksCrie o script do hook
Salve como .claude/hooks/protect-env.sh. Ele lê o caminho do arquivo que o Claude quer mexer e, se o nome começar com .env, sai com código dois, que é o código que bloqueia.
#!/bin/bash
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
FILE_PATH="${FILE_PATH//\\//}"
NAME="${FILE_PATH##*/}"
if [[ "$NAME" == .env* ]]; then
echo "Bloqueado: $FILE_PATH é um arquivo .env protegido por hook" >&2
exit 2
fi
exit 0O script compara só o nome do arquivo (o que vem depois da última barra). Assim ele bloqueia .env, .env.local e .env.production, e não bloqueia uma pasta que só tenha ".env" no nome, como .environments. O .env.example também fica bloqueado; ajuste se precisar liberá-lo.
Torne o script executável:
chmod +x .claude/hooks/protect-env.shRegistre o hook no settings.json
Crie .claude/settings.json com este conteúdo. Se o arquivo já existir, junte o bloco hooks ao que já está lá.
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-env.sh"
}
]
}
]
}
}Abra o Claude Code na pasta de teste e digite /hooks. O hook deve aparecer na lista, em PreToolUse.
Teste
Faça estes três pedidos ao Claude, um de cada vez:
Adicione um comentário no arquivo .env- Esperado: a edição é bloqueada antes de acontecer e o Claude recebe a mensagem "Bloqueado: ...".
Crie um arquivo teste.txt com a palavra oi- Esperado: funciona, porque o script sai com código zero para outros arquivos.
Rode no terminal: echo oi >> .env- Esperado: passa. O matcher
Edit|Writenão vê comandos de terminal. É o limite avisado no começo.
Se o hook não aparecer ou não disparar, inicie com claude --debug-file /tmp/claude.log e acompanhe com tail -f /tmp/claude.log, ou use /debug dentro da sessão.
O que verificar
- Só o código de saída dois bloqueia. Código um sem JSON válido é erro não bloqueante: a ação segue.
- O script precisa estar executável e o
jqinstalado. Sem isso, o hook falha e, em geral, a ação segue. - Código zero em PreToolUse não aprova a ação: ela segue o fluxo normal de permissões.
- Hooks de comando são regras fixas. Hooks de prompt e de agente usam um modelo para decidir; servem para julgamento, não para regra fixa.
- Onde guardar:
.claude/settings.jsonvale para o projeto e pode ir para o Git;.claude/settings.local.jsonvale só para você;~/.claude/settings.jsonvale para todos os seus projetos. - Para proibir uma ação de forma ampla, as regras de permissão (
permissions.deny) são outra camada que a documentação aponta.
Regra de bolso
- Hook ou permissão: regra que precisa valer sempre, como proteger arquivo ou bloquear comando.
- CLAUDE.md: preferência de estilo e contexto do projeto.
Antes de levar para o seu projeto
- O script foi testado em 09/11/2026 no terminal, no Linux e num Mac (macOS 27), com o JSON de PreToolUse que a documentação descreve: bloqueia .env, .env.local, .env.production, sub/.env e .env.example; libera app.py e arquivos dentro de .environments; não vê comandos de terminal.
- Teste dentro de uma sessão real do Claude Code, na pasta de teste, antes de usar num projeto de verdade.
- Nomes de eventos e formato do settings.json podem mudar. Confira a documentação na data em que for usar.
Fontes
Documentação oficial do Claude Code, conferida em 09/11/2026: Memory (CLAUDE.md), Hooks guide e Hooks reference. O script é inspirado no exemplo "Block edits to protected files" da documentação, com a comparação pelo nome do arquivo e a mensagem adaptadas.
Fechamento do guia
Agora você sabe criar um hook que bloqueia a edição do .env, provar que ele funciona e o que ele não cobre.
Seguir @drasdiegotechPróximo guia
Em breve no site.
Salve este guia nos favoritos do navegador e salve o reel no Instagram para voltar quando precisar.
Este site conta visitas com o Vercel Web Analytics, de forma anônima e agregada, sem cookies de terceiros. Aviso de privacidade