Проблема: хаос из десятков сессий Claude Code

Представьте: у вас открыто 10+ вкладок в терминале, в каждой работает отдельная сессия Claude Code или Codex. Вы пишете код сразу в нескольких проектах, переключаетесь между Ghostty и Zed, и не знаете, какая сессия уже завершила задачу, а какая застряла в ожидании разрешения.

Именно в такой ситуации оказался разработчик, запускавший 10+ сессий Claude Code в разных терминалах — постоянно переключаясь между ними, чтобы проверить, какая ждёт разрешения, а какая завершила работу. Это быстро надоедает.

Существующие инструменты мониторинга требовали запускать сессии прямо из их интерфейса, что полностью меняло привычный воркфлоу. Хотелось сохранить свои терминалы и просто получать информацию о происходящем.

Так рождается класс инструментов — macOS menu bar-приложения для мониторинга, поиска и управления сессиями AI-ассистентов. В этой статье разберём архитектуру таких решений, реальные реализации и технические подходы, которые делают их эффективными.


Что умеют современные menu bar-приложения для Claude Code

Экосистема инструментов мониторинга Claude Code за последние месяцы резко выросла. Рассмотрим ключевые проекты и их возможности.

c9watch — мониторинг на уровне ОС

c9watch — нативное macOS menu bar-приложение, которое автоматически обнаруживает каждую запущенную на вашей машине сессию Claude Code.

Никаких плагинов, никакой настройки — приложение сканирует процессы на уровне ОС, поэтому работает с любым терминалом или IDE, которые вы уже используете.

Сессии группируются по статусу — Working, Needs Permission, Idle, Done — запросы на разрешение всплывают наверх. Можно также группировать по проекту (с информацией о git-ветке), раскрывать любую сессию для чтения полного разговора, останавливать или переименовывать сессии и прыгать прямо в родительский терминал.

Claudoscope — полноценная аналитика и поиск

Claudoscope — нативное macOS menu bar-приложение для изучения, анализа и управления сессиями Claude Code. Работает полностью в реальном времени, без телеметрии, 100% локально.

Приложение предоставляет полнотекстовый поиск по сообщениям, thinking-блокам, входам и результатам инструментов, с автоматическим раскрытием совпадающих свёрнутых блоков.

Отдельно стоит отметить функцию безопасности: приложение автоматически обнаруживает утечки API-ключей, токенов и других credentials в ваших сессиях.

ClaudeBar и CodexBar — мониторинг квот

ClaudeBar — macOS menu bar-приложение для мониторинга квот использования AI-ассистентов, поддерживающее Claude, Codex, Gemini, GitHub Copilot, Antigravity, Z.ai, Kimi, Kiro и Amp.

CodexBar хранит сессионные и недельные лимиты (а также кредиты) в menu bar, чтобы вы всегда знали, когда безопасно деплоить.

Сравнительная таблица инструментов

ИнструментПоиск по сессиямМониторинг квотАналитика стоимостиOpen SourceЦена
c9watch✅ MITБесплатно
Claudoscope✅ MITБесплатно
ClaudeBarБесплатно
CodexBarБесплатно
SessionWatcherот $2.99
claude-statisticsБесплатно

Архитектура: как это работает изнутри

Понять, как устроены эти приложения — значит научиться строить подобные инструменты самостоятельно. Разберём ключевые технические решения.

Где хранятся данные сессий

Все AI-ассистенты сохраняют данные локально в JSONL-файлах:

~/.claude/projects/     ← Claude Code сессии
~/.codex/projects/      ← Codex CLI сессии
~/.gemini/tmp/          ← Gemini CLI сессии
~/.claude/history.jsonl ← индекс сессий Claude Code

Claude Statistics автоматически обнаруживает и парсит сессии из ~/.claude/projects/ (Claude Code), ~/.codex/projects/ (Codex CLI) и ~/.gemini/tmp/ (Gemini CLI).

Каждый провайдер имеет собственный пайплайн парсинга и локальный кэш — переключение провайдеров не останавливает фоновую индексацию остальных.

Поиск по содержимому: умная индексация

c9watch читает ~/.claude/history.jsonl для индекса сессий, затем сканирует отдельные JSONL-файлы по всем директориям проектов для глубокого поиска. Логика извлечения текста тщательно различает пользовательские промпты и результаты инструментов — индексируется только то, что реально набрал пользователь, что предотвращает шумные совпадения по метаданным.

Результаты поиска ведут обратно в просмотрщик разговоров с подсветкой найденных совпадений и прокруткой до нужного места.

Расчёт стоимости и токены

Метаданные сообщений ассистента в JSONL-файлах содержат информацию об использовании модели и количестве токенов. Калькулятор стоимости использует таблицы цен по каждой модели и кэширует результаты по времени изменения файла — неизменённые сессии никогда не пересканируются.

Это важный момент для понимания нюансов:

Одна из сложностей: идентификаторы моделей Anthropic включают суффиксы дат, например claude-sonnet-4-5-20250929. При поиске цен эти суффиксы нужно нормализовать, убирая их перед сопоставлением с таблицей тарифов.

Технологии реализации: Tauri vs. SwiftUI

Tauri обеспечивает нативный бинарник с минимальными накладными расходами — Rust обрабатывает тяжёлые задачи (сканирование процессов, парсинг JSONL) на нативной скорости, а Svelte компилирует фреймворк, убирая лишние издержки на фронтенде.

Альтернативный подход — чистый Swift/SwiftUI: нативное macOS menu bar-приложение, построенное целиком на Swift и SwiftUI, предлагает чистый интуитивный интерфейс для отслеживания 5-часового сессионного окна, недельных лимитов использования и специфичного потребления Opus.

ℹ Почему не Electron?
Electron потребляет значительно больше памяти. Учитывая, что само по себе запущено 10+ сессий Claude Code, мониторинговый инструмент не должен добавлять к этому нагрузку. Tauri или нативный Swift — правильный выбор для menu bar-утилит.

Как работает menu bar-попоувер на macOS

Реализация UI имеет свои тонкости. Вот как правильно сделать, чтобы панель отображалась корректно:

Menu bar-попоувер использует macOS NSPanel со специфическими коллекционными поведениями — full_screen_auxiliary(), can_join_all_spaces(), stationary() — чтобы панель появлялась поверх полноэкранных приложений.

Claudoscope мониторит ~/.claude/projects/ с помощью macOS FSEvents для практически мгновенного обнаружения изменений в JSONL-файлах сессий. Обновления парсятся инкрементально и отображаются в интерфейсе в реальном времени. Никакого поллинга, никакого серверного процесса, никаких сетевых запросов.

При запуске выполняется однократное сканирование для построения начального индекса проектов и сессий. Затем перепарсируются только изменённые файлы, а распарсенные сессии хранятся в LRU-кэше (ёмкость 20) для мгновенного повторного доступа.


graph TD
    A[Запуск приложения] --> B[Сканирование ~/.claude/projects/]
    B --> C[Построение индекса сессий]
    C --> D[FSEvents: наблюдение за JSONL]
    D --> E{Изменение файла?}
    E -->|Да| F[Инкрементальный парсинг]
    E -->|Нет| D
    F --> G[Обновление LRU-кэша]
    G --> H[Обновление UI в реальном времени]
    H --> D
    style A fill:#6366f1,color:#fff
    style H fill:#10b981,color:#fff


Как построить собственное приложение: пошаговый подход

Если хотите создать свой инструмент — вот минимальная архитектура.

Шаг 1: Настройка проекта

Для Tauri-подхода:

# Установка Tauri CLI
cargo install tauri-cli

# Создание проекта
npm create tauri-app@latest my-claude-monitor
cd my-claude-monitor

# Запуск в режиме разработки
npm run tauri dev

Для нативного Swift (через Tuist, как в ClaudeBar):

# Установка Tuist
brew install tuist

# Клонирование и сборка
git clone https://github.com/tddworks/ClaudeBar.git
cd ClaudeBar
tuist install
tuist generate
open ClaudeBar.xcworkspace

Шаг 2: Парсинг JSONL-файлов сессий

use std::fs;
use std::path::Path;
use serde_json::Value;

fn parse_session_file(path: &Path) -> Vec<String> {
    let content = fs::read_to_string(path).unwrap_or_default();
    let mut user_messages = Vec::new();
    
    for line in content.lines() {
        if let Ok(entry) = serde_json::from_str::<Value>(line) {
            // Индексируем только пользовательские промпты,
            // не результаты инструментов
            if entry["type"] == "human" {
                if let Some(text) = entry["content"].as_str() {
                    user_messages.push(text.to_string());
                }
            }
        }
    }
    user_messages
}

Шаг 3: Наблюдение за файлами

import Foundation

class SessionWatcher {
    private var fileDescriptor: Int32 = -1
    private var source: DispatchSourceFileSystemObject?
    
    func watch(path: String, onChange: @escaping () -> Void) {
        let url = URL(fileURLWithPath: path)
        fileDescriptor = open(url.path, O_EVTONLY)
        
        source = DispatchSource.makeFileSystemObjectSource(
            fileDescriptor: fileDescriptor,
            eventMask: [.write, .rename, .delete],
            queue: .main
        )
        source?.setEventHandler { onChange() }
        source?.resume()
    }
}
💡 Совет по производительности
Используйте кэширование по mtime файла: если файл не изменился с момента последнего сканирования, пропускайте его. Это радикально снижает нагрузку на CPU при большом количестве сессий.

Безопасность и приватность: критически важные аспекты

При работе с сессиями AI-ассистентов в данных могут оказаться чувствительные данные.

Claudoscope включает обнаружение секретов — сканирование сессий на предмет утечки credentials с энтропийной фильтрацией.

Claudoscope обнаруживает утечки credentials внутри файлов сессий Claude Code и предупреждает в реальном времени. Сканируется 10 паттернов через полную историю сессий: токены платформ (GitHub PAT/OAuth, OpenAI, Anthropic, Stripe, Slack, npm, Google, SendGrid, Shopify, DigitalOcean, Linear, PyPI, HuggingFace, Azure, Vault, Docker).

Что касается общего подхода к приватности:

Никакого сбора данных. Никакой аналитики. Ваши данные об использовании остаются на вашей машине — всегда.

⚠ Осторожно с session cookies
Некоторые инструменты просят сессионный cookie от claude.ai для получения данных об использовании квот. Храните эти данные только локально. Проверяйте, что выбранное приложение не отправляет credentials на внешние серверы — изучайте исходный код open source решений.

Экосистема: кто что использует

Современные menu bar-приложения предлагают мониторинг нескольких провайдеров, включение/отключение отдельных провайдеров, отслеживание квот в реальном времени (сессионных, недельных, по моделям), множество тем оформления и визуальные индикаторы состояния с цветовым кодированием.

Наиболее продвинутые решения предлагают permission cards прямо в интерфейсе — Claude Code PermissionRequest hooks превращаются во встроенные карточки Allow/Deny, решения записываются обратно через протокол хуков, без переключения в терминал.

Лучший инструмент мониторинга — тот, что не нарушает ваш воркфлоу: живёт в menu bar, не требует изменений в том, как вы запускаете сессии, и показывает нужную информацию по одному взгляду.

Интересный факт: AI строит инструменты для AI

c9watch был построен с помощью самого Claude Code. Большая часть Rust-бэкенда и Svelte-фронтенда создавалась с помощью AI: разработчик описывал что нужно, проверял результат, тестировал и итерировал. Архитектурные решения (Tauri вместо Electron, сканирование на уровне ОС, стратегия парсинга JSONL) принимались человеком, а Claude Code выполнял тяжёлую работу реализации.

Это хороший пример рекурсивного использования AI — когда инструмент разработки создаётся с помощью того же инструмента, который он призван обслуживать.


Заключение

Menu bar-приложения для мониторинга сессий Claude Code и Codex решают реальную проблему современного AI-разработчика: управление множеством параллельных агентных сессий без потери контекста и нарушения воркфлоу.

Ключевые takeaways:

  • Данные уже есть — все сессии хранятся локально в JSONL, нужно лишь научиться их читать
  • Правильная архитектура: FSEvents вместо поллинга, LRU-кэш, инкрементальный парсинг
  • Безопасность важна: сканируйте свои же сессии на утечки credentials
  • Open source побеждает: лучшие инструменты — бесплатные и с открытым кодом
  • Tauri или нативный Swift — правильный выбор для минимального footprint

Если вы работаете с Claude Code профессионально и ведёте несколько параллельных сессий — установите один из описанных инструментов. Это займёт 5 минут и сэкономит часы переключений между вкладками терминала.