Gluegent Blog

Gluegent Blog

開発環境を「見える化」する!Claude Codeの `statusline` で自分だけのステータスバーを作る方法

  • 技術

Claude Codeの statusline 機能を利用して、ターミナル下部にモデル名やレート制限、Git状況などの作業状況を常時表示するステータスバーの作成・設定方法を解説しています。

開発環境を「見える化」する!Claude Codeの `statusline` で自分だけのステータスバーを作る方法

こんにちは。エンジニアの土屋です。

開発中の作業状況を把握できることは、ターミナルでの開発において欠かせない要素です。通常の状態では、今使っているモデルやAPIのレート制限、Gitの状態といった情報を確認するには、その都度コマンドを実行する必要がありますが、Claude Codeの statusline(ステータスライン)機能を使えば、こうした情報を自分の好きな形でターミナル下部に常時表示させることができます。

本記事では、表示できる項目から実際のPowerShellを使った設定手順まで詳しく解説します! (※本記事の内容は2026年9月時点の情報に基づいています)

環境

今回は以下の環境で試しています。

  • OS: Windows
  • シェル: PowerShell
  • statuslineの設定は settings.json から powershell コマンド経由でスクリプトを呼び出す形にしています

statusline とは

statuslineは、Claude Codeの入力欄の下に常時表示される帯のことです。デフォルトでは何も表示されていませんが、任意のスクリプトを登録しておくと、Claude Codeがセッションの状態をJSONでそのスクリプトの入力として渡し、スクリプト出力としてバーに表示ができる仕組みになっています。

デフォルトのままのClaude Codeの画面
デフォルトのままのClaude Codeの画面

ポイントは、このJSONの中にモデル名やレート制限だけでなく、Gitブランチやコンテキストウィンドウの使用率、セッションコストなど、かなり細かい情報が詰まっているという点です。今回紹介する項目もあくまで一例で、自分の好みに合わせて表示内容を選べます。

設定方法

一番簡単なのは /statusline コマンドです。日本語で「こう表示してほしい」と伝えるだけで、Claude Code自身がスクリプトを生成し、設定ファイルまで書き換えてくれます。

/statusline モデル名と5時間/週次の利用制限を表示して

自分でスクリプトを用意して設定したい場合は、settings.json(ホームディレクトリ配下の .claude フォルダ、またはプロジェクト単位の .claude フォルダ)に以下のように追加します。

{
  "statusLine": {
    "type": "command",
    "command": "statusline.sh"
  }
}

command にはスクリプトのパスのほか、インラインのシェルコマンドも指定できます。他にも、時計のように時間経過で更新したい場合に使う refreshInterval(N秒ごとに再実行)や、バー全体の左右余白を調整する padding といったオプションもあります。

試してみる:モデル名と使用量をstatuslineに表示する

PowerShellスクリプトでstatuslineを組んでいます。標準入力で受け取ったJSONの rate_limits フィールドから5時間/週次の使用率とリセット時刻を取り出し、モデル名と一緒に進捗バー付きで表示しているだけの、割とシンプルなスクリプトです。

.claude\statusline.ps1

# Claude Code statusline
# 5時間枠 / 7日枠のレート制限使用率を進捗バーで表示する。
# データ源は stdin に渡される JSON の rate_limits フィールドのみ。
[Console]::OutputEncoding = [System.Text.UTF8Encoding]::new($false)
$e = [char]27
$RESET = "$e[0m"
$DIM = "$e[90m"
function Format-Bar {
    param([double]$Pct)
    $width = 10
    $fill = [int][math]::Floor($Pct / 10)
    if ($fill -lt 0) { $fill = 0 }
    if ($fill -gt $width) { $fill = $width }
    $color = if ($Pct -ge 80) { "$e[31m" } elseif ($Pct -ge 50) { "$e[33m" } else { "$e[32m" }
    $filled = [string]::new([char]0x2588, $fill)
    $empty = [string]::new([char]0x2591, $width - $fill)
    return "$color$filled$RESET$DIM$empty$RESET"
}
function Format-Reset {
    param(
        [long]$Epoch,
        [switch]$Relative
    )
    $at = [DateTimeOffset]::FromUnixTimeSeconds($Epoch).ToLocalTime()
    if (-not $Relative) {
        return ("-> {0:MM/dd HH:mm}" -f $at.DateTime)
    }
    $left = $at - [DateTimeOffset]::Now
    if ($left.TotalMinutes -lt 1) { return "-> soon" }
    if ($left.TotalDays -ge 1) { return ("-> in {0}d {1}h" -f [int][math]::Floor($left.TotalDays), $left.Hours) }
    if ($left.TotalHours -lt 1) { return ("-> in {0}m" -f [int]$left.TotalMinutes) }
    return ("-> in {0}h{1:00}m" -f [int][math]::Floor($left.TotalHours), $left.Minutes)
}
function Format-Window {
    param(
        [string]$Label,
        $Window,
        [switch]$Relative
    )
    $pct = [double]$Window.used_percentage
    $bar = Format-Bar -Pct $pct
    $resetInfo = Format-Reset -Epoch ([long]$Window.resets_at) -Relative:$Relative
    return ("{0} {1} {2,3}% {3}{4}{5}" -f $Label, $bar, [int][math]::Round($pct), $DIM, $resetInfo, $RESET)
}
$model = ''
try {
    $raw = [Console]::In.ReadToEnd()
    $json = $raw | ConvertFrom-Json
    $model = if ($json.model.display_name) { $json.model.display_name } elseif ($json.model.id) { $json.model.id } else { '' }
    $segments = [System.Collections.Generic.List[string]]::new()
    if ($model) { $segments.Add("$e[1m$model$RESET") }
    $limits = $json.rate_limits
    if ($limits.five_hour) {
        $segments.Add((Format-Window -Label '5h' -Window $limits.five_hour -Relative))
    }
    if ($limits.seven_day) {
        $segments.Add((Format-Window -Label '7d' -Window $limits.seven_day -Relative))
    }
    if (-not $limits.five_hour -and -not $limits.seven_day) {
        $segments.Add("${DIM}limits n/a${RESET}")
    }
    [Console]::Out.Write(($segments -join " $DIM$([char]0x2502)$RESET "))
} catch {
    [Console]::Out.Write(("{0} {1}statusline error{2}" -f $model, $DIM, $RESET).Trim())
}

statusline.ps1 として保存し、.claude\settings.json から powershell 経由で呼び出すだけで動きます。

.claude\settings.json

{
  "statusLine": {
    "type": "command",
    "command": "powershell -NoProfile -File C:/Users/<ユーザー名>/.claude/statusline.ps1"
  }
}

この設定をしてclaude codeを起動すると、このような表示になります。

カスタマイズしたstatusline
カスタマイズしたstatusline

上記のスクリプトであれば使用量に応じてバーの色も変わるようになっています。

カスタマイズしたstatuslineで使用率が80%を超えた時
カスタマイズしたstatuslineで使用率が80%を超えた時

やっていることは「JSONから値を取り出して整形して標準出力に書く」だけなので、Gitブランチやコンテキスト使用率など他の項目を足したくなったら、同じ要領で rate_limits の部分を差し替えるだけで対応できます。

statuslineに表示できる項目一覧

/statusline やスクリプトで組み合わせられる主な項目を一覧にまとめました。ここまで紹介した以外にも、かなりの情報が渡ってきます。

カテゴリ フィールド例 内容
モデル model.id,
model.display_name
使用中モデルのIDと表示名
作業環境 cwd,
workspace.current_dir,
workspace.project_dir
現在の作業ディレクトリ、セッション開始時のディレクトリ
Git/リポジトリ workspace.repo.host/owner/name,
workspace.git_worktree
originリモートから解決したリポジトリ情報、worktree名
コスト cost.total_cost_usd,
cost.total_duration_ms
セッションの概算コスト、経過時間
コード変更量 cost.total_lines_added,
cost.total_lines_removed
セッション中に増減した行数
コンテキスト context_window.used_percentage,
context_window.context_window_size
コンテキストウィンドウの使用率、上限
レート制限 rate_limits.five_hour,
rate_limits.seven_day,
rate_limits.spend_limit
5時間/週次の利用率とリセット時刻、組織のスペンド上限
プロンプトキャッシュ prompt_cache.warm,
prompt_cache.hit_ratio
キャッシュが有効かどうか、ヒット率
実行設定 effort.level,
thinking.enabled,
fast_mode
reasoning effortのレベル、拡張思考の有無、Fast Modeの状態
セッション情報 session_id,
session_name,
version
セッションID・名前、Claude Codeのバージョン
その他 vim.mode,
agent.name,
pr.number/review_state,
worktree.*
vimモード、サブエージェント名、紐づくPRの状態、worktree情報

これだけ揃っていると、statuslineは小さなダッシュボードと言ってもいいくらいです。全部を詰め込む必要はなく、必要な項目だけをつまみ食いして組み合わせるのがコツだと思います。

まとめ

今回は Claude Code の statusline カスタマイズについてご紹介しました。開発中のステータスや必要な情報を一元化して見やすく整えるだけでも、認知負荷が下がり、日々の作業スピードや集中力には大きな差が生まれます。

単に新しいツールを入れるだけでなく、開発環境そのものを自分たちの手で使いやすく最適化していく姿勢こそが、開発効率を底上げする鍵だと実感しています。Gluegentシリーズの開発現場でも、こうした細かな作業環境の改善を通じて、チーム全体のプロダクト開発をよりスムーズかつスピーディーに進める取り組みを行っています。

無駄のない効率的な開発プロセスを追求し、より良いサービスを1日でも早く確かなクオリティでお届けできるよう、引き続きチーム一丸となって取り組んでまいります!

参考