@sanjeed5
I’m sure the team is busy, but any chance we could get an update on this issue?
As many have pointed out already, the underlying cause is that v1.6 shipped with changed versions of the cursor/code shell scripts, which fundamentally changed the behavior, and can’t be fixed by just reinstalling the shell commands via the Command Palette, since that just reinstalls using the new scripts.
This change is problematic for quite a few reasons:
- The
cursor command now behaves as basically an alias for cursor-agent, which not only confuses any humans running the command (bad UX), but also breaks any scripts that were written to use the old behavior (way worse).
- The
cursor command now behaves differently from its official documentation, which wasn’t updated to reflect this change.
- The old
cursor and cursor-agent have different APIs, so the new behavior is not just different, it’s actually incompatible with the old, since the old and new take different arguments. This also means that the new script’s fallback to the old behavior doesn’t even make sense (fallback_to_cursor_cli).
- The new script downloads and runs the install script without explicit user intent. This is at best a somewhat misguided piece of convenience (not everyone uses
cursor-agent), but technically opens a giant can of worms around security. Especially since it swallows the output.
- As far as I can tell, this change wasn’t documented anywhere at all (though it was flagged prior to release), which made for an unpleasant surprise. And the actual code changes and comments look to be intentional, which just adds a layer of confusion about whether this was a planned change or some accident.
- The new behavior includes an opt-out (
CURSOR_CLI_BLOCK_CURSOR_AGENT), but this should really be an opt-in change, so that users can control exactly when they switch over to the new behavior, just as a matter of general UX and API design.
- And frankly, who asked for this? If people want the aliasing for their own convenience, they can easily add their own alias in their own environment. Assuming that was even the intention.
So as it stands, this looks like an intentional but undocumented breaking change that downloads and runs arbitrary code without asking, deviates from official docs, is inconsistent with itself, that no one asked for, and puts the burden on the user to opt-out of, once they even figure out what’s going on. Just a bad look any way you slice it.
My suggestion is to simply revert the scripts to exactly what they were before, bringing back the old behavior. That seems like it should be an easy solution (barring something weird like Cursor internals now depend on this aliasing, which… say it ain’t so). Then the team can address these issues in a better future rollout, with more time and communication, if the change is still deemed desirable, for some reason.
I really hope this was just an unfortunate confluence of mistakes, and not some dumb shenanigans.
Anyway, an update would be great. Thanks!
For completeness, the current version (v1.6.26) of the cursor script looks like this:
#!/usr/bin/env bash
#
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License. See License.txt in the project root for license information.
function app_realpath() {
SOURCE=$1
while [ -h "$SOURCE" ]; do
DIR=$(dirname "$SOURCE")
SOURCE=$(readlink "$SOURCE")
[[ $SOURCE != /* ]] && SOURCE=$DIR/$SOURCE
done
SOURCE_DIR="$( cd -P "$( dirname "$SOURCE" )" >/dev/null 2>&1 && pwd )"
echo "${SOURCE_DIR%%${SOURCE_DIR#*.app}}"
}
function fallback_to_cursor_cli() {
if [ -n "$CURSOR_CLI" ]; then
# Falling back to direct CLI execution
eval "$CURSOR_CLI" "$@"
else
echo "Error: Neither cursor-agent nor fallback CLI found. Please install Cursor properly." 1>&2
exit 1
fi
}
function find_cursor_cli() {
# Clear the output variables
CURSOR_CLI=""
CURSOR_CLI_MODE=""
# when run in remote terminal, use the remote cli
if [ -n "$VSCODE_IPC_HOOK_CLI" ]; then
REMOTE_CLI="$(which -a 'cursor' | grep /remote-cli/)"
if [ -n "$REMOTE_CLI" ]; then
CURSOR_CLI="$REMOTE_CLI"
CURSOR_CLI_MODE="remote"
return 0
fi
fi
# Otherwise, use the electron app
APP_PATH="$(app_realpath "${BASH_SOURCE[0]}")"
if [ -z "$APP_PATH" ]; then
echo "Unable to determine app path from symlink : ${BASH_SOURCE[0]}" >&2
return 1
fi
CONTENTS="$APP_PATH/Contents"
ELECTRON="$CONTENTS/MacOS/Cursor"
CLI="$CONTENTS/Resources/app/out/cli.js"
CURSOR_CLI="ELECTRON_RUN_AS_NODE=1 \"$ELECTRON\" \"$CLI\""
CURSOR_CLI_MODE="local"
return 0
}
# Main execution
export VSCODE_NODE_OPTIONS=$NODE_OPTIONS
export VSCODE_NODE_REPL_EXTERNAL_MODULE=$NODE_REPL_EXTERNAL_MODULE
unset NODE_OPTIONS
unset NODE_REPL_EXTERNAL_MODULE
# If cursor-agent exists, try to find CURSOR_CLI but don't fail if we can't
if find_cursor_cli 2>/dev/null; then
# Export both variables if we found them
if [ -n "$CURSOR_CLI" ]; then
export CURSOR_CLI
export CURSOR_CLI_MODE
fi
fi
if [ "$CURSOR_CLI_BLOCK_CURSOR_AGENT" = "true" ]; then
# cursor-agent is forbidden, call cursor CLI directly
fallback_to_cursor_cli "$@"
fi
AGENT_JUST_INSTALLED=false
if ! command -v ~/.local/bin/cursor-agent >/dev/null 2>&1; then
echo "cursor-agent not found, installing via https://cursor.com/install ..."
curl -sS https://cursor.com/install | bash >/dev/null 2>&1
# Remove the previous log line from the terminal output
tput cuu1 && tput el
AGENT_JUST_INSTALLED=true
fi
# Check current cursor-agent version meets minimum version requirement
# If it fails with exit code 2 (version too old), update and retry
OUTPUT=$({ ~/.local/bin/cursor-agent --min-version=2025.09.04 status; } 2>&1)
EXIT_CODE=$?
# Update and retry if cursor was not just installed and:
# - exit code is 2 (version too old), OR
# - exit code is 1 and output contains "unknown option" (old agent CLI version doesn't have the --min-version option)
if { [ "$EXIT_CODE" -eq 2 ] || { [ "$EXIT_CODE" -eq 1 ] && echo "$OUTPUT" | grep -qi "unknown option"; }; }; then
echo "cursor-agent version is outdated, updating..."
~/.local/bin/cursor-agent update >/dev/null 2>&1
# Remove the previous log line from the terminal output
tput cuu1 && tput el
# Check new version to see if minimum version requirement is met
OUTPUT2=$({ ~/.local/bin/cursor-agent --min-version=2025.09.04 status; } 2>&1)
EXIT_CODE2=$?
if { [ "$EXIT_CODE2" -eq 2 ] || { [ "$EXIT_CODE2" -eq 1 ] && echo "$OUTPUT2" | grep -qi "unknown option"; }; }; then
# If the second attempt also fails, just try CURSOR_CLI as a fallback
fallback_to_cursor_cli "$@"
else
# min-version is met, run cursor-agent
export CURSOR_CLI_COMPAT=1
exec ~/.local/bin/cursor-agent "$@"
fi
else
# min-version is met, run cursor-agent
export CURSOR_CLI_COMPAT=1
exec ~/.local/bin/cursor-agent "$@"
fi