fix(shell): keep Cursor on agent and Grok on grok

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.
This commit is contained in:
Frank Qing
2026-08-13 17:36:56 +08:00
parent e41d2b6e93
commit 82c6a57c3a
5 changed files with 77 additions and 6 deletions
+32 -2
View File
@@ -113,6 +113,12 @@ fi
grep -Fq 'brew shellenv' "$ROOT/.zshenv" || fail "Homebrew is not initialized in .zshenv"
grep -Fq '/usr/local/bin/brew' "$ROOT/.zshenv" || fail "Intel Homebrew path is missing from .zshenv"
grep -Fq '$HOME/.local/bin' "$ROOT/.zshenv" || fail "~/.local/bin is not added in .zshenv"
grep -Fq '${path:#$HOME/.grok/bin}' "$ROOT/.zshenv" || fail ".zshenv does not drop ~/.grok/bin"
grep -Fq '${path:#$HOME/.grok/bin}' "$ROOT/.zshrc" || fail ".zshrc does not drop ~/.grok/bin"
grep -Fq 'alias agent=$HOME/.local/bin/cursor-agent' "$ROOT/.zshrc" || fail ".zshrc does not alias agent to Cursor"
if grep -Eq '^[[:space:]]*(export[[:space:]]+)?PATH=.*\.grok/bin' "$ROOT/.zshenv" "$ROOT/.zshrc"; then
fail "easyzsh stubs must not prepend ~/.grok/bin"
fi
grep -Fq 'local.zsh' "$ROOT/.zshenv" || fail "local.zsh is not sourced from .zshenv"
grep -Fq 'ZSH_ALWAYS_ON_DIR' "$ROOT/.zshenv" || fail "always-on ~/.config/zsh/*.zsh glob is missing from .zshenv"
grep -Fq 'zsh/fnm' "$ROOT/install_fnm.sh" || fail "install_fnm.sh does not patch always-on zsh/fnm"
@@ -130,19 +136,43 @@ fi
# deploy.sh installs stubs and preserves local.zsh; removes obsolete tree
deploy_home="$TEMP_DIR/deploy-home"
mkdir -p "$deploy_home/.config/zsh/env" "$deploy_home/.local/bin" "$deploy_home/.grok/bin"
printf '%s\n' 'machine-only' >"$deploy_home/.config/zsh/local.zsh"
printf '%s\n' '# machine-only' >"$deploy_home/.config/zsh/local.zsh"
printf '%s\n' 'stale' >"$deploy_home/.config/zsh/env/00-path.zsh"
printf '%s\n' '#!/bin/sh' 'echo grok-ok' >"$deploy_home/.grok/bin/grok"
chmod +x "$deploy_home/.grok/bin/grok"
HOME="$deploy_home" bash "$ROOT/deploy.sh" --home "$deploy_home"
[[ -f "$deploy_home/.zshenv" ]] || fail "deploy.sh did not install .zshenv"
[[ -f "$deploy_home/.zshrc" ]] || fail "deploy.sh did not install .zshrc"
grep -Fxq 'machine-only' "$deploy_home/.config/zsh/local.zsh" ||
grep -Fxq '# machine-only' "$deploy_home/.config/zsh/local.zsh" ||
fail "deploy.sh overwrote local.zsh"
[[ ! -e "$deploy_home/.config/zsh/env" ]] || fail "deploy.sh left obsolete env/ tree"
[[ ! -e "$deploy_home/.config/zsh/local.zsh.example" ]] || fail "deploy.sh left local.zsh.example in home"
[[ -L "$deploy_home/.local/bin/grok" ]] || fail "deploy.sh did not create grok shim"
# Grok's `agent` must not keep the name when Cursor is absent.
printf '%s\n' '#!/bin/sh' 'echo grok-agent' >"$deploy_home/.grok/bin/agent"
chmod +x "$deploy_home/.grok/bin/agent"
ln -sfn "$deploy_home/.grok/bin/agent" "$deploy_home/.local/bin/agent"
HOME="$deploy_home" bash "$ROOT/deploy.sh" --home "$deploy_home" >/dev/null
[[ ! -e "$deploy_home/.local/bin/agent" ]] || fail "deploy.sh left Grok bound to agent without Cursor"
# Cursor takes `agent`; Grok stays on `grok`.
printf '%s\n' '#!/bin/sh' 'echo cursor-agent' >"$deploy_home/.local/bin/cursor-agent"
chmod +x "$deploy_home/.local/bin/cursor-agent"
ln -sfn "$deploy_home/.grok/bin/agent" "$deploy_home/.local/bin/agent"
HOME="$deploy_home" bash "$ROOT/deploy.sh" --home "$deploy_home" >/dev/null
[[ "$(readlink "$deploy_home/.local/bin/agent")" == "$deploy_home/.local/bin/cursor-agent" ]] ||
fail "deploy.sh did not point agent at cursor-agent"
[[ "$(readlink "$deploy_home/.local/bin/grok")" == "$deploy_home/.grok/bin/grok" ]] ||
fail "deploy.sh did not keep the grok shim"
# .zshenv repairs a Grok-stolen agent without deploy.
ln -sfn "$deploy_home/.grok/bin/agent" "$deploy_home/.local/bin/agent"
HOME="$deploy_home" PATH=/usr/bin:/bin zsh -c '. ~/.zshenv' ||
fail ".zshenv failed while repairing agent"
[[ "$(readlink "$deploy_home/.local/bin/agent")" == "$deploy_home/.local/bin/cursor-agent" ]] ||
fail ".zshenv did not retarget a Grok-stolen agent"
# Non-interactive zsh must resolve ~/.local/bin without sourcing .zshrc.
local_bin_home="$TEMP_DIR/local-bin-home"
mkdir -p "$local_bin_home/.local/bin"