sipeed/picoclaw · error
skill '%s' not found
Error message
skill '%s' not found
What it means
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.
Source
Thrown at cmd/picoclaw/internal/skills/helpers.go:174
func skillsRemoveFromWorkspace(workspace string, toolsConfig config.SkillsToolsConfig, skillName string) error {
name := strings.TrimSpace(skillName)
name = strings.Trim(name, "/")
if name == "" {
return fmt.Errorf("skill name is required")
}
if strings.Contains(name, "/") {
dirName, err := skills.GitHubInstallDirNameFromToolsConfig(toolsConfig, name)
if err != nil || dirName == "" {
return fmt.Errorf("invalid skill name %q", skillName)
}
name = dirName
}
if name == "." || name == ".." {
return fmt.Errorf("invalid skill name %q", skillName)
}
skillDir := filepath.Join(workspace, "skills", name)
if _, err := os.Stat(skillDir); os.IsNotExist(err) {
return fmt.Errorf("skill '%s' not found", name)
}
if err := os.RemoveAll(skillDir); err != nil {
return fmt.Errorf("failed to remove skill '%s': %w", name, err)
}
return nil
}
func skillsInstallBuiltinCmd(workspace string) {
builtinSkillsDir := "./picoclaw/skills"
workspaceSkillsDir := filepath.Join(workspace, "skills")
fmt.Printf("Copying builtin skills to workspace...\n")
skillsToInstall := []string{
"weather",
"news",
"stock",
"calculator",View on GitHub (pinned to 49183d7e8d)
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
Example fix
picoclaw skills list # pick exact name, then: picoclaw skills remove weather
Defensive patterns
Strategy: validation
Validate before calling
if _, err := os.Stat(filepath.Join(workspace, "skills", name)); os.IsNotExist(err) {
// list installed skills and prompt for a valid name instead of calling remove
} Prevention
- 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
When it happens
Trigger: `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/.
Common situations: 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.
Related errors
- failed to remove skill '%s': %w
- reset failed: %w
- error adding job: %w
- failed to load config: %w
- failed to save config: %w
AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15).
Data as JSON: /api/errors/ae3025618e357e25.
Report an issue: GitHub.