Repository navigation
2026.9.7: exec reports a global-config npm: tool as 'missing' right after 'already installed' whenever the project has lockfile = true #13184
Replies: 2 comments
|
seems like a major bug, working on a fix now, but I suspect |
|
Correction to my wording above: The bug is that the new embedded-aube graph path did not follow the separate, existing lockfile-target policy. Since #8707, automatic lockfile maintenance excludes global tool sources, and #11746 kept missing global lockfiles explicit via #13186 now aligns automatic graph creation with that target policy without changing settings scope. Revision 2 global lockfiles that actually contain the npm tool still require and replay their stored graph. Until the fix ships, Thanks for the detailed isolation—it identified the source/lockfile-target boundary precisely. AI-assisted — Tool: Codex; model: openai/gpt-5; version: unavailable. |
Uh oh!
There was an error while loading. Please reload this page.
Summary
Since 2026.9.7, when a project has
lockfile = trueand a committedmise.lock, everymise exec(andmise install --dry-run) reports annpm:tool that is pinned only in the global config (~/.config/mise/config.toml) asmissing, immediately after saying it isalready installed:The tool is installed and resolvable (
mise which xcodebuildmcp→.../installs/npm-xcodebuildmcp/2.7.0/node_modules/.bin/xcodebuildmcp,mise ls --json→installed: true, active: true). 2026.9.6 and 2026.9.5 are silent on the same machine and config. Exit codes are unaffected; the warning and the install pass repeat on everyexec.Environment
~/.config/mise/config.tomlpins"npm:xcodebuildmcp" = "2.7.0"(global only)mise.tomlpins other tools (node, gh, gitleaks, osv-scanner, …), has[settings] lockfile = true,minimum_release_age = "1d", committedmise.lockat lockfile version 0auto_install = true,exec_auto_install = true,not_found_auto_install = trueWhat I measured (isolating the cause)
WARN missingexec;install --dry-runalso singles the tool outMISE_EXEC_AUTO_INSTALL=0MISE_LOCKFILE=0mise install npm:xcodebuildmcp@2.7.0under 9.7 (creates2.7.0~aube~<hash>/, repointslatest/2/2.7)mise lock(version 0 rewrite) under 9.7mise lock --upgrade(lockfile version 2 +.mise/locks/sidecar)mise.tomlso it gets a[[tools."npm:xcodebuildmcp"]]entry inmise.lockinstall --dry-run→ "all tools are installed"Other global-only tools on the same machine (aqua/github/core backends: ollama, topgrade, uv, deno, ruby, periphery, yt-dlp, llama.cpp) never trigger it — only the
npm:backend tool does.Expected
A tool that comes from the global config and is installed should not be reported
missingbecause the project lockfile has no entry for it. Either the lockfile check should scope itself to tools declared by the config the lockfile belongs to, or a global-config npm tool absent from the project lock should be a no-op (as in 2026.9.6), not a per-exec warning plus an install pass.Likely origin
The behaviour appears with the lockfile revision 2 / npm dependency-graph work in 2026.9.7 (#13131, #13146: npm graphs recorded via embedded aube and replayed with a frozen install). The
execpath seems to ask the project lockfile for the npm tool's graph, finds none (the tool is not declared in that config), and reports the lock entry as missing using the wordmissing— whilewhich/lsresolve the install directory and are satisfied.Workaround
Declare the npm tool in the project
mise.tomlas well (it then gets a lock entry and the warning disappears), or setMISE_LOCKFILE=0for that invocation. We chose to stay on 2026.9.6 until this is addressed, because duplicating a global pin into the project lock changes our pin topology andMISE_LOCKFILE=0disables the supply-chain check we rely on.Happy to test a fix build on this machine.
Where it appears to come from (read from the v2026.9.7 tag)
mise execcollects tools throughlist_missing_versions_for_install→ backendis_install_satisfied(src/toolset/mod.rs). For embedded aube,is_install_satisfiedrejects a request that carries noaube_lockwhen the request was not resolved from a lockfile and explicit lockfile creation is enabled (lockfile = true). A tool pinned only in the global config is never resolved from a lockfile, and an ordinary install deliberately does not create an absent global lockfile (that needsmise lock --global), so every fresh process produces a graph-less request again: "already installed" (physical dir present) followed by "missing" (graph binding absent), andinstall --dry-runkeeps scheduling it.whichsearches physically installed versions andlsusesis_version_installed, which is why both stay satisfied. Possibly related: #13168 (pypi tools after 2026.9.7).mise doctor(2026.9.7 candidate binary)All reactions