{"record":{"id":"f70df384469a827d","repo":"jackwener/OpenCLI","slug":"unknown-brand-brandarg-pass-a-known-chinese","errorCode":null,"errorMessage":"unknown brand '${brandArg}'. Pass a known Chinese brand name (e.g. 宝马 / 比亚迪 / 理想) or a single A-Z catalog letter.","messagePattern":"unknown brand '(.+?)'\\. Pass a known Chinese brand name \\(e\\.g\\. 宝马 / 比亚迪 / 理想\\) or a single A-Z catalog letter\\.","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/autohome/utils.js","lineNumber":76,"sourceCode":"    日产: 'R', 荣威: 'R',\n    斯巴鲁: 'S', 斯柯达: 'S', 三菱: 'S', 上汽大通: 'S', 思皓: 'S', 赛力斯: 'S', smart: 'S',\n    特斯拉: 'T', 腾势: 'T', 坦克: 'T',\n    沃尔沃: 'W', 五菱: 'W', 蔚来: 'W', 威马: 'W', 魏牌: 'W', 问界: 'W',\n    现代: 'X', 雪佛兰: 'X', 雪铁龙: 'X', 小鹏: 'X', 星途: 'X', 小米: 'X',\n    英菲尼迪: 'Y', 一汽: 'Y', 野马: 'Y', 仰望: 'Y',\n    智己: 'Z', 中华: 'Z', 众泰: 'Z',\n};\n\n/** Resolve a brand name to its catalog initial letter. */\nexport function resolveBrandInitial(brandArg) {\n    const raw = String(brandArg || '').trim();\n    if (!raw) throw new ArgumentError('brand must be a non-empty value');\n    // single A-Z letter passes through (advanced: fetch a whole letter page)\n    if (/^[A-Za-z]$/.test(raw)) return raw.toUpperCase();\n    const key = raw.replace(/[·\\s]/g, '');\n    if (BRAND_INITIAL[key]) return BRAND_INITIAL[key];\n    if (BRAND_INITIAL[raw]) return BRAND_INITIAL[raw];\n    throw new ArgumentError(\n        'brand',\n        `unknown brand '${brandArg}'. Pass a known Chinese brand name (e.g. 宝马 / 比亚迪 / 理想) or a single A-Z catalog letter.`,\n    );\n}\n\n/** Normalize a series id: a bare number or an autohome URL containing it. */\nexport function normalizeSeriesId(rawInput) {\n    const raw = String(rawInput || '').trim();\n    if (!raw) throw new ArgumentError('series_id must be a non-empty value');\n    const m = raw.match(/\\/(?:s)?(\\d+)(?:\\/|$|\\.)/) || raw.match(/^s?(\\d+)$/);\n    if (!m) {\n        throw new ArgumentError(`'${rawInput}' does not look like an autohome series id (a number, or a k.autohome.com.cn/<id> URL)`);\n    }\n    return m[1];\n}\n\nexport function clean(s) {\n    return String(s == null ? '' : s).replace(/\\s+/g, ' ').trim();","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/autohome/utils.js#L58-L94","documentation":"ArgumentError thrown by resolveBrandInitial when the brand argument is non-empty but not a single A-Z letter and not found in the BRAND_INITIAL lookup table (after stripping · and whitespace). The library only knows a fixed catalog of Chinese brand names and cannot resolve anything else to an initial letter.","triggerScenarios":"Passing an English brand name ('BMW', 'Toyota'), pinyin ('baoma'), an unknown/obscure Chinese brand not in BRAND_INITIAL, or a letter combined with other characters ('AB').","commonSituations":"Users typing brands in English or pinyin out of habit; brands added to Autohome after the table was written; typos in Chinese characters that miss the lookup key.","solutions":["Use a known simplified-Chinese brand name from the table, e.g. 宝马, 比亚迪, 理想.","Alternatively pass a single A-Z catalog letter (e.g. B) to browse that letter's page and find the exact name.","If the brand is genuinely new, add it to the BRAND_INITIAL map in clis/autohome/utils.js with its correct initial."],"exampleFix":"// before\nopencli autohome brand 'BMW'\n// after\nopencli autohome brand '宝马'","handlingStrategy":"validation","validationCode":"const KNOWN = ['宝马','比亚迪','理想']; // extend from BRAND_INITIAL\nif (!/^[A-Za-z]$/.test(brand) && !KNOWN.includes(brand)) {\n  throw new Error(`unknown brand '${brand}' — use a known Chinese name or A-Z letter`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await run(['autohome', 'brand', brand]);\n} catch (e) {\n  if (/unknown brand/.test(e.message)) {\n    console.error('Use simplified Chinese (宝马/比亚迪/理想) or a single letter like B');\n  } else throw e;\n}","preventionTips":["Maintain a validated brand-name list sourced from BRAND_INITIAL in utils.js.","Never pass English or pinyin brand names; translate to the official Chinese name first.","For new brands, extend the BRAND_INITIAL map rather than hoping lookup succeeds."],"tags":["validation","arguments","lookup"],"backgroundTag":"unknown-brand-name","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}