bootstrap v2026.09.3
Windows 1.10.0
Two additions to the shell phase: a real sudo for Windows, and git
tab-completion in the profile.
Added
gsudo(gerardog.gsudo), added to theshellgroup. Elevates one
command without spawning a whole separate admin window/profile the way
Start-Process -Verb RunAsdoes. Not added to thecligroup: it is a
shell-elevation tool, not part of the modern-CLI bundle, and Linux/macOS
need no equivalent package -sudoalready ships there. See
tools/cli-parity.conffor how a platform-specific tool like this gets
written down deliberately rather than just added quietly.posh-git, added toModules51andModules7. Tab-completion for git
subcommands, branches and remotes in PSReadLine's menu - a different
feature from Oh My Posh's git segment, which shows status in the prompt
rather than completing anything. Imported inprofile.ps1before
Oh My Posh'sinit, deliberately: posh-git also defines its ownprompt
function, and whichever import runs last wins that fight. Oh My Posh
already owns the prompt line, so it has to load second.
Changed
TerminalFontSizeis14, not16. Deliberately not matching the 16
ghostty/iTerm2 use on the other two platforms - 14 is the size actually
used on Windows.merge-terminal-settings.ps1's own-FontSizedefault
stays at 16: it exists only as a standalone-invocation fallback (nothing
in the real call path frombootstrap.ps1ever reads it, since every
value is always passed explicitly frompackages.psd1), so it mirrors the
general 16pt intent rather than this platform's specific override.
Linux 1.5.0
Same expansion of the ghostty config the macOS side got, minus three knobs
that ghostty documents as macOS-only (macos-option-as-alt, window-save-state,
quit-after-last-window-closed). Also fixes one macOS-ism that got copied
across from the macOS script.
Added
-
The ghostty config is more than one line now.
scrollback-limitwas all
it had, which meant every other decision - font, palette - was ghostty's
default rather than this manifest's. Five new knobs, each in the manifest
with a paragraph of why, rendered into~/.config/ghostty/configthe same
way scrollback already was.theme = Catppuccin Mocha. A name that matches a row from
ghostty +list-themes; ghostty ships 463 of them, so changing palette is
a one-line edit to the manifest and nothing else. Catppuccin Mocha is the
widely used dark across dev tooling in 2026.font-family = MesloLGM Nerd Font Mono. The Meslo Nerd Font this manifest
has installed since the first release, matched by its face-table name
(spaces) rather than the ttf filename. Ghostty's default is empty which
falls back to the bundled font, so p10k's glyphs were rendering from a
different font than the one the manifest ships.font-size = 16. Ghostty's default is 13; 16 matches the macOS manifest
so a fleet running both feels the same on either side.copy-on-select = clipboard. Selecting text puts it on the clipboard
Ctrl-V and the GUI paste both reach. Nottrue, which Ghostty
documents as valid and is not the same thing -truecopies to the X11
primary selection, a separate buffer only reachable via middle-click or
Ctrl-Shift-V.clipboardis the intuitive one on both X11 and Wayland.shell-integration-features = cursor,sudo,title,ssh-env,ssh-terminfo.
Ghostty auto-installs the shell hooks; this opts INTO the extras.
cursorfollows zsh vi-mode with a bar/block change,sudopreserves
the prompt state through sudo,titlekeeps the terminal title tracking
cwd.ssh-envcarriesTERM=xterm-ghosttyandCOLORTERM=truecolor
through ssh, andssh-terminfopipesinfocmp -x xterm-ghosttythrough
tic -x -on the remote on first connect - installing the entry under
the remote user's~/.terminfo, cached locally afterwards. The two
features go together - addingssh-envalone actually makes the
problem worse on hosts without the entry, because the remote now
thinks it can drive an xterm-ghostty it does not understand.keybind = global:ctrl+\=toggle_quick_terminal. Quake-style drop-down terminal summoned from any app with one hotkey.global:` scopes the
binding to the desktop; on Wayland this needs the GlobalShortcuts XDG
portal (KDE and GNOME ship it, most tiling WMs do not). Blank disables.window-padding-x = 10,window-padding-y = 10. Ghostty's default 2/2
is visually cramped at 16pt - the prompt sits right against the frame.
Fixed
-
The script silently exited before the Terminal config phase on some
.zshrcshapes. The zshrc-hook-order check has two pipelines inside
$(...)command substitutions: one finds the source-line's line number,
the other counts non-comment lines above it. Both can legitimately end in
a grep with zero matches - a.zshrcthat names the file only in a
comment, or one whose header above the hook is entirely comments and
blanks.grepexits 1 in both cases,set -euo pipefailpropagates that
to the assignment, and the whole script exits from inside$(...)
without a diagnostic. Both pipelines now end in|| true, and the count
is defaulted to 0.The bug was there since the hook-order check landed and only fired for
specific.zshrcshapes, so the run reportedcurrent zshrc hookand
stopped without an error line. Terminal config, Manual, and Summary never
ran. -
The "ghostty not installed" guard checked
/Applications/Ghostty.app. A
macOS path in the Linux script, copied across when the phase was ported.
Harmless in practice - the directory is absent on a Linux box, so the AND
never changed the answer - but the intent was nonsense and it survived
because it never fired. Now justcommand -v ghostty, which is what the
check was always trying to be.
macOS 1.5.0
Fixed
-
The script silently exited before the Terminal config phase on some
.zshrcshapes. The zshrc-hook-order check has two pipelines inside
$(...)command substitutions: one finds the source-line's line number,
the other counts non-comment lines above it. Both can legitimately end in
a grep with zero matches - a.zshrcthat names the file only in a
comment, or one whose header above the hook is entirely comments and
blanks.grepexits 1 in both cases,set -euo pipefailpropagates that
to the assignment, and the whole script exits from inside$(...)
without a diagnostic. Both pipelines now end in|| true, and the count
is defaulted to 0.The bug was there since the hook-order check landed and only fired for
specific.zshrcshapes, so the run reportedcurrent zshrc hookand
stopped without an error line. Terminal config, Manual, and Summary never
ran.
Added
-
The ghostty config is more than one line now.
scrollback-limitwas all
it had, which meant every other decision - font, palette, Option-key
handling, window state - was ghostty's default rather than this manifest's.
Seven new knobs, each in the manifest with a paragraph of why, rendered into
~/.config/ghostty/configthe same way scrollback already was.theme = Catppuccin Mocha. A name that matches a row from
ghostty +list-themes; ghostty ships 463 of them, so changing palette is
a one-line edit to the manifest and nothing else. Ghostty's own default
on macOS is a plain dark; Catppuccin Mocha is the widely used dark across
dev tooling in 2026.font-family = MesloLGM Nerd Font Mono. The Meslo Nerd Font this
manifest has installed since the first release, matched by its face-table
name (spaces) rather than the ttf filename. Ghostty's default is empty
which falls back to SF Mono, so p10k's glyphs were rendering from a
different font than the one the manifest ships.font-size = 16. Ghostty's default is 13; 16 matches the iTerm2 profile
this manifest replaces and is comfortable at a normal seating distance
on a Retina display.macos-option-as-alt = true. Option-f/b/arrows produce the word-wise
escape sequences readline, zsh and vim recognise. macOS's default keeps
the typographic bindings (Option-e for é, and the rest), which nobody
uses at a terminal - the shortcut half of that keyboard is what
everything on the command line actually uses.window-save-state = always. Restores tabs and splits across a plain
Cmd-Q and relaunch. The defaultdefaultonly restores when the OS asks
(login-item restart, or a reboot with "Reopen windows" ticked); it drops
the state on a hand quit, which is the case anyone not running tmux was
silently losing.copy-on-select = clipboard. Selecting text puts it on the clipboard
Cmd-V pastes from. Nottrue, which Ghostty documents as valid and
is not the same thing -truecopies to the X11-style primary selection,
a separate buffer on macOS that nothing reaches with Cmd-V. The trade-off
is a stray selection replaces whatever was on the clipboard.quit-after-last-window-closed = true. Match CLI-tool convention. macOS's
default is to keep the app alive with no visible window, which is right
for a mail client and wrong for a terminal - the Dock icon lingers and
Cmd-Q is the only way out.shell-integration-features = cursor,sudo,title,ssh-env,ssh-terminfo.
Ghostty auto-installs the shell hooks; this opts INTO the extras.
cursorfollows zsh vi-mode with a bar/block change,sudopreserves
the prompt state through sudo,titlekeeps the terminal title tracking
cwd.ssh-envcarriesTERM=xterm-ghosttyandCOLORTERM=truecolor
through ssh, andssh-terminfopipesinfocmp -x xterm-ghosttythrough
tic -x -on the remote on first connect - installing the entry under
the remote user's~/.terminfo, cached locally afterwards. Together
they solve the caveat this manifest carried in a comment since 1.0.0:
"a Debian box that has never heard of that terminfo entry will complain
until you use ghostty's SSH integration or force TERM=xterm-256color."
The two features go together - addingssh-envalone actually makes
the problem worse on hosts without the entry, because the remote now
thinks it can drive an xterm-ghostty it does not understand.keybind = global:cmd+\=toggle_quick_terminal. Quake-style drop-down terminal summoned from any app, including full-screen ones.global:`
scopes the binding to the OS rather than a ghostty window, so it fires
even when ghostty is not focused. Blank in the manifest disables it.window-padding-x = 10,window-padding-y = 10. Ghostty's default 2/2
is visually cramped at 16pt - the prompt sits right against the frame.