Skip to content

chore(deps): update github-actions - #1129

Open
renovate[bot] wants to merge 2 commits into
mainfrom
renovate/github-actions
Open

renovate[bot] wants to merge 2 commits into
mainfrom
renovate/github-actions

Conversation

@renovate

@renovate renovate Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Type Update
actions/create-github-app-token v3.2.0 -> v3.3.0 action minor
jdx/mise 2026.10.8 -> 2026.10.15 uses-with patch
jdx/mise-action v5.1.1 -> v5.2.1 action minor
node 24.21.0 -> 24.22.0 uses-with minor

Release notes are maintained in a PR comment by the renovate-release-notes-comment workflow.


Configuration

📅 Schedule: (in timezone America/Los_Angeles)

  • Branch creation
    • "after 4pm on thursday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • 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 requested a review from scottames as a code owner October 23, 2026 02:35
@renovate
renovate Bot enabled auto-merge (squash) October 23, 2026 02:35
@scottames-github-bot

scottames-github-bot Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor

Renovate Release Notes

Generated from Renovate's update table by the renovate-release-notes-comment workflow.

Packages that cannot be summarized from GitHub releases are listed explicitly below.

actions/create-github-app-token (actions/create-github-app-token)

v3.3.0: v3.3.0

Compare Source

3.3.0 (2026-10-12)

Features

Bug Fixes

  • deps: bump nested undici from 6.24.0 to 6.29.0 (#403) (12461a3)
  • deps: bump the production-dependencies group across 1 directory with 3 updates (#395) (a69c19d)
jdx/mise (jdx/mise) - part 1 of 2

v2026.10.15: v2026.10.15: Default minimum_release_age covers every backend, plus a PowerShell installer

Compare Source

The default 24-hour minimum_release_age now applies to every backend. Many more backends report release dates, so the cooldown can actually hold new versions back, and mise warns when it installs a version it couldn't date. This release also adds a PowerShell installer for Windows, read_json/read_yaml/read_toml template functions, dotnet@​lts/dotnet@​sts, and new dotfiles options.

Changed

  • The default minimum_release_age applies to every backend. The built-in 24h cooldown used to cover only backends that reported release dates (aqua, cargo, core, github, npm, pypi and others). asdf, vfox, conda, dotnet, http: and s3: tools had no cutoff at all. Now every backend gets the cooldown. A tool whose only version is less than 24h old now resolves to "no versions found", as aqua and github tools already did. To opt a tool out, add it to minimum_release_age_excludes. To turn the cooldown off, set minimum_release_age = "0s". #14701 (@​jdx)

  • mise warns when it can't check a version's release date. A version with no known date still passes the cutoff, but mise install, mise upgrade and mise use now print a one-time warning naming the version. Exact pins you wrote yourself don't trigger it. mise env, mise ls, mise outdated and mise ls-remote never print it. #14694 (@​jdx)

    WARN  asdf:tiny@​3.1.0 has no release date, so the ... cutoff cannot be checked and it is allowed (exclude it with minimum_release_age_excludes to silence this)
    
  • More backends report release dates, so the cooldown applies to them:

    • conda versions use the channel's earliest index timestamp. #14693
    • aqua packages that take versions from git tags (version_source: github_tag, such as aws/aws-cli, docker/cli and cockroachdb/cockroach) are now dated. #14691
    • dotnet dates come from Microsoft's releases index. deno and erlang dates come from their GitHub releases. #14692
    • Every python version now has a date, and so do many more ruby versions (from ruby-lang.org, Maven Central for JRuby, and GitHub for TruffleRuby). Rust's stable, beta and nightly channels are dated too. With an explicit past cutoff, rust@​stable resolves to the newest stable release that is old enough, and beta/nightly resolve to a dated build from before the cutoff. #14697
    • The dart, flutter, nim, julia, nomad-pack, sentinel, tfc-agent, android-cli, cursor-agent and twg registry tools now report dates. #14698

    All by @​jdx.

  • Version lists for more backends come from the mise-versions host. npm:, pipx:, cargo:, gem:, go:, dotnet: and spm: tools now list versions from mise-versions, like other registry tools, instead of going to their own source. So do http/s3 tools with a version_list_url. If you redirect a source, mise still lists from that source directly. That covers a custom npm registry or npm.shell_out, pypi.registry_url, a non-default GOPROXY, cargo.registry_name, a custom gem source, dotnet.registry_url, S3 endpoint overrides, and local listing options. conda always lists from its channel. The host cache TTL now follows the tool's minimum_release_age. To list everything from the source, set MISE_USE_VERSIONS_HOST=0. #14700 (@​jdx)

Added

  • PowerShell installer for Windows. It's published with each release as install.ps1 and served from mise.run at /powershell and /pwsh, so you pipe it into iex with irm. It works on PowerShell 5.1+ and doesn't need admin rights. It installs the newest release that is at least 24h old, or MISE_VERSION if set. The download is verified against SHASUMS256.txt from GitHub Releases. mise.exe and mise-shim.exe go into ~\.local\bin, and that directory is added to your user Path. Re-running it upgrades an existing install. Options include MISE_INSTALL_PATH, MISE_INSTALL_MODIFY_PATH=0, MISE_INSTALL_SHIMS_PATH=1 and MISE_INSTALL_FROM_GITHUB=1. See the "Installing mise" docs for the full command. #14660 (@​jdx, @​lhs-12)

  • read_json(), read_yaml() and read_toml() template functions parse a file so a template can use a value from it. This saves copying a version from package.json or Pulumi.yaml into mise.toml by hand. Relative paths resolve from the config file's directory. A missing key is an error unless you add | default(value="..."). Like read_file(), these functions need a trusted config, and they don't work in safe mode, .miserc.toml or OCI dotfile templates. #14705 (@​jdx, @​edahlseng)

    [tools]
    node = "{{ read_json(path='package.json')['volta']['node'] }}"
    pulumi = "{{ read_yaml(path='Pulumi.yaml')['requiredPulumiVersion'] }}"
  • dotnet@​lts and dotnet@​sts resolve to the newest SDK in the current LTS or STS channel, using Microsoft's release index. Preview, go-live and end-of-life channels are skipped. A lts alias you define in [tool_alias.dotnet.versions] still takes precedence. Runtime-only installs still need an exact version. #14683 (@​jdx)

  • mise bootstrap --prune-dotfiles removes dotfiles that are no longer deployed, the same way mise dot apply --prune does, so mise bootstrap --upgrade --prune-dotfiles handles everything in one run. The prune runs at the end of the dotfiles phase. It respects --dry-run, --yes and --skip dotfiles. Copies you edited are left in place. #14681 (@​jdx, @​thernstig)

  • dotfiles.windows_symlinks (default false) makes symlink and symlink-each create real file symlinks on Windows. With it on, apply fails if Windows refuses to create a link, instead of silently copying. To create symlinks, Windows needs Developer Mode or an elevated shell. If you turn the setting back off, mise dot unapply needs --force on entries that still hold links. #14682 (@​jdx)

    [settings.dotfiles]
    windows_symlinks = true
  • http: tools can report release dates with the new version_date_expr option. It maps versions to dates from the version_list_url response. Use version_date_url to read the dates from a different URL, and version_date_next_expr to follow paged listings (same host only). Dates can be RFC 3339, YYYY-MM-DD or HTTP dates. #14696 (@​jdx)

  • vfox plugins can report release dates. An Available or BackendListVersions hook can return created_at (RFC 3339) for each version. Plain version strings still work. #14695 (@​jdx)

  • mise tasks -a is a short alias for mise tasks --all. #14674 (@​williamsjokvist)

Fixed

  • mise fmt no longer breaks multiline inline tables (TOML 1.1). It used to pull comments out of the table and drop indentation. Now it leaves these tables exactly as written. #14670 (@​jdx, @​ponko2)
  • If one task's dir template fails to render, other task commands keep working. Before, every command failed, including mise tasks validate. Now mise tasks validate reports the broken task as invalid-directory-template, and only running that task fails. #14680 (@​jdx)
  • aqua tools now find their binaries in macOS universal archives, such as fastfetch 2.70.0. #14665 (@​jdx)
  • npm: lifecycle scripts approved by allow_builds now run even when ~/.npmrc sets ignore-scripts=true. #14661 (@​jdx)
  • npm: mise lock no longer fails when your aube config sets a different default lockfile, such as pnpm-lock.yaml. #14659 (@​jdx)
  • .7z tool archives now extract when mise's data directory path contains .., for example in a localized mise setup. #14657 (@​jdx, @​sevenc-nanashi)
  • The mise-shim.exe in the Windows release now keeps its version tag, so mise doctor and mise reshim --force stop reporting it as outdated. The warning goes away after you update and run mise reshim --force. #14656 (@​jdx)
  • On Windows, symlink-each dotfiles messages and dry-run previews now say the files were copied rather than symlinked. #14654 (@​jdx, @​lhs-12)
  • Rust: with a RUSTUP_DIST_SERVER mirror configured and GitHub unreachable, mise now lists the stable, beta and nightly channels instead of failing, so rust@​stable installs through the mirror. #14662 (@​jdx)
  • On Windows, http: installs of large archives no longer fail with "Access is denied" while antivirus is scanning the extracted files. mise now retries the final move for up to about a minute. #14703 (@​jdx)

Documentation

  • New mise.toml playground: a schema-aware editor with hover help, completion and error checking. You can share a config as a link. Every mise.toml example in the docs now shows hover help on its keys. #14673, #14686 (@​jdx)
  • The mise.toml reference is now a searchable key explorer grouped by topic. Each key shows its type, default and a real example. Nearly every key now has a description, and these also appear in mise config explain. #14687, #14690, #14688 (@​jdx)
  • The fnox secrets page now covers setup, CI and migration. The dotnet page explains how private feeds authenticate. #14675, #14679 (@​jdx)

Full Changelog: jdx/mise@v2026.10.14...v2026.10.15

💚 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.10.14: v2026.10.14: Global override config, mise config explain, and stricter tool option checks

Compare Source

A global config.override.toml can now take precedence over project config, and mise config explain describes each key in a config file. Paranoid mode can be turned on per category, and in that mode dotenv files need their own content-bound trust. Installs now fail when a tool has an option its backend doesn't read, which affects existing configs (see Changed).

Added

  • Global override files. ~/.config/mise/config.override.toml, and config.<env>.override.toml for each MISE_ENV, rank above every project file, including mise.local.toml and mise.<env>.toml. This covers [env], [tools], [settings], [tasks], hooks and the other sections. Anything the override file doesn't set still comes from the project. mise never writes to these files by default. To write to one, pass --override to use, unuse, set, unset, settings set|add|unset or config get|set. A tool declared in an override file resolves from the global mise.lock and is exempt from the project's --locked check. If MISE_GLOBAL_CONFIG_FILE is set, override files are not loaded. mise config ls shows a Tier column and mise doctor labels the files. #14610 (@​jdx)

    # ~/.config/mise/config.override.toml
    [env]
    AWS_PROFILE = "personal"
    
    [tools]
    node = "24"
  • mise config explain [KEY] lists each key a config file sets, with its line number and its description from the schema. It flags unknown keys with a "did you mean" suggestion and marks deprecated keys. It reads the file as plain TOML, so it also works on a config mise refuses to load. Pass a key such as tasks to show only that section, --json for machine-readable output, and --file, --global, --system or --override to pick a file. #14642 (@​jdx)

  • Paranoid mode can be turned on per category. paranoid now accepts a list of config, env_files, plugins and provenance in addition to true/false. MISE_PARANOID=config,env_files also works. true still turns on all four categories. An unknown category name is an error. #14609 (@​jdx, @​thernstig)

    [settings]
    paranoid = ["env_files"]
  • env_file takes several filenames, for example env_file = [".env", ".env.local"] or MISE_ENV_FILE=.env:.env.local. The file nearest the current directory wins. Within one directory, a name later in the list wins. A single string still works. #14606 (@​jdx, @​thernstig)

  • A find_up entry in env._.file can search several names together. Give one entry a path list, and mise searches directory by directory. The closest directory wins, then the later name within a directory. With two separate entries, a .env.local in a parent directory still overrides the project's .env. The docs now explain this difference and how env_file differs from _.file. #14620, #14602 (@​jdx)

    [env]
    _.file = { path = [".env", ".env.local"], find_up = true }
  • #MISE headers in file tasks accept the same keys as [tasks.<name>], including timeout, vars and the deny_*/allow_* sandbox keys. Before, these keys were ignored with a warning. If one header value is invalid, mise warns and skips that key, and every other task still loads. An invalid confirm or deny_* value is still an error, so a typo can't remove a confirmation prompt or a sandbox restriction. Before, a template named with extends overrode a header's silent. Now the header's value wins. #14637 (@​jdx)

  • Interactive mise.toml reference in the docs at configuration/reference. It lists every key with its type, choices and default, and you can filter keys and link to them directly. Plain Markdown copies are also published for agents. #14641 (@​jdx)

Changed

  • Installs fail on tool options the backend doesn't read. Before, such options were silently ignored. A typo or a key meant for another backend now stops the install, and the error names the option: cargo:eza: option 'asset_pattern' is not used by the cargo backend. Keys under platforms are checked too. So far this applies to the cargo, conda, gem, github, gitlab, forgejo, go, http, npm, packslip, pipx, s3, spinel, spm and ubi backends. aqua, plugin and core-language tools are not checked. The npm backend accepts the checksum option that comes from a packageManager field in package.json. #14629, #14655 (@​jdx)
  • Paranoid mode needs content-bound trust for env files. In paranoid mode, files loaded through _.file, found by the env_file setting, or run by _.source each need their own trust. Editing one of these files revokes its trust. Before, trusting mise.toml also approved these files, and later edits went unchecked. Running mise trust with no path trusts the project's config and every env file it loads. The error names the file but prints none of its values. To exempt a file by path, add it to trusted_config_paths in your global config. With a category list, this check belongs to env_files. #14604 (@​jdx, @​thernstig)
  • More specific config error messages.
    • A warning about an unknown mise.toml key now gives the line and column, and suggests a close match, for example mise.toml:5:1: settings.experimantal (did you mean experimental?). #14639 (@​jdx)
    • A wrong value for a hook, a task run/depends entry or an [env] variable now says which forms are accepted, or names the unknown key. Before, the error was data did not match any variant of untagged enum. An unknown key in a run or depends table now gets a warning. Before, it was silently ignored. #14640 (@​jdx)
  • [bootstrap.linux.firewall] is validated on every OS. macOS and Windows still skip the section at bootstrap time, but an invalid value such as backend = "iptables" is now an error there too. #14615 (@​jdx)
  • Editor schema updates. Editors now flag unknown keys in most [bootstrap] tables and in [dotfiles] entries. The schema now documents launchd keep_alive_on_failure and nice, and dotfile autosave and enabled. It also accepts valid configs it used to reject: templated login_shell, queue_directories and umask, nested macOS defaults values, and tools on [vars] entries. On Windows, [bootstrap.brew].adopt no longer causes an unknown-field warning. #14616, #14644, #14613 (@​jdx)
  • mise dot status and mise dot sync are faster with many tracked files. They start one git process per tracked file instead of three, which took about 10s down to 4s for 860 files. #14607 (@​waynehoover)

Fixed

  • With an external rustup that keeps its proxies in a shared directory, such as pacman's /usr/bin, mise no longer puts that directory ahead of its own tools. Before, mise exec -- node could run the system Node. Only the Rust proxies are now exposed, through a directory that mise owns. #14597 (@​jdx)
  • The cargo backend now honors rename_exe. Before, it ignored the option and installed the executable under its original name. #14626 (@​jdx)
  • Locked pypi: installs through uv now pass the configured mise Python to uv sync. Before, mise passed an empty path, so uv could pick another interpreter and fail on --no-build tools such as yamllint. #14593 (@​jdx, @​hollow)
  • When the TLS root store or a CA file can't be loaded, the npm backend now reports an error instead of crashing mise with a core dump. #14595 (@​jdx)
  • On fish, mise no longer recurses until fish hits its call stack limit after mise implode. #14594 (@​jdx, @​thernstig)
  • mise bootstrap now finds Nix in /nix/var/nix/profiles/default/bin when a pre-packages hook installed it earlier in the same run, so nix: packages install. #14596 (@​jdx)
  • MISE_WATCH_FILES_GIT_REWRITTEN is no longer set when HEAD stayed on the same commit, for example after git checkout -b, git reset or git branch -m. Before, format-on-edit hooks skipped files you had just edited. #14585 (@​JamBalaya56562)
  • Command wrapper templates can now use config_root and config_source. Relative paths in template functions resolve from the wrapper's config file instead of the current directory. #14628 (@​JamBalaya56562)

Upgrading

  • Unsupported tool options: if an install now fails with option '...' is not used by the ... backend, remove the option or fix its spelling. mise config explain tools shows which keys mise doesn't recognize.
  • Paranoid mode: after upgrading, run mise trust in each project to approve its env files. Run it again after editing them. If you only want the env-file check, set paranoid = ["env_files"].
  • Firewall config on macOS and Windows: if a shared config has an invalid [bootstrap.linux.firewall] value, it now fails to load on macOS and Windows too. Correct the value.

Full Changelog: jdx/mise@v2026.10.13...v2026.10.14

💚 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.10.13: v2026.10.13: Untrusted project configs can no longer change settings

Compare Source

mise now ignores [settings] in a project config until you trust it. This release also adds per-version-range backend options to the registry and template support for command wrappers and [bootstrap.repos]. It fixes several bugs in lockfiles, tasks and multi-version tool options.

Security

  • [settings] from untrusted project configs is ignored. Before, a cloned repo's mise.toml could change settings as soon as mise found it, with no trust prompt. That included settings that redirect downloads or feed build commands, such as node.mirror_url, python.pyenv_repo and ruby.precompiled_url. These settings now apply only after mise trust, like [env], [hooks] and [tools] options already did. Trusted projects, global and system config, environment variables and CLI flags work as before. Commands that trust the active config implicitly (mise run, mise exec, mise install) reload settings after trusting it, so the project's settings still apply to that same command. Settings files are now parsed once per load. #14538, #14553 (@​jdx)

    For example, if an untrusted repo sets [settings.python] pyenv_repo to its own URL, mise settings get python.pyenv_repo returns the default pyenv repository until you run mise trust.

  • mise's own zip dependency moved to 9.x, which fixes GHSA-4684-h2q9-2vcp. Older versions applied Unix permissions through extracted symlinks without checking that the target stayed inside the destination. mise uses this code to extract downloaded .zip tool archives. #14577 (@​jdx)

Added

  • One registry backend can carry different options for each version range. A registry entry can list the same backend more than once, each time with its own min_version/max_version and options. Tools whose release assets changed at some version can then stay on one backend. Two entries can't give the same version different options unless their platforms don't overlap. Table syntax such as tool = { version = "1.4.0" } now takes its registry defaults from the entry that version selects. Older mise releases apply only the first entry's options to every version. #14543 (@​jdx)

    backends = [
      { full = "github:example/tool", min_version = "2.0.0", options = { asset_pattern = "tool-v2-*" } },
      { full = "github:example/tool", max_version = "2.0.0", options = { asset_pattern = "tool-*" } },
    ]
  • mise ls-remote lists every version range of a registry tool. When a tool's backends serve different version ranges, mise now lists each range from the backend that serves it. Before, it listed only the first backend's range. For example, mise ls-remote hk now starts at 0.1.4 instead of 1.58.1. Explicit backends, overrides, --all and --strict-metadata behave as before. #14544 (@​jdx)

  • Command wrapper values render as templates. command, args and env in [wrappers] can use vars, env and the usual template functions. tools and config_root are not available. A command that renders blank is an error. Use {% raw %} to keep literal braces, such as Docker's {{.Names}}. #14565 (@​jdx)

    [wrappers.foo]
    command = "foo-real"
    args = ["--mode={{ vars.mode }}"]
    env = { FOO_HOME = "{{ [xdg_data_home, 'foo'] | join_path }}" }
  • [bootstrap.repos] supports templated url/ref and clone options. url and ref render from [vars] or the process environment. Values from a config's [env] table are not available. filter, depth and submodules = true are passed to the first git clone as --filter, --depth and --recurse-submodules. Existing checkouts are left as they are. depth can't be combined with a commit SHA or a refs/… ref. #14548 (@​jdx, @​ovidiubuligan)

    [bootstrap.repos]
    "~/src/large" = { url = "git@&#8203;github.com:example/large.git", ref = "{{ vars.branch }}", filter = "blob:none", depth = 1 }
  • {{ system_brew_prefix }} template variable. It resolves to the Homebrew prefix that mise bootstrap installs into: /opt/homebrew on macOS and /home/linuxbrew/.linuxbrew on Linux, or the value of MISE_SYSTEM_BREW_PREFIX. It does not detect a Homebrew install somewhere else. [bootstrap.user].login_shell now renders templates too, so login_shell = "{{ system_brew_prefix }}/bin/zsh" works. #14572, #14570 (@​jdx)

  • vfox PreInstall hooks can return a headers table next to url and sha256. Plugins can now download private or token-gated artifacts through the normal install path, which handles checksums, retries and lockfile URLs. Headers are sent only to the origin of url, are dropped on cross-origin redirects, are redacted in debug output and are never written to mise.lock. An explicit Authorization header overrides netrc and the automatic GitHub token. #14531 (@​jdx)

  • mise doctor reports a stale mise-shim.exe on Windows. In windows_shim_mode = "exe", shims are copies of the mise-shim.exe that sits beside mise.exe. If that template is older than mise, or has no version tag (every template built before this release), mise doctor reports it and mise reshim warns. To fix it, update mise with the package manager that installed it, or run mise self-update, and then run mise reshim --force. #14586 (@​jdx)

Fixed

  • Lockfiles
    • Running mise lock on Windows now records ruby entries for Windows, Linux and macOS platforms. Before, it skipped them, and mise install --locked then failed. #14520, #14529 (@​jdx)
    • Commands that rewrite mise.lock without locking again, such as mise link, no longer delete other platforms' option variants (for example, per-platform asset_pattern entries). #14519 (@​jdx)
    • A mise link for one version of a tool no longer makes mise install --locked fail for that tool's other versions. A link now bypasses the lockfile only when the requested version could select it. #14539 (@​jdx)
    • mise install --locked for Java no longer fetches the mise-java catalog when mise.lock already has the download URL, so locked installs work in air-gapped or proxied environments. #14534 (@​jdx)
  • Tasks and shims
    • mise run no longer hangs when parallel tasks need to install the same tool. #14536 (@​jdx)
    • Running mise install inside a task no longer removes the shims for that task's lazy tools. #14533 (@​jdx)
    • Task hooks (such as postinstall = { task = "setup" }) and watch_files task hooks now run with mise even when a tool shim triggered them. Before, they could fail with errors like jq: Unknown option --cd. #14550 (@​jdx, @​alitas)
    • mise watch exits quietly with status 130 when you interrupt watchexec with Ctrl+C, instead of printing an error. #14541 (@​jdx)
  • Per-version tool options
    • When a github:, gitlab: or forgejo: tool lists several versions in config, each version now installs with its own options. Before, an option such as rename_exe set only on the first entry applied to every version. #14537 (@​JamBalaya56562)
    • vfox: plugin hooks now receive only the options configured for the version they handle. #14562 (@​JamBalaya56562)
  • mise install now restores cargo, rustc and the host's rust-std when they are missing from a Rust toolchain with the minimal or default profile. Before, mise reported such a toolchain as installed. #14525 (@​JamBalaya56562, @​risu729)
  • The uv, pip and poetry deps providers now run again after mise recreates a deleted venv in a later process. Before, the new venv stayed empty. #14532 (@​halms)
  • vfox plugins now report an error, instead of crashing mise, when the HTTP client can't be built (for example, when no CA certificates are installed). #14576 (@​JamBalaya56562)
  • MCP resource read errors now include the underlying cause, such as the untrusted-config message and its mise trust hint. #14566 (@​diogochaves)

Registry

  • xcsift 1.7.0 and later installs from signed Packslip releases and now supports Linux x64 as well as macOS ARM64. #14540 (@​jdx)
  • protoc-gen-connect-go 2.x now installs from the /v2 Go module path, and 1.x versions keep working. #14545 (@​jdx)
  • Added rea (npm:rea-agents). #14421 (@​phucisstupid)

Documentation

  • The docs now state that OpenTelemetry export and spinel installs require experimental = true. #14552 (@​ZainnQureshii)

New Contributors

  • @​phucisstupid made their first contribution in #14421
  • @​diogochaves made their first contribution in #14566
  • @​ZainnQureshii made their first contribution in #14552
  • @​fang2hou made their first contribution in #14551

Full Changelog: jdx/mise@v2026.10.12...v2026.10.13

💚 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.10.12: v2026.10.12: Per-tool Python runtimes for PyPI tools, Gradle workspace discovery, and env file find_up

Compare Source

PyPI and pipx tools can now choose their own Python runtime, the workspace graph can read Gradle multi-module builds, and env._.file can search parent directories. When mise-versions is having an outage, GitHub lookups now retry on api.github.com, and _.source scripts no longer pick up ~/.bashrc when mise is launched from an editor.

Added

  • Per-tool Python for pypi: tools. Set python to a minor series or an exact version, and mise installs that runtime and passes it to uv or pipx for that tool only. The runtime stays private to the tool and does not become your shell's default Python. mise lock records the selected Python with the tool, and mise prune keeps any runtime that a retained tool environment still uses. You can't combine python with --python/-p in uvx_args or pipx_args. Tools that don't set python behave as before. #14479 (@​jdx)

    [tools]
    "pypi:black" = { version = "latest", python = "3.12" }
    "pypi:ruff" = { version = "latest", python = "3.12.12" }

    If you change a tool's python, mise installs a new environment instead of reusing the old one. If that install fails, the previous working environment is left untouched. #14504 (@​jdx)

  • Gradle workspace discovery. mise tasks graph and mise run --affected now find projects listed by include in settings.gradle or settings.gradle.kts, using Groovy or Kotlin syntax. Project IDs follow Gradle paths: :app becomes gradle::app, and the root project is gradle::. Literal project(":lib") references in a project's top-level dependencies {} block become graph edges. mise reads the scripts as text and never runs Gradle. If an include is computed or conditional, a projectDir isn't a plain file("...") literal, or both settings files exist, mise reports an error that points to [monorepo.projects."gradle:..."] overrides. Editing the settings script marks every Gradle project as affected. Based on a prototype by @​Jarvvski. #14512 (@​jdx)

  • find_up for env._.file. With find_up = true, mise looks for a relative path in the current directory and in every parent, so a global config can load each project's .env files. Files load from the root down, so values in closer files win. The default is false, and the option has no effect on absolute paths. #14497 (@​jdx)

    # ~/.config/mise/config.toml
    [env]
    _.file = [
      { path = ".env", find_up = true },
      { path = ".env.local", find_up = true },
    ]
  • Detect git-rewritten files in watch_files hooks. mise sets MISE_WATCH_FILES_GIT_REWRITTEN=1 when every changed file was last written before git's most recent HEAD move (checkout, pull, rebase). Commits don't count as HEAD moves. Hooks such as format-on-edit can use this to skip files the user didn't edit. git stash pop/apply don't move HEAD, so mise doesn't detect them. #14511 (@​jdx)

    [[watch_files]]
    patterns = ["**/*.go"]
    run = '[ -n "$MISE_WATCH_FILES_GIT_REWRITTEN" ] || { IFS=:; hk fix $MISE_WATCH_FILES_MODIFIED; }'
  • .tera sources inferred for dotfile group templates. A mode = "template" entry in [dotfile_groups] no longer needs a source just to point at a .tera file. If the exact path doesn't exist, mise falls back to the same path with .tera added. An explicit source still takes precedence, and the .tera file is not also deployed under its suffixed name. #14502 (@​jdx)

  • mise lock warns about unsupported platforms. If you name platforms with lockfile_platforms or mise lock --platform, mise prints a warning for each tool version that has no build for one of them, for example apko@&#8203;0.30.0 is not available for windows-x64; it will not install there. The default platform set still only logs this at debug level, and the exit status is unchanged. #14500 (@​jdx)

  • Registry: added martin (github:maplibre/martin). #14488 (@​ivan-ivkovic, @​jdx)

Fixed

  • GitHub lookups survive mise-versions outages. If mise-versions times out, drops the connection, or returns 429 or 5xx, mise now retries the lookup on api.github.com, using your GitHub token if one is set. This covers releases, tags, repository contents, attestations and self-update. A 404, 403 or empty answer from mise-versions is still trusted and not retried, so normal use doesn't spend GitHub's anonymous rate limit. If both sources fail, the error shows both failures, and a previously cached version list is still used. #14501 (@​jdx)
  • _.source no longer loads ~/.bashrc. When mise's stdin was a socket and SHLVL was unset, which happens when an editor extension such as the VS Code mise extension starts it, bash sourced ~/.bashrc before the script. That leaked variables into the environment and could drop the script's PATH entries. The script now runs with --norc. #14487 (@​pikeas)
  • Each version entry uses its own options. When a tool listed several versions, options set only on the first entry leaked into the later ones. For example, prerelease = true on a latest entry made a separate "1" entry resolve to a prerelease. #14476 (@​JamBalaya56562, @​risu729)
  • Project overrides now work when a workspace provider fails. Previously, if a provider couldn't read its manifest (for example, a malformed go.work), mise tasks graph and mise run --affected failed for the whole repo. Declaring a project in that provider's namespace under [monorepo.projects] now replaces the provider's output and clears its error. Providers with no declared projects still fail loudly. #14508 (@​jdx)

Documentation

  • Explained why mise activate keeps shims on PATH #14493 (@​jdx), and clarified the platform-specific mise cache paths for CI #14506 (@​zeitlinger).

Full Changelog: jdx/mise@v2026.10.11...v2026.10.12

💚 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.10.11: v2026.10.11: Much faster installs and far fewer GitHub API calls

Compare Source

mise is much faster in this release and calls the GitHub API far less. Version lists, release tags, attestations and other public GitHub metadata now come from mise-versions, so everyday commands like mise install, exec, shims, outdated, lock and self-update are quicker and users without a GitHub token no longer run into the 60-requests-an-hour limit. Cached version lists are reused for longer, so repeat installs skip most lookups. It also adds mise bootstrap --upgrade and mise env --paths, and closes a trust gap in remote task files.

Speed and GitHub API usage

Cold-cache timings for v2026.10.10 versus v2026.10.11, measured with hyperfine on one Linux x64 machine with no GitHub token set:

Command v2026.10.10 v2026.10.11
mise ls-remote python 961 ms 93 ms
mise install (jq, ripgrep, fd, bat, gh, shellcheck) 1.49 s 1.08 s
mise outdated (same six tools installed) 433 ms 272 ms

The install and outdated runs are noisy (±0.1–0.4s over 4 runs) and the install time includes downloads, so treat them as rough. Requests to api.github.com in a cold mise install of github: tools dropped from 2 to 0. Cold mise outdated made 8 network requests before and none now.

  • Public GitHub metadata comes from mise-versions. With use_versions_host on (the default), release lists, latest, git tags (aqua github_tag packages, ubi and go), artifact attestations (including aqua's predicate_type filters) and the digest in the checksum-mismatch hint are read from mise-versions instead of api.github.com. GitHub is still asked directly for repositories mise-versions doesn't list when you have a token (the private-repository case), and in paranoid mode for attestations. The direct API is also used with use_versions_host = false, GitHub url_replacements and custom api_urls. #14460, #14461, #14469, #14481, #14477, #14443
  • Other requests also moved off the GitHub API:
    • mise x, mise exec, shims and hook-env use mise-versions when they auto-install a tool. #14458
    • mise self-update reads mise's releases from mise-versions and downloads the archive from github.com release downloads. Packslip and zipsign verification are unchanged. #14464
    • mise lock downloads artifacts for provenance checks from github.com instead of the API asset endpoint. #14465
    • Aqua registries hosted on GitHub are fetched from raw.githubusercontent.com. #14470
    • Ruby looks up the latest ruby-build release through mise-versions. #14471
  • Fewer version-list fetches. mise install, use and run now reuse a cached version list for the tool's minimum_release_age window minus one hour, clamped to 1–24h. With the default 24h cutoff, that is 23h. outdated, upgrade, ls-remote, lock and latest still refresh after 1h. If you set fetch_remote_versions_cache yourself, your value applies to every command. #14484, #14485, #14457
  • Faster version resolution:
    • Multi-tool commands such as mise outdated can resolve many registry tools with one request to the mise-versions index. #14473
    • latest is resolved without refetching the list. #14456
    • Explicit backend args such as aqua:jqlang/jq reuse the registry tool's version list. #14459
    • Release tags come from the versions host instead of being listed or guessed. #14442
    • Packslip installs no longer re-download what resolution already verified. #14466
    • Install tracking and the Python version list are served from static assets. #14441
  • Python version listing no longer clones pyenv. mise ls-remote python, outdated, upgrade and fuzzy mise use python@&#8203;3.12 read the python-build definitions from mise-versions. A cold listing took about 960ms before and about 90ms now. pyenv is still cloned when mise compiles Python, when python.pyenv_repo points at a fork, when you're offline, or when use_versions_host = false. Some definitions that had no date before now have one, so they are held back by minimum_release_age until they are old enough. #14455
  • mise oci build now requires root for apt: packages, as it already did for apk, and fails up front with a clear message. If apt-get still fails, the error now includes the last lines of dpkg's output. #14447
  • Registry: native-sdk now installs from npm (@&#8203;native-sdk/cli), so the native command works. It requires Node 24+. #14431

Security

  • Remote task files now need trust before their headers render. A mise.toml with only [tasks] loads without trust. Before this fix, if one of those tasks set file to a remote URL, mise tasks ls, mise tasks info and mise tasks validate rendered the file's #MISE headers, so a template like {{ exec(...) }} ran without a trust prompt. Remote files now follow the same rule as local task includes: if the headers contain template syntax, the config that references them must be trusted first. Remote files with plain headers still list without trust, and braces in the script body need no trust. #14416 (@​JamBalaya56562, @​risu729)
  • Updated rustls to 0.23.46 to address a RustSec advisory. #14434

Added

  • mise bootstrap --upgrade installs what is missing and then upgrades what is already installed, in a single run. In the packages phase it runs the same upgrade as mise bootstrap packages upgrade, and pins are respected. In the tools phase it runs mise upgrade without --bump, so configured version ranges hold. Both run before the matching post hooks and dependent services. --dry-run previews both steps and --skip works as before. It does not update mise itself, repositories or images, and it does not restart services. #14433

    mise self-update --yes && mise bootstrap --upgrade
  • mise env --paths prints the PATH entries mise manages, one per line and in PATH order: tool bin directories, _.path entries, and inherited directories that mise moves forward, such as ~/.cargo/bin. This lets CI integrations export only mise's additions without diffing PATH. #14429

    $ mise env --paths
    /home/me/.local/share/mise/installs/node/24.11.0/bin
    /home/me/.cargo/bin
  • The install script downloads pinned versions from mise.jdx.dev. curl https://mise.run | MISE_VERSION=<version> sh now tries mise.jdx.dev first and falls back to GitHub Releases if that download fails. Checksums for pinned versions still come only from GitHub's SHASUMS256.txt. If no checksum is found, the script refuses to install. MISE_INSTALL_FROM_GITHUB=1 still uses GitHub only. #14446

  • Registry: gdal installs the GDAL/OGR command-line tools from conda-forge (conda:libgdal-core). #14440 (@​ivan-ivkovic)

Fixed

  • A bare mise upgrade no longer installs lazy tools that have never been installed. Naming the tool still installs it. A lazy tool that already has a version installed upgrades as before. A missing lazy tool is still installed if an upgraded tool depends on it. mise outdated now marks these tools as [MISSING] (lazy), and the bare upgrade no longer looks up their versions. #14422 (@​ryanrhughes), #14444
  • Fixed false stack limit reached errors on the static musl builds, for example on Ubuntu 26.04. These errors broke aqua version_filter parsing and made shims such as kubectl's report "not a valid shim". #14450
  • mise lock --platform ... run on Alpine or NixOS no longer records Node source builds for other platforms. Only an explicit node.compile or all_compile = true forces source builds for those targets. #14432
  • mise upgrade --bump and hand-edited version pins no longer drop a pipx tool's locked uv dependency graph. Before, mise install --locked then failed on a fresh checkout. #14426 (@​wislertt)
  • Packslip prefixes such as fnox@&#8203;1 now skip releases this host can't install, the same way latest does. Each skipped release gets a warning, and if no match can be installed, mise reports a clear error. #14467
  • A bash shim ahead of /bin no longer causes a false "shim fallback recursion detected" error for commands like bash -c 'bash --version'. The docs now recommend installing shells with the system package manager instead of [tools]. #14475
  • Bootstrap UFW rules with an interface now render the incoming direction (ufw allow in on tailscale0 ...), which fixes Invalid token 'on' errors. #14480
  • Dotfiles:
    • Before the files: apply prompt, mise now lists each file it will create, overwrite or remove and warns that local edits will be replaced. The prompt now defaults to No. #14430
    • mise dot add --changed now also captures edited files that a copy-mode dotfile_groups root discovers automatically, not just files listed explicitly in entries. #14436

Documentation

  • The docs now recommend committing mise.lock, so CI and Docker builds skip version lookups. #14453

New Contributors

  • @​ivan-ivkovic made their first contribution in #14440

Full Changelog: jdx/mise@v2026.10.10...v2026.10.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.

@scottames-github-bot

scottames-github-bot Bot commented Oct 23, 2026 •

Copy link
Copy Markdown
Contributor
jdx/mise (jdx/mise) - part 2 of 2

v2026.10.10: v2026.10.10: Task skip_if, snap and COPR in bootstrap, and dotfiles pull fixes

Compare Source

Tasks can now skip themselves with a skip_if check, and bootstrap gains Snap packages, Fedora COPR repositories, and branch selection for --adopt. This release also fixes several mise dot pull problems that could loop, stall, or leave sharing paused on long histories. On the Windows side, it fixes .mise-bins executables and npm installs restored from a cache.

Added

  • skip_if for tasks. Before a task runs, mise runs its skip_if shell command. If the command exits 0, mise skips the task and counts it as successful. Any other exit status runs the task as usual. #14399

    [tasks.setup]
    skip_if = "test -f .initialized"
    run = "touch .initialized"

    The check runs after depends and before confirm. It uses the task's directory, shell, environment, sandbox and timeout, and it supports Tera templates and task arguments. Its output is discarded and it gets no stdin. It does not receive the task's secrets. File tasks can set it with #MISE skip_if="...". mise run --force skips the check, --dry-run prints it without running it, and mise tasks info shows it. If the check can't start, times out, or is killed, the task fails.

  • Snap packages in bootstrap. On Linux, you can declare snaps in [bootstrap.packages] alongside apt and flatpak, with optional channel and classic, and state = "absent" to remove a snap. If a snap tracks a different channel than you declared, status shows it and apply moves it with snap refresh --channel. snapd can't install or hold a specific version, so apply and upgrade skip entries with a version pin and print a warning. #14402

    [bootstrap.packages]
    "snap:jq" = "latest"
    "snap:node" = { channel = "22/stable", classic = true }
  • COPR repositories with [bootstrap.dnf.repos]. You can declare a COPR next to the dnf: packages that come from it, instead of using a pre-packages hook. mise writes the same /etc/yum.repos.d file that dnf copr enable does. It does not need the copr plugin, so this also works on Fedora Atomic hosts that layer packages. The chroot is chosen from /etc/os-release (Fedora, EL, Amazon Linux). Without --yes, mise asks before enabling any COPR. mise never disables or removes repositories, but mise bootstrap unapply names any leftover files. #14401

    [bootstrap.dnf.repos]
    ghostty = { copr = "scottames/ghostty" }
    
    [bootstrap.packages]
    "dnf:ghostty" = "latest"
  • mise bootstrap --adopt <url>?ref=<branch> adopts a branch other than the default, either for global config or for a setup history. This also works with mise bootstrap remote. The ref must be a branch: tags, commits and missing branches are refused before anything is cloned. mise never switches an existing ~/.config/mise checkout to another branch, even with --update, so use git switch first. The docs now also explain how mise dot origin set relates to an adopted global config. #14400

  • GitHub OAuth refresh token in the Secure Enclave. On a Mac with Touch ID, set github.oauth_cache_secure_enclave = true to keep the native GitHub OAuth refresh token behind Touch ID instead of in plaintext in github-oauth-tokens.toml. Touch ID asks for a fingerprint only when the token needs refreshing. If you cancel the prompt, mise skips the refresh and keeps the cached access token. This needs the Developer ID-signed release build. Homebrew and source builds print a warning and keep the token in the cache file. #14413

Changed

  • On Windows, experimental = true now turns on the identity install layout by itself, which keeps deep npm, pipx and Java trees under the 260-character path limit. Only new installs use it. Existing installs stay where they are, and mise installs migrate can move them. To keep the old layout, set install_layout = "legacy" (or MISE_INSTALL_LAYOUT=legacy). Linux and macOS still need install_layout = "identity" set explicitly. #14392

Fixed

Dotfiles

  • Machines that share an origin and track an encrypted file no longer swap ciphertext back and forth forever. age encryption gives different ciphertext for the same content, so mise dot watch could publish commits endlessly without any real edits. Now mise keeps the ciphertext that history already has whenever it decrypts to the same content, mode and recipients. Machines that are already looping settle after one more sync. #14405
  • mise dot pull on long histories is much faster. The number of git processes no longer grows with the length of the history: in one test with 2,000 commits, a pull went from 137 s to under 6 s. #14407, #14415
  • When a pull's plan went out of date because another operation saved first, it was treated as a failed apply and paused sharing until someone ran mise dot pull by hand. Now, if nothing has been written yet, mise retries on the next attempt and the watcher keeps applying changes. #14414
  • After an interrupted history operation, mise dot pull --yes no longer fails with "local saved history changed since planning". The pull now recovers the interrupted operation before it plans. #14410
  • A file that already has the incoming version (content and mode) is no longer held as an unsaved edit or conflict that pauses sharing. Running mise dot pull --take-remote <path> again for a path an earlier pull already resolved no longer fails with "is not a conflict". #14411

Windows

  • mise x and shims now run the original executable instead of its copy in .mise-bins, for tools installed with aqua symlink_bins, github filter_bins, or packslip. Programs that look for DLLs or data next to their own executable, such as exiftool, now start correctly. Tools installed by older versions need mise install --force to get this. A shell from mise activate that finds the copy on PATH still runs the copy. #14397
  • npm tools installed with the built-in aube installer are reinstalled if their dependency links are missing, for example after a CI cache restore drops NTFS junctions. Before, mise reported them as installed and they failed at run time with ERR_MODULE_NOT_FOUND. #14418

Tools and installs

  • rust@&#8203;nightly, mise ls-remote rust, and mise outdated/upgrade now read the nightly manifest from RUSTUP_DIST_SERVER, so a mirror such as panamax no longer needs access to static.rust-lang.org. If [env] sets RUSTUP_DIST_SERVER or RUSTUP_UPDATE_ROOT, mise also passes them to rustup-init and rustup toolchain install. #14384
  • With a global minimum_release_age, mise use --tool-option minimum_release_age=0s <tool> now installs the actual latest version instead of the version the global cutoff allows. #14398 (@​halms)
  • Upgrading a global npm tool that mise lock --global locked with a dependency graph now regenerates the graph for the new version, including with --bump. Before, the upgrade dropped the graph and the next mise install --locked failed. #14419 (@​altendky)
  • Reinstalling a packslip tool signed by a shared reusable workflow works again with its saved pin. In v2026.10.9, mise rejected the unchanged signer as "not a workflow of" the tool's repository. Signer, workflow or repository changes are still refused. #14408
  • Building Erlang from source now shows compiling with kerl while the build runs, instead of staying on verifying checksum. kerl's output now prints above the progress row instead of writing over it. #14391
  • mise prune now shows a progress line while it scans for unused versions, instead of printing nothing for what could be a long time. #14420
  • The JSON schema now rejects unknown keys in env._.python and its venv options, matching what mise already refused at load time. Editors now flag these mistakes. #14387 (@​JamBalaya56562, @​risu729)

Documentation

  • The configuration docs now explain how mise searches for config before listing the per-directory file names. #14390
  • The bootstrap overview and run order now include [bootstrap.apt.sources]. #14396

Full Changelog: jdx/mise@v2026.10.9...v2026.10.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.10.9: v2026.10.9: path: tool versions require trust; apt repositories, login items and run0/doas in bootstrap

Compare Source

This release fixes a trust bypass: an untrusted path: tool version could put a directory on PATH. It also adds several bootstrap features: apt repositories and PPAs, macOS login items, rpm-ostree layering on Fedora Atomic, and run0/doas support. Beyond that, it improves mise dot status, adds GitHub OAuth conveniences, and fixes problems across npm, prune, brew and dotfiles sync.

Security

  • path: tool versions now require trust. Before, an untrusted repository could ship node path:./local in .tool-versions or mise.toml. mise activate would then put ./local/bin ahead of your PATH on the next cd, without asking for trust, so a local/bin/git there would run in place of your real git. Configs with a path: version are now skipped until trusted, and you see the usual is not trusted, run mise trust warning. After mise trust, path: works as before. Other version forms are unaffected. Reported by Anthropic and Ada Logics. #14358
  • mise bootstrap --adopt now rejects repository URLs that embed credentials (a user:TOKEN@&#8203; part). It used to quietly fall back to a plain clone, which left the token in .git/config. Use a Git credential helper or SSH agent. #14315
  • Download file names decoded from URLs (for example tool%2F..%2Fpwned.tar.gz, or C: names on Windows) can no longer point outside the download directory. Ordinary escapes such as %20 still decode. #14274 (@​JamBalaya56562, @​hktitof)

Added

Bootstrap

  • [bootstrap.apt.sources] declares PPAs and vendor apt repositories next to the packages that come from them. You no longer need a pre-packages hook that runs add-apt-repository. Each source is written as a deb822 file at /etc/apt/sources.list.d/mise-<name>.sources. Its signing key is fetched, trimmed to the fingerprints you declared, and stored inline in that file, so deleting the file removes both the repository and its key. PPAs need only ppa = "owner/name" and are added only on Ubuntu and Ubuntu-based distros, so the same config also works on Debian. Other repositories need uris, key and fingerprint; suites and components are optional. An unpinned apt: package that is installed from the distro is moved to the declared source. Inline keys require apt 2.4 or later (Ubuntu 22.04, Debian 12). #14306, #14348

    [bootstrap.apt.sources]
    git-core = { ppa = "git-core/ppa" }
    fish = { ppa = "fish-shell/release-4" }
    
    [bootstrap.packages]
    "apt:git" = "latest"
    "apt:fish" = "latest"
  • macOS login items. [bootstrap.macos.login_items] declares the apps listed under "Open at Login". status and plan report missing apps, and mise bootstrap adds them. The list is additive by default, so apps that register themselves are left alone. Set exclusive = true to have the config own the whole list. #14354

    [bootstrap.macos.login_items]
    apps = ["/Applications/Ghostty.app", "~/Applications/Example.app"]
  • Fedora Atomic hosts. On ostree-booted hosts (Silverblue, Bazzite, secureblue, ...), dnf: installs now stop with an explanation instead of failing inside dnf on read-only /usr. To layer packages instead, set system_packages.ostree = "layer". mise then runs one rpm-ostree install for the whole batch and reports layered packages as pending reboot until you reboot. Version pins are skipped, and upgrade points you to rpm-ostree upgrade. #14353, #14357

  • run0 and doas for privilege elevation. On hosts without sudo, mise uses the first of sudo, run0 or doas it finds on PATH. To always use a specific one, set system_packages.elevate_with (or MISE_SYSTEM_PACKAGES_ELEVATE_WITH), for example "run0". #14351

  • dnf package groups. Entries such as "dnf:@&#8203;development-tools" = "latest" are now installed, upgraded and checked as groups. Before, status always reported them as missing. Environment groups (@&#8203;^name) are not supported. #14347

  • Templated [bootstrap.repos] paths. Repo keys can use templates, so each machine can choose its own clone location with a var answered once through mise vars prompt. Unanswered vars use their default. #14359

    [vars.repos_dir]
    default = "~/src"
    prompt = "Where should repositories be cloned?"
    
    [bootstrap.repos]
    "{{ vars.repos_dir }}/project-a" = { url = "git@&#8203;github.com:example/project-a.git" }

Tools and backends

  • libc() and avx2() template functions for http: URLs. They let one entry pick -musl and no-AVX2 -baseline builds: append {{ avx2(yes="", no="-baseline") }}{{ libc(gnu="", musl="-musl") }} to the url template after {{ os() }}-{{ arch() }}. mise lock records every variant. #14298
  • PyPI Simple indexes: when pypi.registry_url is not a /json URL, mise now asks for the PEP 691 JSON format. If the index supports it, upload times come from the index, so minimum_release_age now works with private indexes. HTML-only indexes behave as before. #14352
  • Rust mirrors: when RUSTUP_UPDATE_ROOT is set, rustup-init is downloaded from {root}/dist/<host-triple>/rustup-init instead of sh.rustup.rs. This lets mirrors such as panamax serve the first download too. mise also forwards RUSTUP_DIST_SERVER and RUSTUP_UPDATE_ROOT from config env to rustup. #14356

GitHub OAuth

  • github.oauth_copy_code copies the one-time device code to the clipboard during mise token github --oauth, like gh auth login --clipboard. When the setting is unset, mise asks in an interactive terminal. Only the device code is copied, never the token. #14269

  • github.oauth_cache_get and github.oauth_cache_set keep the long-lived refresh token in a password manager or keychain, so the plaintext cache file holds only the 8-hour access token. Both settings must be set and can only go in global config. An existing cached refresh token moves into the store at the next refresh. If the store can't be read, mise keeps the cached token. If it can't be written, mise warns and keeps the token in the file. #14360

    [settings.github]
    oauth_cache_get = "pass show mise/github-oauth"
    oauth_cache_set = "pass insert -m -f mise/github-oauth"

Dotfiles and skills

  • mise dot status output is grouped into sections: Tracking, Repository, Conflicts, Automatic capture and Bootstrap, followed by a "Next steps" list of commands. The table now lists only entries that need attention and counts the rest. Use --verbose/-v to list every entry. --json and --missing are unchanged. #14361
  • mise dot status now shows tracked entries whose variants don't match this machine as not on this machine (variants: work), instead of plain tracked. In --json, state stays tracked and a reason field is added. #14266
  • mise skills sync now lists the skill links it creates, plus .mise-skills.json, in the repository's .git/info/exclude, so they stay out of git status. Your hand-written skills are unaffected, and nothing in the repository itself changes. #14374

Changed

  • Registry: opencode now installs OpenCode 2 from npm (npm:@&#8203;opencode/cli). opencode@&#8203;latest moves to v2 on your next upgrade. opencode@&#8203;1 keeps v1 from aqua. #14295
  • Go: if go.mod or go.work has an exact go X.Y.Z line and no toolchain line, mise now uses it as the toolchain version and no longer shows the deprecation warning. This matches how Go reads the file. The old advice to add a toolchain line didn't work, because go mod tidy removes it. go X.Y lines without a patch version are still deprecated. #14308
  • The official -debian Docker image now includes libatomic1, so Node.js 26 installs and runs without extra steps. #14303

Fixed

Tools, shims and updates

  • auto_update now updates only tools that are already installed. Since 2026.10.7, the first shell prompt could install every lazy tool declared with auto_update. #14368 (@​ryanrhughes)
  • Downloads started by mise exec, mise x and shims now retry up to http_retries, like mise install. Before, they made a single attempt. Remote version lookups still make one attempt, so shims don't get slower. #14342
  • npm tools installed from a lockfile in one project no longer show up as missing, or as <version>~aube~<digest>, in another config that requests latest or a version prefix without a lockfile. With install_layout = "identity", unlocked requests get their own plain install, separate from the project's lockfile-built one. The same applies to uv-locked pipx tools. #14307, #14309
  • mise prune no longer removes tool versions used only by inline task tools. It also keeps a uv-locked pipx:/pypi: tool's installs for every Python version, not just the one in the current directory. #14334, #14335
  • Running reshim in one project no longer deletes [wrappers] command wrappers defined in other projects. #14355
  • With skills.auto_sync, mise upgrade now relinks agent skills to the new version. Before, the links kept pointing at the replaced install, which prune could then delete. #14373
  • Remote tasks no longer break commits when they are fetched from a git hook. Their clone was writing over the commit's index (GIT_INDEX_FILE). Fixed by updating gix to 0.89. #14316 (@​any-victor)
  • Packslip tools whose signing workflow moved, such as aube moving from release-plz.yml to release.yml, now upgrade when both workflows are in the workflow list. mise lock also keeps the signer of a renamed or transferred project. #14338, #14362
  • aqua packages that have no repo now print the "cannot list versions" warning once, and it tells you to pin an exact version. #14336
  • On Windows, the tool-update service no longer opens a console window that stops the updater when you close it. #14344

Homebrew and system packages

  • Brew bottles now install their etc/var files and run the formula's post_install_steps. For example, openssl@&#8203;4 now gets its CA bundle and openssl.cnf. Existing files are kept, and the bottle's copy is saved next to them as .default. Protected copy steps (overwrite: false) are respected. #14272, #14311
  • On Linux, Homebrew uses_from_macos dependencies are now installed. This fixes runtime errors such as libbz2.so.1.0 missing for brew:chafa. #14288 (@​itskyf)
  • mise bootstrap no longer runs chown on a Homebrew prefix owned by another non-root user. It stops with an explanation instead. #14345
  • Casks that mise evaluates itself now support the generate_completions_from_executable stanza. #14255 (@​pmmmwh)
  • mise oci build no longer runs the host's apt hooks against the image. Those hooks broke non-root builds that install packages such as cmake. #14296
  • When elevation is unavailable, mise no longer tells you to run privileged helpers that read their plan from stdin, because they can't run on their own. It now tells you to re-run the mise command as root. #14350

Dotfiles

  • When another machine had saved a profile-variant file while that profile was inactive here, turning the profile on no longer publishes a deletion or reverts the shared file. Status reports it as not applied here, and mise dot pull applies it, or stops with a conflict that you resolve with --take-remote or --keep-local. #14275
  • After mise bootstrap --adopt, unchanged encrypted files reuse the ciphertext already in history. Before, they were re-encrypted, and mise dot sync paused on a conflict. #14300
  • When /home is a symlink (Fedora Atomic), adopting now restores config/ entries, and mise dot origin set no longer shows a false "Not portable" warning. #14315
  • mise dot apply applies entries that write mise's own config first, then plans everything else from the new config. A newly added entry now takes effect in a single run. #14339
  • mise dot diff now shows per-file hunks, missing files and type mismatches for directory copy entries. #14333

Schema

  • The JSON schema now accepts [bootstrap.secrets], [bootstrap.groups], [bootstrap.users], and table forms of vars._.file and vars._.source. Editors and linters such as tombi and Taplo no longer flag configs that mise accepts. #14322, #14340, #14383 (@​JamBalaya56562, @​risu729)

Documentation

  • New guidance on when to use mise bootstrap --from versus --adopt, why fish = "auto" is recommended for fish activation, when to use mise dot sync, pull and apply, and how to check from a shim whether a tool is installed. #14301, #14304, #14343, #14337

Upgrade notes

  • If an untrusted project uses a path: tool version, run mise trust in it.
  • Scripts that parse the default table from mise dot status should add --verbose or switch to --json.
  • opencode@&#8203;latest moves to OpenCode 2. Pin opencode@&#8203;1 to stay on v1.
  • mise bootstrap --adopt with a URL that contains credentials now fails. Use a credential helper or SSH agent instead.

Registry

New Contributors

  • @​pmmmwh made their first contribution in #14255
  • @​itskyf made their first contribution in #14288

Full Changelog: jdx/mise@v2026.10.8...v2026.10.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.

jdx/mise-action (jdx/mise-action)

v5.2.1: v5.2.1: Require the signed packslip for mise 2026.9.3 and later

Compare Source

The action now refuses to install mise 2026.9.3 or later if the release's signed packslip is missing. This closes a gap where verification could be downgraded to the weaker checksum check.

Fixed

  • A missing packslip no longer weakens the check on recent mise releases. v5.2.0 started checking the mise binary against the release's signed packslip.sigstore.json. If that file wasn't found, though, the action quietly fell back to the minisign-signed SHASUMS256 checksums. Anyone who could hide the file could force the weaker check. Every mise release from 2026.9.3 on includes a packslip, so for those versions a missing bundle now stops the install with an error like this:
    mise v2026.10.11 must ship a signed packslip, but https://github.com/jdx/mise/releases/download/v2026.10.11/packslip.sigstore.json was not found
    
    Releases before 2026.9.3 don't include a packslip, so they're still checked against the signed checksums. A version string that isn't three dot-separated numbers also requires a packslip. If you set the sha256 input, it still takes precedence over both checks. A packslip that fails verification still never falls back to the checksums. (#695 by @​jdx)

Full Changelog: jdx/mise-action@v5.2.0...v5.2.1

v5.2.0: v5.2.0: Periodic cache rebuilds, signed packslip verification, and monorepo installs

Compare Source

The default cache key now rolls over every 30 days, so long-lived caches pick up newer mise releases. The action also checks the downloaded mise binary against the release's signed packslip, and it runs mise install --monorepo automatically in monorepos. Existing caches miss once after you upgrade, because the default cache key format has changed.

Added

  • The cache is rebuilt every 30 days by default. GitHub never evicts a cache that keeps getting hits. Before this release, an active repo could keep the same mise binary and tools for months, until a config file changed. The default cache key now includes a period suffix (-p<N>), so the cache is rebuilt from scratch at least once per period. All repos roll over on the same calendar boundary. Use the new cache_max_age_days input to change the period, or set it to 0 to keep the old key that never expires. Custom cache_key templates can use the new {{cache_period}} variable, which {{default}} already includes. A custom key that doesn't use it behaves as before. On self-hosted runners that keep mise data between runs, you may also need auto_update: true to pick up a newer mise. (#689 by @​jdx, fixes #688)
    - uses: jdx/mise-action@&#8203;v5
      with:
        cache_max_age_days: 14 # default 30; 0 disables periodic rebuilds
  • Throttled cache restores and saves can be retried. Before this release, when GitHub's cache service returned HTTP 429, the action gave up right away: a restore counted as a miss and a save was skipped. The new cache_restore_retry_budget and cache_save_retry_budget inputs set how long the action may wait. Each retry waits for the Retry-After value plus some random jitter. Once the budget runs out, the action falls back to the old behavior. Retries apply to the main cache, the post-step save and the binary cache. Real cache misses and reservation conflicts are never retried. Both budgets default to 0s (no retries). @&#8203;actions/cache doesn't report 429 errors directly, so the action detects throttling from its warning messages. If those messages change in a future @&#8203;actions/cache release, throttling won't be detected and nothing will be retried. (#692 by @​jdx, fixes #691)
    - uses: jdx/mise-action@&#8203;v5
      with:
        cache_restore_retry_budget: 60s
        cache_save_retry_budget: 120s
  • The latest mise binary can fall back to a second download source. When the action downloads the latest mise version, it can fall back between GitHub and mise.jdx.dev if the first source fails. The fetch_from_github setting decides which source it tries first. Pinned versions and minimum_release_age installs are only downloaded from GitHub. The binary is still checked against the signed checksums for the resolved version, whichever source it came from. (#692 by @​jdx)
  • The mise binary is checked against its signed packslip. If a mise release includes packslip.sigstore.json, the action checks the downloaded binary against it. The bundle must be signed by mise's release workflow for that exact tag. After a successful check, the log shows Verified <asset> against the signed packslip. If the check fails, the install stops instead of falling back to a weaker check. Releases without a packslip use the existing minisign and SHASUMS256 check. An explicit sha256 input still takes precedence. (#693 by @​jdx)
  • Monorepo-aware installs. If your mise config sets [monorepo].config_roots, the action now adds --monorepo to mise install, so tools configured anywhere in the monorepo get installed. Repos without that setting aren't affected. To opt out, set monorepo: false. (#679 by @​zeitlinger)

Fixed

  • Tool directories that mise moves to the front of PATH are now exported. The action used to find mise's PATH changes by comparing mise's PATH with the runner's. If a tool's bin directory was already on the runner's PATH, such as ~/.cargo/bin, mise only moved it to the front, so the action didn't export it. Later steps then found the mise shim first. For example, rustup resolved to the shim instead of ~/.cargo/bin/rustup. The action now asks mise for its entries with mise env --paths and exports them in the order mise reports. This fix needs a mise version that supports --paths. With older versions, the action uses the old comparison. (#685 by @​jdx)

Documentation

  • The new "Release workflows" section of the README says that jobs that publish releases shouldn't restore caches. A lower-trust workflow that can write to default-branch caches could otherwise slip files into a release. In those jobs, use cache: false or GitHub's cache-mode: none. (#682 by @​jdx)
  • The README explains how to cache mise's downloads, keyed on mise.lock, instead of installed tools. It includes a Windows example that sets MISE_CACHE_DIR from ${{ runner.temp }}, because actions/cache doesn't expand %TEMP%. (#686, #690 by @​zeitlinger)

Breaking Changes

  • The default cache key has a new format, so the first run after upgrading is a cache miss and saves a fresh cache. After that, the cache is rebuilt every 30 days by default. To keep the old cache key that never expires, set cache_max_age_days: 0. Workflows that set a custom cache_key without {{default}} or {{cache_period}} aren't affected.

Full Changelog: jdx/mise-action@v5.1.2...v5.2.0

v5.1.2: v5.1.2: mise_dir now sets MISE_DATA_DIR; auto_update handles a locked mise binary

Compare Source

The mise_dir input now also sets where mise installs tools, so those tools end up in the cache. With auto_update: true, the action no longer crashes on Windows when the mise binary is still in use.

Fixed

  • mise_dir now exports MISE_DATA_DIR. Before this release, mise_dir moved the mise binary and the cache path, but mise kept installing tools to ~/.local/share/mise. The saved cache didn't include the tools. On runners where ~/.local isn't writable, the step failed with EACCES: permission denied. When mise_dir is set, the action now exports MISE_DATA_DIR=<mise_dir>, so tools are installed into the directory that gets cached. If your workflow sets a different MISE_DATA_DIR, the mise_dir input overrides it. If mise_dir isn't set, nothing changes. mise's state directory (~/.local/state/mise) stays where it is. If that path also can't be written, set MISE_STATE_DIR yourself. (#672 by @​jdx, fixes #668)
    - uses: jdx/mise-action@&#8203;v5
      with:
        mise_dir: ${{ runner.tool_cache }}/mise/data
  • auto_update no longer crashes when it can't replace mise.exe. On Windows, the step used to fail with a bare EPERM: operation not permitted, unlink '…\mise.exe' if another process was still using the binary. Now, if version isn't pinned and the existing binary passes verification against its recorded version, the action prints a warning and continues with that version. In any other case, the step fails with a message that says the file is in use and how to fix it. A pinned version never quietly keeps an older binary. (#665 by @​jdx, fixes #664)

Documentation

  • The README explains how to use mise's MISE_ENABLE_TOOLS setting as a job-level allowlist. Unlike install_args, the allowlist applies to the action's install and to later mise commands. If jobs use different allowlists, add the value to a custom cache_key. (#667 by @​zeitlinger)
  • The Rust cache section is updated for mise 2026.9.2 and later, where mise install repairs a restored toolchain instead of leaving rustfmt missing. Swatinem/rust-cache now works alongside mise-managed Rust. (#670 by @​jdx)

Full Changelog: jdx/mise-action@v5.1.1...v5.1.2

Skipped Packages

Non-GitHub Sources

@renovate
renovate Bot force-pushed the renovate/github-actions branch from 31715aa to e34311b Compare October 23, 2026 16:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants