CCMissionControl

Claude Codeを複数起動しているとき、ほかのセッションの稼働状況を知りたい需要は高く、様々な方法が提案されてきた。Notification Hookを使ってサウンドを鳴らしたり、TerminalのVisual Bellをフックしたり。最近はcmuxなんていうソリューションも出てきた。
どうにもユースケースに微妙に合わないので、WezTermで使える自分用のmacOSアプリ、CCMissionControlを作った。
Mission Controlとは、スペースシャトルの管制室のこと。往年のMacユーザーであれば、古のMission ControlというOS機能を思い出す(実際それは意識した)。
機能としてはこんな感じ。
- 実行中、待機中のClaude Codeセッションを一覧表示
- 未読管理。セッションが終わったときに未読表示。WezTerm上でタブを選択すると既読に
- バックグラウンドのセッションが終わったらmacOSのネイティブ通知
- メニューバーにも出せるし、フロートウィンドウにもできる
- GUIからWezTermのタブやペインを切り替えられる
- システム起動時の自動機能
個人的に嬉しいのは、終了時や認証確認時にmacOSのネイティブ通知も飛ばしてくれること。さらにこの通知はWezTerm上のセッションがバックグラウンド(別のタブで表示されているなど)のときしか飛んでこない。通知をタップしたらそのままWezTermのペインを移動してくれる。最高便利。

WezTerm専用GUIアプリ!
このアプリはWezTerm専用となっている。これはWeztermが強力なwezterm CLIを提供していて、これ経由でタブやペインの選択状態を取得・操作しているため。
これにより、WezTerm側で、どのClaude Codeセッションを持つttyがアクティブになっているかを外部から監視、操作することができている。
例えば wezterm cli list --format json などを実行すると、現在開かれているペインの情報が返ってくる。
{ { "window_id": 0, "tab_id": 14, "pane_id": 28, "workspace": "default", "size": { "rows": 63, "cols": 79, "pixel_width": 1501, "pixel_height": 2394, "dpi": 144 }, "title": "zsh", "cwd": "file:///Users/giginet/.ghq/github.com/giginet/blog-articles", "cursor_x": 0, "cursor_y": 1, "cursor_shape": "Default", "cursor_visibility": "Visible", "left_col": 80, "top_row": 0, "tab_title": "", "window_title": "< (~/.ghq/github.com/giginet/blog-articles/entry/2026/04/10) - Nvim", "is_active": true, "is_zoomed": false, "tty_name": "/dev/ttys011" } }
macOSアプリ側から、このCLIの実行結果を定期的にpollingして情報を更新している。またペインのアクティブ状況も見れたり、wezterm cli activate-paneでペインの選択状態も変更できるため、既読管理をしたり、GUI側からWezTermに反映したりと、双方向のインタラクションを実現している。
Claude Codeプロセスの取得
ttyから紐付いているClaude Codeのセッションと動作状況を取得
基本的なアイディアはこの記事に大変お世話になった。大変ありがとうございました。
この記事で解説されているとおり、psコマンドでclaude PIDを探し、それを実行しているtmuxのペインと紐付けている。
Claude Codeが動作中かどうかの判定
これも記事で解説されているが、Claude Codeは動作中のスリープを抑止するために、子プロセスとしてcaffeinateを発行するらしい。これを監視することで、動作中かどうかを検出している。
記事で紹介されているGoのコードをコンテキストとして与え、Swift移植を頼んだところすぐにできた。
どうぞご利用ください!
macOS + WezTermユーザー専用だけど、使っている人には便利だと思う。
リリースページに公証済みのバイナリも配布しているので、ぜひ使ってもらえると幸い。