{"record":{"id":"0858a33331b6ca41","repo":"JuliusBrussee/caveman","slug":"no-provider-credential-detected-pass-provider","errorCode":null,"errorMessage":"no provider credential detected; pass --provider","messagePattern":"no provider credential 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":"chooseProvider auto-detects which LLM provider to use from environment variables (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY/GOOGLE_API_KEY). If none are set AND stdin/stdout is not a TTY (so the interactive picker cannot run), it throws telling you to pass --provider explicitly.","triggerScenarios":"No provider env vars are set and the command runs in a non-interactive context: CI pipeline, piped/redirected stdio, non-interactive shell, docker build, or scripted execution with no terminal.","commonSituations":"Fresh machine where credentials were never exported; CI secrets not configured for the job; running inside Docker or a script where stdin is not a TTY; env vars set only in an interactive shell profile not loaded by the runner.","solutions":["Pass the provider explicitly: `--provider anthropic` (or openai/google)","Export the matching API key env var (ANTHROPIC_API_KEY, OPENAI_API_KEY, or GEMINI_API_KEY/GOOGLE_API_KEY) before running","In CI, add the credential to the job's secrets/environment"],"exampleFix":"// before (CI, no env)\nnpm create @caveman-ai/agent@latest my-app\n// after\nANTHROPIC_API_KEY=sk-... npm create @caveman-ai/agent@latest my-app\n// or\nnpm create @caveman-ai/agent@latest my-app -- --provider anthropic","handlingStrategy":"validation","validationCode":"const hasProviderEnv = [\"ANTHROPIC_API_KEY\", \"OPENAI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]\n  .some(k => Boolean(process.env[k]));\nif (!hasProviderEnv && !process.stdout.isTTY) {\n  process.argv.push(\"--provider\", \"anthropic\"); // pick explicitly in non-interactive contexts\n}","typeGuard":"function providerCredentialPresent(): boolean {\n  return [\"ANTHROPIC_API_KEY\", \"OPENAI_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_API_KEY\"]\n    .some(k => Boolean(process.env[k]));\n}","tryCatchPattern":"try {\n  await main();\n} catch (error) {\n  if (error instanceof Error && error.message.includes(\"no provider credential detected\")) {\n    console.error(\"Set an API key env var or pass --provider <anthropic|openai|google>\");\n    process.exitCode = 1;\n  } else throw error;\n}","preventionTips":["In CI/scripts, always pass --provider explicitly","Export the provider API key in the environment before running","Remember interactive prompting only works with a real TTY"],"tags":["cli","environment","configuration"],"backgroundTag":"missing-env-var","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"}