Why Guren
このページでは、Hono・Next.js・AdonisJS・Laravel と比べたときの Guren の立ち位置と、Guren が今の設計になっている理由を、長所も短所も含めて整理します。
Why Guren
このページでは、Hono・Next.js・AdonisJS・Laravel と比べたときの Guren の立ち位置と、Guren が今の設計になっている理由を、長所も短所も含めて整理します。
要約
- 認証、データベース、フォーム、バックグラウンドジョブ、メールまで備えたフルスタックアプリを、1 つの TypeScript コードベースで、端から端まで型を通して組み立てたいなら Guren が向いています。
- 小さなステートレスの API サービスを作りたく、それ以外に何も要らないなら 素の Hono が向いています。
- マーケティングサイト、EC のストアフロント、React Server Components を軸にしたアプリのように、コンテンツが中心で React のレンダリングが主役のプロダクトなら Next.js が向いています。
Guren はさらに、多くのフレームワークが手を付けてこなかった領域にも力を入れています。AI コーディングエージェントがプロジェクトを理解し、拡張し、検証しやすくすることです。詳しくは次の節で説明します。
AI コーディングエージェントのために
多くのフレームワークは、ドキュメントを読む人間を相手に設計されてきました。Guren はそれに加えて、リポジトリの中で作業するエージェントも相手に設計しており、新しく作ったアプリは最初からその状態になっています。secure by default と同じ考え方で、agent-ready by default を目指しています。違いを生んでいる性質は次の 3 つです。
プロジェクトを安く把握できます。 bunx guren context を実行すると、ルート・モデル・コントローラー・ページをまとめた小さな地図が出力されます(--json を付ければ機械可読の形式になります)。エージェントはディレクトリツリーをたどり歩かなくても、コマンド 1 つでプロジェクトを正確に理解できるので、コンテキストウィンドウは小さく、前提は正確なまま保てます。データモデルについては、bunx guren model:list が同じ役割を持ちます。
規約で迷う余地が減ります。 コントローラーは app/Http/Controllers、モデルは app/Models、ページは resources/js/pages に置き、bunx guren make:feature Post --fields "title:string,body:text" を実行すれば、形のそろった CRUD 一式がスキャフォールドされます。どのコードにも置き場所と形が 1 つずつしかなければ、生成したコードが最初から正しい場所に収まることがずっと多くなります。
間違いはレビューに頼らず機械が見つけます。 エージェントが書いたコードは、互いに独立した 3 つのゲートで検証します。
bunx guren check # ルート ↔ コントローラー ↔ ページの整合性
bunx guren audit # 変更系ルートのバリデーション/認証漏れ、生SQL、シークレット
bun run typecheck # 型付き page props とルート契約のズレはビルドが落ちる
ページの props、ルートパラメータ、リクエストボディはどれも型付きの契約です。そのため、エージェントが存在しない props 名をでっち上げたり、バリデーションスキーマを付け忘れたりすると、diff を 1 行も読まないうちにコンパイルエラーか check の失敗として表に出ます。
こうして、読み込むコンテキストは少なく、間違える余地は小さく、できあがったものは機械で検証される状態になります。この「把握、生成、検証」のループがあるので、Guren でのエージェント駆動開発は、うまくいくことを祈るものではなく、当てにできるものになります。
仕様がコードからずれないようにもしています。 Guren はプロジェクトの知識を、導出できるものは導出し、できないものは宣言し、常に検証する(derived where possible, declared where not, checked always) という 1 つの原則で扱います。ER 図・ドメインモデル・画面一覧はコードから生成し(bunx guren spec:generate)、CI のドリフトゲートで守ります。コードでは表せない意思決定は ADR に残し、frontmatter で対象のモデルにリンクして、変更のたびに検証します。bunx guren context Invoice を実行すると、そのエンティティについてプロジェクトが知っていることが、紐付いたドキュメントも含めてすべて、人間にもエージェントにも渡されます。その時点で、リンクが切れていないことと導出したビューが最新であることは、チェッカーが確かめています。全体の流れはスペックアンカード開発を参照してください。
効果は計測で確かめています。 Agents on Guren は、バグ修正・セキュリティ・機能追加の 20 タスクを、エージェントからは見えない受け入れテストで採点する評価です。3 つのモデルそれぞれについて、scaffold に同梱のハーネスがある場合とない場合を走らせ、合計 360 ランを実行しました。各ランの patch、ログ、判定はすべて公開しています。Sonnet 5 では、ハーネスありが 60 ラン中 60 ラン、なしが 58 ラン合格し、ハーネスありのほうがターン数は 28%、コストは 25% 少なく済みました。Opus 5 はどちらも 60 ラン中 60 ラン合格で、差はターン数 26% 減、コスト 12% 減として出ました。Haiku 4.5 では合格率そのものが 51/60 から 54/60 へ上がりましたが、コストは 6% 増えています。guren check を実際に実行したランは、ハーネスありで 180 ラン中 119 ラン、なしでは 15 ランでした。ハーネスが逆効果になったケースもレポートに載せています。この評価の過程で、@guren/orm の paginate() が eager loading を落とすバグも見つかり、すでに issue を起票しました。
Hono との比較
Guren の HTTP レイヤーは Hono そのものです。すべてのリクエストが Hono のルーターを通るので、性能も Hono と同じ水準を保てます。Guren が足しているのは上に載る薄い MVC レイヤーで、新しいサーバーを作っているわけではありません。
Hono があえて持たないものを、Guren は同梱しています。
| 必要なもの | 素の Hono | Guren |
|---|---|---|
| データベースアクセス | ORM を選んで自分で配線 | Drizzle ベースの Model.where().orderBy().get() が最初から使える |
| バリデーション | ハンドラーごとにスキーマライブラリを呼ぶ | this.validateBody(schema) で 422 レスポンスまで返せる |
| 認証 | セッション・ハッシュ・ミドルウェアを自分で組み立てる | bunx guren add auth でフロー一式をスキャフォールド |
| フロントエンド | 別に作った SPA と手書きの API レイヤー | Inertia 経由の React ページに型付き props |
| ジョブ・メール・イベント・キャッシュ | ライブラリを選んで組み込む | 組み込みのサブシステム(プロバイダーでオプトイン) |
| テスト | ハーネスを自作 | fluent なアサーションを備えた TestApp |
JSON のエンドポイントが数個あれば済むサービスなら、素の Hono は優れた選択です。Guren の中身も Hono なので、Hono で始めたものを Guren に移すときも、書き直しではなく自然に育てていく形になります。差が出てくるのはアプリが大きくなってからです。上の表の各行は、Guren を使わなければ自分で書き、テストし、保守し続けることになるグルーコードです。
Next.js との比較
Next.js と Guren は、そもそも答えようとしている問いが違います。Next.js は React ファーストで、中核の抽象はレンダリング戦略(RSC、ストリーミング、ISR)にあり、バックエンドはフロントエンドから育っていきます。一方の Guren はサーバーファーストで、Laravel の系譜に連なる MVC アプリケーションです。React は Inertia を通じて届けるビューレイヤーという位置付けです。
この違いは、機能の作り方に表れます。
- 考え方のモデルは 1 つで済みます。 機能はルート・コントローラー・モデル・ページでできています。クライアントコンポーネントとサーバーコンポーネントの境界を考える必要も、
'use client'を付けるかどうか迷う必要もなく、データと React の props の間に API ルートの層を挟むこともありません。 - データの受け渡しを手で書かずに済みます。 コントローラーは型付きの props をそのままページコンポーネントへ渡します。データベースのカラム名を変えれば、モデルから React のページまで TypeScript のエラーが順に出て、直す場所を教えてくれます。
- バックエンドの機能がフレームワークに入っています。 キュー、スケジュールジョブ、メール、ブロードキャスト、ポリシーはフレームワークのサブシステムとして用意されており、レンダリングフレームワークの周りにサードパーティのサービスを寄せ集める必要はありません。
コンテンツの多いサイト、コンポーネント単位の細かいストリーミング、RSC のエコシステムに深く乗っているチームのように、サーバーでレンダリングした React そのものがプロダクトである場合は、引き続き Next.js が向いています。
AdonisJS との比較
AdonisJS は、TypeScript の世界にあるもう 1 つのバッテリー同梱型 MVC フレームワークで、優れた選択肢です。Laravel のアーキテクチャを Node.js で使いたいなら、まず候補に挙がります。Guren は、次の 2 点で AdonisJS と違う方向に賭けています。
- Node ではなく Bun で動きます。 同じ仕様のアプリ同士で測ったベンチマーク(フレームワーク比較リポジトリにある Inertia SSR の実装 2 つ)では、Guren のスループットは SSR のページで 2.3 倍、JSON の経路で 3.5 倍、コールドスタートは 1.8 倍高速でした(計測方法とワンクリックでの追試手順はこちら)。アプリのコードは同じなので、この差はランタイムの差です。アーキテクチャはそのままで、エンジンだけが替わるという点がポイントです。Bun を選んでもデプロイ先は縛られません。AWS Lambda・Vercel・Cloudflare Workers 向けの公式プラグインがあり、guren.dev 自体も Workers 上で動く Guren アプリです。
- 部品は独自に作らず、TypeScript エコシステムの定番を使います。 AdonisJS は独自の ORM(Lucid)やバリデータ(VineJS)を持っています。Guren はエコシステムですでに標準になっている部品(Drizzle、Zod、Vite、Inertia)を組み合わせ、その上に規約を載せています。同じ仕様のアプリを実装したところ、保守対象のコードは Guren が 991 行 / 38 ファイル、AdonisJS が 2,438 行 / 68 ファイルで、直接の依存は 17 対 43 でした。
手で打つ量はほぼ同じです(どちらもスキャフォールドがよくできていて、手書きしたのは約 570 行と 600 行)。どちらを選ぶかは、ランタイムと、どのデータ層を使いたいかで決まります。
Laravel・Rails との比較
Laravel や Rails を使ったことがあれば、Guren にはすぐ慣れるはずです。コントローラー、モデル、ミドルウェア、ポリシー、リソース、ジョブ、make:* ジェネレーターは、どれも想像どおりに動きます。違うのは言語の境目で、Guren ではその境目がなくなります。
- 端から端まで 1 つの言語で書けます。 バックエンドとフロントエンドの間で PHP と JavaScript を行き来することはありません。バリデーションスキーマも、モデルも、ページの props も、すべて TypeScript です。
- 型がサーバーとブラウザの境目を越えます。 Laravel と同じような開発体験に、静的な保証が加わります。コントローラーが送る props と React のページが宣言する props が一致しているかは、コンパイラが検査します。
- ランタイムがモダンです。 Bun は TypeScript をそのまま実行するので、開発時のトランスパイルが要らず、起動も速く、テストランナーも組み込まれています。
Guren を選ぶべきでないとき
どんな場面でも正解になるフレームワークはありません。次のような場合は、別の選択肢を検討してください。
- プロダクトがレンダリング中心の場合。 コンポーネント単位のストリーミング SSR、きめ細かいキャッシュ、RSC のエコシステムは Next.js が得意とする領域です。
- とにかく小さなサービスが欲しい場合。 Webhook のレシーバーやエッジファンクションに MVC は要らず、素の Hono のほうが軽く済みます。
- チームが Bun で開発できない場合。 Guren は Bun ファーストで設計しており、開発サーバー・テストランナー・CLI は Bun を前提にしています。デプロイ先は選べて、AWS Lambda・Vercel・Cloudflare Workers 向けの公式プラグインもありますが、開発マシンで Bun を使えないなら、別のフレームワークのほうが合っています。
次のステップ
- クイックスタート: 5 分ほどでプロジェクトを作って起動します。
- First Steps: 1 つのリクエストがすべてのレイヤーを通る流れを 10 分で追います。
- アーキテクチャ: ルーティング、コントローラー、モデル、Inertia がどう組み合わさるか。
- CLI リファレンス: エージェントが使う検査コマンドを含む、全コマンドの一覧。