Claude Code Status Line: двустрочная панель состояния для CLI

Claude Code Status Line: двустрочная панель состояния для CLI

Image description

Когда работаешь с 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 не установлен или каталог не является репозиторием.