💻 Développement

openapi-contract-first

Design d'API Contract-First avec OpenAPI/Swagger, génération de code, validation de contrats et documentation interactive.

⚡ Installation & lancement en 1 commande

Copiez-collez dans votre terminal : le skill s'installe dans ~/.claude/skills et Claude Code se lance directement dessus.

macOS / Linux
curl -fsSL https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.sh | sh -s -- openapi-contract-first --launch
Windows (PowerShell)
iex "& { $(iwr -useb https://raw.githubusercontent.com/khalilbenaz/claude-skills-collection/main/install.ps1) } openapi-contract-first -Launch"

🚀 Déjà installé ?

claude "/openapi-contract-first"

Ou tapez /openapi-contract-first dans une session Claude Code, ou décrivez simplement votre besoin — le skill se déclenche automatiquement via le skill-router.

🔑 Déclencheurs automatiques

Le skill s'active automatiquement quand votre demande contient :

OpenAPISwaggercontract firstspécification APIopenapi.yamlswagger.jsongénération de code API

📦 Installation manuelle

git clone https://github.com/khalilbenaz/claude-skills-collection.git cp -r claude-skills-collection/dev-skills/openapi-contract-first ~/.claude/skills/

Source : dev-skills/openapi-contract-first

📖 Manuel

Design API Contract-First avec OpenAPI

Workflow

  1. Définir le contrat : spécification OpenAPI (YAML/JSON) avec endpoints, schémas et exemples.
  2. Valider : vérifier la conformité du contrat (linting, breaking changes).
  3. Générer : code serveur et/ou client depuis la spec.
  4. Documenter : interface interactive pour les consommateurs de l'API.

Structure d'une spécification OpenAPI

openapi: 3.1.0
info:
  title: Payment API
  version: 1.0.0
  description: API de gestion des paiements
  contact:
    name: Équipe Paiements
    email: payments@company.com

servers:
  - url: https://api.company.com/v1
    description: Production
  - url: https://api-staging.company.com/v1
    description: Staging

paths:
  /payments:
    post:
      operationId: createPayment
      summary: Créer un paiement
      tags: [Payments]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreatePaymentRequest'
            example:
              amount: 5000
              currency: EUR
              recipient_id: usr_abc123
      responses:
        '201':
          description: Paiement créé
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Payment'
        '400':
          $ref: '#/components/responses/BadRequest'
        '422':
          $ref: '#/components/responses/UnprocessableEntity'

    get:
      operationId: listPayments
      summary: Lister les paiements
      tags: [Payments]
      parameters:
        - $ref: '#/components/parameters/PageParam'
        - $ref: '#/components/parameters/LimitParam'
        - name: status
          in: query
          schema:
            $ref: '#/components/schemas/PaymentStatus'
      responses:
        '200':
          description: Liste paginée
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaymentList'

components:
  schemas:
    CreatePaymentRequest:
      type: object
      required: [amount, currency, recipient_id]
      properties:
        amount:
          type: integer
          minimum: 1
          description: Montant en centimes
        currency:
          type: string
          enum: [EUR, USD, GBP]
        recipient_id:
          type: string
          pattern: '^usr_[a-zA-Z0-9]+$'
        metadata:
          type: object
          additionalProperties:
            type: string

    Payment:
      type: object
      properties:
        id:
          type: string
          format: uuid
        amount:
          type: integer
        currency:
          type: string
        status:
          $ref: '#/components/schemas/PaymentStatus'
        created_at:
          type: string
          format: date-time

    PaymentStatus:
      type: string
      enum: [pending, processing, completed, failed]

    PaymentList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/Payment'
        pagination:
          $ref: '#/components/schemas/Pagination'

    Pagination:
      type: object
      properties:
        page:
          type: integer
        limit:
          type: integer
        total:
          type: integer

  parameters:
    PageParam:
      name: page
      in: query
      schema:
        type: integer
        default: 1
        minimum: 1
    LimitParam:
      name: limit
      in: query
      schema:
        type: integer
        default: 20
        minimum: 1
        maximum: 100

  responses:
    BadRequest:
      description: Requête invalide
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    UnprocessableEntity:
      description: Données non traitables
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'

  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

security:
  - BearerAuth: []

Génération de code

.NET (NSwag)

# Générer le client C#
nswag openapi2csclient /input:openapi.yaml /output:PaymentApiClient.cs \
  /namespace:MyApp.ApiClients /className:PaymentApiClient

# Générer le contrôleur serveur
nswag openapi2cscontroller /input:openapi.yaml /output:PaymentController.cs \
  /namespace:MyApp.Controllers

TypeScript

# openapi-typescript
npx openapi-typescript openapi.yaml -o ./src/api/schema.d.ts

# openapi-generator
npx @openapitools/openapi-generator-cli generate \
  -i openapi.yaml -g typescript-fetch -o ./src/api/client

Validation et linting

# Spectral (linting OpenAPI)
npx @stoplight/spectral-cli lint openapi.yaml

# oasdiff (détection de breaking changes)
oasdiff breaking openapi-old.yaml openapi-new.yaml

Bonnes pratiques

Conception

Schémas

Workflow Contract-First

  1. Rédiger la spec OpenAPI avant le code
  2. Revue de la spec par les consommateurs de l'API
  3. Générer le code serveur/client depuis la spec
  4. Valider que l'implémentation est conforme au contrat
  5. Tester les breaking changes avant chaque modification

Règles