{"record":{"id":"400d411a57676bf5","repo":"zeroclaw-labs/zeroclaw","slug":"invalid-skill-name-skill-use-a-bare-skill","errorCode":null,"errorMessage":"invalid --skill name '{$skill}': use a bare skill name (letters, digits, '-', '_')","messagePattern":"invalid --skill name '(.+?)': use a bare skill name \\(letters, digits, '-', '_'\\)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/zeroclaw-runtime/src/skills/mod.rs","lineNumber":2349,"sourceCode":"    names.sort();\n    names\n}\n\n/// Install a single skill by name from a git catalog repository.\n///\n/// Clones `url` into a throwaway directory, resolves `skills/<skill_name>/`\n/// (the same `<repo>/skills/<name>/` layout as the default and extra\n/// registries), and installs it through the shared local-copy path (which\n/// runs the security audit). No archive handling — pure `git clone`.\npub fn install_git_catalog_skill_source(\n    url: &str,\n    skill_name: &str,\n    skills_path: &Path,\n    allow_scripts: bool,\n    workspace_dir: &Path,\n) -> Result<(PathBuf, usize)> {\n    if !is_registry_source(skill_name) {\n        anyhow::bail!(crate::i18n::get_required_cli_string_with_args(\n            \"cli-skills-install-invalid-skill-name\",\n            &[(\"skill\", skill_name)]\n        ));\n    }\n\n    std::fs::create_dir_all(workspace_dir).with_context(|| {\n        crate::i18n::get_required_cli_string_with_args(\n            \"cli-skills-install-catalog-clone-failed\",\n            &[(\"url\", url)],\n        )\n    })?;\n    let clone_tempdir = tempfile::Builder::new()\n        .prefix(\".skill-catalog-\")\n        .tempdir_in(workspace_dir)\n        .with_context(|| {\n            crate::i18n::get_required_cli_string_with_args(\n                \"cli-skills-install-catalog-clone-failed\",\n                &[(\"url\", url)],","sourceCodeStart":2331,"sourceCodeEnd":2367,"githubUrl":"https://github.com/zeroclaw-labs/zeroclaw/blob/88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc/crates/zeroclaw-runtime/src/skills/mod.rs#L2331-L2367","documentation":"install_git_catalog_skill_source requires the skill name to satisfy is_registry_source: non-empty; no '/', '\\\\', '..', ':', or '://'; not starting with '.' or '~'; and only ASCII letters, digits, '-', '_'. Anything else — paths, URLs, scoped or relative specifiers — is rejected before any clone happens.","triggerScenarios":"Passing 'owner/repo', 'https://...', './my-skill', 'registry:foo/bar', or a name containing spaces or dots as the skill-name argument of a catalog install.","commonSituations":"Confusing the catalog install (URL plus bare skill name) with the git install (URL only) or the local install (filesystem path).","solutions":["Pass only the bare skill name (e.g. my-skill) and put the repository URL in the url argument","Replace spaces, dots, and slashes with '-' or '_'","For a local path or a whole-repo install, use the local-source or git-source install entry points instead of the catalog one"],"exampleFix":"// before\ninstall_git_catalog_skill_source(url, \"owner/my-skill\", &skills_path, false, &ws)?;\n\n// after\ninstall_git_catalog_skill_source(url, \"my-skill\", &skills_path, false, &ws)?;","handlingStrategy":"validation","validationCode":"if !zeroclaw_runtime::skills::is_registry_source(skill_name) {\n    anyhow::bail!(\"skill name must be bare (letters, digits, '-', '_'): got {skill_name}\");\n}\ninstall_git_catalog_skill_source(url, skill_name, &skills_path, allow_scripts, &workspace)?;","typeGuard":"// is_registry_source is public and is the exact predicate the installer uses:\nfn is_bare_skill_name(name: &str) -> bool {\n    zeroclaw_runtime::skills::is_registry_source(name)\n}","tryCatchPattern":null,"preventionTips":["Validate names with the library's own is_registry_source before calling the catalog installer","Keep catalog skill names to [A-Za-z0-9_-] by construction in your tooling","Route paths and URLs to the local/git install entry points, never the catalog one"],"tags":["skills","catalog","validation","input-format"],"backgroundTag":"invalid-identifier-format","analyzedSha":"88bb9c8533fc57ed7a03e36ca7c9ed2bf8336dcc","analyzedAt":"2026-08-23T01:07:41.857Z","schemaVersion":2},"datasetVersion":"2026-08-23T08:06:27.607Z"}