Hooks são scripts JavaScript (Node.js) determinísticos executados em eventos específicos do ciclo de vida
de uma sessão de agente. Diferente de instruções (que o agente pode ignorar), hooks
garantem execução — rodam como processos reais, recebem JSON via stdin e
retornam JSON via stdout. Os hooks globais são configurados em hooks/hooks.json e os
agent-scoped ficam no frontmatter de cada agent.
O output do hook comunica uma decisão ao agente. As formas principais são:
permissionDecision (allow/deny/ask) para PreToolUse,
decision: "block" + reason para Stop (força o agente a reconsiderar),
e additionalContext para injetar contexto adicional.
Guarda contra operações git perigosas. Intercepta chamadas a run_in_terminal
que envolvem git commit, git push ou git tag e aplica
regras diferentes para cada uma. Suporta comandos encadeados (;, &&,
||) — cada comando git é avaliado independentemente e a decisão mais restritiva
vence (deny > ask > allow).
-m com mensagem conventional commits (feat, fix, docs, chore, etc.). Se válido → allow. Se inválido ou sem -m → denyask — pede confirmação do usuárioask — pede confirmação do usuáriohookSpecificOutput.permissionDecision com valores "allow", "deny", ou "ask". O campo additionalContext fornece a razão (ex: "Commit message must follow conventional commits pattern").
git commit -m "added stuff" →
hook intercepta, detecta que a mensagem não segue conventional commits → retorna deny com explicação.
O agente reformula para git commit -m "feat: add new feature" → hook retorna allow.
Valida que a tabela de confiança da Phase 2 (skill contextação) tem evidência de ferramentas para cada eixo 🟡 (Médio) ou 🔴 (Baixo). Cross-referencia as ferramentas listadas com o transcript da sessão para confirmar que foram realmente usadas.
| Axis | Confidence | Justification | Tools used |decision: "block" + reason se algum eixo 🟡/🔴 não tem evidência de ferramentas, ou se uma ferramenta listada não aparece no transcript. O agente é forçado a corrigir antes de finalizar.
Lembra o agente de seguir o formato de output correto: Research Summary (para o researcher) ou Validation Report (para o validator). Garante que a entrega sempre inclua as seções obrigatórias definidas no output template de cada agente.
block com reminder sobre o formato obrigatóriostop_hook_active está true, faz exit 0decision: "block" + reason com mensagem: "Verify your output follows the required format: Research Summary (researcher) or Validation Report (validator) with all mandatory sections." O agente revisa seu output antes de entregar.
Captura feedback de skills quando o usuário expressou insatisfação ou correções foram necessárias. Lembra o agente de seguir o Feedback Protocol descrito na skill para criar reviews estruturados — mas somente quando validado pelo usuário, nunca autonomamente.
block com instrução de checagem de feedbackdecision: "block" + reason com instrução completa sobre quando e como capturar feedback. O agente avalia a sessão e, se houve problemas, segue o Feedback Protocol da skill usada para criar o review em .vscode/skill-reviews/.
Lembra o implementor de completar seu checklist de qualidade antes de finalizar: rodar testes, produzir task map (se decisões foram tomadas) e verificar que o quality checklist está satisfeito.
block com 3 perguntas de checkliststop_hook_activedecision: "block" + reason: "Before finishing: 1) Did you run tests? 2) Did you produce a task map (if decisions were made)? 3) Is the quality checklist satisfied?" O agente avalia cada ponto antes de entregar.
Loga decisões de roteamento de sub-agentes. Sempre que um sub-agente é criado, registra o nome e timestamp em stderr para auditoria. Não interfere no fluxo — retorna JSON vazio para permitir a execução normalmente.
agentName do JSON de inputyyyy-MM-dd HH:mm:ss[timestamp] Subagent started: agentName{} — não bloqueia, não injeta contexto{} (JSON vazio) — passthrough completo. O agente não recebe nenhuma instrução adicional. O valor é o log em stderr, útil para debugging e auditoria das decisões de roteamento do orchestrator.
[2026-03-16 14:30:22] Subagent started: researcher em stderr → sub-agente inicia normalmente.
Injeta lições aprendidas relevantes no contexto do agente antes de cada prompt. Faz keyword matching
bilíngue (pt-BR + en) no prompt do user para extrair tags, busca lições em
~/.copilot/lessons/ com frontmatter compatível, e retorna os resumos das top 5 lições
por confidence. O agente pode então usar read_file para acessar detalhes completos.
chatMessage com fallbacks)create, "corrigir"/"fix" → fix)L*.md em ~/.copilot/lessons/, parseia frontmatter YAML via regexconfidence DESC, pega top 5## Resumo de cada lição) com limit de 500 charsdecision: "add" + content com formato: "Lições aprendidas relevantes (tags: X, Y): - [L003] resumo... (confidence: 0.8)". O agente lê o resumo e pode fazer read_file ~/.copilot/lessons/L003-*.md se precisar do registro completo.
modify, hooks → hook encontra L005 com tags [modify, hooks] e confidence 0.8
→ injeta resumo no contexto antes do agente processar o prompt.
Verifica referências a arquivos nas mensagens do assistant contra chamadas reais de ferramentas
no transcript. Analisa apenas a interação atual (do último user.message
em diante), evitando falsos positivos de menções antigas. Implementado em JavaScript — sem
dependências externas.
transcript_path do hook inputuser.message no transcript e analisa só dali em dianteread_file, grep_search, file_search, semantic_search, run_in_terminal, list_dir, create_file, etc.content de assistant.message via regex (absolutos e relativos)block com lista dos paths não verificados (máx. 10)decision: "block" + reason listando os paths mencionados sem verificação prévia: "UNVERIFIED FILE REFERENCES — these paths were mentioned without prior tool verification: [lista]. Verify with tools (read_file, grep_search, list_dir) or mark as assumed." O agente deve verificar cada path com ferramentas ou marcar como assumed.
src/utils/helpers.ts na resposta
sem ter chamado read_file, grep_search ou qualquer tool nesse arquivo →
hook bloqueia e lista o path. O agente então usa read_file para verificar ou marca
explicitamente como "assumed".
Injeta automaticamente contexto de git e projeto no início de cada sessão. Elimina a necessidade
do agente rodar git status, git log ou verificar package.json
manualmente — essas informações já estão disponíveis no contexto.
git branch --show-currentgit log --oneline -1git status --porcelaingit log --oneline -5package.json para extrair nome e versão do projetohookSpecificOutput.additionalContext com resumo compacto: "Project: skill-kit@0.6.0 | Branch: main | HEAD: c7b6793 docs: update CHANGELOG | Uncommitted changes: 3 files" seguido dos commits recentes. Máximo 800 chars.
Salva um snapshot do estado da sessão em disco antes da compactação de contexto. Isso permite que o agente recupere detalhes que seriam perdidos durante a compressão — arquivos editados, comandos executados, decisões tomadas e itens pendentes.
user.messagetool.execution_start com tools de arquivorun_in_terminal (primeiros 80 chars, dedup)docs/maps/session-{id}-snapshot.md (max 10KB)hookSpecificOutput.additionalContext: "Session context snapshot saved to docs/maps/session-{id}-snapshot.md. If detail was lost during compaction, read this file to recover state." O agente pode ler o snapshot se precisar de detalhes após compactação.
docs/maps/session-abc123-snapshot.md. Após compactação, o agente pode ler o arquivo para
recuperar detalhes perdidos.