Su página es perfecta. Google ya no la ve.
goflag es una CLI que lee su sitio como lo lee un rastreador, y hace fallar un paso de CI antes de que un defecto invisible llegue a producción.
npx @goflag/cli https://example.comCambia una etiqueta.
día 0Sin goflag
Se despliega.
día 0La página sale del índice.
semanas despuésAlguien pregunta por qué cayó el tráfico.
meses despuésCon goflag
La CI da la alerta.
4 min despuésUn desarrollador o un agente lo corrige.
minutos despuésSe despliega limpio.
todavía el día 0Lo que un navegador no puede mostrarle
Cada uno de estos casos se muestra a la perfección. El defecto está en la parte de la página que nadie mira, y el coste se paga en un índice de búsqueda que usted nunca ve.
Lo que usted ve
Una página que se muestra exactamente como se diseñó.
Lo que ve un rastreador
<link rel="canonical" href="/another-page">Consecuencia
La página pide que se la descarte en favor de otra. Y así será.
Lo que usted ve
Cuatro idiomas, todos ellos accesibles.
Lo que ve un rastreador
no <link rel="alternate" hreflang> anywhereConsecuencia
Cada traducción compite con las otras tres en lugar de consolidarse con ellas.
Lo que usted ve
Un sitio en producción, atendiendo tráfico real.
Lo que ve un rastreador
robots.txt → User-agent: *
Disallow: /Consecuencia
Ninguna página se descarga nunca, así que la directiva de indexación de cada página no se lee jamás.
Toda la interfaz
El informe JSON es la interfaz: canalícelo a sus scripts, compárelo entre ejecuciones, condicione la CI con él o déselo a leer a un agente de IA. La salida del terminal es una representación de él.
$ npx @goflag/cli https://example.com
goflag https://example.com/
RED FLAG 128 pages crawled, 128 scanned
3 broken links 2 missing translations 14 SEO issues 1 site issue 0 unreachable pages
Broken links
https://example.com/blog/hreflang-basics
[404] https://example.com/guides/canonical-tags
[blocked 403 forbidden] https://api.partner.example/status
Missing translations
/blog/hreflang-basics — missing de (have en, fr)
missing-back-link https://example.com/fr/blog/hreflang-basics
/fr/blog/hreflang-basics declares an alternate to /de/... but the peer does not link back.
SEO issues
https://example.com/blog/hreflang-basics
warn canonical.missing Page is missing <link rel="canonical">.
warn description.length Description is 31 characters — short of the recommended 50–160 window.
https://example.com/pricing
error robots.conflict Page asks to be indexed while robots.txt disallows it.
warn og.image.missing Page has no og:image.
Site-wide issues
locales: en, fr, de (via sitemap)
https://example.com/
error hreflang.missing Site serves 3 locales but declares no hreflang alternates.
note: 1 link returned 403 from an anti-bot filter, not counted as broken.
Salida real; solo se ajusta el espaciado para esta página. El progreso va a stderr para que stdout quede limpio para el informe.
Bloquee por regresiones, no por perfección
Una ejecución que falla ante cualquier hallazgo es inservible en un sitio que todavía no está limpio: acaba desactivada, o ignorada sin decirlo. Tres opciones hacen que la barrera sea sostenible, y una de ellas es la que de verdad reduce la deuda acumulada.
Capture una línea base
goflag https://example.com \ --baseline .goflag/baseline.json --update-baselineCongele los hallazgos de hoy como conocidos, para que la barrera pueda preguntar si este cambio ha empeorado las cosas en lugar de si el sitio es perfecto. La salida nunca dice que el sitio esté limpio mientras queden hallazgos pendientes; dice cuántos se están dejando pasar.
Bloquee solo por lo nuevo
goflag http://localhost:3000 --no-external \ --baseline .goflag/baseline.json --regressions-onlyLos hallazgos se emparejan por huella, y las URL de las páginas se normalizan a rutas independientes del origen: así, una línea base capturada contra producción se compara sin ruido con una ejecución contra localhost.
Baje el tope, un diente cada vez
goflag … --baseline .goflag/baseline.json --max-debt 13Corrija un hallazgo, baje --max-debt en uno y haga commit de las dos cosas. Sin esto, una línea base se fosiliza detrás de una build que pasa.
En CI
Hay dos momentos que merece la pena auditar, y responden a preguntas distintas.
| Cuándo | Contra qué | Qué responde |
|---|---|---|
| En la merge request | La build de la propia rama, arrancada por --start | ¿Este cambio introduce una regresión? |
| Después de desplegar | El entorno en ejecución | ¿Es correcto lo que se está sirviendo de verdad? |
Las opciones que conviene conocer (--no-external, fijar la versión, los códigos de salida) caben en tres secciones cortas de la documentación.
Ver las recetas de CIConstruido auditando mis propios sitios
goflag existe porque cuatro sitios que gestiono lo necesitaban, este incluido: goflag.tech está protegido por su propia auditoría en CI, y un merge que la rompe no se fusiona. Todas las cifras de abajo están medidas, no estimadas.
- sitios con barrera en CI
- 4sitios con barrera en CI
- páginas auditadas en 4 min
- 456páginas auditadas en 4 min
- tests en la CLI
- 516tests en la CLI
Lo que goflag no es
Un comando, un informe JSON, un código de salida. Si lo que quiere es una cifra que optimizar, esta es la herramienta equivocada: una puntuación invita a optimizar la puntuación.
Si quiere un rastreador de escritorio con interfaz, existe Screaming Frog; si solo busca enlaces rotos, lychee es más rápido. goflag sirve para condicionar una build a lo que lee un rastreador.
Antes de instalar
Apúntelo a su sitio.
El inicio rápido le lleva de una primera ejecución en rojo a una barrera en la que confiar.
npx @goflag/cli https://example.com