2026 modernization: hardened install/uninstall + CI #1
Loading…
Reference in a new issue
No description provided.
Delete branch "2026-modernization"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Light modernization pass on the keyboard-layout repo. Layout files (
.keylayout,.icns) are unchanged byte-for-byte — only the install scaffolding and documentation are touched.Scope was deliberately trimmed from the latvian-spell-checker fork playbook because this repo has no compiled code, no PKG installer, no Gatekeeper interaction, and no GPL-2.0 obligations. Honest one-PR pass:
install.sh→ bash +set -euo pipefail, robustSCRIPT_DIR, source-file existence checks, idempotent re-install, verification listing.uninstall.sh(new) → symmetric removal; idempotent no-op when nothing is installed.README.md→What this fork addsheader; Uninstall section; compatibility pinned to tested on macOS Tahoe 26.4.1 (arm64) with the 10.6+ floor (the previous Sequoia-only line was already stale by the time the repo was created). License / attribution paragraph preserved verbatim..forgejo/workflows/test.yml→ macmini runner (runs-on: macos, instance-scoped runner reused from the latvian-spell-checker session);shellcheck+xmllint+ install/uninstall dry-run into a tmpHOMEon every push and PR.Why no Homebrew Cask, no PKG, no per-file GPL notices?
Three explicit non-goals, recorded so a future contributor doesn't re-litigate them:
cp 2 files. A PKG adds an opaque scriptable layer overcpand gains nothing.Test plan
HOME=/tmp/X bash install.sh && bash uninstall.sh && bash uninstall.sh(third invocation is idempotent no-op) ✓shellcheckclean on macmini runner (Linux runner would also work, macmini chosen for end-to-end macOS realism)xmllint --noout latvian_apostrofs.keylayoutparsesmktemp -dHOME completes🤖 Generated with Claude Code
Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com
🤖 AI Review · Verdict: BLOCKED ❌
Summary
Code Review
File:
install.shset -euo pipefailset; robustSCRIPT_DIR; existence checks before copy;mkdir -psafe.cp -ffailure is caught byset -e, but a post-copytest -f "$DEST/<file>"check would tighten against the (rare) case wherecpexits 0 yet the file is missing/inaccessible at the destination.File:
uninstall.sh[[ -f "$target" ]]guard, idempotent, clean exit when nothing to remove.rm -ferrors when$DESTdoesn't exist. Not real — the[[ -f ]]guard makes the loop body unreachable for missing paths, andrm -fis itself non-erroring on missing targets. No change required.File:
.forgejo/workflows/test.ymlshellcheck+xmllint+ install/uninstall dry-run intomktemp -dHOME — no script-level bugs.File:
README.mdSecurity
No vulnerabilities found. Personal-install-from-source repo; no auth, no secrets, no network access from the install scripts.
Final Decision
BLOCKED pending one defensive change:
install.shconfirming both files landed at$DEST/after thecpcalls.Reviewed by Teika (gemma4:e4b on macmini) in 111.4s · model occasionally double-states findings (e.g. shebang line); contradictions resolved against the actual diff.
🤖 AI Review (re-run on commit
8cada4e) · Verdict: APPROVED ✅Summary
install.sh: post-copy validation now confirms both files landed at$DEST/.set -euo pipefail+ pre-copy existence checks + post-copy presence checks together cover the silent-cp failure surface.uninstall.sh: unchanged from previous review —[[ -f $target ]]guard + idempotent no-op when nothing is installed..forgejo/workflows/test.yml: shellcheck + xmllint + install/uninstall dry-run into a tmp HOME — passes clean.README.md: license/attribution paragraph preserved verbatim; Tahoe 26.4.1 (arm64) compatibility line correct.Final
No bugs found. No vulnerabilities found. Safe to merge after CI completes.
Reviewed by Teika in 91.6s · 1.5h delta vs first run
placeholder