关于 agent-ready-go
agent-ready-go 是一项技能,帮助 Go 应用更适合编码 Agent 使用。它提供审查清单,并指导配置机器可读输出、结构化错误、非交互命令、测试、日志和构建目标。
主要功能
- 01审查 Agent 就绪情况
- 02配置结构化 JSON 日志
- 03添加机器可读命令输出
- 04改进错误处理和退出码
- 05设置测试、Lint 和 Makefile 目标
适用场景
- 01让现有 Go 应用适用于编码 Agent
- 02为新 Go 项目设置 Agent 友好默认项
- 03检查 CLI 输出和错误处理
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rshade/ agent-skills --skill agent-ready-go安装后在 Claude Code 中输入/agent-ready-go确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
assets/.golangci.ymlMakefilereferences/config.mderror-handling.mdlogging.mdnon-interactive.mdservices.mdtesting.md详细介绍
面向 Agent 的 Go
确保所有工具都生成机器可读的输出、错误采用结构化形式,并且命令默认以非交互方式运行,让 Go 应用能够与 AI 编码 Agent 高效协作。
工作流
让 Go 应用做好与 Agent 协作的准备,涉及以下步骤:
- 审计 — 对照 Agent 就绪清单找出差距
- 结构化日志 — 添加或配置 slog、Zap、ZeroLog 或 Logrus,并使用 JSON 输出
- 机器可读输出 — 确保所有命令都能输出 JSON
- 代码检查 — 添加配置完善的
.golangci.yml - 测试 — 确保
go test -race -count=1 -timeout=5m通过,并设置覆盖率阈值 - 错误处理 — 使用结构化错误和有意义的退出码
- 非交互式设计 — 提供
--yes/-y标志,优先使用环境变量而非提示 - Makefile — 统一
build、test、lint、cover目标
对于全新项目,请执行所有步骤。对于现有项目,请先进行审计,并只处理缺失的部分。
第 1 步:审计
根据以下清单检查项目。处理每个 ❌:
- 已配置结构化日志记录器(slog / Zap / ZeroLog / Logrus)
- 非 TTY 环境下或设置
LOG_FORMAT=json时,日志记录器会输出 JSON - CLI 命令支持
--json或--output json标志 - 存在
.golangci.yml,且配置了完善的检查器集合 -
go test -race通过 - 主要导出的 API 在 godoc 中有可运行的
ExampleXxx测试 - 优先进行契约测试/行为测试,而非追求任意的行覆盖率
-
go vet ./...干净通过 - 所有错误都使用上下文信息包装(
fmt.Errorf("...: %w", err)) - 退出码:0 表示成功,非零表示失败(CLI 入口不发生 panic)
- 所有受 I/O 限制的函数都传递
context.Context - 交互式提示提供
--yes/-y绕过标志 -
Makefile包含build、test、lint、cover、ci目标 - 收到 SIGTERM/SIGINT 时优雅关闭(HTTP 服务)
- HTTP 服务提供健康检查端点(
/healthz、/readyz) -
govulncheck ./...干净通过 - 遵循
NO_COLOR约定;非 TTY 输出不包含 ANSI 代码 - 从环境变量加载配置,并在启动时进行验证
第 2 步:结构化日志
请参阅 references/logging.md,了解 slog、 Zap、ZeroLog 和 Logrus 的配置模式。
主要要求:
- 当
!isatty(os.Stdout.Fd())或LOG_FORMAT=json时使用 JSON 格式 - 包含以下字段:
level、ts、msg,以及上下文字段 - 绝不使用
fmt.Println输出运行日志 - 将日志写入 stderr;保持 stdout 干净,以便输出机器可读数据
第 3 步:机器可读输出
Agent 会解析 stdout 来验证结果。每个非平凡命令都必须支持 JSON 输出。
var outputJSON bool
cmd.Flags().BoolVar(&outputJSON, "json", false, "output results as JSON")
if outputJSON {
enc := json.NewEncoder(os.Stdout)
enc.SetIndent("", " ")
_ = enc.Encode(result)
} else {
fmt.Printf("Created: %s\n", result.Name)
}
规则:结构化数据 → stdout;进度信息/面向用户的信息 → stderr。
fmt.Fprintln(os.Stderr, "Processing...") // progress to stderr
json.NewEncoder(os.Stdout).Encode(result) // data to stdout
第 4 步:代码检查
将 assets/.golangci.yml 复制到项目根目录,然后:
golangci-lint run ./...
需要 golangci-lint v1.59+(v1.x 系列)。
请参阅 references/testing.md,了解检查器说明和配置调整指南。
第 5 步:测试
请参阅 references/testing.md,了解完整的测试配置。
go test -race -count=1 -timeout=5m -coverprofile=coverage.out ./...
go tool cover -func=coverage.out | tail -1
不要在 CI 中强制要求任意的行覆盖率百分比(例如,强制要求 80%)。相比填充式单元测试,高信号的契约测试对 Agent 和人类都更有益。
相反,应确保所有主要导出的 API 都有可运行的 ExampleXxx 测试:
- 示例是由编译检查的文档。
- 它们能证明 API 契约如描述所述正常工作。
- 它们能避免 Agent 臆造错误的用法模式。
第 6 步:错误处理
请参阅 references/error-handling.md,了解结构化错误模式和退出码约定。
快速规则:
- 始终包装错误:
fmt.Errorf("loading config: %w", err) - CLI
main()捕获所有错误,并以适当的代码退出 - 绝不要在业务逻辑深处调用
os.Exit——应向上返回错误 - 除
init()/包级设置外,绝不要使用panic
第 7 步:非交互式设计
模式请参阅 references/non-interactive.md。
任何会阻止 Agent 执行的提示都必须支持通过 --yes/-y 跳过:
if !yes {
confirmed, _ := promptConfirm("Delete all records?")
if !confirmed {
return nil
}
}
// proceed
第 8 步:Makefile
将 assets/Makefile 复制到项目根目录。根据项目调整
BINARY_NAME 和 MAIN_PKG。
标准目标:make build、make test、make lint、make cover、
make ci(运行完整流水线)。
资源
| 文件 | 内容 |
|---|---|
| references/logging.md | slog、Zap、ZeroLog、Logrus 的 JSON 配置 |
| references/testing.md | 竞态检测器、覆盖率、golangci-lint 调优 |
| references/error-handling.md | 结构化错误、退出代码、上下文 |
| references/non-interactive.md | --yes 标志、环境变量、stdin 检测 |
| references/services.md | HTTP 优雅关闭、健康检查、OTel、请求 ID |
| references/config.md | 配置管理、环境变量解析、验证 |
| assets/.golangci.yml | 适用于生产环境的 Linter 配置 |
| assets/Makefile | 标准构建/测试/Lint/覆盖率目标 |