jdx/mise · error

github.com/ has no release carrying ; mise installs from a…

Error message

github.com/{repo} has no release {} carrying {asset_name}; mise installs from a packslip and does not guess at release assets

What it means

mise located the requested version's tag in the GitHub repo but no release carries the asset file name expected from the packslip. Because packslip installs strictly from a signed manifest, mise will not guess among release assets and fails instead.

Solutions

  1. Check the GitHub release for that version and confirm the exact asset file name the packslip expects exists
  2. Report/fix the asset name mismatch in the packslip manifest so it matches the actual release asset
  3. Install a version/platform the vendor actually publishes (mise ls-remote or the release page)

Example fix

// before (manifest asset name)
asset = 'ripgrep-14.1.0-x86_64-linux.tar.gz'
// after — match the actual uploaded asset
asset = 'ripgrep-14.1.0-x86_64-unknown-linux-musl.tar.gz'
Defensive patterns

Strategy: fallback

Validate before calling

gh release view <version> --repo <owner>/<repo> --json assets -q '.assets[].name'  # confirm the expected asset exists before installing

Type guard

null

Try / catch

// catch and surface the missing asset to the user with the release URL
match install {
    Err(e) if e.to_string().contains("carrying") => eprintln!("asset missing; see https://github.com/{repo}/releases/tag/v{version}"),
    other => other?,
}

Prevention

When it happens

Trigger: locate_bundle (via verified_release/install_payload) scanning releases for r.assets matching asset_name at exactly tv.version, and no release at that tag contains an asset with that exact name — asset renamed, not attached, or wrong platform/file mapping in the manifest.

Common situations: Vendor renamed release assets (e.g. added/removed a target triple suffix); asset missing for the user's platform; vendor forgot to attach the file to the GitHub release; user is on an OS/arch the vendor does not publish.

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@533346cc37 (2026-09-17). Data as JSON: /api/errors/15cf727a91dcda0b. Report an issue: GitHub.

Appendix: source

Thrown at src/backend/packslip.rs:863

        pin: &Pin,
        opts: &PackslipOptions<'_>,
    ) -> Result<Located> {
        if let Some(located) = self.vendor_entry(project, tv, pin, opts).await? {
            return Ok(located);
        }
        // No signed list names the manifest, so the release asset is the
        // only place left to find it. Only a GitHub project gets here.
        let asset_name = bundle_name(project);
        let repo = Self::repo(project)
            .ok_or_else(|| eyre!("packslip:{project} publishes no signed release list"))?;
        let releases = github::list_releases_including_prereleases(&repo).await?;
        let found = releases.iter().find_map(|r| {
            let asset = r.assets.iter().find(|a| a.name == asset_name)?;
            (tag_version(&r.tag_name, project).as_deref() == Some(tv.version.as_str()))
                .then_some(asset)
        });
        let Some(asset) = found else {
            bail!(
                "github.com/{repo} has no release {} carrying {asset_name}; mise installs from a packslip and does not guess at release assets",
                tv.version
            );
        };
        Ok(Located {
            // A private repository serves nothing at the browser URL, and the
            // asset's API endpoint is already in hand here.
            url: github::pick_reachable_asset_url(&asset.browser_download_url, &asset.url).await,
            digest: None,
        })
    }

    /// Fetch and verify the release manifest without downloading its artifact.
    /// Lock generation uses this to learn artifact URLs and signed digests for
    /// any target platform, while latest-version selection uses the same policy
    /// path to decide whether a candidate is eligible.
    async fn verified_release(
        &self,

View on GitHub (pinned to 533346cc37)