docs(01): create phase 1 foundation plans
This commit is contained in:
@@ -0,0 +1,338 @@
|
||||
---
|
||||
phase: 01-foundation
|
||||
plan: 01
|
||||
type: execute
|
||||
wave: 1
|
||||
depends_on: []
|
||||
files_modified:
|
||||
- nuxt.config.ts
|
||||
- package.json
|
||||
- pnpm-lock.yaml
|
||||
- tsconfig.json
|
||||
- app/app.vue
|
||||
- shared/types/index.ts
|
||||
- .gitignore
|
||||
autonomous: true
|
||||
requirements:
|
||||
- SSR-01
|
||||
- SSR-02
|
||||
- SSR-03
|
||||
- INFRA-02
|
||||
- INFRA-03
|
||||
|
||||
must_haves:
|
||||
truths:
|
||||
- "nuxt dev demarre sans erreur et sert localhost:3000"
|
||||
- "La structure app/ est utilisee (Nuxt 4 compatibilityVersion 4)"
|
||||
- "Tous les modules sont installes dans nuxt.config.ts"
|
||||
- "TypeScript strict mode est actif"
|
||||
- "ESLint via @nuxt/eslint fonctionne sans erreur"
|
||||
artifacts:
|
||||
- path: "nuxt.config.ts"
|
||||
provides: "Configuration principale Nuxt 4 avec tous les modules"
|
||||
contains: "compatibilityVersion: 4"
|
||||
- path: "app/app.vue"
|
||||
provides: "Composant racine Nuxt"
|
||||
- path: "shared/types/index.ts"
|
||||
provides: "Interfaces TypeScript resserrees"
|
||||
exports: ["Project", "ProjectButton", "Technology", "TechStack", "Testimonial", "FAQ"]
|
||||
- path: "package.json"
|
||||
provides: "Dependances Nuxt 4 + tous modules"
|
||||
key_links:
|
||||
- from: "nuxt.config.ts"
|
||||
to: "app/app.vue"
|
||||
via: "Nuxt srcDir convention"
|
||||
pattern: "compatibilityVersion.*4"
|
||||
---
|
||||
|
||||
<objective>
|
||||
Initialiser le projet Nuxt 4 avec pnpm, installer tous les modules, configurer TypeScript strict et ESLint, et definir les interfaces TypeScript resserrees.
|
||||
|
||||
Purpose: Creer le squelette technique Nuxt 4 sur lequel toute la migration repose.
|
||||
Output: Projet Nuxt 4 fonctionnel avec `pnpm dev` qui demarre, tous modules configures, types definis.
|
||||
</objective>
|
||||
|
||||
<execution_context>
|
||||
@C:/Users/minit/.claude/get-shit-done/workflows/execute-plan.md
|
||||
@C:/Users/minit/.claude/get-shit-done/templates/summary.md
|
||||
</execution_context>
|
||||
|
||||
<context>
|
||||
@.planning/PROJECT.md
|
||||
@.planning/ROADMAP.md
|
||||
@.planning/STATE.md
|
||||
@.planning/phases/01-foundation/01-CONTEXT.md
|
||||
@.planning/phases/01-foundation/01-RESEARCH.md
|
||||
|
||||
<interfaces>
|
||||
<!-- Types existants a migrer et resserrer depuis src/types/index.ts -->
|
||||
From src/types/index.ts:
|
||||
```typescript
|
||||
export interface Project {
|
||||
id: string
|
||||
title: string
|
||||
image: string
|
||||
description: string
|
||||
longDescription?: string
|
||||
technologies?: string[]
|
||||
category?: string
|
||||
featured?: boolean
|
||||
buttons?: ProjectButton[]
|
||||
date?: string
|
||||
demoUrl?: string
|
||||
githubUrl?: string
|
||||
features?: string[]
|
||||
gallery?: string[]
|
||||
status?: string
|
||||
}
|
||||
|
||||
export interface ProjectButton {
|
||||
title: string
|
||||
link: string
|
||||
}
|
||||
|
||||
export interface Technology {
|
||||
name: string
|
||||
level: 'Beginner' | 'Intermediate' | 'Advanced'
|
||||
image: string
|
||||
}
|
||||
|
||||
export interface TechStack {
|
||||
programming: Technology[]
|
||||
front: Technology[]
|
||||
database: Technology[]
|
||||
devtools: Technology[]
|
||||
operating_systems: Technology[]
|
||||
socials: Technology[]
|
||||
}
|
||||
```
|
||||
</interfaces>
|
||||
</context>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Initialiser le projet Nuxt 4 avec pnpm et tous les modules</name>
|
||||
<files>nuxt.config.ts, package.json, pnpm-lock.yaml, app/app.vue, .gitignore, tsconfig.json</files>
|
||||
<read_first>
|
||||
- src/types/index.ts (types existants pour reference)
|
||||
- package.json (dependances actuelles Vue 3)
|
||||
- .gitignore (regles existantes)
|
||||
</read_first>
|
||||
<action>
|
||||
1. Installer pnpm globalement si absent: `npm install -g pnpm`
|
||||
2. Initialiser le projet Nuxt 4: `pnpm dlx nuxi@latest init . --force` (force car le dossier n'est pas vide). Si nuxi init ne supporte pas --force dans un repo existant, creer dans un sous-dossier temp et copier les fichiers generes.
|
||||
3. Installer tous les modules (per D-08, D-09):
|
||||
```bash
|
||||
pnpm add @nuxt/ui @nuxtjs/i18n @nuxt/eslint @nuxtjs/sitemap nuxt-gtag @nuxt/image
|
||||
```
|
||||
NOTE: Ne PAS installer @nuxtjs/color-mode — deja inclus dans @nuxt/ui.
|
||||
|
||||
4. Configurer nuxt.config.ts avec ce contenu exact:
|
||||
```typescript
|
||||
export default defineNuxtConfig({
|
||||
future: {
|
||||
compatibilityVersion: 4
|
||||
},
|
||||
ssr: true,
|
||||
modules: [
|
||||
'@nuxt/ui',
|
||||
'@nuxtjs/i18n',
|
||||
'@nuxt/eslint',
|
||||
'@nuxtjs/sitemap',
|
||||
'nuxt-gtag',
|
||||
'@nuxt/image'
|
||||
],
|
||||
typescript: {
|
||||
strict: true
|
||||
},
|
||||
i18n: {
|
||||
locales: ['fr', 'en'],
|
||||
defaultLocale: 'fr'
|
||||
},
|
||||
gtag: {
|
||||
id: 'G-CDVVNFY6MV',
|
||||
enabled: false
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
5. Creer `app/app.vue` minimal:
|
||||
```vue
|
||||
<template>
|
||||
<div>
|
||||
<NuxtRouteAnnouncer />
|
||||
<NuxtPage />
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
6. Creer `app/pages/index.vue` minimal pour que le serveur demarre sans erreur:
|
||||
```vue
|
||||
<template>
|
||||
<div>
|
||||
<h1>Portfolio Killian Dalcin</h1>
|
||||
<p>Nuxt 4 Foundation</p>
|
||||
</div>
|
||||
</template>
|
||||
```
|
||||
|
||||
7. Mettre a jour .gitignore pour inclure: `node_modules`, `.nuxt`, `.output`, `dist`, `.env`
|
||||
|
||||
8. Verifier que `pnpm dev` demarre sans erreur sur localhost:3000
|
||||
</action>
|
||||
<verify>
|
||||
<automated>cd C:/Users/minit/Desktop/portfolio/portfolio && pnpm dev --port 3000 & sleep 15 && curl -s -o /dev/null -w "%{http_code}" http://localhost:3000 | grep -q "200" && echo "PASS" || echo "FAIL"; kill %1 2>/dev/null</automated>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- nuxt.config.ts contains `compatibilityVersion: 4`
|
||||
- nuxt.config.ts contains `'@nuxt/ui'` in modules array
|
||||
- nuxt.config.ts contains `'@nuxtjs/i18n'` in modules array
|
||||
- nuxt.config.ts contains `'@nuxt/eslint'` in modules array
|
||||
- nuxt.config.ts contains `'@nuxtjs/sitemap'` in modules array
|
||||
- nuxt.config.ts contains `'nuxt-gtag'` in modules array
|
||||
- nuxt.config.ts contains `'@nuxt/image'` in modules array
|
||||
- nuxt.config.ts contains `strict: true`
|
||||
- package.json contains `@nuxt/ui` in dependencies
|
||||
- package.json contains `@nuxtjs/i18n` in dependencies
|
||||
- app/app.vue exists with NuxtPage component
|
||||
- pnpm dev starts and localhost:3000 returns HTTP 200
|
||||
</acceptance_criteria>
|
||||
<done>Projet Nuxt 4 demarre sur localhost:3000 avec tous les modules installes, TypeScript strict actif</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Definir les interfaces TypeScript resserrees et configurer ESLint</name>
|
||||
<files>shared/types/index.ts</files>
|
||||
<read_first>
|
||||
- src/types/index.ts (types existants a resserrer per D-03)
|
||||
- src/data/testimonials.ts (interface Testimonial existante)
|
||||
- src/data/faq.ts (interface FAQ existante)
|
||||
- nuxt.config.ts (verifier @nuxt/eslint present)
|
||||
</read_first>
|
||||
<action>
|
||||
1. Creer `shared/types/index.ts` avec les interfaces resserrees (per D-03 — rendre obligatoires technologies, category, date):
|
||||
|
||||
```typescript
|
||||
export interface ProjectButton {
|
||||
title: string
|
||||
link: string
|
||||
}
|
||||
|
||||
export interface Project {
|
||||
id: string
|
||||
image: string // URL /images/xxx.webp
|
||||
technologies: string[] // OBLIGATOIRE (etait optionnel)
|
||||
category: string // OBLIGATOIRE (etait optionnel)
|
||||
date: string // OBLIGATOIRE (etait optionnel)
|
||||
featured?: boolean
|
||||
buttons?: ProjectButton[]
|
||||
gallery?: string[]
|
||||
demoUrl?: string
|
||||
githubUrl?: string
|
||||
features?: string[]
|
||||
// Pas de title/description/longDescription/status — i18n via cles
|
||||
}
|
||||
|
||||
export interface Technology {
|
||||
name: string
|
||||
level: 'Beginner' | 'Intermediate' | 'Advanced'
|
||||
image: string
|
||||
}
|
||||
|
||||
export interface TechStack {
|
||||
programming: Technology[]
|
||||
front: Technology[]
|
||||
database: Technology[]
|
||||
devtools: Technology[]
|
||||
operating_systems: Technology[]
|
||||
socials: Technology[]
|
||||
}
|
||||
|
||||
export interface Testimonial {
|
||||
name: string
|
||||
role: string
|
||||
company: string
|
||||
avatar: string
|
||||
rating: number
|
||||
content: string
|
||||
date: string
|
||||
platform: string
|
||||
featured?: boolean
|
||||
project_type: string
|
||||
results?: string[]
|
||||
}
|
||||
|
||||
export interface TestimonialsStats {
|
||||
totalReviews: number
|
||||
averageRating: number
|
||||
projectsCompleted: number
|
||||
}
|
||||
|
||||
export interface FAQ {
|
||||
questionKey: string
|
||||
answerKey: string
|
||||
featuresKey: string
|
||||
}
|
||||
```
|
||||
|
||||
Note: FAQ utilise des cles i18n (per D-02) au lieu de texte direct. L'ancienne interface avait `question: string` (texte), la nouvelle a `questionKey: string` (cle de traduction).
|
||||
|
||||
2. Verifier que `pnpm nuxi typecheck` passe (les types sont auto-importes depuis shared/ en Nuxt 4).
|
||||
|
||||
3. Verifier que `pnpm eslint .` passe sans erreur (ESLint configure via @nuxt/eslint dans les modules).
|
||||
</action>
|
||||
<verify>
|
||||
<automated>cd C:/Users/minit/Desktop/portfolio/portfolio && npx nuxi typecheck 2>&1 | tail -5</automated>
|
||||
</verify>
|
||||
<acceptance_criteria>
|
||||
- shared/types/index.ts contains `technologies: string[]` (not optional)
|
||||
- shared/types/index.ts contains `category: string` (not optional)
|
||||
- shared/types/index.ts contains `date: string` (not optional, in Project interface)
|
||||
- shared/types/index.ts contains `export interface Project`
|
||||
- shared/types/index.ts contains `export interface Technology`
|
||||
- shared/types/index.ts contains `export interface TechStack`
|
||||
- shared/types/index.ts contains `export interface Testimonial`
|
||||
- shared/types/index.ts contains `export interface FAQ`
|
||||
- shared/types/index.ts contains `questionKey: string`
|
||||
- npx nuxi typecheck exits with code 0
|
||||
</acceptance_criteria>
|
||||
<done>Toutes les interfaces TypeScript resserrees existent dans shared/types/index.ts, typecheck et eslint passent sans erreur</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<threat_model>
|
||||
## Trust Boundaries
|
||||
|
||||
| Boundary | Description |
|
||||
|----------|-------------|
|
||||
| Aucune | Phase 1 est une initialisation technique sans surface d'attaque |
|
||||
|
||||
## STRIDE Threat Register
|
||||
|
||||
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|
||||
|-----------|----------|-----------|-------------|-----------------|
|
||||
| T-01-01 | I (Information Disclosure) | nuxt.config.ts | mitigate | gtag.enabled: false — pas de tracking en dev |
|
||||
| T-01-02 | T (Tampering) | pnpm dependencies | accept | lockfile pnpm-lock.yaml tracke dans git |
|
||||
</threat_model>
|
||||
|
||||
<verification>
|
||||
1. `pnpm dev` demarre sans erreur sur localhost:3000
|
||||
2. `npx nuxi typecheck` exit 0
|
||||
3. `pnpm eslint .` exit 0 (si le script existe, sinon `npx eslint .`)
|
||||
4. nuxt.config.ts contient les 6 modules et compatibilityVersion 4
|
||||
5. shared/types/index.ts exporte Project, Technology, TechStack, Testimonial, FAQ
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- Le projet Nuxt 4 demarre localement
|
||||
- Tous les modules sont installes et declares
|
||||
- TypeScript strict mode actif
|
||||
- Interfaces resserrees per D-03
|
||||
- ESLint fonctionne via @nuxt/eslint
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.planning/phases/01-foundation/01-01-SUMMARY.md`
|
||||
</output>
|
||||
Reference in New Issue
Block a user