結論先行:我們用 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
做完後的程式碼 repo約 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 repo — 步驟 6 推遠端跑 CI;也可先本機做完
步驟 1:建 repo、寫需求
你要做的:用三句話寫清痛點,落成 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 |
| 老 repo 局部功能 | 跳過②,從 Issue 進 Agent | 骨架已存在 |
| 16GB Mac + 長跑 CI | Agent 本機,race/編譯上 Cloud Mac | 避免 Swap 誤判為模型變慢 |
| 要一週內給老闆 demo | 先鎖 Spec 非目標,再開 Agent | 防止 AI 擴 scope 導致無法上線 |
推薦組合(可疊加)
- 個人開發者 — Fable 5 跑 ②–⑥;Cursor Tab 做發布前微調;Opus 僅對外服務做審查。
- 小團隊 — repo 模板內建七階段 checklist;新工具複製 pulsecheck 流程;Agent 掛在 Claude Code 生產級工作流。
- 省 token — Spec 潤色與 CHANGELOG 可用 Gemini Flash;編碼循環仍用 Fable 5;路由見 OpenRouter 定價結構。
疊加 MCP 時:MCP 拉 Issue / 監控上下文,Fable 5 改 repo;⑦ 發布簽字仍建議人工。
常見誤區
- 誤區 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 repo 嗎?
本文是實測覆盤 + 可複現教學,按七步 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 記憶體拖慢。
查看方案與定價