github jdx/mise v2026.11.6
v2026.11.6: Pick several tasks with mise run --multi, and use unprefixed bootstrap packages

one hour ago

mise run --multi lets you pick several tasks from a checklist. [bootstrap.packages] keys without a manager: prefix now install through one available package manager, and the npm backend can install from an HTTPS tarball URL. Custom daemons can name several ports, and launchd agents can set resource limits. This release also changes the default prompt theme to base16 and fixes problems with tasks, mise env --dotenv, and installs.

Added

  • mise run --multi. Opens the task picker as a checklist. Press Space to check a task, / to filter, and Enter to run the checked tasks. They run as if you had joined them with :::, so they run in parallel unless one depends on another, and -j and the other mise run options still apply. Add --all to list tasks from every project in a monorepo. --multi needs an interactive terminal and can't be combined with a task name, --affected or --tag. #15503 (@jdx)

    mise run --multi
    mise run --multi --all
  • Unprefixed [bootstrap.packages] keys. A key without a manager: prefix now installs through exactly one manager, so the same config works across distributions and operating systems. mise uses the first manager that is available and allowed by system_packages.managers. The default order is apt, dnf, pacman, zypper, apk, brew, winget, scoop, choco. #15506 (@jdx, @thernstig)

    • The new system_packages.prefer setting (MISE_SYSTEM_PACKAGES_PREFER) replaces that order, and only the managers it lists are considered.
    • Use the new names option when a package has a different name under some managers.
    • mise picks the manager only by which managers are available, not by what their repositories contain. If the install fails, mise reports an error and does not try another manager.
    • If no manager can install a key, mise warns and skips it. mise bootstrap packages status lists it as skipped.
    • Prefixed keys such as "apt:git" work as before.
    [bootstrap.packages]
    git = "latest"
    openssl = { names = { apt = "libssl-dev", dnf = "openssl-devel" } }
  • npm tools from HTTPS tarball URLs. The npm backend can now install a package from a tarball URL, such as a pkg.pr.new preview build. Use npm: followed by the full URL as the tool name, for example mise use 'npm:<tarball URL>'. The version is a prefix of the tarball's SHA-256, so latest means whatever the URL serves now, and mise up updates the tool when that content changes. #15461 (@jdx, @kjanat)

    • Only HTTPS URLs work, and the checksum option isn't supported.
    • If the tarball depends on other URL packages, list them in allow_exotic_deps.
    • mise.lock records the version but not a dependency graph.
  • Named ports on custom daemons. run and task daemons can now declare several ports in a ports table, as presets and containers already can. Before, mise passed these entries to pitchfork, which ignored them. Each port is exported as <DAEMON>_<NAME>_PORT. A fixed number is used as written. An auto port needs its own base, and each linked worktree gets a different port. Named ports are checked for collisions with other ports. #15504 (@jdx, @ponko2)

    [daemons.stack]
    run = "docker compose up"
    ports.app = { auto = true, base = 8080 }
    ports.db = { auto = true, base = 5432 }
    ports.admin = 9000
  • Resource limits for launchd agents. [bootstrap.macos.launchd.agents] entries accept soft_resource_limits and hard_resource_limits. You can now raise launchd's default limit of 256 open files without wrapping the program in a ulimit shell command. The keys are launchd's nine limits in snake case, such as number_of_files and number_of_processes. An empty table, or a soft limit above the hard limit, is an error. Based on @disintegrator's implementation. #15509 (@jdx)

    [bootstrap.macos.launchd.agents.proxy]
    program = "~/.local/bin/proxy"
    soft_resource_limits = { number_of_files = 10240 }
    hard_resource_limits = { number_of_files = 65536 }
  • history.lock_wait. Sets how long mise dot commands that change history wait when another history operation is running. Set it in config or with MISE_HISTORY_LOCK_WAIT. The default is 30s, 0 fails immediately, and any value above 1h is treated as 1h. mise dot watch and mise dot recover never wait. #15498 (@jdx, @zachbornheimer)

  • Progress in mise upgrade. After installing, mise upgrade checks every tracked config before removing old versions. This step now shows a checking tracked configs progress line, so the command no longer looks stuck. The check is also faster with many tracked configs: with about 930 configs, the same check in mise prune --dry-run dropped from about 12s to 2-4s. #15489, #15512 (@jdx)

Changed

  • Default prompt theme is now base16. Interactive prompts, such as the mise run task picker, were hard to read on light terminals that don't set COLORFGBG. The base16 theme now uses the terminal's named colors, and unselected options and help text use the terminal's normal text color. On dark terminals, prompts now look different by default. To keep the previous look, set color_theme = "charm" or color_theme = "auto". #15494, #15524 (@jdx, @AdrianDC)

Fixed

  • Broken TOML task usage. A TOML task whose usage couldn't be loaded, such as a missing include file or a spec that didn't parse, used to break mise tasks --usage, mise generate task-docs and completion for every task. Now mise warns about that task and the others keep working. A broken task that doesn't use its spec, such as one with raw_args = true, still runs. mise tasks validate still reports the error. #15465 (@jdx)
  • MISE_ORIGINAL_CWD with --cd. Tasks run with -C/--cd or MISE_CD now get the directory where mise was started, not the --cd target. #15464 (@jdx)
  • Faster task freshness checks. Checking whether a task is up to date no longer reads directories that can't contain its sources or outputs. For example, sources = ["packages/*/src/**/*"] no longer reads every packages/*/node_modules, and mise skips directories excluded by !**/node_modules/**. Tasks still select the same files. #15499 (@jdx, @2chanhaeng)
  • mise env --dotenv output can be read back. Values are now quoted and escaped when needed, so values with #, newlines, quotes or $ stay the same when the file is loaded with _.file. Simple values stay unquoted. Tools that don't handle quotes, such as Docker --env-file, read the quotes as part of the value. #15490 (@jdx)
  • Undefined {{ env.X }} errors. When a template referred to an undefined env field, the error listed the name of every environment variable, including secret names such as *_TOKEN. In an activated shell, mise printed this list at every prompt. The error now names only the missing field and suggests get_env(name=..., default=""). #15510 (@jdx)
  • Nushell completion with activation. With mise activate nu, pressing Tab after mise now completes mise subcommands and arguments instead of file paths. On Nushell versions before 0.116, flags still need ^mise and the script from mise completion nu --install. #15505 (@jdx, @Deano217)
  • Command wrappers during installs. The cargo, npm, pipx and aube backends now run their install commands without command wrappers on PATH. For example, cargo install no longer fails when cargo is wrapped by mbx. mise exec, mise run and ordinary commands still use wrappers. #15495 (@jdx)
  • cargo: tools with minimum_release_age. With an explicit minimum_release_age and "core:rust" = "stable", cargo: tools failed to install because mise looked for rust@stable instead of the dated Rust version it had installed. #15460 (@jdx)
  • Date-only release ages for Rust beta and nightly. A date-only minimum_release_age, such as 2026-11-09, now includes rust@beta and rust@nightly builds from that day instead of falling back to the day before. #15486 (@jdx)
  • packslip: releases in monorepos. In repositories that publish releases for several components, packslip: couldn't find releases listed after another component's releases. A pinned version is now looked up by its tag, and latest searches more of the release history. #15501 (@jdx, @pepicrft)
  • Faster GitHub fallback on 5xx errors. When a GitHub release download URL returns a 5xx error, mise now retries the check once, then switches to the API asset URL. Before, it used up all http_retries first, which could take minutes per file. #15485 (@jdx, @csechuan)
  • Long cache keys in the http: backend. Installs could fail with File name too long, for example Yarn 2+ from a packageManager with a Corepack checksum. Temporary directory names now stay under the filesystem's name length limit. #15493 (@jdx)
  • Cleanup after failed installs. Installing a GitHub repo that isn't an asdf or vfox plugin no longer leaves its clone in the plugins directory. The error now suggests the github: backend. A failed install also removes its cache directory. #15511 (@jdx, @gigaimage)
  • Homebrew tap casks with zap :not_required. Previewing or installing these casks failed with an ArgumentError. #15491 (@jdx, @cdenihan)

Full Changelog: v2026.11.5...v2026.11.6

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