Files
Kalina ed85797eda fix(shell): zsh-Pflicht im Installer durchsetzen und benennen
Der Installer installiert zsh bei Bedarf selbst (apt-get, dnf, pacman, zypper, apk) und sagt das im Kopf und in der Ausgabe. Ohne zsh bricht der Shell-Teil jetzt VOR dem ersten Schreibzugriff ab (Exit 1, Befehl genannt, ~/.zshrc unangetastet), statt einen wirkungslosen Prompt-Eintrag zu hinterlassen. install_zsh meldet Erfolg nur bei echtem Fund im PATH, chsh-Fehler werden gemeldet, Abschlusszeile nennt Exit-Status.
2026-11-02 19:07:16 +01:00
..

Kalina CI in der Shell

Prompt und Terminal-Palette in derselben Farbwelt wie das VS-Code-Theme (themes/kalina-ci-dark.json). Der Prompt ist ein eigenstaendiges zsh-Modul, kein oh-my-zsh und kein powerlevel10k noetig.

┌─ kalina  ~/kalina-ci · main ✚1 ✎2 · 4.2s
└─ ❯
Farbe Wert Rolle
Tinte #0B0F14 Flaeche
Knochenweiss #F5F5EF Text, Pfad
Markenrot #C1121F nur Grafik (Pfeil, Cursor) — 3,09:1 auf Tinte
Text-Rot #E0454F Fehlercode, Akzent — 4,70:1 auf Tinte
Salbei #7FA88C nur Git „hinzugefuegt"
Steel #3A4250 Linien
Muted #8A94A2 Hostname

zsh ist Pflicht

Der Prompt ist zsh-Syntax in ~/.zshrc. In bash, fish oder sh passiert nichts — auch dann nicht, wenn die Datei korrekt geschrieben wurde. Deshalb:

  1. Fehlt zsh, installiert install.sh ihn selbst — apt-get, dnf, pacman, zypper oder apk, je nach System. Der Versuch steht als erste Zeile im Shell-Teil.
  2. Geht das nicht (kein bekannter Paketmanager, oder sudo verlangt ein Passwort ohne -n), bricht der Shell-Teil vor dem ersten Schreibzugriff ab, nennt den genauen Befehl und endet mit Exit 1. ~/.zshrc bleibt dann unangetastet — ein Eintrag dort waere in bash ohnehin wirkungslos.
  3. Login-Shell: chsh -s <zsh> laeuft am Ende (abschaltbar mit --no-chsh). Wirksam wird es erst in der naechsten Sitzung: exec zsh fuer sofort, sonst neu einloggen.

Wer zsh von Hand nachzieht:

sudo apt-get install -y zsh     # Debian/Ubuntu
sudo dnf install -y zsh         # Fedora
sudo pacman -S --needed zsh     # Arch
sudo zypper install -y zsh      # openSUSE
sudo apk add zsh                # Alpine
bash install.sh                 # danach erneut

Installation auf einer neuen Maschine

# oder direkt, ohne Klon (Repo ist oeffentlich lesbar):
# curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/install.sh
git clone https://gitea.m-m.bio/mm/kalina-ci.git
cd kalina-ci/shell
./install.sh --dry-run     # zeigen, was passieren wuerde
./install.sh               # ausfuehren

Das Skript ist idempotent, sichert jede Datei nach .vor-kalina-ci-<stempel> und laesst sich in Teilen fahren:

Schalter Wirkung
--dry-run nichts schreiben, nur anzeigen
--shell-only nur zsh + Prompt
--terminal-only nur Terminal-Palette
--no-chsh Login-Shell nicht umstellen (Prompt bleibt, bis du zsh startest)

Erkannt und eingerichtet werden: foot (~/.config/foot/foot.ini, [colors-dark]), qterminal (~/.local/share/qterminal-ci/…/KalinaCI.colorscheme plus ~/.config/qterminal.org/qterminal.ini und ein environment.d-Eintrag, weil qtermwidget6 nur XDG_DATA_DIRS durchsucht), xfce4-terminal (~/.config/xfce4/terminal/terminalrc und xfconf-query, sonst gewinnt das GTK-Theme) sowie xterm (~/.Xresources, aktiv nach xrdb -merge).

Schalter im Prompt

Variable Wirkung
KALINA_CI_PROMPT=0 Prompt abschalten (Modul wird nicht geladen)
KALINA_CI_NO_NEWLINE=1 keine Leerzeile vor dem Prompt
KALINA_CI_TRUECOLOR=0|1 Farbmodus erzwingen (sonst Automatik)

Fallen, die beim Ausrollen aufgefallen sind

  • Truecolor kommt per SSH nicht an. COLORTERM wird nicht uebertragen, remote greift der 256-Farben-Ersatz (231/145/60/161 statt exakt). Das ist gewollt.
  • Der erste Prompt darf kein ✗1 zeigen. precmd liest $? aus dem Ende der .zshrc; das Modul setzt den ersten echten Prompt deshalb auf 0.
  • p10k wird abgeloest, nicht umgef aerbt. Wer ~/.p10k.zsh behaelt, muss ZSH_THEME="" setzen und die Instant-Prompt-Zeilen samt fi auskommentieren — sonst startet jede Shell mit parse error near 'fi'.
  • Login-Shell-Wechsel: nicht-interaktive zsh-Aufrufe (ssh host '…') brechen bei leerem Glob ab, bash nicht. Das Modul setzt deshalb no_nomatch in ~/.zshenv.