This release brings a major upgrade to mise prepare with content-hash freshness, dependency ordering, and better diagnostics. Hooks and watch files can now delegate to full mise tasks, and task vars gain monorepo inheritance and per-task overrides. Several lockfile and idiomatic version file parsing bugs are also fixed.
Highlights
mise prepareoverhaul -- Freshness detection switches from mtime to blake3 content hashing (reliable across CI and clock skew), providers can declare dependencies on each other, a new--explainflag shows detailed diagnostics, and per-provider timeouts are now supported.- Task-backed hooks -- Hooks and
watch_filescan now reference mise tasks instead of inline scripts, gaining access to the full task system (deps, env, templating). - Per-task vars and monorepo vars inheritance -- Tasks can define their own
varsthat override config-level vars, and monorepo subdirectory vars are now properly inherited when running tasks from the root.
Added
-
Task references in hooks and watch_files -- Hooks can now use
{ task = "name" }syntax to run a mise task instead of an inline script. Mixed arrays of scripts and task references are supported. Task refs respectMISE_NO_HOOKS=1and the full task system (deps, env, etc.). #8400 by @jdx[hooks] enter = { task = "setup" } [[watch_files]] patterns = ["uv.lock"] task = "uv-deps"
-
Per-task vars and monorepo vars inheritance -- Tasks can now define task-local
varsthat override config-level vars for that task. Monorepo subdirectory vars are also properly inherited when running tasks from the project root, matching howenvalready works. #8248 by @halms[vars] greeting = "hello" [tasks.test] run = 'echo {{vars.greeting}}' vars = { greeting = "hi" } # overrides config-level var
-
Built-in
git-submoduleprepare provider -- A new built-in provider detects.gitmodulesand runsgit submodule update --init --recursivewhen submodule directories are stale. No configuration needed -- it activates automatically when.gitmodulesexists. #8407 by @jdx -
Blake3 content-hash freshness for prepare --
mise preparenow uses blake3 content hashing instead of mtime comparison to determine whether providers need to run. Hashes are persisted to.mise/prepare-state.toml. This is more reliable across CI, VCS operations, and clock skew scenarios. #8404 by @jdx -
Human-readable stale reasons in prepare output -- Dry-run and status bar messages now explain why a provider would run, e.g.
[dry-run] Would prepare: npm (node_modules does not exist)orprepare: codegen (schema.graphql changed) -- run 'mise prep'. #8408 by @jdx -
mise prepare --explain <provider>diagnostics -- A new--explainflag shows detailed information about a specific provider: sources, outputs, auto status, command, and a fresh/stale verdict with reasons. Exits 0 if fresh, 1 if stale, useful for scripting. #8409 by @jdx -
Per-provider timeout support for prepare -- Providers can now set a
timeoutin seconds. If the command exceeds the timeout it is killed. #8405 by @jdx[prepare.npm] timeout = 120 # kill after 2 minutes
-
Dependency ordering for prepare providers -- Providers can declare
depends = ["other-provider"]to enforce execution ordering. Independent providers still run in parallel. Cycle detection, failure propagation, and unknown-dep warnings are all handled. #8401 by @jdx[prepare.ansible-galaxy] depends = ["uv"] run = "ansible-galaxy install -f requirements.yml" sources = ["requirements.yml"] outputs = [".galaxy-installed"]
Fixed
-
Idiomatic version files now ignore comments -- Files like
.python-version,.node-version,.ruby-version, and.java-versionnow correctly strip#comments (both full-line and inline) and blank lines, preventing mise from treating comment text as version specifiers. #7682 by @iloveitaly -
Generic parser used for idiomatic files -- Built-in idiomatic file parsers (e.g. for
package.jsonand raw text files) are now used consistently, preventing unexpected behavior when plugins like vfox don't support certain file formats. #8171 by @risu729 -
Aqua bin_paths disk cache restored with proper invalidation -- The aqua
bin_paths.msgpack.zcache removed in v2026.2.24 has been restored withfresh_fileinvalidation keyed on the install directory. This recovers the 7-11% performance regression onmise envandmise hook-envwhile keeping cache correctness. #8398 by @jdx -
Lockfile no longer splits entries for precompiled settings --
mise lockwithprecompiled_flavoror similar settings configured no longer produces duplicate tool entries by splitting the host platform into a separate entry. #8396 by @jdx -
Python lockfile respects precompiled settings --
mise locknow correctly usesprecompiled_arch,precompiled_os, andprecompiled_flavorsettings when generating Python lock file entries, andprecompiled_flavoris properly honored during installs. #8399 by @jdx -
"v" prefix normalized in lockfile version matching --
--lockedmode no longer fails whenmise.tomlspecifiesv1.2.3but the lockfile stores1.2.3(or vice versa). #8413 by @jdx -
Vfox no longer eagerly loads metadata -- Removed vfox's
idiomatic_filenames()override that triggered plugin metadata loading for every config file check, and reordered detection logic so known patterns are checked first. Eliminates spurious[vfox] Getting metadata for yarndebug messages. #8397 by @jdx -
Fixed infinite recursion with
uv_venv_autoand uv shims -- Whenuv_venv_auto = "create|source"is set and a mise shim foruvexists on PATH, venv creation no longer enters infinite subprocess recursion. The fix excludes the mise shims directory from theuvbinary search. #8402 by @halms -
Improved git submodule parser for prepare -- The
.gitmodulesparser is now INI-section aware, only extractingpathvalues from[submodule "..."]sections and ignoring comments. Freshness check errors now default to fresh rather than stale, preventing spurious warnings. #8412 by @jdx
Breaking Changes
- The deprecated
# mise ...file task header syntax has been removed as scheduled. Only#MISE/# [MISE]///MISE/::MISEheaders are now recognized. If you have task files still using the old# miseheaders, update them to use the new syntax. #8403 by @jdx
New Contributors
- @iloveitaly made their first contribution in #7682
Full Changelog: v2026.2.24...v2026.3.0