Wendov1.0 · iOS & Android
日本語

ガイド

スマホで受け取る Claude Code の通知と承認

Claude Code にはフックがあります。フックとは、あなたのコマンドを実行してくれるポイントのことです。これだけで、許可を求めてきたときや作業が終わったときの通知を作れますし、スマホから答えることもできます。ここでは、その仕組みと、Wendo がどう使っているかを説明します。

Claude Code のフックとは

フックは、何かが起きたときに Claude Code が実行するコマンドです。セッションの開始、プロンプトの送信、許可が必要になったとき、返信の完了などがそのタイミングです。~/.claude/settings.json に、イベントごとにキーを分けて、それぞれコマンドを指定して宣言します。

{
  "hooks": {
    "Stop": [
      { "hooks": [{ "type": "command", "command": "~/.wendo/wendo-hook.sh" }] }
    ]
  }
}

Claude Code はそのコマンドを実行し、標準入力にイベントのデータを JSON で渡します。イベント名、作業ディレクトリ、セッション ID、場合によっては使おうとしているツールが含まれます。コマンドはそれを好きなように扱えます。一部のイベントでは標準出力に応答を書き込むこともでき、Claude Code はそれで判断を知ります。

Wendo のフックが登録するイベント

インストーラーは、同じスクリプトを 6 つのイベントに追加します。

  • PermissionRequest: Claude Code があなたの許可を求めようとしています。
  • Notification: 対応が必要な Claude Code からの通知。
  • Stop: 返信を終えました。
  • UserPromptSubmit: あなたがプロンプトを送ったので、作業中です。
  • SessionStart と SessionEnd: セッションの開始と終了。

各イベントは、パソコンの ~/.wendo/events.jsonl に 1 行として保存されます。アプリはそのファイルをあなたの鍵で SSH 経由で読み取るので、中継サーバーもアカウントもありません。受信トレイに表示されるものは、ここから来ています。

インストールはコマンド 1 つです。

curl -fsSL https://wendo.lirafy.dev/install.sh | sh

settings.json に触れる前に settings.json.bak-wendo としてコピーを保存し、何度実行してもエントリが重複しません。すでにあるフックには手を加えません。オプションと手動セットアップは通知と承認のページに、環境全体を作るための広い手順はスマホから Claude Code を使う方法にあります。

承認の仕組み

PermissionRequest は、フックが居残って待つ唯一のイベントです。Claude Code が許可を求めると、スクリプトはそのリクエストを保留として記録し、アプリの受信トレイに承認と拒否のボタンがついた行が表示されます。どちらかをタップすると、アプリは回答をパソコン上のファイルに書き込み、フックがそれを拾って、判断を Claude Code に返します。

待ち時間は 90 秒です。それまでに答えなければ、フックは何も出力せず、Claude Code は Wendo がいないかのように、ターミナルで通常のプロンプトを表示します。ここは重要な点です。スマホの電池が切れたり電波が切れたりしても、何もブロックされたままにならず、いつもどおりのやり方に戻るだけです。

スマホより先にターミナルで答えた場合も、ローカルで解決済みとして記録されます。

フックのコマンドの前に付ける環境変数で、いくつか調整できます。

  • WENDO_APPROVAL_TIMEOUT: 待つ秒数。settings.json のフックの timeout(インストール時の設定では 120)はこれより大きくする必要があります。
  • WENDO_BLOCKING=0: 通知だけを行い、応答を待ちません。
  • WENDO_HOST: hostname -s と違う場合の、アプリがそのパソコンを知っている名前。

Claude の質問(AskUserQuestion)とプランの承認(ExitPlanMode)は待機しません。これらは「はい」「いいえ」ではなく選択を求めるものなので、チャットビューから答えます。

アプリを閉じているときの通知: ntfy

Wendo を開いている間は、アプリが数秒ごとに受信トレイを読み込みます。アプリを閉じているときは、何かが通知をスマホに届ける必要があります。その役目を担うのが ntfy です。HTTP リクエストで送信できる、シンプルなプッシュ通知サービスです。

  1. settings.json のフックのコマンドの前に NTFY_TOPIC を付けます。
NTFY_TOPIC=a-long-random-topic ~/.wendo/wendo-hook.sh
  1. スマホに ntfy アプリをインストールし、同じトピックを購読します。
  2. Wendo にも、設定 › エージェント › 通知 でそのトピックを入力します。

誰にも推測されないトピックを作るには、次のコマンドが使えます。

openssl rand -hex 16

トピックはパスワードの役目を果たします。公開の ntfy サーバーでは、トピック名を知っていれば誰でも、そこに送られた内容を読め、自分のメッセージも送れます。claude-john のような名前は使わないでください。通知にはプロジェクト名と、メッセージやコマンドの抜粋が含まれます。判断には十分ですが、他人に読まれたいものではありません。

公開サーバーに頼りたくない場合は、NTFY_URL でフックの送信先を自分の ntfy サーバーにできます。デフォルトは https://ntfy.sh です。通知をタップすると、エージェントが動いている tmux、zellij、herdr のペインが開きます。ただし、そのいずれかの中で動かしている場合に限ります(tmux のページを参照)。

Android では、少なくとも 15 分ごとにバックグラウンドでも確認します。ntfy に送られるのは、許可、通知、タスク完了のアラートだけです。セッションの開始や終了、すべてのプロンプトについては、フックはプッシュしません。

制限

  • 今のところ Claude Code のみ。ほかのエージェントにはフックが登録されません。
  • パソコンに jq が必要です。curl が必要なのは ntfy を使う場合だけです。
  • マルチプレクサを使っていないと、アプリは Claude がどのペインにいるか分からず、そこへ直接移動できません。
  • 無料プランでは、受信トレイからのお試し承認が 5 回まで使えます。Pro なら制限はありません。
  • Wendo はまだストアにはありません。App Store と Google Play で近日公開予定です。