zeroclaw-labs/zeroclaw · error · anyhow::Error

Skill not found: {name}

Error message

Skill not found: {name}

What it means

`skills remove <name>` without --bundle searches every configured bundle directory plus the global skills dir for a subdirectory named <name> (collect_skill_locations). An empty match list means no such skill directory exists anywhere the CLI looks, so there is nothing to remove and the command bails.

Source

Thrown at src/skills/mod.rs:419

                    .resolve_ref(&name, Some(b))
                    .map_err(anyhow::Error::msg)?;
                service
                    .remove_skill(&target, zeroclaw_runtime::skills::RemoveMode::Archive)
                    .map_err(anyhow::Error::msg)?;
                println!(
                    "{}",
                    get_required_cli_string_with_args(
                        "cli-skills-removed-archived",
                        &[("status", &status), ("name", &name), ("bundle", b)],
                    )
                );
                return Ok(());
            }

            // Otherwise locate the skill across bundles (+ global) and disambiguate.
            let matches = collect_skill_locations(config, &name, agent.as_deref());
            match matches.as_slice() {
                [] => anyhow::bail!("Skill not found: {name}"),
                [(label, dir)] => {
                    if let Some(alias) = label.strip_prefix("bundle:") {
                        let service = SkillsService::new(config, config.install_root_dir());
                        let target = service
                            .resolve_ref(&name, Some(alias))
                            .map_err(anyhow::Error::msg)?;
                        service
                            .remove_skill(&target, zeroclaw_runtime::skills::RemoveMode::Archive)
                            .map_err(anyhow::Error::msg)?;
                        println!(
                            "{}",
                            get_required_cli_string_with_args(
                                "cli-skills-removed-archived",
                                &[("status", &status), ("name", &name), ("bundle", alias)],
                            )
                        );
                    } else {
                        // Global dir: plain delete with a containment guard.

View on GitHub (pinned to 88bb9c8533)

Solutions

  1. Run `zeroclaw skills list` and copy the exact installed name
  2. If it was already removed, treat this as a harmless no-op
  3. Confirm you are using the same config/data dir the skill was installed under (env vars, flags)
  4. If a bundle's directory is unresolvable, fix the [skill_bundles.<alias>] directory entry first, then retry

Example fix

# before
zeroclaw skills remove code-reveiw

# after
zeroclaw skills remove code-review
Defensive patterns

Strategy: validation

Validate before calling

// Shell pre-check before `skills remove <name>`
// zeroclaw skills list | grep -Fx "<name>" || echo "not installed — skip"
let listed = String::from_utf8(
    std::process::Command::new("zeroclaw").args(["skills", "list"]).output()?.stdout
)?;
if !listed.lines().any(|l| l.contains(&name)) { /* nothing to remove */ }

Try / catch

if let Err(e) = handle_command(SkillCommands::Remove { .. }, &config).await {
    if e.to_string().starts_with("Skill not found") { /* treat as no-op, not a hard failure */ }
}

Prevention

When it happens

Trigger: The skill was never installed; it was already removed (bundle removal archives rather than deletes); a name typo or case mismatch; the bundle holding it fails directory resolution; a different data_dir/config is active than at install time.

Common situations: Re-running an old remove command after a fresh install state; switching machines or profiles; skill installed under a bundle that was later renamed so the directory label changed.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23). Data as JSON: /api/errors/6366e7bcfcaf6731. Report an issue: GitHub.