Коротко
Как я пришёл к написанию своего плагина решая свои боли
Я почти весь день работаю в Claude Code, обычно в несколько сессий сразу. У этого режима есть бытовая проблема: терминал свёрнут, окно перекрыто редактором, а десктопное приложение статусную строку не показывает вовсе. Клод там что-то делает. Или уже минуту ждёт, пока я разрешу ему команду. Или доел контекстное окно и начал забывать начало разговора. Снаружи не видно ничего. Вторая боль — MCP-серверы. Упавший сервер выглядит ровно как ненастроенный: его инструменты молча исчезают из списка, без единой ошибки. Узнаёшь об этом в середине задачи, когда агент внезапно «разучился» делать то, что умел вчера. И третья мелочь, которая надоедает: лимиты. Пятичасовое и недельное окно живут в команде /usage — чтобы узнать, сколько осталось, надо пойти и спросить. Мне хотелось одну улучшенную статусную строку — только не внутри терминала, а над ним: со статусом сессий, с MCP и с лимитами. Готовой такой не было. Вот что из этого родилось: . Сначала это были два приложения В строке меню у меня уже жил Мика Цесанека: иконка анимируется, пока Клод работает, жёлтая точка — когда он ждёт разрешения, рядом таймер хода. Хорошая штука, пользовался с удовольствием. Но про MCP и лимиты она ничего не знает, а смотреть мне чаще всего нужно было именно туда. Поэтому про MCP я сначала написал отдельный плагин — claude-mcp-bar. Он показывал все настроенные серверы, ответил ли каждый на проверку, и давал выключатели: на сервер целиком и на каждый инструмент отдельно. У выключателей обнаружился приятный побочный эффект: выключенный инструмент исчезает из контекста целиком, Claude Code даже не загружает его описание. Так выключатель заодно освобождает окно от инструментов, которыми в этом проекте всё равно не пользуешься. Две иконки рядом делили одну задачу пополам. Я форкнул status-bar, перенёс в него MCP-слой из своего плагина — получился Claude Control Bar. У него своё имя и свой bundle id, установки родителей он не трогает. От первого — сессии, анимации и жизненный цикл, от второго — MCP, замер контекста и лимиты. Что в меню Сессии. Каждая строка — проект и ветка, живой таймер, метка CLI или APP и процент заполнения контекстного окна. Клик по строке поднимает терминал этой сессии. С процентом пришлось повозиться. Claude Code отдаёт эту цифру только в statusLine, а десктопное приложение statusLine не запускает никогда — так что для него цифра пересчитывается из транскрипта сессии по той же формуле, что использует сам CLI. Размеры окон при этом не захардкожены, а выпарсиваются из установленного бинаря claude: зашитая таблица протухала бы с каждым релизом. Помогает не всегда: транскрипт может назвать модель, которой в бинаре нет. У меня Claude Code 2.1.205 знает claude-opus-4-8, а транскрипты пишут claude-opus-5. До фикса сессия на 154 тысячи токенов показывала 77% занятого окна при честных 15%. Теперь незнакомое имя берёт самое широкое окно своего семейства и помечается тильдой, а размер, однажды увиденный в живом statusLine, запоминается насовсем. MCP. Серверы сгруппированы по месту настройки: глобальный конфиг, коннекторы claude.ai, плагины, project-файл .mcp.json. У каждого — состояние, счётчик «включено/всего» инструментов и выключатель; список инструментов раскрывается подменю с той же строки, по наведению видно описание и параметры. Строка changed: перечисляет, что сдвинулось с прошлой проверки, а про упавший сервер приходит уведомление — ровно та ситуация, ради которой всё затевалось. Проверка здоровья, кстати, дорогая: claude mcp list по-настоящему стартует каждый настроенный сервер и ждёт ответа, у меня это около полуминуты. Поэтому она запускается по клику на выключателе, раз в десять минут по таймеру и при открытии меню, если картинке больше двух минут, — но не при каждом взгляде на иконку. Лимиты. Пятичасовое и недельное окно — двумя мини-барами прямо в строке меню, в самом меню — проценты и время сброса. Данные берутся из того же эндпоинта Anthropic, который спрашивает /usage, раз в пять минут, с OAuth-токеном из Keychain; токен читается локально и уходит только на api.anthropic.com. Эндпоинт недокументированный — так живут все утилиты этой ниши, но кому серая зона не нравится, у поллинга есть выключатель в опциях, и секция честно скажет, что данных нет. Три истории со стройки Самая неприятная находка — про безопасность project-серверов. Ранний вариант читал .mcp.json прямо из репозитория и сам запускал перечисленные там команды во время проверки. Достаточно было склонировать чужой репозиторий и открыть в нём Claude Code — и чужая команда выполнилась бы при следующем health-check, мимо всех аппрувов. Дыру я закрыл в 0.5.0, а в 0.5.1 доделал правильно: приложение вообще ничего не запускает из project-конфига — оно спрашивает сам Claude Code (claude mcp list в папке проекта) и берёт его ответ как есть. Решение «что можно стартовать» остаётся там, где живёт твой аппрув. Вторая — про параллельные клики. Каждый тогл выключателя — отдельный процесс; два одновременных читали один settings.json, и вторая запись стирала первую. В замере одно из изменений терялось в 43 прогонах из 50. Теперь весь read-modify-write держит эксклюзивный файловый лок: 12 параллельных тоглов — 12 выживших изменений, и это закрыто тестом, который гоняет настоящие процессы, а не моки. Третья — бытовая: строка меню это жестокая среда. Возле чёлки помещается примерно 772 точки, и пункт, который не влез, не обрезается — он уезжает под неё и исчезает. Выглядит как баг приложения, а это просто macOS. На такие случаи есть CONTROL_BAR_DUMP_MENU=1 — печатает меню текстом, и не нужно охотиться за пунктом, запаркованным за экраном. Как поставить Два пути. Как плагин Claude Code: /plugin marketplace add InfinityScripter/claude-control-bar, потом /plugin install claude-control-bar. Приложение соберётся на твоём маке при следующем старте сессии (нужны Xcode Command Line Tools), Gatekeeper в процессе не участвует, обновления приезжают вместе с плагином. Второй путь — DMG из : он не нотаризован, потому что у форка нет Apple Developer ID, так что первый запуск придётся разрешить через «Открыть всё равно» — в README расписано. Код открыт, лицензия MIT. Отдельное спасибо Мику Цесанеку: без claude-status-bar этого форка бы не было. Собирал под свои три слепых зоны — статус, MCP и лимиты. Если у вас те же — забирайте.