TOOLING · 2026-05-25 · ~6 мин
Мой statusline для Claude Code
Одна строка внизу терминала, которая показывает всё, что обычно держишь в голове или проверяешь руками
Из чего состоит
Это одна строка внизу терминала, которая говорит всё, что реально нужно: на какой ты модели, живое состояние git-репозитория, сколько контекста сожжено, hit/write prompt-кэша и лимиты подписки. Без зависимостей и без сборки — macOS, Linux, Windows.
Каждый сегмент раскрашен — сама форма строки сигналит о срочности с одного взгляда. Подписи агрессивно сокращены, чтобы строка влезала в 100-колоночный терминал.
-
Op 4.7 (1m)Текущая модель, сокращённо: семейство (
Op/So/Ha/My) + пробел + версия + размер контекста (приглушённым).Opus 4.7 (1M context)превращается вOp 4.7 (1m). Нераспознанные имена моделей показываются как есть. -
claude-…tusline (main)Имя текущей папки (приглушённым) + активная ветка голубым; при detached HEAD показывает
(HEAD@<sha>)красным. Имя папки обрезается до 15 символов срединным многоточиемhead…tail(по 7 символов с каждой стороны) — но только когда иначе строка превысила бы 100 видимых колонок; короткие строки сохраняют полное имя. -
3M 1A 1D 1R 2? 1!Состояние рабочего дерева, сгруппированное по кодам в стиле VS Code:
M— modified,A— added/staged,D— deleted,R— renamed,?— untracked. Всё приглушённым.!— unmerged conflict, выводится отдельно красным, потому что это единственное, что реально блокирует коммит. Пустые группы скрыты — чистый репозиторий не показывает ничего. -
↑2 push/↓1 pullЛокальная ветка опережает или отстаёт от
origin/<branch>— надо ли пушить или подтянуть изменения. -
⚠ md driftCLAUDE.md↔AGENTS.md↔GEMINI.mdразъехались. Я использую и Claude Code, и Codex, и Gemini — у них разные главные контекст-файлы, и этот сегмент загорается, когда они рассинхронились. -
██░░░ 480k/1MКонтекстное окно. Бар из 5 ячеек с точностью до полублока (
█▌░, ~10% на шаг). Когда Claude Code отдаёт абсолютные счётчики, бар считается какtotal_input_tokens / context_window_size, а к сегменту добавляются сырые числа (например480k/1M). Когда доступен толькоremaining_percentage, бар откатывается на100 − remaining. -
cache 87% ↓75k +360 1h:42mСостояние prompt cache. Счётчики read/write/input берутся из stdin
context_window.current_usage; транскрипт сессии даёт только TTL-корзину (1h/5m) и время последнего касания для отсчёта. Hit ratio =read / (input + write + read):≥90%— жирный зелёный,≥75%— зелёный,≥50%— жёлтый, ниже — оранжевый,0%— жирный красный при полном промахе или инвалидации.↓— токены, прочитанные из кэша,+или↑— записанные. После/compactпоказываетсяcache:reset, пока stdincurrent_usageпуст, но транскрипт ещё помнит прошлую активность кэша. -
5h:35%(2h15m)Использование 5-часового rate-лимита + обратный отсчёт до сброса (
Xh Ym/Mm). -
7d:42%(4d)Использование 7-дневного rate-лимита + отсчёт до сброса. Грубый формат:
Nd, пока остаётся ≥ 2 дней;1dXhв последний день (ровно на 1 дне рендерится как24h, чтобы единица не врала);Xh Ym/Mmменьше чем за день.
Цвета показывают уровень важности: норм / внимание / опасно
Что значат цвета и пороги
Контекстный бар и rate-лимиты используют одну цветовую шкалу
- < 50% — всё спокойно
- 50–65% — yellow, можно начинать поглядывать
- 65–80% — orange, скоро упрёшься
- ≥ 80% — red и 💀
У контекстного бара есть ещё одно правило — по абсолютным токенам: как только total_input_tokens переваливает за 250k, pink принудительно повышается до yellow, независимо от процентной шкалы. 250k — это практический обрыв «уже много»: качество вывода модели деградирует, и где-то там включается длинноконтекстный тариф Anthropic, — так что сессия с 1M-контекстом на 250k/1M (использовано 25%) не должна рендериться уютным pink.
Все подробности — в GitHub
Установка, как это остаётся быстрым, опциональные хуки синхронизации CLAUDE.md / AGENTS.md / GEMINI.md и кастомизация — всё это подробно расписано в репозитории. Один файл, ~370 строк Node.js без зависимостей, лицензия MIT.
Хочешь поглубже разобраться в Claude Code, контексте и агентах? Раз в месяц я беру 10 человек на поток и провожу через 6 уровней — от установки до Context Engineering.
Занять место