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, Ihren Terminal-Prompt 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 die Statuszeile bis zum Rand gehen zu lassen
  }
}

Wie es funktioniert

  • Die Statuszeile wird aktualisiert, wenn sich die Konversationsnachrichten aktualisieren
  • Aktualisierungen 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 über stdin an Ihr Skript

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

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'; }

# 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 übersichtlich 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, ob Ihr Skript ausführbar ist (chmod +x)
  • Stellen Sie sicher, dass Ihr Skript auf stdout (nicht stderr) ausgibt