关于 enonic-guillotine-query-builder
用于构建和验证 Enonic Guillotine GraphQL 查询的开发技能,帮助开发者识别 API 版本并选择查询方式,并提供参考资料与常见错误检查。
主要功能
- 01扫描项目中的 Guillotine 用法
- 02识别 API 风格与版本
- 03使用 Query DSL 构建查询
- 04支持分页与聚合
- 05验证查询结构和类型
适用场景
- 01创建筛选后的内容搜索
- 02迁移已弃用的查询写法
- 03添加分页或高亮
- 04排查空结果或空值
安装
复制下面的命令,在终端中运行。
$
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/guillotine.js中是否有exports.extensions,以检测是否使用 Guillotine 7 Extensions API。 - 如果两种风格并存,请标记已弃用的用法,以便迁移。
步骤 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。
- 获取单个内容:使用
- 如果需要分页,优先使用连接变体(
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必须恰好包含一个表达式字段。 - 使用
boolean及其must、should、mustNot和filter数组组合多个条件。 - 对日期或数值范围,使用
range表达式,以及gt/gte/lt/lte和正确的DSLExpressionValueInput类型(localDate、localDateTime、instant、long、double)。 - 排序时,使用包含
field和direction(ASC/DESC)的SortDslInput。 - 如果查询模式与文档化示例相符,请阅读
references/examples.md。
步骤 6:按需添加聚合和高亮
- 在
queryDslConnection上,将aggregations作为AggregationInput对象数组传入。 - 每个聚合都必须有唯一的
name,并且恰好包含一个聚合类型字段(terms、dateRange、stats等)。 - 需要高亮时,传入
highlight,并使用properties数组为每个需要高亮的字段指定propertyName。 - 从连接结果的
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:验证查询
- 验证所有内联片段类型名称都使用下划线,而非原始描述符格式。
- 确认使用的是
queryDsl/queryDslConnection,而不是已弃用的query/queryConnection。 - 确保
QueryDSLInput对象恰好包含一个表达式字段。 - 验证
DSLExpressionValueInput对象恰好包含一个值类型字段。 - 检查聚合和高亮仅用于连接变体。
- 对于 Guillotine 7+ 项目,验证
pageUrl/mediaUrl/imageUrl/attachmentUrl的params参数使用Json类型,而非String。 - 如果查询返回意外的空值、空结果或类型错误,请阅读
references/troubleshooting.md。
错误处理
- 如果
get返回 null,请验证该键是否为有效的内容路径或 ID,以及目标分支是否正确(draft 或 master)。 - 如果内联片段字段为 null,请确认 GraphQL 类型名称使用下划线,且与内容类型描述符完全匹配。
- 如果
queryDsl返回空结果,请先简化为matchAll: {},以确认数据存在,再逐个重新添加筛选条件。 - 如果聚合或高亮结果为 null,请验证查询使用的是
queryDslConnection,而非queryDsl。 - 如果使用了已弃用的
query字段,请阅读references/compatibility.md,了解如何迁移到使用 DSL 语法的queryDsl。 - 如果
scripts/find-guillotine-targets.mjs无法运行,请手动扫描工作区以查找 Guillotine 标记,然后继续。
评论
支持 Markdown