github jdx/mise v2026.10.25
v2026.10.25: Edit and remove tasks from the CLI, and `mise watch --once`

5 hours ago

mise tasks can now add, change and remove tasks in a chosen config file without an editor, and mise watch --once waits for one change, runs the tasks and exits. Both suit scripts and coding agents. The release also adds opt-in env caching for configs with redacted values, and fixes concurrent installs, lockfiles in symlinked config dirs, slow reshims and signed macOS app bundles.

Added

  • mise tasks set and mise tasks rm, plus more options for mise tasks add. #15213 (@jdx)

    • add, set and rm take the same --env, --global and --path flags as mise use, so you can pick the file they write to.
    • add and set take new task fields: --env-var, --tools, --usage and --confirm.
    • set changes only the fields you pass and keeps the rest of the file, comments included. --unset FIELD removes a field. It fails if the task doesn't exist.
    • rm (alias remove) deletes a TOML task's table or a file task's script. It asks for confirmation unless you pass --yes, and it refuses tasks inferred from package.json or defined in included files.
    • All three commands accept --json and --dry-run. If more than one loaded file defines a task, set and rm stop and list the files so you can choose one.
    • When add or set trusts the config root it writes to, it now says so on stderr.
    mise tasks add --env local deploy --env-var STAGE=prod --tools node@24 \
      --confirm "Deploy now?" -- ./deploy.sh
    mise tasks set build --description "Build for release" -- cargo build --release
    mise tasks rm --env local --yes scratch
  • mise watch --once. mise waits for a change in the watched sources, runs the tasks once with mise run, and exits with their status. It uses the same filters as a normal watch and runs nothing at start, so --postpone is implied. Flags that only control how watchexec reruns the command, such as --restart and --clear, are refused with --once. Ctrl-C exits with 130. SIGTERM while waiting exits without running anything. A signal during the run stops the whole task process tree. mise watch also now passes --exit-on-error to watchexec, which stops at the first failed run and exits with its status. --exit-on-error requires watchexec 2.5.0 or later. #15212 (@jdx)

    mise watch test --once && echo "tests pass after the change"
  • env_cache_redacted setting. With env_cache = true, mise never caches an environment that contains a redact = true directive, so a slow _.source script ran again on every prompt. The new opt-in env_cache_redacted setting (MISE_ENV_CACHE_REDACTED=1, default false) lets these environments be cached. Values stay masked in output when they are read from the cache. The tradeoff: the secret values are stored on disk, encrypted with a key that every process started from the activated shell inherits. age and sops values, plugin results with cacheable = false, redacted [vars], and redacted default/required directives are still never cached. With MISE_DEBUG=1, mise now logs when an environment wasn't cached and which directive prevented it. #15200 (@jdx, @Achder)

    [settings]
    env_cache = true
    env_cache_redacted = true
  • managed_by in bootstrap package status JSON. Installed brew-cask packages now report managed_by ("mise", "homebrew" or "unknown") in mise bootstrap packages status --json and mise bootstrap status --json. Scripts can use it to tell which casks mise will upgrade and which it leaves to Homebrew. #15198 (@jdx, @drewbitt)

  • Registry: added jouet, which installs from its signed packslip #15201 (@jdx)

Changed

  • mise tasks add now accepts --force. Re-adding an identical task does nothing. Replacing a task that has a different definition without --force still works for now. mise will warn about it starting in 2027.5.0 and refuse it starting in 2028.5.0. Scripts that only run on current mise versions can add --force now. #15213 (@jdx)

Fixed

  • Running several mise install processes at once could fail with errors like "Python graph installs require an installed interpreter", because one process saw a tool another process was still installing and treated it as complete. Installs and forced reinstalls now mark a version as incomplete before touching its directory. #15196 (@jdx, @theredspoon)
  • When ~/.config/mise is a symlink into a dotfiles checkout that has a config.override.toml, running mise install inside the checkout no longer makes mise.lock alternate between full and empty. #15197 (@jdx, @ponko2)
  • mise reshim, including the reshim at the end of mise install, no longer slows down quadratically with the number of tracked configs. On machines with thousands of tracked projects it could take minutes. #15203 (@jdx, @Birzool)
  • On macOS, signed .app bundles extracted from tarballs made with bsdtar are no longer killed on launch. mise now applies the ._* AppleDouble files to the files they belong to and then deletes them, as macOS tar does. #15211 (@jdx, @jpeeler)
  • A [bootstrap.repos] entry whose ref is an annotated tag now reports current once that tag is checked out. Before, it always reported differs, and every apply checked the tag out again. #15199 (@jdx)
  • Dotfiles: replacing several tracked paths with the directory that contains them no longer leaves the directory stuck as "not applied here" with autosave stopped. #15187 (@jdx, @drewbitt)
  • Dotfiles: mise dot untrack with several paths now checks all of them before changing anything. Before, if a later path wasn't tracked, the command failed but had already stopped tracking the earlier paths. #15208 (@jdx, @drewbitt)

Full Changelog: v2026.10.24...v2026.10.25

💚 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.

Don't miss a new mise release

NewReleases is sending notifications on new releases.