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

  1. Reinstall the tool so it comes from a packslip-backed source: `mise install <tool>` after ensuring the registry entry resolves to a packslip publisher.
  2. Check that the statement file still exists under the tool's install directory; if missing, reinstall that version.
  3. 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

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


AI-assisted analysis of jdx/mise@afd2eddd3a (2026-09-09). Data as JSON: /api/errors/411e27c1bcbd1eac. Report an issue: GitHub.