{"record":{"id":"5d13f07b8fde6018","repo":"jdx/mise","slug":"workspace-project-id-value-must-include-a-prov","errorCode":null,"errorMessage":"workspace project ID {value:?} must include a provider namespace","messagePattern":"workspace project ID (.+?) must include a provider namespace","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/workspace.rs","lineNumber":57,"sourceCode":"\n    /// Returns the serialized project ID.\n    pub(crate) fn as_str(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl Display for ProjectId {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        Display::fmt(&self.0, f)\n    }\n}\n\nimpl FromStr for ProjectId {\n    type Err = eyre::Report;\n\n    fn from_str(value: &str) -> Result<Self> {\n        let Some((provider, local_id)) = value.split_once(':') else {\n            bail!(\"workspace project ID {value:?} must include a provider namespace\");\n        };\n        Self::new(provider, local_id)\n    }\n}\n\nfn validate_id_part(kind: &str, value: &str) -> Result<()> {\n    if value.is_empty() {\n        bail!(\"workspace {kind} ID cannot be empty\");\n    }\n    if value.trim() != value || value.chars().any(char::is_control) {\n        bail!(\n            \"workspace {kind} ID {value:?} contains surrounding whitespace or control characters\"\n        );\n    }\n    if kind == \"provider\" && value.contains(':') {\n        bail!(\"workspace provider ID {value:?} cannot contain ':'\");\n    }\n    Ok(())","sourceCodeStart":39,"sourceCodeEnd":75,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/task/workspace.rs#L39-L75","documentation":"Workspace ProjectId parses strings of the form 'provider:local_id' via FromStr. If the value has no ':' separator, there is no provider namespace, and the parser bails — every project ID must name its provider (e.g. github:owner/repo).","triggerScenarios":"Parsing a workspace project ID string like `owner/repo` or `myproject` (no colon) into ProjectId::from_str, e.g. from config, lockfiles, or CLI args describing workspace members.","commonSituations":"Hand-editing workspace config and omitting the provider prefix; older configs written before namespacing was required; scripts passing bare repo slugs; typos dropping the 'github:'/'gitlab:' prefix.","solutions":["Add the provider namespace: `github:owner/repo` instead of `owner/repo`","Check the documented provider names and use the exact `provider:local-id` format","Fix the config/lockfile entry that holds the bare ID","If generating IDs programmatically, always join provider and local id with ':'"],"exampleFix":"// before\nprojects = [\"owner/repo\"]\n// after\nprojects = [\"github:owner/repo\"]","handlingStrategy":"validation","validationCode":"[[ \"$PROJECT_ID\" == *:* ]] || echo \"project ID '$PROJECT_ID' needs a 'provider:local-id' form\"","typeGuard":null,"tryCatchPattern":"[[ \"$PROJECT_ID\" == *:* ]] || PROJECT_ID=\"github:$PROJECT_ID\"; mise run build","preventionTips":["Always prefix project IDs with their provider (github:, gitlab:)","Validate workspace config entries after hand edits","Update configs from pre-namespacing formats","Centralize ID construction so ':' join is never skipped"],"tags":["workspace","parsing","identifier"],"backgroundTag":"invalid-identifier-format","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}