nextlevelbuilder/ui-ux-pro-max-skill · error · GitHubDownloadError
No ZIP asset found in latest release
Error message
No ZIP asset found in latest release
What it means
Thrown by the uipro CLI installer when the GitHub 'latest release' it fetched contains no asset whose name ends in .zip. The installer resolves the release via getLatestRelease(), then getAssetUrl() scans release.assets for a .zip upload (browser_download_url); if none exists, installFromGitHub() aborts with GitHubDownloadError. It means the release exists but was published without the expected ZIP artifact.
Source
Thrown at cli/src/commands/init.ts:58
/**
* Try to install from GitHub release (legacy method)
* Returns the copied folders if successful, null if failed
*/
async function tryGitHubInstall(
targetDir: string,
aiType: AIType,
spinner: ReturnType<typeof ora>,
token?: string
): Promise<string[] | null> {
let tempDir: string | null = null;
try {
spinner.text = 'Fetching latest release from GitHub...';
const release = await getLatestRelease(token);
const assetUrl = getAssetUrl(release);
if (!assetUrl) {
throw new GitHubDownloadError('No ZIP asset found in latest release');
}
spinner.text = `Downloading ${release.tag_name}...`;
tempDir = await createTempDir();
const zipPath = join(tempDir, 'release.zip');
await downloadRelease(assetUrl, zipPath, token);
spinner.text = 'Extracting and installing files...';
const { copiedFolders, tempDir: extractedTempDir } = await installFromZip(
zipPath,
targetDir,
aiType
);
// Cleanup temp directory
await cleanup(extractedTempDir);
View on GitHub (pinned to a38d04c3d5)
Solutions
- Check the latest release on the repo's GitHub Releases page and confirm a .zip asset is attached; re-run the release packaging workflow if not.
- If you maintain the repo, ensure the release workflow uploads the zip asset before marking the release 'latest'.
- If the asset uses a different extension intentionally, extend getAssetUrl() in cli/src/utils/github.ts to accept it.
- As a workaround, use the CLI's local/bundled install path instead of the GitHub download, or pin to an older release that has the asset.
Example fix
// before (github.ts)
const asset = release.assets.find(a => a.name.endsWith('.zip'));
// after: also surface a clearer error and accept tar.gz
const asset = release.assets.find(a => /\.(zip|tar\.gz)$/.test(a.name));
if (!asset) {
throw new GitHubDownloadError(
`No ZIP asset found in latest release (assets: ${release.assets.map(a => a.name).join(', ') || 'none'})`
);
} Defensive patterns
Strategy: validation
Validate before calling
import { getLatestRelease, getAssetUrl } from './utils/github';
async function assertReleaseHasZip(token?: string) {
const release = await getLatestRelease(token);
const url = getAssetUrl(release);
if (!url) {
throw new Error(
`Release ${release.tag_name} has no zip asset (assets: ${release.assets.map(a => a.name).join(', ') || 'none'})`
);
}
return { release, url };
} Try / catch
try {
await installFromGitHub(targetDir, aiType, spinner, token);
} catch (e) {
if (e instanceof GitHubDownloadError && /No ZIP asset/.test(e.message)) {
// fall back to the CLI's bundled local assets instead of the GitHub download
await installFromLocalAssets(targetDir, aiType, spinner);
} else throw e;
} Prevention
- Make the release workflow fail if the zip asset upload step fails, so 'latest' never ships without the artifact.
- Log the release.assets names in telemetry when this error fires to make diagnosis one-step.
- Keep the CLI's local-assets install path as a fallback for GitHub release anomalies.
When it happens
Trigger: Running `uipro init` when the latest GitHub release was created from a tag without attaching a ZIP asset, when the release is a draft/nightly that only uploads e.g. tar.gz artifacts, or when asset names were changed in the release workflow so the `.endsWith('.zip')` check in getAssetUrl() no longer matches.
Common situations: Maintainer cuts a release from a tag without running the asset-packaging workflow; CI artifact upload step failed silently so the release published anyway; a release pipeline switched to .tar.gz; querying GitHub with a token that lacks access so the assets array comes back empty for a private repo.
Related errors
- GitHub API rate limit exceeded. Resets at ${resetDate}.\n${g
- Failed to fetch releases: ${response.status} ${response.stat
- Failed to extract zip: ${error}
- Failed to fetch latest release: ${response.status} ${respons
- Failed to download: ${response.status} ${response.statusText
AI-assisted analysis of nextlevelbuilder/ui-ux-pro-max-skill@a38d04c3d5 (2026-08-14).
Data as JSON: /api/errors/39fe27511eff9453.
Report an issue: GitHub.