{"record":{"id":"2b4b93a1fd3ea0b2","repo":"Hmbown/CodeWhale","slug":"unknown-provider-slug-known","errorCode":null,"errorMessage":"unknown provider '{slug}'. Known: {}","messagePattern":"unknown provider '(.+?)'\\. Known: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/remote_setup/mod.rs","lineNumber":188,"sourceCode":"        bail!(\n            \"--bridge is required in --non-interactive mode. {}\",\n            bridge_choices()\n        );\n    }\n    let idx = prompt_choice(\n        \"Chat bridge\",\n        &BRIDGES\n            .iter()\n            .map(|b| format!(\"{} ({})\", b.display, b.slug))\n            .collect::<Vec<_>>(),\n    )?;\n    Ok(&BRIDGES[idx])\n}\n\nfn resolve_provider(args: &RemoteSetupArgs) -> Result<ProviderInfo> {\n    if let Some(slug) = &args.provider {\n        return ProviderInfo::from_slug(slug).ok_or_else(|| {\n            anyhow::anyhow!(\n                \"unknown provider '{slug}'. Known: {}\",\n                codewhale_config::ProviderKind::names_hint()\n            )\n        });\n    }\n    if args.non_interactive {\n        bail!(\n            \"--provider is required in --non-interactive mode. Known: {}\",\n            codewhale_config::ProviderKind::names_hint()\n        );\n    }\n    // List providers by their canonical names from the existing registry.\n    let providers: Vec<ProviderInfo> = codewhale_config::ProviderKind::all()\n        .iter()\n        .filter_map(|kind| ProviderInfo::from_slug(kind.as_str()))\n        .collect();\n    let labels: Vec<String> = providers\n        .iter()","sourceCodeStart":170,"sourceCodeEnd":206,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/73e0f67d83c59909b571efdfc88c4bc28c309cb1/crates/tui/src/remote_setup/mod.rs#L170-L206","documentation":"resolve_provider resolves the --provider flag via ProviderInfo::from_slug and, when the slug matches no known provider kind, throws listing the known provider names from codewhale_config::ProviderKind::names_hint().","triggerScenarios":"Running remote setup with `--provider <slug>` where the slug is not a valid provider kind name (misspelling, wrong case, unknown provider).","commonSituations":"Typos like `--provider anthropc`, using display names instead of slugs, or scripts referencing removed providers.","solutions":["Use one of the names from the 'Known:' list in the error message","Omit --provider to choose interactively","Check codewhale_config::ProviderKind::names_hint() for the exact accepted names","Fix casing — slugs are matched exactly"],"exampleFix":"// before\ncodewhale remote-setup --provider z.ai-grok\n// after\ncodewhale remote-setup --provider zai","handlingStrategy":"validation","validationCode":"if let Some(slug) = &args.provider {\n    if codewhale_config::ProviderKind::from_name(slug).is_none() {\n        eprintln!(\"--provider must be one of: {}\",\n            codewhale_config::ProviderKind::names_hint());\n        std::process::exit(2);\n    }\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = run_remote_setup(args) {\n    if e.to_string().starts_with(\"unknown provider\") {\n        eprintln!(\"{e}\");\n        std::process::exit(2);\n    }\n    return Err(e);\n}","preventionTips":["Use exactly the names from names_hint() — case-sensitive","Never pass provider display names where slugs are expected","Prune removed providers from scripts after upgrades","Validate flags at script start with a dry check"],"tags":["cli","validation","slug","provider"],"backgroundTag":"invalid-cli-argument","analyzedSha":"73e0f67d83c59909b571efdfc88c4bc28c309cb1","analyzedAt":"2026-09-22T01:30:00.501Z","contentChangedAt":"2026-09-22T01:30:00.501Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}