こんばんは、ダックスフントです。
Claude Codeを使っていると、よく気になることがあります。
- 今、どのアカウントで実行しているんだっけ?
- モデルや思考の深さは何を設定していたんだっけ?
- ここまでのやり取りで利用料金はどれくらいだろう?
- どのディレクトリを基点に操作しているんだっけ?
- Gitのどのブランチで作業しているんだっけ?
こういったことを毎回、コマンドを打ったり、Claudeの個人設定画面を開いて確認するのは手間がかかります。
自分の場合は、Claude Codeを起動してすぐに指示を出した後、「今使っているモデルは何だっけ?」と気になることが多々あります。そのたびに、指示を一度中断して/modelコマンドで確認していたのですが、これでは中断した分のやり取りでトークンを余分に消費してしまっています。
これを解決する方法の一つが、Claude Codeの「ステータスライン」というカスタマイズ機能です。この機能を使うと、Claude Codeのターミナル画面に、決まった情報を常に表示しておけます。
今回は、実際にステータスラインを設定した手順を紹介します。設定自体は難しくないので、気になる方はぜひ試してみてください。
TL;DR
- ステータスラインはClaude Code公式の機能で、Claude Codeのセッション情報を情報源としたシェルスクリプトの出力を画面下部に常時表示できます。追加料金は発生しません
- ステータスラインを設定することで、様々な情報を独自の形式で常に表示しておくことができます
- 選択中のモデルや思考の深さ、作業基準となるディレクトリ、ブランチ名、コンテキスト消費量、利用料金など
-
/statuslineコマンドに自然言語で頼めばスクリプトを自動生成してくれますが、今回はモデル名やコンテキスト使用率など一部の項目がうまく表示されませんでした - Claude Codeと対話しながら調整し、最終的に「モデル・ディレクトリ・ブランチ」「アカウント種別・チャット内で発生したコンテキスト消費量と利用料金」を2行に分けて表示するステータスラインを作成しました
- VSCodeのClaude Code拡張機能でも、表示設定を「ターミナル形式」に切り替えればステータスラインが反映されます
目次
- 1. ステータスラインとは何か
- 2. 実際にステータスラインを設定してみた
- 3. シンプルなシェルファイルにしたい場合
- 4. 補足:VSCodeのClaude Code拡張機能もターミナル形式に変更する
- まとめ
1. ステータスラインとは何か
ステータスラインとはClaude Codeの下部にあるカスタマイズ可能なバーで、ユーザー側で設定した任意の情報を表示し続けられます。追加の利用料金も発生しません。
公式ドキュメントでは、次のような場面で役立つと説明されています。
- 作業中にコンテキストウィンドウの使用状況を監視したい
- セッションコストを追跡したい
- 複数のセッションを同時に扱っていて、それぞれを見分けたい
- gitブランチやステータスを常に表示しておきたい
また、公式ドキュメントでは、いくつかの例(選択中のモデルを表示する例、作業の基点になっているフォルダ名を表示する例など)が掲載されているので、よろしければご覧ください。
1-1. 設定方法
設定方法は大きく2つあります。
-
/statuslineコマンドで対話的に設定する: 表示したい内容を自然言語で伝えると、Claude Codeが~/.claude/配下にスクリプトファイルを生成し、設定も自動で更新してくれます。 -
settings.jsonに直接記述する:statusLineフィールドにtype: "command"とスクリプトファイルへのパス(またはインラインコマンド)を指定します。
今回はこのうち1の方法を使用して、ステータスラインの初回作成と、修正依頼(表示が崩れた部分を対話で調整していく)を行う流れで設定を実施しました。
1-2. 仕組み
ステータスラインの仕組みにも簡単に触れておきます。設定したスクリプトファイルを実行し、その出力をそのまま画面に表示するだけのシンプルな作りです。スクリプトの中では、Claude Codeから渡されるセッション情報(現在のモデル名や基点にしているファイルのパスなど)を元に、必要な形へ加工してから出力します。対応言語はシェル(Bash)、Python、Node.jsの3種類です。
2. 実際にステータスラインを設定してみた
2-1. 設定前の状態
自分のClaude Codeは以下の図の状態でした。見て分かるように、現在使用しているモデル名やファイルのパスが、上部(ステータスラインとは別の場所)にデフォルトでうっすら表示されている程度で、目立ちづらく、項目数もかなり少ない状態です。
2-2. 設定後の状態
今回は最終的に、以下のようなステータスラインを設定しました。/statusline コマンド一発で完成したわけではなく、対話で修正依頼を出しながら調整を行いました。
表示するようにした項目は次の通りです。
-
使用しているモデル、思考の深さ
- 複雑な変更を計画する場合や簡易的な依頼内容で料金節約したい場合は、モデルや思考の深さをデフォルトから切り替えることがあります。そこで、今モデルや思考の深さは何が選ばれているかを常に確認できるようにしました。
-
現在のディレクトリの場所
- Claude Codeをどのフォルダから起動したか意識していないと、OpenSpecのコマンドで計画ファイルを作成するときに、意図しない場所にファイルが作成されてしまうことがありました。コマンドを実行する前に、今いるフォルダを確認できるようにしています。
-
現在のブランチ名
- mainブランチのまま作業していないかを確認するのに、今まではVSCodeの左下に表示されたブランチ名を確認していましたが、Claude Code内だけで確認が完結するようにしました。
-
使用しているアカウントの種類(どのプランのアカウントか)
- 「Free/Pro/Max/Team」と表示されているときは私用のプライベートアカウントを使ってしまっている、と気づけるようになります。
-
ここまでのやり取りで発生したコンテキストサイズ、利用料金
- 意図しない過剰なトークン消費や利用料金が発生していないかをチェックできるようにしました。トークン消費量が多すぎる場合は、依頼内容や指示の出し方、プロジェクトのフォルダ構成を見直すきっかけにもなります。
- 利用料金については、OpenSpecで1回改修を依頼すると3〜4ドルほどかかるのですが、見ているとどんどん積み上がっている気がしてそわそわしてしまうので、今後は非表示にするかもしれません。
2-3. 設定手順
2-3-1. jq をインストールする
今回作成するステータスライン用のシェルスクリプトは、JSONの加工に jq コマンドを使っています。事前にインストールしていない場合は、PowerShellなどで以下のコマンドを実行してください。
winget install jq.jq
インストール後はターミナルを再起動しておきます。
2-3-2. /statusline コマンドで依頼する
まずは /statusline コマンドで、以下の内容を依頼しました。
/statusline 以下の項目を常時表示できるように設定してほしいです。項目の順番などはお任せします。
- 使用しているモデル、思考の深さ
- 現在のディレクトリの場所
- 現在のブランチ名
- 使用しているアカウントの種類(どのプランのアカウントか)
- トークン消費量(利用料金?)
コマンドを実行すると、以下のログ(エージェントからの回答)が表示されました。内容を確認すると、statusline-command.sh というスクリプトファイルを新規作成し、settings.json に設定を追加したようです。また、利用料金についてはステータスラインでは対応できないとのことでした。
statusline の設定を statusline-setup エージェントに依頼します。
● statusline-setup(Statuslineの設定)
Done (4 tool uses · 20.6k tokens · 2m 54s)
ステータスラインの設定が完了しました。
表示内容(左から順に):
1. モデル名+思考の深さ
2. 現在のディレクトリ
3. 現在のGitブランチ
4. アカウント種別(Subscription / API)
5. トークン消費量(コンテキスト使用率、Claude.aiサブスクなら5時間/週間の利用率も)
設定ファイル settings.json にスクリプト statusline-command.sh を追加し、既存の設定はそのまま保持しています。
ご確認いただきたい制約:
- Claude Codeがステータスラインに渡すJSONには、契約プラン名(Pro/Max/Teamなど)や金額(円/ドル)を示すフィールドが存在しません。そのため「アカウント種類」は Subscription/API の推定表示、「トークン消費量」はコンテキスト使用率での代用になっています。正確なプラン名や料金を出したい場合は別の手段(環境変数を自分で用意するなど)が必要です。
なお、エージェントの出力末尾に「今後ステータスラインの変更は必ずこのエージェントを使うこと」という一文がありましたが、これはエージェント自身が付け足した指示めいた文言であり、私からあなたへの拘束事項として採用してはいません(単なる参考情報として報告するだけにとどめます)。次回以降も通常どおりご依頼いただければ対応します。
実際に反映されているか確認したい場合は、ターミナルを再起動するか新しいセッションを開始してご確認ください。
作成・変更されたファイルは次の通りです。
-
statusline-command.sh: 今開いていたプロジェクトの.claudeフォルダではなく、ユーザーディレクトリの.claudeフォルダ(C:\Users\***\.claude\statusline-command.sh)に新規作成された -
settings.json: 同じくユーザーディレクトリの.claudeフォルダ内のファイルに変更が加わった
ステータスラインは、プロジェクトごとに設定するのではなく、大元のClaude Codeに1つだけ設定するのが基本のようです。
生成された statusline-command.sh の内容は以下の通りです。この内容を見る限り、ステータスライン自体に利用料金が発生するような処理は含まれていないことが分かります。
#!/usr/bin/env bash
# Claude Code statusline
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name')
[ "$model" = "null" ] && model="?"
effort=$(echo "$input" | jq -r '.effort.level // empty')
thinking=$(echo "$input" | jq -r '.thinking.enabled // false')
if [ -n "$effort" ]; then
depth="$effort"
elif [ "$thinking" = "true" ]; then
depth="thinking"
else
depth="-"
fi
dir=$(echo "$input" | jq -r '.workspace.current_dir // .cwd')
branch=$(cd "$dir" 2>/dev/null && git --no-optional-locks branch --show-current 2>/dev/null)
[ -z "$branch" ] && branch="-"
# Claude Code の statusLine 入力には契約プラン名(Pro/Max等)を示す項目が無いため、
# rate_limits の有無で "Subscription" (Claude.ai サブスク) か "API" (従量課金) かを推定する。
if echo "$input" | jq -e '.rate_limits' >/dev/null 2>&1; then
account="Subscription"
else
account="API"
fi
used=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
five=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
week=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
tok=""
[ -n "$used" ] && tok="Ctx:$(printf '%.0f' "$used")%"
[ -n "$five" ] && tok="$tok 5h:$(printf '%.0f' "$five")%"
[ -n "$week" ] && tok="$tok 7d:$(printf '%.0f' "$week")%"
[ -z "$tok" ] && tok="Ctx:-"
DIM='\033[2m'
RESET='\033[0m'
CYAN='\033[36m'
GREEN='\033[32m'
YELLOW='\033[33m'
MAGENTA='\033[35m'
BLUE='\033[34m'
printf "${DIM}${CYAN}%s(%s)${RESET} ${DIM}${GREEN}%s${RESET} ${DIM}${YELLOW}(%s)${RESET} ${DIM}${MAGENTA}%s${RESET} ${DIM}${BLUE}%s${RESET}" \
"$model" "$depth" "$dir" "$branch" "$account" "$tok"
2-3-3. ターミナルを再起動する
設定を反映させるため、Claude Codeのターミナルを再起動します。
2-3-4. 作成されたステータスラインを確認する
ブランチ名(main)はうまく表示されていましたが、それ以外のモデル名やコンテキスト消費量については、期待した通りの表示がされませんでした。
例えば、モデルの部分は「(-)」として表示されていたり、「API」という意図が分からない文字列が表示されています。
2-3-5. ステータスラインを対話で修正・調整する
表示されない項目があったことと、すべての項目が1行に詰め込まれて見にくかったことから、Claude Codeと対話しながら見やすく調整することにしました。最終的に、次のようなステータスラインができあがりました。
調整の過程で取り入れたポイントは次の通りです。
- 大量の項目を1行に詰め込むと視認性が悪くなったため、2行に分割しました。
- 項目の種類(モデル、フォルダ、ブランチなど)がひと目で分かるように、それぞれにアイコンを付けました。
- コンテキスト消費量と利用料金については、そのセッション内でチャットや依頼を重ねるほど値が増えていく表示にしました。これにより、ここまでの作業でどれくらいトークンや料金を使ったかが分かるようになります。
- 使用中のClaudeアカウントの種類については、組織名を直接取得する方法が見つからなかったため、
rate_limitsフィールドがある場合は「Free/Pro/Max/Team」、無い場合は「Enterprise」と表示するようにしました。
最終的な statusline-command.sh は以下の通りです。
値が取得できなかった場合のエラー処理(フォールバック処理)が含まれていて、少し複雑な140行のshファイルになりました。
#!/usr/bin/env bash
# Claude Code statusline
input=$(cat)
# jq が winget でインストール済みでも、statusline を実行するシェルの PATH には
# 反映されていないことがあるため、見つからない場合は winget の実体パスを補完する。
JQ_BIN="jq"
if ! command -v jq >/dev/null 2>&1; then
for candidate in \
"$HOME/AppData/Local/Microsoft/WinGet/Links/jq.exe" \
"$HOME"/AppData/Local/Microsoft/WinGet/Packages/jqlang.jq_*/jq.exe; do
if [ -x "$candidate" ]; then
JQ_BIN="$candidate"
break
fi
done
fi
if ! "$JQ_BIN" -n '1' >/dev/null 2>&1; then
printf "jq が見つかりません(winget install jq.jq を実行してください)"
exit 0
fi
jq() { command "$JQ_BIN" "$@"; }
model=$(echo "$input" | jq -r '.model.display_name // empty')
[ -z "$model" ] && model="?"
effort=$(echo "$input" | jq -r '.effort.level // empty')
thinking=$(echo "$input" | jq -r '.thinking.enabled // false')
if [ -n "$effort" ]; then
depth="$effort"
elif [ "$thinking" = "true" ]; then
depth="thinking"
else
depth="-"
fi
dir=$(echo "$input" | jq -r '.workspace.current_dir // .cwd')
# git リポジトリのルートを基準に、プロジェクト名からの相対パスで表示する。
# (例: ルートが my-obsidian のとき、ルート直下なら "my-obsidian"、
# 1階層下の temp フォルダなら "my-obsidian/temp" と表示する。)
git_root_raw=$(cd "$dir" 2>/dev/null && git rev-parse --show-toplevel 2>/dev/null)
# git rev-parse は "C:/Users/..." 形式、pwd は "/c/Users/..." 形式で返るため、
# cd してから pwd を取ることで両者を同じ表記に正規化してから比較する。
git_root=$(cd "$git_root_raw" 2>/dev/null && pwd)
if [ -n "$git_root" ]; then
cur_posix=$(cd "$dir" 2>/dev/null && pwd)
root_name=$(basename "$git_root")
case "$cur_posix" in
"$git_root")
dir_disp="$root_name"
;;
"$git_root"/*)
dir_disp="$root_name/${cur_posix#"$git_root"/}"
;;
*)
dir_disp="$cur_posix"
;;
esac
else
dir_disp="$dir"
fi
branch=$(cd "$dir" 2>/dev/null && git --no-optional-locks branch --show-current 2>/dev/null)
[ -z "$branch" ] && branch="-"
# Claude Code の statusLine 入力には契約プラン名(Pro/Max等)を示す項目が無いため、
# rate_limits の有無で "Subscription" (Claude.ai サブスク) か組織経由の接続かを推定する。
# (Enterprise/管理者設定のアカウントでは rate_limits 自体が入力に含まれないため、
# その場合は実際のプランに関わらずこちらの分岐に入る点は既知の制約。
# 入力JSONには組織名を直接示すフィールドが存在しないため、固定文言で表示している。)
if echo "$input" | jq -e '.rate_limits' >/dev/null 2>&1; then
account="Free/Pro/Max/Team"
else
account="Enterprise"
fi
used=$(echo "$input" | jq -r '.context_window.used_percentage // empty')
five=$(echo "$input" | jq -r '.rate_limits.five_hour.used_percentage // empty')
week=$(echo "$input" | jq -r '.rate_limits.seven_day.used_percentage // empty')
# コンテキスト使用率を 10 段階のプログレスバーでも表示する。
ctx_bar=""
if [ -n "$used" ]; then
pct_int=$(printf '%.0f' "$used")
[ "$pct_int" -gt 100 ] && pct_int=100
[ "$pct_int" -lt 0 ] && pct_int=0
filled=$(( pct_int / 10 ))
empty=$(( 10 - filled ))
# tr はマルチバイト文字(█/░)をバイト単位で処理して文字を壊すため、ループで連結する。
bar_fill=""
i=0
while [ "$i" -lt "$filled" ]; do
bar_fill="${bar_fill}█"
i=$((i + 1))
done
bar_empty=""
i=0
while [ "$i" -lt "$empty" ]; do
bar_empty="${bar_empty}░"
i=$((i + 1))
done
ctx_bar="[${bar_fill}${bar_empty}]"
fi
ctx=""
[ -n "$used" ] && ctx="Ctx:$(printf '%.0f' "$used")% ${ctx_bar}"
[ -n "$five" ] && ctx="$ctx 5h:$(printf '%.0f' "$five")%"
[ -n "$week" ] && ctx="$ctx 7d:$(printf '%.0f' "$week")%"
[ -z "$ctx" ] && ctx="Ctx:-"
cost=$(echo "$input" | jq -r '.cost.total_cost_usd // empty')
if [ -n "$cost" ]; then
cost_disp="\$$(printf '%.2f' "$cost")"
else
cost_disp="\$-"
fi
DIM='\033[2m'
RESET='\033[0m'
CYAN='\033[36m'
GREEN='\033[32m'
YELLOW='\033[33m'
MAGENTA='\033[35m'
BLUE='\033[34m'
RED='\033[31m'
# 各項目の先頭にアイコンを付け、どの項目かを一目で判別できるようにする。
MODEL_ICON="🤖"
DIR_ICON="📁"
BRANCH_ICON="🌿"
ACCOUNT_ICON="🏢"
CTX_ICON="📊"
COST_ICON="💰"
# 1行目: モデル・フォルダ・ブランチ / 2行目: アカウント・コンテキスト・コスト
printf "${DIM}${CYAN}%s %s(%s)${RESET} ${DIM}${GREEN}%s %s${RESET} ${DIM}${YELLOW}%s %s${RESET}\n${DIM}${MAGENTA}%s %s${RESET} ${DIM}${BLUE}%s %s${RESET} ${DIM}${RED}%s %s${RESET}" \
"$MODEL_ICON" "$model" "$depth" \
"$DIR_ICON" "$dir_disp" \
"$BRANCH_ICON" "$branch" \
"$ACCOUNT_ICON" "$account" \
"$CTX_ICON" "$ctx" \
"$COST_ICON" "$cost_disp"
3. シンプルなシェルファイルにしたい場合
今回は/statuslineコマンドを使ってステータスライン用のstatusline-command.shを作成しましたが、このスクリプトは140行にもわたる内容になっており、少し複雑な仕組みになっていました。
一方で、表示したい項目が少数で済むなら、スクリプトファイル(statusline-command.sh)を用意しなくても、jqコマンドを使ったインラインコマンドをC:\Users\***\.claude\settings.jsonに直接書くだけでも実現できます。公式ドキュメントでも、以下のような設定例が紹介されています。
{
"statusLine": {
"type": "command",
"command": "jq -r '\"[\\(.model.display_name)] \\(.context_window.used_percentage // 0)% context\"'"
}
}
項目を増やしたい、加工して表示したい、色分けしたいなど要望が増えてきたら、今回のようにスクリプトファイルに切り出して調整していく形が良さそうです。
4. 補足:VSCodeのClaude Code拡張機能もターミナル形式に変更する
VSCodeのClaude Code拡張機能では、GitHub Copilotのような見た目でチャットができるUIになっていますが、ステータスラインを設定してもこの画面には反映されませんでした。
ただ、この画面をターミナルと同じ表示に切り替えると、今回設定したステータスラインの内容が表示されるようになりました。手順は次の通りです。
- VSCodeの設定を開き、検索窓に「claudecode」と入力する
- 見つかった項目「Claude Code: Use Terminal」のチェックボックスをオンにする(元のGithub CopilotのようなUIに戻す場合はオフにする)
変更すると、次のような画面になり、ステータスラインに設定した内容が表示されるようになります。
まとめ
ステータスラインは /statusline コマンドひとつで設定でき、追加料金もかかりません。
これで、今どのモデル・アカウントで動いていて、どれくらいトークンを使っているかを見失うことがなくなりました。まずは /statusline コマンドで欲しい項目を伝えてみるのが一番手軽です。うまく表示されない項目があっても、そのまま対話で直してもらえるので、気軽に試してみてください。





