package config import ( "encoding/json" "fmt" "os" "skillmgr/internal/types" ) // LoadRepositoryConfig 加载仓库配置 func LoadRepositoryConfig() (*types.RepositoryConfig, error) { path, err := GetRepositoryConfigPath() if err != nil { return nil, err } // 如果文件不存在,返回空配置 if _, err := os.Stat(path); os.IsNotExist(err) { return &types.RepositoryConfig{ Repositories: []types.Repository{}, }, nil } data, err := os.ReadFile(path) if err != nil { return nil, err } var cfg types.RepositoryConfig if err := json.Unmarshal(data, &cfg); err != nil { return nil, fmt.Errorf("解析 repository.json 失败: %w(请检查 JSON 格式)", err) } return &cfg, nil } // SaveRepositoryConfig 保存仓库配置 func SaveRepositoryConfig(cfg *types.RepositoryConfig) error { path, err := GetRepositoryConfigPath() if err != nil { return err } data, err := json.MarshalIndent(cfg, "", " ") if err != nil { return err } return os.WriteFile(path, data, 0644) } // AddRepository 添加仓库 // 如果仓库名已存在,返回错误提示先移除 func AddRepository(repo types.Repository) error { cfg, err := LoadRepositoryConfig() if err != nil { return err } // 检查是否已存在同名仓库 for _, r := range cfg.Repositories { if r.Name == repo.Name { return fmt.Errorf("仓库名称 '%s' 已存在,请先使用 `skillmgr remove %s` 移除", repo.Name, repo.Name) } } // 新增 cfg.Repositories = append(cfg.Repositories, repo) return SaveRepositoryConfig(cfg) } // RemoveRepository 移除仓库 func RemoveRepository(name string) error { cfg, err := LoadRepositoryConfig() if err != nil { return err } for i, r := range cfg.Repositories { if r.Name == name { cfg.Repositories = append(cfg.Repositories[:i], cfg.Repositories[i+1:]...) return SaveRepositoryConfig(cfg) } } // 仓库不存在,不报错 return nil } // FindRepository 查找仓库 func FindRepository(name string) (*types.Repository, error) { cfg, err := LoadRepositoryConfig() if err != nil { return nil, err } for _, r := range cfg.Repositories { if r.Name == name { return &r, nil } } return nil, nil }