diff --git a/CHANGELOG.md b/CHANGELOG.md index 22b7763..50287f1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,17 @@ Format: Datum — was — warum. Die CI beginnt versioniert am 2026-10-23; davor sie verstreut (Marke in `brand/`, Dokument-CSS im Open-WebUI-Skill) und wurde nicht versioniert. +## 1.3.1 — 2026-11-02 + +- **zsh ist Pflicht, und das Skript sagt es jetzt auch.** `shell/install.sh` installiert zsh + bei Bedarf selbst (apt-get, dnf, pacman, zypper, apk) und schreibt das in den Kopf und in + die Ausgabe. Geht es nicht — kein Paketmanager oder `sudo` ohne Passwort — bricht der + Shell-Teil **vor dem ersten Schreibzugriff** ab, nennt den genauen Befehl und endet mit + Exit 1; `~/.zshrc` bleibt unangetastet, statt einen wirkungslosen Prompt-Eintrag zu + hinterlassen. Ein `chsh`-Fehlschlag wird gemeldet statt verschluckt, und die Abschlusszeile + nennt Exit-Status und naechsten Schritt. +- `install_zsh` meldet Erfolg nur noch, wenn `zsh` danach wirklich im `PATH` liegt. + ## 1.3.0 — 2026-11-02 - **Die CI reicht bis in die Shell.** `shell/prompt.zsh` rendert einen zweizeiligen Prompt diff --git a/README.md b/README.md index c62f218..8317b87 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,12 @@ Prompt, Terminal-Palette, ein Skript für beides. ![Der Prompt in einem Terminal mit CI-Palette](assets/vorschau-shell.png) +> **zsh ist Pflicht.** Der Prompt ist ein zsh-Modul; in bash passiert nichts. Das Skript +> installiert zsh selbst — `apt-get`, `dnf`, `pacman`, `zypper` oder `apk`, je nach System. +> Fehlt der Paketmanager oder verlangt `sudo` ein Passwort, **bricht der Shell-Teil ab**, nennt +> den genauen Befehl und lässt `~/.zshrc` unangetastet: lieber kein Prompt als ein stummer. +> Danach einmal neu einloggen (oder `exec zsh`), sonst greift die Login-Shell-Änderung nicht. + ```bash curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/install.sh bash install.sh --dry-run # zeigt, was passieren würde @@ -65,7 +71,7 @@ bash install.sh # führt es aus Kein Token nötig — das Repo ist öffentlich lesbar. Das Skript ist idempotent, sichert jede Datei nach `.vor-kalina-ci-` und erkennt **foot**, **qterminal**, **xfce4-terminal** -und **xterm**; zsh installiert es über den vorhandenen Paketmanager. Schalter: +und **xterm**. Schalter: `--shell-only`, `--terminal-only`, `--no-chsh`. Details und die Fallen beim Ausrollen stehen in [`shell/README.md`](shell/README.md). diff --git a/SKILL.md b/SKILL.md index fe91620..8ab2b17 100644 --- a/SKILL.md +++ b/SKILL.md @@ -2,7 +2,7 @@ name: kalina-ci description: Use when a PDF, page or slide must carry the KALINA corporate identity. One CSS, one CLI, one source. metadata: - version: "1.3.0" + version: "1.3.1" stand: "2026-11-02" --- @@ -164,6 +164,11 @@ curl -fsSLo install.sh https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell/ bash install.sh --dry-run && bash install.sh ``` +**zsh ist Pflicht** — der Prompt ist ein zsh-Modul. Das Skript installiert zsh bei Bedarf +selbst; kann es das nicht (kein Paketmanager, `sudo` ohne Passwort), bricht der Shell-Teil mit +Exit 1 ab und nennt den Befehl, statt einen wirkungslosen `~/.zshrc`-Eintrag zu hinterlassen. +Danach `exec zsh` oder neu einloggen, sonst greift die Login-Shell nicht. + Das Skript ist idempotent, sichert jede Datei und erkennt foot, qterminal, xfce4-terminal sowie xterm. Die Paletten sind gemessen, nicht geraten — die drei Fallen (qtermwidget6 kennt kein Benutzerverzeichnis, xfconf überstimmt `terminalrc`, foot will `[colors-dark]`) diff --git a/shell/README.md b/shell/README.md index ece0c1b..d8977c6 100644 --- a/shell/README.md +++ b/shell/README.md @@ -19,6 +19,31 @@ kein oh-my-zsh und kein powerlevel10k noetig. | 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 ` 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: + +```sh +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 ```sh @@ -38,7 +63,7 @@ und laesst sich in Teilen fahren: | `--dry-run` | nichts schreiben, nur anzeigen | | `--shell-only` | nur zsh + Prompt | | `--terminal-only` | nur Terminal-Palette | -| `--no-chsh` | Login-Shell nicht umstellen | +| `--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` diff --git a/shell/install.sh b/shell/install.sh index eb5fe48..f1db0b7 100755 --- a/shell/install.sh +++ b/shell/install.sh @@ -10,6 +10,12 @@ # ./install.sh --terminal-only # nur Terminal-Palette # ./install.sh --no-chsh # Login-Shell nicht anfassen # +# zsh ist Pflicht: der Prompt ist ein zsh-Modul, in bash wirkt er nicht. Fehlt zsh, +# installiert dieses Skript ihn selbst (apt-get, dnf, pacman, zypper, apk). Geht das +# nicht — kein Paketmanager oder sudo ohne Passwort — bricht der Shell-Teil ab und +# nennt den genauen Befehl zum Nachholen. Ein halb eingerichtetes ~/.zshrc hilft +# niemandem, deshalb lieber kein Prompt als ein stummer. +# # Grundsaetze: jede Datei wird vorher gesichert (.vor-kalina-ci-), # jeder Block ist an einem Marker erkennbar und wird nicht doppelt geschrieben, # jede veraenderte Datei wird anschliessend mit dem passenden Pruefer getestet. @@ -26,6 +32,7 @@ SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" RAW="${KALINA_CI_RAW:-https://gitea.m-m.bio/mm/kalina-ci/raw/branch/main/shell}" DRY=0; DO_SHELL=1; DO_TERM=1; DO_CHSH=1 +ZSH_OK=0 # 1 = zsh vorhanden oder installiert; 0 = Prompt kann nicht greifen for arg in "$@"; do case "$arg" in --dry-run) DRY=1 ;; @@ -58,6 +65,11 @@ fi install_zsh() { command -v zsh >/dev/null && { ok "zsh vorhanden: $(zsh --version)"; return 0; } + if [ "$DRY" = 1 ]; then + say " zsh fehlt — ein echter Lauf wuerde ihn jetzt installieren (ohne zsh kein Prompt)." + else + say " zsh fehlt — wird jetzt installiert (ohne zsh kein Prompt)." + fi local pm="" for c in apt-get dnf pacman zypper apk; do command -v "$c" >/dev/null && pm="$c" && break; done [ -n "$pm" ] || { warn "kein bekannter Paketmanager — zsh bitte von Hand installieren"; return 1; } @@ -76,10 +88,15 @@ install_zsh() { apt-get) run $SUDO env DEBIAN_FRONTEND=noninteractive apt-get install -y zsh ;; dnf) run $SUDO dnf install -y zsh ;; pacman) run $SUDO pacman -S --needed --noconfirm zsh ;; - zypper) run $SUDO zypper --non-interactive install zsh ;; - apk) run $SUDO apk add zsh ;; + zypper) $SUDO zypper --non-interactive install zsh ;; + apk) $SUDO apk add zsh ;; esac - command -v zsh >/dev/null && ok "zsh installiert: $(zsh --version)" || warn "zsh weiterhin nicht auffindbar" + if command -v zsh >/dev/null; then + ok "zsh installiert: $(zsh --version)" + return 0 + fi + warn "zsh ist nach der Installation nicht auffindbar — PATH pruefen" + return 1 } # Block mit Markern an eine Datei anhaengen (nicht doppelt) @@ -101,7 +118,17 @@ append_block() { # ------------------------------------------------------------------ Shell do_shell() { step "Shell (zsh + Kalina-CI-Prompt)" - install_zsh || true + + # Ohne zsh gibt es keinen Prompt: das Modul ist zsh-Syntax in ~/.zshrc. Wer in bash + # sitzt, sieht davon nichts — also erst zsh, dann alles andere. + if ! command -v zsh >/dev/null && [ "$DRY" = 1 ]; then + install_zsh || true + warn "Trockenlauf: ein echter Lauf wuerde zsh zuerst installieren, sonst gaebe es keinen Prompt" + elif ! install_zsh; then + warn "Shell-Teil abgebrochen — ohne zsh wirkt der Prompt nicht (kein ~/.zshrc-Eintrag geschrieben)." + warn "zsh nachholen (Befehl oben), dann dieses Skript erneut starten." + return 1 + fi run mkdir -p "$CONF_DIR" if [ -f "$SRC_DIR/prompt.zsh" ]; then @@ -170,13 +197,26 @@ RC fi # Login-Shell - local cur; cur="$(getent passwd "$(id -un)" | cut -d: -f7)" - if [ "$cur" = "$(command -v zsh 2>/dev/null)" ]; then + local cur zshbin; cur="$(getent passwd "$(id -un)" | cut -d: -f7)" + zshbin="$(command -v zsh 2>/dev/null)" + if [ -z "$zshbin" ]; then + warn "zsh nicht gefunden — Login-Shell bleibt $cur, Prompt erscheint nicht" + return 0 + fi + ZSH_OK=1 + if [ "$cur" = "$zshbin" ]; then ok "Login-Shell ist bereits zsh" elif [ "$DO_CHSH" = 0 ]; then - warn "Login-Shell bleibt $cur (--no-chsh); Start mit 'exec zsh' oder 'chsh -s $(command -v zsh)'" + warn "Login-Shell bleibt $cur (--no-chsh). Bis du zsh startest, siehst du den Prompt nicht:" + say " exec zsh # nur diese Sitzung" + say " chsh -s $zshbin # dauerhaft" else - run $SUDO chsh -s "$(command -v zsh)" "$(id -un)" && ok "Login-Shell auf zsh gestellt (greift beim naechsten Login)" + if run $SUDO chsh -s "$zshbin" "$(id -un)"; then + ok "Login-Shell auf zsh gestellt — greift beim naechsten Login (nicht in dieser Sitzung)" + else + warn "chsh fehlgeschlagen; Login-Shell bleibt $cur. Von Hand: chsh -s $zshbin" + warn "Sofort testen: exec zsh" + fi fi } @@ -446,10 +486,20 @@ XRES say "Kalina CI — Installation auf $(hostname), Ziel $HOME" [ "$DRY" = 1 ] && say "(Probelauf: es wird nichts geschrieben)" -[ "$DO_SHELL" = 1 ] && do_shell +RC=0 +[ "$DO_SHELL" = 1 ] && { do_shell || RC=1; } [ "$DO_TERM" = 1 ] && do_terminal +say "" step "Fertig" -say " Prompt pruefen: zsh -i (oder neue Terminal-Sitzung)" +if [ "$RC" = 0 ] && [ "$ZSH_OK" = 1 ]; then + ok "neu starten: exec zsh — oder einmal neu einloggen (Login-Shell greift erst dann)" +elif [ "$RC" = 0 ]; then + warn "ohne zsh kein Prompt — im echten Lauf bricht der Shell-Teil hier ab" +else + warn "mit Fehlern beendet (Exit 1) — oben steht, was fehlt; erneut starten, sobald es da ist" +fi +say " Prompt pruefen: zsh -i" say " Abschalten: KALINA_CI_PROMPT=0 zsh -i" say " Palette pruefen: Terminal neu starten; nach environment.d-Aenderung einmal neu anmelden" +exit "$RC"