Сделайте Claude Code своим с помощью пользовательской строки состояния, которая отображается в нижней части интерфейса Claude Code, аналогично тому, как работают терминальные подсказки (PS1) в оболочках типа Oh-my-zsh.

Создание пользовательской строки состояния

Вы можете либо:

  • Запустить /statusline, чтобы попросить Claude Code помочь вам настроить пользовательскую строку состояния. По умолчанию он попытается воспроизвести подсказку вашего терминала, но вы можете предоставить дополнительные инструкции о поведении, которое вы хотите от Claude Code, например /statusline показать имя модели оранжевым цветом

  • Напрямую добавить команду statusLine в ваш .claude/settings.json:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // Опционально: установите 0, чтобы строка состояния доходила до края
  }
}

Как это работает

  • Строка состояния обновляется при обновлении сообщений разговора
  • Обновления выполняются не чаще чем каждые 300мс
  • Первая строка stdout из вашей команды становится текстом строки состояния
  • ANSI цветовые коды поддерживаются для стилизации вашей строки состояния
  • Claude Code передает контекстную информацию о текущей сессии (модель, директории и т.д.) в виде JSON в ваш скрипт через stdin

Структура JSON входных данных

Ваша команда строки состояния получает структурированные данные через stdin в формате JSON:

{
  "hook_event_name": "Status",
  "session_id": "abc123...",
  "transcript_path": "/path/to/transcript.json",
  "cwd": "/current/working/directory",
  "model": {
    "id": "claude-opus-4-1",
    "display_name": "Opus"
  },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory"
  }
}

Примеры скриптов

Простая строка состояния

#!/bin/bash
# Читаем JSON входные данные из stdin
input=$(cat)

# Извлекаем значения используя jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}"

Строка состояния с поддержкой Git

#!/bin/bash
# Читаем JSON входные данные из stdin
input=$(cat)

# Извлекаем значения используя jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# Показываем git ветку если находимся в git репозитории
GIT_BRANCH=""
if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    if [ -n "$BRANCH" ]; then
        GIT_BRANCH=" | 🌿 $BRANCH"
    fi
fi

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}$GIT_BRANCH"

Пример на Python

#!/usr/bin/env python3
import json
import sys
import os

# Читаем JSON из stdin
data = json.load(sys.stdin)

# Извлекаем значения
model = data['model']['display_name']
current_dir = os.path.basename(data['workspace']['current_dir'])

# Проверяем git ветку
git_branch = ""
if os.path.exists('.git'):
    try:
        with open('.git/HEAD', 'r') as f:
            ref = f.read().strip()
            if ref.startswith('ref: refs/heads/'):
                git_branch = f" | 🌿 {ref.replace('ref: refs/heads/', '')}"
    except:
        pass

print(f"[{model}] 📁 {current_dir}{git_branch}")

Пример на Node.js

#!/usr/bin/env node

const fs = require('fs');
const path = require('path');

// Читаем JSON из stdin
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // Извлекаем значения
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // Проверяем git ветку
    let gitBranch = '';
    try {
        const headContent = fs.readFileSync('.git/HEAD', 'utf8').trim();
        if (headContent.startsWith('ref: refs/heads/')) {
            gitBranch = ` | 🌿 ${headContent.replace('ref: refs/heads/', '')}`;
        }
    } catch (e) {
        // Не git репозиторий или не можем прочитать HEAD
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

Подход с вспомогательными функциями

Для более сложных bash скриптов вы можете создать вспомогательные функции:

#!/bin/bash
# Читаем JSON входные данные один раз
input=$(cat)

# Вспомогательные функции для общих извлечений
get_model_name() { echo "$input" | jq -r '.model.display_name'; }
get_current_dir() { echo "$input" | jq -r '.workspace.current_dir'; }
get_project_dir() { echo "$input" | jq -r '.workspace.project_dir'; }
get_version() { echo "$input" | jq -r '.version'; }

# Используем помощники
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

Советы

  • Держите вашу строку состояния краткой - она должна помещаться на одной строке
  • Используйте эмодзи (если ваш терминал их поддерживает) и цвета, чтобы сделать информацию легко сканируемой
  • Используйте jq для парсинга JSON в Bash (см. примеры выше)
  • Тестируйте ваш скрипт, запуская его вручную с фиктивными JSON входными данными: echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • Рассмотрите кэширование дорогих операций (таких как git status) при необходимости

Устранение неполадок

  • Если ваша строка состояния не появляется, проверьте, что ваш скрипт исполняемый (chmod +x)
  • Убедитесь, что ваш скрипт выводит в stdout (не stderr)