{"record":{"id":"9286d16c0a3f348a","repo":"jdx/mise","slug":"uv-workspace-member-at-is-missing-pyproject-to","errorCode":null,"errorMessage":"uv workspace member at {} is missing {PYPROJECT_TOML}","messagePattern":"uv workspace member at (.+?) is missing (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/workspace/uv.rs","lineNumber":317,"sourceCode":"        {\n            let candidate = candidate.wrap_err_with(|| {\n                format!(\"failed to evaluate uv workspace member pattern {member:?}\")\n            })?;\n            if !context.is_dir(&candidate) {\n                continue;\n            }\n            let candidate = context.canonicalize(&candidate).wrap_err_with(|| {\n                format!(\n                    \"failed to resolve uv workspace member {}\",\n                    candidate.display()\n                )\n            })?;\n            let relative = relative_root(canonical_root, &candidate)?;\n            if is_excluded(&relative, excludes) {\n                continue;\n            }\n            if !context.is_file(&candidate.join(PYPROJECT_TOML)) {\n                bail!(\n                    \"uv workspace member at {} is missing {PYPROJECT_TOML}\",\n                    relative.display()\n                );\n            }\n            roots.insert(candidate);\n        }\n    }\n    Ok(roots)\n}\n\nfn match_options() -> MatchOptions {\n    MatchOptions {\n        case_sensitive: true,\n        require_literal_separator: true,\n        require_literal_leading_dot: true,\n    }\n}\n","sourceCodeStart":299,"sourceCodeEnd":335,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/task/workspace/uv.rs#L299-L335","documentation":"After expanding a workspace member glob and excluding excluded paths, mise requires each matched candidate directory to contain a pyproject.toml (PYPROJECT_TOML) — a uv workspace member is defined as a Python project directory. A matched directory without one cannot be a member, so discovery bails with the member's path relative to the root.","triggerScenarios":"A members glob (e.g. \"packages/*\") matches a plain directory that has no pyproject.toml — e.g. an assets folder or docs folder under packages/.","commonSituations":"Dropping a non-Python directory into a globbed members path; deleting pyproject.toml from a member while keeping it in the workspace; overly broad member patterns like \"*\".","solutions":["Add a pyproject.toml to the matched directory if it is meant to be a member.","Narrow the members glob so it excludes non-project directories (e.g. \"packages/pkg-*\").","Add the directory's name to tool.uv.workspace.exclude.","Move non-project folders outside the globbed directory."],"exampleFix":"# before\n[tool.uv.workspace]\nmembers = [\"packages/*\"]  # packages/docs has no pyproject.toml\n# after\n[tool.uv.workspace]\nmembers = [\"packages/*\"]\nexclude = [\"packages/docs\"]","handlingStrategy":"validation","validationCode":"const glob = require('glob');\nfor (const dir of glob.sync('packages/*')) {\n  if (!existsSync(join(dir, 'pyproject.toml'))) {\n    console.warn(`${dir} matches members glob but has no pyproject.toml`);\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep non-Python directories out of members globs or list them in exclude.","Verify each workspace member has a pyproject.toml after restructuring."],"tags":["uv","python","workspace","pyproject"],"backgroundTag":"file-not-found","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"}