Claude Code gitブランチ jq settings.json シェルスクリプト ステータスライン ターミナルカスタマイズ

Claude Codeのステータスラインをカスタマイズする基本設定

Claude Codeのステータスラインは、ターミナル下部に常時表示される情報バーです。デフォルトでは非表示なので、~/.claude/settings.jsonstatusLineキーを追加して有効化します。

settings.jsonにstatusLineを追加する手順

指定するのはtypecommandの2つだけ。以下のように書けば、スクリプトが標準出力へ返した文字列がそのまま表示されます。

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

保存したらClaude Codeを一度再起動します。変更が既存セッションに反映されず「効かない」と誤解しやすいポイントです。

スクリプト方式とコマンド方式の使い分け

commandには外部スクリプトのパスも、echoのようなワンライナーも書けます。固定文字や環境変数を出すだけならワンライナーで十分ですが、ブランチ名やコストなど複数の情報を組み立てるならスクリプト方式が圧倒的に楽です。

迷ったらスクリプト方式にしておくと後の拡張が効きます。ワンライナーはJSON内のエスケープが増え、後から読み解くのに苦労します。

ステータスラインに表示できる情報とスクリプトの書き方

スクリプトには、セッションごとのコンテキストがJSON形式で標準入力に渡されます。これをパースすれば、モデル名やコストといった動的な値を表示に組み込めます。

JSON入力から取得できるモデル名・カレントディレクトリ・コスト

入力JSONにはmodel.display_nameworkspace.current_dir、累積コストのcost.total_cost_usdなどが含まれます。抜き出しはjqが定番です。

#!/bin/bash
input=$(cat)
model=$(echo "$input" | jq -r '.model.display_name')
dir=$(echo "$input" | jq -r '.workspace.current_dir')
echo -n "[$model] ${dir##*/}"

キー構成はバージョンで増減します。まずecho "$input" > /tmp/sl.jsonで実データを確認してから参照先を決めると、キー名の思い込みによる事故を防げます。

gitブランチや稼働時間を動的に表示する実装例

gitブランチはJSONには含まれず、スクリプト内でコマンドを叩いて取得します。カレントディレクトリへ移動してからgitを呼ぶのがポイントです。

cd "$dir" 2>/dev/null
branch=$(git branch --show-current 2>/dev/null)
[ -n "$branch" ] && echo -n " ($branch)"

リポジトリ外ではfatal: not a git repositoryが出るため、2>/dev/nullでエラーを捨て、ブランチが空なら何も出さない分岐を必ず入れます。これを省くとエラー文字列がバーに漏れて表示が乱れます。

ステータスラインが表示されない・文字化けする場合の原因と検証方法

表示されないトラブルの大半は、実行権限とパス指定という単純な二点です。Claude Code側は無反応でエラーも吐かないため、切り分けは自分で手を動かすしかありません。

実行権限とパス指定の見落としによる無反応の切り分け

スクリプトに実行権限がないと、何のメッセージもなくバーが空のままになります。chmod +x ~/.claude/statusline.shを実行しておきましょう。

チルダや相対パスの展開はシェル環境に依存します。複数マシンへ配布する場合は、settings.jsonのパスを絶対パスに統一しておくと解決失敗を避けられます。

echo -nと標準出力を使った表示前の動作確認

反映前に、スクリプト単体で正しい文字列を返すか確かめます。保存しておいた実データを流し込むのが確実です。

cat /tmp/sl.json | ~/.claude/statusline.sh

末尾に余計な改行が入ると表示が崩れるので、出力はechoではなくecho -nで終える習慣をつけます。文字化けするなら、スクリプトとターミナルの文字コードをUTF-8に揃えれば大抵は直ります。