package main import ( "fmt" "os" "github.com/spf13/cobra" "skillmgr/internal/config" "skillmgr/internal/types" ) var cleanCmd = &cobra.Command{ Use: "clean", Short: "清理孤立的安装记录", Long: `检查并清理不存在的安装记录。 当文件被手动删除但安装记录仍存在时,使用此命令清理。 示例: # 检查孤立记录(不删除) skillmgr clean --dry-run # 清理孤立记录 skillmgr clean`, RunE: func(cmd *cobra.Command, args []string) error { dryRun, _ := cmd.Flags().GetBool("dry-run") cfg, err := config.LoadInstallConfig() if err != nil { return err } if len(cfg.Installations) == 0 { fmt.Println("无安装记录") return nil } var orphans []types.InstallRecord var valid []types.InstallRecord for _, r := range cfg.Installations { if _, err := os.Stat(r.InstallPath); os.IsNotExist(err) { orphans = append(orphans, r) } else { valid = append(valid, r) } } if len(orphans) == 0 { fmt.Println("无孤立记录") return nil } fmt.Printf("发现 %d 个孤立记录:\n", len(orphans)) for _, r := range orphans { fmt.Printf(" [%s] %s (%s, %s)\n", r.Type, r.Name, r.Platform, r.Scope) fmt.Printf(" 路径: %s\n", r.InstallPath) } if dryRun { fmt.Println("\n使用 --dry-run,未执行清理") return nil } cfg.Installations = valid if err := config.SaveInstallConfig(cfg); err != nil { return fmt.Errorf("保存配置失败: %w", err) } fmt.Printf("\n已清理 %d 个孤立记录\n", len(orphans)) return nil }, } func init() { cleanCmd.Flags().Bool("dry-run", false, "仅检查,不执行清理") rootCmd.AddCommand(cleanCmd) }