{"record":{"id":"d884346cb20434a2","repo":"paperclipai/paperclip","slug":"invalid-secret-value-raw-use-key-value","errorCode":null,"errorMessage":"Invalid --secret-value \"${raw}\". Use key=value.","messagePattern":"Invalid --secret-value \"(.+?)\"\\. Use key=value\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"cli/src/commands/client/teams.ts","lineNumber":493,"sourceCode":"  if (!values || values.length === 0) return undefined;\n  const result: Record<string, string> = {};\n  for (const raw of values) {\n    const [slug, name] = parseKeyValueOption(raw, \"--name-override\", \"slug=name\");\n    if (!slug || !name) {\n      throw new Error(`Invalid --name-override \"${raw}\". Use slug=name.`);\n    }\n    result[slug] = name;\n  }\n  return result;\n}\n\nfunction parseSecretValues(values: string[] | undefined): Record<string, string> | undefined {\n  if (!values || values.length === 0) return undefined;\n  const result: Record<string, string> = {};\n  for (const raw of values) {\n    const [key, value] = parseKeyValueOption(raw, \"--secret-value\", \"key=value\");\n    if (!key) {\n      throw new Error(`Invalid --secret-value \"${raw}\". Use key=value.`);\n    }\n    result[key] = value;\n  }\n  return result;\n}\n\nfunction parseAdapterOverrides(\n  values: string[] | undefined,\n): CatalogTeamInstallOptions[\"adapterOverrides\"] | undefined {\n  if (!values || values.length === 0) return undefined;\n  const result: NonNullable<CatalogTeamInstallOptions[\"adapterOverrides\"]> = {};\n  for (const raw of values) {\n    const [slug, adapterType] = parseKeyValueOption(raw, \"--adapter-override\", \"slug=type\");\n    if (!slug || !adapterType) {\n      throw new Error(`Invalid --adapter-override \"${raw}\". Use slug=type.`);\n    }\n    result[slug] = { adapterType };\n  }","sourceCodeStart":475,"sourceCodeEnd":511,"githubUrl":"https://github.com/paperclipai/paperclip/blob/67001ec6eb96ae601aa27bc91d9b2415d665334a/cli/src/commands/client/teams.ts#L475-L511","documentation":"Thrown by parseSecretValues() when a --secret-value value, after splitting on '=' and trimming, yields an empty key. Used by `teams install` to supply secret env values. Notably only the key is required — an empty value is accepted by this check. As with --name-override, a missing '=' is caught earlier by parseKeyValueOption; this throw is for a '=' present but a blank/whitespace key.","triggerScenarios":"Passing `--secret-value =secretvalue` (empty key) or `--secret-value \" =value\"` (whitespace-only key). A `--secret-value KEY=` (empty value) does NOT trigger this error — it is accepted.","commonSituations":"Typing the flag without the key, copy-paste from a secrets file that left the key side blank, or templating that produced an empty key.","solutions":["Format as `--secret-value <key>=<value>` with a non-empty key, e.g. `--secret-value API_KEY=sk-...`.","If you intended an empty value, still supply a real key: `--secret-value MY_KEY=` is valid.","Validate each entry has a non-empty trimmed key before invoking."],"exampleFix":"# before\npaperclipai teams install <ref> --secret-value =sk-live\n# after\npaperclipai teams install <ref> --secret-value API_KEY=sk-live","handlingStrategy":"validation","validationCode":"function validSecretValue(v: string): boolean {\n  const i = v.indexOf(\"=\");\n  if (i <= 0) return false;\n  return v.slice(0, i).trim().length > 0; // value may be empty\n}\nfor (const v of secretValues) {\n  if (!validSecretValue(v)) throw new Error(`Bad --secret-value \"${v}\". Use key=value.`);\n}","typeGuard":"function isSecretValue(v: string): boolean {\n  const i = v.indexOf(\"=\");\n  return i > 0 && v.slice(0, i).trim().length > 0;\n}","tryCatchPattern":null,"preventionTips":["Format --secret-value as key=value with a non-empty key.","Remember an empty value (key=) is allowed; only the key must be present.","Avoid whitespace-only keys; trim before emitting the flag."],"tags":["cli","validation","teams","parsing","secret","install"],"backgroundTag":null,"analyzedSha":"67001ec6eb96ae601aa27bc91d9b2415d665334a","analyzedAt":"2026-08-12T12:05:45.408Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}