Claude Codeインターフェースの下部に表示されるカスタムステータスラインでClaude Codeを自分好みにカスタマイズしましょう。これはOh-my-zshなどのシェルでターミナルプロンプト(PS1)が動作する方法と似ています。

カスタムステータスラインの作成

以下のいずれかの方法を使用できます:

  • /statuslineを実行してClaude Codeにカスタムステータスラインの設定を手伝ってもらう。デフォルトでは、ターミナルのプロンプトを再現しようとしますが、/statusline モデル名をオレンジ色で表示のように、Claude Codeに求める動作について追加の指示を提供できます

  • .claude/settings.jsonに直接statusLineコマンドを追加する:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // オプション:ステータスラインを端まで表示するには0に設定
  }
}

動作原理

  • ステータスラインは会話メッセージが更新されるときに更新されます
  • 更新は最大300msごとに実行されます
  • コマンドのstdoutの最初の行がステータスラインテキストになります
  • ANSIカラーコードがステータスラインのスタイリングでサポートされています
  • Claude Codeは現在のセッション(モデル、ディレクトリなど)に関するコンテキスト情報をJSONとしてstdin経由でスクリプトに渡します

JSON入力構造

ステータスラインコマンドは、stdin経由でJSON形式の構造化データを受け取ります:

{
  "hook_event_name": "Status",
  "session_id": "abc123...",
  "transcript_path": "/path/to/transcript.json",
  "cwd": "/current/working/directory",
  "model": {
    "id": "claude-opus-4-1",
    "display_name": "Opus"
  },
  "workspace": {
    "current_dir": "/current/working/directory",
    "project_dir": "/original/project/directory"
  },
  "version": "1.0.80",
  "output_style": {
    "name": "default"
  },
  "cost": {
    "total_cost_usd": 0.01234,
    "total_duration_ms": 45000,
    "total_api_duration_ms": 2300,
    "total_lines_added": 156,
    "total_lines_removed": 23
  }
}

サンプルスクリプト

シンプルなステータスライン

#!/bin/bash
# stdinからJSON入力を読み取る
input=$(cat)

# jqを使用して値を抽出
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}"

Git対応ステータスライン

#!/bin/bash
# stdinからJSON入力を読み取る
input=$(cat)

# jqを使用して値を抽出
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# gitリポジトリ内の場合はgitブランチを表示
GIT_BRANCH=""
if git rev-parse --git-dir > /dev/null 2>&1; then
    BRANCH=$(git branch --show-current 2>/dev/null)
    if [ -n "$BRANCH" ]; then
        GIT_BRANCH=" | 🌿 $BRANCH"
    fi
fi

echo "[$MODEL_DISPLAY] 📁 ${CURRENT_DIR##*/}$GIT_BRANCH"

Pythonの例

#!/usr/bin/env python3
import json
import sys
import os

# stdinからJSONを読み取る
data = json.load(sys.stdin)

# 値を抽出
model = data['model']['display_name']
current_dir = os.path.basename(data['workspace']['current_dir'])

# gitブランチをチェック
git_branch = ""
if os.path.exists('.git'):
    try:
        with open('.git/HEAD', 'r') as f:
            ref = f.read().strip()
            if ref.startswith('ref: refs/heads/'):
                git_branch = f" | 🌿 {ref.replace('ref: refs/heads/', '')}"
    except:
        pass

print(f"[{model}] 📁 {current_dir}{git_branch}")

Node.jsの例

#!/usr/bin/env node

const fs = require('fs');
const path = require('path');

// stdinからJSONを読み取る
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // 値を抽出
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // gitブランチをチェック
    let gitBranch = '';
    try {
        const headContent = fs.readFileSync('.git/HEAD', 'utf8').trim();
        if (headContent.startsWith('ref: refs/heads/')) {
            gitBranch = ` | 🌿 ${headContent.replace('ref: refs/heads/', '')}`;
        }
    } catch (e) {
        // gitリポジトリではないか、HEADを読み取れない
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

ヘルパー関数アプローチ

より複雑なbashスクリプトの場合、ヘルパー関数を作成できます:

#!/bin/bash
# JSON入力を一度読み取る
input=$(cat)

# 一般的な抽出のためのヘルパー関数
get_model_name() { echo "$input" | jq -r '.model.display_name'; }
get_current_dir() { echo "$input" | jq -r '.workspace.current_dir'; }
get_project_dir() { echo "$input" | jq -r '.workspace.project_dir'; }
get_version() { echo "$input" | jq -r '.version'; }
get_cost() { echo "$input" | jq -r '.cost.total_cost_usd'; }
get_duration() { echo "$input" | jq -r '.cost.total_duration_ms'; }
get_lines_added() { echo "$input" | jq -r '.cost.total_lines_added'; }
get_lines_removed() { echo "$input" | jq -r '.cost.total_lines_removed'; }

# ヘルパーを使用
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

ヒント

  • ステータスラインは簡潔に保つ - 1行に収まるようにする
  • (ターミナルがサポートしている場合)絵文字と色を使用して情報をスキャンしやすくする
  • BashでのJSON解析にはjqを使用する(上記の例を参照)
  • モックJSON入力でスクリプトを手動実行してテストする:echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • 必要に応じて(git statusなどの)重い処理のキャッシュを検討する

トラブルシューティング

  • ステータスラインが表示されない場合は、スクリプトが実行可能かチェックする(chmod +x
  • スクリプトがstdout(stderrではなく)に出力することを確認する