Skip to content

ci: gate CLI consumer contract on openapi.json changes - #374

Merged
yupix merged 3 commits into
mainfrom
ci/openapi-consumer-contract-gate
Jul 18, 2026
Merged

ci: gate CLI consumer contract on openapi.json changes#374
yupix merged 3 commits into
mainfrom
ci/openapi-consumer-contract-gate

Conversation

@sousuke0422

Copy link
Copy Markdown
Contributor

openapi.json(API 契約)の変更で CLI の消費者契約型チェックが CI で必ず走るようにし、「backend が契約から endpoint を撤去 × 消費者がまだ叩いている」class を 実行時 405 でなく CI で赤検知する恒久ガードを追加する。

背景(動機=#364

#364 のレビューで露呈: backend が POST /v1/tenants/{tenant_id}/users/me/tasks を撤去しても、その endpoint を叩く CLI(apps/cli/src/commands/my.tsmy add)の契約チェックが CI で走らず、実行時に 405 で初めて壊れる。原因は二つ:

  • cli-test.yml の trigger paths が apps/cli/** のみで、正典契約 apps/frontend/openapi.json の変更では発火しなかった。
  • CLI の消費者型(src/api/paths.ts)は手書き committed で、契約から型を再生成する CI ステップが無く、契約撤去を型レベルで検知できなかった。
  • CLI 単体テストは POST をモックするため、この破壊はテストで検知されず実行時のみ顕在化する。

変更(発火だけで終わらせず「意味のある検知」にする)

  • trigger 追加: cli-test.ymlpull_request / push paths に apps/frontend/openapi.json を追加(既存 apps/cli/** は維持)。
  • 型再生成: CLI に openapi-typescript 7.13.0 と openapi:generate script を追加し、CI で正典 openapi.json から消費者型(src/api/openapi.d.ts)を毎回再生成する。
  • contract gate(openapi-contract.ts: CLI が使う全 path + HTTP method を生成型へ型レベルで照合。正典から path または method(POST 等)が消えると tsc が当該 path 名付きで失敗する。
  • drift gate: 再生成後に CLI build + contract typecheck を実行し、git diff --exit-code -- src/api/openapi.d.ts で committed 生成物の drift も検知。
  • 過剰発火の抑制: 新規発火は正典 apps/frontend/openapi.json 変更時の CLI Unit Test workflow のみ。backend の実装変更は既存の OpenAPI Drift Check が担い、consumer CLI を過剰発火させない。

赤/緑実証(#364 シナリオ・シミュレーション)

  • : 一時 jqpaths[/v1/tenants/{tenant_id}/users/me/tasks].post を削った型で pnpm buildexit 2 / TS2344: Type '/v1/tenants/{tenant_id}/users/me/tasks' does not satisfy constraint never(CLI my add が使う POST 消失を検知)。※正典 openapi.json は未変更・commit に撤去なし。
  • : 正典から pnpm openapi:generatepnpm build exit 0 / 生成物 git diff exit 0。

検証

pnpm install --frozen-lockfile(供給網 policy pass)・CLI application typecheck・contract test typecheck・生成物 drift・CLI tests 6 files / 23 tests、いずれも PASS(SKIP 0)。

スコープ外

本 PR は 検知機構のみ#364 本体の endpoint 撤去や CLI my add の挙動修正は一切含まない。

Assisted-by: multi-agent-shogun-aki-tweak

@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Jul 17, 2026

Copy link
Copy Markdown

Deploying koyori with  Cloudflare Pages  Cloudflare Pages

Latest commit: 67600d7
Status: ✅  Deploy successful!
Preview URL: https://9493fcc3.koyori.pages.dev
Branch Preview URL: https://ci-openapi-consumer-contract.koyori.pages.dev

View logs

Assisted-by: multi-agent-shogun-aki-tweak
cli-test.yml の drift gate 失敗時に ::error と修復コマンドを案内。
CLAUDE.md の API 表面変更手順に CLI 再生成を追記。

Assisted-by: multi-agent-shogun-aki-tweak
Assisted-by: multi-agent-shogun-aki-tweak
@sousuke0422
sousuke0422 force-pushed the ci/openapi-consumer-contract-gate branch from 4060b14 to 67600d7 Compare July 18, 2026 09:44
@yupix
yupix merged commit a7a2509 into main Jul 18, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants