Use when detecting breaking changes between GraphQL schema versions, comparing schemas across branches, or validating schema migrations.
Detects breaking changes in GraphQL schemas during version comparisons or migrations.
/plugin marketplace add thebushidocollective/han/plugin install graphql-inspector@hanThis skill is limited to using the following tools:
Expert knowledge of GraphQL Inspector's diff command for detecting breaking, non-breaking, and dangerous changes between GraphQL schema versions.
GraphQL Inspector's diff command compares two GraphQL schemas and outputs a precise list of changes. Each change is categorized as breaking, non-breaking, or dangerous, helping teams prevent API regressions.
# Compare two schema files
npx @graphql-inspector/cli diff old-schema.graphql new-schema.graphql
# Compare against git branch
npx @graphql-inspector/cli diff 'git:origin/main:schema.graphql' schema.graphql
# Compare against specific commit
npx @graphql-inspector/cli diff 'git:abc123:schema.graphql' schema.graphql
# Compare against tag
npx @graphql-inspector/cli diff 'git:v1.0.0:schema.graphql' schema.graphql
# Compare local schema against remote endpoint
npx @graphql-inspector/cli diff 'https://api.example.com/graphql' schema.graphql
# Compare two remote endpoints
npx @graphql-inspector/cli diff 'https://staging.api.com/graphql' 'https://prod.api.com/graphql'
# Only show breaking changes
npx @graphql-inspector/cli diff old.graphql new.graphql --onlyBreaking
# Fail on dangerous changes
npx @graphql-inspector/cli diff old.graphql new.graphql --failOnDangerous
# Custom rules
npx @graphql-inspector/cli diff old.graphql new.graphql --rule suppressRemovalOfDeprecatedField
# Output as JSON
npx @graphql-inspector/cli diff old.graphql new.graphql --json
Changes that will break existing clients:
| Change Type | Example |
|---|---|
| Field removed | User.email removed |
| Type removed | UserType deleted |
| Required argument added | New id: ID! on query |
| Type changed | User.age: Int → User.age: String |
| Non-null constraint added | email: String → email: String! |
| Union member removed | SearchResult loses Product type |
| Enum value removed | Status.PENDING removed |
| Interface field removed | Node.id removed from interface |
Changes that may break some clients:
| Change Type | Example |
|---|---|
| Argument default changed | limit = 10 → limit = 20 |
| Enum value added | New Status.ARCHIVED |
| Optional argument added | New User.name(format: String) |
| Union member added | SearchResult gains Article type |
| Interface added to type | User implements Timestampable |
| Nullable field becomes non-null | email: String → email: String! on output |
Safe changes that won't break clients:
| Change Type | Example |
|---|---|
| Field added | New User.avatar field |
| Type added | New Comment type |
| Optional argument added | New users(filter: String) |
| Deprecation added | @deprecated(reason: "Use newField") |
| Description changed | Updated field documentation |
| Directive added | @cacheControl(maxAge: 60) |
Create .graphql-inspector.yaml:
diff:
rules:
- suppressRemovalOfDeprecatedField
- considerUsage
failOnBreaking: true
failOnDangerous: false
# Suppress rules
- suppressRemovalOfDeprecatedField # Deprecated fields can be removed
- suppressCommonPrefixChanges # Ignore prefix renames
# Usage-based rules
- considerUsage # Check if breaking change affects real usage
# Local file
old: ./old-schema.graphql
# Git reference
old: git:origin/main:schema.graphql
# URL with headers
old:
url: https://api.example.com/graphql
headers:
Authorization: Bearer ${API_TOKEN}
# Glob pattern
new: ./**/*.graphql
name: Schema Diff
on:
pull_request:
paths:
- 'schema.graphql'
- '**/*.graphql'
jobs:
diff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Install Inspector
run: npm install -g @graphql-inspector/cli
- name: Check for breaking changes
run: |
graphql-inspector diff \
'git:origin/main:schema.graphql' \
schema.graphql \
--onlyBreaking
schema-diff:
image: node:20
script:
- npm install -g @graphql-inspector/cli
- graphql-inspector diff "git:origin/main:schema.graphql" schema.graphql
rules:
- changes:
- "**/*.graphql"
Check if breaking changes affect actual operations:
# Provide operations to check against
npx @graphql-inspector/cli diff old.graphql new.graphql \
--rule considerUsage \
--documents "src/**/*.graphql"
Benefits:
For Apollo Federation schemas:
# Compare federated schemas
npx @graphql-inspector/cli diff \
--federation \
old-subgraph.graphql \
new-subgraph.graphql
@deprecated before removing fields# Step 1: Add new field and deprecate old
type User {
fullName: String!
name: String @deprecated(reason: "Use fullName instead")
}
# Step 2: After migration window, remove old field
type User {
fullName: String!
}
# Phase 1: Add alias with deprecated old name
type User {
displayName: String!
name: String @deprecated(reason: "Use displayName")
}
# Phase 2: Remove after client migration
type User {
displayName: String!
}
"Schema not found"
git:branch:path"Breaking changes detected" in CI
--rule suppressRemovalOfDeprecatedField if field was deprecated"Introspection query failed"
Expert guidance for Next.js Cache Components and Partial Prerendering (PPR). **PROACTIVE ACTIVATION**: Use this skill automatically when working in Next.js projects that have `cacheComponents: true` in their next.config.ts/next.config.js. When this config is detected, proactively apply Cache Components patterns and best practices to all React Server Component implementations. **DETECTION**: At the start of a session in a Next.js project, check for `cacheComponents: true` in next.config. If enabled, this skill's patterns should guide all component authoring, data fetching, and caching decisions. **USE CASES**: Implementing 'use cache' directive, configuring cache lifetimes with cacheLife(), tagging cached data with cacheTag(), invalidating caches with updateTag()/revalidateTag(), optimizing static vs dynamic content boundaries, debugging cache issues, and reviewing Cache Component implementations.