WezTermでClaude Codeのタスク完了をSlackに通知してみた

WezTermでClaude Codeのタスク完了をSlackに通知してみた

Clock Icon2025.06.19

Claude Codeを使い始めました。 いつもターミナルに住んでいる身としては、 CLIで使えるので色々と他と連動しやすそうです。

Claude CodeはiTerm2で利用している場合は タスク完了時にベルを鳴らしてくれる機能があるようなのですが、 私が愛用するWezTermは対応していなさそうです(やったらできるのかもですが)。

対応していないなら力技で対応だ!!

ということで、WezTermの機能を使ってなんとかタスク完了を取得して通知したいと思います。 具体的には、WezTermでは各ペインに表示されている文字列を取得することができるので、 これを正規表現とかで引っ掛けるような方法をとりたいと思います。 そしてせっかくなので通知も音を鳴らすだけではなく、 Slack通知させてみようと思います。

コード

早速コードです。 wezterm.luaconfig.keysに下記のキーバインドを追加します。

config.keys = {
    -- 他のキーバインド
    {
        key = "x",
        mods = "CMD|CTRL|SHIFT",
        action = wezterm.action_callback(function(_, pane)
            -- 監視対象の文字列
            local trigger_text = " tokens · esc to interrupt)"
            -- 取得行数
            local trriget_line_n = 10

            -- 定期的に画面内容をチェック
            local function check_output()
                local screen_text = pane:get_lines_as_text(trriget_line_n)

                if not string.find(screen_text, trigger_text) then
                    wezterm.run_child_process({
                        'curl', '-X', 'POST', '-H', 'Content-type: application/json', '--data',
                        '{"text":"<@U1234567890> [Claude Code] 確認!"}',
                        'https://hooks.slack.com/services/ABC123456/DEF12345678/hogehoge'
                    })

                    return -- 監視終了
                end

                -- 1秒後に再チェック
                wezterm.time.call_after(1, check_output)
            end

            check_output()
        end),
    },

内容としてはこんな感じです。

  • 1秒ごとに
    • ターゲットとなるペインの最後10行を取得
    • tokens · esc to interrupt)と言う文字列が含まれているかチェック
    • 含まれなかったら処理が終わったと判断して通知
      • 通知したらループを抜けて終了
    • 含まれている場合は処理継続中と判断して次のループに

あるペインが有効な時にバインドしたキー(上記例だとCMD+CTRL+SHIFT+x)が押されたら監視が開始されるイメージです。

設定は以上です。 設定ファイルを保存したら設定が有効になるはずです。

動作確認

では早速確認していきます。

Claude Codeで何かしらの命令をします。
Pasted image 20250619114037.png
esc to interruptという表示が出ていることを確認した上で設定したキーバインドを押します。 これで監視が有効になります。 (監視が有効なのかを確認する術がないので、何かしら欲しいかも)

しばらくするとClaude Codeでの処理が終わります。
Pasted image 20250619114319.png
ユーザからの入力待ちの状態なので esc to interrupt の表示はありません。 これでイベントがトリガーされて通知処理が飛ぶはずです。

Slackの当該チャンネルと見るとちゃんと通知が来ています。
Pasted image 20250619115208.png
通知内容もキャプチャした文字列からある程度カスタマイズしても良いかもしれません。

まとめ

WezTermをカスタマイズさせてClaude Codeのタスク終了を検知してSlackに通知する仕組みを作ってみました。 Slack通知にすることもできたので、 Slack以外の通知気にしたくないマンも満足です。

多くの方が気づいていると思いますが、 この方法はClaude Codeに限らずあらゆるアプリの出力に応用可能ですし、 トリガーされたら任意のプロセスを実行可能です。 なので非常に魔改造しがいがある機能ではありますが、 あんまりこれを色々やるととてもカオスなことになりそうなのでこれ以上は自重しようと思います。

これでClaude Codeの終了を待ってる間にターミナルのカスタマイズが捗りますね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.