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,90 @@
package main
import (
"fmt"
"strings"
"time"
"github.com/spf13/cobra"
"skillmgr/internal/config"
"skillmgr/internal/repo"
"skillmgr/internal/types"
)
// validateGitURL 验证 Git URL 格式
func validateGitURL(url string) error {
if url == "" {
return fmt.Errorf("URL 不能为空")
}
// 支持 https://, http://, git@, git:// 协议
validPrefixes := []string{"https://", "http://", "git@", "git://"}
for _, prefix := range validPrefixes {
if strings.HasPrefix(url, prefix) {
return nil
}
}
return fmt.Errorf("无效的 Git URL 格式,必须以 https://, http://, git@ 或 git:// 开头")
}
var addCmd = &cobra.Command{
Use: "add <url>",
Short: "添加源仓库",
Long: `添加一个 git 仓库作为 skills/commands 的源。
示例:
skillmgr add https://github.com/user/skills
skillmgr add https://github.com/user/skills --name my-skills
skillmgr add https://github.com/user/skills --branch main`,
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
url := args[0]
// 验证 URL 格式
if err := validateGitURL(url); err != nil {
return err
}
name, _ := cmd.Flags().GetString("name")
branch, _ := cmd.Flags().GetString("branch")
// 如果没有指定名称,从 URL 生成
if name == "" {
name = repo.URLToPathName(url)
}
if branch == "" {
branch = "main" // 默认分支
}
// Clone 仓库
fmt.Printf("正在克隆仓库 %s...\n", url)
repoPath, err := repo.CloneOrPull(url, branch)
if err != nil {
return fmt.Errorf("克隆仓库失败: %w", err)
}
// 保存到配置
repository := types.Repository{
Name: name,
URL: url,
Branch: branch,
AddedAt: time.Now(),
}
if err := config.AddRepository(repository); err != nil {
return err
}
fmt.Printf("✓ 仓库 '%s' 添加成功\n", name)
fmt.Printf(" 缓存路径: %s\n", repoPath)
return nil
},
}
func init() {
addCmd.Flags().String("name", "", "仓库别名")
addCmd.Flags().String("branch", "main", "克隆的分支")
rootCmd.AddCommand(addCmd)
}