Conventional Commits
El último hook del curso combina todo lo aprendido y cierra la suite: validar que cada commit que hace Claude sigue el formato Conventional Commits (feat:, fix:, chore:…) y rechazarlo si no.
El script
Guarda esto en .claude/hooks/check-commit.sh:
#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
# Solo nos interesan los commits con -m.
if echo "$COMMAND" | grep -q 'git commit'; then
MSG=$(printf '%s' "$COMMAND" | sed -nE "s/.*-[a-z]*m[[:space:]]*['\"]([^'\"]*)['\"].*/\1/p" | head -1)
if ! echo "$MSG" | grep -Eq \
'^(feat|fix|docs|style|refactor|test|chore|perf|build|ci)(\(.+\))?!?: .+'; then
echo "Commit rechazado: '$MSG' no sigue Conventional Commits (ej.: 'feat(auth): add login')." >&2
exit 2
fi
fi
exit 0
chmod +x .claude/hooks/check-commit.sh
El registro
Matcher Bash, igual que el guard anterior (de hecho podrían ser el mismo grupo de hooks):
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-commit.sh" }
]
}
]
}
}
Cómo funciona
- Antes de cada
Bash, el hook mira si el comando es ungit commit. - Si lo es, extrae el mensaje del
-m. - Lo valida contra el regex de Conventional Commits: un tipo (
feat,fix, …), un scope opcional entre paréntesis, y una descripción. - Si no cumple,
exit 2con un ejemplo del formato correcto. Claude lee el motivo y reescribe el mensaje bien — sin que tú tengas que rechazarlo a mano.
Lo elegante: el agente no solo es bloqueado, sino educado. El mensaje de error le enseña el formato, así que en el segundo intento acierta. Un buen mensaje de
exit 2convierte el muro en una corrección.
Tu suite, completa
Junta los cuatro hooks que has construido en tu .claude/settings.json y commitéalo:
git add .claude/settings.json .claude/hooks
git commit -m "feat(hooks): add deterministic guardrails suite"
Ese fichero es el artefacto del curso: una suite versionada que tu equipo entero hereda al clonar. Formateo garantizado, secrets bloqueados, destructivos vetados, commits con formato. Reglas que ya no dependen de que nadie se acuerde.
Cierre del curso y del nivel
Has cruzado la frontera de lo blando a lo determinista. Sabes cuándo una regla necesita un muro (hook) y cuándo basta con una guía (CLAUDE.md, skill) o un patrón (deny).
Con esto cierras el nivel Extender Claude: comandos, skills, subagentes y hooks. El siguiente nivel del plan es Integración y empaquetado: conectar Claude a tus herramientas con MCP y empaquetar todo lo que has construido —skills, subagentes, hooks— en plugins que tu equipo instala de una vez.
Fuente oficial: Hooks reference
¿Quieres llevar la cuenta de las lecciones que has terminado?
Entrar para guardar progreso