{"record":{"id":"cf3082d074d3d2ed","repo":"mastra-ai/mastra","slug":"github-resource-id-must-be-a-positive-integer","errorCode":null,"errorMessage":"GitHub ${resource} id must be a positive integer.","messagePattern":"GitHub (.+?) id must be a positive integer\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mastracode/factory/src/integrations/github/integration.ts","lineNumber":1474,"sourceCode":"  if (state === 'APPROVED') return 'approved';\n  if (state === 'CHANGES_REQUESTED') return 'changes-requested';\n  if (state === 'DISMISSED') return 'dismissed';\n  throw new Error(`Unsupported GitHub review state: ${state}`);\n}\n\nfunction reviewEventToGithub(event: Exclude<InputOf<'createReview'>['event'], undefined>) {\n  if (event === 'approve') return 'APPROVE' as const;\n  if (event === 'request-changes') return 'REQUEST_CHANGES' as const;\n  return 'COMMENT' as const;\n}\n\nfunction requirePullRequestNumber(value: string): number {\n  return requirePositiveId(value, 'pull request');\n}\n\nfunction requirePositiveId(value: string, resource: string): number {\n  const parsed = parsePositiveInteger(value);\n  if (parsed === null) throw new Error(`GitHub ${resource} id must be a positive integer.`);\n  return parsed;\n}\n\nfunction getGithubInstallationId(connection: IntegrationConnection): number {\n  if (connection.type !== 'app-installation') {\n    throw new Error('GitHub capabilities require an app-installation connection.');\n  }\n  return connection.installationId;\n}\n\nfunction getSingleSourceId(sourceIds: string[], message: string): string {\n  if (sourceIds.length !== 1) throw new Error(message);\n  return sourceIds[0]!;\n}\n\nfunction normalizeLabels(labels: string[] | undefined): string[] {\n  return [...new Set((labels ?? []).map(label => label.trim()).filter(Boolean))];\n}","sourceCodeStart":1456,"sourceCodeEnd":1492,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/mastracode/factory/src/integrations/github/integration.ts#L1456-L1492","documentation":"requirePositiveId validates that a GitHub resource identifier (pull request or issue number) extracted from a source id string is a valid positive integer. Non-numeric, zero, negative, or decimal values are rejected because GitHub PR/issue numbers are positive integers.","triggerScenarios":"Passing sourceIds like 'pr-42', '0', '-1', '12.5', or an empty string into capabilities that call requirePullRequestNumber/requirePositiveId.","commonSituations":"Prefixing ids with a resource label; storing ids as floats; pulling a number from a URL that still contains text; locale formatting adding separators.","solutions":["Pass the bare numeric string, e.g. '42'.","Strip non-digit prefixes with a regex like /\\d+$/ before calling.","Check upstream code that builds the source id for concatenation bugs.","Log the raw value to see what is actually being passed."],"exampleFix":"// before\nrequirePullRequestNumber('pr-42');\n// after\nrequirePullRequestNumber('42');","handlingStrategy":"validation","validationCode":"const n = Number(value);\nif (!Number.isInteger(n) || n <= 0) throw new Error(`invalid GitHub id: ${value}`);","typeGuard":"function isPositiveIntegerString(v: unknown): v is string {\n  return typeof v === 'string' && /^\\d+$/.test(v) && Number(v) > 0;\n}","tryCatchPattern":"try {\n  const num = requirePullRequestNumber(id);\n} catch {\n  const m = id.match(/\\d+$/);\n  if (!m) throw new Error(`cannot derive PR number from: ${id}`);\n  return useNumber(Number(m[0]));\n}","preventionTips":["Store PR/issue numbers as bare integer strings or numbers.","Strip URL prefixes before extracting ids.","Avoid Number() on user input without integer validation."],"tags":["github","validation","input"],"backgroundTag":"schema-validation-failed","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}