Skip to content

bootstrap v2026.09.16

Choose a tag to compare

@github-actions github-actions released this 16 Sep 13:05
· 31 commits to main since this release

Windows 1.39.0

Added

  • TerminalSetPwshDefault in the Shell manifest (default $true).
    merge-terminal-settings.ps1 now writes Windows Terminal's
    defaultProfile to the PowerShell 7 profile guid it already creates, so
    a new terminal tab opens PowerShell 7 instead of whatever Windows
    Terminal picked on its own.

  • F2 flips PSReadLine predictions to ListView for the current line -
    see Changed below for why InlineView is now the default. F2 runs
    SwitchPredictionView, so the full dropdown of matches is still one key
    away without it appearing unprompted.

Changed

  • PSReadLine PredictionViewStyle: ListView → InlineView. ListView
    rendered a dropdown of every history/plugin match for whatever was in the
    buffer, typed or pasted - pasting a multi-line command flooded the
    terminal with a page of unrelated history entries. InlineView shows one
    greyed suggestion on the current line instead, the same shape as zsh's
    zsh-autosuggestions on the other two platforms.

  • Prompt renders on one line. starship.toml (shared by all three
    platforms) had a hardcoded leading newline in format, on top of
    add_newline = false, forcing a blank line above every prompt regardless
    of that setting. Removed, so the prompt is one dense line like a typical
    Mac/Linux shell.

Linux 1.32.0

Fixed

  • Temp files no longer survive an interrupted run. Every mktemp went
    through a bare command substitution and was cleaned up only on the happy
    path, so a Ctrl-C between the mktemp and the mv left the half-written
    file behind - two ~/.zshrc.bootstrap.XXXXXX files from interrupted runs
    were sitting in $HOME on this machine when this was found. Every temp path
    now goes through mktemp_tracked, and trap on EXIT, INT and TERM removes
    whatever is still there; INT and TERM re-exit with 130 and 143 rather than
    resuming where they were interrupted.

    mktemp_tracked assigns to a variable named by its first argument instead of
    printing the path: a command substitution would run the array append in a
    subshell, and the parent would forget the path - which is the whole point.

Added

  • ~/go/bin on PATH. go install and the VS Code Go extension put
    gopls, dlv and staticcheck there, and nothing was adding it - the
    tools installed fine and then were not on PATH. Unrelated to where go
    itself comes from; it was missing before this release too.

  • ~/.dotnet/tools on PATH, next to the existing DOTNET_ROOT line.
    dotnet tool install -g installs there. macOS gets this from the SDK
    installer's /etc/paths.d entry and Windows from the installer's user PATH;
    only Linux was missing it.

  • node, go and java come from mise on all three platforms, declared once in
    mise/tools.conf at the repo root. They used to come from three different
    places - brew on macOS, winget on Windows, and nothing at all on Linux,
    where grep -cE "nodejs|golang-go|openjdk" packages.conf returned 0 and a
    fresh machine simply had no Node until somebody ran mise use -g by hand.
    mise was installed everywhere and managing nothing: mise ls -g was empty.

    mise use -g merges into the user's global config rather than replacing it,
    so a tool added by hand survives a bootstrap run. Removing the packages from
    the manifests does not uninstall them - brew uninstall node go,
    brew uninstall --cask microsoft-openjdk@21 and the winget equivalents are
    yours to run when you want the disk back.

    Python is deliberately not in the list: OS packages link against the system
    python3, and a mise shim in front of it breaks them.

  • The mise shims directory on PATH in the zsh fragment. mise activate
    covers interactive shells, JAVA_HOME included, but never sees a
    non-interactive ssh host command, a cron job, or a Makefile an IDE runs.
    Activation still takes precedence where both apply.

  • Seven git defaults, set the same way the delta and difftastic keys
    already are - only where the key is unset, so an existing value stays:
    push.autoSetupRemote (push a new branch without the --set-upstream
    dance), fetch.prune (stop completing months of deleted origin/*),
    diff.algorithm=histogram (better on moved and reindented code, and it is
    what delta and difftastic then render), rebase.autoStash,
    column.ui=auto, merge.conflictStyle=zdiff3 (the common ancestor in a
    conflict, not just the two endings) and tag.sort=-version:refname
    (v1.10.0 above v1.9.0).

    The tag field is version:refname; a plain -version is rejected at use
    with fatal: unknown field name: version.

  • lazygit in RELEASES. A git TUI: stage hunks, rebase, stash and
    branch without leaving the terminal. A release binary, not an apt package -
    Debian's trails upstream. Its assets are linux_x86_64/linux_arm64, so the
    entry uses {GORELEASER_ARCH} rather than the {ARCH} that expands to
    amd64.

  • Catppuccin Mocha for bat, delta and fzf. The palette was already deployed
    for starship, ghostty and atuin, and stopped at the three tools you read
    output in: bat rendered in its own default theme, delta in bat's, and
    fzf in its own colours.

    • bat/config and bat/themes/Catppuccin Mocha.tmTheme at the repo root,
      deployed to bat's config directory by a new bat config phase - the
      same shared-file shape starship.toml and atuin/ already use. bat since
      0.24 reads the themes directory at startup, so the bat cache --build
      fallback is a no-op on anything current.
    • delta.syntax-theme=Catppuccin Mocha in the git config phase, set only
      when bat is installed: delta highlights through bat's theme store, so a
      diff and a bat of the same file now match.
    • FZF_DEFAULT_OPTS with the Catppuccin colours. fzf-tab shells out to fzf
      and inherits them.
  • MANPAGER through bat, so man pages get the same theme. col -bx
    strips the overstrike backspaces groff emits for bold and underline, which
    bat would otherwise render literally. Set for batcat as well as
    bat, the same way the cat alias above it already is - Debian's apt
    package installs the binary under that name.

macOS 1.34.0

Fixed

  • Temp files no longer survive an interrupted run. Every mktemp went
    through a bare command substitution and was cleaned up only on the happy
    path, so a Ctrl-C between the mktemp and the mv left the half-written
    file behind - two ~/.zshrc.bootstrap.XXXXXX files from interrupted runs
    were sitting in $HOME on this machine when this was found. Every temp path
    now goes through mktemp_tracked, and trap on EXIT, INT and TERM removes
    whatever is still there; INT and TERM re-exit with 130 and 143 rather than
    resuming where they were interrupted.

    mktemp_tracked assigns to a variable named by its first argument instead of
    printing the path: a command substitution would run the array append in a
    subshell, and the parent would forget the path - which is the whole point.

Added

  • macOS note on the mise JDK: it is not registered with
    /usr/libexec/java_home, so the JetBrains IDEs, Android Studio and anything
    else that auto-detects a JDK need the path once -
    ~/.local/share/mise/installs/java/temurin-21, a symlink mise maintains
    across patch bumps. Shells are unaffected: mise activate exports
    JAVA_HOME. Registering it properly would mean a sudo symlink into
    /Library/Java/JavaVirtualMachines, and this script does not use sudo.

  • ~/go/bin on PATH. go install and the VS Code Go extension put
    gopls, dlv and staticcheck there, and nothing was adding it - the
    tools installed fine and then were not on PATH. Unrelated to where go
    itself comes from; it was missing before this release too.

  • node, go and java come from mise on all three platforms, declared once in
    mise/tools.conf at the repo root. They used to come from three different
    places - brew on macOS, winget on Windows, and nothing at all on Linux,
    where grep -cE "nodejs|golang-go|openjdk" packages.conf returned 0 and a
    fresh machine simply had no Node until somebody ran mise use -g by hand.
    mise was installed everywhere and managing nothing: mise ls -g was empty.

    mise use -g merges into the user's global config rather than replacing it,
    so a tool added by hand survives a bootstrap run. Removing the packages from
    the manifests does not uninstall them - brew uninstall node go,
    brew uninstall --cask microsoft-openjdk@21 and the winget equivalents are
    yours to run when you want the disk back.

    Python is deliberately not in the list: OS packages link against the system
    python3, and a mise shim in front of it breaks them.

  • The mise shims directory on PATH in the zsh fragment. mise activate
    covers interactive shells, JAVA_HOME included, but never sees a
    non-interactive ssh host command, a cron job, or a Makefile an IDE runs.
    Activation still takes precedence where both apply.

  • Seven git defaults, set the same way the delta and difftastic keys
    already are - only where the key is unset, so an existing value stays:
    push.autoSetupRemote (push a new branch without the --set-upstream
    dance), fetch.prune (stop completing months of deleted origin/*),
    diff.algorithm=histogram (better on moved and reindented code, and it is
    what delta and difftastic then render), rebase.autoStash,
    column.ui=auto, merge.conflictStyle=zdiff3 (the common ancestor in a
    conflict, not just the two endings) and tag.sort=-version:refname
    (v1.10.0 above v1.9.0).

    The tag field is version:refname; a plain -version is rejected at use
    with fatal: unknown field name: version.

  • lazygit in the cli group. A git TUI: stage hunks, rebase, stash and
    branch without leaving the terminal. Same tool on all three platforms, so it
    gets a cli-parity.conf row and tools/parity.sh checks it.

  • Catppuccin Mocha for bat, delta and fzf. The palette was already deployed
    for starship, ghostty and atuin, and stopped at the three tools you read
    output in: bat rendered in its own default theme, delta in bat's, and
    fzf in its own colours.

    • bat/config and bat/themes/Catppuccin Mocha.tmTheme at the repo root,
      deployed to bat's config directory by a new bat config phase - the
      same shared-file shape starship.toml and atuin/ already use. bat since
      0.24 reads the themes directory at startup, so the bat cache --build
      fallback is a no-op on anything current.
    • delta.syntax-theme=Catppuccin Mocha in the git config phase, set only
      when bat is installed: delta highlights through bat's theme store, so a
      diff and a bat of the same file now match.
    • FZF_DEFAULT_OPTS with the Catppuccin colours. fzf-tab shells out to fzf
      and inherits them.
  • MANPAGER through bat, so man pages get the same theme. col -bx
    strips the overstrike backspaces groff emits for bold and underline, which
    bat would otherwise render literally.