- hooks/pre-push: bash -n + shellcheck -S warning -e SC1090 on every
tracked *.sh; fails closed when shellcheck is missing, bypassable with
--no-verify; enable with 'git config core.hooksPath hooks' (documented)
- tests/smoke.sh: manual docker/podman Arch-container run of bat.sh,
zsh.sh and fish.sh with assertions (idempotent bat config, timestamped
zsh backups, fisher actually installed in fish); LazyVim.sh opt-in.
This catches the inverted-condition/quoting class shellcheck cannot.
fish.sh gains a SKIP_END4_SETUP=1 test hook to skip end-4's installer
- README: scripts table (documents installbeta.sh vs install.sh and why
SecureBoot.sh is not in the menu), apt full-upgrade note, development
section; claims audited against current behavior (gum wording already
correct, no whiptail/selection claims remain)
- remove untracked vendored gum.md (reference only, per decision)
- prerequisite condition tested fish (was inverted: 'zsh missing and
git/curl/fzf present', so fish was never installed on a working machine)
- run fisher bootstrap inside fish via 'fish -c' (was: 'curl | source' in
bash, which always failed with 'filename argument required')
- download fisher.fish with curl -fsSL to a temp file first (fail on HTTP error)
- resolve configs/ via BASH_SOURCE; when piped (curl | bash) fall back to
the end-4 clone instead of failing on relative paths from an arbitrary CWD
- clone dots-hyprland into mktemp -d, never into the caller's CWD; git -C
style usage so a failed pull can't strand the script's working directory
- set -euo pipefail from the top with a guarded/unguarded audit
- warn visibly that end-4 still runs with --force --skip-backup (kept per decision)
- mkdir -p before config copies; tty-guarded fish warning; ${1:-}