Skip to content

Anleitung: Claude Code statusLine mit Session-ID, cwd & Branch #3760

@TaprootFreak

Description

@TaprootFreak

Worum geht's

Claude Code rendert standardmässig nur einen minimalen Prompt. Für unsere Multi-Session-Setups (Worktrees pro Session unter ~/Documents/Claude/$CLAUDE_CODE_SESSION_ID/) ist es enorm wertvoll, bei jeder Eingabe sofort zu sehen:

  1. Session-ID (kurz) — welche der parallel laufenden Sessions ist das?
  2. IN-WS / OUT-WS — bin ich im Session-Workspace oder ausserhalb?
  3. Working Directory — wo arbeitet Claude gerade?
  4. Git-Branch — auf welchem Branch?

Beispiel-Output:

[6989cb3c IN-WS] ~/Documents/Claude/6989cb3c-efdd-43dd-8fe1-4823d6c89702/DFXswiss/ccflare (fix/retry-backoff)

Setup

1. Statusline-Script anlegen

~/.claude/statusline.sh:

#!/usr/bin/env bash
# Statusline: kurze Session-ID, Workspace-IN/OUT-Indikator, cwd, Branch.
# Receives Claude Code statusline JSON on stdin.

set -uo pipefail

INPUT=$(cat)

SESSION_ID=$(echo "$INPUT" | jq -r '.session_id // empty')
CWD=$(echo "$INPUT" | jq -r '.workspace.current_dir // empty')

# Fallback wenn JSON-Felder fehlen
[[ -z "$SESSION_ID" ]] && SESSION_ID="${CLAUDE_CODE_SESSION_ID:-unknown}"
[[ -z "$CWD" ]] && CWD="${PWD:-?}"

SHORT="${SESSION_ID:0:8}"
DISPLAY_CWD="${CWD/#$HOME/~}"

WORKSPACE_BASE="$HOME/Documents/Claude/$SESSION_ID"
if [[ "$CWD" == "$WORKSPACE_BASE"* ]]; then
  STATE="IN-WS"
else
  STATE="OUT-WS"
fi

BRANCH=""
if [[ -d "$CWD/.git" ]] || git -C "$CWD" rev-parse --git-dir >/dev/null 2>&1; then
  BRANCH=$(git -C "$CWD" rev-parse --abbrev-ref HEAD 2>/dev/null || true)
fi

if [[ -n "$BRANCH" ]]; then
  echo "[$SHORT $STATE] $DISPLAY_CWD ($BRANCH)"
else
  echo "[$SHORT $STATE] $DISPLAY_CWD"
fi

Ausführbar machen:

chmod +x ~/.claude/statusline.sh

2. In ~/.claude/settings.json eintragen

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh"
  }
}

3. Session-Workspace-Hook (Voraussetzung für IN-WS / OUT-WS)

Damit IN-WS überhaupt einen Sinn ergibt, muss der Session-Ordner bei jedem Start angelegt werden. Ebenfalls in ~/.claude/settings.json:

{
  "hooks": {
    "SessionStart": [
      {
        "hooks": [
          {
            "type": "command",
            "command": "mkdir -p \"$HOME/Documents/Claude/$CLAUDE_CODE_SESSION_ID\""
          }
        ]
      }
    ]
  }
}

Repo-Klone für die Session landen dann unter:

~/Documents/Claude/$CLAUDE_CODE_SESSION_ID/<org>/<repo>/

4. Verifizieren

Neue Claude-Code-Session starten — die Zeile sollte direkt erscheinen. Falls nicht:

  • jq installiert? (brew install jq)
  • Script ausführbar? (ls -l ~/.claude/statusline.sh)
  • Script-Output direkt testen:
    echo '{"session_id":"abc12345","workspace":{"current_dir":"'"$PWD"'"}}' | ~/.claude/statusline.sh

Wie's funktioniert

Claude Code ruft den statusLine.command bei jedem Render auf und reicht JSON über stdin rein. Verfügbare Felder u.a.:

  • session_id
  • workspace.current_dir
  • model.display_name
  • cwd

Das Script gibt eine Zeile auf stdout zurück — das wird unten im UI gerendert.

Erweiterungsideen

  • Model-Name anzeigen (claude-opus-4-7[1m] vs Sonnet)
  • Dirty-Git-Indikator (* bei uncommitted changes)
  • Anzahl Files staged/modified
  • Bei OUT-WS rot färben (ANSI escape codes funktionieren)

Doku: https://docs.claude.com/en/docs/claude-code/statusline

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions