# 開發流程

Source: https://gortexa.sheng.page/examples/workflow/

## 01 scaffold-smoke — 開發者流程全程

證明 create → gen → build → test 一路可跑，加第二個 API 後仍成立。這是 scaffold 的 transport smoke test；`create` 刻意保留 placeholder secret，所以伺服器啟動前必須在執行環境注入真正的 secret。

```bash
gortexa create myapp --module github.com/me/myapp
cd myapp
make gen                        # buf lint → breaking → generate
go build ./... && go test ./...
gortexa gen shop/v1 Product     # 加第二個 API
make gen && go build ./... && go test ./...
```

關鍵斷言：`proto/myapp/shop/v1/product.proto`（package `myapp.shop.v1`，`gen` 從 `.gortexa/project.json` 讀專案 namespace）與 `internal/logic/product.go` 都產出、`cmd/server/main.go` 已 wire product，且 `etc/config.yaml` 仍留著 `dev-only-insecure-secret-change-me-please` —— 伺服器會拒絕以它啟動，直到設好 `GORTEXA_AUTH__JWT_SECRET`。這只驗證本機可啟動；在 git 或 Docker 前仍必須改成外部 secret injection，並把 in-memory logic 換成真實資料層。

## 02 multi-protocol-e2e — 同一實體跨三協定

在單一 h2c port（`:18080`）上，gRPC 建的實體用 HTTP 抓得到、MCP 建的也在 list 裡——三協定共享同一份狀態。`$TOK` 是開發用 token，`$SCHEMA` 是 `buf build` 出的 descriptor。

gRPC 建立：

```bash
buf curl --protocol grpc --http2-prior-knowledge --schema $SCHEMA \
  -H "authorization: Bearer $TOK" \
  -d '{"resource":{"name":"grpc-entity","owner":"owner-e2e"}}' \
  http://localhost:18080/myapp.resource.v1.ResourceService/CreateResource
```

HTTP gateway 抓同一個 id，再用 MCP `tools/call` 建第三個：

```bash
curl -H "authorization: Bearer $TOK" http://localhost:18080/v1/resources/$RID   # 200，同一實體

curl -XPOST http://localhost:18080/mcp -H 'Content-Type: application/json' \
  -H "authorization: Bearer $TOK" \
  -d '{"jsonrpc":"2.0","id":3,"method":"tools/call",
       "params":{"name":"create_resource",
                 "arguments":{"resource":{"name":"mcp-entity","owner":"owner-e2e"}}}}'
```

最後 list `owner-e2e`，會同時看到 gRPC、HTTP、MCP 三個來源建立的實體——證明三個表面背後是同一個 store。
