@eqs/tooling 0.8.0 : scripts/ n'est pas publié, conformite.js ne se charge pas et eqs doctor perd TOUS les contrôles du package #44
Closed
opened 2026-09-10 03:55:23 +00:00 by nicolas-fryder
·
1 comment
No Branch/Tag specified
main
dev
@eqs/tooling@0.24.3
@eqs/testing@0.24.3
@eqs/telemetry@0.24.3
@eqs/platform-next@0.24.3
@eqs/platform-nest@0.24.3
@eqs/http@0.24.3
@eqs/errors@0.24.3
@eqs/config@0.24.3
@eqs/cli@0.24.3
@eqs/auth@0.24.3
@eqs/tooling@0.24.2
@eqs/testing@0.24.2
@eqs/telemetry@0.24.2
@eqs/platform-next@0.24.2
@eqs/platform-nest@0.24.2
@eqs/http@0.24.2
@eqs/errors@0.24.2
@eqs/config@0.24.2
@eqs/cli@0.24.2
@eqs/auth@0.24.2
@eqs/tooling@0.24.1
@eqs/testing@0.24.1
@eqs/telemetry@0.24.1
@eqs/platform-next@0.24.1
@eqs/platform-nest@0.24.1
@eqs/http@0.24.1
@eqs/errors@0.24.1
@eqs/config@0.24.1
@eqs/cli@0.24.1
@eqs/auth@0.24.1
@eqs/tooling@0.24.0
@eqs/testing@0.24.0
@eqs/telemetry@0.24.0
@eqs/platform-next@0.24.0
@eqs/platform-nest@0.24.0
@eqs/http@0.24.0
@eqs/errors@0.24.0
@eqs/config@0.24.0
@eqs/cli@0.24.0
@eqs/auth@0.24.0
@eqs/tooling@0.23.0
@eqs/testing@0.23.0
@eqs/telemetry@0.23.0
@eqs/platform-next@0.23.0
@eqs/platform-nest@0.23.0
@eqs/http@0.23.0
@eqs/errors@0.23.0
@eqs/config@0.23.0
@eqs/cli@0.23.0
@eqs/auth@0.23.0
@eqs/tooling@0.22.0
@eqs/testing@0.22.0
@eqs/telemetry@0.22.0
@eqs/platform-next@0.22.0
@eqs/platform-nest@0.22.0
@eqs/http@0.22.0
@eqs/errors@0.22.0
@eqs/config@0.22.0
@eqs/cli@0.22.0
@eqs/auth@0.22.0
@eqs/tooling@0.21.0
@eqs/testing@0.21.0
@eqs/telemetry@0.21.0
@eqs/platform-next@0.21.0
@eqs/platform-nest@0.21.0
@eqs/http@0.21.0
@eqs/errors@0.21.0
@eqs/config@0.21.0
@eqs/cli@0.21.0
@eqs/auth@0.21.0
@eqs/tooling@0.20.0
@eqs/testing@0.20.0
@eqs/telemetry@0.20.0
@eqs/platform-next@0.20.0
@eqs/platform-nest@0.20.0
@eqs/http@0.20.0
@eqs/errors@0.20.0
@eqs/config@0.20.0
@eqs/cli@0.20.0
@eqs/auth@0.20.0
@eqs/tooling@0.19.0
@eqs/testing@0.19.0
@eqs/telemetry@0.19.0
@eqs/platform-next@0.19.0
@eqs/platform-nest@0.19.0
@eqs/http@0.19.0
@eqs/errors@0.19.0
@eqs/config@0.19.0
@eqs/cli@0.19.0
@eqs/auth@0.19.0
@eqs/tooling@0.17.1
@eqs/testing@0.17.1
@eqs/telemetry@0.17.1
@eqs/platform-next@0.17.1
@eqs/platform-nest@0.17.1
@eqs/http@0.17.1
@eqs/errors@0.17.1
@eqs/config@0.17.1
@eqs/cli@0.17.1
@eqs/auth@0.17.1
@eqs/tooling@0.17.0
@eqs/testing@0.17.0
@eqs/telemetry@0.17.0
@eqs/platform-next@0.17.0
@eqs/platform-nest@0.17.0
@eqs/http@0.17.0
@eqs/errors@0.17.0
@eqs/config@0.17.0
@eqs/cli@0.17.0
@eqs/auth@0.17.0
@eqs/tooling@0.16.0
@eqs/testing@0.16.0
@eqs/telemetry@0.16.0
@eqs/platform-next@0.16.0
@eqs/platform-nest@0.16.0
@eqs/http@0.16.0
@eqs/errors@0.16.0
@eqs/config@0.16.0
@eqs/cli@0.16.0
@eqs/auth@0.16.0
@eqs/tooling@0.15.0
@eqs/testing@0.15.0
@eqs/telemetry@0.15.0
@eqs/platform-next@0.15.0
@eqs/platform-nest@0.15.0
@eqs/http@0.15.0
@eqs/errors@0.15.0
@eqs/config@0.15.0
@eqs/cli@0.15.0
@eqs/auth@0.15.0
@eqs/tooling@0.14.0
@eqs/testing@0.14.0
@eqs/telemetry@0.14.0
@eqs/platform-next@0.14.0
@eqs/platform-nest@0.14.0
@eqs/http@0.14.0
@eqs/errors@0.14.0
@eqs/config@0.14.0
@eqs/cli@0.14.0
@eqs/auth@0.14.0
@eqs/tooling@0.13.0
@eqs/testing@0.13.0
@eqs/telemetry@0.13.0
@eqs/platform-next@0.13.0
@eqs/platform-nest@0.13.0
@eqs/http@0.13.0
@eqs/errors@0.13.0
@eqs/config@0.13.0
@eqs/cli@0.13.0
@eqs/auth@0.13.0
@eqs/tooling@0.12.2
@eqs/testing@0.12.2
@eqs/telemetry@0.12.2
@eqs/platform-next@0.12.2
@eqs/platform-nest@0.12.2
@eqs/http@0.12.2
@eqs/errors@0.12.2
@eqs/config@0.12.2
@eqs/cli@0.12.2
@eqs/auth@0.12.2
@eqs/tooling@0.12.1
@eqs/testing@0.12.1
@eqs/telemetry@0.12.1
@eqs/platform-next@0.12.1
@eqs/platform-nest@0.12.1
@eqs/http@0.12.1
@eqs/errors@0.12.1
@eqs/config@0.12.1
@eqs/cli@0.12.1
@eqs/auth@0.12.1
@eqs/tooling@0.12.0
@eqs/testing@0.12.0
@eqs/telemetry@0.12.0
@eqs/platform-next@0.12.0
@eqs/platform-nest@0.12.0
@eqs/http@0.12.0
@eqs/errors@0.12.0
@eqs/config@0.12.0
@eqs/cli@0.12.0
@eqs/auth@0.12.0
@eqs/tooling@0.11.2
@eqs/testing@0.11.2
@eqs/telemetry@0.11.2
@eqs/platform-next@0.11.2
@eqs/platform-nest@0.11.2
@eqs/http@0.11.2
@eqs/errors@0.11.2
@eqs/config@0.11.2
@eqs/cli@0.11.2
@eqs/auth@0.11.2
@eqs/tooling@0.11.1
@eqs/testing@0.11.1
@eqs/telemetry@0.11.1
@eqs/platform-next@0.11.1
@eqs/platform-nest@0.11.1
@eqs/http@0.11.1
@eqs/errors@0.11.1
@eqs/config@0.11.1
@eqs/cli@0.11.1
@eqs/auth@0.11.1
@eqs/tooling@0.11.0
@eqs/testing@0.11.0
@eqs/telemetry@0.11.0
@eqs/platform-next@0.11.0
@eqs/platform-nest@0.11.0
@eqs/http@0.11.0
@eqs/errors@0.11.0
@eqs/config@0.11.0
@eqs/cli@0.11.0
@eqs/auth@0.11.0
@eqs/tooling@0.10.1
@eqs/testing@0.10.1
@eqs/telemetry@0.10.1
@eqs/platform-next@0.10.1
@eqs/platform-nest@0.10.1
@eqs/http@0.10.1
@eqs/errors@0.10.1
@eqs/config@0.10.1
@eqs/cli@0.10.1
@eqs/auth@0.10.1
@eqs/tooling@0.10.0
@eqs/testing@0.10.0
@eqs/telemetry@0.10.0
@eqs/platform-next@0.10.0
@eqs/platform-nest@0.10.0
@eqs/http@0.10.0
@eqs/errors@0.10.0
@eqs/config@0.10.0
@eqs/cli@0.10.0
@eqs/auth@0.10.0
@eqs/tooling@0.9.0
@eqs/testing@0.9.0
@eqs/telemetry@0.9.0
@eqs/platform-next@0.9.0
@eqs/platform-nest@0.9.0
@eqs/http@0.9.0
@eqs/errors@0.9.0
@eqs/config@0.9.0
@eqs/cli@0.9.0
@eqs/auth@0.9.0
@eqs/tooling@0.8.1
@eqs/testing@0.8.1
@eqs/telemetry@0.8.1
@eqs/platform-next@0.8.1
@eqs/platform-nest@0.8.1
@eqs/http@0.8.1
@eqs/errors@0.8.1
@eqs/config@0.8.1
@eqs/cli@0.8.1
@eqs/auth@0.8.1
@eqs/tooling@0.8.0
@eqs/testing@0.8.0
@eqs/telemetry@0.8.0
@eqs/platform-next@0.8.0
@eqs/platform-nest@0.8.0
@eqs/http@0.8.0
@eqs/errors@0.8.0
@eqs/config@0.8.0
@eqs/cli@0.8.0
@eqs/auth@0.8.0
@eqs/tooling@0.7.0
@eqs/testing@0.7.0
@eqs/telemetry@0.7.0
@eqs/platform-next@0.7.0
@eqs/platform-nest@0.7.0
@eqs/http@0.7.0
@eqs/errors@0.7.0
@eqs/config@0.7.0
@eqs/cli@0.7.0
@eqs/auth@0.7.0
@eqs/tooling@0.6.0
@eqs/testing@0.6.0
@eqs/telemetry@0.6.0
@eqs/platform-next@0.6.0
@eqs/platform-nest@0.6.0
@eqs/http@0.6.0
@eqs/errors@0.6.0
@eqs/config@0.6.0
@eqs/cli@0.6.0
@eqs/auth@0.6.0
@eqs/tooling@0.5.1
@eqs/testing@0.5.1
@eqs/telemetry@0.5.1
@eqs/platform-next@0.5.1
@eqs/platform-nest@0.5.1
@eqs/http@0.5.1
@eqs/errors@0.5.1
@eqs/config@0.5.1
@eqs/cli@0.5.1
@eqs/auth@0.5.1
@eqs/tooling@0.5.0
@eqs/testing@0.5.0
@eqs/telemetry@0.5.0
@eqs/platform-next@0.5.0
@eqs/platform-nest@0.5.0
@eqs/http@0.5.0
@eqs/errors@0.5.0
@eqs/config@0.5.0
@eqs/cli@0.5.0
@eqs/auth@0.5.0
@eqs/tooling@0.4.0
@eqs/testing@0.4.0
@eqs/telemetry@0.4.0
@eqs/platform-next@0.4.0
@eqs/platform-nest@0.4.0
@eqs/http@0.4.0
@eqs/errors@0.4.0
@eqs/config@0.4.0
@eqs/cli@0.4.0
@eqs/auth@0.4.0
@eqs/tooling@0.2.0
@eqs/telemetry@0.2.0
@eqs/errors@0.2.0
@eqs/config@0.2.0
@eqs/tooling@0.1.0
Labels
No labels
bug
duplicate
enhancement
help wanted
invalid
question
wontfix
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference
Infrastructure/eqs-platform#44
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Constaté le 2026-09-10 en montant le premier satellite réel de
@eqs/*0.7.0 à 0.8.0. Régression de publication, pas de code : le paquet publié est incomplet.Le symptôme
eqs doctorsort donc en échec sur un dépôt par ailleurs sain.La cause
conformite.js(ligne 11) fait :Mais le dossier
scripts/n'est pas dans le paquet :Et le
package.jsonpublié ne le déclare pas :scripts/manque à la liste. L'import échoue donc à l'installation, pas seulement à l'exécution du contrôle.Pourquoi c'est plus grave que le contrôle manquant
L'import est en tête de module. Quand il échoue, ce n'est pas
workspaces-dockerfilequi est indisponible : c'est@eqs/tooling/conformiteen entier. Tous les contrôles du paquet disparaissent d'un coup, y compris ceux qui marchaient en 0.7.0.Et la sortie est trompeuse dans le mauvais sens. Juste sous l'avertissement,
eqs doctoraffiche :C'est vrai des contrôles qui ont pu se charger, mais quelqu'un qui lit vite conclut que tout va bien — alors qu'un paquet entier de contrôles n'a pas tourné. La ligne d'échec finale rattrape, mais seulement si on va jusqu'en bas.
Autrement dit : un satellite qui monte en 0.8.0 perd silencieusement une partie de sa porte, tout en voyant « aucun problème statique ».
Ce qui rend le cas particulier
Ce contrôle est né de notre ticket eqs-satellite-template#7 — le
Dockerfilequi énumère les manifestes en dur, et l'installation partielle muette qui en découle. La réponse retenue était excellente et plus fine que ce que je proposais : plutôt que de figer une liste de workspaces dans le gabarit, un contrôle statique qui compare lesimportersdu lockfile auxCOPY …/package.jsonduDockerfile.Nous ne pouvons pas le vérifier : il ne se charge pas. Le défaut qu'il devait fermer reste donc ouvert en pratique pour tout satellite en 0.8.0.
Reproduction
Sur n'importe quel dépôt en
@eqs/tooling0.8.0 :Ce que je proposerais
Ajouter
"scripts"au champfilesde@eqs/tooling, et republier.Deux garde-fous qui auraient attrapé ça, si vous les jugez utiles :
npm packpuis unimportde chaque point d'entrée depuis le tarball extrait. C'est ce qui distingue « le code marche » de « le paquet publié marche », et c'est exactement la différence ici : le dépôt du socle est sain, seul le tarball est amputé.Ce qui est en place chez nous
Rien — il n'y a pas de contournement possible, et nous n'en voulons pas : ajouter le fichier à la main dans
node_modulesmasquerait le défaut pour tout le monde. Nous restons aveceqs doctoren échec jusqu'à la republication, et nous le rejouerons dès qu'elle sera là.À signaler si utile : le reste de la montée en 0.8.0 s'est très bien passée. Les cinq contournements que nous portions ont pu être retirés,
pnpm checkest vert, les 58 tests d'intégration passent, et les deux images Docker se construisent. C'est le seul point qui bloque.Vrai de bout en bout, et c'est ma régression.
@eqs/*0.8.1 est publiée enlatest.npm pack --dry-runsur la 0.8.0 rendait 13 fichiers, aucunscripts/. Votre diagnostic était exact jusqu'au détail : l'import est en tête de module, donc ce n'est pas un contrôle qui manquait, c'est le paquet entier de contrôles qui disparaissait — y compris ceux qui marchaient en 0.7.0.Ce qui est corrigé
Le module publié vit maintenant à la racine du paquet, avec
orval.jsetconformite.js. Je n'ai pas simplement ajouté"scripts"au champfilescomme vous le proposiez : ça aurait aussi embarqué le vérificateur depnpm check, qui n'a rien à faire chez un consommateur. La règle devient lisible — ce qui est publié est à la racine,scripts/est du développement.Votre garde-fou n°1, et il était le bon
Le
checkde@eqs/toolingvérifiait que chaque export existe dans l'arbre de travail, où tout est toujours là. C'est exactement pourquoi il n'a rien vu. Il éprouve désormais ce quenpm packemporte, et importe chaque point d'entrée depuis le tarball extrait.Vérifié dans les deux sens : vert tel quel, et en retirant le fichier du champ
files:Un détail qui a failli me faire renoncer : en déballant hors du dépôt, l'import échouait sur
typescript-eslint— la dépendance, pas le fichier manquant. Un faux positif qui aurait fait désactiver la vérification. Le bac est donc déballé dans le package, oùnode_modulesse résout en remontant.Votre garde-fou n°2, retenu aussi
eqs doctorne dit plus « Aucun problème statique » quand un paquet n'a pas pu se charger. Il dit « aucun problème statique parmi les contrôles qui ont pu se charger », et combien manquent. Votre formulation était juste : un contrôle qui ne se charge pas est plus inquiétant qu'un contrôle qui échoue, parce qu'on ne sait pas ce qu'on ne voit pas.La vérification, là où le défaut vivait
J'ai rejoué votre commande sur un dépôt qui installe le paquet depuis le registre, pas depuis l'arbre de travail :
Sortie 0, aucune erreur de chargement. Et pour que ce ne soit pas un silence trompeur :
Le contrôle né de votre ticket #7 est enfin exécutable chez un satellite. C'était le vrai coût de la régression : il existait, il était publié, et il ne tournait nulle part.
Puis la procédure complète — candidate sous
next, portes vertes sur le socle, le gabarit et la démo, bac à sable Coolify jusqu'au service en HTTPS, promotion sans republier.Une chose que je n'ai pas généralisée, et je préfère le dire. Les neuf autres packages publient des dossiers entiers (
dist,schemas,compose) : un fichier construit y arrive tout seul.@eqs/toolingest le seul à énumérer ses fichiers, donc le seul exposé à cette faute — c'est pourquoi la vérification du tarball vit dans sonchecket pas dans un harnais commun aux dix. Si l'un des autres gagne un jour un dossier de premier niveau, la même faute redeviendra possible chez lui.Merci d'avoir refusé le contournement. Ajouter le fichier à la main dans
node_modulesaurait masqué la régression pour tout le monde, et le contrôle serait resté muet dans les trente dépôts sans que personne le sache.eqs checkdéclare une tâcheknipque personne n'installe : le détecteur de code mort est éteint dans tous les satellites #51