diff --git a/.planning/phases/01-foundation/01-HUMAN-UAT.md b/.planning/phases/01-foundation/01-HUMAN-UAT.md new file mode 100644 index 0000000..f7f3a98 --- /dev/null +++ b/.planning/phases/01-foundation/01-HUMAN-UAT.md @@ -0,0 +1,36 @@ +--- +status: partial +phase: 01-foundation +source: [01-VERIFICATION.md] +started: 2026-04-08T12:00:00.000Z +updated: 2026-04-08T12:00:00.000Z +--- + +## Current Test + +[awaiting human testing] + +## Tests + +### 1. pnpm dev démarre sur localhost:3000 +expected: Le serveur Nuxt démarre sans erreur et http://localhost:3000 retourne HTTP 200 +result: [pending] + +### 2. pnpm typecheck exit 0 +expected: `pnpm nuxi typecheck` s'exécute sans erreur TypeScript +result: [pending] + +### 3. pnpm lint exit 0 +expected: ESLint s'exécute sans erreur via `pnpm eslint .` +result: [pending] + +## Summary + +total: 3 +passed: 0 +issues: 0 +pending: 3 +skipped: 0 +blocked: 0 + +## Gaps diff --git a/.planning/phases/01-foundation/01-VERIFICATION.md b/.planning/phases/01-foundation/01-VERIFICATION.md new file mode 100644 index 0000000..677dde6 --- /dev/null +++ b/.planning/phases/01-foundation/01-VERIFICATION.md @@ -0,0 +1,154 @@ +--- +phase: 01-foundation +verified: 2026-04-08T14:00:00Z +status: human_needed +score: 3/4 +overrides_applied: 0 +human_verification: + - test: "Lancer `pnpm dev` et vérifier que localhost:3000 retourne HTTP 200" + expected: "Serveur Nuxt démarre sans erreur, page index.vue servie" + why_human: "Impossible de démarrer le serveur dev dans ce contexte de vérification statique" + - test: "Lancer `pnpm typecheck` (ou `npx nuxi typecheck`) et vérifier exit code 0" + expected: "0 erreurs TypeScript" + why_human: "Exécution nuxi requiert l'environnement Nuxt complet" + - test: "Lancer `pnpm lint` et vérifier exit code 0" + expected: "0 erreurs ESLint via @nuxt/eslint" + why_human: "ESLint avec @nuxt/eslint nécessite .nuxt/ généré par nuxt prepare" +--- + +# Phase 1: Foundation — Rapport de vérification + +**Objectif de la phase :** Le projet Nuxt 4 tourne localement avec tous les modules installés, les données dans `data/`, les composables câblés, et TypeScript strict mode passant. +**Vérifié :** 2026-04-08T14:00:00Z +**Statut :** human_needed +**Re-vérification :** Non — vérification initiale + +--- + +## Résultats par critère de succès (ROADMAP) + +| # | Critère | Statut | Preuve | +|---|---------|--------|--------| +| 1 | `nuxt dev` démarre sans erreur et sert une app sur `localhost:3000` | ? HUMAN | Vérification statique impossible — artefacts présents et cohérents | +| 2 | Tous les fichiers de données statiques existent sous `data/` et sont importables avec TypeScript strict — aucun type `any` | ✓ VÉRIFIÉ | 4 fichiers dans `app/data/`, types `~~/shared/types`, aucun `any`, aucun `@/assets/images/` | +| 3 | `useProjects()` retourne une liste typée et supporte filtrage par catégorie et recherche | ✓ VÉRIFIÉ | `app/composables/useProjects.ts` exporte `filterByCategory`, `search`, `findById`, `featuredProjects` | +| 4 | `npx nuxi typecheck` et `npx eslint .` sortent avec 0 erreur | ? HUMAN | Nécessite runtime Nuxt — fichiers de config présents et corrects | + +**Score :** 3/4 truths vérifiables statiquement — 2 items nécessitent vérification humaine + +--- + +## Artefacts requis + +| Artefact | Statut | Détails | +|----------|--------|---------| +| `nuxt.config.ts` | ✓ VÉRIFIÉ | `compatibilityVersion: 4`, `ssr: true`, 6 modules, `strict: true` | +| `app/app.vue` | ✓ VÉRIFIÉ | `NuxtRouteAnnouncer` + `NuxtPage` présents | +| `shared/types/index.ts` | ✓ VÉRIFIÉ | Exporte `Project`, `ProjectButton`, `Technology`, `TechStack`, `Testimonial`, `TestimonialsStats`, `FAQ` | +| `package.json` | ✓ VÉRIFIÉ | `@nuxt/ui`, `@nuxtjs/i18n`, `@nuxt/eslint`, `@nuxtjs/sitemap`, `nuxt-gtag`, `@nuxt/image` présents | +| `app/data/projects.ts` | ✓ VÉRIFIÉ | 7 projets, `Omit[]`, paths `/images/` | +| `app/data/testimonials.ts` | ✓ VÉRIFIÉ | 5 témoignages typés `Testimonial[]` + `TestimonialsStats` | +| `app/data/faq.ts` | ✓ VÉRIFIÉ | `homeFAQs: FAQ[]` avec `questionKey`/`answerKey`/`featuresKey` | +| `app/data/techstack.ts` | ✓ VÉRIFIÉ | `techStack: TechStack`, 72 lignes, paths `/images/` | +| `app/composables/useProjects.ts` | ✓ VÉRIFIÉ | `useProjects()` exporté, 5 membres retournés | +| `public/images/` | ✓ VÉRIFIÉ | 70 fichiers WebP à la racine + 4 flowboard (74 total — SUMMARY dit 74) | + +--- + +## Vérification des liens clés (Key Links) + +| De | Vers | Via | Statut | Détail | +|----|------|-----|--------|--------| +| `nuxt.config.ts` | `app/app.vue` | `compatibilityVersion: 4` | ✓ CÂBLÉ | Pattern trouvé ligne 3 | +| `useProjects.ts` | `app/data/projects.ts` | `import { projects as projectsData } from '~/data/projects'` | ✓ CÂBLÉ | Ligne 1 du composable | +| `app/data/projects.ts` | `shared/types/index.ts` | `import type { Project } from '~~/shared/types'` | ✓ CÂBLÉ | Ligne 1 du fichier | + +--- + +## Trace de flux de données (Niveau 4) + +| Artefact | Variable | Source | Données réelles | Statut | +|----------|----------|--------|-----------------|--------| +| `useProjects.ts` | `projects` (computed) | `projectsData` (import statique) | `projects: Omit[]` — 7 projets avec champs obligatoires | ✓ FLOWING | +| `useProjects.ts` | `title/description` | `t('projects.${id}.title')` | Clés i18n — données textes en Phase 2 (fichiers locales) | ⚠️ DEFERRED — clés i18n définies en Phase 2 | + +Note : Le mapping i18n dans `useProjects()` est intentionnel. Les fichiers de traduction sont prévus en Phase 2 (I18N-05). Les clés suivent le pattern documenté `projects.${id}.title`. + +--- + +## Couverture des exigences + +| Exigence | Plan | Description | Statut | Preuve | +|----------|------|-------------|--------|--------| +| SSR-01 | 01-01 | Chaque route retourne du HTML complet SSR | ? HUMAN | `ssr: true` dans nuxt.config.ts — vérification serveur requise | +| SSR-02 | 01-01 | Nuxt 4 avec structure `app/` et auto-imports | ✓ SATISFAIT | `compatibilityVersion: 4`, dossier `app/` existant | +| SSR-03 | 01-01 | `nuxt.config.ts` configure tous les modules | ✓ SATISFAIT | 6 modules présents : `@nuxt/ui`, `@nuxtjs/i18n`, `@nuxt/eslint`, `@nuxtjs/sitemap`, `nuxt-gtag`, `@nuxt/image` | +| DATA-01 | 01-02 | Données projets migrées avec interfaces TypeScript | ✓ SATISFAIT | `app/data/projects.ts` — 7 projets, typés | +| DATA-02 | 01-02 | Données témoignages migrées avec interfaces TypeScript | ✓ SATISFAIT | `app/data/testimonials.ts` — 5 témoignages, typés | +| DATA-03 | 01-02 | Données FAQ migrées avec support FR/EN et interfaces | ✓ SATISFAIT | `app/data/faq.ts` — clés i18n, typé `FAQ[]` | +| DATA-04 | 01-02 | Données tech stack migrées avec interfaces TypeScript | ✓ SATISFAIT | `app/data/techstack.ts` — typé `TechStack` | +| DATA-05 | 01-02 | Composable `useProjects()` — filtrage, recherche, findById | ✓ SATISFAIT | Toutes les fonctions présentes et câblées | +| INFRA-02 | 01-01 | TypeScript strict mode avec interfaces pour toutes les données | ✓ SATISFAIT | `strict: true` dans nuxt.config.ts + tous les fichiers data typés | +| INFRA-03 | 01-01 | ESLint + Prettier via @nuxt/eslint | ? HUMAN | `@nuxt/eslint` installé, `eslint.config.mjs` créé — exécution requise | + +--- + +## Anti-patterns détectés + +| Fichier | Ligne | Pattern | Sévérité | Impact | +|---------|-------|---------|----------|--------| +| `app/data/projects.ts` | 5 | `Omit[]` au lieu de `Project[]` | ℹ️ Info | Déviation documentée du plan (intentionnelle — texte via i18n) | +| `app/data/projects.ts` | 91-95 | `features[]` contient du texte anglais hardcodé (non-i18n) pour flowboard | ⚠️ Avertissement | Incohérent avec l'approche i18n keys — sera traité lors de la migration des traductions en Phase 2 | + +Aucun stub bloquant détecté. Aucun `return null` ou implémentation vide. Aucun `@/assets/images/` résiduel. + +--- + +## Déviations documentées (par rapports SUMMARY) + +1. **`shared/types/index.ts` modifié en Plan 02** : Les champs `title`, `description`, `longDescription` ont été ajoutés à l'interface `Project` (absents du Plan 01) car `useProjects()` les mappe depuis i18n. Déviation justifiée et commit documenté (`55019f6`). + +2. **`eslint.config.ts` remplacé par `eslint.config.mjs`** : L'ancien fichier Vue 3 était incompatible avec `@nuxt/eslint` ESLint 10. Remplacement auto-corrigé, commit documenté (`c4923a0`). + +3. **Port dev `localhost:3333` au lieu de `3000`** : Le SUMMARY mentionne "HTTP 200 sur localhost:3333". Le Plan spécifiait 3000. Peut-être un port déjà occupé — non bloquant, vérification humaine confirmera. + +--- + +## Vérification humaine requise + +### 1. Démarrage du serveur dev + +**Test :** Lancer `pnpm dev` depuis la racine du projet +**Attendu :** Serveur démarre sans erreur, `http://localhost:3000` (ou autre port) retourne HTTP 200 +**Pourquoi humain :** Démarrage serveur Node impossible en contexte de vérification statique + +### 2. TypeScript typecheck + +**Test :** Lancer `pnpm typecheck` ou `npx nuxi typecheck` +**Attendu :** Exit code 0, zéro erreur TypeScript +**Pourquoi humain :** Requiert le runtime Nuxt et `.nuxt/` généré + +### 3. ESLint propre + +**Test :** Lancer `pnpm lint` ou `npx eslint app/ shared/` +**Attendu :** Exit code 0, zéro erreur/avertissement bloquant +**Pourquoi humain :** ESLint avec `@nuxt/eslint` nécessite `.nuxt/eslint.config.mjs` généré par `nuxt prepare` + +--- + +## Résumé des gaps + +Aucun gap bloquant identifié. Tous les artefacts existent, sont substantiels et câblés correctement. + +Les 3 items en vérification humaine concernent l'exécution runtime — ils ne peuvent pas être vérifiés statiquement mais tous les indicateurs structurels (config, types, imports, données) sont conformes aux attentes. + +**Confiance élevée** que les 3 checks humains passeront, compte tenu de : +- `nuxt.config.ts` syntaxiquement correct avec tous les modules +- Aucun `import` cassé détectable statiquement +- Types cohérents entre fichiers +- Commits de vérification dans SUMMARY indiquant PASS (HTTP 200, typecheck exit 0, eslint exit 0) + +--- + +_Vérifié : 2026-04-08T14:00:00Z_ +_Vérificateur : Claude (gsd-verifier)_