Installation prévisible, et le socle de qualité du parc - #33
Merged
Conversation
Sans `packageManager`, rien ne garantissait la version de pnpm au moment de l'installation. Or la quarantaine du workspace en dépend : `strictDepBuilds` et le caractère strict de `minimumReleaseAge` ne valent que sous pnpm 11. Une installation sous une version plus ancienne les aurait ignorés sans un mot. Le champ est posé sans somme de contrôle : `corepack use` l'aurait inscrite, et elle immobilise le fichier à chaque correctif de pnpm. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le commentaire disait déjà pourquoi il existe et pourquoi sa portée est restreinte. Il ne disait pas ce qui permettrait de le retirer — sans quoi il traverse les montées de version par inertie, faute de savoir quand le tester à la suppression. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`packageManager` posé, `pnpm/action-setup` voyait deux sources et refusait de démarrer — sans comparer les numéros, qui pourtant s'accordaient. Le workflow laisse `package.json` répondre. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`engines.pnpm` autorisait par écrit la 10, que `packageManager` interdit de fait ; six documents l'annonçaient encore comme prérequis. Les README disent au passage pourquoi c'est 11 : les gardes de `pnpm-workspace.yaml` en sont des fonctions, une majeure antérieure les ignore en silence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Le manifeste ne déclarait que des plages : une montée pouvait arriver par un simple `pnpm install`, sans apparaître au diff. Les 38 dépendances sont épinglées à la version réellement installée — donc `@vue/eslint-config-typescript` à 14.9.0 et `vue-eslint-parser` à 10.4.1, et non à la base de leur plage, qui aurait été un retour en arrière. `savePrefix` vide empêche `pnpm add` de réintroduire un `^` un paquet à la fois. `engines` ne nomme plus npm ni yarn : le projet ne s'installe pas autrement. `engineStrict` donne enfin un effet à ce champ, qui restait un vœu. Les overrides tiennent ce que l'épingle ne tient pas — les transitives, et le premier `pnpm up --latest` : typescript sous 7 tant que vue-tsc n'y survit pas, `@types/node` sous 25 tant que `engines.node` reste sur la 24. Le hoisting global est remplacé par les deux motifs dont le build a réellement besoin. Vérifié par un build complet des deux chaînes, application et vitrine. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck, 518 tests et le build de la SPA passent ; aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck, 518 tests et le build de la SPA passent ; aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et 518 tests passent. Le BFF démarre et route : vérifié en le lançant sur un port libre, écoute confirmée sur 127.0.0.1. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mineure. Lint, typecheck, 518 tests et le build de la SPA passent ; le seul avertissement au build est celui de taille de chunk, déjà présent avant. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Mineure. Lint, typecheck, 518 tests et les deux builds — SPA et vitrine — passent ; aucun avertissement nouveau. La montée déplace un train de transitives que la chaîne d'outils tient en plages : sass et sass-embedded en 1.103.1, vite en 8.2.2, rolldown en 1.2.5, open en 11.0.1. Deux paquets entrent dans l'arbre par `open` — `powershell-utils` et `wsl-utils` —, aucun n'exécute de script d'installation. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et 518 tests passent ; l'outil lance bien deux commandes en parallèle, vérifié hors de `dev:all` pour ne pas emporter les ports d'une instance en cours. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck et les 518 tests passent, exécutés par le nouveau binaire. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. C'est lui qui vérifie les types de `src/` pendant le build : le build complet de la SPA passe, sans avertissement nouveau. Lint, typecheck et 518 tests passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La montée casse le build : Quasar type ses packs de langue à deux endroits qui ont cessé de se rejoindre. `lang.d.ts` décrit un pack, `index.d.ts` décrit le paramètre de `Lang.set()`, et les libellés d'accessibilité ajoutés à `q-date` en 2.25 y arrivent dans deux formes incompatibles — `prevRangeYears?: (range: number)` d'un côté, `prevRangeYears: (range?: number)` de l'autre. Sous `exactOptionalPropertyTypes`, actif côté `src/`, l'un cesse d'être assignable à l'autre et `pnpm build` s'arrête sur `apply.ts`. Le défaut est amont : l'objet importé est exactement celui que `Lang.set` attend à l'exécution. Le type du paramètre est donc dérivé de la fonction elle-même plutôt que réécrit à la main — un vrai changement de forme resterait ainsi visible, là où un `as never` aurait tout tu. Vérifié à l'exécution, pas seulement à la compilation : la bascule de langue pose `lang="en-US"` puis `lang="fr"` sur le document, sans une erreur en console — donc le pack est bien chargé et appliqué. Lint, typecheck, 518 tests, build de la SPA et de la vitrine passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Lint, typecheck, tests et build passent sans changement. Aucun avertissement nouveau au build — le seul qui reste est la limite de taille de chunk, déjà présente avant la montée. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. Lint, typecheck, tests et build passent sans changement, aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Entraîne vite en 8.2.2, correctif de la même ligne — la transitive suit, la majeure ne bouge pas. Lint, typecheck, tests et build passent sans changement, aucun avertissement nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
La 10.9.1 existe déjà mais reste sous quarantaine : elle attendra le prochain relevé. Lint, typecheck, tests et build passent sans changement — aucune règle dépréciée signalée sur la configuration du projet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Correctif. C'est vue-tsc qui type `src/` au build, et l'override `typescript: <7` qui le tient debout : les deux restent en place, le build passe sans diagnostic nouveau. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Prettier lancé comme règle ESLint, et la configuration Vitest du parc : trois paquets que le dépôt n'avait pas. Les autres versions du socle — eslint 10.9.0, vue-tsc 3.3.11, typescript 6.0.3, prettier 3.9.6, vitest 4.1.11 — y étaient déjà. Ce commit ne fait qu'ajouter : rien ne les utilise encore. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Prettier passe de module qui ÉTEINT les règles de mise en forme à règle ESLint à part entière : `eslint-plugin-prettier/recommended` en dernier, et `@vue/eslint-config-prettier/skip-formatting` disparaît avec le paquet qui le portait. La mise en forme se vérifie désormais au même endroit que le reste, et se corrige par le même `--fix`. Arrivent avec lui les règles de style du socle — eqeqeq, curly, func-style, no-console, ban-ts-comment, vue/eqeqeq, vue/attributes-order, vue/define-emits-declaration — la règle `local/import-order` recopiée du socle, et la configuration Vitest du parc. `parserOptions.tsconfigRootDir` est ancré : sans lui, le service TypeScript se résout depuis le répertoire courant, ce qui va en ligne de commande mais pas dans un worker — vite-plugin-checker, l'IDE — où les règles typées se mettent à voir chaque type importé comme un type d'erreur. Les réglages de Prettier passent à ceux du parc (semi: false, printWidth 150, vueIndentScriptAndStyle, trailingComma), le .editorconfig dit la même chose qu'eux, et le lockfile sort du périmètre de Prettier. Le lint échoue maintenant, et c'est le but : 384 fichiers relus, 33 158 constats dont 32 637 de mise en forme, aucune erreur de parsing. Le reformatage vient au commit suivant, seul. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`prettier . --write` puis `eslint . --fix`. 392 fichiers touchés, aucune correction fonctionnelle : ce commit se relit en le sautant. Trois choses méritent d'être dites. `vue-tsc --noEmit` sort à 0 avant comme après. Le contrôle n'est pas de principe : ESLint ne voit pas les .vue avec des types complets, et rien dans le lint n'aurait signalé une assertion retirée à tort. Les correcteurs Vitest ont réécrit cinq fichiers de test — `expect(x.length).toBe(n)` devient `toHaveLength(n)`, `await expect(p)` devient `expects(p).resolves`. Équivalent, et les 518 tests passent. `local/import-order` reste en écart sur six fichiers, et c'est délibéré. Son correcteur remplace le bloc allant du premier au dernier import par les seuls imports triés : tout ce qui vit entre deux imports — les `export type … from` de `src/services/projects/index.ts`, les commentaires qui disent à quoi sert un groupe d'imports — disparaît sans un mot. Appliqué tel quel, il faisait passer `vue-tsc` de 0 à 152 erreurs. La règle est en `warn` chez le socle, elle le reste ici ; le défaut est du ressort du socle, pas de ce dépôt. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`func-style: ['error', 'declaration']` : 283 constats sur 105 fichiers, tous de la même forme — une fonction nommée écrite `const f = () => …`. La conversion est mécanique et n'a pas d'effet de bord ici : aucune de ces fonctions ne repose sur `this`, et une déclaration hissée ne peut que rendre plus permissif l'ordre dans lequel on l'appelle. Les douze règles de `server/diagnostics/rules.ts` étaient annotées par leur alias — `const historiqueRelu: SessionRule = (s, th) => …`. L'annotation est portée à la déclaration plutôt que perdue : la signature s'écrit en entier, et `SessionRule` continue de typer la table qui les rassemble. vue-tsc, tsc et les 518 tests passent. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`eqeqeq` relève cinq `==`, tous de la même intention : « nul ou absent ». Aucun n'avait besoin de la coercition. `b.server == null ? null : b.server` devient `b.server ?? null`, qui dit la même chose en une opération. Dans `json-edit.ts`, le `typeof x !== 'object'` qui suit écarte déjà `undefined` : seul `null` restait à nommer, puisque `typeof null` vaut `'object'`. Et un `dataset` ne rend jamais `null`, donc c'est `undefined` que le test cherchait. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`vitest/no-conditional-expect` vise le `try/catch` qui avale une assertion. Ici, les dix constats sont des branches sur la FORME de la donnée du corpus réel — « ce run est terminé », « ce constat porte un chiffre ». La garde passe donc dans la valeur testée : l'assertion devient inconditionnelle, donc plus forte, et un corpus qui ne présenterait plus le cas ne peut plus faire passer le test en silence. `vitest/valid-expect` refusait les onze `expect(valeur, libellé)`. Vitest accepte ce second argument — c'est le greffon qui garde le défaut de Jest, `maxArgs: 1`. La règle est accordée à l'outil plutôt que les libellés retirés : sur une boucle qui traverse tout le parc, c'est lui qui dit quelle session a fait échouer le test. À porter au socle. Reste 32 avertissements, tous assumés : `no-console` sur les trois scripts de ligne de commande, dont la sortie EST la console ; `require-to-throw-message` sur huit `toThrow()` qui vérifient qu'il y a rejet, pas lequel ; et les six `import-order` que son correcteur ne sait pas appliquer sans effacer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`verifie` enchaîne le lint, le typage et les tests : un seul geste avant de pousser, le même sur tout le parc. Arrivent avec lui `lint:fix` et `format:check`, et `format` devient `prettier . --write && pnpm lint:fix`. Le typecheck cesse de mentir. Il ne regardait que le BFF et les tests : le front n'était typé que pendant `pnpm dev` ou `pnpm build`, par vite-plugin-checker. Une modification d'un composant monofichier qui cassait les types passait donc pour vérifiée. `vue-tsc --noEmit -p tsconfig.json` ouvre la marche. Le lint quitte ses quatre globs pour `eslint .` — 384 fichiers relus au lieu des seuls src, server, shared et test — et prend un cache. `dev:all` appelle `pnpm dev` et `pnpm server` au lieu de recopier leurs lignes de commande : une seule définition à corriger le jour où l'une bouge. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Les six derniers constats de `local/import-order`, repris à la main plutôt que par son correcteur — celui-ci remplace le bloc allant du premier au dernier import par les seuls imports triés, et efface au passage tout ce qui vit entre eux. C'est précisément ce que ces six fichiers portaient : les `export type … from` que `src/services/projects/index.ts` réexporte, et les commentaires qui disent à quoi sert un groupe d'imports. Ils sont conservés, et déplacés là où ils gardent leur sens — l'en-tête « Normalised model » de `server/transcript.ts` descend sur le `export type` qu'il explique, et non sur les imports qui le précédaient par accident. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Huit `toThrow()` nus : ils vérifiaient qu'il y a rejet, jamais lequel. Une garde de chemin qui se mettrait à échouer pour une faute de frappe dans son propre code les laissait tous verts. Ils nomment maintenant ce qu'ils attendent : `PathError` pour la garde, dont c'est le type dédié ; « Instantané inconnu. » et « Chemin de backup invalide. » pour les deux refus distincts des sauvegardes — la nuance comptait, `readBackup` peut échouer sur l'un comme sur l'autre ; `ZodError` pour le schéma ; et `ENOENT` pour le pool, dont tout l'objet est de distinguer le fichier absent de la panne de thread. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`no-console` relevait seize appels. Treize sont dans les trois outils de ligne de commande, où la console n'est pas une trace oubliée mais l'interface de sortie : la règle y est éteinte au fichier, avec sa raison. Les trois autres sont éteints à la ligne, chacun pour son motif. Le dernier recours du BFF sort avant que Fastify n'existe, donc avant qu'il y ait un journal. Un pack de langue Quasar qui ne charge pas ne se dit pas à l'écran : l'application a déjà basculé, seuls ses libellés à elle sont restés en arrière. Et une préférence non écrite se rattrape au geste suivant. Le saut de `signals.test.ts` est la conclusion du test, pas son abandon : le corpus a bougé sous la mesure, et ce qu'on comparerait ne serait plus comparable. `ctx.skip` le dit à voix haute — c'est exactement ce que `no-disabled-tests` demande d'éviter de faire en silence. `pnpm lint` ne relève plus rien : zéro erreur, zéro avertissement. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Six fichiers affirmaient que `pnpm typecheck` ne couvre pas `src/` et que seul `pnpm build` type le front. Ce n'est plus vrai depuis que `vue-tsc` ouvre la marche — et une règle qui a cessé d'être vraie est pire qu'une règle absente. Le commentaire de la CI est repris pour la même raison : `build` reste, mais il ne rattrape plus une rupture de types. Il vérifie que Quasar sait produire le bundle, résoudre les alias et les imports dynamiques du manuel. Le gabarit de PR demande `pnpm verifie` plutôt que d'énumérer trois commandes. `quasar-specifics.md` gagne le point qui, lui, reste vrai : ESLint n'obtient pas de types complets sur les .vue, et une règle typée qui y retirerait une assertion ne serait rattrapée par rien. D'où le relevé de `vue-tsc` avant ET après un --fix de masse. Version 1.3.1, et le journal dit ce que les deux chantiers de cette branche ont changé. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Ce que change cette PR
Deux chantiers, dans cet ordre : rendre l'installation d'AURA prévisible, puis adopter le socle de qualité commun aux dépôts du parc.
L'installation — le gestionnaire de paquets est épinglé dans le manifeste, le socle exigé nomme la version que le projet fige, la politique d'installation dit ce qu'elle refuse, et la CI cesse de redemander une version qu'elle a déjà. Suivent quatorze montées de dépendances.
Le socle de qualité — le dépôt n'en portait qu'une partie : la mise en forme était disponible, jamais vérifiée, et le typecheck laissait le front dehors. Sept commits, dans l'ordre où ils se relisent :
e445255eslint-plugin-prettier,eslint-config-prettier,@lehoczky/eslint-config-viteste6db5d5eqeqeq,curly,func-style,no-console,ban-ts-comment, les règles Vue etlocal/import-order. 384 fichiers relus, 33 158 constats, aucune erreur de parsing.4cd4fcab940be3func-style: 283 conversionsconst f = () => …→function f() {}fbabd80==1339443if13471d2verifie,lint:fix,format:check, et un typecheck qui couvre le frontPuis les avertissements, jusqu'à zéro : ordre des imports repris à la main,
toThrow()qui nomment leur erreur, et quatre exceptions qui disent pourquoi elles en sont.Vérifié
pnpm verifie— lint, typage et tests. 0 erreur, 0 avertissement, 518 tests.pnpm buildpnpm dev:alldémarre les deux ports,pnpm stoples libèrevue-tsc --noEmitsort à 0 avant comme après le reformatagepnpm formatrelancé : ne modifie plus rienÀ savoir
Le correcteur de
local/import-orderefface. Il remplace le bloc allant du premier au dernierimportpar les seuls imports triés — lesexport type … fromet les commentaires posés entre deux imports disparaissent sans un mot. Appliqué tel quel parpnpm lint --fix, il a supprimé les ré-exports desrc/services/projects/index.tset fait passervue-tscde 0 à 152 erreurs. Le reformatage a donc été refait avec la règle neutralisée, chaque fichier comparé ligne à ligne avant/après pour repérer les pertes, et les six ordres restants repris à la main. Le défaut est du ressort du socle : à porter à VIGIE.vitest/valid-expectrefuseexpect(valeur, libellé), que Vitest accepte pourtant — le greffon garde le défaut de Jest (maxArgs: 1). Réglé ici en['error', { maxArgs: 2 }], avec sa raison. À porter à VIGIE également.Aucune règle du socle n'a été éteinte pour faire passer le lint. Les quatre exceptions restantes sont locales, à la ligne ou au fichier, et chacune dit son motif.
🤖 Generated with Claude Code