{"record":{"id":"9f58b6d6fb8a74a0","repo":"JuliusBrussee/caveman","slug":"unknown-option-arg","errorCode":null,"errorMessage":"unknown option ${arg}","messagePattern":"unknown option (.+?)","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/cli/src/stats-cli.ts","lineNumber":52,"sourceCode":"  const seen = new Set<string>();\n  const valueFlags = new Set([\"--days\", \"--provider\", \"--model\", \"--agent\", \"--auth\", \"--out\"]);\n  for (let i = 0; i < argv.length; i++) {\n    const arg = argv[i]!;\n    if (seen.has(arg)) throw new Error(`duplicate ${arg}`);\n    seen.add(arg);\n    if (valueFlags.has(arg)) {\n      const value = argv[++i];\n      if (!value || value.startsWith(\"--\") || /[\\u0000-\\u001f\\u007f]/u.test(value)) throw new Error(`${arg} requires a value`);\n      if (arg === \"--days\" && (!/^\\d+$/u.test(value) || Number(value) < 1 || Number(value) > 3660)) {\n        throw new Error(\"--days must be an integer from 1 to 3660\");\n      }\n      if (arg === \"--out\") result.out = value;\n      else result.filters.push(arg, value);\n    } else if (arg === \"--json\") result.json = true;\n    else if (arg === \"--plain\" || arg === \"--no-open\") result.plain = true;\n    else if (arg === \"--open\") result.open = true;\n    else if (arg === \"--all-time\") result.filters.push(\"--days\", \"0\");\n    else throw new Error(`unknown option ${arg}`);\n  }\n  if (seen.has(\"--days\") && seen.has(\"--all-time\")) throw new Error(\"choose --days or --all-time\");\n  if (result.plain && result.open) throw new Error(\"choose --plain or --open\");\n  if (result.json && result.open) throw new Error(\"--json cannot open a browser\");\n  return result;\n}\n\ntype StatsMetrics = {\n  requests: number;\n  successful_requests: number;\n  failed_requests: number;\n  input_tokens: number;\n  output_tokens: number;\n  cache_read_tokens: number;\n  cache_write_tokens: number;\n  complete_usage_requests: number;\n  partial_usage_requests: number;\n  measured_requests: number;","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/cli/src/stats-cli.ts#L34-L70","documentation":"Any argument that is not one of the recognized flags (--days, --provider, --model, --agent, --auth, --out, --json, --plain, --no-open, --open, --all-time) is rejected with this error. The parser is strict: no abbreviations, no '--flag=value' shorthand, no unknown filters.","triggerScenarios":"Typo like `--day 7` or `--jsn`; using `--days=7` syntax the parser doesn't support (the '=' form becomes an unknown option); passing a free-form positional argument such as a path or subcommand.","commonSituations":"Muscle-memory flags from other CLIs (--verbose, --format); shell scripts passing leftover positional args; users guessing at filter flag names.","solutions":["Check the flag spelling against the accepted list and fix the typo (e.g. --day → --days)","Convert `--flag=value` to space-separated form: `--days 7`","Remove any positional/free-form argument; filters are expressed via the supported flags like --provider, --model, --agent"],"exampleFix":"// before\nmyapp stats --days=7\n// after\nmyapp stats --days 7","handlingStrategy":"validation","validationCode":"const KNOWN = new Set([\"--days\",\"--provider\",\"--model\",\"--agent\",\"--auth\",\"--out\",\"--json\",\"--plain\",\"--no-open\",\"--open\",\"--all-time\"]);\nconst unknown = argv.filter(a => a.startsWith(\"--\") && !KNOWN.has(a));\nif (unknown.length) throw new Error(`unknown option ${unknown[0]}`);","typeGuard":null,"tryCatchPattern":"try {\n  const opts = parseStatsOptions(argv);\n} catch (e) {\n  if (String(e.message).startsWith(\"unknown option \")) {\n    console.error(`${e.message} — see docs for accepted flags`); process.exitCode = 2;\n  } else throw e;\n}","preventionTips":["Validate flags against the known list before invoking","Use space-separated form, not --flag=value","Fuzzy-check typos (levenshtein) against known flags in wrapper tooling"],"tags":["cli","argument-parsing"],"backgroundTag":"invalid-cli-argument","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}