XのコメントとRTするときの下書き作成のChrome拡張の要件定義はこちら。
gpt-5.2-codex で以下の要件投げたら同じようなChrome拡張できると思うよ。
※Geminiの無料API KEYでもたぶん動くと思う。
###
目的
- X(Twitter)上で引用リツイート/返信用の下書きを自動生成し、投稿作成ダイアログに即時挿入する。
対象環境
- Chrome 拡張 (Manifest V3)。
- 対象 URL:
x.com/*,
twitter.com/*。
- ファイル: manifest.json, background.js, content.js (いずれも直下)。
API/モデル
- Gemini Generative Language API v1beta の models/{model}:generateContent を fetch で呼び出す。
- デフォルトモデル: gemini-2.5-flash-lite。モデルはパネルから変更可能(選択肢: 2.0/2.5 flash(-lite),
3 flash preview)。
- APIキーは
chrome.storage.local.geminiApiKey に保存し、未設定時はエラー扱い。背景でキーなしの場合は
ユーザーに設定を促す(UIで保存)。
- モデル移行フラグ geminiModelMigratedTo25FlashLite を持ち、未移行時は自動でデフォルトモデルを書き換
えて移行完了フラグを保存。
生成プロンプト仕様 (background.js)
- メッセージタイプ: GENERATE_RERT。payload: { text, mode } (modeはreply/quote)。
- ユーザー設定に応じた可変要素:
- viewpoint(視点: 肩書き文言を本文に含めない)
- audience(想定読者: 呼称は本文に含めない)
- length(short=20–40字, standard=40–80字, long=80–140字)
- writingHabit(文体のクセを守る)
- banWords(カンマ区切り語を本文で禁止)
- モード別指示: reply→「返信文を作成」、それ以外→「引用リツイート文を作成」。
- プロンプトパターン:
- 最大5件まで保存 (rertPromptPatterns array)。各要素 {id,name,prompt}。
- 選択中ID rertSelectedPatternId。テンプレ内の {{mode}}, {{text}} を置換。{{text}} が無い場合は
末尾に「投稿内容:\n{text}」を付与。
- パターン未設定時のデフォルトテンプレート: 40–80字、観察者視点、事実と解釈を分離、不特定多数向
け、前置き・記号なし。
- 出力後処理: draftを trim して返却。レスポンスから candidates[0].content.parts[0].text を取得し、無
ければエラー。
データ保存/統計
- modelStats にモデル別 input/output 文字数を累積。CHARS_PER_TOKEN=4 を用い、簡易コスト表示用。
- UI では rertEnabled(自動生成ON/OFF)、geminiModel, geminiApiKey, rert* 各種設定を
chrome.storage.local に読書き。
パネルUI/操作 (content.js)
- 浮動パネル(デフォルト最小化、右上あたり)。Z-index: 最小化 2,147,483,000 / 展開 2,147,483,647。ド
ラッグ移動可(展開時のみ)。
- 最小化ボタン: “R” アイコン。クリックで展開。
- 展開ビュー要素:
- トグル: 自動下書きON/OFF。ONは緑枠/影で状態表示。
- コストカード: 推定コスト、入力/出力文字数。
- プロンプトパターン編集:
- セレクトで既存パターン選択。
- 名前、本文テキストエリア({{mode}}, {{text}} 使用説明付き)。
- 「 新規パターン」ボタン(最大5件、超過でボタン無効)。
- 設定セクション(折りたたみ):
- モデルセレクト(上記選択肢)。
- APIキー入力(password型)。
- 保存ボタン/メッセージ表示。
- 初期化時:
- rertPromptPatterns が無い場合、デフォルトパターン1件を作成・保存。
- トグルは rertEnabled !== false ならON。
- モデル移行フラグチェック後、モデル値をUIに反映。
- APIキーをキャッシュ(cachedApiKey)。
- パターン選択とフォームへの反映。
- パネルは最小化状態で開始。
ドラフト生成フロー (content.js)
1. DOM監視: MutationObserver が document.body を監視し、投稿ダイアログ div[role="dialog"] が現れたら
処理。
2. ダイアログ内の本文入力エリア: data-testid="tweetTextarea_0" を取得。
3. 対象ツイート本文: ダイアログ内の [data-testid="tweetText"] / div[lang] を全て取得し、テキストを結
合。
4. モード判定: ダイアログに data-testid="replyingTo" または文言「返信先」があれば reply、なければ
quote。
5. 生成・挿入:
- APIキーが無ければ何もしない。
- 同一ソーステキスト モードの重複実行防止セット pendingDrafts。
- キャッシュ draftCache に同キーがあればそれを再利用して末尾に挿入。
- 未キャッシュなら chrome.runtime.sendMessage で GENERATE_RERT 呼び出し → draft受領。
- 既存テキストがある場合は前に空白1つを付けて連結。
- 挿入は paste イベント試行→execCommand('insertText')→textContent書き込みの順でフォールバック。
- 1ダイアログ1回だけ実行するよう textarea.dataset.geminiRertFilled /
dialog.dataset.geminiRertProcessed/Processing でガード。
6. 失敗時は特にUIエラー表示なし(console loggingのみ)。
キャッシュ/再実行条件
- draftCache キー: "{mode}::{text.trim()}"。
- 同一ソース モードの同時多重実行を pendingDrafts で抑止。
- ダイアログ閉鎖後のキャッシュ保持期間の明示はなし(セッション中Map保持)。
スタイル/フォント
- システム系サンセリフ(-apple-system等)。パネルは白背景 影、ボタンは丸角。
パーミッション
- "storage" と Gemini API ホストのみ。タブ/クリップボードなど追加権限なし。
エッジケース/ガード
- 投稿本文が3文字未満なら生成しない。
- APIレスポンスが不正/空ならエラー扱い。
- UI操作時、入力フォーカスで枠線色変更。
- パターン上限で追加ボタン無効化&文言表示。
再現に必要な外部値
- Gemini APIキー(ユーザーがパネルで入力)。
- Geminiモデル: デフォルト gemini-2.5-flash-lite、選択肢は上記5種。
期待されるユーザーフロー
1. 拡張をインストールし、パネルでAPIキーとモデルを保存(必要ならプロンプトパターンを編集/追加)。
2. タイムラインやスレッドで「返信」または「引用リツイート」を押してダイアログを開く。
3. 自動下書きがONなら数秒以内に生成文がテキストエリア末尾へ自動挿入される。
4. ユーザーは必要に応じて手動編集し、そのまま投稿。
Chrome拡張の第4弾は、コメントとRTのドラフト作成ツール。
冬休みになってみんなが時間を持て余して大量長文投稿になることへの対策。
大量投稿でもひとつずつしっかりとフォローアップして楽しめる。
#冬休みの準備を万全に