{"record":{"id":"dc7f3bc2d2b8017c","repo":"Hmbown/CodeWhale","slug":"skill-name-is-not-installed-at","errorCode":null,"errorMessage":"skill '{name}' is not installed at {}","messagePattern":"skill '(.+?)' is not installed at (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/tui/src/skills/install.rs","lineNumber":502,"sourceCode":"            }\n        }\n        InstallOutcome::NeedsApproval(_) | InstallOutcome::NetworkDenied(_) => {}\n    }\n    match outcome {\n        InstallOutcome::Installed(installed) => Ok(UpdateResult::Updated(installed)),\n        InstallOutcome::NeedsApproval(host) => Ok(UpdateResult::NeedsApproval(host)),\n        InstallOutcome::NetworkDenied(host) => Ok(UpdateResult::NetworkDenied(host)),\n    }\n}\n\n/// Remove a community-installed skill.\n///\n/// Refuses to touch any directory that doesn't carry the `.installed-from`\n/// marker — that's our cue that it's user-owned and not a system skill.\npub fn uninstall(name: &str, skills_dir: &Path) -> Result<()> {\n    let target = skill_target_path(name, skills_dir)?;\n    if !target.exists() {\n        bail!(\"skill '{name}' is not installed at {}\", target.display());\n    }\n    ensure_target_within_skills_dir(&target, skills_dir)?;\n    if !target.join(INSTALLED_FROM_MARKER).exists() {\n        return Err(InstallError::NotInstalledHere(name.to_string()).into());\n    }\n    fs::remove_dir_all(&target)\n        .with_context(|| format!(\"failed to remove {}\", target.display()))?;\n    Ok(())\n}\n\n/// Mark a community-installed skill as trusted, binding the marker to the\n/// current package content digest (schema v2).\n///\n/// Refuses to mark system skills (no `.installed-from`) so the bundled\n/// `skill-creator` doesn't accidentally inherit elevated tool privileges.\n#[cfg(test)]\npub fn trust(name: &str, skills_dir: &Path) -> Result<()> {\n    let target = skill_target_path(name, skills_dir)?;","sourceCodeStart":484,"sourceCodeEnd":520,"githubUrl":"https://github.com/Hmbown/CodeWhale/blob/0c42157ee52f9d55af2b506d71b46249910f77d3/crates/tui/src/skills/install.rs#L484-L520","documentation":"uninstall() bails with this error when the skill's target directory under skills_dir does not exist; the check runs before any marker or removal logic. The resolved path is printed in the message, so name mismatches and wrong-directory cases are visible.","triggerScenarios":"'/skill uninstall <name>' where the name was never installed, is spelled differently (skill directories are cased names), or the skill lives under a different skills_dir than the one in effect.","commonSituations":"Typos or case mismatches in the skill name, multiple skills directories (project vs user) with the skill in the other one, and stale memory after a skill was already removed.","solutions":["List installed skills and copy the exact, case-sensitive directory name.","Compare the path in the error message against where the skill actually lives; the checked skills_dir is printed.","If the directory exists but lacks the .installed-from marker, the sibling NotInstalledHere error applies: system/user-owned skills are not uninstallable this way."],"exampleFix":"# before\n/skill uninstall MySkill\n# -> not installed at .../skills/MySkill\n\n# after (actual directory is my-skill)\n/skill uninstall my-skill","handlingStrategy":"validation","validationCode":"let target = skills_dir.join(name);\nif !target.exists() {\n    eprintln!(\"skill '{name}' not present under {}; nothing to uninstall\", skills_dir.display());\n    return;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["List installed skills first and copy the exact case-sensitive directory name.","Confirm which skills dir (project vs user) the session uses before uninstalling.","Make bulk uninstall scripts skip missing names instead of aborting."],"tags":["skills","uninstall","not-found","rust"],"backgroundTag":"skill-not-installed","analyzedSha":"0c42157ee52f9d55af2b506d71b46249910f77d3","analyzedAt":"2026-08-20T21:50:45.477Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}