1
0

完成一个简易的全局skill、command管理器

This commit is contained in:
2026-02-25 14:33:56 +08:00
parent f4cb809f9d
commit 2d327b5af8
60 changed files with 6053 additions and 1 deletions

View File

@@ -0,0 +1,105 @@
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
}