mise v2026.8.12

v2026.8.12

v2026.8.12: Cleaner diagnostics and a raft of task, config, and tool fixes

Added 1
  • Package-plugin managers now support pruning via an optional PackageUninstall hook, so mise bootstrap packages prune --manager <plugin> is no longer Homebrew-only
Fixed 14
  • Version-declaring files that begin with a UTF-8 byte-order mark now parse correctly instead of silently vanishing or resolving to a corrupt version
  • Saving from mise edit and the interactive TUI now preserves comments including leading, trailing, and section comments
  • An idiomatic file such as package.json that was disabled no longer triggers a spurious cannot update idiomatic version file warning on read-only operations
  • A cd target that cannot be entered is now reported with the path and OS reason instead of panicking
  • A task whose child process is killed by SIGINT is now treated as an interruption exiting 130 without failing sibling tasks
  • Value-taking usage flags without a default now stay string-typed during template rendering so path filters work on them

From mise

This release adds package uninstall support to the plugin bootstrap flow and fixes a broad set of task, config, tool, and diagnostic edge cases. Many changes turn silent failures and cryptic errors into actionable messages, so it is largely a robustness and quality-of-life release.

Added
  • bootstrap: Package-plugin managers now support pruning via an optional PackageUninstall hook, so mise bootstrap packages prune --manager <plugin> is no longer Homebrew-only. mise records ownership only for packages that go from missing to installed during an install, and prune removes only owned packages that are absent from the current config and trusted tracked configs. Pre-existing and manually installed packages are never claimed, dry-run never invokes the hook, and the keep-set is reloaded after confirmation so newly declared packages cannot be removed without another prompt. (#12332 by @jdx)
Fixed
  • config: Version-declaring files that begin with a UTF-8 byte-order mark now parse correctly. Previously a leading BOM (as written by Notepad or PowerShell's Out-File -Encoding utf8) could make .tool-versions, .node-version, package.json packageManager, registry-scraped files like Earthfile, and .sdkmanrc entries silently vanish or resolve to a corrupt version. Cached idiomatic parses written by an older mise are re-parsed so the fix takes effect on upgrade. (#12325 by @JamBalaya56562)
  • config: Saving from mise edit (and the interactive TUI) now preserves comments — leading, trailing, and section comments are captured on parse and written back on save, instead of being stripped. (#12319 by @Marukome0743)
  • config: An idiomatic file such as package.json that was tracked while enabled and later disabled no longer triggers a spurious "cannot update idiomatic version file" warning on read-only operations like mise ls --all-sources. The tracking entry is retained so re-enabling the tool reactivates it. (#12194 by @xqm32)
  • cli: A cd target that cannot be entered (for example via MISE_CD pointing at a missing directory, or a directory the process cannot chdir into) is now reported with the path and OS reason instead of panicking. (#12314 by @JamBalaya56562)
  • task: A task whose child process is killed by SIGINT (Ctrl-C reaching only the child) is now treated as an interruption, exiting 130 without failing sibling tasks, instead of reporting a spurious failure. Signalled processes now render as killed by SIGINT/killed by SIGTERM rather than "no exit status". (#12323 by @Marukome0743)
  • task: Value-taking usage flags without a default (for example --file <file>) now stay string-typed during template rendering, so path filters like dirname work on them. Switch flags still default to booleans and count flags to integers. (#12355 by @jdx)
  • tasks: On Windows, task files skipped because they have no known extension or shebang now explain why and give platform-appropriate guidance, instead of producing no output or a misleading "Are you in a project directory?" message. Outdated chmod +x advice is gone from Windows messages. (#12324 by @JamBalaya56562)
  • tool-stub: Non-cached tool-stub execution now keeps the toolset's env_with_path rather than rebuilding PATH from a pristine environment, restoring project _.path directories and fixing discovery of sibling stubs. The stub-selected tool version is no longer shadowed by an outer task's install directories. (#12322 by @tmkx)
  • watch: mise watch --clear=reset --restart no longer leaves the terminal without echo after Ctrl-C. The controlling terminal (preferring /dev/tty) is now saved and restored from a drop guard, so it recovers on normal return, errors, and cancellation, including when stdin is redirected or a second terminal is in use. (#12328 by @Marukome0743)
  • go: go install no longer inherits a GOROOT that mise exported for a different Go, which caused compile: version ... does not match go tool version ... failures when another go was first on PATH. An explicitly configured install_env GOROOT is still honored. (#12342 by @Marukome0743)
  • doctor: mise doctor now flags a tool whose install directory exists but is empty (for example after an interrupted download), marking it (empty) and suggesting mise install --force, instead of silently treating it as installed. (#12321 by @Marukome0743)
  • env: When an age SSH identity cannot be used (passphrase-protected, encrypted, hardware-backed, or an unsupported key type), decryption failures now explain which identity could not be read and why, instead of the misleading "No matching keys found". (#12339 by @Marukome0743)
  • env: The warning for an unexpanded $VAR now names the key or directive that referenced the missing variable and the config file it lives in, making it possible to find the offending line in a large [env] block. (#12316 by @Marukome0743)
  • brew-cask: Casks already owned by Homebrew are now recognized as installed (read-only) rather than reported missing and then blocked by the ownership guard, making declarative bootstrap idempotent for Homebrew-managed casks. mise leaves such installations untouched across status, apply, use, upgrade, and prune. (#12346 by @donbeave)
  • registry: oc (OpenShift client) now installs from channel aliases such as oc = "stable" by resolving the unversioned artifact name within the channel directory, fixing a 404. (#12326 by @Marukome0743)
Documentation
  • tasks: PowerShell task guidance now points extensionless tasks at MISE_TASK_DIR for locating sibling files, which works consistently across Linux, macOS, and Windows without renaming the task. (#12313 by @JamBalaya56562)
New Contributors
  • @tmkx made their first contribution in #12322

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

💚 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