Hooks de Ciclo de Vida: Contexto Automatizado e Controle de Qualidade
O Que Você Vai Aprender
- Injetar automaticamente contexto de projeto em agentes de IA (AGENTS.md, README.md)
- Impedir que agentes desistam a meio caminho e force a conclusão de listas TODO
- Truncar automaticamente saídas excessivas para evitar estouro da janela de contexto
- Ativar o modo Ultrawork com um clique para ativar todos os agentes especializados
- Personalizar configurações de hooks e desativar funcionalidades desnecessárias
Seu Dilema Atual
Você já encontrou estes problemas?
- Agentes de IA esquecendo constantemente as convenções do projeto e repetindo erros?
- Agentes parando a meio caminho sem concluir a lista TODO?
- Saídas de busca de código muito grandes, estourando a janela de contexto?
- Tendo que informar manualmente o agente sobre qual modo usar a cada vez?
Quando Usar Esta Abordagem
Hooks de ciclo de vida são adequados para os seguintes cenários:
Cenários Típicos
- Gestão de Contexto de Projeto: Injeção automática de AGENTS.md e README.md
- Controle de Qualidade: Verificação de comentários de código, validação de blocos de pensamento
- Continuidade de Tarefas: Forçar agente a completar todas as tarefas TODO
- Otimização de Performance: Truncamento dinâmico, gestão de janela de contexto
- Automação de Fluxo de Trabalho: Gatilho de modo por palavras-chave, execução automática de comandos
Ideia Central
O Que São Hooks de Ciclo de Vida?
Hooks de ciclo de vida são um mecanismo orientado a eventos que permite inserir lógica personalizada em pontos-chave do trabalho de um agente. Por exemplo: injetar automaticamente documentos de projeto, forçar conclusão de tarefas TODO, truncar saídas excessivas, etc. Estes hooks escutam 4 tipos de eventos: antes da execução de ferramenta, após execução de ferramenta, quando usuário submete prompt, e quando sessão fica ociosa. Através da configuração apropriada de hooks, você pode tornar seus agentes de IA mais inteligentes e mais adequados aos seus hábitos de trabalho.
Hooks vs Middleware
Hooks são muito parecidos com middleware em frameworks web — ambos são mecanismos de "fazer algo específico em momentos específicos". As diferenças são:
- Middleware: Execução linear, pode interromper requisições
- Hooks: Orientado a eventos, não pode interromper, só pode modificar dados
32 Hooks, 7 Categorias
oh-my-opencode fornece 32 hooks embutidos, divididos em 7 categorias:
| Categoria | Número de Hooks | Principal Função |
|---|---|---|
| Injeção de Contexto | 4 | Injetar documentos de projeto e regras automaticamente |
| Produtividade e Controle | 6 | Detecção de palavras-chave, mudança de modo, gestão de loops |
| Qualidade e Segurança | 4 | Verificação de comentários de código, validação de blocos de pensamento |
| Recuperação e Estabilidade | 3 | Recuperação de sessão, tratamento de erros |
| Truncamento e Gestão de Contexto | 2 | Truncamento de saída, monitoramento de janela |
| Notificações e UX | 3 | Atualizações de versão, notificações de tarefas em background, lembretes de ociosidade |
| Gestão de Tarefas | 2 | Resumo de tarefas, retry de delegação |
Tipos de Eventos de Hooks
Hooks escutam os seguintes 4 tipos de eventos:
1. PreToolUse (Antes da Execução de Ferramenta)
Momento de Gatilho: Antes do agente chamar uma ferramenta
O Que Pode Fazer:
- Impedir execução de ferramenta
- Modificar parâmetros da ferramenta
- Injetar contexto
Exemplos de Hooks: comment-checker, directory-agents-injector
2. PostToolUse (Após Execução de Ferramenta)
Momento de Gatilho: Após a conclusão da execução da ferramenta
O Que Pode Fazer:
- Modificar saída da ferramenta
- Adicionar mensagens de aviso
- Injetar instruções subsequentes
Exemplos de Hooks: tool-output-truncator, directory-readme-injector
3. UserPromptSubmit (Quando Usuário Submete Prompt)
Momento de Gatilho: Quando usuário envia mensagem para a sessão
O Que Pode Fazer:
- Impedir submissão (raro)
- Modificar conteúdo do prompt
- Injetar mensagem de sistema
- Ativar modo de trabalho
Exemplos de Hooks: keyword-detector, auto-slash-command
4. Stop (Quando Sessão Está Ociosa)
Momento de Gatilho: Quando agente para de trabalhar e sessão entra em estado ocioso
O Que Pode Fazer:
- Injetar prompts subsequentes
- Enviar notificações
- Verificar estado de tarefas
Exemplos de Hooks: todo-continuation-enforcer, session-notification
Ordem de Execução de Hooks
Hooks são executados em ordem fixa para garantir correção lógica:
Evento UserPromptSubmit
flowchart LR
A[UserPromptSubmit] --> B[keyword-detector]
B --> C[claude-code-hooks]
C --> D[auto-slash-command]
D --> E[start-work]Explicação da Ordem:
keyword-detector: Detecta palavras-chave (ultrawork, search, analyze)claude-code-hooks: Executa hooks da camada de compatibilidade Claude Codeauto-slash-command: Executa automaticamente comandos de barrastart-work: Processa comando/start-work
Evento PreToolUse
flowchart TD
A[PreToolUse] --> B[question-label-truncator]
B --> C[claude-code-hooks]
C --> D[non-interactive-env]
D --> E[comment-checker]
E --> F[directory-agents-injector]
F --> G[directory-readme-injector]
G --> H[rules-injector]
H --> I[prometheus-md-only]
I --> J[isisphus-junior-notepad]
J --> K[atlas]Explicação da Ordem:
question-label-truncator: Trunca rótulos de ferramentasclaude-code-hooks: Camada de compatibilidade Claude Codenon-interactive-env: Processa ambiente não-interativocomment-checker: Verifica comentários de códigodirectory-agents-injector: Injeta AGENTS.mddirectory-readme-injector: Injeta README.mdrules-injector: Injeta regras de projetoprometheus-md-only: Força Prometheus a só saída Markdownsisyphus-junior-notepad: Injeta prompts para Sisyphus Junioratlas: Lógica de orquestração principal Atlas
Evento PostToolUse
flowchart TD
A[PostToolUse] --> B[claude-code-hooks]
B --> C[tool-output-truncator]
C --> D[context-window-monitor]
D --> E[comment-checker]
E --> F[directory-agents-injector]
F --> G[directory-readme-injector]
G --> H[rules-injector]
H --> I[empty-task-response-detector]
I --> J[agent-usage-reminder]
J --> K[category-skill-reminder]
K --> L[interactive-bash-session]
L --> M[edit-error-recovery]
M --> N[delegate-task-retry]
N --> O[atlas]
O --> P[task-resume-info]Explicação da Ordem:
claude-code-hooks: Camada de compatibilidade Claude Codetool-output-truncator: Trunca saída de ferramentacontext-window-monitor: Monitora janela de contextocomment-checker: Verifica comentários de códigodirectory-agents-injector: Injeta AGENTS.mddirectory-readme-injector: Injeta README.mdrules-injector: Injeta regras de projetoempty-task-response-detector: Detecta respostas vaziasagent-usage-reminder: Lembra de usar agentes especializadoscategory-skill-reminder: Lembra de usar Category/Skillinteractive-bash-session: Gerencia sessões Bash interativasedit-error-recovery: Recupera erros de ediçãodelegate-task-retry: Tenta novamente tarefas delegadas falhasatlas: Lógica de orquestração principal Atlastask-resume-info: Fornece informação para resumo de tarefas
Hooks Principais em Detalhe
1. directory-agents-injector (Injeção de AGENTS.md)
Evento de Gatilho: PostToolUse
Funcionalidade: Quando um agente lê um arquivo, automaticamente percorre do diretório do arquivo até a raiz do projeto, coletando todos os arquivos AGENTS.md no caminho e injetando-os no contexto do agente.
Fluxo de Trabalho:
flowchart TD
A[Agente lê arquivo] --> B[Localiza diretório do arquivo]
B --> C[Percorre árvore de diretórios]
C --> D[Encontrou AGENTS.md?]
D -->|Sim| E[Registra caminho]
D -->|Não| F[Chegou na raiz?]
E --> F
F -->|Não| C
F -->|Sim| G[Ordena do mais próximo ao mais distante]
G --> H[Lê conteúdo e injeta]
H --> I[Cache diretórios injetados]Exemplo:
Estrutura de projeto:
project/
├── AGENTS.md # Contexto nível projeto
├── src/
│ ├── AGENTS.md # Contexto nível src
│ └── components/
│ ├── AGENTS.md # Contexto nível components
│ └── Button.tsxQuando o agente lê Button.tsx, automaticamente injeta:
components/AGENTS.md(injetado primeiro)src/AGENTS.mdAGENTS.md(raiz do projeto)
Melhores Práticas
- Crie
AGENTS.mdem cada diretório principal, descrevendo responsabilidades e convenções do diretório - AGENTS.md segue o princípio "do mais próximo ao mais distante", o mais próximo tem prioridade
- Diretórios já injetados são cacheados para evitar injeção repetida
Localização do Código: src/hooks/directory-agents-injector/index.ts (183 linhas)
2. todo-continuation-enforcer (Continuação Forçada de TODO)
Evento de Gatilho: Stop
Funcionalidade: Detecta a lista de TODOs do agente e, se houver TODOs não concluídos, força o agente a continuar trabalhando, evitando que pare a meio caminho.
Fluxo de Trabalho:
stateDiagram-v2
[*] --> SessionIdle: Sessão ociosa
SessionIdle --> CheckTodos: Verificar lista de TODOs
CheckTodos --> HasIncomplete: Tem tarefas incompletas?
CheckTodos --> [*]: Todas concluídas
HasIncomplete --> CheckPermissions: Verificar permissões do agente
CheckPermissions --> HasWritePermission: Tem permissão de escrita?
CheckPermissions --> [*]: Sem permissão, pula
HasWritePermission --> CheckBgTasks: Tem tarefas em background?
HasWritePermission --> [*]: Tem tarefas em background, pula
HasWritePermission --> Countdown: Iniciar contagem regressiva 2s
Countdown --> ShowToast: Mostrar notificação "Resuming in 2s..."
ShowToast --> InjectPrompt: Injetar prompt de continuação
InjectPrompt --> [*]: Agente continua trabalhandoMecanismo de Contagem Regressiva:
- Contagem regressiva padrão de 2 segundos
- Mostra notificação Toast: "Resuming in 2s... (X tasks remaining)"
- Usuário pode cancelar manualmente durante a contagem regressiva
Condições de Pular:
- Agente sem permissão de escrita (agente read-only)
- Agente está na lista de pulo (prometheus, compaction)
- Há tarefas em background em execução
- Sessão está em processo de recuperação
Localização do Código: src/hooks/todo-continuation-enforcer.ts (490 linhas)
3. keyword-detector (Detector de Palavras-chave)
Evento de Gatilho: UserPromptSubmit
Funcionalidade: Detecta palavras-chave nos prompts do usuário e ativa automaticamente o modo correspondente:
| Palavra-chave | Modo Ativado | Descrição |
|---|---|---|
ultrawork / ulw | Modo Máxima Performance | Ativa todos os agentes especializados e tarefas paralelas |
search / find | Modo Exploração Paralela | Inicia explore/librarian em paralelo |
analyze / investigate | Modo Análise Profunda | Ativa exploração profunda e análise |
Exemplo de Uso:
Entrada do usuário:
ultrawork desenvolva uma API REST com autenticação e autorização
Resposta do sistema:
[✅ Modo Ultrawork Ativado]
Precisão máxima engajada. Todos os agentes à sua disposição.Detalhes de Implementação:
- Detecção de palavras-chave suporta variantes (ultrawork = ulw)
- Tratamento diferente para sessão principal e não-principal
- Configuração de modo passada via
message.variantpara o agente - Detecção de palavras-chave não é feita em sessões de tarefas em background
Localização do Código: src/hooks/keyword-detector/index.ts (101 linhas)
4. tool-output-truncator (Truncador de Saída de Ferramenta)
Evento de Gatilho: PostToolUse
Funcionalidade: Trunca dinamicamente saídas de ferramenta excessivas, mantendo 50% de espaço de headroom na janela de contexto, truncando no máximo para 50k tokens.
Ferramentas Suportadas:
const TRUNCATABLE_TOOLS = [
"grep", "Grep", "safe_grep",
"glob", "Glob", "safe_glob",
"lsp_diagnostics",
"ast_grep_search",
"interactive_bash", "Interactive_bash",
"skill_mcp",
"webfetch", "WebFetch",
]Restrições Especiais:
webfetchmáximo 10k tokens (conteúdo web precisa de truncamento mais agressivo)- Outras ferramentas máximo 50k tokens
Estratégia de Truncamento:
- Calcula dinamicamente ponto de truncamento baseado na janela de contexto restante
- Preserva início e fim da saída, meio substituído por reticências
- Adiciona aviso de truncamento:
[Note: Content was truncated to save context window space. For full context, please read file directly: {path}]
Habilitar Truncamento Mais Agressivo
No oh-my-opencode.json configure:
{
"experimental": {
"truncate_all_tool_outputs": true
}
}Isso truncará todas as saídas de ferramenta, não apenas as da lista TRUNCATABLE_TOOLS.
Localização do Código: src/hooks/tool-output-truncator.ts (62 linhas)
5. comment-checker (Verificador de Comentários de Código)
Evento de Gatilho: PreToolUse / PostToolUse
Funcionalidade: Verifica se o agente está escrevendo comentários em excesso, ignorando inteligentemente BDD, instruções e docstrings.
Fluxo de Trabalho:
flowchart LR
A[Antes da ferramenta] --> B[Registra parâmetros]
B --> C[Após execução da ferramenta]
C --> D[Verifica tipo da ferramenta]
D --> E{write/edit?}
E -->|Sim| F[Detecta proporção de comentários]
E -->|Não| G[Pula]
F --> H{Muitos comentários?}
H -->|Sim| I[Injeta lembrete]
H -->|Não| GRegras de Ignorar Inteligente:
- Comentários BDD (Behavior-Driven Development)
- Comentários instrucionais (como
// TODO,// FIXME) - Docstrings
Método de Configuração:
{
"comment_checker": {
"custom_prompt": "seu prompt personalizado"
}
}Localização do Código: src/hooks/comment-checker/index.ts (172 linhas)
Configuração de Hooks
Habilitar/Desabilitar Hooks
No oh-my-opencode.json configure:
{
"disabled_hooks": [
"comment-checker",
"auto-update-checker",
"keyword-detector"
]
}Cenários de Configuração Comuns
Cenário 1: Desabilitar Verificação de Comentários
{
"disabled_hooks": ["comment-checker"]
}Cenário 2: Desabilitar Detecção de Palavras-chave
{
"disabled_hooks": ["keyword-detector"]
}Cenário 3: Desabilitar Continuação Forçada de TODO
{
"disabled_hooks": ["todo-continuation-enforcer"]
}Cenário 4: Habilitar Truncamento Agressivo de Saída
{
"experimental": {
"truncate_all_tool_outputs": true
}
}Resumo da Aula
Esta aula apresentou os 32 hooks de ciclo de vida do oh-my-opencode:
Conceitos Fundamentais:
- Hooks são mecanismos de interceptação orientados a eventos
- 4 tipos de eventos: PreToolUse, PostToolUse, UserPromptSubmit, Stop
- Executam em ordem fixa para garantir correção lógica
Hooks Comuns:
directory-agents-injector: Injeta AGENTS.md automaticamentetodo-continuation-enforcer: Força conclusão da lista TODOkeyword-detector: Detecta palavras-chave e ativa modostool-output-truncator: Trunca saídas dinamicamentecomment-checker: Verifica comentários de código
Métodos de Configuração:
- Desabilitar hooks desnecessários através do array
disabled_hooks - Habilitar funcionalidades experimentais através de
experimental
Próxima Aula
Na próxima aula aprenderemos Comandos de Barra: Fluxos de Trabalho Pré-configurados.
Você aprenderá:
- Como usar os 6 comandos de barra embutidos
/ralph-looppara completar trabalho automaticamente/refactorpara refatoração inteligente/start-workpara executar plano Prometheus- Como criar comandos de barra personalizados
Apêndice: Referência de Código Fonte
Clique para expandir e ver localização do código fonte
Última atualização: 2026-01-26
| Funcionalidade | Caminho do Arquivo | Linhas |
|---|---|---|
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
| --- | --- | --- |
Constantes Principais:
AGENTS_FILENAME = "AGENTS.md": Nome do arquivo de contexto do agente (src/hooks/directory-agents-injector/constants.ts)DEFAULT_MAX_TOKENS = 50_000: Tokens máximos padrão para truncamento (src/hooks/tool-output-truncator.ts)WEBFETCH_MAX_TOKENS = 10_000: Tokens máximos para webfetch (src/hooks/tool-output-truncator.ts)COUNTDOWN_SECONDS = 2: Segundos de contagem regressiva para continuação de TODO (src/hooks/todo-continuation-enforcer.ts)
Funções Principais:
createDirectoryAgentsInjectorHook(ctx): Cria hook de injeção de AGENTS.mdcreateTodoContinuationEnforcer(ctx, options): Cria hook de continuação forçada de TODOcreateKeywordDetectorHook(ctx, collector): Cria hook de detecção de palavras-chavecreateToolOutputTruncatorHook(ctx, options): Cria hook de truncamento de saída de ferramentacreateCommentCheckerHooks(config): Cria hooks de verificação de comentários de código