关于 implement-graphql
面向使用 `graphql-ruby` 的 Rails 应用,用于设计、实现和审查 GraphQL API 的 Skill。它强调先写失败测试,并检查授权与 N+1 查询防护。
主要功能
- 01要求实现前先编写失败测试
- 02定义 GraphQL 类型、参数与解析器
- 03使用 Dataloader 防止 N+1 查询
- 04检查字段授权与 Schema 防护
- 05规范 Mutation 的错误响应
适用场景
- 01构建 GraphQL 解析器或 Mutation
- 02审查敏感字段的授权
- 03检查分页与查询性能
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ igmarin/ rails-agent-skills --skill implement-graphql安装后在 Claude Code 中输入/implement-graphql确认已加载。
附带文件EXAMPLES.mdTESTING.md
详细介绍
实现 GraphQL
当你在 Rails 应用中使用 graphql-ruby gem 设计、实现或审查 GraphQL API 时,使用本技能。
核心流程
在第 1 步编写完成并失败之前,不要进入第 3 步。
-
SPEC: 编写失败的 spec(正常路径 + 认证 + 校验错误场景)——参见 TESTING.md。在
spec/graphql/中使用AppSchema.execute。GraphQL spec 绝不要使用 HTTP controller dispatch。 -
TYPE: 定义参数和返回类型。分页形态使用
connection_type。不要泄露内部模型名称。 -
IMPLEMENT: 创建 resolver/mutation 类,委托给 service object。使用专用类,而不是内联 field block。
-
N+1 CHECK: 每次加载关联都使用 dataloader。对于列表 resolver,在字段解析关联对象之前,用 relation 返回的记录为 dataloader 预加载。在 spec 中使用
bullet和db-query-matchers。# ✅ batches loads across all records def buyer dataloader.with(Sources::RecordById, Buyer).load(object.buyer_id) end -
AUTH CHECK: 对敏感数据使用 Pundit 或自定义 context guard 应用字段级防护。
field :internal_notes, String, null: true do guard -> (_obj, _args, ctx) { ctx[:current_user]&.admin? } end -
FINAL CHECK: 验证下方 HARD-GATE 检查清单中的每一项。确保 mutation 在失败时返回
{ result, errors }形态。rescue ActiveRecord::RecordInvalid => e { order: nil, errors: e.record.errors.full_messages } -
RUN: 在提 PR 之前确保完整测试套件通过。
HARD-GATE 检查清单
在交付 resolver/mutation 切片之前,必须确认以下所有事项:
- Specs —— 覆盖正常路径、未认证、未授权、校验错误、N+1 计数和 schema 限制。
- N+1 Prevention —— 每个关联都使用
dataloader.with(Source, Model).load(id);绝不要使用object.association。 - Dataloader Priming —— 集合 resolver 在关联字段解析之前预加载记录。
- Authorization —— 敏感字段有字段级防护(不能只有类型级防护)。
- Type Conventions —— 分页集合使用
Types::*Type.connection_type,而不是普通数组。 - Schema Safeguards —— 生产环境禁用 introspection;设置
max_depth和max_complexity。 - Error Handling —— mutation 使用 rescue 块返回
{ result, errors };没有未处理异常。 - Documentation —— 每个类型中的每个字段都有
description:。 - Resolver Structure —— 使用专用 resolver 类,而不是内联 field block。
扩展资源(渐进式披露)
仅在需要其特定内容时加载这些文件:
- TESTING.md —— spec 模板、路径和检查清单。
- EXAMPLES.md —— dataloader、mutation 和类型的详细代码示例。
集成
| 技能 | 何时串联 |
|---|---|
| define-domain-language | 类型和字段命名必须与业务语言一致 |
| plan-tests | 选择第一个失败的 spec(mutation vs query vs resolver unit) |
| write-tests | 对 resolver 和 mutation 执行完整 TDD 周期 |
| security-check | 认证、禁用 introspection、查询深度/复杂度限制 |