结论先行:我们用 Claude Fable 5 从零做出一个叫 pulsecheck 的 CLI——批量检查一组 URL/API 是否还能访问,结果写成 JSON,方便挂 cron 或接告警。全文分两块:先讲这个工具解决什么问题、成品怎么用(见下方说明与截图);再按七个步骤复盘Claude Code 里 AI 写了哪些代码、哪些环节必须你来定。只想快速了解用途和效果,读到截图即可;要自己动手做一遍,从步骤 1 开始。
pulsecheck 用来干什么?
一句话:帮你批量检查一组网址/API 是否还能正常访问,不用手动一个个打开浏览器或敲 curl。
典型用法:把生产环境要盯住的地址写进 config.yaml(比如 /health、/ping),用 cron 每 5 分钟跑一次 pulsecheck。若某个 API 返回 503 或超时,程序退出码变成 1,你的告警脚本或监控系统就能抓到。它是轻量巡检脚本,不是完整监控平台——没有大盘、没有短信,只负责「这批 URL 现在活没活」并输出 JSON 报告。
用来干什么:三个真实场景
先别管 Go、YAML、JSON——这个小工具解决的是「我怎么知道这些服务还活着」。下面三种情况,就是写它的理由:
- 定时巡检 — 你有 5~20 个健康检查 URL(支付回调、开放 API、内部网关)。以前用 shell 写
for url in ...; do curl ...,难维护、没统一报告。pulsecheck 读一份配置,输出结构化 JSON,cron 挂上去即可。 - 发版 / 值班前手动确认 — 上线前跑一条命令:
./pulsecheck -config prod.yaml -o /tmp/pre-deploy.json。全绿(退出码 0)再发版;有红(退出码 1)先别推。 - 接告警的「探针」 — 不需要 Prometheus 全家桶时,用退出码接现有脚本:退出码 1 就
curl你的 Webhook 或发邮件。JSON 报告留给事后翻日志。
它不负责的事:历史趋势、短信告警、多租户后台——那些交给 Datadog 或云监控。pulsecheck 只管此刻这一批 URL 通不通。
成品截图
下面是 pulsecheck 全部做完之后在 Mac 终端里的真实效果:读配置、探测 URL、写出 JSON,有一个站点返回 503 所以退出码是 1。
./pulsecheck -config config.example.yaml -o report.json;右侧 report.json 列出每个 URL 的状态码、延迟与是否健康(ok)。对应你本地的三条命令就是:
./pulsecheck -config config.example.yaml -o report.json echo $? # 1 = 有站点不健康 cat report.json # 查看报告
输入 / 输出 / 技术形态
用途讲清之后,再看技术上怎么运转:可以把它想成「批量 curl + 汇总成一份报告」,做成可编译、可接 cron 的 CLI。
| 维度 | 说明 | 示例 |
|---|---|---|
| 输入 | YAML 配置文件,列出要检查的 URL | config.example.yaml |
| 输出 | JSON 健康报告 + 进程退出码 | report.json;0=全绿,1=有失败 |
| 典型用法 | cron 定时巡检;发版前手动确认;退出码接告警 | 每 5 分钟 */5 * * * * pulsecheck ... |
| 技术栈 | Go 1.22 单二进制 | 无 GUI、无数据库 |
你需要维护的只是一份 YAML 配置,列出要巡检的 URL;探测与汇总由 pulsecheck 自动完成。示例见下:
targets: - https://api.example.com/health - https://status.example.com/ping
做完后的代码仓库约 400 行 Go,结构如下:
pulsecheck/ ├── cmd/pulsecheck/main.go # 命令入口:-config -o ├── internal/checker/checker.go # 发 HTTP、记延迟 ├── internal/config/config.go # 解析 YAML ├── config.example.yaml ├── Makefile · README.md └── .github/workflows/ci.yml
后半篇:AI 在七步里写了什么
到这里,pulsecheck 是什么、用来干什么,应该已经清楚。从本节起进入构建过程:用 Claude Fable 5 + Claude Code,从空文件夹到打出 v0.1.0 tag,AI 逐步产出了哪些文件、人在哪几步必须插手。
一句话分工:AI 写代码和测试;人定「做什么 / 不做什么」、Review 打回、最后签字发布。下面七个步骤均可照抄 Prompt 复现;模型用 Claude Code 里的 Fable 5 即可(不必上 Opus,见 档位对比)。
环境准备
- Go 1.22+ —
go version确认 - Claude Code CLI — 模型选 Claude Fable 5(日常 Agent 循环够用,见 模型档位对比)
- 空目录 —
mkdir pulsecheck && cd pulsecheck && git init - (可选)GitHub 仓库 — 步骤 6 推远程跑 CI;也可先本地做完
步骤 1:建仓库、写需求
你要做的:用三句话写清痛点,落成 SPEC.md。可以手写,也可以先口述让 AI 扩写,但非目标必须人删(否则 AI 会加 Web UI、数据库)。
请阅读下面需求,生成 SPEC.md 草案,不要增加任何未列出的功能: - 工具名 pulsecheck,Go 1.22 CLI - 读取 YAML 配置中的 URL 列表,并发 HTTP GET - 输出 JSON 报告到 -o 指定路径 - 字段:url, status_code, latency_ms, ok - 默认超时 5 秒,环境变量 PULSECHECK_TIMEOUT 可覆盖 - 退出码:0 全绿,1 有失败,2 配置错误 - 非目标:无 GUI、无 DB、无 Docker、无告警推送
AI 会产出:SPEC.md。你要检查:有没有擅自加功能;验收命令是否写上 go test ./...。
验收:cat SPEC.md,确认「必须 / 非目标 / 退出码」三节齐全。
步骤 2:搭项目骨架
你要做的:让 AI 只搭架子、不写业务。这一步 Fable 5 几乎全包。
阅读 SPEC.md,初始化 Go 模块 github.com/you/pulsecheck。 只创建项目骨架,业务逻辑返回 stub: - cmd/pulsecheck/main.go 解析 -config 和 -o - internal/config 读 YAML - internal/checker 空实现 - Makefile:test、lint、build - .github/workflows/ci.yml 占位 要求 go build ./... 通过,不要写真实 HTTP 逻辑。
AI 会产出:上文目录树里的 8 个文件。耗时约 6 分钟。
验收:
go build ./... ./pulsecheck -h # 应显示用法
步骤 3:写探测逻辑与测试
你要做的:要求先写测试、再写实现。这是整个项目里最「像在做项目」的一步——AI 会自己跑 go test,失败了改代码,直到绿。
在 internal/checker 中: 1. 先写 checker_test.go,用 httptest 模拟 200、500、超时三种情况 2. 再实现 checker.go:HTTP GET、记录 status_code 和 latency_ms 3. 循环执行 go test ./... 直到全部通过 4. main.go 串联 config → checker → 写 JSON 到 -o 路径
AI 会产出:核心探测代码。逻辑大致如下(节选):
func CheckURL(ctx context.Context, client *http.Client, url string) Result { start := time.Now() req, _ := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) resp, err := client.Do(req) if err != nil { return Result{URL: url, OK: false, LatencyMs: time.Since(start).Milliseconds()} } defer resp.Body.Close() ok := resp.StatusCode >= 200 && resp.StatusCode < 300 return Result{ URL: url, StatusCode: resp.StatusCode, LatencyMs: time.Since(start).Milliseconds(), OK: ok, } }
实测中 Fable 5 跑了 3 轮 go test:第 2 轮自己修好了「超时没传进 HTTP client」的 bug,人没改代码。
验收:
go test ./... -v # 12 条表驱动测试全绿
步骤 4:Review 修补
你要做的:自己当 Code Reviewer,列问题清单让 AI 改,不要自己动手改(否则测不出 AI 能不能按反馈迭代)。
按下面 Review 意见修改,改完 go test ./... 必须仍绿: 1. JSON 字段 latency 改为 latency_ms,与 SPEC 一致 2. 多 URL 用 worker pool,默认最多 10 并发 3. stdout 只输出 JSON 报告路径提示;warn 日志走 stderr
AI 会产出:并发 worker pool、字段改名、日志分流。人完成:判断这三条是否该改——这是 AI 替不了的。
验收:go test ./... 仍绿;手动跑一两个 URL 看 JSON 字段名对不对。
步骤 5:配置文件与 README
你要做的:让 AI 写运维能直接 copy 的文档和样例配置。
生成 config.example.yaml 和 README.md: - 安装:go install 或 go build - 用法示例、退出码表(0/1/2) - cron 每 5 分钟跑一次并追加日志的示例 - 不要编造不存在的子命令
AI 会产出:
targets: - https://api.example.com/health - https://status.example.com/ping
验收:把 example 里的 URL 换成你能访问的地址,按上文「成品截图」里的三条命令跑通,report.json 字段齐全。
步骤 6:接 GitHub Actions
你要做的:推送到 GitHub,让 AI 补全 CI 并在失败时自修。
完善 .github/workflows/ci.yml: - go test -race ./... - golangci-lint run - 用 go 1.22 如果 lint 失败,读日志并修复后重新提交。
首次 lint 报了 unused import,Fable 5 读 CI 日志后自己删掉。若本机 16GB 内存跑 -race 会 Swap,可把 race 放到 GitHub Runner 或 Cloud Mac 节点 上跑——与 Claude Code 执行环境 选型同一思路。
验收:GitHub 上 CI 全绿。
步骤 7:验收并打 tag 上线
你要做的:最后一步必须人亲手做——smoke test、打 tag。AI 可以写 CHANGELOG 草案,但上线签字是你的事。
go test ./... make build ./pulsecheck -config config.example.yaml -o /tmp/report.json cat /tmp/report.json | jq . git add -A && git commit -m "feat: pulsecheck v0.1.0" git tag -a v0.1.0 -m "first release: YAML-driven HTTP health probe" git push && git push --tags
到这一步,pulsecheck 就算从需求到上线做完了:一个能装 cron、能接监控的 CLI 小工具,全程约 52 分钟。
做完之后还能扩什么
v0.1 故意没做:Slack 告警、Prometheus exporter、Docker 镜像。这些可以开新 Issue 再让 Fable 5 做——小项目先闭环,再迭代。
各步对照:AI 完成了什么
做完项目后回头看,七步里 AI 与人的分工可以这样记:
| 步骤 | AI(Fable 5)完成 | 人必须完成 |
|---|---|---|
| 1 需求 | 把口语扩成 SPEC 结构 | 删非目标、定退出码 |
| 2 骨架 | 8 个文件、go build 通过 | 确认 Go 版本与模块名 |
| 3 实现 | 测试 + checker + main 串联 | 看测试是否覆盖 Spec |
| 4 Review | 按清单改代码 | 列 Review 意见 |
| 5 文档 | README + config 样例 | copy-paste 跑通 |
| 6 CI | workflow + 修 lint | 定义「何谓绿」 |
| 7 发布 | CHANGELOG 草案 | smoke test、打 tag |
可编码产出大约 78% 由 AI 写完;需求剪刀、Review 判断、tag 签字这三样,换哪个模型都得人做。
场景怎么选(决策矩阵)
| 如果你是… | 推荐做法 | 原因 |
|---|---|---|
| 第一次跟 AI 做完整小项目 | 照本文七步 + 每步验收命令 | 比抽象讨论「AI 强不强」更快出成品 |
| 想做运维/内部 CLI(类似 pulsecheck) | Go + Fable 5 Agent 循环 | 测试可自跑,适合表驱动验收 |
| 对外 SaaS / 含用户数据 | AI 仅草稿 + Opus 安全审查 | 上线责任不能全给 Agent |
| 老仓库局部功能 | 跳过②,从 Issue 进 Agent | 骨架已存在 |
| 16GB Mac + 长跑 CI | Agent 本地,race/编译上 Cloud Mac | 避免 Swap 误判为模型变慢 |
| 要一周内给老板 demo | 先锁 Spec 非目标,再开 Agent | 防止 AI 扩 scope 导致无法上线 |
推荐组合(可叠加)
- 个人开发者 — Fable 5 跑 ②–⑥;Cursor Tab 做发布前微调;Opus 仅对外服务做审查。
- 小团队 — 仓库模板内置七阶段 checklist;新工具复制 pulsecheck 流程;Agent 挂在 Claude Code 生产级工作流。
- 省 token — Spec 润色与 CHANGELOG 可用 Gemini Flash;编码循环仍用 Fable 5;路由见 OpenRouter 定价结构。
叠加 MCP 时:MCP 拉 Issue / 监控上下文,Fable 5 改仓库;⑦ 发布签字仍建议人工。
常见误区
- 误区 1:没写清做什么项目就开聊 — AI 会泛泛给方案;先定 pulsecheck 这类一句话目标。
- 误区 2:步骤 2 就让写业务逻辑 — 骨架和实现混在一起,后面难测。
- 误区 3:跳过步骤 4 Review — JSON 字段名、日志污染 stdout 等细节会漏进「成品」。
- 误区 4:不做步骤 7 就打 tag — 没 smoke test 不算上线。
- 误区 5:本机 16GB 跑 race + Agent — 变慢是内存问题,把 CI 放 Runner / Cloud Mac。
FAQ
pulsecheck 用来解决什么问题?
解决「一批 URL 现在能不能访问」——不用手写 shell 循环 curl,也不用上重型监控平台。适合个人项目、小团队或发版前的快速探活。
和 UptimeRobot、Prometheus 有啥区别?
pulsecheck 是自己机器上跑的轻量 CLI,配置在你手里,无 SaaS 依赖;后者是完整监控方案,功能多、成本高。本文做的是前者——够用、可自己改代码。
能直接 clone 仓库吗?
本文是实测复盘 + 可复现教程,按七步 Prompt 可在自己目录生成等价实现,不必追求与文中 diff 逐行一致。
哪一步 AI 做得最多?
步骤 3(测试 + 实现)和步骤 2(骨架)几乎全由 Fable 5 写完;步骤 1 和 7 人动手最多。
和 Cursor Tab 补全有什么不同?
Tab 适合改单文件;做完整项目要 Claude Code 多文件 + 跑测试。见 Copilot vs Cursor 实测。
总结
成品:pulsecheck——读 YAML 里的 URL,批量检查是否在线,输出 report.json(见上文截图)。过程:用 Claude Fable 5 按七步从空目录做到可打 v0.1.0 tag,AI 写了大部分 Go 代码与测试,人负责定范围、Review 和发布。你若只想评估「AI 能不能做小项目」,先看截图和输入输出表;若想自己做一遍,从步骤 1 的 Prompt 复制即可。
ZavCloud · 云端 Mac
用 Cloud Mac 跑 pulsecheck 的 CI
Mac mini M4 独享实例:Claude Code 写代码,GitHub Actions 在同一 macOS 节点跑 test -race——步骤 6 不被本机 16GB 内存拖慢。
查看方案与定价