WezTermでClaude Codeのタスク完了をSlackに通知してみた
Claude Codeを使い始めました。 いつもターミナルに住んでいる身としては、 CLIで使えるので色々と他と連動しやすそうです。
Claude CodeはiTerm2で利用している場合は タスク完了時にベルを鳴らしてくれる機能があるようなのですが、 私が愛用するWezTermは対応していなさそうです(やったらできるのかもですが)。
対応していないなら力技で対応だ!!
ということで、WezTermの機能を使ってなんとかタスク完了を取得して通知したいと思います。 具体的には、WezTermでは各ペインに表示されている文字列を取得することができるので、 これを正規表現とかで引っ掛けるような方法をとりたいと思います。 そしてせっかくなので通知も音を鳴らすだけではなく、 Slack通知させてみようと思います。
コード
早速コードです。 wezterm.lua
のconfig.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で何かしらの命令をします。
esc to interrupt
という表示が出ていることを確認した上で設定したキーバインドを押します。 これで監視が有効になります。 (監視が有効なのかを確認する術がないので、何かしら欲しいかも)
しばらくするとClaude Codeでの処理が終わります。
ユーザからの入力待ちの状態なので esc to interrupt
の表示はありません。 これでイベントがトリガーされて通知処理が飛ぶはずです。
Slackの当該チャンネルと見るとちゃんと通知が来ています。
通知内容もキャプチャした文字列からある程度カスタマイズしても良いかもしれません。
まとめ
WezTermをカスタマイズさせてClaude Codeのタスク終了を検知してSlackに通知する仕組みを作ってみました。 Slack通知にすることもできたので、 Slack以外の通知気にしたくないマンも満足です。
多くの方が気づいていると思いますが、 この方法はClaude Codeに限らずあらゆるアプリの出力に応用可能ですし、 トリガーされたら任意のプロセスを実行可能です。 なので非常に魔改造しがいがある機能ではありますが、 あんまりこれを色々やるととてもカオスなことになりそうなのでこれ以上は自重しようと思います。
これでClaude Codeの終了を待ってる間にターミナルのカスタマイズが捗りますね。