Devin にモノリスを見せる
おなじみのあのファイル――18か月かけて肥大化したひとつの Express ルーターです。あらゆるドメインのエンドポイントが ターゲットとする構成をどのような形にしたいのかを、Devin に正確に伝えてください。
src/routes/index.ts にすべて集約されていて、ユーザー登録の隣に決済の Webhook、その隣に商品検索が並んでいます。インラインの認可・認証チェックは 40 個のハンドラーにコピペされていて、誰も触りたがりません。注文ロジックを変更すると、300 行上にあるユーザー用エンドポイントが壊れるかもしれないからです。ファイルの先頭は、たいていこんな感じになっています。src/routes/index.ts (before — 2,000 lines)
規約でDevinをガイドする
Devin はコードベースを読み込んでパターンを推論しますが、リファクタリングの場面では Knowledge のエントリが最も効果を発揮します。Devin に従わせたい規約について、エントリを追加します:
- ルーターパターン — “各ドメインルーターは
Router()を使用し、アプリケーションのルートでapp.use('/domain', domainRouter)としてマウントする” - ミドルウェア — “認証ミドルウェアは
src/middleware/に配置し、常にインポートして使用し、その場で定義しない” - エラーハンドリング — “すべてのルートハンドラーは
src/lib/asyncHandler.tsのasyncHandlerラッパーを使用し、生の try/catch は使わない”
src/routes/admin.ts のパターンに従ってください。このファイルはすでにきれいに分離されています” のような一文を追加してください。Devin に Knowledge エントリを生成するよう依頼することもできます。規約を説明するだけで、確認して保存できる、よく構造化されたエントリを作成します。Devin の PR をレビューする
Devin はすべてのエンドポイントをマッピングし、インポートグラフをトレースし、共通ロジックを抽出し、ドメインファイルを作成し、ルートルーターを組み替えたうえで、テストスイートを実行します。一般的な PR は次のようになります。分割後のクリーンなルートルーターは次のとおりです。また、共有ミドルウェアを正しくインポートしたドメインルートファイルは次のとおりです:すべてのURLパスは同一のままです —
src/routes/index.ts (after — 15 lines)
src/routes/orders.ts (after — excerpt)
/orders は /orders にマウントされた ordersRouter によって処理されるため、既存のクライアントやテストは変更なしでそのまま動作します。(任意)ブランチをチェックアウトしてローカル環境でテストする
このような構造的なリファクタリングでは、マージ前にブランチをローカルに pull して検証しておく価値があります。Windsurf や使い慣れた IDE で開き、アプリを起動していくつかのエンドポイントを叩き、ルーティング、ミドルウェア、エラー処理が以前と同じように動作することを確認してください。何か気になる点があれば、PR にコメントを残してください — Devin がそれを拾い上げて修正を反映します。
