pbakaus/impeccable · error

Pass one explicitly, e.g. --providers=claude,cursor

Error message

Pass one explicitly, e.g. --providers=claude,cursor

What it means

Follow-up hint in link when sys.resolve_install_targets returned an empty list — no harness folder could be auto-detected for the project (and none was selectable from --providers). This line tells the user to name the target provider folders explicitly.

Source

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

fn link(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 source_value = get_flag_value(flags, "--source");
    let providers_value = get_flag_value(flags, "--providers");
    let root = sys.find_project_root();

    let source = match bundle::resolve_link_source(source_value, &root) {
        Ok(s) => s,
        Err(e) => {
            err(io, &e);
            return Err(Flow::Exit(1));
        }
    };
    let targets = sys.resolve_install_targets(&root, providers_value);
    if targets.is_empty() {
        err(io, "Could not determine a target harness folder.");
        err(io, "Pass one explicitly, e.g. --providers=claude,cursor");
        return Err(Flow::Exit(1));
    }
    if !yes {
        out(io, &format!("Source checkout: {}", source.checkout_root));
        out(io, &format!("Target harness folder(s): {}", targets.join(", ")));
        let ans = prompt.ask(io, &format!("Link impeccable skills into {} folder(s)? (Y/n) ", targets.len()))?;
        if ans == "n" || ans == "no" {
            out(io, "Aborted. Re-run with --providers=<names> to choose explicitly (e.g. --providers=claude,cursor).");
            return Err(Flow::Exit(0));
        }
    }
    let result = bundle::link_provider_skills(io, &source.bundle_root, &root, &targets, force).map_err(Flow::Throw)?;
    // Linked installs are excluded from install/update refreshes (overwriting
    // a symlink would destroy the link), so this is the only path that can
    // deliver the OpenCode command bridge to them. A copy, not a symlink: the
    // bridge is static and OpenCode scans the real commands dir. No-ops when
    // the source checkout has no built commands (#483).
    bundle::copy_provider_commands(&sys, &source.bundle_root, &root, &targets, Some(Scope::Project));

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Add `--providers=claude,cursor` (or your providers of choice) to the link command
  2. Consult the provider list in the docs and pick valid values

Example fix

// before
impeccable link
// after
impeccable link --providers=claude
Defensive patterns

Strategy: validation

Validate before calling

if (!/--providers=/.test(cmd)) warn('link requires --providers=claude,cursor');

Try / catch

try { await link(); } catch (e) { if (/--providers=/.test(String(e))) console.error('Add explicit providers'); }

Prevention

When it happens

Trigger: Same as the missing-target error: `impeccable link` invoked with no `--providers` flag and no detectable harness folders.

Common situations: Users relying on auto-detection in an empty workspace or a non-standard setup.

Understand the failure class

Background: "--flag is required" and "must specify" CLI errors: how missing-required-flag validation works and how to fix it — this error's family across 20 libraries.

Related errors


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