# 新しいプラットフォームを追加する 新しいチャットサイトを追加するには、2 つの別々の層があります。 1. **サイトアダプタ** `catalog/sites//site.json`。Voyager に、そのウェブサイトの認識方法と、ユーザーのターン、アシスタントのターン、入力欄、サイドバー、テーマのマーカーを見つける方法を教えます。 2. `catalog/sites//plugins//` の下にある **プラグイン**。そのウェブサイト上で、読み取り幅やレンダリングの修正など、ユーザーが直面する 1 つの問題を解決します。 `site.json` には、`id`(ディレクトリ名と同じ)、`label`、`matches`、`selectors`、`theme`、`brandColor`、`capabilities` と、任意の `conversationIdPattern` および `turnKeyAttributes` が含まれます。`turnKeyAttributes` は、ページが再描画されたときにユーザーのメッセージの識別子を保つ属性の名前を指定します。送信の追跡(フォルダの Activity やタイムラインのタイムスタンプで使われます)は、この属性と `composer`、`userTurn`、`conversationIdPattern` を設定したサイトでのみ動作します。`src/features/plugins/sites/siteAdapterData.ts` の `validateSiteAdapterData` がこれを検証し、`bun run catalog:build` は公開の前にすべてのサイトとプラグインを検証します。 `site.json` はサイトアダプタそのものをデータとして書いたものです。現在のプラグイン対応サイトは ChatGPT、Claude、DeepSeek、Kimi です。Gemini と AI Studio は Voyager のネイティブ画面で、こちらも専用の `site.json`(`catalog/sites/gemini/`、`catalog/sites/aistudio/`)を持ちますが、拡張機能に同梱され、リモートカタログには公開されません。`sites/adapters/gemini.ts`、`aistudio.ts`、`claude.ts`、`chatgpt.ts`、`deepseek.ts` はいずれも `site.json` を読むだけの 1 行のシェルです。TypeScript ではなく JSON を編集してください。 公開されるホスト別カタログはサイトデータも運ぶため、セレクタ修正は拡張機能をリリースしなくてもユーザーに届きます。ただし、まったく新しいサイトには、やはり拡張機能の中に含める必要があります。ホスト権限とコンテンツスクリプトの登録が、パッケージに組み込まれているためです。 DeepSeek のような新しいプラットフォームを追加する場合は、アダプタの作業をプラットフォームとの契約に絞ってください。`site.json`、必要なセレクタのテスト、そして対応内容を説明するための最低限のドキュメントを、1 つの完全な変更にまとめます。サイトのレジストリは、ファイル自体から新しいアダプタを読み込むので、登録リストを編集する必要はありません。プラグインごとに新しいサイトを追加しないでください。 アダプタが承認されたあとは、後続のプラグインを、独立した焦点の絞られた変更として提出できます。複数の変更が互いに依存している場合は、スタックされた PR の連鎖が役立ちます。後続のブランチは直前のブランチを基にし、各 PR には、そのPR独自の増分の機能だけが表示されます。それでも連鎖全体で同じスコープのルールに従ってください。PR ごとに、明確なユーザー目標を 1 つだけ持ち、必要なテストと後片付けを含めます。 サイトの対応に、モデル API との連携は必要ありません。新しいプラットフォームのために、静的なコンテンツスクリプトや必須のホスト権限を追加しないでください。プラグインだけのサイトには、既存のオプション権限と動的な登録の仕組みを使ってください。 オプション権限と動的な登録の仕組みは、ブラウザのバージョンに依存します。Chrome と Edge は、この拡張機能が使っている仕組みに対応しています。Firefox はオプションのホスト権限に バージョン 128 以降を必要とし、Safari は動的なコンテンツスクリプトの登録にバージョン 16.4 以降を必要とします。対応しているより古いブラウザでは、必要な API が永続的な許可を提供できないため、カスタムサイトでプラグインを有効にできなくても、それは正しい動作です。メンテナーの承認なしに、広い静的なホスト権限を追加して回避しないでください。