English | 日本語
Claude Code の グローバルHooks からイベントを収集し、複数プロジェクトのセッション状態を メニューバー(トレイ) と ダッシュボード で一覧できるアプリケーションです。tmux との連携もバッチリ — ダッシュボードから直接ペインの表示・操作ができます!
- macOS(12+)
- Linux(動作未検証)
- Windows(動作未検証。windowsユーザの方のコントリビューションをお待ちしています🙇🏻♂️)
- Claude Code
- Node.js v23+
- Releases ページにアクセス
- お使いのプラットフォームに対応したファイルをダウンロード:
- macOS:
.dmgファイル - Linux:
.debまたは.AppImageファイル - Windows:
.msiまたは.exeファイル
- macOS:
- インストールしてアプリを起動
Note
macOSでは「アプリが壊れているため開けません」というエラーが表示される場合があります。トラブルシューティングを参照してください。
# リポジトリをクローン
git clone https://github.com/joe-re/eyes-on-claude-code.git
cd eyes-on-claude-code
# 依存関係をインストール
pnpm install
# 開発モードで実行
pnpm tauri dev
# または本番用にビルド
pnpm tauri build初回起動時にはアプリケーション上にhooksの設定のインストラクションが表示されます。
Setupモーダルの指示に従って、生成された設定を ~/.claude/settings.json に反映してください。
Note
Setupモーダル上で表示されているJSONは既存設定を読み込み、hooksだけを差し替える JSON を生成します(古い eocc hooks は置換され、他のhooks/設定は保持されます)。
- ダッシュボードには Sessions 一覧が表示されます。
Monitoring: Waiting状態のセッションが0件(監視中)N waiting:WaitingPermissionまたはWaitingInputのセッションが N件- 右上のドットも waiting のときは警告色+点滅表示になります
セッションの状態は以下の4種類で、一覧/トレイ/メニュー表示にも反映されます。
| 状態 | 意味 | 表示(絵文字) |
|---|---|---|
Active |
Claudeが作業中/通常状態 | 🟢 |
WaitingPermission |
Claude Code が権限許可待ち | 🔐 |
WaitingInput |
入力待ち(アイドル等) | ⏳ |
Completed |
応答完了 | ✅ |
- カードをクリックすると展開し、Gitの状態が表示されます。
Diffをクリックすると difit を起動し、diffの確認ができます。(Thanks the awesome product for difit dev team! 🙇🏻♂️)
unstaged: 作業ツリーの差分staged: indexの差分commit: 最新コミットの差分(HEAD~1..HEAD)branch: デフォルトブランチ(自動検出)との比較
Note
Diff表示は内部で npx difit を対象リポジトリ内で起動します。そのためNode.js(npx)が必要です。
対象がGitリポジトリでない場合、または差分が無い場合は開けません。
Claude Codeがtmuxペイン内で実行されている場合、セッションカードにTerminalボタンが表示され、ペインの内容をリアルタイムで確認できるビューアウィンドウを開けます。
- リアルタイム更新: ペインの内容を500msごとに更新
- キーボード入力: Ctrl組み合わせや特殊キーを含むキー入力をペインに送信可能
- IMEサポート: 日本語入力(IME)に対応
- ANSIカラー: ターミナルカラーを正しくレンダリング
Note
tmux連携にはClaude Codeがtmuxセッション内で実行されている必要があります。TMUX_PANE環境変数はhookスクリプトによって自動的に取得されます。
- Always on Top の切替に対応します。
- フォーカス状態に応じてOpacityを変えられます。
- difitウィンドウがフォーカスされるとダッシュボードは「非アクティブ」として扱われます。
- Sound をONにすると、状態変化に応じて効果音が鳴ります。
- Waiting(Permission/Input): 注意音
- Completed: 完了音
有効時(デフォルト)、ダッシュボードはフォーカスを失うと自動的にコンパクトビューに縮小されます:
- コンパクト表示: タイトルバーとセッション状態のカウント(🟢:1 🔐:2 ⏳:1 ✅:3)のみを表示
- 自動復元: ウィンドウがフォーカスを得ると元のサイズに戻ります
- 位置記憶: 元のウィンドウサイズと位置を記憶します
メニューバーの Window → Minimum Mode から切り替えられます。
- ダッシュボードは アクティブ/非アクティブ で透過率(Opacity)を切り替えます。
- Active: ダッシュボードにフォーカスがあるとき(初期値: 100%)
- Inactive: フォーカスが無いとき(初期値: 100%)
- 透過率はメニューバーの Window → Opacity から変更できます。
- 複数セッション監視
- 状態表示: Active / WaitingPermission / WaitingInput / Completed
- waiting数の可視化
- Git情報の表示: ブランチ名、unstaged/staged有無、最新コミット
- Diff表示: difit(
npx difit)で差分を別ウィンドウに表示 - tmux連携: tmuxペインの内容をリアルタイムで表示・操作
- 通知音: waiting / completed を音で通知(SoundのON/OFFあり)
- Rust(
rustup) - Node.js(
npx含む) - pnpm
pnpm installpnpm tauri devHook/ログ
~/.local/bin/
└── eocc-hook # Hookスクリプト(アプリが作るシンボリックリンク)
~/.claude/
└── settings.json # グローバルHooks設定
~/.eocc/
└── logs/
└── events.jsonl # イベントキュー(アプリ処理後にクリアされる)
アプリデータ
~/Library/Application Support/tech.joe-re.eocc/ # macOS
├── settings.json # アプリ設定
└── runtime_state.json # セッション状態(アプリ再起動時に復元)
~/Library/Logs/tech.joe-re.eocc/ # macOS
└── *.log # アプリログ
Hookスクリプトはイベントを events.jsonl に追記します。
| event | 用途 | セッション状態への反映 |
|---|---|---|
session_start (startup/resume) |
セッション開始 | Activeとして登録 |
session_end |
セッション終了 | セッション削除 |
notification (permission_prompt) |
承認待ち | WaitingPermission |
notification (idle_prompt) |
入力待ち | WaitingInput |
stop |
応答完了 | Completed |
post_tool_use |
ツール実行後 | Active |
user_prompt_submit |
プロンプト送信 | Active |
sequenceDiagram
participant CC as Claude Code
participant Hook as eocc-hook
participant Queue as events.jsonl
participant App as EOCC App
participant Log as App Log
CC->>Hook: Hook呼び出し(stdin: event data)
Hook->>Queue: イベント追記(JSON行)
loop ファイル監視
App->>Queue: 変更検知
App->>App: events.jsonl → events.processing.*.jsonl(アトミックにリネーム)
App->>App: 空のevents.jsonlを再作成
App->>App: processing fileを1行ずつ処理
App->>Log: イベントをログに記録
App->>App: セッション状態を更新
App->>App: processing fileを削除
App->>App: runtime_state.jsonに保存
end
pnpm tauri build成果物(macOS例):
src-tauri/target/release/bundle/macos/Eyes on Claude Code.appsrc-tauri/target/release/bundle/dmg/Eyes on Claude Code_1.0.0_aarch64.dmg
リリースはGitHub Actionsで自動化されています。新しいリリースを作成するには:
src-tauri/tauri.conf.jsonとpackage.jsonのバージョンを更新- バージョン更新をコミット
- バージョンタグを作成してプッシュ:
git tag v1.0.1 git push origin v1.0.1
- GitHub Actionsが自動的にすべてのプラットフォーム向けにビルドし、ドラフトリリースを作成
- GitHubでリリースノートを確認し、公開
| プラットフォーム | アーキテクチャ | 成果物 |
|---|---|---|
| macOS | Apple Silicon (aarch64) | .dmg, .app |
| Linux | x64 | .deb, .AppImage |
| Windows | x64 | .msi, .exe |
特定のプラットフォーム向けにローカルでビルドする場合:
# macOS (Apple Silicon)
pnpm tauri buildソースPNGからアイコンを再生成する場合:
./scripts/generate-icons.sh
# または
pnpm tauri icon src-tauri/icons/icon.pngこのエラーはアプリがApple Developer証明書で署名・公証されていないために発生します。以下のコマンドで回避できます:
xattr -cr "/Applications/Eyes on Claude Code.app"マウントしたDMGから開く場合:
xattr -cr "/Volumes/Eyes on Claude Code/Eyes on Claude Code.app"Note
Apple Developer証明書による署名は将来のリリースで対応予定です。
~/.claude/settings.jsonを開き、Setupモーダルで生成した内容に反映できているか確認- Claude Codeで
/hooksを実行して、hooksが読み込まれているか確認 ~/.local/bin/eocc-hookの存在/実行権限を確認ls -la ~/.local/bin/eocc-hook
- Node.js が利用できるか確認
command -v node
- アプリログを確認
ls -la ~/Library/Logs/tech.joe-re.eocc/cat ~/Library/Logs/tech.joe-re.eocc/*.log | grep -i error
events.jsonlが作成/更新されているか確認ls -la ~/.eocc/logs/
- Hookが呼ばれているか確認(Claude Codeで
/hooksを実行)
- 対象がGitリポジトリか確認(
.gitが無いとエラーになります) - 差分が無いと「No diff content to display」になり開けません
- Node.js(
npx)が利用できるか確認command -v node && command -v npx
- 環境によっては
npxがdifitを取得するためネットワークが必要です
- メニューの Sound がONになっているか確認
- ブラウザ/OS側の制限でAudioがブロックされる場合があります(設定変更後に再度状態変化を発生させて確認してください)
- Claude Codeがtmuxセッション内で実行されているか確認
echo $TMUX_PANEでペインID(例:%0)が表示されるはずです
- hookが
TMUX_PANE変数を取得しているか確認- イベントログで確認:
grep tmux_pane ~/.eocc/logs/events.jsonl
- イベントログで確認:
- tmuxがインストールされており、アクセス可能か確認
command -v tmux
- ペインがまだ存在するか確認
tmux list-panes -a
本プロジェクトは MIT License で公開します。LICENSE を参照してください。
依存関係(Node/Rust)のライセンス概要と、依存ライセンスレポート生成手順は THIRD_PARTY_NOTICES.md を参照してください。
- ローカル完結: 本アプリはHookイベントをローカルで処理し、テレメトリ/解析目的の送信は実装していません。
- 保存されるもの:
~/.eocc/logs/events.jsonl: Hookが追記するイベントキュー(アプリが処理後に消費/クリア)- アプリログ: 生のイベントJSON行もアプリログに出力されます(
tauri-plugin-logによりローテート)
- 注意: Claude Code 側のHookペイロードによっては
messageなどが含まれるため、機密情報が混ざり得ます。





