Sua página está perfeita. O Google não a vê mais.
O goflag é uma CLI que lê o seu site como um rastreador lê, e faz falhar uma etapa de CI antes que um defeito invisível chegue à produção.
npx @goflag/cli https://example.comUma tag muda.
dia 0Sem goflag
Vai para produção.
dia 0A página sai do índice.
semanas depoisAlguém pergunta por que o tráfego caiu.
meses depoisCom goflag
A CI levanta a bandeira.
4 min depoisUma pessoa ou um agente corrige.
minutos depoisVai para produção limpo.
ainda no dia 0O que um navegador não consegue mostrar
Cada um destes casos renderiza perfeitamente. O defeito está na parte da página que ninguém olha, e o preço é pago em um índice de busca que você nunca vê.
O que você vê
Uma página que renderiza exatamente como foi projetada.
O que um rastreador vê
<link rel="canonical" href="/another-page">Consequência
A página pede para ser descartada em favor de outra. E será.
O que você vê
Quatro idiomas, todos alcançáveis.
O que um rastreador vê
no <link rel="alternate" hreflang> anywhereConsequência
Cada tradução compete com as outras três em vez de se consolidar com elas.
O que você vê
Um site em produção, servindo tráfego.
O que um rastreador vê
robots.txt → User-agent: *
Disallow: /Consequência
Nenhuma página chega a ser buscada, então a diretiva de indexação de cada página nunca é lida.
A interface inteira
O relatório JSON é a interface: encadeie com pipe nos seus scripts, compare entre execuções, condicione o CI a ele ou entregue para um agente de IA ler. A saída do terminal é uma renderização dele.
$ 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.
Saída real; só o espaçamento foi ajustado para a página. O progresso vai para o stderr, então o stdout fica limpo para o relatório.
Faça o gate nas regressões, não na perfeição
Uma execução que falha diante de qualquer achado é inutilizável em um site que ainda não está limpo, então ela é desligada, ou ignorada em silêncio. Três flags tornam o gate sustentável, e uma delas faz o acúmulo realmente diminuir.
Capture um baseline
goflag https://example.com \ --baseline .goflag/baseline.json --update-baselineCongele os achados de hoje como conhecidos, para que o gate pergunte se esta mudança piorou as coisas em vez de perguntar se o site está perfeito. A saída nunca diz que está limpo enquanto houver achados em aberto; ela diz quantos estão sendo deixados passar.
Faça o gate no que é novo
goflag http://localhost:3000 --no-external \ --baseline .goflag/baseline.json --regressions-onlyOs achados são casados por fingerprint, e as URLs das páginas são normalizadas para rotas independentes de origem, assim um baseline capturado contra produção se compara sem ruído com uma execução contra localhost.
Baixe a catraca
goflag … --baseline .goflag/baseline.json --max-debt 13Corrija um achado, reduza --max-debt em um, faça commit dos dois. Sem isso, um baseline fossiliza atrás de um build que passa.
No CI
Dois momentos valem uma auditoria, e eles respondem perguntas diferentes.
| Quando | Contra | Responde |
|---|---|---|
| No merge request | O build da própria branch, iniciado por --start | Esta mudança causa regressão? |
| Depois do deploy | O ambiente em execução | O que está sendo servido de fato está correto? |
As flags que valem conhecer (--no-external, fixar a versão, os códigos de saída) cabem em três seções curtas da documentação.
Ver as receitas de CIConstruído auditando meus próprios sites
O goflag existe porque quatro sites que eu mantenho precisavam dele, este incluído: goflag.tech é protegido pela sua própria auditoria no CI, e um merge que a quebra não passa. Cada número abaixo é medido, não estimado.
- sites com gate no CI
- 4sites com gate no CI
- páginas auditadas em 4 min
- 456páginas auditadas em 4 min
- testes na CLI
- 516testes na CLI
O que o goflag não é
Um comando, um relatório JSON, um código de saída. Se o que você quer é um número para otimizar, esta é a ferramenta errada: uma pontuação convida a otimizar a pontuação.
Se você quer um rastreador de desktop com interface, o Screaming Frog existe; se só procura links quebrados, o lychee é mais rápido. O goflag serve para condicionar um build ao que um rastreador lê.
Antes de instalar
Aponte para o seu site.
O início rápido leva você de uma primeira execução vermelha a um gate em que você confia.
npx @goflag/cli https://example.com