link-to-im について
link-to-imは、対応するメッセージングチャネルとエージェント実行環境のブリッジを設定・運用するスキルです。設定手順に加え、起動、停止、状態確認、診断の操作を案内します。
主な機能
- 01Telegram、Discord、Feishu、QQ、Weixinの設定
- 02Claude、Codex、Geminiまたは自動実行環境の指定
- 03ブリッジの起動・停止・状態確認
- 04ログの確認と一般的な問題の診断
- 05設定変更と認証情報の検証
活用シーン
- 01メッセージングチャネルをエージェント実行環境に接続
- 02応答しないブリッジの状態を調査
- 03チャネル認証情報や実行環境の設定変更
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ d-wwei/ agents-to-im --skill link-to-imインストール後、Claude Code で/link-to-imを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
.gitignoreCLAUDE.mdconfig.env.exampleLICENSEpackage-lock.jsonpackage.jsonevals/evals.jsonpackages/agent-to-im-core/.gitignoreLICENSEpackage-lock.jsonpackage.jsonREADME.mdREADME.zh-CN.mdpackages/agent-to-im-core/docs/development.mddevelopment.zh-CN.mdfeishu-v2-streaming-cards.mdpackages/agent-to-im-core/src/__tests__/unit/bridge-channel-router.test.tsbridge-delivery-layer.test.tsbridge-manager.test.tsbridge-permission-broker.test.tsbridge-qq.test.tspackages/agent-to-im-core/src/lib/bridge/ARCHITECTURE.mdpackages/agent-to-im-core/src/lib/bridge/adapters/discord-adapter.tsfeishu-adapter.tsindex.tsqq-adapter.tsqq-api.tstelegram-adapter.tstelegram-media.tstelegram-utils.ts詳細
Link-to-IM Bridge スキル
Link-to-IM ブリッジを管理します。
ユーザーデータは ~/.link-to-im/ に保存されます。
前文 — 更新チェック
サブコマンドを処理する前に、セッションごとに一度だけ、次のサイレントチェックを実行します。
_UPD=$("SKILL_DIR/node_modules/.bin/update-kit" quick-check --cwd "SKILL_DIR" --json 2>/dev/null || true)
[ -n "$_UPD" ] && echo "$_UPD" || true
(以下で解決した実際のスキルディレクトリパスに SKILL_DIR を置き換えてください。)
- 出力に
"status":"upgrade_available"が含まれる場合:ユーザーに「Link-to-IM v{candidateVersion} が利用可能です(現在 v{currentVersion})。今すぐアップグレードしますか?」と伝え、"SKILL_DIR/node_modules/.bin/update-kit" apply --cwd "SKILL_DIR" --decision update_onceの実行を提案します。 - 出力に
"status":"just_upgraded"が含まれる場合:ユーザーに「最新バージョンにアップグレードしました!」と伝えます。 - それ以外の場合は、何も伝えずに続行します。
まず、この SKILL.md ファイルを見つけて、スキルディレクトリを特定します。
- Glob でパターン
**/skills/**/link-to-im/SKILL.mdを使用してパスを見つけ、そこからスキルのルートディレクトリを特定します。 - 以降のすべてのファイル参照で使用するため、そのパスを SKILL_DIR として記憶しておきます。
コマンドの解析
$ARGUMENTS からユーザーの意図を解析し、次のいずれかのサブコマンドに分類します。
| ユーザーの入力例 | サブコマンド |
|---|---|
setup、configure、配置、我想在飞书上用 Link、帮我连接 Telegram、帮我接微信 | setup |
start、start bridge、启动、启动桥接 | start |
stop、stop bridge、停止、停止桥接 | stop |
status、bridge status、状态、运行状态、怎么看桥接的运行状态 | status |
logs、logs 200、查看日志、查看日志 200 | logs |
reconfigure、修改配置、帮我改一下 token、换个 bot | reconfigure |
doctor、diagnose、诊断、挂了、没反应了、bot 没反应、出问题了 | doctor |
使い分け:status と doctor — ブリッジが実行中かどうかを情報として確認したい場合は status を使用します。ユーザーが問題を報告している、または何かが壊れていると考えている場合は doctor を使用します。迷った場合や、ユーザーが症状(例:「応答がありません」「停止しました」)を説明している場合は、doctor を優先します。
logs の省略可能な数値引数を抽出します(デフォルトは 50)。
ユーザーにプラットフォームの認証情報を尋ねる前に、SKILL_DIR/references/setup-guides.md を内部で読み、各認証情報の取得場所を確認してください。ガイド全体を最初からユーザーに表示してはいけません。次に必要な手順だけを伝えてください(例:「https://open.feishu.cn → アプリ → 認証情報に移動し、App ID を確認してください」)。方法が分からないと言われた場合は、ガイドの該当セクションを表示してください。
実行環境の検出
サブコマンドを実行する前に、実行環境を検出します。
- 対話型スキルホスト —
AskUserQuestionツールが利用可能です。対話型セットアップウィザードで使用します。 - 非対話型ホスト —
AskUserQuestionは利用できません。非対話型の案内に切り替え、手順を説明し、SKILL_DIR/config.env.exampleを表示して、ユーザーに~/.link-to-im/config.envを手動で作成するよう依頼します。
利用可能なツール一覧に AskUserQuestion があるかどうかを確認して判定できます。
設定の確認(start、stop、status、logs、reconfigure、doctor に適用)
setup 以外のサブコマンドを実行する前に、~/.link-to-im/config.env が存在するか確認します。
- 存在しない場合:
- 対話型ホストの場合:ユーザーに「設定が見つかりません」と伝え、AskUserQuestion を使用して
setupウィザードを自動的に開始します。 - 非対話型ホストの場合:ユーザーに「設定が見つかりません。次の例を参考に
~/.link-to-im/config.envを作成してください:」と伝え、SKILL_DIR/config.env.exampleの内容を表示して終了します。デーモンの起動を試みてはいけません。config.env がないと、起動時にプロセスがクラッシュし、古い PID ファイルが残って以降の起動を妨げるためです。
- 対話型ホストの場合:ユーザーに「設定が見つかりません」と伝え、AskUserQuestion を使用して
- 存在する場合: 指定されたサブコマンドを続行します。
サブコマンド
setup
対話型のセットアップウィザードを実行します。このサブコマンドには AskUserQuestion が必要です。利用できない場合は、代わりに SKILL_DIR/config.env.example の内容をフィールドごとの説明とともに表示し、ユーザーに設定ファイルを手動で作成するよう案内します。
AskUserQuestion が利用可能な場合は、入力を一度に1項目ずつ収集します。各回答の後、次の質問に進む前に、ユーザーに入力値を確認します(秘密情報は末尾4文字だけを表示します)。
Step 1 — チャネルを選択する
有効にするチャネル(telegram、discord、feishu、qq、weixin)を尋ねます。カンマ区切りの入力を受け付けます。それぞれについて簡潔に説明します。
- telegram — 個人利用に最適です。ストリーミングプレビュー、インライン権限ボタンに対応しています。
- discord — チーム利用に適しています。サーバー/チャンネル/ユーザーレベルのアクセス制御に対応しています。
- feishu(Lark)— Feishu/Lark チーム向けです。ストリーミングカード、ツールの進行状況、インライン権限ボタンに対応しています。
- qq — QQ の C2C プライベートチャットのみです。インライン権限ボタンとストリーミングプレビューには対応していません。権限設定にはテキストの
/perm ...コマンドを使用します。 - weixin — WeChat の QR ログインです。連携できるアカウントは1つのみで、新しいアカウントでログインすると以前のアカウントが置き換えられます。インライン権限ボタンとストリーミングプレビューには対応していません。権限設定にはテキストの
/perm ...コマンドまたは1/2/3の簡易返信を使用します。音声メッセージには WeChat 独自の音声テキスト変換結果のみを使用します。ブリッジでは音声データを直接文字起こししません。
Step 2 — チャネルごとにトークンを収集する
有効にした各チャネルについて、認証情報を一度に1項目ずつ収集します。各値の取得場所を1文でユーザーに伝えます。ユーザーからヘルプを求められた場合、または取得方法が分からないと言われた場合に限り、ガイドの該当セクション全体(SKILL_DIR/references/setup-guides.md から)を表示します。
- Telegram:ボットトークン → 確認(マスク表示) → チャット ID(取得方法はガイドを参照) → 確認 → 許可するユーザー ID(任意)。重要: チャット ID または許可するユーザー ID のいずれかを設定してください。どちらも設定しないと、ボットはすべてのメッセージを拒否します。
- Discord:ボットトークン → 確認(マスク表示) → 許可するユーザー ID → 許可するチャンネル ID(任意) → 許可するギルド ID(任意)。重要: 許可するユーザー ID または許可するチャンネル ID のいずれかを設定してください。どちらも設定しないと、ボットはすべてのメッセージを拒否します(デフォルトで拒否)。
- Feishu:アプリ ID → 確認 → アプリシークレット → 確認(マスク表示) → ドメイン(任意) → 許可するユーザー ID(任意)。認証情報の収集後、ユーザーが完了する必要のある2段階のセットアップを説明します。
- フェーズ 1(ブリッジの起動前):(A)権限を一括追加、(B)ボット機能を有効化、(C)初回バージョンを公開して管理者の承認を受ける。これにより、権限とボットが有効になります。
- フェーズ 2(ブリッジの起動が必要):(D)
/agent-to-im startを実行、(E)長時間接続モードでイベント(im.message.receive_v1)とコールバック(card.action.trigger)を設定、(F)2回目のバージョンを公開して管理者の承認を受ける。 - 2段階に分かれる理由: Feishu はイベントサブスクリプションの保存時に WebSocket 接続を検証します。ブリッジが起動していないと、保存に失敗します。ブリッジの接続には、公開済みの権限が必要です。
- 簡潔なチェックリストにとどめ、求められた場合にのみ完全なガイドを提示します。
- QQ:必須項目を2つ収集してから、任意項目を確認します。
- QQ アプリ ID(必須) → 確認
- QQ アプリシークレット(必須) → 確認(マスク表示)
- 次の場所でこれら2つの値を確認できることをユーザーに伝えます:https://q.qq.com/qqbot/openclaw
- 許可するユーザー OpenID(任意、Enter キーでスキップ) — これは QQ 番号ではなく、
user_openidであることを伝えます。まだ OpenID を取得していない場合は、空欄のままでかまいません。 - 画像を有効化(任意、デフォルトは true、Enter キーでスキップ) — 使用するプロバイダーが画像入力に対応していない場合は、false に設定します。
- 最大画像サイズ(MB)(任意、デフォルトは 20、Enter キーでスキップ)
- QQ の初回バージョンでは、C2C のプライベートチャットによるサンドボックスアクセスのみがサポートされることをユーザーに伝えます。グループやチャンネルには対応せず、インラインボタンもストリーミングプレビューも利用できません。
- Weixin:固定トークンを尋ねないでください。代わりに、次の手順を行います。
- このチャンネルでは、認証情報を手動で入力するのではなく、QR コードでログインすることをユーザーに伝えます。
cd SKILL_DIR && npm run weixin:loginを実行します。- ヘルパーは
~/.agent-to-im/runtime/weixin-login.htmlを書き込み、ローカルブラウザーで自動的に開こうとします。 - 自動で開けない場合は、ユーザーにその HTML ファイルを手動で開き、WeChat で QR コードをスキャンするよう伝えます。
- ヘルパーから成功の報告があるまで待ち、リンク済みアカウントがローカルに保存されたことを確認します。
- リンク済みの Weixin アカウントは
~/.agent-to-im/data/weixin-accounts.jsonに保存されることを簡潔に説明します。ヘルパーを再度実行すると、以前にリンクしたアカウントは置き換えられます。 CTI_WEIXIN_MEDIA_ENABLEDは、受信した画像、ファイル、動画のダウンロードのみを制御することを簡潔に説明します。音声メッセージについて、ブリッジが受け付けるのは WeChat の組み込み音声テキスト変換が返すテキストのみです。WeChat が文字起こし結果を提供しない場合、ブリッジは生音声をダウンロードして文字起こしするのではなく、エラーを返します。
ステップ 3 — 一般設定
ランタイム、デフォルトの作業ディレクトリ、モデル、モードを尋ねます。
- ランタイム:
claude、codex、gemini、autoclaude— Claude CLI と Claude Agent SDK を使用します。codex— OpenAI Codex SDK を使用します。gemini— Gemini CLI を使用します。auto— まず Gemini を試し、次に Claude を試します。必要に応じて Codex にフォールバックします。
- 作業ディレクトリ:デフォルトは
$CWD - モデル(任意):空欄のままにすると、ランタイム独自のデフォルトモデルを継承します。別のモデルを指定する場合は、モデル名を入力してもらいます。利用可能なモデルは随時変わるため、モデル名をハードコードしたり、特定のモデル名を提案したりしないでください。
- モード:
code(デフォルト)、plan、ask
ステップ 4 — 設定の書き込みと検証
- すべての設定を記載した最終確認用の表を表示します(シークレットは末尾4文字のみ表示します)。
- 書き込みの前にユーザーに確認します。
- Bash を使用してディレクトリ構成を作成します:
mkdir -p ~/.link-to-im/{data,logs,runtime,data/messages} - Write を使用して、すべての設定を KEY=VALUE 形式で
~/.link-to-im/config.envに作成します。 - Bash を使用してアクセス権を設定します:
chmod 600 ~/.link-to-im/config.env - トークンを検証します。各プラットフォームの正確なコマンドと期待される応答については、
SKILL_DIR/references/token-validation.mdを読みます。これにより、デーモンを起動する前に、入力ミスや認証情報の誤りを確認できます。Weixin の場合、QR コードでのログインに成功していれば検証済みとみなします。 - 結果を表にまとめて報告します。検証に失敗した項目がある場合は、考えられる原因と解決方法を説明します。
- 成功した場合は、ユーザーに「セットアップが完了しました!ブリッジを起動するには
/link-to-im startを実行してください。」と伝えます。
start
事前確認: ~/.link-to-im/config.env が存在することを確認します(上記の「設定ファイルの確認」を参照)。このファイルがないと、デーモンはすぐにクラッシュし、古い PID ファイルが残ります。
実行:bash "SKILL_DIR/scripts/daemon.sh" start
出力をユーザーに表示します。失敗した場合は、ユーザーに以下を伝えます。
/link-to-im doctorを実行して診断します。/link-to-im logsで最近のログを確認します。
stop
実行:bash "SKILL_DIR/scripts/daemon.sh" stop
status
実行:bash "SKILL_DIR/scripts/daemon.sh" status
logs
引数から省略可能な行数 N を取得します(デフォルトは 50)。
実行:bash "SKILL_DIR/scripts/daemon.sh" logs N
reconfigure
~/.link-to-im/config.envから現在の設定を読み込みます。- 現在の設定をわかりやすい表形式で表示し、すべてのシークレットをマスクします(末尾4文字のみ表示)。
- AskUserQuestion を使用して、変更したい項目をユーザーに尋ねます。
- 新しい値を収集する際は、値の確認場所をユーザーに伝えます。
SKILL_DIR/references/setup-guides.mdのガイド全文を表示するのは、ユーザーから求められた場合のみです。 - 設定ファイルをアトミックに更新します(一時ファイルに書き込み、名前を変更します)。
- 変更したトークンを再検証します。
- ユーザーに「変更を適用するには
/link-to-im stopを実行してから/link-to-im startを実行してください。」と伝えます。
ユーザーが reconfigure 中に Weixin アカウントの切り替えを希望する場合は、再度 cd SKILL_DIR && npm run weixin:login を実行します。スキャンに成功するたびに、以前リンクされていたローカルアカウントが置き換わります。
doctor
実行:bash "SKILL_DIR/scripts/doctor.sh"
結果を表示し、失敗があれば解決方法を提案します。よくある解決方法:
- SDK cli.js が見つからない →
cd SKILL_DIR && npm install dist/daemon.mjsが古い →cd SKILL_DIR && npm run build- 設定ファイルが見つからない →
setupを実行 - Weixin アカウントが見つからない/期限切れ →
cd SKILL_DIR && npm run weixin:login - Weixin の音声メッセージで音声テキスト変換機能が見つからないと表示される → WeChat の音声文字起こし機能を有効にして再送信します。ブリッジ自体は音声データを文字起こししません。
より複雑な問題(メッセージが受信されない、権限のタイムアウト、メモリ使用量が多い、古い PID ファイル)については、詳しい診断手順を確認するために SKILL_DIR/references/troubleshooting.md を読みます。
自己修復プロトコル(UDD)
doctor で未解決の問題が見つかった場合、またはブリッジの動作中にエラーが発生した場合は、UDD の自己修復フローを使用します。UDD コマンドは必ずサブエージェントで実行してください。メインエージェントのコンテキストでは実行しないでください。
-
上流ですでに修正されているか確認します。
cd "SKILL_DIR" && "SKILL_DIR/node_modules/.bin/udd" check --jsonupstreamFixMatchが中程度または高い確度で存在する場合は、まずアップデートを推奨します。 -
エラーを分析します。
cd "SKILL_DIR" && "SKILL_DIR/node_modules/.bin/udd" analyze --error "<error message>" --jsondiagnosis.kindと推奨される対処方法を報告します。 -
ユーザーが修復を承認した場合:
cd "SKILL_DIR" && "SKILL_DIR/node_modules/.bin/udd" heal --error "<error message>" --decision repair_once --jsonこれは隔離された Git ワークツリー内で実行されます。検証に合格したら、修正内容をレビューできます。
-
修復に失敗した場合は、イシューの下書きを作成します。
cd "SKILL_DIR" && "SKILL_DIR/node_modules/.bin/udd" issue-draft --error "<error message>" --out ./issue-draft.md提出する前に、下書きをユーザーに提示してレビューしてもらいます。
UDD のルール:SKILL_DIR の外にあるファイルは変更しないでください。main に直接コミットしないでください。udd.config.json がない場合は、ユーザーに知らせてください。.env と protectedPaths に記載されたパスを尊重してください。
Feishu のアップグレードに関する注意: ユーザーがこのスキルの以前のバージョンからアップグレードし、Feishu で権限エラーが発生する場合(ストリーミングカードが機能しない、入力中インジケーターが動作しない、権限ボタンが反応しないなど)、根本原因はほぼ間違いなく Feishu バックエンドの権限またはコールバックの不足です。ユーザーには SKILL_DIR/references/setup-guides.md の「以前のバージョンからのアップグレード」セクションを参照するよう案内してください。新しいスコープ(cardkit:card:write、cardkit:card:read、im:message:update、im:message.reactions:read、im:message.reactions:write_only)を追加し、card.action.trigger コールバックを追加して、アプリを再公開する必要があります。コールバックの追加にはアクティブな WebSocket 接続が必要なため(ブリッジの実行中に限られます)、アップグレードには 2 回の公開サイクルが必要です。
注意事項
- 出力内のシークレットは必ずマスキングし(末尾 4 文字のみ表示)、ユーザーはバグレポートでターミナルの出力を共有することが多いため、トークンの露出はセキュリティインシデントにつながります。
- デーモンを起動する前に、必ず config.env の有無を確認してください。config.env がないと、プロセスは起動時にクラッシュし、古い PID ファイルが残って以降の起動を妨げるため、手動でのクリーンアップが必要になります。
- デーモンは、プラットフォームのスーパーバイザー(macOS では launchd、Linux では setsid、Windows では WinSW/NSSM)によって管理される Node.js のバックグラウンドプロセスとして実行されます。
- 設定は
~/.link-to-im/config.envに保持され、セッションをまたいで維持されます。