mcpField
O
obsidian-to-x

obsidian-to-x

github.com/libukaiマーケティング・グロース507 回インストール
リポジトリ

obsidian-to-x について

Obsidian ユーザー向けの X 投稿スキルで、通常投稿、動画、引用投稿、長文記事を実際の Chrome ブラウザーから公開できます。アクティブなノートを検出し、Obsidian Markdown を X の形式に変換します。

主な機能

  1. 01テキスト、画像、動画、記事の投稿
  2. 02アクティブな Obsidian ファイルの取得
  3. 03Obsidian Markdown と画像記法の変換
  4. 04frontmatter に基づく記事・通常投稿の選択
  5. 05ブラウザーで確認してから手動投稿

活用シーン

  1. 01アクティブな Obsidian ノートを X Article として公開
  2. 02Markdown ノートを画像付きの通常投稿に変換
  3. 03動画投稿やコメント付き引用投稿の作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/libukai/awesome-agent-skills --skill obsidian-to-x

インストール後、Claude Code で/obsidian-to-xを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
articles.md
browser-automation-lessons.md
obsidian-conversion.md
obsidian-integration.md
regular-posts.md
troubleshooting.md
scripts/
bun.lock
check-editor-content.ts
check-paste-permissions.ts
copy-to-clipboard.ts
insert-code-blocks.ts
md-to-article.ts
md-to-post.ts
obsidian-resolver.ts
package.json
paste-from-clipboard.ts
publish-active.sh
test-annotation-debug.ts
test-code-insertion.ts
x-article.ts
x-post.ts
x-quote.ts
x-utils.ts
x-video.ts

詳細

X(Twitter)に投稿

実際の Chrome ブラウザーを介して、テキスト、画像、動画、長文記事を X に投稿します(ボット対策検出を回避します)。

デフォルトの動作(追加の指示がない場合)

ユーザーが公開する内容を指定せずにこのスキルを呼び出した場合(たとえば「X に投稿して」とだけ言う場合や、スラッシュコマンドを使う場合):

  1. まず Chrome CDP プロセスをクリーンアップします(以下のCDP のクリーンアップを参照)

  2. 現在アクティブなファイルを取得します。次の優先順位で試します:

    優先順位 1:<current_note> タグ(Claudian が挿入。最も正確) ユーザーメッセージの末尾に <current_note> タグがあるか確認し、パスを直接抽出します。コマンドの実行は不要です。

    優先順位 2:workspace.json(ローカルのフォールバック)

    jq -r '.lastOpenFiles[] | select(endswith(".md"))' .obsidian/workspace.json | head -1
    

    優先順位 3:Obsidian CLI(最後の手段)

    obsidian file active
    
  3. Read ツールを使用してファイルの内容を読み取ります

  4. 投稿の種類を自動検出します:

    • ファイルに 是否长文: true を含むフロントマターがあるか確認します
    • 是否长文: true → X Articles(長文)として投稿します
    • 是否长文: false、是否长文 がない、またはフロントマターがない → 通常の投稿(短文)として投稿します
  5. 検出した種類をユーザーに伝え、投稿を進めます

  6. 適切なワークフローを実行します:

    • X Articles の場合:x-article.ts で投稿します(Obsidian からの変換を内部で処理します)
    • 通常の投稿の場合:md-to-post.ts で変換し、x-post.ts で投稿します
  7. Bash のバックグラウンドプロセスで投稿スクリプトを実行します(必須 — Agent の run_in_background=true は使用しないでください):

    • 必ず Bash の & を使用し、ログを vault にリダイレクトします:bun ... > .temp/x-article-output.log 2>&1 &
    • run_in_background=true を指定して Agent ツールを使用しないでください — 出力ファイルが /private/tmp/ に作成されますが、vault の権限フックによってブロックされるため、TaskOutput が失敗し、処理が重複して実行されます
    • .temp/x-article-output.log を sleep N && cat .temp/x-article-output.log | tail -30 で読み取り、進捗を確認します
  8. 成功の検出:.temp/x-article-output.log で成功を示すマーカーを確認します:

    • 最適な方法:想定される画像数と一致する Image upload verified の出現回数を数えます
    • 代替方法:Post composed (preview mode) または Browser remains open を探します
    • X Articles の場合:Article composed または Browser remains open を探します
    • 進捗確認には sleep 15 && cat .temp/x-article-output.log | tail -30 を使用します
    • マーカーが検出されたら、タスクの完了を待たずにすぐ成功を報告します

例:

User: "发到 X"
AI: ✓ Detected current file: Articles/news/my-article.md
    ✓ Found `是否文章: true` → Publishing as X Article
    [proceeds with article publishing workflow]

CDP のクリーンアップ

「Chrome debug port not ready」エラーを防ぐため、投稿スクリプトを実行する前に毎回実行します。自動で行い、ユーザーに確認する必要はありません。

pkill -f "Chrome.*remote-debugging-port"; pkill -f "Chromium.*remote-debugging-port"; sleep 2

コンテンツの種類

X Articles と通常の投稿の比較:

機能X Articles通常の投稿
コンテンツリッチテキスト(Markdown)プレーンテキストのみ
書式設定✅ 太字、斜体、見出し、リスト❌ すべて削除
コードブロック✅ 構文ハイライト❌ 非対応
画像✅ 複数の画像✅ 最大 4 枚
長さ長文(無制限)短文(280 文字)
要件X Premium無料
スクリプトx-article.tsx-post.ts
変換md-to-article.tsmd-to-post.ts

使用する場面:

  • X Articles:ブログ記事、チュートリアル、コードを含む技術記事
  • 通常の投稿:簡単な近況報告、お知らせ、テキストと画像だけの投稿

クイックスタート

現在アクティブな記事を公開したい Obsidian ユーザー向け:

bash ${SKILL_DIR}/scripts/publish-active.sh

これにより、次の処理が自動的に行われます:

  1. アクティブなファイルを検出します(workspace.json または Obsidian CLI 経由)
  2. Obsidian の構文を X 形式に変換します
  3. 内容を入力した状態で X Articles エディターを開きます

スクリプトディレクトリ

重要:すべてのスクリプトは、このスキルの scripts/ サブディレクトリにあります。

エージェントの実行手順:

  1. この SKILL.md ファイルのディレクトリパスを SKILL_DIR として特定します
  2. スクリプトのパス = ${SKILL_DIR}/scripts/<script-name>.ts
  3. このドキュメント内のすべての ${SKILL_DIR} を実際のパスに置き換えます
  4. ${BUN_X} のランタイムを解決します:bun がインストールされている場合は bun、npx が利用可能な場合は npx -y bun を使用し、どちらも利用できない場合は bun のインストールを提案します

スクリプト一覧:

スクリプト用途
投稿スクリプト
scripts/x-post.ts通常の投稿を公開(テキスト + 画像、最大 4 枚)
scripts/x-video.ts動画付き投稿を公開(テキスト + 動画)
scripts/x-quote.tsコメント付きの引用ポストを公開
scripts/x-article.tsX Articles を公開(リッチテキスト + 画像 + コード)
変換スクリプト
scripts/md-to-post.tsObsidian Markdown をプレーンテキスト + 画像に変換(投稿用)
scripts/md-to-article.tsObsidian Markdown を HTML + 画像に変換(Articles 用)
ユーティリティ
scripts/publish-active.shObsidian でアクティブなファイルをワンコマンドで公開

前提条件

  • Google Chrome または Chromium
  • bun ランタイム
  • 初回実行時:X に手動でログインします(セッションは保存されます)
  • Obsidian 連携の場合:jq ツール(macOS では brew install jq)

事前チェック(任意)

初回使用前に、環境チェックの実行を提案してください:

${BUN_X} ${SKILL_DIR}/scripts/check-paste-permissions.ts

チェック項目:Chrome、Bun、アクセシビリティ権限、クリップボード、貼り付けのキー操作。

いずれかのチェックに失敗した場合は、項目ごとに修正方法を案内してください:

チェック項目修正方法
ChromeChrome をインストールするか、X_BROWSER_CHROME_PATH 環境変数を設定します
Bun ランタイムbrew install oven-sh/bun/bun(macOS)または npm install -g bun
アクセシビリティ(macOS)システム設定 → プライバシーとセキュリティ → アクセシビリティ → ターミナルアプリを有効にします
貼り付けのキー操作(Linux)xdotool(X11)または ydotool(Wayland)をインストールします

Obsidian 連携

Obsidian ユーザーは、このスキルを使って現在アクティブなファイルを自動検出し、Obsidian 固有の構文を変換できます。

簡単なワークフロー:

# One-command publish
bash ${SKILL_DIR}/scripts/publish-active.sh

手動のワークフロー:

# Step 1: Get active file (workspace.json method, 39x faster)
ACTIVE_FILE=$(jq -r '.lastOpenFiles[0]' .obsidian/workspace.json)

# Step 2: Publish (x-article.ts handles Obsidian conversion internally)
bun ${SKILL_DIR}/scripts/x-article.ts "$ACTIVE_FILE"

Obsidian 連携の詳細については、references/obsidian-integration.md を参照してください:

  • アクティブなファイルの検出方法(workspace.json と CLI)
  • パフォーマンスの比較(0.007 秒 対 0.274 秒)
  • エラー処理とフォールバック戦略

Obsidian 構文の変換については、references/obsidian-conversion.md を参照してください:

  • ![[]] 画像構文の変換
  • 中国語の frontmatter フィールドの処理
  • 手動での変換コマンド

通常の投稿

テキスト + 最大 4 枚の画像。プレーンテキストのみ(Markdown の書式はすべて削除されます)。

Obsidian Markdown からの投稿

ステップ 1:CDP のクリーンアップ(CDP のクリーンアップセクションを参照)

ステップ 2:Markdown をプレーンテキスト + 画像に変換

# Extract content from Markdown file
# Supports both standard Markdown ![](path) and Obsidian ![[path]] image syntax
# --output-dir keeps downloaded images inside the vault (.temp) to avoid permission issues
bun ${SKILL_DIR}/scripts/md-to-post.ts "Articles/my-post.md" --output-dir ".temp/x-post" > .temp/post-content.json
TEXT=$(jq -r '.text' .temp/post-content.json)
IMAGES=$(jq -r '.images[]' .temp/post-content.json)

対応する画像構文:

  • ✅ 標準の Markdown:![alt](path/to/image.png)
  • ✅ Obsidian 構文:![[path/to/image.png]]
  • ✅ ネットワーク URL:![alt](https://example.com/image.jpg) または ![[https://example.com/image.jpg]]
  • ローカルパスは絶対パスに変換されます
  • ネットワーク上の画像は自動的に並列ダウンロードされます(逐次ダウンロードより 3~4 倍高速です)

ステップ 2.5:カバー画像を最初の画像として抽出

ファイルの frontmatter から 封面 プロパティを読み取り、存在する場合は、そのパスを最初の画像として使用します:

# 提取 封面 属性(支持 ![[path]] 和裸路径两种格式)
COVER_RAW=$(grep -m1 '^封面:' "Articles/my-post.md" | sed 's/^封面: *//' | tr -d '"')
# 解析 Obsidian wikilink 格式 ![[path]] → path
COVER_PATH=$(echo "$COVER_RAW" | sed 's/^!\[\[//;s/\]\]$//')

# 组合图片列表:封面优先,正文图片补充(总数上限 4 张)
IMAGE_ARGS=""
if [ -n "$COVER_PATH" ]; then
  IMAGE_ARGS="--image \"$COVER_PATH\""
fi
for img in $IMAGES; do
  IMAGE_ARGS="$IMAGE_ARGS --image \"$img\""
done
  • 封面 プロパティが空、または存在しない場合はスキップし、本文の画像のみを使用します
  • 画像の合計数は最大 4 枚です(x-post.ts の制限)。超過分は自動的に切り捨てられます

ステップ 3:投稿を公開

eval "${BUN_X} ${SKILL_DIR}/scripts/x-post.ts \"$TEXT\" $IMAGE_ARGS"
直接使用
${BUN_X} ${SKILL_DIR}/scripts/x-post.ts "Hello!" --image ./photo.png

パラメーター:

パラメーター説明
<text>投稿内容(プレーンテキスト、位置引数)
--image <path>画像ファイル(複数指定可能、最大4件)
--profile <dir>カスタム Chrome プロファイル

コンテンツ処理:

  • ✅ プレーンテキスト(すべての書式が削除されます)
  • ✅ 画像(最大4件)
  • ❌ リッチテキストの書式には対応していません
  • ❌ コードブロックには対応していません
  • ❌ HTML には対応していません

ブラウザーの動作:

  • スクリプトがコンテンツを入力した状態でブラウザーを開きます
  • ブラウザーは手動で確認できるよう、開いたままになります
  • ユーザーは自分のペースで確認、編集、公開できます
  • 作業が完了したら、ユーザーが手動でブラウザーを閉じます
  • --submit フラグを追加すると自動で公開します(2秒後に閉じます)

AI による成功検出(バックグラウンド実行の場合):

  • タスクの完了を待たないでください(ブラウザーは無期限に開いたままになります)
  • 最適な方法:出力内の Image upload verified の数が想定される画像数と一致するか確認します
  • 代替方法:Post composed (preview mode) または Browser remains open があるか確認します
  • 短いタイムアウト(10~15秒)を設定してから、出力内容を確認します
  • マーカーが検出されたら、すぐに成功を報告します
  • ワークフローの例:
    1. Know you're uploading 3 images
    2. Wait 10-15s for uploads
    3. Check output: grep "Image upload verified" | wc -l
    4. If count == 3 → Report success immediately
    

動画投稿

テキストと動画ファイルを投稿します。

ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)

ステップ2:動画投稿を公開

${BUN_X} ${SKILL_DIR}/scripts/x-video.ts "Check this out!" --video ./clip.mp4

パラメーター:

パラメーター説明
<text>投稿内容(位置引数)
--video <path>動画ファイル(MP4、MOV、WebM)
--profile <dir>カスタム Chrome プロファイル

制限:通常アカウントは最大140秒、Premium は最大60分です。処理時間:30~60秒。


引用ポスト

既存のツイートにコメントを添えて引用します。

ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)

ステップ2:引用ポストを公開

${BUN_X} ${SKILL_DIR}/scripts/x-quote.ts https://x.com/user/status/123 "Great insight!"

パラメーター:

パラメーター説明
<tweet-url>引用する URL(位置引数)
<comment>コメントテキスト(位置引数、省略可能)
--profile <dir>カスタム Chrome プロファイル

X Articles

長文の Markdown 記事(X Premium が必要です)。

ステップ1:CDP のクリーンアップ(CDP Cleanup セクションを参照)

ステップ2:記事を公開

${BUN_X} ${SKILL_DIR}/scripts/x-article.ts article.md
${BUN_X} ${SKILL_DIR}/scripts/x-article.ts article.md --cover ./cover.jpg

パラメーター:

パラメーター説明
<markdown>Markdown ファイル(位置引数)
--cover <path>カバー画像
--title <text>タイトルを上書き

フロントマター:YAML フロントマターでは、title / 标题、cover_image / 封面 / 配图 に対応しています。

タイトルの決定方法(X Articles の場合):

# 优先读 frontmatter 的 `标题` 属性,为空则 fallback 到文件名
TITLE=$(obsidian property:read name="标题" path="$NOTE_PATH" 2>/dev/null | tr -d '[:space:]')
if [ -z "$TITLE" ]; then
  TITLE=$(basename "$NOTE_PATH" .md)
fi
# 传入脚本
${BUN_X} ${SKILL_DIR}/scripts/x-article.ts "$NOTE_PATH" --title "$TITLE"

注:スクリプトは記事を入力した状態でブラウザーを開きます。ユーザーが確認して手動で公開します。

コードブロックのサポート

Markdown 内のコードブロックは自動的に抽出され、X Articles のエディターに挿入されます。すべての言語(JavaScript、Python、TypeScript、Rust、Go、Shell など)に対応しています。手動での操作は不要です。


トラブルシューティング

よくある問題:

  • Chrome のデバッグポートが準備できていない → まず CDP プロセスを必ずクリーンアップしてください(上記を参照)
  • macOS のアクセシビリティ権限エラー → システム設定で有効にしてください
  • コードブロックが挿入されない → 自動処理されます。コンソールでエラーを確認してください
  • 画像の一時パスが Vault の外にある → md-to-post.ts はデフォルトで画像をシステムの /tmp にダウンロードします。Vault 内に制限するフックによってブロックされる場合があります。解決策:画像を Vault 内に保存するため、常に --output-dir ".temp/x-post" を指定してください:
    bun ${SKILL_DIR}/scripts/md-to-post.ts "Articles/my-post.md" --output-dir ".temp/x-post"
    

詳しいトラブルシューティングについては、references/troubleshooting.md を参照してください。


参考資料

  • references/obsidian-integration.md - Obsidian ファイルの検出と統合
  • references/obsidian-conversion.md - Obsidian の構文を標準 Markdown に変換
  • references/regular-posts.md - 通常の投稿のワークフローとトラブルシューティング
  • references/articles.md - X Articles の詳細ガイド
  • references/troubleshooting.md - よくある問題と解決策
  • references/browser-automation-lessons.md - ブラウザー自動化のパターンと学んだ教訓(CDP、DraftJS、バックグラウンドタブ)

拡張機能のサポート

EXTEND.md でカスタム設定を指定できます。以下のパスを優先順に確認します:

  • .libukai-skills/obsidian-to-x/EXTEND.md(プロジェクトディレクトリ)
  • $HOME/.libukai-skills/obsidian-to-x/EXTEND.md(ユーザーホーム)

EXTEND.md がサポートするもの:デフォルトの Chrome プロファイル

注意事項

  • 初回実行時は手動でのログインが必要です(セッションは保持されます)
  • すべてのスクリプトはブラウザーにコンテンツを入力し、手動で確認できるよう開いたままにします
  • (--submit フラグを使用する場合を除き)ユーザーが手動で閉じるまでブラウザーは開いたままです
  • クロスプラットフォーム:macOS、Linux、Windows

コメント