mise now includes a language server, mise lsp, which gives editors diagnostics, completion, hover, navigation and quick fixes for mise.toml. Doctor checks can depend on other checks, and mise dot history purge erases a tracked file from dotfiles history. This release also fixes many lockfile, prune, Windows and dotfiles issues.
Added
-
mise lsp, a language server for mise config files. It runs over stdin/stdout, so any editor with an LSP client can use it (Neovim, Helix, Emacs, Zed, VS Code, ...). It uses the schema and formatter of the installed mise, so its answers match your version. #14744, #14808, #14811, #14812 (@jdx)- Diagnostics: TOML syntax errors, unknown keys with a "did you mean" suggestion, values of the wrong type, and deprecated keys. It warns about task references that point to no task and reports
dependscycles as errors. - Completion and hover: config keys and enum or boolean values, task names in
depends,depends_post,wait_for,run = [{ task = ... }]andextends, and tool names from the registry under[tools]. Hover shows the description and backends of a tool, or the description and command of a task. - Navigation and editing: go to a task's definition (also in included files), find its references, and rename a task together with every reference in the file. Quick fixes replace an unknown key or task name, and rewrite a deprecated key such as
env_pathto the key that replaces it. Formatting gives the same output asmise fmt. - It only handles files that mise loads as configs (
mise.toml,mise.<env>.toml,conf.d/*.toml, ...) and ignoresCargo.toml,pyproject.tomland other TOML files, so you can attach it to the TOML filetype. Configs are parsed but never rendered, and it makes no network requests, so opening an untrusted file runs nothing. Clients can turn offformatting,hover,completion,definition,referencesorrenamewithinitializationOptions.
vim.lsp.config("mise", { cmd = { "mise", "lsp" }, filetypes = { "toml" }, root_markers = { "mise.toml" } }) vim.lsp.enable("mise")
- Diagnostics: TOML syntax errors, unknown keys with a "did you mean" suggestion, values of the wrong type, and deprecated keys. It warns about task references that point to no task and reports
-
Doctor checks can depend on other checks. Add
depends(a single name or a list) to a check in[doctor.checks.*]. If a dependency fails, errors, is skipped or is blocked, the dependent check is reported asblocked, and its command and hint are skipped. Ablockedresult does not change the exit code on its own. An unknown dependency name or a cycle is reported as a config error, and then no checks run. #14773 (@jdx)[doctor.checks."examplectl:project"] depends = ["examplectl:auth"] run = 'test -n "$(examplectl config get project)"'
-
mise dot history purge <path>removes a tracked path from local dotfiles history. Use it after tracking a secret by mistake. Checkpoints that changed only that path are removed. All other checkpoints keep their numeric IDs, messages and dates, sohistory,rollbackandundokeep working. Use--dry-runto preview and--yesto skip the prompt.--backupkeeps the old history underrefs/mise/purge-backup/, and--keep-objectsskips pruning. The command refuses if any version of the path is already reachable from the origin, because mise never force-pushes. #14831 (@jdx) -
A dotfiles variant's
targetcan be a template, so one shared config can link into locations that differ between machines. Only the varianttargetis rendered. Templates get the standard config context (env,xdg_config_home,config_root, ...), butexec()andvarsare not available. The rendered path must be absolute or start with~/. #14856 (@jdx, @ponko2)[dotfiles.examplectl] source = "dotfiles/examplectl" mode = "symlink" variants = [{ default = true, target = "{{ xdg_config_home }}/examplectl" }]
-
mise upgrade --bump --pinwrites resolved versions to config. Requests such aslatestor20become the exact version, for example24.14.0, even if the tool was already up to date. With thepinsetting (MISE_PIN=1), a plainmise upgrade --bumpnow does the same.--dry-runshows what would change. #14791 (@jdx) -
[bootstrap.hooks]tables acceptrun_windows, as tasks and[hooks]already do. On Windows it is used instead ofrun. A table with onlyrun_windowsdoes nothing on other platforms. #14851 (@jdx) -
Registry:
goose-agent(aqua:aaif-goose/goose), the Goose AI agent CLI. The installed binary is still namedgoose. #14822 (@kwsantiago)
Changed
pinnow also affects a plainmise upgrade --bump. If you havepinenabled, your nextmise upgrade --bumprewrites non-exact requests such as"22"to exact versions such as"22.1.0". Withoutpin, requests keep their precision as before. #14791 (@jdx)mise unuse tool@versiononly prunes the version you named. It used to prune every unused version of the tool. If the named version is kept, mise now explains why, for examplenode@24.20.0 is kept: required by ~/proj/mise.toml.mise unuse nodewithout a version still prunes all unused versions of node. #14863 (@jdx, @Strepto)
Fixed
Lockfiles
- If a pipx tool selects its own Python (
python = "3.12"),mise use,mise up -l,mise lock pipx:...andmise lock pythonnow keep both that Python and the project's Python inmise.lock. Before, one entry was dropped andmise install --lockedfailed. #14794 (@jdx, @AllDmeat) mise install tool@latestno longer fails with "lockfile contains multiple resolutions" when nested configs pin different versions. The nearest lockfile now decides. #14818 (@jdx)- When a monorepo root config is in
.config/mise.toml, the shared lockfile is now written to.config/mise.lockinstead of<root>/mise.lock. #14860 (@jdx, @fxsalazar) mise lockforpipx:andpypi:tools now accepts PyPI simple indexes that respond with a PEP 691+htmlcontent type, such as Azure Artifacts. #14852 (@jdx, @alexanderlinne)- Locked conda installs reuse cached downloads whose checksum is known, instead of downloading the package again. #14866 (@zeitlinger)
Install, upgrade and prune
- A project-level
[hooks].postinstallnow runs with the version that was just installed. Before, duringmise upgradeof a fuzzy request such aslatest, itsPATHpointed at the old version. #14853 (@jdx, @sam9191) mise pruneno longer aborts with "points to an unknown mise Python installation" when a pypi/pipx tool's receipt reaches mise's Python through a minor-version link such aspython/3.14. #14857, #14874 (@jdx, @chancez)- With
MISE_OVERRIDE_TOOL_VERSIONS_FILENAMESset, tracked.tool-versionsfiles are still loaded. Before,mise prunecould remove versions that those projects still used. #14779 (@jdx) java = "latest"now selects the newest installed build when two installed versions differ only after+(for example+7and+101). #14876 (@jdx, @javabrett)gem:installs andbundle installno longer fail whenmiseis not onPATH. This applies to Rubies installed with this release or later. #14850 (@jdx, @fxsalazar)- packslip tools no longer warn on every
mise outdatedormise upabout skipping a version that is past theminimum_release_agecutoff when that version is already installed. #14835 (@jdx, @alx-xo) - Homebrew tap formulae that define their own
Requirementclasses no longer breakmise bootstrap packages apply. mise does not enforce these requirements and logs a warning about them. #14807 (@jdx) mise oci buildimages that includerustnow contain a workingcargoandrustc, withCARGO_HOMEandRUSTUP_HOMEset, so containers no longer download the toolchain again on first use. The build now fails if rust comes from a rustup that mise does not manage. #14854 (@jdx, @eiswind)
Network and backends
- In official rustls Linux builds, mise falls back to its bundled Mozilla root certificates, with a warning, when no system CA certificates can be loaded (for example in minimal containers, or when
SSL_CERT_FILEpoints to a missing file). Roots that do load are not changed. #14817 (@jdx) - GitHub assets now download correctly when
.netrchas credentials forgithub.com. The reachability check no longer sends those credentials, which had caused a fallback to the rate-limited API. #14786 (@jdx) github:tools for which mise-versions returned an empty release list (such asgithub:caarlos0/svu) now fall back to paged listing, so their versions are found. #14877 (@jdx)- Expired glab OAuth2 tokens are now ignored instead of sent. This fixes
401 Unauthorizederrors when installinggitlab:tools from public projects. #14873 (@jdx, @chung1905)
Windows
- Zip archives that contain read-only files, such as the Flutter SDK, now extract without "Access is denied". #14869 (@jdx, @akiWagashi)
- uv-locked
pipx:tools whose console script names end in.py(for examplepipx:clang-format) now install. #14825 (@jdx) - In tasks,
run_windows = []now skips the task on Windows instead of runningrun. #14859 (@jdx)
Tasks, bootstrap and generate
mise tasks listnow works as an alias formise tasks ls. If you have a task namedlist, that task still runs. #14878 (@jdx, @mcstafford-git)mise bootstrapno longer fails when a namespaced task such assystem:bootstrapexists but no task is named exactlybootstrap. #14858 (@jdx)mise generate install-script --writeandmise generate task-stubsnow write files that end with a newline. Existing stubs regenerate as before. #14819 (@itochan)curl https://mise.run | shno longer fails when~/.config/curlrcsetswrite-out. #14830 (@jdx)
Dotfiles
- A
mode = "track"entry declared in aconfig.<env>.tomlstays tracked on machines that don't select that env. Before, those machines published a removal of the entry. #14815 (@jdx) - One saved enrollment under a parent directory that is now a symlink no longer stops automatic capture for all other tracked paths. It is reported as invalid instead. #14871 (@jdx)
- The JSON schema now declares the keys of
[dotfile_groups.<name>.entries], so strict validators such as Tombi accept valid entries and report unknown keys. #14810 (@jdx)
Other
- The aqua registry built into mise is now encoded the same way on every build, so builds of the same source are reproducible. #14809 (@jdx)
Performance
- mise now checks
trusted_config_pathsafter the cheaper trust rules and resolves each entry at most once per process. This speeds uphook-envwhen entries are on slow mounts such as autofs/homeon macOS. #14875 (@jdx)
Documentation
- The dotfiles docs now explain repo-only files, how existing repos fit in, undoing an accidental track, and what
add --no-apply,dot diffandexcludedo. #14829, #14862 (@jdx)
New Contributors
- @kwsantiago made their first contribution in #14822
Full Changelog: v2026.10.17...v2026.10.18
💚 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.