はじめに
「あれ、今どのブランチで作業してたっけ?」「コンテキストってあとどれくらい残ってる?」「今日のAPI使用量、大丈夫かな?」
Claude Codeで開発しているとき、こうした疑問が頭をよぎるたびにコマンドを叩いて確認するのは、地味にストレスです。実は、Claude Codeにはこれらの情報を常時表示できるステータスライン機能があります。
ステータスラインは、Claude CodeのTUI(ターミナルUI)最下部に表示される情報バーです。モデル名、コンテキスト使用率、セッションコスト、Gitブランチ、レート制限など、開発中に気になる情報がひと目でわかります。しかもステータスラインの表示にはトークンが消費されません。会話のコンテキストとは独立した仕組みなので、情報を表示しっぱなしにしてもコストに影響しません。
仕組み
ステータスラインの仕組みはシンプルです。Claude Codeがセッション情報をJSON形式で標準入力(stdin)に送信し、指定されたスクリプトがそれを受け取って加工し、標準出力(stdout)に出力した内容がそのまま表示されます。
Claude Code → JSON (stdin) → スクリプト → テキスト (stdout) → ステータスライン表示
複数行のechoで複数行表示ができ、ANSIカラーコードにも対応しています。スクリプトはアシスタントメッセージの受信後、パーミッションモード変更時、vimモードのトグル時に実行され、300msのデバウンスが適用されます。
利用可能なデータフィールド一覧
stdinで受け取るJSONには、以下のフィールドが含まれます。カスタマイズの際の辞書として活用してください。
モデル・ワークスペース
| フィールド | 説明 | 備考 |
|---|---|---|
model.display_name |
モデル表示名 | |
model.id |
モデルID | |
workspace.current_dir |
現在のディレクトリ |
cwdでも取得可 |
workspace.project_dir |
起動ディレクトリ |
コンテキストウィンドウ
| フィールド | 説明 | 備考 |
|---|---|---|
context_window.used_percentage |
使用率% | 初回API応答前はnullの可能性 |
context_window.remaining_percentage |
残り% | |
context_window.context_window_size |
最大サイズ | 200K or 1M |
context_window.total_input_tokens |
累計入力トークン | |
context_window.total_output_tokens |
累計出力トークン |
コスト・アクティビティ
| フィールド | 説明 | 備考 |
|---|---|---|
cost.total_cost_usd |
セッション累計コスト | |
cost.total_duration_ms |
総経過時間(ms) | |
cost.total_api_duration_ms |
API応答待ち時間(ms) | |
cost.total_lines_added |
追加行数 | |
cost.total_lines_removed |
削除行数 |
レート制限
Claude.aiサブスクリプション(Pro/Max)限定のフィールドです。初回API応答後に出現します。
| フィールド | 説明 | 備考 |
|---|---|---|
rate_limits.five_hour.used_percentage |
5時間使用率 | v2.1.80で追加 |
rate_limits.seven_day.used_percentage |
7日間使用率 | |
rate_limits.*.resets_at |
リセット時刻 | Unix epoch秒 |
Vim・エージェント・Worktree
| フィールド | 説明 | 備考 |
|---|---|---|
vim.mode |
NORMAL/INSERT等 | vimモード有効時のみ |
agent.name |
エージェント名 | --agent使用時のみ |
worktree.name |
worktree名 | worktree使用時のみ |
worktree.branch |
worktreeブランチ | |
worktree.original_branch |
元のブランチ |
その他
| フィールド | 説明 | 備考 |
|---|---|---|
session_id |
セッションID | |
exceeds_200k_tokens |
200K超過フラグ |
始め方:3つのアプローチ
手軽な方法から順に紹介します。
1. /statuslineコマンド(最速セットアップ)
最も簡単なのは、Claude Codeのチャット欄に/statuslineコマンドを入力する方法です。
/statusline Gitブランチと現在時刻を表示
これだけで、Claude Codeがユーザーの.bashrcや.zshrcを読み取り、環境に合わせたステータスラインスクリプトを自動生成・設定してくれます。「まず動くものを見たい」という方には最適な入り口です。
ただし、LLMの応答に依存するため、生成結果が毎回同じとは限りません。より細かい制御が必要になったら、次のアプローチに進みましょう。
2. インラインjqワンライナー(ファイル不要)
スクリプトファイルを作らず、settings.jsonに直接jqコマンドを書く方法です。
{
"statusLine": {
"type": "command",
"command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0 | floor)% context\"'"
}
}
これで [Opus 4.6] 42% context のような表示になります。ファイル作成が不要なので手軽ですが、JSONのエスケープが多重になり可読性は低くなります。「ちょっと試してみたい」段階では便利です。
3. 外部スクリプト(推奨)
本格的にカスタマイズするなら、外部スクリプトファイルを使います。
まず~/.claude/statusline.shを作成します。
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
pct_int="${pct%.*}"
echo "${model} · ${pct_int}%"
次に~/.claude/settings.jsonに設定を追加します。
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh",
"padding": 1
}
}
最後に、忘れずに実行権限を付与してください。
chmod +x ~/.claude/statusline.sh
外部スクリプトにする利点は、普通のbashスクリプトとして編集・デバッグできること、パイプで単体テストができること(echo '{"model":{"display_name":"Test"}}' | ~/.claude/statusline.sh)、そしてバージョン管理しやすいことです。
実践カスタマイズ:厳選6パターン
シンプルなものから順に並べているので、自分の好みに合うものを見つけてください。
パターン1: ミニマリスト(6行で完結)
何も足さない、何も引かない。モデル名とコンテキスト%だけの究極のシンプル設定です。
表示例
Opus 4.6 · 42%
コード
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
pct_int="${pct%.*}"
echo "${model} · ${pct_int}%"
たった6行で完結します。中黒(·)で区切るだけの美学。邪魔をしないステータスラインが欲しい方に。
パターン2: コンテキスト使用率バー(入門向け)
ブロック文字でコンテキスト使用率を視覚化する、ステータスライン入門に最適なパターンです。
表示例
[Opus 4.6] ▓▓▓▓░░░░░░ 42%
[Opus 4.6] ▓▓▓▓▓▓▓▓░░ 87%
コード
#!/bin/bash
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
PCT=$(echo "$input" | jq -r '.context_window.used_percentage // 0' | cut -d. -f1)
BAR_WIDTH=10
FILLED=$((PCT * BAR_WIDTH / 100))
EMPTY=$((BAR_WIDTH - FILLED))
BAR=""
[ "$FILLED" -gt 0 ] && printf -v FILL "%${FILLED}s" && BAR="${FILL// /▓}"
[ "$EMPTY" -gt 0 ] && printf -v PAD "%${EMPTY}s" && BAR="${BAR}${PAD// /░}"
echo "[$MODEL] $BAR $PCT%"
printf -vでスペースを生成し、${var// /▓}で一括置換するテクニックを使っています。cut -d. -f1で小数点以下を切り捨てることでシンプルな表示になります。
パターン3: Gitステータス(色付き)
ブランチ名に加えて、ステージ済み・変更ファイル数を色付きで表示します。
表示例
[Opus 4.6] my-project | main (変更なしの場合)
[Opus 4.6] my-project | main 【緑】+3【黄】~5 (staged=3, modified=5の場合)
[Sonnet 4.6] tmp (非Gitディレクトリ)
コード
#!/bin/bash
input=$(cat)
MODEL=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
DIR=$(echo "$input" | jq -r '.workspace.current_dir // ""')
GREEN='\033[32m'
YELLOW='\033[33m'
RESET='\033[0m'
if [ -n "$DIR" ] && 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_STATUS=""
[ "$STAGED" -gt 0 ] && GIT_STATUS="${GREEN}+${STAGED}${RESET}"
[ "$MODIFIED" -gt 0 ] && GIT_STATUS="${GIT_STATUS}${YELLOW}~${MODIFIED}${RESET}"
echo -e "[$MODEL] ${DIR##*/} | $BRANCH $GIT_STATUS"
else
echo "[$MODEL] ${DIR##*/}"
fi
git -C "$DIR"でワークスペースのディレクトリに対してgit操作を実行しています。${DIR##*/}はbasenameコマンドと同等の処理を外部コマンドなしで実現するテクニックです。非Gitディレクトリでは自動的にフォールバック表示になります。
パターン4: 2行フル機能(おすすめ構成)
1行目にプロジェクト情報、2行目にメトリクスを分離した見やすい2行レイアウトです。ドット(●○)のプログレスバーと、レート制限の閾値色分けを組み合わせています。
表示例
Opus 4.6 ▸ obsidian ⎇ main
【緑】●●●●●○○○○○【リセット】 56% ▸ 5h: 【緑】23%【リセット】 ▸ 7d: 【緑】8%【リセット】 ▸ $0.42
高使用率時は色が変わります。
Opus 4.6 ▸ obsidian ⎇ main
【黄】●●●●●●●●○○【リセット】 85% ▸ 5h: 【黄】75%【リセット】 ▸ 7d: 【赤】92%【リセット】 ▸ $1.23
コード
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
context_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
workspace=$(echo "$input" | jq -r '.workspace.current_dir // ""')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
rate_5h=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty' 2>/dev/null || echo "")
rate_7d=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty' 2>/dev/null || echo "")
ws_name="--"
[[ -n "$workspace" ]] && ws_name=$(basename "$workspace")
branch=$(git -C "$workspace" branch --show-current 2>/dev/null || echo "--")
branch="${branch:-"--"}"
color_for_pct() {
local pct="$1"
[[ -z "$pct" || "$pct" == "null" ]] && { echo "\033[0m"; return; }
local int_pct="${pct%.*}"
if (( int_pct >= 90 )); then echo "\033[31m"
elif (( int_pct >= 70 )); then echo "\033[33m"
else echo "\033[32m"; fi
}
RESET="\033[0m"
context_int="${context_pct%.*}"
filled=$(( context_int / 10 )); empty=$(( 10 - filled ))
bar=""
for (( i=0; i<filled; i++ )); do bar+="●"; done
for (( i=0; i<empty; i++ )); do bar+="○"; done
context_color=$(color_for_pct "$context_int")
if [[ -n "$rate_5h" && "$rate_5h" != "null" ]]; then
rate_5h_int="${rate_5h%.*}"; rate_5h_color=$(color_for_pct "$rate_5h_int")
rate_5h_display="${rate_5h_color}${rate_5h_int}%${RESET}"
else rate_5h_display="--"; fi
if [[ -n "$rate_7d" && "$rate_7d" != "null" ]]; then
rate_7d_int="${rate_7d%.*}"; rate_7d_color=$(color_for_pct "$rate_7d_int")
rate_7d_display="${rate_7d_color}${rate_7d_int}%${RESET}"
else rate_7d_display="--"; fi
cost_display=$(printf '$%.2f' "$cost")
echo -e "${model} ▸ ${ws_name} ⎇ ${branch}"
echo -e "${context_color}${bar}${RESET} ${context_int}% ▸ 5h: ${rate_5h_display} ▸ 7d: ${rate_7d_display} ▸ ${cost_display}"
各メトリクス(コンテキスト、5h、7d)が独立して緑→黄→赤に色変化します。Unicode記号(▸ ⎇)を使うことで、絵文字に頼らないクリーンなデザインになっています。ドット(●○)はどのフォントでも安定して表示されます。
パターン5: 条件付き警告(プログレッシブ・ディスクロージャー)
普段はミニマル表示で、メトリクスが閾値を超えた場合のみ警告行が追加される「プログレッシブ・ディスクロージャー」パターンです。
通常時の表示例
Opus 4.6 · 42%
高使用率時の表示例
Opus 4.6 · 87%
【黄】⚠ Context 87% - 圧縮が近いです【リセット】
【赤】⚠ Rate 7d: 92% - レート制限に注意【リセット】
コード
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
context_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
rate_5h=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty' 2>/dev/null || echo "")
rate_7d=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty' 2>/dev/null || echo "")
RESET="\033[0m"; YELLOW="\033[33m"; RED="\033[31m"
context_int="${context_pct%.*}"
echo -e "${model} · ${context_int}%"
if (( context_int >= 70 )); then
if (( context_int >= 90 )); then color="$RED"; else color="$YELLOW"; fi
echo -e "${color}⚠ Context ${context_int}% - 圧縮が近いです${RESET}"
fi
rate_warn=""
if [[ -n "$rate_5h" && "$rate_5h" != "null" ]]; then
rate_5h_int="${rate_5h%.*}"
(( rate_5h_int >= 80 )) && rate_warn="5h: ${rate_5h_int}%"
fi
if [[ -n "$rate_7d" && "$rate_7d" != "null" ]]; then
rate_7d_int="${rate_7d%.*}"
if (( rate_7d_int >= 80 )); then
# 5hに続いて7dも警告する場合、区切りスペースを挿入
[[ -n "$rate_warn" ]] && rate_warn+=" " || true
rate_warn+="7d: ${rate_7d_int}%"
fi
fi
[[ -n "$rate_warn" ]] && echo -e "${RED}⚠ Rate ${rate_warn} - レート制限に注意${RESET}"
cost_int="${cost%.*}"; cost_int="${cost_int:-0}"
if (( cost_int >= 5 )); then
cost_display=$(printf '$%.2f' "$cost")
echo -e "${YELLOW}⚠ Cost: ${cost_display} - コスト確認推奨${RESET}"
fi
通常時はパターン1と同じミニマル表示なので視界の邪魔になりません。問題がある時だけ情報量が増えるため、「何か起きたら気づける」安心感と「普段は静か」な快適さを両立できます。閾値はコンテキスト70%、レート80%、コスト$5で、スクリプト内の数値を変えるだけで調整できます。
パターン6: catppuccin-mocha配色版(テーマ統一)
ターミナルテーマのcatppuccin-mochaカラーパレットに合わせた設定です。24bitカラー(truecolor)を使い、テーマとの統一感を出します。
表示例
【Lavender】Opus 4.6【リセット】 ▸ my-project ⎇ 【Teal】main【リセット】
【Green】████░░░░░░【リセット】 42% ▸ 5h: 【Teal】23%【リセット】 ▸ 7d: 【Sky】8%【リセット】 ▸ 【Peach】$0.42【リセット】
コード
#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name // "Unknown"')
context_pct=$(echo "$input" | jq -r '.context_window.used_percentage // 0')
workspace=$(echo "$input" | jq -r '.workspace.current_dir // ""')
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // 0')
rate_5h=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty' 2>/dev/null || echo "")
rate_7d=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty' 2>/dev/null || echo "")
# Catppuccin Mocha palette (truecolor)
LAVENDER="\033[38;2;180;190;254m"
SUBTEXT0="\033[38;2;166;173;200m"
GREEN="\033[38;2;166;227;161m"
YELLOW="\033[38;2;249;226;175m"
RED="\033[38;2;243;139;168m"
PEACH="\033[38;2;250;179;135m"
TEAL="\033[38;2;148;226;213m"
SKY="\033[38;2;137;220;235m"
TEXT="\033[38;2;205;214;244m"
RESET="\033[0m"
ws_name="--"
[[ -n "$workspace" ]] && ws_name=$(basename "$workspace")
branch=$(git -C "$workspace" branch --show-current 2>/dev/null || echo "--")
branch="${branch:-"--"}"
context_int="${context_pct%.*}"
if (( context_int >= 90 )); then BAR_COLOR="$RED"
elif (( context_int >= 70 )); then BAR_COLOR="$YELLOW"
else BAR_COLOR="$GREEN"; fi
filled=$(( context_int / 10 )); empty_count=$(( 10 - filled ))
bar=""
for (( i=0; i<filled; i++ )); do bar+="█"; done
for (( i=0; i<empty_count; i++ )); do bar+="░"; done
if [[ -n "$rate_5h" && "$rate_5h" != "null" ]]; then
rate_5h_int="${rate_5h%.*}"
if (( rate_5h_int >= 90 )); then r5c="$RED"; elif (( rate_5h_int >= 70 )); then r5c="$YELLOW"; else r5c="$TEAL"; fi
rate_5h_display="${r5c}${rate_5h_int}%${RESET}"
else rate_5h_display="${SUBTEXT0}--${RESET}"; fi
if [[ -n "$rate_7d" && "$rate_7d" != "null" ]]; then
rate_7d_int="${rate_7d%.*}"
if (( rate_7d_int >= 90 )); then r7c="$RED"; elif (( rate_7d_int >= 70 )); then r7c="$YELLOW"; else r7c="$SKY"; fi
rate_7d_display="${r7c}${rate_7d_int}%${RESET}"
else rate_7d_display="${SUBTEXT0}--${RESET}"; fi
cost_display=$(printf '$%.2f' "$cost")
echo -e "${LAVENDER}${model}${RESET} ${SUBTEXT0}▸${RESET} ${TEXT}${ws_name}${RESET} ${SUBTEXT0}⎇${RESET} ${TEAL}${branch}${RESET}"
echo -e "${BAR_COLOR}${bar}${RESET} ${TEXT}${context_int}%${RESET} ${SUBTEXT0}▸${RESET} 5h: ${rate_5h_display} ${SUBTEXT0}▸${RESET} 7d: ${rate_7d_display} ${SUBTEXT0}▸${RESET} ${PEACH}${cost_display}${RESET}"
\033[38;2;R;G;Bm形式で24bitカラーを指定しています。catppuccin-mochaの公式パレットから、Lavender(モデル名)、Teal(ブランチ)、Peach(コスト)と、情報の種類ごとに色を割り当てることで、自然な視覚的階層が生まれます。truecolor対応ターミナル(Ghostty, iTerm2, Kitty, WezTerm等)が必要です。
テクニック集
パターンをさらにカスタマイズする際に役立つテクニックです。
null安全なjqの書き方
Claude Code起動直後は多くのフィールドがnullになります。jqの代替演算子(//)を使ってフォールバックを設定しましょう。
| 書き方 | 用途 | 動作 |
|---|---|---|
// 0 |
数値フィールド | nullの場合に0を返す |
// empty |
文字列フィールド | nullの場合に何も出力しない |
// "Unknown" |
表示名 | nullの場合にフォールバック文字列を返す |
rate_limitsのように親オブジェクトごとnullになる可能性があるフィールドでは、jqの// emptyだけでは不十分な場合があります。2>/dev/null || echo ""で二重にガードすると安全です。
rate_5h=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty' 2>/dev/null || echo "")
ANSIカラーコードの基礎と閾値色分け
ANSIカラーは\033[NNm形式で指定します。ステータスラインでよく使う色を挙げます。
| コード | 色 | 用途の例 |
|---|---|---|
\033[31m |
赤 | 危険(90%以上) |
\033[32m |
緑 | 正常(70%未満) |
\033[33m |
黄 | 警告(70-89%) |
\033[36m |
シアン | 情報(時間、セッション) |
\033[0m |
リセット | 色の終了(必須) |
リセット忘れに注意してください。\033[0mを入れないと後続テキストすべてに色が漏れます。ステータスラインの場合、ターミナル全体の表示に影響する可能性があります。
閾値による色分けは、以下のパターンが汎用的です。
color_for_pct() {
local int_pct="${1%.*}"
if (( int_pct >= 90 )); then echo "\033[31m" # 赤
elif (( int_pct >= 70 )); then echo "\033[33m" # 黄
else echo "\033[32m"; fi # 緑
}
24bitカラー(truecolor)を使いたい場合は \033[38;2;R;G;Bm 形式で指定します。対応ターミナルが必要ですが、より豊かな表現が可能になります。
プログレスバーの文字バリエーション
プログレスバーに使える文字は豊富にあります。お好みのスタイルを選んでください。
| スタイル | Filled | Empty | 表示例 |
|---|---|---|---|
| ブロック | █ |
░ |
████░░░░░░ |
| ドット | ● |
○ |
●●●●○○○○○○ |
| 四角 | ■ |
□ |
■■■■□□□□□□ |
| ダイヤ | ◆ |
◇ |
◆◆◆◆◇◇◇◇◇◇ |
| 星 | ★ |
☆ |
★★★★☆☆☆☆☆☆ |
| ハイフン | = |
- |
====----- |
| ハッシュ | # |
- |
####------ |
| シック | ▓ |
░ |
▓▓▓▓░░░░░░ |
| 三角 | ▶ |
▷ |
▶▶▶▶▷▷▷▷▷▷ |
| パイプ | ` | ` | . |
| チェック | ✔ |
· |
✔✔✔✔······ |
| 矢印 | ➤ |
· |
➤➤➤➤······ |
| ファイン | ▉ |
▏ |
▉▉▉▉▏▏▏▏▏▏ |
| 点字 | ⣿ |
⣀ |
⣿⣿⣿⣿⣀⣀⣀⣀⣀⣀ |
| リング |
● ◕ ◑ ◔ ○
|
— |
◑(5段階) |
汎用バー生成関数
どのパターンでも使い回せる汎用的なバー生成関数です。
make_bar() {
local pct=${1:-0}
local width=${2:-10}
local filled_char=${3:-"█"}
local empty_char=${4:-"░"}
local filled=$((pct * width / 100))
local empty=$((width - filled))
local bar=""
for (( i=0; i<filled; i++ )); do bar+="${filled_char}"; done
for (( i=0; i<empty; i++ )); do bar+="${empty_char}"; done
echo "$bar"
}
# 使用例
bar=$(make_bar 42 10 "●" "○") # → ●●●●○○○○○○
bar=$(make_bar 42 10 "█" "░") # → ████░░░░░░
Gitキャッシング最適化パターン
ステータスラインは頻繁に実行されるため、gitコマンドのような重い処理はキャッシュすることを推奨します。一時ファイルに結果を保存し、5秒間は再利用するパターンです。
CACHE_FILE="/tmp/statusline-git-cache"
CACHE_MAX_AGE=5
cache_is_stale() {
[ ! -f "$CACHE_FILE" ] || \
[ $(($(date +%s) - $(stat -f %m "$CACHE_FILE" 2>/dev/null || \
stat -c %Y "$CACHE_FILE" 2>/dev/null || echo 0))) -gt $CACHE_MAX_AGE ]
}
if cache_is_stale; then
BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null || echo "")
echo "$BRANCH" > "$CACHE_FILE"
fi
BRANCH=$(cat "$CACHE_FILE")
stat -f %m(macOS)とstat -c %Y(Linux)の両方に対応しているので、環境を問わず動作します。
パフォーマンスの注意点
ステータスラインのスクリプトは300msのデバウンスで頻繁に実行されます。重い処理を含めるとUIの応答性に影響するので、以下の点に気をつけてください。
-
gitコマンドは大規模リポジトリで遅くなりうるため、キャッシュを推奨 - 外部APIの呼び出しはキャッシュ必須
-
jqの呼び出し回数を減らすには、一度のjq実行で複数フィールドを取得する方法もある
外部スクリプト vs インラインの比較
| 項目 | 外部スクリプト | インラインjq |
|---|---|---|
| セットアップ | ファイル作成 + chmod | settings.jsonのみ |
| 可読性 | 高い | エスケープで低い |
| デバッグ | パイプでテスト可能 | 困難 |
| 機能 | 制限なし | jqワンライナーの範囲 |
| 保守性 | 高い | 低い |
| おすすめ場面 | 本格カスタマイズ | 簡易表示・お試し |
コミュニティツール紹介
ステータスラインを手書きするのが面倒な方のために、コミュニティが開発したツールも存在します。
ccstatusline
oh-my-zshのテーマ設定のように、TUIで対話的にステータスラインを組み立てられるツールです。
npx ccstatusline@latest
TUIが起動したら、「Edit Lines」で行を追加し、左右キーでウィジェットの種類を切り替え、「Edit Colors」で色を選び、「Save & Exit」で保存するだけです。Powerlineスタイルの見た目にも対応しています。最新バージョンではThinking Effort(考察レベル表示)やVim Modeウィジェット、クリック可能なGitHubブランチリンクなども追加されています。
利用可能なウィジェットは以下のとおりです。
| カテゴリ | ウィジェット |
|---|---|
| モデル | モデル名、モデルID |
| コンテキスト | 使用率%、プログレスバー、トークン数 |
| コスト | コスト、経過時間 |
| ワークスペース | ディレクトリ名、Gitブランチ |
| レート制限 | 5h使用率、7d使用率 |
| カスタム | セパレータ、テキスト |
claude-statusline(kamranahmedse作)
ミニマルな構成で、ワンコマンドでセットアップが完了するツールです。
npx @kamranahmedse/claude-statusline
既存のステータスライン設定を自動バックアップしたうえで、スクリプトを~/.claude/statusline.shに配置し、Claude Codeの設定に自動反映してくれます。表示内容はAPIレート制限、カレントディレクトリ、Gitブランチ名です。アンインストールも--uninstallフラグ一つで完了します。
claude-code-usage-bar
トークン使用量とコスト管理に特化したツールです。セッション中のトークン消費量やコストをバー形式で表示し、予算管理を意識した開発をサポートします。
CCometixLine
Rust製の高性能なステータスラインツールです。インタラクティブなTUI設定、Git統合、使用量追跡機能を備えています。Rustならではの起動速度の速さが特徴で、パフォーマンスを重視するユーザーに向いています。
比較表
| 基準 | ccstatusline | claude-statusline | claude-code-usage-bar | CCometixLine |
|---|---|---|---|---|
| 見た目 | ◎ Powerlineスタイル対応 | ○ ミニマル | ○ シンプル | ◎ リッチ |
| 設定の簡単さ | ○ TUIで対話的 | ◎ ワンライナー | ◎ ワンライナー | ○ TUI |
| 機能の豊富さ | ◎ 多機能 | ○ 基本情報 | ○ 使用量特化 | ◎ 多機能 |
| パフォーマンス | ○ Node.js | ○ Shell | ○ Shell | ◎ Rust製 |
手軽さならclaude-statusline、自由度ならccstatusline、パフォーマンスならCCometixLineが合っています。
StatusCraft:ビジュアルGUIで設計できるツールを作った
ここからは、筆者が開発したStatusCraftの話です。単なるツール紹介ではなく、開発プロセスで得た学びを中心に書きます。
動機
きっかけはGhosttyのconfig generatorでした。Ghosttyターミナルの設定を視覚的に組み立てられるWebツールで、「これのClaude Code版があったら便利だな」と思ったのです。
ステータスラインのカスタマイズには、bashスクリプトを手書きし、JSONをjqでパースして整形する必要があります。前述のパターン4のスクリプトを見ればわかるように、null安全な処理、色分けロジック、プログレスバー構築と、やることは多い。この障壁を下げたいと考えました。
v3の失敗:見た目は完璧、中身は嘘
まずclaude.ai(Web版Claude)でアイデアを相談しました。「Claude Codeのステータスラインを視覚的にデザインできるツールを作りたい」と伝えると、UIとしては非常に優れたHTMLツール(v3)が出来上がりました。ダークテーマ、トークンのクリック選択、ライブプレビュー。見た目は完璧です。
ところが、Claude Code(CLI版)に渡して検証してもらったところ、根本的な問題が発覚しました。
v3が生成する出力はこのような形式でした。
{
"statusLine": {
"statusFormat": "{model} | {context}% | ${cost}"
}
}
このstatusFormatキーは実在しません。claude.aiが「こういうAPIがあるはず」と推測して作った架空のインターフェースでした。実際のClaude Codeのステータスラインはフォーマット文字列ではなく、コマンドベースのシステムで動くため、この設定をsettings.jsonに貼り付けても何も起きません。
美しいUIで「コピペしても動かない」設定を生成するツール。これがv3の正体でした。
AIが生成したコードの「動く前提」は検証が必須です。特にAPIやインターフェースの仕様は、公式ドキュメントとの突合なしに信用してはいけません。
v4:正確な仕様に基づく再構築
v4では「見た目はv3、中身は正確」を目指しました。
まず、正確なデータソースを2つ用意し、突合しました。1つ目はClaude Codeの公式ドキュメント(WebFetchで取得)、2つ目は以前作成していたステータスライン設定集(本記事のパターン群の元になったもの)です。18パターンを実際にテストした記録から、フィールドの実際の挙動(null値の処理、型の違い等)を確認できました。
この2つを突き合わせて、24トークン、6カテゴリの完全なトークンデータベースを構築しました。各トークンには、jqパス、bash変数名、サンプル値、必要なヘルパー関数の情報が紐付けられています。
{
id: "context_pct",
label: "Context %",
category: "context",
jqPath: ".context_window.used_percentage",
bashVar: "ctx_pct",
sampleValues: { normal: "42", high: "87", startup: "0" }
}
使用するトークンに応じて、必要なヘルパー関数(ミリ秒→分秒変換、大きな数の短縮形など)だけがスクリプトに含まれる仕組みです。
v4のもう一つの大きな改善は3状態プレビューです。Normal(通常)、High Load(高負荷)、Startup(起動直後)の3つの状態をプレビューで確認できるようにしました。特にStartup状態は重要で、Claude Code起動直後は多くのフィールドがnullになりますが、v3にはこの考慮がありませんでした。
アーキテクチャ
StatusCraftは単一HTMLファイル(筆者が確認した時点で約3,000行)として設計されています。CSS、JavaScript、HTMLのすべてが1ファイルに収まっています。
この設計にした理由は明確です。Claude Codeのスキルとして使う場合に1ファイルを/tmp/にコピーしてopenするだけで動くこと。外部依存なしでオフライン動作すること。GitHub Pagesでビルドステップなく公開できること。
- Claude Code Skillとして使うには「Apply to Claude Code」ボタンでJSONがダウンロードされ、Claude Codeが自動で設定を適用
ブラウザからCLIへのデータ受け渡しには、Claude Code公式スキルのskill-creatorで使われていたパターンを応用しました。ブラウザはファイルシステムに直接書き込めませんが、ダウンロードのトリガーはできる。これを通信チャネルとして利用し、~/Downloads/経由でJSONを受け渡す仕組みです。
使い方
Claude Code Skillとして使う場合は、Claude Codeで/statuscraftと入力するだけでGUIが起動します。デザインした結果は自動的にClaude Codeに適用されます。
GitHubリポジトリは以下です。
開発から得た学び
StatusCraftの開発で得た学びは大きく2つあります。
1つ目は、claude.aiからClaude Codeへのリレー開発パターンが有効だったことです。claude.ai(Web版)は自由な発想やUIデザインの議論に向いており、Claude Code(CLI版)はファイルシステムへのアクセスや実際のコードベースとの統合に向いています。claude.aiで大枠を作り、Claude Codeで現実と接続するこのフローは、他のプロジェクトでも応用できるパターンです。
2つ目は、AI支援開発における「検証」の位置づけです。v3は完璧に見えましたが、出力が実際のシステムと接続する部分は完全に架空のものでした。AIは「こうあるべき」という理想的なAPIを想像してコードを書きます。公式ドキュメントとの突合、実際の動作テスト、エッジケースの検証を省略すると、「完璧に見えるが動かない」成果物ができあがります。
まとめ
ステータスラインのカスタマイズは、以下の手順で今日から始められます。
-
/statuslineコマンドで動作を確認する - 表示したい情報を洗い出す(モデル名、コンテキスト%、レート制限、コスト、Gitなど)
- 手書き、コミュニティツール、StatusCraftから自分に合う方法を選ぶ
ミニマリストの6行スクリプトも、2行フル機能版も、条件付き警告パターンも、それぞれのワークフローに最適な形があります。本記事のパターンやテクニックを参考に、自分だけのステータスラインを組み立ててみてください。
リンク集
- 公式ドキュメント: https://code.claude.com/docs/en/statusline
- StatusCraft
- コミュニティツール
- ccstatusline: https://github.com/sirmalloc/ccstatusline
- claude-statusline: https://github.com/kamranahmedse/claude-statusline
- CCometixLine: https://github.com/Haleclipse/CCometixLine
- claude-code-usage-bar: https://github.com/leeguooooo/claude-code-usage-bar