{"record":{"id":"b94d06f8a60484ba","repo":"jdx/mise","slug":"uv-project-at-has-an-empty-project-name","errorCode":null,"errorMessage":"uv project at {} has an empty project.name","messagePattern":"uv project at (.+?) has an empty project\\.name","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/workspace/uv.rs","lineNumber":125,"sourceCode":"        let mut known_roots = workspace_roots.clone();\n        let mut queue = workspace_roots.iter().cloned().collect::<VecDeque<_>>();\n        let mut manifests = BTreeMap::new();\n        while let Some(project_root) = queue.pop_front() {\n            if manifests.contains_key(&project_root) {\n                continue;\n            }\n            let relative = relative_root(&canonical_root, &project_root)?;\n            let pyproject_path = project_root.join(PYPROJECT_TOML);\n            let pyproject = if project_root == canonical_root {\n                root_pyproject.clone()\n            } else {\n                read_pyproject(context, &pyproject_path)?\n            };\n            let project = pyproject.project.as_ref().ok_or_else(|| {\n                eyre::eyre!(\"uv project at {} is missing [project]\", relative.display())\n            })?;\n            if project.name.is_empty() {\n                bail!(\n                    \"uv project at {} has an empty project.name\",\n                    relative.display()\n                );\n            }\n            let id = ProjectId::new(self.id(), &normalize_package_name(&project.name))?;\n            let workspace_member = workspace_roots.contains(&project_root);\n\n            for dependency in dependency_names(&pyproject) {\n                let Some((source, source_base)) = effective_source(\n                    &pyproject,\n                    &root_pyproject,\n                    &dependency,\n                    workspace_member,\n                    &project_root,\n                    &canonical_root,\n                ) else {\n                    continue;\n                };","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/jdx/mise/blob/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/task/workspace/uv.rs#L107-L143","documentation":"When discovering uv project workspaces, mise requires a [project] table with a non-empty `name` in pyproject.toml. The project table exists but `project.name` is an empty string, so no valid ProjectId can be derived and discovery of that uv project fails.","triggerScenarios":"uv discover (via discover_with_context) reads a pyproject.toml containing `[project]\\nname = \"\"` or a name that serializes to empty; typically a scaffolded file where the name placeholder was deleted.","commonSituations":"Copied template pyproject.toml with the name blanked; regex/script-based edits that stripped the name; newly created uv project interrupted mid-init.","solutions":["Set a non-empty name in the [project] table of the pyproject.toml at the reported path","Regenerate the project with `uv init` if the file is broken scaffolding","If the directory is not meant to be a uv project, remove the empty [project] table or exclude it from discovery"],"exampleFix":"# before\n[project]\nname = \"\"\n\n# after\n[project]\nname = \"my-uv-project\"","handlingStrategy":"validation","validationCode":"# check before running mise\nimport tomllib\np = tomllib.load(open('pyproject.toml','rb'))\nassert p.get('project', {}).get('name'), 'project.name must be a non-empty string'","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run uv init for scaffolding instead of hand-writing [project]","Lint pyproject.toml in CI (e.g. with validate-pyproject)","Never blank out project.name in templates"],"tags":["uv","python","pyproject","config"],"backgroundTag":"empty-required-field","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"}