9.2 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous, requirements, must_haves
| phase | plan | type | wave | depends_on | files_modified | autonomous | requirements | must_haves | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 07-seo-blog | 01 | execute | 1 |
|
true |
|
|
Purpose: Aucun des plans Wave 2 ne peut fonctionner sans (a) le module nuxt-schema-org présent dans modules[], (b) le champ updated queryable, (c) l'identité Person disponible par @id global, (d) sitemap.sources wiré.
Output: package installé, 1 fichier utilitaire créé, 3 fichiers config/racine modifiés.
<execution_context> @$HOME/.claude/get-shit-done/workflows/execute-plan.md @$HOME/.claude/get-shit-done/templates/summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/STATE.md @.planning/phases/07-seo-blog/07-CONTEXT.md @.planning/phases/07-seo-blog/07-RESEARCH.md @.planning/phases/07-seo-blog/07-PATTERNS.md @nuxt.config.ts @content.config.ts @app/app.vue @app/data/site.ts Depuis app/data/site.ts : - `siteConfig.url` = 'https://killiandalcin.fr' - `siteConfig.social` = tableau avec entrées Gitea, LinkedIn, Discord, Email (reprendre `url` pour `sameAs`)Depuis content.config.ts (existant) :
const blogSchema = z.object({
title: z.string(),
description: z.string(),
date: z.string(),
tags: z.array(z.string()).optional(),
image: z.string().optional(), // DÉJÀ présent (D-14 #2 = no-op)
draft: z.boolean().optional().default(false),
wordCount: z.number().optional(),
minutes: z.number().optional(),
})
Depuis app/app.vue (existant) : useHead + useLocaleHead({ seo: true }) — NE PAS remplacer, APPEND.
Auto-imports nuxt-schema-org (une fois module ajouté) : useSchemaOrg, definePerson, defineWebSite, defineArticle, defineBreadcrumb, defineWebPage.
export const KILLIAN_PERSON_ID = '#killian'
export const killianPerson = {
'@id': KILLIAN_PERSON_ID,
name: "Killian' Dal-Cin",
url: siteConfig.url,
jobTitle: siteConfig.jobTitle,
sameAs: siteConfig.social
.filter((s) => s.name !== 'Email')
.map((s) => s.url),
} as const
```
3. **app/app.vue** : APPEND (ne pas remplacer) après le bloc `useHead({...})` existant, AVANT la fermeture `</script>` :
```ts
import { killianPerson } from '~/utils/seo-person'
useSchemaOrg([
definePerson(killianPerson),
defineWebSite({
name: "Killian' Dal-Cin — Hytale Plugin Developer",
inLanguage: ['fr-FR', 'en-US'],
}),
])
```
Ne pas toucher au `<template>` ni au `useLocaleHead`/`useHead` existants.
grep -q "'nuxt-schema-org'" nuxt.config.ts && grep -q "/api/__sitemap__/urls" nuxt.config.ts && grep -q "KILLIAN_PERSON_ID" app/utils/seo-person.ts && grep -q "definePerson(killianPerson)" app/app.vue && pnpm typecheck && pnpm dev --port 3000 & sleep 10 && curl -s http://localhost:3000/ | grep -q '"@type":"Person"' && kill %1
Module chargé sans erreur ; `curl /` contient un `<script type="application/ld+json">` avec `"@type":"Person"` et `"@id":"#killian"` émis en SSR ; typecheck vert.
<threat_model>
Trust Boundaries
| Boundary | Description |
|---|---|
| build → runtime | Dépendance npm (nuxt-schema-org) introduite dans le supply chain — version figée ^6.0.4 |
STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|---|---|---|---|---|
| T-07-01 | Tampering | package.json (nouveau module) | mitigate | Version explicite ^6.0.4 + pnpm-lock.yaml committé, intégrité pnpm |
| T-07-02 | Information Disclosure | schema.org Person (exposition URLs publiques) | accept | URLs déjà publiques (portfolio freelance), email exclu de sameAs |
| </threat_model> |
<success_criteria>
nuxt-schema-orginstallé (^6.0.4), lockfile à jourupdatedqueryable (Zod) — un article avecupdated:frontmatter sera exposé parqueryCollection(...).select('updated')curl /émet JSON-LD global avec Person (@id=#killian) + WebSite, en SSR purnuxt.config.ts > sitemap.sourcesdéclaré (l'endpoint sera créé 07-04) </success_criteria>