Playbook Dev × IA
Sommaire
09Chapitre 9·Variable (hands-on)·Tous niveaux

Labs pratiques

Exercices guidés par stack

NestJS, Next.js, Laravel, DevOps — applications du cycle Explore → Plan → Code → Verify avec prompts exacts.

Ce que vous saurez faire
  • 01Générer une API REST + tests avec Claude Code (NestJS)
  • 02Refactorer un composant Next.js avec Cursor
  • 03Mener une migration DB en Spec-Driven (Laravel)
  • 04Bâtir un pipeline CI avec revue IA automatisée

Lab 1 — NestJS : API REST avec Auth JWT

Durée : 2-3 h · Niveau : intermédiaire · Prérequis : NestJS installé, Module 3 lu · Livrable : module auth avec tests E2E

Setup du contexte

<!-- CLAUDE.md pour ce lab -->
# Lab NestJS Auth

## Stack
- NestJS 10, TypeScript 5.3, TypeORM + PostgreSQL 15
- Passport.js + @nestjs/jwt, class-validator
- Tests : Jest + Supertest

## Conventions
- Architecture : Module / Controller / Service / Repository
- DTOs typés (jamais d'entité retournée directement)
- Erreurs : HttpException avec messages clairs
- IMPORTANT: bcrypt avec cost ≥ 10, jamais de password en clair en mémoire après hash

Phase EXPLORE

Prompt
[ANALYSE UNIQUEMENT — PAS DE CODE] Explore la structure du projet NestJS. Identifie : 1. Les modules existants et leur organisation 2. Comment la config est gérée (ConfigModule ?) 3. La structure TypeORM (entities, migrations) 4. Si un système d'auth existe déjà, même partiel Livre un rapport de 10-15 lignes.

Phase PLAN

Prompt
Je veux une authentification JWT avec : register, login, refresh, logout, guard JWT réutilisable et une route protégée /me. Sur la base de l'exploration : génère un plan d'implémentation étape par étape. Format : Étape | Fichiers | Critère de validation. Ne génère pas de code encore.

Phase CODE

Prompt
Implémente l'étape 1 du plan. Arrête-toi après pour validation. Une fois validée, j'envoie « étape suivante » pour continuer.

Ne dicte pas la structure ligne par ligne. Le plan validé en phase précédente fait foi — la phase CODE applique ce plan, étape par étape, avec validation humaine entre chaque.

Phase VERIFY

Prompt
Agis en QA Engineer senior. Génère des tests E2E (Supertest + Jest) couvrant ces 5 scénarios essentiels : 1. Register → 201 + tokens / email déjà utilisé → 409 2. Login bon mot de passe → 200 / mauvais → 401 3. /me sans token → 401 / avec token valide → 200 4. Refresh avec token valide → nouveaux tokens 5. Logout → refresh suivant retourne 401 Utilise une DB éphémère (TypeORM avec better-sqlite3 ou PostgreSQL test container). Pas de mock d'ORM.

Lab 2 — Next.js : Refactoring avec Context Engineering

Durée : 30-45 min · Niveau : intermédiaire · Prérequis : projet Next.js existant, Module 4 lu · Livrable : composant migré Class → Functional + hooks, tests verts

Setup CLAUDE.md

# Lab Next.js Refactoring

## Stack
- Next.js 14 (App Router), TypeScript 5, React 18
- Tailwind CSS 3
- Tests : Vitest + React Testing Library
- State : Zustand (pas de Redux)

## Conventions composants
- Functional components uniquement
- Props interface (pas de type alias) : interface ButtonProps {}
- Export named uniquement (pas de default export pour les composants)
- Fichiers : ComponentName.tsx + ComponentName.test.tsx dans le même dossier

## Anti-patterns à éviter
- Pas de useEffect pour fetch (utiliser React Query ou Server Components)
- Pas de prop drilling > 2 niveaux (utiliser Zustand)
- Pas de inline styles (Tailwind uniquement)

Workflow de refactoring

Prompt
# EXPLORE [ANALYSE UNIQUEMENT] Analyse le composant @src/components/UserProfile.tsx Identifie : - Le type de composant (class ou functional ?) - Les props et leur typage actuel - L'état local et son usage - Les effets de bord - Les tests existants # PLAN Propose le plan de migration vers : - Functional component avec hooks - Props interface TypeScript stricte - Zustand si état partagé nécessaire Format : liste d'étapes avec estimations # CODE (atomique) Implémente le composant refactorisé selon le plan. Respecte STRICTEMENT les conventions du CLAUDE.md. Maintiens la même API externe (props identiques). # VERIFY Agis en QA. 1. Lance npm run test -- UserProfile 2. Si des tests échouent, identifie pourquoi 3. Génère les tests manquants pour les nouveaux hooks 4. Vérifie que l'accessibilité n'a pas régressé (aria-*)

Lab 3 — Laravel : Migration et Soft Delete

Durée : 30-45 min · Niveau : intermédiaire · Prérequis : Laravel 11 installé, Module 3 lu · Livrable : migration deleted_at, modèle SoftDeletes, tests Pest verts

# CLAUDE.md Laravel

## Stack
- Laravel 11, PHP 8.3
- Eloquent ORM + MySQL 8
- Tests : Pest (pas PHPUnit)
- API Resources pour les réponses

## Conventions
- Repository Pattern (interface + implémentation)
- Form Requests pour la validation
- API Resources pour la transformation
- Soft deletes via SoftDeletes trait Eloquent

## Commandes
php artisan serve      # Dev
php artisan test       # Tests (Pest)
php artisan migrate    # Migrations
./vendor/bin/pint      # Linter

Lab : Implémenter le soft delete sur User

Prompt
# EXPLORE Analyse le modèle User et UserRepository. Identifie : la méthode delete actuelle, les scopes existants, les relations qui pourraient être affectées, les tests existants. # PLAN Plan pour migrer vers SoftDeletes Eloquent : 1. Migration : ajouter deleted_at à users 2. Modèle : ajouter SoftDeletes trait 3. Repository : adapter les méthodes (withTrashed, onlyTrashed, restore) 4. Tests : ajouter les scénarios soft delete # CODE Étape 1 : Génère la migration Laravel pour ajouter deleted_at. Arrête et attends validation. # VERIFY (Pest) Génère des feature tests Pest : - Soft delete → user non retourné dans les queries normales - withTrashed → user visible - restore → user revient dans les queries normales - forceDelete → suppression physique - Cascade sur les relations si applicable

Lab 4 — DevOps : Pipeline CI/CD avec revue IA

Durée : 45-60 min · Niveau : intermédiaire · Prérequis : projet sur GitHub, Module 6 lu · Livrable : workflow .github/workflows/ai-review.yml avec 3 jobs (quality, ai-security-review, changelog)

Prompt
# EXPLORE Analyse le repo GitHub Actions existant si présent (.github/workflows/). Identifie les jobs actuels et ce qui manque. # PLAN Je veux un pipeline en 3 jobs : 1. quality : lint + test + coverage check (>80%) 2. ai-security-review : sur les PRs uniquement 3. changelog-update : sur merge en main uniquement Plan : quels jobs, quelles dépendances entre eux, quelles permissions. # CODE — Job par job ## Job 1 : quality Génère le workflow quality avec : - Node.js setup + cache - npm ci (pas npm install) - lint strict (exit 1 si erreurs) - test avec coverage - fail si coverage < 80% ## Job 2 : ai-security-review Voir le template du Module 6 et adapte-le pour ce projet. Ajoute la logique de posting de commentaire uniquement si problèmes trouvés. ## Job 3 : changelog Sur chaque push main, utilise Claude pour générer les notes de release depuis les commits Conventional Commits depuis le dernier tag. # VERIFY Checklist manuelle : - [ ] Secrets dans GitHub Secrets (pas dans le YAML) - [ ] Permissions minimales sur chaque job - [ ] Cache configuré pour node_modules - [ ] Jobs parallélisés quand possible - [ ] Notifications en cas d'échec

Lab 5 — Python / FastAPI : endpoint async avec SQLAlchemy 2.x

Durée : 45-60 min · Niveau : intermédiaire · Prérequis : projet FastAPI, Module 3 lu · Livrable : endpoint POST /articles async + tests pytest verts

Stack : Python 3.12, FastAPI 0.115+, SQLAlchemy 2.x async, Pydantic v2

Setup du contexte

# CLAUDE.md (extrait spécifique au lab)

## Stack
- Python 3.12, FastAPI 0.115+
- SQLAlchemy 2.x **async** uniquement (pas de Session synchrone)
- Pydantic v2 pour les schémas
- pytest + pytest-asyncio + httpx pour les tests

## Conventions
- Fichiers par feature : `app/<feature>/{router,schemas,models,service}.py`
- Routes ne contiennent JAMAIS de logique métier — tout passe par `service.py`
- Dépendances FastAPI : injection via `Depends()`, jamais de globals
- Async partout : pas de `requests`, utiliser `httpx.AsyncClient`

## Tests
- Une base SQLite en mémoire par test
- Fixtures dans `conftest.py`, factory-boy pour les seeds
- Marker `@pytest.mark.asyncio` obligatoire sur les tests async

## Anti-patterns
IMPORTANT: SQLAlchemy 2.x style uniquement (`Mapped`, `mapped_column`, `select().where()`) — pas de raw SQL ni de syntaxe v1.

Phase EXPLORE

Prompt
[ANALYSE UNIQUEMENT — PAS DE CODE] Explore la structure du projet. Identifie : 1. Comment les routes existantes sont organisées (par feature ? par couche ?) 2. Comment SQLAlchemy est initialisé (engine, sessionmaker, dépendance FastAPI) 3. Comment Pydantic est utilisé (schémas In/Out séparés ou unifiés ?) 4. Quels fixtures existent dans conftest.py Livre un rapport de 10-15 lignes.

Phase PLAN

Prompt
Je veux ajouter un endpoint `POST /api/v2/articles` qui : - Reçoit un payload `{title, body, tags: string[]}` - Crée un article en DB - Lie ou crée les tags - Retourne l'article créé avec ses tags Sur la base de ton exploration, propose un plan en étapes numérotées. Format : Étape | Fichier(s) | Action | Critère de validation. Identifie les edge cases : - Tag vide ou trop long - Tag dupliqué dans la liste - Conflit de slug si auto-généré Ne génère pas de code encore.

Phase CODE

Prompt
Implémente l'étape 1 du plan : ajout du modèle Article + relation many-to-many vers Tag. Contraintes : - SQLAlchemy 2.x style (Mapped, mapped_column) - Annotations de types complètes - Une migration Alembic auto-générée Arrête-toi après cette étape pour validation.

Phase VERIFY

Prompt
L'implémentation est terminée. Agis maintenant en QA Engineer. 1. Lance pytest sur app/articles : `pytest app/articles -v` 2. Lance le linter : `ruff check app/articles` 3. Lance mypy : `mypy app/articles` 4. Génère les tests manquants pour les edge cases identifiés en phase PLAN 5. Lance les tests modifiés et vérifie qu'ils passent 6. Lance `httpx` test contre `POST /api/v2/articles` avec 3 payloads : - Cas nominal - Payload invalide (titre vide) - Tag inexistant Rapport : tests passés | warnings ruff/mypy | tests manquants ajoutés.

Lab 6 — Production Incident Response avec Sentry MCP

Durée : 30-45 min · Niveau : senior · Prérequis : projet en prod connecté à Sentry, MCP Sentry configuré · Livrable : PR avec fix + test + post-mortem une page

Apprendre à utiliser Claude Code en mode incident commander : récupérer les infos Sentry, formuler une hypothèse, valider, proposer un fix, documenter le post-mortem.

Setup MCP

// .claude/settings.json
{
  "mcpServers": {
    "sentry": {
      "command": "npx",
      "args": ["-y", "@sentry/mcp-server"],
      "env": {
        "SENTRY_AUTH_TOKEN": "${env:SENTRY_AUTH_TOKEN}",
        "SENTRY_ORG": "my-org",
        "SENTRY_PROJECT": "api"
      }
    }
  }
}

Phase 1 — Capture

Prompt
[LECTURE SEULE] Via le MCP Sentry, cartographie le top 5 des issues non résolues des 24 dernières heures (titre, première/dernière occurrence, utilisateurs affectés, release). Pas de fix encore.

Phase 2 — Triage

Prompt
[LECTURE SEULE] Pour l'issue à plus fort impact : récupère le détail (stack trace, breadcrumbs, requête), identifie fichier:ligne, lis le code autour (max 50 lignes). Formule 2-3 hypothèses classées par probabilité, chacune avec sa méthode de validation.

Phase 3 — Fix

Prompt
On valide l'hypothèse n°1 : [description]. Fix minimal (pas de refactoring opportuniste) + test qui reproduit le bug (rouge avant fix). Vérifie que le test passe. Ne touche à aucun autre fichier.

Phase 4 — Post-mortem

Prompt
Génère le post-mortem INC-[date]-[id] avec le template Module 7 §8. Cherche le trailer `AI-Assisted:` dans le commit d'origine. Conclus par au moins une action qui modifie le contexte ou un prompt — pour que ce type de bug ne repasse plus. Une page A4 max.

Ressources complémentaires

Templates à reprendre

Le Starter Pack du playbook est sur la page dédiée /templates : un fichier de contexte (AGENTS.md) qui marche pour tous les outils, une configuration Claude Code avec des permissions sécurisées par défaut, un hook qui bloque l'écriture de fichiers contenant des secrets, et trois slash commands (/audit-security, /test-gen, /release-notes). Tout est aligné avec les modules 3, 4, 5 et 8.

Pour le reste — Skills spécialisés, serveurs MCP, agents prêts à l'emploi — le catalogue de référence est aitmpl.com. C'est un catalogue communautaire de plus de 1000 composants pour Claude Code, soutenu par Vercel, Neon et Anthropic. La page Templates signale les composants qu'on recommande spécifiquement.