
TL;DR
Do cc-slim-statusline
doszedł segment git brancha (⎇ main) — pojawia się tylko w
repo, poza git segment znika bez śladu. Przy okazji jeden
(…) & w statusline.sh zrobił z pasek
terminala drugi ekran dla voice-inboxa: PWA na
iPhonie pokazuje teraz ten sam bar co terminal, więc wiem gdzie jest
Claude Code nawet wtedy, gdy nie siedzę przy biurku.
To jest krótki update z pola, nie tutorial. Piszę bo pomyliłem branch
i kosztowało mnie to godzinę — może komuś oszczędzę tę godzinę.
Jak się pomyliłem
Typowy freelancerski poniedziałek: trzy projekty klienckie otwarte w
trzech oknach, Claude Code w każdym. W jednym z nich robiłem rebase
feature brancha na main, przeszedłem do terminala,
odpaliłem krótką poprawkę przez CC, /commit,
git push.
Push poleciał na main. Bo rebase mnie tam przerzucił, a
ja byłem pewien że nadal jestem na fix/notifications.
Godzina na odkręcenie: git reset --hard na mainie, force
push (ostrożnie, nikt jeszcze nie pulowal), rebase feature’a od nowa.
Niekrytyczne. Irytujące. I całkowicie do uniknięcia, gdyby
branch był cały czas w moim polu widzenia.
Stary pasek nie miał brancha:
◧ 51k/1M 5% | ⏱ 15% → 3h9m | ⚡ medium | $0.81 | ◆ Opus 4.7 | ▸ my-project
Bo kiedy pisałem pierwszą wersję cc-slim-statusline, pracowałem
głównie w jednym branchu na projekt. Branch nie był informacją — był
szumem. Dziś, przy kilku feature branchach dziennie, brak
brancha jest szumem.
Nowy pasek:
◧ 51k/1M 5% | ⏱ 15% → 3h9m | ⚡ medium | $0.81 | ◆ Opus 4.7 | ▸ my-project ⎇ main
Dlaczego akurat tak to
napisałem
Dwie linijki:
branch=$(git -C "$cwd" symbolic-ref --quiet --short HEAD 2>/dev/null)
[ -z "$branch" ] && branch=$(git -C "$cwd" rev-parse --short HEAD 2>/dev/null)
Świadome decyzje, a nie przypadek:
symbolic-ref zamiast
branch --show-current. Ta druga polecana przez
większość tutoriali milcząco zwraca pusty string w detached
HEAD — czyli akurat wtedy, kiedy najbardziej chcesz wiedzieć, że
wylądowałeś gdzie indziej niż myślisz. symbolic-ref --quiet
zwraca błąd (exit 1), łapię go przez 2>/dev/null i
fallbackuję na short SHA. Detached HEAD = widzisz SHA, nie pustkę.
git -C "$cwd" zamiast
[ -e "$cwd/.git" ] guard. Druga wersja wydaje się
czystsza — „sprawdź czy to repo zanim odpalisz gita”. Problem: matchuje
tylko root repo. Gdy Claude Code startuje w
tools/voice-inbox/ wewnątrz monorepo
stroniarz.pl/, .git jest piętro wyżej i guard
zwraca false. Branch znika tam, gdzie najbardziej mi zależy.
git -C po prostu deleguje wykrywanie repo do gita — który
robi to poprawnie od lat.
Brak brancha = brak segmentu. Nie „no branch”, nie
-, nie pusty nawias. Jeśli nie jestem w repo, statusline
nie udaje że jestem. To jest ta sama zasada co reszta paska: niedostępna
wartość znika, a nie wyświetla śmieci.
Koszt: jeden fork git na render (~1ms), raz na turę CC.
Niemierzalne.
Bonus: mirror w PWA
Mam lokalną appkę na Maca, voice-inbox, która
głosowo czyta mi powiadomienia z Slacka/Gmaila/Linear. Do tego ma prosty
PWA do podglądu na telefonie. Pomyślałem: skoro i tak mam ten pasek w
terminalu, czemu nie wysłać go też do PWA?
Cały kod po stronie statusline’a:
(
printf '%s' "$input" | curl -sS -X POST
-H 'content-type: application/json'
--data-binary @-
-m 1 "$VOICE_INBOX_URL" > /dev/null 2>&1
) &
Nawias + & = fire-and-forget w tle.
-m 1 = max sekunda na cały request. Voice-inbox może być
offline, ja mogę być w samolocie, terminalowy statusline
nigdy nie czeka dłużej niż ułamek sekundy. Payload to
surowy JSON od CC — serwer po swojej stronie dorabia branch ze ścieżki i
wrzuca do statsów.
Efekt: Claude Code pracuje w tle nad długim taskiem (deep research z
NotebookLM, 25-minutowy crawl), ja idę po kawę, zaglądam na PWA na
iPhonie — widzę dokładnie ten sam pasek co w terminalu. Wiem czy
skończył, ile zjadł, w którym projekcie/branchu jest.
Nie jest to rewolucja. Jest to 5 linijek bash, które znikają frykcję
„muszę wrócić do biurka żeby sprawdzić”.
Co chcę przekazać
Dwie rzeczy, jeśli piszesz własny statusline (albo cokolwiek co ma
git pod spodem):
symbolic-ref>
branch --show-current. Zawsze. Jedyna kombinacja,
która poprawnie obsługuje detached HEAD bez dodatkowej logiki.- Jeśli myślisz „dodam X tylko na wszelki wypadek” — nie
dodawaj. Ja dodałem brancha wtedy, kiedy zacząłem go
realnie potrzebować. Wcześniej byłby szumem. Pasek statusu to
nie gablota trofeów, to sygnał.
Koszt update’a: 30 minut kodu, godzina testów na własnej konsoli,
commit. Zero breaking changes dla osób, które mają już
cc-slim-statusline zainstalowany —
curl install.sh | bash jeszcze raz i gotowe.
Linki
- cc-slim-statusline: github.com/stroniarz/cc-slim-statusline
- voice-inbox: github.com/stroniarz/voice-inbox
- Licencja: MIT