jdx/mise · error
{} was not installed from a packslip, so mise does not know
Error message
{} was not installed from a packslip, so mise does not know its completions What it means
mise can only supply completions for a tool it installed from a signed packslip, because the completion sources are read from the packslip statement stored inside the install directory. If no statement file exists at the tool version's install path, mise has no knowledge of the tool's completions and bails with this message naming the styled tool@version.
Source
Thrown at src/packslip.rs:1152
bail!("invalid completion cache identity");
}
Ok(install_path
.join(RESOURCES_DIR)
.join("completions-v2")
.join(bin)
.join(format!("{shell}.completion")))
}
pub(crate) async fn completion_script(
config: &Arc<Config>,
tool: &str,
shell: &str,
) -> Result<String> {
let ts = config.get_toolset().await?;
let (backend, tv) = find_tool(config, ts, tool).await?;
let install_path = tv.install_path();
let Some(statement) = statement(&install_path)? else {
bail!(
"{} was not installed from a packslip, so mise does not know its completions",
tv.style()
);
};
let artifact = selected_artifact(
&statement,
tv.request.options().get_string("variant").as_deref(),
);
let sources = completion_sources(
&statement,
&install_path,
shell,
artifact.as_ref(),
Some(tool),
);
if sources.is_empty() {
if declares_completion(&statement, shell) {
bail!(View on GitHub (pinned to afd2eddd3a)
Solutions
- Reinstall the tool so it comes from a packslip-backed source: `mise install <tool>` after ensuring the registry entry resolves to a packslip publisher.
- Check that the statement file still exists under the tool's install directory; if missing, reinstall that version.
- Generate the completion manually with the tool's own command (e.g. `<tool> completions <shell>`) and source it in your shell config instead.
Example fix
// before: plugin-installed tool, no packslip mise use github:owner/tool # non-packslip backend // after mise use <tool> # registry entry backed by a packslip publisher mise install <tool>
Defensive patterns
Strategy: fallback
Validate before calling
let has_statement = install_path.join("packslip-statement").exists(); // or via mise packslip show
if !has_statement { eprintln!("{tool} is not packslip-installed; completions unavailable via mise"); } Type guard
fn is_packslip_installed(install: &Path) -> bool { statement(install).map(|s| s.is_some()).unwrap_or(false) } Try / catch
match completion_script(&config, tool, shell) {
Ok(s) => Some(s),
Err(e) if e.to_string().contains("not installed from a packslip") => tool_native_completions(tool, shell),
Err(e) => return Err(e),
} Prevention
- Install tools from packslip-backed registry entries if you want mise-managed completions.
- Fall back to the tool's own `completions` subcommand for non-packslip backends.
- Reinstall tools that predate packslip support in mise.
When it happens
Trigger: Running `mise completion <shell> --tool <tool>` for a tool installed via a non-packslip backend (asdf/vfox plugin, github release without packslip, cargo, npm, core plugin) so statement(&install_path) returns None.
Common situations: Tab-completing a tool installed by an older mise before packslip support, or installed from a plugin backend; a corrupted install where the packslip statement file was deleted.
Understand the failure class
Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.
Related errors
- mise cannot derive completions from a {format} spec
- invalid completion cache identity
- the packslip of {} declares a {shell} completion, but none o
- the packslip of {} declares no {shell} completion
- cli-spec entry names {bin:?} in format {format:?}
AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09).
Data as JSON: /api/errors/411e27c1bcbd1eac.
Report an issue: GitHub.