{"record":{"id":"09ef435f951d18be","repo":"chenhg5/cc-connect","slug":"no-env-in-settings-config","errorCode":null,"errorMessage":"no env in settings_config","messagePattern":"no env in settings_config","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/cc-connect/provider.go","lineNumber":370,"sourceCode":"\n\tp := config.ProviderConfig{\n\t\tName: strings.ToLower(strings.ReplaceAll(strings.TrimSpace(row.Name), \" \", \"-\")),\n\t}\n\n\tswitch row.AppType {\n\tcase \"claude\":\n\t\treturn convertClaudeProvider(p, sc)\n\tcase \"codex\":\n\t\treturn convertCodexProvider(p, sc)\n\tdefault:\n\t\treturn config.ProviderConfig{}, fmt.Errorf(\"unsupported app_type %q (only claude and codex are supported)\", row.AppType)\n\t}\n}\n\nfunc convertClaudeProvider(p config.ProviderConfig, sc map[string]any) (config.ProviderConfig, error) {\n\tenv, _ := sc[\"env\"].(map[string]any)\n\tif env == nil {\n\t\treturn p, fmt.Errorf(\"no env in settings_config\")\n\t}\n\n\tif key, ok := env[\"ANTHROPIC_AUTH_TOKEN\"].(string); ok && key != \"\" {\n\t\tp.APIKey = key\n\t}\n\tif url, ok := env[\"ANTHROPIC_BASE_URL\"].(string); ok && url != \"\" {\n\t\tp.BaseURL = url\n\t}\n\tif model, ok := env[\"ANTHROPIC_MODEL\"].(string); ok && model != \"\" {\n\t\tp.Model = model\n\t}\n\n\t// Carry over any extra env vars (e.g. ANTHROPIC_DEFAULT_HAIKU_MODEL)\n\textra := make(map[string]string)\n\tknown := map[string]bool{\"ANTHROPIC_AUTH_TOKEN\": true, \"ANTHROPIC_BASE_URL\": true, \"ANTHROPIC_MODEL\": true}\n\tfor k, v := range env {\n\t\tif !known[k] {\n\t\t\tif s, ok := v.(string); ok && s != \"\" {","sourceCodeStart":352,"sourceCodeEnd":388,"githubUrl":"https://github.com/chenhg5/cc-connect/blob/4000b2338aa6e850c99df54f8b0ed6ed7460b401/cmd/cc-connect/provider.go#L352-L388","documentation":"convertClaudeProvider expects the parsed settings_config JSON to contain an `env` object holding Claude's environment (ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL, etc.). When settings_config parses as JSON but has no usable `env` key (or it is not an object), this error is returned. Without env there is nothing to extract an API key or base URL from.","triggerScenarios":"A cc-switch claude row's settings_config is a JSON object lacking `env` — e.g. {\"model\":\"...\"} or {\"env\": \"string\"} (wrong type, so the assertion to map[string]any fails and env is nil).","commonSituations":"Manually crafted DB rows; a different tool writing claude-like settings without env; cc-switch version storing env under another key like \"environment\".","solutions":["Edit the row so settings_config contains an `env` object with ANTHROPIC_AUTH_TOKEN/ANTHROPIC_BASE_URL.","Recreate the provider in cc-switch so it writes the correct structure.","Check the env value is an object, not a string.","If env lives under a different key in your data, migrate it into `env` before importing."],"exampleFix":"// before (settings_config)\n{\"model\": \"claude-3\"}\n// error: no env in settings_config\n// after\n{\"env\": {\"ANTHROPIC_AUTH_TOKEN\": \"sk-...\", \"ANTHROPIC_BASE_URL\": \"https://api.example.com\"}}","handlingStrategy":"validation","validationCode":"func claudeSettingsUsable(settingsJSON string) bool {\n    var sc map[string]any\n    if json.Unmarshal([]byte(settingsJSON), &sc) != nil { return false }\n    env, ok := sc[\"env\"].(map[string]any)\n    return ok && len(env) > 0\n}","typeGuard":"env, ok := sc[\"env\"].(map[string]any)\nif !ok || env == nil {\n    return p, fmt.Errorf(\"no env in settings_config\")\n}","tryCatchPattern":"p, err := convertCCSwitchProvider(row)\nif err != nil && strings.Contains(err.Error(), \"no env in settings_config\") {\n    return fmt.Errorf(\"provider %q has no env block; re-create it in cc-switch\", row.Name)\n}","preventionTips":["Ensure claude provider rows always contain an env object with ANTHROPIC_AUTH_TOKEN/ANTHROPIC_BASE_URL.","Confirm env is a JSON object, never a string.","Re-create providers in the cc-switch UI rather than hand-writing JSON.","Validate settings_config against the expected schema before import."],"tags":["go","json","cc-switch","claude"],"backgroundTag":"missing-required-config-field","analyzedSha":"4000b2338aa6e850c99df54f8b0ed6ed7460b401","analyzedAt":"2026-09-06T11:45:09.575Z","contentChangedAt":"2026-09-06T11:45:09.575Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}