🔔

[WezTerm]ClaudeCodeHooksからの通知クリック時に適切なPaneにフォーカスする

に公開

はじめに

この記事 のWezTerm版です。
ClaudeCodeのNative通知だとWezTermのタブが切り替わらなかったので作成しました。
WezTerm使い始めて3時間で書いているのでもっと良い方法があれば教えてください。

前提

OS: Mac
Ternmial: WezTerm
terminal-notifierがインストールされている。

仕組み

  • WezTermで実行中のshellでは WEZTERM_PANE という環境変数が設定されている
  • hooksで上記環境変数から取得したpane_idを一時ファイルに保存しつつ、terminal-notifierで通知
  • terminal-notifierのexecuteオプションでフォーカス用のスクリプトを実行
  • wezterm cli activate-pane コマンドでpaneにフォーカス

コード

#!/bin/bash
# .claude/hooks/claude-notification.sh

# stdin から JSON を読み取り
INPUT=$(cat)

TYPE=$(echo "$INPUT" | jq -r '.notification_type // .hook_event_name // "unknown"')
CWD=$(echo "$INPUT" | jq -r '.cwd // ""')
MESSAGE=$(echo "$INPUT" | jq -r '.message // ""')

# idle_prompt は通知しない
if [ "$TYPE" = "idle_prompt" ]; then
  exit 0
fi

# 通知メッセージを設定(message フィールドがあればそれを使用)
if [ -n "$MESSAGE" ]; then
  MSG="$MESSAGE"
else
  case "$TYPE" in
    permission_prompt) MSG="許可が必要です" ;;
    tool_permission_prompt) MSG="ツール実行の許可が必要です" ;;
    user_question_prompt) MSG="質問があります" ;;
    Stop) MSG="タスクが完了しました" ;;
    *) MSG="通知" ;;
  esac
fi

# WezTerm ペインIDを一時ファイルに保存
# 環境変数 WEZTERM_PANE から現在のペインIDを取得
WEZTERM_INFO_FILE="/tmp/claude-wezterm-info"
if [ -n "$WEZTERM_PANE" ]; then
  echo "$WEZTERM_PANE" > "$WEZTERM_INFO_FILE"
else
  # デバッグ: 環境変数が設定されていない場合のログ
  echo "WEZTERM_PANE not set" > "$WEZTERM_INFO_FILE.log"
fi

# 通知を送信(クリック時に focus スクリプトを実行)
terminal-notifier \
  -title "Claude Code" \
  -subtitle "${CWD##*/}" \
  -message "$MSG" \
  -sound Hero \
  -group "claudecode" \
  -execute "$HOME/.claude/hooks/focus-pane.sh"

exit 0
#!/bin/bash
# ~/.claude/hooks/focus-pane.sh

WEZTERM_INFO_FILE="/tmp/claude-wezterm-info"

# WezTerm をアクティブに(バックグラウンドで並列実行)
osascript -e 'tell application "WezTerm" to activate' &

# ペインをアクティブ化(ファイルが存在する場合)
if [ -f "$WEZTERM_INFO_FILE" ]; then
  PANE_ID=$(<"$WEZTERM_INFO_FILE")
  [ -n "$PANE_ID" ] && wezterm cli activate-pane --pane-id "$PANE_ID" 2>/dev/null
fi

wait
{
  // 
  // その他の設定
  //
  "hooks": {
    "Notification": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/claude-notification.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "~/.claude/hooks/claude-notification.sh"
          }
        ]
      }
    ]
  }
}

以上!

Discussion