Skip to content

chore(deps): update dependency jdx/mise to v2026.9.12 - #2492

Merged
renovate[bot] merged 1 commit into
mainfrom
renovate/mise
Sep 21, 2026
Merged

renovate[bot] merged 1 commit into
mainfrom
renovate/mise

Conversation

@renovate

@renovate renovate Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Type Update Change
jdx/mise uses-with patch v2026.9.7v2026.9.12

Release Notes

jdx/mise (jdx/mise)

v2026.9.12

Compare Source

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.


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • "before 4am on Monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, 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 dependencies Pull requests that update a dependency file label Sep 21, 2026
@renovate renovate Bot added the dependencies Pull requests that update a dependency file label Sep 21, 2026
@renovate
renovate Bot enabled auto-merge (squash) September 21, 2026 00:49
@renovate
renovate Bot merged commit 0e19704 into main Sep 21, 2026
27 checks passed
@renovate
renovate Bot deleted the renovate/mise branch September 21, 2026 06:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant