Communitygithub.com

サイトキャプチャツールキット

ライブサイトを読み取り専用で、ペース調整しながらクロールし、capture/フォルダに保存。後続の再ビルドはこのキャプチャと照合される。HTML、テキスト、headタグ、リダイレクトの全ホップ、リンク、サードパーティスクリプト、メディアセット、スタイルシート、フォント、ロゴ、アイコン、フィード、テンプレート、3種類の幅でのライブスクリーンショットを含む。サイトの変換や再構築前、クロール・キャプチャ・スナップショット・インベントリの指示があった場合、あるいはブロックで停止したキャプチャを再開する際に使用する。

サイトキャプチャツールキット とは?

このスキルは、ライブWebサイトを完全かつ読み取り専用でキャプチャし、すべてのリソース(HTML、テキスト、メタタグ、リダイレクト、リンク、サードパーティスクリプト、メディア、スタイルシート、フォント、ロゴ、アイコン、フィード、テンプレート、複数幅のスクリーンショットなど)を`capture/`フォルダに保存します。主な目的は、サイトの静的変換や再構築の前に、正確なスナップショットを取得することです。クロールはレート制限と適応型ペーシングを備えており、サーバーに過負荷をかけずにブロックを回避します(例:429/503応答時に遅延を自動増加)。また、中断されたキャプチャの再開(exit code 3)、Wayback Machineの統合、ファビコンやロゴの自動抽出、`templates.json`へのページクラスタリング、3つのビューポートでのスクリーンショット撮影など、高度な機能を提供します。このツールは、Claude CodeやCodexなどのAIエージェント環境で使用するために設計されており、コマンドラインから順次実行されます。

対応~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ethanplusai/astro-conversion-kit/tree/HEAD/skills/capture-site

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

capture-site

ライブサイトが提供するすべてを一度保存し、以降のすべてのステップがキャプチャから動作するようにします。

黄金律

ライブサイトは読み取り専用であり、キャプチャもその後は読み取り専用です。 スクリプトはペース調整されたGETリクエストとHEADリクエストのみを行います。フォームを送信したり、ログインしたり、手作業でギャップを埋めたりすることは決してありません。ノートが書き込まれたら、capture/以下は編集されません。すべてのゲートが読み取る証拠です。

使用タイミング

変換のステップ2(convert-siteが実行)、またはライブサイトのインベントリが必要な場合(ステージングサイトや新規サイトはlaunch-auditの担当)。exit code 3で終了したキャプチャは、後述の方法で再開します。

ペーシング

すべてのスクリプトはデスクトップChromeユーザーエージェントを送信します。キャプチャスクリプト(capture、media、assets、fingerprint)はホストごとの制限を共有します。デフォルトでは、リクエスト開始は400ミリ秒間隔で、同時に最大4つ実行中(media:6つ)なので、応答の速いホストは数分で読み取られます。Chromiumのステップ(shoot、css-coverage、styles)は一度に1ページずつ、500ミリ秒間隔で読み込み、launch-auditとpre-launchは独自のペーシングを維持します。制限は自動的に適応します。

  • 429または503が発生すると、そのホストの遅延が2倍(最大32倍)になり、一度に1リクエストに低下します。30秒間クリーンな応答が続くごとに、1ステップ回復(遅延を半分に、実行中のリクエストを1つ増やす)し、デフォルトに戻るまで続きます。
  • 応答に5秒以上かかると、そのホストの実行中リクエストが半分になります(半減中は再度適用されません)。同じ方法で、30秒間のクリーンな応答ごとに実行中リクエストが1つずつ回復します。
  • 403またはネットワークエラーは、以下の3回連続停止にカウントされます。

--politeは旧来のペースです。一度に1リクエスト、2500ミリ秒間隔(capture、media、assets)。ボット対策のある共有ホスティング(SiteGroundの/.well-known/sgcaptcha/、数回のリクエストで429や503を返すホスト)で最初から使用するか、ブロックで停止した実行を再開する場合に--politeを付けて再開します。--delay <ms>と--concurrency <n>はデフォルトまたは--politeを上書きします。ライブサイトに対してはデフォルトまたは--politeを維持し(--delay 0はローカルフィクスチャのみ)、--uaを変更してブロックを回避しないでください。

  • captureは、キューに入ったURLを--concurrencyまで先読みして取得し、キュー順に記録するため、キャプチャは一度に1ページずつクロールした場合と同じになります。各URLを3回試行します。それでもブロックされたURL(403、429、503、またはネットワークエラー)は、そのステータスとinventory.jsonのattemptsに記録され(meta.jsonのdiscoveryErrors内のサイトマップまたはRESTリスト)、クロールは続行されます。3つの異なるURLが連続して試行を使い果たし、その間に成功がない場合にのみ停止し、状態を保存し、それらの3つを新たな試行回数で再度キューに入れます。wp-admin、wp-login、xmlrpc.php、?s=検索はリクエストしません。
  • mediaは各ファイルを3回試行します。永続的な429または503は即座に停止します。403またはネットワークエラーはそのファイルのステータスとして記録され、そのようなファイルが3つ連続(応答が到着した順序)で停止します。停止時にダウンロード中のファイルは完了させます。100ファイルごとにmedia.jsonを保存するため、強制終了された実行は中断した場所の近くから再開します。
  • fingerprintは再試行しません。ブロックされたホームページ、またはボットチャレンジの場合はexit code 3で終了します。assetsとshootは回避し、3回連続でブロックされた応答の後に停止します。

コマンドの順序

capture/を保持するフォルダ(サイトリポジトリのルート)から実行します。<skill-dir>は、このスキルのフォルダの絶対パスで、npm installが実行されたキットのコピー内にあります(スクリプトはそのパッケージをインポートします)。各スクリプトは--helpを表示するので、ソースを読む代わりに実行してください。各ステップを独自のコマンドとして、次の順序で実行します。

  1. Fingerprint、次に命名されたプラットフォーム参照を読みます(以下の表):

    node <skill-dir>/scripts/fingerprint.mjs https://www.example.com
    
  2. キャプチャ。 ディスカバリは、サイトマップ(robots.txtのすべてのSitemap:行、プラットフォームのデフォルトインデックス)、RESTリスト(WordPress、フィンガープリントがRESTを見つけた場合、--no-restでスキップ)、リンククロール、およびクロールが到達できないパス用の--seed <path>または--seed-file <file>(1行に1つのパスまたはURL、#コメント)です。クロール後、Waybackで見つからなかったパスはwayback-unverified.txtに保存されます(--no-waybackでスキップ。失敗したリストは、meta.json waybackがfailedを記録する前に、10秒後にもう一度要求されます)。?p=ショートリンクは未確認で記録され、--verify-shortlinksを渡さない限りフェッチされません。クロール後、存在しないパス(/<32 hex>/)を一度リクエストし、サイト独自の404ページをpages/404.htmlとして保存します(meta.json notFound。200またはリダイレクトで応答するサイトはページなしで記録されます)。また、/favicon.icoと/apple-touch-icon.pngを一度ずつ要求し、リダイレクトを追跡します(meta.json icons:{ status, file, contentType, bytes }へのパス)。200で応答したものは、assets/root-favicon.icoまたはassets/root-apple-touch-icon.pngとしてバイト単位で保存されます(HTML応答は保存されず、noteが付きます。5 MBを超えるものはステータス"too-large"になります)。assets.mjsはそれを種類"root-icon"とそのpathでassets/index.jsonにリストするため、ビルドはそれをそこに出荷します。URLは大文字のパーセントエスケープでキー付けされるため(%c3%a9と%C3%A9は同じURL)、両方のスペルでリンクされたページは一度だけキャプチャされます。robots.txtが命名したサイトマップで404(または200以外)を返すものは、そのステータスとともにsitemaps/index.jsonにリストされ、meta.jsonのdiscoveryErrorsにもリストされます。別のホスト上のサイトマップ(robots.txtが姉妹サイトのものを命名している、またはインデックスがリストしている、wwwとapexは1つのホストとしてカウント)は、{ url, host, skipped: "other host" }としてそこにリストされ、フェッチされることはないため、そのURLはクロールに入りません。同じファイル名を持つ2つのサイトマップURLが互いに上書きすることはありません。2番目はディレクトリパスからのサフィックス(page-sitemap-es.xml)で保存されます。--exclude <prefix>[,<prefix>...]は、ホストの一部を除外します(WordPressマルチサイトのサブサイト(/president/など)、または所有者が保持するセクション)。パスがそのプレフィックスで始まるURLは、サイトマップ、RESTリスト、リンク、リダイレクトのいずれが導く場合でも決してリクエストされません。プレフィックスの下のサイトマップは、sitemaps/index.jsonに{ url, skipped: "excluded" }としてリストされます。その中へのリダイレクトは、そのターゲットとともに、未リクエストとして記録されます。それへのリンクは保存されたHTMLに残り、links.jsonのinternalではなくexcludedにリストされます。meta.jsonのexcludedはプレフィックスを命名し、ベースラインはそれらを引き継ぎます。プレフィックスとパスは正規化された形式で比較されるため、/présidence/、/pr%c3%a9sidence/、/pr%C3%A9sidence/は同じプレフィックスです。その下にリダイレクトするスタイルシートやルートアイコンは、そこでは追跡されません(シートはステータス"excluded"でリストされます)。--resumeはそれらを保持します。--resumeで追加されたプレフィックスは、その下にすでにキャプチャされたものを削除し(そのpages/およびtext/ファイル、それからのリダイレクト、その下のフィードおよびサイトマップ、およびそれらのページのみが使用したスタイルシートとスクリプト)、削除したものを出力します。media.mjsとassets.mjsもそれらの下のファイルをスキップします。

    node <skill-dir>/scripts/capture.mjs https://www.example.com --out capture
    

    次に、Waybackセカンドパス。wayback-unverified.txtが空でない場合:アーカイブされた各パスを1回リクエストし、まだリダイレクトするものはソースseedとしてcapture/redirects.jsonに記録され(ベースラインのリダイレクトがそれらを拾います)、残りはそのステータスとともにinventory.jsonに記録されます。--seed、--seed-file、--include-queryはすべて--resumeで適用され、Wayback Machineは再度照会されません。

    node <skill-dir>/scripts/capture.mjs https://www.example.com --out capture --resume --seed-file capture/wayback-unverified.txt
    
  3. メディア。 capture/media.json内のすべてのメディアファイルをリストし、変換の作業ディレクトリである.conversion/media-cache/(git管理外)に保存します。

    node <skill-dir>/scripts/media.mjs --capture capture --download .conversion/media-cache
    

    一度に6ファイルをダウンロードします。デフォルト(--sizes referenced)では、元のファイルとサイトが使用するすべてのサイズを取得します:ページ、スタイルシート、srcset、ogタグ、またはサイトマップが指すもの、またはそのファイル名がキャプチャされたページ、スタイルシート、またはスクリプトのどこかに現れるもの(data-thumb、data-bg、JSON設定、スライダースクリプト)。RESTメディアリストのみが命名するWordPressサイズは、downloaded: false, reason: "unreferenced size"でリストされ、リクエストされません。分割を出力します(例:920 originals + referenced sizes (downloaded), 4,520 unreferenced sizes (listed only))。その行を担当者に繰り返します。所有者が古いメールや他のサイトがそれらのサイズにリンクしている可能性があると言った場合は、--sizes allを使用します。

    クエリ文字列でリサイズするホスト(WordPress VIP、Jetpack Photon:photo.jpg?w=1024、?resize=300,200)は、同じパスですべてのサイズを提供します。オリジナルはベアパスなので、それがリクエストされて保存されます。見られる各クエリ文字列はvariantsの下にリストされます(リクエストされません。--sizes allはそれらを兄弟フォルダ.conversion/media-cache-variants/の下に<path>%3F<query>として保存するため、リポジトリにアップロードまたはコピーされるメディアキャッシュはベアパスのみを保持します)。ベアパスがエラー(4xxまたは5xx、リダイレクトはその場所で記録され、大きすぎるファイルは上限が引き上げられた後に再度要求されます)で応答する場合、バリアントが代わりに保存され、エントリのdownloadedFromはそれが取得されたURLになります。キャッシュバスティングクエリ(w、h、resize、crop、fit、quality、format、sパラメータなし、例:?ver=3)は同じファイルであるため、優先され、他には何もマークされません。それ以外の場合は最も幅の広いバリアントが保存され、エントリはresized: trueとも言います。実行はファイルごとに1行とカウント(2 originals unavailable (resized: true) ...)を出力し、baseline/media.jsonは両方のフィールドを保持し、メディアゲートは実際に保存されたバイトと比較するため、失敗せずにカウントをN resized (original unavailable on live)として繰り返します。そのカウントを担当者に繰り返し、それらのファイルを計画および実行計画書に、ライブサイトが提供しなくなったオリジナルとしてリストします。

  4. テンプレート。 200で応答したページをcapture/templates.jsonにクラスタリングします。WordPressでは、最初にテンプレート本文クラス(home、page、single-post、archive、テンプレートクラス)でページをグループ化し、マークアップが明らかに異なるページ(Jaccard係数0.5未満)はpage-2として分割されます。他のプラットフォームでは、Jaccard係数0.6でマークアップをマージし、template-<n>としてグループ化します。

    node <skill-dir>/scripts/templates.mjs --capture capture
    
  5. アセット。 ロゴ、ファビコン、アップルタッチアイコン、<link rel=manifest> Webマニフェスト、すべての@font-faceフォントをcapture/assets/に保存します。さらに、meta.jsonのiconsが200で記録した場合、ルート/favicon.icoと/apple-touch-icon.png(root-favicon.*、root-apple-touch-icon.*)も保存します。

    node <skill-dir>/scripts/assets.mjs --capture capture
    

    ロゴは、まずホームページの<header>内で検索され、次にクラスまたはIDがロゴを名付ける他の要素(.logo、.site-logo、#logo-wrap)内で検索されます。各要素内で:src、alt、class、またはidに「logo」(「logout」ではない)を含む<img>、次にクラス、id、aria-label、または<title>に「logo」を含むインライン<svg>(logo.svg、assets/index.jsonでurl: nullとして保存。ページ上の他の場所で定義されたシンボルを<use>するだけの場合、それだけで空でレンダリングされるため、その注意書きが付けられます)、次にホームページへのリンク内の最初の<img>、次に最初の<img>。assets/logo.*を目視で確認します。アカウントアバターやスポンサーマークが珍しいヘッダーで優先される可能性があります。ファビコンとアップルタッチアイコンは、その<link> hrefから提供されたまま保存され、クエリ文字列も含まれます。そのため、アップロードファイルのリサイズ(?w=32、?w=180)を指すものは、media.jsonのそのファイルのエントリとはバイトが異なります。その場合は、保存されたアイコンを元のファイルではなく保持します。

  6. ライブスクリーンショット、テンプレートごとに390、768、1440の幅で、ビジュアルレビューシューターを使用します。

    node <skill-dir>/../visual-review/scripts/shoot.mjs --base https://www.example.com --routes capture/templates.json --widths 390,768,1440 --out capture/screens/live
    
  7. Lighthouse(オプション)。 npx --no-install lighthouse --versionが応答する場合のみ。要求なしにインストールしないでください。欠落している場合は、ノートにその旨を記載します(スキップであり、合格ではありません)。mkdir -p capture/lighthouse-liveを実行し、次にtemplates.jsonのrepresentativeごとに順番に1回実行します。

    npx --no-install lighthouse https://www.example.com/ --quiet --chrome-flags="--headless=new" --output json --output html --output-path capture/lighthouse-live/home
    
  8. README。 キャプチャをcapture/README.mdに要約します。## Notesセクションは生成された行で始まり、実行ごとに書き換えられます(Waybackパスがセカンドパスで検証された数と各応答の内容:ステータス、リダイレクト先。失敗したかサイズで拒否されたWaybackリスト。再試行後も失敗しているすべてのURL)。これを最後に実行し、再実行後にも実行します。

    node <skill-dir>/scripts/readme.mjs --capture capture
    
スクリプト終了コード
fingerprint0 完了、2 使用方法または到達不能、3 ブロックまたはボットチャレンジ
capture0 完了、2 使用方法、3 ブロックで停止、到達不能、ボットチャレンジ(すべて再開可能)、または200で応答したページなし
media0 完了(不足ファイルを含む)、2 使用方法、キャプチャなし、または200で応答したページなし、3 ブロックで停止
assets0 完了(不足ファイルを含む)、2 使用方法またはキャプチャなし、3 ブロックで停止
templates0 完了、2 使用方法、inventory.jsonなし、または「キャプチャされたページなし」(200で応答したものなし)
readme0 完了、2 使用方法またはinventory.jsonなし
shoot0 すべて撮影、1 ルートが失敗、2 使用方法、3 ブロックで停止

exit code 3 の場合

サイトがリクエストをブロックしているか、到達できません。数秒ではなく数分待ってから、以下の操作を行います。

  • fingerprint:再度実行します。
  • capture:同じコマンドを--resume付きで実行します。まだキューにあるURLが再試行されます。

...

[以下翻訳対象外]

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

ethanplusai/astro-conversion-kit

Convert a live website (WordPress first; Drupal, Webflow, Squarespace, Wix and static sites too) into a static Astro site with the same URLs, content, head tags, media, redirects and look, proven by parity gates and a pixel-level visual review, ending in one pull request, a noindexed staging deploy and a launch runbook. Use when asked to convert, rebuild, migrate or clone a site to Astro, when handed a site URL with this kit's link, to resume a conversion from .conversion/state.json, or with --apply <id> to apply one suggestion as a proposal.

ethanplusai/astro-conversion-kit

Audit a live or staging website and report what would go wrong at launch — crawl and inventory, indexability, redirects for a domain cutover, links, images, forms, accessibility, performance, analytics, content sanity, and full-page screenshots for a visual pass. Use before or right after a site launch, when asked to QA, audit, or review a website, when a site is moving to a new domain, or when somebody asks whether a site is ready to go live. Read-only: it never submits a form, clicks a control, or edits anything.

ethanplusai/astro-conversion-kit

Freeze a site capture into baseline/ and prove an Astro build matches it — every route, redirect (one hop, through a simulation of the host), SEO head field, visible text, internal link, media file, sitemap entry, feed, form, third-party script and security header — with approved differences in exceptions.json and improvements in proposals.json. Use after a capture to build the baseline, when compiling redirects.csv for Vercel or Cloudflare, before calling any conversion page done, when a gate fails and needs reading, or to check a staging deploy against the baseline.

ethanplusai/astro-conversion-kit

The moment DNS moves and for the thirty days after — verifies the cutover (DNS propagation, certificate, http and www redirects, the noindex, robots and sitemap on the live host, every redirect the audit mapped, forms, analytics, the staging copy, the old host, security headers), diffs production against the pre-launch baseline, and schedules the watch. Use when asked did the launch work, is the site live, what should I check after launch, the domain just switched, or when a site went live in the last month and something looks wrong. It is read-only and exits 0 whatever it finds.

関連スキル