{"record":{"id":"ca09850ef59d4cc5","repo":"jdx/mise","slug":"packslip-tool-name-is-not-a-project-name-use-gi","errorCode":null,"errorMessage":"packslip:{tool_name} is not a project name; use github.com/owner/repo, owner/repo, or a host such as tool.example.com","messagePattern":"packslip:(.+?) is not a project name; use github\\.com/owner/repo, owner/repo, or a host such as tool\\.example\\.com","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/backend/packslip.rs","lineNumber":137,"sourceCode":"    .iter()\n    .map(|s| s.to_string())\n    .collect()\n}\n\n/// The packslip project name behind a tool name: `github.com/owner/repo`\n/// as given, `owner/repo` with github.com implied, or a vendor's host.\npub(crate) fn project_name(tool_name: &str) -> Result<String> {\n    let name = tool_name.trim_matches('/');\n    let first = name.split('/').next().unwrap_or_default();\n    let project = if first.contains('.') {\n        name.to_string()\n    } else {\n        format!(\"github.com/{name}\")\n    };\n    let forge_without_repo =\n        packslip::model::project_host(&project) == \"github.com\" && repository(&project).is_none();\n    if !packslip::model::valid_project(&project) || forge_without_repo {\n        bail!(\n            \"packslip:{tool_name} is not a project name; use github.com/owner/repo, owner/repo, or a host such as tool.example.com\"\n        );\n    }\n    Ok(project)\n}\n\n/// The release asset a project's packslip is published as.\nfn bundle_name(project: &str) -> String {\n    match repository_subpath(project) {\n        Some(sub) => format!(\"packslip.{}.sigstore.json\", sub.replace('/', \"-\")),\n        None => \"packslip.sigstore.json\".to_string(),\n    }\n}\n\n/// The signed release list of a project on its own domain.\nfn well_known_url(project: &str) -> String {\n    match project.split_once('/') {\n        Some((host, path)) => format!(\"https://{host}/.well-known/packslip/{path}.json\"),","sourceCodeStart":119,"sourceCodeEnd":155,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/backend/packslip.rs#L119-L155","documentation":"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.","triggerScenarios":"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).","commonSituations":"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.","solutions":["Use the fully qualified form: `packslip:github.com/owner/repo` (or `packslip:owner/repo`).","Use a custom host if releases live elsewhere: `packslip:tool.example.com/owner/repo`.","Check the tool's README for the exact packslip project identifier."],"exampleFix":"// before (mise.toml)\n[tools]\n\"packslip:mytool\" = \"1.0\"\n// after\n[tools]\n\"packslip:github.com/owner/mytool\" = \"1.0\"","handlingStrategy":"validation","validationCode":"const isValidPackslipName = (s) =>\n  /^(github\\.com|gitlab\\.com|[a-z0-9.-]+\\.[a-z]{2,})\\/[\\w.-]+\\/[\\w.-]+$/i.test(s) ||\n  /^[\\w.-]+\\/[\\w.-]+$/.test(s); // owner/repo shorthand\nif (!isValidPackslipName(name)) throw new Error(`use github.com/owner/repo or owner/repo: ${name}`);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write packslip refs as host/owner/repo or at minimum owner/repo.","Copy the project identifier verbatim from the upstream project's install docs.","Never shorten to a bare tool name like other registry backends allow."],"tags":["packslip","identifier","config"],"backgroundTag":"invalid-identifier-format","analyzedSha":"afd2eddd3a50c16190efc1c7e94404b48f72af57","analyzedAt":"2026-09-09T01:38:25.179Z","contentChangedAt":"2026-09-09T01:38:25.179Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}