trpc について
tRPC v11のコードを書く、またはレビューするエージェント向けのスキルです。React連携、移行、ルーター、転送、SSR、サブスクリプションに関するバージョン固有の判断と注意点をまとめています。
主な機能
- 01tRPC v11 APIの指針
- 02v10からv11への移行情報
- 03ルーターとプロシージャのパターン
- 04エラーと検証の指針
- 05転送とバッチ処理の注意点
- 06SSRとサブスクリプションのパターン
活用シーン
- 01tRPC v11コードのレビュー
- 02tRPC v10からの移行
- 03アップロードやサブスクリプションの追加
- 04プリフェッチやバッチ処理の問題調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill trpcインストール後、Claude Code で/trpcを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdclient-derive-query-keys.mdclient-invalidate-with-query-filters.mdclient-subscription-options.mdclient-tanstack-integration.mderr-format-standard-schema-issues.mderr-nullish-cursor.mderr-output-strips-fields.mderr-set-isdev-explicitly.mdlink-cap-batch-size.mdlink-default-to-httpbatchlink.mdlink-endpoint-matches-mount-path.mdlink-gate-cache-headers.mdlink-read-batch-headers-from-oplist.mdlink-route-subscriptions-separately.mdlink-scope-body-parsers.mdlink-transformer-on-terminating-links.mdmig-await-get-raw-input.mdmig-formdata-is-native.mdmig-renamed-type-exports.mdmig-typescript-version-floor.mdproc-concat-over-standalone-middleware.mdproc-input-before-use.mdproc-merge-only-object-inputs.mdproc-narrow-ctx-in-middleware.mdproc-single-trpc-instance.mdrsc-dehydrate-pending-queries.md詳細
tRPC v11
エージェントがコードの作成やレビュー時に適用できるよう、tRPC が求める判断事項とその解決方法をまとめています。すべてのルールで、修正対象となる誤ったデフォルトを明示しています。モデルがすでに正しく判断できる事項についてのルールはありません。
tRPC v11 に固定されており、11.18.0(2026-06-17)に対して検証済みです。 v12 はありません。ただし、ここで取り上げるいくつかの API には @deprecated … will be removed in v12 と記載されており、現在も提供されています。ピア依存関係:typescript >=5.7.2、@tanstack/react-query ^5.80.3、react >=18.2.0。
適用する場面
次の場合にこのスキルを使用します。
- コードで
initTRPC、createTRPCContext、createTRPCOptionsProxy、createTRPCReact、createTRPCClient、httpBatchLink、httpSubscriptionLink、splitLink、fetchRequestHandler、createCallerFactory、TRPCErrorをインポートしている場合、または.input()/.output()/.use()/.query()/.mutation()/.subscription()でプロシージャを定義している場合 - ユーザーが「すべての型が
anyになる」「無効化が機能しない」「contextMap[utilName] is not a function」「transformer プロパティの場所が変わった」「ダッシュボードで 414 / 413 が発生する」「サブスクリプションに接続できない」「プリフェッチがハイドレーションされない」「すべてのプロシージャが 404 になる」と言った場合 - コードベースを tRPC v10 から移行する場合、または v10 時代の例に基づいて書かれた tRPC コードをレビューする場合。推奨される React クライアントが変更されており、古いコードがそのままコンパイルできることも多いため、特に効果的な適用タイミングです
- 既存のルーターに初めてサブスクリプション、ファイルアップロード、または RSC プリフェッチを追加する場合。それぞれで、v11 が v10 の方式を全面的に置き換えた領域に入るためです
- アプリの成長に合わせてバッチ処理クライアントをレビューする場合。上限のないデフォルト設定が、本番環境で断続的な障害につながるためです
このスキルの対象外:
- TanStack Query の一般的なセマンティクス:キャッシュの有効期間、再試行、
useMutationの使い勝手(→tanstack-query) - バリデーターとして使用する Zod スキーマの作成や移行(→
zod) - tRPC ハンドラーの範囲を超えた Next.js App Router のルーティング、ストリーミング、キャッシュ(→
nextjs) - TypeScript の一般的な型の絞り込みやジェネリクス(→
typescript)
ルールのカテゴリ
| # | カテゴリ | 接頭辞 | 対象 |
|---|---|---|---|
| 1 | React クライアントのインターフェース | client- | 使用する統合、オプションファクトリー、クエリーキー、無効化、サブスクライブ |
| 2 | v10 → v11 の差分 | mig- | 名前変更、削除、遅延生成される API、ピア依存関係の最低バージョン |
| 3 | ルーターとプロシージャの構築 | proc- | インスタンスの同一性、ビルダーの順序、コンテキストの型の絞り込み、入力のマージ |
| 4 | エラーと検証のセマンティクス | err- | 表面化する内容、漏えいする内容、使用するエラークラス |
| 5 | リンク、トランスポート、シリアライズ | link- | リンクチェーン、バッチ処理の上限、トランスフォーマー、アダプター、キャッシュ |
| 6 | SSR、RSC、サーバーサイド呼び出し | rsc- | プリフェッチとハイドレーション、QueryClient のライフタイム、caller の誤用 |
| 7 | サブスクリプションとストリーミング | sub- | SSE を介した非同期ジェネレーター、認証、キープアライブ、バックログの競合 |
クイックリファレンス
1. React クライアントのインターフェース
client-tanstack-integration— React のデータ取得には@trpc/tanstack-react-queryを使用します。createTRPCReactは現在、従来型の方法ですclient-invalidate-with-query-filters— 新しいプロキシにはuseUtils()がありません。queryClientとpathFilter()/queryFilter()を使って無効化しますclient-derive-query-keys— 新しいプロキシにはgetQueryKey()がありません。キーはqueryKey()/pathKey()/infiniteQueryKey()として取得しますclient-subscription-options— 新しいプロキシには.useSubscription()がありません。@trpc/tanstack-react-queryのuseSubscriptionにsubscriptionOptions()を渡します
2. v10 → v11 の変更点
mig-formdata-is-native— 6つのexperimental_*アップロード API がすべて削除され、FormData はsplitLinkの背後でネイティブ入力として扱われますmig-renamed-type-exports—AnyRouter→AnyTRPCRouterなどに変更されました。inferRouterInputs/Outputsは変更されていませんmig-await-get-raw-input—rawInputはundefinedです。入力は遅延評価されるため、await getRawInput()を使用しますmig-typescript-version-floor— TS>=5.7.2が必要です。また、異なる TS バージョンを使うエディターでは、すべてが暗黙にanyとして型付けされます
3. ルーターとプロシージャの構築
proc-narrow-ctx-in-middleware— 引数なしのnext()ではctx.userが nullable のままになるため、!でガードの型が取り除かれますproc-input-before-use—.input()より前に.use()を指定すると、未検証の入力に対してミドルウェアが実行されますproc-single-trpc-instance— アプリごとにinitTRPC.create()は1つだけにします。インスタンスが一致しないと、実行時にmergeRoutersがエラーをスローしますproc-merge-only-object-inputs— マージされるのはオブジェクトスキーマだけです。それ以外は、前のパーサーをエラーなく置き換えますproc-concat-over-standalone-middleware—experimental_standaloneMiddlewareは非推奨で、.input()を宣言できません。.concat()を使用します
4. エラーと検証のセマンティクス
err-format-standard-schema-issues— パーサーのディスパッチは順序付きのため、Zod 専用のerrorFormatterは Valibot/Effect(StandardSchemaV1Error)および ArkType(ArkErrors)に対してnullを返しますerr-output-strips-fields—.output()が返すのはパース済みの値なので、不明なキーは取り除かれます。失敗時のステータスは4xxではなく500ですerr-nullish-cursor—.optional()のカーソルは invalidate の後にのみ400を返します。.nullish()を使用しますerr-set-isdev-explicitly—isDevを明示的に指定しないと、エッジランタイムではerror.data.stackがすべてのクライアントに送信されます
5. リンク、トランスポート、シリアライズ
link-transformer-on-terminating-links— トランスフォーマーはリンク内に移動しました。ブランド型のエラーを解消するために削除すると、実行時にDateが正しく動作しなくなりますlink-route-subscriptions-separately—httpBatchLinkはサブスクリプション操作を明示的に拒否しますlink-cap-batch-size—maxItemsとmaxURLLengthのデフォルトはInfinityです。サーバーのmaxBatchSizeと併用しますlink-gate-cache-headers— バッチ処理と一律のresponseMetaキャッシュを併用すると、CDN があるユーザーのデータを別のユーザーに配信する可能性がありますlink-default-to-httpbatchlink—httpBatchStreamLinkはストリーミング開始後にレスポンスヘッダーを設定できないため、デフォルトではありませんlink-read-batch-headers-from-oplist— バッチリンクが渡すのは{ opList }であり、{ op }ではありません。誤った分割代入をすると、すべてのリクエストが401になりますlink-scope-body-parsers— グローバルなexpress.json()は、tRPC が読み取る前にストリームを消費しますlink-endpoint-matches-mount-path—endpointは tRPC が取り除くプレフィックスです。一致しないと、すべてのプロシージャが404になります
6. SSR、RSC、サーバーサイド呼び出し
rsc-query-client-per-request— モジュールスコープのQueryClientを使うと、あるユーザーのキャッシュが次のリクエストに引き継がれますrsc-dehydrate-pending-queries— pending のオーバーライドがないと、void prefetchQueryの結果がクライアントに届きませんrsc-prefetch-through-options-proxy— 呼び出し元の結果がキャッシュに入らないため、クライアントがすべて再取得しますrsc-share-logic-not-callers— ネストされた呼び出し元がコンテキストを再作成し、ミドルウェアチェーン全体を再実行します
7. サブスクリプションとストリーミング
sub-write-async-generators—observable()は非推奨で削除予定です。また、tracked()による再接続と再開に対応するのはジェネレーターだけですsub-keep-credentials-out-of-urls—connectionParamsはトークンをクエリ文字列にシリアライズするため、その情報を含むすべてのログにも記録されますsub-enable-sse-keepalive—ping.enabledはデフォルトでfalseのため、アイドル状態の SSE ストリームはプロキシによって破棄され、不安定なネットワークとして扱われますsub-attach-listener-before-backlog— リスナーをアタッチする前に履歴を取得すると、本番環境の負荷がある場合に限ってイベントが失われます
使い方
該当する判断が必要になったら、リファレンスファイルを読んでください。各ルールでは、修正対象となる誤ったデフォルトを示し、標準的な方法を説明します。誤った方法が実際の落とし穴になる場合にのみ、誤りと正解を対比しています。
先に確認しておくと役立つショートカットが2つあります。
-
既存の tRPC コードをレビューまたは移行していますか?
client-とmig-から始めてください。古いコードはコンパイルが通ることも多いため、これらの問題に気づく手がかりがありません。他のすべてが引き継ぐのは、まさにこれらのルールです。 -
すでに動作しているものの堅牢性を高めたいですか? セキュリティに関わるルールは、
link-gate-cache-headers、rsc-query-client-per-request、err-set-isdev-explicitly、proc-input-before-use、sub-keep-credentials-out-of-urlsです。 -
セクションの定義 — カテゴリ構成と順序の根拠
-
ルールのテンプレート — 新しいルールを追加するためのテンプレート
-
AGENTS.md — すべてのルールを含む自動生成の目次
関連スキル
tanstack-query— tRPC の React クライアントが現在委譲しているクエリレイヤーです。このスキルが前提とするキャッシュのセマンティクスを担いますzod— バリデーターの作成と Zod 4 への移行差分を扱います。このスキルでは変更先を示すだけの.flatten()からz.treeifyError()への変更も含みますtypescript— tRPC の型推論の範囲を超える、一般的な型レベルの作業