Claude Fable 5 小项目实战:从需求到上线,全程 AI 完成了什么?

AI 手记  ·   ·  约 10 分钟阅读

开发者用笔记本推进小项目上线,象征 Claude Fable 5 从需求到发布的全链路协作

结论先行:我们用 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 报告。

CLI
终端小工具
7
构建步骤
52
分钟到 v0.1.0

用来干什么:三个真实场景

先别管 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 成品截图:终端运行 ./pulsecheck 后输出 report.json,含 api.example.com 200 与 status.example.com 503 两条探测结果
成品示意:左侧命令 ./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 自动完成。示例见下:

config.example.yaml
targets:
  - https://api.example.com/health
  - https://status.example.com/ping

做完后的代码仓库约 400 行 Go,结构如下:

pulsecheck/ 目录
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、数据库)。

发给 Claude Code 的 Prompt(步骤 1)
请阅读下面需求,生成 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 几乎全包。

发给 Claude Code 的 Prompt(步骤 2)
阅读 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,失败了改代码,直到绿。

发给 Claude Code 的 Prompt(步骤 3)
在 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 会产出:核心探测代码。逻辑大致如下(节选):

internal/checker/checker.go(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 能不能按反馈迭代)。

发给 Claude Code 的 Prompt(步骤 4 · Review 打回)
按下面 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 的文档和样例配置。

发给 Claude Code 的 Prompt(步骤 5)
生成 config.example.yaml 和 README.md:
- 安装:go install 或 go build
- 用法示例、退出码表(0/1/2)
- cron 每 5 分钟跑一次并追加日志的示例
- 不要编造不存在的子命令

AI 会产出:

config.example.yaml
targets:
  - https://api.example.com/health
  - https://status.example.com/ping

验收:把 example 里的 URL 换成你能访问的地址,按上文「成品截图」里的三条命令跑通,report.json 字段齐全。

步骤 6:接 GitHub Actions

你要做的:推送到 GitHub,让 AI 补全 CI 并在失败时自修。

发给 Claude Code 的 Prompt(步骤 6)
完善 .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 RunnerCloud 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 内存拖慢。

查看方案与定价
Cloud Mac 在线租用 Mac mini