Output styles и статусная строка

Две вещи, которые влияют на работу с Claude Code незаметно, но постоянно: output style определяет, как Claude отвечает на каждый ваш запрос, а статусная строка показывает состояние сессии в реальном времени. Обе — персональные настройки, которые не трогают логику агента и не потребляют API-токены сверх нормы.


Output styles: стиль поведения агента

Output style — это набор инструкций, которые добавляются к системному промпту Claude Code. Не к вашим сообщениям — к системному промпту, который читается один раз при старте сессии. Поэтому смена стиля вступает в силу только после /clear или нового сеанса.

Встроенные стили

Из коробки доступны четыре стиля:

СтильСуть
DefaultСтандартный системный промпт: эффективная помощь в разработке ПО
ProactiveClaude действует немедленно, делает разумные допущения, не останавливается на рутинных решениях. Более агрессивная автономность, чем auto mode, — но разрешения на инструменты всё равно спрашиваются
ExplanatoryВ ответы вставляются «Insights» — объяснения, почему выбрано именно это решение, какие паттерны кодовой базы задействованы
LearningКооперативный режим: Claude объясняет и оставляет TODO(human) — метки, куда вы должны вписать код сами

Обратите внимание: Proactive не то же самое, что bypassPermissions. Режим разрешений не меняется — меняется только поведение агента (меньше уточняющих вопросов, больше инициативы).

Check yourself
Вы настроили стиль Proactive. Будет ли Claude пропускать разрешения на запуск инструментов — например, на редактирование файлов?

Как переключить стиль

Проще всего — через /config, пункт Output style. Claude Code покажет меню, выбор сохраняется в .claude/settings.local.json на уровне проекта.

Вручную — добавьте поле outputStyle в любой файл настроек:

{
  "outputStyle": "Explanatory"
}

Иерархия настроек стандартная: enterprise → user → project → local. Если в settings.local.json стоит Proactive, а в корпоративных настройках — Default, победит local.

Кастомный output style

Когда ни один из встроенных стилей не подходит — создайте свой. Это markdown-файл с frontmatter. Имя файла становится именем стиля, если в frontmatter не задан name.

Расположение файлов:

  • Пользовательский уровень: ~/.claude/output-styles/
  • Проектный: .claude/output-styles/
  • Внутри плагина: output-styles/ в корне плагина

Пример — стиль, который требует начинать каждое объяснение с диаграммы, но оставляет всю инженерную логику нетронутой:

---
name: Diagrams first
description: Lead every explanation with a diagram
keep-coding-instructions: true
---

When explaining code, architecture, or data flow, start with a Mermaid diagram
showing the structure, then explain in prose.


Quick recall
Если в `.claude/settings.local.json` стоит Proactive, а в корпоративных настройках Default, какой стиль применится?
Quick recall
Режим Proactive и `bypassPermissions` — это одно и то же?
Quick recall
Output style изменится для текущей сессии сразу после смены в `/config`?

Diagram conventions

Use flowchart TD for control flow and sequenceDiagram for request paths.

Keep diagrams under 15 nodes.


Ключевое поле frontmatter — `keep-coding-instructions`:
- `true` — Claude Code оставляет свои встроенные инструкции по разработке (как скопировать изменения, как писать комментарии, как верифицировать работу). Используйте, если вы меняете *формат* ответов, но продолжаете кодить.
- `false` (по умолчанию) — встроенные инструкции убираются. Подходит, когда Claude выступает как аналитик данных, технический писатель или любая другая роль, не связанная с разработкой.

Полный список frontmatter-полей:

| Поле | Назначение | По умолчанию |
|---|---|---|
| `name` | Имя стиля в меню `/config` | Имя файла |
| `description` | Подсказка в меню | — |
| `keep-coding-instructions` | Сохранять ли встроенные инструкции | `false` |
| `force-for-plugin` | Применять стиль автоматически при подключении плагина | `false` |

Поле `force-for-plugin` стоит применять осторожно: если сразу несколько подключённых плагинов устанавливают его в `true`, Claude Code берёт первый загруженный и игнорирует остальные.

Check yourself
Вы создаёте output style для ролевого ассистента по написанию технической документации — без кода, без разработки. Нужно ли ставить keep-coding-instructions: true?

Output style vs. CLAUDE.md vs. Skills

Часто возникает вопрос: что куда класть?

Output style  → «Как Claude отвечает на каждый вопрос» (роль, тон, формат)
CLAUDE.md     → «Что Claude знает о проекте» (конвенции, команды, архитектура)
Skill         → «Что Claude умеет делать в конкретной задаче» (переносимая экспертиза)

Если вы хотите, чтобы Claude всегда отвечал по-русски и в стиле code review — это output style. Если нужно, чтобы он знал, что тесты запускаются через pnpm test --coverage — это CLAUDE.md. Если нужна переиспользуемая процедура деплоя — это skill.


Статусная строка

Статусная строка — полоса в нижней части интерфейса Claude Code. По умолчанию там отображается минимальный набор: модель, режим разрешений. Но строка полностью настраиваема: Claude Code запускает ваш shell-скрипт, передаёт ему JSON-данные сессии через stdin, и всё, что скрипт выведет в stdout, становится строкой.

Важно: статусная строка работает локально и не потребляет API-токены.

Быстрый старт: /statusline

Самый простой способ — описать желаемое в /statusline на естественном языке:

/statusline show model name and context percentage with a progress bar

Claude Code сгенерирует скрипт в ~/.claude/ и сразу пропишет его в settings.json. Это удобно для первого знакомства.

Ручная настройка

Для полного контроля — добавьте блок statusLine в ~/.claude/settings.json (или проектный .claude/settings.json):

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 2,
    "refreshInterval": 30
  }
}

Поля:

  • command — путь к скрипту или inline-команда (например, через jq).
  • padding — дополнительные пробелы по горизонтали.
  • refreshInterval — перезапуск скрипта каждые N секунд помимо событийных обновлений. Полезно, когда статусная строка показывает часы или статус субагентов, работающих в фоне пока основная сессия простаивает.
  • hideVimModeIndicator — убрать встроенный -- INSERT --, если вы сами рендерите vim.mode.

Строка обновляется после каждого ответа ассистента, после /compact, при смене режима разрешений и при переключении vim mode. Обновления дебаунсируются с задержкой 300 мс.

Данные, доступные скрипту

Claude Code передаёт в stdin JSON со всем состоянием сессии. Ключевые поля:

{
  "model": { "id": "claude-opus-4-8", "display_name": "Opus" },
  "workspace": {
    "current_dir": "/home/user/project",
    "git_worktree": "feature-xyz",
    "repo": { "host": "github.com", "owner": "acme", "name": "backend" }
  },
  "context_window": {
    "used_percentage": 42,
    "remaining_percentage": 58,
    "context_window_size": 200000
  },
  "cost": {
    "total_cost_usd": 0.0124,
    "total_duration_ms": 145000,
    "total_lines_added": 87
  },
  "rate_limits": {
    "five_hour": { "used_percentage": 31.5 },
    "seven_day": { "used_percentage": 18.2 }
  },
  "effort": { "level": "high" },
  "vim": { "mode": "NORMAL" },
  "pr": { "number": 42, "url": "https://github.com/...", "review_state": "pending" },
  "output_style": { "name": "Explanatory" },
  "session_name": "refactor-auth",
  "version": "2.1.153"
}

Поля rate_limits доступны только подписчикам Claude.ai (Pro/Max). Поля vim, agent, pr, worktree, session_name присутствуют только когда соответствующие фичи активны — всегда делайте fallback через // empty или or 0.

Размер терминала доступен через переменные окружения COLUMNS и LINES (Claude Code v2.1.153+). Стандартный tput cols внутри скрипта не работает — скрипт запускается без прямого доступа к терминалу.

Check yourself
Скрипт статусной строки делает tput cols внутри Bash, чтобы узнать ширину терминала. Почему это не сработает, и как правильно?

Практический пример: цветовой индикатор контекста

#!/bin/bash
input=$(cat)

MODEL=$(echo "$input" | jq -r '.model.display_name')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')

# Цвет по порогу заполненности
if [ "$PCT" -ge 90 ]; then COLOR='\033[31m'   # красный
elif [ "$PCT" -ge 70 ]; then COLOR='\033[33m' # жёлтый
else COLOR='\033[32m'; fi                      # зелёный
RESET='\033[0m'

# Прогресс-бар из 10 блоков
FILLED=$((PCT / 10)); EMPTY=$((10 - FILLED))
printf -v FILL "%${FILLED}s"; printf -v PAD "%${EMPTY}s"
BAR="${FILL// /▓}${PAD// /░}"

COST_FMT=$(printf '$%.3f' "$COST")

echo -e "[${MODEL}] ${COLOR}${BAR}${RESET} ${PCT}% | 💰 ${COST_FMT}"

Сохраните в ~/.claude/statusline.sh, сделайте исполняемым (chmod +x) и пропишите в settings.json.

Многострочная статусная строка

Каждый echo — отдельная строка в статусной области. Это позволяет организовать компактный «дашборд»:

# Строка 1: модель + директория + git-ветка
BRANCH=$(git branch --show-current 2>/dev/null)
echo -e "[${MODEL}] 📁 ${DIR##*/} | 🌿 ${BRANCH}"

# Строка 2: контекст + стоимость
echo -e "${COLOR}${BAR}${RESET} ${PCT}% | 💰 ${COST_FMT}"

subagentStatusLine

Есть ещё одно поле настроек — subagentStatusLine. Оно настраивает не нижнюю строку интерфейса, а строки субагентов в панели агентов:

{
  "subagentStatusLine": {
    "type": "command",
    "command": "~/.claude/subagent-statusline.sh"
  }
}

Скрипт получает на stdin JSON с массивом tasks — каждый субагент с полями id, name, status, description и временными метками. Вывод заменяет стандартную строку name · description · token count для каждого агента. Полезно, когда запущено несколько фоновых агентов и нужно отличить их по чему-то более значимому, чем имя по умолчанию.


Экосистема: готовые решения

Если писать скрипт с нуля не хочется, в open source уже есть несколько готовых тем и генераторов:

  • ccstatusline (GitHub: sirmalloc/ccstatusline) — Powerline-совместимые темы, настройка через конфиг.
  • claude-statusline (felipeelias, Go) — самодостаточный бинарник, готовые виджеты.
  • Starship-интеграции — если вы уже используете Starship в терминале, часть метрик можно перегнать туда.

Но помните: любой сторонний скрипт получает полный доступ к JSON-данным сессии, включая стоимость и рейт-лимиты. Проверяйте код перед использованием.


See also