네이티브 statusline 스크립트 및 자동 설치/업데이트 도구 추가
Claude Code 네이티브 statusLine 방식의 4줄 상태바 스크립트와 어느 머신에서든 한 줄로 설치·업데이트할 수 있는 스크립트 추가. 크로스플랫폼(Linux/macOS) stat 호환 처리 포함. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
2537881858
commit
fb59b17031
90
README.md
90
README.md
@ -1,39 +1,85 @@
|
|||||||
# ccstatusline-config
|
# ccstatusline-config
|
||||||
|
|
||||||
Claude Code [ccstatusline](https://github.com/sirmalloc/ccstatusline) 커스텀 설정.
|
Claude Code 커스텀 statusline 중앙 관리 저장소.
|
||||||
|
|
||||||
## 구성
|
여러 머신에서 동일한 statusline을 사용하기 위한 설정과 설치 스크립트.
|
||||||
|
|
||||||
```
|
|
||||||
ccstatusline/settings.json -- 위젯 배치/색상/이모지 설정
|
|
||||||
scripts/ctx-bar.sh -- 컨텍스트 사용량 progress bar
|
|
||||||
scripts/ctx-debug.sh -- 디버그용 (컨텍스트 raw 데이터 출력)
|
|
||||||
```
|
|
||||||
|
|
||||||
## 상태바 레이아웃
|
## 상태바 레이아웃
|
||||||
|
|
||||||
```
|
```
|
||||||
🎨 Explanatory | 🖥️ OY-Mac | 🧠 [████████░░░░] 70% | 💰 $4.10
|
🎨 Explanatory │ 🖥️ odroidhc4 │ 🧠 [░░░░░░░░░░░░] 0% │ 💰 $0.00 0 tokens
|
||||||
🤖 Opus 4.6 | 🔑 session-id
|
🤖 ◆ Opus 4.6 │ 🔑 e6271b19 │ 📟 v2.1.49
|
||||||
📁 /Users/zaksal58 | ⚡ MCP [ATL:O|SRN:O] | 🕐 11:15
|
📁 /home/user │ 🌿 main │ 📊 ▲+0 ▼-0 │ ⏱️ 9s
|
||||||
|
⏵⏵ Explanatory
|
||||||
```
|
```
|
||||||
|
|
||||||
## 설치 (복원)
|
### 표시 항목
|
||||||
|
|
||||||
|
| 라인 | 항목 |
|
||||||
|
|------|------|
|
||||||
|
| 1 | Output Style, 호스트명, 컨텍스트 사용률 (색상 변화), 비용, 토큰 수 |
|
||||||
|
| 2 | 모델 (티어별 심볼: ◆Opus/◇Sonnet/○Haiku), 세션 ID, 버전 |
|
||||||
|
| 3 | 작업 디렉토리, Git 브랜치, 추가/삭제 라인 수, 경과 시간 |
|
||||||
|
| 4 | 현재 모드, Vim 모드 (사용 시), 에이전트 이름 (팀 모드 시) |
|
||||||
|
|
||||||
|
## 설치
|
||||||
|
|
||||||
|
### 방법 1: 클론 후 설치
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. ccstatusline 설정 복사
|
git clone https://git.scrutineer.co.kr/zaksal58/ccstatusline-config.git
|
||||||
cp ccstatusline/settings.json ~/.config/ccstatusline/settings.json
|
cd ccstatusline-config
|
||||||
|
./install.sh
|
||||||
|
```
|
||||||
|
|
||||||
# 2. 커스텀 스크립트 복사
|
### 방법 2: 원격 설치 (한 줄)
|
||||||
cp scripts/ctx-bar.sh ~/.claude/ctx-bar.sh
|
|
||||||
cp scripts/ctx-debug.sh ~/.claude/ctx-debug.sh
|
|
||||||
chmod +x ~/.claude/ctx-bar.sh ~/.claude/ctx-debug.sh
|
|
||||||
|
|
||||||
# 3. ctx-bar.sh 경로 수정 (username이 다를 경우)
|
```bash
|
||||||
# settings.json 내 commandPath를 본인 경로로 변경
|
curl -sSL https://git.scrutineer.co.kr/zaksal58/ccstatusline-config/raw/branch/main/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## 업데이트
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 방법 1: 클론된 디렉토리에서
|
||||||
|
cd ccstatusline-config && git pull && ./install.sh
|
||||||
|
|
||||||
|
# 방법 2: 원격 업데이트 (한 줄)
|
||||||
|
curl -sSL https://git.scrutineer.co.kr/zaksal58/ccstatusline-config/raw/branch/main/update.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
## 구조
|
||||||
|
|
||||||
|
```
|
||||||
|
statusline.sh -- 메인 statusline 스크립트 (Claude Code 네이티브)
|
||||||
|
install.sh -- 자동 설치 스크립트
|
||||||
|
update.sh -- 원격 업데이트 스크립트
|
||||||
|
ccstatusline/ -- (레거시) ccstatusline npm 패키지용 설정
|
||||||
|
settings.json -- 위젯 배치/색상 설정
|
||||||
|
scripts/ -- (레거시) ccstatusline 커스텀 커맨드 스크립트
|
||||||
|
ctx-bar.sh -- 컨텍스트 사용량 progress bar
|
||||||
|
ctx-debug.sh -- 디버그용 raw 데이터 출력
|
||||||
```
|
```
|
||||||
|
|
||||||
## 요구사항
|
## 요구사항
|
||||||
|
|
||||||
- [ccstatusline](https://github.com/sirmalloc/ccstatusline) (npx로 자동 실행)
|
- `jq` (JSON 파싱에 필요)
|
||||||
- `jq` (context bar에 필요)
|
- `git` (설치/업데이트에 필요)
|
||||||
|
- Claude Code v1.0+
|
||||||
|
|
||||||
|
## 동작 방식
|
||||||
|
|
||||||
|
Claude Code의 네이티브 `statusLine` 설정을 사용합니다.
|
||||||
|
`~/.claude/settings.json`에 다음이 추가됩니다:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"statusLine": {
|
||||||
|
"type": "command",
|
||||||
|
"command": "/home/<user>/.claude/statusline.sh",
|
||||||
|
"padding": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
스크립트는 Claude Code에서 JSON을 stdin으로 받아 ANSI 색상이 적용된 4줄 상태바를 출력합니다.
|
||||||
|
|||||||
151
install.sh
Executable file
151
install.sh
Executable file
@ -0,0 +1,151 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ccstatusline-config installer
|
||||||
|
# 어느 머신에서든 한 줄로 설치:
|
||||||
|
# git clone https://git.scrutineer.co.kr/zaksal58/ccstatusline-config.git && cd ccstatusline-config && ./install.sh
|
||||||
|
#
|
||||||
|
# 또는 원격 설치:
|
||||||
|
# curl -sSL https://git.scrutineer.co.kr/zaksal58/ccstatusline-config/raw/branch/main/install.sh | bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO_URL="https://git.scrutineer.co.kr/zaksal58/ccstatusline-config.git"
|
||||||
|
CLAUDE_DIR="${HOME}/.claude"
|
||||||
|
STATUSLINE_SCRIPT="${CLAUDE_DIR}/statusline.sh"
|
||||||
|
SETTINGS_FILE="${CLAUDE_DIR}/settings.json"
|
||||||
|
|
||||||
|
# --- Colors ---
|
||||||
|
RED=$'\033[91m'
|
||||||
|
GREEN=$'\033[92m'
|
||||||
|
YELLOW=$'\033[93m'
|
||||||
|
CYAN=$'\033[96m'
|
||||||
|
BOLD=$'\033[1m'
|
||||||
|
RESET=$'\033[0m'
|
||||||
|
|
||||||
|
info() { echo "${CYAN}[INFO]${RESET} $*"; }
|
||||||
|
ok() { echo "${GREEN}[OK]${RESET} $*"; }
|
||||||
|
warn() { echo "${YELLOW}[WARN]${RESET} $*"; }
|
||||||
|
err() { echo "${RED}[ERROR]${RESET} $*" >&2; }
|
||||||
|
|
||||||
|
# --- Dependency check ---
|
||||||
|
check_deps() {
|
||||||
|
local missing=()
|
||||||
|
for cmd in jq git; do
|
||||||
|
if ! command -v "$cmd" >/dev/null 2>&1; then
|
||||||
|
missing+=("$cmd")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ ${#missing[@]} -gt 0 ]; then
|
||||||
|
err "필수 의존성이 없습니다: ${missing[*]}"
|
||||||
|
err "설치 후 다시 실행해주세요."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Determine script source directory ---
|
||||||
|
get_script_dir() {
|
||||||
|
# If run from a cloned repo, use local files
|
||||||
|
local dir
|
||||||
|
dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
if [ -f "${dir}/statusline.sh" ]; then
|
||||||
|
echo "$dir"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
# If run via curl pipe, clone to temp dir
|
||||||
|
local tmpdir
|
||||||
|
tmpdir=$(mktemp -d)
|
||||||
|
info "저장소 클론 중..."
|
||||||
|
git clone --depth 1 "$REPO_URL" "$tmpdir" >/dev/null 2>&1
|
||||||
|
echo "$tmpdir"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Install statusline script ---
|
||||||
|
install_statusline() {
|
||||||
|
local src_dir="$1"
|
||||||
|
|
||||||
|
mkdir -p "$CLAUDE_DIR"
|
||||||
|
|
||||||
|
# Backup existing statusline if different
|
||||||
|
if [ -f "$STATUSLINE_SCRIPT" ]; then
|
||||||
|
if ! diff -q "${src_dir}/statusline.sh" "$STATUSLINE_SCRIPT" >/dev/null 2>&1; then
|
||||||
|
local backup="${STATUSLINE_SCRIPT}.bak.$(date +%Y%m%d%H%M%S)"
|
||||||
|
cp "$STATUSLINE_SCRIPT" "$backup"
|
||||||
|
warn "기존 statusline.sh 백업: ${backup}"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp "${src_dir}/statusline.sh" "$STATUSLINE_SCRIPT"
|
||||||
|
chmod +x "$STATUSLINE_SCRIPT"
|
||||||
|
ok "statusline.sh 설치 완료: ${STATUSLINE_SCRIPT}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Update settings.json ---
|
||||||
|
update_settings() {
|
||||||
|
local statusline_entry
|
||||||
|
statusline_entry=$(cat <<JSONEOF
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "${STATUSLINE_SCRIPT}",
|
||||||
|
"padding": 0
|
||||||
|
}
|
||||||
|
JSONEOF
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ ! -f "$SETTINGS_FILE" ]; then
|
||||||
|
# Create new settings.json with statusLine
|
||||||
|
cat > "$SETTINGS_FILE" <<JSONEOF
|
||||||
|
{
|
||||||
|
"statusLine": {
|
||||||
|
"type": "command",
|
||||||
|
"command": "${STATUSLINE_SCRIPT}",
|
||||||
|
"padding": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
JSONEOF
|
||||||
|
ok "settings.json 생성 완료 (statusLine 설정 포함)"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if statusLine is already configured
|
||||||
|
local existing
|
||||||
|
existing=$(jq -r '.statusLine.command // ""' "$SETTINGS_FILE" 2>/dev/null || echo "")
|
||||||
|
|
||||||
|
if [ "$existing" = "$STATUSLINE_SCRIPT" ]; then
|
||||||
|
ok "settings.json에 statusLine이 이미 올바르게 설정되어 있습니다."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Update or add statusLine entry
|
||||||
|
local tmpfile
|
||||||
|
tmpfile=$(mktemp)
|
||||||
|
jq --arg cmd "$STATUSLINE_SCRIPT" '.statusLine = {"type": "command", "command": $cmd, "padding": 0}' "$SETTINGS_FILE" > "$tmpfile"
|
||||||
|
mv "$tmpfile" "$SETTINGS_FILE"
|
||||||
|
ok "settings.json 업데이트 완료 (statusLine 경로: ${STATUSLINE_SCRIPT})"
|
||||||
|
}
|
||||||
|
|
||||||
|
# --- Main ---
|
||||||
|
main() {
|
||||||
|
echo ""
|
||||||
|
echo "${BOLD}${CYAN}╔══════════════════════════════════════╗${RESET}"
|
||||||
|
echo "${BOLD}${CYAN}║ Claude Code Statusline Installer ║${RESET}"
|
||||||
|
echo "${BOLD}${CYAN}╚══════════════════════════════════════╝${RESET}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
check_deps
|
||||||
|
|
||||||
|
local src_dir
|
||||||
|
src_dir=$(get_script_dir)
|
||||||
|
|
||||||
|
install_statusline "$src_dir"
|
||||||
|
update_settings
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "${GREEN}${BOLD}설치 완료!${RESET}"
|
||||||
|
echo ""
|
||||||
|
echo " Claude Code를 다시 시작하면 새 statusline이 적용됩니다."
|
||||||
|
echo ""
|
||||||
|
echo " 업데이트하려면:"
|
||||||
|
echo " ${CYAN}cd ${src_dir} && git pull && ./install.sh${RESET}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
main "$@"
|
||||||
208
statusline.sh
Executable file
208
statusline.sh
Executable file
@ -0,0 +1,208 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Claude Code 4-line statusline
|
||||||
|
# Reads JSON from stdin, outputs ANSI-colored 4-line status bar
|
||||||
|
|
||||||
|
# --- Color definitions (bright variants for dark backgrounds) ---
|
||||||
|
RED=$'\033[91m'
|
||||||
|
GREEN=$'\033[92m'
|
||||||
|
YELLOW=$'\033[93m'
|
||||||
|
BLUE=$'\033[94m'
|
||||||
|
MAGENTA=$'\033[95m'
|
||||||
|
CYAN=$'\033[96m'
|
||||||
|
GRAY=$'\033[37m'
|
||||||
|
WHITE=$'\033[97m'
|
||||||
|
BOLD=$'\033[1m'
|
||||||
|
DIM=$'\033[2m'
|
||||||
|
RESET=$'\033[0m'
|
||||||
|
SEP="${GRAY} │ ${RESET}"
|
||||||
|
|
||||||
|
# --- Read all JSON input ---
|
||||||
|
input=$(cat)
|
||||||
|
|
||||||
|
# --- Single jq call: extract all 16 fields newline-separated ---
|
||||||
|
# Using newlines instead of tabs to avoid bash IFS merging consecutive delimiters
|
||||||
|
mapfile -t _fields < <(echo "$input" | jq -r '
|
||||||
|
(.model.display_name // .model.id // "?"),
|
||||||
|
(.model.id // "?"),
|
||||||
|
(.context_window.used_percentage // 0 | floor | tostring),
|
||||||
|
(.context_window.context_window_size // 0 | tostring),
|
||||||
|
(.context_window.total_input_tokens // 0 | tostring),
|
||||||
|
(.context_window.total_output_tokens // 0 | tostring),
|
||||||
|
(.cost.total_cost_usd // 0 | . * 100 | floor | . / 100 | tostring),
|
||||||
|
(.cost.total_duration_ms // 0 | tostring),
|
||||||
|
(.cost.total_lines_added // 0 | tostring),
|
||||||
|
(.cost.total_lines_removed // 0 | tostring),
|
||||||
|
(if .session_id == null or .session_id == "" then "--------" else .session_id end),
|
||||||
|
(.version // "?.?.?"),
|
||||||
|
(if .output_style.name == null or .output_style.name == "" then "default" else .output_style.name end),
|
||||||
|
(.workspace.current_dir // "~"),
|
||||||
|
(.vim.mode // ""),
|
||||||
|
(.agent.name // "")
|
||||||
|
')
|
||||||
|
model_name="${_fields[0]}"
|
||||||
|
model_id="${_fields[1]}"
|
||||||
|
ctx_pct="${_fields[2]}"
|
||||||
|
ctx_size="${_fields[3]}"
|
||||||
|
total_in_tok="${_fields[4]}"
|
||||||
|
total_out_tok="${_fields[5]}"
|
||||||
|
cost="${_fields[6]}"
|
||||||
|
dur_ms="${_fields[7]}"
|
||||||
|
lines_add="${_fields[8]}"
|
||||||
|
lines_rm="${_fields[9]}"
|
||||||
|
session_id="${_fields[10]}"
|
||||||
|
version="${_fields[11]}"
|
||||||
|
style="${_fields[12]}"
|
||||||
|
cwd="${_fields[13]}"
|
||||||
|
vim_mode="${_fields[14]}"
|
||||||
|
agent_name="${_fields[15]}"
|
||||||
|
|
||||||
|
# --- Hostname (cached in variable, never changes) ---
|
||||||
|
HOSTNAME_SHORT=$(hostname -s 2>/dev/null || echo "unknown")
|
||||||
|
|
||||||
|
# --- Context progress bar (12 chars wide) ---
|
||||||
|
pct=${ctx_pct:-0}
|
||||||
|
filled=$(( pct * 12 / 100 ))
|
||||||
|
empty=$(( 12 - filled ))
|
||||||
|
|
||||||
|
if [ "$pct" -ge 70 ]; then
|
||||||
|
bar_color="$RED"
|
||||||
|
elif [ "$pct" -ge 50 ]; then
|
||||||
|
bar_color="$YELLOW"
|
||||||
|
else
|
||||||
|
bar_color="$GREEN"
|
||||||
|
fi
|
||||||
|
|
||||||
|
bar_filled=""
|
||||||
|
bar_empty=""
|
||||||
|
for (( i=0; i<filled; i++ )); do bar_filled+="█"; done
|
||||||
|
for (( i=0; i<empty; i++ )); do bar_empty+="░"; done
|
||||||
|
progress_bar="${bar_color}${bar_filled}${GRAY}${bar_empty}${RESET}"
|
||||||
|
pct_display="${bar_color}${pct}%${RESET}"
|
||||||
|
|
||||||
|
# --- Cost color ---
|
||||||
|
cost_val=${cost:-0}
|
||||||
|
# Compare using awk for floating-point
|
||||||
|
cost_display=$(awk -v c="$cost_val" '
|
||||||
|
BEGIN {
|
||||||
|
if (c+0 >= 5) col="\033[91m";
|
||||||
|
else if (c+0 >= 2) col="\033[93m";
|
||||||
|
else col="\033[92m";
|
||||||
|
printf "%s$%.2f\033[0m", col, c+0
|
||||||
|
}')
|
||||||
|
|
||||||
|
# --- Token formatting ---
|
||||||
|
format_tokens() {
|
||||||
|
local tok=$1
|
||||||
|
if [ "$tok" -ge 1000000 ] 2>/dev/null; then
|
||||||
|
echo "$(( tok / 1000000 ))M"
|
||||||
|
elif [ "$tok" -ge 1000 ] 2>/dev/null; then
|
||||||
|
echo "$(( tok / 1000 ))k"
|
||||||
|
else
|
||||||
|
echo "${tok}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
in_tok_display=$(format_tokens "${total_in_tok:-0}")
|
||||||
|
|
||||||
|
# --- Model tier symbol ---
|
||||||
|
case "$model_id" in
|
||||||
|
*opus*) tier_sym="${MAGENTA}${BOLD}◆${RESET}"; model_color="${MAGENTA}${BOLD}" ;;
|
||||||
|
*sonnet*) tier_sym="${BLUE}${BOLD}◇${RESET}"; model_color="${BLUE}${BOLD}" ;;
|
||||||
|
*haiku*) tier_sym="${GREEN}${BOLD}○${RESET}"; model_color="${GREEN}${BOLD}" ;;
|
||||||
|
*) tier_sym="${GRAY}●${RESET}"; model_color="${GRAY}" ;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# --- Session ID (first 8 chars) ---
|
||||||
|
session_short="${session_id:0:8}"
|
||||||
|
|
||||||
|
# --- Duration formatting ---
|
||||||
|
dur_total_sec=$(( ${dur_ms:-0} / 1000 ))
|
||||||
|
if [ "$dur_total_sec" -ge 3600 ]; then
|
||||||
|
dur_h=$(( dur_total_sec / 3600 ))
|
||||||
|
dur_m=$(( (dur_total_sec % 3600) / 60 ))
|
||||||
|
dur_display="${dur_h}h ${dur_m}m"
|
||||||
|
elif [ "$dur_total_sec" -ge 60 ]; then
|
||||||
|
dur_m=$(( dur_total_sec / 60 ))
|
||||||
|
dur_s=$(( dur_total_sec % 60 ))
|
||||||
|
dur_display="${dur_m}m ${dur_s}s"
|
||||||
|
else
|
||||||
|
dur_display="${dur_total_sec}s"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# --- Git branch (cached with 5s TTL) ---
|
||||||
|
CACHE_FILE="/tmp/claude-statusline-git-cache"
|
||||||
|
NOW=$(date +%s)
|
||||||
|
GIT_BRANCH=""
|
||||||
|
if [ -f "$CACHE_FILE" ]; then
|
||||||
|
CACHE_AGE=$(( NOW - $(stat -c %Y "$CACHE_FILE" 2>/dev/null || stat -f %m "$CACHE_FILE" 2>/dev/null || echo 0) ))
|
||||||
|
if [ "$CACHE_AGE" -lt 5 ]; then
|
||||||
|
GIT_BRANCH=$(cat "$CACHE_FILE")
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if [ -z "$GIT_BRANCH" ]; then
|
||||||
|
GIT_BRANCH=$(cd "${cwd:-$HOME}" 2>/dev/null && git symbolic-ref --short HEAD 2>/dev/null || echo "")
|
||||||
|
echo "$GIT_BRANCH" > "$CACHE_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# LINE 1: Identity & Resources
|
||||||
|
# ============================================================
|
||||||
|
line1="\xf0\x9f\x8e\xa8 ${WHITE}${style}${RESET}"
|
||||||
|
line1+="${SEP}"
|
||||||
|
line1+="\xf0\x9f\x96\xa5\xef\xb8\x8f ${CYAN}${BOLD}${HOSTNAME_SHORT}${RESET}"
|
||||||
|
line1+="${SEP}"
|
||||||
|
line1+="\xf0\x9f\xa7\xa0 [${progress_bar}] ${pct_display}"
|
||||||
|
line1+="${SEP}"
|
||||||
|
line1+="\xf0\x9f\x92\xb0 ${cost_display}"
|
||||||
|
line1+=" ${GRAY}${in_tok_display} tokens${RESET}"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# LINE 2: Model & Session
|
||||||
|
# ============================================================
|
||||||
|
line2="\xf0\x9f\xa4\x96 ${tier_sym} ${model_color}${model_name}${RESET}"
|
||||||
|
line2+="${SEP}"
|
||||||
|
line2+="\xf0\x9f\x94\x91 ${GRAY}${session_short}${RESET}"
|
||||||
|
line2+="${SEP}"
|
||||||
|
line2+="\xf0\x9f\x93\x9f ${CYAN}v${version}${RESET}"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# LINE 3: Workspace & Tools
|
||||||
|
# ============================================================
|
||||||
|
line3="\xf0\x9f\x93\x81 ${CYAN}${cwd}${RESET}"
|
||||||
|
if [ -n "$GIT_BRANCH" ]; then
|
||||||
|
line3+="${SEP}"
|
||||||
|
line3+="\xf0\x9f\x8c\xbf ${GREEN}${BOLD}${GIT_BRANCH}${RESET}"
|
||||||
|
fi
|
||||||
|
line3+="${SEP}"
|
||||||
|
line3+="\xf0\x9f\x93\x8a ${GREEN}▲+${lines_add}${RESET} ${RED}▼-${lines_rm}${RESET}"
|
||||||
|
line3+="${SEP}"
|
||||||
|
line3+="\xe2\x8f\xb1\xef\xb8\x8f ${YELLOW}${dur_display}${RESET}"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# LINE 4: Mode & Status (conditional)
|
||||||
|
# ============================================================
|
||||||
|
line4="\xe2\x8f\xb5\xe2\x8f\xb5 ${BOLD}${style}${RESET}"
|
||||||
|
|
||||||
|
if [ -n "$vim_mode" ]; then
|
||||||
|
vim_upper=$(echo "$vim_mode" | tr '[:lower:]' '[:upper:]')
|
||||||
|
case "$vim_upper" in
|
||||||
|
NORMAL) vim_color="$BLUE" ;;
|
||||||
|
INSERT) vim_color="$GREEN" ;;
|
||||||
|
*) vim_color="$WHITE" ;;
|
||||||
|
esac
|
||||||
|
line4+="${SEP}"
|
||||||
|
line4+="\xf0\x9f\x94\xb2 ${vim_color}${vim_upper}${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$agent_name" ]; then
|
||||||
|
line4+="${SEP}"
|
||||||
|
line4+="\xf0\x9f\x8f\xb7\xef\xb8\x8f ${MAGENTA}${agent_name}${RESET}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# Output all 4 lines
|
||||||
|
# ============================================================
|
||||||
|
printf '%b\n' "$line1"
|
||||||
|
printf '%b\n' "$line2"
|
||||||
|
printf '%b\n' "$line3"
|
||||||
|
printf '%b\n' "$line4"
|
||||||
41
update.sh
Executable file
41
update.sh
Executable file
@ -0,0 +1,41 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# ccstatusline-config updater
|
||||||
|
# 원격 저장소에서 최신 statusline을 가져와 설치합니다.
|
||||||
|
#
|
||||||
|
# 사용법:
|
||||||
|
# ~/.claude/update-statusline.sh
|
||||||
|
#
|
||||||
|
# 또는 원격 실행:
|
||||||
|
# curl -sSL https://git.scrutineer.co.kr/zaksal58/ccstatusline-config/raw/branch/main/update.sh | bash
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO_URL="https://git.scrutineer.co.kr/zaksal58/ccstatusline-config.git"
|
||||||
|
CLAUDE_DIR="${HOME}/.claude"
|
||||||
|
STATUSLINE_SCRIPT="${CLAUDE_DIR}/statusline.sh"
|
||||||
|
|
||||||
|
GREEN=$'\033[92m'
|
||||||
|
CYAN=$'\033[96m'
|
||||||
|
YELLOW=$'\033[93m'
|
||||||
|
BOLD=$'\033[1m'
|
||||||
|
RESET=$'\033[0m'
|
||||||
|
|
||||||
|
info() { echo "${CYAN}[INFO]${RESET} $*"; }
|
||||||
|
ok() { echo "${GREEN}[OK]${RESET} $*"; }
|
||||||
|
warn() { echo "${YELLOW}[WARN]${RESET} $*"; }
|
||||||
|
|
||||||
|
tmpdir=$(mktemp -d)
|
||||||
|
trap 'rm -rf "$tmpdir"' EXIT
|
||||||
|
|
||||||
|
info "최신 statusline 가져오는 중..."
|
||||||
|
git clone --depth 1 "$REPO_URL" "$tmpdir" >/dev/null 2>&1
|
||||||
|
|
||||||
|
if diff -q "${tmpdir}/statusline.sh" "$STATUSLINE_SCRIPT" >/dev/null 2>&1; then
|
||||||
|
ok "이미 최신 버전입니다."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp "${tmpdir}/statusline.sh" "$STATUSLINE_SCRIPT"
|
||||||
|
chmod +x "$STATUSLINE_SCRIPT"
|
||||||
|
ok "statusline.sh 업데이트 완료!"
|
||||||
|
echo " Claude Code를 다시 시작하면 적용됩니다."
|
||||||
Loading…
Reference in New Issue
Block a user