| name | go-graphql |
| description | Analyze Go GraphQL projects using gqlgen. Use when onboarding to Go GraphQL APIs, understanding schema design, analyzing resolver implementations, reviewing directive usage, examining dataloaders, identifying N+1 query patterns, and generating GraphQL API documentation. |
| context | fork |
| agent | graphql-architect |
| allowed-tools | ["Read","Glob","Grep","Bash","Task","Write","WebFetch","WebSearch"] |
Purpose
Provide comprehensive analysis of Go GraphQL projects built with gqlgen to help developers quickly understand schema design, resolver patterns, and GraphQL-specific implementations. This skill leverages the graphql-architect agent for deep GraphQL analysis.
When to Use
Use this skill when you need to:
- Onboard to a gqlgen project - Understand the full GraphQL API structure
- Analyze schema design - Review types, queries, mutations, subscriptions
- Review resolver implementations - Understand how queries are resolved
- Examine directive usage - Find custom directives and their handlers
- Identify dataloaders - Analyze batching and caching patterns
- Detect N+1 problems - Find potential performance issues
- Document the GraphQL API - Generate schema documentation
- Understand federation - Analyze Apollo Federation setup
gqlgen Detection
Identifying gqlgen Projects
Check for gqlgen markers:
grep "github.com/99designs/gqlgen" go.mod
find . -name "gqlgen.yml" -o -name "gqlgen.yaml" -o -name ".gqlgen.yml"
find . -name "generated.go" -path "*/graph/*"
gqlgen Project Structure
project/
├── graph/
│ ├── generated/ # Auto-generated code (DO NOT EDIT)
│ │ └── generated.go
│ ├── model/ # Generated and custom models
│ │ └── models_gen.go
│ ├── resolver.go # Root resolver
│ ├── schema.resolvers.go # Schema resolver implementations
│ └── schema.graphqls # GraphQL schema definition
├── gqlgen.yml # gqlgen configuration
└── server.go # Server entry point
Analysis Checklist
1. Schema Analysis
find . -name "*.graphqls" -o -name "*.graphql"
grep -c "^type " *.graphqls
grep -c "^input " *.graphqls
grep -c "^enum " *.graphqls
grep -c "^interface " *.graphqls
grep -A 50 "^type Query" *.graphqls
grep -A 50 "^type Mutation" *.graphqls
grep -A 20 "^type Subscription" *.graphqls
2. Resolver Analysis
find . -name "*resolver*.go"
grep -rn "type Resolver struct" --include="*.go"
grep -rn "func.*QueryResolver" --include="*.go"
grep -rn "func.*MutationResolver" --include="*.go"
grep -rn "func.*Resolver\)" --include="*.go" | grep -v "Query\|Mutation"
3. Directive Analysis
grep -rn "^directive @" --include="*.graphqls"
grep -rn "DirectiveRoot" --include="*.go"
grep -rn "@auth\|@hasRole\|@deprecated\|@cacheControl" --include="*.graphqls"
4. Dataloader Analysis
grep -rn "dataloader\|DataLoader\|Loader" --include="*.go"
grep -rn "func.*Batch\|func.*Load" --include="*.go"
grep "github.com/vektah/dataloaden" go.mod
5. Model Analysis
find . -name "*model*.go" -o -name "*models*.go"
grep -rn "MarshalGQL\|UnmarshalGQL" --include="*.go"
grep -A 20 "models:" gqlgen.yml
6. Subscription Analysis
grep -rn "func.*SubscriptionResolver" --include="*.go"
grep -rn "chan.*<-\|<-chan" --include="*resolver*.go"
7. Federation Analysis (if applicable)
grep -rn "@key\|@external\|@requires\|@provides" --include="*.graphqls"
grep -rn "func.*EntityResolver\|func.*Entity\(" --include="*.go"
grep "federation:" gqlgen.yml
gqlgen Configuration Analysis
Key sections in gqlgen.yml:
schema:
- graph/*.graphqls
exec:
filename: graph/generated/generated.go
package: generated
model:
filename: graph/model/models_gen.go
package: model
resolver:
layout: follow-schema
dir: graph
package: graph
models:
ID:
model:
- github.com/99designs/gqlgen/graphql.ID
DateTime:
model:
- github.com/99designs/gqlgen/graphql.Time
federation:
filename: graph/federation.go
package: graph
version: 2
Common Patterns
Resolver Pattern
See reference/resolver-patterns.md for detailed patterns.
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
return r.UserService.List(ctx)
}
func (r *userResolver) FullName(ctx context.Context, obj *model.User) (string, error) {
return obj.FirstName + " " + obj.LastName, nil
}
Dataloader Pattern
See reference/dataloader-patterns.md for detailed patterns.
func (r *Resolver) UserLoader(ctx context.Context, keys []string) ([]*model.User, []error) {
users, err := r.UserService.GetByIDs(ctx, keys)
}
Directive Pattern
See reference/directive-patterns.md for detailed patterns.
func Auth(ctx context.Context, obj interface{}, next graphql.Resolver) (interface{}, error) {
user := auth.ForContext(ctx)
if user == nil {
return nil, errors.New("unauthorized")
}
return next(ctx)
}
Output Format
Generate a GraphQL API onboarding report with:
1. Schema Overview
- Total types, queries, mutations, subscriptions
- Custom scalars and enums
- Interface and union types
2. Schema Diagram (Mermaid)
Generate docs/graphql-schema.md with schema visualization:
# GraphQL Schema
## Type Relationships
\`\`\`mermaid
<!-- See reference/schema-diagram.mmd -->
\`\`\`
## Operations
| Type | Operation | Return Type | Description |
|------|-----------|-------------|-------------|
| Query | users | [User!]! | List all users |
| Query | user(id: ID!) | User | Get user by ID |
| Mutation | createUser | User! | Create new user |
3. Resolver Map
- Query resolvers and their implementations
- Mutation resolvers
- Field resolvers (computed fields)
- Subscription resolvers
4. Directive Reference
- Custom directives and their purposes
- Directive handlers and implementations
5. Dataloader Analysis
- Identified dataloaders
- Batch functions
- Potential N+1 issues
6. Key Files
Recommended reading order:
gqlgen.yml - Configuration
graph/schema.graphqls - Schema definition
graph/resolver.go - Root resolver
graph/schema.resolvers.go - Resolver implementations
graph/model/ - Data models
- Directive handlers (if any)
- Dataloader implementations (if any)
Performance Checklist