{"record":{"id":"4cd20e7297bc6286","repo":"pbakaus/impeccable","slug":"nothing-was-linked-had-no-variants-for","errorCode":null,"errorMessage":"Nothing was linked: {} had no variants for {}.","messagePattern":"Nothing was linked: (.+?) had no variants for (.+?)\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/skills/src/commands.rs","lineNumber":494,"sourceCode":"        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));\n    if result.linked == 0 && result.already == 0 {\n        if result.skipped > 0 {\n            err(io, \"Nothing was linked because matching skill folders already exist.\");\n            err(io, \"Existing skills were left untouched. Re-run with --force to replace them with links.\");\n        } else {\n            err(io, &format!(\"Nothing was linked: {} had no variants for {}.\", source.bundle_root, targets.join(\", \")));\n        }\n        return Err(Flow::Exit(1));\n    }\n    // Linked skill dirs resolve into the source checkout; repair the\n    // launcher/binary executable bit there too (through the symlink), so a\n    // checkout whose copier dropped modes still runs.\n    for provider in &targets {\n        let skills_dir = util::jsp::join(&[&root, provider, \"skills\"]);\n        for skill in util::read_dir_names(&skills_dir).unwrap_or_default() {\n            let dir = util::jsp::join(&[&skills_dir, &skill]);\n            if util::is_dir(&dir) {\n                crate::engine_binary::ensure_executable_scripts(&dir);\n            }\n        }\n    }\n    let mut parts = Vec::new();\n    if result.linked > 0 {\n        parts.push(format!(\"{} linked\", result.linked));","sourceCodeStart":476,"sourceCodeEnd":512,"githubUrl":"https://github.com/pbakaus/impeccable/blob/2bc2879276c1f321a53c4ca99d3371e411329b52/crates/skills/src/commands.rs#L476-L512","documentation":"Report in link after link_provider_skills linked and skipped nothing: the resolved source checkout's bundle directory contained no per-provider variants for any of the selected targets. Usually means --source points at a checkout that has not been built (dist/ absent) or the provider names don't match the bundle layout.","triggerScenarios":"Running `impeccable link` with provider names that the built bundle does not contain variants for, or linking against an empty/unbuilt bundle root.","commonSituations":"Typos in `--providers`, a stale or partial build, or custom provider names the bundle doesn't ship.","solutions":["Verify provider names against the bundle contents","Rebuild the bundle with `bun run build`","Check that `source.bundle_root` contains the expected skill folders"],"exampleFix":"// before\nimpeccable link --providers=claude,codex-custom\n// after\nimpeccable link --providers=claude,cursor","handlingStrategy":"validation","validationCode":"const variants = fs.readdirSync(bundleRoot).filter(d => providers.includes(d));\nif (variants.length === 0) console.error('No bundle variants for chosen providers');","typeGuard":null,"tryCatchPattern":"try { await link(); } catch (e) { if (/had no variants/.test(String(e))) { console.error('Rebuild bundle or fix provider names'); } }","preventionTips":["Rebuild the bundle after pulling changes","Only use provider names that exist in the bundle","Verify bundle contents before linking"],"tags":["cli","link","empty-result"],"backgroundTag":"empty-result-set","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"}