Rendi Claude Code tuo con una linea di stato personalizzata che viene visualizzata nella parte inferiore dell’interfaccia di Claude Code, simile a come funzionano i prompt del terminale (PS1) nelle shell come Oh-my-zsh.

Crea una linea di stato personalizzata

Puoi:

  • Eseguire /statusline per chiedere a Claude Code di aiutarti a configurare una linea di stato personalizzata. Per impostazione predefinita, cercherà di riprodurre il prompt del tuo terminale, ma puoi fornire istruzioni aggiuntive sul comportamento che desideri a Claude Code, come /statusline mostra il nome del modello in arancione

  • Aggiungere direttamente un comando statusLine al tuo .claude/settings.json:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // Opzionale: imposta a 0 per far arrivare la linea di stato al bordo
  }
}

Come Funziona

  • La linea di stato viene aggiornata quando i messaggi della conversazione vengono aggiornati
  • Gli aggiornamenti vengono eseguiti al massimo ogni 300ms
  • La prima riga di stdout dal tuo comando diventa il testo della linea di stato
  • I codici colore ANSI sono supportati per stilizzare la tua linea di stato
  • Claude Code passa informazioni contestuali sulla sessione corrente (modello, directory, ecc.) come JSON al tuo script tramite stdin

Struttura dell’Input JSON

Il tuo comando della linea di stato riceve dati strutturati tramite stdin in formato 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
  }
}

Script di Esempio

Linea di Stato Semplice

#!/bin/bash
# Leggi l'input JSON da stdin
input=$(cat)

# Estrai i valori usando jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

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

Linea di Stato Consapevole di Git

#!/bin/bash
# Leggi l'input JSON da stdin
input=$(cat)

# Estrai i valori usando jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# Mostra il branch git se in un repo 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"

Esempio Python

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

# Leggi JSON da stdin
data = json.load(sys.stdin)

# Estrai i valori
model = data['model']['display_name']
current_dir = os.path.basename(data['workspace']['current_dir'])

# Controlla il branch 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}")

Esempio Node.js

#!/usr/bin/env node

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

// Leggi JSON da stdin
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // Estrai i valori
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // Controlla il branch 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) {
        // Non è un repo git o non può leggere HEAD
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

Approccio con Funzioni Helper

Per script bash più complessi, puoi creare funzioni helper:

#!/bin/bash
# Leggi l'input JSON una volta
input=$(cat)

# Funzioni helper per estrazioni comuni
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'; }

# Usa gli helper
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

Suggerimenti

  • Mantieni la tua linea di stato concisa - dovrebbe stare su una riga
  • Usa emoji (se il tuo terminale li supporta) e colori per rendere le informazioni scansionabili
  • Usa jq per il parsing JSON in Bash (vedi esempi sopra)
  • Testa il tuo script eseguendolo manualmente con input JSON fittizio: echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • Considera di memorizzare nella cache operazioni costose (come git status) se necessario

Risoluzione dei Problemi

  • Se la tua linea di stato non appare, controlla che il tuo script sia eseguibile (chmod +x)
  • Assicurati che il tuo script produca output su stdout (non stderr)