{"record":{"id":"c2a9ca23134f2e0e","repo":"sipeed/picoclaw","slug":"registry-s-not-found-or-not-enabled-check-y","errorCode":null,"errorMessage":"✗  registry '%s' not found or not enabled. check your config.json.","messagePattern":"✗  registry '(.+?)' not found or not enabled\\. check your config\\.json\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/picoclaw/internal/skills/helpers.go","lineNumber":61,"sourceCode":"\t\tfmt.Printf(\"  ✓ %s (%s)\\n\", skill.Name, skill.Source)\n\t\tif skill.Description != \"\" {\n\t\t\tfmt.Printf(\"    %s\\n\", skill.Description)\n\t\t}\n\t}\n}\n\n// skillsInstallFromRegistry installs a skill from a named registry (e.g. clawhub).\nfunc skillsInstallFromRegistry(cfg *config.Config, registryName, target string) error {\n\terr := utils.ValidateSkillIdentifier(registryName)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"✗  invalid registry name: %w\", err)\n\t}\n\n\tregistryMgr := skills.NewRegistryManagerFromToolsConfig(cfg.Tools.Skills)\n\n\tregistry := registryMgr.GetRegistry(registryName)\n\tif registry == nil {\n\t\treturn fmt.Errorf(\"✗  registry '%s' not found or not enabled. check your config.json.\", registryName)\n\t}\n\n\tdirName, err := registry.ResolveInstallDirName(target)\n\tif err != nil {\n\t\treturn fmt.Errorf(\"✗  invalid install target %q: %w\", target, err)\n\t}\n\n\tfmt.Printf(\"Installing skill '%s' from %s registry...\\n\", target, registryName)\n\n\tworkspace := cfg.WorkspacePath()\n\ttargetDir := filepath.Join(workspace, \"skills\", dirName)\n\n\tif _, err = os.Stat(targetDir); err == nil {\n\t\treturn fmt.Errorf(\"\\u2717 skill '%s' already installed at %s\", dirName, targetDir)\n\t}\n\n\tctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)\n\tdefer cancel()","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/sipeed/picoclaw/blob/49183d7e8daed0dba89ddbb6fcb60089401d9680/cmd/picoclaw/internal/skills/helpers.go#L43-L79","documentation":"The registry name is syntactically valid but no enabled registry with that name exists in the loaded config: RegistryManager.GetRegistry returned nil. The message points at config.json because that is where registries (e.g. clawhub) are declared and enabled under tools.skills.","triggerScenarios":"skillsInstallFromRegistry with a name that is not among cfg.Tools.Skills registries, or one that exists but is disabled — GetRegistry returns nil at helpers.go:61.","commonSituations":"Fresh install where clawhub was never added, a registry entry disabled during a security review, a typo/casing mismatch in the name, or picoclaw loading a different config.json than the one edited.","solutions":["List the registries in the loaded config.json and use the exact key.","Add or enable the registry entry (e.g. clawhub) under tools.skills.","Check spelling and casing of the registry name.","Confirm which config file picoclaw actually loads (global vs workspace) before editing."],"exampleFix":"// before: tools.skills has no clawhub entry\n// after:  { \"tools\": { \"skills\": { \"registries\": { \"clawhub\": { \"enabled\": true } } } } }","handlingStrategy":"validation","validationCode":"mgr := skills.NewRegistryManagerFromToolsConfig(cfg.Tools.Skills)\nif mgr.GetRegistry(registryName) == nil {\n    return fmt.Errorf(\"registry %q not found or not enabled\", registryName)\n}","typeGuard":"func registryEnabled(mgr *skills.RegistryManager, name string) bool {\n    return mgr.GetRegistry(name) != nil\n}","tryCatchPattern":null,"preventionTips":["Print the available registry names when a lookup fails.","Ship a default clawhub entry in generated config.","Fail config lint when a registry referenced by docs or scripts is absent."],"tags":["config","registry","cli","go"],"backgroundTag":null,"analyzedSha":"49183d7e8daed0dba89ddbb6fcb60089401d9680","analyzedAt":"2026-08-15T21:55:41.315Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}