diff --git a/cmd/plugin.go b/cmd/plugin.go index 4ad7e89..edbb91f 100644 --- a/cmd/plugin.go +++ b/cmd/plugin.go @@ -16,10 +16,11 @@ import ( ) var ( - pluginInstall plugin.Plugin - pluginUpdateRepo string - pluginUpdateForce bool - pluginInstallRunner = executePluginInstall + pluginInstall plugin.Plugin + pluginUpdateRepo string + pluginUpdateForce bool + pluginInstallRunner = executePluginInstall + pluginSkillInstaller = tryInstallPluginSkills ) func init() { @@ -337,6 +338,8 @@ func executePluginInstall(manifest *plugin.Manifest, name string, p plugin.Plugi return fmt.Errorf("plugin installed but failed to update manifest: %w", err) } + pluginSkillInstaller(name) + spinner.Success(fmt.Sprintf("Installed plugin %q (%s)", name, version)) return nil } diff --git a/cmd/plugin_skills.go b/cmd/plugin_skills.go new file mode 100644 index 0000000..6bfb477 --- /dev/null +++ b/cmd/plugin_skills.go @@ -0,0 +1,53 @@ +package cmd + +import ( + "os/exec" + "strings" + + "github.com/git-hulk/clime/internal/skill" +) + +func tryInstallPluginSkills(name string) { + name = strings.TrimSpace(name) + if name == "" { + return + } + + bin, err := exec.LookPath("clime-" + name) + if err != nil { + return + } + + out, err := exec.Command(bin, "skills").Output() + if err != nil { + return + } + + source := strings.TrimSpace(string(out)) + if source == "" { + return + } + + manifest, err := skill.LoadManifest() + if err != nil { + return + } + + repoManifest, err := skill.FetchRepoManifest(source) + if err != nil { + return + } + + dir, cleanup, err := skill.PrepareRepoDir(source) + if err != nil { + return + } + defer cleanup() + + for _, entry := range repoManifest.Skills { + if _, found := manifest.GetSkill(entry.Name); found { + continue + } + _ = installSkillEntry(manifest, &entry, source, dir) + } +}