Skill openapi-contract-diff
Compara especificaciones OpenAPI o Swagger para identificar cambios disruptivos y bloquear pipelines de CI según los niveles de severidad.
- Estrellas en GitHub
- 13
- Archivos
- 12
- Último commit
- 12 nov 2026
- Licencia
- MIT
- Herramientas permitidas
- —
¿Qué hace la skill openapi-contract-diff?
openapi-contract-diff es una agent skill. Compara especificaciones OpenAPI o Swagger para identificar cambios disruptivos y bloquear pipelines de CI según los niveles de severidad.
Resumen generado a partir del SKILL.md de la skill.
Sobre la skill openapi-contract-diff
Esta SKILL permite a los desarrolladores que gestionan integraciones públicas o de terceros identificar cambios disruptivos (breaking changes) en las especificaciones de una API. Utiliza la herramienta oasdiff para comparar dos archivos OpenAPI o Swagger, como un archivo local y una URL remota, con el fin de detectar modificaciones que podrían afectar a clientes externos. La herramienta realiza más de 250 comprobaciones para categorizar los hallazgos en tres niveles de severidad: ERR para cambios disruptivos confirmados, WARN para problemas potenciales e INFO para actualizaciones que no rompen la compatibilidad.
Un agente debe cargar esta SKILL cuando un desarrollador necesite verificar si un pull request afectará a los consumidores actuales o al configurar puertas de enlace (gates) automatizadas en CI. Mediante el uso de la bandera --fail-on, los equipos pueden configurar el proceso para que finalice con un error si se detectan niveles de severidad específicos, como fallar una compilación ante cualquier hallazgo de tipo ERR. La SKILL genera varios formatos de salida, incluyendo JSON, YAML, markdown y HTML, lo que la hace ideal tanto para la revisión humana como para la automatización mediante máquinas en pipelines de despliegue.
Lo que un agente puede hacer con ella
- 1Prevenir cambios disruptivos en la API en CIConfigura un paso de compilación para que falle automáticamente si un pull request introduce cambios disruptivos de alta severidad en la especificación OpenAPI.
- 2Revisar un diff de API específicoAnaliza un pull request individual para determinar si eliminar un endpoint o restringir un enum impactará a los usuarios externos.
- 3Comparar archivos de especificación remotosEjecuta una comparación entre una versión local de un esquema y una versión en vivo alojada en una URL remota.
Escrito a partir del SKILL.md de la skill. Cada caso de uso se verifica con una cita del mismo.
Cómo instalar la skill openapi-contract-diff
Cada comando copia la carpeta de la skill al directorio de skills del cliente. Reinicia el cliente o inicia una nueva sesión para cargarla.Instalar la skill openapi-contract-diff en Plugin
/plugin marketplace add testland/qa /plugin install qa-contract-testing@testland-qa
Instalar la skill openapi-contract-diff en Claude Code
~/.claude/skills/openapi-contract-diff/SKILL.md
$ npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff ~/.claude/skills/openapi-contract-diffInstalar la skill openapi-contract-diff en Claude Code (project)
.claude/skills/openapi-contract-diff/SKILL.md
$ npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff .claude/skills/openapi-contract-diffInstalar la skill openapi-contract-diff en Codex
~/.agents/skills/openapi-contract-diff/SKILL.md
$ npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff ~/.agents/skills/openapi-contract-diffInstalar la skill openapi-contract-diff en Gemini CLI
~/.gemini/skills/openapi-contract-diff/SKILL.md
$ npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff ~/.gemini/skills/openapi-contract-diffInstalar la skill openapi-contract-diff en Claude.ai
npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff openapi-contract-diff && zip -r openapi-contract-diff.zip openapi-contract-diff # claude.ai → Customize → Skills → + → Create skill → Upload a skill → openapi-contract-diff.zip
SKILL.md
Ver en GitHubopenapi-contract-diff
Overview
oasdiff is the canonical CLI for comparing two OpenAPI specifications
and reporting breaking changes (oasdiff-readme). It runs
over 250 checks against the diff and classifies each finding into one
of three severity tiers (oasdiff-breaking):
| Severity | Meaning |
|---|---|
ERR |
Definite breaking change - should be avoided. |
WARN |
Potential breaking change - developers should be aware. |
INFO |
Non-breaking change. |
This is the schema-driven counterpart to
pact-contract-testing: use
oasdiff when you don't control the consumers (public APIs, third-
party integrations) and need to gate breaking-change shipment based on
the spec alone.
When to use
- The repo defines an OpenAPI 3 spec (
openapi.yaml,openapi.json, or split-file equivalent). - The team wants a CI gate that fails the build on breaking spec changes between the PR and the deployed version.
- The API has external consumers (no Pact possible) or the team isn't ready to invest in consumer-driven contracts yet.
- You need a one-shot review tool for "is this PR going to break consumers?"
Authoring (no authoring - the spec is the contract)
Unlike Pact, oasdiff doesn't add tests to the repo. Instead it consumes two OpenAPI specs and emits a diff. Authoring effort goes into keeping the spec authoritative - i.e. ensuring the OpenAPI file in the repo accurately describes the implementation. Tools that close the spec-vs-implementation gap (Schemathesis, Spectral lint) pair well with this skill but are out of scope.
Install
# Go install (preferred for native CLI)
go install github.com/oasdiff/oasdiff@latest
# Docker (CI-friendly, no Go toolchain required)
docker pull tufin/oasdiff
(Per oasdiff-readme.)
Running
Local diff
oasdiff breaking openapi-old.yaml openapi-new.yaml
(Per oasdiff-breaking.)
By default oasdiff prints colorized text. For machine consumption, use
--format:
oasdiff breaking --format json openapi-old.yaml openapi-new.yaml > breaking.json
oasdiff breaking --format yaml openapi-old.yaml openapi-new.yaml
oasdiff breaking --format markdown openapi-old.yaml openapi-new.yaml
oasdiff breaking --format html openapi-old.yaml openapi-new.yaml > breaking.html
Available formats: text (default), JSON, YAML, markdown, HTML, plus single-line (oasdiff-breaking).
Comparing remote specs
The CLI accepts URLs directly:
oasdiff breaking \
https://raw.githubusercontent.com/.../openapi-test1.yaml \
https://raw.githubusercontent.com/.../openapi-test3.yaml
(Adapted from oasdiff-readme.)
Docker variant
docker run --rm -t -v "$PWD:/specs" tufin/oasdiff breaking \
/specs/openapi-old.yaml /specs/openapi-new.yaml
--fail-on for CI gating
The exit code is the gate signal (oasdiff-breaking):
oasdiff breaking --fail-on ERR ... # exit 1 on ERR; default behavior most teams want
oasdiff breaking --fail-on WARN ... # exit 1 on ERR or WARN; stricter
oasdiff breaking --fail-on INFO ... # exit 1 on any reported change
Default for production gates: --fail-on ERR. Use --fail-on WARN for
stricter projects (financial APIs, public SDKs) where even potentially-
breaking changes need explicit acceptance.
What counts as breaking
oasdiff ships 250+ checks. The headline breaking patterns (oasdiff-breaking):
- Endpoint deletion - removing a path or HTTP method.
- Removed success response - e.g. dropping the 200 from a
responsesblock. - Deleted schemas from
components.schemas- even if no longer referenced. - Enum value removal - removing a value from an
enumarray. Mark the enumx-extensible-enum: trueto treat removals as non-breaking (clients should ignore unknown values). - Response shape narrowing - changing a property type from
stringtointeger, removing arequiredarray entry, etc. - Request shape widening into
required- making a previously- optional request field required.
For the full list, run oasdiff checks to dump the active rule set.
Reading the report
Text output (default) example:
1 changes: 1 error, 0 warning, 0 info
error [response-success-status-removed] at openapi-new.yaml
in API GET /pets
the success response status '200' was removed
JSON output (for downstream parsing):
[
{
"id": "response-success-status-removed",
"level": 3,
"operation": "GET",
"operationId": "listPets",
"path": "/pets",
"source": "openapi-new.yaml",
"section": "paths",
"text": "the success response status '200' was removed"
}
]
level: 3 is ERR, 2 is WARN, 1 is INFO per the standard
oasdiff convention. Pipe to jq for triage:
jq -r '.[] | select(.level==3) | "ERR " + .operation + " " + .path + " :: " + .text' breaking.json
CI integration
GitHub Actions example using the Docker image and the --fail-on ERR
default:
# .github/workflows/openapi-diff.yml
name: openapi-diff
on:
pull_request:
jobs:
oasdiff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0 # need merge-base SHA for `git show <base>:openapi.yaml`
- name: Extract base spec
run: |
BASE_SHA=$(git merge-base origin/main HEAD)
git show $BASE_SHA:openapi.yaml > /tmp/openapi-base.yaml
- name: Run oasdiff
run: |
docker run --rm -v "$PWD:/specs" -v /tmp:/tmp tufin/oasdiff breaking \
--fail-on ERR \
--format text \
/tmp/openapi-base.yaml \
/specs/openapi.yaml | tee oasdiff-report.txt
- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: openapi-breaking-report
path: oasdiff-report.txt
retention-days: 14
fetch-depth: 0 is required so the merge-base of the PR resolves; the
shallow clone GitHub uses by default doesn't include the merge-base
commit.
For a PR comment workflow, generate --format markdown and post via
actions/github-script@v7 - the markdown table format includes a
clickable per-finding rationale.
References
- oasdiff-readme - install (Go + Docker), output formats, key flags.
- oasdiff-breaking -
breakingsubcommand, severity tiers,--fail-onsemantics, breaking-change categories. pact-contract-testing- the consumer-driven counterpart for cases where you control consumers.contract-compatibility-gate- the gate skill that aggregates oasdiff output with Pact and Protobuf verdicts.
Archivos de esta skill
12Preguntas sobre la skill openapi-contract-diff
¿Cómo instalo la skill openapi-contract-diff en Claude Code?
Ejecuta npx degit testland/qa/plugins/qa-contract-testing/skills/openapi-contract-diff ~/.claude/skills/openapi-contract-diff. Claude Code carga las skills desde ~/.claude/skills (todos los proyectos) o .claude/skills (un proyecto) y usa una skill cuando su descripción coincide con la tarea.
¿Qué clientes pueden usar la skill openapi-contract-diff?
Cualquier cliente que lea el formato Agent Skills: Claude Code, Codex, Gemini CLI y claude.ai (subir como ZIP). Los scripts de la skill se ejecutan solo donde el cliente permite la ejecución de código.