Skip to content

Releases: dotgibson/dotfiles-core

v3.9.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 14:11
dcdeda5

Added

  • Neovim: shared utils/palette.lua — a single source of truth for the active tokyonight
    palette. The "storm" style string and the require("tokyonight.colors").setup{} pcall dance
    were duplicated across lualine, bufferline, and the cheatsheet; they now all resolve through this
    one module (change the style once). It also exposes a NvChad-base_30 semantic map (black2,
    statusline_bg, nord_blue, dark_purple, …) so the block/pill styling is written in NvChad's
    own vocabulary while still tracking the theme.
  • Neovim: scroll-percentage indicator in the lualine statusline (right bubble, next to the
    cursor location) so you can see how far through a file you are.
  • Neovim: NvChad-style inline LSP renamer (utils/renamer.lua) — <leader>rn now opens a
    small cursor-anchored, git-red-bordered prompt prefilled with the symbol (<CR> applies across
    the workspace, <Esc>/q cancels) instead of the bare cmdline prompt.
  • Neovim: colorify-style colour highlighter (nvim-colorizer.lua, catgoose fork) — inline
    colour swatches over the visible viewport: CSS colour literals (#rrggbb, rgb()/hsl()) plus
    Tailwind utility-class colours via the Tailwind LSP. ccc.nvim is kept for the interactive
    :CccPick picker (its always-on highlighter is now off).

Changed

  • Neovim: statusline & tabline go hybrid-NvChad. The bufferline adopts NvChad's tabufline model
    where buffer state is conveyed by BACKGROUND on a solid opaque bar — the active buffer lifts to a
    lighter raised block, inactive buffers recede to the bar colour — while the editor stays
    transparent. The blink.cmp menu gains NvChad's colored kind-icon column (via BlinkCmpKind*
    highlights) with an icon-left / kind-text-right layout. The <leader>? cheatsheet renders as a
    solid opaque card.
  • Neovim: signature help is owned by blink.cmp. The manual CursorHoldI
    vim.lsp.buf.signature_help autocmd was removed — blink's own signature window handled the same
    case and the two floats could stack while idle. <C-s> stays as the manual trigger.
  • Neovim: the central Mason install manifest moved out of conform.nvim (which is lazy on
    BufWritePre, so run_on_start really meant "on first save") into its own VeryLazy-loaded
    plugins/mason-tool-installer.lua, so a fresh box installs its toolchain near startup.

Removed

  • Neovim: trimmed unused plugins — the full in-editor debugger stack (nvim-dap,
    nvim-dap-ui, nvim-dap-virtual-text, mason-nvim-dap, and every <leader>d* keymap), the test
    runner
    (neotest + neotest-python/-golang), vim-dadbod (DB UI), incline.nvim (dropbar's winbar
    covers split identity), aerial.nvim (Trouble + fzf-lua + dropbar cover symbols), nvim-spectre,
    git-conflict.nvim, and mini.indentscope — along with their keymaps, which-key groups, and
    cheatsheet sections. (16 entries removed from lazy-lock.json, including transitive dependencies.)

Fixed

  • Neovim: heavy linters no longer run on InsertLeave. golangci-lint / cpplint scan the whole
    package per run; they are now restricted to BufWritePost (save-only) while fast per-file linters
    keep the snappier cadence.
  • Neovim: bash-language-server no longer emits SC1071 on zsh. Its built-in shellcheck
    integration is disabled (bashIde.shellcheckPath = "") so zsh buffers keep completion/hover
    without the "shellcheck only supports sh/bash/…" phantom diagnostic.
  • Neovim: :w can't be broken by a missing mini.nvim. The format-on-save
    mini.trailspace.trim() call is now pcall-guarded.

v3.8.0

Choose a tag to compare

@github-actions github-actions released this 19 Jul 02:21
da15412

Changed

  • Neovim UI moves to an NvChad-styled statusline + bufferline. lualine now uses a
    hand-built theme derived from tokyonight's resolved palette (mode/location render as rounded
    accent pills, git/cwd as a lighter block, filename on the base run) instead of the bundled
    tokyonight theme — so the blocks read as opaque islands on the transparent bar and follow
    NvChad's structure. bufferline gains palette-aware highlights so the active buffer lifts as a
    subtle raised block with an accent underline while inactive buffers dim into the bar. Both are
    computed at plugin-load (pcall-guarded), so a fresh box falls back to the bundled/auto theming.
  • LSP hover, signature help, and the diagnostic float share one padded, rounded card style.
    Hover/signature pass an explicit rounded border with width/height caps (a huge docstring becomes
    a tidy box); the diagnostic float drops its header row and gains a left pad + width cap.
    Signature help now also pops automatically when you rest inside a function's arguments
    (CursorHoldI, gated on server support, suppressed while the completion menu is open).
  • which-key and the <leader>? cheatsheet restyled to mirror NvChad's keymap visualizer.
    which-key gets a minimal rounded, padded, left-aligned column popup with NvChad-palette colors
    (blue keys, red descriptions, green groups); the cheatsheet's category headings become
    full-width accent pill bars (cycling colors) with blue keys — both palette-aware, with a
    semantic-link fallback on a bare box.

Fixed

  • Neovim taplo (TOML) root detection. root_markers listed the glob "*.toml", which
    vim.fs.root/vim.fs.find do not support — so it never matched and taplo always fell back to
    .git, giving a lone TOML file outside a repo a cwd root. Replaced with real manifest names
    (pyproject.toml, Cargo.toml, foundry.toml, taplo.toml, .taplo.toml, .git).
  • Neovim <leader>oi (organize imports) no longer binds where it can't work or races the
    formatter.
    A server that ENUMERATES its code-action kinds without source[.organizeImports] is
    now skipped (so the map no longer silently no-ops on e.g. lua_ls); a server that only reports a
    bare true or a provider table without kinds still gets the map, since it can't be ruled out. The
    racy fixed-50ms post-format timer is dropped — formatting stays owned by format-on-save and
    <leader>cf.
  • Neovim cursor-restore skips commit buffers. gitcommit/gitrebase buffers open at the top
    again instead of jumping to a stale mark from a previous commit.
  • Neovim folding has a single owner. nvim-ufo computes folds via its own treesitter+indent
    providers, so the global foldmethod=expr + treesitter foldexpr in options.lua was redundant
    per-buffer work (UFO never reads foldexpr). Dropped it; UFO now owns folding outright.

Changed (internal)

  • Deduped the identical snippetSupport capability boilerplate in the Neovim html/cssls
    server specs into a shared utils.lsp.with_snippets helper; standardized autocmd augroups on an
    explicit { clear = true }; corrected a stale comment claiming no vim.notify-competing
    notifier is installed (fidget is, for LSP progress only — no clash).

v3.7.0

Choose a tag to compare

@github-actions github-actions released this 17 Jul 21:47
e9cf907

Changed

  • Neovim clipboard gains a gated OSC52 last-resort provider. When no native clipboard
    backend is on PATH (no Core clip/clip-paste, no clip.exe, and none of pbcopy /
    wl-copy / xclip / xsel / win32yank), "+y/"+p route over the terminal's OSC52
    sequence — closing the "yank does nothing over tmux/psmux/SSH" gap on headless/remote boxes.
    A working native provider is never overridden, so a normal desktop is unaffected.
  • Neovim clipboard paste uses Get-Clipboard -Raw on Windows, so multi-line pastes no
    longer arrive split/CRLF-mangled.
  • Windows-correct Neovim Python DAP + LuaSnip build. debugpy/venv interpreters resolve to
    Scripts\python.exe (and python, not python3) on Windows; LuaSnip skips its
    make install_jsregexp build where there's no toolchain. All gated on has("win32").
  • Neovim LSP capabilities fetch is pcall-guarded (a blink load failure no longer aborts
    the whole server stack), and emmet_ls now attaches to html.
  • Starship prompt gains venv, package, git-metrics, and WSL indicators. [python] shows the
    active $virtualenv; a $package version indicator and an $env_var slot are wired into
    format (surfacing a previously-unplaced ENGAGEMENT var and a new WSL_DISTRO_NAME badge);
    git_metrics is enabled; a documented opt-in docker_version custom is included (off by default).
  • git_main_branch resolves the trunk in one call. It reads origin/HEAD directly
    (git symbolic-ref) and only falls back to probing the trunk-name candidate list when
    that is unset — instead of firing up to 18 git show-ref subprocesses every call. It sits
    on the hot path (gcom / gswm / grbm).
  • git_current_branch uses the git porcelain. It now reads git branch --show-current
    (git 2.22+) instead of the hand-rolled symbolic-ref + return-code dance; the short-SHA
    fallback on a detached HEAD and the empty result outside a repo are both preserved.
  • _core_suggest no longer forks per candidate. _core_lev gained a fork-free out-var
    mode, so scoring a mistyped Core verb against the alias/subcommand list runs in-process
    rather than spawning a command substitution for each candidate (~80+ on a bad please).
  • pullall tallies its summary in a single awk pass instead of four grep -c scans of
    the same buffer.
  • Collapsed a dead status-left conditional in tmux/tmux.conf to a constant — all three
    branches resolved to the same colour.
  • Decoupled --help from header line numbers. update-plugins.sh,
    update-nvim-plugins.sh, and freshness-dashboard.sh now print usage from a heredoc rather
    than sed -n '<a>,<b>p' "$0", which silently mis-printed whenever the header comment moved
    (the coupling sync-core.sh already documents having removed).
  • Removed redundant zsh history setopts (zsh/history.zsh): INC_APPEND_HISTORY (implied
    by SHARE_HISTORY) and HIST_IGNORE_DUPS (superseded by HIST_IGNORE_ALL_DUPS) were
    no-ops, so they are dropped.

Security

  • session-start hook verifies its tool downloads. install_tarball and the neovim
    install in .claude/hooks/session-start.sh now download to a file and check the pinned
    SHA-256 from scripts/tool-versions.env before extracting — failing closed when a
    checksum is absent or mismatched — instead of piping curl … | tar unverified. Brings the
    remote-session gate toolchain in line with the CI composite action, which already verifies.
  • claude-routines run with least-privilege tools. Each job's --allowedTools now mirrors
    its routine's own allowed-tools frontmatter rather than granting unrestricted Bash; the
    web-reading routines (tool-scout, freshness-triage, modernize, release-readiness,
    drift-triage) no longer pair arbitrary shell with WebFetch/WebSearch, closing a
    prompt-injection → CLAUDE_CODE_OAUTH_TOKEN exfiltration path. drift-triage's command
    frontmatter is scoped to match.
  • HISTORY_IGNORE covers more secret shapes (zsh/history.zsh): --flag=value forms and
    env-assignment credentials (TOKEN=, PASSWORD=, *ACCESS_KEY=, APIKEY) that the
    space-only patterns let slip now stay out of the plaintext $HISTFILE.

Fixed

  • Cheatsheet uses a non-deprecated highlight API. nvim/lua/gerrrt/cheatsheet.lua now
    calls nvim_buf_set_extmark instead of the deprecated nvim_buf_add_highlight (slated for
    removal on Neovim nightly), so :Cheatsheet / <leader>? keeps working on current Neovim.

v3.6.1

Choose a tag to compare

@github-actions github-actions released this 17 Jul 04:09
3ace724

Documentation

  • docs(runbook): spell out how release cuts differ by bump type.
    RELEASE-RUNBOOK.md now adds the Core-release bump-selection table, the step-4
    @vN alias split for PATCH/MINOR vs MAJOR, the extra MAJOR rollout uses: bump,
    the htpx SemVer guide, and the "undo a staged make release" troubleshooting
    path. RELEASE-STRATEGY.md is updated alongside it so the current-version examples
    stay aligned with the live Core release line.

v3.6.0

Choose a tag to compare

@github-actions github-actions released this 16 Jul 22:07
a811871

Added

  • feat(nvim): five editor quality-of-life tweaks. Cherry-picked from an external
    config the handful of behaviours that beat or fill a gap in ours (the rest we already run
    better-configured equivalents of). (1) i/a/A on a blank line auto-indents via "_cc
    (black-hole register, guarded on count == 0 so 3i/10a keep native behaviour);
    (2) an async git fetch on VimEnter toasts when the upstream is ahead of HEAD — pinned
    to the startup cwd, argv-form (Windows-portable), and only reported after a successful
    fetch; (3) vimade dims inactive windows and cursorline is now shown only in the active
    window (markdown/text/gitcommit keep their cursorline-off policy); (4) a macro-recording
    indicator in the lualine mode block; (5) exrc for project-local config. The git fetch
    toast and exrc are both gated on DOTFILES_OFFLINE so they stay inert on engagement boxes,
    and exrc additionally relies on Neovim's vim.secure trust prompt for untrusted repos.

v3.5.2

Choose a tag to compare

@github-actions github-actions released this 15 Jul 02:48
8089460

Fixed

  • fix(tmux): trailing space after the copy-mode icon. The status-bar copy-mode
    indicator was 󰆏#S (glyph abutting the session name); it is now 󰆏 #S — a single
    space keeps the pill readable at a glance without otherwise changing the layout.

Documentation

  • docs(runbook,strategy): document the deliberate dotfiles-Windows minor/major
    release flow.
    RELEASE-RUNBOOK.md §3 only covered the automatic PATCH path
    (mirror-sync → auto-tag). A new §3b covers the human-driven minor/major flow: the
    version decision via /release-readiness + /release-notes, the
    packages.lock.json re-pin (including the winget-export-vs-ARP mapping gap that
    silently drops installed-but-unmapped apps), CHANGELOG promotion, and
    gh release create (there is no release.yml on the Windows repo). Simultaneously,
    RELEASE-STRATEGY.md is corrected: dotfiles-Windows is now carved out as the
    standalone exception that carries its own vX.Y.Z but no core/ subtree, and the
    notes-source column is fixed (--notes-file via auto-tag.sh is the automatic path;
    --generate-notes is only the fallback for empty/unconventional ranges).

v3.5.1

Choose a tag to compare

@github-actions github-actions released this 14 Jul 22:38
2ea75bc

Changed

  • ci(modern): ban the macos-14 runner in the modern-CI floor. macos-14
    (Sonoma) images entered deprecation on 2026-07-06 and are fully unsupported on
    2026-11-02, so scripts/modern-baseline.yml now lists it under banned_runners
    alongside macos-13. Pre-emptive and free — the fleet rides macos-latest, so no
    workflow references the pinned label today; check-modern.sh enforces it.

Documentation

  • docs(matrix): watchviddy is now a first-class, provisioned tool.
    PORTING-MATRIX.md gains a viddy row so the watchviddy alias Core already
    ships (HAVE_VIDDY-guarded in zsh/aliases.zsh) is actually installed — macOS
    already had it via Homebrew; the Linux/Kali repos now install it best-effort in
    bootstrap.sh via cargo install viddy (viddy is a Rust CLI, so the same cargo path
    as yazi/dust — Arch, which ships no rust toolchain, prints a paru -S viddy hint).
    Inert without the binary, so boxes that skip it keep classic watch.

v3.5.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 18:52
4f75ce5

Changed

  • fix(git): delta's syntax-theme is now ansi (was TwoDark). delta now follows
    the terminal's Tokyo Night ANSI palette, matching BAT_THEME=ansi (already set in
    aliases.zsh) so git diff and bat render syntax the same way — and matching the
    Windows host, which already used ansi. Part of the Windows↔Mac terminal parity pass.

Fixed

  • fix(nvim): <leader>rc and the alpha dashboard "Config" button open init.lua
    on Windows too.
    Both hardcoded ~/.config/nvim/init.lua, which doesn't exist on the
    Windows host — Neovim there reads %LOCALAPPDATA%\nvim — so the binding opened a phantom
    path. They now resolve the config dir at runtime via vim.fn.stdpath("config"), so the
    same binding lands on the real init.lua on every platform.

Parity (cross-shell contract)

  • feat(parity): the aligned tool-swap manifest gains df→duf, top/htop→btop,
    fm/y→yazi, md→glow (pwsh gmd), and ping→gping.
    These were already defined
    in zsh/aliases.zsh; adding them to scripts/parity-aliases.txt makes
    parity-check.sh enforce them bidirectionally against the pwsh host's provides:
    contract (the Windows PowerShell port added the matching functions in the same pass).
  • feat(parity): Ctrl+\ autosuggest/prediction toggle is now aligned, not
    deliberate.
    The Windows host binds Ctrl+\ to flip PSReadLine's PredictionSource,
    mirroring zsh's autosuggest-toggle; parity-check.sh now enforces the needle on both
    shells. PARITY.md's Aliases prose also now documents the full curated git shorthand set
    as aligned across zsh + pwsh.

    Merge order: the pwsh side of these rows ships in the dotfiles-Windows parity PR.
    Merge (or land together with) that PR so the weekly parity-check.yml — which clones
    dotfiles-Windows main — sees the matching pwsh definitions and stays green.

v3.4.0

Choose a tag to compare

@github-actions github-actions released this 13 Jul 00:02
8533c5e

Added

  • feat(freshness): the weekly fleet board gains three live cross-repo signals.
    scripts/freshness-dashboard.sh now queries the GitHub API (best-effort, gated on gh +
    a token — the workflow provides both, a local run degrades to an "unavailable" note) for:
    own-tag release drift (commits each repo has merged since its last release tag — its
    own unreleased work, distinct from Core-tag vendoring drift), an open Renovate PR tally
    per repo (how many dependency PRs are waiting right now, beside the existing dashboard
    links), and judgment-layer routine issues (links to each repo's open .claude-routine
    issues — doc-audit, os-package-availability, coverage-gap, … — so the board references the
    stale-docs and coverage-hole signals rather than recomputing them). Still a never-failing
    reporter (always exits 0).
  • feat(routines): three new judgment routines + a reusable OS-repo routine workflow.
    • /shell-review (.claude/commands/shell-review.md) — weekly (Tue 11:00) read of the
      week's changed zsh/bash for runtime footguns lint can't catch (the tmux-scratchpad
      and doctor-hint classes), report-first.
    • /drift-triage (.claude/commands/drift-triage.md) — weekly (Tue 12:00) interpretation
      of Monday's fleet-drift sweep into ranked per-repo remediation, report-first.
    • /os-package-availability (.claude/commands/os-package-availability.md) — audits an OS
      repo's install/packages.txt/Brewfile for renamed/dropped/moved packages against
      upstream + PORTING-MATRIX.md. Shipped as a reusable workflow
      (.github/workflows/claude-routines-call.yml) so each OS repo consumes it as a ~5-line
      @v3 caller (inverted checkout, like lint-call.yml) rather than a 6× copy.
      All inert-by-default (preflight CLAUDE_CODE_OAUTH_TOKEN gate) and report-first.

Changed

  • perf(zsh): drop zstyle ':completion:*' rehash true — no more per-Tab $PATH stat storm.
    rehash true (zsh/options.zsh) forced zsh to rebuild its external-command hash — stat every
    directory in $PATH — on every completion attempt, which is perceptible on an NFS home,
    linuxbrew, or a large mise-shims $PATH, and fanned out to all eight OS repos. Removed; a
    newly-installed binary now surfaces after hash -r or a new shell (the maint runner already
    refreshes the command hash after installs). A regression-guard comment records why it stays out.
  • chore(bin): make .bin/sync-upstream.sh overridable for forks/mirrors.
    CORE_REPO_URL and TARGET_BRANCH now read ${VAR:-default}, so a fork, a mirror, or a
    renamed org can gsync without editing this vendored file.

Fixed

  • docs(porting): correct the PORTING-MATRIX.md package cells the /os-package-availability
    routine flagged as drifted.
    Alpine duf/glow are back to testing (they were never
    promoted to community on stable, incl. 3.24 — a July flip that claimed otherwise is reverted,
    and footnote ¹⁴ restored); Alpine tldr now shows cargo³ (testing-only → bootstrap builds
    it from source) and Alpine ouch is corrected to testing (testing-only, not auto-installed);
    and Gentoo tealdeer/yazi/lazygit are marked GURU-only
    (footnote ¹²) alongside a note that direnv is app-shells/direnv, not the non-existent
    dev-util/direnv. Matches the OS-repo bootstrap reality (Alpine cargo/go-install fallbacks;
    Gentoo guru_install). Also: Arch atuin drops the stale "(AUR for some)" qualifier and Arch
    doggo moves from AUR³ to doggo (both now first-class in extra), and the openSUSE
    tealdeer footnote ¹ is de-hedged (it's in Tumbleweed main OSS, not devel-only).
  • fix(zsh): compinit block no longer leaks a global zcd into every interactive shell.
    zsh/options.zsh declared local zcd=… at the file's sourced top level, where zsh (which has
    only function scope) silently promotes local to an ordinary global — polluting the
    namespace on every shell start across all eight OS repos and contradicting the codebase's own
    anon-function convention (zsh/aliases.zsh) and loader.zsh's "no top-level local" rule. The
    cache body is now wrapped in an anonymous function so zcd is genuinely function-scoped;
    compinit declares its state typeset -g, so the completion system persists unchanged.
  • fix(zsh): serve now prints a reachable URL and QR on macOS.
    serve (zsh/functions.zsh) gated all tunnel/LAN IP discovery on command -v ip, but macOS
    ships no ip(8), so on a Mac it degraded to a bare "serving on port N" with no LAN URL and no
    QR. Added a route(8) + ipconfig fallback branch — the same Linux/macOS split
    tmux/scripts/tmux-netinfo.sh already uses — so tunnel-first, then default-route LAN discovery
    works on a Mac. No change on Linux/WSL.
  • fix(nvim): undo dir now derives from stdpath("state"), not a hardcoded path.
    options.lua hardcoded ~/.local/share/nvim/undodir; it now uses vim.fn.stdpath("state"),
    so undo history lands in the right tree under a relocated XDG_STATE_HOME and on macOS.
  • fix(nvim): drop the no-op vim.opt.encoding = "UTF-8".
    Neovim's internal encoding is always UTF-8; setting it post-startup is a no-op at best and a
    footgun at worst. Removed; a comment records why it stays out.
  • fix(tmux): popup previews degrade on Debian / a bare box.
    tmux-menu.sh's engagement preview now falls back batbatcat (Debian renames the binary),
    and tmux-sesh.sh's project preview falls back ezals when eza is absent — matching how
    the zsh widgets already resolve these.
  • fix(starship): the Linux VPN segment uses a portable ip link show probe, not ifconfig.
    custom.vpn_linux shelled out to ifconfig (net-tools), which modern distros don't ship by
    default, so the tunnel indicator silently never appeared. It now parses ip link show — the
    common form supported by BOTH iproute2 AND BusyBox's ip applet (Alpine's default), so it works
    on every Linux target including the BusyBox outlier. custom.vpn_macos keeps ifconfig (native).
  • docs(git): spell out the includeIf work-identity failure mode.
    Clarified that a missing ~/.config/git/config-work makes git silently fall back to your
    default identity (no error), with the exact commands to seed it.
  • fix(git): prune-branches uses grep -E, not deprecated egrep.
    The prune-branches alias (git/gitconfig) shelled out to egrep, which GNU grep ≥3.8 prints
    a deprecation warning for on every invocation. Switched to grep -Ev; xargs -r is kept (GNU
    needs it to skip empty input, and modern BSD/macOS xargs supports it), so the alias is quiet on
    the Linux target and unchanged in behaviour on the macOS/BSD target it ships to.
  • fix(scripts): checksum refresh falls back to shasum -a 256 off-Linux.
    scripts/update-tool-checksums.sh hard-called sha256sum (GNU coreutils); a run on the macOS
    box (which ships shasum -a 256, not sha256sum) died. It now probes and falls back, so the
    tool works on either platform.
  • fix(maint): dotfiles-maint.sh enables set -uo pipefail.
    The unattended daily runner had no set options, so a typo'd env knob expanded to empty and a
    mid-pipe failure was masked. Added set -uo pipefail (every env knob is already :=/:-
    defaulted); -e stays deliberately omitted so one failed step never aborts the rest — that
    remains step()'s job.
  • fix(tmux): the popup scripts enable set -u.
    tmux-menu.sh, tmux-scratch.sh, and tmux-sesh.sh carried no set options, unlike their
    siblings; a typo'd variable would expand to empty silently. Added set -u (all three already
    guard ${TMUX:-}/${TERM:-} etc.); -e/pipefail stay off because the fzf pickers exit
    non-zero on a normal operator cancel.
  • fix(scripts): the freshness board's live signals honour an env token.
    scripts/freshness-dashboard.sh gated its GitHub-API "live signals" on gh auth status
    alone, whose exit/output varies by gh version — so in CI (which authenticates via
    GH_TOKEN, not gh auth login) the release-drift / Renovate-count / routine-issue
    sections could be mis-detected as unavailable. It now treats a GH_TOKEN/GITHUB_TOKEN
    env var as sufficient (what gh api actually uses), falling back to gh auth status
    for local runs with stored credentials.

v3.3.0

Choose a tag to compare

@github-actions github-actions released this 09 Jul 23:28
1db7213

Changed

  • perf(zsh): cut per-shell subprocess forks on the interactive startup path.
    _cache_eval (zsh/tools.zsh) now resolves each tool's binary via zsh's fork-free
    $commands hash instead of $(command -v …), removing one command-substitution fork
    per cached tool (~8/shell across starship/zoxide/mise/atuin/carapace + the os-layer
    gh/uv/ty callers). The diff --color capability probe (zsh/aliases.zsh) is now
    cached (keyed on the diff binary's mtime, invalidated on a toolchain change) instead
    of running the real diff on every shell; a live probe still decides correctly when
    the cache dir isn't writable. No behavioural change — same aliases, faster launch.
  • docs(zsh): make core-doctor's "install missing" hint honest about unpackaged tools.
    The batch hint printed a blanket <pkg-manager> install <all-missing>, implying the package
    manager can install every tool. On some distros a few modern-CLI tools aren't packaged at
    all (they're binary-distributed, and the right method — a distro package, mise use -g,
    go install, cargo install, or a vendor repo — varies per tool and distro), so the line
    fails on those. The caveat now states that names differ per distro and that not every
    tool is packaged everywhere, pointing to PORTING-MATRIX.md for the authoritative per-tool
    install path instead of implying the package manager covers all of them. Output-only; the
    package-manager line itself is unchanged.

Fixed

  • fix(tmux): scratchpad popup (prefix + T) no longer hijacks the main session on close.
    tmux-scratch.sh runs the scratchpad as a persistent _popup_scratchpad session the popup
    attaches to. On close, exiting the shell destroys that session, and the global
    detach-on-destroy off (tmux.conf) made the popup's client jump to the MAIN session instead
    of closing — attaching a second, popup-sized (80%×80%) client, so tmux clamped the main
    session to the popup's size and double-drew it (the scratchpad "took over" and the real
    terminal was left garbled). The scratch session now sets detach-on-destroy on for itself,
    so its client detaches (popup closes cleanly) when it's destroyed; real sessions keep the
    global jump-don't-exit behaviour.