\
CONTEXT/academy
Lección 06 · ≈ 13 min

Conventional Commits

Un hook que valida el mensaje de commit y rechaza los que no cumplen.

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

  1. Antes de cada Bash, el hook mira si el comando es un git commit.
  2. Si lo es, extrae el mensaje del -m.
  3. Lo valida contra el regex de Conventional Commits: un tipo (feat, fix, …), un scope opcional entre paréntesis, y una descripción.
  4. Si no cumple, exit 2 con 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 2 convierte 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