Skip to main content

referência de ganchos da CLI GitHub Copilot

Localizar eventos de gancho, formatos de configuração e cargas de entrada para CLI do Copilot.

Ganchos são comandos externos que são executados em pontos de ciclo de vida específicos durante uma sessão, permitindo automação personalizada, controles de segurança e integrações. Os arquivos de configuração de gancho .github/hooks/*.json são carregados automaticamente a partir de seu repositório.

Formato de configuração do gancho

Os arquivos de configuração do gancho usam o formato JSON com a versão 1.

Ganchos de comando

Os ganchos de comando executam scripts de shell e têm suporte em todos os tipos de gancho.

{
  "version": 1,
  "hooks": {
    "preToolUse": [
      {
        "type": "command",
        "bash": "your-bash-command",
        "powershell": "your-powershell-command",
        "cwd": "optional/working/directory",
        "env": { "VAR": "value" },
        "timeoutSec": 30
      }
    ]
  }
}
CampoTipoObrigatórioDescription
bashcadeiaUm dos bash/powershellComando shell para Unix.
cwdcadeiaNoDiretório de trabalho para o comando (relativo à raiz do repositório ou absoluto).
envobjetoNoVariáveis de ambiente a serem definidas (dá suporte à expansão variável).
powershellcadeiaUm dos bash/powershellComando shell para Windows.
timeoutSecnúmeroNoTempo limite em segundos. Padrão: 30.
type"command"SimDeve ser "command".

Ganchos de prompt

Prompt hooks enviam automaticamente o texto como se o usuário tivesse digitado. Elas têm suporte apenas em sessionStart e são acionadas somente para novas sessões interativas. Eles não são acionados na retomada e não são acionados no modo de prompt não interativo (-p). O texto pode ser uma solicitação em linguagem natural ou um comando de barra.

{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "prompt",
        "prompt": "Your prompt text or /slash-command"
      }
    ]
  }
}
CampoTipoObrigatórioDescription
type"prompt"SimDeve ser "prompt".
promptcadeiaSimO texto a ser enviada pode ser uma mensagem de linguagem natural ou um comando de barra.

Eventos de intercepção

EventAcionado quandoA saída foi processada
agentStopO agente principal conclui um turno.Sim – pode bloquear e forçar a continuação.
errorOccurredOcorre um erro durante a execução.No
notificationÉ acionado de forma assíncrona quando a CLI emite uma notificação do sistema (conclusão do shell, conclusão do agente ou estado ocioso, prompts de permissão, caixas de diálogo para elicitação). Disparar e esquecer: nunca bloqueia a sessão.
          `matcher` Dá suporte ao regex em `notification_type`. | Opcional – pode injetar `additionalContext` na sessão. |

| permissionRequest | É acionado antes que o serviço de permissão seja executado (mecanismo de regras, aprovações de sessão, permissão automática/negação automática e solicitação do usuário). Se a saída do gancho mesclado retornar behavior: "allow" ou "deny", essa decisão interrompe o fluxo de permissão normal. matcher Dá suporte ao regex em toolName. | Sim – pode permitir ou negar programaticamente. | | postToolUse | Depois que cada ferramenta for executada com sucesso. | Sim — pode substituir o resultado bem-sucedido (somente ganchos programáticos do SDK). | | postToolUseFailure | Depois que uma ferramenta termina com falha. | Sim – pode fornecer diretrizes de recuperação por meio de additionalContext (código de saída 2 para hooks de comando). | | preCompact | A compactação de contexto está prestes a começar (manual ou automática). matcher Dá suporte para filtrar por gatilho ("manual" ou "auto"). | Não — somente notificação. | | preToolUse | Antes de executar cada ferramenta. | Sim — pode permitir, negar ou modificar. | | sessionEnd | A sessão é encerrada. | No | | sessionStart | Uma sessão nova ou retomada começa. | No | | subagentStart | Um subagente é gerado (antes de ser executado). Retorna additionalContext prefixado ao prompt do subagente. matcher Dá suporte para filtrar pelo nome do agente. | Não — não é possível bloquear a criação. | | subagentStop | Um subagente completa. | Sim – pode bloquear e forçar a continuação. | | userPromptSubmitted | O usuário envia um prompt. | No |

Cargas de entrada de evento do gancho

Cada evento de gancho fornece uma carga JSON para o manipulador de gancho. Há suporte para dois formatos de conteúdo, selecionados pelo nome do evento usado na configuração do gancho:

  • formato camelCase — Configure o nome do evento em camelCase (por exemplo, sessionStart). Os campos usam camelCase (formato de nomenclatura onde a primeira palavra é minúscula e as subsequentes começam com letra maiúscula).

          VS Code Formato compatível** — configure o nome do evento em PascalCase (por exemplo, `SessionStart`). Os campos usam snake_case para corresponder ao formato de extensão VS CodeCopilot.

sessionStart / SessionStart

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;      // Unix timestamp in milliseconds
    cwd: string;
    source: "startup" | "resume" | "new";
    initialPrompt?: string;
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "SessionStart";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    source: "startup" | "resume" | "new";
    initial_prompt?: string;
}

sessionEnd / SessionEnd

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "SessionEnd";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    reason: "complete" | "error" | "abort" | "timeout" | "user_exit";
}

userPromptSubmitted / UserPromptSubmit

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    prompt: string;
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "UserPromptSubmit";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    prompt: string;
}

preToolUse / PreToolUse

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
}
          **
          VS Code entrada compatível:**

Quando configurado com o nome do evento PreToolUse PascalCase, o conteúdo usa nomes de campo em snake_case para corresponder ao formato de extensão VS CodeCopilot.

{
    hook_event_name: "PreToolUse";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;    // Tool arguments (parsed from JSON string when possible)
}

postToolUse / PostToolUse

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
    toolResult: {
        resultType: "success";
        textResultForLlm: string;
    }
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "PostToolUse";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;
    tool_result: {
        result_type: "success" | "failure" | "denied" | "error";
        text_result_for_llm: string;
    }
}

postToolUseFailure / PostToolUseFailure

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    toolName: string;
    toolArgs: unknown;
    error: string;
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "PostToolUseFailure";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    tool_name: string;
    tool_input: unknown;
    error: string;
}

agentStop / Stop

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    stopReason: "end_turn";
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "Stop";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    stop_reason: "end_turn";
}

subagentStart

          **Entrada:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    agentName: string;
    agentDisplayName?: string;
    agentDescription?: string;
}

subagentStop / SubagentStop

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    agentName: string;
    agentDisplayName?: string;
    stopReason: "end_turn";
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "SubagentStop";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    agent_name: string;
    agent_display_name?: string;
    stop_reason: "end_turn";
}

errorOccurred / ErrorOccurred

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    error: {
        message: string;
        name: string;
        stack?: string;
    };
    errorContext: "model_call" | "tool_execution" | "system" | "user_input";
    recoverable: boolean;
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "ErrorOccurred";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    error: {
        message: string;
        name: string;
        stack?: string;
    };
    error_context: "model_call" | "tool_execution" | "system" | "user_input";
    recoverable: boolean;
}

preCompact / PreCompact

          **entrada camelCase:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    transcriptPath: string;
    trigger: "manual" | "auto";
    customInstructions: string;
}
          **
          VS Code entrada compatível:**
{
    hook_event_name: "PreCompact";
    session_id: string;
    timestamp: string;      // ISO 8601 timestamp
    cwd: string;
    transcript_path: string;
    trigger: "manual" | "auto";
    custom_instructions: string;
}

          `preToolUse` controle de decisão

O preToolUse gancho pode controlar a execução da ferramenta escrevendo um objeto JSON para stdout.

CampoValoresDescription
permissionDecision
          `"allow"`
          `"deny"`, `"ask"` | Se a ferramenta é executada. A saída vazia usa o comportamento padrão. |

| permissionDecisionReason | cadeia | Motivo mostrado ao agente. Obrigatório quando a decisão é "deny". | | modifiedArgs | objeto | Substitua os argumentos da ferramenta para serem usados no lugar dos originais. |

          `agentStop`
           / 
          `subagentStop` controle de decisão
CampoValoresDescription
decision
          `"block"`, `"allow"` | 
          `"block"` obriga outro agente a fazer um turno usando `reason` como prompt. |

| reason | cadeia | Solicite a próxima rodada quando decision for "block". |

          `permissionRequest` controle de decisão

O permissionRequest gancho é acionado antes da execução do serviço de permissão , antes de verificações de regra, aprovações de sessão, permissão automática/negação automática e solicitação do usuário. Se os ganchos retornarem behavior: "allow" ou "deny", essa decisão causará um curto-circuito no fluxo de permissão normal. O retorno de nada passa pelo tratamento normal de permissões. Use-o para aprovar ou negar chamadas de ferramentas de forma programática, especialmente útil no modo de pipe (-p) e em ambientes de CI onde nenhum prompt interativo está disponível.

Todos os ganchos configurados permissionRequest são executados para cada solicitação (exceto pelos tipos de permissão read e hook, que curto-circuitam antes dos ganchos). As saídas de gancho são mescladas com saídas de gancho posteriores substituindo as anteriores.

          **Matcher:** Regex opcional testado contra `toolName`. Ancorado como `^(?:pattern)$`; deve corresponder ao nome completo da ferramenta. Quando definido, o gancho é acionado apenas para nomes de ferramentas correspondentes.

Para controlar a decisão de permissão, exibir JSON no stdout:

CampoValoresDescription
behavior
          `"allow"`, `"deny"` | Aprovar ou negar a chamada da ferramenta. |

| message | cadeia | Motivo para voltar à LLM ao negar. | | interrupt | boolean | Quando true é combinado com "deny", interrompe totalmente o agente. |

Retornar uma saída vazia ou {} para avançar para o fluxo de permissão normal. Para ganchos de comando, o código 2 de saída é tratado como uma negação; stdout JSON (se houver) é mesclado com {"behavior":"deny"}, e stderr é ignorado.

          `notification` Gancho

O notification gancho é acionado de forma assíncrona quando a CLI emite uma notificação do sistema. Esses ganchos são "fire-and-forget" (disparar e esquecer): eles nunca bloqueiam a sessão, e quaisquer erros são registrados no log e ignorados.

          **Entrada:**
{
    sessionId: string;
    timestamp: number;
    cwd: string;
    hook_event_name: "Notification";
    message: string;           // Human-readable notification text
    title?: string;            // Short title (e.g., "Permission needed", "Shell completed")
    notification_type: string; // One of the types listed below
}
          **Tipos de notificação:**
TipoQuando é acionado
shell_completedUm comando de shell em segundo plano (assíncrono) termina
shell_detached_completedUma sessão de shell desconectada é concluída
agent_completedUm subagente em execução em segundo plano é finalizado (completo ou com falha)
agent_idleUm agente em segundo plano conclui um ciclo e entra em modo inativo (aguardando write_agent)
permission_promptO agente solicita permissão para executar uma ferramenta
elicitation_dialogO agente solicita informações adicionais do usuário
          **Saída:**
{
    additionalContext?: string; // Injected into the session as a user message
}

Se additionalContext for retornado, o texto será injetado na sessão como uma mensagem de usuário prefixada. Isso pode disparar um processamento adicional do agente se a sessão estiver ociosa. Retornar {} ou esvaziar a saída para não executar nenhuma ação.

          **Matcher:** Regex opcional em `notification_type`. O padrão é ancorado como `^(?:pattern)$`. Omita `matcher` para receber todos os tipos de notificação.

Nomes de ferramentas para correspondência de hooks

Nome da ferramentaDescription
ask_userFaça uma pergunta esclarecedora ao usuário.
bashExecute comandos de shell (Unix).
createCrie novos arquivos.
editModificar o conteúdo do arquivo.
globLocalizar arquivos por padrão.
grepPesquisar conteúdo do arquivo.
powershellExecute comandos de shell (Windows).
taskExecutar tarefas de subagente.
viewLer o conteúdo do arquivo.
web_fetchRecuperar páginas da Web.

Se vários ganchos do mesmo tipo forem configurados, eles serão executados em ordem. Para preToolUse, se algum gancho retornar "deny", a ferramenta será bloqueada. Para postToolUseFailure ganchos de comando, sair com código 2 faz com que stderr seja retornado como diretriz de recuperação para o assistente. Falhas de gancho (códigos de saída ou tempos limite diferentes de zero) são registradas e ignoradas– elas nunca bloqueiam a execução do agente.

Leitura adicional