M.

私の Claude Code statusline 設定(利用上限・コンテキスト・モデルをバーで表示)

Claude Code の画面下に出る statusline は、自分でスクリプトを書いて中身を変えられます。

わたしは、ここに 利用上限の使用率・コンテキストの使用率・モデル名 を出しています。作業中にいちばん気にする数字を、いつも目に入る場所に置いておくためです。

環境:Windows 10 / Node.js / Claude Code

表示はこうなる

5h:██████░░░░ 63% ~2h15m | 7d:█████████░ 91% ~3d04h | Context:████░░░░░░ 42% | Model: Opus 5.5 | C:\Users\me\repos\my-app | v2.1.300

実際の画面では色が付いています。

表示中身色
5h:5時間ごとの利用上限の使用率と、リセットまでの残り時間シアン
7d:7日ごとの利用上限の使用率と、リセットまでの残り日数マゼンタ
Context:コンテキストウィンドウの使用率黄
Model:今使っているモデルなし
パス・v...作業ディレクトリと Claude Code のバージョンなし

どのバーも、90% を超えると太字になって目立つようにしています。

なぜこの3つを見るのか

利用上限(5h / 7d)

一番よく見るのがここです。上限に近いときは重い作業を後回しにしたり、リセットまでの残り時間を見て「あと2時間で戻るから、それまで軽い作業をしよう」と決めたりします。

使用率だけだといつ戻るのか分からないので、リセットまでの残り時間も一緒に出す のがポイントです。

Context

コンテキストの使用率が高くなると、そのうち自動で圧縮(compact)されます。大きな作業の途中で圧縮されるより、区切りのいいところで自分から /compact するか、新しい会話にしたいので、残りがどれくらいかを見ています。

Model

タスクの難しさでモデルを使い分けている ので、今どのモデルで動いているかがすぐ分かるようにしています。軽い質問のために切り替えたモデルのまま、重い作業を始めてしまうのを防げます。

設定

~/.claude/settings.json で、statusline を出すコマンドを指定します。

{
  "statusLine": {
    "type": "command",
    "command": "node C:/Users/<ユーザー名>/.claude/statusline.js"
  }
}

Claude Code は、セッションの情報を JSON にして、このコマンドの標準入力に渡してくれます。スクリプトはそれを読んで、表示したい文字列を標準出力に書くだけです。

スクリプト全文(statusline.js)

#!/usr/bin/env node
let raw = '';
process.stdin.on('data', (c) => (raw += c));
process.stdin.on('end', () => {
  let data = {};
  try {
    data = JSON.parse(raw);
  } catch {
    data = {};
  }

  const esc = '\x1b';
  const color = (text, code) => `${esc}[${code}m${text}${esc}[0m`;

  const model = data?.model?.display_name || 'Unknown';
  const version = data?.version || '?';
  const cwd = data?.workspace?.current_dir || data?.cwd || '';
  const contextPct = Math.round(Number(data?.context_window?.used_percentage ?? 0));

  function makeBar(pct, code) {
    const width = 10;
    const filled = Math.floor((pct * width) / 100);
    const empty = width - filled;
    const bar = '█'.repeat(filled) + '░'.repeat(empty) + ` ${pct}%`;
    if (pct >= 90) code = `${code};1`;
    return color(bar, code);
  }

  function formatRemain(resetsAt, unit) {
    if (!resetsAt) return '';
    const now = Math.floor(Date.now() / 1000);
    const remain = Number(resetsAt) - now;
    if (remain <= 0) return '';
    if (unit === 'h') {
      const hours = Math.floor(remain / 3600);
      const mins = Math.floor((remain % 3600) / 60);
      return ` ~${hours}h${String(mins).padStart(2, '0')}m`;
    }
    const days = Math.floor(remain / 86400);
    const hours = Math.floor((remain % 86400) / 3600);
    return ` ~${days}d${String(hours).padStart(2, '0')}h`;
  }

  const cyan = 96;
  const magenta = 95;
  const yellow = 93;

  const rateParts = [];

  const fivePct = data?.rate_limits?.five_hour?.used_percentage;
  if (fivePct != null) {
    const fiveInt = Math.round(Number(fivePct));
    const suffix = formatRemain(data?.rate_limits?.five_hour?.resets_at, 'h');
    rateParts.push(color('5h:', cyan) + makeBar(fiveInt, cyan) + suffix);
  }

  const sevenPct = data?.rate_limits?.seven_day?.used_percentage;
  if (sevenPct != null) {
    const sevenInt = Math.round(Number(sevenPct));
    const suffix = formatRemain(data?.rate_limits?.seven_day?.resets_at, 'd');
    rateParts.push(color('7d:', magenta) + makeBar(sevenInt, magenta) + suffix);
  }

  const rateStr = rateParts.length > 0 ? rateParts.join(' | ') + ' | ' : '';
  const contextStr = color('Context:', yellow) + makeBar(contextPct, yellow);

  process.stdout.write(`${rateStr}${contextStr} | Model: ${model} | ${cwd} | v${version}`);
});

読み取っている項目

JSON のキー使い道
model.display_nameモデル名
context_window.used_percentageコンテキストの使用率
rate_limits.five_hour.used_percentage / resets_at5時間枠の使用率とリセット時刻(UNIX 秒)
rate_limits.seven_day.used_percentage / resets_at7日枠の使用率とリセット時刻(UNIX 秒)
workspace.current_dir作業ディレクトリ
versionClaude Code のバージョン

rate_limits が入力に無いときは、5h・7d の表示ごと省くようにしています。JSON が読めなかったときも、空のデータとして最後まで表示できるようにしてあります。

PowerShell ではなく Node.js で書いている理由

最初は PowerShell で書いていましたが、pwsh の起動が遅く、statusline が表示されない ことがありました。statusline のスクリプトは更新のたびに起動されて、終わる前に次の更新が来ると取り消されてしまうためです。

Node.js に書き直したら、実行時間が約1.4秒から約0.14秒になり、表示が安定しました。原因の調べ方と計測結果は、別の記事に詳しく書いています。

→ Claude Code の statusLine が表示されない原因は PowerShell の起動遅延

まとめ

  • statusline は、標準入力の JSON を読んで文字列を出すだけのスクリプトで自由に作れる
  • 利用上限(5h / 7d)は 使用率とリセットまでの残り時間をセットで 出すと、作業の順番を決めやすい
  • コンテキストの使用率とモデル名も出しておくと、compact のタイミングやモデルの切り替え忘れに気づける
  • Windows では、起動の速い Node.js で書くのがおすすめ

この記事をシェア

関連する記事

Claude Code に .env を読ませない deny 設定と、その限界

Claude Code に任せて作業するにあたり、.env や credentials を読ませないよう settings.json の permissions.deny を設定しています。実際の設定と、Bash コマンドのパターン指定ではすり抜けが防ぎきれない理由、ほかに重ねている対策をまとめます。

テーマから探す