Pular para o conteúdo

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.com
commit

Uma tag muda.

dia 0

Sem goflag

publicado

Vai para produção.

dia 0
despercebido

A página sai do índice.

semanas depois
tarde demais

Alguém pergunta por que o tráfego caiu.

meses depois

Com goflag

detectado na CI

A CI levanta a bandeira.

4 min depois
corrigido

Uma pessoa ou um agente corrige.

minutos depois
publicado limpo

Vai para produção limpo.

ainda no dia 0

O 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> anywhere

Consequê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.

  1. Capture um baseline

    goflag https://example.com \
      --baseline .goflag/baseline.json --update-baseline

    Congele 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.

  2. Faça o gate no que é novo

    goflag http://localhost:3000 --no-external \
      --baseline .goflag/baseline.json --regressions-only

    Os 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.

  3. Baixe a catraca

    goflag … --baseline .goflag/baseline.json --max-debt 13

    Corrija 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.

QuandoContraResponde
No merge requestO build da própria branch, iniciado por --startEsta mudança causa regressão?
Depois do deployO ambiente em execuçãoO 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 CI

Construí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

Não. Ele precisa de uma URL. O goflag lê o que um rastreador lê, e é também por isso que ele pega coisas que um build local não mostra: a URL base real, o que o proxy serve como robots.txt, os redirecionamentos.

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