Skip to content

Claude Code Status Line으로 컨텍스트와 비용을 한눈에 확인하기

Published:

Claude Code로 긴 작업을 하다 보면 신경 쓰이는 게 생깁니다. 컨텍스트 창이 얼마나 찼는지, 비용이 얼마나 나왔는지, 커밋 안 한 변경사항은 없는지. Status line은 이런 정보를 화면 하단에 고정으로 노출하는 기능입니다.

Status line이란

Claude Code 하단에 표시되는 커스터마이징 가능한 상태바입니다. 설정한 셸 스크립트를 실행하고 그 출력을 그대로 보여줍니다. Claude Code는 각 어시스턴트 응답 후 JSON 형태의 세션 데이터를 스크립트의 stdin으로 전달하고, 스크립트가 stdout에 출력한 내용이 화면에 나타납니다.

핵심은 스크립트가 로컬에서 실행된다는 점입니다. API 호출이 없으므로 토큰을 소비하지 않습니다.

사용 가능한 데이터

스크립트가 받는 JSON에는 다음 필드가 포함됩니다.

필드내용
model.id모델 ID (예: claude-sonnet-4-6)
model.display_name모델 표시명 (예: Sonnet)
workspace.current_dir현재 작업 디렉토리
workspace.project_dirClaude 실행 시작 디렉토리
context_window.used_percentage컨텍스트 창 사용률 (%)
context_window.remaining_percentage컨텍스트 창 잔여 비율 (%)
context_window.context_window_size최대 컨텍스트 크기 (토큰)
context_window.total_input_tokens세션 누적 input 토큰 수
context_window.total_output_tokens세션 누적 output 토큰 수
cost.total_cost_usd세션 누적 비용 (USD)
cost.total_duration_ms세션 경과 시간 (밀리초)
cost.total_api_duration_msAPI 응답 대기 시간 합산 (밀리초)
cost.total_lines_added세션 중 추가된 코드 라인 수
cost.total_lines_removed세션 중 삭제된 코드 라인 수
exceeds_200k_tokens최근 응답 기준 200k 토큰 초과 여부 (boolean)
vim.modevim 모드 활성화 시 현재 모드 (NORMAL/INSERT)

전체 필드 목록은 공식 문서에서 확인할 수 있습니다.

컨텍스트 퍼센트는 context_window.current_usage의 input 토큰 합산으로 계산됩니다. output 토큰은 포함되지 않습니다.

설정 방법

/statusline 명령어 사용

Claude Code에서 자연어로 원하는 내용을 설명하면 스크립트를 자동 생성하고 settings.json도 업데이트해줍니다.

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

단, 이 방식은 Claude가 자연어를 해석하고 코드를 작성하는 과정이므로 토큰이 소비됩니다. 일회성 설정 비용입니다.

수동 설정

스크립트를 직접 작성하고 ~/.claude/settings.json에 등록하면 토큰 없이 동일한 결과를 얻을 수 있습니다.

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

command 필드에는 스크립트 경로 대신 인라인 셸 명령도 사용할 수 있습니다.

{
  "statusLine": {
    "type": "command",
    "command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)%\"'"
  }
}

스크립트 작성

다음 스크립트는 두 줄로 구성됩니다. 첫 번째 줄에 모델명, 폴더명, git 상태를, 두 번째 줄에 컨텍스트 프로그레스 바와 비용 정보를 표시합니다.

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

GREEN='\033[32m'
YELLOW='\033[33m'
CYAN='\033[36m'
MAGENTA='\033[35m'
RED='\033[31m'
BOLD='\033[1m'
RESET='\033[0m'

MODEL=$(echo "$input" | jq -r '.model.display_name')
DIR=$(echo "$input" | jq -r '.workspace.current_dir')
FOLDER="${DIR##*/}"

GIT_INFO=""
if git -C "$DIR" rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
    STAGED=$(git -C "$DIR" diff --cached --numstat 2>/dev/null | wc -l | tr -d ' ')
    MODIFIED=$(git -C "$DIR" diff --numstat 2>/dev/null | wc -l | tr -d ' ')

    GIT_PART="${CYAN}${BRANCH}${RESET}"
    [ "$STAGED" -gt 0 ] && GIT_PART="${GIT_PART} ${GREEN}+${STAGED}${RESET}"
    [ "$MODIFIED" -gt 0 ] && GIT_PART="${GIT_PART} ${YELLOW}~${MODIFIED}${RESET}"
    GIT_INFO=" | ${GIT_PART}"
fi

echo -e "${BOLD}[${MODEL}]${RESET} ${FOLDER}${GIT_INFO}"

PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
COST=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
DURATION_MS=$(echo "$input" | jq -r '.cost.total_duration_ms // 0' | cut -d. -f1)
LINES_ADDED=$(echo "$input" | jq -r '.cost.total_lines_added // 0')
LINES_REMOVED=$(echo "$input" | jq -r '.cost.total_lines_removed // 0')

BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && BAR=$(printf "%${FILLED}s" | tr ' ' '▓')
[ "$EMPTY" -gt 0 ] && BAR="${BAR}$(printf "%${EMPTY}s" | tr ' ' '░')"

if [ "$PCT" -ge 80 ]; then
    BAR_COLOR="$RED"
elif [ "$PCT" -ge 50 ]; then
    BAR_COLOR="$YELLOW"
else
    BAR_COLOR="$GREEN"
fi

DURATION_SEC=$((DURATION_MS / 1000))
if [ "$DURATION_SEC" -ge 3600 ]; then
    DURATION_STR=$(printf "%dh%02dm" $((DURATION_SEC/3600)) $(((DURATION_SEC%3600)/60)))
elif [ "$DURATION_SEC" -ge 60 ]; then
    DURATION_STR=$(printf "%dm%02ds" $((DURATION_SEC/60)) $((DURATION_SEC%60)))
else
    DURATION_STR="${DURATION_SEC}s"
fi

COST_STR=$(printf "\$%.4f" "$COST")

echo -e "${BAR_COLOR}${BAR}${RESET} ${PCT}% | ${MAGENTA}${COST_STR}${RESET} | ${DURATION_STR} | ${GREEN}+${LINES_ADDED}${RESET} ${RED}-${LINES_REMOVED}${RESET}"

스크립트를 저장한 뒤 실행 권한을 부여합니다.

chmod +x ~/.claude/statusline.sh

결과는 다음과 같은 형태입니다.

[Sonnet] hojinlee | main ~2
▓░░░░░░░░░ 12% | $0.0234 | 2m05s | +42 -7

컨텍스트 프로그레스 바는 50% 미만이면 초록, 50~80%는 노랑, 80% 이상이면 빨강으로 색이 바뀝니다.

주의할 점

jq가 설치되어 있어야 합니다. 없다면 먼저 설치합니다.

brew install jq

context_window.used_percentage는 세션 초반 첫 API 호출 전에는 null일 수 있습니다. // 0 fallback을 항상 붙이는 이유입니다.

참고 문서