{"record":{"id":"ae3025618e357e25","repo":"sipeed/picoclaw","slug":"skill-s-not-found","errorCode":null,"errorMessage":"skill '%s' not found","messagePattern":"skill '(.+?)' not found","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/picoclaw/internal/skills/helpers.go","lineNumber":174,"sourceCode":"func skillsRemoveFromWorkspace(workspace string, toolsConfig config.SkillsToolsConfig, skillName string) error {\n\tname := strings.TrimSpace(skillName)\n\tname = strings.Trim(name, \"/\")\n\tif name == \"\" {\n\t\treturn fmt.Errorf(\"skill name is required\")\n\t}\n\tif strings.Contains(name, \"/\") {\n\t\tdirName, err := skills.GitHubInstallDirNameFromToolsConfig(toolsConfig, name)\n\t\tif err != nil || dirName == \"\" {\n\t\t\treturn fmt.Errorf(\"invalid skill name %q\", skillName)\n\t\t}\n\t\tname = dirName\n\t}\n\tif name == \".\" || name == \"..\" {\n\t\treturn fmt.Errorf(\"invalid skill name %q\", skillName)\n\t}\n\tskillDir := filepath.Join(workspace, \"skills\", name)\n\tif _, err := os.Stat(skillDir); os.IsNotExist(err) {\n\t\treturn fmt.Errorf(\"skill '%s' not found\", name)\n\t}\n\tif err := os.RemoveAll(skillDir); err != nil {\n\t\treturn fmt.Errorf(\"failed to remove skill '%s': %w\", name, err)\n\t}\n\treturn nil\n}\n\nfunc skillsInstallBuiltinCmd(workspace string) {\n\tbuiltinSkillsDir := \"./picoclaw/skills\"\n\tworkspaceSkillsDir := filepath.Join(workspace, \"skills\")\n\n\tfmt.Printf(\"Copying builtin skills to workspace...\\n\")\n\n\tskillsToInstall := []string{\n\t\t\"weather\",\n\t\t\"news\",\n\t\t\"stock\",\n\t\t\"calculator\",","sourceCodeStart":156,"sourceCodeEnd":192,"githubUrl":"https://github.com/sipeed/picoclaw/blob/49183d7e8daed0dba89ddbb6fcb60089401d9680/cmd/picoclaw/internal/skills/helpers.go#L156-L192","documentation":"skillsRemoveFromWorkspace stat's <workspace>/skills/<name> and os.Stat returned os.IsNotExist. The skill directory to uninstall is not present in the current workspace, so nothing can be removed. Note that a GitHub-style input was already rewritten to its installed directory name before this check, so the message may show a directory name different from what you typed.","triggerScenarios":"`picoclaw skills remove <name>` where <name> is not a directory under the workspace's skills/ folder: a typo, a skill never installed, a skill installed into a different workspace, or a builtin/global skill that does not live in workspace skills/.","commonSituations":"Wrong --workspace or running the command from a different project directory; skill was previously removed; name casing or spelling mismatch; expecting builtin skills (weather, news, stock, calculator) to be removable when they were never copied into the workspace.","solutions":["Run `picoclaw skills list` and copy the exact installed skill name","Verify you are operating on the intended workspace (check workspace path in config)","If the skill came from GitHub, re-derive its installed directory name from the install command you used, then remove by that name"],"exampleFix":"picoclaw skills list\n# pick exact name, then:\npicoclaw skills remove weather","handlingStrategy":"validation","validationCode":"if _, err := os.Stat(filepath.Join(workspace, \"skills\", name)); os.IsNotExist(err) {\n    // list installed skills and prompt for a valid name instead of calling remove\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Confirm the skill exists in the workspace before offering a remove action","Keep a manifest of installed skills and their directory names","Remember GitHub-style names map to different on-disk directory names"],"tags":["cli","skills","filesystem","not-found"],"backgroundTag":null,"analyzedSha":"49183d7e8daed0dba89ddbb6fcb60089401d9680","analyzedAt":"2026-08-15T21:55:41.315Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}