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

  1. Run `picoclaw skills list` and copy the exact installed skill name
  2. Verify you are operating on the intended workspace (check workspace path in config)
  3. 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

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


AI-assisted analysis of sipeed/picoclaw@49183d7e8d (2026-08-15). Data as JSON: /api/errors/ae3025618e357e25. Report an issue: GitHub.