- eslint.config.js reprend l'exemple du README du paquet (préfixe app, comme dans
angular.json), plus les sorties ignorées par .gitignore (out-tsc, rapports
Playwright, cache de l'ETL…) : ESLint ne lit pas .gitignore, et un
playwright-report/index.html local serait sinon lu comme un template Angular.
- devDependencies aux mêmes plages que web-site (main) : eslint ^10.10.0,
@eslint/js ^10.0.1, typescript-eslint ^8.70.0, angular-eslint ^22.5.0. Le paquet
partagé les déclare en pairs optionnels : chaque dépôt qui l'importe les garde.
- Script "lint" : eslint .
`npm run lint` signale 37 erreurs existantes (14 prefer-inject, 18 no-unused-vars,
4 no-useless-assignment, 1 no-unused-expressions), corrigées dans les commits
suivants.
package-lock.json : angular-eslint tire @angular-devkit/core 22.2, qui épingle
picomatch 4.0.7 ; npm remonte donc picomatch 4.0.4 → 4.0.7 (et retire la copie
4.0.5 de vite), @jridgewell/sourcemap-codec 1.5.5 → 1.6.0, et remonte ora.
Vérifié depuis un `npm ci` propre contre main 822c699 : les 33 fichiers du
`ng build` de production ont le même sha256, et prettier --check, les 5 typechecks,
`ng test` (729 tests verts) et `playwright test --list` (17 tests) sont identiques.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
- .npmrc : le scope @avalon-vanguard pointe vers le registre npm de Gitea (lecture
anonyme, aucune ligne _authToken).
- devDependency @avalon-vanguard/config ^1.0.0 (résolu depuis git.avalonvanguard.com).
- .prettierrc : "@avalon-vanguard/config/prettier/angular" (mêmes printWidth 100,
singleQuote et parser angular pour *.html ; les défauts de Prettier 3 deviennent
explicites).
- tsconfig.json étend @avalon-vanguard/config/tsconfig/angular.json ; files et
references restent ici. Les sous-configs (app, spec, worker, e2e, etl) étendent
toujours ../tsconfig.json, sans changement.
- .editorconfig : copie du fichier du paquet (seuls trois commentaires s'ajoutent).
Aucun changement de résultat, vérifié depuis un `npm ci` propre de chaque côté
(Node 24.15, rm -rf dist .angular/cache) contre main 822c699 :
- `ng build` de production : les 33 fichiers de dist/ ont le même sha256.
- `prettier --check .` : sortie identique (les mêmes 135 fichiers déjà signalés).
- etl, e2e et worker typecheck, tsc app et spec : propres avant et après ;
`tsc --showConfig` sémantiquement identique pour les 5 projets.
- `ng test` : 729 tests sur 41 fichiers, tous verts des deux côtés.
- `playwright test --list` : identique (17 tests, 8 fichiers).
- node_modules : seul @avalon-vanguard/config s'ajoute.
Note : index.html embarque la CSS de Google Fonts téléchargée au moment du build ;
deux builds de main à quelques minutes d'écart peuvent donc différer sur ce seul
fichier. Les deux builds comparés ici ont été faits à la suite.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The adversarial review confirmed three defects in this PR, all reproduced in
the browser.
1. Superseded graphs queued up in front of routes. The worker answers
messages one at a time and cannot drop one it has started. With the
jump-link layer on, every pause on the range slider posted a full graph
build, seconds of work at 6-8 pc. Answers no longer wanted were thrown
away only once built. A route asked for afterwards waited behind every
one of them: a one-jump route took 44 s.
RoutingClient now holds requests and sends them one at a time. While one
is out, only the latest of each kind waits: a newer graph replaces an
older one before it is ever built, and the older promise is rejected with
SupersededRequest. Routes go ahead of graphs. The same question asked
again while outstanding shares the answer rather than being worked twice,
as when the layer is turned off and on during a build.
The same scenario in the browser (layer on, range stepped 5 -> 8 pc with
400 ms pauses, then Sol to Proxima): the route came back in 110 ms. The
worker was sent "links 3, links 5, route, links 8"; 6 and 7 were never
built.
2. A worker that failed left the panel stuck. With no error handling, a
worker that failed to load (a 404 on its chunk after a redeploy) or
threw left "Plotting…" and a disabled button for good, and a graph at a
range could not be asked for again.
The worker now answers an exception with a 'failed' message, which
rejects that request. A worker that fails to load or dies is abandoned,
and what it left outstanding, and everything asked afterwards, is
answered in place. The scene releases the panel when a route fails, and
forgets a graph range that was never drawn so it can be asked for again.
3. Nothing type-checked the worker. The application builder never reads
webWorkerTsConfig, and bundles the worker with esbuild, which strips
types without checking them. tsconfig.app.json leaves the file out. A
type error in the worker shipped.
`npm run worker:typecheck` (tsc -p tsconfig.worker.json) now runs in CI
beside the other project checks. webWorkerTsConfig is removed from
angular.json, since it only suggested that something checked the worker.
Tests with a fake worker cover one request at a time, a waiting graph
replaced and a route sent ahead of it, a question shared, a failure rejected
and the next request sent, and a failed worker's requests answered in place.
A scene test covers the panel released after a failed route. Negative
controls, each caught: several requests sent at once, a waiting graph kept,
graphs ahead of routes, a question asked twice, a failure answered as a
success, a failed worker waited on, the panel left pending, and a type error
in the worker (caught by worker:typecheck).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016jxMkwA2rbicdGxHosecYi
Angular 22 requires Node ^22.22.3 || ^24.15.0 || >=26.0.0, and package.json
said nothing about it. On a machine half a patch below that floor — 22.22.2,
which is what this development container has on PATH — every `ng` command
refuses to start, so `npm test` and `npm run build` fail with a version
error rather than a test failure. Nothing in the repository pointed at the
cause; you had to already know.
The range is Angular's, taken verbatim rather than guessed at, because it is
the binding constraint. Every other direct dependency is looser and fully
contained by it: vitest wants ^20 || ^22 || >=24, jsdom ^20.19 || ^22.12 ||
>=24, tsx >=18, typescript >=14.17, Playwright >=20.
This moves the complaint earlier and makes it name the project. `npm ci` now
prints EBADENGINE for star-map itself before anything is installed, instead
of the first Angular command failing several steps later. It stays a warning
rather than an error — turning it into one needs engine-strict in .npmrc,
which would hard-fail installs on any unlisted version, and that is a
stricter policy than this change is claiming to make.
The lockfile carries the field too: npm mirrors the root package's engines
into it, and a lockfile that disagrees with package.json is one npm has to
resolve rather than trust. Regenerated with --package-lock-only, which
changed those three lines and no dependency.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G
Add star-map Angular app, ETL pipeline, and caveman plugin
Angular 3D star map (galaxy/system/body views, Three.js rendering,
navigation store) plus the NASA ETL tooling that builds the star,
exoplanet and solar-system datasets, Playwright e2e suite, and the
cs:caveman Claude Code plugin (command, agent, skill).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@