Files
portfolio/.planning/phases/02-content/02-01-PLAN.md
T

14 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
02-content 01 execute 1
shared/types/index.ts
app/data/site.ts
app/data/testimonials.ts
app/data/pricing.ts
i18n/locales/fr.json
i18n/locales/en.json
true
CONT-01
CONT-02
CONT-03
CONT-04
SEO-05
truths artifacts key_links
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
path provides contains
shared/types/index.ts PricingTier interface, jobTitle on SiteConfig PricingTier
path provides contains
app/data/pricing.ts 5 pricing tiers for Hytale page hytalePricing
path provides contains
app/data/site.ts Updated title and jobTitle Hytale Plugin Developer
path provides contains
app/data/testimonials.ts Corrected stats and featured flags totalReviews: 5
path provides contains
i18n/locales/fr.json All French i18n keys for phase 2 hytale
path provides contains
i18n/locales/en.json All English i18n keys for phase 2 hytale
from to via pattern
app/data/pricing.ts shared/types/index.ts import PricingTier import type.*PricingTier
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.

<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/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

Task 1: Add types, update site.ts, create pricing.ts, fix testimonials.ts shared/types/index.ts, app/data/site.ts, app/data/pricing.ts, app/data/testimonials.ts shared/types/index.ts, app/data/site.ts, app/data/testimonials.ts 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`).
  1. 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'
  2. app/data/pricing.ts — Create new file per D-09, D-10. Export hytalePricing: PricingTier[] with 5 tiers:

    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€".

  3. 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) 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" <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> Types extended, site.ts repositioned to Hytale, pricing data created with 5 tiers, testimonials stats corrected to 5 with 3 featured
Task 2: Add all i18n keys for phase 2 in fr.json and en.json i18n/locales/fr.json, i18n/locales/en.json i18n/locales/fr.json, i18n/locales/en.json 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. 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" <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> 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

<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>
- `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

<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>
After completion, create `.planning/phases/02-content/02-01-SUMMARY.md`