From qe-framework
Designs RESTful and GraphQL APIs with OpenAPI 3.1 specifications, covering resource modeling, versioning, pagination, and error handling.
How this skill is triggered — by the user, by Claude, or both
Slash command
/qe-framework:Qapi-designerThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Senior API architect specializing in REST and GraphQL APIs with comprehensive OpenAPI 3.1 specifications.
Senior API architect specializing in REST and GraphQL APIs with comprehensive OpenAPI 3.1 specifications.
npx @redocly/cli lint openapi.yamlnpx @stoplight/prism-cli mock openapi.yamlLoad detailed guidance based on context:
| Topic | Reference | Load When |
|---|---|---|
| REST Patterns | references/rest-patterns.md | Resource design, HTTP methods, HATEOAS |
| Versioning | references/versioning.md | API versions, deprecation, breaking changes |
| Pagination | references/pagination.md | Cursor, offset, keyset pagination |
| Error Handling | references/error-handling.md | Error responses, RFC 7807, status codes |
| OpenAPI | references/openapi.md | OpenAPI 3.1, documentation, code generation |
/users/{id}, not /getUser/{id})Resource CRUD with versioning and timestamps. Use /v1/users/{id} URIs with snake_case fields.
All errors return RFC 7807 Problem Details with stable type URI, actionable detail, and field-level errors[].
Large collections use opaque cursor + has_more boolean. Limit max 100, default 20. Never expose internal IDs in cursors.
OpenAPI descriptions must include:
JSDoc for route handlers:
/**
* GET /v1/users/{id} - Retrieve user by ID
* @param {string} id - UUID required
* @throws {404} User not found
* @throws {401} Missing bearer token
* @returns {User} User object with audit timestamps
*/
npx @redocly/cli lint openapi.yaml (no errors, only warnings allowed)eslint --rule "no-hardcoded-secrets: error" + require JSDoc on all endpointsnpx @apidevtools/swagger-cli validate openapi.yamlAuthorization: Bearer header; reject unauth with 401Retry-After header* in production| Wrong | Correct |
|---|---|
GET /getUser/{id} (verb in URL) | GET /users/{id} (resource-oriented) |
{ status: "ok", result: {...} } (inconsistent envelope) | { data: {...}, pagination: {...} } (consistent shape) |
GET /users returns all 10K records | GET /users?limit=20&cursor=... (paginated always) |
/v1/users/{id} → /v2/users/{userId} without deprecation | Maintain /v1/users/{id} for 90 days, add /v2/users/{id} in parallel |
GET /[email protected] in query string | Use POST /users/search with encrypted body or X-Query: base64 header |
openapi: "3.1.0"
info:
title: Example API
version: "1.1.0"
paths:
/users:
get:
summary: List users
operationId: listUsers
tags: [Users]
parameters:
- name: cursor
in: query
schema: { type: string }
description: Opaque cursor for pagination
- name: limit
in: query
schema: { type: integer, default: 20, maximum: 100 }
responses:
"200":
description: Paginated list of users
content:
application/json:
schema:
type: object
required: [data, pagination]
properties:
data:
type: array
items: { $ref: "#/components/schemas/User" }
pagination:
$ref: "#/components/schemas/CursorPage"
"400": { $ref: "#/components/responses/BadRequest" }
"401": { $ref: "#/components/responses/Unauthorized" }
"429": { $ref: "#/components/responses/TooManyRequests" }
/users/{id}:
get:
summary: Get a user
operationId: getUser
tags: [Users]
parameters:
- name: id
in: path
required: true
schema: { type: string, format: uuid }
responses:
"200":
description: User found
content:
application/json:
schema: { $ref: "#/components/schemas/User" }
"404": { $ref: "#/components/responses/NotFound" }
components:
schemas:
User:
type: object
required: [id, email, created_at]
properties:
id: { type: string, format: uuid, readOnly: true }
email: { type: string, format: email }
name: { type: string }
created_at: { type: string, format: date-time, readOnly: true }
CursorPage:
type: object
required: [next_cursor, has_more]
properties:
next_cursor: { type: string, nullable: true }
has_more: { type: boolean }
Problem: # RFC 7807 Problem Details
type: object
required: [type, title, status]
properties:
type: { type: string, format: uri, example: "https://api.example.com/errors/validation-error" }
title: { type: string, example: "Validation Error" }
status: { type: integer, example: 400 }
detail: { type: string, example: "The 'email' field must be a valid email address." }
instance: { type: string, format: uri, example: "/users/req-abc123" }
responses:
BadRequest:
description: Invalid request parameters
content:
application/problem+json:
schema: { $ref: "#/components/schemas/Problem" }
Unauthorized:
description: Missing or invalid authentication
content:
application/problem+json:
schema: { $ref: "#/components/schemas/Problem" }
NotFound:
description: Resource not found
content:
application/problem+json:
schema: { $ref: "#/components/schemas/Problem" }
TooManyRequests:
description: Rate limit exceeded
headers:
Retry-After: { schema: { type: integer } }
content:
application/problem+json:
schema: { $ref: "#/components/schemas/Problem" }
securitySchemes:
BearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- BearerAuth: []
{
"type": "https://api.example.com/errors/validation-error",
"title": "Validation Error",
"status": 422,
"detail": "The 'email' field must be a valid email address.",
"instance": "/users/req-abc123",
"errors": [
{ "field": "email", "message": "Must be a valid email address." }
]
}
Content-Type: application/problem+json for error responses.type must be a stable, documented URI — never a generic string.detail must be human-readable and actionable.errors[] for field-level validation failures.When delivering an API design, provide:
type URIs)npx @redocly/cli lint openapi.yaml passes with no errorsREST architecture, OpenAPI 3.1, GraphQL, HTTP semantics, JSON:API, HATEOAS, OAuth 2.0, JWT, RFC 7807 Problem Details, API versioning patterns, pagination strategies, rate limiting, webhook design, SDK generation
npx claudepluginhub inho-team/qe-framework --plugin qe-frameworkCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.