4 plans across 3 waves: shared components + deps (wave 1), pages landing/projects/detail + about/contact/fiverr/404 (wave 2), Dockerfile SSR + GA4 + docker-compose (wave 3).
9.4 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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 03-pages-ship | 03 | execute | 2 |
|
|
true |
|
|
Purpose: Complete le portfolio avec toutes les pages necessaires — About pour la credibilite, Contact pour la conversion, Fiverr pour les services, 404 pour l'UX. Output: 4 pages fonctionnelles.
<execution_context> @C:\Users\minit.claude\get-shit-done\workflows\execute-plan.md @C:\Users\minit.claude\get-shit-done\templates\summary.md </execution_context>
@.planning/PROJECT.md @.planning/ROADMAP.md @.planning/phases/03-pages-ship/03-CONTEXT.md @.planning/phases/03-pages-ship/03-RESEARCH.md @.planning/phases/03-pages-ship/03-01-SUMMARY.md@src/views/AboutPage.vue @src/views/ContactPage.vue @src/views/FiverrPage.vue @app/data/techstack.ts @app/data/faq.ts @src/config/site.ts
Composants disponibles (auto-importes, crees en Plan 01): - ContactForm — pas de props (formulaire autonome avec Zod + useToast) - FAQSection — props: faqs (FAQ[]), title, subtitle - TechBadge — props: tech (Technology | string), showLevel?, showImage?From app/data/site.ts (cree en Plan 01):
export const siteConfig: SiteConfig
// siteConfig.contact: { email, phone, location }
// siteConfig.social: SocialLink[]
// siteConfig.fiverr: { profileUrl, services: FiverrService[] }
From app/data/techstack.ts:
export const techStack: TechStack
// .programming, .front, .database, .devtools, .operating_systems, .socials
From app/data/faq.ts:
export const homeFAQs: FAQ[]
- Section hero : titre
t('about.title'), sous-titre, intro content (2 paragraphes bio) - Section Skills : 4 categories tech (programming, front, database, devtools) en grille 2x2 avec
UCard. Chaque card : icone, titre categorie, grilleTechBadgeavecshowLevel. Section OS separee en bas. - Section Approach : 4 cards (performance, architecture, quality, collaboration) avec
UCard, icones lucide. - Section CTA : titre + 2 boutons (Contact, Projets) via
UButton. useSeoMeta()avec titre/description about.
contact.vue (per D-08, D-10, D-16, PAGE-05) : Migrer depuis src/views/ContactPage.vue.
- Section hero : titre
t('contact.title'), sous-titre, stats (24-48h response, 100% satisfaction, Remote) - Layout 2 colonnes :
- Colonne gauche :
<ContactForm />(auto-importe du Plan 01, gere tout seul — Zod, $fetch, UToast) - Colonne droite : Infos contact (
UCardavec email cliquable, telephone, localisation depuissiteConfig.contact) + Reseaux sociaux (UCardavec lienssiteConfig.social— icones pour Gitea/LinkedIn/Discord)
- Colonne gauche :
- Section FAQ en bas : 3 cards info (temps reponse, types projets, collaboration) avec
UCard. useSeoMeta()specifique contact.
Importer siteConfig depuis ~/data/site.
cd C:/Users/minit/Desktop/portfolio/portfolio && grep -q "TechBadge" app/pages/about.vue && grep -q "techStack" app/pages/about.vue && grep -q "ContactForm" app/pages/contact.vue && grep -q "siteConfig" app/pages/contact.vue && echo "PASS"
About page avec bio + 5 categories tech stack badges, Contact page avec ContactForm + infos contact + reseaux sociaux
-
Script setup : Importer
siteConfigdepuis~/data/site. Computedservices=siteConfig.fiverr.services. ComputedheroStatsavec nombre services dispo + rating "5 etoiles". -
Section Hero : titre
t('fiverr.title'), sous-titre, stats (services count, rating), bouton CTAUButtonverssiteConfig.fiverr.profileUrl(external link, target blank). -
Section Services : grille de service cards. Pour chaque service dans
siteConfig.fiverr.services, utiliserUCardavec :- Image service via
NuxtImg :src="service.image" - Badge prix :
t('fiverr.pricing.startingAt') + ' ' + service.price - Badge statut : "Disponible" (vert) si url !== '#', "Bientot" (jaune) sinon
- Titre et description via
t('fiverr.serviceData.${service.id}.title/description') - Features liste via i18n (recuperer du fichier de traduction comme dans src/views/FiverrPage.vue)
- Bouton commander / en savoir plus
- Image service via
-
Section FAQ (per D-18) : Utiliser
<FAQSection>du Plan 01 avec les FAQs fiverr. Creer un array computed de FAQ fiverr depuis les cles i18nfiverr.faq.*si elles existent, sinon reutiliserhomeFAQs. -
Section CTA finale : titre
t('fiverr.cta.title'), sous-titre, bouton vers profil Fiverr. -
useSeoMeta()specifique fiverr. cd C:/Users/minit/Desktop/portfolio/portfolio && grep -q "siteConfig" app/pages/fiverr.vue && grep -q "fiverr" app/pages/fiverr.vue && grep -q "FAQSection|UAccordion" app/pages/fiverr.vue && echo "PASS" Page Fiverr avec hero stats, service cards, FAQ accordion UAccordion, CTA vers profil Fiverr
Implementation exacte du RESEARCH.md Pattern 5 :
<script setup lang="ts">
import type { NuxtError } from '#app'
const props = defineProps<{ error: NuxtError }>()
const { t } = useI18n()
function handleError() {
clearError({ redirect: '/' })
}
</script>
<template>
<div class="min-h-screen flex flex-col items-center justify-center gap-6 px-4">
<h1 class="text-8xl font-bold text-primary">{{ error.statusCode }}</h1>
<p class="text-xl text-gray-500 dark:text-gray-400 text-center max-w-md">
{{ error.statusCode === 404 ? t('error.notFound') : t('error.generic') }}
</p>
<UButton size="lg" @click="handleError">
{{ t('error.backHome') }}
</UButton>
</div>
</template>
Ajouter les cles i18n manquantes si necessaire : error.notFound ("Page introuvable"), error.generic ("Une erreur est survenue"), error.backHome ("Retour a l'accueil") dans les fichiers de traduction FR/EN. Si les cles n'existent pas encore, les ajouter dans i18n/locales/fr.json et i18n/locales/en.json.
cd C:/Users/minit/Desktop/portfolio/portfolio && test -f app/error.vue && grep -q "clearError" app/error.vue && grep -q "statusCode" app/error.vue && echo "PASS"
error.vue dans app/ avec affichage code erreur, message i18n, bouton retour accueil via clearError
<threat_model>
Trust Boundaries
| Boundary | Description |
|---|---|
| Aucune nouvelle | Les pages About/Fiverr/404 ne traitent pas de donnees utilisateur. Contact est gere par ContactForm du Plan 01. |
STRIDE Threat Register
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|---|---|---|---|---|
| T-03-06 | Information Disclosure | contact.vue | accept | email/telephone affiches publiquement — voulu par le proprietaire du site |
| </threat_model> |
<success_criteria>
- About affiche bio + tech stack par categorie avec TechBadge (per D-17)
- Contact affiche ContactForm (3 champs) + infos contact + reseaux (per D-08)
- Fiverr affiche hero + services + FAQ accordion + CTA (per D-18)
- error.vue dans app/ (pas pages/), affiche 404, bouton clearError (per D-20)
- Toutes les pages ont useSeoMeta() </success_criteria>