seo-drift について
seo-driftは、ページのベースラインを保存し、SEOの変化を追跡するCodexスキルです。スナップショットを比較して重要度別に分類し、ベースラインと比較履歴をローカルのSQLiteに保存します。
主な機能
- 01ページのSEOベースライン取得
- 02現在の状態とスナップショットの比較
- 03重要度別の変更分類
- 04ローカルSQLiteでの履歴管理
- 05任意のHTML比較レポート
活用シーン
- 01デプロイ後のSEO変更確認
- 02ページの変化や回帰の継続監視
- 03トラフィック低下に関連する変更の調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ agricidaniel/ codex-seo --skill seo-driftインストール後、Claude Code で/seo-driftを入力して読み込まれたか確認します。
同梱ファイルreferences/comparison-rules.md
詳細
SEO ドリフトモニター(2026年4月)
共有データキャッシュ
ステップ 0 -- 共有データキャッシュを確認します:
情報を収集する前に、関連する SEO スキルで再利用できるコンテキストがないか .seo-cache/ を確認します。
スキーマと依存関係マップについては、../seo/references/shared-data-cache.md を参照してください。
次のキャッシュファイルが存在する場合は確認します:
-
.seo-cache/site-meta.json:ドメイン、ビジネスタイプ、業界、クロールのコンテキスト -
.seo-cache/audit-scores.json:以前のフル監査での優先項目 -
.seo-cache/pages/{url-slug}/page-analysis.json:URL が指定されている場合のページレベルのコンテキスト -
見つかった場合:明らかに有効なフィールドを解析して使用します(「[日付] の [X] をキャッシュから使用」と記録します)
-
見つからない、破損している、または関連性がない場合:新たな証拠の収集を続けます
-
ユーザーが「refresh」または「re-run」と指示した場合:キャッシュの読み込みを無視し、書き込み時に上書きします
SEO のための Git です。ベースラインを取得し、低下を検出し、変更を経時的に追跡します。
コマンド
| コマンド | 目的 |
|---|---|
/seo drift baseline <url> | 現在の SEO 状態を「正常」と確認されたスナップショットとして取得します |
/seo drift compare <url> | 現在のページ状態を保存済みのベースラインと比較します |
/seo drift history <url> | 変更履歴と過去の比較結果を表示します |
取得する情報
各ベースラインには、SEO に不可欠な次の要素が記録されます:
| 要素 | フィールド | ソース |
|---|---|---|
| タイトルタグ | title | parse_html.py |
| メタディスクリプション | meta_description | parse_html.py |
| 正規 URL | canonical | parse_html.py |
| Robots ディレクティブ | meta_robots | parse_html.py |
| H1 見出し | h1 (array) | parse_html.py |
| H2 見出し | h2 (array) | parse_html.py |
| H3 見出し | h3 (array) | parse_html.py |
| JSON-LD スキーマ | schema (array) | parse_html.py |
| Open Graph タグ | open_graph (dict) | parse_html.py |
| Core Web Vitals | cwv (dict) | pagespeed_check.py |
| HTTP ステータスコード | status_code | fetch_page.py |
| HTML コンテンツハッシュ | html_hash (SHA-256) | 算出 |
| スキーマコンテンツハッシュ | schema_hash (SHA-256) | 算出 |
比較の仕組み
比較エンジンは、3 段階の重大度にわたる 17 のルールを適用します。しきい値、
推奨される対応、スキル間の参照を含むルールセット全体については、
references/comparison-rules.md を読み込んでください。
重大度レベル
| レベル | 意味 | 対応時間 |
|---|---|---|
| CRITICAL | SEO に重大な影響を与える変更で、トラフィック減少の可能性があります | 直ちに |
| WARNING | 影響の可能性があり、調査が必要です | 1 週間以内 |
| INFO | 周知のみを目的とし、意図的な変更の可能性があります | 都合のよいときに確認 |
保存
すべてのデータは SQLite にローカル保存されます:
~/.cache/codex-seo/drift/baselines.db
テーブル
- baselines:すべての SEO 要素を含む取得済みスナップショット
- comparisons:発動したルールと重大度を含む差分結果
URL の正規化により、一貫した照合が可能になります:スキームとホストを小文字に変換し、デフォルトポート(80/443)を削除し、クエリパラメーターを並べ替え、UTM パラメーターと末尾のスラッシュを削除します。
コマンド:baseline
ページの現在の状態を取得して保存します。
手順:
- URL を検証します(
google_auth.validate_url()による SSRF 保護) scripts/fetch_page.pyでページを取得しますscripts/parse_html.pyで HTML を解析します- 必要に応じて
scripts/pagespeed_check.pyで CWV を取得します(スキップするには--skip-cwvを使用します) - HTML 本文とスキーマコンテンツのハッシュを計算します(SHA-256)
- スナップショットを SQLite に保存します
実行:
python scripts/drift_baseline.py <url>
python scripts/drift_baseline.py <url> --skip-cwv
出力: ベースライン ID、タイムスタンプ、URL、取得した要素の概要を含む JSON。
コマンド:compare
ページの現在の状態を取得し、最新のベースラインと比較します。
手順:
- URL を検証します
- SQLite から最新のベースラインを読み込みます(または特定の
--baseline-idを指定します) - ページの現在の状態を取得して解析します
- 17 個すべての比較ルールを実行します
- 検出結果を重大度別に分類します
- 比較結果を保存します
- 差分レポートを JSON で出力します
実行:
python scripts/drift_compare.py <url>
python scripts/drift_compare.py <url> --baseline-id 5
python scripts/drift_compare.py <url> --skip-cwv
出力: 発動したすべてのルール、変更前後の値、重大度、対応策を含む JSON。
比較後、HTML レポートの生成を提案します:
python scripts/drift_report.py <comparison_json_file> --output drift-report.html
コマンド:history
URL に対するすべてのベースラインと比較結果を表示します。
実行:
python scripts/drift_history.py <url>
python scripts/drift_history.py <url> --limit 10
出力: タイムスタンプと比較の概要を含むベースラインの JSON 配列(新しい順)。
スキル間の連携
ドリフトが検出された場合は、適切な専門スキルを推奨します。
| 検出内容 | 推奨事項 |
|---|---|
| スキーマが削除または変更された | 完全な検証を行うには、/seo schema <url> を実行してください |
| CWV の悪化 | パフォーマンス監査を行うには、/seo technical <url> を実行してください |
| タイトルまたはメタディスクリプションが変更された | コンテンツ分析を行うには、/seo page <url> を実行してください |
| canonical が変更または削除された | インデックス登録可能性を確認するには、/seo technical <url> を実行してください |
| noindex が追加された | クロール可能性を監査するには、/seo technical <url> を実行してください |
| H1/見出し構造が変更された | E-E-A-T を確認するには、/seo content <url> を実行してください |
| OG タグが削除された | ソーシャル共有の分析を行うには、/seo page <url> を実行してください |
| ステータスコードがエラーに変わった | 完全な診断を行うには、/seo technical <url> を実行してください |
エラー処理
| 状況 | 対応 |
|---|---|
| URL に到達できない | fetch_page.py のエラーを報告します。状態を推測しないでください。ユーザーに URL の確認を促してください。 |
| URL のベースラインが存在しない | ユーザーにその旨を伝え、まず baseline を実行するよう提案してください。 |
| SSRF によりブロックされた(プライベート IP) | validate_url() による拒否を報告します。決して回避しないでください。 |
| SQLite データベースが見つからない | 初回使用時に自動作成します。エラーではありません。 |
| CWV の取得に失敗した(API キーなし) | CWV フィールドには null を保存します。比較時に CWV ルールをスキップします。 |
| ページが 4xx/5xx を返す | ベースラインとして引き続き取得します(ステータスコードは追跡対象のフィールドです)。 |
| 複数のベースラインが存在する | --baseline-id が指定されていない限り、最新のものを使用します。 |
セキュリティ
- すべての URL 取得は、SSRF 保護(プライベート IP、ループバック、予約済みアドレス範囲、GCP メタデータエンドポイントをブロック)を適用する
scripts/fetch_page.pyを経由します - curl や subprocess による HTTP 呼び出しは禁止です。プロジェクトで検証済みの取得パイプラインのみを使用します
- すべての SQLite クエリではパラメーター化されたプレースホルダー(
?)を使用し、文字列補間は決して使用しません - TLS は常に検証されます。パイプライン内に
verify=Falseはありません
典型的なワークフロー
デプロイ前/後のチェック
/seo drift baseline https://example.com # Before deploy
# ... deploy happens ...
/seo drift compare https://example.com # After deploy
継続的なモニタリング
/seo drift baseline https://example.com # Initial capture
# ... weeks later ...
/seo drift compare https://example.com # Check for drift
/seo drift history https://example.com # Review all changes
トラフィック減少の調査
/seo drift compare https://example.com # What changed?
/seo drift history https://example.com # When did it change?
共有データキャッシュへの書き込み
すべての作業が完了したら、ワークフローで永続的な知見が得られた場合に、簡潔な JSON の概要を .seo-cache/ に書き込みます。
../seo/references/shared-data-cache.md のスキーマと命名規則を使用し、少なくとも cache_type、analyzed_at、ソース URL/ドメイン、主な知見、問題、推奨事項、ツールの制限事項を含めてください。.gitignore に .seo-cache/ がない場合は追加してください。