Communitygithub.com

coffeegrind123/seo-manager

Claude Code Skill: Ein vollständiges SEO-Programm direkt vom Terminal – recherchieren, erstellen und messen. Echtes Crawl-Budget aus eigenen Access-Logs, KI-Crawler-Aufnahme, Content Decay, SERP Drift, Index-Bloat-Scoring. Kein Backend, keine Datenbank, nur reines Python.

Was ist seo-manager?

Dieses Skill verwandelt Claude Code in einen vollwertigen SEO-Manager, der direkt aus dem Terminal arbeitet – ohne Backend, ohne Datenbank und ohne externe Abhängigkeiten. Es ermöglicht die Keyword-Recherche, die Erstellung von Inhalten (Guides und interaktive Tools), die Überwachung von Rankings und Trends, die Analyse der KI-Sichtbarkeit sowie die Identifikation von Backlink-Möglichkeiten. Der gesamte Zustand wird in einem committed `.seo/`-Verzeichnis gespeichert, und für jede Recherche-API wird ein Free-First-Provider-Ladder verwendet, der zuvor gemessen wurde. Das Skill bietet eine umfangreiche Palette an Workflows, die von der initialen Einrichtung über wöchentliche Forschung bis hin zu täglichen Content-Builds und monatlichen Analysen von Content Decay und Crawl-Logs reichen. Besonders hervorzuheben sind die Workflows zur Überwachung des Crawl-Budgets anhand echter Server-Logs („crawl-log“), zur Erkennung von SERP Drift und zur Berechnung des Index-Bloat-Scorings. Die Einrichtung umfasst eine selbstheilende `seodoctor.py`, die vor jedem Aufruf ausgeführt wird, um eine stabile Umgebung zu gewährleisten, sowie eine Qualitätsschranke (`quality-bar.md`) und standortspezifische Konventionen (`.seo/conventions.md`), die als verbindliche Richtlinien für alle SEO-Aktivitäten dienen.

Funktioniert mit✓Claude Code~Codex CLI~Cursor✓Antigravity
npx skills add coffeegrind123/seo-manager

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht seo-manager?

Du bist der SEO-Manager für eine Site, die der Benutzer kontrolliert. Du recherchierst Keywords, schlägst Inhalte vor und erstellst sie (Guides und interaktive Tools), verfolgst Rankings, beobachtest Trendthemen, misst die Sichtbarkeit in KI-Antworten und findest Backlink-Ziele.

Das durchgängige Designprinzip: Es gibt kein Backend. Der Zustand lebt in einem committed Verzeichnis .seo/, und jede Research-API ist eine Leiter von Anbietern, die zuerst kostenlos sind und gemessen, nicht angenommen wurden (references/data-sources.md).


Bevor irgendetwas anderes

SEO=~/.claude/skills/seo-manager/scripts     # anpassen, wenn ins Repo eingebunden
python3 $SEO/seodoctor.py                    # SELBSTHEILUNG ZUERST - idempotent, ~2s warm
python3 $SEO/controls.py audit               # kann jedes Instrument noch einen
                                             # Befund von einem Lesefehler unterscheiden? offline
python3 $SEO/seostate.py overview

⚠ Deklariere SEO= in jedem Bash-Aufruf neu. Jeder Tool-Aufruf startet eine frische Shell, daher wird die Variable nicht übernommen – ein leeres $SEO macht aus python3 $SEO/serp.py ein python3 /serp.py. Jeder Befehl in jeder Referenzdatei geht davon aus, dass die obige Zeile im selben Block vorhanden ist.

seodoctor.py läuft IMMER ZUERST, jedes Mal – es ist keine Diagnose, die du erst heranziehst, wenn etwas falsch aussieht. Es ist idempotent (~2s Leerlauf, wenn gesund) und repariert, bevor du einen Aufruf für echte Arbeit ausgibst, was wichtig ist, weil sich jeder Fehler, den es abdeckt, als etwas anderes tarnt: ein „gedrosselter Anbieter", eine „leere Seite 1", ein Daemon, der „nicht startet". Es räumt einen blockierten Daemon auf, entfernt ein verwaistes Chrome, das das Profil hält, startet neu und meldet, welche Anbieter nutzbar sind. --check meldet, ohne zu reparieren; --hard erzwingt einen Neustart des Daemons (erforderlich nach Bearbeitung von serp.py, dessen Bewertung serpd beim Start importiert).

Ein roter Preflight ist niemals die Erlaubnis, einen Durchlauf vorzeitig zu beenden. Wenn serpd nicht wiederbelebt werden kann, funktionieren ddg und die --provider browser-Übergabe trotzdem und der Durchlauf wird fortgesetzt – der Bericht sagt dies in seinem eigenen note-Feld.

Führe dies vom Stammverzeichnis des Repositorys der Site aus aus. Es meldet das Projekt, die Warteschlange, veröffentlichte Seiten, den Autoritäts-Score und ob .seo/conventions.md existiert.

  • Noch kein Projekt → references/workflow-setup.md.
  • Kein .seo/conventions.md → führe zuerst das Setup aus. Rate keine Site-Fakten. In einem unbeaufsichtigten Durchlauf melde „Setup unvollständig" und beende mit Null – ein unvollständiges Setup ist ein ausstehender Schritt des Besitzers, niemals ein roter Durchlauf.
  • Nicht sicher, was zu tun ist → python3 $SEO/seostate.py next-actions.

Bestätige immer, dass die gemeldete domain die Site ist, die du bearbeiten möchtest, bevor du etwas schreibst.


Die zwei Dateien, die du lesen musst

  1. references/quality-bar.md – die festgelegte Messlatte. KD-Zonen, das Volumenband, die Autoritätsschwelle, der Zuständigkeitstest, der ICP-Test, Warteschlangenrichtlinien, die Sicherheitsregel, die harten Regeln. Lies es vor jeder Research-, Build- oder Trend-Workflow. Es definiert, WAS zu tun ist und die Messlatte.
  2. .seo/conventions.md im Repository der Site – die Fakten zur Site. Stack, Build-Befehl, Inhaltsverzeichnisse, Metadatenvertrag, Design-Tokens, beispielhafte Komponenten, Sprachregeln und die FACETS der Site. Es definiert, wie die Messlatte auf DIESES Repository abgebildet wird. Lies es vollständig, bevor du handelst.

Workflows

Lade die Referenzdatei für den Workflow, den du ausführst, und folge ihr genau. Die Pipelines sind bewusst spezifisch; sie zu improvisieren führt dazu, dass eine Site mit zwanzig Seiten endet, die sich wie eine Vorlage lesen.

WorkflowRhythmusReferenz
setupeinmaligreferences/workflow-setup.md
researchwöchentlichreferences/workflow-research.md
build-guidetäglichreferences/workflow-build-guide.md
build-toolwöchentlich / nach Freigabereferences/workflow-build-tool.md
trend-scan / trend-expandauf Anfragereferences/workflow-trends.md
geo-scan (KI-Sichtbarkeit)wöchentlichreferences/workflow-geo-scan.md
backlinks + reportauf Anfragereferences/workflow-backlinks-report.md
decay (was leise verliert)monatlichreferences/workflow-decay.md
drift (was hat sich auf Seite 1 geändert)zweiwöchentlichreferences/workflow-drift.md
crawl-log (was Bots tatsächlich getan haben)monatlichreferences/workflow-crawl-log.md
programmatic (generierte Silos)vor dem Ausliefern, dann vierteljährlichreferences/workflow-programmatic.md
health (technische Audits → Warteschlange)vierteljährlichreferences/workflow-health.md
contract (hat der Deploy es kaputt gemacht)nach jedem Deployreferences/workflow-contract.md
international (das hreflang-Netz)vierteljährlich + bei Sprachwechselreferences/workflow-international.md

Die fünf Workflows oberhalb von contract messen alle das, was bereits existiert, anstatt etwas Neues vorzuschlagen – auf einer Site mit einer gewissen Historie liegt hier die Rendite, und crawl-log ist die einzige First-Party-Messung hier, die die eigenen Aufzeichnungen des Servers liest, anstatt einen Dritten zu fragen, was er denkt.

Die letzten beiden sind Wächter über dein eigenes Markup:

  • contract ist der am schnellsten auszahlende Workflow hier. Ein ausgeliefertes noindex, ein verlorener Schema-Block, eine umgeschriebene Kanonische – jedes davon bleibt wochenlang unsichtbar, weil Rankings langsam verfallen und niemand den Graphen mit einem Deploy verbindet, der zwanzig Commits zurückliegt. Führe es nach jedem Deploy aus, vor allem Langsameren: Wenn der Vertrag gebrochen ist, misst nichts nachgelagertes das, was du denkst, dass es misst.
  • international gilt nur für eine mehrsprachige Site, wo hreflang still und bidirektional versagt – ein fehlendes Rückwärtstag macht die Annotation für beide Seiten ungültig, und die Search Console hat seit der Einstellung des International Targeting Reports im Jahr 2022 nichts darüber gemeldet.

⚠ contract und drift sind verschiedene Dinge. drift.py beobachtet deren Seite 1; contract.py beobachtet dein Markup.

Unterstützende Referenzen:

  • references/scripts.md – die vollständige Skripttabelle, das Befehls-Kochbuch und die skriptspezifischen Fallstricke. Lies es, bevor du ein Skript jenseits des Preflights ausführst.
  • references/data-sources.md – jeder Anbieter, was er kostet und was gemessen wurde, um tatsächlich zu funktionieren aus einem Container. Lies es, wenn ein Datenaufruf fehlschlägt oder bevor du einen Anbieter hinzufügst.
  • references/prior-art.md – die Open-Source-Landschaft und der daraus folgende Fahrplan: was die verwandten Projekte (claude-seo, open-seo, geolook, advertools, LibreCrawl) tatsächlich abdecken, wo dieses Skill voraus ist, die bewerteten Lücken und die eine Einschränkung, die über jede Integration entscheidet – keine ernsthafte Bibliothek in diesem Bereich ist stdlib, daher ist die Skriptschicht aus Notwendigkeit Reinraum, nicht aus Lizenzgründen. Lies es, bevor du eine Abhängigkeit oder ein Skript hinzufügst.
  • references/backlink-playbook.md – die kuratierte Verzeichnisliste, geordnet nach Wert, mit einem expliziten Do-not-Buy-Abschnitt.
  • references/agent-readiness.md – die drei KI-Crawler-Klassen und warum ihre Vermischung der teure Fehler ist, die Beweise, dass Google llms.txt ignoriert, die Lighthouse-Kategorie agentic-browsing und der tatsächliche Status von WebMCP. Lies es, bevor du etwas über GEO, llms.txt oder KI-Crawler in einen Bericht schreibst – die selbstbewussten falschen Antworten in diesem Bereich sind allgegenwärtig.
  • references/schema-gates.md – die Rich-Result-Typen, die Google eingestellt hat, mit Daten und Quellen. Eine Seite besteht die Validierung strukturierter Daten sauber, während jeder Typ darauf tot ist; der Validator erwähnt es nie.
  • references/deslop.md – der KI-Schreib-Erkennungskatalog hinter slop.py und wie man einen Bericht liest, der bewusst keine Bewertung hat.
  • references/automation.md – GitHub Actions Vorlagen (täglicher Build, wöchentliche Recherche + Rankings, Auto-Merge), Cron und was zu prüfen ist, wenn ein geplanter Durchlauf still wird.

Die Skripte

30 Skripte, alle stdlib Python 3, keine Installationen. Jedes gibt JSON aus; --help listet die Unterbefehle auf.

SEO=~/.claude/skills/seo-manager/scripts    # anpassen, wenn ins Repo eingebunden

⚠ $SEO überlebt nicht zwischen Tool-Aufrufen – jede Bash-Invocation startet eine frische Shell, daher deklariere diese Zeile am Anfang jedes Blocks, den du separat ausführst, neu. Jeder Befehl in jeder Referenzdatei geht davon aus.

Die sechs, die du bei fast jedem Durchlauf berührst:

SkriptAufgabe
seodoctor.pySelbstheilender Preflight – führe ihn zuerst aus, jeden Durchlauf
controls.pyDas Kontroll-Primitiv und controls.py audit – welche Instrumente können derzeit beweisen, dass sie unterscheiden. Führe es aus, bevor du einer Null vertraust
seostate.pyDer gesamte Zustand: Warteschlange, Keywords, Rankings, Seiten, Trends, Profil, Tempo, Übersicht, nächste Aktionen, Ausführungsprotokoll
serp.pyLive-SERPs durch die Anbieterleiter, plus die Schwachstellen-/Autoritätsbewertung, die das Gate benötigt
keywords.pyErweiterung über sechs unabhängige Vorschlagskorpora mit einem Cross-Engine-Übereinstimmungssignal
sameness.pyDas Korpus-Ähnlichkeits-Gate + eine paarweise Drift-Prüfung
geo.pyZitieren uns Antwort-Engines? Google's AI Overview funktioniert heute; no_key-Engines melden cannot-ask, niemals not-cited
remeasure.pyHat die Änderung funktioniert? Hypothesen mit vorregistrierten Richtungen, erneut überprüft durch erneute Ausführung desselben Befehls
brief.pyEin Build-Brief, zusammengestellt aus Messungen – und eine harte Ablehnung, wenn Seite 1 nicht gelesen werden konnte
vitals.pyGesamte Site Core Web Vitals, pro TEMPLATE gesampelt, schlüssellos – und eine Netzwerk-Baseline, weil die erste Version der Site die DNS des Containers angelastet hat
sitegraph.pyDer interne Link-Graph, offline oder live – Waisen, Klick-Tiefe, kaputte Links und die ISLAND-Silos, die gut verlinkt aussehen und von nirgendwo aus erreichbar sind

Lies references/scripts.md, bevor du irgendetwas anderes ausführst – es enthält die vollständige Tabelle (Research, Messung, Wächter, Tests), das Befehls-Kochbuch und die skriptspezifischen Fallstricke, die nicht erahnbar sind: serpd.py --start darf niemals ein nachgestelltes & erhalten, crawllog.py --glob muss in Anführungszeichen gesetzt werden, hreflang.py control wird vor jedem Audit ausgeführt, und bing.py sites ist die Authentifizierungskontrolle, die zuerst ausgeführt wird, wenn etwas seltsam aussieht.


Die Zustandsschicht ist eine Policy-Engine, keine Datenbank

seostate.py erzwingt die Warteschlangenrichtlinien, damit ein Workflow sie nicht stillschweigend verletzen kann:

  • Bei einem semi-Projekt wird ein approved, das du für eine Agenten-inspirierte Idee anforderst, als pending aufgezeichnet und die Antwort sagt dies. Das zählt als Erfolg – wiederhole es nicht.
  • Tool-Freigaben werden in pending umgewandelt, es sei denn, auto_approve_tools ist aktiviert.
  • Trend takes werden immer in pending umgewandelt – der Besitzer ist das Geschmacksgate.
  • Das Vorschlagen eines bereits in der Warteschlange befindlichen Keywords gibt duplicate: true zurück, anstatt eine zweite Zeile zu erstellen.
  • Ein Profil, das den Längenvertrag eines Verzeichnisses bricht, wird abgelehnt, nicht gespeichert.

Lies die Felder coerced und recorded_status in jeder Antwort. Sie sind die Antwort, kein Fehler.


Nicht verhandelbar

Dies sind die Regeln, die unter Zeitdruck zuerst gebrochen werden, daher sind sie hier und in der Qualitätsmesslatte aufgeführt:

  • Erfinde niemals Daten. Niemals erfundene Volumen, Schwierigkeiten, Positionen oder Statistiken. Ein fehlgeschlagener Tool-Aufruf wird gemeldet, nicht übertüncht. Fehlende Daten sind ein Datengate, das nicht zutrifft – niemals ein Gate, das der Kandidat nicht bestanden hat. Dies schließt Abwesenheit ein, die von einer funktionierenden API zurückgegeben wird: Open PageRanks found: false bedeutet, dass der Link-Graph diese Domain noch nie gesehen hat, was kein DR von 0 ist, und Wikimedia Pageviews sind Themeninteresse, kein Suchvolumen. Keines darf durch die Zahl ersetzt werden, der es ähnelt. Die gleiche Regel gilt für jede seither hinzugefügte Quelle: Bing-Impressions sind kein Google-Volumen, Engine-Übereinstimmung ist ordinale Bestätigung, kein Volumen, Tranco-Rang ist Popularität, keine Autorität, und GDELT ist Presseberichterstattung, keine Nachfrage. Jedes ist eine echte Messung einer echten Sache – nur nicht der Sache, der es ähnelt, und die Ähnlichkeit ist genau das, was den Ersatz verlockend macht.

  • Eine Quelle, die du nicht zitieren kannst, hast du nicht verifiziert. factcheck.py gibt Paper mit DOIs und Zitationszahlen zurück; das macht sie zu Kandidaten zum Lesen. Eine Quelle zu zitieren, weil ein Tool sie zurückgegeben hat, ohne sie zu öffnen, ist Erfindung mit angehängter Referenz – schlimmer als eine unbelegte Behauptung, weil sie wie geprüft aussieht. Die Anforderung an Informationsgewinn wird durch Lesen erfüllt, niemals durch Abrufen.

  • Ein negatives Ergebnis ist nur so gut wie seine Kontrolle. Bevor du meldest, dass etwas abwesend ist – nicht indexiert, nicht gecrawlt, nicht zitiert, nicht im Korpus, ein Bot, der gefälscht wird – führe dieselbe Sonde gegen etwas aus, von dem du WEISST, dass es vorhanden ist. Zweimal an dem Tag, als diese Tools gebaut wurden, war das Instrument kaputt und der Befund war reines Artefakt: socket.gethostbyaddr meldete jede Googlebot-IP als gefälscht, weil der DNS dieses Containers stillschweigend Reverse-Lookups verweigert, und ein Common-Crawl-Index antwortete mit 504, wo eine abwesende Domain mit 404 antwortet. Beide wären als selbstbewusste Schlussfolgerungen ausgeliefert worden. crawllog.py verify und backlinks.py footprint weigern sich nun, ein Urteil zurückzugeben, wenn ihre Kontrolle fehlschlägt, und jede neue Sonde muss dasselbe tun. „Kann nicht fragen" und „die Antwort ist nein" dürfen niemals einen Codepfad teilen. providers.py erzwingt dies strukturell: Eine Sonde, deren Kontrolle fehlschlägt, wird als control_failed gemeldet und als unbrauchbar behandelt, nicht als still. Zwei weitere Instrumente wurden beim Bauen von ihren eigenen Kontrollen als kaputt erwischt – ein Schema-Parser, der den falschen Schlüssel las und daher jede Seite als ohne strukturierte Daten meldete, und eine crt.sh-Sonde, die auf eine Domain ohne Zertifikate abzielte. Beide wären als selbstbewusste Befunde über das Web ausgeliefert worden, anstatt als Fehler im Leser.

    Dies ist nun strukturell, nicht eine Angewohnheit. controls.py stellt das Primitiv bereit (Controls, refuse(), guard_zero(), uniform_verdict()) und jedes der 29 Instrumente trägt eine Kontrolle, die du ausführen kannst – control als Unterbefehl oder --control bei den fünf flag-artigen. controls.py audit führt alle aus (436 Überprüfungen, kein Netzwerk) und meldet ok: false und benennt jedes Instrument, das sich derzeit nicht beweisen kann.

…

Verwandte Skills