{"record":{"id":"993f9607022dc2e2","repo":"Hmbown/CodeWhale","slug":"usage-node-scripts-release-ensure-release-assets","errorCode":null,"errorMessage":"Usage: node scripts/release/ensure-release-assets-absent.js OWNER/REPO vX.Y.Z","messagePattern":"Usage: node scripts/release/ensure-release-assets-absent\\.js OWNER/REPO vX\\.Y\\.Z","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"info","filePath":"scripts/release/ensure-release-assets-absent.js","lineNumber":74,"sourceCode":"  }\n  if (!release || !Array.isArray(release.assets)) {\n    throw new Error(`GitHub Release ${tag} did not provide an asset inventory`);\n  }\n  if (release.assets.length === 0) {\n    return;\n  }\n\n  const names = release.assets.map((asset) => asset && asset.name).filter(Boolean);\n  const inventory = names.length > 0 ? names.join(\", \") : `${release.assets.length} unnamed asset(s)`;\n  throw new Error(\n    `Refusing to replace existing assets for ${tag}: ${inventory}. ` +\n      \"A normal Release workflow rerun must never delete or overwrite public bytes.\",\n  );\n}\n\nfunction main() {\n  if (process.argv.length !== 4) {\n    throw new Error(usage());\n  }\n  const repo = process.argv[2];\n  const tag = process.argv[3];\n  const release = fetchRelease(repo, tag);\n  assertReleaseAssetsAbsent(release, tag);\n  console.log(\n    release === null\n      ? `No existing GitHub Release assets found for ${tag}.`\n      : `Existing GitHub Release ${tag} has no assets; first upload may proceed.`,\n  );\n}\n\nif (require.main === module) {\n  try {\n    main();\n  } catch (error) {\n    console.error(`Release immutability check failed: ${error.message}`);\n    process.exit(1);","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/scripts/release/ensure-release-assets-absent.js#L56-L92","documentation":"CLI usage guard in main(): ensure-release-assets-absent.js expects exactly two arguments (OWNER/REPO and vX.Y.Z), so argv length must be 4. Any other count throws the one-line usage text; the top-level handler prints 'Release immutability check failed: <usage>' and exits 1.","triggerScenarios":"Invoking with no arguments, one argument, or three or more; passing flags the script does not parse.","commonSituations":"First use in a workflow with an unset variable collapsing to one argument; copy-paste from docs without substituting placeholders; extra debug flags appended.","solutions":["Invoke exactly: node scripts/release/ensure-release-assets-absent.js OWNER/REPO vX.Y.Z","In CI, build the command from validated env vars (GITHUB_REPOSITORY and the pushed tag) so argument count is stable"],"exampleFix":"# before\nnode scripts/release/ensure-release-assets-absent.js acme/codewhale\n\n# after\nnode scripts/release/ensure-release-assets-absent.js acme/codewhale v1.2.3","handlingStrategy":"validation","validationCode":"#!/usr/bin/env bash\n: \"${REPO:?set REPO to OWNER/REPO}\" \"${TAG:?set TAG to vX.Y.Z}\"\nnode scripts/release/ensure-release-assets-absent.js \"$REPO\" \"$TAG\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Drive the script from GITHUB_REPOSITORY and the pushed tag so exactly two arguments always arrive","Fail on unset variables (: ${VAR:?}) in wrapper scripts instead of letting them collapse argument count"],"tags":["cli","usage","github","release"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}