jdx/mise · error

packslip:{tool_name} is not a project name; use github.com/o

Error message

packslip:{tool_name} is not a project name; use github.com/owner/repo, owner/repo, or a host such as tool.example.com

What it means

The packslip backend requires a fully qualified project name — a host (github.com, gitlab.com, or custom), owner, and repo. `project_name` validates the constructed project and bails when the name is not a valid project (missing owner/repo or missing host), because without it mise cannot resolve release manifests or pin a signer.

Source

Thrown at src/backend/packslip.rs:137

    .iter()
    .map(|s| s.to_string())
    .collect()
}

/// The packslip project name behind a tool name: `github.com/owner/repo`
/// as given, `owner/repo` with github.com implied, or a vendor's host.
pub(crate) fn project_name(tool_name: &str) -> Result<String> {
    let name = tool_name.trim_matches('/');
    let first = name.split('/').next().unwrap_or_default();
    let project = if first.contains('.') {
        name.to_string()
    } else {
        format!("github.com/{name}")
    };
    let forge_without_repo =
        packslip::model::project_host(&project) == "github.com" && repository(&project).is_none();
    if !packslip::model::valid_project(&project) || forge_without_repo {
        bail!(
            "packslip:{tool_name} is not a project name; use github.com/owner/repo, owner/repo, or a host such as tool.example.com"
        );
    }
    Ok(project)
}

/// The release asset a project's packslip is published as.
fn bundle_name(project: &str) -> String {
    match repository_subpath(project) {
        Some(sub) => format!("packslip.{}.sigstore.json", sub.replace('/', "-")),
        None => "packslip.sigstore.json".to_string(),
    }
}

/// The signed release list of a project on its own domain.
fn well_known_url(project: &str) -> String {
    match project.split_once('/') {
        Some((host, path)) => format!("https://{host}/.well-known/packslip/{path}.json"),

View on GitHub (pinned to afd2eddd3a)

Solutions

  1. Use the fully qualified form: `packslip:github.com/owner/repo` (or `packslip:owner/repo`).
  2. Use a custom host if releases live elsewhere: `packslip:tool.example.com/owner/repo`.
  3. Check the tool's README for the exact packslip project identifier.

Example fix

// before (mise.toml)
[tools]
"packslip:mytool" = "1.0"
// after
[tools]
"packslip:github.com/owner/mytool" = "1.0"
Defensive patterns

Strategy: validation

Validate before calling

const isValidPackslipName = (s) =>
  /^(github\.com|gitlab\.com|[a-z0-9.-]+\.[a-z]{2,})\/[\w.-]+\/[\w.-]+$/i.test(s) ||
  /^[\w.-]+\/[\w.-]+$/.test(s); // owner/repo shorthand
if (!isValidPackslipName(name)) throw new Error(`use github.com/owner/repo or owner/repo: ${name}`);

Prevention

When it happens

Trigger: Configuring a tool as `packslip:somerepo` or `packslip:owner` without a host prefix when the shorthand cannot be expanded, or a malformed name like `packslip:github.com/repo` (missing owner).

Common situations: Users writing `packslip:mytool` by analogy with other backends; forgetting the owner portion; assuming bare repo names work like the github: backend's owner/repo shorthand.

Understand the failure class

Background: "invalid id" errors: invalid identifier format — why libraries reject IDs before lookup, and how to fix them — this error's family across 37 libraries.

Related errors


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