From 93e5d4bc29a8789182920150a5f8f89f5f038d54 Mon Sep 17 00:00:00 2001 From: kayjaydee Date: Wed, 8 Apr 2026 16:26:04 +0200 Subject: [PATCH] docs(02-03): complete per-route SEO metadata plan Co-Authored-By: Claude Opus 4.6 (1M context) --- .planning/REQUIREMENTS.md | 12 ++--- .planning/ROADMAP.md | 2 +- .planning/STATE.md | 14 ++--- .../phases/02-ssr-shell/02-03-SUMMARY.md | 51 +++++++++++++++++++ 4 files changed, 66 insertions(+), 13 deletions(-) create mode 100644 .planning/phases/02-ssr-shell/02-03-SUMMARY.md diff --git a/.planning/REQUIREMENTS.md b/.planning/REQUIREMENTS.md index 16c812d..84f1464 100644 --- a/.planning/REQUIREMENTS.md +++ b/.planning/REQUIREMENTS.md @@ -27,10 +27,10 @@ ### SEO -- [ ] **SEO-01**: Chaque page a un ``, `<meta description>`, `og:title`, `og:description` uniques via `useSeoMeta()` -- [ ] **SEO-02**: La page d'accueil inclut du JSON-LD structuré (Person / CreativeWork) +- [x] **SEO-01**: Chaque page a un `<title>`, `<meta description>`, `og:title`, `og:description` uniques via `useSeoMeta()` +- [x] **SEO-02**: La page d'accueil inclut du JSON-LD structuré (Person / CreativeWork) - [x] **SEO-03**: Le sitemap.xml est généré automatiquement avec les alternates i18n (hreflang) -- [ ] **SEO-04**: Les og:image utilisent des URLs absolues et sont présentes sur chaque page +- [x] **SEO-04**: Les og:image utilisent des URLs absolues et sont présentes sur chaque page ### Pages @@ -116,10 +116,10 @@ | THEME-01 | Phase 2 | Pending | | THEME-02 | Phase 2 | Complete | | THEME-03 | Phase 2 | Complete | -| SEO-01 | Phase 2 | Pending | -| SEO-02 | Phase 2 | Pending | +| SEO-01 | Phase 2 | Complete | +| SEO-02 | Phase 2 | Complete | | SEO-03 | Phase 2 | Complete | -| SEO-04 | Phase 2 | Pending | +| SEO-04 | Phase 2 | Complete | | COMP-05 | Phase 2 | Pending | | COMP-06 | Phase 2 | Pending | | PAGE-01 | Phase 3 | Pending | diff --git a/.planning/ROADMAP.md b/.planning/ROADMAP.md index dd2e0ec..a9bfcc3 100644 --- a/.planning/ROADMAP.md +++ b/.planning/ROADMAP.md @@ -46,7 +46,7 @@ Plans: Plans: - [x] 02-01-PLAN.md — Design system, color-mode, i18n translations, sitemap config - [ ] 02-02-PLAN.md — Header, footer, default layout with nav and toggles -- [ ] 02-03-PLAN.md — Per-route SEO metadata and JSON-LD structured data +- [x] 02-03-PLAN.md — Per-route SEO metadata and JSON-LD structured data **UI hint**: yes ### Phase 3: Pages & Ship diff --git a/.planning/STATE.md b/.planning/STATE.md index 66597d8..98fb961 100644 --- a/.planning/STATE.md +++ b/.planning/STATE.md @@ -3,15 +3,15 @@ gsd_state_version: 1.0 milestone: v1.0 milestone_name: milestone status: executing -stopped_at: Completed 02-01-PLAN.md -last_updated: "2026-04-08T14:23:39.103Z" +stopped_at: Completed 02-03-PLAN.md +last_updated: "2026-04-08T14:25:59.906Z" last_activity: 2026-04-08 -- Phase 2 planning complete progress: total_phases: 3 completed_phases: 1 total_plans: 5 - completed_plans: 3 - percent: 60 + completed_plans: 4 + percent: 80 --- # Project State @@ -53,6 +53,7 @@ Progress: [░░░░░░░░░░] 0% *Updated after each plan completion* | Phase 02 P01 | 394s | 2 tasks | 6 files | +| Phase 02-ssr-shell P03 | 48s | 1 tasks | 6 files | ## Accumulated Context @@ -67,6 +68,7 @@ Recent decisions affecting current work: - Init: Static TS data files under `data/` (no @nuxt/content needed) - [Phase 02]: Brand color #85cb85 as Nuxt UI primary via CSS @theme + app.config.ts - [Phase 02]: Emojis stripped from migrated i18n translations for clean SSR +- [Phase 02-ssr-shell]: JSON-LD values hardcoded per threat model T-02-06 ### Pending Todos @@ -80,6 +82,6 @@ None yet. ## Session Continuity -Last session: 2026-04-08T14:23:39.100Z -Stopped at: Completed 02-01-PLAN.md +Last session: 2026-04-08T14:25:59.904Z +Stopped at: Completed 02-03-PLAN.md Resume file: None diff --git a/.planning/phases/02-ssr-shell/02-03-SUMMARY.md b/.planning/phases/02-ssr-shell/02-03-SUMMARY.md new file mode 100644 index 0000000..da654d7 --- /dev/null +++ b/.planning/phases/02-ssr-shell/02-03-SUMMARY.md @@ -0,0 +1,51 @@ +--- +phase: 02-ssr-shell +plan: 03 +subsystem: seo-metadata +tags: [seo, json-ld, useSeoMeta, og-tags, i18n] +dependency_graph: + requires: [02-01] + provides: [per-route-seo, json-ld-homepage, og-image-all-routes] + affects: [app/pages/] +tech_stack: + added: [] + patterns: [useSeoMeta-per-route, useHead-json-ld, reactive-i18n-seo] +key_files: + created: + - app/pages/projects.vue + - app/pages/about.vue + - app/pages/contact.vue + - app/pages/fiverr.vue + - app/pages/formation.vue + modified: + - app/pages/index.vue +decisions: + - "JSON-LD values hardcoded (not from i18n) per threat model T-02-06 — avoids injection risk" + - "ogImage uses static absolute URL per D-12 decision" +metrics: + duration: 48s + completed: 2026-04-08 +--- + +# Phase 02 Plan 03: Per-route SEO Metadata Summary + +useSeoMeta() on all 6 page stubs with localized title/description/og tags via reactive i18n getters, homepage JSON-LD with Person + ProfessionalService schema, og:image absolute URL on every route. + +## Tasks Completed + +| Task | Name | Commit | Files | +|------|------|--------|-------| +| 1 | Per-route SEO metadata on all page stubs | 0a58201 | app/pages/index.vue, projects.vue, about.vue, contact.vue, fiverr.vue, formation.vue | + +## Deviations from Plan + +None - plan executed exactly as written. + +## Verification Results + +- All 6 pages contain useSeoMeta: PASS +- index.vue contains application/ld+json: PASS +- All pages contain og-image.png absolute URL: PASS +- JSON-LD contains sameAs with LinkedIn, Fiverr, Gitea: PASS + +## Self-Check: PASSED