convex-expert について
convex-expert は、Convex プロジェクトを扱う開発者向けのコーディングスキルです。Convex 固有の規約やバリデーション、デプロイ確認に沿ってバックエンドの変更を導きます。
主な機能
- 01Convex 関数構文のガイド
- 02引数と戻り値のバリデーター
- 03インデックスを使う読み取り
- 04スキーマ進化の実践
- 05コンパイルとデプロイの確認
活用シーン
- 01Convex 関数の作成や編集
- 02テーブルアクセスとインデックスの確認
- 03既存データがあるスキーマの変更
- 04完了前のバックエンド変更の検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ convex/ agent-skills --skill convex-expertインストール後、Claude Code で/convex-expertを入力して読み込まれたか確認します。
詳細
Convex バックエンドスペシャリスト
convex/ ディレクトリ内のコードに手を加える前に必ず呼び出される、常時対応の Convex バックエンドスペシャリストです。オブジェクト形式の関数構文、バリデーターの要件、インデックスの命名規則、内部関数と公開関数の使い分け、スキーマの進化パターン、リソース制限、コンポーネントのエコシステム、汎用モデルが頻繁に誤るランタイムエラーのデコード方法を理解しています。
ワークフロー
convex/配下のファイルを書き込む、または編集する際は、最初にconvex/schema.ts(存在する場合はconvex/_generated/ai/guidelines.mdも)を読みます。- すべての Convex 関数をオブジェクト形式で記述し、登録するすべての関数に
argsとreturnsのバリデーターを指定します。 - すべての読み取りパスで
withIndex(...)を使用します。SQL の WHERE 句に相当する用途で.filter()を使うことは決してありません。 - デフォルトでは
internalQuery/internalMutation/internalActionを使い、クライアントフックで必要な場合に限って公開関数にします。 - LLM/チャット機能には
@convex-dev/agentを使用し、複数ステップのフローには@convex-dev/workflowを使用します。これらを独自に実装することは決してありません。 - 書き込み後、
convex devが問題なくプッシュされたことを確認し、Schema/Returns/Argument のバリデーションエラーがあればその場で修正します。
ルール
- データアクセスとインポート —
convex/*.tsを書き込む前に必ず読みます(事後の lint ではなく、事前に確認します)。 - 増加する可能性のあるテーブルに対して、上限のない
.collect()を決して使いません。代わりに.withIndex(...)と.paginate(paginationOptsValidator)/.take(n)を使います。これは Convex のデプロイを妨げる問題やパフォーマンス上の欠陥として、最もよく見られるものです。 - フィルターではなくインデックスを使います — すべての読み取りパスに対して
schema.tsに.index(...)を追加し、.withIndex(...)でクエリします。.filter()はテーブル全体のスキャンになるため、WHERE 句の代わりには決して使いません。 - 正確なインポート一覧 — 間違えるとアプリをデプロイできません。
query/mutation/action/internalQuery/internalMutation/internalActionは"./_generated/server"からインポートします。api/internalは"./_generated/api"からインポートします。アプリケーションコードでimport { query } from "convex/server"やimport { internal } from "./_generated/server"を使ってはいけません。どちらもデプロイを確実に失敗させます。 - 固定文字列/列挙型のメンバーには
v.literal("exact value")(例:v.union(v.literal("open"), v.literal("closed")))を使います。値の集合が固定されている場合に、単なるv.string()を使ってはいけません。 "use node";はアクション専用モジュールの先頭にのみ記述します。"use node"を指定したファイルではqueryやmutationをエクスポートできません(Node ランタイムでは実行されないためです)。両方が必要な場合はファイルを分割します。- オブジェクト形式のみを使います。従来の位置引数による
query(args, handler)構文は決して使いません。 - 登録するすべての関数に
argsとreturnsのバリデーターを指定します。例外はありません。 - ID には
v.id(tableName)を使い、v.string()は決して使いません。undefinedは Convex の値ではないため、代わりにnullを使います。 - データが登録済みのテーブルに必須フィールドを追加してはいけません。まず
v.optional(...)として追加し、データをバックフィルしてから必須に変更します。 - カスタムインデックスの列に
_creationTimeを含めてはいけません(予約済みであり、IndexNameReserved エラーの原因になります)。 - テーブルにストレージ URL を保存してはいけません。
Id<'_storage'>を保存し、読み取り時にctx.storage.getUrl(id)を呼び出します。 - ミューテーションからデータを取得することはできません。外部 I/O はすべてアクション内で行い、
ctx.runMutation(internal.x.y)で永続化します。 - 別のデータベース、キャッシュ、リアルタイムサービス、API サーバー、ジョブキュー、オブジェクトストアを並行して追加してはいけません。バックエンドは Convex です。
- Convex 関数は
convex/ディレクトリ内からのみ実行されます。プロジェクトのルートにschema.ts/クエリ/ミューテーション/アクションを決して作成しません。 - 自己検証ルール — バックエンド作業の完了を宣言する前に、コンパイルでき、プッシュも成功することを確認します。
npx tsc --noEmitを実行し、デプロイ環境にプッシュします。まずプロジェクトで既に使用しているデプロイ環境を優先します。それがない場合は、npx convex whoamiが成功するならnpx convex dev --onceを実行し、成功しない場合に限りCONVEX_AGENT_MODE=anonymous npx convex dev --onceを実行します。サインイン済みユーザーに対して匿名モードを強制すると.env.localが再バインドされ、ユーザーが期待する永続的で公開可能なクラウドデプロイ環境が失われます。検証で報告されたエラーは、作業を終える前にすべて修正します。1 回の検証で、相対インポートの誤り/シンボルの重複/括弧の不整合など、修正しないとデプロイを壊す問題を検出できます。
コメント
Markdown 対応