{"record":{"id":"0d497e82b341d14b","repo":"nanocoai/nanoclaw","slug":"flag-requires-a-value","errorCode":null,"errorMessage":"${flag} requires a value","messagePattern":"(.+?) requires a value","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"src/cli/crud.ts","lineNumber":419,"sourceCode":"\n  for (const key of Object.keys(args)) {\n    if (!allowed.has(key)) {\n      throw new Error(`unknown flag --${key.replace(/_/g, '-')}`);\n    }\n  }\n\n  const out: Record<string, unknown> = { ...args };\n  for (const def of defs) {\n    const flag = `--${def.name.replace(/_/g, '-')}`;\n    const v = args[def.name];\n    if (v === undefined) {\n      if (def.required) throw new Error(`${flag} is required`);\n      if (def.default !== undefined) out[def.name] = def.default;\n      continue;\n    }\n    // The client parses a value-less `--flag` as boolean true.\n    if (v === true && def.type !== 'boolean') {\n      throw new Error(`${flag} requires a value`);\n    }\n    switch (def.type) {\n      case 'number': {\n        const n = Number(v);\n        if (Number.isNaN(n)) throw new Error(`${flag} must be a number, got \"${v}\"`);\n        out[def.name] = n;\n        break;\n      }\n      case 'boolean': {\n        if (v === true || v === 'true' || v === '1') out[def.name] = true;\n        else if (v === false || v === 'false' || v === '0') out[def.name] = false;\n        else throw new Error(`${flag} must be true or false, got \"${v}\"`);\n        break;\n      }\n      case 'json': {\n        if (typeof v === 'string') {\n          try {\n            out[def.name] = JSON.parse(v);","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/nanocoai/nanoclaw/blob/294ef2aee85218b23ad30eda9dfe10e590b54a8c/src/cli/crud.ts#L401-L437","documentation":"The ncl client parses a value-less `--flag` as boolean `true`. When strict validation sees `true` for a flag whose declared type is not boolean (number, string, json), it throws `<flag> requires a value` — the caller wrote `--flag` but no value after it.","triggerScenarios":"`ncl tasks create --title` (nothing after --title, so the next token is consumed or the flag is bare); `--rebuild --id g1` style ordering where a value-less flag precedes another flag; a value that starts with `--` being parsed as a flag rather than a value.","commonSituations":"Truncated terminal commands; agents generating flag lists and forgetting value pairs; a value legitimately starting with a dash (e.g. negative number) needing `--flag=-5` syntax.","solutions":["Supply an explicit value: `--flag value` or `--flag=value`","For values starting with a dash, use the `=` form (`--count=-5`)","Quote multi-word values: `--message \"hello there\"`"],"exampleFix":"# before\nncl groups restart --id g1 --message\n# Error: --message requires a value\n\n# after\nncl groups restart --id g1 --message \"respawn now\"","handlingStrategy":"validation","validationCode":"for (const [k, v] of Object.entries(args)) {\n  if (v === true && !booleanFlags.has(k)) throw new Error(`--${k} needs an explicit value`);\n}","typeGuard":null,"tryCatchPattern":"catch (e) { if (e instanceof Error && /requires a value$/.test(e.message)) { /* re-prompt for the value */ } else throw e; }","preventionTips":["Always pair flags with values in generated commands; use `--flag=value` form for safety","Prefer `=` syntax when values may start with a dash"],"tags":["cli","argument-validation","missing-value","flag-parsing"],"backgroundTag":"missing-flag-value","analyzedSha":"294ef2aee85218b23ad30eda9dfe10e590b54a8c","analyzedAt":"2026-08-28T13:59:10.357Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}