v2026.8.1

jdx/misev2026.8.1Aug 3, 2026by mise-en-dev

AI Summary

Adds experimental remote task caching, `--affected` flag for monorepos, and makes config writing flags interchangeable.

Key Highlights

  • Remote task cache backend supporting authenticated CI caching.
  • Experimental `mise run --affected` for running only affected tasks in monorepos.
  • `--file` and `--path` flags are now interchangeable across config commands.
  • New tools for inspecting and selectively clearing task cache.

New Features

  • Remote task cache
  • Affected tasks flag
  • Config flag interchangeability
  • Cache inspection tools

Full Release Notes

This release rounds out mise's experimental task artifact cache with size/age limits, inspection tooling, and a full local-plus-remote cache backend (including authenticated CI caching), adds experimental `mise run --affected` for monorepos, and lands a batch of config, upgrade, and install fixes.

## Highlights
- The experimental task output cache now supports remote sharing: a composite store reads locally first, promotes remote hits, and mirrors writes, with authenticated requests backed by token files or GitHub Actions OIDC. Cache entries can be inspected, cleared per-task, and bounded by size and age.
- Experimental `mise run --affected` runs only the tasks in monorepo projects touched by your Git changes, using workspace dependency graphs, global task inputs, and provider lockfile attribution to decide what is affected.
- The config-writing flags are now more forgiving: `--file` and `--path` are interchangeable across the commands that write config, so you no longer have to remember which name each subcommand expects.

## Added
- **task:** experimental `mise run --affected` selects and runs only the tasks in projects affected by Git changes, combining the workspace dependency graph, `global_inputs`, and provider lockfile diffs. Base and head revisions can be overridden with `--affected-base`/`--affected-head` or `MISE_AFFECTED_*`. Includes JSON output and an `--explain` breakdown of why each task was selected. ([#11590](https://github.com/jdx/mise/pull/11590), [#11587](https://github.com/jdx/mise/pull/11587), [#11589](https://github.com/jdx/mise/pull/11589), [#11591](https://github.com/jdx/mise/pull/11591), [#11593](https://github.com/jdx/mise/pull/11593) by @jdx)

  ```bash
  mise run --affected test
  mise run --affected --affected-base main test
  ```
- **task:** remote task cache. A composite store layers local and remote backends, reading local first and promoting remote hits, then committing locally before mirroring writes so a remote failure never loses a local hit. Requests are hardened, verified, streamed, and support read/write access modes. ([#11622](https://github.com/jdx/mise/pull/11622), [#11623](https://github.com/jdx/mise/pull/11623), [#11624](https://github.com/jdx/mise/pull/11624), [#11626](https://github.com/jdx/mise/pull/11626), [#11627](https://github.com/jdx/mise/pull/11627) by @jdx)
- **task:** authenticated remote cache. Credentials resolve in fixed precedence: an explicit bearer token, a global-only token file (`MISE_TASK_CACHE_REMOTE_TOKEN_FILE`), then GitHub Actions OIDC when `MISE_TASK_CACHE_REMOTE_OIDC_AUDIENCE` is set. HTTPS is enforced except for loopback development endpoints. ([#11625](https://github.com/jdx/mise/pull/11625), [#11653](https://github.com/jdx/mise/pull/11653) by @jdx)
- **task:** `task.cache_max_size` and `task.cache_max_age` settings cap the task output cache independently of the global prune age, evicting least-recently-accessed entries after writes and rejecting expired entries on restore. ([#11610](https://github.com/jdx/mise/pull/11610) by @jdx)
- **task:** inspect and selectively clear the cache with `mise cache task <task>` (table or `--json`, reporting stored size, restorable bytes, saved time, last access, and outputs) and `mise cache clear --task <task>`, which removes only that task's entries without touching your working-tree outputs. ([#11604](https://github.com/jdx/mise/pull/11604) by @jdx)
- **task:** `mise run --task-cache-explain <task>` prints a structural breakdown of what feeds a task's cache key (input categories, counts, env/var names and presence, platform) without emitting secret-derived hashes, and works under `--dry-run`. Companion changes report cache miss reasons, cache statistics, resolved cache paths, and add JSON explanation output. ([#11595](https://github.com/jdx/mise/pull/11595), [#11597](https://github.com/jdx/mise/pull/11597), [#11599](https://github.com/jdx/mise/pull/11599), [#11600](https://github.com/jdx/mise/pull/11600), [#11601](https://github.com/jdx/mise/pull/11601) by @jdx)
- **task:** cache artifacts are now checksum-verified and cache declarations are audited on load. ([#11605](https://github.com/jdx/mise/pull/11605), [#11617](https://github.com/jdx/mise/pull/11617) by @jdx)
- **config:** `--file` and `--path` are now interchangeable across the commands that write config: `mise use`, `mise set`, `mise unuse`, `mise unset`, `mise config get`, and `mise config set`. ([#11577](https://github.com/jdx/mise/pull/11577), [#11616](https://github.com/jdx/mise/pull/11616), [#11631](https://github.com/jdx/mise/pull/11631), [#11640](https://github.com/jdx/mise/pull/11640) by @JamBalaya56562)

  ```bash
  mise use --file mise.local.toml node@22
  mise set --path mise.local.toml FOO=bar
  ```
- **upgrade:** `mise upgrade --no-prune` keeps the version being replaced instead of uninstalling it, so external references such as virtualenvs built from a mise-managed Python keep working. Also works with `--bump`. ([#11639](https://github.com/jdx/mise/pull/11639) by @JamBalaya56562)
- **env:** on Windows, mise now warns when the generated PATH exceeds the ~8191-character length at which `cmd.exe` silently drops the variable, which otherwise makes every command appear unrecognized. ([#11643](https://github.com/jdx/mise/pull/11643) by @JamBalaya56562)
- **vfox:** Lua plugins gain `strip_components = 1` on `archiver.decompress` plus sorted `file.list`, `file.glob`, and `file.move`, letting plugins flatten versioned archive roots and rename executables portably without shelling out. ([#11652](https://github.com/jdx/mise/pull/11652) by @jdx)

## Fixed
- **config:** tool versions may now contain a colon, so templated versions like `{{ exec(...) | split(pat=': ') | last }}` and selectors resolved from templates no longer fail config loading. ([#11580](https://github.com/jdx/mise/pull/11580) by @JamBalaya56562)
- **config:** config writes no longer pick a target that config loading would ignore, honor ignore filters when a `--path <dir>` is given, and no longer write the global config into a `conf.d` drop-in. ([#11571](https://github.com/jdx/mise/pull/11571), [#11609](https://github.com/jdx/mise/pull/11609), [#11633](https://github.com/jdx/mise/pull/11633) by @JamBalaya56562)
- **upgrade:** `mise upgrade --bump` now applies every eligible tool bump in the same config file instead of letting the last save overwrite earlier ones, and preserves successful bumps when another tool in the file fails to install. ([#11572](https://github.com/jdx/mise/pull/11572) by @Marukome0743)
- **install:** a failed backend install no longer leaves runtime aliases such as `latest` pointing at the removed version; mise rebuilds valid symlinks (or removes dangling ones) after cleanup. ([#11579](https://github.com/jdx/mise/pull/11579) by @Marukome0743)
- **brew:** Linux Homebrew bottles containing shebang executables with binary payloads (such as Watchman's `watchman-diag` zipapp) now relocate correctly with long Linuxbrew prefixes. ([#11632](https://github.com/jdx/mise/pull/11632) by @Marukome0743)
- **pipx:** extras are now applied to git-based installs. ([#11586](https://github.com/jdx/mise/pull/11586) by @jdx)
- **prune:** read-only shared installs are excluded from pruning. ([#11644](https://github.com/jdx/mise/pull/11644) by @Marukome0743)
- **task:** dangling task symlinks are skipped, wildcard task matching respects group boundaries, shared pre/post dependencies are supported, and task-list flags are rejected on subcommands. Task cache writes are serialized and abandoned partial writes are cleaned up. ([#11574](https://github.com/jdx/mise/pull/11574), [#11581](https://github.com/jdx/mise/pull/11581), [#11578](https://github.com/jdx/mise/pull/11578) by @Marukome0743; [#11638](https://github.com/jdx/mise/pull/11638), [#11606](https://github.com/jdx/mise/pull/11606), [#11608](https://github.com/jdx/mise/pull/11608) by @jdx)
- **schema:** JSON schemas are now published alongside the documentation. ([#11596](https://github.com/jdx/mise/pull/11596) by @jdx)

## Documentation
- Recommend installing official release binaries, clarify Node dependency behavior for npm-backed tools, offer shims as a workaround for the Windows PATH length limit, and fix a dead tool-stub example URL and an npmmirror `node.mirror_url` example. ([#11615](https://github.com/jdx/mise/pull/11615), [#11637](https://github.com/jdx/mise/pull/11637) by @jdx; [#11642](https://github.com/jdx/mise/pull/11642) by @JamBalaya56562; [#11377](https://github.com/jdx/mise/pull/11377), [#11460](https://github.com/jdx/mise/pull/11460) by @Bartok9)
- Document the remote cache protocol and its trust requirements. ([#11621](https://github.com/jdx/mise/pull/11621), [#11628](https://github.com/jdx/mise/pull/11628) by @jdx)

**Full Changelog**: https://github.com/jdx/mise/compare/v2026.8.0...v2026.8.1

## 💚 Sponsor mise

mise is maintained by [@jdx](https://github.com/jdx), an open source developer for [**entire.io**](https://entire.io), the title sponsor of the [jdx.dev](https://jdx.dev) open source tools. Development is funded by sponsors.

If mise saves you or your team time, please consider sponsoring at [jdx.dev](https://jdx.dev/sponsors.html). Individual and company sponsorships keep mise fast, free, and independent.