graphql
GraphQL 开发指南,包含 schema 定义、resolver 实现、类型系统、代码生成和前后端集成。Invoke when working with GraphQL schema, resolvers, running generate-graphql.ps1, or implementing GraphQL-related functionality.
Works with
---
name: graphql
description: GraphQL 开发指南,包含 schema 定义、resolver 实现、类型系统、代码生成和前后端集成。Invoke when working with GraphQL schema, resolvers, running generate-graphql.ps1, or implementing GraphQL-related functionality.
license: MIT
---
# GraphQL 开发指南
## 项目结构
GraphQL 相关文件分为两个目录:
```
├── graph/ # GraphQL schema 定义(纯定义文件)
│ ├── scalars.graphql # Scalar 类型定义
│ ├── directives.graphql # Directive 定义
│ ├── types/ # Type 类型定义
│ ├── enums/ # Enum 类型定义
│ ├── queries/ # Query 定义
│ ├── subscriptions/ # Subscription 定义
│ └── mutations/ # Mutation 定义
├── internal/interfaces/graphql/ # GraphQL 实现代码
│ ├── generated.go # gqlgen 自动生成的执行代码
│ ├── models_gen.go # gqlgen 自动生成的模型
│ ├── resolver.go # 主 resolver 入口
│ ├── scalars.go # 自定义标量类型(Time、Upload、URI)
│ └── *.resolvers.go # 各 mutation/query 的 resolver 实现
└── frontend/src/graphql/ # 前端 GraphQL 相关代码
├── fragments/ # GraphQL 片段
├── mutations/ # GraphQL 变更
├── queries/ # GraphQL 查询
├── subscriptions/ # GraphQL 订阅
├── utils/ # GraphQL 工具函数
├── client.ts # GraphQL 客户端
└── generated.ts # 自动生成的前端 GraphQL 代码
```
## 配置文件
`gqlgen.yml` 包含对应配置
## 开发工作流
### 修改 GraphQL schema 后
在更新 resolver 实现之前
运行 `.\scripts\generate-graphql.ps1` 命令来同时更新前后端的 GraphQL 相关代码。
### 代码生成规则
- `graph/` 目录只包含 `.graphql` 定义文件
- `internal/interfaces/graphql/` 目录包含所有生成的 Go 代码
- `frontend/src/graphql/` 目录包含前端 GraphQL 相关代码
- 自定义代码放在 `resolver.go`、`scalars.go`、`*.resolvers.go` 和前端的对应目录中
## Schema 文件组织规则
- 每个文件围绕一个字段/类型,放在对应的子目录中
- 文件命名和其中主要的字段或类型相同,使用 snake_case(如 `image_filters.graphql`)
- 使用 `extend type` 形式定义根对象上的额外字段(除了第一个字段)
## 常见任务
**添加 GraphQL 元素**:在 `graph/` 对应子目录创建 `.graphql` 文件,运行 `.\scripts\generate-graphql.ps1` 生成代码,在 `internal/interfaces/graphql/*.resolvers.go`、`internal/application/` 和 `internal/domain/` 实现逻辑。
**前端使用 GraphQL**:在 `frontend/src/graphql/` 对应目录创建 `.gql` 文件,使用 `@/graphql/utils/` 工具函数执行查询或变更。
**Schema 组织**:Type/Enum 单独文件,使用 `@goModel` 指定 Go 类型;Query/Subscription 用 `extend type` 定义;文件命名使用 snake_case。
## 类型映射
### 自定义标量类型
在 `internal/interfaces/graphql/scalars.go` 中定义:
- **Time**: `time.Time` 类型,使用 RFC3339Nano 格式序列化
- **Upload**: `github.com/99designs/gqlgen/graphql.Upload` 类型,用于文件上传
### Go 类型映射
使用 `@goModel` 指定 GraphQL 类型对应的 Go 类型:
```graphql
extend type Session @goModel(model: "main/internal/shared.SessionDTO") {
id: ID!
status: SessionStatus!
# ...
}
```
## 注意事项
- 不要手动编辑生成的文件(`generated.go`、`models_gen.go` 和 `generated.ts`),而是运行 `.\scripts\generate-graphql.ps1` 生成新代码
- 修改 schema 后必须重新生成代码
- 不用保持 schema 的向后兼容性(前后端总是一起更新)More API Design skills
lark-event
larksuite/cli
Lark/Feishu real-time event listening / subscribing / consuming: stream events as NDJSON via `lark-cli event consume <EventKey>` (covers IM messages/reactions/chat changes, Approval status changes, Task updates, VC meeting started/joined/ended, Minutes generated, Whiteboard updated, etc.). Use for Lark bots, real-time message processing, long-running subscribers, streaming webhook/push handlers. Supports `--max-events` / `--timeout` bounded runs and a stderr ready-marker contract — designed for AI agents running as subprocesses.
lark-contact
larksuite/cli
飞书 / Lark 通讯录:按姓名 / 邮箱解析成 open_id,或按 open_id 反查姓名 / 部门 / 邮箱 / 联系方式 / 个人状态 / 签名,以及按关键词搜索当前用户可见的机器人 / 智能体(agent)。当用户提到一个名字要下一步发消息 / 排日程,或拿到 open_id 想查具体信息时使用。不负责部门树遍历、按部门列员工、组织架构图,这类需求走原生 OpenAPI。
lark-openapi-explorer
larksuite/cli
飞书/Lark 原生 OpenAPI 探索:从官方文档库中挖掘未经 CLI 封装的原生 OpenAPI 接口。当用户的需求无法被现有 lark-* skill 或 lark-cli 已注册命令满足,需要查找并调用原生飞书 OpenAPI 时使用。

