Communitygithub.com

ethanplusai/astro-conversion-kit

ライブサイト(WordPress、Drupal、Webflow、Squarespace、Wix、静的サイトなど)を、同一URL・コンテンツ・ヘッドタグ・メディア・リダイレクト・外観を維持した静的Astroサイトに変換します。パリティゲートとピクセルレベルのビジュアルレビューで検証し、1つのプルリクエスト、noindexステージングデプロイ、ローンチランブックで完了します。

astro-conversion-kit とは?

Astro Conversion Kitは、既存のライブWebサイト(WordPressを最優先、Drupal、Webflow、Squarespace、Wix、静的サイトも対応)を、完全に機能する静的Astroサイトに変換するための包括的な自動化スキルです。元のサイトのURL構造、コンテンツ、メタデータ、メディア、リダイレクト、そして見た目を忠実に再現することを目的としています。変換プロセスは、キャプチャ、計画、スキャフォールディング、ビルド、検証の各フェーズで構成され、各コミットでパリティゲート(parity-gates)とピクセルレベルのビジュアルレビュー(visual-review)による厳格な検証が行われます。このスキルは、Claude CodeやCursorなどのAIエージェント環境で動作し、単一の対話メッセージで開始され、その後は自動的に全フェーズを実行します。重要なのは、デフォルトのビルドが元のライブサイトと完全に一致することを保証し、例外や改善は明示的に文書化・承認される必要があるという点です。最終的には、1つのプルリクエスト、noindexステージングデプロイ、そして人間が実行するための詳細なローンチランブック(LAUNCH.md)を生成します。変換の再開や、特定の提案(--apply <id>)の適用にも対応しています。

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

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

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

ドキュメント

convert-site

オーケストレーター。1回の質問メッセージを送信し、その後は停止することなく他のすべてのスキルを順番に実行し、最後にマージ用のプルリクエストとローンチ用のランブックを生成します。

黄金ルール

  1. 1回の受付メッセージ。その後は停止しない。 すべての質問にはデフォルト値が設定されています。後でアカウント、ログイン、または保持していないトークンが必要になるものは、「必要なもの」リスト(state.needsYou および docs/LAUNCH.md のセクションA)に追加され、実行は継続されます。
  2. ライブサイトは読み取り専用。 以下のスクリプトのみが、ペースを調整しながら読み取ります:キャプチャスクリプト、shoot.mjs、styles.mjs(ライブサイト上)、css-coverage.mjs、launch-audit --old-url、pre-launch --predecessor-url。ライブページの読み込み時にはアナリティクスはブロックされるため、訪問としてカウントされません。ライブサイトでフォームを送信したり、ログインしたり、不足を補うために手動でページを取得したりしないでください。
  3. デフォルトのビルドは、欠点も含めてライブと同一。 コンテンツはキャプチャされたマークアップから移動され、再入力や整理は行われません。すべての奇妙な点は、「デフォルトでライブを再現する」という決定項目になります。強制的な差異は例外であり、改善は提案(PROPOSALS=on の場合のみ)です。
  4. すべてのコミットにゲート。決して緩めない。 ゲートを通過させるために baseline/ を編集しないでください(baseline/scripts.json の keep フラグのみ許可)。スキップは合格ではありません。「Not covered」は決して合格ではありません。
  5. main ブランチにはスキャフォールドコミットのみ。 新しい空のリポジトリでは、init-site が main に1つのコミットを作成します。これは「mainにコミットしない」ルールの例外であり、PRにはベースが必要です。これ以降のすべては astro-rebuild ブランチ、1つのPRです。フォースプッシュ、マージ、DNS、旧ホスト、ダッシュボード設定の変更は絶対に行わないでください。
  6. チャットやリポジトリにシークレットを保存しない。 ユーザーにトークンを貼り付けさせないでください。認証情報は環境変数またはCLI独自のログインから取得します。

以下で使用される名称

KIT はこのキットの絶対パス(skills/ と package.json があるフォルダ)です。 LIVE はライブサイトのオリジンです。SITE は新しいサイトリポジトリの絶対パス(デフォルトは <カレントフォルダ>/<スラッグ>)。キャプチャと実行状態は最初からここに書き込まれ、init-site.mjs がその周りをスキャフォールドします。すべてのコマンドは SITE から実行してください。すべてのスクリプトは --help を出力します。ソースを読む代わりにそれを実行してください。新しいシェルでのNodeコマンドは、すべて source ~/.nvm/nvm.sh && nvm use 22.23.4 で始めるか(または .nvmrc を読み込むシェルで実行します)。

ステップ 0a: 実行可能なキット

スクリプトは、キットの node_modules から parse5、playwright などをインポートします。$KIT/package.json または $KIT/node_modules がない場合(スキルフォルダのみをコピーしたインストール)、キットをクローンしてインストールし、そのクローンを KIT として使用します。

git clone https://github.com/ethanplusai/astro-conversion-kit <folder>/astro-conversion-kit
npm install --prefix <folder>/astro-conversion-kit

ステップ 0: 事前チェックとフィンガープリント(受付メッセージの前)

node $KIT/skills/convert-site/scripts/preflight.mjs --json
node $KIT/skills/capture-site/scripts/fingerprint.mjs $LIVE

自分でインストールできるもの(ユーザーに尋ねずに)をインストールします:playwright.chromium が false の場合は npx playwright install chromium。vercel と wrangler は npx 経由で実行します。存在するがログインしていないCLIはユーザーがログインする必要があります:受付メッセージでコマンド名を指定し(gh auth login、npx vercel login、npx wrangler login)、スキャフォールド時に再度確認します。

experience は、話し方(何をするかではない)を設定します。new:各フェーズについて、何をするかとなぜかを1つの平易な文で説明し、すべての用語を一度説明し、インストールは黙って実行。some:フェーズごとに1行。experienced:コマンドと結果のみ。Shopifyのフィンガープリントの場合はストアです。停止してその旨を伝えます。

ステップ 1: 受付(1つのメッセージ)

references/intake.md のテンプレートを、preflightとフィンガープリントで見つかったもので埋めて送信します:すべての質問とそのデフォルト値、「不足しているものとその対処」リスト。ユーザーが返信しない場合、デフォルト値が適用されます。2回目の質問メッセージは絶対に送信しないでください。

フェーズ

順序は docs/process.md の通り。references/phases.md にはすべてのコマンドと各証明があります。各境界で node $KIT/skills/convert-site/scripts/state.mjs --dir $SITE phase <name> を実行します。前のフェーズの証明が成立するまで、次のフェーズを開始しないでください。state.mjs の呼び出しは1回ずつ実行し、&& でチェーンしないでください:各呼び出しで state.json が書き換えられ、チェーンが途中で失敗すると同期が取れなくなります。

#フェーズ(<name>)何が起こるか完了条件
1intakePreflight、フィンガープリント、1つのメッセージ回答があるか、デフォルト値が適用された
2capturecapture-site を $SITE/capture/ に実行、CSSカバレッジすべてのURLが保存されるか、そのステータスと共に記録された。ノートが作成された
3planホスティング、URL形式、メディアモード、テンプレートを決定。stateに決定事項を保存。.conversion/ にドラフトを作成すべてのテンプレート、カウント、奇妙な点、スコープ外の機能に決定が下された
4scaffoldリポジトリ、キャプチャ周りの init-site.mjs、その後 docs/plan.md と docs/media-plan.json空のビルドが成功。main に1つのスキャフォールドコミットがある
5baselinenpm run baseline(templates.json は既に存在する)build-baseline.mjs --check が終了コード0を返す
6buildレイアウトと共通部分、テンプレートごとに1ページ、テンプレートのデザインロック、その後全ページnpm run build が成功。テンプレートゲートがパスごとに合格
7gates完全なゲートnpm run verify が終了コード0を返す
8visual各テンプレートを390、768、1440で。各ページを390と1440ですべてのペアが合格
9componentsオプション、デフォルトはオフ(references/components-optional.md)ゲートと差分がまだ合格。1つの別個のコミット
10prelaunchpre-launch、ステージングデプロイ、verify-live、launch-audit、1つのテスト送信prelaunch-reconcile.mjs が終了コード0を返す(references/phases.md §10)。監査ブロッカーが修正されるかリスト化された
11suggestionsgates.json と review/ を使用した suggest-improvementsdocs/suggestions.md とその「レビューから」セクション
12prランブック、プッシュ、PR、最終レポートPRがゲート出力とすべての「Not covered」セクションを引用している
13launchユーザーが docs/LAUNCH.md に従って実行post-launch が切り替えを確認し、30日間監視

各フェーズで使用されるスキル(それぞれ独自のルールがあります):capture-site (2)、parity-gates (5 to 7)、visual-review (6, 8)、pre-launch and launch-audit (10)、suggest-improvements (11)、post-launch(ランブック内)。各スキルのSKILL.mdは、そのフェーズの前に読んでください。

ビルド(1段落で)

references/build-rules.md は拘束力があります。レイアウト、共通ヘッダー、ナビゲーション、フッターは常にコンポーネントです。コンテンツブロックはキャプチャされたマークアップをスクリプトで移動します。メディアは元のパス、フォントはセルフホスト、CSSはカバレッジに基づいて削減(css-coverage.mjs の後に css-prune.mjs)、書き換えは禁止。フォームは references/forms.md、サードパーティスクリプトは references/third-party.md に従います。redirects.csv は単一のリダイレクトソースです:新しいリダイレクトは、source が decision で note が決定IDを指定する行であり、その後 npm run redirects:build を実行します。生成されたルールを手動で編集しないでください。テンプレートごとに1コミット(feat: <template> template、そのパススコープのゲートが合格したら)、ビルド全体で1コミットは禁止。デザインはテンプレートでロックされ(visual-review)、その後全ページに展開されます。サブエージェントを使用する場合、テンプレートまたはゲート修正ごとに1人の実装者。2人で1つのファイルを操作しないでください。各ブリーフには絶対パスと build-rules.md が含まれ、次のフェーズの前にコミットをレビューします。

決定、例外、提案

このセクションがルールです。参考文献はここを参照します。

  • 決定 ライブサイトが変わった動作をする場合、および適用するすべてのデフォルトについて、state.mjs decision '{"topic":…,"choice":…,"default":…,"reason":…,"costIfWrong":…}' を実行します。これによりID(d1、d2、…)が出力されます。唯一の台帳は docs/plan.md の決定表です:ID、日付、トピック、選択、デフォルト、理由、間違えた場合のコスト。スキャフォールドの前は、決定は .conversion/state.json に保存されます。計画表は init-site 直後にこれらから作成されます。デフォルトは常に「ライブを再現する」です。
  • 例外(exceptions.json、{ path, field, from, to, reason, approvedBy, date }):静的ビルドが回避できない差異。ゲートは、そのパスのそのフィールドについて from を to に置き換えます。approvedBy は、ユーザーがPRで承認するまで "default, <decision id>" になります。フォームとスクリプトは例外フィールドではありません(独自のフラグがあります)。routes は:キャプチャが読み取れなかったルート。from はそのステータス(文字列)、to は "skip" またはビルドされた置換パス。
  • 提案(proposals.json、同じ形状に加えて id、決定ID、approvedBy: "proposed"。複数のレコードが同じIDを共有できます):改善。コードは proposalOn(id) で切り替えます。PROPOSALS=on ビルドでのみ出荷され、npm run verify:proposals でゲートされます。どのゲートも測定しない変更(書き換えられたhref)は field: "markup" であり、比較されません。ユーザーが承認すると、レコードは exceptions.json に移動します(approvedBy は変更されます)。

ホスティング

デフォルトはVercel。リクエストがあればCloudflare Pages:references/hosting-vercel.md と references/hosting-cloudflare.md。プロダクションビルドが PUBLIC_INDEXABLE=true を設定しない限り、すべてのページは noindex を保持します。メディアは repo、store(media-upload.mjs)、または live-temporary(ステージングのみ。DNS移行前に削除)で、media-plan.mjs が決定します(references/phases.md §3)。

計画後の1つのメッセージ

フェーズ3の後、1つの短いステータス(質問ではない)を送信します:プラットフォーム、ページ数とテンプレート数、メディアの決定、スコープ外の機能とオプション、デフォルトで行われた決定、これまでの必要なものリスト。非対話型実行でも必須です(固定の回答があり、誰も返信しない場合):進捗行はこれを置き換えません。その後、待たずに続行します。

プルリクエスト(フェーズ12)

astro-rebuild をプッシュし(main はスキャフォールド時にプッシュ済み)、その後 gh pr create --base main --head astro-rebuild --title "Astro rebuild of <host>" --body-file .conversion/pr-body.md を実行します。pre-launch が placeholders.form-id で失敗する場合(フォームIDがない)、--draft を追加し、最終レポートでそれをブロッカーとして指定します。gh ログインがない場合、ボディはそのファイルに残り、「プッシュしてPRを開く」が必要なものリストに追加されます。ボディは以下の順序です。

## 変更内容       1段落:プラットフォーム、変換内容、ホスト、メディアモード
## カウント             ページ数、テンプレート数、リダイレクト数、メディアファイル数とサイズ、フォーム数、保持/削除されたベンダー
## 適用された例外      すべての exceptions.json エントリ:パス、フィールド、理由、決定ID
## 未解決の提案       すべての proposals.json ID:パス、内容、理由(PROPOSALS=on でのみ出荷)
## 決定               docs/plan.md の決定表、およびデフォルト以外のすべての選択
## ゲート出力         `npm run verify` の出力、そのままコードブロック内、すべてのスキップ行を含む。その後、prelaunch-reconcile が受け入れた各行を「ライブから再現 (dN)」として
## ビジュアルレビュー  `npm run review:check` の出力、すべての docs/visual-overrides.json エントリ(ルート、ID、しきい値、理由)、すべての bannerClosed と heightMismatch。コンタクトシートは review/index.html と review/all.html(ローカル。npm run review:sheet)
## ステージング       ステージングURL、verify-live の結果、launch-audit のブロッカーとその状態
## 提案               カテゴリごとのカウント、中リスクと高リスクの項目、適用可能なID
## 非適用範囲         pre-launch と launch-audit の「Not covered」セクション、そのまま、それぞれ独自の見出しの下。次に capture-site、visual-review、suggestions のもの
## あなたを待っているもの すべての state.needsYou 項目、ランブック順

最終レポート(ユーザーへ)

PRリンクを先頭に(「ドラフト:フォームIDを待っています」の場合はそのように)、次に:変換内容(カウント)、ゲートとビジュアルレビューをそれぞれ1行、ステージングURL、あなたを待っているもの の下に state.mjs --dir $SITE get needsYou から読み取った必要なものリスト(各項目に正確なコマンドまたはクリック、ランブック順)、そしてすべての「Not covered」セクションをそのまま。 「PR open, waiting on your merge」と言い、「完了」や「公開済み」とは言いません。開始したレビューサーバーを停止し(npm run review:serve -- --stop、プレビューを使用した場合は npx astro preview stop)、その後停止します。

再開

新しいセッションでは、node $KIT/skills/convert-site/scripts/state.mjs --dir $SITE get を読み取り、phase から続行します:まずそのフェーズの証明を再実行します。成立すれば、次のフェーズを開始します。キャプチャは --resume で再開します。受付を繰り返さないでください。後で提案を適用する場合は convert-site --apply <id>(references/apply-suggestion.md)であり、実行自体の一部ではありません。

参考文献

ファイル内容
references/intake.md1つのメッセージ:質問、デフォルト値、不足しているものとその対処
references/phases.mdすべてのフェーズ:正確なコマンド、完了の証明、記録すべきこと
references/build-rules.mdレイアウト、コンテンツ、CSS、メディア、フォント、遅延画像、リダイレクトの構築方法
references/forms.mdFormspreeの配線、フィールド名、ハニーポット、サンキューページ、フォームID、1つのテスト送信
references/third-party.mdbaseline/scripts.json の keep 許可リストと docs/third-party.md
references/hosting-vercel.mdプロジェクト、パブリックな noindex ステージング、インデックス作成、Blobメディア、オプトイン保護
references/hosting-cloudflare.mdPagesプロジェクト、_redirects、_headers、R2メディア関数、クエリリダイレクト
references/runbook.mddocs/LAUNCH.md:A 必要なもの、B 完了手続き、C ローンチ当日、D 30日間監視
references/components-optional.mdオプションのコンポーネントパス
references/apply-suggestion.md--apply <id>:提案レコード、ブランチコミット、ゲート、シート

Individual skills in this repo

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

ethanplusai/astro-conversion-kit

Crawl a live website, read-only and paced, into a capture/ folder that a rebuild is checked against — every page's HTML, text and head tags, redirects with every hop, links, third-party scripts, the media set, stylesheets, fonts, logo and icons, feeds, templates, and live screenshots at three widths. Use before converting or rebuilding a site, when asked to crawl, capture, snapshot or inventory a site, or when a capture stopped on blocks and needs resuming.

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.

関連スキル