Hmbown/CodeWhale · error · Error

GitHub Release ${tag} did not provide an asset inventory

Error message

GitHub Release ${tag} did not provide an asset inventory

What it means

The release JSON was fetched and parsed, but the object has no usable assets field (release.assets is missing or not an Array). GitHub's release object always includes assets, so this indicates schema drift or output interception: a GitHub Enterprise version with a different response shape, a proxy returning a JSON error object with exit 0, or a stubbed/mocked gh in tests.

Source

Thrown at scripts/release/ensure-release-assets-absent.js:58

    const detail = String(error && error.stderr ? error.stderr : "").trim();
    throw new Error(
      `Could not inspect GitHub Release ${tag}${detail ? `: ${detail}` : ""}`,
    );
  }

  try {
    return JSON.parse(output);
  } catch (error) {
    throw new Error(`GitHub Release ${tag} returned invalid JSON: ${error.message}`);
  }
}

function assertReleaseAssetsAbsent(release, tag) {
  if (release === null) {
    return;
  }
  if (!release || !Array.isArray(release.assets)) {
    throw new Error(`GitHub Release ${tag} did not provide an asset inventory`);
  }
  if (release.assets.length === 0) {
    return;
  }

  const names = release.assets.map((asset) => asset && asset.name).filter(Boolean);
  const inventory = names.length > 0 ? names.join(", ") : `${release.assets.length} unnamed asset(s)`;
  throw new Error(
    `Refusing to replace existing assets for ${tag}: ${inventory}. ` +
      "A normal Release workflow rerun must never delete or overwrite public bytes.",
  );
}

function main() {
  if (process.argv.length !== 4) {
    throw new Error(usage());
  }
  const repo = process.argv[2];

View on GitHub (pinned to 8880682c63)

Solutions

  1. Inspect the actual JSON gh returns for that tag and compare it to the documented release schema
  2. If targeting GitHub Enterprise, confirm its API version includes assets on release objects
  3. Fix test stubs and GH_BIN wrappers to pass the gh response through unmodified (include "assets": [] at minimum)

Example fix

// before: stubbed gh returns '{ "id": 1 }' -> did not provide an asset inventory

// after: stub includes the field
// { "id": 1, "assets": [] }
Defensive patterns

Strategy: type-guard

Type guard

function isReleaseWithAssetInventory(value) {
  return value === null || (typeof value === "object" && Array.isArray(value.assets));
}

Try / catch

const { fetchRelease } = require("./scripts/release/ensure-release-assets-absent");
const release = fetchRelease(repo, tag);
if (!isReleaseWithAssetInventory(release)) {
  throw new Error(`unexpected release payload for ${tag}; inspect raw gh api output before proceeding`);
}

Prevention

When it happens

Trigger: gh api resolving against a GitHub Enterprise instance whose release payload lacks assets; an interception layer returning a JSON error envelope; test harnesses stubbing gh api with a minimal object like {id: 1}.

Common situations: GHE deployments with older REST shapes; corporate proxies rewriting API responses; CI stubs of the gh binary; GH_BIN wrappers that reshape the payload.

Related errors


AI-assisted analysis of Hmbown/CodeWhale@8880682c63 (2026-08-16). Data as JSON: /api/errors/972fe937afed7378. Report an issue: GitHub.