{"record":{"id":"3b922332254d98f3","repo":"jdx/mise","slug":"the-packslip-gives-no-download-url-for","errorCode":null,"errorMessage":"the packslip gives no download URL for {}","messagePattern":"the packslip gives no download URL for (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/packslip.rs","lineNumber":1232,"sourceCode":"        if vfox_plugin {\n            crate::plugins::packslip::validate_artifact(&artifact)?;\n        }\n        let mut commands = BTreeMap::new();\n        if let Some(req) = &artifact.requires {\n            for bin in &req.bin {\n                // Spawnable, not merely present: the probe below runs the\n                // path with `--version`, so a shebang-only script or a `.ps1`\n                // would be chosen and then fail to start.\n                if let Some(path) = ctx.ts.which_bin_spawnable(&ctx.config, &bin.name).await {\n                    commands.insert(bin.name.clone(), path);\n                }\n            }\n        }\n        crate::packslip_requirements::check(&artifact, &commands)\n            .await\n            .enforce(raw_opts.get(\"ignore_requirements\") == Some(\"true\"))?;\n        let Some(url) = artifact.url.clone() else {\n            bail!(\"the packslip gives no download URL for {}\", artifact.name);\n        };\n        if !file::is_plain_file_name(&artifact.name) {\n            bail!(\n                \"the packslip names an artifact {:?}, which is not a plain file name\",\n                artifact.name\n            );\n        }\n        let file_path = tv.download_path().join(&artifact.name);\n        ctx.pr.next_operation();\n        ctx.pr.set_message(format!(\"download {}\", artifact.name));\n        HTTP.download_file_with_headers(\n            &url,\n            &file_path,\n            &headers_for(&url)?,\n            Some(ctx.pr.as_ref()),\n        )\n        .await?;\n","sourceCodeStart":1214,"sourceCodeEnd":1250,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/backend/packslip.rs#L1214-L1250","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["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>`).","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.","Clear any cached manifest and retry (`mise cache clear`), then `mise install` again to re-fetch a fresh manifest.","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."],"exampleFix":"// before (mise.toml)\n[tools]\nmytool = \"packslip:owner/repo@1.2.2\"\n\n// after — move to a version whose packslip carries the artifact URL\n[tools]\nmytool = \"packslip:owner/repo@1.2.3\"","handlingStrategy":"validation","validationCode":"// before install, verify the manifest has a URL for your platform\nconst hasUrl = artifact && typeof artifact.url === 'string' && artifact.url.startsWith('http');\nif (!hasUrl) throw new Error(`packslip artifact ${artifact?.name} has no download URL; pick another version`);","typeGuard":"function hasDownloadUrl(a) { return typeof a === 'object' && a !== null && typeof a.url === 'string' && a.url.length > 0; }","tryCatchPattern":"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; }","preventionTips":["Pin versions with known-good packslip manifests","Clear mise caches after upstream manifest changes","Prefer aqua/github backends when packslip manifests look incomplete"],"tags":["packslip","install","manifest","backend","rust"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}