v2026.8.12

jdx/misev2026.8.12Aug 24, 2026by mise-en-dev

AI Summary

This release adds package uninstall support to the plugin bootstrap flow and fixes a broad set of task, config, tool, and diagnostic edge cases.

Key Highlights

  • Package-plugin managers now support pruning via an optional `PackageUninstall` hook.
  • Fixed UTF-8 BOM parsing in version-declaring files like `.tool-versions`.
  • Saving from `mise edit` now preserves comments.
  • Task child processes killed by SIGINT are now treated as interruptions.

New Features

  • Package uninstall support via `mise bootstrap packages prune`
  • UTF-8 BOM parsing support
  • Comment preservation in `mise edit`
  • SIGINT handling for task child processes

Full Release Notes

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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/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](https://github.com/jdx/mise/pull/12313) by @JamBalaya56562)

## New Contributors
* @tmkx made their first contribution in [#12322](https://github.com/jdx/mise/pull/12322)

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

## 💚 Sponsor mise

mise is maintained by [@jdx](https://github.com/jdx), an open source developer for [**entire.io**](https://entire.io), the title sponsor of the [jdx.dev](https://jdx.dev) open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at [jdx.dev](https://jdx.dev/sponsors.html). Individual and company sponsorships keep mise fast, free, and independent.