{"record":{"id":"805cc578a5d888f7","repo":"odysseus-dev/odysseus","slug":"github-url-must-include-tree-branch-or-blo","errorCode":null,"errorMessage":"GitHub URL must include /tree/<branch>/... or /blob/<branch>/...","messagePattern":"GitHub URL must include /tree/<branch>/\\.\\.\\. or /blob/<branch>/\\.\\.\\.","errorType":"validation","errorClass":"SkillImportError","httpStatus":null,"severity":"error","filePath":"services/memory/skill_importer.py","lineNumber":337,"sourceCode":"            raise SkillImportError(\"Invalid raw GitHub URL\")\n        owner, repo, ref = bits[0], bits[1], bits[2]\n        path = \"/\".join(bits[3:])\n        return ResolvedSource(owner=owner, repo=repo, ref=ref, path=path)\n\n    bits = [p for p in parsed.path.split(\"/\") if p]\n    if len(bits) < 2:\n        raise SkillImportError(\"Invalid GitHub URL\")\n    owner, repo = bits[0], bits[1]\n    ref = \"main\"\n    path = \"\"\n\n    if len(bits) >= 4 and bits[2] in (\"tree\", \"blob\"):\n        ref = bits[3]\n        path = \"/\".join(bits[4:])\n    elif len(bits) == 2:\n        path = \"\"\n    else:\n        raise SkillImportError(\"GitHub URL must include /tree/<branch>/... or /blob/<branch>/...\")\n\n    return ResolvedSource(owner=owner, repo=repo, ref=ref, path=path)\n\n\ndef _raw_url(src: ResolvedSource, rel_path: str) -> str:\n    rel = _safe_relpath(rel_path)\n    return f\"https://raw.githubusercontent.com/{src.owner}/{src.repo}/{quote(src.ref, safe='')}/{quote(rel, safe='/')}\"\n\n\ndef _api_contents_url(src: ResolvedSource, rel_path: str = \"\") -> str:\n    rel = _safe_relpath(rel_path) if rel_path else \"\"\n    base = f\"https://api.github.com/repos/{src.owner}/{src.repo}/contents\"\n    if rel:\n        base += f\"/{quote(rel, safe='/')}\"\n    return f\"{base}?ref={quote(src.ref, safe='')}\"\n\n\ndef _github_response_error(response: httpx.Response) -> SkillImportError:","sourceCodeStart":319,"sourceCodeEnd":355,"githubUrl":"https://github.com/odysseus-dev/odysseus/blob/f9235ebbf13f693a6fd29ce70b097f6ec83705bf/services/memory/skill_importer.py#L319-L355","documentation":"Error \"GitHub URL must include /tree/<branch>/... or /blob/<branch>/...\" thrown in odysseus-dev/odysseus.","triggerScenarios":"Triggered when the corresponding server-side validation or runtime check at the recorded location rejects the request or operation and returns this error message to the caller.","commonSituations":"See trigger scenarios.","solutions":["Link to a GitHub /tree/<branch>/... or /blob/<branch>/... path for the skill.","Open the skill folder on GitHub and copy the full URL including the branch."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f9235ebbf13f693a6fd29ce70b097f6ec83705bf","analyzedAt":"2026-08-14T21:47:48.359Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}