# Sobre ganchos para GitHub Copilot

Estenda e personalize GitHub Copilot o comportamento do agente executando comandos de shell personalizados em pontos-chave durante a execução do agente.

## O que são ganchos?

Ganchos são uma maneira de executar comandos de shell personalizados em pontos estratégicos no fluxo de trabalho de um agente, como quando uma sessão do agente é iniciada ou termina, quando você insere um prompt ou quando uma ferramenta é chamada.

Os ganchos recebem informações detalhadas sobre as ações do agente por meio da entrada JSON, habilitando a automação com reconhecimento de contexto. Por exemplo, você pode usar ganchos para:

* Aprovar ou negar execuções de ferramentas programaticamente.
* Use recursos de segurança internos, como verificação secreta, para evitar vazamentos de credenciais.
* Implemente regras de validação personalizadas e log de auditoria para conformidade.

Os ganchos estão disponíveis para uso com:

* **Copilot cloud agent** em GitHub.
* **GitHub Copilot CLI** em seu terminal.

Você define ganchos em arquivos JSON, armazenados em seu repositório em `.github/hooks/*.json`. Elas se aplicam sempre que Copilot os agentes são usados no repositório.
Copilot CLI também dá suporte a ganchos pessoais que você armazena no diretório inicial em `~/.copilot/hooks/*.json`. Elas se aplicam sempre que você usa Copilot CLI.

## Tipos de ganchos

Os seguintes tipos de ganchos estão disponíveis:

* **sessionStart**: Executado quando uma nova sessão de agente começa ou ao retomar uma sessão existente. Pode ser usado para inicializar ambientes, registrar o início de sessões para auditoria, validar o estado do projeto e configurar recursos temporários.
* **sessionEnd**: executado quando a sessão do agente é concluída ou encerrada. Pode ser usado para limpar recursos temporários, gerar e arquivar relatórios e logs de sessão ou enviar notificações sobre a conclusão da sessão.
* **userPromptSubmitted**: Executado quando o usuário envia um prompt para o agente. Pode ser usado para registrar solicitações de usuário para auditoria e análise de uso.
* **preToolUse**: executado antes que o agente use qualquer ferramenta (como `bash`, , `edit`). `view` Esse é o gancho mais poderoso, pois pode **aprovar ou negar execuções de ferramentas**. Use esse gancho para bloquear comandos perigosos, impor políticas de segurança e padrões de codificação, exigir aprovação para operações confidenciais ou uso de ferramentas de log para conformidade.
* **postToolUse**: executado depois que uma ferramenta conclui a execução (com êxito ou falha). Pode ser usado para registrar resultados de execução, acompanhar estatísticas de uso, gerar trilhas de auditoria, monitorar métricas de desempenho e enviar alertas de falha.
* **agentStop**: executado quando o agente principal terminar de responder sua solicitação.
* **subagentStop**: executado quando um subagente encerra, antes de retornar os resultados ao agente pai.
* **errorOccurred**: executado quando ocorre um erro durante a execução do agente. Pode ser usado para registrar erros para depuração, enviar notificações, rastrear padrões de erro e gerar relatórios.

Para ver uma referência completa de tipos de gancho com casos de uso de exemplo, práticas recomendadas e padrões avançados, consulte [Referência de ganchos do GitHub Copilot](/pt/copilot/reference/hooks-reference).

## Formato de configuração do gancho

Você configura ganchos usando um formato JSON especial. O JSON deve conter um `version` campo com um valor `1` e um `hooks` objeto contendo matrizes de definições de gancho.

```json copy
{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "string (optional)",
        "powershell": "string (optional)",
        "cwd": "string (optional)",
        "env": { "KEY": "value" },
        "timeoutSec": 30
      }
    ],
  }
}
```

O objeto hook pode conter as seguintes chaves:

| Property     | Obrigatório            | Description                                                                 |
| ------------ | ---------------------- | --------------------------------------------------------------------------- |
| `type`       | Sim                    | Deve ser `"command"`                                                        |
| `bash`       | Sim (em sistemas Unix) | Caminho para o script bash a ser executado                                  |
| `powershell` | Sim (no Windows)       | Caminho para o script do PowerShell a ser executado                         |
| `cwd`        | Não                    | Diretório de trabalho para o script (relativo à raiz do repositório)        |
| `env`        | Não                    | Variáveis de ambiente adicionais que são mescladas com o ambiente existente |
| `timeoutSec` | Não                    | Tempo máximo de execução em segundos (padrão: 30)                           |

## Arquivo de configuração de gancho de exemplo

Este é um arquivo de configuração de exemplo que reside em `~/.github/hooks/project-hooks.json` em um repositório.

```json copy
{
  "version": 1,
  "hooks": {
    "sessionStart": [
      {
        "type": "command",
        "bash": "echo \"Session started: $(date)\" >> logs/session.log",
        "powershell": "Add-Content -Path logs/session.log -Value \"Session started: $(Get-Date)\"",
        "cwd": ".",
        "timeoutSec": 10
      }
    ],
    "userPromptSubmitted": [
      {
        "type": "command",
        "bash": "./scripts/log-prompt.sh",
        "powershell": "./scripts/log-prompt.ps1",
        "cwd": "scripts",
        "env": {
          "LOG_LEVEL": "INFO"
        }
      }
    ],
    "preToolUse": [
      {
        "type": "command",
        "bash": "./scripts/security-check.sh",
        "powershell": "./scripts/security-check.ps1",
        "cwd": "scripts",
        "timeoutSec": 15
      },
      {
        "type": "command",
        "bash": "./scripts/log-tool-use.sh",
        "powershell": "./scripts/log-tool-use.ps1",
        "cwd": "scripts"
      }
    ],
    "postToolUse": [
      {
        "type": "command",
        "bash": "cat >> logs/tool-results.jsonl",
        "powershell": "$input | Add-Content -Path logs/tool-results.jsonl"
      }
    ],
    "sessionEnd": [
      {
        "type": "command",
        "bash": "./scripts/cleanup.sh",
        "powershell": "./scripts/cleanup.ps1",
        "cwd": "scripts",
        "timeoutSec": 60
      }
    ]
  }
}
```

## Considerações sobre desempenho

Os ganchos são executados de forma síncrona e bloqueiam a execução do agente. Para garantir uma experiência responsiva, tenha em mente as seguintes considerações:

* **Minimizar o tempo de execução**: mantenha o tempo de execução do gancho em menos de 5 segundos, quando possível.
* **Otimizar configurações**: utilize registro em log assíncrono, como adicionar informações a arquivos, em vez de E/S síncrona.
* **Use o processamento em segundo plano**: para operações caras, considere o processamento em segundo plano.
* **Resultados do cache**: armazenar em cache cálculos caros quando possível.

## Considerações de segurança

Para garantir que a segurança seja mantida ao usar ganchos, tenha em mente as seguintes considerações:

* **Valide e higienize sempre a entrada processada pelos ganchos**. A entrada não confiável pode levar a um comportamento inesperado.
* **Use a codificação de escape de shell adequada ao construir comandos**. Isso impede vulnerabilidades de injeção de comando.
* **Nunca registre dados confidenciais, como tokens ou senhas**.
* **Verifique se os scripts e logs de hook têm as permissões apropriadas**.
* **Tenha cuidado com ganchos que fazem chamadas de rede externas**. Elas podem introduzir latência, falhas ou expor dados a terceiros.
* **Defina os tempos limite apropriados para evitar o esgotamento de recursos**. Ganchos de execução longa podem bloquear a execução do agente e prejudicar o desempenho.

## Próximas Etapas 

Para começar a criar ganchos, consulte:

* [Personalizar fluxos de trabalho do agente com ganchos](/pt/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/use-hooks) para Copilot cloud agent
* [Usando ganchos com GitHub Copilot CLI](/pt/copilot/how-tos/copilot-cli/customize-copilot/use-hooks) para GitHub Copilot CLI