suggestion.md - maoxiaoyue/hypgo GitHub Wiki
HypGo Framework — AI-Human Collaborative Development Guide 版本:0.8.1 | 2026-03
這篇文檔不講理論,只講「你下一步該做什麼」。
如果你剛接觸 HypGo,或者你已經在用但覺得 AI 協作的效果不如預期,這篇文檔會建議你:怎麼準備材料、怎麼下指令、怎麼讓 AI 少犯錯。
核心觀念只有一個:你給 AI 的資訊品質,決定了 AI 產出的程式碼品質。 HypGo 的工具鏈就是幫你用最少的力氣,準備最高品質的資訊。
# 純 API 專案(推薦起手)
hyp api myservice && cd myservice && go mod tidy
# 全棧專案(含前端模板)
hyp new myapp && cd myapp && go mod tidy很多人的直覺是先寫 handler,再補文檔。在 HypGo 中,順序反過來:
❌ 先寫 handler → 再寫測試 → 再寫文檔 → AI 不知道你在幹嘛
✅ 先寫 Schema → AI 幫你寫 handler → Contract 自動驗證 → 你審核業務邏輯
Schema 是整個人機協作的起點。沒有 Schema,Manifest 是空的,Contract Testing 無法運作,AI 生成的程式碼沒有依據。
Schema 寫好、server 跑起來之後,立刻執行:
# 生成專案快照(AI 的「地圖」)
hyp context -o .hyp/context.yaml
# 生成所有 AI 工具的配置檔
hyp ai-rules這兩步做完後,無論開發者用哪個 AI 工具(Claude Code、Cursor、Copilot、Gemini、Codex),AI 都會自動讀取配置檔,立刻知道你的專案用了 HypGo、有哪些路由、該用什麼慣例。
| 順序 | 命令 | 目的 | 何時執行 |
|---|---|---|---|
| 1 | hyp api myservice |
建立專案 | 一次 |
| 2 | 寫 Schema 路由 | 定義 API 合約 | 每次新增路由 |
| 3 | hyp run |
啟動(AutoSync 自動生成 manifest) | 開發時 |
| 4 | hyp context -o .hyp/context.yaml |
手動更新 manifest | Schema 變更後 |
| 5 | hyp ai-rules |
生成 AI 工具配置檔 | 路由變更後、新成員加入時 |
| 6 | hyp chkcomment <file> |
檢查註解完整性 | 寫完程式碼後 |
| 7 | hyp impact <file> |
分析修改影響 | 改共用套件前 |
| 8 | hyp migrate diff |
產生 DB migration SQL | Model 變更後 |
你不需要把所有原始碼丟給 AI。HypGo 幫你把資訊壓縮到幾個關鍵檔案:
| 材料 | 檔案 | Token 成本預估 | 包含什麼 |
|---|---|---|---|
| 必備 | .hyp/context.yaml |
~500 | 所有路由、型別、server 設定 |
| 必備 |
AGENTS.md 或 CLAUDE.md
|
~300 | 框架慣例、Build/Test 指令 |
| 按需 | 單一 Schema 定義 | ~50 | 特定路由的 Input/Output struct |
| 按需 | Error Catalog 節錄 | ~30 | 已定義的錯誤碼清單 |
| 按需 |
hyp impact 輸出 |
~50 | 修改影響範圍 |
關鍵原則:讓 AI 先讀 manifest,再讀你的需求。不要讓 AI 自己去翻原始碼。
假設你要新增一組訂單 API(建立訂單、查詢訂單、列出訂單)。以下是推薦的步驟:
// app/models/order.go
type CreateOrderReq struct {
UserID int `json:"user_id"`
ProductID int `json:"product_id"`
Quantity int `json:"quantity"`
Note string `json:"note,omitempty"`
}
type OrderResp struct {
ID int `json:"id"`
UserID int `json:"user_id"`
ProductID int `json:"product_id"`
Quantity int `json:"quantity"`
Total float64 `json:"total"`
Status string `json:"status"`
CreatedAt string `json:"created_at"`
}// app/controllers/order.go
r.Schema(schema.Route{
Method: "POST",
Path: "/api/orders",
Summary: "建立訂單",
Tags: []string{"orders"},
Input: CreateOrderReq{},
Output: OrderResp{},
Responses: map[int]schema.ResponseSchema{
201: {Description: "Order created"},
400: {Description: "Invalid input"},
},
}).Handle(createOrderHandler)
r.Schema(schema.Route{
Method: "GET",
Path: "/api/orders/:id",
Summary: "查詢單筆訂單",
Tags: []string{"orders"},
Output: OrderResp{},
}).Handle(getOrderHandler)請根據 .hyp/context.yaml 中的 schema,實作 createOrderHandler 和 getOrderHandler。
使用 errors.Define 定義錯誤碼(E3001 起跳),
用 Bun ORM 存取資料庫。
AI 會看到 manifest 裡的 Input/Output 型別,直接生成符合合約的 handler。
// app/controllers/order_test.go
func TestOrderContracts(t *testing.T) {
contract.TestAll(t, router)
}一行就驗證了所有 schema 路由的 Input/Output 合約。
你定義「什麼」(Schema) → AI 實作「怎麼做」(Handler) → Contract 驗證「對不對」
這個順序最大化了人機協作的效率:
- 你擅長的事:決定 API 長什麼樣、業務邏輯是什麼
- AI 擅長的事:把你的定義轉成 boilerplate 程式碼
- 框架擅長的事:自動驗證 AI 的產出符合你的定義
Schema(定義合約)
│
├──→ Router(註冊路由 + Schema metadata)
│ │
│ └──→ Manifest(專案快照,給 AI 讀)
│
└──→ Contract(根據 Schema 自動驗證 Handler)
| 排名 | 元件 | 影響範圍 | 為什麼 |
|---|---|---|---|
| 1 | Schema | 全局 | 它是其他三者的基礎。沒有 Schema,Manifest 是空的、Contract 無法驗證、Router 退化為傳統路由 |
| 2 | Contract | 品質保證 | Schema 寫好但不驗證,等於沒寫。Contract 是閉環的「最後一哩路」 |
| 3 | Manifest | AI 效率 | 有了 Schema,Manifest 是自動產出的。它影響的是 AI 的理解速度和準確度 |
| 4 | Router | 運行時 | Router 本身是基礎設施,Schema 路由和傳統路由都能用,差別在於有沒有攜帶 metadata |
一句話總結:Schema 是源頭,Contract 是驗證,Manifest 是傳遞,Router 是載體。
Schema 的品質直接決定了 AI 生成程式碼的品質。以下是實戰建議:
r.Schema(schema.Route{
Method: "POST", // ← 必填:HTTP 方法
Path: "/api/users", // ← 必填:路由路徑
Summary: "建立使用者", // ← 強烈建議:一句話說明,AI 靠這個理解意圖
Input: CreateUserReq{}, // ← 強烈建議:Input struct,Contract 用它驗證請求
Output: UserResp{}, // ← 強烈建議:Output struct,Contract 用它驗證回應
}).Handle(handler)r.Schema(schema.Route{
// ...必填欄位...
Tags: []string{"users", "admin"}, // AI 可以按模組理解路由
Description: "建立新使用者帳號,需要 admin 權限", // 更詳細的說明
Responses: map[int]schema.ResponseSchema{
201: {Description: "User created successfully"},
400: {Description: "Validation error"},
409: {Description: "Email already exists"},
},
Params: []schema.ParamSchema{
{Name: "id", In: "path", Required: true, Type: "int"},
},
}).Handle(handler)| 項目 | 好的做法 | 差的做法 |
|---|---|---|
| Summary | "建立使用者" |
"" (空的,AI 不知道這路由幹嘛) |
| Input |
CreateUserReq{} (明確的 struct) |
nil (AI 無法知道要傳什麼) |
| Output |
UserResp{} (明確的 struct) |
nil (Contract 無法驗證回應) |
| Tags |
[]string{"users"} (分類清楚) |
nil (Manifest 裡看不出模組劃分) |
| Responses | 列出 201/400/409 | 不寫(AI 猜不到錯誤情境) |
你不需要手動寫 Manifest。 它是自動生成的。
# 方法一:手動生成
hyp context -o .hyp/context.yaml
# 方法二:自動生成(Server.Start() 時 AutoSync 會寫入 .hyp/context.yaml)
hyp runManifest 的品質取決於你的 Schema 品質。Schema 寫得好,Manifest 就包含完整的路由、型別和描述。Schema 是空的,Manifest 就只有 server 設定。
唯一要做的事:確保 .hyp/context.yaml 被加入版本控制(或者加入 .gitignore 讓每次啟動自動生成,取決於你的偏好)。
func TestAllContracts(t *testing.T) {
// 建立你的 router(含所有 Schema 路由)
r := setupRouter()
// 一行測試所有 schema 路由
contract.TestAll(t, r)
}TestAll 會自動:
- 遍歷 Schema Registry 中所有路由
- 為 Input struct 生成最小有效的 JSON(數字填 0,字串填
"test") - 發送 HTTP 請求
- 驗證回應狀態碼(POST → 201、DELETE → 204、其他 → 200)
- 驗證回應 body 符合 Output struct 的欄位
contract.Test(t, r, contract.TestCase{
Route: "POST /api/users",
Input: `{"name":"alice","email":"[email protected]"}`,
ExpectStatus: 201,
ExpectSchema: true, // 驗證回應符合 UserResp schema
})// 不驗證 schema,只驗證路由存在且回傳正確狀態碼
contract.TestRoute(t, r, "GET", "/health", 200)兩者可以並存,你不需要一次全部遷移:
// 傳統路由 — 簡單、快速,但 AI 看不到 metadata
r.GET("/health", healthHandler)
r.POST("/webhook", webhookHandler)
// Schema 路由 — 多寫幾行,但 AI 可以理解、Contract 可以驗證
r.Schema(schema.Route{
Method: "POST",
Path: "/api/users",
Summary: "建立使用者",
Input: CreateUserReq{},
Output: UserResp{},
}).Handle(createUserHandler)什麼時候該用 Schema 路由?
| 場景 | 建議 |
|---|---|
| 對外 API(供前端或第三方呼叫) | 一定要用 Schema |
| 會請 AI 幫忙實作的路由 | 一定要用 Schema |
| 內部健康檢查、webhook | 傳統路由即可 |
| 靜態檔案路由 | 傳統路由即可 |
hyp generate controller user → app/controllers/user.go
hyp generate model order → app/models/order.go
hyp generate service payment → app/services/payment.go生成的程式碼不是空殼 — 它自動整合了 HypGo 的慣例:
-
Controller:包含
router.Schema()註冊、errors.Define()錯誤碼定義、CRUD handler 骨架 -
Model:包含 Bun ORM struct tags(
bun:"table:users") - Service:包含 Error Catalog 整合、介面定義
| 場景 | 為什麼有利 | 具體效果 |
|---|---|---|
| 專案初期快速搭建 | 一次生成 5-10 個 CRUD 資源的骨架 | 省去重複的 boilerplate,幾分鐘就有完整的 API 結構 |
| 新成員加入團隊 | 生成的程式碼就是「範例」 | 新人一看就知道 Schema 怎麼寫、Error 怎麼定義 |
| AI 互動的起點 | 生成骨架後讓 AI 填充業務邏輯 | AI 有了正確的結構,不會自行發明不符慣例的寫法 |
| 保持一致性 | 所有資源都用相同模板 | 團隊不會出現「每個人寫法不同」的問題 |
| 場景 | 原因 | 替代方案 |
|---|---|---|
| 複雜的自訂路由邏輯 | 模板是通用的,無法涵蓋特殊需求 | 手動寫 Schema + 讓 AI 實作 |
| 已有大量既有程式碼 | generate 只建立新檔案,不能整合進既有結構 | 手動添加 Schema 到現有 handler |
| 非 CRUD 的場景(WebSocket、串流) | 模板針對 REST CRUD 設計 | 手動實作 |
# 1. 批量生成資源骨架
hyp generate controller user
hyp generate controller product
hyp generate controller order
hyp generate model user
hyp generate model product
hyp generate model order
# 2. 調整 Schema 定義(加入正確的 Input/Output struct)
# 3. 更新 manifest
hyp context -o .hyp/context.yaml
# 4. 告訴 AI:「根據 manifest 中的 schema,實作所有 handler 的業務邏輯」
# 5. 跑 Contract Testing 驗證
go test ./app/controllers/... -v# 確保 manifest 是最新的
hyp context -o .hyp/context.yaml# 先看影響範圍
hyp impact pkg/errors/catalog.go
# 如果風險是 HIGH,跟團隊討論再改
# 如果風險是 LOW/MEDIUM,改完跑受影響的測試
go test ./pkg/errors/... ./pkg/contract/... -v# 檢查註解完整性
hyp chkcomment app/controllers/user.go
# 跑 contract 測試
go test ./app/controllers/... -v
# 如果有 model 變更,生成 migration
hyp migrate diff以下是經過驗證的、能讓 AI 產出高品質程式碼的提示模板:
新增功能:
請先讀取 .hyp/context.yaml 了解專案結構。
我需要新增一個 [功能名稱] 功能,
Input 是 [StructName],Output 是 [StructName]。
請使用 router.Schema() 註冊路由,
用 errors.Define() 定義錯誤碼(從 E[xxxx] 開始),
用 Bun ORM 存取資料庫。
修改現有功能:
請先讀取 .hyp/context.yaml,
然後執行 hyp impact [要修改的檔案] 確認影響範圍。
我需要修改 [路由路徑] 的行為:[具體修改]。
修改完後請跑 contract.TestAll() 確認合約沒有被破壞。
排查問題:
請先讀取 .hyp/context.yaml 了解專案結構,
然後看 [問題相關的檔案]。
問題是:[描述問題]。
請用 hyp impact 確認修復不會影響其他模組。
Go doc comment 是自由文本,AI 需要「理解」自然語言。Schema 是結構化的 Go struct,AI 直接讀取欄位名和型別 — 零歧義。
Swagger 是從程式碼「生成」的文檔,可能與程式碼不同步。HypGo Schema 是路由註冊過程的一部分 — 它不可能不同步,因為它就是路由本身。另外,Schema 直接驅動 Contract Testing,Swagger 做不到。
不能。Contract Testing 驗證的是「介面合約」(型別對不對、狀態碼對不對)。單元測試驗證的是「業務邏輯」(金額算對沒、邊界條件對不對)。兩者互補,缺一不可。
值得。寫 Schema 只多 5 行程式碼,但你得到:
-
contract.TestAll()自動驗證(省掉手寫測試的時間) - Manifest 包含完整路由資訊(AI 理解更準確)
- 隨著專案成長,Schema 的價值會指數級增長
建議加入。這樣團隊裡每個人用不同的 AI 工具,都能自動讀到相同的慣例。
你 AI 框架
│ │ │
├─ 定義 Struct ──────────→│ │
├─ 寫 Schema 路由 ───────→│ │
├─ hyp context ──────────→├─ 讀 manifest ──────────→│
│ ├─ 理解 API 結構 │
├─ 描述需求 ─────────────→├─ 生成 Handler ─────────→│
│ │ ├─ Contract 驗證
│ │ ├─ ✅ 通過 → 合併
│ │ └─ ❌ 失敗 → 回饋
│ ├─ 修正程式碼 ─────────────→│
│ │ ├─ 再次驗證
├─ 審核業務邏輯 ←──────────┤ │
├─ hyp chkcomment ───────→│ │
├─ hyp migrate diff ─────→│ │
└─ 完成 ✅ │ │
記住:你負責「什麼」(Schema),AI 負責「怎麼做」(Handler),框架負責「對不對」(Contract)。
HypGo · AI-Human Collaborative Development Guide · 2026-03