このプロジェクトについて
Prompt Save Reuseは、ChromeとEdge向けのManifest V3ブラウザ拡張機能で、AIチャットの入力欄に入力したテキストを保存し、必要なときに復元します。チャットセッションをまたいで同じ指示を再入力・再貼り付けしている人に向けて、ワンジェスチャーで保持できるように設計されています。
対応プラットフォーム(7つ):ChatGPT、Gemini、Claude、Perplexity、Grok、Mistral、DeepSeek。
操作モデル
- 入力欄またはツールバーアイコンをシングルクリック:この会話URLに対する現在の入力欄テキストを保存します。入力欄が空の場合は、そのURL用に保存されたテキストを復元します。
- 入力欄またはツールバーアイコンをダブルクリック:保存済みテキストを現在の入力欄コンテンツの下に、空行を挟んで追記します。
- ツールバーアイコンを右クリック:コンテキストメニューが表示され、保存データの全消去、ユーザーガイドの表示、開発者プロフィールの表示ができます。
- キーボードショートカット:Ctrl+Shift+1で保存、Ctrl+Shift+2で追記。
ポップアップやサイドパネルはありません。インターフェースは入力欄とツールバーボタンのみです。保存されたテキストはchrome.storage.syncに保持されるため、ブラウザプロフィールを介してデバイス間で同期されます。
インストール
- ChromeウェブストアとMicrosoft EdgeアドオンストアのリストはREADMEにリンクがあります。
- ソースから:リポジトリをクローンし、chrome://extensionsを開き、デベロッパーモードを有効にして、「パッケージ化されていない拡張機能を読み込む」をクリックし、リポジトリフォルダを選択します。ビルド工程や依存関係はなく、スタックはプレーンなJavaScriptです。
権限とプライバシー
- storage:会話URLをキーにしたプロンプトをchrome.storage.syncに保存。
- activeTab:現在使用中のチャットタブに対して操作。
- scripting:ショートカットとツールバーアイコン用に、そのタブで保存・追記機能を実行。
- contextMenus:ツールバーアイコンの右クリックメニューを提供。
READMEには、7つの対応チャットドメイン以外のホスト権限はなく、拡張機能自身によるネットワークリクエストや分析もないと記載されています。
著者が説明する注目すべきエンジニアリング詳細
- ポップアップなしで1つのターゲットに2つのジェスチャー:ブラウザにはツールバーアクションのネイティブなダブルクリックイベントがないため、background.jsとcontent.jsはそれぞれ300msのタイマーを保持します。最初のクリックでシングルクリックハンドラをスケジュールし、ウィンドウ内での2回目のクリックでそれをキャンセルしてダブルクリックハンドラを実行します。その結果、すべてのシングルクリック操作は意図的に300ms遅延します。
- 7つのチャットUIにわたる単一の挿入パス:findInputField()はサイトごとの分岐ではなく、順序付けられたセレクタカスケードであり、ProseMirror contenteditable、ChatGPTの#prompt-textarea、Quillの.ql-editor、Perplexityの#ask-input、DeepSeekのプレースホルダー一致textareaをカバーします。insertText()は3方向に分岐します。これは、フレームワーク制御の入力が直接の.value代入を上書きするためです。プロトタイプのネイティブ値セッターと、textareaとinputへのinputイベントのディスパッチ、Lexicalエディタ用のdocument.execCommand("insertText")、その他のcontenteditableコンポーザ用のinnerHTMLとinputイベントです。
- コンテンツスクリプト実行時にはコンポーザが存在しない:7つのサイトすべてがシングルページアプリであり、入力は後からマウントされ、ナビゲーション時に再マウントされるため、MutationObserverがそれを監視し、リスナーを再アタッチします。
- URLをキーにしたストレージ:会話ごとに1つの保存プロンプトを、localではなくchrome.storage.syncに保存するため、ブラウザプロフィールに追従します。トレードオフは同期クォータであり、十分に長いプロンプトは保存されません。
READMEに記載されている既知の制限事項
- セレクタが脆弱な部分:プラットフォームが新しいコンポーザをリリースすると、findInputField()が一致しなくなり、セレクタリストが更新されるまでそのサイトでは拡張機能が動作しなくなります。
- 保存失敗は無言:入力フィールドが見つからない場合、ユーザーに知らせるものはありません(issue #13で追跡)。
- chrome.storage.syncにはクォータがあり、十分に長いプロンプトはアイテムあたりのサイズ制限を超え、保存されません。
- シングルクリック操作には設計上300msの遅延があります。
- 自動テストはありません(issue #8と#9で追跡)。
- URLごとに1つのプロンプト:名前付きプロンプトライブラリはなく、再度保存すると上書きされます。
プロジェクトの状態と貢献
- Chromeウェブストアのリストはバージョン3.0で公開中。Edgeアドオンストアのリストも公開中。
- 貢献は歓迎されており、good first issueやhacktoberfestとラベル付けされたissueがあります。CONTRIBUTING.mdとCODE_OF_CONDUCT.mdが参照されています。テストガイダンスは、パッケージ化されていない拡張機能を読み込み、7つの対応サイトのうち少なくとも1つで変更をテストすることです。
- 連絡先はGitHub issuesまたはLinkedIn(linkedin.com/in/atj393)。
ライセンス
MITではなくカスタムライセンス。READMEは、このプロジェクトへの貢献を目的とした変更の使用、修正、公開の権利を付与し、派生作品が同じ条件を維持することを要求し、私的利用、商用利用、サブライセンス、および変更なしでのソフトウェアの再配布を明示的に禁止するものと要約しています。全文はライセンスファイルにあります。
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.