package main import ( "fmt" "github.com/spf13/cobra" "skillmgr/internal/config" "skillmgr/internal/installer" "skillmgr/internal/types" ) var updateCmd = &cobra.Command{ Use: "update [type] [name]", Short: "更新已安装的 skill 或 command", Long: `从源仓库重新安装最新版本。 示例: # 更新单个 skillmgr update skill lyxy-kb --platform claude --global skillmgr update command lyxy-kb --platform opencode # 更新所有 skillmgr update --all`, RunE: func(cmd *cobra.Command, args []string) error { all, _ := cmd.Flags().GetBool("all") if all { return updateAll() } if len(args) != 2 { return fmt.Errorf("需要指定类型和名称,或使用 --all 更新所有") } itemType := args[0] name := args[1] platformStr, _ := cmd.Flags().GetString("platform") global, _ := cmd.Flags().GetBool("global") platform := types.Platform(platformStr) scope := types.ScopeProject if global { scope = types.ScopeGlobal } switch itemType { case "skill": return installer.UpdateSkill(name, platform, scope) case "command": return installer.UpdateCommand(name, platform, scope) default: return fmt.Errorf("无效的类型: %s(必须是 'skill' 或 'command')", itemType) } }, } func updateAll() error { cfg, err := config.LoadInstallConfig() if err != nil { return err } if len(cfg.Installations) == 0 { fmt.Println("无已安装的 skills/commands") return nil } var hasError bool for _, r := range cfg.Installations { fmt.Printf("正在更新 [%s] %s...\n", r.Type, r.Name) var err error if r.Type == types.ItemTypeSkill { err = installer.UpdateSkill(r.Name, r.Platform, r.Scope) } else { err = installer.UpdateCommand(r.Name, r.Platform, r.Scope) } if err != nil { fmt.Printf(" ✗ 更新失败: %v\n", err) hasError = true continue } } if hasError { fmt.Println("\n部分项目更新失败") } return nil } func init() { updateCmd.Flags().StringP("platform", "p", "", "目标平台 (claude|opencode)") updateCmd.Flags().BoolP("global", "g", false, "全局更新") updateCmd.Flags().Bool("all", false, "更新所有已安装项") rootCmd.AddCommand(updateCmd) }