{"record":{"id":"77e5d25f15e01092","repo":"pbakaus/impeccable","slug":"pass-one-explicitly-e-g-providers-claude-curso","errorCode":null,"errorMessage":"Pass one explicitly, e.g. --providers=claude,cursor","messagePattern":"Pass one explicitly, e\\.g\\. --providers=claude,cursor","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/skills/src/commands.rs","lineNumber":470,"sourceCode":"fn link(flags: &[String], io: &mut Io) -> R<()> {\n    let (sys, mut prompt) = ctx(io);\n    let force = has_flag(flags, \"--force\");\n    let yes = has_flag(flags, \"-y\") || has_flag(flags, \"--yes\");\n    let source_value = get_flag_value(flags, \"--source\");\n    let providers_value = get_flag_value(flags, \"--providers\");\n    let root = sys.find_project_root();\n\n    let source = match bundle::resolve_link_source(source_value, &root) {\n        Ok(s) => s,\n        Err(e) => {\n            err(io, &e);\n            return Err(Flow::Exit(1));\n        }\n    };\n    let targets = sys.resolve_install_targets(&root, providers_value);\n    if targets.is_empty() {\n        err(io, \"Could not determine a target harness folder.\");\n        err(io, \"Pass one explicitly, e.g. --providers=claude,cursor\");\n        return Err(Flow::Exit(1));\n    }\n    if !yes {\n        out(io, &format!(\"Source checkout: {}\", source.checkout_root));\n        out(io, &format!(\"Target harness folder(s): {}\", targets.join(\", \")));\n        let ans = prompt.ask(io, &format!(\"Link impeccable skills into {} folder(s)? (Y/n) \", targets.len()))?;\n        if ans == \"n\" || ans == \"no\" {\n            out(io, \"Aborted. Re-run with --providers=<names> to choose explicitly (e.g. --providers=claude,cursor).\");\n            return Err(Flow::Exit(0));\n        }\n    }\n    let result = bundle::link_provider_skills(io, &source.bundle_root, &root, &targets, force).map_err(Flow::Throw)?;\n    // Linked installs are excluded from install/update refreshes (overwriting\n    // a symlink would destroy the link), so this is the only path that can\n    // deliver the OpenCode command bridge to them. A copy, not a symlink: the\n    // bridge is static and OpenCode scans the real commands dir. No-ops when\n    // the source checkout has no built commands (#483).\n    bundle::copy_provider_commands(&sys, &source.bundle_root, &root, &targets, Some(Scope::Project));","sourceCodeStart":452,"sourceCodeEnd":488,"githubUrl":"https://github.com/pbakaus/impeccable/blob/2bc2879276c1f321a53c4ca99d3371e411329b52/crates/skills/src/commands.rs#L452-L488","documentation":"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.","triggerScenarios":"Same as the missing-target error: `impeccable link` invoked with no `--providers` flag and no detectable harness folders.","commonSituations":"Users relying on auto-detection in an empty workspace or a non-standard setup.","solutions":["Add `--providers=claude,cursor` (or your providers of choice) to the link command","Consult the provider list in the docs and pick valid values"],"exampleFix":"// before\nimpeccable link\n// after\nimpeccable link --providers=claude","handlingStrategy":"validation","validationCode":"if (!/--providers=/.test(cmd)) warn('link requires --providers=claude,cursor');","typeGuard":null,"tryCatchPattern":"try { await link(); } catch (e) { if (/--providers=/.test(String(e))) console.error('Add explicit providers'); }","preventionTips":["Include --providers in all link invocations","Document valid provider values in your team scripts"],"tags":["cli","link","hint"],"backgroundTag":"missing-required-flag","analyzedSha":"2bc2879276c1f321a53c4ca99d3371e411329b52","analyzedAt":"2026-09-08T04:51:14.109Z","contentChangedAt":"2026-09-08T04:51:14.109Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}