100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
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)
|
||
}
|