16 KiB
Défi : aligner main sur l'intention trunk + nettoyage CSS/JS
Énoncé : 2026-06-14, par Paul Schneider. Statut : ouvert.
Énoncé
Atteindre, sur la branche main et en mode trunk, l'état
intentionnel qui a déjà opéré sur la branche themeok (la
référence). Concrètement :
-
Libérer le dépôt de son code inutile : retirer les assets vendor non utilisés (Quill, dropzone.min.css, jquery-ui si plus personne ne s'en sert, etc.) et tout ce qui n'est référencé nulle part dans le code applicatif.
-
Bien nettoyer le CSS et le JS : déplacer les vendor libs sous un régime cohérent (npm + esbuild), arrêter le double-tracking (fichiers versionnés + bundles esbuild), poser des conventions claires.
-
À minima, ne pas casser le JS et le CSS de
_Layout.cshtml. C'est l'invariant non-négociable. -
Introduire immédiatement des tests d'UI automatisés pour servir de garde-fou contre la régression, à chaque commit.
Pourquoi maintenant
themeok est devenu, dans la pratique, la branche de référence
pour le look et le comportement front. main n'a pas reçu les
commits correctifs de themeok, et son état est plus dégradé
(caches navigateur, état runtime, scripts inline qui plantent sur
du contenu vide).
Tant que la divergence existe, on risque de :
- cherry-picker à la main en ratant un commit,
- ne pas voir une régression front parce qu'on ne teste pas en navigateur,
- accumuler de la dette visuelle sur
mainjusqu'à un point de non-retour.
État actuel
themeok (référence, à 4 commits devant main)
ec8fd4b6 fix(cookies): set Identity cookies to SameSite=Lax in dev
76fef567 chore: remove Quill
379413f3 chore: snapshot of themeok branch as visual reference
d71490f5 chore: stop tracking vendor lib files
31906a78 WIP : Js and css cleanup ← point de départ du WIP
30587248 ← ancêtre commun avec main
État du working tree : propre. dotnet test : 11/11 verts.
Serveur dev local démarre sans warning (à part le certificat
HTTPS de dev non trusted, sans gravité).
main (à remettre au niveau)
2a9760ca docs: roadmap à jour, archive TODO.fr
8f768240 WIP: refactoring pour déploiement
30587248 ← même ancêtre commun
État runtime connu : look catastrophique sur
http://localhost:5000. Diagnostic (cf.
§ Résultats du diagnostic) :
- Le HTML est rendu correctement, toutes les CSS et JS sont servies en HTTP 200.
- Le "look catastrophique" vient du contenu vide (Home/Index n'a aucune section) et d'une erreur JS dans un script inline qui plante quand le carousel est vide.
refac/js-bundle (suspendue)
fad7fc8d refac: remove jQuery + jQuery UI imports from datetime
79658c84 refac: remove vendor imports from chat entry
6455178b refac: load jQuery + Bootstrap as global scripts in _Layout
ed7522c5 fix: drop nuget bootstrap and popper.js, npm bundles
196f4b0b chore: gitignore node_modules, build/, wwwroot/lib
Trois commits de migration jQuery-en-script-global. Pas encore
fusionnés dans themeok ni dans main. À intégrer dans le
plan, mais pas en première priorité.
Résultats du diagnostic
Reproduit en worktree ~/Workspace/yavsc-main/ sur branche
diag/main (basée sur main@2a9760ca).
Procédure
git worktree add -b diag/main ../yavsc-main main
cp ~/Workspace/yavsc/.env ~/Workspace/yavsc-main/.env
# Forcer le port : appsettings de main contient
# "Kestrel.Endpoints.Http.Url": "http://localhost:3002" qui entre
# en conflit avec le port 5000 du dev settings. Override par env :
cd ~/Workspace/yavsc-main/src/Yavsc.Org
Kestrel__Endpoints__Http__Url=http://localhost:5060 \
Kestrel__Endpoints__Https__Url=https://localhost:5061 \
ConnectionStrings__YavscConnection="Server=localhost;Port=5432;Database=yavscdev;Username=yavscdev;Password=***" \
ASPNETCORE_ENVIRONMENT=Development \
dotnet bin/Debug/net10.0/Yavsc.Org.dll
Note de Paul : la procédure d'install / dev principale est en fait
cd contrib; make reinstall(qui build en Release, copie vers/srv/www/yavsc/, et gere le service systemdyavscOrgsur port 3002). Ledotnet rundirect n'est qu'un raccourci de debug. Le diagnostic ci-dessus a été fait endotnet runsur un port libre (5060) parce que le port 3002 etait deja occupe par le service systemd existant.
Fichiers servis (HTTP 200, taille correcte)
| URL | Code | Taille |
|---|---|---|
/lib/jquery-ui/jquery-ui.min.css |
200 | 30770 |
/lib/bootstrap.quartz.min.css |
200 | 244113 |
/css/site.css |
200 | 3009 |
/lib/jquery-ui/external/jquery/jquery.js |
200 | 285314 |
/lib/jquery-ui/jquery-ui.js |
200 | 521054 |
/lib/bootstrap/dist/js/bootstrap.bundle.min.js |
200 | 80721 |
/js/site.js |
200 | 364 |
/lib/bootstrap/js/carousel.js |
200 | 7141 |
HTML rendu (extrait du <body>)
<nav class="navbar navbar-expand-sm navbar-dark bg-dark">...</nav>
<div id="myCarousel" class="carousel slide" data-ride="carousel" data-interval="6000">
<div class="carousel-inner" role="listbox">
</div> <!-- VIDE -->
</div>
<div class="container py-4">
<!-- VIDE -->
</div>
<footer class="border-top footer text-muted">
<div class="container">© WTFPL 2025 ...</div>
</footer>
<script>
$(document).ready(function(){
var car = $('.carousel').first();
var fi = car.children('.carousel-inner').first()
.children('.item').first(); <!-- null : plante -->
var capt = fi.children('.carousel-caption-s');
fi.addClass('active');
car.animate({...});
})
</script>
Cause racine
-
Le HTML est structurellement correct : navbar Bootstrap 5
bg-dark, carousel Bootstrap 4 (data-ride), container Bootstrap. Toutes les CSS et JS sont chargées. -
Le carousel est vide (
<div class="carousel-inner">sans enfant.item). Le script inlinecar.children('.carousel-inner').first().children('.item').first()retournenull→fi.children(...)lèveTypeError: Cannot read properties of null→ erreur console qui stoppe la chaîne d'initialisation. -
Le container principal est vide : aucune section de contenu → page visuellement blanche malgré le BG art.
Diff main vs themeok (fichiers versionnés)
| Fichier | Diff |
|---|---|
_Layout.cshtml |
identique |
_Nav.cshtml |
identique |
site.css |
identique |
_Layout.cshtml.css (Razor scoped) |
identique |
appsettings-org.Development.json |
identique |
appsettings-org.json (production) |
Kestrel.Endpoints.Http.Url = 3002 sur main, absent sur themeok |
Donc structurellement, main et themeok servent le même
HTML quand on les lance en dev. La différence visible est due
au contenu des vues, pas aux fichiers de structure.
Critères d'acceptation
Le défi est résolu quand :
- CA1 :
maincontient les 4 commits dethemeok(d71490f5,379413f3,76fef567,ec8fd4b6) — par merge ou cherry-pick. - CA2 : la branche
refac/js-bundleest mergée (ou re-intégrée) surmain, via un commit explicite (pas un merge fast-forward silencieux). - CA3 : un test d'UI automatisé (Selenium Driver) existe et
passe sur
mainET surthemeok. Le test vérifie au minimum :- la page d'accueil répond 200,
- le HTML contient la navbar Bootstrap,
- la CSS
bootstrap.quartz.min.cssest chargée sans erreur, - aucun script
<script src>ne retourne 404.
- CA4 : la liste des vendor libs effectivement utilisées
par le code applicatif est documentée (un fichier
doc/vendor-libs.mdou équivalent). Tout fichier danswwwroot/lib/non listé est candidat à la suppression. - CA5 : aucun script inline ne plante au chargement d'une page. Vérifié par le test d'UI (CA3) qui collecte les erreurs console.
- CA6 :
Home/Index.cshtmlcontient au moins une section visible (hero ou équivalent) — sinon le "look catastrophique" persiste même avec tout le reste correct.
Stratégie de tests d'UI automatisés
Outil proposé : Playwright (C# / .NET, pour rester dans la stack actuelle). À introduire en premier, avant les autres commits, pour servir de filet de sécurité dès le début.
Phase A — Bootstrap des tests UI
- Créer un projet de test UI séparé :
test/yavsc.UiTests/yavsc.UiTests.csproj - Dépendance :
Microsoft.Playwright(NuGet). - Une classe
BaseUiTestqui :- démarre le serveur sur un port dédié (5050 par convention),
- configure Kestrel via
WebApplicationFactory<Program>, - lance Playwright en mode headless.
- Un premier test
HomePage_ShouldRenderqui vérifie CA3.
Phase B — Extension de la couverture
Tests à ajouter au fil de l'eau, un par commit :
HomePage_Navbar_IsBootstrapDarkHomePage_NoConsoleErrorsAccountPage_Login_AndLogout(quand pertinent)BlogListPage_Renders
Garde-fou
À chaque commit qui touche Views/, wwwroot/, ou
HostingExtensions.cs, les tests UI doivent passer. C'est
la règle. Si on n'a pas le temps de migrer toute la suite de
tests, on ajoute au moins un test qui couvre le changement.
Plan d'attaque
Étape 0 — Tests UI (garde-fou immédiat)
Avant tout cherry-pick, mettre en place le projet de tests UI et le premier test CA3. C'est le filet.
Étape 1 — Cherry-pick des commits themeok sur main
Dans l'ordre chronologique, en testant à chaque commit :
d71490f5(gitignore)379413f3(snapshot, vide)76fef567(Quill)ec8fd4b6(cookies)
OU un merge themeok → main (plus risqué si main a divergé
entre temps, mais ici c'est le bon choix car les 4 commits sont
consécutifs et bien isolés).
Étape 2 — Nettoyage de fond
- Lister les vendor libs (
wwwroot/lib/) réellement utilisées par le code (grepsrc/Yavsc.Org/). - Documenter dans
doc/vendor-libs.md. - Pour les libs inutilisées :
git rm(trackées) ou documentation (non trackées surthemeok). - Pour les libs utilisées : confirmer qu'elles sont dans
package.jsonou statiquement référencées par un bundle esbuild.
Étape 3 — Fusion refac/js-bundle → main
Cherry-pick des 3 commits, ou merge de la branche. Vérifier que
core.bundle.min.js (et les autres bundles) se génèrent
correctement via npm run build:js après le merge.
Étape 4 — Test runtime manuel
- Démarrer le serveur dev.
- Naviguer sur Home, About, Contact, Blogspot, Account/Login.
- Vérifier visuellement l'absence d'erreur console.
- Comparer avec l'état de référence sur
themeok.
Étape 5 — Remplir Home/Index.cshtml (optionnel)
Si on a le temps et le contenu, ajouter une section hero et une section services, pour que la page d'accueil ne soit plus vide.
Risques identifiés
R1 — Cache navigateur trompeur
Après un git checkout rapide, le navigateur peut servir une
version cachée du bundle avec un hash obsolète. Toujours faire
Ctrl+Shift+R ou vider le cache avant de juger un look.
Mitigation : le test UI (CA3) charge en Playwright, qui ne cache pas. Donc on a un verdict objectif.
R2 — Double binding Kestrel : main veut 3002, dev settings forcent 5000
appsettings-org.json sur main contient
"Kestrel": { "Endpoints": { "Http": { "Url": "http://localhost:3002" } } }.
Le dev settings le merge avec 5000/5001, mais en prod-like (via
make reinstall + systemd), c'est 3002.
Ce qu'on a en local :
- Service systemd
yavscOrg(useryavsc,ExecStart=/srv/www/yavsc/Yavsc.Org) : tourne sur port 3002, sert le build Release publié. C'est ce que Paul utilise pour le dev runtime "proche prod". dotnet rundepuis VSCode (ou worktree) :ASPNETCORE_ENVIRONMENT=Development→ port 5000/5001 viaappsettings-org.Development.json.
Les deux setups sont légitimes et cohabitent. Le test d'UI automatique doit pouvoir tourner contre les deux.
Décision à prendre : doit-on garder cette divergence main/themeok ou aligner ? Mon avis : aligner sur 5000/5001 partout en dev, et garder 3002 pour la prod (ce qui est déjà le cas implicitement).
R3 — .env non versionné
Le .env contient des secrets SMTP/ANTHROPIC et n'est pas dans
git. Le copier manuellement sur un worktree est une opération
manuelle qu'on peut oublier.
Mitigation : doc/install.md doit documenter cette étape. À
réviser.
R4 — Ports utilisés
5000/5001 : dev Yavsc
3001/3002 : autre service yavsc user (prod-like) sur la machine
5050/5051, 5060/5061 : ports libres utilisés pour diag/tests
À documenter pour ne pas se marcher dessus.
R5 — Quiproquos de branches
On a déjà perdu du temps dans cette session à ne pas savoir
quelle branche était active. Règle : toujours vérifier
git branch -a et git status au début d'une session, et
l'écrire en mémo.
Ce qui est déjà fait (récap session 2026-06-14)
- 4 commits sur
themeok(cf. log ci-dessus) - Worktree
~/Workspace/yavsc-main/surdiag/maincréé - Diagnostic de
maineffectué, cause racine identifiée - 11/11 tests
dotnet testverts dotnet build0 erreur
À faire
Court terme (prochaine session)
- Phase 0a : documenter
cd contrib; make reinstalldansdoc/install.md(s'il existe, à créer sinon) — c'est la procédure officielle de Paul, elle doit être la référence - Phase 0b : bootstrap tests UI Playwright
- Phase 1 : cherry-pick ou merge des 4 commits sur
main - Phase 2 :
doc/vendor-libs.md
Moyen terme
- Phase 3 : fusion
refac/js-bundle - Phase 4 : test runtime manuel
- Phase 5 : remplir
Home/Index.cshtml(si scope confirmé)
Long terme (backlog)
- Auditer les autres vues internes pour migration Bootstrap 5
- Documenter la procédure d'install (incluant la copie
manuelle du
.env) - Réviser
doc/install.mdsi existant - CI : intégrer les tests UI Playwright dans le pipeline
Annexes
Liens utiles
doc/Architecture.md: architecture générale de YavscROADMAP.md: roadmap produitgit log themeok: historique de la branche de référencegit log refac/js-bundle: branche de migration jQuery
Historique de cette session
Voir memory/2026-06-14.md (mémo interne OpenClaw) pour le récit
détaillé, quiproquos compris. Ce document-ci est l'énoncé
exécutif ; le mémo est l'historique de travail.
Environnement d'exécution (état au 2026-06-14)
Sur la machine de dev, deux process Yavsc peuvent tourner en parallèle :
| Process | Port | User | Lance par | Build |
|---|---|---|---|---|
Service systemd yavscOrg |
3002 | yavsc |
cd contrib; make reinstall |
Release |
dotnet run / VSCode |
5000 | paul |
VSCode ou CLI | Debug |
Avant de lancer un nouveau dotnet run :
ss -ltn | grep -E ':5000|:5001|:3002|:3001': voir qui écouteps -ef | grep Yavsc.Org: voir les process- Si 5000 occupé par
paul: OK, c'est ton dev - Si 5000 occupé par autre : ne pas lancer, choisir un
autre port (5060+) ET modifier
appsettings-org.Development.jsondu worktree pour pointer dessus (les vars d'envKestrel__Endpoints__*__Urlpeuvent forcer le port) - Ne jamais toucher au service systemd sauf demande explicite de Paul