{"record":{"id":"843ed8a03a3336c0","repo":"astrid-runtime/astrid","slug":"no-github-releases-found-for-org-repo","errorCode":null,"errorMessage":"no GitHub releases found for {org}/{repo}","messagePattern":"no GitHub releases found for (.+?)/(.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/astrid-cli/src/commands/capsule/install_update.rs","lineNumber":46,"sourceCode":"    Failed { reason: String },\n    Skipped { reason: String },\n}\n\n/// Fetch the latest release version from GitHub for a given org/repo.\nasync fn fetch_github_latest_version(\n    client: &reqwest::Client,\n    org: &str,\n    repo: &str,\n) -> anyhow::Result<semver::Version> {\n    let api_url = format!(\"https://api.github.com/repos/{org}/{repo}/releases/latest\");\n    let response = client\n        .get(&api_url)\n        .send()\n        .await\n        .context(\"failed to reach GitHub API\")?;\n\n    if response.status() == reqwest::StatusCode::NOT_FOUND {\n        bail!(\"no GitHub releases found for {org}/{repo}\");\n    }\n    if response.status() == reqwest::StatusCode::TOO_MANY_REQUESTS\n        || response.status() == reqwest::StatusCode::FORBIDDEN\n    {\n        bail!(\"GitHub API rate limit exceeded - try again later\");\n    }\n    if !response.status().is_success() {\n        bail!(\"GitHub API returned {}\", response.status());\n    }\n\n    let json: serde_json::Value = response\n        .json()\n        .await\n        .context(\"failed to parse GitHub API response\")?;\n    let tag_name = json\n        .get(\"tag_name\")\n        .and_then(serde_json::Value::as_str)\n        .filter(|s| !s.is_empty())","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/astrid-runtime/astrid/blob/affd8760f44190dbdfbec23403f4c4b642c33112/crates/astrid-cli/src/commands/capsule/install_update.rs#L28-L64","documentation":"Raised by `fetch_github_latest_version` when the GitHub releases API responds with 404 NOT_FOUND for `https://api.github.com/repos/{org}/{repo}/releases/latest`. GitHub returns 404 here when the repository does not exist, is private/unauthenticated, or exists but has no published releases. `astrid capsule update` surfaces this as a failed update check for that capsule.","triggerScenarios":"Calling `astrid capsule update` (workspace mode) for a capsule whose recorded source points to a GitHub org/repo where the `/releases/latest` endpoint returns 404 — repo deleted or renamed, repo made private, or repo has zero published releases (only draft/prerelease-only tags).","commonSituations":"Capsule author renamed or deleted the GitHub repo after you installed; repo went private; author tags the repo but never publishes a GitHub Release; typo in source URL recorded in meta.json.","solutions":["Verify the repo exists and has at least one published release at https://github.com/{org}/{repo}/releases; if the author only pushes tags, ask them to publish a Release.","If the repo was renamed, reinstall the capsule with the new `org/repo` source so meta.json records the correct location.","If the repo is private, ensure credentials/GITHUB_TOKEN are available to your environment or use an accessible mirror.","If the capsule is abandoned, keep the currently installed version or reinstall from a local `.capsule` file instead of updating."],"exampleFix":"// meta.json source pointing at a removed repo\n\"source\": \"github.com/old-org/my-capsule\"\n// update fails: no GitHub releases found for old-org/my-capsule\n\n// after — reinstall from the relocated repo\nastrid capsule install github.com/new-org/my-capsule","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"match check_remote_version(&client, &source, &version) {\n    UpdateCheck::Failed { reason } if reason.contains(\"no GitHub releases found\") => {\n        eprintln!(\"Skipping update: {reason}\");\n    },\n    other => handle(other),\n}","preventionTips":["Before updating, confirm the source repo still exists and has published releases.","Pin capsule versions for critical environments so a vanished upstream repo does not block workflows.","Keep local `.capsule` copies of capsules you depend on as an install fallback.","Watch org/repo renames and update recorded sources promptly."],"tags":["network","github","http"],"backgroundTag":"resource-not-found","analyzedSha":"affd8760f44190dbdfbec23403f4c4b642c33112","analyzedAt":"2026-09-09T21:28:12.402Z","contentChangedAt":"2026-09-09T21:28:12.402Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}