convert-site
オーケストレーター。1回の質問メッセージを送信し、その後は停止することなく他のすべてのスキルを順番に実行し、最後にマージ用のプルリクエストとローンチ用のランブックを生成します。
黄金ルール
- 1回の受付メッセージ。その後は停止しない。 すべての質問にはデフォルト値が設定されています。後でアカウント、ログイン、または保持していないトークンが必要になるものは、「必要なもの」リスト(
state.needsYouおよびdocs/LAUNCH.mdのセクションA)に追加され、実行は継続されます。 - ライブサイトは読み取り専用。 以下のスクリプトのみが、ペースを調整しながら読み取ります:キャプチャスクリプト、
shoot.mjs、styles.mjs(ライブサイト上)、css-coverage.mjs、launch-audit --old-url、pre-launch --predecessor-url。ライブページの読み込み時にはアナリティクスはブロックされるため、訪問としてカウントされません。ライブサイトでフォームを送信したり、ログインしたり、不足を補うために手動でページを取得したりしないでください。 - デフォルトのビルドは、欠点も含めてライブと同一。 コンテンツはキャプチャされたマークアップから移動され、再入力や整理は行われません。すべての奇妙な点は、「デフォルトでライブを再現する」という決定項目になります。強制的な差異は例外であり、改善は提案(
PROPOSALS=onの場合のみ)です。 - すべてのコミットにゲート。決して緩めない。 ゲートを通過させるために
baseline/を編集しないでください(baseline/scripts.jsonのkeepフラグのみ許可)。スキップは合格ではありません。「Not covered」は決して合格ではありません。 mainブランチにはスキャフォールドコミットのみ。 新しい空のリポジトリでは、init-siteがmainに1つのコミットを作成します。これは「mainにコミットしない」ルールの例外であり、PRにはベースが必要です。これ以降のすべてはastro-rebuildブランチ、1つのPRです。フォースプッシュ、マージ、DNS、旧ホスト、ダッシュボード設定の変更は絶対に行わないでください。- チャットやリポジトリにシークレットを保存しない。 ユーザーにトークンを貼り付けさせないでください。認証情報は環境変数または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>) | 何が起こるか | 完了条件 |
|---|---|---|---|
| 1 | intake | Preflight、フィンガープリント、1つのメッセージ | 回答があるか、デフォルト値が適用された |
| 2 | capture | capture-site を $SITE/capture/ に実行、CSSカバレッジ | すべてのURLが保存されるか、そのステータスと共に記録された。ノートが作成された |
| 3 | plan | ホスティング、URL形式、メディアモード、テンプレートを決定。stateに決定事項を保存。.conversion/ にドラフトを作成 | すべてのテンプレート、カウント、奇妙な点、スコープ外の機能に決定が下された |
| 4 | scaffold | リポジトリ、キャプチャ周りの init-site.mjs、その後 docs/plan.md と docs/media-plan.json | 空のビルドが成功。main に1つのスキャフォールドコミットがある |
| 5 | baseline | npm run baseline(templates.json は既に存在する) | build-baseline.mjs --check が終了コード0を返す |
| 6 | build | レイアウトと共通部分、テンプレートごとに1ページ、テンプレートのデザインロック、その後全ページ | npm run build が成功。テンプレートゲートがパスごとに合格 |
| 7 | gates | 完全なゲート | npm run verify が終了コード0を返す |
| 8 | visual | 各テンプレートを390、768、1440で。各ページを390と1440で | すべてのペアが合格 |
| 9 | components | オプション、デフォルトはオフ(references/components-optional.md) | ゲートと差分がまだ合格。1つの別個のコミット |
| 10 | prelaunch | pre-launch、ステージングデプロイ、verify-live、launch-audit、1つのテスト送信 | prelaunch-reconcile.mjs が終了コード0を返す(references/phases.md §10)。監査ブロッカーが修正されるかリスト化された |
| 11 | suggestions | gates.json と review/ を使用した suggest-improvements | docs/suggestions.md とその「レビューから」セクション |
| 12 | pr | ランブック、プッシュ、PR、最終レポート | PRがゲート出力とすべての「Not covered」セクションを引用している |
| 13 | launch | ユーザーが 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.md | 1つのメッセージ:質問、デフォルト値、不足しているものとその対処 |
references/phases.md | すべてのフェーズ:正確なコマンド、完了の証明、記録すべきこと |
references/build-rules.md | レイアウト、コンテンツ、CSS、メディア、フォント、遅延画像、リダイレクトの構築方法 |
references/forms.md | Formspreeの配線、フィールド名、ハニーポット、サンキューページ、フォームID、1つのテスト送信 |
references/third-party.md | baseline/scripts.json の keep 許可リストと docs/third-party.md |
references/hosting-vercel.md | プロジェクト、パブリックな noindex ステージング、インデックス作成、Blobメディア、オプトイン保護 |
references/hosting-cloudflare.md | Pagesプロジェクト、_redirects、_headers、R2メディア関数、クエリリダイレクト |
references/runbook.md | docs/LAUNCH.md:A 必要なもの、B 完了手続き、C ローンチ当日、D 30日間監視 |
references/components-optional.md | オプションのコンポーネントパス |
references/apply-suggestion.md | --apply <id>:提案レコード、ブランチコミット、ゲート、シート |