{"record":{"id":"4d8c0f81caa6d11f","repo":"jackwener/OpenCLI","slug":"storage-must-be-local-or-session","errorCode":null,"errorMessage":"storage must be \"local\" or \"session\"","messagePattern":"storage must be \"local\" or \"session\"","errorType":"validation","errorClass":"ArgumentError","httpStatus":null,"severity":"error","filePath":"clis/antigravity/storage.js","lineNumber":92,"sourceCode":"\n// ====== Renderer-side: storage-keys ======\ncli({\n    site: 'antigravity',\n    name: 'storage-keys',\n    access: 'read',\n    description: 'List localStorage / sessionStorage keys on the Antigravity renderer (CDP).',\n    domain: '127.0.0.1',\n    strategy: Strategy.UI,\n    browser: true,\n    args: [\n        { name: 'storage', required: false, default: 'local', help: '\"local\" or \"session\"' },\n        { name: 'filter', required: false, help: 'Case-insensitive substring filter' },\n        { name: 'limit', type: 'int', required: false, default: 100, help: 'Max rows to return' },\n    ],\n    columns: STORAGE_COLUMNS,\n    func: async (page, kwargs) => {\n        const s = String(kwargs?.storage || 'local').trim().toLowerCase();\n        if (s !== 'local' && s !== 'session') throw new ArgumentError('storage', 'must be \"local\" or \"session\"');\n        const store = s === 'session' ? 'sessionStorage' : 'localStorage';\n        const raw = unwrapEvaluateResult(await page.evaluate(`(() => {\n      const s = ${store};\n      const out = [];\n      for (let i = 0; i < s.length; i++) {\n        const k = s.key(i); const v = s.getItem(k) || '';\n        out.push({ k, bytes: v.length });\n      }\n      return out;\n    })()`));\n        const flt = kwargs?.filter ? String(kwargs.filter).toLowerCase() : null;\n        const filtered = flt ? raw.filter((r) => r.k.toLowerCase().includes(flt)) : raw;\n        if (!filtered.length) throw new EmptyResultError('antigravity storage-keys', flt ? `No keys match \"${flt}\".` : `${store} is empty.`);\n        filtered.sort((a, b) => a.k.localeCompare(b.k));\n        const limit = Number.isInteger(kwargs?.limit) && kwargs.limit > 0 ? kwargs.limit : 100;\n        return filtered.slice(0, limit).map((r, i) => ({ Index: i + 1, Key: r.k, Bytes: r.bytes }));\n    },\n});","sourceCodeStart":74,"sourceCodeEnd":110,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/antigravity/storage.js#L74-L110","documentation":"The storage-keys command accepts a --storage argument that must be exactly \"local\" or \"session\" (after trimming and lowercasing). ArgumentError is thrown for any other value, e.g. \"localStorage\", \"Local\", or \"disk\". This is a strict enum validation of the caller-supplied keyword argument.","triggerScenarios":"Running `opencli antigravity storage-keys --storage localStorage`, `--storage SESSION` (uppercase not normalized before compare? it is lowercased, so only non-local/session strings fail), `--storage ''` resolves to default, but `--storage cache`, `--storage indexeddb` all throw.","commonSituations":"Typing the full Web API name 'localStorage' instead of 'local', guessing other stores like 'indexeddb' or 'cookie' are supported here, or scripting with a variable that holds the wrong token.","solutions":["Use --storage local (default) or --storage session exactly.","Omit --storage to get localStorage behavior.","For IndexedDB use the separate `idb-list` command; for cookies use `cookies`.","Normalize your script variable: value.trim().toLowerCase() before passing."],"exampleFix":"// before\nopencli antigravity storage-keys --storage localStorage\n// after\nopencli antigravity storage-keys --storage local","handlingStrategy":"validation","validationCode":"const storage = (process.argv.store || 'local').trim().toLowerCase();\nif (!['local', 'session'].includes(storage)) throw new Error(`storage must be \"local\" or \"session\", got: ${storage}`);","typeGuard":"function isStorageKind(v) {\n  return v === 'local' || v === 'session';\n}","tryCatchPattern":"try {\n  execSync(`opencli antigravity storage-keys --storage ${storage}`);\n} catch (e) {\n  if (/storage must be \"local\" or \"session\"/.test(e.message)) {\n    console.error(`Bad --storage value; use local|session (got ${storage})`);\n  } else throw e;\n}","preventionTips":["Use only the literal tokens 'local' and 'session'.","normalize with trim().toLowerCase() in wrapper scripts before passing the flag.","Omit the flag entirely to get the default (local).","Remember IndexedDB and cookies have their own commands (idb-list, cookies)."],"tags":["argument-validation","storage","cli","antigravity"],"backgroundTag":"invalid-argument-value","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}