Claude Code Status Line: двустрочная панель состояния для CLI
Claude Code Status Line: двустрочная панель состояния для CLI
Когда работаешь с Claude Code весь день, важно видеть контекст одним взглядом — какой проект, ветка, сколько контекста использовано, когда сбросится лимит. Стандартный интерфейс этого не даёт. Я написал statusline.sh — двустрочную строку состояния, которая живёт в нижней части экрана и обновляется автоматически.
Как выглядит
tim | LAISK:9 | /root/projects/app | main +2 ~3 ?7 | ex:1.19.5/OTP28 | srv:11:07:29 | 256M | +1226 -334
claude-opus-4-6 (200K ctx) | ctx =======[---------- 35% | 5h ==============----- 73% 2h13m 19:45 | $46.43 | v2.1.92
Первая строка — контекст проекта. Вторая — метрики LLM: модель, заполненность контекста, лимиты по времени с прогресс-барами, стоимость сессии.
Как работает
Claude Code поддерживает кастомный statusLine в settings.json. Когда строка включена, Claude Code запускает указанную команду и передаёт ей JSON через stdin — с текущей моделью, контекстом, лимитами и стоимостью. Скрипт читает JSON через jq, собирает строки с ANSI-цветами и выводит их через printf '%b\n'.
JSON, который передаёт Claude Code
{
"workspace": { "current_dir": "/root/projects/app" },
"model": { "display_name": "claude-opus-4-6" },
"context_window": {
"used_percentage": 35.2,
"context_window_size": 200000
},
"rate_limits": {
"five_hour": {
"used_percentage": 73.0,
"resets_at": "2026-04-08T19:45:00+03:00"
},
"seven_day": {
"used_percentage": 40.0,
"resets_at": "2026-04-12T00:00:00+03:00"
}
},
"cost": {
"total_cost_usd": 46.43,
"total_lines_added": 1226,
"total_lines_removed": 334,
"message_count": 127
},
"version": "2.1.92"
}
resets_at может быть ISO 8601 строкой ("2026-04-08T19:45:00+03:00") или Unix timestamp. Скрипт определяет формат перед вычислением и обрабатывает оба варианта.
Строка 1 — Проект
tim | LAISK:9 | /root/projects/app | main +2 ~3 ?7 | ex:1.19.5/OTP28 | srv:11:07:29 | 256M | +1226 -334
| Поле | Откуда | Условие |
|---|---|---|
tim — пользователь |
whoami |
всегда |
LAISK:9 — tmux сессия:окно |
tmux display-message |
только в tmux |
/root/projects/app — рабочий каталог |
JSON .workspace.current_dir или pwd |
всегда |
main — ветка git |
git symbolic-ref --short HEAD |
только в git-репо |
+2 ~3 ?7 — изменения git |
git diff, git ls-files |
только если есть |
ex:1.19.5/OTP28 — версии |
elixir --short-version, erl -eval |
если elixir в PATH |
srv:11:07:29 — аптайм сервера |
pgrep "mix phx.server" + ps -o etime |
если сервер запущен |
256M — размер проекта |
du -sh $cwd |
если каталог существует |
+1226 -334 — строки в сессии |
JSON .cost.total_lines_added/removed |
если ненулевые |
Расшифровка git-статусов
-
+N(зелёный) — N файлов staged (добавлены черезgit add) -
~N(жёлтый) — N файлов modified, но не staged -
?N(красный) — N untracked файлов
Символ не показывается, если счётчик = 0. Чистый репозиторий — только ветка, без статусов.
Строка 2 — LLM
claude-opus-4-6 (200K ctx) | ctx =======[---------- 35% | 5h ==============----- 73% 2h13m 19:45 | $46.43 | v2.1.92
| Поле | JSON-ключ |
|---|---|
claude-opus-4-6 (200K ctx) — модель |
.model.display_name + .context_window.context_window_size |
ctx ====[---- 35% — контекст |
.context_window.used_percentage |
5h ===[---- 73% 2h13m 19:45 — 5-часовой лимит |
.rate_limits.five_hour.* |
7d ===[---- 40% 4d12h 00:00 — 7-дневный лимит |
.rate_limits.seven_day.* |
$46.43 — стоимость сессии |
.cost.total_cost_usd |
127 req — количество запросов |
.cost.message_count |
v2.1.92 — версия Claude Code |
.version |
Прогресс-бары
Ширина 20 символов (каждый = 5%). Цвет фона меняется по заполненности:
| Заполнение | Фон |
|---|---|
| < 50% | зелёный |
| 50–79% | жёлтый |
| ≥ 80% | красный |
После прогресс-бара: процент, оставшееся время (2h13m, cyan) и время сброса (19:45, серый). Если сброс уже прошёл — показывается now.
Установка
1. Разместить скрипт
mkdir -p ~/.claude/scripts
# скопировать statusline.sh в ~/.claude/scripts/
chmod +x ~/.claude/scripts/statusline.sh
2. Прописать в settings.json
{
"statusLine": {
"type": "command",
"command": "~/.claude/scripts/statusline.sh",
"padding": 0
}
}
3. Деплой в Docker-контейнер
Если Claude Code работает внутри контейнера:
docker exec CONTAINER mkdir -p /root/.claude/scripts
docker cp ~/.claude/scripts/statusline.sh CONTAINER:/root/.claude/scripts/statusline.sh
docker exec CONTAINER chmod +x /root/.claude/scripts/statusline.sh
И обновить /root/.claude/settings.json внутри контейнера с теми же настройками.
Зависимости
-
bashс поддержкой[[ ]]и(( )) -
jq— парсинг JSON -
git— информация о репозитории (опционально) -
elixir,erl— версии Elixir/OTP (опционально) -
tmux— сессия (опционально) -
GNU
date— конвертация ISO 8601 → Unix timestamp
Всё опциональное просто не показывается при отсутствии. Скрипт не упадёт, если git не установлен или каталог не является репозиторием.