{"record":{"id":"ddc18233f6effab8","repo":"Hmbown/CodeWhale","slug":"unknown-argument-arg-ddc182","errorCode":null,"errorMessage":"unknown argument: ${arg}","messagePattern":"unknown argument: (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"web/scripts/compare-deployed-facts.mjs","lineNumber":32,"sourceCode":"    expectedRevision: process.env.CODEWHALE_SOURCE_REVISION || process.env.GITHUB_SHA || null,\n    requireCurrent: false,\n    attempts: null,\n    retryDelayMs: 3_000,\n  };\n  for (let index = 0; index < argv.length; index += 1) {\n    const arg = argv[index];\n    if (arg === \"--require-current\") {\n      out.requireCurrent = true;\n    } else if (arg === \"--base-url\") {\n      out.baseUrl = argv[++index];\n    } else if (arg === \"--expected-revision\") {\n      out.expectedRevision = argv[++index];\n    } else if (arg === \"--attempts\") {\n      out.attempts = Number(argv[++index]);\n    } else if (arg === \"--retry-delay-ms\") {\n      out.retryDelayMs = Number(argv[++index]);\n    } else {\n      throw new Error(`unknown argument: ${arg}`);\n    }\n  }\n  out.attempts ??= out.requireCurrent ? 6 : 1;\n  return out;\n}\n\nfunction localRevision() {\n  try {\n    return execFileSync(\"git\", [\"rev-parse\", \"HEAD\"], {\n      cwd: REPO_ROOT,\n      encoding: \"utf8\",\n      stdio: [\"ignore\", \"pipe\", \"ignore\"],\n    }).trim();\n  } catch {\n    return null;\n  }\n}\n","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/8880682c63083a91624de936797efa3ce9e498fd/web/scripts/compare-deployed-facts.mjs#L14-L50","documentation":"compare-deployed-facts.mjs parseArgs recognizes exactly --require-current (boolean), --base-url <url>, --expected-revision <sha>, --attempts <n>, and --retry-delay-ms <ms>; anything else throws `unknown argument: ${arg}`. Note --attempts defaults to 6 when --require-current is set, otherwise 1.","triggerScenarios":"Passing unsupported or misspelled flags (--baseurl, --verbose), stray positionals, or a value flag whose missing value makes the next token be parsed as a flag and rejected.","commonSituations":"Adapting an ad-hoc curl check into this script; flags copied from another web/scripts tool; wrapper scripts appending extra arguments.","solutions":["Rerun with only the five documented flags, spelled exactly as parsed","Ensure every value flag (--base-url, --expected-revision, --attempts, --retry-delay-ms) is followed by its value — the parser does not validate missing values itself","When adding a flag, extend the else-if chain and keep the final else throw intact"],"exampleFix":"# before\nnode scripts/compare-deployed-facts.mjs --baseurl https://example.com\n# after\nnode scripts/compare-deployed-facts.mjs --base-url https://example.com","handlingStrategy":"validation","validationCode":"const VALUE_FLAGS = new Set(['--base-url', '--expected-revision', '--attempts', '--retry-delay-ms']);\nconst argv = process.argv.slice(2);\nfor (let i = 0; i < argv.length; i += 1) {\n  const a = argv[i];\n  if (VALUE_FLAGS.has(a)) { i += 1; continue; }\n  if (a !== '--require-current') {\n    console.error(`unknown argument: ${a} — see script header for usage`);\n    process.exit(2);\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  parseArgs(process.argv.slice(2));\n} catch (error) {\n  if (/^unknown argument:/.test(error.message)) { process.exit(2); }\n  throw error;\n}","preventionTips":["Read the parseArgs chain at the top of the script before adding flags","Always pair value flags with their value on the same command line"],"tags":["cli","arguments","validation","web"],"backgroundTag":null,"analyzedSha":"8880682c63083a91624de936797efa3ce9e498fd","analyzedAt":"2026-08-16T11:31:27.956Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}