{"record":{"id":"06886a80a9b7fe15","repo":"jdx/mise","slug":"no-usable-shell-completion-for","errorCode":null,"errorMessage":"no usable {shell} completion for {}: {}","messagePattern":"no usable (.+?) completion for (.+?): (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/packslip.rs","lineNumber":1572,"sourceCode":"            }\n        };\n        match attempt {\n            Ok(script) if script.trim().is_empty() => {\n                skipped.push(\"nothing was printed\".to_string())\n            }\n            Ok(script) => {\n                if ran_tool\n                    && let Some(dir) = cache.parent()\n                    && file::create_dir_all(dir).is_ok()\n                {\n                    let _ = file::write_atomic(&cache, &script);\n                }\n                return Ok(script);\n            }\n            Err(err) => skipped.push(err.to_string()),\n        }\n    }\n    bail!(\n        \"no usable {shell} completion for {}: {}\",\n        tv.style(),\n        skipped.join(\"; \")\n    )\n}\n\n/// Take turns generating, so that of the shells completing one command at\n/// once the first runs the tool and the rest read what it cached. The lock\n/// lives beside the cache, shared by every process that shares the install,\n/// and is taken off the runtime's threads.\n///\n/// A read-only install cannot be locked and does not need to be: nothing\n/// will be cached there either, so each shell generates its own script\n/// rather than being refused a completion.\nasync fn lock_generation(cache: &Path) -> Option<fslock::LockFile> {\n    let lock_path = cache.with_extension(\"lock\");\n    let taken = tokio::task::spawn_blocking(move || -> Result<fslock::LockFile> {\n        if let Some(dir) = lock_path.parent() {","sourceCodeStart":1554,"sourceCodeEnd":1590,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/packslip.rs#L1554-L1590","documentation":"mise's packslip backend tries each registered completion source for a shell and collects every failure. When none yield a script, `completion_script` gives up with this error listing each source's failure reason. It means the tool's packslip manifest offers no completion script mise can render for that shell.","triggerScenarios":"Running `mise completion <shell> --tool <tool>` (or an install flow that fetches completions) for a packslip-installed tool where every candidate source errored — e.g. the manifest references a completion file that failed to download or a shell variant the manifest doesn't ship.","commonSituations":"Requesting completions for a shell the vendor doesn't publish (e.g. fish when only bash/zsh are shipped); offline or proxy-blocked downloads of completion assets; a malformed or stale packslip manifest pointing at missing assets.","solutions":["Check which shells the tool's packslip publishes and request one it ships (`mise completion bash --tool <tool>`)","Verify network access / proxy settings so the completion assets can download","Run with MISE_DEBUG=1 to see each skipped source's underlying error and address it (404, checksum, parse failure)","Generate completions with the tool itself and install them manually (e.g. `<tool> completions bash > ...`), or file an issue upstream for missing shell support"],"exampleFix":"// before\nmise completion fish --tool some-tool   # no usable fish completion\n// after\nmise completion bash --tool some-tool   # shell the packslip actually ships","handlingStrategy":"fallback","validationCode":"mise completion bash --tool <tool> --dry-run 2>/dev/null || echo 'no completions for this shell'","typeGuard":null,"tryCatchPattern":"match mise::packslip::completion_script(shell, tv) {\n    Ok(script) => install(script),\n    Err(e) => fallback_to_native_completions(tool, shell, e),\n}","preventionTips":["Check the tool's packslip manifest for supported shells before scripting completion setup","Prefer shells the vendor publishes (bash/zsh/fish) for packslip tools","Handle per-source skip reasons in logs (MISE_DEBUG=1) to catch asset download failures early"],"tags":["cli","completions","packslip","shell"],"backgroundTag":"empty-result-set","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}