v2026.7.17

takahirom/arbigentv2026.7.17Jul 30, 2026by mise-en-dev

AI Summary

Introduces Node workspace task inference, root task defaults, and per-tool control over idiomatic version files, alongside fixes for shell activation, hook-env, and Homebrew casks.

Key Highlights

  • Node scripts are imported as first-class tasks with dependency graphs.
  • Experimental root task defaults and `^task` upstream dependencies.
  • Optional task dependencies that run when present and skip when absent.

New Features

  • Node workspace task inference and project dependency edges.
  • Root task defaults shared by task name across the workspace.
  • Experimental `^task` upstream dependency syntax.
  • Optional task dependencies for `depends` and `wait_for`.
  • Per-tool idiomatic version file control (e.g., disable `.nvmrc`).
  • Improved dotfiles workflow with capture and apply options.

Full Release Notes

This release builds out mise's experimental monorepo task story: Node workspaces now infer project dependency graphs, import package scripts as first-class tasks, and can share configuration through root task defaults and upstream (`^task`) dependencies. It also adds per-tool control over idiomatic version files, a smoother dotfiles workflow, and a batch of fixes across shell activation, hook-env, Homebrew casks, Aqua, and Python uv environments.

## Highlights
- Node monorepo workspaces gain end-to-end task support: inferred project dependency edges, imported `package.json` scripts as `node:<package>#<script>` tasks, root task defaults shared by task name, and experimental `^task` upstream dependencies for "build upstream projects first" ordering.
- New `optional = true` task dependencies run when they match and are silently skipped when they don't, and idiomatic version files can now be disabled per tool so `.nvmrc` and `package.json` no longer fight over your Node version.
- A round of environment and shell fixes stops hook-env from reloading every prompt after unrelated file writes, keeps the fish `cd` hook working during compound commands, and fixes zsh activation under `POSIX_IDENTIFIERS`.

## Added
- **task:** Node workspace packages now expose their `package.json` scripts as mise tasks without needing a `mise.toml` in every package. Scripts get stable IDs like `node:@scope/app#build` plus monorepo path aliases such as `//packages/app:build`, run in their package root through the detected package manager (npm/pnpm/Yarn/Bun) with raw argument passthrough, and explicit tasks take precedence while keeping both names linked. ([#11466](https://github.com/jdx/mise/pull/11466) by @jdx)
- **task:** Node workspaces now infer project dependency edges by matching declared internal package names (`dependencies`, `devDependencies`, `optionalDependencies`, `peerDependencies`) to other discovered packages, surfaced through `mise tasks graph`. This is the graph that powers dependency-aware ordering. ([#11435](https://github.com/jdx/mise/pull/11435) by @jdx)
- **task:** experimental root task defaults via `[monorepo.task_defaults.<name>]` in the root `mise.toml`, applied by task name to both inferred and explicit workspace tasks. Task-local config and `extends` templates still win. ([#11473](https://github.com/jdx/mise/pull/11473) by @jdx)

  ```toml
  [monorepo.task_defaults.build]
  sources = ["src/**", "package.json"]
  outputs = ["dist/**"]
  cache = { enabled = true }

  [monorepo.task_defaults.test]
  env = { NODE_ENV = "test" }
  ```
- **task:** experimental `^task` upstream dependency syntax so a task can require the same task in every upstream workspace project before it runs, expanding through the project graph (including transitive upstreams) and skipping projects that lack the task. Supported in `depends` only. ([#11476](https://github.com/jdx/mise/pull/11476) by @jdx)

  ```toml
  [monorepo.task_defaults.build]
  depends = ["^build"]
  ```
- **task:** optional dependencies via `optional = true` on structured task dependencies. Optional deps run all matches when present and are silently omitted when nothing matches, while invalid selectors still error. Works across `depends`, `depends_post`, and `wait_for`. ([#11471](https://github.com/jdx/mise/pull/11471) by @jdx)
- **config:** `idiomatic_version_file_disable_files` lets you disable individual idiomatic version files per tool using `tool:filename` pairs, so you can keep `.nvmrc` selecting Node while ignoring `package.json` `devEngines`, with pnpm still reading `package.json`. ([#11470](https://github.com/jdx/mise/pull/11470) by @jdx)

  ```sh
  mise settings add idiomatic_version_file_disable_files node:package.json
  ```
- **dotfiles:** `mise bootstrap dotfiles add` now applies captured entries by default (use `--no-apply` for capture-only workflows), moves real paths into the dotfiles source before linking, normalizes and sorts `[dotfiles]` entries, and reports config writes and concrete apply actions, with rollback on failure. ([#11451](https://github.com/jdx/mise/pull/11451) by @jdx)

## Fixed
- **hook-env:** creating an unrelated file in a config-search ancestor directory no longer forces `env._.source` and full config reloads to re-run on every prompt indefinitely. Forced fast-path runs now always refresh the session. ([#11458](https://github.com/jdx/mise/pull/11458) by @Marukome0743)
- **activate:** the fish directory-change hook now stays active while commands run, so each `cd` in a compound command applies the matching mise environment immediately, matching Bash and Zsh behavior. ([#11478](https://github.com/jdx/mise/pull/11478) by @Marukome0743)
- **activate:** zsh activation now works with `POSIX_IDENTIFIERS` enabled; `MISE_*` changes are captured correctly instead of hitting a `bad math expression` error. ([#11467](https://github.com/jdx/mise/pull/11467) by @jdx)
- **brew:** Homebrew casks using the new `command_wrapper` artifacts and structured `run` lifecycle steps (for example Firefox and OrbStack) now install and reconcile correctly instead of failing on unknown metadata. ([#11472](https://github.com/jdx/mise/pull/11472) by @jdx)
- **aqua:** version overrides now match their `version_prefix` family before evaluating constraints, so packages with multiple tag families (like oxlint's `oxlint_v` and `apps_v`) resolve to the right override. Locked installs also parse the release tag from the download URL so prefix-scoped overrides apply. ([#11469](https://github.com/jdx/mise/pull/11469), [#11482](https://github.com/jdx/mise/pull/11482) by @jdx)
- **python:** uv auto-venv now respects `UV_PROJECT_ENVIRONMENT` when selecting, creating, and activating the virtual environment (resolving relative paths from the workspace root), and folds the resolved path into env cache keys so alternate venv locations are honored. ([#11475](https://github.com/jdx/mise/pull/11475) by @Marukome0743)
- **lockfile:** shim resolution with explicit unified monorepo lockfiles (`[monorepo] lockfile = true`) no longer rescans every configured monorepo root per tool, removing repeated filesystem traversal on the hot path. ([#11468](https://github.com/jdx/mise/pull/11468) by @jdx)
- **config:** alias and bootstrap writers, aliased tool keys, and version arrays now preserve surrounding comments when rewriting `mise.toml`. ([#11453](https://github.com/jdx/mise/pull/11453), [#11474](https://github.com/jdx/mise/pull/11474), [#11454](https://github.com/jdx/mise/pull/11454) by @JamBalaya56562)
- **self-update:** when self-update is disabled and no packager instructions file exists (as on Homebrew and Arch installs), mise now shows a generic upgrade hint instead of reporting an out-of-date version with no follow-up advice. ([#11449](https://github.com/jdx/mise/pull/11449) by @JamBalaya56562)
- **task:** source metadata hashes now include mtime, improving change detection for task sources. ([#11455](https://github.com/jdx/mise/pull/11455) by @JamBalaya56562)

## Documentation
- Updated the stephane-robert guide URL and external post dates. ([#11252](https://github.com/jdx/mise/pull/11252) by @Bartok9)

**Full Changelog**: https://github.com/jdx/mise/compare/v2026.7.16...v2026.7.17

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