Skip to main content
O Sistema de Hooks do ChatCLI permite que você execute ações automáticas em resposta a eventos do ciclo de vida da aplicação. Com hooks, você pode auto-formatar código após edicoes, enviar notificações, bloquear comandos perigosos, registrar logs de auditoria e muito mais.
Hooks são aditivos: configurações globais e de workspace são mescladas. Hooks de workspace complementam os globais, nunca os substituem.

Configuração

Os hooks são definidos em arquivos JSON em dois níveis:
Hooks de workspace são aditivos — eles se somam aos hooks globais. Se o mesmo evento tem hooks em ambos os níveis, todos são executados (globais primeiro, depois workspace).

Estrutura do Arquivo


Eventos Disponíveis

O ChatCLI emite 8 eventos de lifecycle aos quais hooks podem se vincular: Os eventos de compactação carregam um campo trigger (auto, manual, recovery) e, no PostCompact, um outcome (applied quando o histórico mudou, skipped quando nada mudou: no-op, resumo rejeitado, falha) no payload JSON e em CHATCLI_HOOK_TRIGGER / CHATCLI_HOOK_OUTCOME; todo PreCompact tem exatamente um PostCompact par, então um hook pode tirar snapshot do transcript antes de uma reescrita automática, logar /compact manuais separadamente ou alertar em recoveries de overflow. PreCompact roda de forma síncrona antes de o histórico mudar; PostCompact roda desacoplado do turno.
O evento PreToolUse e blocking: se o hook retornar exit code 2, a execução da ferramenta e bloqueada. Isso permite criar guardrails que impedem operações perigosas.

Tipos de Hook

Executa um comando shell no sistema operacional. O comando tem acesso a variáveis de ambiente com contexto do evento.
Exit codes:
  • 0 — Sucesso (execução continua normalmente)
  • 1 — Erro (logado, mas não bloqueia)
  • 2 — Bloqueia a operação (apenas para PreToolUse)
O comando e executado via sh -c no Linux/macOS e cmd /c no Windows.

ToolPattern — Filtro por Ferramenta

O campo toolPattern permite filtrar quais ferramentas acionam o hook. Ele aceita padroes glob:

Variáveis de Ambiente

Hooks do tipo command recebem variáveis de ambiente com contexto do evento: Todo o resto do evento — argumentos e output da ferramenta, o prompt do usuário, o diretório de trabalho, a mensagem de erro — chega como payload JSON no stdin (toolArgs, toolOutput, userPrompt, workingDir, error, trigger); leia com jq quando um hook precisar de mais do que as quatro variáveis acima.

Desligando os Hooks

Os hooks também nunca disparam dentro de uma execução do chatcli eval, seja qual for o valor dessa variável. Cada candidato do eval é um processo real do chatcli, então sem essa regra um hook que roda um eval dispararia de novo dentro de cada candidato que o eval cria, sem fim, e um hook UserPromptSubmit que injeta contexto mudaria o resultado que está sendo medido. O harness de eval também define CHATCLI_HOOKS_ENABLED=false em cada candidato.

Exemplos Completos

Auto-formatar arquivos Go após qualquer edicao:

Casos de Uso

Auto-Format

Execute formatadores (gofmt, prettier, black) automaticamente após edicoes de arquivo.

Notificações

Envie alertas para Slack, Discord ou email ao final de sessões ou em erros.

Guardrails

Bloqueie comandos perigosos (rm -rf, DROP TABLE, force push) com PreToolUse.

Auditoria

Registre todas as ações do agent em arquivos de log para compliance.

Testes Automaticos

Execute testes automaticamente após cada edicao de código.

Linting

Execute linters (golangci-lint, eslint) após cada write/patch.

Rodando um Eval a partir de um Hook

Um hook pode rodar uma suíte de evals, por exemplo uma checagem barata quando você sai do REPL, que só avisa se houver regressão. Um eval leva de segundos a minutos, e o SessionEnd roda enquanto o ChatCLI encerra, dentro do timeout do hook (10 s por padrão). Por isso o hook inicia o eval em segundo plano e retorna na hora, com a saída indo para um arquivo, para que nada fique esperando por ele.
~/.chatcli/hooks.json
~/.chatcli/hooks/eval-smoke.sh
O exit code 3 significa regressão contra o baseline. Troque o osascript (macOS) por notify-send no Linux, ou por um curl para um webhook de chat. Para rodar o eval só quando você muda algo que define o comportamento, como uma skill ou um slash command, use PostToolUse com "toolPattern": "@coder" e faça o script verificar, no toolArgs do stdin, se aparece .chatcli/skills ou .chatcli/commands. Você não precisa de trava contra recursão: os hooks não disparam dentro das execuções do próprio eval.

Próximos Passos

Coder Security

Politicas de segurança e aprovação para operações do coder.

Segurança

Entenda o modelo de segurança do ChatCLI.

UI Compacta

Modo de exibicao minimalista para o coder mode.

Modo Coder

O ciclo completo de engenharia com hooks integrados.