diff --git a/CLAUDE.md b/CLAUDE.md index f2ebf67..105169a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -159,10 +159,17 @@ typecheck and the build all stay silent. It reads the literal `t("…")` form on write one. Keys no screen asks for are reported and never failed on: deleting a screen should not be harder than adding one. -`check:api` is not a gate yet: it prints the endpoints the HTTP layer calls, and -only checks them when handed an OpenAPI document — -`npm run check:api -- openapi.json`. It becomes a gate the day the Server -publishes one. +`check:api` is not a gate: it prints the endpoints the HTTP layer calls, and +compares them only when handed an OpenAPI document — +`npm run check:api -- ../AlgoJudge-Server/openapi.json`. **The Server commits +one**, generated from its running container, and `check:events` reads +`events.json` beside it the same way. + +So the comparison is available and CI does not make it. What stands between here +and a gate is that no CI job has the Server's document to hand, which is a +decision nobody has made rather than a thing being waited for. Both are run +against the Server's released tag when this repository is released, and +`docs/RELEASE.md` says how. **Browsers are closed by pid, never by image name.** `taskkill /IM chrome.exe`, `Stop-Process -Name chrome` and `pkill chrome` close whatever somebody is reading diff --git a/README.md b/README.md index 984b860..7e71c7c 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ the fake or the real HTTP client. See *Running without a Server*. | Area | Where | |---|---| | Activities, problems, submissions, source view, ranking, questions | `src/pages/` | -| Manager panel — sixteen screens, from activities to the LTI platforms | `src/pages/manager/` | +| Manager panel — seventeen screens, from activities to the LTI platforms | `src/pages/manager/` | | Sign in and register | wired to the Server | | Live status over WebSocket | `src/api/ws/WebSocketEvents.ts`, mounted as `` in `src/App.tsx` | | Renderer registry keyed by the `name@version` discriminator | `src/renderers/TypeRegistry.ts`, registered in `src/renderers/index.ts` | @@ -153,11 +153,11 @@ Released images are pushed to GitHub's container registry when a `v*` tag is pushed: ```bash -docker pull ghcr.io/algojudge/algojudge-client:0.1.1 +docker pull ghcr.io/algojudge/algojudge-client:0.2.0 ``` -`0.1.1`, `0.1`, `0` and `latest` all point at the same image. **A prerelease -(`v0.1.1-rc.1`) publishes only its own tag** — nothing moving follows it, so +`0.2.0`, `0.2`, `0` and `latest` all point at the same image. **A prerelease +(`v0.2.0-rc.1`) publishes only its own tag** — nothing moving follows it, so `latest` is never a release candidate. ## Docker @@ -167,7 +167,7 @@ in the final image. ```bash docker run -p 8080:80 -e API_BASE_URL=https://api.example.org \ - ghcr.io/algojudge/algojudge-client:0.1.1 + ghcr.io/algojudge/algojudge-client:0.2.0 ``` **One image serves every installation.** The address is read from the diff --git a/docs/RELEASE.md b/docs/RELEASE.md index 1e64741..fd76618 100644 --- a/docs/RELEASE.md +++ b/docs/RELEASE.md @@ -3,18 +3,23 @@ For whoever cuts the release. Somebody installing the product wants [AlgoJudge-Ops](https://github.com/AlgoJudge/AlgoJudge-Ops) instead. -Every claim below was checked against the repository on 2026-09-07 and retaken -on 2026-09-09, the day 0.1.1 was cut: the readings that move on their own — -dependencies, base images — and also the counts and line numbers this file quotes -out of other files, two of which had gone stale in a day. Where something could -not be checked, the last section says so rather than leaving it to be assumed. +Every claim below was retaken against the repository on **2026-09-21**, the day +0.2.0 was cut: the readings that move on their own — dependencies, base images, +the Node schedule — and also the counts and line numbers this file quotes out of +other files. Where something could not be checked, the last section says so +rather than leaving it to be assumed. + +**Recompute, do not re-read.** Ten claims in this file were wrong on the morning +of 2026-09-21, and the one reported as having held — a count of manager screens +— was among them. A figure that was right at the last release is evidence about +that day and nothing else. ## Where the version lives **`package.json`, `version`**, with `package-lock.json` following it — change it with `npm pkg set version=…` and `npm install --package-lock-only`, never by hand, because the lock carries it in two places (`package-lock.json` lines 3 and -9). All three read `0.1.1`. +9). All three read `0.2.0`. The package is `private` and is never published to a registry; the field exists so the repository can say which release a commit belongs to. @@ -43,27 +48,40 @@ Both releases so far were cut that way, and 0.1.0 found the rule by meeting it. `release.yml` runs on a pushed tag matching `v*`, checks the ancestry above, refuses a name that is not `v..[-prerelease]`, and publishes -`ghcr.io/algojudge/algojudge-client` under `0.1.1`, `0.1`, `0` and `latest`. A -prerelease publishes its own tag alone, so nothing moving follows it. +`ghcr.io/algojudge/algojudge-client` under `..`, +`.`, `` and `latest`. A prerelease publishes its own tag +alone, so nothing moving follows it. It builds the image, starts it, and checks it serves the front page and a deep link before pushing. **It runs none of the checks below** — a tag points at a commit, and that commit's own CI run is the evidence. -**The package exists and is public.** 0.1.0's tag created it on 2026-09-08, and -read anonymously on 2026-09-09 all four of `0.1.0`, `0.1`, `0` and `latest` -answer — so a tag now moves the three floating ones onto new bytes rather than -creating anything, and that move is what an installation following the major -picks up on its next `docker compose pull`. A package a workflow creates starts -private, which this one no longer is; `AlgoJudge-Ops/docs/INSTALL.md` covers what -private would mean for an installation pulling it. +**The package exists and is public.** Read anonymously on 2026-09-21, the tag +list answers `0.1.0`, `0.1.1`, `0.1`, `0` and `latest` — so a tag moves the three +floating ones onto new bytes rather than creating anything, and that move is what +an installation following the major picks up on its next `docker compose pull`. +A package a workflow creates starts private, which this one is not; +`AlgoJudge-Ops/docs/INSTALL.md` covers what private would mean for an +installation pulling it. + +Read it without a token — `gh api .../packages` needs a `read:packages` scope +that a release does not otherwise require: + +```bash +token=$(curl -s "https://ghcr.io/token?scope=repository:algojudge/algojudge-client:pull&service=ghcr.io" | + python -c "import json,sys; print(json.load(sys.stdin)['token'])") +curl -s -H "Authorization: Bearer $token" \ + "https://ghcr.io/v2/algojudge/algojudge-client/tags/list" +``` ## Before the tag - [ ] `package.json` and `package-lock.json` say the version being released. -- [ ] `README.md` names it in the `docker pull` and `docker run` examples — - lines 156 and 170, both `0.1.1`. **Recount them**: they were 149 and 163 - when 0.1.0 was cut, one day earlier. +- [ ] `README.md` names it in **four** places, not two: the `docker pull` + example, the sentence listing the four tags, the prerelease example beside + it, and the `docker run` example — lines 156, 159, 160 and 170. + **`git grep -n` the previous version rather than trusting those numbers**, + which move whenever anything above them does. - [ ] **The documentation describes the software as it is** — not merely the version in it. `README.md`, `CLAUDE.md`, `SERVER_CONTRACT.md`, `scripts/verify/README.md`, `AUTHORS.md` and `AUTHORS.txt`, this file, and @@ -73,13 +91,17 @@ private would mean for an installation pulling it. - [ ] The commit is on `main`, and **its** CI run is green. See *The tag has to sit on `main`*. - [ ] `npm ci`, then `npm run lint`, `lint:deps`, `typecheck`, `build`. -- [ ] **The ten `check:` scripts the `build` job runs**: `check:content`, - `check:package`, `check:languages`, `check:exchange`, `check:zawodyweb`, - `check:access`, `check:events`, `check:i18n`, `check:ranking`, - `check:api`. `check:api` cannot go red as it is invoked — it prints the - endpoints the HTTP layer calls, because the Server publishes no OpenAPI - document yet. +- [ ] **The `check:` scripts the `build` job runs. Count them in + `.github/workflows/ci.yml` rather than here** — `grep -c 'run: npm run + check:'` — because the list grows and a copy of it does not. Thirteen on + 2026-09-21: `check:content`, `check:package`, `check:languages`, + `check:exchange`, `check:zawodyweb`, `check:access`, `check:time`, + `check:events`, `check:i18n`, `check:ranking`, `check:seo`, `check:api`, + `check:instructions`. With `check:ui` in `browser-checks` that is fourteen + in all. - [ ] **`npm run check:ui` in full**, not per script. +- [ ] **`check:api` and `check:events` against the Server's own documents.** See + *Two checks CI runs blind*. - [ ] `.env.example` matches the source **in both directions**. Nothing checks this here. - [ ] The runtime variables are not confused with the build-time ones. @@ -95,40 +117,77 @@ private would mean for an installation pulling it. `npm run check:e2e` is the other Playwright suite and is **not** a release gate: it runs nowhere automatically and wants a full stack already up. -### What goes stale in a README +### Two checks CI runs blind -The bullet above it reads two lines and would pass a README that is wrong about -everything else. Four kinds of claim go stale on their own, and on 2026-09-08 -three of the four had: +`check:api` and `check:events` each compare **only when handed a document**, and +CI hands them none. Run bare they print what this Client calls and stay green +whatever the Server does, so in CI they are inventories rather than checks. -**A dependency named in prose.** *ESLint 9* stood in the `Commands` table against -10.10.0 installed, and `CLAUDE.md` carried the same sentence. Read every major -the `Technology` and `Commands` tables name against `package.json` on release day. +The Server commits both documents, beside each other, and both are present at +its release tags. A release is the one moment the comparison can be made against +a Server that is itself released: -**A list that mirrors CI.** The README gave eight of the ten `check:` scripts the -`build` job runs — `check:languages` and `check:ranking` were missing — so the -gate a reader trusted was shorter than the one that blocks a merge. Count the -`run: npm run check:` lines in `.github/workflows/ci.yml` and compare. +```bash +git -C ../AlgoJudge-Server switch --detach v.. +npm run check:api -- ../AlgoJudge-Server/openapi.json +npm run check:events -- ../AlgoJudge-Server/events.json +``` + +`check:api` reads `openapi.json` and reports an endpoint this Client calls that +the Server does not serve. `check:events` drives the real `WebSocketEvents` class +and diffs the event names against `events.json`, which is generated from +`Api/Contracts/Events.cs` — that diff is what once caught fourteen names +reaching nobody. -**A value copied out of another file.** It said the example points at -`https://localhost:7004`; `.env.example` has pointed at `http://localhost:5171` -since `9d40088`, and the scheme is not cosmetic — `SameSite=Lax` makes an HTTP -page against an HTTPS API unable to sign in at all. Every address, port and -default stated in prose is a copy, and a copy does not move with its original. +**Read a difference before calling it a defect.** The two repositories release +independently, so a name on one side and not the other may be a Client ready for +a Server that has not shipped yet. What it must never be is unnoticed. + +### What goes stale in a README -**A count.** *Sixteen screens* in the manager panel is the number of -`managerRoute` calls in `src/App.tsx`, and it held. Recompute a count rather than -re-reading it, and know which thing is being counted: `managerAreas.ts` has -fourteen entries, two of them `soon: true`, and neither number is the one the -README states. +The bullet above it reads four lines and would pass a README that is wrong about +everything else. Four kinds of claim go stale on their own, and each has done so +here at least once: + +**A dependency named in prose.** The `Technology` and `Commands` tables name a +major per library — React 19, TypeScript 6, Vite 8, Mantine 9, React Router 7, +i18next 26, ESLint 10. Read every one against `package.json` on release day; a +refresh inside a `^` leaves them all true and a major taken makes one false. + +**A list that mirrors CI.** The README names the `check:` scripts the `build` +job runs, and the list grows. Count the `run: npm run check:` lines in +`.github/workflows/ci.yml` and compare, rather than reading either prose against +the other — `ci.yml` is the only one of the three that decides anything. + +**A value copied out of another file.** Every address, port and default stated +in prose is a copy, and a copy does not move with its original. The one that +matters most is the scheme: `SameSite=Lax` makes an HTTP page against an HTTPS +API unable to sign in at all, so `http://localhost:5171` in `.env.example` and +an `https://` example in the README would describe a pairing that cannot work. + +**A count.** *Seventeen screens* in the manager panel is the number of +`managerRoute` **call sites** in `src/App.tsx` — `grep -c` gives eighteen, +because the arrow function's own definition matches too. Know which thing is +being counted: `managerAreas.ts` has fourteen entries, one of them `soon: true`, +and neither number is the one the README states. + +**`check:instructions` covers some of this and not the rest, so know which.** It +asserts the script table and the counts `CLAUDE.md` states, and one thing about +the README: that it names the same `build`-job steps as `ci.yml`. It reads +nothing else in the README and nothing at all in this file. + +So the `check:` list is machine-checked in both prose files and the manager-screen +count is checked in neither. **Every count in this runbook, and every count in +the README that is not the step list, is checked by a person on release day or +not at all.** ### Why `check:ui` is the gate There is no unit-test runner in this repository. `lint`, `lint:deps`, -`typecheck`, `build` and the ten `check:` scripts all read files and modules; -not one of them renders a screen, so a rule applied by a view instead of by the -API, a control that stopped reaching the keyboard, or two halves of the fake -disagreeing all pass the whole of that gate. +`typecheck`, `build` and every `check:` script in the `build` job read files and +modules; not one of them renders a screen, so a rule applied by a view instead of +by the API, a control that stopped reaching the keyboard, or two halves of the +fake disagreeing all pass the whole of that gate. `check:ui` is a Playwright suite driving a real browser against the fake API. It runs as the `browser-checks` job, blocks a merge, and carries `retries: 0`. @@ -151,10 +210,15 @@ easiest thing here to mix up. | `VITE_APP_DEBUG_AUTHENTICATION` | `src/routers/Authentication.tsx`, under `import.meta.env.DEV` | | `VITE_DOTNET_CERT` | `vite.config.ts` — the **dev server**, not the bundle | -Checked both ways on 2026-09-07: `import.meta.env` across `src/`, -`vite.config.ts` and `index.html` reaches these four plus Vite's own `DEV` and -`BASE_URL`, which are not configuration. Nothing in `.env.example` goes unread, -and nothing the source reads is missing from it. +Checked both ways on 2026-09-21: the source reaches these four plus Vite's own +`DEV`, `PROD` and `BASE_URL`, which are not configuration. Nothing in +`.env.example` goes unread, and nothing the source reads is missing from it. + +**Three of the four are reached as `import.meta.env.*` and the fourth is not.** +`VITE_DOTNET_CERT` is read by `vite.config.ts` through `loadEnv`, because it +configures the dev server rather than the bundle — so a grep for +`import.meta.env` alone finds three keys, concludes the example has one too many, +and is wrong. Grep for the bare names. **Runtime**, written into the served bundle by `docker-entrypoint.sh` when the container starts. Two, and neither is `VITE_`-prefixed: @@ -202,11 +266,20 @@ already in maintenance — a maintenance line takes security fixes and nothing else, so an image built on it ships something upstream has stopped improving, for as long as that image is deployed. -Node 24 satisfies the rule today. It is **Active LTS** on the release date, -enters maintenance 2026-10-20, and Node 26 becomes Active LTS on 2026-10-28 — -read from `nodejs/Release` `schedule.json` on 2026-09-07. So the pin is right for -0.1.1 and will not be right for a release cut after October; raising it is those -three files at once, plus the whole gate. +Node 24 satisfies the rule today. Read from `nodejs/Release` `schedule.json` on +**2026-09-21**: 24 entered Active LTS 2025-10-28 and leaves it **2026-10-20**, +Node 26 becomes Active LTS 2026-10-28, and 22 is already in maintenance. + +**So the pin is right for 0.2.0 by twenty-nine days.** A release cut after +2026-10-20 cannot say this, and the gap between the two dates is eight days in +which no line is both Active LTS and released — plan the move rather than +discovering it. Raising it is those three files at once, plus the whole gate. + +Read the schedule; do not carry the dates. They are published as data: + +```bash +curl -s https://raw.githubusercontent.com/nodejs/Release/main/schedule.json +``` Checked locally on Node 24.20.0 with npm 11.19.0, which is what `README.md` records. @@ -218,48 +291,73 @@ move, **it moves before the gate runs, never after**: a green gate is evidence about one tree, and an `npm install`, `npm update` or `npm audit fix` afterwards turns it into evidence about a tree nobody checked. -Read on **2026-09-09**. Nothing was taken this time, because nothing was -behind: `npm outdated` names the same two majors and no third row, and the -lockfile did not move — which is the shape a patch release should have. +Read on **2026-09-21**. `npm outdated` gave nineteen rows: seventeen inside +their declared range, and two majors where `Wanted` equals `Current`. -**Nothing is behind inside its declared range.** `npm update` took sixteen -packages on the day the release was cut — Mantine 9.5.2 → 9.6.0 across all five, -`@playwright/test` 1.62.1 → 1.63.0, ESLint 10.9.1 → 10.10.0, -`@typescript-eslint/*` 8.68.0 → 8.70.0, `@types/react-dom` 19.2.5 → 19.2.7, -i18next 26.4.0 → 26.4.2, `i18next-http-backend` 4.0.1 → 4.0.2, `react-i18next` -17.0.12 → 17.0.13, katex 0.18.4 → 0.18.7, postcss 8.5.26 → 8.5.28 and -`eslint-plugin-react-refresh` 0.5.5 → 0.5.6. `package.json` did not move with -them, which is the check that this was a refresh and not a decision: every one -was already inside its `^`. +**The refresh was taken.** `npm update` moved **fifty-one** packages in the lock +— seventeen direct and the rest transitive — and added or removed none: 326 +entries before and after. `package.json` did not move with them, **which is the +check that this was a refresh and not a decision**: every one was already inside +its `^`. -**At the latest published version, and untouched**: Vite 8.2.2, React and React -DOM 19.2.8, `@vitejs/plugin-react` 6.1.1, React Router 7.18.3, Monaco 0.56.0. +The direct seventeen: Mantine 9.6.0 → 9.6.1 across all five, +`@tabler/icons-react` 3.46.0 → 3.47.0, `@types/react` 19.2.18 → 19.3.0, +`@types/react-dom` 19.2.7 → 19.3.0, ESLint 10.10.0 → 10.11.0, +`eslint-plugin-react-refresh` 0.5.6 → 0.5.7, `markdown-it` 15.0.1 → 15.0.2, +React and React DOM 19.2.8 → 19.3.0, `react-i18next` 17.0.13 → 17.0.14, React +Router 7.18.3 → 7.18.4, Vite 8.2.2 → 8.3.0, `yaml` 2.9.0 → 2.9.1. -**Two majors, which are release decisions rather than chores.** Each moves the -range in `package.json` and needs the whole gate re-run: - -- **TypeScript 6.0.3 → 7.0.2.** `README.md` states TypeScript 6 as the stack, - and `@typescript-eslint`'s stable line is what decides when 7 is reachable. -- **`markdown-it-anchor` 9.2.1 → 10.0.0.** It anchors statement headings, which - `check:content` covers. - -Neither belongs in 0.1.1, and less so than in 0.1.0: something **is** published -now, so a major taken on release day is a major taken against installations that -will pull it, for a release whose whole content is two fixes. +**Compare the two lockfiles rather than reading `npm update`'s summary.** It +reports how many packages changed and not which, and the distinction that +matters at a release is between a version moving and a package arriving: -**Mantine is worth naming on its own.** The browser suite no longer matches its -generated class names, so a Mantine minor does not redden `check:ui` for nothing. -It is still a UI library upgrade, and nothing in the file-reading gate can see a -view that renders differently: the full `check:ui` run against the refreshed tree -is what makes it evidence. +```bash +cp package-lock.json /tmp/before.json && npm update +python - <<'PY' +import json +b=json.load(open('/tmp/before.json'))['packages'] +a=json.load(open('package-lock.json'))['packages'] +print('added ', sorted(set(a)-set(b))) +print('removed', sorted(set(b)-set(a))) +print('moved ', sum(1 for k in set(a)&set(b) if a[k].get('version')!=b[k].get('version'))) +PY +git diff --quiet -- package.json && echo 'package.json unchanged: a refresh' +``` -`npm audit`, 2026-09-09: **zero at every severity**, unchanged. +**Two of the seventeen are worth naming rather than counting.** React 19.2.8 → +19.3.0 and Vite 8.2.2 → 8.3.0 are minors of the renderer and of the build tool, +and **nothing in the file-reading gate can see a view that renders +differently**. The full `check:ui` run against the refreshed tree is what turns +a refresh into evidence. The same holds for Mantine, whose generated class names +the browser suite no longer matches — so a Mantine minor does not redden +`check:ui` for nothing, and equally does not vouch for itself. -It read **one moderate** before the refresh, kept here because the next release -will meet the same shape: GHSA-p498-v437-472g, `@humanfs/node` 0.16.6, reached -through `eslint@10.9.1` and nothing else. It could not have shipped — the final -stage is nginx with `dist/` copied in and carries no Node.js runtime at all — and -ESLint 10.10.0, inside the existing range, closed it anyway. +**Two majors, which are release decisions rather than chores.** Each moves the +range in `package.json` and needs the whole gate re-run. Both were left where +they are for 0.2.0: + +- **TypeScript 6.0.3 → 7.0.2**, and it is **red**: Dependabot's pull request + fails *Lint, typecheck, build*, *The browser checks* and *Build the container + image*. `@typescript-eslint`'s stable line declares `typescript <6.1.0` and + only its alphas support 7, so this is the expected result rather than a + surprise. It becomes takeable when that line does, not before. +- **`markdown-it-anchor` 9.2.1 → 10.0.0**, and it is **green** on all six + checks. It anchors statement headings, which `check:content` covers. Nothing + in this release needed it, and a major taken on release day is a major taken + against installations that will pull it. + +**A green Dependabot major is still a decision; a red one is not even a +question.** Read the pull request's own checks before weighing either — the two +here differ in nothing except that, and it settles both. + +`npm audit`, 2026-09-21: **zero at every severity**, before and after the +refresh. + +**`npm audit` is the advisory scan and Dependabot is not.** Dependabot offers +upgrades and says nothing about what is already in the lock, so an open pull +request is not evidence of anything and an empty inbox is not either. Run the +audit, and run it before the gate: a lock that moves afterwards makes the green +gate evidence about a tree nobody checked. ## Every image this repository pins @@ -283,9 +381,9 @@ for i in node:24-alpine nginx:1.30-alpine postgres:18; do done ``` -Read on 2026-09-09: `node:24-alpine` built 2026-08-27, `nginx:1.30-alpine` -2026-09-03, `postgres:18` 2026-08-26 — the same three builds as the day before, -none of them stale. Postgres 19 does not exist yet. +Read on 2026-09-21: `node:24-alpine` built **2026-09-18**, `nginx:1.30-alpine` +**2026-09-18**, `postgres:18` **2026-09-19** — all three within three days, none +of them stale. Postgres 19 does not exist yet. ## The nginx base @@ -300,10 +398,12 @@ months before this release, while pulling cleanly the whole time. It is also the only stage with system packages in it — the second stage is `dist/` copied in — which makes it the only part of this image that goes stale on its own. -**The other two are not this repository's to raise.** `AlgoJudge-Ops` defaults -its edge to `nginx:${NGINX_TAG:-1.27-alpine}` and `AlgoJudge-Docs` runs -`1.29-alpine`; read on 2026-09-08, both are stale the same way, and each is its -own release's step. If you raise one, know which of the three you are raising. +**The other two are not this repository's to raise.** Read on 2026-09-21, all +three now agree: `AlgoJudge-Ops` defaults its edge to +`nginx:${NGINX_TAG:-1.30-alpine}` — in `compose.yaml` and in `.env.example` — +and `AlgoJudge-Docs` builds on `1.30-alpine`. Agreement is not a rule, though; +each moves on its own release's schedule. If you raise one, know which of the +three you are raising, and do not read this file for the other two. ## Release order across the repositories @@ -325,37 +425,101 @@ makes an installation resolve. Neither Runner depends on the other's image, and neither depends on this one. Their order is the order the release follows, not a constraint. +## Cutting the tag + +The tag is what publishes. Nothing that lands on `main` reaches the registry on +its own, and nothing above this line has moved a byte outside this machine. + +Three things are true before it is cut, and each is read rather than assumed: + +```bash +git merge-base --is-ancestor origin/main # it is on main +gh run list -R AlgoJudge/AlgoJudge-Client --commit # its own run, green +git tag --list # the name is free +``` + +**Its own run.** A later green run on `main` is evidence about a later commit, +and a release branch has no run at all — `ci.yml` triggers on `main` and on pull +requests into it, which is the same reason the branch has to be merged first. + +The tag is annotated, and the message names the product: + +```bash +git tag -a v -m "AlgoJudge Client " +git push origin v +``` + +That push starts `.github/workflows/release.yml`, which takes **about a minute** +— the shortest of the five. It builds the image, starts it, checks it serves the +front page and a deep link, and pushes the four tags. Watch it rather than +assuming it: `gh run watch -R AlgoJudge/AlgoJudge-Client`. + +**Two things have no undo.** The run is never canceled: `cancel-in-progress` is +`false` here because a run interrupted between two `docker push` calls leaves a +version half in the registry. And **deleting a tag unpublishes nothing** — the +images of a tag deleted from a sibling repository in August 2026 are still in +GHCR. The name is checked before the push or not at all. + +Then the GitHub Release, which no workflow creates — `release.yml` holds +`contents: read`: + +```bash +gh release create v -R AlgoJudge/AlgoJudge-Client \ + --title "" --notes-file +``` + +The title is the bare version, with no `v`. Add `--prerelease` when the version +carries one; a prerelease publishes its own tag alone and moves +`.`, `` and `latest` onto nothing. + +**A release body is not a file in this repository.** GitHub renders a single +newline as a visible line break, so an eighty-column paragraph arrives as a +ragged column. Write each paragraph as one physical line. + ## After the tag -- [ ] The package carries `0.1.1`, and `0.1`, `0` and `latest` have moved onto - it. -- [ ] `docker pull ghcr.io/algojudge/algojudge-client:0.1.1` succeeds from +- [ ] The package carries the new version, and `.`, `` and + `latest` have moved onto it — all four at one digest, read by comparing + the `docker-content-digest` header of each. +- [ ] `docker pull ghcr.io/algojudge/algojudge-client:` succeeds from outside the organization, or the package's visibility is deliberately private. - [ ] Ops has been stood up against the published tags rather than local builds. -The documentation site cuts its `/client/` snapshot on release day. That is -`AlgoJudge-Docs`' step rather than this repository's, and for 0.1.0 it was taken: -`content/docs/en/client/v0.1` exists, and `docs.algojudge.pl` answers — read on -2026-09-09, it redirects to `/en/` and serves it. **A patch release is not a new -snapshot**: `/client/v0.1` is the 0.1 line, and 0.1.1 is in it. +**The documentation snapshot, and only on the day.** `AlgoJudge-Docs` cuts +`/client/` when this repository opens a new **minor** line — +`npm run snapshot -- v. client` — and **there is no backfill**: it +is taken on release day or never. It refuses a patch version as usage and +refuses to re-cut a directory that exists, so a patch release must not invoke it +at all and a minor release must not forget to. + +It is `AlgoJudge-Docs`' step rather than this repository's, which is why it is +easy to lose: nothing in this repository fails when it is skipped, and the +window closes with the day. `content/docs/en/client/` holds `v0.1`. ### The public website states this component's version -`algojudge.pl` prints **`Client v`** in four places — a card badge and a -roadmap item, in each of `src/content/pl.json` and `src/content/en.json` of -`AlgoJudge-Website`. A release makes all four wrong. +`algojudge.pl` states this component's version in **three structural places per +locale file**, in each of `src/content/pl.json` and `src/content/en.json` of +`AlgoJudge-Website`: a sentence claiming one version for every component, a +`badge` on each of the five component cards, and a roadmap `items` array naming +all five. A release makes this component's entry wrong in all six. -**`AlgoJudge-Website` has no CI.** Its fifteen tests run only when somebody types -`npm test`, so nothing reports the mismatch. +**`AlgoJudge-Website` has no CI at all.** Its tests run only when somebody types +`npm test`, so nothing reports the mismatch — read on 2026-09-21, every one of +those places still says `v0.1.0`, which has been wrong for this component since +0.1.1 was cut. -`AlgoJudge-Website/tests/content.test.mjs:125` pins the version literal by regex, -`Client v0\.1\.0`, and hard-codes the five repository keys. Correcting the content -turns that suite red: the test asserts the literal and needs the same edit. Change -content and test in one commit. +**The test is wrong in its shape, not only in its literal.** +`tests/content.test.mjs` is named *"the 0.1 release line reflects independently +versioned components"* and then asserts, in a loop over five hard-coded +component keys, that each reads `v0\.1\.0`. Those two things cannot both be +wanted: components that version independently do not share a literal. Correcting +the content turns the suite red, and editing the regex would keep the defect — +the loop is what has to go. -The correction is `/website-sync` in the workspace. This runbook's step is to -record that it is owed. +The correction is `/website-sync` in the workspace, and it is a separate piece of +work with its own approval. This runbook's step is to record that it is owed. ## Not verified here @@ -363,6 +527,9 @@ record that it is owed. full stack already up. - **The image was not built or pulled** from this branch; the `docker` job in `ci.yml` and the release workflow's own serve check are what cover it. +- **No installation was stood up against the published image.** That is + `AlgoJudge-Ops`' proof and its own release's step. -`npm run check:ui` **was** run in full for 0.1.1, against the tree being tagged, -which is the one line of this section that 0.1.0 could not write. +`npm run check:ui` **was** run in full, against the tree being tagged, and so +were `check:api` and `check:events` against the Server's own documents at its +release tag. diff --git a/package-lock.json b/package-lock.json index 70cc1ed..619c6ba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "algojudge-client", - "version": "0.1.1", + "version": "0.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "algojudge-client", - "version": "0.1.1", + "version": "0.2.0", "dependencies": { "@algojudge/uva-explorer-react": "^0.2.0", "@mantine/code-highlight": "^9.5.2", @@ -267,9 +267,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", - "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "version": "7.29.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz", + "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==", "dev": true, "license": "MIT", "dependencies": { @@ -672,33 +672,33 @@ "license": "MIT" }, "node_modules/@mantine/code-highlight": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/code-highlight/-/code-highlight-9.6.0.tgz", - "integrity": "sha512-bqCybWbPHhYvdqVru8G2qdApR9rVm3HcvK1eCohjIk61p2khrXvEu8e7ErOb/JsNhYVsRC4GTCPFO92Ma6kI9g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/code-highlight/-/code-highlight-9.6.1.tgz", + "integrity": "sha512-EvboHfOSl5+9jQO5KqiyHEaNtTxH4CQ2TzReZgJR/h1HsC9zPosWyCYvT6IoRA1X5iQxaLb39ym6eI6uYjFzTg==", "license": "MIT", "dependencies": { "clsx": "^2.1.1" }, "peerDependencies": { - "@mantine/core": "9.6.0", - "@mantine/hooks": "9.6.0", + "@mantine/core": "9.6.1", + "@mantine/hooks": "9.6.1", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "node_modules/@mantine/colors-generator": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/colors-generator/-/colors-generator-9.6.0.tgz", - "integrity": "sha512-OlmjW1tprkrD0AoN5cR3b0YosqWkIacfsNpSY1Mrc8uPJPEkAUQZE3qAoHzu1sl+idgY8yFXOr/a/XYuj4/i4g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/colors-generator/-/colors-generator-9.6.1.tgz", + "integrity": "sha512-ETlCvmmCJT0Agt8/Zfdelw41Q8TGlfA4PMqmcSaJf9CEzi0i8IoOYlTqCaJAIah42kW1E4c2MeVr5vcV0QoRbQ==", "license": "MIT", "peerDependencies": { "chroma-js": ">=2.4.2" } }, "node_modules/@mantine/core": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.0.tgz", - "integrity": "sha512-WpdtSv9q2k4RrAVUxBlABMyEul4vv94EkjoVuQglBBC7jVmLhBBgI64HltE6di/l6zvj9D7k1vgkbVjyxQsn1g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.6.1.tgz", + "integrity": "sha512-UkcPo8Zq0uSdodvyXV62HVmfIfHCcrjFrFrH0TggTy6Wtp8a78znGP8RJOz8zC9XSPpJmKjBQjg0M+nOvIzftA==", "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.20", @@ -708,40 +708,40 @@ "type-fest": "^5.8.0" }, "peerDependencies": { - "@mantine/hooks": "9.6.0", + "@mantine/hooks": "9.6.1", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "node_modules/@mantine/hooks": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.0.tgz", - "integrity": "sha512-r+1RWxc0F2XK9exKIk3Cxc17eyDTEtRqvomeQMCqI4S2Z3A78ObAGuNS8WXn8aqDGN66MJlO+WV7oCgQn2iQfQ==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.6.1.tgz", + "integrity": "sha512-pfxM95WozngB0ZALw6h99QV1TQ0qniOkFhzi0+dmSnKpxkVSR0xeNsvPpGDj9Teu+M69fRoE4IkzyMnu5Xld3w==", "license": "MIT", "peerDependencies": { "react": "^19.2.0" } }, "node_modules/@mantine/notifications": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.6.0.tgz", - "integrity": "sha512-1sTE7EaGpr6LX7ykE8DOwpTNxi3U7AHF7Ve/oBd1VEe2k/5RmEYLTWpexxf7WwNpEmHCi99MvG7qUMQJyqc9Fg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.6.1.tgz", + "integrity": "sha512-6bikkVCAf6wd1KO/oVhBuXGDZ+HcWeNGCEvdgkL0pQ6jmjzd24ShW6UnbGu6aLABhYxQdfLnrE1cbOjC93Tj6A==", "license": "MIT", "dependencies": { - "@mantine/store": "9.6.0", + "@mantine/store": "9.6.1", "react-transition-group": "4.4.5" }, "peerDependencies": { - "@mantine/core": "9.6.0", - "@mantine/hooks": "9.6.0", + "@mantine/core": "9.6.1", + "@mantine/hooks": "9.6.1", "react": "^19.2.0", "react-dom": "^19.2.0" } }, "node_modules/@mantine/store": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.6.0.tgz", - "integrity": "sha512-nYt2tfn1/e6CK35a5TWlPbOL3Xwf7OzBmBElV0l+Ae6mswVaMip1WHm0mCaHAbTKgsOnvL/tooDTVxBBrmm87Q==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.6.1.tgz", + "integrity": "sha512-KePeOIAg2n7wkHlxFxF7s6qYeD9EE/GrFIK3cc329nTSDIEIJQ+oFQv1S/t4sZJTIz7YnBlRuvA9Wc8pRg8TRA==", "license": "MIT", "peerDependencies": { "react": "^19.2.0" @@ -789,9 +789,9 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.148.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.148.0.tgz", - "integrity": "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A==", + "version": "0.150.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.150.0.tgz", + "integrity": "sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==", "dev": true, "license": "MIT", "funding": { @@ -815,9 +815,9 @@ } }, "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.7.tgz", - "integrity": "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.9.tgz", + "integrity": "sha512-tNISae1QEf/vkb3xkRcjV5SEdzPE97We5IVaa2Z8jSszQPZ8U60B/YCYpw4QI7VidYsBtKavczXf+DyDs9WGxw==", "cpu": [ "arm" ], @@ -832,9 +832,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.7.tgz", - "integrity": "sha512-l17HE9EweWaqJZhuUuNBN/FzM62xw+DECVnJyvMsxn8vJFAGLy5QfLDoYAcronkAN8VxKZHezDpulHDPx95vFw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.9.tgz", + "integrity": "sha512-YC8YsI30o606GTZi0VyzYlsDKFP8W61i/QzayHDkLbNEz/IShqAmTa+hsJRj13xTHA0H+6fk4b2UmGn+Q/cMlg==", "cpu": [ "arm64" ], @@ -849,9 +849,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.7.tgz", - "integrity": "sha512-8ED8ELFvHXc6OCETIn4gXObPiaR6bckM/ipXtbzlPVDRMBfEGjCKgO90F9YtfdpDatVx/ZQw7aZ1vUMf/+T3Mw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.9.tgz", + "integrity": "sha512-IwhlH3qK5urrY8hZiEgGkHKEFN901p/p2bjxCxJlr4GyNnF7wYpUvK+Y43uaRYuC4hpfjzbR3SJC3arX1jGvmw==", "cpu": [ "arm64" ], @@ -866,9 +866,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.7.tgz", - "integrity": "sha512-/WPripjtiAIZ2tWY7ddijORT0Ujg87wxWW/qcoFVCKAWVDPhtY0xr7Dj0M3GyNGz60jGwTElhro/mkF9dT7dDQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.9.tgz", + "integrity": "sha512-XxpJfVzFh+jilRxIXUqcfYAYcunIc/XEzIizsOL1fcJee5Sf7H3mH8WlLmfHfluz5amqR88QQo9izKtmMlavAw==", "cpu": [ "x64" ], @@ -883,9 +883,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.7.tgz", - "integrity": "sha512-14DI4NcqpvbICxSnGLx3PmtDaWqRP/KGSGb6C+JLLVPeZRl6dKdHba3pGsqT3vpdTqhEYIPG0MMQ8c0xYqoJxA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.9.tgz", + "integrity": "sha512-kSfvhmgeWyfkbT3p/1s5vSgboogoah2zkm9fX2zjg2hHxSV7T4KhMWRUUaRk4OXNqoD3QAUeRqLcs1aZOK4U1g==", "cpu": [ "x64" ], @@ -900,9 +900,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.7.tgz", - "integrity": "sha512-bxrWIRvHWQvbJwi+VIie/kDJmQxcNE6xxWwZdqF/ExVAigtHkv54WTLQPb+QsZdnFy18fg7JPfWGL0RH6vwIlQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.9.tgz", + "integrity": "sha512-1RVzG17pxqbTfYLC352JlLt6kKLG+6Hr30n8DlIJqsnV5luUDd2Qdx9Ayw1Cabfyb1K9k0jXEZ7evxkRoT+uiw==", "cpu": [ "arm" ], @@ -917,9 +917,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.7.tgz", - "integrity": "sha512-toOY2BChBZyuxU7OYX6Tn389di4IzAqPTycVcci0O7FSfBqzRB3RZn+K5Is6ANf4tmgRd/K1yZTsNTXbkXsnLg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.9.tgz", + "integrity": "sha512-BXqPvZ2drqVD+/Z8UpKwcs4Mp7grM+eGFku4CAEKrEtcbAsUpzREphK1sogCRZGreVPiMkiiBtw0n3TPteuqvw==", "cpu": [ "arm64" ], @@ -937,9 +937,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.7.tgz", - "integrity": "sha512-lAIXTH/aiLRLxsTgQvfhjo4K1ydWIp00+V0voOr9beb/9ZmkUFrSIb03dXNFRgMNvkE6oGsF10ioQ6UsI+vS5Q==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.9.tgz", + "integrity": "sha512-11vWvo8YDwLzukt27J3aYDWU+gg2P7J+ZOmiJ0hkF5BXZDW7pVya7r40MXDy6ya0i9KamoENSVKIugvJNgFXIA==", "cpu": [ "arm64" ], @@ -957,9 +957,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.7.tgz", - "integrity": "sha512-kdnwS28Pkenp/mZMRwjXXXwxQ7pIsm+bF919LUK93BOyhcLsrVKdP2p9fxpiPNPAbNuch8ypQt0pm2P2LYCAGg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.9.tgz", + "integrity": "sha512-a1tijMkdwsIARtc0F39ApURROkf3NwqinI6TOiSSWCTR7dT96dffNvMUtDHnq64wKNTIZOIlzKrFvvFUznJiyw==", "cpu": [ "ppc64" ], @@ -977,9 +977,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.7.tgz", - "integrity": "sha512-516OdsyLdr5E65paF3yBF55t8mfm9+gmtCsK3xI7XKXIT7EfRlHhxL8K/NR6Hu8BWSgF5+1w74lTL0+nxcc8Qw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.9.tgz", + "integrity": "sha512-x6SQNdAvv4c3hWqTMaWuawzMX9myaCs/yEmlGsxJzkdClnHW7FbrjQuSiRDhuSYzEYoEMhsaJy9qHG/XNemJPQ==", "cpu": [ "s390x" ], @@ -997,9 +997,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.7.tgz", - "integrity": "sha512-r8/z8n7GFaYRln3xmP1Cxy0HH/HLM0uBUPkEuSVEfKGDA89M0FsZRZJRSwe/tJjRx+fpH/gjorfhB8tmEbSFLA==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.9.tgz", + "integrity": "sha512-9s0AZ8BFK5/n7B/TBoa2yJE3gI3KURrbXcPBlsAsvjU4VeJKgE90y1YtNxyEUIcHPQkg6/yfF3qihUrcM/Kf0Q==", "cpu": [ "x64" ], @@ -1017,9 +1017,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.7.tgz", - "integrity": "sha512-pAsE8iiDxUg1xBqdhrTfg45AVDVpirjz00sblEYClGNNcMnDb+e8beQgqIAw6LvauX/APvgxUnwrgun/YYGBhw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.9.tgz", + "integrity": "sha512-P7VWAmV+WdJluH7ovnRGoiv2i8To7GAZ+kGzfGup635cyL7SyYl3lSUaA3Gp5THf0n/Co5EyEqb2zbqq+nMOHQ==", "cpu": [ "x64" ], @@ -1037,9 +1037,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.7.tgz", - "integrity": "sha512-lTcIYmmnQQA8Or/2DatS6oSqcdLHvendjS+zLu+FwgToynWMRSmQdpM65fTANJgIS4mjbMOo5KT2lnT9SAb96w==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.9.tgz", + "integrity": "sha512-1qixtsE4BK8h+yS3BfmZ09UhA7O/N4IACva6YBr7EBvCJraByTuRcgOTaiA62Tm0vey3UcKXLOaoGHtYmNGEVg==", "cpu": [ "arm64" ], @@ -1054,9 +1054,9 @@ } }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.7.tgz", - "integrity": "sha512-e3Gu3WxbNk/UqQhxqU7YIYO+9ZBvWNz3U+h/qRFosscMFzdRPbXYSaSWgSnklv2fz1TgzBTcti2z35c/7irsHw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.9.tgz", + "integrity": "sha512-ok8IQjcEPs1AKZfuEUznVBrJw+gK4soq+bx8b1X2XoMqVClarc1q5JDmVtWXY1xfr6ZuHTAsPXHTgTrqKTZeww==", "cpu": [ "arm64" ], @@ -1071,9 +1071,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.7.tgz", - "integrity": "sha512-W/jg5qoRSqjsEv0+dZi4e687mcHqmVuU0P4fK6qS/xjetW2Gmc1W8j//z5nAeNcC8Ttm0hV46IjcYeuVwYhuiw==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.9.tgz", + "integrity": "sha512-Ip2mXoU0hM0boq3Rf+ekuT653OROSo6aSYcPT1VHE4q52KvyxgFkQgrgb/IEsxOuvQ2fZZbs8khJAyCEPM24/g==", "cpu": [ "x64" ], @@ -1195,9 +1195,9 @@ "license": "MIT" }, "node_modules/@tabler/icons": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.46.0.tgz", - "integrity": "sha512-f2RYFl3fzPwj5WO82x6en0dmkjefxEfOm16D1ByM6cj/McNiwOkL4VaPUoP9VVIrXAD9WnTSVFr70px703b//A==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.47.0.tgz", + "integrity": "sha512-aCbSemVrGvSA3w0sJi8mka6QrnQCN8wCD1jKNXXIR/h6Q4ffov/yFPyzjTULDM8ETtK4DABUZhWdYlygqy3npA==", "license": "MIT", "funding": { "type": "github", @@ -1205,12 +1205,12 @@ } }, "node_modules/@tabler/icons-react": { - "version": "3.46.0", - "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.46.0.tgz", - "integrity": "sha512-CCm7xJWhDT2PH4ZIFkP6AgYKtVhq0gpYkjUN+GVh1AzmIQaa77OW0bQPBPQiTE0PsXMR9oSxFqA3qBglzPyrVQ==", + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.47.0.tgz", + "integrity": "sha512-lQkDkYwqTzRNt+MYNinu+fkcIZLKjYBcI37RWkcY72doOgE/vMVFvrFrGZ2cVo2ueB3zH1dWMIhnGgi8Y5mFJA==", "license": "MIT", "dependencies": { - "@tabler/icons": "3.46.0" + "@tabler/icons": "3.47.0" }, "funding": { "type": "github", @@ -1282,9 +1282,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.2.18", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.18.tgz", - "integrity": "sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1292,13 +1292,13 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-I8bPpDLcHBv1qiIiXDCy71Rt8eQDKJP0sMSWJphDdAcdqiJ1sGpZamavoEIRZmYzjia9LuEb2HlYdDpmoENpvQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" + "@types/react": "^19.3.0" } }, "node_modules/@types/trusted-types": { @@ -1677,9 +1677,9 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.1.tgz", - "integrity": "sha512-nM4mHF/KM1v59ZNKX7zfusQz5wUAxR511YG8Vo6TyiV4aqhu++rbJW4v04xsWhpSsHFj66flT8P7znVpyO20xQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-3.0.2.tgz", + "integrity": "sha512-mFdDM6WqWKraGLsVb+C9CahPnzTXOefAOLq3jYcca2YZ8bEWpr++Tzj+zSaKW9+X9L5uSxcm1AZ3Y6aZJ09OhQ==", "funding": [ { "type": "github", @@ -1703,9 +1703,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.11.21", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.21.tgz", - "integrity": "sha512-uh8vpY/1/YyFkunIDFH/12p7/7VdPKA1hejMVEbdkEaWnUz0Hesvx5EbiU6XxjyHZIOju+ZMbQJkRh+es3/spQ==", + "version": "2.11.25", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.25.tgz", + "integrity": "sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1716,9 +1716,9 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1729,9 +1729,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.9", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", - "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.0.tgz", + "integrity": "sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==", "dev": true, "funding": [ { @@ -1749,11 +1749,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.20", + "baseline-browser-mapping": "^2.11.23", "caniuse-lite": "^1.0.30001810", - "electron-to-chromium": "^1.5.420", - "node-releases": "^2.0.54", - "update-browserslist-db": "^1.3.2" + "electron-to-chromium": "^1.5.427", + "node-releases": "^2.0.55", + "update-browserslist-db": "^1.3.3" }, "bin": { "browserslist": "cli.js" @@ -2014,9 +2014,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.422", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.422.tgz", - "integrity": "sha512-UvA/32XqrLDdZSn7Jllo1AYNcWji/G0d5M0GTViE7KoGBiMunw3a34Sb2KO4ZZyrSEhqsxFoVhWWJshdyfKqJA==", + "version": "1.5.433", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.433.tgz", + "integrity": "sha512-5lCAbyZBjtmUt/RAGHRqrL2q0oEFRThDAsZHHDn9XHa89Qw7gMYOeSicBTy+AHfvo0r6vwsZvqNJTQIQy1BLzA==", "dev": true, "license": "ISC" }, @@ -2056,9 +2056,9 @@ } }, "node_modules/eslint": { - "version": "10.10.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.10.0.tgz", - "integrity": "sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==", + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.11.0.tgz", + "integrity": "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==", "dev": true, "license": "MIT", "workspaces": [ @@ -2135,9 +2135,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.6.tgz", - "integrity": "sha512-uZnh24On2bk478AkaDAKcpRiYhS3qFSaSNvpXxV6/Ek/BBDICkWGG7MnBSfjnIlCVBei5vsLlIeQYxbF22+Udg==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.7.tgz", + "integrity": "sha512-XhJSzLljuYD4UjNuFGJu2v7aD3sqNVK12w5/DCUfrNfHWegZo2+TsavNx8MuxMwEquuFAzNbNfXKU0WoZ+YUIg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2592,9 +2592,9 @@ } }, "node_modules/ignore": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.8.tgz", - "integrity": "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.9.tgz", + "integrity": "sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==", "dev": true, "license": "MIT", "engines": { @@ -3070,9 +3070,9 @@ } }, "node_modules/markdown-it": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.1.tgz", - "integrity": "sha512-9/7gE95FNPkfUWrjJIoHZza2iLmuJlPD0UNMxPi7bxUrbCR525YZY0r+zyfes0dZI5ZZ/uNIXUJca0pJvtw41g==", + "version": "15.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-15.0.2.tgz", + "integrity": "sha512-q4IGxMv56jCqT4OCRCADBoDP3LO4MhmTXjFbphHPXs4g3j9Xg5RDnxqN8IF/3vIWEU+VCnUq+7JUg/cfy2E6Qw==", "funding": [ { "type": "github", @@ -3274,9 +3274,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "dev": true, "funding": [ { @@ -3300,9 +3300,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", - "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "version": "2.0.56", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.56.tgz", + "integrity": "sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==", "dev": true, "license": "MIT", "engines": { @@ -3695,30 +3695,30 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", - "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "19.2.8", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", - "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.8" + "react": "^19.3.0" } }, "node_modules/react-i18next": { - "version": "17.0.13", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.13.tgz", - "integrity": "sha512-Cc1PscmblIHA1kljTqDwrcVMI21ydgmUzw0UAeQBe7pAOgfuRLfzXze4EUBQoeDiICzFIXXhHFoZxuetNg5D0Q==", + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.14.tgz", + "integrity": "sha512-ZpMBfJL3BiXPuYHj5QMY1GwvKJNhE1vCxOJQ8BoMBdHP5XONTfi/Qss1nuRlnFdIl72PKo2jPmw+fxuLjRFgaQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.29.7", @@ -3806,9 +3806,9 @@ } }, "node_modules/react-router": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.3.tgz", - "integrity": "sha512-gyXgtdr5uACJ5b1Q4udzjVV+tb/rlHIMJKuJ0e89R4Kzgz47z/rgP0dIKxktqIEUhDHluGTPJJH/wRha7CyqsA==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.4.tgz", + "integrity": "sha512-PUPQcMhMGRAslLcvtlPz/kmzBEWPhLdgLFrL7pLNepBL6dX0lWj4WD2cUYVgYCuT3jxvghYFg81cDTj44DhetQ==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -3828,12 +3828,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.3.tgz", - "integrity": "sha512-ytVbyBBM7vMfRCam25r0WMhSVSom909A8p+8m0/f1w853dz/xfFu6etAT2SEbVoSnI+ZoPRDqIsQXVT89gp7kg==", + "version": "7.18.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.4.tgz", + "integrity": "sha512-yrfmJHIpDG7taCpqKjT1G5B6q3O2K+RN8/fgNf0lTjCwiPbQ0ei6vXX9ZjQR+7ld8Tr7Z5xmyMnZ8YJrphWQUw==", "license": "MIT", "dependencies": { - "react-router": "7.18.3" + "react-router": "7.18.4" }, "engines": { "node": ">=20.0.0" @@ -3906,13 +3906,13 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.7.tgz", - "integrity": "sha512-g0EtLvBjTUB7jhyV0S/TCup3v/XSVl45vUIGbOGU4QPiyjTenCe4mKuFvW9fEgYmS2Fo42AUssRmNuMziXdrig==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.9.tgz", + "integrity": "sha512-hx/Pv0N1haXRb11qkfnK5MXB/iqr7i0yjWQqmO9uHqZpBgQSqzc8UsSnEpalsh+j1I8qQ2CkXAkJC8Br3dKSlg==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.148.0", + "@oxc-project/types": "=0.150.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -3922,27 +3922,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm-eabi": "1.2.7", - "@rolldown/binding-android-arm64": "1.2.7", - "@rolldown/binding-darwin-arm64": "1.2.7", - "@rolldown/binding-darwin-x64": "1.2.7", - "@rolldown/binding-freebsd-x64": "1.2.7", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.7", - "@rolldown/binding-linux-arm64-gnu": "1.2.7", - "@rolldown/binding-linux-arm64-musl": "1.2.7", - "@rolldown/binding-linux-ppc64-gnu": "1.2.7", - "@rolldown/binding-linux-s390x-gnu": "1.2.7", - "@rolldown/binding-linux-x64-gnu": "1.2.7", - "@rolldown/binding-linux-x64-musl": "1.2.7", - "@rolldown/binding-openharmony-arm64": "1.2.7", - "@rolldown/binding-win32-arm64-msvc": "1.2.7", - "@rolldown/binding-win32-x64-msvc": "1.2.7" + "@rolldown/binding-android-arm-eabi": "1.2.9", + "@rolldown/binding-android-arm64": "1.2.9", + "@rolldown/binding-darwin-arm64": "1.2.9", + "@rolldown/binding-darwin-x64": "1.2.9", + "@rolldown/binding-freebsd-x64": "1.2.9", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.9", + "@rolldown/binding-linux-arm64-gnu": "1.2.9", + "@rolldown/binding-linux-arm64-musl": "1.2.9", + "@rolldown/binding-linux-ppc64-gnu": "1.2.9", + "@rolldown/binding-linux-s390x-gnu": "1.2.9", + "@rolldown/binding-linux-x64-gnu": "1.2.9", + "@rolldown/binding-linux-x64-musl": "1.2.9", + "@rolldown/binding-openharmony-arm64": "1.2.9", + "@rolldown/binding-win32-arm64-msvc": "1.2.9", + "@rolldown/binding-win32-x64-msvc": "1.2.9" } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", "license": "MIT" }, "node_modules/semver": { @@ -4175,9 +4175,9 @@ } }, "node_modules/type-fest": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.9.0.tgz", - "integrity": "sha512-yANm3Jr3GiJ1qgJlxGAVxTOIcEOk1rhQHamlXtnrCK7EHP4HeM9OGxtMg/W7HFdrVzw/ZWJKGVIJusVH85sLtw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.10.0.tgz", + "integrity": "sha512-NoSdpq/WEiAg5sjmBkmV/hfxv6HJH4NqPNrqjtSO5CwRmpsDfaf4begxW34KdJykH/l1yHtwBWQkCRdoXO8mPA==", "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" @@ -4278,9 +4278,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", - "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -4362,9 +4362,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.7.0.tgz", + "integrity": "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4406,16 +4406,16 @@ } }, "node_modules/vite": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", - "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.26", - "rolldown": "~1.2.4", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "bin": { @@ -4432,7 +4432,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0 || ^0.5.0", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -4532,9 +4532,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -4560,9 +4560,9 @@ } }, "node_modules/zod": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", - "integrity": "sha512-sC95tT5iHHH9gtpj6A81kh+NEaRAUFN+qlUPDUbRfOMvNf5QCBqsb3WgvnpVtK5Y+4UfA6KqufotuTvMGiTlsA==", + "version": "4.6.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", + "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", "dev": true, "license": "MIT", "funding": { diff --git a/package.json b/package.json index 22de916..264cde6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "algojudge-client", "private": true, - "version": "0.1.1", + "version": "0.2.0", "type": "module", "engines": { "node": ">=24"