{"record":{"id":"4cde595a6cec787a","repo":"tinyhumansai/openhuman","slug":"name-requires-a-value","errorCode":null,"errorMessage":"${name} requires a value","messagePattern":"(.+?) requires a value","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"scripts/release/generate-release-notes.mjs","lineNumber":61,"sourceCode":"    argv = argv.slice(1);\n  }\n\n  const options = {\n    from: process.env.RELEASE_NOTES_FROM || DEFAULT_FROM,\n    to: process.env.RELEASE_NOTES_TO || DEFAULT_TO,\n    repo: process.env.GITHUB_REPOSITORY || null,\n    model: process.env.OPENAI_MODEL || DEFAULT_MODEL,\n    output: null,\n    noAi: false,\n    dryRun: false,\n  };\n\n  for (let index = 0; index < argv.length; index += 1) {\n    const arg = argv[index];\n    const readValue = (name) => {\n      const value = argv[index + 1];\n      if (!value || value.startsWith('--')) {\n        throw new Error(`${name} requires a value`);\n      }\n      index += 1;\n      return value;\n    };\n\n    if (arg === '--help' || arg === '-h') {\n      return { ...options, help: true };\n    }\n    if (arg === '--from') {\n      options.from = readValue(arg);\n    } else if (arg === '--to') {\n      options.to = readValue(arg);\n    } else if (arg === '--repo') {\n      options.repo = readValue(arg);\n    } else if (arg === '--model') {\n      options.model = readValue(arg);\n    } else if (arg === '--output' || arg === '-o') {\n      options.output = readValue(arg);","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/a221052e0df5b1f7598fceba7329fd1af95d6699/scripts/release/generate-release-notes.mjs#L43-L79","documentation":"In generate-release-notes.mjs option parsing, every value-taking option (--from, --to, --repo, --model, --output/-o) reads its value via readValue(): the next argv token must exist and must not start with '--'. A missing value — the option is last, or is immediately followed by another flag — throws `${name} requires a value` naming the option.","triggerScenarios":"`--from` as the last token (`node scripts/release/generate-release-notes.mjs --from`); `--from --to v1.2.3` where the parser sees the next token starting with '--' and refuses rather than consuming it as the value; a CI template variable expanding to empty leaving a dangling flag.","commonSituations":"Half-edited command lines; templated CI commands with unset variables; intentionally starting a value with '--' (unsupported — reorder or rename).","solutions":["Give every value option its argument: `--from latest-release --to latest-tag`","In CI, guard templated flags: only emit `--from \"$FROM\"` when $FROM is non-empty (`[ -n \"$FROM\" ] && set -- --from \"$FROM\" \"$@\"` style)","Note that values beginning with '--' are rejected by design — use a ref/tag name that doesn't"],"exampleFix":"# before\nnode scripts/release/generate-release-notes.mjs --from --to latest-tag\n# → Error: --from requires a value\n\n# after\nnode scripts/release/generate-release-notes.mjs --from latest-release --to latest-tag","handlingStrategy":"validation","validationCode":"const VALUE_OPTS = new Set(['--from', '--to', '--repo', '--model', '--output', '-o']);\nfor (let i = 0; i < argv.length; i++) {\n  const a = argv[i];\n  if (VALUE_OPTS.has(a)) {\n    const v = argv[i + 1];\n    if (!v || v.startsWith('--')) {\n      console.error(`${a} needs a following value`);\n      process.exit(2);\n    }\n    i++; // skip the value\n  }\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Quote-and-check templated flags in CI: only append `--from \"$FROM\"` when $FROM is non-empty","Keep option values free of a leading '--'; use tag/sha names that start alphanumerically"],"tags":["cli","validation","release","ci"],"backgroundTag":null,"analyzedSha":"a221052e0df5b1f7598fceba7329fd1af95d6699","analyzedAt":"2026-08-16T12:47:06.542Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}