Claude Code 인터페이스 하단에 표시되는 사용자 정의 상태 표시줄로 Claude Code를 자신만의 것으로 만들어보세요. 이는 Oh-my-zsh와 같은 셸에서 터미널 프롬프트(PS1)가 작동하는 방식과 유사합니다.

사용자 정의 상태 표시줄 만들기

다음 중 하나를 선택할 수 있습니다:

  • /statusline을 실행하여 Claude Code가 사용자 정의 상태 표시줄 설정을 도와달라고 요청하세요. 기본적으로 터미널의 프롬프트를 재현하려고 시도하지만, /statusline show the model name in orange와 같이 Claude Code에 원하는 동작에 대한 추가 지침을 제공할 수 있습니다.

  • .claude/settings.json에 직접 statusLine 명령을 추가하세요:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // 선택사항: 상태 표시줄이 가장자리까지 가도록 0으로 설정
  }
}

작동 방식

  • 상태 표시줄은 대화 메시지가 업데이트될 때 업데이트됩니다
  • 업데이트는 최대 300ms마다 실행됩니다
  • 명령의 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"
  },
  "version": "1.0.80",
  "output_style": {
    "name": "default"
  },
  "cost": {
    "total_cost_usd": 0.01234,
    "total_duration_ms": 45000,
    "total_api_duration_ms": 2300,
    "total_lines_added": 156,
    "total_lines_removed": 23
  }
}

예제 스크립트

간단한 상태 표시줄

#!/bin/bash
# stdin에서 JSON 입력 읽기
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
# stdin에서 JSON 입력 읽기
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

# stdin에서 JSON 읽기
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');

// stdin에서 JSON 읽기
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'; }
get_cost() { echo "$input" | jq -r '.cost.total_cost_usd'; }
get_duration() { echo "$input" | jq -r '.cost.total_duration_ms'; }
get_lines_added() { echo "$input" | jq -r '.cost.total_lines_added'; }
get_lines_removed() { echo "$input" | jq -r '.cost.total_lines_removed'; }

# 헬퍼 사용
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

  • 상태 표시줄을 간결하게 유지하세요 - 한 줄에 맞아야 합니다
  • 정보를 스캔하기 쉽게 만들기 위해 이모지(터미널이 지원하는 경우)와 색상을 사용하세요
  • Bash에서 JSON 파싱을 위해 jq를 사용하세요 (위 예제 참조)
  • 모의 JSON 입력으로 스크립트를 수동으로 실행하여 테스트하세요: echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • 필요한 경우 비용이 많이 드는 작업(git status 등)을 캐싱하는 것을 고려하세요

문제 해결

  • 상태 표시줄이 나타나지 않으면 스크립트가 실행 가능한지 확인하세요 (chmod +x)
  • 스크립트가 stdout으로 출력하는지 확인하세요 (stderr이 아닌)