Skip to content
Back to skills

Hook Development

ASecurity

Esta skill deve ser usada quando o usuário solicita "criar um hook", "adicionar um hook PreToolUse/PostToolUse/Stop", "validar uso de ferramentas", "implementar hooks baseados em prompt", "usar ${CLAUDE_PLUGIN_ROOT}", "configurar automação orientada por eventos", "bloquear comandos perigosos" ou menciona eventos de hook (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Fornece orientação abrangente para criar e implementar hoo...

  • 11 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added September 8, 2026
ai-agentsgobashnodenodejsapisecurity

Works with

  • claude code
  • api
  • mcp

Security analysis

A100/100

Pro scans all 11 files and shows the line behind each finding

Scanned September 8, 2026

npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill hook-development --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Hook Development?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Hook Development
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/artubss-hook-development/badge)](https://www.skillsdirectory.com/skills/artubss-hook-development)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: Desenvolvimento de Hooks
description: Esta skill deve ser usada quando o usuário solicita "criar um hook", "adicionar um hook PreToolUse/PostToolUse/Stop", "validar uso de ferramentas", "implementar hooks baseados em prompt", "usar ${CLAUDE_PLUGIN_ROOT}", "configurar automação orientada por eventos", "bloquear comandos perigosos" ou menciona eventos de hook (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Fornece orientação abrangente para criar e implementar hooks de plugin Claude Code com foco na API avançada de hooks baseados em prompt.
version: 0.1.0
---

# Desenvolvimento de Hooks para Plugins Claude Code

## Visão Geral

Hooks são scripts de automação orientados por eventos que são executados em resposta a eventos do Claude Code. Use hooks para validar operações, aplicar políticas, adicionar contexto e integrar ferramentas externas em workflows.

**Capacidades-chave:**
- Validar chamadas de ferramenta antes da execução (PreToolUse)
- Reagir a resultados de ferramentas (PostToolUse)
- Aplicar padrões de conclusão (Stop, SubagentStop)
- Carregar contexto do projeto (SessionStart)
- Automatizar workflows em todo o ciclo de vida do desenvolvimento

## Tipos de Hooks

### Hooks Baseados em Prompt (Recomendado)

Use tomada de decisão orientada por LLM para validação consciente do contexto:

```json
{
  "type": "prompt",
  "prompt": "Avalie se este uso de ferramenta é apropriado: $TOOL_INPUT",
  "timeout": 30
}
```

**Eventos suportados:** Stop, SubagentStop, UserPromptSubmit, PreToolUse

**Benefícios:**
- Decisões conscientes do contexto baseadas em raciocínio em linguagem natural
- Lógica de avaliação flexível sem scripts bash
- Melhor tratamento de casos extremos
- Mais fácil de manter e estender

### Hooks de Comando

Execute comandos bash para verificações determinísticas:

```json
{
  "type": "command",
  "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh",
  "timeout": 60
}
```

**Use para:**
- Validações rápidas e determinísticas
- Operações do sistema de arquivos
- Integrações com ferramentas externas
- Verificações críticas de desempenho

## Formatos de Configuração de Hooks

### Formato hooks.json de Plugin

**Para hooks de plugin** em `hooks/hooks.json`, use formato com wrapper:

```json
{
  "description": "Breve explicação dos hooks (opcional)",
  "hooks": {
    "PreToolUse": [...],
    "Stop": [...],
    "SessionStart": [...]
  }
}
```

**Pontos-chave:**
- Campo `description` é opcional
- Campo `hooks` é obrigatório como wrapper contendo os eventos reais
- Este é o **formato específico de plugin**

**Exemplo:**
```json
{
  "description": "Hooks de validação para qualidade de código",
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/hooks/validate.sh"
          }
        ]
      }
    ]
  }
}
```

### Formato de Configurações (Direto)

**Para configurações do usuário** em `.claude/settings.json`, use formato direto:

```json
{
  "PreToolUse": [...],
  "Stop": [...],
  "SessionStart": [...]
}
```

**Pontos-chave:**
- Sem wrapper — eventos diretamente no nível superior
- Sem campo description
- Este é o **formato de configurações**

**Importante:** Os exemplos abaixo mostram a estrutura de evento de hook que fica dentro de qualquer formato. Para hooks.json de plugin, envolva esses em `{"hooks": {...}}`.

## Eventos de Hook

### PreToolUse

Execute antes de qualquer ferramenta ser executada. Use para aprovar, negar ou modificar chamadas de ferramenta.

**Exemplo (baseado em prompt):**
```json
{
  "PreToolUse": [
    {
      "matcher": "Write|Edit",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Valide a segurança da escrita de arquivo. Verificar: caminhos de sistema, credenciais, path traversal, conteúdo sensível. Retorne 'approve' ou 'deny'."
        }
      ]
    }
  ]
}
```

**Saída para PreToolUse:**
```json
{
  "hookSpecificOutput": {
    "permissionDecision": "allow|deny|ask",
    "updatedInput": {"field": "modified_value"}
  },
  "systemMessage": "Explicação para Claude"
}
```

### PostToolUse

Execute após a ferramenta ser concluída. Use para reagir a resultados, fornecer feedback ou fazer log.

**Exemplo:**
```json
{
  "PostToolUse": [
    {
      "matcher": "Edit",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Analise o resultado da edição para possíveis problemas: erros de sintaxe, vulnerabilidades de segurança, mudanças que quebram compatibilidade. Forneça feedback."
        }
      ]
    }
  ]
}
```

**Comportamento de saída:**
- Exit 0: stdout mostrado na transcrição
- Exit 2: stderr realimentado para Claude
- systemMessage incluída no contexto

### Stop

Execute quando o agente principal considerar parar. Use para validar completude.

**Exemplo:**
```json
{
  "Stop": [
    {
      "matcher": "*",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Verifique a conclusão da tarefa: testes executados, build bem-sucedido, perguntas respondidas. Retorne 'approve' para parar ou 'block' com motivo para continuar."
        }
      ]
    }
  ]
}
```

**Saída de decisão:**
```json
{
  "decision": "approve|block",
  "reason": "Explicação",
  "systemMessage": "Contexto adicional"
}
```

### SubagentStop

Execute quando um subagente considerar parar. Use para garantir que o subagente completou sua tarefa.

Semelhante ao hook Stop, mas para subagentes.

### UserPromptSubmit

Execute quando o usuário envia um prompt. Use para adicionar contexto, validar ou bloquear prompts.

**Exemplo:**
```json
{
  "UserPromptSubmit": [
    {
      "matcher": "*",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Verifique se o prompt requer orientação de segurança. Se estiver discutindo autenticação, permissões ou segurança de API, retorne avisos relevantes."
        }
      ]
    }
  ]
}
```

### SessionStart

Execute quando uma sessão do Claude Code inicia. Use para carregar contexto e configurar ambiente.

**Exemplo:**
```json
{
  "SessionStart": [
    {
      "matcher": "*",
      "hooks": [
        {
          "type": "command",
          "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh"
        }
      ]
    }
  ]
}
```

**Capacidade especial:** Persistir variáveis de ambiente usando `$CLAUDE_ENV_FILE`:
```bash
echo "export PROJECT_TYPE=nodejs" >> "$CLAUDE_ENV_FILE"
```

Veja `examples/load-context.sh` para exemplo completo.

### SessionEnd

Execute quando a sessão termina. Use para limpeza, logging e preservação de estado.

### PreCompact

Execute antes da compactação de contexto. Use para adicionar informações críticas a preservar.

### Notification

Execute quando Claude envia notificações. Use para reagir a notificações do usuário.

## Formato de Saída de Hook

### Saída Padrão (Todos os Hooks)

```json
{
  "continue": true,
  "suppressOutput": false,
  "systemMessage": "Mensagem para Claude"
}
```

- `continue`: Se false, interrompe o processamento (padrão true)
- `suppressOutput`: Oculta saída da transcrição (padrão false)
- `systemMessage`: Mensagem mostrada para Claude

### Códigos de Saída

- `0` - Sucesso (stdout mostrado na transcrição)
- `2` - Erro de bloqueio (stderr realimentado para Claude)
- Outros - Erro não-bloqueador

## Formato de Entrada de Hook

Todos os hooks recebem JSON via stdin com campos comuns:

```json
{
  "session_id": "abc123",
  "transcript_path": "/path/to/transcript.txt",
  "cwd": "/current/working/dir",
  "permission_mode": "ask|allow",
  "hook_event_name": "PreToolUse"
}
```

**Campos específicos de evento:**

- **PreToolUse/PostToolUse:** `tool_name`, `tool_input`, `tool_result`
- **UserPromptSubmit:** `user_prompt`
- **Stop/SubagentStop:** `reason`

Acesse campos em prompts usando `$TOOL_INPUT`, `$TOOL_RESULT`, `$USER_PROMPT`, etc.

## Variáveis de Ambiente

Disponíveis em todos os hooks de comando:

- `$CLAUDE_PROJECT_DIR` - Caminho raiz do projeto
- `$CLAUDE_PLUGIN_ROOT` - Diretório do plugin (use para caminhos portáveis)
- `$CLAUDE_ENV_FILE` - Somente SessionStart: persistir variáveis de env aqui
- `$CLAUDE_CODE_REMOTE` - Definida se executando em contexto remoto

**Sempre use ${CLAUDE_PLUGIN_ROOT} em comandos de hook para portabilidade:**

```json
{
  "type": "command",
  "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh"
}
```

## Configuração de Hooks de Plugin

Em plugins, defina hooks em `hooks/hooks.json`:

```json
{
  "PreToolUse": [
    {
      "matcher": "Write|Edit",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Valide a segurança da escrita de arquivo"
        }
      ]
    }
  ],
  "Stop": [
    {
      "matcher": "*",
      "hooks": [
        {
          "type": "prompt",
          "prompt": "Verifique a conclusão da tarefa"
        }
      ]
    }
  ],
  "SessionStart": [
    {
      "matcher": "*",
      "hooks": [
        {
          "type": "command",
          "command": "bash ${CLAUDE_PLUGIN_ROOT}/scripts/load-context.sh",
          "timeout": 10
        }
      ]
    }
  ]
}
```

Hooks de plugin se mesclam com hooks do usuário e executam em paralelo.

## Matchers

### Correspondência de Nome de Ferramenta

**Correspondência exata:**
```json
"matcher": "Write"
```

**Múltiplas ferramentas:**
```json
"matcher": "Read|Write|Edit"
```

**Wildcard (todas as ferramentas):**
```json
"matcher": "*"
```

**Padrões Regex:**
```json
"matcher": "mcp__.*__delete.*"  // Todas as ferramentas de exclusão MCP
```

**Nota:** Matchers diferenciam maiúsculas de minúsculas.

### Padrões Comuns

```json
// Todas as ferramentas MCP
"matcher": "mcp__.*"

// Ferramentas MCP de um plugin específico
"matcher": "mcp__plugin_asana_.*"

// Todas as operações de arquivo
"matcher": "Read|Write|Edit"

// Apenas comandos Bash
"matcher": "Bash"
```

## Melhores Práticas de Segurança

### Validação de Entrada

Sempre valide entradas em hooks de comando:

```bash
#!/bin/bash
set -euo pipefail

input=$(cat)
tool_name=$(echo "$input" | jq -r '.tool_name')

# Valide o formato do nome da ferramenta
if [[ ! "$tool_name" =~ ^[a-zA-Z0-9_]+$ ]]; then
  echo '{"decision": "deny", "reason": "Nome de ferramenta inválido"}' >&2
  exit 2
fi
```

### Segurança de Caminho

Verifique path traversal e arquivos sensíveis:

```bash
file_path=$(echo "$input" | jq -r '.tool_input.file_path')

# Negue path traversal
if [[ "$file_path" == *".."* ]]; then
  echo '{"decision": "deny", "reason": "Path traversal detectado"}' >&2
  exit 2
fi

# Negue arquivos sensíveis
if [[ "$file_path" == *".env"* ]]; then
  echo '{"decision": "deny", "reason": "Arquivo sensível"}' >&2
  exit 2
fi
```

Veja `examples/validate-write.sh` e `examples/validate-bash.sh` para exemplos completos.

### Coloque Aspas em Todas as Variáveis

```bash
# BOM: Entre aspas
echo "$file_path"
cd "$CLAUDE_PROJECT_DIR"

# RUIM: Sem aspas (risco de injeção)
echo $file_path
cd $CLAUDE_PROJECT_DIR
```

### Defina Timeouts Apropriados

```json
{
  "type": "command",
  "command": "bash script.sh",
  "timeout": 10
}
```

**Padrões:** Hooks de comando (60s), Hooks de prompt (30s)

## Considerações de Desempenho

### Execução Paralela

Todos os hooks correspondentes são executados **em paralelo**:

```json
{
  "PreToolUse": [
    {
      "matcher": "Write",
      "hooks": [
        {"type": "command", "command": "check1.sh"},  // Paralelo
        {"type": "command", "command": "check2.sh"},  // Paralelo
        {"type": "prompt", "prompt": "Validar..."}    // Paralelo
      ]
    }
  ]
}
```

**Implicações de design:**
- Hooks não veem a saída uns dos outros
- Ordenação não-determinística
- Design para independência

### Otimização

1. Use hooks de comando para verificações rápidas e determinísticas
2. Use hooks de prompt para raciocínio complexo
3. Coloque em cache resultados de validação em arquivos temporários
4. Minimize I/O em caminhos críticos

## Hooks Temporariamente Ativos

Crie hooks que se ativem condicionalmente verificando um arquivo de flag ou configuração:

**Padrão: Ativação por arquivo de flag**
```bash
#!/bin/bash
# Apenas ativo quando arquivo de flag existe
FLAG_FILE="$CLAUDE_PROJECT_DIR/.enable-strict-validation"

if [ ! -f "$FLAG_FILE" ]; then
  # Flag não presente, pule validação
  exit 0
fi

# Flag presente, execute validação
input=$(cat)
# ... lógica de validação ...
```

**Padrão: Ativação baseada em configuração**
```bash
#!/bin/bash
# Verifique configuração para ativação
CONFIG_FILE="$CLAUDE_PROJECT_DIR/.claude/plugin-config.json"

if [ -f "$CONFIG_FILE" ]; then
  enabled=$(jq -r '.strictMode // false' "$CONFIG_FILE")
  if [ "$enabled" != "true" ]; then
    exit 0  # Não ativado, pule
  fi
fi

# Ativado, execute lógica do hook
input=$(cat)
# ... lógica do hook ...
```

**Casos de uso:**
- Ative validação rigorosa apenas quando necessário
- Hooks de depuração temporários
- Comportamento de hook específico do projeto
- Feature flags para hooks

**Melhor prática:** Documente mecanismo de ativação no README do plugin para que os usuários saibam como ativar/desativar hooks temporários.

## Ciclo de Vida de Hook e Limitações

### Hooks Carregam no Início da Sessão

**Importante:** Hooks são carregados quando a sessão do Claude Code inicia. Mudanças na configuração de hooks requerem reiniciar o Claude Code.

**Não é possível trocar hooks dinamicamente:**
- Editar `hooks/hooks.json` não afetará a sessão atual
- Adicionar novos scripts de hook não será reconhecido
- Mudar comandos/prompts de hook não será atualizado
- Deve reiniciar o Claude Code: saia e execute `claude` novamente

**Para testar mudanças de hook:**
1. Edite configuração de hook ou scripts
2. Saia da sessão do Claude Code
3. Reinicie: `claude` ou `cc`
4. Nova configuração de hook carrega
5. Teste hooks com `claude --debug`

### Validação de Hook na Inicialização

Hooks são validados quando Claude Code inicia:
- JSON inválido em hooks.json causa falha de carregamento
- Scripts ausentes causam avisos
- Erros de sintaxe reportados em modo debug

Use comando `/hooks` para revisar hooks carregados na sessão atual.

## Depurando Hooks

### Ative Modo Debug

```bash
claude --debug
```

Procure por registro de hook, logs de execução, entrada/saída JSON e informações de timing.

### Teste Scripts de Hook

Teste hooks de comando diretamente:

```bash
echo '{"tool_name": "Write", "tool_input": {"file_path": "/test"}}' | \
  bash ${CLAUDE_PLUGIN_ROOT}/scripts/validate.sh

echo "Código de saída: $?"
```

### Valide Saída JSON

Garanta que hooks retornem JSON válido:

```bash
output=$(./your-hook.sh < test-input.json)
echo "$output" | jq .
```

## Referência Rápida

### Resumo de Eventos de Hook

| Evento | Quando | Usar Para |
|-------|--------|-----------|
| PreToolUse | Antes da ferramenta | Validação, modificação |
| PostToolUse | Após ferramenta | Feedback, logging |
| UserPromptSubmit | Entrada do usuário | Contexto, validação |
| Stop | Agente parando | Verificação de completude |
| SubagentStop | Subagente pronto | Validação de tarefa |
| SessionStart | Sessão inicia | Carregamento de contexto |
| SessionEnd | Sessão termina | Limpeza, logging |
| PreCompact | Antes de compactar | Preservar contexto |
| Notification | Usuário notificado | Logging, reações |

### Melhores Práticas

**FAÇA:**
- ✅ Use hooks baseados em prompt para lógica complexa
- ✅ Use ${CLAUDE_PLUGIN_ROOT} para portabilidade
- ✅ Valide todas as entradas em hooks de comando
- ✅ Coloque aspas em todas as variáveis bash
- ✅ Defina timeouts apropriados
- ✅ Retorne saída JSON estruturada
- ✅ Teste hooks minuciosamente

**NÃO FAÇA:**
- ❌ Use caminhos hardcoded
- ❌ Confie em entrada do usuário sem validação
- ❌ Crie hooks de longa duração
- ❌ Dependa da ordem de execução de hooks
- ❌ Modifique estado global de forma imprevisível
- ❌ Registre informações sensíveis

## Recursos Adicionais

### Arquivos de Referência

Para padrões detalhados e técnicas avançadas, consulte:

- **`references/patterns.md`** - Padrões comuns de hook (8+ padrões comprovados)
- **`references/migration.md`** - Migrar de hooks básicos para avançados
- **`references/advanced.md`** - Casos de uso avançados e técnicas

### Scripts de Exemplo de Hook

Exemplos em funcionamento em `examples/`:

- **`validate-write.sh`** - Exemplo de validação de escrita de arquivo
- **`validate-bash.sh`** - Exemplo de validação de comando Bash
- **`load-context.sh`** - Exemplo de carregamento de contexto de SessionStart

### Scripts Utilitários

Ferramentas de desenvolvimento em `scripts/`:

- **`validate-hook-schema.sh`** - Valide estrutura e sintaxe de hooks.json
- **`test-hook.sh`** - Teste hooks com entrada de amostra antes da implantação
- **`hook-linter.sh`** - Verifique scripts de hook para problemas comuns e melhores práticas

### Recursos Externos

- **Docs Oficial**: https://docs.claude.com/en/docs/claude-code/hooks
- **Exemplos**: Veja plugin security-guidance no marketplace
- **Testes**: Use `claude --debug` para logs detalhados
- **Validação**: Use `jq` para validar saída JSON de hook

## Workflow de Implementação

Para implementar hooks em um plugin:

1. Identifique eventos para hookear (PreToolUse, Stop, SessionStart, etc.)
2. Decida entre hooks baseados em prompt (flexível) ou comando (determinístico)
3. Escreva configuração de hook em `hooks/hooks.json`
4. Para hooks de comando, crie scripts de hook
5. Use ${CLAUDE_PLUGIN_ROOT} para todas as referências de arquivo
6. Valide configuração com `scripts/validate-hook-schema.sh hooks/hooks.json`
7. Teste hooks com `scripts/test-hook.sh` antes da implantação
8. Teste no Claude Code com `claude --debug`
9. Documente hooks no README do plugin

Foco em hooks baseados em prompt para a maioria dos casos de uso. Reserve hooks de comando para verificações críticas de desempenho ou determinísticas.

Files in this skill

  • SKILL.md17.8 KB
  • examples/load-context.sh1.7 KB
  • examples/validate-bash.sh1.3 KB
  • examples/validate-write.sh1.2 KB
  • references/advanced.md9.9 KB
  • references/migration.md8.1 KB
  • references/patterns.md7 KB
  • scripts/README.md3.6 KB
  • scripts/hook-linter.sh4.1 KB
  • scripts/test-hook.sh5.2 KB
  • scripts/validate-hook-schema.sh5 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…