Machen Sie Claude Code zu Ihrem eigenen mit einer benutzerdefinierten Statuszeile, die am unteren Rand der Claude Code-Benutzeroberfläche angezeigt wird, ähnlich wie Terminal-Prompts (PS1) in Shells wie Oh-my-zsh funktionieren.

Eine benutzerdefinierte Statuszeile erstellen

Sie können entweder:

  • /statusline ausführen, um Claude Code zu bitten, Ihnen beim Einrichten einer benutzerdefinierten Statuszeile zu helfen. Standardmäßig wird versucht, den Prompt Ihres Terminals zu reproduzieren, aber Sie können Claude Code zusätzliche Anweisungen über das gewünschte Verhalten geben, wie z.B. /statusline zeige den Modellnamen in Orange

  • Direkt einen statusLine-Befehl zu Ihrer .claude/settings.json hinzufügen:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // Optional: auf 0 setzen, um Statuszeile bis zum Rand gehen zu lassen
  }
}

Wie es funktioniert

  • Die Statuszeile wird aktualisiert, wenn sich die Konversationsnachrichten aktualisieren
  • Updates laufen höchstens alle 300ms
  • Die erste Zeile von stdout aus Ihrem Befehl wird zum Statuszeilen-Text
  • ANSI-Farbcodes werden für die Gestaltung Ihrer Statuszeile unterstützt
  • Claude Code übergibt kontextuelle Informationen über die aktuelle Sitzung (Modell, Verzeichnisse, etc.) als JSON an Ihr Skript über stdin

JSON-Eingabestruktur

Ihr Statuszeilen-Befehl erhält strukturierte Daten über stdin im JSON-Format:

{
  "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
  }
}

Beispielskripte

Einfache Statuszeile

#!/bin/bash
# JSON-Eingabe von stdin lesen
input=$(cat)

# Werte mit jq extrahieren
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

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

Git-bewusste Statuszeile

#!/bin/bash
# JSON-Eingabe von stdin lesen
input=$(cat)

# Werte mit jq extrahieren
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# Git-Branch anzeigen, wenn in einem Git-Repository
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-Beispiel

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

# JSON von stdin lesen
data = json.load(sys.stdin)

# Werte extrahieren
model = data['model']['display_name']
current_dir = os.path.basename(data['workspace']['current_dir'])

# Nach Git-Branch suchen
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-Beispiel

#!/usr/bin/env node

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

// JSON von stdin lesen
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // Werte extrahieren
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // Nach Git-Branch suchen
    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) {
        // Kein Git-Repository oder kann HEAD nicht lesen
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

Hilfsfunktions-Ansatz

Für komplexere Bash-Skripte können Sie Hilfsfunktionen erstellen:

#!/bin/bash
# JSON-Eingabe einmal lesen
input=$(cat)

# Hilfsfunktionen für häufige Extraktionen
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'; }

# Die Helfer verwenden
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

Tipps

  • Halten Sie Ihre Statuszeile prägnant - sie sollte in eine Zeile passen
  • Verwenden Sie Emojis (wenn Ihr Terminal sie unterstützt) und Farben, um Informationen scanbar zu machen
  • Verwenden Sie jq für JSON-Parsing in Bash (siehe Beispiele oben)
  • Testen Sie Ihr Skript, indem Sie es manuell mit Mock-JSON-Eingabe ausführen: echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • Erwägen Sie das Zwischenspeichern teurer Operationen (wie Git-Status), falls erforderlich

Fehlerbehebung

  • Wenn Ihre Statuszeile nicht erscheint, überprüfen Sie, dass Ihr Skript ausführbar ist (chmod +x)
  • Stellen Sie sicher, dass Ihr Skript nach stdout ausgibt (nicht stderr)