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

Formato post-edit automático

PostToolUse + Edit|Write para formatear cada fichero que el agente toca.

Formato post-edit automático

El primer hook real, y el más satisfactorio: que cada fichero que Claude edita salga ya formateado, sin que tú ni el agente tengáis que acordaros. Es un caso de libro para PostToolUse.

El hook, entero

Añade esto a .claude/settings.json:

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": "jq -r '.tool_input.file_path' | xargs npx prettier --write" }
        ]
      }
    ]
  }
}

Desgranado con lo de la lección anterior:

  • PostToolUse — corre después de que la tool tenga éxito (el fichero ya está escrito; ahora lo formateamos).
  • matcher: "Edit|Write" — solo tras tools que editan ficheros. No se dispara con Bash ni con lecturas.
  • jq -r '.tool_input.file_path' — extrae del JSON de stdin la ruta del fichero que se acaba de tocar.
  • xargs npx prettier --write — pasa esa ruta a Prettier, que la formatea in situ.

La clave: formatea solo lo tocado

Fíjate en que no formateamos todo el repo: extraemos file_path del input y formateamos ese fichero. Es rápido y no genera ruido en ficheros que nadie tocó. Ese tool_input.file_path es el mismo patrón que usarás para inspeccionar contenido en el hook de secrets.

Adáptalo a tu stack

Prettier es solo el ejemplo. La forma es idéntica:

  • Python: xargs black (o ruff format).
  • Rust: xargs rustfmt.
  • Go: xargs gofmt -w.

Si tu repo es políglota, el comando puede mirar la extensión y elegir el formateador; cuando crece, muévelo a un script en .claude/hooks/format.sh y referéncialo (lo viste en la anatomía).

¿Por qué un hook y no pedírselo al agente? Porque "acuérdate de formatear" es justo el tipo de regla blanda que falla un viernes a las 23:42. Con el hook, el formato deja de ser una decisión: es una garantía.

Pruébalo

Pídele a Claude un cambio pequeño en un fichero desordenado. Al aceptarlo, el hook corre y el fichero queda formateado al instante. Si miras el diff, verás el cambio ya limpio.

Si falla

  • Prettier no está disponiblenpx prettier intenta descargarlo al vuelo o falla si no hay red; instálalo en el proyecto (npm i -D prettier) o apunta el hook al formateador que ya tengas.
  • Sin .prettierrc → Prettier aplica sus defaults y puede reformatear más de lo que esperas; añade un fichero de config para acotar el estilo a lo que quieres.
  • El hook parece no hacer nada → recuerda que un PostToolUse que falla no revierte la edición (el fichero ya está escrito); revisa que el matcher sea exacto Edit|Write y que el comando no dé error (pruébalo a mano pasándole un file_path).

Qué llevas hasta aquí

  • Un hook PostToolUse con matcher Edit|Write reacciona a cada edición.
  • Extraes la ruta con jq -r '.tool_input.file_path' y formateas solo ese fichero.
  • La forma se adapta a cualquier formateador (Black, rustfmt, gofmt…).

En la siguiente lección pasamos de "reaccionar" a "impedir": un hook PreToolUse que bloquea secrets antes de que se escriban.

Fuente oficial: Hooks guide · Hooks reference

¿Quieres llevar la cuenta de las lecciones que has terminado?

Entrar para guardar progreso