Wendov1.0 · iOS 與 Android
繁體中文

學習

手機上的 Claude Code 通知與核准

Claude Code 有 Hook:在特定時機執行你自己指令的掛鉤點。光是這樣,就足以做出一個在它要求權限或完成工作時通知你的機制,甚至可以直接從手機回覆它。這裡說明它的底層怎麼運作,以及 Wendo 如何使用它。

Claude Code 的 Hook 是什麼

Hook 是 Claude Code 在某件事發生時執行的指令:工作階段開始、你送出提示詞、它需要權限、它回覆完畢。你在 ~/.claude/settings.json 裡宣告它們,每個事件一個鍵,各自指向一個指令:

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

Claude Code 會執行那個指令,並從標準輸入傳入一份 JSON 文件,裡面是事件的資料:事件名稱、工作目錄、工作階段 ID,以及視情況而定它想使用的工具。指令可以拿這些資料做任何事。對某些事件,它還可以把回應寫到標準輸出,Claude Code 就是這樣得知決定的。

Wendo 的 Hook 註冊的事件

安裝程式把同一個腳本加到六個事件上:

  • PermissionRequest:Claude Code 即將向你要求權限。
  • Notification:Claude Code 發出需要注意的通知。
  • Stop:它已經回覆完畢。
  • UserPromptSubmit:你送出了提示詞,所以它正在工作。
  • SessionStart 和 SessionEnd:工作階段開始或結束。

每個事件都會在電腦的 ~/.wendo/events.jsonl 中存成一行。App 用你的金鑰透過 SSH 讀取這個檔案,所以沒有中間伺服器,也沒有帳號。你在收件匣看到的內容就來自那裡。

安裝只要一個指令:

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

在動 settings.json 之前,它會先存一份備份為 settings.json.bak-wendo,而且可以重複執行,不會產生重複的項目。你原本已有的 Hook 不會被動到。選項與手動設定在通知與核准頁面;要建立整套環境的完整流程,請見如何用手機操作 Claude Code。

核准如何運作

PermissionRequest 是 Hook 會停下來等待的唯一事件。Claude Code 要求權限時,腳本會把請求記為待處理,App 的收件匣會顯示那一列,附上允許或拒絕的按鈕。你按下其中一個後,App 會把答案放進電腦上的一個檔案,Hook 取得它,再把決定交還給 Claude Code。

等待時間是 90 秒。如果到時你還沒回覆,Hook 什麼都不輸出,Claude Code 會在終端機裡顯示它平常的提示,就像 Wendo 不存在一樣。這一點很重要:就算你的手機沒電或收不到訊號,也不會有東西卡住,只是退回它一向的運作方式。

如果你在手機之前先在終端機裡回覆,這也會被記錄下來,標示為在本機解決。

有幾個環境變數可以調整,設定在 Hook 指令前面:

  • WENDO_APPROVAL_TIMEOUT:等待的秒數。settings.json 中 Hook 的 timeout(安裝後的設定為 120)必須比它大。
  • WENDO_BLOCKING=0:只通知,不等待回覆。
  • WENDO_HOST:App 對這台電腦的稱呼,用於它和 hostname -s 不同時。

Claude 的問題(AskUserQuestion)和計畫核准(ExitPlanMode)不會阻塞。它們要的是選擇,而不是是或否,所以你在聊天檢視裡回答。

App 關閉時的通知:ntfy

Wendo 開啟時,App 每隔幾秒讀取一次收件匣。App 關閉時,就得有東西把通知推到你的手機,那就是 ntfy:一個簡單的推播通知服務,你用一個 HTTP 請求就能發佈訊息。

  1. 在 settings.json 的 Hook 指令前面加上 NTFY_TOPIC:
NTFY_TOPIC=a-long-random-topic ~/.wendo/wendo-hook.sh
  1. 在手機上安裝 ntfy App,並訂閱同一個 topic。
  2. 在 Wendo 裡也輸入這個 topic,位置在 設定 › 智慧代理 › 通知。

要產生一個沒人猜得到的 topic:

openssl rand -hex 16

topic 相當於密碼。在公開的 ntfy 伺服器上,任何知道 topic 名稱的人都能讀取發佈到那裡的內容,也能發佈自己的訊息,所以別用像 claude-john 這樣的名稱。通知裡包含專案名稱,以及訊息或指令的摘錄,足夠你做決定,卻不是你想讓陌生人讀到的東西。

如果你不想依賴公開伺服器,可以用 NTFY_URL 讓 Hook 指向你自己的 ntfy 伺服器。預設值是 https://ntfy.sh。只要代理跑在 tmux、zellij 或 herdr 其中之一裡,輕觸通知就會開啟代理所在的窗格(見 tmux 頁面)。

在 Android 上,還會至少每 15 分鐘在背景檢查一次。只有權限、通知和任務完成的通知會送到 ntfy;Hook 不會推送工作階段開始、工作階段結束,或每一次提示詞。

限制

  • 目前只支援 Claude Code。Hook 沒有註冊到其他代理。
  • 電腦上需要 jq。curl 只有 ntfy 才需要。
  • 沒有多工器的話,App 不知道 Claude 在哪個窗格,也就無法直接帶你過去。
  • 免費方案包含 5 次收件匣的試用核准;有了 Pro 就沒有上限。
  • Wendo 還沒上架:即將登上 App Store 與 Google Play。