{"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/afd2eddd3a50c16190efc1c7e94404b48f72af57/src/task/workspace/uv.rs#L299-L335","documentation":"After glob expansion, each candidate directory that matches a uv workspace member pattern must contain a pyproject.toml (PYPROJECT_TOML) to be a valid member. When a matched candidate lacks that file, discover_members treats the workspace definition as inconsistent and errors naming the missing file.","triggerScenarios":"A glob pattern like `packages/*` in [tool.uv.workspace].members matches a directory (e.g. packages/README-only or a build-output dir) that has no pyproject.toml, and it is not excluded via the `exclude` list.","commonSituations":"Broad wildcard members catching scratch/output directories; a member directory emptied or renamed so its pyproject.toml is gone; an exclude entry typo'd so the directory is no longer skipped.","solutions":["Add a pyproject.toml to the reported member directory if it is a real workspace member","Narrow the members glob (e.g. packages/api instead of packages/*) so non-member directories don't match","Add the non-member directory to [tool.uv.workspace] exclude"],"exampleFix":"# before\n[tool.uv.workspace]\nmembers = [\"packages/*\"]\n\n# after\n[tool.uv.workspace]\nmembers = [\"packages/*\"]\nexclude = [\"packages/scratch\"]","handlingStrategy":"validation","validationCode":"# every directory matched by member globs must contain pyproject.toml\nimport glob, os\nfor d in glob.glob('packages/*'):\n    if os.path.isdir(d) and not os.path.exists(os.path.join(d, 'pyproject.toml')):\n        print(f'{d} matches members glob but lacks pyproject.toml — exclude it')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep build outputs out of directories covered by member globs","Maintain an explicit exclude list for non-member dirs","Verify workspace with `uv sync` before running mise tasks"],"tags":["uv","python","workspace","file-not-found"],"backgroundTag":"file-not-found","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"}