docs: create requirements, roadmap, and state
This commit is contained in:
@@ -0,0 +1,82 @@
|
|||||||
|
# Requirements: Portfolio Killian' Dalcin
|
||||||
|
|
||||||
|
**Defined:** 2026-04-10
|
||||||
|
**Core Value:** Positionner Killian comme dev Hytale #1, crawlable sans JS, SEO optimise
|
||||||
|
|
||||||
|
## v1 Requirements
|
||||||
|
|
||||||
|
### Content
|
||||||
|
|
||||||
|
- [ ] **CONT-01**: Refonte Hero accueil — "Hytale Plugin Developer" en H1, CTA Discord/contact, bilingue
|
||||||
|
- [ ] **CONT-02**: Page Hytale dediee `/hytale` — services plugin dev, tiers pricing, demos placeholders, maintenance recurrente, bilingue
|
||||||
|
- [ ] **CONT-03**: Grille tarifaire — plugin simple/complexe/sur-mesure/maintenance/web avec prix visibles
|
||||||
|
- [ ] **CONT-04**: Temoignages — section featured + stats sur homepage et page Hytale (5 avis Fiverr existants)
|
||||||
|
|
||||||
|
### SEO
|
||||||
|
|
||||||
|
- [ ] **SEO-01**: Canonical links — `<link rel="canonical">` sur chaque page pour eviter duplication i18n
|
||||||
|
- [ ] **SEO-02**: ogUrl par page — chaque `useSeoMeta()` inclut `ogUrl` specifique
|
||||||
|
- [ ] **SEO-03**: og:image par page — images distinctes au lieu du meme og-image.png partout
|
||||||
|
- [ ] **SEO-04**: JSON-LD complet — Person (homepage), Service (hytale), SoftwareApplication (projets), composable `useJsonLd.ts`
|
||||||
|
- [ ] **SEO-05**: jobTitle corrige — "Hytale Plugin Developer" dans site.ts et JSON-LD, pas "Full Stack Freelance"
|
||||||
|
|
||||||
|
### i18n
|
||||||
|
|
||||||
|
- [ ] **I18N-01**: Audit complet FR/EN — chaque cle FR doit exister en EN avec traduction reelle
|
||||||
|
- [ ] **I18N-02**: Qualite traductions FR — reformuler les traductions approximatives/anglicismes
|
||||||
|
- [ ] **I18N-03**: Hardcoded strings — eliminer toutes les chaines en dur dans les composants (HeroSection, error.vue)
|
||||||
|
- [ ] **I18N-04**: SEO keys Hytale — title/description/og specifiques pour la page Hytale en FR et EN
|
||||||
|
|
||||||
|
### Fixes
|
||||||
|
|
||||||
|
- [ ] **FIX-01**: Supprimer `public/sitemap.xml` statique — conflit avec `@nuxtjs/sitemap` dynamique
|
||||||
|
- [ ] **FIX-02**: Dockerfile pnpm — remplacer `npm ci` par `pnpm install --frozen-lockfile`
|
||||||
|
- [ ] **FIX-03**: Rate limiting contact API — protection anti-spam in-memory sur `/api/contact`
|
||||||
|
- [ ] **FIX-04**: Donnees incoherentes — `reviewCount: '50'` vs `totalReviews: 10`, Fiverr URLs `#`
|
||||||
|
- [ ] **FIX-05**: Pinning deps — `vue: "latest"` et `vue-router: "latest"` a pincer sur `^3.5.0` / `^4.5.0`
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
|
||||||
|
- [ ] **DEPLOY-01**: Dockerfile production corrige — pnpm, node:22-alpine, env vars SMTP/gtag runtime
|
||||||
|
|
||||||
|
## v2 Requirements
|
||||||
|
|
||||||
|
- **CONT-05**: Blog technique — articles Hytale plugin dev pour SEO long-tail
|
||||||
|
- **SEO-06**: og:image dynamique generee par page
|
||||||
|
- **FEAT-01**: Formulaire devis en ligne
|
||||||
|
- **FEAT-02**: Section portfolio Minecraft Java
|
||||||
|
|
||||||
|
## Out of Scope
|
||||||
|
|
||||||
|
| Feature | Reason |
|
||||||
|
|---------|--------|
|
||||||
|
| Tests automatises | Ship d'abord, tests ensuite |
|
||||||
|
| Blog/CMS | Pas de contenu dynamique pour l'instant |
|
||||||
|
| Dashboard admin | Portfolio statique |
|
||||||
|
| PWA/Service Workers | Pas de besoin offline |
|
||||||
|
| Pub payante | Budget zero |
|
||||||
|
| Payment integration | Paiements via Fiverr ou virement |
|
||||||
|
|
||||||
|
## Traceability
|
||||||
|
|
||||||
|
| Requirement | Phase | Status |
|
||||||
|
|-------------|-------|--------|
|
||||||
|
| CONT-01 | TBD | Pending |
|
||||||
|
| CONT-02 | TBD | Pending |
|
||||||
|
| CONT-03 | TBD | Pending |
|
||||||
|
| CONT-04 | TBD | Pending |
|
||||||
|
| SEO-01 | TBD | Pending |
|
||||||
|
| SEO-02 | TBD | Pending |
|
||||||
|
| SEO-03 | TBD | Pending |
|
||||||
|
| SEO-04 | TBD | Pending |
|
||||||
|
| SEO-05 | TBD | Pending |
|
||||||
|
| I18N-01 | TBD | Pending |
|
||||||
|
| I18N-02 | TBD | Pending |
|
||||||
|
| I18N-03 | TBD | Pending |
|
||||||
|
| I18N-04 | TBD | Pending |
|
||||||
|
| FIX-01 | TBD | Pending |
|
||||||
|
| FIX-02 | TBD | Pending |
|
||||||
|
| FIX-03 | TBD | Pending |
|
||||||
|
| FIX-04 | TBD | Pending |
|
||||||
|
| FIX-05 | TBD | Pending |
|
||||||
|
| DEPLOY-01 | TBD | Pending |
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# Roadmap: Portfolio Killian' Dalcin
|
||||||
|
|
||||||
|
**Milestone:** M1 — Portfolio Hytale-first, SEO-ready, production
|
||||||
|
**Granularity:** Coarse
|
||||||
|
**Coverage:** 19/19 requirements mapped
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phases
|
||||||
|
|
||||||
|
- [ ] **Phase 1: Cleanup & Fixes** - Sitemap conflit, Dockerfile pnpm, deps pinning, donnees incoherentes, rate limiting
|
||||||
|
- [ ] **Phase 2: Content** - Hero Hytale, page Hytale, pricing, temoignages, jobTitle
|
||||||
|
- [ ] **Phase 3: SEO & i18n** - Canonical, ogUrl, og:image, JSON-LD, audit i18n, traductions
|
||||||
|
- [ ] **Phase 4: Ship** - Dockerfile final, verification production, deploy
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase Details
|
||||||
|
|
||||||
|
### Phase 1: Cleanup & Fixes
|
||||||
|
**Goal**: Le codebase est propre — pas de conflits de config, deps pinees, contact form protege, donnees coherentes
|
||||||
|
**Depends on**: Nothing
|
||||||
|
**Requirements**: FIX-01, FIX-02, FIX-03, FIX-04, FIX-05, DEPLOY-01
|
||||||
|
**Success Criteria** (what must be TRUE):
|
||||||
|
1. `public/sitemap.xml` supprime — `curl localhost:3000/sitemap.xml` retourne le sitemap dynamique genere par `@nuxtjs/sitemap`
|
||||||
|
2. `Dockerfile` utilise `pnpm install --frozen-lockfile` — `docker build` reussit sans npm
|
||||||
|
3. `package.json` ne contient ni `"latest"` ni `"*"` dans les deps
|
||||||
|
4. `siteConfig.seo.organization.aggregateRating.reviewCount` correspond a `testimonials.totalReviews`
|
||||||
|
5. 10 requetes POST rapides sur `/api/contact` → les dernieres sont rejetees (rate limit)
|
||||||
|
**Plans**: TBD
|
||||||
|
|
||||||
|
### Phase 2: Content
|
||||||
|
**Goal**: Un visiteur comprend immediatement que Killian est dev Hytale, peut voir les services/prix, et lire des temoignages clients
|
||||||
|
**Depends on**: Phase 1
|
||||||
|
**Requirements**: CONT-01, CONT-02, CONT-03, CONT-04, SEO-05
|
||||||
|
**Success Criteria** (what must be TRUE):
|
||||||
|
1. Le H1 de la homepage contient "Hytale" — `curl localhost:3000 | grep -i hytale` dans le `<h1>`
|
||||||
|
2. `/hytale` existe avec 3+ tiers de pricing visibles et un CTA contact/Discord
|
||||||
|
3. `app/data/site.ts` contient `jobTitle: 'Hytale Plugin Developer'`
|
||||||
|
4. Les temoignages apparaissent sur la homepage ET la page Hytale
|
||||||
|
5. Tout le contenu est bilingue — `curl localhost:3000/en/hytale` retourne du contenu anglais
|
||||||
|
**Plans**: TBD
|
||||||
|
**UI hint**: yes
|
||||||
|
|
||||||
|
### Phase 3: SEO & i18n
|
||||||
|
**Goal**: Chaque page a des meta tags complets, JSON-LD, canonical links, et des traductions FR/EN naturelles et completes
|
||||||
|
**Depends on**: Phase 2
|
||||||
|
**Requirements**: SEO-01, SEO-02, SEO-03, SEO-04, I18N-01, I18N-02, I18N-03, I18N-04
|
||||||
|
**Success Criteria** (what must be TRUE):
|
||||||
|
1. `curl localhost:3000` retourne `<link rel="canonical">` et `ogUrl` dans le HTML
|
||||||
|
2. `curl localhost:3000/hytale` retourne un JSON-LD `Service` avec les 3 tiers
|
||||||
|
3. `curl localhost:3000/en/` retourne du HTML anglais sans hardcoded French strings
|
||||||
|
4. Aucun composant ne contient de chaine en dur (grep pour strings hors `t()` dans les templates)
|
||||||
|
5. Les traductions FR sonnent naturel — pas de calque anglais
|
||||||
|
**Plans**: TBD
|
||||||
|
|
||||||
|
### Phase 4: Ship
|
||||||
|
**Goal**: Le site est deployable en production via Docker et passe tous les checks
|
||||||
|
**Depends on**: Phase 3
|
||||||
|
**Requirements**: DEPLOY-01
|
||||||
|
**Success Criteria** (what must be TRUE):
|
||||||
|
1. `docker build` complete sans erreur
|
||||||
|
2. Le container sert le site SSR sur le port attendu
|
||||||
|
3. `pnpm typecheck` et `pnpm lint` passent avec 0 erreurs
|
||||||
|
4. `curl` sur chaque page retourne `<title>`, `<meta description>`, `og:title` dans le HTML brut
|
||||||
|
**Plans**: TBD
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Progress
|
||||||
|
|
||||||
|
| Phase | Plans Complete | Status | Completed |
|
||||||
|
|-------|----------------|--------|-----------|
|
||||||
|
| 1. Cleanup & Fixes | 0/? | Not started | - |
|
||||||
|
| 2. Content | 0/? | Not started | - |
|
||||||
|
| 3. SEO & i18n | 0/? | Not started | - |
|
||||||
|
| 4. Ship | 0/? | Not started | - |
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
---
|
||||||
|
gsd_state_version: 1.0
|
||||||
|
milestone: v1.0
|
||||||
|
milestone_name: Portfolio Hytale-first
|
||||||
|
status: planning
|
||||||
|
last_updated: "2026-04-10"
|
||||||
|
last_activity: 2026-04-10 -- Project initialized with research
|
||||||
|
progress:
|
||||||
|
total_phases: 4
|
||||||
|
completed_phases: 0
|
||||||
|
total_plans: 0
|
||||||
|
completed_plans: 0
|
||||||
|
percent: 0
|
||||||
|
---
|
||||||
|
|
||||||
|
# Project State
|
||||||
|
|
||||||
|
## Project Reference
|
||||||
|
- PROJECT.md: .planning/PROJECT.md
|
||||||
|
- REQUIREMENTS.md: .planning/REQUIREMENTS.md
|
||||||
|
- ROADMAP.md: .planning/ROADMAP.md
|
||||||
|
|
||||||
|
## Current Focus
|
||||||
|
Phase 1: Cleanup & Fixes — ready for planning
|
||||||
|
|
||||||
|
## Session Notes
|
||||||
|
- Project initialized 2026-04-10 with codebase mapping + 4-agent research
|
||||||
|
- Brownfield: Nuxt 4 SSR portfolio already functional, needs content pivot to Hytale + SEO fixes
|
||||||
Reference in New Issue
Block a user