Astro サイト (site/)
スタンドアロンの pnpm プロジェクト (独自のロックファイル、プラグインビルドの一部ではありません)。Astro + @astrojs/sitemap + @astrojs/check。GitHub Pages に https://vadimonix.github.io/xray-decky/ としてデプロイされます。
cd site
pnpm install
pnpm run check # astro check — ロケール辞書を型チェック; CI ゲート
pnpm run build # → site/dist
pnpm run dev
URL & SEO 契約 (静かに壊れる部分)
これらが一貫している場合にのみ、すべてが機能します:
build.format: 'preserve'→ フラットページはchangelog.htmlに、ロケールルートはru/index.html(ディレクトリ) にビルドされます。- カノニカル形式: フラットページは
.htmlで終了します。ロケールルートは末尾スラッシュ (…/ru/) を使用します。サイトルートは…/xray-decky/です。src/lib/urls.ts(absoluteUrl、withBase、localeHref) によって生成されます。 - サイトマップはカノニカルと文字列一致する必要があります。
astro.config.mjsのserializeフックは、<loc>と自動生成された hreflang<xhtml:link>の代替の両方を書き換えます: ロケールルートセグメント (LOCALE_DIRS) は/を取得し、その他すべての拡張子なしのものは.htmlを取得します。歴史: 2026-08 より前は<loc>のみを書き換え、一律に.htmlを追加していたため、クローラーが存在しないru.html/zh.html/fa.html/es.htmlに送られていました。 - サイトマップの hreflang セットは、ページの hreflang セットと等しくなければなりません。
Base.astroは 5 ロケール +x-defaultを出力します。インテグレーションは 5 つのみを出力するため、serializeはx-default(=enURL) を追加します。Google は両方の配信方法からのアノテーションを読み取り、異なるセットをサブセットとしてではなく競合として扱います。seo-check --siteは URL ごとにそれらを比較します。 - robots.txt はこのデプロイでは機能しません。
/xray-decky/robots.txtに出荷されますが、クローラーはhttps://vadimonix.github.io/robots.txtのみを読み取り、これは 404 になります (ユーザーサイトリポジトリなし) — 404 は「すべてをクロール」を意味するため、何もブロックされませんが、Sitemap:行は決して認識されません。サイトマップの検出は、Search Console への登録に完全に依存します。このリポジトリ外での実際の修正: ホストルートの robots.txt を提供するVadimOnix/vadimonix.github.ioリポジトリ、またはカスタムドメイン。 - GitHub Pages は寛容です (拡張子なしのファイル → 200、スラッシュなしのディレクトリ → 301) — これに依存せず、カノニカルを正確に一致させてください。
compressHTML: falseは意図的です: SEO 監査のために<head>(カノニカル、hreflang、OG、JSON-LD) を grep 可能に保ちます。gzip はサイズを補います。
ロケールを追加する = 1 か所: src/i18n/locales.ts (LOCALES、localePrefixes、hreflangCodes) + src/i18n/types.ts で型指定された辞書ファイル + astro.config.mjs の LOCALE_DIRS + サイトマップインテグレーション設定の locales マップ。astro check は欠落した辞書キーで失敗します — そのため CI はビルドの前にそれを実行します。
デプロイ
.github/workflows/pages.yml: site/** (またはワークフロー自体) に触れる master へのプッシュでトリガーされます。Node 22、pnpm 9、--frozen-lockfile、check → build → site/dist のアップロード → デプロイ。PR ビルドはありません — PR CI はサイトをビルドしません。そのため、緑色の PR はサイトについて何も語りません。
Astro メジャーバージョンアップの検証 (経験的、変更ログを読むのではなく)
Dependabot は astro のみをアップグレードします。ピアインテグレーション (@astrojs/sitemap、@astrojs/check) は遅れます。想定するのではなく、それらがまだ機能することを確認してください。
- アップグレードされたバージョンをローカルでビルド:
pnpm install --frozen-lockfile && pnpm run check && pnpm run build。 dist/レイアウトを以前のビルドと比較 (同じ 11 以上のルート、ロケールディレクトリはそのまま、フラット化されていないこと)。grep -o '<loc>[^<]*</loc>' dist/sitemap-0.xml— すべての URL が実際のファイルのカノニカル形式と一致する必要があります。dist/index.htmlと 1 つのロケールページで<link rel="canonical">と hreflang をスポットチェック。- マージ後、Pages の実行を監視し、ライブ URL をプローブ (
curl -s -o /dev/null -w "%{http_code}")。
既知のしきい値: Astro 6 には Node ≥22 が必要 (pages.yml はすでに 22) で、CJS 設定が廃止されました (こちらは .mjs); i18n.routing.redirectToDefaultLocale のデフォルトが変更されました (ここでは無関係 — prefixDefaultLocale: false)。Astro 7 は Vite 8/Rolldown + Rust コンパイラに移行しました — 主にこのサイトにはないインテグレーション/カスタム Vite 設定に影響します。アップグレードガイド: https://docs.astro.build/en/guides/upgrade-to/v6/、https://docs.astro.build/en/guides/upgrade-to/v7/。
その他
optimize-images.sh—public/の画像パイプライン; 重いアセットを追加した後に実行します。- Search Console / Yandex 検証タグはレイアウトの head にあります — 削除しないでください。
- サイトコピー (およびその他すべてのユーザー向け表面 — README、plugin.json、リポジトリメタデータ) の文言/配置ルールは、
seo-surfacesスキル + AGENTS.md の「SEO surfaces」にあります。CI:node scripts/seo-check.mjs --siteは Pages ワークフローでdist/に対して実行されます。