5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

WezTerm上のClaude Codeの稼働状態を監視するmacOSアプリ、CCMissionControlを作った

CCMissionControl

稼働中のClaude Codeセッションが一覧表示!

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ユーザー専用だけど、使っている人には便利だと思う。

リリースページに公証済みのバイナリも配布しているので、ぜひ使ってもらえると幸い。