claude.md : fiche et boucle de vérification fusionnées

- Rôle, port, dépôt, stack (layer @yvv/nuxt-base, pnpm épinglé, Umami),
  déploiement Woodpecker sans étape de test, graine des messages.
- Section « Vérifier » : V0 (build + smoke rejoués le 26/10/2026), V1 et V2
  à construire, V3, trous connus et gates humains d'anneau 1.
- Constats du 26/10/2026 : montages Docker sur /src alors que l'image tourne
  dans /app, git sync admin inactif (pas de variable, pas de .git, aucun
  commit [admin]). Décision portée au HANDOFF.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-26 01:28:52 +01:00
co-authored by Claude Opus 5.5
parent 852a4881a6
commit 23b1767e67
2 changed files with 81 additions and 6 deletions
+72 -4
View File
@@ -2,17 +2,30 @@
Site vitrine du projet Le Librodrome — livre + chansons sur l'économie du don.
- **Rôle** : site éditorial en production sur `librodrome.org` et hub d'intégration
de l'écosystème (GrateWizard en popup ; liens libreDecision
`decision.librodrome.org`, SejeteralO, sweetHome/LaPlanK dans le YAML de `site/`).
Cap : plateforme éditoriale de bassin de vie (autonomie collective, économie
monnaie libriste, boîte à outils, événementiel).
- **Port** : 3000 (dev), 3099 (smoke du build). **Dépôt** : `origin` =
`gitea@git.open.us.org:EHV/librodrome.git` ; `main` = production.
## Protocole de début de session
1. `git pull --rebase origin main` (récupère les commits admin git sync YAML prod)
1. `git pull --rebase origin main` (règle canon ; voir § Contenu administrable)
2. Vérifier que `data/messages.yml` existe — si absent, signaler avant toute opération
3. Si l'objectif de la session n'est pas précisé, le demander
## Stack
- Nuxt 4 (Vue 3, TypeScript, Nitro) + Nuxt Content, Pinia, UnoCSS, VueUse, Nuxt Image
- Icônes : Lucide + Phosphor (via @iconify-json) ; Package manager : pnpm
- Déploiement : Docker + Traefik, CI via Woodpecker
- Layer `@yvv/nuxt-base` (`extends` dans `nuxt.config.ts`, dépendance `git+https` épinglée `#v0.1.0`)
- Icônes : Lucide + Phosphor (via @iconify-json) ; pnpm épinglé 10.29.3 (`packageManager`)
- Audience : Umami (`nuxt-umami`)
- Déploiement : Woodpecker (`.woodpecker.yml`) — push sur `main` →
`docker compose -f docker/docker-compose.yml -f docker/docker-compose.fabio.yml up --build -d`,
**sans étape de test**. Secrets CI : `NUXT_ADMIN_PASSWORD`, `NUXT_ADMIN_SECRET`.
Healthcheck de l'image : `/api/health`.
## Structure
@@ -56,6 +69,12 @@ docker/
- Structure message : `{ id, author, email, text, type, published, createdAt, reply: { text, publishedAt } | null }`
- Types : `reaction` (ancien, affiché "Réaction", plus proposé dans les formulaires) | `question` | `suggestion` | `retour`
- En dev local : `<racine>/data/messages.yml`
- Graine : `site/messages.yml` (versionné) copié par `server/plugins/seed-messages.ts`
si `data/messages.yml` est absent
- ⚠ Constat du 26/10/2026 : l'image tourne dans `/app` (WORKDIR depuis `07bf07a`) et
résout `data/` depuis `process.cwd()`, alors que le compose monte `/src/data` et
`/src/public`. La persistance en prod n'est donc pas assurée par la config ; effet
sur le serveur non vérifié (voir HANDOFF).
- **Avant toute migration de chemin ou écriture sur data/ : demander confirmation**
## Intégration GrateWizard
@@ -67,7 +86,12 @@ docker/
- YAML dans `site/pages/` par section ; API supporte les chemins imbriqués
- Admin : `/admin/pages` liste, `/admin/pages/{path}` édite en YAML
- Git sync auto en prod (`ADMIN_GIT_SYNC=true`) → d'où le `git pull --rebase` obligatoire en début de session
- Git sync (`server/utils/gitSync.ts`, actif si `ADMIN_GIT_SYNC=true`) : commit
`[admin] …` puis push depuis le conteneur → `git pull --rebase` obligatoire en début de session
- ⚠ Constat du 26/10/2026 : la CI ne fixe pas `ADMIN_GIT_SYNC` (défaut `false` dans le
compose), l'image de prod n'embarque pas `.git`, et l'historique ne contient aucun
commit `[admin]`. Les éditions /admin en prod ne reviennent donc pas dans git
(voir HANDOFF).
## Commandes
@@ -77,6 +101,50 @@ pnpm build # Build production
PORT=3099 node .output/server/index.mjs # Test build prod (toujours avant commit)
```
## Vérifier
Niveaux V0 à V4 : gabarit `harness/skills/boucles/_gabarit.md`. Seuls V0 et V3 existent :
aucun test automatisé, ni lint ni typecheck (aucun script, pas de `vue-tsc`).
**V0 — build + smoke** (vert le 26/10/2026, build ≈ 1 min)
```bash
date; pnpm build # exit 0
NUXT_ADMIN_PASSWORD=jetable NUXT_ADMIN_SECRET=jetable PORT=3099 node .output/server/index.mjs &
sleep 3; for p in / /api/health /api/admin/messages; do
curl -s -o /dev/null -w "$p %{http_code}\n" http://127.0.0.1:3099$p; done # 200, 200, 401
kill $(lsof -ti :3099)
```
Lancé depuis la racine, le serveur lit et écrit le vrai `data/` : aucun POST pendant le
smoke. Le build ne lit pas `.env` : sans `NUXT_ADMIN_SECRET`, l'API admin répond 503.
**V1 — invariants (à construire)** : vitest sur les API messages (POST/GET/DELETE),
admin content (PUT YAML → fichier écrit, format préservé), auth (mauvais mot de passe →
401). `data/` et `site/` se résolvent depuis `process.cwd()` : lancer depuis un dossier jetable.
**V2 — parcours (à construire)** : Playwright, chromium bundlé (HANDOFF, Pièges), mobile +
desktop, ambiances claire et sombre : accueil sans erreur console, les 3 axes, lecteur PDF,
player, formulaire message (data jetable), login admin. Captures dans `/tmp/librodrome-shots/`.
**V3 — données**
```bash
sha256sum data/messages.yml # avant et après le run : identiques
git status --short # rien sous data/ ni .env
git log --oneline origin/main..HEAD # ce que le prochain push mettrait en ligne
```
**V4** : rapport avec sorties réelles et captures ; tout niveau sauté est annoncé.
**Trous** : la CI déploie sans gate (un commit cassé part en prod) ; V1 et V2 inexistants.
Prochaines briques : gate build + tests dans `.woodpecker.yml` avant le `up`, puis V1 et V2
exposés en `pnpm verify`.
**Gates humains (anneau 1)** : push de `main` (= mise en ligne) ; suppressions admin
(`server/api/admin/messages/[id].delete.ts`, `media/[...path].delete.ts`,
`chapters/[slug].delete.ts`) ; toute écriture sous `site/` ou `content/book/` (contenu de
prod) ; `data/messages.yml` ; lien de commande du livre (Bookelis,
`site/pages/economique/commande.yml`, aucun paiement sur le site) ; auth admin
(`server/middleware/admin-auth.ts`) et secrets `NUXT_ADMIN_*`.
## Conventions
- CSS via UnoCSS + variables CSS palettes ; composants Vue SFC `<script setup lang="ts">`