{"record":{"id":"f1af7edd1929f491","repo":"jackwener/OpenCLI","slug":"huodongxing-date-must-be-dateto","errorCode":null,"errorMessage":"huodongxing date must be <= dateTo","messagePattern":"huodongxing date must be <= dateTo","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/huodongxing/events.js","lineNumber":74,"sourceCode":"    return null;\n  }\n  return dateOrdinal(year, month, day);\n}\n\nfunction requireYmdArg(value, label) {\n  const text = cleanText(value);\n  if (!text) return '';\n  if (parseYmd(text) == null) {\n    throw new ArgumentError(`huodongxing ${label} must be a valid YYYY-MM-DD date`);\n  }\n  return text;\n}\n\nfunction requireDateRangeArgs(args = {}) {\n  const date = requireYmdArg(args.date, 'date');\n  const dateTo = requireYmdArg(args.dateTo, 'dateTo');\n  if (date && dateTo && parseYmd(date) > parseYmd(dateTo)) {\n    throw new ArgumentError('huodongxing date must be <= dateTo');\n  }\n  return { date, dateTo };\n}\n\nfunction unwrapEvaluateResult(payload) {\n  if (payload && !Array.isArray(payload) && typeof payload === 'object' && 'session' in payload && 'data' in payload) {\n    return payload.data;\n  }\n  return payload;\n}\n\nfunction localDateOrdinal(date) {\n  return dateOrdinal(date.getFullYear(), date.getMonth() + 1, date.getDate());\n}\n\nfunction parseMonthDayToken(token, year) {\n  const match = cleanText(token).match(/(\\d{1,2})\\/(\\d{1,2})/);\n  if (!match) return null;","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/huodongxing/events.js#L56-L92","documentation":"requireDateRangeArgs validates the optional date/dateTo range for huodongxing event queries. Both values must be YYYYMMDD strings, and if both are present the start date must not be after the end date. This fail-fast ArgumentError prevents issuing a browser query that can never match.","triggerScenarios":"Calling filterRowsByDateRange (or a command using dateRange) with args where parseYmd(args.date) > parseYmd(args.dateTo), e.g. date='20260110', dateTo='20260101'.","commonSituations":"Swapping start/end fields when building a tool call; copying a single-day range and only editing one side; timezone/locale confusion producing a later start date than end date.","solutions":["Swap the values so date <= dateTo","Set only one of date or dateTo if a one-sided range is intended (both are optional)","Verify both values are YYYYMMDD strings that parseYmd accepts"],"exampleFix":"// before\nrequireDateRangeArgs({ date: '20260110', dateTo: '20260101' });\n// after\nrequireDateRangeArgs({ date: '20260101', dateTo: '20260110' });","handlingStrategy":"validation","validationCode":"function isValidYmd(s){return typeof s==='string'&&/^\\d{8}$/.test(s);}\nif (args.date && args.dateTo && isValidYmd(args.date) && isValidYmd(args.dateTo) && args.date > args.dateTo) {\n  [args.date, args.dateTo] = [args.dateTo, args.date]; // or reject\n}","typeGuard":"const isYmdRange = r => (r.date == null || /^\\d{8}$/.test(r.date)) && (r.dateTo == null || /^\\d{8}$/.test(r.dateTo)) && (!(r.date && r.dateTo) || r.date <= r.dateTo);","tryCatchPattern":"try { const { date, dateTo } = requireDateRangeArgs(args); } catch (e) { if (e.name === 'ArgumentError' && /date must be <= dateTo/.test(e.message)) { /* swap or prompt user for corrected range */ } else throw e; }","preventionTips":["Always pass the range as (earlier, later) — swap or sort dates before calling","Only send date or dateTo when you actually mean a one-sided bound","Keep dates as YYYYMMDD strings; avoid locale-formatted dates"],"tags":["argument-validation","date-range","cli"],"backgroundTag":"invalid-date-range-arguments","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}