16 Ciclo de vida do hook16 Ciclo de vida do hook
17</h2>17</h2>
18 18
19Hooks disparam em pontos específicos durante uma sessão do Claude Code. Quando um evento dispara e um matcher corresponde, o Claude Code passa contexto JSON sobre o evento para seu manipulador de hook. Para hooks de comando, a entrada chega em stdin. Para hooks HTTP, chega como corpo da solicitação POST. Seu manipulador pode então inspecionar a entrada, tomar ação e opcionalmente retornar uma decisão. Os eventos caem em três cadências: uma vez por sessão (`SessionStart`, `SessionEnd`), uma vez por turno (`UserPromptSubmit`, `Stop`, `StopFailure`) e em cada chamada de ferramenta dentro do loop agentic (`PreToolUse`, `PostToolUse`, `PostToolUseFailure`, `PostToolBatch`, `SubagentStart`, `SubagentStop`, `TaskCreated`, `TaskCompleted`):19Hooks disparam em pontos específicos durante uma sessão do Claude Code. Quando um evento dispara e um matcher corresponde, o Claude Code passa contexto JSON sobre o evento para seu manipulador de hook. Para hooks de comando, a entrada chega em stdin. Para hooks HTTP, chega como corpo da solicitação POST. Seu manipulador pode então inspecionar a entrada, tomar ação e opcionalmente retornar uma decisão.
20
21Os eventos caem em três cadências:
22
23* uma vez por sessão: `SessionStart` e `SessionEnd`
24* uma vez por turno: `UserPromptSubmit`, `Stop` e `StopFailure`
25* em cada chamada de ferramenta dentro do loop agentic: `PreToolUse` e `PostToolUse`
20 26
21<div style={{maxWidth: "500px", margin: "0 auto"}}>27<div style={{maxWidth: "500px", margin: "0 auto"}}>
22 <Frame>28 <Frame>
214| `SessionStart` | como a sessão começou | `startup`, `resume`, `clear`, `compact` |220| `SessionStart` | como a sessão começou | `startup`, `resume`, `clear`, `compact` |
215| `Setup` | qual sinalizador CLI acionou a configuração | `init`, `maintenance` |221| `Setup` | qual sinalizador CLI acionou a configuração | `init`, `maintenance` |
216| `SessionEnd` | por que a sessão terminou | `clear`, `resume`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |222| `SessionEnd` | por que a sessão terminou | `clear`, `resume`, `logout`, `prompt_input_exit`, `bypass_permissions_disabled`, `other` |
217| `Notification` | tipo de notificação | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_complete`, `elicitation_response` |223| `Notification` | tipo de notificação | `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_complete`, `elicitation_response`, `agent_needs_input`, `agent_completed` |
218| `SubagentStart` | tipo de agente | `general-purpose`, `Explore`, `Plan`, nomes de agentes personalizados ou nomes com escopo de plugin como `^my-plugin:reviewer$` |224| `SubagentStart` | tipo de agente | `general-purpose`, `Explore`, `Plan`, nomes de agentes personalizados ou nomes com escopo de plugin como `^my-plugin:reviewer$` |
219| `PreCompact`, `PostCompact` | o que acionou a compactação | `manual`, `auto` |225| `PreCompact`, `PostCompact` | o que acionou a compactação | `manual`, `auto` |
220| `SubagentStop` | tipo de agente | mesmos valores que `SubagentStart` |226| `SubagentStop` | tipo de agente | mesmos valores que `SubagentStart` |
317 323
318Todos os hooks correspondentes executam em paralelo, e manipuladores idênticos são automaticamente desduplicados. Hooks de comando são desduplicados por string de comando e `args`, e hooks HTTP são desduplicados por URL.324Todos os hooks correspondentes executam em paralelo, e manipuladores idênticos são automaticamente desduplicados. Hooks de comando são desduplicados por string de comando e `args`, e hooks HTTP são desduplicados por URL.
319 325
320Manipuladores executam no diretório atual com o ambiente do Claude Code. A variável de ambiente `$CLAUDE_CODE_REMOTE` é definida como `"true"` em ambientes web remotos e não é definida na CLI local.326Manipuladores executam no diretório atual com o ambiente do Claude Code. A variável de ambiente `$CLAUDE_CODE_REMOTE` é definida como `"true"` em ambientes web remotos e não é definida na CLI local. {/* min-version: 2.1.199 */}A partir de v2.1.199, [`$CLAUDE_CODE_BRIDGE_SESSION_ID`](/pt/env-vars) é definido para o ID de sessão [Remote Control](/pt/remote-control) enquanto a sessão local tem uma conexão Remote Control ativa.
321 327
322<h4 id="common-fields">328<h4 id="common-fields">
323 Campos comuns329 Campos comuns
704Código de saída 2 é a forma de um hook sinalizar "pare, não faça isso". O efeito depende do evento, porque alguns eventos representam ações que podem ser bloqueadas (como uma chamada de ferramenta que ainda não aconteceu) e outros representam coisas que já aconteceram ou não podem ser prevenidas.710Código de saída 2 é a forma de um hook sinalizar "pare, não faça isso". O efeito depende do evento, porque alguns eventos representam ações que podem ser bloqueadas (como uma chamada de ferramenta que ainda não aconteceu) e outros representam coisas que já aconteceram ou não podem ser prevenidas.
705 711
706| Evento de hook | Pode bloquear? | O que acontece na saída 2 |712| Evento de hook | Pode bloquear? | O que acontece na saída 2 |
707| :-------------------- | :------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------- |713| :-------------------- | :------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------- |
708| `PreToolUse` | Sim | Bloqueia a chamada da ferramenta |714| `PreToolUse` | Sim | Bloqueia a chamada da ferramenta |
709| `PermissionRequest` | Sim | Nega a permissão |715| `PermissionRequest` | Sim | Nega a permissão |
710| `UserPromptSubmit` | Sim | Bloqueia o processamento de prompt e apaga o prompt |716| `UserPromptSubmit` | Sim | Bloqueia o processamento de prompt e apaga o prompt |
711| `UserPromptExpansion` | Sim | Bloqueia a expansão |717| `UserPromptExpansion` | Sim | Bloqueia a expansão |
712| `Stop` | Sim | Previne Claude de parar, continua a conversa |718| `Stop` | Sim | Previne Claude de parar, continua a conversa |
713| `SubagentStop` | Sim | Previne o subagente de parar |719| `SubagentStop` | Sim | Previne o subagente de parar |
714| `TeammateIdle` | Sim | Previne o colega de ficar ocioso (colega continua trabalhando) |720| `TeammateIdle` | Sim | Previne o colega de ficar ocioso, para que continue trabalhando |
715| `TaskCreated` | Sim | Reverte a criação de tarefa |721| `TaskCreated` | Sim | Reverte a criação de tarefa |
716| `TaskCompleted` | Sim | Previne a tarefa de ser marcada como concluída |722| `TaskCompleted` | Sim | Previne a tarefa de ser marcada como concluída |
717| `ConfigChange` | Sim | Bloqueia a mudança de configuração de entrar em efeito (exceto `policy_settings`) |723| `ConfigChange` | Sim | Bloqueia a mudança de configuração de entrar em efeito (exceto `policy_settings`) |
718| `StopFailure` | Não | Saída e código de saída são ignorados |724| `StopFailure` | Não | Saída e código de saída são ignorados |
719| `PostToolUse` | Não | Mostra stderr ao Claude (ferramenta já executou) |725| `PostToolUse` | Não | Mostra stderr ao Claude; a ferramenta já executou |
720| `PostToolUseFailure` | Não | Mostra stderr ao Claude (ferramenta já falhou) |726| `PostToolUseFailure` | Não | Mostra stderr ao Claude; a ferramenta já falhou |
721| `PostToolBatch` | Sim | Para o loop agentic antes da próxima chamada de modelo |727| `PostToolBatch` | Sim | Para o loop agentic antes da próxima chamada de modelo |
722| `PermissionDenied` | Não | Código de saída e stderr são ignorados (negação já ocorreu). Use JSON `hookSpecificOutput.retry: true` para dizer ao modelo que pode tentar novamente |728| `PermissionDenied` | Não | Código de saída e stderr são ignorados porque a negação já ocorreu. Use JSON `hookSpecificOutput.retry: true` para dizer ao modelo que pode tentar novamente |
723| `Notification` | Não | Mostra stderr apenas ao usuário |729| `Notification` | Não | Mostra stderr apenas ao usuário |
724| `SubagentStart` | Não | Mostra stderr apenas ao usuário |730| `SubagentStart` | Não | Mostra stderr apenas ao usuário |
725| `SessionStart` | Não | Mostra stderr apenas ao usuário |731| `SessionStart` | Não | Mostra stderr apenas ao usuário |
736| `InstructionsLoaded` | Não | Código de saída é ignorado |742| `InstructionsLoaded` | Não | Código de saída é ignorado |
737| `MessageDisplay` | Não | O texto original é exibido |743| `MessageDisplay` | Não | O texto original é exibido |
738 744
745Para `SessionStart`, `Setup` e `SubagentStart`, o stderr de código de saída 2 é renderizado na transcrição como um aviso `<hook name> hook error`, da mesma forma que um [erro não-bloqueador](#exit-code-output) faz. Claude não vê isso, e a sessão ou subagente prossegue. Para `SubagentStart`, o aviso aparece na própria transcrição do subagente, não na conversa pai.
746
747A partir do Claude Code v2.1.199, `SessionStart`, `Setup` e `SubagentStart` mostram stderr de código de saída 2 na transcrição. Versões anteriores o escreviam apenas no log de debug.
748
739<h3 id="http-response-handling">749<h3 id="http-response-handling">
740 Tratamento de resposta HTTP750 Tratamento de resposta HTTP
741</h3>751</h3>
963 Entrada de SessionStart973 Entrada de SessionStart
964</h4>974</h4>
965 975
966Além dos [campos de entrada comuns](#common-input-fields), hooks SessionStart recebem `source` e opcionalmente `model`, `agent_type` e `session_title`. O campo `source` indica como a sessão começou: `"startup"` para novas sessões, `"resume"` para sessões retomadas, `"clear"` após `/clear` ou `"compact"` após compactação. O campo `model` contém o identificador do modelo ativo. Pode ser omitido, por exemplo após `/clear` ou quando uma sessão é restaurada através de recuperação de conversa, então verifique o campo antes de lê-lo. Se você iniciar Claude Code com `claude --agent <name>`, um campo `agent_type` contém o nome do agente. O campo `session_title` carrega o título da sessão atual se um já estiver definido, por exemplo via `--name` ou `/rename`. Um hook que emite `sessionTitle` pode verificar `session_title` primeiro para evitar sobrescrever um título que o usuário definiu explicitamente.976Além dos [campos de entrada comuns](#common-input-fields), hooks SessionStart recebem `source` e opcionalmente `model`, `agent_type` e `session_title`:
977
978| Campo | Descrição |
979| :-------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
980| `source` | Como a sessão começou: `"startup"` para novas sessões, `"resume"` para sessões retomadas, `"clear"` após `/clear` ou `"compact"` após compactação |
981| `model` | O identificador do modelo ativo. Pode ser omitido, por exemplo após `/clear` ou quando uma sessão é restaurada através de recuperação de conversa, então verifique o campo antes de lê-lo |
982| `agent_type` | O nome do agente, presente quando você inicia Claude Code com `claude --agent <name>` |
983| `session_title` | O título da sessão atual se um já estiver definido, por exemplo via `--name` ou `/rename`. Um hook que emite `sessionTitle` pode verificar `session_title` primeiro para evitar sobrescrever um título que o usuário definiu explicitamente |
967 984
968```json theme={null}985```json theme={null}
969{986{
983Qualquer texto que seu script de hook imprima em stdout é adicionado como contexto para Claude. Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, você pode retornar esses campos específicos do evento:1000Qualquer texto que seu script de hook imprima em stdout é adicionado como contexto para Claude. Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, você pode retornar esses campos específicos do evento:
984 1001
985| Campo | Descrição |1002| Campo | Descrição |
986| :------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1003| :------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
987| `additionalContext` | String adicionada ao contexto de Claude no início da conversa, antes do primeiro prompt. Consulte [Adicionar contexto para Claude](#add-context-for-claude) para saber como o texto é entregue e o que colocar nele |1004| `additionalContext` | String adicionada ao contexto de Claude no início da conversa, antes do primeiro prompt. Consulte [Adicionar contexto para Claude](#add-context-for-claude) para saber como o texto é entregue e o que colocar nele |
988| `initialUserMessage` | String usada como a primeira mensagem de usuário da sessão. Aplica-se em [modo não-interativo](/pt/headless) (`-p`), onde se torna o primeiro turno mesmo se nenhum prompt for fornecido. Se um prompt for fornecido, ele segue como o próximo turno. Diferentemente de `additionalContext`, que se anexa a um turno existente, isso cria o turno |1005| `initialUserMessage` | String usada como a primeira mensagem de usuário da sessão. Aplica-se em [modo não-interativo](/pt/headless) com a flag `-p`, onde se torna o primeiro turno mesmo se nenhum prompt for fornecido. Se um prompt for fornecido, ele segue como o próximo turno. Diferentemente de `additionalContext`, que se anexa a um turno existente, isso cria o turno |
989| `sessionTitle` | Define o título da sessão, com o mesmo efeito que `/rename`. Use para nomear sessões automaticamente a partir da pasta de lançamento, branch git ou nome de worktree. Aplica-se apenas quando `source` é `"startup"` ou `"resume"`; ignorado em `"clear"` e `"compact"` |1006| `sessionTitle` | Define o título da sessão, com o mesmo efeito que `/rename`. Use para nomear sessões automaticamente a partir da pasta de lançamento, branch git ou nome de worktree. Aplica-se apenas quando `source` é `"startup"` ou `"resume"`; ignorado em `"clear"` e `"compact"` |
990| `watchPaths` | Array de caminhos absolutos para monitorar eventos [FileChanged](#filechanged) durante esta sessão |1007| `watchPaths` | Array de caminhos absolutos para monitorar eventos [FileChanged](#filechanged) durante esta sessão |
991| `reloadSkills` | Boolean. Quando `true`, Claude Code re-escaneia os diretórios [skill](/pt/skills) e comando após os hooks SessionStart completarem, então skills que o hook instalou estão disponíveis na mesma sessão, começando com o primeiro prompt |1008| `reloadSkills` | Boolean. Quando `true`, Claude Code re-escaneia os diretórios [skill](/pt/skills) e comando após os hooks SessionStart completarem, então skills que o hook instalou estão disponíveis na mesma sessão, começando com o primeiro prompt |
1062 Setup1079 Setup
1063</h3>1080</h3>
1064 1081
1065Dispara apenas quando você lança Claude Code com `--init-only`, ou com `--init` ou `--maintenance` em modo de impressão (`-p`). Não dispara na inicialização normal. Use-o para instalação de dependência única ou limpeza agendada que você aciona explicitamente de CI ou scripts, separado da inicialização de sessão normal. Para inicialização por sessão, use [SessionStart](#sessionstart) em vez disso.1082Dispara apenas quando você lança Claude Code com `--init-only`, ou com `--init` ou `--maintenance` em [modo não-interativo](/pt/headless) com a flag `-p`. Não dispara na inicialização normal. Use-o para instalação de dependência única ou limpeza agendada que você aciona explicitamente de CI ou scripts, separado da inicialização de sessão normal. Para inicialização por sessão, use [SessionStart](#sessionstart) em vez disso.
1066 1083
1067O valor do matcher corresponde à flag CLI que acionou o hook:1084O valor do matcher corresponde à flag CLI que acionou o hook:
1068 1085
1071| `init` | `claude --init-only` ou `claude -p --init` |1088| `init` | `claude --init-only` ou `claude -p --init` |
1072| `maintenance` | `claude -p --maintenance` |1089| `maintenance` | `claude -p --maintenance` |
1073 1090
1074`--init-only` executa hooks Setup e hooks SessionStart com o matcher `startup`, depois sai sem iniciar uma conversa. `--init` e `--maintenance` disparam hooks Setup apenas quando combinados com `-p` (modo de impressão); em uma sessão interativa essas duas flags atualmente não disparam hooks Setup.1091`--init-only` executa hooks Setup e hooks SessionStart com o matcher `startup`, depois sai sem iniciar uma conversa. `--init` e `--maintenance` disparam hooks Setup apenas quando combinados com `-p`; em uma sessão interativa essas duas flags atualmente não disparam hooks Setup.
1075 1092
1076Porque Setup não dispara em cada lançamento, um plugin que precisa de uma dependência instalada não pode confiar apenas em Setup. O padrão prático é verificar a dependência no primeiro uso e instalar se ausente, por exemplo um hook ou skill que testa `${CLAUDE_PLUGIN_DATA}/node_modules` e executa `npm install` se ausente. Consulte o [diretório de dados persistentes](/pt/plugins-reference#persistent-data-directory) para onde armazenar dependências instaladas.1093Porque Setup não dispara em cada lançamento, um plugin que precisa de uma dependência instalada não pode confiar apenas em Setup. O padrão prático é verificar a dependência no primeiro uso e instalar se ausente, por exemplo um hook ou skill que testa `${CLAUDE_PLUGIN_DATA}/node_modules` e executa `npm install` se ausente. Consulte o [diretório de dados persistentes](/pt/plugins-reference#persistent-data-directory) para onde armazenar dependências instaladas.
1077 1094
1095 Controle de decisão de Setup1112 Controle de decisão de Setup
1096</h4>1113</h4>
1097 1114
1098Hooks Setup não podem bloquear. Na saída de código 2, stderr é mostrado ao usuário; em qualquer outro código de saída não-zero, stderr aparece apenas quando você lança com `--verbose`. Em ambos os casos a execução continua. Para passar informação para o contexto de Claude, retorne `additionalContext` em saída JSON; stdout simples é escrito apenas no log de debug. Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, você pode retornar esses campos específicos do evento:1115Hooks Setup não podem bloquear. Qualquer código de saída não-zero, incluindo 2, superficializa stderr ao usuário como um aviso de `<hook name> hook error`, e a execução continua. Em [modo não-interativo](/pt/headless), a saída do hook aparece apenas quando você lança com `--verbose`.
1116
1117Para passar informação para o contexto de Claude, retorne `additionalContext` em saída JSON; stdout simples é escrito apenas no log de debug. Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, você pode retornar esses campos específicos do evento:
1099 1118
1100| Campo | Descrição |1119| Campo | Descrição |
1101| :------------------ | :-------------------------------------------------------------------------------------- |1120| :------------------ | :-------------------------------------------------------------------------------------- |
1191* **Stdout de texto simples**: qualquer texto não-JSON escrito em stdout é adicionado como contexto1210* **Stdout de texto simples**: qualquer texto não-JSON escrito em stdout é adicionado como contexto
1192* **JSON com `additionalContext`**: use o formato JSON abaixo para mais controle. O campo `additionalContext` é adicionado como contexto1211* **JSON com `additionalContext`**: use o formato JSON abaixo para mais controle. O campo `additionalContext` é adicionado como contexto
1193 1212
1194Stdout simples é mostrado como saída de hook na transcrição. O campo `additionalContext` é adicionado mais discretamente.1213Stdout simples é mostrado como saída de hook na transcrição. O valor `additionalContext` é injetado como um lembrete do sistema que Claude lê sem uma entrada de transcrição visível.
1195 1214
1196Para bloquear um prompt, retorne um objeto JSON com `decision` definido para `"block"`:1215Para bloquear um prompt, retorne um objeto JSON com `decision` definido para `"block"`:
1197 1216
1215}1234}
1216```1235```
1217 1236
1218<Note>
1219 O formato JSON não é obrigatório para casos simples. Para adicionar contexto, você pode imprimir texto simples em stdout com saída 0. Use JSON quando precisar bloquear prompts ou quiser controle mais estruturado.
1220</Note>
1221
1222<h3 id="userpromptexpansion">1237<h3 id="userpromptexpansion">
1223 UserPromptExpansion1238 UserPromptExpansion
1224</h3>1239</h3>
1545Em `PostToolUse`, `tool_response` para uma chamada Agent concluída carrega o texto final do subagente junto com telemetria de uso. Leia esses campos para registrar custo por subagente de um hook:1560Em `PostToolUse`, `tool_response` para uma chamada Agent concluída carrega o texto final do subagente junto com telemetria de uso. Leia esses campos para registrar custo por subagente de um hook:
1546 1561
1547| Campo | Tipo | Exemplo | Descrição |1562| Campo | Tipo | Exemplo | Descrição |
1548| :------------------ | :----- | :---------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- |1563| :------------------ | :----- | :---------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1549| `status` | string | `"completed"` | `"completed"` para chamadas síncronas, `"async_launched"` para `run_in_background: true` |1564| `status` | string | `"completed"` | `"completed"` para subagentes em primeiro plano, `"async_launched"` para subagentes em background. {/* min-version: 2.1.198 */}A partir de v2.1.198, subagentes executam em background por padrão, então um `run_in_background` omitido também produz `"async_launched"` |
1550| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identificador para a execução do subagente |1565| `agentId` | string | `"a4d2c8f1e0b3a297"` | Identificador para a execução do subagente |
1551| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Os blocos de texto final do subagente |1566| `content` | array | `[{"type": "text", "text": "Found 12 endpoints..."}]` | Os blocos de texto final do subagente |
1552| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modelo que o subagente executou, que pode diferir do modelo solicitado. {/* min-version: 2.1.174 */}Requer Claude Code v2.1.174 ou posterior |1567| `resolvedModel` | string | `"claude-sonnet-4-5"` | Modelo que o subagente executou, que pode diferir do modelo solicitado. {/* min-version: 2.1.174 */}Requer Claude Code v2.1.174 ou posterior |
1555| `totalToolUseCount` | number | `7` | Contagem de chamadas de ferramenta que o subagente fez |1570| `totalToolUseCount` | number | `7` | Contagem de chamadas de ferramenta que o subagente fez |
1556| `usage` | object | `{"input_tokens": 8320, ...}` | Divisão de tokens por tipo: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |1571| `usage` | object | `{"input_tokens": 8320, ...}` | Divisão de tokens por tipo: `input_tokens`, `output_tokens`, `cache_creation_input_tokens`, `cache_read_input_tokens` |
1557 1572
1558Para chamadas `run_in_background: true`, a ferramenta retorna imediatamente após lançar o subagente, então `tool_response` não carrega campos de uso. Tem `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` e `resolvedModel` em vez disso.1573Para subagentes em background, a ferramenta retorna imediatamente após lançar, então `tool_response` não carrega campos de uso. Tem `status: "async_launched"`, `agentId`, `description`, `prompt`, `outputFile` e `resolvedModel`.
1559 1574
1560O campo `resolvedModel` nomeia o modelo que o subagente realmente executa, que pode diferir do valor `model` em `tool_input`, como quando `availableModels` ou outra sobrescrita se aplica. Requer Claude Code v2.1.174 ou posterior.1575O campo `resolvedModel` nomeia o modelo que o subagente realmente executa, que pode diferir do valor `model` em `tool_input`, como quando `availableModels` ou outra sobrescrita se aplica. Requer Claude Code v2.1.174 ou posterior.
1561 1576
1593Hooks `PreToolUse` podem controlar se uma chamada de ferramenta prossegue. Diferentemente de outros hooks que usam um campo `decision` de nível superior, PreToolUse retorna sua decisão dentro de um objeto `hookSpecificOutput`. Isso oferece controle mais rico: quatro resultados (permitir, negar, pedir ou adiar) além da capacidade de modificar entrada de ferramenta antes da execução.1608Hooks `PreToolUse` podem controlar se uma chamada de ferramenta prossegue. Diferentemente de outros hooks que usam um campo `decision` de nível superior, PreToolUse retorna sua decisão dentro de um objeto `hookSpecificOutput`. Isso oferece controle mais rico: quatro resultados (permitir, negar, pedir ou adiar) além da capacidade de modificar entrada de ferramenta antes da execução.
1594 1609
1595| Campo | Descrição |1610| Campo | Descrição |
1596| :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |1611| :------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
1597| `permissionDecision` | `"allow"` ignora o prompt de permissão. `"deny"` previne a chamada da ferramenta. `"ask"` solicita ao usuário confirmar. `"defer"` sai graciosamente para que a ferramenta possa ser retomada mais tarde. [Regras de negação e pergunta](/pt/permissions#manage-permissions) ainda se aplicam independentemente do que o hook retorna |1612| `permissionDecision` | `"allow"` ignora o prompt de permissão, exceto para [ferramentas que requerem interação do usuário](#pretooluse-decision-control). `"deny"` previne a chamada da ferramenta. `"ask"` solicita ao usuário confirmar. `"defer"` sai graciosamente para que a ferramenta possa ser retomada mais tarde. [Regras de negação e pergunta](/pt/permissions#manage-permissions) ainda são avaliadas independentemente do que o hook retorna |
1598| `permissionDecisionReason` | Para `"allow"` e `"ask"`, mostrado ao usuário mas não ao Claude. Para `"deny"`, mostrado ao Claude. Para `"defer"`, ignorado |1613| `permissionDecisionReason` | Para `"allow"` e `"ask"`, mostrado ao usuário mas não ao Claude. Para `"deny"`, mostrado ao Claude. Para `"defer"`, ignorado |
1599| `updatedInput` | Modifica os parâmetros de entrada da ferramenta antes da execução. Substitui o objeto de entrada inteiro, então inclua campos inalterados junto com os modificados. Combine com `"allow"` para aprovação automática ou `"ask"` para mostrar a entrada modificada ao usuário. Para `"defer"`, ignorado |1614| `updatedInput` | Modifica os parâmetros de entrada da ferramenta antes da execução. Substitui o objeto de entrada inteiro, então inclua campos inalterados junto com os modificados. Combine com `"allow"` para aprovação automática ou `"ask"` para mostrar a entrada modificada ao usuário. Para `"defer"`, ignorado |
1600| `additionalContext` | String adicionada ao contexto de Claude junto com o resultado da ferramenta. Para `"defer"`, ignorado. Consulte [Adicionar contexto para Claude](#add-context-for-claude) |1615| `additionalContext` | String adicionada ao contexto de Claude junto com o resultado da ferramenta. Para `"defer"`, ignorado. Consulte [Adicionar contexto para Claude](#add-context-for-claude) |
1619 1634
1620`AskUserQuestion` e `ExitPlanMode` requerem interação do usuário e normalmente bloqueiam em [modo não-interativo](/pt/headless) com a flag `-p`. Retornar `permissionDecision: "allow"` junto com `updatedInput` satisfaz esse requisito: o hook lê a entrada da ferramenta de stdin, coleta a resposta através de sua própria UI e a retorna em `updatedInput` para que a ferramenta execute sem solicitar. Retornar `"allow"` sozinho não é suficiente para essas ferramentas. Para `AskUserQuestion`, ecoar de volta o array `questions` original e adicionar um objeto [`answers`](#askuserquestion) mapeando o texto de cada pergunta para a resposta escolhida.1635`AskUserQuestion` e `ExitPlanMode` requerem interação do usuário e normalmente bloqueiam em [modo não-interativo](/pt/headless) com a flag `-p`. Retornar `permissionDecision: "allow"` junto com `updatedInput` satisfaz esse requisito: o hook lê a entrada da ferramenta de stdin, coleta a resposta através de sua própria UI e a retorna em `updatedInput` para que a ferramenta execute sem solicitar. Retornar `"allow"` sozinho não é suficiente para essas ferramentas. Para `AskUserQuestion`, ecoar de volta o array `questions` original e adicionar um objeto [`answers`](#askuserquestion) mapeando o texto de cada pergunta para a resposta escolhida.
1621 1636
1637A partir de v2.1.199, uma ferramenta MCP cujo servidor a marca com [`_meta["anthropic/requiresUserInteraction"]`](/pt/mcp#require-approval-for-a-specific-tool) é mais rigorosa: um hook não pode pular seu prompt de aprovação com `"allow"`, com ou sem `updatedInput`, porque Claude Code não pode confirmar que o hook coletou a interação que a ferramenta precisa.
1638
1622<Note>1639<Note>
1623 PreToolUse anteriormente usava campos `decision` e `reason` de nível superior, mas esses estão deprecados para este evento. Use `hookSpecificOutput.permissionDecision` e `hookSpecificOutput.permissionDecisionReason` em vez disso. Os valores deprecados `"approve"` e `"block"` mapeiam para `"allow"` e `"deny"` respectivamente. Outros eventos como PostToolUse e Stop continuam usando `decision` e `reason` de nível superior como seu formato atual.1640 PreToolUse anteriormente usava campos `decision` e `reason` de nível superior, mas esses estão deprecados para este evento. Use `hookSpecificOutput.permissionDecision` e `hookSpecificOutput.permissionDecisionReason` em vez disso. Os valores deprecados `"approve"` e `"block"` mapeiam para `"allow"` e `"deny"` respectivamente. Outros eventos como PostToolUse e Stop continuam usando `decision` e `reason` de nível superior como seu formato atual.
1624</Note>1641</Note>
2016 Notification2033 Notification
2017</h3>2034</h3>
2018 2035
2019Executa quando Claude Code envia notificações. Corresponde no tipo de notificação: `permission_prompt`, `idle_prompt`, `auth_success`, `elicitation_dialog`, `elicitation_complete`, `elicitation_response`. Omita o matcher para executar hooks para todos os tipos de notificação.2036Executa quando Claude Code envia notificações. Corresponde no tipo de notificação. Omita o matcher para executar hooks para todos os tipos de notificação.
2037
2038| Matcher | Quando dispara |
2039| :--------------------- | :------------------------------------------------------------------------------------------------------------------------------------- |
2040| `permission_prompt` | Claude precisa que você aprove um uso de ferramenta |
2041| `idle_prompt` | Claude está feito e esperando seu próximo prompt |
2042| `auth_success` | Autenticação é concluída |
2043| `elicitation_dialog` | Um servidor MCP abre um formulário de elicitação |
2044| `elicitation_complete` | Um formulário de elicitação MCP é submetido ou descartado |
2045| `elicitation_response` | Uma resposta de elicitação MCP é enviada de volta ao servidor |
2046| `agent_needs_input` | Uma sessão em background começa esperando sua entrada. Dispara apenas enquanto [agent view](/pt/agent-view) está aberto em um terminal |
2047| `agent_completed` | Uma sessão em background termina ou falha. Dispara apenas enquanto [agent view](/pt/agent-view) está aberto em um terminal |
2048
2049Os tipos `agent_needs_input` e `agent_completed` requerem Claude Code v2.1.198 ou posterior.
2020 2050
2021Use matchers separados para executar diferentes manipuladores dependendo do tipo de notificação. Esta configuração aciona um script de alerta específico de permissão quando Claude precisa de aprovação de permissão e uma notificação diferente quando Claude está ocioso:2051Use matchers separados para executar diferentes manipuladores dependendo do tipo de notificação. Esta configuração aciona um script de alerta específico de permissão quando Claude precisa de aprovação de permissão e uma notificação diferente quando Claude está ocioso:
2022 2052
2079 Entrada de SubagentStart2109 Entrada de SubagentStart
2080</h4>2110</h4>
2081 2111
2082Além dos [campos de entrada comuns](#common-input-fields), hooks SubagentStart recebem `agent_id` com o identificador único para o subagente e `agent_type` com o nome do agente (agentes integrados como `"general-purpose"`, `"Explore"`, `"Plan"` ou nomes de agentes personalizados).2112Além dos [campos de entrada comuns](#common-input-fields), hooks SubagentStart recebem `agent_id` com o identificador único para o subagente e `agent_type` com o nome do agente que o matcher filtra.
2083 2113
2084```json theme={null}2114```json theme={null}
2085{2115{
2561Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, hooks CwdChanged podem retornar `watchPaths` para definir dinamicamente quais caminhos de arquivo [FileChanged](#filechanged) monitora:2591Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, hooks CwdChanged podem retornar `watchPaths` para definir dinamicamente quais caminhos de arquivo [FileChanged](#filechanged) monitora:
2562 2592
2563| Campo | Descrição |2593| Campo | Descrição |
2564| :----------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |2594| :----------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2565| `watchPaths` | Array de caminhos absolutos. Substitui a lista de monitoramento dinâmica atual (caminhos de sua configuração `matcher` são sempre monitorados). Retornar um array vazio limpa a lista dinâmica, que é típico ao entrar em um novo diretório |2595| `watchPaths` | Array de caminhos absolutos. Substitui a lista de monitoramento dinâmica atual. Caminhos de sua configuração `matcher` são sempre monitorados. Retornar um array vazio limpa a lista dinâmica, que é típico ao entrar em um novo diretório |
2566 2596
2567Hooks CwdChanged não têm controle de decisão. Eles não podem bloquear a mudança de diretório.2597Hooks CwdChanged não têm controle de decisão. Eles não podem bloquear a mudança de diretório.
2568 2598
2586Além dos [campos de entrada comuns](#common-input-fields), hooks FileChanged recebem `file_path` e `event`.2616Além dos [campos de entrada comuns](#common-input-fields), hooks FileChanged recebem `file_path` e `event`.
2587 2617
2588| Campo | Descrição |2618| Campo | Descrição |
2589| :---------- | :---------------------------------------------------------------------------------------------------------- |2619| :---------- | :---------------------------------------------------------------------------------------------------------------------------- |
2590| `file_path` | Caminho absoluto para o arquivo que mudou |2620| `file_path` | Caminho absoluto para o arquivo que mudou |
2591| `event` | O que aconteceu: `"change"` (arquivo modificado), `"add"` (arquivo criado) ou `"unlink"` (arquivo deletado) |2621| `event` | O que aconteceu: `"change"` para um arquivo modificado, `"add"` para um arquivo criado ou `"unlink"` para um arquivo deletado |
2592 2622
2593```json theme={null}2623```json theme={null}
2594{2624{
2608Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, hooks FileChanged podem retornar `watchPaths` para atualizar dinamicamente quais caminhos de arquivo são monitorados:2638Além dos [campos de saída JSON](#json-output) disponíveis para todos os hooks, hooks FileChanged podem retornar `watchPaths` para atualizar dinamicamente quais caminhos de arquivo são monitorados:
2609 2639
2610| Campo | Descrição |2640| Campo | Descrição |
2611| :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |2641| :----------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
2612| `watchPaths` | Array de caminhos absolutos. Substitui a lista de monitoramento dinâmica atual (caminhos de sua configuração `matcher` são sempre monitorados). Use isso quando seu script de hook descobre arquivos adicionais para monitorar baseado no arquivo alterado |2642| `watchPaths` | Array de caminhos absolutos. Substitui a lista de monitoramento dinâmica atual. Caminhos de sua configuração `matcher` são sempre monitorados. Use isso quando seu script de hook descobre arquivos adicionais para monitorar baseado no arquivo alterado |
2613 2643
2614Hooks FileChanged não têm controle de decisão. Eles não podem bloquear a mudança de arquivo de ocorrer.2644Hooks FileChanged não têm controle de decisão. Eles não podem bloquear a mudança de arquivo de ocorrer.
2615 2645
2617 WorktreeCreate2647 WorktreeCreate
2618</h3>2648</h3>
2619 2649
2620Quando você executa `claude --worktree` ou um [subagente usa `isolation: "worktree"`](/pt/sub-agents#choose-the-subagent-scope), Claude Code cria uma cópia de trabalho isolada usando `git worktree`. Se você configurar um hook WorktreeCreate, ele substitui o comportamento git padrão, permitindo que você use um sistema de controle de versão diferente como SVN, Perforce ou Mercurial.2650Executa quando um worktree está sendo criado, seja de `claude --worktree` ou de um [subagente usando `isolation: "worktree"`](/pt/sub-agents#choose-the-subagent-scope). Por padrão Claude Code cria a cópia de trabalho isolada com `git worktree`. Configurar um hook WorktreeCreate substitui esse comportamento git padrão, permitindo que você use um sistema de controle de versão diferente como SVN, Perforce ou Mercurial.
2621 2651
2622Porque o hook substitui o comportamento padrão inteiramente, [`.worktreeinclude`](/pt/worktrees#copy-gitignored-files-into-worktrees) não é processado. Se você precisar copiar arquivos de configuração local como `.env` para o novo worktree, faça isso dentro de seu script de hook.2652Porque o hook substitui o comportamento padrão inteiramente, [`.worktreeinclude`](/pt/worktrees#copy-gitignored-files-into-worktrees) não é processado. Se você precisar copiar arquivos de configuração local como `.env` para o novo worktree, faça isso dentro de seu script de hook.
2623 2653
2648 Entrada de WorktreeCreate2678 Entrada de WorktreeCreate
2649</h4>2679</h4>
2650 2680
2651Além dos [campos de entrada comuns](#common-input-fields), hooks WorktreeCreate recebem o campo `name`. Este é um identificador slug para o novo worktree, especificado pelo usuário ou auto-gerado (por exemplo, `bold-oak-a3f2`).2681Além dos [campos de entrada comuns](#common-input-fields), hooks WorktreeCreate recebem o campo `name`. Este é um identificador slug para o novo worktree, especificado pelo usuário ou auto-gerado, por exemplo `bold-oak-a3f2`.
2652 2682
2653```json theme={null}2683```json theme={null}
2654{2684{
2675 WorktreeRemove2705 WorktreeRemove
2676</h3>2706</h3>
2677 2707
2678A contraparte de limpeza para [WorktreeCreate](#worktreecreate). Este hook dispara quando um worktree está sendo removido, seja quando você sai de uma sessão `--worktree` e escolhe removê-lo, ou quando um subagente com `isolation: "worktree"` termina. Para worktrees baseados em git, Claude lida com limpeza automaticamente com `git worktree remove`. Se você configurou um hook WorktreeCreate para um sistema de controle de versão não-git, emparelhe-o com um hook WorktreeRemove para lidar com limpeza. Sem um, o diretório worktree é deixado no disco.2708Executa quando um worktree está sendo removido, seja quando você sai de uma sessão `--worktree` e escolhe removê-lo, ou quando um subagente com `isolation: "worktree"` termina. Esta é a contraparte de limpeza para [WorktreeCreate](#worktreecreate).
2709
2710Para worktrees baseados em git, Claude Code lida com limpeza automaticamente com `git worktree remove`. Se você configurou um hook WorktreeCreate para um sistema de controle de versão não-git, emparelhe-o com um hook WorktreeRemove para lidar com limpeza. Sem um, o diretório worktree é deixado no disco.
2679 2711
2680Claude Code passa o caminho que WorktreeCreate retornou como `worktree_path` na entrada do hook. Este exemplo lê esse caminho e remove o diretório:2712Claude Code passa o caminho que WorktreeCreate retornou como `worktree_path` na entrada do hook. Este exemplo lê esse caminho e remove o diretório:
2681 2713
3064 3096
3065Se você precisar de controle mais fino em qualquer evento, use um [hook de comando](#command-hook-fields) com os campos por evento descritos em [Controle de decisão](#decision-control).3097Se você precisar de controle mais fino em qualquer evento, use um [hook de comando](#command-hook-fields) com os campos por evento descritos em [Controle de decisão](#decision-control).
3066 3098
3067<h3 id="example-multi-criteria-stop-hook">3099<h3 id="check-multiple-conditions-before-stopping">
3068 Exemplo: Hook Stop com múltiplos critérios3100 Verificar múltiplas condições antes de parar
3069</h3>3101</h3>
3070 3102
3071Este hook `Stop` usa um prompt detalhado para verificar três condições antes de permitir que Claude pare. Se `"ok"` for `false`, Claude continua trabalhando com a razão fornecida como sua próxima instrução. Hooks `SubagentStop` usam o mesmo formato para avaliar se um [subagente](/pt/sub-agents) deve parar:3103Este hook `Stop` usa um prompt detalhado para verificar três condições antes de permitir que Claude pare. Hooks `SubagentStop` usam o mesmo formato para avaliar se um [subagente](/pt/sub-agents) deve parar. Se `"ok"` for `false`, Claude continua trabalhando com a razão fornecida como sua próxima instrução:
3072 3104
3073```json theme={null}3105```json theme={null}
3074{3106{
3192 3224
3193Notificações de conclusão de hook assíncrono são suprimidas por padrão. Para vê-las, ative modo verbose com `Ctrl+O` ou inicie Claude Code com `--verbose`.3225Notificações de conclusão de hook assíncrono são suprimidas por padrão. Para vê-las, ative modo verbose com `Ctrl+O` ou inicie Claude Code com `--verbose`.
3194 3226
3195<h3 id="example-run-tests-after-file-changes">3227<h3 id="run-tests-after-file-changes">
3196 Exemplo: executar testes após mudanças de arquivo3228 Executar testes após mudanças de arquivo
3197</h3>3229</h3>
3198 3230
3199Este hook inicia uma suite de testes em background sempre que Claude escreve um arquivo, então relata os resultados de volta ao Claude quando os testes terminam. Salve este script em `.claude/hooks/run-tests-async.sh` em seu projeto e torne-o executável com `chmod +x`:3231Este hook inicia uma suite de testes em background sempre que Claude escreve um arquivo, então relata os resultados de volta ao Claude quando os testes terminam. Salve este script em `.claude/hooks/run-tests-async.sh` em seu projeto e torne-o executável com `chmod +x`:
3287 Ferramenta Windows PowerShell3319 Ferramenta Windows PowerShell
3288</h2>3320</h2>
3289 3321
3290No Windows, você pode executar hooks individuais em PowerShell definindo `"shell": "powershell"` em um hook de comando. Hooks geram PowerShell diretamente, então isso funciona independentemente de `CLAUDE_CODE_USE_POWERSHELL_TOOL` estar definido. Claude Code auto-detecta `pwsh.exe` (PowerShell 7+) com fallback para `powershell.exe` (5.1).3322No Windows, você pode executar hooks individuais em PowerShell definindo `"shell": "powershell"` em um hook de comando. Hooks geram PowerShell diretamente, então isso funciona independentemente de `CLAUDE_CODE_USE_POWERSHELL_TOOL` estar definido. Claude Code auto-detecta `pwsh.exe`, o executável do PowerShell 7 e posterior, e volta para `powershell.exe` para Windows PowerShell 5.1.
3291 3323
3292```json theme={null}3324```json theme={null}
3293{3325{
3308}3340}
3309```3341```
3310 3342
3311Para referenciar o diretório raiz do projeto a partir de um comando em forma de shell do PowerShell, leia-o como uma variável de ambiente com `$env:CLAUDE_PROJECT_DIR`. PowerShell trata a forma nua `${CLAUDE_PROJECT_DIR}` como uma variável local, não como uma busca de ambiente, e Claude Code substitui esse espaço reservado em forma de shell apenas para [hooks de plugin](#reference-scripts-by-path). Para um hook definido em `settings.json`, use a forma `$env:` ou mude para [forma exec](#exec-form-and-shell-form), onde `${CLAUDE_PROJECT_DIR}` é substituído em cada elemento `args` independentemente de onde o hook está definido.3343Para referenciar o diretório raiz do projeto a partir de um comando em forma de shell do PowerShell, escreva `${CLAUDE_PROJECT_DIR}` ou `$env:CLAUDE_PROJECT_DIR`. A partir da v2.1.198, Claude Code reescreve os espaços reservados `${CLAUDE_PROJECT_DIR}`, `${CLAUDE_PLUGIN_ROOT}` e `${CLAUDE_PLUGIN_DATA}` em um comando em forma de shell do PowerShell para a forma `${env:NAME}` do PowerShell, independentemente de o hook estar definido em `settings.json`, um plugin ou uma skill. PowerShell então resolve o valor do ambiente exportado após análise, então o espaço reservado funciona dentro de strings entre aspas duplas, mas não dentro de strings entre aspas simples, onde PowerShell nunca expande variáveis.
3344
3345Antes da v2.1.198, essa reescrita se aplicava apenas a hooks de plugin. Em versões anteriores, um hook `settings.json` precisa da forma `$env:` ou [forma exec](#exec-form-and-shell-form), onde `${CLAUDE_PROJECT_DIR}` é substituído em cada elemento `args` independentemente de onde o hook está definido.
3346
3347Não escreva a forma nua `$CLAUDE_PROJECT_DIR` em um hook do PowerShell. PowerShell a analisa como uma variável local indefinida e a resolve para `$null`, o que deixa o caminho do script sem seu prefixo de diretório raiz do projeto. Claude Code não reescreve essa forma; em vez disso, registra um aviso no [log de depuração](#debug-hooks).
3312 3348
3313O exemplo abaixo mostra um hook `settings.json` que executa um script de projeto com a forma `$env:`:3349O exemplo abaixo mostra um hook `settings.json` que executa um script de projeto com a forma `$env:`, que funciona em todas as versões:
3314 3350
3315```json theme={null}3351```json theme={null}
3316{3352{