Problem
The two installers behave differently on a machine with nothing preinstalled.
install.ps1 (added in #2309) installs its prerequisites: Git via winget, uv via winget with the astral.sh script as fallback. uv downloads its own Python, so a bare Windows machine completes the install with no preparation. Its own step banner says so: "Both are installed automatically when missing. No Python is required."
install.sh only detects. It never installs uv and never installs Python:
| state |
outcome |
| uv present |
works — uv provisions Python via --python '>=3.12' |
| no uv, pipx + supported Python |
works |
| no uv, pipx, Python too old |
exit 1 (install.sh:1216) |
| no uv, no pipx, no supported Python |
exit 1 (install.sh:1237) |
In the failing cases it prints remediation and stops. The string curl -LsSf https://astral.sh/uv/install.sh | sh does appear in the script, but only inside _print_python_install_remediation() as text on screen (install.sh:937) — it is never executed.
So the documented one-liner install (curl -fsSL .../install.sh | bash) works on Windows from a clean machine but not on a clean macOS or Linux machine.
Why this is worth fixing rather than documenting
uv carries its own Python. Installing that one thing turns every failing row above into a working install — there is no separate "install Python first" step to ask the user for.
Proposal
At the two points where the script currently exits, install uv from astral.sh — the same script install.ps1 already falls back to — then continue. Re-probe the directories the installer writes to (XDG_BIN_HOME, CARGO_HOME/bin, ~/.local/bin), since it cannot change the running shell's PATH.
Leave every currently-working path untouched: an existing uv, or pipx with a supported Python, reaches its installer before the bootstrap is reached.
Fetching and running an installer from the network is something a caller may reasonably refuse, so it should be declinable — an env var that restores today's instructions-and-exit behaviour.
Problem
The two installers behave differently on a machine with nothing preinstalled.
install.ps1(added in #2309) installs its prerequisites: Git via winget, uv via winget with theastral.shscript as fallback. uv downloads its own Python, so a bare Windows machine completes the install with no preparation. Its own step banner says so: "Both are installed automatically when missing. No Python is required."install.shonly detects. It never installs uv and never installs Python:--python '>=3.12'exit 1(install.sh:1216)exit 1(install.sh:1237)In the failing cases it prints remediation and stops. The string
curl -LsSf https://astral.sh/uv/install.sh | shdoes appear in the script, but only inside_print_python_install_remediation()as text on screen (install.sh:937) — it is never executed.So the documented one-liner install (
curl -fsSL .../install.sh | bash) works on Windows from a clean machine but not on a clean macOS or Linux machine.Why this is worth fixing rather than documenting
uv carries its own Python. Installing that one thing turns every failing row above into a working install — there is no separate "install Python first" step to ask the user for.
Proposal
At the two points where the script currently exits, install uv from
astral.sh— the same scriptinstall.ps1already falls back to — then continue. Re-probe the directories the installer writes to (XDG_BIN_HOME,CARGO_HOME/bin,~/.local/bin), since it cannot change the running shell's PATH.Leave every currently-working path untouched: an existing uv, or pipx with a supported Python, reaches its installer before the bootstrap is reached.
Fetching and running an installer from the network is something a caller may reasonably refuse, so it should be declinable — an env var that restores today's instructions-and-exit behaviour.