mise v2026.8.11

v2026.8.11

v2026.8.11: Automatic updates, remote mise installs, and versioned lockfiles

Added 7
  • Add opt-in automatic self-updates with `auto_update` setting and configurable `auto_update_check_duration` that re-executes commands with the updated binary
  • Add remote bootstrap capability to install a persistent mise on target hosts via `install_mise` setting or `--install-mise` flag
  • Add lockfile versioning with `lockfile_version = 1` to bind each request to its resolved version, with `mise lock --upgrade` for migration
  • Add Corepack replacement functionality that honors `+sha...` checksums in `packageManager` and `devEngines.packageManager` with artifact verification
  • Add SHA-224 and SHA-384 hashing support and Windows script launcher for Yarn's JS CLI
  • Add `mise prune --dry-run` explanation output showing why each version is prunable
  • Recognize Oracle GraalVM innovation feature releases
Changed 1
  • Replace CLI parser from clap to usage-rs
Fixed 13
  • Relocate pipx virtual environments when packed into OCI images by rewriting shebangs and rebasing venv interpreter links
  • Skip glibc precompiled binaries on musl Linux and fall back to ruby-build
  • Stop applying environment in bash activation under `--no-hook-env`
  • Fold any spelling of `PATH` onto a single key on Windows
  • Filter deprecated versions during npm resolution
  • Fix cargo warnings to use crate names and correct `go install` warning paths

From mise

This release adds opt-in automatic self-updates, lets remote bootstrap leave a working mise behind on each target, and introduces versioned lockfiles that bind each request to the version it resolved. It also replaces the CLI parser with usage-rs, hardens remote Git task handling, and fixes a wide range of tool-installation, task, and config edge cases.

Highlights
  • mise can now keep itself up to date and provision itself onto remote hosts, closing two long-standing gaps in unattended and remote workflows.
  • Lockfiles gained an explicit format version so overlapping loose and exact requests can pin distinct versions, with mise lock --upgrade for safe migration and no surprise drift for existing files.
  • The CLI parser moved from clap to usage-rs, and remote Git task paths are now contained against traversal, symlink, and Windows path escapes.
Added
  • self-update: New opt-in automatic updates. Enable auto_update (with auto_update_check_duration, default 7d) and mise will update itself before eligible interactive commands, then re-exec your original invocation with the new binary. Updates are throttled and lock-serialized, skipped in CI, offline, non-interactive, and shell-integration contexts, and failures never block the requested command. Package-managed builds are steered toward the official optimized binaries. (#12288 by @jdx)

    [settings]
    auto_update = true
    auto_update_check_duration = "7d"
    
  • bootstrap: Remote bootstrap can now install a persistent mise on each target instead of tearing it down with the staging directory. Set install_mise in [bootstrap.remote] (or per host) or pass --install-mise[=/path]; the same checksum-verified executable that ran the bootstrap is installed, so the host converges on the orchestrating mise version. (#12284 by @jdx)

    [bootstrap.remote]
    install_mise = true  # installs to ~/.local/bin/mise
    
  • lock: Lockfiles now carry lockfile_version = 1 and bind each original request to the entry it resolved, so overlapping requests like "1" and "1.0.0" can lock different versions. Existing unversioned lockfiles stay on format 0 during ordinary mise lock/install/upgrade to avoid drift; run mise lock --upgrade to migrate (transactional, rolls back on failure). (#12299 by @jdx)

  • node: mise can now act as a Corepack replacement, honoring the +sha... checksum suffixes in packageManager / devEngines.packageManager and verifying the exact npm, pnpm, Yarn, or bun artifact before installing. Adds SHA-224/SHA-384 hashing and a Windows script launcher for Yarn's JS CLI. (#12214 by @jdx)

  • prune: mise prune --dry-run now explains why each version is prunable, naming either the kept versions and the configs requiring them or the fact that nothing tracked references the tool. (#12304 by @Marukome0743)

  • java: Oracle GraalVM "innovation" feature releases are now recognized. (#12189 by @roele)

Fixed
  • oci: pipx virtual environments are now relocated when packed into OCI images, rewriting host-absolute shebangs and rebasing venv interpreter links (including aliases like python/latest) onto the image's Python, so tools no longer dangle at runtime. (#12211 by @jdx)
  • ruby: glibc precompiled binaries are now skipped on musl Linux, falling back to ruby-build. (#12289 by @risu729)
  • bash: activation no longer applies the environment under --no-hook-env. (#12218 by @JamBalaya56562)
  • env: any spelling of PATH now folds onto a single key on Windows. (#12312 by @JamBalaya56562)
  • npm: deprecated versions are now filtered during resolution. (#12226 by @risu729)
  • aqua: cargo warnings use crate names, go install warning paths render correctly, and mise suggests compatible package backends. (#12252, #12251, #12225 by @risu729)
  • brew: cask artifacts behind flight-created symlinks now resolve correctly. (#12243 by @jdx)
  • bootstrap: progress display is suspended while sudo prompts, brew casks are no longer reinstalled on content drift, overlapping dotfile footprints are rejected, and brew cask pkgutil patterns match correctly. (#12244, #12222, #12290, #12297 by @jdx)
  • config: dotted conf.d fragments load unconditionally again, and mise no longer prompts for trust when stdin is not a tty. (#12242 by @jdx, #12268 by @Marukome0743)
  • lock: the "run mise lock" hint now points at --global when only global config has tools. (#12260 by @jdx)
  • ls-remote: JSON prerelease output now distinguishes unknown from stable. (#12265 by @risu729)
  • doctor: the new-version warning is now reported in JSON output too. (#12267 by @JamBalaya56562)
  • install-script: the pinned binary now defaults under the data dir rather than the cache dir. (#12261 by @Guria)
  • set: mise set --file now refuses a file it cannot read back. (#12207 by @JamBalaya56562)
  • sandbox: macOS root path traversal is now allowed. (#12263 by @jrandolf)
  • task: several task fixes — Rust cache paths map to the task root (#12235 by @jrandolf), Git task snapshots are preserved (#12000 by @risu729), global task scope precedence is enforced (#12229 by @risu729), silent template overrides are preserved (#12215 by @risu729), pwsh shebang file tasks run on Windows (#12274 by @JamBalaya56562), and file task arguments forward through a -c shell (#12277 by @JamBalaya56562).
Changed
  • cli: The command-line parser, help output, and shell completions moved from clap to usage-rs. Completions and help are now generated from compiled usage metadata rather than an external usage CLI, and mise completion --install writes self-contained scripts. This raises the minimum supported Rust version to 1.95. (#12221 by @jdx)
  • generate: mise generate bootstrap is renamed to mise generate install-script to avoid confusion with mise bootstrap. The old spelling still works as a hidden, deprecated alias (removal scheduled for 2027.9.0). (#12247 by @jdx)
  • prompts: confirmation prompts now distinguish "could not ask" from an explicit "no". (#12273 by @Marukome0743)
Security
  • task: Remote Git task paths are now contained to the checkout root, rejecting .. traversal, Windows absolute/backslash and drive-qualified forms, and intermediate symlink escapes, and refusing non-regular-file targets. This closes escapes that could chmod +x and execute attacker-chosen files outside the checkout. (#12254 by @risu729)
Deprecated
  • config (Alpine): The distro-wide all_compile = true default on Alpine now warns and is scheduled for removal in 2027.8.0; precompiled musl binaries become the default path. Set all_compile = true explicitly to keep building from source. (#12287 by @risu729)
  • config (idiomatic files): Minimum-version floors in go.mod (go X.Y) and CMakeLists.txt (cmake_minimum_required) now warn when they resolve a version and stop being read in 2026.11.0. toolchain goX.Y.Z is unaffected. Only affects users who opted these tools into idiomatic_version_file_enable_tools. (#12259 by @jdx)
Documentation
  • Clarified brew-cask TCC warnings on bootstrap (#12223 by @jdx), _.source being bash-only (#12286 by @risu729) and its cacheable source example (#12278 by @Marukome0743), cross-file hook execution order (#12295 by @jdx), that --system is shared storage rather than a mise-free install (#12253 by @jdx), which backends lockfile strict mode skips (#12306 by @Marukome0743), that task deps ignores run-array refs (#12285 by @risu729), and that raw serializes execution (#12307 by @Marukome0743).
Registry
  • Added hugo-extended-withdeploy (#12230 by @Perlence), skim (#12239 by @risu729), ticker (#12269 by @i-api), and cloc (#12280 by @szepeviktor).
Performance
  • Aqua registry search avoids allocating registry ids (#12231 by @risu729), and install state is loaded per tool instead of scanning every install (#12236 by @jdx).
Breaking Changes
  • The CLI parser migration (#12221) raises the minimum supported Rust version to 1.95 for building from source, and mise completion's --include-bash-completion-lib / --usage flags are now no-ops. Command behavior, flags, and aliases are otherwise preserved.
New Contributors
  • @szepeviktor made their first contribution in #12280
  • @i-api made their first contribution in #12269
  • @jrandolf made their first contribution in #12263
  • @Perlence made their first contribution in #12230

Full Changelog: https://github.com/jdx/mise/compare/v2026.8.10...v2026.8.11

💚 Sponsor mise

mise is maintained by @jdx, an open source developer for entire.io, the title sponsor of the jdx.dev open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at jdx.dev. Individual and company sponsorships keep mise fast, free, and independent.

View original

Upgraded? How did it go?

Discussion