{"record":{"id":"8412815255f73300","repo":"zeroclaw-labs/zeroclaw","slug":"skill-source-not-found-in-the-registry-and-no","errorCode":null,"errorMessage":"skill '{source}' not found in the registry and no skills are available","messagePattern":"skill '(.+?)' not found in the registry and no skills are available","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/skills/mod.rs","lineNumber":2525,"sourceCode":"        install_local_skill_source(skill_dir_str, skills_path, allow_scripts)\n    })()\n}\n\npub fn install_registry_skill_source(\n    source: &str,\n    skills_path: &Path,\n    allow_scripts: bool,\n    workspace_dir: &Path,\n    registry_url: Option<&str>,\n    suppress_tier_banner: bool,\n) -> Result<(PathBuf, usize)> {\n    let registry_dir = ensure_skills_registry(workspace_dir, registry_url)?;\n    let skill_dir = registry_dir.join(\"skills\").join(source);\n\n    if !skill_dir.is_dir() {\n        let available = list_registry_skill_names(&registry_dir);\n        if available.is_empty() {\n            anyhow::bail!(\"skill '{source}' not found in the registry and no skills are available\");\n        }\n        anyhow::bail!(\n            \"skill '{source}' not found in the registry.\\nAvailable skills: {}\",\n            available.join(\", \")\n        );\n    }\n\n    if !suppress_tier_banner {\n        let (tier, version) = lookup_registry_skill_tier(&registry_dir, source);\n        print_install_tier_banner(source, version.as_deref(), tier);\n    }\n\n    install_local_skill_source(\n        skill_dir.to_str().with_context(|| {\n            format!(\n                \"registry path is not valid UTF-8: {}\",\n                skill_dir.display().to_string()\n            )","sourceCodeStart":2507,"sourceCodeEnd":2543,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/skills/mod.rs#L2507-L2543","documentation":"Registry-based skill install (install by source name from the default skills registry): after ensure_skills_registry clones/updates the registry, skills/<source> is not a directory and the registry listing returned zero names. The local registry clone is empty or broken — no skills can be installed from it.","triggerScenarios":"Calling the registry install path with a source name when `registry_dir/skills/<source>` is not a dir and `list_registry_skill_names(&registry_dir)` is empty — e.g. the registry clone failed partway, the registry repo is empty, or the registry layout changed.","commonSituations":"First-use scenario where the registry clone was interrupted (disk full, network drop); registry URL overridden in config to an empty repo; registry repo restructured so skills/ moved; corrupted workspace cache dir.","solutions":["Delete the local registry clone inside the workspace and retry so it re-clones fresh.","Verify the configured registry URL is correct and reachable, and that the repo has a skills/ directory with entries.","Check disk space and permissions on the workspace dir — partial clones often come from IO failures.","If the registry layout changed upstream, pin to a compatible tag/commit or update zeroclaw."],"exampleFix":"# before: stale/empty registry cache\nzeroclaw skills install from-registry:my-skill\n# error: skill 'my-skill' not found in the registry and no skills are available\n\n# after: wipe the cache so it re-clones\nrm -rf .zeroclaw/skills-registry && zeroclaw skills install from-registry:my-skill","handlingStrategy":"validation","validationCode":"fn registry_ready(registry_dir: &std::path::Path) -> bool {\n    registry_dir\n        .join(\"skills\")\n        .read_dir()\n        .map(|mut it| it.any(|e| e.map(|e| e.path().is_dir()).unwrap_or(false)))\n        .unwrap_or(false)\n}\n// if false, delete registry_dir and re-clone before installing","typeGuard":null,"tryCatchPattern":"match install_registry_skill(source) {\n    Err(e) if e.to_string().contains(\"no skills are available\") => {\n        refresh_registry_clone()?; // rm -rf + re-clone, then retry once\n        install_registry_skill(source)?\n    }\n    rest => rest?,\n}","preventionTips":["After any failed/interrupted registry clone, clear the cache dir before the next install.","Monitor disk space and IO errors — empty registry listings are usually broken clones.","Verify the registry URL responds with a real repo (git ls-remote) in setup scripts."],"tags":["skills","registry","not-found","clone","cache"],"backgroundTag":"resource-not-found","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}