From 21c44d8193abd0a5489ce0eb97ab18a489c4c275 Mon Sep 17 00:00:00 2001 From: Jules Neny Date: Tue, 28 Apr 2026 14:00:05 +0200 Subject: [PATCH] =?UTF-8?q?feat(aep):=20carte=20AEP=20=E2=80=94=20push=20G?= =?UTF-8?q?itea=202026-04-28?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 9 + .../dev-aep-S6-corrections-post-S5.md | 133 + .../dev-aep-S8-scroll-hamburger.md | 60 + JOURNAL-V2.md | 1005 ++ PIPE-IA-DOC.md | 332 + V2-cadrage/A-biblio-ecosysteme-archi.md | 134 + V2-cadrage/B-provider-ia-souverain.md | 244 + V2-cadrage/C-systeme-dons.md | 299 + V2-cadrage/E-spec-frontend.md | 1159 ++ V2-cadrage/F-spec-pipe-collaboration.md | 824 ++ V2-cadrage/G-prompt-dev-final.md | 289 + V2-cadrage/H-prompt-session-2-front.md | 155 + V2-cadrage/I-prompt-session-3-ia-deploy.md | 194 + V2-cadrage/J-prompt-session-2-fiche.md | 87 + V2-cadrage/K-prompt-session-2-contribuer.md | 105 + V2-cadrage/L-prompt-session-2.5-hierarchie.md | 102 + V2-cadrage/M-prompt-session-2-mobile.md | 179 + ...-prompt-session-taxonomie-carte-unifiee.md | 174 + V2-cadrage/VPS-check.md | 111 + V2-cadrage/palette-nav-v2.md | 100 + V2-cadrage/palettes-preview.html | 226 + V2-cadrage/seed-94-fiches-v2.json | 1727 +++ V2-cadrage/seed-94-fiches.json | 1603 +++ V2-cadrage/seed-94-rapport.md | 114 + V2-cadrage/seed-test-pipe-ia.json | 54 + app.vue | 285 + assets/css/main.css | 110 + components/BandeauBas.vue | 587 + components/ChatbotPlaceholder.vue | 382 + components/ChatbotSheet.vue | 406 + components/CommentForm.vue | 147 + components/CommentSection.vue | 100 + components/EchelleFilter.vue | 63 + components/FicheDetail.vue | 375 + components/FicheModal.vue | 164 + components/FonctionFilter.vue | 67 + components/MobileSheet.vue | 218 + components/NavMap.vue | 241 + components/NavSidebar.vue | 257 + components/OrgCard.vue | 45 + components/OutremerMap.vue | 279 + components/TagBadge.vue | 11 + components/TopSearchBar.vue | 162 + components/TypeBadge.vue | 21 + content-a-propos.md | 69 + deploy.sh | 62 + deploy/systemd/nav-ratelimit-purge.service | 7 + deploy/systemd/nav-ratelimit-purge.timer | 9 + nuxt.config.ts | 33 + package-lock.json | 11840 ++++++++++++++++ package.json | 25 + pages/a-propos.vue | 534 + pages/a-propos.vue.tmp.47800.1777123068982 | 477 + pages/a-propos.vue.tmp.916.1777376899845 | 534 + pages/agences.vue | 39 + pages/ajouter.vue | 215 + pages/contribuer.vue | 795 ++ pages/fiche/[id].vue | 123 + pages/index.vue | 568 + pages/rag.vue | 38 + pages/signaler.vue | 389 + prompt-aep-S5-corrections-post-phase2.md | 224 + prompt-aep-S7-logo-fiches-outremer.md | 165 + public/og-default.png | Bin 0 -> 18427 bytes server/api/chatbot.post.ts | 331 + server/api/comment/[orgId].get.ts | 22 + server/api/comment/index.post.ts | 183 + server/api/fiche/[id].get.ts | 26 + server/api/report-general.post.ts | 94 + server/api/report.post.ts | 94 + server/api/stats.get.ts | 106 + server/api/submit/index.post.ts | 241 + server/routes/api/avis.post.ts | 16 + server/routes/api/avis/[orgId].get.ts | 13 + server/routes/api/organisations.get.ts | 50 + server/routes/api/organisations.post.ts | 16 + server/routes/api/organisations/[id].get.ts | 17 + server/utils/circuitBreaker.ts | 87 + server/utils/rateLimit.ts | 109 + server/utils/rateLimitJson.ts | 87 + tailwind.config.js | 54 + types/org.ts | 38 + vps-setup.sh | 44 + worker/daily-digest.js | 234 + worker/enrich.js | 495 + worker/package.json | 13 + 86 files changed, 31855 insertions(+) create mode 100644 .gitignore create mode 100644 Archive Prompts/dev-aep-S6-corrections-post-S5.md create mode 100644 Archive Prompts/dev-aep-S8-scroll-hamburger.md create mode 100644 JOURNAL-V2.md create mode 100644 PIPE-IA-DOC.md create mode 100644 V2-cadrage/A-biblio-ecosysteme-archi.md create mode 100644 V2-cadrage/B-provider-ia-souverain.md create mode 100644 V2-cadrage/C-systeme-dons.md create mode 100644 V2-cadrage/E-spec-frontend.md create mode 100644 V2-cadrage/F-spec-pipe-collaboration.md create mode 100644 V2-cadrage/G-prompt-dev-final.md create mode 100644 V2-cadrage/H-prompt-session-2-front.md create mode 100644 V2-cadrage/I-prompt-session-3-ia-deploy.md create mode 100644 V2-cadrage/J-prompt-session-2-fiche.md create mode 100644 V2-cadrage/K-prompt-session-2-contribuer.md create mode 100644 V2-cadrage/L-prompt-session-2.5-hierarchie.md create mode 100644 V2-cadrage/M-prompt-session-2-mobile.md create mode 100644 V2-cadrage/N-prompt-session-taxonomie-carte-unifiee.md create mode 100644 V2-cadrage/VPS-check.md create mode 100644 V2-cadrage/palette-nav-v2.md create mode 100644 V2-cadrage/palettes-preview.html create mode 100644 V2-cadrage/seed-94-fiches-v2.json create mode 100644 V2-cadrage/seed-94-fiches.json create mode 100644 V2-cadrage/seed-94-rapport.md create mode 100644 V2-cadrage/seed-test-pipe-ia.json create mode 100644 app.vue create mode 100644 assets/css/main.css create mode 100644 components/BandeauBas.vue create mode 100644 components/ChatbotPlaceholder.vue create mode 100644 components/ChatbotSheet.vue create mode 100644 components/CommentForm.vue create mode 100644 components/CommentSection.vue create mode 100644 components/EchelleFilter.vue create mode 100644 components/FicheDetail.vue create mode 100644 components/FicheModal.vue create mode 100644 components/FonctionFilter.vue create mode 100644 components/MobileSheet.vue create mode 100644 components/NavMap.vue create mode 100644 components/NavSidebar.vue create mode 100644 components/OrgCard.vue create mode 100644 components/OutremerMap.vue create mode 100644 components/TagBadge.vue create mode 100644 components/TopSearchBar.vue create mode 100644 components/TypeBadge.vue create mode 100644 content-a-propos.md create mode 100644 deploy.sh create mode 100644 deploy/systemd/nav-ratelimit-purge.service create mode 100644 deploy/systemd/nav-ratelimit-purge.timer create mode 100644 nuxt.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 pages/a-propos.vue create mode 100644 pages/a-propos.vue.tmp.47800.1777123068982 create mode 100644 pages/a-propos.vue.tmp.916.1777376899845 create mode 100644 pages/agences.vue create mode 100644 pages/ajouter.vue create mode 100644 pages/contribuer.vue create mode 100644 pages/fiche/[id].vue create mode 100644 pages/index.vue create mode 100644 pages/rag.vue create mode 100644 pages/signaler.vue create mode 100644 prompt-aep-S5-corrections-post-phase2.md create mode 100644 prompt-aep-S7-logo-fiches-outremer.md create mode 100644 public/og-default.png create mode 100644 server/api/chatbot.post.ts create mode 100644 server/api/comment/[orgId].get.ts create mode 100644 server/api/comment/index.post.ts create mode 100644 server/api/fiche/[id].get.ts create mode 100644 server/api/report-general.post.ts create mode 100644 server/api/report.post.ts create mode 100644 server/api/stats.get.ts create mode 100644 server/api/submit/index.post.ts create mode 100644 server/routes/api/avis.post.ts create mode 100644 server/routes/api/avis/[orgId].get.ts create mode 100644 server/routes/api/organisations.get.ts create mode 100644 server/routes/api/organisations.post.ts create mode 100644 server/routes/api/organisations/[id].get.ts create mode 100644 server/utils/circuitBreaker.ts create mode 100644 server/utils/rateLimit.ts create mode 100644 server/utils/rateLimitJson.ts create mode 100644 tailwind.config.js create mode 100644 types/org.ts create mode 100644 vps-setup.sh create mode 100644 worker/daily-digest.js create mode 100644 worker/enrich.js create mode 100644 worker/package.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3184488 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +node_modules +.nuxt +.output +dist +.env +.env.* +*.log + +*.tmp.* diff --git a/Archive Prompts/dev-aep-S6-corrections-post-S5.md b/Archive Prompts/dev-aep-S6-corrections-post-S5.md new file mode 100644 index 0000000..7c92c2a --- /dev/null +++ b/Archive Prompts/dev-aep-S6-corrections-post-S5.md @@ -0,0 +1,133 @@ +# Prompt — AEP Session 6 (corrections post S5) + +**À lancer :** prochaine session, Sonnet full auto (Opus pilote standby) +**Priorité :** Mobile polish + DOM-TOM layout repensé + bug form proposer +**Créé :** 2026-04-15 (après S5 livrée — 11/11 retours, 8 commits) + +--- + +## Contexte + +Site live : https://aep.trans-former.fr/ +Racine projet : `C:\Users\jules\Dropbox\ATIS - IPCJRA\1 PROJETS\TECH - infra VPS, website pro, RAG\nav-carte\` +VPS SSH : alias `vps-hetzner`, service `nav-carte.service`, working dir `/opt/nav-carte/.output/`. +Stack : Nuxt 3 + Vue 3 + Tailwind + Leaflet. + +**État S5 livrée (2026-04-15) :** +- 11 retours implémentés (onglets header, sheet mobile, report Resend, DOM-TOM row bas, dark mode tuile, bandeau inversé, etc.) +- 8 commits `aep-s5` +- Site 200 OK, service active + +**NE PAS TOUCHER à `.env` VPS ni `.env.production` local** (patchés manuellement). + +--- + +## Mission + +9 retours UX post-S5 + 1 bug critique (form proposer invisible). + +--- + +## Retours Jules — à implémenter + +### 1. DOM-TOM — repenser le layout (encore) +**Actuel S5 :** row horizontale pleine largeur en bas de la Métropole (Option A). +**Cible S6 :** DOM-TOM à droite du site, **empilés verticalement** (superposés). Navigation dans chaque mini-carte OK (acquis S5). + +En clair : revenir sur un encart à droite de la Métropole, mais les 5 DOM-TOM se **superposent** (une pile verticale dense), pas en grille étalée. Conserver `dragging: true` + `scrollWheelZoom: true`. + +**Layout suggéré :** Métropole 75-80% largeur à gauche, colonne droite 20-25% avec les 5 DOM-TOM empilés (Guadeloupe, Martinique, Guyane, Réunion, Mayotte) — petites hauteurs ~140-160px chacune. + +**Bug #1a — Réunion** : la mini-carte Réunion disparaît après un moment de déplacement. À investiguer (event listener cassé ? tile layer perdu ? bounds reset ?). + +### 2. Onglets header — style "languette de dossier" +Les 3 onglets (Écosystème / Agences / RAG) sont présents mais trop discrets. +Ajouter un effet visuel **languette de fiche de dossier** : petit trapèze/rectangle qui ressort au-dessus de la carte, suggère que l'onglet actif "tire" le contenu de la carte vers le haut. Underline + border-top + border-left/right arrondis haut, background blanc pour l'actif, fond gris clair pour les inactifs. + +### 3. Mobile — onglets invisibles +Les 3 onglets ne sont pas visibles en version mobile actuellement. Les faire apparaître (scroll horizontal ou drawer compact). Même style languette que desktop, adapté petit écran. + +### 4. Mobile — bug barre recherche superposée +La barre de recherche header mobile chevauche les filtres "National / Local". Fix : soit décaler la barre, soit décaler les filtres, soit les combiner proprement dans un bloc unifié. + +### 5. Mobile — supprimer ou remonter "Leaflet | OpenStreetMap contributors" +La ligne de crédit Leaflet en bas de la carte interfère avec les fiches qui remontent (sheet swipable). Options : +- Option A : supprimer sur mobile (`attributionControl: false`) +- Option B : la déplacer en haut de la carte (`position: 'topright'` — mais conflit possible avec autres UI) +- **Recommandation agent : Option A** (suppression mobile — la mention légale peut vivre dans `/a-propos`). + +### 6. Mobile — remonter le chatbot, coeur reste en bas +Actuellement chatbot et coeur (don) tous deux en bas, ça prend de la place inutile. +Cible : +- **Chatbot** : remonter en haut (icône flottante top-right ou intégrée au header) +- **Coeur (don Liberapay)** : reste en bas à droite à la place du chatbot (garde visibilité du don, important) + +### 7. Desktop — bandeau bas label initial +Actuel replié : "AEP transparence IA" +Cible replié : **"Soutenir le projet"** (plus clair, plus engageant) +Transparence IA passe en second plan (hover ou dans le bandeau déployé). + +### 8. Desktop — bandeau fluidité +Le bandeau déploie/replie pas hyper fluide. Ajouter transition CSS propre : `transition: height 0.25s ease-out, opacity 0.2s ease-out`. Vérifier qu'il n'y a pas de reflow layout (utiliser `transform: translateY` si possible plutôt que `height`). + +### 9. Formulaire "Proposer une ressource" — nombre de caractères +Réduire les minimums de caractères requis. Accepter même 0 ou très court (1 ligne suffit). Laisser la description optionnelle ou très permissive. + +### 10. **BUG CRITIQUE — Bouton envoyer invisible sur /proposer** +Sur la page formulaire "Proposer une ressource", **le bouton "Envoyer" n'est pas visible** — probablement masqué sous le bandeau IA/footer fixe. Impossible de soumettre une fiche actuellement. + +Fix : +- Ajouter un `padding-bottom` suffisant au form pour que le bouton soit au-dessus du bandeau +- Ou : s'assurer que le bandeau a un `z-index` inférieur au form +- Tester sur desktop ET mobile + +### 11. Chatbot — vérifier compteur de tokens +Jules a fait quelques recherches via chatbot, mais le compteur de tokens n'a apparemment pas bougé. Vérifier que le tracking fonctionne (logs API, compteur frontend, incrémentation backend). Si bug, corriger. + +--- + +## Règles d'exécution + +- Sonnet full auto, délègue aux sous-agents task si utile +- Commits atomiques : `feat(aep-s6): ` / `fix(aep-s6): ` +- Tests après chaque batch : `npm run build` +- Deploy final : + ```bash + tar -czf - .output | ssh vps-hetzner "rm -rf /tmp/nav-output && mkdir /tmp/nav-output && tar -xzf - -C /tmp/nav-output && rm -rf /opt/nav-carte/.output && mv /tmp/nav-output/.output /opt/nav-carte/.output && systemctl restart nav-carte" + ``` +- Vérif : `curl -sI https://aep.trans-former.fr/ | head -3` → 200 +- Mise à jour `JOURNAL-V2.md` section "Session 6 (2026-04-16)" + +## Critères de fin + +- [ ] 10 retours implémentés + #11 chatbot compteur vérifié +- [ ] Bug form proposer (bouton envoyer visible + soumission fonctionnelle) testé +- [ ] DOM-TOM à droite empilés + bug Réunion fixé +- [ ] Mobile : onglets visibles, barre recherche fixée, chatbot remonté, leaflet credit géré +- [ ] Site 200 OK, service active +- [ ] JOURNAL-V2.md à jour + +## Modèle recommandé + +- Sonnet full auto sur tout +- Opus pilote standby uniquement si bug Réunion #1a nécessite arbitrage debug + +## Durée estimée + +1h30-2h + +--- + +## Autocritique + +**✓ Solide :** +- Bugs critiques identifiés (form proposer, Réunion) +- Layout DOM-TOM reprécisé clairement (pile verticale à droite, pas row bas) +- Chaque retour a recommandation concrète + +**⚠ Faiblesses :** +- #2 style "languette de dossier" : subjectif, agent devra itérer — si rendu pas satisfaisant, screenshot + retour session suivante +- #8 fluidité bandeau : solution CSS proposée mais dépend de l'archi actuelle de `BandeauBas.vue` +- #11 compteur tokens chatbot : pas clair si bug frontend ou backend — agent devra investiguer + +**Autonomie : 8/10** (bug Réunion potentiellement piégeux, sinon clean). diff --git a/Archive Prompts/dev-aep-S8-scroll-hamburger.md b/Archive Prompts/dev-aep-S8-scroll-hamburger.md new file mode 100644 index 0000000..9310440 --- /dev/null +++ b/Archive Prompts/dev-aep-S8-scroll-hamburger.md @@ -0,0 +1,60 @@ +# Prompt AEP — S8 : Fix scroll fiches + hamburger desktop + +**Projet :** `1 PROJETS/TECH - infra VPS, website pro, RAG/nav-carte/` +**Site live :** `aep.trans-former.fr` +**Invocation :** `/atis-dev AEP` + +--- + +## État d'avancement (fin S8, 2026-04-25) — SESSION TERMINÉE + +**S8 livré et déployé :** +- P0 scroll : `app.vue` — `overflow-hidden` conditionné sur `route.path === '/'`, `overflow-y-auto` ailleurs → /fiche/[id], /a-propos, /contribuer scrollent +- P1 hamburger : lien "Signaler" ajouté dans le header desktop (`hidden lg:inline-flex`) — accessible sans hamburger +- /a-propos : phrase "On s'installe seul.e." ajoutée en S1 (texte 2026-04-25 ATIS Business) +- Deploy : `/opt/aep/` sur VPS Hetzner, service `aep`, port 3333 — HTTP 200 confirmé + +**Nota deploy :** le dossier VPS est `/opt/aep/` (pas `/opt/nav-carte/`), service systemd `aep`. + +--- + +## État d'avancement (fin S7, 2026-04-16) + +Déployé et fonctionnel : +- Logo "AEP" dans le carré + sous-titre "Architecture d'Écologie Politique" + lien → trans-former.fr +- Onglets Agences/RAG masqués (code en commentaire dans app.vue, pages gardées) +- Mobile : clic fiche → navigation /fiche/[id] (filtres sauvegardés) +- Desktop : nextTick sur ficheModalOpen (P0 fix) +- Outre-mer mobile : accordéon (header compact, déplie 33vh, invalidateSize Leaflet) +- /a-propos : section "Coût de construction" (~1M tokens, ~0,3 kgCO₂e) + +--- + +## Reste à faire (S9+) + +- /a-propos Section 5 "Transparence IA" — placeholder à écrire (posture politique des coûts IA) +- /a-propos Section 6 "Contribuer" — placeholder à écrire (invitation, ton sans friction) +- Taxonomie v2 (Session N dans roadmap dev) +- Intégration IA / RAG chatbot (Session S3) + +--- + +## Fichiers clés + +| Fichier | Rôle | +|---------|------| +| `app.vue` | Layout global, header, overflow conditionné | +| `pages/index.vue` | Page carte (overflow-hidden géré via app.vue conditionnel) | +| `pages/a-propos.vue` | Page à propos — sections 5+6 encore placeholder | + +--- + +## Deploy (corrigé) + +```bash +cd nav-carte && npm run build +tar -czf /tmp/nav-carte-output.tar.gz -C .output . +scp -P 4422 /tmp/nav-carte-output.tar.gz vps-hetzner:/tmp/ +ssh -p 4422 vps-hetzner "rm -rf /opt/aep/server /opt/aep/public && tar -xzf /tmp/nav-carte-output.tar.gz -C /opt/aep && rm /tmp/nav-carte-output.tar.gz && systemctl restart aep" +ssh -p 4422 vps-hetzner "curl -s -o /dev/null -w 'HTTP %{http_code}' http://localhost:3333/" +``` diff --git a/JOURNAL-V2.md b/JOURNAL-V2.md new file mode 100644 index 0000000..fba9bc3 --- /dev/null +++ b/JOURNAL-V2.md @@ -0,0 +1,1005 @@ +--- +type: journal +project: NAV V2 +created: 2026-04-14 +status: actif +--- + +# NAV V2 — Journal de développement + +Journal technique de la V2. Décisions, anomalies, points bloquants, TODOs. + +--- + +## 2026-04-27 — Session V3 : Finition mobile + Blog Liberapay + 3 deploys + +**Commit :** `a02a555` — feat(mobile): accordéon outremer, hamburger nav, logo AEP, fiches cliquables, chatbot fullscreen +**Pattern :** agents parallèles (3 × Sonnet) pour les 3 SSH indépendants — ~90s total vs ~20min séquentiel + +### Changements implémentés + +**B — OutremerMap.vue : accordéon vertical DOM-TOM** +- Template : row horizontale → accordéon `