Release Notes
💥 Breaking
- Lockfiles
- Added support for environment scoped lockfiles. When
PROTO_ENVis set, a.prototools.<env>config is now locked to a sibling.protolock.<env>lockfile, instead of sharing the directory's.protolockwith the base.prototoolsconfig.- Each lockfile only tracks tools with versions defined in its own config. A version overridden by an environment config is tracked in
.protolock.<env>, while versions inherited from.prototoolsremain in.protolock. Ad-hoc installs are tracked by the base.prototoolsconfig. - Environment configs inherit the
settings.lockfilesetting from the.prototoolsconfig in the same directory, but can override it. Lockfiles for inactive environments are never loaded or modified. - Records for environment specific versions that were previously written to
.protolockare no longer used, and will be re-created in.protolock.<env>on the next install.
- Each lockfile only tracks tools with versions defined in its own config. A version overridden by an environment config is tracked in
- Added support for environment scoped lockfiles. When
🚀 Updates
- Added unstable Swift support:
proto install swift. - Increased the plugin cache duration from 30 days to 180 days (6 months) because of GitHub's unreliability.
- Checksums
- Added support for verifying prebuilt downloads with GPG detached signatures (
.sigand.asc) provided throughchecksum_url, using the plugin-providedchecksum_public_key.- Public keyrings may contain multiple certificates in a single armored block or multiple concatenated armored blocks.
- Signature files may contain multiple binary signatures, multiple signatures in one armored block, or multiple concatenated armored blocks. Verification succeeds when any signature matches a trusted key.
- GPG verification streams the artifact from disk in a blocking worker and records only the verified signer fingerprint and artifact SHA256 in lockfiles, instead of the armored public keyring.
- Added support for verifying prebuilt downloads with GPG detached signatures (
- Lockfiles
- Added an
--immutable-lockfileflag toproto install(and aPROTO_IMMUTABLE_LOCKFILEenvironment variable) that treats the lockfile as read-only. Versions are resolved from existing lockfile records, and the lockfile is never created, updated, or pruned.- If a tool being installed has no matching record, the install fails instead of resolving a fresh version, which is useful for reproducible installs in CI.
- This flag cannot be combined with
--update-lockfileor--pin.
- Updated
proto pinandproto unpinto always keep the lockfile of the modified config in sync, even when another config (like an environment config) takes precedence for the tool. - Updated
proto install --pinto track the record of the installed version in the lockfile of the pinned config, even when another config (like an environment config) takes precedence for the tool. - Updated
proto uninstallto remove records for the uninstalled version from all applicable lockfiles, as the version may be pinned in multiple configs (each of which is unpinned). When uninstalling all versions, the tool is removed from all applicable lockfiles. - Updated
proto outdated --updateto also update versions defined in environment scoped configs (.prototools.<env>), including the records in their lockfiles. Previously these versions were skipped with a warning. - Updated
proto installandproto uninstallto prune orphaned records from lockfiles. A record is orphaned when its tool has a version defined in the config that owns the lockfile, but the record's spec no longer matches any of that config's specs, which typically happens when a config is modified outside of proto. Records for tools that the owning config does not define are ad-hoc installs, and are never pruned.- This is the same staleness that
proto diagnosereports, so records it warns about are now removed by the next install or uninstall. - Only lockfiles that have been loaded are pruned, so lockfiles for inactive environments continue to be left untouched.
- Pruning runs after the install or uninstall, against configs as they stand at that point. Installing an explicit version of a tool that is configured with a different version no longer leaves a record behind, unless the version is pinned with
--pin.
- This is the same staleness that
- Added an
- WASM API
- Added a
download_filehost function, which downloads a file from a URL directly to a file on the host machine, without loading the contents into WASM memory. Requests are made with proto's HTTP client, respecting[settings.http]and.netrcconfiguration.- Added
downloadanddownload_from_urlfunctions, and adownload_file!macro, to the PDK.
- Added
- Added a
methodfield to thesend_requesthost function input (SendRequestInput), which supportsGET(default) andPOST. - Added a
SendRequestInput::post()constructor for creatingPOSTrequests. - Added a
ToolLockOptions.metadatafield, which allows plugins to include additional metadata in lockfile records for the installed tool.
- Added a
🛠️ Tools
- Ruby
- Fixed build from source returning a prebuilt archive.
🐞 Fixes
- Fixed an issue where the internal fallback loop guard (
PROTO_INTERNAL_RUN_FALLBACK) would leak into child processes and abort unrelated, nested invocations of the same tool (like npm scripts that spawnnode) with a falsefallback_looperror. The guard is now scoped to the process that performed the fallback, so only a genuine same-process re-entry is treated as a loop.- Proto now also skips any directory on
PATHthat contains a shimsregistry.json, so a foreign proto store (from a mismatchedPROTO_HOME) is never selected as the global fallback and can't trigger a loop. - Reworded the
fallback_looperror to describe the actual cause instead of incorrectly claiming the resolved binary is a proto shim.
- Proto now also skips any directory on
- Fixed an issue where
proto uninstallwould fail whenPROTO_ENVis set and an environment scoped.prototools.<env>config exists, as it would attempt to unpin the version from an invalid path. - Fixed
proto install <tool>not respecting thedetect-strategysetting. It resolved a version by scanning the working directory for the tool's own version file before consulting.prototools, unlikeproto run,proto statusand a bareproto install, which all honour the setting. A repo pinninggo = "1.26.7"withdetect-strategy = "prefer-prototools"beside ago.workwould install whatever thegodirective's range resolved to, andproto run gowould then fail withmissing_tool. As a consequence,installnow also detects ecosystem files by traversing the config file chain rather than only the working directory, and honoursPROTO_<TOOL>_VERSION. - Fixed virtual path conversion producing a path with a trailing separator when the path being converted is a virtual/real prefix itself (
Path::join("")appends a separator). This surfaced in moon as$env.PWD contains trailing slasheserrors from nushell when plugin commands ran at the workspace root. - Fixed concurrent commands that write to a
.prototoolsfile erasing each other's changes. The config was read under a shared lock, the lock released, then an exclusive lock acquired to write, so 2 processes could both read the same content and the last writer would erase the entries added by the first. Runningproto install <tool> --pinin parallel (orpin,unpin,alias,unalias,uninstall,plugin add,plugin remove) would silently drop tools from the config, surfacing much later asproto runfailing to detect a version for a tool that had just installed successfully. - Fixed an issue where an install that failed very early (before any progress output) could hang when not running in a TTY, as the non-TTY progress monitor could miss the exit signal.
- Fixed an issue where versions with a pre-release or build identifier that begins with a hyphen (like
1.0.6--canary.9.0c3f3b7.0) would fail to parse, even though they are valid semver. Such versions can appear inyarn.lockfiles transitively through published npm packages.
⚙️ Internal
- Updated Rust to v1.98.0.
- Updated dependencies.
Install proto_cli 0.61.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/moonrepo/proto/releases/download/v0.61.0/proto_cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/moonrepo/proto/releases/download/v0.61.0/proto_cli-installer.ps1 | iex"Download proto_cli 0.61.0
| File | Platform | Checksum |
|---|---|---|
| proto_cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| proto_cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| proto_cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| proto_cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| proto_cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
| proto_cli-aarch64-unknown-linux-musl.tar.xz | ARM64 MUSL Linux | checksum |
| proto_cli-x86_64-unknown-linux-musl.tar.xz | x64 MUSL Linux | checksum |