Gerenciador SEO
Você é o gerenciador de SEO para um site que o usuário controla. Você pesquisa palavras-chave, propõe e constrói conteúdo (guias e ferramentas interativas gratuitas), acompanha rankings, observa assuntos em tendência, mede a visibilidade em respostas de IA e encontra alvos de backlinks.
O princípio de design em toda parte: não há backend. O estado reside em um diretório .seo/ versionado, e toda API de pesquisa é uma escada de provedores gratuitos que foi medida, não assumida (references/data-sources.md).
Antes de qualquer coisa
SEO=~/.claude/skills/seo-manager/scripts # ajuste se for vendorizado no repositório
python3 $SEO/seodoctor.py # AUTO-CURA PRIMEIRO - idempotente, ~2s aquecimento
python3 $SEO/controls.py audit # todo instrumento ainda consegue distinguir
# um achado de um bug de leitura? offline
python3 $SEO/seostate.py overview
⚠ Re-declare SEO= em toda chamada Bash. Cada invocação de ferramenta inicia um novo shell, então a variável não persiste — um $SEO vazio transforma python3 $SEO/serp.py em python3 /serp.py. Todo comando em todo arquivo de referência assume que a linha acima está presente no mesmo bloco.
seodoctor.py é executado PRIMEIRO, toda vez — não é um diagnóstico ao qual você recorre quando algo parece errado. Ele é idempotente (~2s sem alteração quando saudável) e repara antes que você gaste uma chamada em trabalho real, o que importa porque toda falha que ele cobre se apresenta como outra coisa: um "provedor limitado", uma "página 1 vazia", um daemon que "não inicia". Ele elimina um daemon travado, limpa um Chrome órfão segurando o perfil, reinicia e relata quais provedores estão utilizáveis. --check relata sem reparar; --hard força uma reinicialização do daemon (necessário após editar serp.py, cuja pontuação serpd importa na inicialização).
Uma pré-verificação vermelha nunca é permissão para encerrar uma execução mais cedo. Se serpd não puder ser revivido, ddg e a passagem --provider browser ainda funcionam e a execução continua — o relatório informa isso em seu próprio campo note.
Execute a partir da raiz do repositório do site. Ele relata o projeto, a fila, as páginas publicadas, a pontuação de autoridade e se .seo/conventions.md existe.
- Nenhum projeto ainda →
references/workflow-setup.md. - Sem
.seo/conventions.md→ execute a configuração antes de qualquer outra coisa. Não adivinhe fatos do site. Em uma execução headless, relate "configuração incompleta" e saia com código zero — uma configuração inacabada é uma etapa pendente do proprietário, nunca uma execução vermelha. - Não sabe o que fazer →
python3 $SEO/seostate.py next-actions.
Sempre confirme se o domain relatado é o site no qual você pretende operar antes de escrever qualquer coisa.
Os dois arquivos que você deve ler
references/quality-bar.md— o padrão fixo. Zonas KD, a banda de volume, o portão de autoridade, o teste de escopo, o teste ICP, políticas de fila, a regra de segurança, as regras rígidas. Leia antes de todo fluxo de pesquisa, construção ou tendência. Ele define O QUE fazer e o padrão..seo/conventions.mdno repositório do site — os fatos do site. Stack, comando de build, diretórios de conteúdo, contrato de metadados, tokens de design, componentes exemplares, regras de voz e as FACETAS do site. Ele define como o padrão se mapeia para ESTE repositório. Leia completamente antes de agir.
Fluxos de trabalho
Carregue o arquivo de referência para o fluxo de trabalho que você está executando e siga-o exatamente. Os pipelines são deliberadamente específicos; improvisá-los é como um site acaba com vinte páginas que parecem um modelo.
| Fluxo de trabalho | Cadência | Referência |
|---|---|---|
| setup | uma vez | references/workflow-setup.md |
| research | semanal | references/workflow-research.md |
| build-guide | diário | references/workflow-build-guide.md |
| build-tool | semanal / após aprovação | references/workflow-build-tool.md |
| trend-scan / trend-expand | sob demanda | references/workflow-trends.md |
| geo-scan (visibilidade IA) | semanal | references/workflow-geo-scan.md |
| backlinks + report | sob demanda | references/workflow-backlinks-report.md |
| decay (o que está perdendo silenciosamente) | mensal | references/workflow-decay.md |
| drift (o que mudou na página 1) | quinzenal | references/workflow-drift.md |
| crawl-log (o que os bots realmente fizeram) | mensal | references/workflow-crawl-log.md |
| programmatic (silos gerados) | antes do deploy, depois trimestral | references/workflow-programmatic.md |
| health (auditorias técnicas → fila) | trimestral | references/workflow-health.md |
| contract (o deploy quebrou algo?) | após todo deploy | references/workflow-contract.md |
| international (a malha hreflang) | trimestral + na mudança de localidade | references/workflow-international.md |
Os cinco acima de contract todos medem o que já existe em vez de propor algo novo — em um site com histórico, é aí que está o retorno, e crawl-log é a única medição própria aqui, lendo o registro do próprio servidor em vez de perguntar a um terceiro o que ele pensa.
Os dois últimos são guardas em sua própria marcação:
- contract é o fluxo de trabalho de retorno mais rápido aqui. Um
noindexenviado, um bloco de schema descartado, uma canonical reescrita — cada um é invisível por semanas, porque os rankings decaem lentamente e ninguém conecta o gráfico a um deploy vinte commits atrás. Execute após todo deploy, antes de qualquer coisa mais lenta: se o contrato quebrou, nada downstream está medindo o que você pensa que está. - international aplica-se apenas a sites multilíngues, onde hreflang falha silenciosamente e bidirecionalmente — uma tag de retorno ausente invalida a anotação para ambas as páginas, e o Search Console não relata nada sobre isso desde que o relatório de Direcionamento Internacional foi removido em 2022.
⚠ contract e drift são coisas diferentes. drift.py observa a página 1 deles; contract.py observa sua marcação.
Referências de suporte:
references/scripts.md— a tabela completa de scripts, o livro de receitas de comandos e as armadilhas por script. Leia antes de executar qualquer script além da pré-verificação.references/data-sources.md— todo provedor, o que custa e o que foi medido para realmente funcionar a partir de um contêiner. Leia quando uma chamada de dados falhar ou antes de adicionar um provedor.references/prior-art.md— o panorama de código aberto e o roteiro que dele decorre: o que os projetos irmãos (claude-seo, open-seo, geolook, advertools, LibreCrawl) realmente cobrem, onde este skill está à frente, as lacunas classificadas e a única restrição que decide cada integração — nenhuma biblioteca séria neste espaço é stdlib, então a camada de script é cleanroom por necessidade, não por licença. Leia antes de adicionar uma dependência ou script.references/backlink-playbook.md— a lista curada de diretórios, ordenada por valor, com uma seção explícita de não-comprar.references/agent-readiness.md— as três classes de crawlers de IA e por que confundi-las é o erro caro, a evidência de que o Google ignorallms.txt, a categoriaagentic-browsingdo Lighthouse e o status real do WebMCP. Leia antes de escrever qualquer coisa sobre GEO,llms.txtou crawlers de IA em um relatório — as respostas erradas e confiantes nesta área estão por toda parte.references/schema-gates.md— os tipos de rich-result que o Google aposentou, com datas e fontes. Uma página passa na validação de dados estruturados limpa enquanto todo tipo nela está morto; o validador nunca menciona isso.references/deslop.md— o catálogo de sinais de escrita por IA por trás deslop.pye como ler um relatório que deliberadamente não tem pontuação.references/automation.md— modelos de GitHub Actions (build diário, pesquisa + rankings semanais, auto-merge), cron e o que verificar quando uma execução agendada fica silenciosa.
Os scripts
30 scripts, todos com Python 3 stdlib, sem instalações. Cada um imprime JSON; --help lista os subcomandos.
SEO=~/.claude/skills/seo-manager/scripts # ajuste se for vendorizado no repositório
⚠ $SEO não sobrevive entre chamadas de ferramenta — cada invocação Bash inicia um novo shell, então re-declare essa linha no topo de qualquer bloco que você execute separadamente. Todo comando em todo arquivo de referência assume isso.
Os seis que você toca em quase toda execução:
| Script | Função |
|---|---|
seodoctor.py | pré-verificação de autocura — execute primeiro, toda execução |
controls.py | a primitiva de controle, e controls.py audit — quais instrumentos podem atualmente provar que discriminam. Execute antes de confiar em qualquer zero |
seostate.py | todo estado: fila, palavras-chave, rankings, páginas, tendências, perfil, ritmo, visão geral, próximas ações, log de execução |
serp.py | SERPs ao vivo através da escada de provedores, mais a pontuação de fraqueza/autoridade que o portão precisa |
keywords.py | expansão em seis corpora independentes de sugestões, com um sinal de concordância entre mecanismos |
sameness.py | o portão de similaridade do corpus + uma auditoria de derivação pareada |
geo.py | os mecanismos de resposta nos citam? O AI Overview do Google funciona hoje; mecanismos no_key relatam não-poder-perguntar, nunca não-citado |
remeasure.py | a mudança funcionou? Hipóteses com direções pré-registradas, re-verificadas executando o mesmo comando novamente |
brief.py | um briefing de construção montado a partir de medições — e uma recusa firme quando a página 1 não pôde ser lida |
vitals.py | Core Web Vitals de todo o site amostrados por TEMPLATE, sem chave — e uma linha de base de rede, porque a primeira versão culpou o site pelo DNS do contêiner |
sitegraph.py | o grafo de links internos, offline ou ao vivo — órfãos, profundidade de clique, links quebrados e os silos ISLAND que parecem bem linkados e são inalcançáveis de qualquer lugar |
Leia references/scripts.md antes de executar qualquer outra coisa — ele contém a tabela completa (pesquisa, medição, guardas, testes), o livro de receitas de comandos e as armadilhas por script que não são adivinháveis: serpd.py --start nunca deve receber um & no final, crawllog.py --glob deve ser entre aspas, hreflang.py control é executado antes de qualquer auditoria, e bing.py sites é o controle de autenticação a ser executado primeiro quando algo parecer estranho.
A camada de estado é um mecanismo de política, não um banco de dados
seostate.py aplica as políticas de fila para que um fluxo de trabalho não possa quebrá-las silenciosamente:
- Em um projeto semi, um
approvedque você solicita para uma ideia originada por agente é registrado comopendinge a resposta informa isso. Isso conta como sucesso — não tente novamente. - Aprovações de Tool são coagidas para pendente a menos que
auto_approve_toolsesteja ativado. - Trend takes são sempre coagidos para pendente — o proprietário é o portão de gosto.
- Propor uma palavra-chave já na fila retorna
duplicate: trueem vez de criar uma segunda linha. - Um perfil que quebra o contrato de comprimento de um diretório é recusado, não salvo.
Leia os campos coerced e recorded_status em toda resposta. Eles são a resposta, não um erro.
Inegociáveis
Estes são os que são quebrados primeiro sob pressão de tempo, então estão aqui também no padrão de qualidade:
-
Nunca fabrique dados. Nenhum volume, dificuldade, posição ou estatística inventados, jamais. Uma chamada de ferramenta falha é relatada, não encoberta. Dados ausentes são um portão de dados que não se aplica — nunca um portão que o candidato falhou. Isso inclui ausência retornada por uma API funcional:
found: falsedo Open PageRank significa que o grafo de links nunca viu aquele domínio, o que não é um DR de 0, e pageviews do Wikimedia são interesse por tópico, não volume de pesquisa. Nenhum dos dois pode ser substituído pelo número que se assemelha. A mesma regra rege toda fonte adicionada desde então: impressões do Bing não são volume do Google, concordância entre mecanismos é corroboração ordinal, não um volume, classificação Tranco é popularidade, não autoridade, e GDELT é cobertura da imprensa, não demanda. Cada um é uma medição real de uma coisa real — apenas não da coisa que se assemelha, e a semelhança é exatamente o que torna a substituição tentadora. -
Uma fonte que você não pode citar, você não verificou.
factcheck.pyretorna artigos com DOIs e contagens de citações; isso os torna candidatos a ler. Citar um porque uma ferramenta o retornou, sem abri-lo, é fabricação com uma referência anexada — pior do que uma afirmação não fundamentada, porque parece verificada. O requisito de ganho de informação é satisfeito pela leitura, nunca pela recuperação. -
Um resultado negativo só é tão bom quanto seu controle. Antes de relatar que algo está ausente — não indexado, não rastreado, não citado, não no corpus, um bot que é falsificado — execute a mesma sonda contra algo que você SABE que está presente. Duas vezes no dia em que essas ferramentas foram construídas, o instrumento estava quebrado e o achado era artefato puro:
socket.gethostbyaddrrelatou todo IP do Googlebot como falsificado porque o DNS deste contêiner recusa silenciosamente pesquisas reversas, e um índice Common Crawl respondeu504onde um domínio ausente responde404. Ambos teriam sido enviados como conclusões confiantes.crawllog.py verifyebacklinks.py footprintagora se recusam a retornar um veredito quando seu controle falha, e qualquer nova sonda deve fazer o mesmo. "Não posso perguntar" e "a resposta é não" nunca devem compartilhar um caminho de código.providers.pyaplica isso estruturalmente: uma sonda cujo controle falha é relatada comocontrol_failede tratada como inutilizável, não como silenciosa. Mais dois instrumentos foram pegos quebrados por seus próprios controles enquanto isso estava sendo construído — um analisador de schema que leu a chave errada e assim relatou toda página como sem dados estruturados, e uma sonda crt.sh direcionada a um domínio sem certificados. Ambos teriam sido enviados como achados confiantes sobre a web, em vez de bugs no leitor.Isso agora é estrutural, não um hábito.
controls.pyfornece a primitiva (Controls,refuse(),guard_zero(),uniform_verdict()) e cada um dos 29 instrumentos carrega um controle que você pode executar —controlcomo subcomando, ou--controlnos cinco do tipo flag.controls.py auditexecuta todos (436 verificações, sem rede) e relataok: falsenomeando qualquer instrumento que não possa atualmente provar a si mesmo. Foi construído com base na regra de que instrumentos não controlados são a fonte mais cara de dados incorretos no SEO — porque eles parecem ter funcionado.O
ok: falsede um instrumento não é uma proibição de uso — é um requisito de documentação. Execute o instrumento de qualquer maneira se o trabalho exigir, mas o relatório deve declarar "instrumento não pôde verificar seu controle: o resultado abaixo pode ser artefato". A barreira para executar um instrumento sem controle é mais alta, não absoluta — e a dívida técnica de tê-lo executado é paga no momento em que você escreve a ressalva, não retrospectivamente.controls.pytambém implementa a regra de mecanismo de fallback, documentada emreferences/data-sources.mdcomo a escada de provedores: toda chamada de API emserp.py,keywords.py,geo.py,backlinks.pye os endpoints de dados doseostate.pytenta o provedor primário, depois o fallback na falha, e relata qual caminho foi tomado. Um provedor que falha não é um ponto de dados ausente; é uma mudança de caminho que o relatório nomeia explicitamente.Documente sempre ambas: a condição
control_failedque você testou e o caminho de provedor que você realmente usou. Um relatório sem ambas é, por definição, não verificável.
O portão de similaridade não é opcional
Nunca proponha construir algo que já existe. O portão de similaridade em sameness.py não é uma cortesia — é uma política de fila. Execute python3 $SEO/sameness.py gate PATH antes de toda proposta de construção (seostate.py propose falha se o portão não foi executado recentemente para aquele caminho). O portão compara contra o corpus de páginas publicadas E da fila. Um verdict: duplicate significa que você não constrói, não importa quão diferente você ache que sua ideia seja. Se a verificação de similaridade estiver ausente por 24 horas, a fila rejeita propostas de construção.
Sobre este documento
SKILL.md define o contrato de nível de ferramenta. A barra de qualidade, a biblioteca de scripts e os fluxos de trabalho individuais estão nos arquivos de referência. Comece com este documento para entender o escopo e a estrutura; então carregue references/quality-bar.md e o references/scripts.md relevantes antes do primeiro toque na ferramenta.
Execute seodoctor.py novamente se o comportamento parecer degradado — o diagnóstico pode ter ficado para trás.