Foundation SEO Blog shipped — nuxt-schema-org installed, blog schema extended with updated field, global Person/WebSite schema.org emitted SSR, sitemap.sources wired to future Nitro endpoint (07-04).
6.0 KiB
phase, plan, subsystem, tags, status, completed, requirements, dependency_graph, tech_stack, key_files, decisions, metrics
| phase | plan | subsystem | tags | status | completed | requirements | dependency_graph | tech_stack | key_files | decisions | metrics | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 07-seo-blog | 01 | seo-infrastructure |
|
shipped | 2026-04-22 |
|
|
|
|
|
|
Phase 7 Plan 1 : Foundation SEO Blog — Summary
One-liner : Module nuxt-schema-org installé + identité Person/WebSite Killian globale + schema Zod blog étendu avec updated + sitemap.sources branché sur endpoint Nitro futur.
Ce qui a été fait
Task 1 — chore(07-01) (commit 17420af)
pnpm add -D nuxt-schema-org@^6.0.4content.config.ts: ajoutupdated: z.string().optional()entredateettagsdansblogSchema(partagéblog_fr+blog_en)- Caches
node_modules/.cache/content+.nuxtvidés (Pitfall 8 research — forcer la re-ingestion) pnpm typecheckexit 0
Task 2 — feat(07-01) (commit 654842b)
nuxt.config.ts:'nuxt-schema-org'ajouté dansmodules[]juste après'@nuxtjs/sitemap'; nouveau blocsitemap: { sources: ['/api/__sitemap__/urls'] }au même niveau d'indentation quesite/i18napp/utils/seo-person.tscréé : exporteKILLIAN_PERSON_ID = '#killian'etkillianPerson(dérivé desiteConfig—sameAsfiltre l'entréeEmail)app/app.vue: append (pas de remplacement) d'un blocuseSchemaOrg([definePerson(killianPerson), defineWebSite({ name, inLanguage: ['fr-FR','en-US'] })])après leuseHeadexistantpnpm typecheckexit 0- Validation SSR curl :
curl http://localhost:3001/frrenvoie bien un<script type="application/ld+json" data-nuxt-schema-org="true">contenant@type: Person(id se terminant par#killian) +@type: WebSite+@type: WebPageauto-attaché par le module
Deviations from Plan
None critical. Deux points de friction mineurs rencontrés & résolus sans changer le plan :
- Port :
pnpm dev --port 3000a basculé automatiquement sur 3001 (port 3000 déjà occupé). Non-bloquant — validation faite sur 3001. - @id Person : le module
nuxt-schema-orgpréfixe l'@idfourni (#killian) par la route canonique du site (résultat final :https://killiandalcin.fr/#/schema/person/#killian). Comportement attendu du module et cohérent avec la spec schema.org — le fragment#killianreste identifiable en suffixe, ce qui suffit aux références inter-entités (author/publisher) dans les plans Wave 2 via la forme{ '@id': '#killian' }(le module résout le préfixe tout seul).
Acceptance Criteria — tous passés
grep "'nuxt-schema-org'" nuxt.config.ts— match ligne 12grep "sources.*__sitemap__/urls" nuxt.config.ts— match bloc sitemapgrep "updated: z.string().optional()" content.config.ts— match ligne 7curl http://localhost:3001/frémet JSON-LD global Person (@id suffixe#killian) + WebSite + WebPage, en SSR pur (aucun JS client requis — détection<script type="application/ld+json">directement dans le HTML renvoyé)pnpm typecheckexit 0 (sortie clean, seulement banners Nuxt Icon)
Known Stubs
Aucun. Le seul placeholder explicitement déclaré (sitemap.sources: ['/api/__sitemap__/urls']) référence un endpoint Nitro qui sera implémenté par le Plan 07-04 (ownership clair, documenté dans dependency_graph).
Threat Flags
Aucun nouveau surface de menace introduit. Le module nuxt-schema-org ^6.0.4 figé en devDependency + pnpm-lock.yaml commité mitige T-07-01 (Tampering supply chain). T-07-02 (IDisclo Person public) accepté — URLs du sameAs déjà publiques, l'email est explicitement filtré du sameAs dans seo-person.ts (filter((s) => s.name !== 'Email')).
Self-Check: PASSED
app/utils/seo-person.ts— FOUND- Commit
17420af(chore Task 1) — FOUND in git log - Commit
654842b(feat Task 2) — FOUND in git log - Validation SSR JSON-LD — confirmée via curl (Person @id=#killian + WebSite + WebPage émis avant hydratation)