Skip to content

chore(deps): update dependency jdx/mise to v2026 - #220

Open
renovate[bot] wants to merge 1 commit into
scipfrom
renovate/jdx-mise-2026.x
Open

renovate[bot] wants to merge 1 commit into
scipfrom
renovate/jdx-mise-2026.x

Conversation

@renovate

@renovate renovate Bot commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Type Update New value References Sourcegraph
jdx/mise uses-with major 2026.9.11 source code search for "jdx/mise"

Test plan: CI should pass with updated dependencies. No review required: this is an automated dependency update PR.


Release Notes

jdx/mise (jdx/mise)

v2026.9.11: : macos-app bootstrap packages, task template inheritance for flags and file tasks, and Swift on Linux fixes

Compare Source

A new macos-app bootstrap manager installs .app bundles from a pinned URL and checksum when no Homebrew cask exists, task templates now compose usage flags and can be extended from file tasks, and Swift on Linux picks its distro build from swift.org's release index instead of a hard-coded map that 404'd on arm64 and on newer Fedora, Amazon Linux, and Arch hosts. Install failures also become far more actionable: errors name the minimum_release_age cutoff that hid every version, the child's last stderr line, or the shared libraries a Swift toolchain cannot load.

Highlights

  • Apps without a cask: "macos-app:<name>" entries in [bootstrap.packages] download, checksum-verify, and install a .app into /Applications using mise's existing cask pipeline, with stricter ownership rules for apps already at the target.
  • Task templates that actually share things: a task that extends a template now inherits the template's usage flags alongside its own, file tasks can write #MISE extends="...", and a template's vars can read the values the extending task supplies.
  • Swift on Linux: arm64 downloads resolve on every distro, the build is chosen from what a release actually publishes (with a warning when a fallback is used), and a fallback that cannot start names the missing libraries instead of exiting 127 after a 1 GB download.

Added

  • bootstrap: The macos-app package manager installs a macOS .app bundle from a vendor or internal download. version, url, sha256, and artifact are all required ("latest" is rejected because mise cannot discover releases behind a plain URL); {{version}} is interpolated into url, so a release bump is a two-field edit. Only .dmg and .zip archives containing an app bundle are supported, state is kept in mise's state directory rather than Homebrew's Caskroom, and an app already at the destination that this entry does not own is refused unless adopt = true and the contents match. mise bootstrap packages upgrade cannot discover new versions for these entries, and prune --manager macos-app is unsupported. Prefer brew-cask wherever a cask exists. (#​13279)

    [bootstrap.packages."macos-app:example"]
    version = "1.2.3"
    url = "<HTTPS URL of the .dmg or .zip; {{version}} is interpolated>"
    sha256 = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
    artifact = "Example.app"
  • tasks: A task that names a template with extends and declares its own usage now gets the template's flags too, listed first in --help. Previously the task's spec replaced the template's entirely, so shared flags had to be copied into every task. Workspace-root task defaults still only fill in usage when the task has none. A flag declared in both places is listed twice; declare each flag in one place, or use usage flagsets for replacements. (#​13310)

    [task_templates.deploy]
    usage = 'flag "--env <env>" help="Target environment"'
    
    [tasks.deploy-api]
    extends = "deploy"
    usage = 'flag "--replicas <n>" help="How many to run"'
    run = 'echo "env=$usage_env replicas=$usage_replicas"'
  • tasks: File tasks (including remote HTTP and git:: scripts) can use #MISE extends="<template>" in their header to inherit tools, env, description, aliases, and other fields from a task template; previously the field was warned about and ignored. A task whose command is a script file no longer picks up a template's run. (#​13307)

  • swift: When a Linux install fails its swift --version check, mise runs ldd over the toolchain and lists every unresolved shared library (for example libform.so.6, libncurses.so.6, libpanel.so.6 on an Arch-family host running a ubi9 build), with the tool's install_env applied so an LD_LIBRARY_PATH remedy is not misreported. docs/lang/swift.md documents the workaround. (#​13319)

Fixed

  • swift: Installing Swift on arm64 failed with a 404 on every Linux distro except Ubuntu (and on Windows arm64 lock entries) because only Ubuntu used swift.org's <platform>-<arch> download directory. (#​13293, fixes #​13291)
  • swift: The Linux distro build is now chosen from swift.org's release index rather than a hard-coded map: the host's exact distro version wins, then the newest published build older than the host, then the family's oldest, with ID_LIKE consulted (Linux Mint gets an Ubuntu build) and unknown distros such as Arch falling back to ubi9. Every compromise is announced with a warning, musl hosts and unsupported architectures fail before downloading, and swift.platform still overrides selection without contacting swift.org. The swift_platform lockfile option now records the host as detected (e.g. fedora40 instead of fedora39); mismatched entries are re-resolved on the next lock. (#​13297, fixes #​13289)
  • config: install_env values are now rendered as templates like other tool options, so LD_LIBRARY_PATH = "{{env.HOME}}/.local/lib/compat" reaches the install subprocess expanded rather than literally. {{version}} is left unchanged. (#​13314)
  • install: When minimum_release_age (default 24h) hides every candidate, the error names the setting and cutoff, how many releases it hid, the newest one with its release and eligibility dates, and a copy-pasteable exact pin to install it now, instead of no versions found ... matching date filter. A query that matched nothing is no longer blamed on the filter. (#​13308)
  • cmd: A failing command run by mise (installs, tasks, plugin scripts) now appends the child's last non-empty stderr line to the error, e.g. exit code 127; last stderr: swift: error while loading shared libraries: libncurses.so.6 .... This also reaches the final error block under --quiet, where stderr was previously never shown. (#​13315)
  • tasks: A broken usage spec now reports the task name and the parser's diagnostic (invalid usage spec for task 'deploy' followed by the reason) instead of a bare Invalid usage config; file tasks render the same diagnostic rather than a Debug dump, and a missing or unreadable script is reported as such rather than as a bad spec. (#​13312)
  • tasks: A task template's vars can now read the vars the extending task supplies, so {{ vars.opt | default(value='none') }} in a template sees the task's opt instead of always taking the default. Literal vars within a single task are also bound first, so vars = { msg = "hi {{ vars.who }}", who = "world" } works regardless of declaration order. Config-level [vars] are unchanged. (#​13322)
  • runtime symlinks: latest and version-prefix links under installs/<tool>/ that point at an install no longer eligible for a link (for example a directory left with an incomplete marker by an interrupted install) are now removed on rebuild instead of surviving indefinitely. Configured aliases, hand-made names, and absolute symlinks are left alone. (#​13288)
  • npm: Semver pre-releases with numeric suffixes such as 1.3.1-3 no longer claim the latest, 1, and 1.3 runtime symlinks or satisfy "latest"/prefix requests over the newest stable install; links an older mise already wrote are cleaned up on the next install. An exact request or the prerelease option still selects them. (#​13272 by @​pataar)
  • lockfile: mise lock --global on a mise.lock symlinked into a dotfiles repository now keeps native dependency sidecars beside the target lockfile, so mise install --locked works from a fresh checkout. If you used this layout on 2026.9.7 through 2026.9.10 and see missing sidecars, run mise lock --global again to repair the pointers. (#​13268 by @​nettlesh)
  • lockfile: With lockfile_mode = "generate", mise unuse now removes the tool's entry from mise.lock and its .mise/locks/... sidecar immediately rather than leaving them until the next mise install or mise lock. Merge mode is unchanged. (#​13304)
  • conda: Commands from conda: packages that have nothing to activate (no activate.d scripts, no dependency executables, no script entry points) are now plain symlinks instead of shell launchers, so tools like conda:ripgrep or conda:gh no longer prepend the conda prefix to the PATH of every child process and skip the extra shell. Packages that need activation keep their launcher; Windows is unchanged. A relative MISE_DATA_DIR is also handled. Existing installs keep their current entries until reinstalled with mise install --force conda:<pkg>. (#​13305)
  • backends: A tool's postinstall hook now receives pre-tools [env] from the config on every backend (http, aqua, github, cargo, npm, core tools), not only for asdf plugins, and a hook that changes an env input is visible to hooks ordered after it. (#​13316)
  • github: Tools whose release tags repeat the configured version_prefix (tag a-a-1.2.3 with version_prefix = "a-", listed as a-1.2.3) can now be installed; prefix + version is tried first so every listed version round-trips to its tag. If a repo publishes both a-1.2.3 and a-a-1.2.3, requesting a-1.2.3 now resolves to the doubled tag. (#​13317)

Changed

  • brew-cask: Cask archives are downloaded concurrently at the configured jobs concurrency before the serial install pass, so --jobs/MISE_JOBS now speed up cask-heavy runs. Placement (mounting, swapping app bundles) remains serial. (#​13282 by @​waynehoover)

Security

  • http: Artifact downloads now refuse a redirect that steps down from HTTPS to HTTP, matching the policy the remote-version client already applied; the error names which kind of request was refused. URLs that are plain HTTP to begin with are unaffected. (#​13292)
  • brew-cask: The fingerprint used to adopt or refuse an existing app bundle is now computed entirely through the verified directory descriptor (fstatat/openat/readlinkat), so a path component swapped mid-check cannot make mise compare against a different tree than the one it will replace. Digests are unchanged, so existing receipts remain valid; large files are now hashed in-process, which can make adoption checks slower. (#​13294)

Documentation

  • The bootstrap packages guide is reorganized around choosing a manager, declaring packages, and the command reference, with a dedicated section for direct macos-app downloads and app ownership. (#​13298)
  • The variables guide explains when [vars] resolve and why a task-local override does not recompute a top-level var that already referenced it, with task templates as the way to defer a fragment. (#​13323)
  • Task Arguments documents sharing flags between tasks with usage flagset, use, and include, in both TOML and file tasks. (#​13313)

New Contributors

Full Changelog: jdx/mise@v2026.9.10...v2026.9.11

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

v2026.9.10: : shims.exclude, npm allow_exotic_deps, bulk dotfiles conflict resolution, and Windows Ctrl-C handling for tasks

Compare Source

New settings let mise manage a tool without claiming its command names (shims.exclude) and approve non-registry npm dependencies (allow_exotic_deps), mise dot pull can decide every sharing conflict at once, and vfox plugin hooks gain cmd.stream plus a working cmd.exec timeout. On the fix side, mise run now survives Ctrl-C on Windows instead of orphaning cmd.exe, fish shells launched through shims start much faster with correct PATH order, and several task-resolution, lockfile, and Homebrew cask bugs are corrected.

Highlights
  • Control over what mise puts on PATH and what it installs: settings.shims.exclude keeps names like python resolving to the OS while mise still manages the tool; allow_exotic_deps approves specific npm packages fetched from git or tarball URLs; exact packslip: pins install during a minimum_release_age cooling window; and mise upgrade --bump keeps SemVer build metadata such as +k3s1.
  • Dotfiles sharing on a second machine: mise dot pull --take-remote-all / --keep-local-all resolve all conflicts in one command, paths that cannot be decided are held rather than aborting the pass, and a directory sitting where a tracked file belongs is now reported as exactly that.
  • Task and shell reliability: Windows Ctrl-C shuts tasks down cleanly, a task's own name always beats another task's alias, glob expansions no longer drop file tasks, Bash completion of ns:task names no longer duplicates the prefix, and fish startup through mise exec/shims is no longer quadratic in the number of tools.
Added
  • shims: settings.shims.exclude (env MISE_SHIMS_EXCLUDE) lists command names mise never creates shims for. The tool stays installed and version-qualified names like python3.12 still resolve through mise, but the excluded name resolves to whatever else is on PATH; existing shims for those names are removed on the next mise reshim. Note that under mise activate without --shims the tool's bin directory still joins PATH, and excluding python3 means python3 -m venv silently uses the system interpreter. (#​13266)

    [settings.shims]
    exclude = ["python", "python3", "pip", "pip3"]
  • npm: allow_exotic_deps approves dependencies that aube's blockExoticSubdeps gate would otherwise block because they come from a git, file:, or direct tarball URL. List package names to exempt only those (the gate stays on for the rest of the graph), or set true to exempt the whole graph. Applies to the aube and aube_cli installers. Embedded-aube installs now also warn when install_env is set, since it never reached the in-process installer. (#​13231)

    [tools]
    "npm:@gmickel/gno" = { version = "2.3.0", allow_exotic_deps = ["xlsx"] }
  • dotfiles: mise dot pull --take-remote-all and --keep-local-all decide every pending conflict at once, with per-path --take-remote/--keep-local naming exceptions. The two blanket flags are mutually exclusive, and paused-sync and adoption messages now point at them. (#​13233)

    mise dot pull --take-remote-all --keep-local ~/.bashrc
  • bootstrap: Every string value in [bootstrap.linux.systemd.units] and [bootstrap.macos.launchd.agents] is rendered as a template before the unit file or plist is written, so {{ config_root }}/.env in environment_file resolves to the declaring config's directory. Values without template syntax (including %h and $HOME) pass through untouched, exec() is rejected, and a unit whose template fails is skipped by name without blocking the others. [bootstrap.services] is not yet templated. (#​13227)

  • hooks: Each MISE_INSTALLED_TOOLS entry passed to postinstall hooks now carries requested_version (for example latest, 22, or an alias) alongside the resolved version, so a hook can tell a floating request from a pin. The field is always present; existing hooks reading name/version are unaffected. (#​13274)

  • vfox plugins: cmd.stream runs a command with stdin connected and stdout/stderr streamed to the terminal, for hooks that genuinely need input such as a login or license prompt; it pauses the progress renderer and holds the terminal exclusively while it runs. cmd.exec and os.execute now detach stdin unless --raw is set, matching every other subprocess mise spawns, so a plugin that read stdin through os.execute should switch to cmd.stream. (#​13261)

  • vfox plugins: The timeout option on cmd.exec (and cmd.stream) now works instead of being silently ignored. It takes seconds (fractions allowed); on expiry the spawned shell is killed and the call raises a catchable error. Only the shell mise spawned is killed, so background processes it started may keep running. (#​13263)

    local ok, err = pcall(cmd.exec, "some-tool sync", { timeout = 30 })
Fixed
  • task: On Windows, pressing Ctrl-C during mise run no longer kills mise immediately and leaves a cmd.exe behind stuck on Terminate batch job (Y/N)?. The first Ctrl-C lets running commands exit and stops scheduling new tasks; a second one takes the remaining process tree down. Tasks ended by the console are reported as interrupted instead of failing with exit code -1073741510. (#​13226)
  • task: A task's own name now always wins over another task's alias. Previously a parent config's tests task with alias = "test" could shadow a test task in the current directory, depending on alphabetical order. Aliases still resolve wherever no task claims that name. (#​13230)
  • task: Glob expansions such as mise run '//...:lint' or '*:lint' no longer silently drop file tasks (mise-tasks/lint.sh) when a sibling package has an exact match. The same-package dedup that stops hello and hello.sh running twice is preserved. (#​13277)
  • completions: Bash completion of namespaced tasks like update:deps:no<TAB> no longer produces update:deps:update:deps:no-cooldown. Reinstall the script with mise completion bash --install if yours predates the prefix-aware wrapper. (#​13276)
  • exec: Launching fish through mise exec or a shim emitted one fish_add_path per directory, which made startup quadratic (over 1s with ~80 tools) and reversed mise's PATH order relative to bash. A single batched call restores both. (#​13235)
  • dotfiles: A blanket --take-remote-all/--keep-local-all no longer aborts the whole pass when one path cannot be decided (a directory on the live side, or unsaved local changes under --keep-local-all). Decisions for the other conflicts are recorded, and the error names the held paths so fixing just those finishes the setup. (#​13239, #​13242)
  • dotfiles: A directory or unreadable path where the repository has a file is now reported by mise dot conflicts, mise dot status, and mise doctor as exactly that, with advice to move it aside, instead of as a "changed type" conflict that --take-remote/--keep-local cannot resolve. Git or process failures while reading a live file now stop the sync with their own error instead of posing as a conflict. (#​13249)
  • upgrade: mise upgrade --bump preserves SemVer build metadata when rewriting a pin, so k3s bumps to 1.37.0+k3s1 rather than a nonexistent 1.37.0, and Temurin keeps its +7 build number. Coarser pins like 1.36 still bump to 1.37. (#​13258)
  • packslip: An exactly pinned version (for example "packslip:github.com/jdx/hk" = "2.0.1") now installs and locks while still inside its minimum_release_age window, as the setting documents. Fuzzy requests such as "2" or latest still wait out the cutoff. (#​13251)
  • install: MISE_LOCKED=1 mise install <tool> no longer warns about unrelated (often global) tools missing from the lockfile; installing the requested tool or a bare mise install still fails if that tool is not locked. (#​13259 by @​jamescassell)
  • pypi: mise lock no longer fails when a with/expose requirement is pinned to a release needing a newer Python than the tool itself (e.g. mkdocs 1.6.1 with mkdocstrings==1.0.6). The sidecar's requires-python is now intersected across every pinned requirement; unpinned requirements and pins behind an interpreter marker leave the range alone. Existing lockfiles remain valid. (#​13252)
  • aqua: With minimum_release_age set, the latest release no longer falls back to an older version when the hosted version list lags GitHub. The release date from the /releases/latest response mise already fetched is used directly, with no extra requests. (#​13228)
  • backend: Tools whose registry entry splits across backends at a version boundary (like hk) now list versions from the backend that actually resolves, so mise ls-remote hk@1.57 and mise latest hk@1.57 return 1.57.0 instead of nothing. Also covers backends promoted by MISE_DISABLE_BACKENDS, platform-scoped entries, and lockfile pins. (#​13238)
  • http: GitHub answers an exhausted rate limit with 403 rather than 429, so mise never retried it. A 403 carrying x-ratelimit-remaining: 0 or retry-after is now retried like a 429 under http_retries; a 403 with quota remaining is still treated as a refusal. Default backoff (~5s total) will not outlast a long reset, but brief contention no longer fails an install outright. (#​13256)
  • skills: mise skills ls and mise skills sync now warn when a packslip declares a skill the install does not hold, with the reason (skills.fetch off, packslip.exec off, or a failed download), instead of looking identical to "no skills declared". After an install with skills.auto_sync off, a one-time hint points at mise skills sync. --json output is unchanged. (#​13275)
  • brew: adopt is now honored for casks named on the command line (mise bootstrap packages apply brew-cask:menuwhere) and for tap-qualified names and aliases like brew-cask:homebrew/cask/firefox, so existing app bundles are adopted rather than replaced and macOS keeps their Privacy & Security grants. (#​13262)
  • brew: Tap formulae declaring requirement symbols such as depends_on :macos no longer make bootstrap packages try to fetch a formula named macos and abort the whole run with a 404. (#​13240 by @​waynehoover)
  • brew: Tap cask metadata evaluation now understands appdir and HOMEBREW_PREFIX interpolation, and casks whose app bundle sits in a nested archive directory (app "nested/Example.app") install as Example.app instead of being rejected as a relative target; duplicate app targets are rejected before anything is downloaded. (#​13138 by @​Guria, #​13199 and #​13200 by @​soodoh)
  • bootstrap: Selecting a Ruby to evaluate third-party Homebrew taps skips mise shims, which the metadata sandbox could not load, so package bootstrap no longer fails when Ruby is installed through mise. (#​13198 by @​jacobbednarz)
Documentation
  • The dotfiles history guide now explains encryption recipients (SSH keys, age-keygen, recovery keys) and warns that passphrase-protected SSH keys and plugin-only recipients cannot decrypt in the background; the setup guide covers adopting onto a machine that already has the files and using non-GitHub Git hosts. (#​13232)
  • The PyPI backend's locking limitations now point at the lockable with, expose, and dependency_prereleases options. (#​13222)
New Contributors

Full Changelog: jdx/mise@v2026.9.9...v2026.9.10

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

v2026.9.9: : Dotfiles false-deletion fix, encrypted mise dot track, semantic uv options for PyPI tools

Compare Source

The dotfiles history watcher no longer records files as deleted when a checkpoint and a sync compose snapshots at the same time, mise dot track --encrypt enrolls a file with encrypted history from its first checkpoint, mise bootstrap --adopt --replace-history discards unrelated local history in one shot, and pypi: tools gain lock-aware with, expose, and dependency_prereleases options. Also fixed: packslip: installs from private GitHub repositories, stale history watchers after upgrading, global npm tools being reinstalled under lockfile = true, and the -- separator in activated PowerShell sessions.

Added

  • dotfiles: mise dot track --encrypt writes encrypt = true into the tracked declaration and encrypts the initial baseline checkpoint, for files that must never have plaintext history. [history.encryption].recipients must be configured first; if the encrypted baseline cannot be saved, enrollment fails closed and rolls back the declaration without committing history metadata. Run it as a standalone command rather than inside mise dot capture. Enabling encryption on a file that already has plaintext history does not rewrite that history. (#​13180 by @​jdx)

    mise dot track ~/.config/app/credentials --encrypt
  • bootstrap: Fresh mise bootstrap --adopt now compares existing live files against the incoming setup before creating any local history, so identical files adopt the origin's history instead of being rejected as an unrelated root (for example right after the history store was removed). Differences still pause for an explicit decision. For machines that genuinely hold unrelated local history, --replace-history discards it and adopts the setup repository's branch in one shot; --dry-run previews the local and origin commits, and a failed replacement restores the previous branch and sync state. Ordinary sync never replaces divergent history and there is no persistent force setting. (#​13182 by @​jdx)

    mise bootstrap --adopt <url> --replace-history --yes
  • pypi: Three new tool options express common uv install behavior without opaque uvx_args, and unlike free-form arguments they participate in dependency graph locking: with installs extra requirements, expose installs extra requirements and links their executables (requires uv 0.8.5 or newer), and dependency_prereleases sets uv's prerelease policy (disallow, allow, if-necessary, explicit). Setting any of them selects uv as the installer. uvx_args and pipx_args remain available as version-only escape hatches. The Ansible and Azure CLI registry entries now use these options by default; if you force pipx for one of them, clear the default with an empty list, e.g. "pypi:ansible" = { version = "latest", uvx = false, expose = [], pipx_args = "--include-deps" }. (#​13181 by @​jdx)

    [tools]
    "pypi:azure-cli" = { version = "latest", with = ["pip"], dependency_prereleases = "allow" }
    "pypi:ansible" = { version = "latest", expose = ["ansible-core"] }
  • registry: Added nubr (npm:@nubjs/runner), the Nub project's TypeScript runner for a file, package.json script, or installed bin on plain Node. (#​13191 by @​colinhacks)

Fixed

  • dotfiles: With history.sync = "sync" and a running watcher, a checkpoint could record a sorted prefix of tracked files as deleted even though they were untouched on disk; those deletions then synced to other machines and removed their copies. Two compositions in one process (the watcher's checkpoint and the sync it started) shared a single scratch git index, and one resetting it mid-flight truncated the other's tree. Each composition now uses its own scratch index, and indexes left by killed processes are swept. Files recorded as falsely deleted are still in history and can be restored from an earlier checkpoint. (#​13195 by @​jdx)
  • dotfiles: A history watcher started before mise 2026.9.5 (which moved history locks into $MISE_STATE_DIR/history/), or started with a different MISE_STATE_DIR than the shell, kept running the old process without watching the current store, while mise bootstrap services apply considered the unchanged service converged and skipped it. services apply now restarts a history-watch service whose process is not watching this store, and mise doctor and mise dot status report "running but not watching this store" instead of "not running" (service-not-watching in mise dot status --json). Users already in this state are recovered by running mise bootstrap services apply. (#​13190 by @​jdx)
  • npm: With lockfile = true in effect, an npm tool pinned in the global config was resolved with a graph-specific install identity that no automatic flow could persist, so every mise exec treated the installed tool as unsatisfied, re-ran an install pass, and warned that it was missing. Global requests now stay version-only unless resolved from an explicitly generated revision 2 global lockfile; opt in with mise lock --global. (#​13186 by @​jdx)
  • packslip: Installing from a private GitHub repository failed with 404 Not Found on the manifest because GitHub only serves private release assets through its API, not the releases/download/ URLs a packslip records. mise now falls back to the API asset endpoint using the same credentials as the github: backend (MISE_GITHUB_TOKEN, GITHUB_API_TOKEN, or GITHUB_TOKEN) with no configuration changes; signature, identity, digest, and size verification are unchanged. Tags containing / (such as @biomejs/biome@2.5.2 or monorepo tool/v1.0.0 tags) and # are also resolved correctly now. Non-GitHub hosts and GitHub Enterprise are not covered. (#​13188 by @​jdx)
  • activate: In a shell activated with mise activate pwsh, mise exec -- pnpm --version failed with unexpected argument '--version' because PowerShell's parameter binder removes the first bare -- before the mise wrapper function sees its arguments. The wrapper now recovers the separator from the raw invocation line, fixing mise exec/mise x, mise tasks add, mise dotfiles capture, mise oci run, mise generate git-pre-commit, and mise bootstrap; mise run was not affected. Open sessions pick up the fix the next time mise activate pwsh runs (normally at shell start). The doubled mise exec -- -- cmd workaround now fails in an activated shell, as it always did without activation, so drop back to a single --. (#​13202 by @​jdx)
  • registry: The dbt-fusion install test now expects dbt <version>, matching what dbt --version actually prints. (873c400 by @​jdx)

Documentation

  • The GitHub star count on mise.jdx.dev now also appears in the nav overflow menu at medium viewport widths. (#​13193 by @​jdx)

Full Changelog: jdx/mise@v2026.9.8...v2026.9.9

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

v2026.9.8: : Top-level mise dot command, faster brew bootstrap installs, and npm safety-check fixes

Compare Source

Dotfile management moves to the top level as mise dot, Homebrew bootstrap installs run their download, extraction, and linking stages concurrently, and several install paths are corrected: embedded aube reputation gates now report the real reason and honor --yes, PyPI tools fall back to version-only installs when a dependency graph cannot be built, lazy tools no longer trigger missing: warnings, and lockfiles no longer resurrect disabled backends.

Added

  • dotfiles: The full dotfiles command tree is now available as mise dotfiles, with mise dot as a short alias. mise bootstrap dotfiles remains supported and all three spellings share the same behavior, including bootstrap hooks around apply. Generated history-watch services now invoke mise dot watch. (#​13158 by @​jdx)

    mise dot track ~/.zshrc
    mise dot status
    mise dot history
  • dotfiles: Enabling encryption on a file that was previously saved in plaintext left older commits that blocked sync. mise dot sync --allow-plaintext-history lets that history reach the origin for one run, and the global-only setting settings.history.allow_plaintext_history = true (default false, env MISE_HISTORY_ALLOW_PLAINTEXT_HISTORY) does the same for sync, publish, the history watcher, and incoming history on pull. New saves still follow the file's encryption policy; the history guide also documents how to remove the old commits instead. (#​13175 by @​jdx)

  • registry: Added poppler (conda:poppler), providing pdftotext, pdfinfo, pdftoppm, pdftocairo, pdfunite, and the other Poppler PDF utilities. (#​13133 by @​i-api)

Fixed

  • npm: Embedded aube reputation gates (low weekly downloads, similar-name, new package name) no longer surface as a misleading user aborted mise add error when stdin is closed or no terminal is attached. Non-interactive installs now report the measured signal (for example 569 weekly downloads against the 1000 threshold) and suggest the mise-native fix, allow_low_downloads = true on the tool; an explicit "no" reports user declined to add <package>. An explicit CLI --yes now reaches the aube prompt and approves it, including auto-installs through use, exec, run, shell, and upgrade; CI mode and a configured yes = true setting alone do not approve reputation gates. (#​13123 by @​jdx)
  • pypi: Ordinary mise install of pypi:/pipx: tools no longer fails when a uv dependency graph cannot represent the package or its configuration, such as a source-only dependency or free-form uvx_args/pipx_args. mise warns and falls back to the version-only install path, reusing an existing version-only installation on later runs. mise lock and mise install --locked remain strict and still reject unsupported arguments or dependencies without usable wheels. (#​13170 by @​jdx)
  • Tools declared with lazy = true are no longer reported as missing: <tool> when entering a project or running a bare mise install, regardless of status.missing_tools; ordinary missing tools are still reported as before. (#​13169 by @​jdx)
  • backend: Backend discovery from lockfiles now skips backends listed in disable_backends. When a parent mise.lock pins a shorthand such as yarn to asdf:yarn and a child project disables asdf, mise tool yarn --backend and a fresh child mise lock now select the first enabled recorded backend or fall back to the enabled registry backend (aqua:yarnpkg/berry) instead of the disabled pin. The parent lockfile is left unchanged and explicitly installing a disabled backend still fails. (#​13178 by @​jdx)

Changed

  • bootstrap: mise bootstrap packages apply installs Homebrew packages substantially faster. Formula metadata for each dependency frontier is fetched concurrently, bottles are extracted, relocated, signed, and receipted concurrently, and each job now downloads and prepares its own bottle so prepared bottles are committed as soon as dependency order allows. All stages respect the existing jobs limit with no new settings; Cellar commits and prefix linking stay dependency-ordered, opt/<name> is linked last so an interrupted install cannot look complete, and a failure cancels queued work while cleaning up in-flight staging. On Apple silicon, a fresh install of brew:jq brew:tree brew:wget brew:just brew:shellcheck dropped from roughly 6.6s to 4.0s, and dependency resolution for brew:ffmpeg from 288ms to 112ms. (#​13151, #​13152, #​13155 by @​jdx)

Documentation

  • The npm backend, PyPI backend, and mise.lock guides now open with quick-start and everyday workflows (mise use node@24 npm:prettier, mise use python@3.14 uv pypi:black, mise lock, mise install --locked) and group dependency-graph locking, sidecar management, and strict-mode details afterward. The lockfile guide clarifies that URL-lock exemptions do not exempt dependency graphs from validation. (#​13149 by @​jdx)

Full Changelog: jdx/mise@v2026.9.7...v2026.9.8

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

v2026.9.7: : Lockfile revision 2 with npm and Python dependency graphs, dotfile conflict inspection

Compare Source

This release introduces mise.lock revision 2, which records complete transitive dependency graphs for npm tools (via embedded aube) and Python tools (via uv) in native sidecar files, and adds mise bootstrap dotfiles conflicts for inspecting dotfile sync conflicts before resolving them. It also lets dotfile templates consume bootstrap secrets, stops minimum_release_age from rejecting versions already committed to a lockfile, and closes a security gap in history.describe_command.

Added
  • lock: Lockfile revision 2 records the full dependency graph of npm tools installed by embedded aube and of pypi: tools installed by uv, then replays it with a strict frozen install so two projects on the same top-level version can still receive their own reviewed transitive graph. Graphs live in native sidecar files (uv.lock / aube-lock.yaml plus a manifest) under .mise/locks/<backend-tool>/<version>/, referenced from mise.lock by relative path and SHA-256 digest, so the lockfile itself stays small. Commit the sidecar directory with mise.lock. New lockfiles use revision 2; existing revision 0 and 1 files keep their format until you run mise lock --upgrade. mise lock --bump <tool> refreshes a tool's transitive graph even when its top-level version is unchanged, ordinary mise install validates and accepts hand-edited sidecars, and mise install --locked rejects digest mismatches until you run mise lock. Python graph locking requires uv 0.12.10 or newer and published wheels for the target platform; Git sources, standalone pipx installs, and free-form uvx_args/pipx_args stay version-only. (#​13131, #​13146 by @​jdx)

    mise lock --upgrade        # move an existing lockfile to revision 2 and resolve graphs
    mise install --locked      # replay the recorded graphs
    mise lock --bump pypi:black  # refresh Black's dependencies without changing its version
  • pypi: pypi: is now the preferred name for the Python CLI backend; pipx: remains fully supported as an alias with no warnings, and settings accept both pypi.* and pipx.* names. The two spellings are distinct tool identities (pypi-black vs pipx-black install directories and lock entries), so switching spelling creates a new installation. (#​13146 by @​jdx)

  • bootstrap: mise bootstrap dotfiles conflicts [PATH...] shows a read-only comparison of the saved local and fetched remote versions of a conflicted dotfile so you can decide between --take-remote and --keep-local with full context. The default output is a unified diff including file-mode changes; --difftool opens the configured Git diff.tool (falling back to merge.tool) and --tool <name> picks one explicitly. Encrypted contents are decrypted only into private temporary files, and inspection never modifies either side or marks the conflict resolved. Bootstrap secrets are also now resolved from the same composed config maps as dotfile discovery, so root-scoped dotfile templates can use secrets declared by their bootstrap root. (#​13144 by @​jdx)

    mise bootstrap dotfiles conflicts ~/.config/mise/config.toml
    mise bootstrap dotfiles conflicts --difftool ~/.config/mise/config.toml
  • dotfiles: Dotfile templates (mode = "template") can reference [bootstrap.secrets] values with {{ secret(name="...") }}, matching managed bootstrap file templates. Dotfiles commands that render templates (add, apply, diff, edit, status, unapply) accept --prompt-secrets; without an available value, rendering fails closed. A full mise bootstrap run preflights dotfile templates before making changes, mise bootstrap status reports secrets used only by dotfiles, and textual diffs redact resolved secret values. (#​13140 by @​jdx)

    [bootstrap.secrets]
    api_token = "EXAMPLE_API_TOKEN"
    
    [dotfiles."~/.config/example/credentials"]
    source = "dotfiles/credentials.tmpl"
    mode = "template"
Fixed
  • lock: Installing from a committed mise.lock no longer fails when the locked release is younger than minimum_release_age. The cutoff still applies when resolving unlocked fuzzy requests and when generating or bumping a lockfile, and npm:/pypi: still forward it to unpinned transitive dependencies, but a reviewed lock entry now reproduces immediately in CI instead of waiting for the release to cool. (#​13128 by @​jdx)
  • config: A .python-version (or other idiomatic version file) containing system selects the system interpreter without printing the mise-specific @system deprecation warning, matching the existing .tool-versions exception. Explicit python@system requests from mise configuration or command arguments still warn. (#​13132 by @​jdx)
  • npm: Embedded aube is updated to 2.2.16, fixing the Bun checksum install regression and ensuring local npm tarballs keep their manifest package name. (#​13145 by @​jdx)
  • registry: The mc shorthand uses aqua:minio/mc again now that the upstream Aqua registry entry is restored, with asdf:mise-plugins/mise-mc kept as the fallback. (#​13124 by @​jdx)
Security
  • history: history.describe_command is now global-only. Previously an implicitly trusted project could set it and have a later dotfiles history checkpoint execute the project-controlled command with unencrypted tracked-file diffs. The setting is honored only from system/global configuration or MISE_HISTORY_DESCRIBE_COMMAND; project values are ignored with a warning. (#​13134 by @​jdx)
  • oci: mise oci build now renders dotfile templates with a restricted engine: secret() is rejected and the env context, get_env(), exec(), and read_file() are unavailable, so ambient credentials cannot be baked into a publishable image layer. (#​13140 by @​jdx)
Breaking Changes
  • Lockfile revision 2 is not readable by older mise versions. Newly created lockfiles use revision 2, and existing files switch only when you run mise lock --upgrade. Upgrade collaborators and CI to this release before committing a revision 2 mise.lock, and commit the .mise/locks/ (or .config/mise/locks/) sidecar directory alongside it. Revision 2 --locked installs fail if a recorded graph is missing or its digest does not match. If you gitignore mise.local.lock, also ignore its matching sidecar subdirectory (for example .mise/locks/mise.local/).
  • history.describe_command in project configuration is ignored. Move it to ~/.config/mise/config.toml or set MISE_HISTORY_DESCRIBE_COMMAND.
  • mise oci build dotfile templates can no longer call secret(), get_env(), exec(), or read_file() or read the env context.

Full Changelog: jdx/mise@v2026.9.6...v2026.9.7

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

v2026.9.6: : Project daemons, mise doctor project, and vfox backend tool discovery

Compare Source

This release adds experimental project daemons backed by pitchfork, a mise doctor project command for project-declared diagnostic checks, and tool discovery from vfox backend plugins in mise search. It also changes the HTTP backend's default install layout so uninstall and prune reclaim disk space, speeds up warm lockfile_mode = "generate" installs and repeated OCI builds, and fixes a batch of nushell, monorepo, lockfile, brew, and Windows bootstrap issues.

Highlights

  • Services next to tools: [daemons] declares background processes and PostgreSQL/Redis presets in mise.toml, managed through mise daemons and optionally started when you enter the project. [doctor.checks.<name>] lets projects declare their own environment probes for mise doctor project.
  • Discovery and output: mise search, shell completion, and interactive mise use now include tools published by installed vfox backend plugins, and settings.truncate / --no-truncate disable terminal-width truncation (automatically when a coding agent is detected).
  • Storage and speed: HTTP tools now extract into their own install directory by default (opt back into deduplication with shared_extraction = true), warm generate-mode installs skip needless lockfile rewrites, and OCI builds share a local tool-layer cache.

Added

  • daemons: New experimental [daemons] section and mise daemons command family (start, stop, restart, ls, status, logs, tui) manage project background processes with pitchfork. PostgreSQL and Redis presets install the database as a tool (participating in lockfiles), supply connection environment variables and readiness checks, and keep project data across stop/start. Daemons with auto = ["start", "stop"] start when entering the project from an activated Bash, Zsh, or Fish shell and are released when the last shell session leaves. Requires experimental = true and pitchfork 2.25.0 or later; database presets are Unix-only and PostgreSQL uses loopback trust authentication intended for local development. (#​13085 by @​jdx)

    [settings]
    experimental = true
    
    [daemons]
    postgres = "18"
    redis = "8"
    
    [daemons.web]
    run = "npm run dev"
    port = 3000
    auto = ["start", "stop"]
  • doctor: mise doctor project runs checks declared in [doctor.checks.<name>] with the project's environment and installed tools, reporting PASS/FAIL/error/skipped per check in text or --json. Checks support description, hint, timeout (default 10s), dir, shell, and os selectors, run concurrently under the jobs limit, and exit nonzero when any check fails. Ordinary mise doctor does not run them, and hints are never executed. A follow-up aligned dir resolution with task conventions (config root for project configs including ~/mise.toml, ~/ expansion), fixed head-of-line blocking when one probe hangs, and kept nohup mise doctor project alive on SIGHUP. (#​13062, #​13089 by @​jdx)

    [doctor.checks.openssl]
    description = "OpenSSL development files are discoverable"
    run = "pkg-config --exists openssl"
    hint = "Run `mise bootstrap packages apply` to install the declared build dependencies."
    timeout = "5s"
    os = ["linux", "macos"]
  • vfox: Tools provided by installed vfox backend plugins now appear in mise search, shell completion, and interactive mise use, namespaced as <plugin>:<tool>. Plugins can implement BackendListTools for a finite catalog and/or BackendSearchTools for query-driven discovery in large ecosystems; a prefixed query like npm:eslint is routed only to that plugin. Results are cached, slow plugins fall back to stale cache, and existing plugins need no changes. mise registry remains registry-only. (#​13111 by @​jdx)

  • cli: New settings.truncate (and MISE_TRUNCATE, default true) controls terminal-width shortening

Important

✂ PR body was truncated to here.


Configuration

📅 Schedule: (in timezone America/Los_Angeles)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate renovate Bot added the bot label Jul 20, 2026
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 6 times, most recently from b069281 to 4210d96 Compare July 30, 2026 03:03
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 4 times, most recently from 7255dd3 to 18a73a9 Compare August 5, 2026 03:26
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 3 times, most recently from 2752ba1 to 661a5bf Compare August 12, 2026 20:16
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 4 times, most recently from 6445a85 to c5325ef Compare August 20, 2026 23:10
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 4 times, most recently from 9dd559c to fac6f2e Compare August 26, 2026 03:48
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 4 times, most recently from 61548e9 to 844f10e Compare September 3, 2026 00:28
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 4 times, most recently from b504efd to 25c7628 Compare September 11, 2026 04:03
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch 5 times, most recently from 6e7311c to 5986910 Compare September 16, 2026 17:47
@renovate
renovate Bot force-pushed the renovate/jdx-mise-2026.x branch from 5986910 to e80a868 Compare September 18, 2026 07:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants