enonic-guillotine-query-builder について
Enonic Guillotine の GraphQL クエリを作成・検証する開発スキルです。API のバージョンに応じたクエリ形式の選択や、よくあるエラーの確認に役立ちます。
主な機能
- 01プロジェクト内の Guillotine 利用箇所を検索
- 02API の形式とバージョンを判定
- 03Query DSL でクエリを作成
- 04ページネーションと集計に対応
- 05クエリの構造と型を検証
活用シーン
- 01条件付きコンテンツ検索の作成
- 02非推奨クエリ形式からの移行
- 03ページネーションやハイライトの追加
- 04空の結果や null の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ webmaxru/ enonic-agent-skills --skill enonic-guillotine-query-builderインストール後、Claude Code で/enonic-guillotine-query-builderを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
assets/guillotine-query.template.tsreferences/compatibility.mdexamples.mdguillotine-reference.mdtroubleshooting.mdscripts/find-guillotine-targets.mjs詳細
Enonic Guillotine クエリビルダー
手順
ステップ 1:ワークスペース内で既存の Guillotine の使用箇所をスキャンする
node scripts/find-guillotine-targets.mjs .を実行して、Guillotine のマーカー(クエリ文字列、ライブラリーのインポート、エンドポイント参照)が含まれるファイルを一覧表示します。- Node ランタイムを利用できない場合は、
.ts、.js、.graphql、.gqlファイル内のguillotine、queryDsl、queryDslConnection、/lib/guillotineを手動で検索します。 - 使用中の Guillotine のバージョンを確認します。
query(query: "...")形式の文字列ベースのフィールドが見つかった場合、プロジェクトでは非推奨の 5.x スタイルの API が使用されています。queryDsl/queryDslConnectionが見つかった場合は、6.x 以降の DSL が使用されています。Guillotine 7 Extensions API の使用を検出するには、guillotine/guillotine.js内のexports.extensionsを確認します。 - 両方のスタイルが混在している場合は、非推奨の使用箇所を移行対象として示します。
ステップ 2:Guillotine API リファレンスを読み込む
- クエリを作成する前に、
references/guillotine-reference.mdを読みます。 - ワークスペースが Guillotine のバージョンを対象とする場合、またはバージョン間の移行を行う場合は、
references/compatibility.mdを読みます。
ステップ 3:クエリの形式を決定する
- ユーザーが必要としている操作を特定します。
- 単一コンテンツの取得:
get(key)を使用します。 - 直接の子コンテンツ:
getChildren(key)を使用します。ページネーションにはgetChildrenConnection(key)を使用します。 - フィルター付き検索:フラットなリストには
queryDsl(query)を、ページネーション、集計、またはハイライトにはqueryDslConnection(query)を使用します。 - コンテンツタイプのメタデータ:
getType(name)またはgetTypesを使用します。
- 単一コンテンツの取得:
- ページネーションが必要な場合は、Connection 版(
queryDslConnection、getChildrenConnection)を優先し、呼び出し元にafter/firstを渡すよう案内します。 - 集計またはハイライトが必要な場合は、
queryDslConnectionを必須とします。これらの機能はqueryDslでは利用できません。
ステップ 4:コンテンツタイプのフラグメントを作成する
- コンテンツタイプ記述子から GraphQL タイプ名を導き出します。ドット(
.)とコロン(:)をアンダースコア(_)に置き換え、ハイフン(-)を削除して、その次の文字を大文字にします。コロンの後の各セグメントの先頭文字は大文字にします。例:com.enonic.app.myapp:BlogPost→com_enonic_app_myapp_BlogPost。組み込みタイプの場合:portal:template-folder→portal_TemplateFolder。 - インラインフラグメントを使用して、タイプ固有の
dataフィールドにアクセスします:... on <GraphQLTypeName> { data { ... } }。 - コンテンツ参照(ContentSelector、ImageSelector、MediaSelector)では、参照先のタイプに対するネストされたインラインフラグメントを使って参照をたどります。
- RichText / HtmlArea フィールドには、
processedHtmlと、必要に応じてlinks、images、macrosサブフィールドを含めます。絶対 URL、srcset の幅(imageWidths)、またはレスポンシブサイズ(imageSizes)には、processHtml入力引数を使用します。
ステップ 5:クエリのフィルターとソートを作成する
- Query DSL 入力タイプを使用します。各
QueryDSLInputに含める式フィールドは必ず 1 つにします。 - 複数の条件を組み合わせるには、
must、should、mustNot、filter配列を含むbooleanを使用します。 - 日付または数値の範囲には、
gt/gte/lt/lteと、適切なDSLExpressionValueInputタイプ(localDate、localDateTime、instant、long、double)を指定したrange式を使用します。 - ソートには、
fieldとdirection(ASC/DESC)を指定したSortDslInputを使用します。 - クエリパターンが文書化された例に該当する場合は、
references/examples.mdを読みます。
ステップ 6:必要に応じて集計とハイライトを追加する
queryDslConnectionにAggregationInputオブジェクトの配列としてaggregationsを渡します。- 各集計には、一意の
nameと、集計タイプのフィールド(terms、dateRange、statsなど)が 1 つだけ必要です。 - ハイライトする各フィールドの
propertyNameを指定したproperties配列とともに、highlightを渡します。 - 接続結果の
aggregationsAsJsonとhighlightAsJsonから集計結果とハイライト結果を読み取ります。 ステップ 7:TypeScript 型を生成する(必要な場合) assets/guillotine-query.template.tsを開始テンプレートとして読み込みます。__APP_KEY__、__CONTENT_TYPE__、__GRAPHQL_TYPE__、__FIELDS__のプレースホルダーを、実際のコンテンツタイプの値に置き換えます。- クエリで要求されているコンテンツタイプのスキーマフィールドに合わせて、
Dataインターフェースに型付きフィールドを追加します。 - コネクションクエリでは、特定のコンテンツタイプを指定した
ContentConnection<T>ジェネリックを使用します。
ステップ 8:サイトコンテキストを設定する(該当する場合)
- クエリが特定のサイトを対象とする場合は、
guillotineフィールドにsiteKeyを設定するか、呼び出し元にX-Guillotine-SiteKeyHTTP ヘッダーを設定するよう指示します。 - サイト相対クエリのパス引数では
${site}プレースホルダーを使用します。 - サイト相対パスを返すには
_path(type: siteRelative)を使用します。
ステップ 9:クエリを検証する
- すべてのインラインフラグメント型名で、元の記述子形式ではなくアンダースコアが使用されていることを確認します。
- 非推奨の
query/queryConnectionではなく、queryDsl/queryDslConnectionが使用されていることを確認します。 QueryDSLInputオブジェクトに式フィールドが 1 つだけ含まれていることを確認します。DSLExpressionValueInputオブジェクトに値型フィールドが 1 つだけ含まれていることを確認します。- 集計とハイライトがコネクション版でのみ使用されていることを確認します。
- Guillotine 7+ のプロジェクトでは、
pageUrl/mediaUrl/imageUrl/attachmentUrlのparams引数にStringではなくJson型が使用されていることを確認します。 - クエリで予期しない null、空の結果、型エラーが返された場合は、
references/troubleshooting.mdを読みます。
エラー処理
getが null を返す場合は、そのキーが有効なコンテンツパスまたは ID であること、また正しいブランチ(draft または master)が対象になっていることを確認します。- インラインフラグメントのフィールドが null の場合は、GraphQL 型名にアンダースコアが使用され、コンテンツタイプの記述子と完全に一致していることを確認します。
queryDslが空の結果を返す場合は、データの存在を確認するためにmatchAll: {}に簡略化してから、フィルターを 1 つずつ再追加します。- 集計またはハイライトの結果が null の場合は、クエリで
queryDslではなくqueryDslConnectionが使用されていることを確認します。 - 非推奨の
queryフィールドが使用されている場合は、references/compatibility.mdを読み、DSL 構文を使うqueryDslに移行します。 scripts/find-guillotine-targets.mjsを実行できない場合は、ワークスペース内で Guillotine のマーカーを手動で検索し、作業を続けます。
コメント
Markdown 対応