Los agentes de código son increíbles… hasta que ejecutan git reset --hard sobre una tarde de trabajo sin commitear.
Claude Code tiene una función poco conocida para evitarlo: los hooks.
Qué es un hook
Un script que Claude Code ejecuta antes o después de usar una herramienta. Si un hook PreToolUse
termina con código de salida 2, la acción se cancela y Claude recibe tu mensaje de error, así que corrige su plan solo.
Hook 1: bloquear comandos destructivos
.claude/hooks/bloquear.py:
#!/usr/bin/env python3
import json, re, sys
PATRONES = [
(r"\brm\s+-[a-zA-Z]*[rR][a-zA-Z]*f?\s+(/|~|\$HOME|\*)(\s|$)", "rm recursivo sobre /, ~ o *"),
(r"\bgit\s+push\b.*(--force\b|-f\b)(?!-with-lease)", "git push --force"),
(r"\bgit\s+reset\s+--hard\b", "git reset --hard"),
(r"(curl|wget)[^|]*\|\s*(sudo\s+)?(ba|z)?sh\b", "curl | sh"),
]
cmd = (json.load(sys.stdin).get("tool_input") or {}).get("command", "")
for p, motivo in PATRONES:
if re.search(p, cmd, re.I):
print(f"Bloqueado: {motivo}", file=sys.stderr); sys.exit(2)
Hook 2: que no lea tu .env
Mismo patrón, pero mirando tool_input.file_path en las herramientas Read|Edit|Write
y bloqueando .env, *.pem, id_rsa… (y permitiendo .env.example).
Conectarlos
.claude/settings.json:
{
"hooks": {
"PreToolUse": [
{ "matcher": "Bash",
"hooks": [{ "type": "command", "command": "python3 \"$CLAUDE_PROJECT_DIR\"/.claude/hooks/bloquear.py" }] }
]
}
}
Reinicia Claude Code y escribe /hooks para comprobar que está activo.
Probarlo sin riesgo
echo '{"tool_input":{"command":"rm -rf ~"}}' | python3 .claude/hooks/bloquear.py; echo $? # 2
echo '{"tool_input":{"command":"npm test"}}' | python3 .claude/hooks/bloquear.py; echo $? # 0
Código completo
Los dos hooks probados y una skill de code review en español, gratis: https://github.com/carlosp5751258-lgtm/claude-code-es.
Si quieres la configuración completa (6 skills, comandos /plan y /pr, plantillas CLAUDE.md, autoformato),
está el Kit Claude Code en Español.
Top comments (0)