{"record":{"id":"2c25912dae9f7ef4","repo":"jackwener/OpenCLI","slug":"twitter-tweets-page-delay-must-be-an-integer-bet","errorCode":null,"errorMessage":"twitter tweets --page-delay must be an integer between 0 and 60 seconds","messagePattern":"twitter tweets --page-delay must be an integer between 0 and 60 seconds","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/twitter/tweets.js","lineNumber":98,"sourceCode":"    visit(instructions);\n    return { tweets, nextCursor };\n}\n\nfunction normalizeLimit(rawLimit) {\n    const limit = rawLimit ?? 20;\n    if (!Number.isInteger(limit) || limit < 1 || limit > MAX_TWEETS_LIMIT) {\n        throw new ArgumentError(\n            `twitter tweets --limit must be an integer between 1 and ${MAX_TWEETS_LIMIT}`,\n            'Example: opencli twitter tweets @jack --limit 250',\n        );\n    }\n    return limit;\n}\n\nfunction normalizePageDelaySeconds(rawDelay) {\n    const delay = rawDelay ?? DEFAULT_PAGE_DELAY_SECONDS;\n    if (!Number.isInteger(delay) || delay < 0 || delay > 60) {\n        throw new ArgumentError(\n            'twitter tweets --page-delay must be an integer between 0 and 60 seconds',\n            'Example: opencli twitter tweets @jack --limit 250 --page-delay 2',\n        );\n    }\n    return delay;\n}\n\ncli({\n    site: 'twitter',\n    name: 'tweets',\n    access: 'read',\n    description: \"Fetch a Twitter user's most recent tweets (chronological, excludes pinned; defaults to the logged-in user when no username is given)\",\n    domain: 'x.com',\n    strategy: Strategy.COOKIE,\n    browser: true,\n    args: [\n        { name: 'username', type: 'string', positional: true, help: 'Twitter screen name (with or without @). Defaults to the logged-in user when omitted.' },\n        { name: 'limit', type: 'int', default: 20, help: `Max tweets to return (1-${MAX_TWEETS_LIMIT}; fetched across cursor pages)` },","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/twitter/tweets.js#L80-L116","documentation":"normalizePageDelaySeconds in clis/twitter/tweets.js:98 validates the --page-delay flag, defaulting to DEFAULT_PAGE_DELAY_SECONDS. It must be an integer between 0 and 60 (seconds of wait between paginated UserTweets fetches); otherwise ArgumentError is thrown. The delay throttles requests so scraping does not trip x.com rate limits.","triggerScenarios":"Calling `opencli twitter tweets <user> --page-delay <n>` with a non-integer (e.g. 1.5), a negative number, or a value above 60 seconds.","commonSituations":"Scripts computing the delay from averages (producing floats); users trying --page-delay 120 to be polite, unaware of the 60s cap; unit confusion (passing milliseconds like 2000); copied config from older versions with different bounds.","solutions":["Pass an integer number of seconds from 0 to 60, e.g. --page-delay 2","Clamp computed values: Math.min(60, Math.max(0, Math.round(raw))) before invoking","If you need longer waits, run multiple invocations or add sleep between separate CLI calls rather than exceeding the cap","Remember 0 is valid (no delay) if you intentionally want fastest (riskier) fetching"],"exampleFix":"// before\nopencli twitter tweets @jack --page-delay 1.5\n// after\nopencli twitter tweets @jack --page-delay 2","handlingStrategy":"validation","validationCode":"function assertPageDelay(v) {\n  const n = Number(v);\n  if (!Number.isInteger(n) || n < 0 || n > 60) {\n    throw new Error('--page-delay must be an integer 0..60 seconds');\n  }\n  return n;\n}","typeGuard":"function isValidPageDelay(v) {\n  return Number.isInteger(v) && v >= 0 && v <= 60;\n}","tryCatchPattern":"import { ArgumentError } from '@jackwener/opencli/errors';\ntry {\n  await run(['twitter', 'tweets', '@jack', '--page-delay', String(delay)]);\n} catch (e) {\n  if (e instanceof ArgumentError && e.message.includes('--page-delay')) {\n    console.error('Use integer seconds 0..60; clamp longer waits outside the CLI.');\n    process.exitCode = 2;\n  } else throw e;\n}","preventionTips":["Round computed delays with Math.round and clamp to 0..60 before invoking","Don't pass milliseconds — the flag is seconds","For waits over 60s, sleep between separate CLI invocations instead","Document defaults in wrapper scripts so operators don't guess bounds"],"tags":["argument-validation","cli-flag","input-validation","twitter"],"backgroundTag":"invalid-cli-argument","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}