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,184 @@
package testutil
import (
"os"
"os/exec"
"path/filepath"
"testing"
"skillmgr/pkg/fileutil"
)
// SetupTestEnv 设置测试环境
// 返回临时目录路径和清理函数
func SetupTestEnv(t *testing.T) (string, func()) {
t.Helper()
tmpDir, err := os.MkdirTemp("", "skillmgr-test-*")
if err != nil {
t.Fatalf("创建临时目录失败: %v", err)
}
// 设置环境变量
os.Setenv("SKILLMGR_TEST_ROOT", tmpDir)
os.Setenv("SKILLMGR_TEST_BASE", tmpDir)
cleanup := func() {
os.Unsetenv("SKILLMGR_TEST_ROOT")
os.Unsetenv("SKILLMGR_TEST_BASE")
os.RemoveAll(tmpDir)
}
return tmpDir, cleanup
}
// SetupTestRepo 创建一个临时 git 仓库
// 返回仓库路径
func SetupTestRepo(t *testing.T, baseDir string) string {
t.Helper()
repoDir := filepath.Join(baseDir, "test-repo")
if err := os.MkdirAll(repoDir, 0755); err != nil {
t.Fatalf("创建仓库目录失败: %v", err)
}
// 初始化 git 仓库
cmd := exec.Command("git", "init")
cmd.Dir = repoDir
if output, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("git init 失败: %v\n%s", err, output)
}
// 配置 git user测试用
configCmds := [][]string{
{"git", "config", "user.email", "test@example.com"},
{"git", "config", "user.name", "Test User"},
}
for _, args := range configCmds {
cmd := exec.Command(args[0], args[1:]...)
cmd.Dir = repoDir
if output, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("git config 失败: %v\n%s", err, output)
}
}
return repoDir
}
// CopyFixtureRepo 复制 fixture 仓库并初始化 git
func CopyFixtureRepo(t *testing.T, fixtureDir, destDir string) string {
t.Helper()
repoDir := filepath.Join(destDir, filepath.Base(fixtureDir))
if err := fileutil.CopyDir(fixtureDir, repoDir); err != nil {
t.Fatalf("复制 fixture 仓库失败: %v", err)
}
// 初始化 git 仓库
cmd := exec.Command("git", "init")
cmd.Dir = repoDir
if output, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("git init 失败: %v\n%s", err, output)
}
// 配置 git user测试用
configCmds := [][]string{
{"git", "config", "user.email", "test@example.com"},
{"git", "config", "user.name", "Test User"},
}
for _, args := range configCmds {
cmd := exec.Command(args[0], args[1:]...)
cmd.Dir = repoDir
if output, err := cmd.CombinedOutput(); err != nil {
t.Fatalf("git config 失败: %v\n%s", err, output)
}
}
// 添加并提交
addCmd := exec.Command("git", "add", ".")
addCmd.Dir = repoDir
if output, err := addCmd.CombinedOutput(); err != nil {
t.Fatalf("git add 失败: %v\n%s", err, output)
}
commitCmd := exec.Command("git", "commit", "-m", "Initial commit")
commitCmd.Dir = repoDir
if output, err := commitCmd.CombinedOutput(); err != nil {
t.Fatalf("git commit 失败: %v\n%s", err, output)
}
return repoDir
}
// GetFixturePath 获取 fixture 目录路径
func GetFixturePath(t *testing.T) string {
t.Helper()
// 尝试几个可能的位置
candidates := []string{
"testdata/fixtures",
"../testdata/fixtures",
"../../testdata/fixtures",
"../../../testdata/fixtures",
}
for _, candidate := range candidates {
if _, err := os.Stat(candidate); err == nil {
abs, _ := filepath.Abs(candidate)
return abs
}
}
// 从工作目录向上查找
wd, _ := os.Getwd()
for {
candidate := filepath.Join(wd, "testdata", "fixtures")
if _, err := os.Stat(candidate); err == nil {
return candidate
}
parent := filepath.Dir(wd)
if parent == wd {
break
}
wd = parent
}
t.Fatalf("无法找到 fixtures 目录")
return ""
}
// CreateTestSkill 在目录中创建测试 skill
func CreateTestSkill(t *testing.T, baseDir, name string) string {
t.Helper()
skillDir := filepath.Join(baseDir, "skills", name)
if err := os.MkdirAll(skillDir, 0755); err != nil {
t.Fatalf("创建 skill 目录失败: %v", err)
}
content := []byte("# " + name + "\n\nTest skill.\n")
if err := os.WriteFile(filepath.Join(skillDir, "SKILL.md"), content, 0644); err != nil {
t.Fatalf("创建 SKILL.md 失败: %v", err)
}
return skillDir
}
// CreateTestCommand 在目录中创建测试命令组
func CreateTestCommand(t *testing.T, baseDir, groupName string, files []string) string {
t.Helper()
cmdDir := filepath.Join(baseDir, "commands", groupName)
if err := os.MkdirAll(cmdDir, 0755); err != nil {
t.Fatalf("创建 command 目录失败: %v", err)
}
for _, file := range files {
content := []byte("# " + file + "\n\nTest command.\n")
if err := os.WriteFile(filepath.Join(cmdDir, file), content, 0644); err != nil {
t.Fatalf("创建 %s 失败: %v", file, err)
}
}
return cmdDir
}