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
- Run `zeroclaw skills list` and copy the exact installed name
- If it was already removed, treat this as a harmless no-op
- Confirm you are using the same config/data dir the skill was installed under (env vars, flags)
- 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
- Make remove steps idempotent: treat 'Skill not found' as success in automation
- Pin the config/data dir (env or flags) so list and remove see the same skills
- Copy exact names from `skills list` output
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
- Skill path escapes skills directory: {name}
- cli-skills-multiple-locations-bundle
- skill '{$skill}' not found in {$url}: no skills/ directory,
- skill '{$skill}' not found in {$url}. Available skills: {$av
- skill '{source}' not found in the registry and no skills are
AI-assisted analysis of zeroclaw-labs/zeroclaw@88bb9c8533 (2026-08-23).
Data as JSON: /api/errors/6366e7bcfcaf6731.
Report an issue: GitHub.