🎚️

うちのClaude Codeのstatuslineモエス見てつーか見ろ♪

に公開

Claude Codeのプロンプト部分には、statuslineとして情報を表示することができます。

https://docs.anthropic.com/en/docs/claude-code/statusline

手元のstatuslineの設定が概ね固まったので公開します。

claudeの設定に以下のように記述してスクリプトを呼び出します。このスクリプトの標準出力(の1行目)がstatuslineとして描画されます。

CLAUDE_CONFIG_DIR/settings.json
{
  "statusLine": {
    "type": "command",
    "command": "CLAUDE_CONFIG_DIR/statusline.sh"
  },
  // その他は略…
}

statusline.shを以下の内容で作成し、 chmod +x statusline.shで実行権限をつけます。実行にはjqが必要です。

CLAUDE_CONFIG_DIR/statusline.sh
#!/usr/bin/env bash

# Read JSON input from stdin
input=$(cat)

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

# Get git branch information
GIT_BRANCH=""
if git rev-parse &>/dev/null; then
  BRANCH=$(git branch --show-current)
  if [ -n "$BRANCH" ]; then
    GIT_BRANCH=" |  $BRANCH"
  else
    COMMIT_HASH=$(git rev-parse --short HEAD 2>/dev/null)
    if [ -n "$COMMIT_HASH" ]; then
      GIT_BRANCH=" |  HEAD ($COMMIT_HASH)"
    fi
  fi
fi

# Get token summary
if [ -z "$TRANSCRIPT_PATH" ] || [ ! -f "$TRANSCRIPT_PATH" ]; then
  TOKEN_COUNT="_ tkns. (_%)"
else
  # Get last assistant message with usage data using jq
  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)

  # Default to 0 if no valid result
  total_tokens=${total_tokens:-0}

  # max token count: 200k
  # compaction threshold: 80% (160k)
  COMPACTION_THRESHOLD=160000
  # Calculate percentage
  percentage=$((total_tokens * 100 / COMPACTION_THRESHOLD))

  # Format token display
  if [ "$total_tokens" -ge 1000 ]; then
    thousands=$(echo "scale=1; $total_tokens/1000" | bc)
    token_display=$(printf "%.1fK" "$thousands")
  else
    token_display="$total_tokens"
  fi

  # Color coding for percentage
  if [ "$percentage" -ge 90 ]; then
    color="\033[31m"  # Red
  elif [ "$percentage" -ge 70 ]; then
    color="\033[33m"  # Yellow
  else
    color="\033[32m"  # Green
  fi

  # Format: "123 tkns. (10%)"
  TOKEN_COUNT=$(echo -e "${token_display} tkns. (${color}${percentage}%\033[0m)")
fi

echo "󰚩 ${MODEL_DISPLAY} |  ${CURRENT_DIR##*/}${GIT_BRANCH} |  ${TOKEN_COUNT}"

表示部にはNerd fontsを使用しているのでZennのコードブロックでは表示されていませんが、コピペはできるはずです。フォントが適切に設定されていれば、ターミナルでは以下のように描画されます。


うはwwwテラモエス オレ天才wうぇwww

このスクリプトには引数としてjsonが渡されます。

https://docs.anthropic.com/en/docs/claude-code/statusline#json-input-structure

モデル、ディレクトリ、gitブランチは簡単に取得できますが、トークン数はちょっと処理が必要です。
渡されるjsonのtranscript_pathにあるファイルに会話(というか通信)の各回の情報が記録されているので、それをパースし、トークン数を合計する必要があります。
この辺はシェルスクリプトだと面倒だと思ったのですが、AIさんに聞いたらjqで一気にやる方法を提案してくれて助かりました。

ちなみに、ブランチでなくHEADも表示できるようにしているのは、筆者がdetached headにいることがよくあるためです。詳細は以下の記事にて。

https://zenn.dev/kawarimidoll/articles/94fe6d900ed4d6

参考

以下の記事をめっちゃ参考にしました。大感謝。

https://zenn.dev/makotan/articles/db34bb6860cda5

https://zenn.dev/pnd/articles/claude-code-statusline

タイトルと途中の画像のキャプションの元ネタはこちらのページに乗っていた漫画。Claude Codeとは関係ないです。

http://oekakigakusyuu.blog97.fc2.com/blog-entry-556.html

Discussion