graphql について
graphqlは、Crowdin GraphQLクエリの作成やエラー修正を支援するスキルです。実際のスキーマで利用できるフィールドと引数を重視し、ページネーション、フィルタリング、リクエスト規模の調整方法を案内します。
主な機能
- 01Crowdinスキーマに沿ったクエリ構築
- 02コネクションのページネーション引数確認
- 03カーソルページネーションの例
- 04フィルタリング・ソート・規模の指針
- 05未対応引数の修正
活用シーン
- 01Crowdinのプロジェクト、文字列、翻訳の照会
- 02コネクションクエリへのカーソルページネーション追加
- 03スキーマ非対応の引数エラーの調査
- 04ネストしたクエリのリクエスト規模の制限
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crowdin/ skills --skill graphqlインストール後、Claude Code で/graphqlを入力して読み込まれたか確認します。
同梱ファイルevals/evals.jsonreferences/common-fixes.md
詳細
Crowdin GraphQL クエリの作成
このスキルを使って、ライブスキーマに適合し、未サポートの引数を避け、実用的なページネーションとフィルタリングのパターンを含む、有効な Crowdin GraphQL クエリを作成します。
提供する内容
- 動作する GraphQL クエリ。
- クエリの仕組みに関する簡単な説明。
- 該当する場合は、ユーザーの壊れたクエリを修正したものと、問題点の簡単な説明。
- 任意:読みやすさが向上する場合は、変数オブジェクト。
基本的なワークフロー
1) 意図と範囲を確認する
次の項目を特定します。
- 対象リソース(プロジェクト、文字列、翻訳など)。
- 必須の条件(言語、日付、ステータス、ユーザー、承認状態)。
- ユーザーが必要とする出力フィールド。
依頼が曖昧な場合は、保守的なデフォルトを選び、その旨を簡潔に伝えます。
2) スキーマに適合する基本要素から組み立てる
次の順に進めます。
- 対象のコネクションを実際に公開しているルートフィールドを選びます。
- すべてのコネクションに必須のページネーション引数(
firstまたはlast)を追加します。 - ネストした選択(
edges -> node)を追加し、要求されたフィールドのみを指定します。 - スキーマがサポートしている場合に限り、フィルタリングやソートを追加します。
REST のパラメーターから類推して引数を作り出さないでください。
3) Crowdin GraphQL の一般的な制約に照らして検証する
最終回答を作成する前に、次の点を確認します。
- クエリ対象のすべてのコネクションに
firstまたはlast(1..10000)が指定されている。 - リクエストするノードの推定総数が 10,000 未満である。
- ページネーションが必要になりそうな場合、クエリに
pageInfoが含まれている。 - フィールドで未サポートの引数を使っていない。
4) 安全なページネーションパターンを追加する
カーソルページネーションを推奨します。
- 前方:
first+after - 後方:
last+before
ユーザーが「日付 X から日付 Y まで」と指定した場合、アドホックな引数ではなく、サポートされている filter 入力フィールドを使います(そのようなフィールドを公開しているリソースの場合)。
特に注意すべきミス
未知の引数エラー
ユーザーのクエリにスキーマにないフィールド引数が含まれている場合は、サポートされている代替手段を使うようにクエリを書き換えます。
実際にエラーが発生したアンチパターンの例:
translations(..., createdAfter: "...", createdBefore: "...")
修正方法:
- 未サポートの引数を削除します。
languageId、first、afterなどのサポートされている引数は残します。- 日付条件が必要な場合は、
filter入力を利用できるフィールドであればそこに条件を移します(または、このフィールドでは日付を直接フィルタリングできないことを説明します)。
必須のページネーション引数の欠落
Crowdin GraphQL のコネクションには first または last が必須です。省略しないでください。
過剰なデータ取得
理由なく、大量のネストされた結果を取得しないでください。ノード数の上限を考慮してください。
クエリパターン
パターン A:最小限で安全なコネクションクエリ
query GetProjects($first: Int!, $after: String) {
viewer {
projects(first: $first, after: $after) {
edges {
node {
id
name
}
cursor
}
pageInfo {
hasNextPage
endCursor
}
totalCount
}
}
}
パターン B:フィルタリング + 並べ替え(サポートされている場合)
query FilteredProjects {
viewer {
projects(
first: 10
filter: { createdAt: { gt: "2023-01-01T00:00:00Z" } }
order: [{ lastActivityAt: asc }]
) {
edges {
node {
id
name
lastActivityAt
}
}
}
}
}
パターン C:レート制限への配慮
query MeAndCost {
viewer {
username
}
rateLimit {
limit
cost
remaining
resetAt
}
}
デバッグ用テンプレート
ユーザーがエラーを提示した場合は、次の形式で回答します。
- 原因:スキーマとの不一致を示す一文。
- 修正済みクエリ:修正したクエリ全体。
- これで動作する理由:スキーマのルールに関連した箇条書き 2~4 件。
- 日付フィルタリングが必要な場合:そのフィールドが日付フィルタリングをサポートしているかを説明します。サポートしていない場合は、最も近い有効な代替方法を提案します。
トーンと安全性
- 「賢い」工夫よりも、正確さを優先します。
- スキーマのサポート状況が不確かな場合は、「このフィールドについては Playground Explorer で確認してください」と明示します。
- 引数が存在するかのように装わないでください。
参考資料
制約と例は、Crowdin のドキュメントに準拠させます。
- GraphQL API の概要、ページネーション、フィルタリング/ソート、制限。
- https://support.crowdin.com/developer/graphql-api/