X(Twitter)への投稿
実際のChromeブラウザ経由で、テキスト、画像、動画、長文記事をXに投稿します。
Codexでは、以下のブラウザパスを混同しないでください:
- Codex Chromeプラグイン /
@chrome/ Chrome拡張機能: バンドルされたchrome:ChromeスキルとそのNode REPLブラウザクライアントを使用します。ユーザーが「Codex Chromeプラグイン」「Codex 自带的 Chrome 插件」「@chrome」などと言った場合に必須です。 - Chrome Computer Use: 可視のGoogle Chrome UIに対して
mcp__computer_use__.*を、ユーザーがComputer Useを要求した場合、またはChromeプラグインの指定がなくComputer Useが利用可能な場合にのみ使用します。 - CDPスクリプトモード: 選択したモードが利用できない場合、またはユーザーがCDP/スクリプトモードを明示的に要求した場合のフォールバックとしてのみ使用します。
スクリプトディレクトリ
重要: すべてのスクリプトは、このスキルのscripts/サブディレクトリにあります。
エージェント実行手順:
- このSKILL.mdファイルのディレクトリパスを
{baseDir}として決定します。 - スクリプトパス =
{baseDir}/scripts/<script-name>.ts - このドキュメント内の
{baseDir}をすべて実際のパスに置き換えます。 ${BUN_X}ランタイムを解決:bunがインストールされていれば →bun、npxが利用可能なら →npx -y bun、そうでなければbunのインストールを提案します。
スクリプト参照:
| スクリプト | 目的 |
|---|---|
scripts/x-browser.ts | 通常の投稿(テキスト+画像)、CDPフォールバック |
scripts/x-video.ts | 動画投稿(テキスト+動画)、CDPフォールバック |
scripts/x-quote.ts | 引用ツイート(コメント付き)、CDPフォールバック |
scripts/x-article.ts | 長文記事の公開(Markdown)、CDPフォールバック |
scripts/md-to-html.ts | Markdown → HTML変換 |
scripts/copy-to-clipboard.ts | コンテンツをクリップボードにコピー |
scripts/paste-from-clipboard.ts | 実際の貼り付けキーストロークを送信 |
scripts/check-paste-permissions.ts | 環境と権限を検証 |
実行モードの選択(必須)
Xと対話する前に、必ず1つのモードを選択してください:
- ユーザーがCodex Chromeプラグイン、
@chrome、Chrome拡張機能、または「Codex 自带的 Chrome 插件」を明示的に要求した場合、Codex Chromeプラグインモードを使用します。Computer Useを最初に呼び出さないでください。 - ユーザーがChrome Computer Useを明示的に要求した場合、Chrome Computer Useモードを使用します。ユーザーに伝え承認を得ずに、CDP、Playwright、アプリ内ブラウザ、またはChromeプラグインにフォールバックしないでください。
- ユーザーがCDP/スクリプトモードを明示的に要求した場合、CDPスクリプトモードを使用します。
- それ以外の場合は、Chrome Computer Useモードを優先します。Markdownの**X記事(ローカルコンテンツ画像を含む)**では、テスト済みのXエディターフローを使用します:ツールバーから各本文画像をそのプレースホルダーに挿入し(
Insert→Media→ ダイアログのアイコンボタンAdd photos or video)、その後プレースホルダーテキストを削除します。CDPスクリプトモードは、選択したブラウザ制御モードが利用できない場合、またはUIのアップロード/選択フローが不安定な場合にのみ使用します。
X公開ワークフローでは、アプリ内ブラウザを使用しないでください。
Codex Chromeプラグインモード
ユーザーがCodex Chromeプラグイン、@chrome、またはChrome拡張機能のパスを要求した場合は常にこのモードを使用します。これは、Computer UseやCDPではなく、バンドルされたChromeプラグインを介してユーザーの実際のChromeプロファイルとXログインを使用します。
セットアップ
- ブラウザ作業の前に
chrome:Chromeスキルを読み込みます。 - Node REPL
jsツールがまだ表示されていない場合は、tool_searchでnode_repl jsを検索します。 - Chromeスキルの指定どおりにChromeブラウザクライアントを初期化し、
browser.user.openTabs()のような軽量な呼び出しを実行して拡張機能の接続を確認します。 - 最初の軽量呼び出しが失敗した場合は、2秒待ってから再試行します。それでも失敗する場合は、Chromeスキルの拡張機能チェックと回復手順に従います。チェックに合格しても通信がまだ失敗する場合は、新しいChromeウィンドウを開く前にユーザーに尋ねてください。サイレントにComputer UseやCDPに切り替えないでください。
一般ルール
- Chromeプラグインの
browser.tabs.*、tab.playwright.*、tab.cua.*、およびファイルチューザーAPIをXのUIアクションに使用します。 - シェルコマンドは、Markdownの前処理とリッチHTMLのクリップボード準備に使用できます。X記事の本文画像では、画像のクリップボード貼り付けに依存せず、エディターの
Insert→Mediaアップロードフローを使用してください。 - ファイルアップロードが
Not allowedで失敗した場合は、ユーザーに次のように伝えます:ファイルのアップロードを有効にするには、Chromeでchrome://extensionsに移動し、Codex拡張機能の下の「詳細」をクリックして、「ファイルのURLへのアクセスを許可する」を有効にしてください。詳細はhttps://developers.openai.com/codex/app/chrome-extension#upload-files を参照してください。 - Chromeプラグインが
native pipe is closedと報告した場合は、2秒後にもう一度軽量ブラウザ呼び出しを再試行し、次にChromeスキルのヘルスチェックを実行します。Chromeが実行中で、拡張機能が有効になっており、ネイティブホストマニフェストが正しい場合は、新しいChromeウィンドウを開いて再試行する許可を求めます。壊れたパイプを通してブラウザアクションを送り続けないでください。 - 現在の会話でユーザーからの明示的な最終確認なしに、
Publish、Post、または外部から見える送信アクションをクリックしないでください。
X記事
- Markdownを変換し、イメージマップを保持します:
${BUN_X} {baseDir}/scripts/md-to-html.ts article.md --save-html /tmp/x-article-body.html > /tmp/x-article.json - JSON出力から
title、coverImage、contentImages(placeholder→localPath)を読み取ります。 https://x.com/compose/articlesで記事の下書きを開くか作成します。- Chromeプラグインのファイルチューザーフローでカバー画像をアップロードします。アップロードが拡張機能の権限によってブロックされる場合は、停止して上記の正確な権限修正方法を報告します。
- タイトルを入力し、リッチHTMLをコピーします:
${BUN_X} {baseDir}/scripts/copy-to-clipboard.ts html --file /tmp/x-article-body.html - Chromeプラグインを介して実際の貼り付けキーストロークで記事本文に貼り付けます。macOSでは
Meta+Vを使用します。 - エディターテキストに記事本文と
XIMGPH_プレースホルダーが含まれていることを確認します。シェルのクリップボード書き込み後に、システムクリップボードの証明としてtab.clipboard.readText()に依存しないでください。macOSでは必要に応じてpbpasteで確認します。 - 各
contentImages項目をプレースホルダー順に処理します:- 可視のプレースホルダーテキスト(
XIMGPH_N)を見つけてクリックし、そこにキャレットを配置します。 - ツールバーメニュー
Insert→Mediaを開きます。 - モーダル内で、
aria-label="Add photos or video"のアイコンボタンをクリックします。テキスト/ドロップゾーンや非表示のファイル入力をクリックしないでください。 - ファイルチューザーを使用して、その画像の
localPathをアップロードします。 - 画像が表示された後、その上に
XIMGPH_Nが残っている場合は、そのプレースホルダーを正確に選択して最初にDeleteを押します。Deleteが失敗し、選択されたテキストが正確にプレースホルダーであることが確認された場合にのみBackspaceを使用します。 - その
XIMGPH_Nのプレースホルダー数が0であることを確認します。
- 可視のプレースホルダーテキスト(
- プレビューを開き、タイトル、カバー、本文、リンク、画像を確認します。
Publishをクリックする前に明示的な確認を求めます。
設定(EXTEND.md)
優先順にEXTEND.mdを確認します — 最初に見つかったものが優先されます:
| 優先順位 | パス | スコープ |
|---|---|---|
| 1 | .baoyu-skills/baoyu-post-to-x/EXTEND.md | プロジェクト |
| 2 | ${XDG_CONFIG_HOME:-$HOME/.config}/baoyu-skills/baoyu-post-to-x/EXTEND.md | XDG |
| 3 | $HOME/.baoyu-skills/baoyu-post-to-x/EXTEND.md | ユーザーホーム |
見つからない場合は、デフォルトを使用します。
EXTEND.mdがサポートするもの: デフォルトのChromeプロファイル
前提条件
- Google ChromeまたはChromium
bunランタイム- 初回実行時:手動でXにログイン(セッションが保存されます)
プリフライトチェック(オプション)
初回使用前に、環境チェックを実行することをお勧めします。ユーザーが希望する場合はスキップできます。
${BUN_X} {baseDir}/scripts/check-paste-permissions.ts
チェック項目:Chrome、プロファイルの分離、Bun、アクセシビリティ、クリップボード、貼り付けキーストローク、Chromeの競合。
いずれかのチェックが失敗した場合、項目ごとに修正ガイダンスを提供します:
| チェック | 修正 |
|---|---|
| Chrome | Chromeをインストールするか、環境変数X_BROWSER_CHROME_PATHを設定します |
| プロファイルディレクトリ | baoyu-skills/chrome-profileの共有プロファイル(CLAUDE.mdのChromeプロファイルセクションを参照) |
| Bunランタイム | brew install oven-sh/bun/bun(macOS)またはnpm install -g bun |
| アクセシビリティ(macOS) | システム設定 → プライバシーとセキュリティ → アクセシビリティ → ターミナルアプリを有効にする |
| クリップボードコピー | Swift/AppKitが利用可能であることを確認(macOS Xcode CLIツール:xcode-select --install) |
| 貼り付けキーストローク(macOS) | 上記のアクセシビリティ修正と同じ |
| 貼り付けキーストローク(Linux) | xdotool(X11)またはydotool(Wayland)をインストールします |
参照
- 通常の投稿:手動ワークフロー、トラブルシューティング、技術的な詳細については
references/regular-posts.mdを参照してください - X記事:長文記事の公開ガイドについては
references/articles.mdを参照してください
Chrome Computer Useモード
ユーザーがChrome Computer Useを明示的に要求した場合、またはChromeプラグインの指定がなくCodexがComputer UseでGoogle Chromeを制御できる場合にこのモードを使用します。既存のChromeウィンドウ、Cookie、ログイン、拡張機能、Xセッションを使用します。
一般ルール:
- Chromeを制御するアシスタントの各ターンで、
Google Chromeに対してget_app_stateを呼び出して開始します。 - 可能な場合は要素インデックスアクションを優先します。座標はエディターテキストの選択やドラッグ選択にのみ使用します。
- ユーザーがモード変更を承認しない限り、このモードでX UIアクションにアプリ内ブラウザ、Chromeプラグイン、Playwright、CDPを使用しないでください。
- 現在の会話でユーザーからの明示的な最終確認なしに、
Publish、Post、または外部から見える送信アクションをクリックしないでください。
通常の投稿:
- Chromeで
https://x.com/compose/postを開くか移動します。 - Computer Useを使用して、投稿テキストをコンポーザーに入力します。
- 各画像に対して次を実行します:
${BUN_X} {baseDir}/scripts/copy-to-clipboard.ts image /absolute/path/to/image.png - Computer Useで貼り付け(macOSでは
super+v、Windows/Linuxではcontrol+v)、Xがメディアのアップロードを完了するまで待ちます。 Postをクリックする前に確認を求めます。
動画投稿:
- Chromeで
https://x.com/compose/postを開くか移動します。 - 投稿テキストをコンポーザーに入力します。
- 可視のメディアアップロード/ファイルピッカーUIを使用して動画を添付します。
- アップロードと処理が完了するのを待ちます。
Postをクリックする前に確認を求めます。
引用ツイート:
- ChromeでツイートURLを開きます。
- 可視の引用/リポストUIを使用して引用を選択します。
- コメントを入力します。
Postをクリックする前に確認を求めます。
X記事:
- Markdownを変換し、イメージマップを保持します:
${BUN_X} {baseDir}/scripts/md-to-html.ts article.md --save-html /tmp/x-article-body.html > /tmp/x-article.json - JSON出力から
title、coverImage、contentImages(placeholder→localPath)を読み取ります。 - Chromeで
https://x.com/compose/articlesを開き、下書きを作成または開き、カバーがある場合はアップロードし、タイトルを入力します。 - リッチHTMLをクリップボードにコピーします:
${BUN_X} {baseDir}/scripts/copy-to-clipboard.ts html --file /tmp/x-article-body.html - Computer Useで記事本文に貼り付けます。
- 各
contentImagesエントリをプレースホルダー順に処理します:- 正確な可視プレースホルダーテキスト(例:
XIMGPH_3)を見つけてクリックし、挿入ポイントを設定します。 - ツールバーの
Insertドロップダウンを開き、Mediaを選択し、モーダルのAdd photos or videoというラベルのアイコンボタンをクリックします。 - ネイティブファイルピッカーを使用して画像の
localPathを選択します。 - 画像ブロックが表示され、アップロードアクティビティが終了するまで待ちます。
- 挿入された画像の上にプレースホルダーが残っている場合は、そのプレースホルダーテキストを正確に再選択し、まず
Deleteを押します。Deleteが失敗し、選択されたテキストが正確にプレースホルダーであることが確認された場合にのみBackspaceを使用します。
- 正確な可視プレースホルダーテキスト(例:
XIMGPH_プレースホルダーが残っておらず、予想される画像が表示されることを確認します。- プレビューを開き、タイトル、カバー、本文、リンク、画像を確認します。
Publishをクリックする前に明示的な確認を求めます。
Computer Useの選択、ツールバーのアップロード、またはファイルピッカーの制御が信頼できなくなった場合は、サイレントにChromeプラグインやCDPに切り替えるのではなく、停止してブロッカーを報告します。
CDPスクリプトモード(フォールバック)
以下のスクリプトセクションは、選択したブラウザ制御モードが利用できない、信頼できない、または明示的に要求されていない場合にのみ使用します。これらのスクリプトは、CDP経由で実際のChromeインスタンスを起動または再利用し、レビューのためにブラウザを開いたままにします。
ユーザーがCodex ChromeプラグインまたはChrome Computer Useを明示的に要求している場合、ブロッカーを説明してユーザーがフォールバックを承認しない限り、CDPスクリプトモードを使用しないでください。
投稿タイプの選択
ユーザーが投稿タイプを明示的に指定しない限り:
- プレーンテキスト + 10,000文字以内 → 通常の投稿(プレミアム会員は最大10,000文字、非プレミアムは280文字)
- Markdownファイル(.md) → X記事
通常の投稿
${BUN_X} {baseDir}/scripts/x-browser.ts "Hello!" --image ./photo.png
パラメータ:
| パラメータ | 説明 |
|---|---|
<text> | 投稿内容(位置指定) |
--image <path> | 画像ファイル(繰り返し可能、最大4枚) |
--profile <dir> | カスタムChromeプロファイル |
注記: スクリプトは内容が入力された状態でブラウザを開きます。ユーザーが確認して手動で公開します。
Codexモードに関する注記: ユーザーがCodex Chromeプラグインを明示的に要求した場合、Codex Chromeプラグインモードを使用します。それ以外の場合、Chrome Computer Useが有効であれば、x-browser.tsを実行する代わりにChrome Computer Useモードを使用します。
動画投稿
テキスト+動画ファイル。
${BUN_X} {baseDir}/scripts/x-video.ts "Check this out!" --video ./clip.mp4
パラメータ:
| パラメータ | 説明 |
|---|---|
<text> | 投稿内容(位置指定) |
--video <path> | 動画ファイル(MP4、MOV、WebM) |
--profile <dir> | カスタムChromeプロファイル |
注記: スクリプトは内容が入力された状態でブラウザを開きます。ユーザーが確認して手動で公開します。
Codexモードに関する注記: ユーザーがCodex Chromeプラグインを明示的に要求した場合、Codex Chromeプラグインモードを使用します。それ以外の場合、Chrome Computer Useが有効であれば、x-video.tsを実行する代わりにChrome Computer Useモードを使用します。
制限: 通常は最大140秒、プレミアムは最大60分。処理時間:30〜60秒。
引用ツイート
既存のツイートにコメントを付けて引用します。
${BUN_X} {baseDir}/scripts/x-quote.ts https://x.com/user/status/123 "Great insight!"
パラメータ:
| パラメータ | 説明 |
|---|---|
<tweet-url> | 引用するURL(位置指定) |
<comment> | コメントテキスト(位置指定、オプション) |
--profile <dir> | カスタムChromeプロファイル |
注記: スクリプトは内容が入力された状態でブラウザを開きます。ユーザーが確認して手動で公開します。
Codexモードに関する注記: ユーザーがCodex Chromeプラグインを明示的に要求した場合、Codex Chromeプラグインモードを使用します。それ以外の場合、Chrome Computer Useが有効であれば、x-quote.tsを実行する代わりにChrome Computer Useモードを使用します。
X記事
長文のMarkdown記事(X Premiumが必要)。
${BUN_X} {baseDir}/scripts/x-article.ts article.md
${BUN_X} {baseDir}/scripts/x-article.ts article.md --cover ./cover.jpg
パラメータ:
| パラメータ | 説明 |
|---|---|
<markdown> | Markdownファイル(位置指定) |
--cover <path> | カバー画像 |
--title <text> | タイトルを上書き |
フロントマター: YAMLフロントマターでtitleとcover_imageがサポートされています。
Codexモードに関する注記: ユーザーがCodex Chromeプラグインを明示的に要求した場合、上記のCodex Chromeプラグインモードに従います。Chrome Computer Useを明示的に要求した場合は、Chrome Computer Useモードに従います。それ以外の場合はChrome Computer Useを優先します。ローカルコンテンツ画像を含むMarkdown記事では、ツールバーのInsert → Media画像アップロードワークフローを使用してから、CDPスクリプトモードのx-article.tsにフォールバックします。
CDPフォールバックに関する注記: スクリプトは記事が入力された状態でブラウザを開きます。--submitが使用されない限り、ユーザーが確認して手動で公開します。
公開の安全性: ユーザーが最終的な公開アクションを明示的に確認しない限り、--submitを使用したりPublishをクリックしたりしないでください。
ポストコンポジションチェック: すべての画像が挿入された後、スクリプトは自動的に次のことを検証します:
- エディターコンテンツ内に残っている
XIMGPH_プレースホルダー - 予想される画像数と実際の画像数
チェックが失敗した場合(出力に警告)、公開前に具体的な問題をユーザーに警告します。
トラブルシューティング
Chromeデバッグポートの準備ができていない
CDPフォールバックのみ:スクリプトがChrome debug port not readyまたはUnable to connectで失敗した場合、まず既存のChrome CDPインスタンスを強制終了してから再試行します:
pkill -f "Chrome.*remote-debugging-port" 2>/dev/null; pkill -f "Chromium.*remote-debugging-port" 2>/dev/null; sleep 2
重要: これは自動的に行う必要があります — このエラーが発生した場合、ユーザーに尋ねずにChrome CDPインスタンスを強制終了してコマンドを再試行します。
注意事項
- 初回実行時:手動ログインが必要です(セッションは永続化されます)
- Codex ChromeプラグインモードおよびChrome Computer Useモードでは、ユーザーの既存のChromeセッションを使用し、別のCDPプロファイルを起動しないでください
- CDPスクリプトはデフォルトでブラウザにコンテンツを入力するだけです。
--submitが明示的に使用されない限り、ユーザーが確認して手動で公開する必要があります - クロスプラットフォーム:macOS、Linux、Windows
拡張サポート
EXTEND.mdによるカスタム設定。パスとサポートされるオプションについては設定セクションを参照してください。


