Files
pgr/deltas/0.1.1/alpha.4.md
2026-09-27 11:33:12 +02:00

8.4 KiB

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 :

0.1.1-alpha.3.fix.2

Version après application :

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 :

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, 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 :

VERSION
docs/000-README.md
docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
docs/rules/550-VITE.md

ADD :

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 :

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 '<!-- version: 27 -->' docs/000-README.md
grep -Fx '<!-- version: 7 -->' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
grep -Fx '<!-- version: 2 -->' docs/rules/550-VITE.md
grep -Fx '<!-- version: 1 -->' 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] == "<!-- version: 3 -->"
assert Path("docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md").read_text(encoding="utf-8").splitlines()[1] == "<!-- version: 3 -->"
assert Path("docs/rules/560-CSS_SASS.md").read_text(encoding="utf-8").splitlines()[1] == "<!-- version: 1 -->"
assert Path("docs/rules/710-TAURI.md").read_text(encoding="utf-8").splitlines()[1] == "<!-- version: 6 -->"

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 :

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.