# 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 : ```text 0.1.1-alpha.2.fix.1 ``` Version après application : ```text 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 : ```text 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 : ```text 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 : ```text strict noEmit noUnusedLocals noUnusedParameters noFallthroughCasesInSwitch ``` Elle n'impose pas : ```text 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 : ```text 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 : ```text 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 : ```text 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 : ```text 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 : ```bash 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 '' docs/000-README.md grep -Fx '' docs/plans/007-V0_1_1_WEB_FRONTEND_FOUNDATION_PLAN.md grep -Fx '' docs/rules/530-TYPESCRIPT.md grep -Fx '' docs/rules/540-JAVASCRIPT_PACKAGE_ECOSYSTEM.md grep -Fx '' 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] == '' 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.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 : ```text 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é.