Esta página proporciona documentación de referencia para implementar hooks en Claude Code.
~/.claude/settings.json
- Configuración de usuario.claude/settings.json
- Configuración de proyecto.claude/settings.local.json
- Configuración local de proyecto (no confirmada)PreToolUse
y PostToolUse
)
Write
coincide solo con la herramienta WriteEdit|Write
o Notebook.*
*
para coincidir con todas las herramientas. También puedes usar cadena vacía (""
) o dejar
matcher
en blanco.type
: Actualmente solo se soporta "command"
command
: El comando bash a ejecutar (puede usar la variable de entorno $CLAUDE_PROJECT_DIR
)timeout
: (Opcional) Cuánto tiempo debe ejecutarse un comando, en segundos, antes de
cancelar ese comando específico.UserPromptSubmit
, Notification
, Stop
, y SubagentStop
que no usan coincidencias, puedes omitir el campo matcher:
CLAUDE_PROJECT_DIR
(solo disponible cuando
Claude Code genera el comando hook) para referenciar scripts almacenados en tu proyecto,
asegurando que funcionen independientemente del directorio actual de Claude:
Task
- Tareas de subagente (ver documentación de subagentes)Bash
- Comandos de shellGlob
- Coincidencia de patrones de archivoGrep
- Búsqueda de contenidoRead
- Lectura de archivosEdit
, MultiEdit
- Edición de archivosWrite
- Escritura de archivosWebFetch
, WebSearch
- Operaciones webmanual
- Invocado desde /compact
auto
- Invocado desde auto-compact (debido a ventana de contexto llena)startup
- Invocado desde inicioresume
- Invocado desde --resume
, --continue
, o /resume
clear
- Invocado desde /clear
compact
- Invocado desde compactación automática o manual.reason
en la entrada del hook será uno de:
clear
- Sesión limpiada con comando /clearlogout
- Usuario cerró sesiónprompt_input_exit
- Usuario salió mientras la entrada de prompt era visibleother
- Otras razones de salidatool_input
depende de la herramienta.
tool_input
y tool_response
depende de la herramienta.
stop_hook_active
es true cuando Claude Code ya está continuando como resultado de
un hook de parada. Verifica este valor o procesa la transcripción para evitar que Claude Code
se ejecute indefinidamente.
manual
, custom_instructions
viene de lo que el usuario pasa a
/compact
. Para auto
, custom_instructions
está vacío.
stdout
se muestra al usuario en modo transcripción
(CTRL-R), excepto para UserPromptSubmit
y SessionStart
, donde stdout se
agrega al contexto.stderr
se devuelve a Claude para procesar
automáticamente. Ver comportamiento por evento de hook abajo.stderr
se muestra al usuario y
la ejecución continúa.UserPromptSubmit
donde stdout se inyecta como contexto.Evento de Hook | Comportamiento |
---|---|
PreToolUse | Bloquea la llamada de herramienta, muestra stderr a Claude |
PostToolUse | Muestra stderr a Claude (la herramienta ya se ejecutó) |
Notification | N/A, muestra stderr solo al usuario |
UserPromptSubmit | Bloquea el procesamiento del prompt, borra el prompt, muestra stderr solo al usuario |
Stop | Bloquea la parada, muestra stderr a Claude |
SubagentStop | Bloquea la parada, muestra stderr al subagente de Claude |
PreCompact | N/A, muestra stderr solo al usuario |
SessionStart | N/A, muestra stderr solo al usuario |
SessionEnd | N/A, muestra stderr solo al usuario |
stdout
para un control más sofisticado:
continue
es false, Claude deja de procesar después de que se ejecuten los hooks.
PreToolUse
, esto es diferente de "permissionDecision": "deny"
, que
solo bloquea una llamada de herramienta específica y proporciona retroalimentación automática a Claude.PostToolUse
, esto es diferente de "decision": "block"
, que
proporciona retroalimentación automatizada a Claude.UserPromptSubmit
, esto evita que el prompt sea procesado.Stop
y SubagentStop
, esto tiene precedencia sobre cualquier
salida "decision": "block"
."continue" = false
tiene precedencia sobre cualquier
salida "decision": "block"
.stopReason
acompaña a continue
con una razón mostrada al usuario, no mostrada
a Claude.
PreToolUse
PreToolUse
pueden controlar si una llamada de herramienta procede.
"allow"
evita el sistema de permisos. permissionDecisionReason
se muestra
al usuario pero no a Claude."deny"
evita que la llamada de herramienta se ejecute. permissionDecisionReason
se
muestra a Claude."ask"
pide al usuario confirmar la llamada de herramienta en la UI.
permissionDecisionReason
se muestra al usuario pero no a Claude.decision
y reason
están obsoletos para hooks PreToolUse.
Usa hookSpecificOutput.permissionDecision
y
hookSpecificOutput.permissionDecisionReason
en su lugar. Los campos obsoletos
"approve"
y "block"
se mapean a "allow"
y "deny"
respectivamente.PostToolUse
PostToolUse
pueden proporcionar retroalimentación a Claude después de la ejecución de herramientas.
"block"
automáticamente solicita a Claude con reason
.undefined
no hace nada. reason
se ignora."hookSpecificOutput.additionalContext"
agrega contexto para que Claude considere.UserPromptSubmit
UserPromptSubmit
pueden controlar si un prompt de usuario es procesado.
"block"
evita que el prompt sea procesado. El prompt enviado se
borra del contexto. "reason"
se muestra al usuario pero no se agrega al contexto.undefined
permite que el prompt proceda normalmente. "reason"
se ignora."hookSpecificOutput.additionalContext"
agrega la cadena al contexto si no está
bloqueado.Stop
/SubagentStop
Stop
y SubagentStop
pueden controlar si Claude debe continuar.
"block"
evita que Claude se detenga. Debes poblar reason
para que Claude
sepa cómo proceder.undefined
permite que Claude se detenga. reason
se ignora.SessionStart
SessionStart
te permiten cargar contexto al inicio de una sesión.
"hookSpecificOutput.additionalContext"
agrega la cadena al contexto.additionalContext
de múltiples hooks se concatenan.SessionEnd
SessionEnd
se ejecutan cuando una sesión termina. No pueden bloquear la terminación de sesión
pero pueden realizar tareas de limpieza.
UserPromptSubmit
, puedes inyectar contexto usando cualquier método:UserPromptSubmit
)mcp__<server>__<tool>
, por ejemplo:
mcp__memory__create_entities
- Herramienta de crear entidades del servidor de memoriamcp__filesystem__read_file
- Herramienta de leer archivo del servidor de sistema de archivosmcp__github__search_repositories
- Herramienta de búsqueda del servidor de GitHub"$VAR"
no $VAR
..
en rutas de archivo$CLAUDE_PROJECT_DIR
para la ruta del proyecto).env
, .git/
, claves, etc./hooks
para que los cambios se apliquenCLAUDE_PROJECT_DIR
está disponible y contiene la
ruta absoluta al directorio raíz del proyecto (donde se inició Claude Code)--debug
)/hooks
para ver si tu hook está registradoclaude --debug
para ver detalles de ejecución de hooks\"
dentro de cadenas JSONclaude --debug
para ver ejecución detallada de
hooksclaude --debug
para ver detalles de ejecución de hooks: