{"record":{"id":"d46ffa98b1559908","repo":"Hmbown/CodeWhale","slug":"unknown-argument-arg-d46ffa","errorCode":null,"errorMessage":"unknown argument: ${arg}","messagePattern":"unknown argument: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"telemetry-ingest/scripts/report-active-installs.mjs","lineNumber":47,"sourceCode":"\nexport function parseArgs(argv) {\n  // 15 = 14 complete UTC days plus the partial current day, the smallest\n  // window that fills both sides of the 7-day trend.\n  let days = 15;\n  let json = false;\n  for (let index = 0; index < argv.length; index += 1) {\n    const arg = argv[index];\n    if (arg === \"--json\") {\n      json = true;\n      continue;\n    }\n    if (arg === \"--days\") {\n      const raw = argv[index + 1];\n      index += 1;\n      days = Number(raw);\n      continue;\n    }\n    throw new Error(`unknown argument: ${arg}`);\n  }\n  if (!Number.isInteger(days) || days < 1 || days > 90) {\n    throw new Error(\"--days must be an integer from 1 through 90\");\n  }\n  return { days, json };\n}\n\nexport function activeInstallsSql(days) {\n  return `SELECT\n  toDate(timestamp) AS day,\n  count(DISTINCT index1) AS active_installs,\n  sum(_sample_interval) AS sessions_started\nFROM codewhale_telemetry\nWHERE timestamp >= toStartOfDay(NOW()) - INTERVAL '${days - 1}' DAY\n  AND blob1 = 'session_start'\nGROUP BY day\nORDER BY day DESC\nFORMAT JSON`;","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/telemetry-ingest/scripts/report-active-installs.mjs#L29-L65","documentation":"report-active-installs.mjs parseArgs accepts exactly two flags: `--json` (boolean) and `--days <n>` (which consumes the next argv token). Any other argument throws `unknown argument: ${arg}` before any Cloudflare request is made.","triggerScenarios":"Running the script with a positional argument, a flag from another report script (e.g. --format), or a typo such as `--day 30` instead of `--days 30`.","commonSituations":"Copy-pasting CLI examples across telemetry scripts; aliases or wrappers that append extra flags.","solutions":["Remove the unsupported argument and use only `--json` and `--days N`","Re-check the parser loop at report-active-installs.mjs:47 when adding new flags","Prefer `--help` output (or reading the parser) over guessing flag names"],"exampleFix":"# before\nnode scripts/report-active-installs.mjs --day 30\n# after\nnode scripts/report-active-installs.mjs --days 30","handlingStrategy":"validation","validationCode":"const ALLOWED = new Set(['--json', '--days']);\nconst argv = process.argv.slice(2);\nconst bad = argv.filter((a, i) => !ALLOWED.has(a) && !(i > 0 && argv[i - 1] === '--days'));\nif (bad.length) {\n  console.error(`unknown argument(s): ${bad.join(' ')} — supported: --json, --days <1-90>`);\n  process.exit(2);\n}","typeGuard":null,"tryCatchPattern":"try {\n  parseArgs(argv);\n} catch (error) {\n  if (/^unknown argument:/.test(error.message)) { console.error('usage: --json [--days N]'); process.exit(2); }\n  throw error;\n}","preventionTips":["Check the script's parser before inventing flags; each report script has its own small flag set"],"tags":["cli","arguments","validation","telemetry"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}