{"record":{"id":"ab2b88c6e5b8e612","repo":"stablyai/orca","slug":"repo-is-required","errorCode":null,"errorMessage":"repo is required","messagePattern":"repo is required","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"config/scripts/create-draft-release.mjs","lineNumber":122,"sourceCode":"  }\n\n  const availableLength = maxLength - TRUNCATION_NOTICE.length\n  if (availableLength <= 0) {\n    throw new Error('Release truncation notice is longer than the maximum release body length')\n  }\n\n  return `${body.slice(0, availableLength).trimEnd()}${TRUNCATION_NOTICE}`\n}\n\nexport async function createDraftRelease({\n  repo,\n  tag,\n  token,\n  fetchImpl = fetch,\n  log = console.log\n}) {\n  if (!repo) {\n    throw new Error('repo is required')\n  }\n  if (!tag) {\n    throw new Error('tag is required')\n  }\n  if (!token) {\n    throw new Error('token is required')\n  }\n\n  const previousTag = latestPreviousPublishedDesktopReleaseTag(\n    await fetchRepoReleases(repo, token, fetchImpl),\n    tag\n  )\n  const generateNotesBody = {\n    tag_name: tag,\n    target_commitish: tag,\n    ...(previousTag ? { previous_tag_name: previousTag } : {})\n  }\n","sourceCodeStart":104,"sourceCodeEnd":140,"githubUrl":"https://github.com/stablyai/orca/blob/1136503c6a231a16dce8f921f6fadb63d181e8db/config/scripts/create-draft-release.mjs#L104-L140","documentation":"Thrown by createDraftRelease when the repo parameter is falsy. repo is required because it forms the GitHub API URL path for every request (create-draft-release.mjs:121-123). In main(), it defaults to process.env.GITHUB_REPOSITORY or 'stablyai/orca', so this fires only when calling createDraftRelease directly without repo.","triggerScenarios":"Calling createDraftRelease({}) or createDraftRelease({ tag, token }) from a script/test that omits repo; GITHUB_REPOSITORY env explicitly set to empty string and the default overridden.","commonSituations":"Programmatic use of createDraftRelease in a custom release workflow; a fork that removed the default repo; a test that constructs params from a partial config object.","solutions":["Pass a non-empty repo string in 'owner/name' form, e.g. createDraftRelease({ repo: 'owner/repo', ... }).","If using main(), ensure GITHUB_REPOSITORY is set, or rely on the 'stablyai/orca' default.","Validate the params object has repo before calling."],"exampleFix":"// before\nawait createDraftRelease({ tag: 'v1.0.0', token: tok })\n// after\nawait createDraftRelease({ repo: 'owner/repo', tag: 'v1.0.0', token: tok })","handlingStrategy":"validation","validationCode":"function validateCreateDraftReleaseParams({ repo, tag, token }) {\n  if (!repo) throw new Error('repo is required (owner/name)')\n  if (!tag) throw new Error('tag is required')\n  if (!token) throw new Error('token is required')\n}\nvalidateCreateDraftReleaseParams(params)","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Construct the params object from a single config source and validate all three fields before calling.","Default repo to process.env.GITHUB_REPOSITORY in wrapper scripts."],"tags":["argument-validation","release","github-api"],"backgroundTag":null,"analyzedSha":"1136503c6a231a16dce8f921f6fadb63d181e8db","analyzedAt":"2026-08-12T23:15:58.167Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}