{"record":{"id":"277e4bd9c4d07361","repo":"aaif-goose/goose","slug":"expected-one-match-for-pattern-r-in-path","errorCode":null,"errorMessage":"expected one match for {pattern!r} in {path}","messagePattern":"expected one match for (.+?) in (.+?)","errorType":"exception","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"crates/goose-sdk/justfile","lineNumber":145,"sourceCode":"    python_version = f\"{major}.{minor}.{patch}\" if alpha is None else f\"{major}.{minor}.{patch}a{alpha}\"\n\n    crate_names = [\n        \"goose-provider-types\",\n        \"goose-sdk-types\",\n        \"goose-download-manager\",\n        \"goose-local-inference\",\n        \"goose-providers\",\n        \"goose-agent\",\n        \"goose-context-management\",\n        \"goose-sdk\",\n    ]\n    crate_paths = {name: Path(\"crates\") / name / \"Cargo.toml\" for name in crate_names}\n\n    def replace_unique(path: Path, pattern: str, replacement: str) -> None:\n        text = path.read_text()\n        new_text, count = re.subn(pattern, replacement, text, count=1, flags=re.MULTILINE)\n        if count != 1:\n            raise SystemExit(f\"expected one match for {pattern!r} in {path}\")\n        path.write_text(new_text)\n\n    for path in crate_paths.values():\n        replace_unique(path, r'^version\\s*=\\s*\"[^\"]+\"', f'version = \"{rust_version}\"')\n\n    dependency_names = [\n        \"goose-provider-types\",\n        \"goose-sdk-types\",\n        \"goose-download-manager\",\n        \"goose-local-inference\",\n        \"goose-providers\",\n        \"goose-agent\",\n        \"goose-context-management\",\n    ]\n    for path in crate_paths.values():\n        text = path.read_text()\n        for dependency in dependency_names:\n            text = re.sub(","sourceCodeStart":127,"sourceCodeEnd":163,"githubUrl":"https://github.com/aaif-goose/goose/blob/3810898a7447ec3299be72e223d3570a7aabf0ab/crates/goose-sdk/justfile#L127-L163","documentation":"SystemExit raised by replace_unique() in the bump-version recipe when re.subn finds zero occurrences of '^version\\s*=\\s*\"[^\"]+\"' in one of the listed crate Cargo.toml files (count is capped at 1, so 'not 1' means 'not found'). The recipe demands exactly one literal version line per crate so it cannot silently skip or double-edit a manifest.","triggerScenarios":"Running 'just bump-version <version>' when a crate in crate_names (goose-provider-types, goose-sdk-types, goose-download-manager, goose-local-inference, goose-providers, goose-agent, goose-context-management, goose-sdk) has no literal 'version = \"...\"' line — typically because its Cargo.toml uses 'version.workspace = true', the file was renamed/removed, or the recipe is run from a directory where crates/<name>/Cargo.toml does not resolve.","commonSituations":"A crate was switched to workspace-inherited versions; a new crate was added to the workspace but not given its own version line; running the recipe outside crates/goose-sdk so relative paths miss; a crate listed in the recipe was deleted/renamed.","solutions":["Grep the failing crate's manifest for the version line: rg '^version' crates/<name>/Cargo.toml — the failing path is printed in the error","If it uses version.workspace = true, give it a literal version = \"x.y.z\" line (or drop it from crate_names)","Run the recipe from crates/goose-sdk so the relative crates/<name>/Cargo.toml paths resolve","Keep the crate_names list in the justfile in sync with reality when crates are added/renamed"],"exampleFix":"# before (crates/goose-sdk/Cargo.toml)\n[package]\nname = \"goose-sdk\"\nversion.workspace = true\n\n# after\n[package]\nname = \"goose-sdk\"\nversion = \"0.1.0\"","handlingStrategy":"validation","validationCode":"from pathlib import Path\nimport re\nfor name in [\"goose-provider-types\",\"goose-sdk-types\",\"goose-download-manager\",\"goose-local-inference\",\"goose-providers\",\"goose-agent\",\"goose-context-management\",\"goose-sdk\"]:\n    p = Path(\"crates\")/name/\"Cargo.toml\"\n    assert p.is_file(), f\"missing {p}\"\n    assert re.search(r'^version\\s*=\\s*\"[^\"]+\"', p.read_text(), re.M), f\"no literal version line in {p}\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never switch SDK crates to version.workspace = true","Add a CI check that every crate in crate_names has a literal version line","Run bump-version from crates/goose-sdk only","Update crate_names whenever crates are added/renamed"],"tags":["justfile","cargo","versioning","release"],"backgroundTag":null,"analyzedSha":"3810898a7447ec3299be72e223d3570a7aabf0ab","analyzedAt":"2026-08-16T10:14:26.282Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}