{"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/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/task/workspace.rs#L39-L75","documentation":"Workspace ProjectId values are namespaced as `provider:local_id` (e.g. `npm:@scope/pkg` or `cargo:my-crate`). FromStr requires a `:` separator; a value without one cannot be split into provider and local parts, so parsing bails. This enforces that every project ID carries its ecosystem provider namespace.","triggerScenarios":"Parsing a project ID string via ProjectId::from_str (or config/spec input that flows into it) where the string has no `:`, e.g. \"myproject\" instead of \"npm:myproject\".","commonSituations":"Hand-writing workspace project IDs in mise.toml without the provider prefix; tooling that emits bare package names; older configs written before namespaced IDs were required.","solutions":["Add the provider namespace prefix: `provider:local-id` (e.g. `npm:mypkg`, `cargo:mypkg`)","Check the provider names supported by the workspace integration you use","Fix the upstream generator/serializer that omitted the namespace"],"exampleFix":"// before\nprojects = [\"webapp\"]\n// after\nprojects = [\"npm:webapp\"]","handlingStrategy":"validation","validationCode":"// js: validate project ID carries a provider namespace\nconst isValidProjectId = (id) => /^[^:\\s]+:[^:\\s]+$/.test(id);\nif (!isValidProjectId('webapp')) throw new Error('use npm:webapp style provider:local-id');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always write workspace project IDs as provider:local-id","Document the provider prefix convention in team configs","Validate generated IDs against /^[^:]+:.+$/ before writing mise.toml"],"tags":["workspace","identifier","parsing"],"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-14T00:17:10.932Z"}