docs(02): create phase 2 content plans

This commit is contained in:
2026-04-11 03:58:21 +02:00
parent 710692f0ae
commit 215fba6342
4 changed files with 756 additions and 2 deletions
+268
View File
@@ -0,0 +1,268 @@
---
phase: 02-content
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- shared/types/index.ts
- app/data/site.ts
- app/data/testimonials.ts
- app/data/pricing.ts
- i18n/locales/fr.json
- i18n/locales/en.json
autonomous: true
requirements: [CONT-01, CONT-02, CONT-03, CONT-04, SEO-05]
must_haves:
truths:
- "PricingTier and jobTitle types exist in shared/types/index.ts"
- "site.ts has jobTitle 'Hytale Plugin Developer' and title updated per D-20"
- "testimonials.ts has totalReviews 5 and 3 featured testimonials"
- "pricing.ts has 5 tiers with correct price data"
- "fr.json and en.json have all hytale.*, home.*, nav.hytale keys"
artifacts:
- path: "shared/types/index.ts"
provides: "PricingTier interface, jobTitle on SiteConfig"
contains: "PricingTier"
- path: "app/data/pricing.ts"
provides: "5 pricing tiers for Hytale page"
contains: "hytalePricing"
- path: "app/data/site.ts"
provides: "Updated title and jobTitle"
contains: "Hytale Plugin Developer"
- path: "app/data/testimonials.ts"
provides: "Corrected stats and featured flags"
contains: "totalReviews: 5"
- path: "i18n/locales/fr.json"
provides: "All French i18n keys for phase 2"
contains: "hytale"
- path: "i18n/locales/en.json"
provides: "All English i18n keys for phase 2"
contains: "hytale"
key_links:
- from: "app/data/pricing.ts"
to: "shared/types/index.ts"
via: "import PricingTier"
pattern: "import type.*PricingTier"
---
<objective>
Data layer foundation for phase 2 content: types, data files, site config, and all i18n keys.
Purpose: Every subsequent plan (hero refonte, hytale page) depends on these types, data, and i18n keys existing first. By completing data layer in wave 1, plans 02 and 03 can execute in parallel in wave 2.
Output: Updated types, site config, pricing data, testimonials fixes, complete FR+EN i18n keys.
</objective>
<execution_context>
@$HOME/.claude/get-shit-done/workflows/execute-plan.md
@$HOME/.claude/get-shit-done/templates/summary.md
</execution_context>
<context>
@.planning/PROJECT.md
@.planning/ROADMAP.md
@.planning/STATE.md
@.planning/phases/02-content/02-CONTEXT.md
@.planning/phases/02-content/02-RESEARCH.md
@.planning/phases/02-content/02-UI-SPEC.md
@shared/types/index.ts
@app/data/site.ts
@app/data/testimonials.ts
@i18n/locales/fr.json
@i18n/locales/en.json
</context>
<tasks>
<task type="auto">
<name>Task 1: Add types, update site.ts, create pricing.ts, fix testimonials.ts</name>
<files>shared/types/index.ts, app/data/site.ts, app/data/pricing.ts, app/data/testimonials.ts</files>
<read_first>shared/types/index.ts, app/data/site.ts, app/data/testimonials.ts</read_first>
<action>
1. **shared/types/index.ts** — Add `PricingTier` interface and `jobTitle` to `SiteConfig`:
```typescript
export interface PricingTier {
id: string
priceFixed: string | null
priceLabel?: string
featured?: boolean
}
```
Add `jobTitle?: string` field to `SiteConfig` interface (after `description`).
2. **app/data/site.ts** — Per D-20, D-21, D-16:
- Change `title` to: `"Killian' DAL-CIN - Hytale Plugin Developer | Freelance"`
- Add `jobTitle: 'Hytale Plugin Developer'` after `description`
- Change `seo.organization.name` to: `"Killian' DAL-CIN - Hytale Plugin Developer"`
- Change `seo.organization.aggregateRating.reviewCount` from `'10'` to `'5'`
3. **app/data/pricing.ts** — Create new file per D-09, D-10. Export `hytalePricing: PricingTier[]` with 5 tiers:
```typescript
import type { PricingTier } from '~~/shared/types'
export const hytalePricing: PricingTier[] = [
{ id: 'simple', priceFixed: '50€', featured: false },
{ id: 'complex', priceFixed: null, priceLabel: 'Sur devis', featured: true },
{ id: 'custom', priceFixed: null, priceLabel: 'Sur devis', featured: false },
{ id: 'maintenance', priceFixed: '30€/mois', featured: false },
{ id: 'web', priceFixed: null, priceLabel: 'Sur devis', featured: false },
]
```
Note: Use "A partir de 50€" / "A partir de 30€/mois" as priceFixed values matching UI-SPEC copywriting contract. Actually, price display text goes through i18n — priceFixed stores the raw value. The i18n keys will hold display strings like "A partir de 50€".
4. **app/data/testimonials.ts** — Per D-16:
- Change `totalReviews: 10` to `totalReviews: 5`
- Add `featured: true` to `colo263` and `cobra2` testimonials (per D-15, need 3 featured for homepage)
</action>
<verify>
<automated>grep -q "PricingTier" shared/types/index.ts && grep -q "jobTitle" shared/types/index.ts && grep -q "Hytale Plugin Developer" app/data/site.ts && grep -q "reviewCount: '5'" app/data/site.ts && grep -q "totalReviews: 5" app/data/testimonials.ts && grep -q "hytalePricing" app/data/pricing.ts && echo "PASS" || echo "FAIL"</automated>
</verify>
<acceptance_criteria>
- `grep "PricingTier" shared/types/index.ts` returns the interface definition
- `grep "jobTitle" shared/types/index.ts` shows field in SiteConfig
- `grep "jobTitle: 'Hytale Plugin Developer'" app/data/site.ts` matches
- `grep "reviewCount: '5'" app/data/site.ts` matches
- `grep "totalReviews: 5" app/data/testimonials.ts` matches
- `grep "hytalePricing" app/data/pricing.ts` returns the exported array
- 3 testimonials have `featured: true`
</acceptance_criteria>
<done>Types extended, site.ts repositioned to Hytale, pricing data created with 5 tiers, testimonials stats corrected to 5 with 3 featured</done>
</task>
<task type="auto">
<name>Task 2: Add all i18n keys for phase 2 in fr.json and en.json</name>
<files>i18n/locales/fr.json, i18n/locales/en.json</files>
<read_first>i18n/locales/fr.json, i18n/locales/en.json</read_first>
<action>
Add ALL the following i18n keys to BOTH fr.json and en.json. This is the complete set for phase 2 — hero, hytale page, pricing, testimonials, nav. Every key added in FR must also exist in EN.
**nav section** — add `"hytale": "Hytale"` (same in both languages)
**home section** — update/add these keys (per D-01, D-02, D-03, D-04, UI-SPEC copywriting contract):
- `home.title`: FR "Hytale Plugin Developer" / EN "Hytale Plugin Developer"
- `home.subtitle`: FR "Des plugins performants et sur-mesure pour votre serveur Hytale" / EN "High-performance, custom plugins for your Hytale server"
- `home.badge.available`: FR "Disponible pour vos projets" / EN "Available for projects"
- `home.cta.discord`: FR "Rejoindre sur Discord" / EN "Join on Discord"
- `home.cta.contact`: FR "Me contacter" / EN "Contact me"
- `home.stats.projects`: FR "50+ projets" / EN "50+ projects"
- `home.stats.rating`: FR "Note 5.0" / EN "5.0 rating"
- `home.terminal.role`: FR "Hytale Plugin Developer" / EN "Hytale Plugin Developer"
**hytale section** — create entirely (per D-08, CONT-02, UI-SPEC):
- `hytale.hero.label`: FR "// hytale" / EN "// hytale"
- `hytale.hero.title`: FR "Plugins Hytale sur-mesure" / EN "Custom Hytale Plugins"
- `hytale.hero.subtitle`: FR "Developpement de plugins performants pour votre serveur Hytale, de la conception a la livraison." / EN "High-performance plugin development for your Hytale server, from design to delivery."
- `hytale.services.label`: FR "// services" / EN "// services"
- `hytale.services.title`: FR "Expertise Hytale" / EN "Hytale Expertise"
- `hytale.services.subtitle`: FR "Des solutions adaptees a chaque besoin" / EN "Solutions tailored to every need"
- `hytale.pricing.label`: FR "// tarifs" / EN "// pricing"
- `hytale.pricing.title`: FR "Tarifs" / EN "Pricing"
- `hytale.pricing.subtitle`: FR "Des offres transparentes pour chaque projet" / EN "Transparent pricing for every project"
- `hytale.pricing.cta`: FR "Demander un devis" / EN "Request a quote"
- `hytale.pricing.popular`: FR "Populaire" / EN "Popular"
- `hytale.pricing.from`: FR "A partir de" / EN "From"
- `hytale.pricing.perMonth`: FR "/mois" / EN "/month"
- `hytale.pricing.onQuote`: FR "Sur devis" / EN "Custom quote"
Per tier (simple, complex, custom, maintenance, web) — UI-SPEC copywriting contract:
- `hytale.pricing.simple.name`: FR "Plugin Simple" / EN "Simple Plugin"
- `hytale.pricing.simple.description`: FR "Un plugin basique avec des fonctionnalites simples" / EN "A basic plugin with simple features"
- `hytale.pricing.simple.features.0` through `.3`: FR features list / EN features list
- "Fonctionnalites de base" / "Basic features"
- "Configuration simple" / "Simple configuration"
- "Documentation incluse" / "Documentation included"
- "Support 30 jours" / "30-day support"
- `hytale.pricing.complex.name`: FR "Plugin Complexe" / EN "Complex Plugin"
- `hytale.pricing.complex.description`: FR "Un plugin avance avec des systemes complexes" / EN "An advanced plugin with complex systems"
- `hytale.pricing.complex.features.0` through `.3`:
- "Systemes avances" / "Advanced systems"
- "Integration API" / "API integration"
- "Tests complets" / "Comprehensive testing"
- "Support 60 jours" / "60-day support"
- `hytale.pricing.custom.name`: FR "Developpement Sur-Mesure" / EN "Custom Development"
- `hytale.pricing.custom.description`: FR "Un projet entierement personnalise" / EN "A fully customized project"
- `hytale.pricing.custom.features.0` through `.3`:
- "Architecture sur-mesure" / "Custom architecture"
- "Fonctionnalites illimitees" / "Unlimited features"
- "Support prioritaire" / "Priority support"
- "Maintenance incluse" / "Maintenance included"
- `hytale.pricing.maintenance.name`: FR "Maintenance & Support" / EN "Maintenance & Support"
- `hytale.pricing.maintenance.description`: FR "Support continu pour vos plugins" / EN "Ongoing support for your plugins"
- `hytale.pricing.maintenance.features.0` through `.3`:
- "Mises a jour regulieres" / "Regular updates"
- "Corrections de bugs" / "Bug fixes"
- "Support technique" / "Technical support"
- "Monitoring" / "Monitoring"
- `hytale.pricing.web.name`: FR "Developpement Web" / EN "Web Development"
- `hytale.pricing.web.description`: FR "Sites web et applications pour votre communaute" / EN "Websites and apps for your community"
- `hytale.pricing.web.features.0` through `.3`:
- "Site responsive" / "Responsive website"
- "SEO optimise" / "SEO optimized"
- "Dashboard admin" / "Admin dashboard"
- "Integration Discord" / "Discord integration"
**seo section** — add hytale page SEO keys (per I18N-04):
- `seo.hytale.title`: FR "Plugins Hytale sur-mesure | Killian' DAL-CIN" / EN "Custom Hytale Plugins | Killian' DAL-CIN"
- `seo.hytale.description`: FR "Developpement de plugins Hytale performants et sur-mesure. Du plugin simple au projet complexe, des solutions adaptees a votre serveur." / EN "High-performance custom Hytale plugin development. From simple plugins to complex projects, solutions tailored to your server."
**testimonials section** — add/update keys:
- `testimonials.label`: FR "// temoignages" / EN "// testimonials"
- `testimonials.title`: FR "Ce que disent nos clients" / EN "What our clients say"
- `testimonials.stats.reviews`: FR "avis clients" / EN "client reviews"
- `testimonials.stats.rating`: FR "note moyenne" / EN "average rating"
- `testimonials.stats.projects`: FR "projets livres" / EN "projects delivered"
- `testimonials.empty`: FR "Aucun temoignage disponible pour l'instant." / EN "No testimonials available yet."
IMPORTANT: Preserve ALL existing keys in both JSON files. Only ADD new keys and UPDATE the specific home.title, home.subtitle, home.cta keys. Do NOT remove any existing keys.
</action>
<verify>
<automated>grep -q "hytale.hero.title" i18n/locales/fr.json && grep -q "hytale.hero.title" i18n/locales/en.json && grep -q "hytale.pricing.simple.name" i18n/locales/fr.json && grep -q "nav.*hytale" i18n/locales/fr.json && grep -q "seo.hytale" i18n/locales/en.json && echo "PASS" || echo "FAIL"</automated>
</verify>
<acceptance_criteria>
- `grep "hytale.hero.title" i18n/locales/fr.json` finds the key (nested or flat)
- `grep "hytale.pricing.simple.name" i18n/locales/en.json` finds the key
- `grep "hytale" i18n/locales/fr.json | wc -l` returns 30+ matches
- `grep "nav" i18n/locales/fr.json` includes "hytale"
- `grep "seo" i18n/locales/en.json` includes hytale title and description
- All existing keys are preserved (no regression)
</acceptance_criteria>
<done>Both fr.json and en.json contain all i18n keys for hero, hytale page, pricing tiers, testimonials, nav, and SEO — complete bilingual coverage for phase 2</done>
</task>
</tasks>
<threat_model>
## Trust Boundaries
| Boundary | Description |
|----------|-------------|
| Static data files | All data is hardcoded in TypeScript files, no user input |
## STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|-----------|----------|-----------|-------------|-----------------|
| T-02-01 | I (Information Disclosure) | pricing.ts | accept | Pricing is intentionally public — displayed on website |
| T-02-02 | T (Tampering) | i18n JSON files | accept | Static files served via SSR, no runtime modification possible |
</threat_model>
<verification>
- `pnpm typecheck` passes (no TypeScript errors from new types/data)
- All 5 pricing tiers exist in pricing.ts
- site.ts contains "Hytale Plugin Developer" in title and jobTitle
- reviewCount and totalReviews both show 5
- fr.json and en.json have matching key sets for all hytale.* keys
</verification>
<success_criteria>
- Types compile cleanly with strict mode
- Data layer is complete — plans 02 and 03 can reference all types, data, and i18n keys
- No hardcoded strings remain in the data layer
</success_criteria>
<output>
After completion, create `.planning/phases/02-content/02-01-SUMMARY.md`
</output>