⌚

Claude Codeの長時間処理をApple Watchに通知する(Pushcut × Hooks)

に公開

はじめに

Claude Codeで cc-sddなどを活用していると、処理が数分〜数十分かかることがあります。

その間、別の作業をしていると「いつ終わったかわからない」という問題が発生します。ターミナルをずっと見ているわけにもいきません。

Claude CodeのHooksで完了時に通知音を鳴らす設定はよく紹介されています。しかし長時間処理の場合、イヤホンやヘッドホンをしていなかったり、そもそもPCから離れていたりすると気づけません。

そこで、一定時間以上かかった処理が完了したらApple Watch(スマートウォッチ)に通知を送る仕組みを作りました。

Apple Watchの通知画面
Apple Watchの通知例

この記事で実現できること

  • Claude Codeの処理が指定秒数(例:5分)以上かかった場合のみ通知
  • Pushcutを使ってiPhone・Apple Watchにプッシュ通知
  • 複数プロジェクト・複数ウィンドウで同時に使っても競合しない

想定読者

  • Claude Codeを日常的に使っている
  • 長時間の処理中、別作業をしたい
  • Apple WatchやiPhoneで完了通知を受け取りたい

必要なもの

  • Claude Code
  • iPhone + Pushcutアプリ(無料版でOK)
  • Apple Watch(任意、iPhoneだけでも可)
  • jqコマンド(JSONパース用)

Pushcutとは

PushcutはiOS向けの自動化アプリです。Webhook経由でiPhone・Apple Watchにプッシュ通知を送ることができます。

https://www.pushcut.io/

本記事では、Webhookを叩いて通知を受け取る機能のみを使用します。

Pushcutの設定

1. アプリのインストール

App Storeから「Pushcut」をインストールします。

https://apps.apple.com/app/pushcut-shortcuts-automation/id1450936447

2. 通知の作成

  1. Pushcutアプリを開く
  2. 「Notifications」タブで「Add Notification」をタップ
  3. 名前を入力(例:ClaudeCode)
  4. 通知タイトルと通知内容を入力
  5. 保存

Pushcutの設定画面
iPhone側のPushcut設定例

3. Webhook URLの取得

  1. 作成した通知をタップ
  2. 「URL Triggers & Webhooks」セクションの「Copy URL」でURLをコピー

以下のような形式のURLが取得できます:

https://api.pushcut.io/xxxxxxxx/notifications/ClaudeCode
                                              ^^^^^^^^^^
                                              ここがNotificationのname

URLの末尾はPushcutで作成したNotificationの名前になります。手順2で ClaudeCode という名前で作成した場合、URLの末尾も ClaudeCode になります。

このURLにPOSTリクエストを送ると、iPhoneとApple Watchに通知が届きます。

Claude Code Hooksの設定

Claude CodeのHooks機能を使って、処理の開始時刻を記録し、完了時に経過時間をチェックします。

ディレクトリの作成

mkdir -p ~/.claude/hooks

1. 開始時刻を記録するスクリプト

~/.claude/hooks/record-start.sh

#!/bin/bash

input=$(cat)
session_id=$(echo "$input" | jq -r '.session_id')

if [ -n "$session_id" ] && [ "$session_id" != "null" ]; then
  echo $(date +%s) > "/tmp/claude_start_${session_id}"
fi

2. 完了時に通知するスクリプト

~/.claude/hooks/notify-on-stop.sh

#!/bin/bash

# ================================
# ここを変更してください(秒数)
# ================================
THRESHOLD_SECONDS=300  # 5分

# ================================

input=$(cat)
session_id=$(echo "$input" | jq -r '.session_id')

if [ -z "$session_id" ] || [ "$session_id" = "null" ]; then
  exit 0
fi

start_file="/tmp/claude_start_${session_id}"
start=$(cat "$start_file" 2>/dev/null || echo 0)
now=$(date +%s)
duration=$((now - start))

if [ $duration -ge $THRESHOLD_SECONDS ]; then
  curl -X POST "https://api.pushcut.io/xxxxxxxx/notifications/ClaudeCode"
fi

rm -f "$start_file"

3. 実行権限の付与

chmod +x ~/.claude/hooks/record-start.sh
chmod +x ~/.claude/hooks/notify-on-stop.sh

4. settings.jsonの設定

以下のいずれかのファイルに設定を追加します:

ファイル 適用範囲
~/.claude/settings.json 全プロジェクト共通
プロジェクト/.claude/settings.json 特定のプロジェクト(チームで共有可)
プロジェクト/.claude/settings.local.json 特定のプロジェクト(個人用、gitignore推奨)
{
  "hooks": {
    "UserPromptSubmit": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/record-start.sh"
          }
        ]
      }
    ],
    "Stop": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "bash ~/.claude/hooks/notify-on-stop.sh"
          }
        ]
      }
    ]
  }
}

既存の設定がある場合は、hooksの中に追記してください。

閾値の目安

THRESHOLD_SECONDS の設定値を変更することで、通知を受け取る基準を調整できます。

設定値 時間
60 1分
180 3分
300 5分
600 10分

短すぎると通知が頻繁になり、長すぎると通知の意味がなくなります。自分のワークフローに合わせて調整してください。

なぜsession_idを使うのか

単純にプロジェクトパスだけで管理すると、以下のケースで問題が発生します:

  • 複数プロジェクトを同時に開いている → 後から開始した方の時刻で上書きされる
  • 同じプロジェクトを複数ウィンドウで開いている → 同様に上書きされる

session_idはセッションごとに一意なので、これらの問題を回避できます。

まとめ

Claude CodeのHooks機能とPushcutを組み合わせることで、長時間処理の完了通知をApple Watch(スマートウォッチ)で受け取れるようになりました。

長時間処理の完了通知は、以下のようなケースでも活用できます:

  • 大規模なリファクタリング
  • テストの一括実行
  • ドキュメントの自動生成
  • 複数ファイルにまたがる修正

Claude Codeに任せている間、安心して別の作業やコーヒーブレイクができるようになります。ぜひ試してみてください。

参考

Discussion