pbakaus/impeccable · error

{msg} (dynamic Flow::Throw message, e.g. 'Unknown provider(s

Error message

{msg} (dynamic Flow::Throw message, e.g. 'Unknown provider(s): {}' or 'Unknown install scope: {v}. Use --scope=project or --scope=global.')

What it means

In `install`, `choose_install_plan` can return `Flow::Throw(msg)` with dynamic messages such as 'Unknown provider(s): {}' or 'Unknown install scope: {v}. Use --scope=project or --scope=global.' These are printed and the command exits 1 with a hint to pass providers explicitly.

Source

Thrown at crates/skills/src/commands.rs:544

/// Sentinel for the JS `process.exit(1)` inside install's already-installed
/// `try` block (an exit, not an error, so no "Install check failed" line).
const EXIT_1: &str = "\u{0}exit1";

/// JS: install(flags)
fn install(flags: &[String], io: &mut Io) -> R<()> {
    let (sys, mut prompt) = ctx(io);
    let force = has_flag(flags, "--force");
    let yes = has_flag(flags, "-y") || has_flag(flags, "--yes");
    let install_hooks = !has_flag(flags, "--no-hooks");
    let project_root = sys.find_project_root();
    if !yes {
        print_install_intro(&prompt, io);
    }
    let plan = match choose_install_plan(&sys, &mut prompt, io, &project_root, flags, yes) {
        Ok(p) => p,
        Err(Flow::Throw(msg)) => {
            err(io, &msg);
            err(io, "Pass providers explicitly, e.g. --providers=claude,cursor");
            return Err(Flow::Exit(1));
        }
        Err(other) => return Err(other),
    };
    let InstallPlan { targets, scope, install_root, hook_root, explicit } = plan;
    let scope_opt = Some(scope);
    let existing = sys.is_already_installed(&install_root, scope_opt);
    let installed_targets: Vec<&'static str> = if existing.is_some() {
        sys.find_installed_providers(&install_root, scope_opt)
    } else {
        Vec::new()
    };
    let missing_selected_targets: Vec<&'static str> = if existing.is_some() && !force && explicit {
        targets.iter().copied().filter(|p| !installed_targets.contains(p)).collect()
    } else {
        Vec::new()
    };

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Use valid provider names, e.g. `--providers=claude,cursor`
  2. Use `--scope=project` or `--scope=global` exactly
  3. List available providers via help/docs and correct the value

Example fix

// before
impeccable install --scope=local
// after
impeccable install --scope=project
Defensive patterns

Strategy: validation

Validate before calling

const VALID_PROVIDERS = ['claude','cursor'];
if (!providers.split(',').every(p => VALID_PROVIDERS.includes(p))) throw new Error('Unknown provider');
if (!['project','global'].includes(scope)) throw new Error('Unknown scope');

Try / catch

try { await install(); } catch (e) { if (/Unknown (provider|install scope)/.test(String(e))) console.error('Fix --providers/--scope values'); }

Prevention

When it happens

Trigger: Running `impeccable install` with an unrecognized `--providers` value or an invalid `--scope` value.

Common situations: Typos like `--providers=Cluad`, unsupported scope strings like `--scope=local`, or provider names not in the supported set.

Understand the failure class

Background: Invalid enum value errors: "Unknown type", "Invalid scope", "must be one of" — when a string is not on the library's allowed list — this error's family across 23 libraries.

Related errors


AI-assisted analysis of pbakaus/impeccable@2bc2879276 (2026-09-08). Data as JSON: /api/errors/aa49d9cc0124369a. Report an issue: GitHub.