{"record":{"id":"0df88e940d08edd3","repo":"zeroclaw-labs/zeroclaw","slug":"skill-skill-not-found-in-url-available-sk","errorCode":null,"errorMessage":"skill '{$skill}' not found in {$url}.\nAvailable skills: {$available}","messagePattern":"skill '(.+?)' not found in (.+?)\\.\nAvailable skills: (.+?)","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/skills/mod.rs","lineNumber":2448,"sourceCode":"        if !skills_root.is_dir() {\n            anyhow::bail!(crate::i18n::get_required_cli_string_with_args(\n                \"cli-skills-install-skill-not-in-catalog-empty\",\n                &[(\"skill\", skill_name), (\"url\", url)]\n            ));\n        }\n\n        let skill_dir = skills_root.join(skill_name);\n        let entry_meta = match std::fs::symlink_metadata(&skill_dir) {\n            Ok(metadata) => metadata,\n            Err(err) if err.kind() == std::io::ErrorKind::NotFound => {\n                let available = list_contained_catalog_skill_names(&skills_root);\n                if available.is_empty() {\n                    anyhow::bail!(crate::i18n::get_required_cli_string_with_args(\n                        \"cli-skills-install-skill-not-in-catalog-empty\",\n                        &[(\"skill\", skill_name), (\"url\", url)]\n                    ));\n                }\n                anyhow::bail!(crate::i18n::get_required_cli_string_with_args(\n                    \"cli-skills-install-skill-not-in-catalog\",\n                    &[\n                        (\"skill\", skill_name),\n                        (\"url\", url),\n                        (\"available\", &available.join(\", \")),\n                    ]\n                ));\n            }\n            Err(err) => {\n                return Err(err).with_context(|| {\n                    format!(\n                        \"failed to read metadata for selected catalog skill {}\",\n                        skill_dir.display()\n                    )\n                });\n            }\n        };\n        if entry_meta.file_type().is_symlink() {","sourceCodeStart":2430,"sourceCodeEnd":2466,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/skills/mod.rs#L2430-L2466","documentation":"The requested skill name has no matching directory in the catalog's skills/ root, and the catalog does contain other skills — the message lists them comma-separated (from list_contained_catalog_skill_names, sorted) so the correct names can be picked immediately. Names are matched as literal directory names: case and separators matter.","triggerScenarios":"Typo or case mismatch in the skill name; the skill was renamed upstream; requesting 'foo' when the catalog ships 'foo-v2'; hyphen vs underscore confusion (my_skill vs my-skill).","commonSituations":"Version-suffixed names after a catalog refactor; stale docs or tutorials referencing old names; keyboard autocorrect altering names.","solutions":["Pick the exact name from the 'Available skills' list embedded in the error message","Mind case and separators — the name must equal the directory name under skills/ exactly","If you maintain the catalog, add a skills/<name>/ directory for the missing skill"],"exampleFix":"# before\nzeroclaw skills install --url <catalog-url> --skill web-scraper\n# error: ... Available skills: web_scraper, web-scraper-v2\n\n# after\nzeroclaw skills install --url <catalog-url> --skill web-scraper-v2","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"match install_git_catalog_skill_source(url, skill, &skills_path, false, &ws) {\n    Err(e) => {\n        let msg = e.to_string();\n        if let Some(idx) = msg.find(\"Available skills: \") {\n            let names: Vec<&str> = msg[idx + \"Available skills: \".len()..].split(\", \").collect();\n            // offer the user a pick from `names`; retry with the exact choice\n        }\n        Err(e)\n    }\n    r => r,\n}","preventionTips":["Parse the 'Available skills:' suffix to build an interactive picker instead of failing flat","Match names exactly — case and separator sensitive, they are literal directory names","Pin skill names in config to catalog releases you have verified"],"tags":["skills","catalog","registry","not-found","typo"],"backgroundTag":"skill-not-in-catalog","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}