本项目是对 Vercel 的技能管理 CLI 的 Go 语言移植实现,主要用于发现、安装、列出与移除 Agent Skills(基于 SKILL.md)。
原项目:
- https://github.com/vercel-labs/skills (上游实现,Node.js/TypeScript)
安装到全局(推荐):
go install github.com/looplj/skills/cmd/find-skills@latest安装后可直接使用:
find-skills --help从源码构建:
go build -o find-skills ./cmd/find-skills或直接运行:
go run ./cmd/find-skills --help搜索技能:
find-skills find "browser automation" --limit 10以可直接用于安装的格式输出搜索结果:
find-skills find "pdf" --format add安装技能(支持本地目录、Git 仓库、URL、well-known 等来源):
find-skills add vercel-labs/agent-skills --global --yes列出已安装技能:
find-skills list --global移除技能:
find-skills remove --global my-skill生成 SKILL.md 模板:
find-skills init MySkill检查并更新通过 GitHub 安装的全局技能:
find-skills check
find-skills update该 Go 版本不仅提供可执行文件,也可以直接作为库引入,在你的程序里完成技能的发现/安装/移除等逻辑。
安装技能(启用 Agent 自动发现;若需安装到指定目录,见下一个示例):
package main
import (
"context"
"fmt"
skills "github.com/looplj/skills"
)
func main() {
ctx := context.Background()
res, err := skills.Add(ctx, skills.AddOptions{
Source: "vercel-labs/agent-skills",
Global: true,
Yes: true,
EnableAgentDiscovery: true,
})
if err != nil {
panic(err)
}
for _, s := range res.Installed {
fmt.Println(s.InstallName, s.Name)
}
}安装技能(显式指定目标目录;适合嵌入到你自己的目录结构中):
package main
import (
"context"
skills "github.com/looplj/skills"
)
func main() {
ctx := context.Background()
_, err := skills.Add(ctx, skills.AddOptions{
Source: "vercel-labs/agent-skills",
Yes: true,
Dirs: []string{".agents/skills"},
EnableAgentDiscovery: false,
})
if err != nil {
panic(err)
}
}列出与移除:
package main
import (
"fmt"
skills "github.com/looplj/skills"
)
func main() {
items, err := skills.List(skills.ListOptions{
Global: true,
EnableAgentDiscovery: true,
})
if err != nil {
panic(err)
}
for _, it := range items {
fmt.Println(it.InstallName, it.Name)
}
}package main
import (
skills "github.com/looplj/skills"
)
func main() {
_, err := skills.Remove(skills.RemoveOptions{
Global: true,
Skills: []string{"my-skill"},
EnableAgentDiscovery: true,
})
if err != nil {
panic(err)
}
}项目同时提供了可嵌入的 Cobra 命令集合,可作为你自己 CLI 的子命令使用。
将 find-skills 作为子命令挂到你的根命令下:
package main
import (
"os"
skillscmd "github.com/looplj/skills/skillscmd"
"github.com/spf13/cobra"
)
func main() {
root := &cobra.Command{Use: "myapp"}
root.AddCommand(skillscmd.NewRootCommand(skillscmd.RootOptions{
Use: "find-skills",
Stdout: os.Stdout,
Stderr: os.Stderr,
EnableAgentDiscovery: true,
}))
if err := root.Execute(); err != nil {
os.Exit(1)
}
}如果你不希望依赖自动发现,也可以通过 WorkspaceDir / GlobalDir 指定技能目录(安装/列出/移除会直接作用在这些目录上):
package main
import (
"os"
skillscmd "github.com/looplj/skills/skillscmd"
)
func main() {
cmd := skillscmd.NewRootCommand(skillscmd.RootOptions{
Use: "find-skills",
Stdout: os.Stdout,
Stderr: os.Stderr,
WorkspaceDir: ".agents/skills",
GlobalDir: "~/.agents/skills",
EnableAgentDiscovery: false,
})
if err := cmd.Execute(); err != nil {
os.Exit(1)
}
}如果你还需要暴露一层 bundled skills 作为 list/get 的回退来源,可以直接从代码注入 BundledSkills。Skill.Name 会作为 install name 使用。当 bundled skill 与已安装 skill 同名时,已安装的 global/workspace skill 会覆盖 bundled 版本:
root.AddCommand(skillscmd.NewRootCommand(skillscmd.RootOptions{
Use: "find-skills",
WorkspaceDir: ".agents/skills",
GlobalDir: "~/.agents/skills",
BundledSkills: []skills.Skill{
{
Name: "seo-audit",
Description: "Bundled SEO audit skill",
Content: "---\nname: seo-audit\ndescription: Bundled SEO audit skill\n---\n",
},
},
}))在检查/更新 GitHub 技能时,若遇到限流或私有仓库访问需求,可配置以下任一方式:
- 环境变量
GITHUB_TOKEN或GH_TOKEN - 已登录的 GitHub CLI(
gh auth login),工具会尝试读取gh auth token
MIT,见 LICENSE。本项目保持与上游项目声明一致的开源协议。