prisma-client-api (prisma/skills)
Prisma Client のクエリ、フィルター、演算子、メソッドを、CRUD・リレーション・トランザクション別に参照できます。
prisma-client-api:有意な効果はありません。全 18 実行がすべてのチェックに合格し(対照群 5.0、一文プロンプト 5.0、スキルあり 5.0)、モデルはすでに慣用的な Prisma を書いています。
Codex CLI · gpt-6-astra
24.0 / 30
スキルなしに対するリフト:+0.00 · 状況次第 · 18 実行
状況次第:リフト +0.00 が +1.0 未満。推奨には合計 22/30、出力品質 3.5、リフト +1.0 が必要です。
SOTA
合格Codex でテスト済み。
カバー対象 Codex, Claude Code
Codex CLI 0.166(SOTA ティア):採点対象 18 実行。当ティアのルールでは、ここでの合格は Claude Code もカバーします。第2ティアについては何も述べません。
スコア
各ディメンションは 0〜5 点で、6 つの合計が 30 点満点の合計スコアになります。すべてのディメンションで 5 が最良です。コスト 5 は低コストで高速、インストール 5 は簡単であることを意味します。
- トリガーの信頼性
- 5.0
- スキルなしに対するリフト
- 2.0
- 出力品質
- 5.0
- トークンと時間のコスト
- 5.0
- インストールと移植性
- 3.0
- 安全性
- 4.0
セキュリティレビュー
安全静的スキャン:CRITICAL 9 / HIGH 9 / MEDIUM 0。手動レビュー:ネットワーク無効のサンドボックスで実行しても安全(スキャナの指摘は確認済み)。クリーンなスキャン結果はスキルの安全性を証明しません。
インストール
npx skills@latest add prisma/skills --skill prisma-client-api
固定コミット: 8ea289b730c2e89f7ff1f518af128b113d842a92
テスト済み: 2026-11-02
テスト内容
- 説明から型付きクエリを書く — Prisma Client を使って src/queries.ts を書いてください。含める関数: getUserWithPosts(id) はユーザーとその公開済み投稿のみを新しい順に最大 10 件返す; searchPosts(term, cursor?) はカーソルページネーション(ページサイズ 20)の大文字小文字を区別しないタイトル検索; upsertUser(…
- N+1 クエリの解消 — src/report.ts は大きなテーブルで遅くなっています。src/report.ts のパフォーマンス問題を修正し、返される形式は変えないでください。
- Prisma コードの誤りレビュー — src/search.ts と src/report.ts を Prisma の誤りやリスクがないかレビューしてください。問題を重大なものから順に列挙してください。ファイルは変更しないでください。
長所
- スキルは名前を出さずとも採用されました:スキルあり群 6/6 実行でスキルファイルが読み込まれました。
- トークンのオーバーヘッドなし:スキルなしの 1.05 倍。
- スキルありの絶対品質は高水準:5 点中 5.0。
短所
- スキルなしに対する有意なリフトなし(+0.00、ノイズの範囲内)。
- 一文プロンプトは 5.0、スキルありは 5.0(+0.00)。
- 対照群はすでに 5.0 点:天井効果のため、テストでリフトを示せません。
- タスク・群ごとに n=2。1 ポイント未満の差はノイズです。
レビュー
専用の Windows テスト PC 上で Codex CLI 0.166(gpt-6-astra、低推論)、実行ごとに新規の一時プロジェクトと一時 HOME/TMPDIR/キャッシュを使用、スキルをインストール(スキルあり群)、スキルなし(対照群)、またはスキルの中核要件をプロンプト末尾に付けた一文に圧縮(一文プロンプト群)、タスクごとに各群 2 実行、ネットワーク無効、/tmp への書き込みはブロック。プロンプトはスキル名に一切言及しません(以下で注記する表現を除く)。小さな Prisma プロジェクト(スキーマ、シード、src ファイル)。タスクは、5つの型付きクエリ関数を src/queries.ts に書く(ユーザーと直近 10 件の公開済み投稿、カーソルページネーションの大文字小文字を区別しない検索、upsert、投稿のアトミックな移動、groupBy による件数)、src/report.ts の N+1 を出力形式を保ったまま修正する、2つのファイルを Prisma の誤りがないかレビューする(文字列補間で組み立てた生クエリなど)。プロンプトは Prisma の機能名に言及しません。一文プロンプトは慣用的な機能を一文で列挙します。
3群の比較
| 群 | 平均スコア(0〜5) | 1実行あたりのトークン |
|---|---|---|
| スキルなし | 5.0 | 92k |
| 一文プロンプト | 5.0 | 88k |
| スキルあり | 5.0 | 97k |
Codex CLI で 18 実行を計測し、LLM 判定なしのルールベースのチェックで採点。合計 24.0 / 30、判定は 状況次第。
判定:状況次第(24.0 / 30)。 出典:prisma/skills、prisma-client-api、コミット 8ea289b に固定。インストール:npx skills@latest add prisma/skills --skill prisma-client-api。ライセンス: Apache-2.0(リポジトリの LICENSE)。
概要
prisma-client-api スキル(prisma/skills):Prisma Client のクエリ API(findUnique/findMany、select/include、フィルタ、カーソルページネーション、upsert、トランザクション、groupBy、生クエリ)のリファレンスに、ドキュメント風のガイダンスを加え、SKILL.md とルールファイルとして提供されます。
テスト方法
専用の Windows テスト PC 上で Codex CLI 0.166(gpt-6-astra、低推論)、実行ごとに新規の一時プロジェクトと一時 HOME/TMPDIR/キャッシュを使用、スキルをインストール(スキルあり群)、スキルなし(対照群)、またはスキルの中核要件をプロンプト末尾に付けた一文に圧縮(一文プロンプト群)、タスクごとに各群 2 実行、ネットワーク無効、/tmp への書き込みはブロック。プロンプトはスキル名に一切言及しません(以下で注記する表現を除く)。
小さな Prisma プロジェクト(スキーマ、シード、src ファイル)。タスク:5 つの型付きクエリ関数(直近 10 件の公開済み投稿を含むユーザー、カーソルページネーションの大文字小文字を区別しない検索、upsert、投稿のアトミックな移動、groupBy による集計)を src/queries.ts に書く、src/report.ts の N+1 を出力の形を保ったまま修正する、2 つのファイルを Prisma の誤り(文字列補間で構築された生クエリなど)についてレビューする。プロンプトは Prisma の機能名を出しません。一文プロンプトは慣用的な機能を 1 文で列挙します。
- 説明からの型付きクエリの作成 — Prisma Client を使って src/queries.ts に以下の関数を書いてください:getUserWithPosts(id) はユーザーとその公開済み投稿のみを新しい順に最大 10 件返す。searchPosts(term, cursor?) はカーソルページネーション(ページサイズ 20)の大文字小文字を区別しないタイトル検索。upsertUser(…
- N+1 クエリの除去 — src/report.ts は大きなテーブルで遅いです。src/report.ts の性能問題を修正し、返す形は同じに保ってください。
- Prisma コードの誤りのレビュー — src/search.ts と src/report.ts を Prisma の誤りとリスクのあるものについてレビューしてください。問題を最も重大なものから順に挙げてください。ファイルは変更しないでください。
採点はプログラム的(隠しテスト/仕込み問題の検出/制約チェック/該当する場合はレンダリング+OCR)で、実行ごとに 0〜5 点。スコアはどの LLM 判定者も決めていません。
結果
第 3 群に与えた一文プロンプト:「Prisma Client を慣用的に使う:一意フィールドでは findUnique、N+1 と過剰取得を避けるため include/select、mode: 'insensitive' のフィルタ、take によるカーソルページネーション、挿入または更新には upsert、アトミックな変更には $transaction または updateMany、集計には groupBy、そして補間された入力で $queryRawUnsafe を決して使わない。」
| タスク | 対照群スコア | 一文プロンプト | スキルあり | 対照群のトークン | 一文プロンプトのトークン | スキルありのトークン | スキル読み込み |
|---|---|---|---|---|---|---|---|
| t1-queries | 5.0 | 5.0 | 5.0 | 83k | 83k | 105k | 2/2 |
| t2-n-plus-1 | 5.0 | 5.0 | 5.0 | 103k | 103k | 100k | 2/2 |
| t3-review | 5.0 | 5.0 | 5.0 | 89k | 75k | 84k | 2/2 |
平均スコア:スキルなし 5.0 に対しスキルあり 5.0(差 +0.0)。1実行あたりのトークン:92k 対 97k(1.05x)。時間:44s 対 40s。一文プロンプト群:5.0(一文プロンプトに対するスキルの上積み:+0.0。一文プロンプト自身のスキルなしに対する上積み:+0.0)。一文プロンプトのトークンは 1実行あたり 88k なので、スキルは一文プロンプトの 1.10 倍のコストになります。
何が起きたか
- 全群の全実行が全チェックに合格しました:対照群 5.00、一文プロンプト 5.00、スキル 5.00(各 n=6)。生成されたクエリは findUnique、
mode: 'insensitive'、cursor + take、upsert、$transaction/updateMany、groupBy を使い、N+1 は include/select またはバッチ処理で修正され、レビューはすべての実行で危険な生の補間を見つけました。 - スキルは 6/6 実行で読み込まれ、1実行あたり 97k トークン。対照群 92k、一文プロンプト 88k(1.05x):小さなオーバーヘッドで、得られるものはありません。
- スキルあり群の実行はスキルのルールファイルをプロジェクトにコピーします(平均 1実行あたり 9.7 ファイル)。
- チェックセットには天井効果があります:全実行が満点のため、スキルが害を及ぼさなかったと言えるだけで、決して役立たないとは言えません。恩恵を見つけるには、より難しいタスク(Prisma 7 のドライバーアダプタや、モデルが知らないかもしれない新しい機能)が必要です。
評価項目スコア
| 評価項目 | スコア | 理由 |
|---|---|---|
| 1_output_quality | 5.0 | スキルありの平均スコアは 5 点中 5.00(プログラム的チェック。タスク別の表を参照)。 |
| 2_lift_vs_no_skill | 2.0 | スキルなしの 5.00 に対し +0.00 点(タスクごとに n=2。約 1 点未満の差はノイズ)。 |
| 3_trigger | 5.0 | スキルあり群 6/6 実行でスキルファイルが読み込まれました。 |
| 4_instructions_portability | 3 | SKILL.md と約 10 個のルールファイル。ドキュメントのみ。 |
| 5_efficiency | 5 | トークン 1.05x(1実行あたり 97k 対 92k)、時間 0.92x(40s 対 44s)。 |
| 6_safety_hygiene | 4 | スキャナは CRITICAL 9 を報告。すべて文書内での
|
このテストの限界
- コードテキストに対するルールベースのチェック。Prisma クライアントは生成されず、クエリも実行されていません(オフライン、データベースなし)。
- 全群が天井に達しています:タスクは、ベースモデルがすでに知っている基本的な慣用的 Prisma を測っています。
- セルごとに n=2。新しい API の知識(ドキュメント系スキルが最も追加しそうな部分)は検証していません。
- タスクごとに各群 n=2。約 1 点未満の差はノイズです。
- ルールベースの採点はチェックが見られるものだけを測ります。好みや、結果が可能な限り最善かどうかは判断できません。
セキュリティ
security.md を参照。スキャン:CRITICAL 9 / HIGH 9 / MEDIUM 0。判定:実行しても安全(ネットワーク無効のサンドボックス)。クリーンなスキャン結果はスキルの安全性を証明しません。
結論
日常的な Prisma Client の作業では、素の Codex がすでに正しいため、このスキルは目に見える変化なしに小さなトークンコストを加えるだけです。このテストが扱わなかったごく新しい Prisma 機能では意味を持つかもしれません。
トランスクリプト
実行ログ:prisma-client-api (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.) 列:タスク、群-回、スコア(0-5)、トークン、秒、合格したチェック、エージェントが開いたスキルファイル。 t1-queries control-1: スコア 5.0, トークン 84040, 秒 35.0, チェック 7/7, 開いたファイルなし t1-queries control-2: スコア 5.0, トークン 83803, 秒 36.4, チェック 7/7, 開いたファイルなし t1-queries oneliner-1: スコア 5.0, トークン 83731, 秒 38.4, チェック 7/7, 開いたファイルなし t1-queries oneliner-2: スコア 5.0, トークン 83779, 秒 38.1, チェック 7/7, 開いたファイルなし t1-queries treatment-1: スコア 5.0, トークン 110031, 秒 39.9, チェック 7/7, 開いたファイル prisma-client-api t1-queries treatment-2: スコア 5.0, トークン 100691, 秒 36.8, チェック 7/7, 開いたファイル prisma-client-api t2-n-plus-1 control-1: スコア 5.0, トークン 103258, 秒 57.7, チェック 3/3, 開いたファイルなし t2-n-plus-1 control-2: スコア 5.0, トークン 103374, 秒 54.2, チェック 3/3, 開いたファイルなし t2-n-plus-1 oneliner-1: スコア 5.0, トークン 103307, 秒 51.8, チェック 3/3, 開いたファイルなし
18 実行、3 成果物
サンプル出力
SOTA · With the skill: src/queries.ts (t1-queries, run 1, Codex)
import { prisma } from "./db"; export function getUserWithPosts(id: number) { return prisma.user.findUnique({ where: { id }, include: { posts: { where: { published: true }, orderBy: [{ createdAt: "desc" }, { id: "desc" }], take: 10, }, }, }); } // Pass the last post's id as the cursor for the next page. export function searchPosts(term: string, cursor?: number) { return prisma.post.findMany({ where: { title: { contains: term, mode: "insensitive" } }, orderBy: { id: "asc" }, take: 20, ...(cursor !== undefined ? { cursor: { id: cursor }, skip: 1 } : {}), }); } export function upsertUser(email: string, name: string | null) { return prisma.user.upsert({ where: { email }, update: { name }, create: { email, name }, }); } // Returns { count } with the number of posts transferred. export function transferPosts(fromId: number, toId: number) { return prisma.$transaction(async (tx) => { await tx.user.findUniqueOrThrow({ where: { id: fromId } }); await tx.user.findUniqueOrThrow({ where: { id: toId } }); return tx.post.updateMany({ where: { authorId: fromId }, data: { authorId: toId }, }); }); } // Includes authors with posts; each row has { authorId, _count: { _all } }. export function postCountsByAuthor() { return prisma.post.groupBy({ by: ["authorId"], _count: { _all: true }, orderBy: { authorId: "asc" }, }); }