{"record":{"id":"6366e7bcfcaf6731","repo":"zeroclaw-labs/zeroclaw","slug":"skill-not-found-name","errorCode":null,"errorMessage":"Skill not found: {name}","messagePattern":"Skill not found: (.+?)","errorType":"console","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/skills/mod.rs","lineNumber":419,"sourceCode":"                    .resolve_ref(&name, Some(b))\n                    .map_err(anyhow::Error::msg)?;\n                service\n                    .remove_skill(&target, zeroclaw_runtime::skills::RemoveMode::Archive)\n                    .map_err(anyhow::Error::msg)?;\n                println!(\n                    \"{}\",\n                    get_required_cli_string_with_args(\n                        \"cli-skills-removed-archived\",\n                        &[(\"status\", &status), (\"name\", &name), (\"bundle\", b)],\n                    )\n                );\n                return Ok(());\n            }\n\n            // Otherwise locate the skill across bundles (+ global) and disambiguate.\n            let matches = collect_skill_locations(config, &name, agent.as_deref());\n            match matches.as_slice() {\n                [] => anyhow::bail!(\"Skill not found: {name}\"),\n                [(label, dir)] => {\n                    if let Some(alias) = label.strip_prefix(\"bundle:\") {\n                        let service = SkillsService::new(config, config.install_root_dir());\n                        let target = service\n                            .resolve_ref(&name, Some(alias))\n                            .map_err(anyhow::Error::msg)?;\n                        service\n                            .remove_skill(&target, zeroclaw_runtime::skills::RemoveMode::Archive)\n                            .map_err(anyhow::Error::msg)?;\n                        println!(\n                            \"{}\",\n                            get_required_cli_string_with_args(\n                                \"cli-skills-removed-archived\",\n                                &[(\"status\", &status), (\"name\", &name), (\"bundle\", alias)],\n                            )\n                        );\n                    } else {\n                        // Global dir: plain delete with a containment guard.","sourceCodeStart":401,"sourceCodeEnd":437,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/src/skills/mod.rs#L401-L437","documentation":"`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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"# before\nzeroclaw skills remove code-reveiw\n\n# after\nzeroclaw skills remove code-review","handlingStrategy":"validation","validationCode":"// Shell pre-check before `skills remove <name>`\n// zeroclaw skills list | grep -Fx \"<name>\" || echo \"not installed — skip\"\nlet listed = String::from_utf8(\n    std::process::Command::new(\"zeroclaw\").args([\"skills\", \"list\"]).output()?.stdout\n)?;\nif !listed.lines().any(|l| l.contains(&name)) { /* nothing to remove */ }","typeGuard":null,"tryCatchPattern":"if let Err(e) = handle_command(SkillCommands::Remove { .. }, &config).await {\n    if e.to_string().starts_with(\"Skill not found\") { /* treat as no-op, not a hard failure */ }\n}","preventionTips":["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"],"tags":["cli","skills","remove","not-found"],"backgroundTag":"entity-not-found","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}