Os ganchos permitem estender e personalizar o comportamento dos agentes executando comandos de shell personalizados em pontos-chave durante a execução do GitHub Copilot agente. Para obter uma visão geral conceitual dos ganchos, incluindo detalhes dos gatilhos disponíveis para os ganchos, consulte Sobre ganchos para GitHub Copilot.
Pré-requisito
Para Windows only: Os exemplos neste artigo usam o PowerShell. Se você estiver usando Windows, deverá ter o PowerShell 7.0 ou posterior instalado e em seu PATH. Você pode verificar sua versão do PowerShell em execução pwsh --version em um terminal. Para instalar o PowerShell, execute winget install Microsoft.PowerShell, em seguida, reinicie o terminal.
Criando um gancho em nível de repositório
-
Crie um novo
NAME.jsonarquivo (em queNAMEdescreve a finalidade do arquivo) na.github/hooks/pasta do repositório. -
No editor de texto, copie e cole o modelo de gancho a seguir. Remova os ganchos que você não planeja usar da
hooksmatriz.JSON { "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } }{ "version": 1, "hooks": { "sessionStart": [...], "sessionEnd": [...], "userPromptSubmitted": [...], "preToolUse": [...], "postToolUse": [...], "errorOccurred": [...] } } -
Configure a sintaxe do gancho nos campos das chaves
bashepowershell, ou referencie diretamente os arquivos de script que você criou.Observação
Inclua uma chave
bash(com um script para Linux e macOS) e uma chavepowershell(para um script para Windows) para permitir que os ganchos sejam executados em todos os três sistemas operacionais. Copilot usa a chave apropriada com base no sistema operacional do usuário.-
Este exemplo executa um script que gera a data de início da sessão para um arquivo de log usando o
sessionStartgancho:JSON "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 } ],"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 } ], -
Este exemplo chama um script externo
log-prompt:JSON "userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],"userPromptSubmitted": [ { "type": "command", "bash": "./scripts/log-prompt.sh", "powershell": "./scripts/log-prompt.ps1", "cwd": "scripts", "env": { "LOG_LEVEL": "INFO" } } ],Para obter uma referência completa do JSON de entrada das sessões de agente, juntamente com scripts de exemplo, consulte Referência dos hooks do GitHub Copilot.
-
-
Confirme o arquivo no repositório e faça a mesclagem na ramificação padrão. Agora, os ganchos serão executados durante as sessões do agente.
Criando um hook de nível de usuário
Os ganchos no nível do usuário são configurados como ganchos no nível do repositório, mas os arquivos de gancho são armazenados localmente, abaixo do diretório base.
Os exemplos a seguir para macOS e Windows mostram como configurar ganchos que reproduzirão um som e exibirão uma caixa de mensagem quando a CLI terminar de responder a um prompt e quando você sair CLI do Copilot. Os ganchos para Linux seriam semelhantes ao exemplo do macOS, mas usariam ferramentas do Linux para reproduzir sons e exibir mensagens.
Exemplo de nível de usuário para macOS
-
Crie um arquivo chamado
notification-hooks.jsonem~/.copilot/hooks/.Observação
Se
COPILOT_HOMEestiver definido, crie o arquivo em$COPILOT_HOME/hooks/. -
Copie e cole o seguinte JSON no arquivo:
JSON { "version": 1, "hooks": { "agentStop": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Agent stopped.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Session ended.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ] } }{ "version": 1, "hooks": { "agentStop": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Agent stopped.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "bash": "osascript -e 'do shell script \"afplay /System/Library/Sounds/Funk.aiff &> /dev/null &\"' -e 'display dialog \"Session ended.\" with title \"Hook-generated message\" buttons {\"OK\"} default button \"OK\"'", "timeoutSec": 5 } ] } } -
Iniciar ou reiniciar. CLI do Copilot
Observação
As alterações nas configurações de gancho são carregadas quando a CLI é iniciada.
-
Insira um prompt e verifique se você ouve um som e vê uma caixa de mensagem quando o agente termina de responder e quando você sai da CLI.
-
Exclua o
notification-hooks.jsonarquivo para remover esses ganchos.
Exemplo de nível de usuário para Windows
-
Crie um arquivo chamado
notification-hooks.jsonem%USERPROFILE%\.copilot\hooks\.Observação
Se
COPILOT_HOMEestiver definido, crie o arquivo em%COPILOT_HOME%\hooks\. -
Copie e cole o seguinte JSON no arquivo:
JSON { "version": 1, "hooks": { "agentStop": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Agent stopped.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Session ended.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ] } }{ "version": 1, "hooks": { "agentStop": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Agent stopped.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ], "sessionEnd": [ { "type": "command", "powershell": "Add-Type -AssemblyName System.Windows.Forms; [System.Media.SystemSounds]::Asterisk.Play(); [System.Windows.Forms.MessageBox]::Show('Session ended.', 'Hook-generated message') | Out-Null", "timeoutSec": 5 } ] } } -
Iniciar ou reiniciar. CLI do Copilot
Observação
As alterações nas configurações de gancho são carregadas quando a CLI é iniciada.
-
Insira um prompt e verifique se você ouve um som e vê uma caixa de mensagem quando o agente termina de responder e quando você sai da CLI.
-
Exclua o
notification-hooks.jsonarquivo para remover esses ganchos.
Resolução de problemas
Se você encontrar problemas ao usar hooks, utilize a tabela a seguir para solucioná-los.
| Questão | Ação |
|---|---|
| Os ganchos não estão sendo executados |
|
| Ganchos estão atingindo o tempo limite |
|
| Saída JSON inválida |
|
Resolução de Erros
Você pode depurar ganchos usando os seguintes métodos:
-
Habilite o log detalhado no script para inspecionar os dados de entrada e rastrear a execução do script.
Shell #!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script
#!/bin/bash set -x # Enable bash debug mode INPUT=$(cat) echo "DEBUG: Received input" >&2 echo "$INPUT" >&2 # ... rest of script -
Teste ganchos localmente canalizando a entrada de teste para o seu gancho para validar seu comportamento.
Shell # Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .# Create test input echo '{"timestamp":1704614400000,"cwd":"/tmp","toolName":"bash","toolArgs":"{\"command\":\"ls\"}"}' | ./my-hook.sh # Check exit code echo $? # Validate output is valid JSON ./my-hook.sh | jq .