From graphql-inspector
Detects breaking, dangerous, and non-breaking changes between GraphQL schema versions using GraphQL Inspector diff command. Compares files, git branches/tags/commits, and remote endpoints.
npx claudepluginhub thebushidocollective/han --plugin graphql-inspectorThis 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.
Integrates GraphQL Inspector into GitHub Actions, GitLab CI, and pipelines for automated schema diffing, operation validation, breaking change detection, and PR comments.
Validates OpenAPI, Swagger, GraphQL schemas against backends like Express, FastAPI, Django. Detects breaking changes, generates TypeScript clients from .yaml, .json, .graphql specs.
Detects breaking changes in REST, GraphQL, and gRPC API contracts. Compares OpenAPI schemas and protobuf defs to baselines, classifies severity, validates semver, runs Pact tests, generates reports.
Share bugs, ideas, or general feedback.
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
user-invocable: false
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"