# Delta 0.1.1-alpha.4 — Vite, dev server et outputs ## Baseline et version Baseline attendue : commit opérateur de `0.1.1-alpha.3.fix.2`, réalisé après application de `history/0.1.1/alpha.3.fix.2.md` avec statut `PASS`. Le hash de ce commit n'est pas anticipé. Version avant application : ```text 0.1.1-alpha.3.fix.2 ``` Version après application : ```text 0.1.1-alpha.4 ``` ## Objet Compléter l'owner `550-VITE.md` avec un contrat générique de dev server, cache, outputs et assets, puis documenter l'adaptation d'un projet Vite sans inventer un `vite.config.ts` universel. La tranche conserve Vite comme recommandation `SHOULD`, pas comme obligation. Elle ne modifie pas : - la baseline TypeScript/package de `alpha.3` ; - les règles de déclarations `@types/*` ; - le profil CSS/Sass réservé à `alpha.5` ; - le profil Tauri ; - WASM, backend ou deployment/operations. ## Décisions matérialisées Le contrat Vite distingue désormais explicitement : ```text sources versionnées cache Vite reproductible outputs build générés assets sources assets copiés/transformés ``` Le cache et les outputs `SHOULD` rester hors Git et `SHOULD` être externalisés hors de l'arborescence source lorsqu'un emplacement de build externe est raisonnablement disponible. `build.emptyOutDir = true` n'est acceptable que sur un répertoire dédié dont Vite possède entièrement le contenu généré. Le dev server reste local/loopback par défaut. L'exposition réseau est une décision explicite. `server.allowedHosts = true` et `server.cors = true` ne sont pas des défauts PGR. Lorsqu'une intégration dépend d'un port déterministe, le couple `server.port` + `server.strictPort = true` est recommandé. Les ports eux-mêmes restent locaux. `vite preview` est classifié comme prévisualisation/smoke local du build, jamais comme serveur de production. ## Pas de `vite.config.ts` générique artificiel La tranche ajoute [`docs/templates/009-WEB_VITE.md`](../../docs/templates/009-WEB_VITE.md), mais aucun fichier copiable `templates/web-vite/vite.config.ts`. Cette absence est volontaire : le corpus prouve l'owner et les responsabilités, mais pas une valeur universelle pour `root`, `base`, `cacheDir`, `outDir`, ports, aliases ou plugins. Un template exécutable pourra être ajouté ultérieurement si une configuration minimale réellement neutre est démontrée. PGR ne crée pas un fichier vide ou rempli de placeholders uniquement pour satisfaire un catalogue. ## Scope REPLACE : ```text VERSION docs/000-README.md docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md docs/rules/550-VITE.md ``` ADD : ```text docs/templates/009-WEB_VITE.md deltas/0.1.1/alpha.4.md ``` DELETE : aucun. ## Validation opérateur Après application du history `PASS`, commit/push de `alpha.3.fix.2`, puis application du présent delta : ```bash test "$(cat VERSION)" = '0.1.1-alpha.4' git cat-file -e HEAD:history/0.1.1/alpha.3.fix.2.md test -f history/0.1.1/alpha.3.fix.2.md test -f deltas/0.1.1/alpha.4.md test ! -e history/0.1.1/alpha.4.md grep -A2 '^## Statut$' history/0.1.1/alpha.3.fix.2.md | grep -Fx 'PASS' grep -Fx '' docs/000-README.md grep -Fx '' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md grep -Fx '' docs/rules/550-VITE.md grep -Fx '' docs/templates/009-WEB_VITE.md python3 -B - <<'PYGATE' from pathlib import Path import re history = Path("history/0.1.1/alpha.3.fix.2.md").read_text(encoding="utf-8") assert re.search(r"## Statut\s+PASS\s", history) vite = Path("docs/rules/550-VITE.md").read_text(encoding="utf-8") for phrase in ( "Vite **SHOULD** être le build tool/dev server privilégié", "PGR ne fournit pas de `vite.config.ts` universel", "`cacheDir` **SHOULD** être externalisé", "Le contenu de `build.outDir` est un output généré", "`build.emptyOutDir = true`", "`publicDir` est une capacité optionnelle", "PGR MUST NOT imposer le nom `frontend/`", "PGR MUST NOT imposer `./`, `/` ou un chemin de sous-répertoire universel", "Le dev server **SHOULD** rester limité à la machine locale/loopback", "`server.port` avec `server.strictPort = true`", "`server.allowedHosts = true` et `server.cors = true` **SHOULD NOT**", "Il MUST NOT être présenté comme serveur de production", "le build de production via le package manager choisi **SHOULD** faire partie de la gate", ): assert phrase in vite, phrase guide = Path("docs/templates/009-WEB_VITE.md").read_text(encoding="utf-8") for phrase in ( "ne fournit volontairement pas de `vite.config.ts` copiable universel", '"dev": "vite"', '"build": "vite build"', '"preview": "vite preview"', "typecheck -> tsc --noEmit", "build -> vite build", "Le nom `frontend/` observé dans Games est une convention locale", "PGR ne copie donc pas automatiquement `base: \"./\"`", "Le cache Vite est reproductible", "`build.outDir` contient des artefacts générés", "server.allowedHosts = true", "server.cors = true", "server.strictPort true", "Il ne constitue pas un serveur de production PGR", "PGR ne livre pas encore de `vite.config.ts` exécutable générique", ): assert phrase in guide, phrase plan = Path("docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md").read_text(encoding="utf-8") for phrase in ( "### alpha.3.fix.2 — correction de la gate des déclarations de types", "Statut opérateur : **PASS**.", "### alpha.4 — Vite, dev server et outputs", "sans créer un `vite.config.ts` universel artificiel", "TypeScript reste validé séparément ; CSS/Sass reste réservé à `alpha.5`.", ): assert phrase in plan, phrase index = Path("docs/000-README.md").read_text(encoding="utf-8") assert "templates/009-WEB_VITE.md" in index assert not Path("templates/web-vite/vite.config.ts").exists() assert Path("docs/rules/530-TYPESCRIPT.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/560-CSS_SASS.md").read_text(encoding="utf-8").splitlines()[1] == "" assert Path("docs/rules/710-TAURI.md").read_text(encoding="utf-8").splitlines()[1] == "" print("0.1.1 alpha.4 Vite contract audit: clean (outputs/cache explicit, dev server bounded, no fake universal config, alpha.5 untouched)") PYGATE python3 -B -m unittest discover -s tests -v python3 -B scripts/audit_markdown_headers.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_tables.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts python3 -B scripts/audit_markdown_links.py \ README.md RULES.md ROADMAP.md CHANGELOG.md docs deltas history prompts git diff --check git add VERSION docs/000-README.md \ docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md \ docs/rules/550-VITE.md docs/templates/009-WEB_VITE.md \ deltas/0.1.1/alpha.4.md git diff --cached --check git status --short ``` Le scope indexé attendu avant ajout du history de `alpha.4` est exactement : ```text M VERSION A deltas/0.1.1/alpha.4.md M docs/000-README.md M docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md M docs/rules/550-VITE.md A docs/templates/009-WEB_VITE.md ``` ## Revue opérateur complémentaire Confirmer que : - Vite reste `SHOULD`, jamais `MUST` universel ; - aucun package manager n'est imposé ; - aucun port, host, `base`, alias ou plugin n'est transformé en valeur universelle ; - aucun `vite.config.ts` artificiellement générique n'est ajouté ; - cache et outputs sont classifiés comme générés et hors Git ; - `emptyOutDir` ne peut viser qu'un output dédié ; - `preview` n'est pas présenté comme serveur de production ; - TypeScript/package ne sont pas réouverts ; - CSS/Sass reste réservé à `alpha.5` ; - Tauri/WASM/deployment restent hors scope. ## Transition ### PASS Produire `history/0.1.1/alpha.4.md`, l'appliquer puis committer/pousser `alpha.4`. Continuer avec `0.1.1-alpha.5`, consacré à CSS/Sass et à la validation frontend indépendante du host. ### FAIL Consigner le diagnostic réel dans `history/0.1.1/alpha.4.md`, puis produire `alpha.4.fix.N` ou effectuer un REPLAN si le défaut révèle une frontière d'ownership incorrecte. Ne pas absorber `alpha.5` dans un correctif Vite.