Files
pgr/deltas/0.1.1/alpha.3.md
2026-09-27 10:56:05 +02:00

9.8 KiB

Delta 0.1.1-alpha.3 — TypeScript et écosystème de package

Baseline et version

Baseline attendue : commit opérateur de 0.1.1-alpha.2.fix.1, réalisé après application de history/0.1.1/alpha.2.fix.1.md avec statut PASS.

Le hash de ce commit n'est pas anticipé.

Version avant application :

0.1.1-alpha.2.fix.1

Version après application :

0.1.1-alpha.3

Objet

Détailler les owners 530 TypeScript et 540 JavaScript package ecosystem, puis fournir une baseline minimale réutilisable pour une application Web TypeScript privée.

La tranche définit :

  • une baseline TypeScript stricte et indépendante du bundler ;
  • le script canonique typecheck ;
  • la responsabilité de package.json et de la sélection explicite du package manager ;
  • une politique de lockfile fondée sur le rôle du package et la reproductibilité ;
  • une paire minimale package.json + tsconfig.json sans version TypeScript, package manager, Vite, Sass, framework UI, host ou WASM imposés.

Vite reste réservé à alpha.4. CSS/Sass et la validation frontend réconciliée restent réservés à alpha.5.

Scope

REPLACE :

VERSION
docs/000-README.md
docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
docs/rules/530-TYPESCRIPT.md
docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md

ADD :

deltas/0.1.1/alpha.3.md
docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md
templates/web-typescript/package.json
templates/web-typescript/tsconfig.json

DELETE : aucun.

RULES.md, ROADMAP.md, CHANGELOG.md, les profils 550, 560, 710, les skeletons, scripts Python, tests et matrices de validation restent inchangés.

Aucun history/0.1.1/alpha.3.md n'est anticipé.

Décisions TypeScript

La baseline générique contrôlée active :

strict
noEmit
noUnusedLocals
noUnusedParameters
noFallthroughCasesInSwitch

Elle n'impose pas :

target
module
moduleResolution
lib
types
jsx
include/exclude
aliases
Vite
WASM
Tauri

Ces choix dépendent du runtime, du host, du bundler ou du layout réel.

Le script typecheck SHOULD exposer la vérification TypeScript indépendamment du bundler. Le template utilise :

tsc --noEmit

Le package manager reste responsable de l'invocation réelle de ce script.

Décisions package manager / manifest

PGR ne choisit toujours pas npm, pnpm, yarn, Bun ou un autre outil par défaut.

Le projet MUST rendre son choix de package manager explicite dans un owner local approprié. Le champ packageManager de package.json MAY être utilisé lorsque la toolchain le permet, mais PGR ne peut pas y inscrire une version fictive dans son template générique.

Pour une application non publiée, private: true SHOULD être utilisé.

Le template package.json n'invente ni version de package, ni dépendance, ni champ de publication. Il fournit seulement un nom d'exemple, private: true et le script typecheck.

Politique de lockfile

La politique PGR est désormais :

application privée / déployable
    -> lockfile SHOULD être versionné

bibliothèque publiée
    -> lockfile MAY être versionné pour dev/CI
       mais le manifest reste le contrat consommateur

template / fixture sans résolution réelle
    -> lockfile MAY être absent

Un package SHOULD NOT conserver plusieurs lockfiles concurrents sauf migration temporaire explicitement documentée.

Lorsqu'un lockfile est versionné, CI SHOULD utiliser le mode gelé/immutable/clean-install équivalent du package manager choisi.

La politique historique Games sans lockfile n'est donc ni réécrite ni qualifiée rétroactivement de défaut. Son adoption 0.1.5 décidera package par package entre ADOPT et OVERRIDE.

Templates

Les deux fichiers copiables sont :

templates/web-typescript/package.json
templates/web-typescript/tsconfig.json

Ils sont volontairement du JSON strict, donc ne portent pas de commentaires internes file/version.

Leur contrat et leurs étapes d'adaptation sont documentés dans :

docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md

La paire ne constitue pas encore un skeleton frontend.

Validation opérateur

Après application du history PASS, commit/push de alpha.2.fix.1, puis application du présent delta :

test "$(cat VERSION)" = '0.1.1-alpha.3'
git cat-file -e HEAD:history/0.1.1/alpha.2.fix.1.md
test -f history/0.1.1/alpha.2.fix.1.md
test -f deltas/0.1.1/alpha.3.md
test ! -e history/0.1.1/alpha.3.md

grep -A2 '^## Statut$' history/0.1.1/alpha.2.fix.1.md | grep -Fx 'PASS'
grep -Fx '<!-- version: 26 -->' docs/000-README.md
grep -Fx '<!-- version: 4 -->' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
grep -Fx '<!-- version: 2 -->' docs/rules/530-TYPESCRIPT.md
grep -Fx '<!-- version: 2 -->' docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md
grep -Fx '<!-- version: 1 -->' docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md

python3 -B - <<'PYGATE'
from pathlib import Path
import json
import re

history = Path('history/0.1.1/alpha.2.fix.1.md').read_text(encoding='utf-8')
assert re.search(r'## Statut\s+PASS\s', history)

typescript = Path('docs/rules/530-TYPESCRIPT.md').read_text(encoding='utf-8')
for phrase in (
    'strict = true',
    'noEmit = true',
    'noUnusedLocals = true',
    'noUnusedParameters = true',
    'noFallthroughCasesInSwitch = true',
    'typecheck',
    'tsc --noEmit',
    'MUST NOT les figer',
):
    assert phrase in typescript, phrase

packages = Path('docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md').read_text(encoding='utf-8')
for phrase in (
    'private: true',
    'MUST sélectionner explicitement son package manager',
    'typecheck',
    'SHOULD** être versionné',
    'SHOULD NOT** conserver simultanément plusieurs lockfiles',
    'MUST NOT transformer `npm ci` en commande universelle',
    '`ADOPT` cette recommandation',
    '`OVERRIDE`',
):
    assert phrase in packages, phrase

package = json.loads(Path('templates/web-typescript/package.json').read_text(encoding='utf-8'))
tsconfig = json.loads(Path('templates/web-typescript/tsconfig.json').read_text(encoding='utf-8'))

assert package == {
    'name': 'project-web',
    'private': True,
    'scripts': {'typecheck': 'tsc --noEmit'},
}
assert tsconfig == {
    'compilerOptions': {
        'strict': True,
        'noEmit': True,
        'noUnusedLocals': True,
        'noUnusedParameters': True,
        'noFallthroughCasesInSwitch': True,
    }
}

guide = Path('docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md').read_text(encoding='utf-8')
for phrase in (
    'package manager concret',
    'version TypeScript',
    'target ECMAScript',
    'Vite ou autre bundler',
    "n'acceptent pas un header commentaire PGR",
    'npm run typecheck',
    'pnpm typecheck',
    'yarn typecheck',
):
    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 (
    'Statut opérateur : **PASS**.',
    'application privée ou déployable `SHOULD` versionner le lockfile',
    "`DEFER` jusqu'à l'adoption `0.1.5`",
    'script canonique `typecheck`',
    'Vite reste réservé à `alpha.4`',
):
    assert phrase in plan, phrase

assert Path('docs/rules/550-VITE.md').read_text(encoding='utf-8').splitlines()[1] == '<!-- version: 1 -->'
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.3 TypeScript/package audit: clean (strict typecheck, package-manager neutral, role-based lockfile policy, 2 JSON templates parsed)')
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/530-TYPESCRIPT.md docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md \
    docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md \
    templates/web-typescript/package.json templates/web-typescript/tsconfig.json \
    deltas/0.1.1/alpha.3.md

git diff --cached --check
git status --short

Le scope indexé attendu avant ajout du history est exactement :

M  VERSION
A  deltas/0.1.1/alpha.3.md
M  docs/000-README.md
M  docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md
M  docs/rules/530-TYPESCRIPT.md
M  docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md
A  docs/templates/008-WEB_TYPESCRIPT_PACKAGE.md
A  templates/web-typescript/package.json
A  templates/web-typescript/tsconfig.json

Revue opérateur complémentaire

Confirmer que :

  • la baseline TypeScript générique ne fige aucun choix propre à Vite, Node, WASM ou Tauri ;
  • typecheck reste une preuve indépendante et ne devient pas une responsabilité du bundler ;
  • PGR ne sélectionne aucun package manager universel ;
  • le lockfile est recommandé pour les applications privées/déployables sans imposer la même politique aux bibliothèques publiées ;
  • le template package.json n'invente aucune version de dépendance ou de package manager ;
  • les deux JSON restent des templates minimaux, pas un skeleton frontend ;
  • aucun contenu de alpha.4 ou alpha.5 n'est absorbé.

Transition

PASS

Produire history/0.1.1/alpha.3.md, l'appliquer puis committer/pousser la tranche. Préparer ensuite 0.1.1-alpha.4 consacré à Vite, au dev server et aux outputs.

FAIL

Consigner le diagnostic réel dans history/0.1.1/alpha.3.md et rester dans alpha.3.fix.M sauf REPLAN explicitement justifié.