pbakaus/impeccable · warning

Skipped existing {provider}/skills/{skill}. Use --force to r

Error message

Skipped existing {provider}/skills/{skill}. Use --force to replace it with a link.

What it means

In `link_provider_skills`, when creating symlinks for provider skills, a destination that already exists blocks the operation. If the existing entry is not already a symlink to the intended source and `--force` was not passed, the skill is skipped with this message and counted in `result.skipped` — nothing is overwritten.

Source

Thrown at crates/skills/src/bundle.rs:855

        }
        seen.push(real);
        unique.push((provider, local_skills_dir));
    }
    for (provider, local_skills_dir) in unique {
        let src_dir = jsp::join(&[bundle_root, provider, "skills"]);
        if !util::exists(&src_dir) {
            continue;
        }
        for skill in bundle_skill_dirs(&src_dir) {
            let src = jsp::join(&[&src_dir, &skill]);
            let dest = jsp::join(&[&local_skills_dir, &skill]);
            if util::exists_or_link(&dest) {
                if is_symlink_to(&dest, &src) {
                    result.already += 1;
                    continue;
                }
                if !force {
                    io.err(&format!("Skipped existing {provider}/skills/{skill}. Use --force to replace it with a link.\n"));
                    result.skipped += 1;
                    continue;
                }
                util::rm_rf(&dest);
            }
            let mut target = jsp::relative("/", &jsp::dirname(&dest), &src);
            if target.is_empty() {
                target = ".".to_string();
            }
            util::symlink_dir(&target, &dest)?;
            result.linked += 1;
        }
    }
    Ok(result)
}

#[cfg(test)]
mod tests {

View on GitHub (pinned to 2bc2879276)

Solutions

  1. Re-run with `--force`: `impeccable skills link --force` to replace the existing entry with a link.
  2. Manually remove the existing `<provider>/skills/<skill>` path, then link again.
  3. If the existing copy is intentional and current, do nothing — the skip is safe.
  4. If the existing path is a stale symlink to an old checkout, delete just that symlink and re-link.

Example fix

// before
impeccable skills link   # Skipped existing claude/skills/impeccable
// after
impeccable skills link --force
Defensive patterns

Strategy: validation

Validate before calling

[ -e .claude/skills/impeccable ] && echo 'destination exists; pass --force or remove it first'

Prevention

When it happens

Trigger: Running `impeccable skills link` (without `--force`) where `<provider>/skills/<skill>` already exists as a regular directory/file, or as a symlink pointing somewhere other than the checkout source.

Common situations: A previous `skills install` copied the skill into the provider directory; a manually created folder with the same name; a stale symlink left from an old checkout path that no longer matches the new source.

Understand the failure class

Background: "already exists" / EEXIST / FileAlreadyExistsException: what the 'file already exists' error means and how to fix it — this error's family across 37 libraries.

Related errors


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