Volvemos fuertes de las vacaciones y seguimos con la serie de Claude Code in Action de Anthropic. En el post anterior vimos cómo lanzar trabajo sin estar delante de la pantalla. El capítulo de hoy lo lleva al sitio donde ese trabajo repetido de verdad se acumula, que es en la pull request.
Hay dos maneras de meter a Claude Code ahí y resuelven problemas distintos. Una es un servicio de Anthropic que enciendes y ya está y la otra es una GitHub Action que te montas tú mismo.
Code Review: lo enciendes y revisa
Code Review es un servicio alojado por Anthropic que revisa tus pull requests a través de la app de GitHub. No hay nada que programar ni que hospedar. Lo activas y empieza a dejar comentarios en las líneas concretas donde ve algo.
Lo enciende un Owner de la organización desde claude.ai/admin-settings/claude-code, en la sección Code Review con el botón Setup. Desde ahí instala la app de GitHub, elige qué repos vigila y cuándo se dispara. Hay tres opciones: una vez al abrir la PR, en cada push, o solo cuando alguien comenta @claude review.
Por dentro no es un agente leyendo el diff, son varios en paralelo, cada uno buscando una clase distinta de problema y luego un paso de verificación que contrasta cada candidato contra el comportamiento real del código para tirar los falsos positivos. Lo que sobrevive se deduplica, se ordena por gravedad y se publica en la línea que toca. De ahí que no te llegue un muro de tonterías sino de cosas que merecen tu tiempo.
Las tres gravedades tienen nombre y color:
| Marca | Qué significa |
|---|---|
| 🔴 Important | Un bug que hay que arreglar antes de mergear |
| 🟡 Nit | Menor, vale la pena pero no bloquea |
| 🟣 Pre-existing | Ya estaba roto, no lo ha traído esta PR |
Nunca aprueba ni bloquea. El check run termina siempre en neutral, así que no te va a trabar un merge por protección de rama. La decisión sigue siendo de una persona, que es como tiene que ser.
Y no hay autofix, publica hallazgos y ahí se queda. Para aplicarlos tienes el comando /code-review en tu terminal, que con --fix te mete los cambios en el árbol de trabajo. O sea que el circuito es: lo encuentra en la PR, te lo bajas y lo arreglas en local.
Lo que el curso no cuenta y hay que tener en cuenta
Tres cosas que no salen en el capítulo y que cambian bastante la decisión.
La primera y más gorda es que cada revisión cuesta entre 15 y 25 dólares. Escala con el tamaño de la PR y con lo complejo que sea el repo y tarda unos veinte minutos de media. Se factura aparte, por créditos de uso, no sale de lo que ya pagas en tu plan. Con el disparador en cada push eso se multiplica por cada vez que alguien pushea a la rama. Que no haya nada que hospedar no significa que sea gratis, y el curso lo vende como la opción sencilla sin decir el precio, sorpresas para luego.
La segunda es research preview y solo está en planes Team y Enterprise. Si tienes un plan personal, esto no lo vas a poder usar. Tampoco está disponible si tu organización tiene Zero Data Retention.
Y la tercera, que es la que yo aprovecharía. Puedes afinar lo que te marca con un REVIEW.md en la raíz del repo. El CLAUDE.md también lo lee, pero las violaciones que encuentra ahí las trata como nits. El REVIEW.md va directo a los agentes que buscan y verifican, así que es donde de verdad mandas. Sirve para redefinir qué es importante en tu repo, para capar cuántos nits te publica, para saltarse rutas enteras como los ficheros generados o los lockfiles, y para pedirle que después de la primera revisión solo saque cosas importantes, que si no una PR de una línea te llega a la ronda siete discutiendo estilo y es una castaña.
ConsejoLas PR que vienen de un fork no se revisan nunca solas, da igual el disparador que tengas puesto. Hay que comentar
@claude reviewa mano. Y ojo con ese comando, que desde julio de 2026 solo lanza una revisión suelta. Si quieres que además se suscriba a los siguientes push es@claude review always.
La GitHub Action: cuando el trabajo es más que revisar
Code Review revisa pero cuando lo que quieres es que se haga algo, bajas a la Action, que es anthropics/claude-code-action@v1. Sirve para implementar lo que le pidas en un comentario, para informes programados y para cualquier evento de GitHub.
La instalación se lanza desde el propio Claude Code con /install-github-app, y necesitas ser admin del repo. El comando instala la app, guarda el secret de auth y te deja una branch con los workflows y la pull request abierta para que la revises antes de mergear.
Puedes autenticarte de dos formas: con ANTHROPIC_API_KEY, que es una clave de la Console y factura por tokens, o con CLAUDE_CODE_OAUTH_TOKEN, que lo generas con claude setup-token y usa tu suscripción. Está disponible en Pro, Max, Team y Enterprise. Si ya pagas un plan, no hay motivo para meterle una clave de API a un repo personal.
El workflow que responde a @claude
name: Claude Code
on:
issue_comment:
types: [created]
pull_request_review_comment:
types: [created]
jobs:
claude:
if: contains(github.event.comment.body, '@claude')
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
issues: write
id-token: write
actions: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 1
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
El id-token: write hace falta para que la Action se autentique como la app de GitHub, actions: read es lo que le deja leer los resultados de CI en la PR, y el if evita levantar un runner cada vez que alguien comenta cualquier cosa.
Con eso puesto, alguien escribe @claude arregla el TypeError del dashboard en un comentario y la Action lo recoge, empuja commits y va contando lo que hace.
El workflow programado
Con prompt puesto entras en modo automático, y ahí ya vale cualquier evento, incluido un cron:
name: Daily Report
on:
schedule:
- cron: '0 9 * * *'
jobs:
report:
runs-on: ubuntu-latest
permissions:
contents: read
issues: read
id-token: write
steps:
- uses: anthropics/claude-code-action@v1
with:
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
prompt: 'Resume los commits de ayer y las issues abiertas'
claude_args: |
--model claude-sonnet-5
--allowedTools "mcp__github__list_commits,mcp__github__list_issues"
Fíjate en que no hay checkout. Con esas dos herramientas lee los commits y las issues por la API de GitHub, así que no necesita el repo clonado.
Eso del --allowedTools es porque en modo automático, con un prompt de texto plano, Claude arranca sin shell y sin acceso a la API de GitHub hasta que se lo das tú. Si no le pones herramientas, la tarea no puede hacer nada.
AdvertenciaEn repos públicos, GitHub desactiva los workflows programados después de 60 días sin actividad en el repositorio. Si montas un informe diario en un proyecto que tocas poco, un día dejará de llegarte sin aviso ninguno.
Los ajustes de claude_args
claude_args acepta cualquier argumento del CLI, y hay tres que van a ir siempre en un trabajo desatendido. --max-turns le pone un techo al bucle del agente para que no se vaya de las manos. --model elige el modelo, porque si no coge el que tengas por defecto. Y --allowedTools le da exactamente lo que necesita y nada más, que para un informe significa solo lectura.
Hay además dos filtros que trae la Action de serie y que está bien conocer. Quien dispara la Action tiene que tener permiso de escritura en el repo y los bots están rechazados salvo que los listes en allowed_bots, precisamente para que no se llame a sí misma en bucle.
Cuál de los dos
| Herramienta | Cuándo |
|---|---|
| Code Review | Revisar PR y nada más, con plan Team o Enterprise y presupuesto |
| GitHub Action | Cuando el trabajo es hacer algo, no comentarlo |
/code-review | Tu terminal, tu rama, gratis dentro de tu plan |
El curso te dice que empieces por el servicio gestionado y bajes a la Action cuando necesites más. Con el precio delante yo lo pondría de otra forma.
Lo que sí tengo claro es que la tercera fila de esa tabla es la que va a usar el 90% de la gente que lea esto. /code-review en tu terminal no necesita app de GitHub, ni plan de empresa, ni que nadie apruebe un gasto y revisa lo mismo.
EA! Nos vemos en los bares! 🍻