Skip to content

v1.3.1: provisioning can put a toolchain on PATH again

Latest

Choose a tag to compare

@coder-pm coder-pm released this 25 Jul 09:53

Project provisioning can put a toolchain on PATH again. On macOS it could not, and the failure took the whole [setup] payload down with it.

A patch release for one image bug found while writing the provisioning docs. Cleat will offer to refresh your box image on the next start, because the fix lives in the image rather than the CLI.

Fixes

  • [setup] provisioning failed on macOS whenever a step touched a shell rc file - the box remaps its user to your host account, then takes ownership of the paths that need it. The shell rc files and ~/.config were not in that set, so on any host whose user id is not the image's own (which is every Mac) a [setup] step that appended to ~/.bashrc or ~/.profile, or created a directory under ~/.config, was refused. A payload runs under bash -e, so that refusal aborted the entire provisioning run. This is what rustup, the .NET install script and the uv installer all do by default. The box now takes ownership of those paths too. ~/.config is claimed non-recursively on purpose, so the gh capability's mount of your real ~/.config/gh keeps host ownership.

Changes

  • The bundled image spec moved to 4, so existing boxes are offered a refreshed image on the next start. Accepting it recreates the box: your project files and Claude state are untouched, ad-hoc installs inside the box are not. Any approved [setup] re-runs automatically on the new box.
  • The examples/setup starters no longer depend on that fix landing, so they also work on a box created before it. rustup runs with --no-modify-path, uv installs unmanaged into ~/.local/bin, and the .NET and Rust examples expose their binaries by symlinking into ~/.local/bin instead of editing a shell rc file. The box already puts ~/.local/bin first on the session PATH, and a provisioning payload never sources an rc file anyway.
  • The Rust example installs build-essential and pkg-config, and the .NET example installs libicu72 on arm64. The slim base ships neither, so rustc could not link and dotnet --info aborted with exit 134.
  • 1773 (+3) behavioral tests across 52 files, including one that fails if the ~/.config ownership fix ever becomes recursive and starts rewriting your real ~/.config/gh.
  • 384 (+2) mutations caught, 0 missed, 0 skipped.