jdx/mise · error

the packslip gives no download URL for {}

Error message

the packslip gives no download URL for {}

What it means

This error is thrown by mise's packslip backend during `install_payload` after requirements checks pass but the resolved packslip artifact has no download URL (`artifact.url` is None). A packslip manifest must point at a concrete downloadable artifact; if the signer's manifest omits the URL for this artifact, mise cannot proceed with the download. It is an invariant check on the manifest data before any network fetch happens.

Source

Thrown at src/backend/packslip.rs:1232

        if vfox_plugin {
            crate::plugins::packslip::validate_artifact(&artifact)?;
        }
        let mut commands = BTreeMap::new();
        if let Some(req) = &artifact.requires {
            for bin in &req.bin {
                // Spawnable, not merely present: the probe below runs the
                // path with `--version`, so a shebang-only script or a `.ps1`
                // would be chosen and then fail to start.
                if let Some(path) = ctx.ts.which_bin_spawnable(&ctx.config, &bin.name).await {
                    commands.insert(bin.name.clone(), path);
                }
            }
        }
        crate::packslip_requirements::check(&artifact, &commands)
            .await
            .enforce(raw_opts.get("ignore_requirements") == Some("true"))?;
        let Some(url) = artifact.url.clone() else {
            bail!("the packslip gives no download URL for {}", artifact.name);
        };
        if !file::is_plain_file_name(&artifact.name) {
            bail!(
                "the packslip names an artifact {:?}, which is not a plain file name",
                artifact.name
            );
        }
        let file_path = tv.download_path().join(&artifact.name);
        ctx.pr.next_operation();
        ctx.pr.set_message(format!("download {}", artifact.name));
        HTTP.download_file_with_headers(
            &url,
            &file_path,
            &headers_for(&url)?,
            Some(ctx.pr.as_ref()),
        )
        .await?;

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Update the packslip manifest/version: run `mise ls-remote packslip:<project>` and install a newer version whose manifest includes the download URL (`mise use packslip:<project>@<newer-version>`).
  2. Check the upstream signed manifest for the artifact matching your platform; if the URL is missing upstream, report it to the project publishing the packslip.
  3. Clear any cached manifest and retry (`mise cache clear`), then `mise install` again to re-fetch a fresh manifest.
  4. As a workaround, switch the tool to another backend (e.g. `mise use aqua:owner/repo` or `mise use github:owner/repo`) that publishes release assets directly.

Example fix

// before (mise.toml)
[tools]
mytool = "packslip:owner/repo@1.2.2"

// after — move to a version whose packslip carries the artifact URL
[tools]
mytool = "packslip:owner/repo@1.2.3"
Defensive patterns

Strategy: validation

Validate before calling

// before install, verify the manifest has a URL for your platform
const hasUrl = artifact && typeof artifact.url === 'string' && artifact.url.startsWith('http');
if (!hasUrl) throw new Error(`packslip artifact ${artifact?.name} has no download URL; pick another version`);

Type guard

function hasDownloadUrl(a) { return typeof a === 'object' && a !== null && typeof a.url === 'string' && a.url.length > 0; }

Try / catch

try { await $`mise install` } catch (e) { if (String(e).includes('gives no download URL')) { /* fall back to aqua/github backend or newer version */ } else throw e; }

Prevention

When it happens

Trigger: Calling `mise install` (or `install_version_` -> `install_payload`) for a tool resolved through the packslip backend where the downloaded/verified packslip manifest contains an artifact entry whose `url` field is null or missing. The `let Some(url) = artifact.url.clone() else` guard fails exactly then.

Common situations: A packslip manifest published upstream was malformed or newly changed and dropped the URL; a pinned manifest version lacks an artifact for the current platform; a proxy/mirror serves a truncated manifest; a typo'd or outdated packslip reference resolves to the wrong manifest.

Understand the failure class

Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.

Related errors


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