sf in place, using whichever installer put it there. How it was installed is
detected, not assumed — pip install --upgrade inside a uv tool environment writes packages
uv’s receipt does not know about, which is worse than doing nothing.
What it does for each installation
A refusal names the command that would work, so
sf update never leaves you without a next
step. This is the reason to prefer uv tool install: it is the installation with nothing in
the way of an upgrade.
Keep the CLI close to the server.
sf version prints both, and the JobSpec dialect the server
speaks; a CLI that speaks a different dialect cannot submit at all, and says so.