tranquia

Curso de Claude Code

Curso de Claude Code · Nivel 4: Superpoderes

Lección 19 de 28 · 8 minutos

Hooks: reglas que se cumplen siempre

Al acabar

Tu ordenador te avisará cuando Claude te necesite, y sabrás poner reglas que Claude no se puede saltar.

Qué son

Un hook es una orden que Claude Code ejecuta sola en un momento concreto: antes de usar una herramienta, cuando te necesita, al terminar de responder...

✕ Una instrucción en el CLAUDE.md

Es un consejo. Claude lo sigue casi siempre, pero puede olvidarlo en una conversación larga.

✓ Un hook

Se ejecuta siempre, porque no depende de que Claude se acuerde. Para lo que tiene que pasar sí o sí.

Se escriben en un archivo de ajustes, settings.json: el tuyo (~/.claude/settings.json) para todo, o el de una carpeta (.claude/settings.json). Para ver los que tienes, escribe /hooks: hoy es solo un visor, no un asistente para crearlos.

El más útil: un aviso cuando Claude te necesita

Mientras Claude trabaja puedes hacer otra cosa. Con este hook, cuando se queda esperando tu permiso o tu respuesta, te salta un aviso. Es el ejemplo oficial de la documentación:

~/.claude/settings.json · Windows
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""
          }
        ]
      }
    ]
  }
}
~/.claude/settings.json · Mac
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
          }
        ]
      }
    ]
  }
}

Si tu settings.json ya tiene cosas, no lo sustituyas entero: añade la parte de "hooks" junto a lo que haya. Lo más seguro es pedírselo a Claude:

Pídeselo así

Añade a mi ~/.claude/settings.json el hook oficial de Notification para mi sistema, el que muestra un aviso cuando necesitas mi atención. Si el archivo ya tiene cosas, no borres nada y comprueba que el JSON queda bien escrito.

Reglas que no se saltan

Un hook también puede bloquear una acción antes de que ocurra. La documentación trae, por ejemplo, uno que impide borrar carpetas enteras y otro que impide tocar archivos protegidos. Un bloqueo de un hook funciona incluso en el modo que se salta los permisos.

Ver el ejemplo oficial para Windows que bloquea los borrados de carpetas

Va en dos archivos dentro de tu carpeta de trabajo. Primero, la regla en .claude/settings.json:

.claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash|PowerShell",
        "hooks": [
          {
            "type": "command",
            "if": "Bash(rm *)",
            "command": "powershell.exe",
            "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.ps1"]
          },
          {
            "type": "command",
            "if": "PowerShell(Remove-Item *)",
            "command": "powershell.exe",
            "args": ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", "${CLAUDE_PROJECT_DIR}/.claude/hooks/block-rm.ps1"]
          }
        ]
      }
    ]
  }
}

Y el script que decide:

.claude/hooks/block-rm.ps1
# .claude/hooks/block-rm.ps1
$callInput = [Console]::In.ReadToEnd() | ConvertFrom-Json
$command = $callInput.tool_input.command

if ($command -match 'rm -rf|Remove-Item.*-Recurse') {
  @{
    hookSpecificOutput = @{
      hookEventName = "PreToolUse"
      permissionDecision = "deny"
      permissionDecisionReason = "Destructive command blocked by hook"
    }
  } | ConvertTo-Json
} else {
  exit 0  # no decision; normal permission flow applies
}

Si el script no dice nada, no aprueba la acción: Claude sigue pidiéndote permiso como siempre.

Con cuidado

Un hook ejecuta órdenes con todos tus permisos: puede leer, cambiar o borrar cualquier archivo al que tú tengas acceso. Lee y entiende cada hook antes de añadirlo, sobre todo si viene en una carpeta o un plugin de otra persona.

Los hooks de una carpeta no se ejecutan hasta que dices que confías en ella al abrir Claude. Para apagarlos todos de golpe existe el ajuste "disableAllHooks": true.

Te toca

Pon el aviso. Pídele a Claude que lo añada con la petición de arriba y compruébalo: escribe /hooks, pulsa Esc, cambia al modo manual con Mayús + Tab, pídele algo que necesite tu permiso (por ejemplo, crear un archivo) y cambia a otra ventana.

Sabrás que te ha salido si:

Si algo falla

No salta el aviso

Mira en /hooks que aparece. Los nombres distinguen mayúsculas: tiene que ser Notification, tal cual. En el JSON no puede haber comas al final de una lista ni comentarios.

En Windows falla un hook pensado para Mac o Linux

Sin Git Bash instalado, un hook escrito para bash se ejecuta en PowerShell y puede fallar. Usa la versión de Windows o instala Git para Windows.

Comprueba que lo has pillado

Tres preguntas. Cada acierto suma 10 puntos.

1. ¿En qué se diferencia un hook de una instrucción en el CLAUDE.md?

2. ¿Qué hace hoy el comando /hooks?

3. ¿Qué evento usas para que te avise cuando espera tu permiso?

¿Terminada?

Márcala y suma 100 puntos. Tu avance se guarda en este navegador.

Fuentes (documentación oficial, consultada el 5-nov-2026):