Jadikan Claude Code milik Anda dengan baris status kustom yang ditampilkan di bagian bawah antarmuka Claude Code, mirip dengan cara kerja prompt terminal (PS1) di shell seperti Oh-my-zsh.

Buat baris status kustom

Anda dapat:

  • Jalankan /statusline untuk meminta Claude Code membantu Anda mengatur baris status kustom. Secara default, ini akan mencoba mereproduksi prompt terminal Anda, tetapi Anda dapat memberikan instruksi tambahan tentang perilaku yang Anda inginkan kepada Claude Code, seperti /statusline show the model name in orange

  • Langsung tambahkan perintah statusLine ke .claude/settings.json Anda:

{
  "statusLine": {
    "type": "command",
    "command": "~/.claude/statusline.sh",
    "padding": 0 // Opsional: atur ke 0 untuk membiarkan baris status sampai ke tepi
  }
}

Cara Kerjanya

  • Baris status diperbarui ketika pesan percakapan diperbarui
  • Pembaruan berjalan paling banyak setiap 300ms
  • Baris pertama stdout dari perintah Anda menjadi teks baris status
  • Kode warna ANSI didukung untuk menata gaya baris status Anda
  • Claude Code meneruskan informasi kontekstual tentang sesi saat ini (model, direktori, dll.) sebagai JSON ke skrip Anda melalui stdin

Struktur Input JSON

Perintah baris status Anda menerima data terstruktur melalui stdin dalam format 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
  }
}

Contoh Skrip

Baris Status Sederhana

#!/bin/bash
# Baca input JSON dari stdin
input=$(cat)

# Ekstrak nilai menggunakan jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

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

Baris Status yang Menyadari Git

#!/bin/bash
# Baca input JSON dari stdin
input=$(cat)

# Ekstrak nilai menggunakan jq
MODEL_DISPLAY=$(echo "$input" | jq -r '.model.display_name')
CURRENT_DIR=$(echo "$input" | jq -r '.workspace.current_dir')

# Tampilkan branch git jika dalam 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"

Contoh Python

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

# Baca JSON dari stdin
data = json.load(sys.stdin)

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

# Periksa 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}")

Contoh Node.js

#!/usr/bin/env node

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

// Baca JSON dari stdin
let input = '';
process.stdin.on('data', chunk => input += chunk);
process.stdin.on('end', () => {
    const data = JSON.parse(input);
    
    // Ekstrak nilai
    const model = data.model.display_name;
    const currentDir = path.basename(data.workspace.current_dir);
    
    // Periksa 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) {
        // Bukan repo git atau tidak dapat membaca HEAD
    }
    
    console.log(`[${model}] 📁 ${currentDir}${gitBranch}`);
});

Pendekatan Fungsi Pembantu

Untuk skrip bash yang lebih kompleks, Anda dapat membuat fungsi pembantu:

#!/bin/bash
# Baca input JSON sekali
input=$(cat)

# Fungsi pembantu untuk ekstraksi umum
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'; }

# Gunakan pembantu
MODEL=$(get_model_name)
DIR=$(get_current_dir)
echo "[$MODEL] 📁 ${DIR##*/}"

Tips

  • Jaga agar baris status Anda ringkas - harus muat dalam satu baris
  • Gunakan emoji (jika terminal Anda mendukungnya) dan warna untuk membuat informasi mudah dipindai
  • Gunakan jq untuk parsing JSON di Bash (lihat contoh di atas)
  • Uji skrip Anda dengan menjalankannya secara manual dengan input JSON tiruan: echo '{"model":{"display_name":"Test"},"workspace":{"current_dir":"/test"}}' | ./statusline.sh
  • Pertimbangkan untuk menyimpan operasi yang mahal (seperti status git) jika diperlukan

Pemecahan Masalah

  • Jika baris status Anda tidak muncul, periksa bahwa skrip Anda dapat dieksekusi (chmod +x)
  • Pastikan skrip Anda mengeluarkan output ke stdout (bukan stderr)