This release adds four mise run features that help CI scripts and coding agents: tags for selecting tasks, a summary output style that only shows failures, a JSON run report, and --at for running tasks at another git revision. It also fixes problems with safe-mode lockfiles, symlink-each dotfiles, shims and shell completion.
Added
-
Task tags. You can label tasks with
tags, then run every task that has a tag withmise run --tag. A tag can be a string or a list. File tasks set them with#MISE tags=[...], and templates add their tags to the tasks that extend them. You can repeat--tag, and a task matches if it has any of the given tags. Dependencies run whatever their tags are. If you also give a pattern, such asmise run --tag slow 'test:*', mise runs only the matching tasks that have the tag.mise tasks ls --tagfilters the task list, andtasks ls --json,tasks infoand the MCP task list now includetags. #15406 (@jdx)[tasks."lint:docs"] run = "markdownlint docs" tags = ["lint", "docs"] [tasks."test:e2e"] run = "./e2e/run" tags = ["test", "slow"]
mise run --tag lint mise tasks ls --tag slow
-
summarytask output style. mise holds each task's output until the task ends. A task that passed prints one line, such as[unit] passed in 4.2s. A task that failed prints everything it wrote. Tasks that mise stopped print[name] cancelled. This style is opt-in: use--output summary,MISE_TASK_OUTPUT=summary,task.output, or a task'soutput. mise keeps up to 64 KiB of output per task and drops the oldest output past that. A long-running task such as a dev server prints nothing until it exits, so give those tasksoutput = "interleave". #15403 (@jdx)$ mise run --output summary test [lint] $ cargo clippy -- -D warnings [lint] error: unused variable: `x` [unit] passed in 4.2s [lint] ERROR task failed
-
JSON run reports.
mise run --report-file <PATH>, orMISE_TASK_REPORT_FILE, writes a JSON report when the run ends. This happens whether the run passes, fails, is interrupted or hits--timeout.- The report has the run's
status(passed,failed,cancelledortimed_out) and every scheduled task, dependencies included. - Each task has its status (
passed,failed,cancelled,skipped,cachedornot_run), exit code, duration and timestamps. - Task arguments are redacted the same way as in terminal output.
- The flag can't be combined with
--dry-run. Tasks don't inherit the variable, so a nestedmise runcan't overwrite the outer report.
- The report has the run's
-
mise run --at REV. Runs tasks at another git revision without touching your checkout. mise checks the revision out into a temporary detached worktree, runs the task with that revision's own config and tasks, then removes the worktree. It also removes it after a failure, a timeout or Ctrl-C.--at-setup CMDprepares the worktree first, for example by installing dependencies.- Submodules are initialized.
- Tasks and the setup command get
MISE_RUN_AT_SOURCE(your checkout) andMISE_RUN_AT_REV(the commit). - Config at that revision gets your main checkout's trust, and you can't bypass this with a prompt or
--yes. - Paranoid mode always refuses a config at that revision.
mise run --at main test mise run --at HEAD~1 --at-setup "npm ci" test
Fixed
- Lockfiles and safe mode
MISE_SAFE=1 MISE_LOCKED=1 mise installworks again fornode,pythonandgowhenmise.lockhas their checksums. It used to fail with "No lockfile URL found". These tools now work out their own download URL and check it against the locked checksum. If safe mode is the reason a URL is missing, the error now says so. #15392 (@jdx)npm:tools locked through aube now install in safe mode and in untrusted projects. mise keeps the lockfile's dependency graph if it only fetches from the registry using integrity hashes. Graphs that name tarball URLs, git sources or local paths are still dropped. #15401 (@jdx)mise lock java@temurin-27no longer rewritesjava = "temurin-26"to the brokentemurin-temurin. It now writestemurin-27, with the same precision as the original request. Switching vendor at the same version, as injava@zulu-26, is saved too. #15386 (@jdx)- When
mise lock tool@3.0.1changestool = "2"totool = "3"in the config, the lockfile entry now records"3", the request the config holds, instead of"3.0.1". Before, later lookups for that request couldn't find the entry. #15404 (@jdx)
- Dotfiles and bootstrap
mise bootstrapnow writes mise's own config files first and plans the rest of the dotfiles from the result, asmise dot applyalready did. If a dotfile entry deploys aconf.dfile, the entries in that file now apply in the same run, not the next one.--dry-runpreviews them as well. #15387 (@jdx, @webkaz)- A
symlink-eachentry no longer writes through a directory symlink you made inside its target. That symlink is now reported as a conflict that needs--force.unapplyalso no longer deletes a directory symlink as if it were an empty folder. #15399 (@jdx) - On the first apply, a
symlink-eachsource that contains a dangling symlink no longer loses its link right after creating it. #15395 (@jdx) mise dot unapply --groupandmise dot apply --prunenow delete a group's leftoversymlink-eachstate records once none of its links remain. #15390 (@jdx)- On a second machine whose local history holds no files,
mise dot origin setnow adopts the origin's history. It used to fail with "local and origin histories are unrelated". Iforigin setrefuses to connect, it no longer writes[history.origin]. #15394 (@jdx) - History snapshots no longer start a
gitprocess for each encrypted tracked file. This speeds upmise bootstrapand the dotfile history commands when you have many encrypted files. #15393 (@jdx)
- Shims
- On macOS, when a due
tool_update.global_autocheck ran from a shim, the tool was launched with mise's internal arguments (jq: Unknown option --id). mise now runs the update itself. #15389 (@jdx) - When the installed version ships other executables but not the one you called, as after mprocs was renamed to dekit, the shim and
mise whicherrors no longer suggest a reinstall that can't help. They now show the errormprocs@0.10.3 does not provide mprocs (it provides: dekit), or name another installed version that does provide it. #15388 (@jdx)
- On macOS, when a due
- Completion
- In
mise x -- <cmd> <Tab>, every word after the command now completes file names, as it would in a plain shell. The same applies tomise dot capture --,mise bootstrap repos exec --andmise ssh. #15396 (@jdx, @Yasushi) - When a task has the same name as a built-in command, such as
upgrade, completingmise upnow shows the built-in command's description.mise run <TAB>still shows the task. #15385 (@jdx)
- In
- Installs and config
- Go tool installs now retry
go installafter temporary network errors from the module proxy or checksum database, using thehttp_retriessetting. When the retries run out, mise shows the network error, not a misleadingunknown revision. #15384 (@jdx) - On Windows, aqua raw downloads whose URL ends in
.exenow keep the extension when the recipe setscomplete_windows_ext: false. Before,aqua:SonarSource/sonarqube-cliinstalledsonarinstead ofsonar.exe. #15412 (@jdx) - mise no longer crashes with
PermissionDeniedif it can't resolve a config path. This happened on Windows inside workspace sandboxes. A config trusted outside the sandbox may show as untrusted inside it;MISE_TRUSTED_CONFIG_PATHSworks around that. #15383 (@jdx) - With
skills.auto_sync, a tool that only your global config declares no longer has its agent skills linked into every project as well. Global tools are linked only under your home directory.mise skills syncwithout--diror--globalfollows the same rule. Links that are already in project directories stay until you runmise skills sync --prune. #15391 (@jdx)
- Go tool installs now retry
Changed
- Registry:
temporalnow installs the Temporal CLI fromaqua:temporalio/cli, which includestemporal server start-dev. Before, it installed the server bundle. If you need the server bundle, usemise use aqua:temporalio/temporal. #15373 (@jdx) - Registry:
odinon Windows now gets anodinshim. Before, only the bundled linker tools were shimmed. #15400 (@jdx)
Documentation
- The site search can now find individual keys on the mise.toml reference page, such as
doctor.checks. #15375 (@jdx)
Full Changelog: v2026.11.1...v2026.11.2
💚 Sponsor mise
mise is built and maintained by @jdx, an open source developer at entire.io, the title sponsor of his open source work.
If mise saves you or your team time, please consider becoming an individual or company sponsor. Your support funds ongoing development and helps keep mise fast, free, and independent.