v2026.4.16

jdx/misev2026.4.16Apr 17, 2026by mise-en-dev

AI Summary

Adds Tera template support in inline tasks, introduces a `raw_args` option for proxy tasks, and fixes runtime symlink paths for fuzzy versions.

Key Highlights

  • Tera templates can now be used in inline run task `args` and `env`.
  • New `raw_args` option lets proxy tasks forward all flags without interception.
  • Runtime symlink paths for fuzzy versions now use the requested-version symlink.
  • TOML task metadata now merges into file tasks instead of being dropped.

New Features

  • Tera template support for inline tasks
  • `raw_args` task option
  • `.perl-version` support for perl
  • New registry tools: ibmcloud, rush

Full Release Notes

A feature-rich release with two new task runner capabilities, an important fix for how mise exposes tool paths in the environment, and a batch of task system improvements.

Inline table run tasks (`run = [{ task = "...", args = [...] }]`) now support Tera templates, so you can pass parsed usage arguments into sub-task calls. A new `raw_args` option lets proxy tasks forward all flags -- including `--help` -- directly to the underlying command without mise intercepting them. On the tooling side, fuzzy version requests like `python = "3.14"` now put the stable runtime symlink on PATH instead of the resolved patch directory, so virtualenvs and other tools that cache interpreter paths survive patch upgrades.

## Highlights

- **Tera templates in inline run tasks** -- `args` and `env` in table-style `run` entries can now use `{{usage.*}}` variables, connecting usage-parsed arguments to sub-task invocations.
- **`raw_args` for proxy tasks** -- Tasks that wrap tools with their own CLI (Django `manage.py`, Next.js, argparse scripts) can set `raw_args = true` so mise never intercepts `--help` or rewrites flags.
- **Runtime symlink paths for fuzzy versions** -- PATH entries now use the requested-version symlink (e.g. `.../installs/python/3.14/bin`) rather than the concrete patch directory, so downstream tools that cache paths are not broken by patch upgrades.
- **TOML task metadata merges into file tasks** -- A `[tasks.my-script]` block in `mise.toml` now overlays env, description, dir, and other metadata onto a same-named file task instead of being silently dropped.

## Added

- **Tera template support for inline table run tasks** -- `args` and `env` values in `run = [{ task = "greet", args = ["{{usage.name}}"] }]` are now rendered through the Tera engine, allowing usage-parsed arguments and environment variables to flow into sub-task calls. [#9079](https://github.com/jdx/mise/pull/9079) by @iamkroot

- **`raw_args` task option** -- Set `raw_args = true` on a task definition (TOML or file header) to skip mise's argument parsing entirely. All arguments, including `--help` and `-h`, are forwarded verbatim to the underlying command. Additionally, `mise run task -- --help` now bypasses the usage parser even without `raw_args`, restoring the documented escape hatch. [#9118](https://github.com/jdx/mise/pull/9118) by @jdx

  ```toml
  [tasks.manage]
  raw_args = true
  run = 'python manage.py'
  ```
  ```sh
  mise run manage --help            # forwarded to manage.py
  mise run manage migrate --fake    # all flags reach manage.py unchanged
  ```

- **`.perl-version` support for perl** -- The perl registry entry now recognizes `.perl-version` files for both auto-detection and idiomatic version file reading (when `idiomatic_version_file_enable_tools` includes `"perl"`), matching the pattern used by plenv. [#9102](https://github.com/jdx/mise/pull/9102) by @ergofriend

- **Registry: ibmcloud** -- IBM Cloud CLI is now available via `mise use ibmcloud`. [#9139](https://github.com/jdx/mise/pull/9139) by @dnwe

- **Registry: rush** -- [rush](https://github.com/shenwei356/rush), a cross-platform tool for executing jobs in parallel (similar to GNU parallel), is now available via `mise use rush`. [#9146](https://github.com/jdx/mise/pull/9146) by @jdx

## Fixed

- **Runtime symlink paths for fuzzy versions** -- When a fuzzy version like `python = "3.14"` resolved to `3.14.4`, PATH used the concrete install directory (`.../installs/python/3.14.4/bin`). Now mise uses the stable requested-version symlink (`.../installs/python/3.14/bin`), so tools that cache interpreter paths (e.g. virtualenvs) survive patch upgrades without breaking. [#9143](https://github.com/jdx/mise/pull/9143) by @jdx

- **Go subpath packages reinstalling on every upgrade** -- A stale workaround in the Go backend overrode the version to "latest" for subpath packages, causing `mise up` to reinstall them every time because the resolved version directory didn't match. This workaround has been removed now that proxy-based resolution handles subpath packages correctly. [#9135](https://github.com/jdx/mise/pull/9135) by @c22

- **Missing task suggestions** -- `mise run <missing-task>` now suggests similar task names and shows a compact table of available tasks (up to 20), making it easier to find the right name. [#9141](https://github.com/jdx/mise/pull/9141) by @jdx

- **Task prefix colors no longer use red/yellow** -- Red and yellow were removed from the task prefix color palette because they could be confused with errors and warnings. The palette now uses 16 styles: 4 base colors (blue, magenta, cyan, green) combined with 4 modifiers (regular, bold, dim, bright). [#8782](https://github.com/jdx/mise/pull/8782) by @lechuckcaptain

- **TOML task block merged into same-named file task** -- A `[tasks.my-script]` block in `mise.toml` was silently discarded when a file task with the same name existed. Now the TOML block overlays env, description, dir, aliases, depends, and other metadata onto the file task. Additionally, `mise tasks ls --json` now reports the resolved task directory instead of null. [#9147](https://github.com/jdx/mise/pull/9147) by @jdx

- **npm `install_before` respected for dist-tag resolution** -- `mise latest` and similar commands that resolve npm dist-tags now honor the `install_before` date filter instead of always returning the absolute latest version. [#9145](https://github.com/jdx/mise/pull/9145) by @webkaz

- **GitHub attestation verification uses full token chain** -- Attestation verification was only using the `GITHUB_TOKEN` environment variable, ignoring tokens configured via `credential_command`, `github_tokens.toml`, the `gh` CLI, or `git credential fill`. This caused unauthenticated rate-limit hits even when a valid token was configured. [#9154](https://github.com/jdx/mise/pull/9154) by @jdx

- **Tool option serialization round-trips correctly** -- Comma-containing string values in tool options (e.g. `[tool_options]`) no longer get split into fake extra keys during re-serialization, and empty brackets are no longer emitted when all remaining options are filtered out. [#9124](https://github.com/jdx/mise/pull/9124) by @atharvasingh7007

- **vfox backend falls back to absolute bin path** -- When a vfox plugin does not set `env_keys`, mise now falls back to the absolute bin path instead of failing. [#9151](https://github.com/jdx/mise/pull/9151) by @80avin

- **`mise self-update` available in stub builds** -- When compiled without the `self_update` Cargo feature, the subcommand was completely missing from the CLI. It now shows a stub message explaining the feature is unavailable. [#9144](https://github.com/jdx/mise/pull/9144) by @salim-b

## New Contributors

* @80avin made their first contribution in [#9151](https://github.com/jdx/mise/pull/9151)
* @atharvasingh7007 made their first contribution in [#9124](https://github.com/jdx/mise/pull/9124)
* @lechuckcaptain made their first contribution in [#8782](https://github.com/jdx/mise/pull/8782)
* @ergofriend made their first contribution in [#9102](https://github.com/jdx/mise/pull/9102)
* @dnwe made their first contribution in [#9139](https://github.com/jdx/mise/pull/9139)

**Full Changelog**: https://github.com/jdx/mise/compare/v2026.4.15...v2026.4.16