{"record":{"id":"f895c19d00e13f0a","repo":"JuliusBrussee/caveman","slug":"multiple-provider-credentials-detected-pass-pro","errorCode":null,"errorMessage":"multiple provider credentials detected; pass --provider","messagePattern":"multiple provider credentials detected; pass --provider","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/create-caveman-agent/src/index.ts","lineNumber":139,"sourceCode":"    \"TEMP\", \"TMP\", \"TMPDIR\", \"LANG\", \"LC_ALL\", \"LC_CTYPE\", \"TZ\", \"CI\", \"NO_COLOR\", \"FORCE_COLOR\",\n    \"HTTP_PROXY\", \"HTTPS_PROXY\", \"NO_PROXY\", \"http_proxy\", \"https_proxy\", \"no_proxy\",\n    \"NPM_CONFIG_CACHE\", \"NPM_CONFIG_REGISTRY\", \"NPM_CONFIG_USERCONFIG\",\n    \"npm_config_cache\", \"npm_config_registry\", \"npm_config_userconfig\",\n  ]) {\n    if (process.env[key] !== undefined) env[key] = process.env[key];\n  }\n  return env;\n}\n\nasync function chooseProvider(flag: string | undefined): Promise<Provider> {\n  if (flag !== undefined) return parseProvider(flag);\n  const detected: Provider[] = [];\n  if (process.env.ANTHROPIC_API_KEY) detected.push(\"anthropic\");\n  if (process.env.OPENAI_API_KEY) detected.push(\"openai\");\n  if (process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY) detected.push(\"google\");\n  if (detected.length === 1) return detected[0]!;\n  if (!process.stdin.isTTY || !process.stdout.isTTY) {\n    throw new Error(\n      detected.length === 0\n        ? \"no provider credential detected; pass --provider\"\n        : \"multiple provider credentials detected; pass --provider\",\n    );\n  }\n  const rl = createInterface({ input: process.stdin, output: process.stdout });\n  try {\n    const answer = await rl.question(\"Provider (anthropic/openai/google): \");\n    return parseProvider(answer);\n  } finally {\n    rl.close();\n  }\n}\n\nfunction projectFiles(name: string, provider: Provider): Record<string, string> {\n  return {\n    \"package.json\": `${JSON.stringify({\n      name,","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/packages/create-caveman-agent/src/index.ts#L121-L157","documentation":"When credentials for more than one provider are present in the environment and stdio is not a TTY, chooseProvider cannot disambiguate and cannot prompt interactively, so it throws asking for an explicit --provider choice.","triggerScenarios":"Two or more of ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY/GOOGLE_API_KEY are set simultaneously and the command runs non-interactively (CI, piped output, script).","commonSituations":"Developers with keys for several providers in their shell profile running the scaffolder from a script; CI runners that export multiple vendor keys globally; leftover keys from previous experiments.","solutions":["Pass --provider with the desired value to disambiguate","Temporarily unset the extra keys (`unset OPENAI_API_KEY`) so only one is detected","In CI, scope secrets to just the provider you intend to use","Run interactively in a TTY, where a prompt lets you pick instead of throwing"],"exampleFix":"// before\nnpm create @caveman-ai/agent@latest my-app   # both ANTHROPIC_API_KEY and OPENAI_API_KEY set, non-TTY\n// after\nnpm create @caveman-ai/agent@latest my-app -- --provider openai","handlingStrategy":"validation","validationCode":"const keys = [\"ANTHROPIC_API_KEY\", \"OPENAI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]\n  .filter(k => Boolean(process.env[k]));\nif (keys.length > 1 && !process.argv.includes(\"--provider\")) {\n  process.argv.push(\"--provider\", \"anthropic\"); // disambiguate before running\n}","typeGuard":"function exactlyOneProviderCredential(): boolean {\n  return [\"ANTHROPIC_API_KEY\", \"OPENAI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]\n    .filter(k => Boolean(process.env[k])).length === 1;\n}","tryCatchPattern":"try {\n  await main();\n} catch (error) {\n  if (error instanceof Error && error.message.includes(\"multiple provider credentials\")) {\n    console.error(\"Multiple provider keys detected; pass --provider to choose one\");\n    process.exitCode = 1;\n  } else throw error;\n}","preventionTips":["Scope CI secrets to a single provider when scaffolding","Pass --provider whenever multiple vendor keys are exported","Periodically prune stale API keys from shell profiles"],"tags":["cli","environment","configuration"],"backgroundTag":"missing-required-flag","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}