feat(TERM-001): Ghostty bootstrap for Linux#45
Merged
Conversation
Implements the proposal merged in #42. Versioned config + version pin + healthcheck section + bats coverage + vault runbook. Files ----- - terminal/ghostty/config new -- canonical config (Catppuccin Mocha, JetBrainsMono Nerd Font Mono, confirm-close-surface, copy-on-select) promoted from ~/.config/ghostty/config (the draft created mid-AI-011-validation) - versions.conf +GHOSTTY_VERSION=1.3.0 - setup-linux.sh new ghostty block: detect-and-act install check (warn-not-fail, no sudo, same convention as tmux/xclip) + version drift warning + config deploy with the same reconcile-not-skip pattern used for opencode.jsonc - scripts/healthcheck.sh renumber 1..11/11 -> 1..12/12 + insert new section 11/12 "Ghostty" (binary present, version matches versions.conf, config deployed and well-formed) - tests/ghostty.bats new -- 10 assertions on repo config shape, theme/font sanity, version pin, setup-linux.sh integration - tests/healthcheck.bats update count assertion 11 -> 12, add 4 new ghostty section assertions, renumber drift to 12/12 - tests/opencode.bats update OpenCode section references 10/11 -> 10/12 - tests/verify-setup.bats new integration assertion: ghostty config deployed to ~/.config/ghostty/ inside the Docker container regardless of binary presence Design decisions, all from the merged proposal in #42: 1. Version pinned in versions.conf (consistent with UV_VERSION etc.) 2. Ubuntu-only via apt (KISS; cross-distro is YAGNI) 3. Set-as-default GNOME terminal (manual, documented in runbook) 4. Install gating (detect-and-warn; setup-linux.sh avoids sudo, same as tmux) The user's currently-deployed ~/.config/ghostty/config is byte-identical to terminal/ghostty/config, so the first reconcile run on this box is a no-op (cmp -s passes, log_info "ghostty config already in sync"). Runbook ------- guide-ghostty-setup.md in the vault (separate commit via hive MCP) covers GUI-only steps: Nerd Font install, set-as-default gsettings, SSH terminfo workaround, recommended workflow alongside tmux + opencode, theme/font/font-size rationale, eye-fatigue lever ranking, troubleshooting. Out of scope deferred --------------------- - Cross-distro install paths (Arch / Fedora) - WingGhostty / Windows side (deferred to TERM-002 in 3-6 months when the community fork matures) - Auto-install of JetBrainsMono Nerd Font (heavyweight + version-fragile; stays in runbook as a manual step) Tests: 532/532 green locally. CI will run integration in Docker; the new verify-setup.bats assertion checks config deploy works even when the ghostty binary itself is absent (container has no ghostty).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implementation PR for TERM-001-ghostty-bootstrap. Closes the loop on the Ghostty setup that was done manually mid-AI-011-validation (2026-05-17): the config draft lives at
~/.config/ghostty/configon this machine but was never versioned. This PR promotes it toterminal/ghostty/configin the repo and adds the full bootstrap surface around it.Builds on the design decisions locked in merged PR #42 (
chore/TERM-001-proposal):GHOSTTY_VERSION=1.3.0inversions.confapt install ghostty)setup-linux.shavoids sudo, same convention as tmux/xclip)What lands
terminal/ghostty/config— canonical config (Catppuccin Mocha + JetBrainsMono Nerd Font Mono +confirm-close-surface+copy-on-select)versions.conf—GHOSTTY_VERSION=1.3.0setup-linux.sh— install detect + version drift warning + config deploy (reconcile-not-skip, same pattern asopencode.jsonc)scripts/healthcheck.sh— new section11/12 Ghostty(binary + version match + config presence + theme/font line check); existing sections renumbered to/12tests/ghostty.bats— 10 assertionstests/healthcheck.bats— section count 11 → 12 + 4 new ghostty assertions, drift renumbered to 12/12tests/opencode.bats— OpenCode section refs updated 10/11 → 10/12tests/verify-setup.bats— new integration assertion: ghostty config deployed in the Docker container even without the binary40-runbooks/guide-ghostty-setup.md(committed separately via hive MCP) — GUI one-time steps, SSH terminfo workaround, workflow alongside tmux/opencode, eye-fatigue lever ranking, troubleshootingTest plan
bats tests/*.bats— 532/532 green locallybash -n setup-linux.sh+zsh -n setup-linux.shcleanshellcheck setup-linux.sh scripts/healthcheck.sh— only pre-existing INFO warnings (SC1091/SC2015), unrelated to this PRcmp -s terminal/ghostty/config ~/.config/ghostty/config— repo file matches the deployed file (idempotent first run)./setup-linux.shhere and confirm healthcheck shows12/12 OKOut of scope (deferred)
Cross-links
specs/TERM-001-ghostty-bootstrap/(proposal merged in chore(TERM-001): scaffold + filled proposal for Ghostty Linux bootstrap #42)10_projects/dotfiles/40-runbooks/guide-ghostty-setup.md30-architecture/adr-009-multi-agent-runtime(vault)