
文章同步發表在我的個人 Blog
我平常主要開發 Laravel、Filament 和雲端服務,以後端為主,寫過一陣子 Android,沒寫過 Swift。這 30 天要開發一個可用的 iOS App,同時每天發一篇文章,時間其實是相當緊迫的。
不先從頭學語言,先弄清楚自己不知道什麼,再讓 AI Agent 幫忙找、幫忙整理。

開發由 Codex 規劃、Spectra 寫規格、Claude Code 實作。
Spectra 是龍哥開發的一套規格驅動開發(Spec-Driven Development)的工具:先把要做什麼、做到怎樣才算完成寫成文件,AI 照文件實作,做完再對照文件驗收。用 Laravel 來比喻,它有點像管需求的 migration:每次變更是一個資料夾,做完用 /spectra-archive 併進「系統現在該有的行為」。

$spectra-propose 產生規格/spectra-apply 一次做一個 task,每個綠燈都 commit/spectra-debug,只修這一個錯,修完重新驗證/spectra-archive 封存$spectra-ingest 更新規格,再回到實作入口都在 Claude Code,我不會在兩個工具之間切換,規劃和審查的時候,在 Claude Code 裡用 /codex:rescue 把工作交給 Codex:
| 步驟 | 在 Claude Code 輸入 | 實際誰做 |
|---|---|---|
| 規劃 | /codex:rescue 讀 plan.md,用 $spectra-propose 建立下一個功能的 change |
Codex |
| 審查 | /codex:rescue 審查 <change> 的實作和驗證證據 |
Codex |
| 需求改了 | /codex:rescue 用 $spectra-ingest 更新 <change> |
Codex |
規則只有一條:規劃和審查加 /codex:rescue,其他步驟直接打指令。
這個流程有三個原則:
xcodebuild 和模擬器,就像 Day 5 提到的「誰能開瀏覽器,誰就負責驗收」/spectra-debug,修 3 次仍失敗就停下來通知我這個想法參考了 Graph Engineering:把 AI 的工作流程畫成一張圖,每個失敗都有去處,也有停下來的邊界。
停下來之後換我接手,用過去 debug 的經驗判斷方向:
開發會用到好幾份文件,每份各管一塊,彼此不重複:
| 文件 | 管什麼 | 誰建立 | 不寫什麼 |
|---|---|---|---|
plan.md |
整個 App 要做哪些功能、先後順序、這次不做什麼 | 我,Codex 協助規劃 | 單一功能的細節規格 |
AGENTS.md |
分工、開發流程、build 和測試指令、驗證、停止條件 | Codex 起草,我確認 | 個別功能的需求 |
CLAUDE.md |
匯入 AGENTS.md,加上 Claude Code 專屬的工具用法 |
Claude Code | 重複寫一次共用規則 |
| Spectra change | 單一功能的 proposal、design、specs、tasks | Codex 用 $spectra-propose 產生 |
其他功能的需求 |
整體方向放在 plan.md。 Spectra 只處理 AI Agent 交給它的那一個功能,不會自己去讀 plan.md。所以流程是:Codex 先讀 plan.md,挑出下一個要做的功能,整理成需求,再用 $spectra-propose 開出規格。「整個 App 要做哪些、先做哪個、哪些這次不做」由 plan.md 決定,每個功能的驗收條件則寫在 Spectra 的規格裡。
共用規則寫在 AGENTS.md。 Codex 讀 AGENTS.md,Claude Code 讀 CLAUDE.md,兩邊都要知道同一套驗收標準,所以規則只寫一份,CLAUDE.md 第一行用 @AGENTS.md 匯入。Claude Code 的官方文件有說明這種寫法。
有衝突時各看各的:範圍和順序看 plan.md、行為看 specs、做法看 design、驗證門檻看 AGENTS.md。Claude Code 實作時發現需求不對,不能自己在 tasks 裡改,要回去請 Codex 更新規格。
AGENTS.md 會寫五段:分工、開發流程、驗證、停止條件、回報。其中回報是為了我自己,要求 AI 講清楚動了哪些檔、用到哪些新的 Swift 寫法、哪裡是猜的,我才有辦法驗收。實際內容明天建專案時寫好再介紹。
AI 說「做好了」不算數,要拿出證據。證據依照時機分三種,不是每次都要全部做:
| 什麼時候 | 要看到什麼 |
|---|---|
| AI 每改完一次 | build 成功,測試有跑而且全部通過 |
| 一個功能做完 | 上面那些,加上在模擬器上走過主要流程,我自己也點過一次 |
| 重要的版本 | 上面那些,加上裝到手機上能用 |
規格也要寫成驗收得了的樣子,我訂了四條規則:
後三條參考了一支 SwiftUI 影片作者公開的範本(連結在文末)。這四條明天會寫進 Spectra 的設定檔 openspec/config.yaml,之後每次產生規格都會自動套用。
規範和驗收都交給流程之後,我要先掌握的是能判斷驗收結果的最少知識。AI 交出來的 SwiftUI 大概長這樣,後端工程師第一次看,比較陌生的是這六種寫法:

看得懂這六種,AI 的程式碼大致就讀得下去。其他的等卡住再查,我把可能卡住的地方分成四層,每一層對應一種常見的症狀:

SwiftData 和 Swift 6 的並行這兩塊,錄製影片的教材通常講得不深入,所以有些資料仍需要自行研究與查詢。於是我告訴自己一個方向:如果同一類型的問題卡住三次,那個區塊就必須深入研讀。
明天是上工的第一天。我會跟 AI Agent 一起把 Xcode 安裝、設定起來,介紹 Xcode 基本的開啟方式和操作,再簡單介紹今天整理的規範寫成檔案之後的樣子:AGENTS.md、CLAUDE.md 和 openspec/config.yaml。
影片
文章與 Repo
ios/ios-scaffold/templates/Docs/PRD-TEMPLATE.md
官方文件