Claude Code ステータスラインのカスタマイズ - トークン使用量と Git 情報を一目で確認

背景

Claude Code を使っていると、トークン使用量が気になりませんか?特に長い会話では、気づいたら要約閾値(155,000 トークン)に達していて、会話履歴が圧縮されてしまうことがあります。

そこで今回は、Claude Code のステータスライン機能をカスタマイズして、トークン使用量をリアルタイムで確認できるようにしてみました。ターミナルのプロンプトのように、インターフェース下部に独自の情報を表示できる便利な機能です。

実装した内容は以下の通りです。使用中のモデル名(Sonnet 4.5 など)、現在のプロジェクト名、Git ブランチ情報、そしてトークン使用量とパーセンテージ(色分け表示)が一目で分かるようになっています。

ステータスライン機能とは

ステータスライン機能は、Claude Code のインターフェース下部に独自の情報を表示する機能です。Oh-my-zsh のようなシェルプロンプトと同様に、カスタムスクリプトで表示内容を自由に設定できます。

会話メッセージが変更されるたびにリアルタイムで更新されます。更新間隔は最大 300ms です。

スクリプトは標準入力から JSON 形式でセッション情報を受け取ります。この JSON には、モデル情報やワークスペース情報、トークン使用量のパスなどが含まれています。

出力には ANSI カラーコードを使えるので、テキストの色やスタイルを自由に変更できます。トークン使用量に応じて色を変えることで、一目で状況が分かるようになります。

実装は Bash、Python、Node.js など、どの言語でも可能です。今回は軽量な Bash スクリプトで実装しました。

設定方法

では、実際に設定していきましょう。

1. settings.json の設定

まず、.claude/settings.json に以下を追加します。

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

type は "command" を指定してスクリプトを実行します。command にはステータスライン生成スクリプトのパスを指定します。padding は上下のパディングで、0 にすると最小化されます。

2. statusline.sh の作成

次に、~/.claude/statusline.sh を作成して、実行権限を付与しておきます。

chmod +x ~/.claude/statusline.sh

実装

それでは、実際のスクリプトを見ていきましょう。

完全なスクリプト

statusline.sh の全体コード
#!/usr/bin/env bash

# Constants
readonly SUMMARY_THRESHOLD=155000
readonly COLOR_RED="\033[31m"
readonly COLOR_YELLOW="\033[33m"
readonly COLOR_GREEN="\033[32m"
readonly COLOR_RESET="\033[0m"

# Read and parse JSON input
readonly INPUT=$(cat)
readonly MODEL_DISPLAY=$(echo "$INPUT" | jq -r '.model.display_name')
readonly CURRENT_DIR=$(echo "$INPUT" | jq -r '.workspace.current_dir')
readonly TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path')

# Get git branch information
get_git_info() {
  git rev-parse &>/dev/null || return

  local branch
  branch=$(git branch --show-current 2>/dev/null)

  if [ -n "$branch" ]; then
    echo " | 🌿 $branch"
  else
    local commit_hash
    commit_hash=$(git rev-parse --short HEAD 2>/dev/null)
    [ -n "$commit_hash" ] && echo " | 🌿 HEAD ($commit_hash)"
  fi
}

# Format token count (1000+ becomes "1.0K")
format_token_count() {
  local tokens=$1
  if [ "$tokens" -ge 1000 ]; then
    printf "%.1fK" "$(echo "scale=1; $tokens/1000" | bc)"
  else
    echo "$tokens"
  fi
}

# Get color based on percentage
get_percentage_color() {
  local percentage=$1
  if [ "$percentage" -ge 90 ]; then
    echo "$COLOR_RED"
  elif [ "$percentage" -ge 70 ]; then
    echo "$COLOR_YELLOW"
  else
    echo "$COLOR_GREEN"
  fi
}

# Get token summary with color-coded percentage
get_token_summary() {
  if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
    echo "_ tkns. (_%)"
    return
  fi

  local total_tokens
  total_tokens=$(tail -n 100 "$TRANSCRIPT_PATH" 2>/dev/null | \
    jq -s 'map(select(.type == "assistant" and .message.usage)) |
      last |
      .message.usage |
      (.input_tokens // 0) +
      (.output_tokens // 0) +
      (.cache_creation_input_tokens // 0) +
      (.cache_read_input_tokens // 0)' 2>/dev/null)

  total_tokens=${total_tokens:-0}

  local percentage=$((total_tokens * 100 / SUMMARY_THRESHOLD))
  local token_display
  token_display=$(format_token_count "$total_tokens")
  local color
  color=$(get_percentage_color "$percentage")

  echo -e "${token_display} tkns. (${color}${percentage}%${COLOR_RESET})"
}

# Main
main() {
  local git_info
  git_info=$(get_git_info)
  local token_count
  token_count=$(get_token_summary)
  echo "🤖 ${MODEL_DISPLAY} | 📁 ${CURRENT_DIR##*/}${git_info} | 📊 ${token_count}"
}

main

スクリプトの解説

1. JSON データの取得

Claude Code は標準入力から以下の JSON データを送信します。

{
  "model": {
    "display_name": "Sonnet 4.5",
    "id": "claude-sonnet-4-5-20250929"
  },
  "workspace": {
    "current_dir": "/path/to/project",
    "project_dir": "/path/to/project"
  },
  "transcript_path": "/path/to/transcript.jsonl",
  "session_id": "...",
  "version": "..."
}

スクリプトは jq コマンドでこれらの情報を抽出します。

readonly INPUT=$(cat)
readonly MODEL_DISPLAY=$(echo "$INPUT" | jq -r '.model.display_name')
readonly CURRENT_DIR=$(echo "$INPUT" | jq -r '.workspace.current_dir')
readonly TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path')

2. Git ブランチ情報の取得

現在のディレクトリが Git リポジトリの場合、ブランチ名を表示します。

get_git_info() {
  git rev-parse &>/dev/null || return

  local branch
  branch=$(git branch --show-current 2>/dev/null)

  if [ -n "$branch" ]; then
    echo " | 🌿 $branch"
  else
    local commit_hash
    commit_hash=$(git rev-parse --short HEAD 2>/dev/null)
    [ -n "$commit_hash" ] && echo " | 🌿 HEAD ($commit_hash)"
  fi
}

3. トークン使用量の取得と色分け

transcript ファイルから最新のトークン使用量を取得し、要約閾値(155,000 トークン)に対するパーセンテージを計算します。

get_token_summary() {
  if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
    echo "_ tkns. (_%)"
    return
  fi

  local total_tokens
  total_tokens=$(tail -n 100 "$TRANSCRIPT_PATH" 2>/dev/null | \
    jq -s 'map(select(.type == "assistant" and .message.usage)) |
      last |
      .message.usage |
      (.input_tokens // 0) +
      (.output_tokens // 0) +
      (.cache_creation_input_tokens // 0) +
      (.cache_read_input_tokens // 0)' 2>/dev/null)

  total_tokens=${total_tokens:-0}

  local percentage=$((total_tokens * 100 / SUMMARY_THRESHOLD))
  local token_display
  token_display=$(format_token_count "$total_tokens")
  local color
  color=$(get_percentage_color "$percentage")

  echo -e "${token_display} tkns. (${color}${percentage}%${COLOR_RESET})"
}

色分けのルールは次のようになります。90% 以上(139,500+ トークン)の場合は赤色で、要約が間近に迫っています。70% 以上(108,500+ トークン)は黄色で、注意が必要な状態です。70% 未満は緑色で、まだ余裕があります。

4. 最終的な出力

すべての情報を組み合わせて、1 行で出力します。

main() {
  local git_info
  git_info=$(get_git_info)
  local token_count
  token_count=$(get_token_summary)
  echo "🤖 ${MODEL_DISPLAY} | 📁 ${CURRENT_DIR##*/}${git_info} | 📊 ${token_count}"
}

表示例

実際のステータスラインは以下のように表示されます。

Claude Code ステータスライン表示例

🤖 Sonnet 4.5 | 📁 KusumotoDailyReport | 🌿 main | 📊 28.2K tkns. (17%)

それぞれの要素を見ていきましょう。

🤖 Sonnet 4.5 は使用中のモデル、📁 KusumotoDailyReport はプロジェクト名(ディレクトリ名)、🌿 main は Git ブランチ、📊 28.2K tkns. (17%) はトークン使用量とパーセンテージ(緑色)を示しています。トークン使用量が色分けされているので、一目で状況が分かります。

ベストプラクティス

1. 簡潔な表示

ステータスラインは 1 行に収め、スキャン可能な情報のみを表示します。

# Good - 簡潔で読みやすい
echo "🤖 ${MODEL} | 📁 ${DIR} | 🌿 ${BRANCH}"

# Bad - 長すぎて読みにくい
echo "Model: ${MODEL}, Project: ${DIR}, Branch: ${BRANCH}, Tokens: ${TOKENS}"

2. 絵文字と色の活用

絵文字と ANSI カラーで視認性を向上させます。

# 色分けでトークン使用量の状態を直感的に把握
echo -e "📊 ${token_display} tkns. (${color}${percentage}%${COLOR_RESET})"

3. エラーハンドリング

Git リポジトリでない場合や transcript ファイルがない場合の処理を忘れずに行います。

# Git リポジトリでない場合は何も表示しない
git rev-parse &>/dev/null || return

# transcript ファイルがない場合はプレースホルダーを表示
if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
  echo "_ tkns. (_%)"
  return
fi

4. テスト

モック JSON データでスクリプトをテストします。

# テスト用 JSON データ
echo '{
  "model": {"display_name": "Sonnet 4.5"},
  "workspace": {"current_dir": "/Users/test/project"},
  "transcript_path": ""
}' | ~/.claude/statusline.sh

利用可能なデータ

Claude Code から提供される JSON データには、以下の情報が含まれます。

{
  model: {
    display_name: string,  // "Sonnet 4.5"
    id: string             // "claude-sonnet-4-5-20250929"
  },
  workspace: {
    current_dir: string,   // "/path/to/project"
    project_dir: string    // "/path/to/project"
  },
  cost: {
    total_cost_usd: number,
    duration: number,
    lines_added: number,
    lines_removed: number
  },
  transcript_path: string, // "/path/to/transcript.jsonl"
  session_id: string,
  version: string,
  output_style: string
}

これらの情報を使って、コスト、作業時間、変更行数なども表示できます。

まとめ

今回は、Claude Code のステータスライン機能をカスタマイズして、トークン使用量を一目で確認できるようにしてみました。

実装したステータスラインには、使用中のモデル、プロジェクト名、Git ブランチ、そしてトークン使用量が表示されます。特にトークン使用量は色分けされているので、要約が実行される前に作業を区切るタイミングが分かりやすくなりました。

実際に使ってみると、トークン使用量を意識しながら作業できるので、とても便利です。~/.claude/statusline.sh を編集すれば、プロジェクトに応じて表示内容を自由にカスタマイズできます。

参考リンク

技術的な詳細

依存パッケージ

このスクリプトは以下のパッケージに依存しています。jq は JSON データの解析に使用し、git は Git ブランチ情報の取得に使用し、bc は浮動小数点演算(トークン表示フォーマット)に使用します。

インストール方法(macOS)は以下の通りです。

brew install jq bc

要約閾値について

Claude Code の要約閾値は 155,000 トークンです。この値の前後で、会話履歴が自動的に要約されます。

Claude Code チームによると、155,000 トークンという値は「コンテンツウィンドウを最大化しつつ、信頼性を最大化し、"context window exceeded" API エラーを回避する」ために、数十回の反復を経て決定されたとのことです。

スクリプトではこの値を基準にパーセンテージを計算しています。

readonly SUMMARY_THRESHOLD=155000
local percentage=$((total_tokens * 100 / SUMMARY_THRESHOLD))

パフォーマンス最適化

transcript ファイルは大きくなる可能性があるため、tail -n 100 で最新の 100 行のみを読み込みます。

total_tokens=$(tail -n 100 "$TRANSCRIPT_PATH" 2>/dev/null | \
  jq -s 'map(select(.type == "assistant" and .message.usage)) | last | ...')

これにより、ファイルサイズに関係なく高速に動作します。