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

  1. 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.
  2. If you maintain the repo, ensure the release workflow uploads the zip asset before marking the release 'latest'.
  3. If the asset uses a different extension intentionally, extend getAssetUrl() in cli/src/utils/github.ts to accept it.
  4. 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

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


AI-assisted analysis of nextlevelbuilder/ui-ux-pro-max-skill@a38d04c3d5 (2026-08-14). Data as JSON: /api/errors/39fe27511eff9453. Report an issue: GitHub.