Login shells source the fragment twice to restore shim precedence after the system profile. Reapplying PATH does not require repeating shell integration or rebuilding shims.
Grok's installer prepends ~/.grok/bin and steals ~/.local/bin/agent.
easyzsh already shims `grok`; claim `agent` for Cursor and drop the
vendor bin from PATH so a later Grok upgrade cannot shadow it.
macOS path_helper runs after .zshenv and can move system Python ahead of pyenv. Add an idempotent login hook and preserve it across later easyzsh migrations.
The pyenv fragment lived in the interactive overlay, so agents and zsh -c fell back to system Python. Install it through the always-on fragment path and keep XDG destinations aligned with the loader.
fnm lived in interactive-only ~/.config/zshrc, so ssh/agents/zsh -c
missed fnm-managed node. Source ~/.config/zsh/*.zsh from .zshenv and
install the fragment as zsh/fnm instead.
Always-on and machine hooks already live in .zshenv / local.zsh.
Drop the empty stub, remove it on deploy, and leave real .zprofile
files to optional migration into local.zsh only.
Drop ~/.config/zsh/{env,interactive,login} modules. PATH and local.zsh
live in .zshenv; interactive UX is a single .zshrc again. Deploy only
installs the three stubs and removes obsolete trees/examples.
Replace the local/ directory of split env/login/interactive files with
one always-on local.zsh sourced from .zshenv. Deploy migrates old
fragments and never overwrites local.zsh.
Split always-on PATH/env, login hooks, and interactive UX into a
managed tree under ~/.config/zsh, with never-overwrite local/ hooks.
Agents and interactive shells share one PATH owner; deploy.sh applies
the layout safely across machines.
Non-interactive agent shells (Codex, Claude) skip .zshrc and never saw
user-local tools installed via pipx/uv/grok. Add ~/.local/bin in
.zshenv with an idempotent guard, and source optional
~/.config/zshenv.local for machine-local early env.
zoxide is part of the base install; a short j jump alias matches
common muscle memory. Refresh omz on a monthly cadence instead of
the bi-weekly default.
Keep ~/.zshrc upgrade-friendly by not shipping author-specific
plugin samples as patch targets. Prefer the flag-tolerant trash
function over bare aliases so common rm -f usage still works.
Set ZSH_DISABLE_COMPFIX=true so oh-my-zsh runs compinit -u instead of -i,
skipping the per-startup compaudit security scan. The completion directories
are machine-owned and not group/world-writable, so the audit only costs time.
Combined with deferring pyenv init in ~/.config/zshrc/pyenv.zsh, this cuts
interactive startup from ~258ms to ~211ms and agent shells from ~226ms to
~183ms.
Co-authored-by: Cursor <cursoragent@cursor.com>
Uncomment history-substring-search, systemd, k, extract, and sudo, and add
poetry to the default plugin list; all are installed via the bundled or custom
plugin dirs. Switch to robbyrussell when CURSOR_AGENT is set so Cursor's agent
terminal skips powerlevel10k, keeping interactive shells on p10k.
Co-authored-by: Cursor <cursoragent@cursor.com>
.zshenv runs brew shellenv for every zsh, including non-interactive and
GUI-launched shells; without a safe CWD the eval fails or triggers a
permission prompt when launched from a TCC-protected directory such as
~/Documents. Run it from /tmp.
The eza `l` alias (and the myip/e/ip/a/aa group) was defined before
oh-my-zsh loaded, so lib/directories.zsh overrode `l` back to ls. Move
the alias block after the oh-my-zsh source so the eza versions win.
Also document the ~/.config/zshrc personal-config mechanism and patch.sh
in the README, which previously only had a title.
Co-authored-by: Cursor <cursoragent@cursor.com>
Move brew shellenv into .zshenv so PATH is available outside
interactive shells, and make install guarantee a Trash backend
for safer rm aliases on both macOS and Linux.