nextlevelbuilder/ui-ux-pro-max-skill · error · GitHubDownloadError
Failed to fetch latest release: ${response.status} ${respons
Error message
Failed to fetch latest release: ${response.status} ${response.statusText} What it means
Same guard pattern as fetchReleases() but for GET /repos/{owner}/{repo}/releases/latest — the call `uipro init` makes first. Any non-2xx, non-rate-limited response becomes GitHubDownloadError('Failed to fetch latest release: <status> <reason>'). Notably GitHub returns 404 for this endpoint when the repository has no published (non-draft, non-prerelease) release yet.
Source
Thrown at cli/src/utils/github.ts:88
return response.json();
}
export async function getLatestRelease(token?: string): Promise<Release> {
const url = `${API_BASE}/repos/${REPO_OWNER}/${REPO_NAME}/releases/latest`;
const response = await fetch(url, {
headers: {
'Accept': 'application/vnd.github.v3+json',
'User-Agent': USER_AGENT,
...getAuthHeaders(token),
},
});
checkRateLimit(response);
if (!response.ok) {
throw new GitHubDownloadError(`Failed to fetch latest release: ${response.status} ${response.statusText}`);
}
return response.json();
}
export async function downloadRelease(url: string, dest: string, token?: string): Promise<void> {
const response = await fetch(url, {
headers: {
'User-Agent': USER_AGENT,
'Accept': 'application/octet-stream',
...getAuthHeaders(token),
},
});
checkRateLimit(response);
if (!response.ok) {
throw new GitHubDownloadError(`Failed to download: ${response.status} ${response.statusText}`);View on GitHub (pinned to a38d04c3d5)
Solutions
- Open the repo's Releases page and confirm a stable, published release exists (drafts and prereleases don't count for /latest).
- If 401, clear or rotate the stale UI_PRO_MAX_GITHUB_TOKEN/GITHUB_TOKEN.
- Publish or promote a release to stable, or fall back to fetchReleases() and pick the first entry when /latest 404s.
- Check githubstatus.com for 5xx causes and retry.
Example fix
// before
const release = await getLatestRelease(token);
// after: fall back to the releases list when /latest 404s
let release;
try {
release = await getLatestRelease(token);
} catch (e) {
if (e instanceof GitHubDownloadError && e.message.includes('404')) {
const [first] = await fetchReleases(token);
if (!first) throw new Error('No releases published yet');
release = first;
} else throw e;
} Defensive patterns
Strategy: fallback
Try / catch
import { getLatestRelease, fetchReleases, GitHubDownloadError } from './utils/github';
async function latestOrFirst(token?: string) {
try {
return await getLatestRelease(token);
} catch (e) {
if (e instanceof GitHubDownloadError && e.message.includes('404')) {
const [first] = await fetchReleases(token);
if (!first) throw new Error('Repository has no published releases');
return first;
}
throw e;
}
} Prevention
- On forks, publish a stable release before exercising install flows.
- Treat /releases/latest 404 as 'no stable release yet', not as a hard failure.
- Verify tokens with a simple curl before batch runs.
When it happens
Trigger: Freshly forked or bootstrapped repo where no release has been marked 'latest' (404); a repository where all releases are drafts or marked prerelease; 401 from an invalid token; 5xx during a GitHub outage.
Common situations: Running the CLI against a fork that never published a release; release accidentally left in draft/prerelease so /releases/latest 404s; invalid or expired token in the environment.
Related errors
- Failed to fetch releases: ${response.status} ${response.stat
- Failed to download: ${response.status} ${response.statusText
- GitHub API rate limit exceeded. Resets at ${resetDate}.\n${g
- No ZIP asset found in latest release
AI-assisted analysis of nextlevelbuilder/ui-ux-pro-max-skill@a38d04c3d5 (2026-08-14).
Data as JSON: /api/errors/611b8ebdb59b34a7.
Report an issue: GitHub.