1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Codeのstatuslineを拡張してコンテキスト使用量をプログレスバー表示する

Posted at

はじめに

Claude Codeには、ターミナル下部にステータス情報を表示するstatusline機能があります。デフォルトでは基本的な情報のみ表示されますが、カスタムスクリプトで自由に拡張できます。

この記事では、公式のstatusline機能を拡張して、以下の情報を表示する方法を紹介します:

  • モデル名
  • カレントディレクトリ
  • Gitブランチ
  • コンテキスト使用量(プログレスバー表示)

statuslineの仕組み

Claude Codeのstatuslineは、指定したスクリプトにJSON形式でセッション情報を渡し、スクリプトの標準出力の1行目をステータスバーに表示します。

設定方法

  1. スクリプトを~/.claude/statusline.shに配置します
  2. 実行権限を付与します:chmod +x ~/.claude/statusline.sh
  3. ~/.claude/settings.jsonに以下を追加します:
{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

渡されるJSON情報

スクリプトには以下のような情報が渡されます:

  • model.display_name - モデル名
  • workspace.current_dir - カレントディレクトリ
  • session_id - セッションID
  • cost.total_cost_usd - 累計コスト

コンテキスト使用量の取得方法

ここがポイントです。Claude Codeは各セッションのログを~/.claude/projects/配下にJSONL形式で保存しています。

~/.claude/projects/-Users-username-work-project/セッションID.jsonl

このJSONLファイルには各APIコールのusage情報が含まれており、ここからトークン使用量を取得できます:

{
  "message": {
    "usage": {
      "input_tokens": 3,
      "cache_creation_input_tokens": 383,
      "cache_read_input_tokens": 33724,
      "output_tokens": 161
    }
  }
}

実装

以下が拡張したstatuslineスクリプトです:

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

MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')
SESSION_ID=$(echo "$input" | jq -r '.session_id')

# セッションIDからJSONLファイルのパスを構築
DIR_ENCODED=$(echo "$CURRENT_DIR" | sed 's/\//-/g')
JSONL_PATH=~/.claude/projects/${DIR_ENCODED}/${SESSION_ID}.jsonl

TOKENS="N/A"
if [ -f "$JSONL_PATH" ]; then
    # 最新のAPIコールの入力トークン(現在のコンテキスト使用量)
    LAST_USAGE=$(grep '"usage"' "$JSONL_PATH" | tail -1 | jq -r '.message.usage // empty')
    if [ -n "$LAST_USAGE" ]; then
        INPUT=$(echo "$LAST_USAGE" | jq -r '.input_tokens + .cache_read_input_tokens + .cache_creation_input_tokens')
        LIMIT=200000

        # バー表示を生成(20メモリ)
        PERCENT=$((INPUT * 100 / LIMIT))
        FILLED=$((INPUT * 20 / LIMIT))
        [ $FILLED -gt 20 ] && FILLED=20
        EMPTY=$((20 - FILLED))

        BAR=$(printf '█%.0s' $(seq 1 $FILLED 2>/dev/null))
        BAR+=$(printf '░%.0s' $(seq 1 $EMPTY 2>/dev/null))

        TOKENS="[${BAR}] ${PERCENT}%"
    fi
fi

# Git branch
GIT_BRANCH=""
if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    [ -n "$BRANCH" ] && GIT_BRANCH=" | 🌿 $BRANCH"
fi

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

表示例

[Claude Sonnet 4.5] 📁 my-project | 🌿 main | [████████░░░░░░░░░░░░] 40%

解説

コンテキスト使用量の計算

入力トークンは以下の3つの合計です:

  • input_tokens - 実際の入力トークン
  • cache_creation_input_tokens - キャッシュ作成時のトークン
  • cache_read_input_tokens - キャッシュ読み込み時のトークン

プログレスバーの生成

20文字のバーを生成し、使用率に応じてで表現しています。Claude Sonnet 4.5のコンテキストウィンドウは200,000トークンなので、これを上限としています。

なぜ最新のusageだけを見るのか

各APIコールで渡される入力トークン数は、その時点でのコンテキスト全体を表しています。累計ではなく、最新の値が現在のコンテキスト使用量となります。

注意点

  • jqコマンドが必要です
  • statuslineは最大300msごとに更新されます
  • 他のモデル(OpusやHaiku)を使う場合はLIMITの値を調整してください

参考

まとめ

Claude Codeのstatusline機能を拡張することで、コンテキストの使用状況をリアルタイムで把握できるようになりました。長い会話でコンテキスト上限に近づいているかどうかを視覚的に確認できるので、適切なタイミングで新しいセッションを開始する判断に役立ちます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?