Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/agents/dependabot-fixer.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ You follow the rules in `CLAUDE.md`. Implementation work goes through Workflow s

1. **Read the PR live.** `gh pr view <n>`, `gh pr diff <n>`. Note the branch and head sha. Dependabot branches are named `dependabot/...`.
2. **Read the failing checks.** Delegate the diagnosis to the `ci-triager` agent. Do not diagnose from memory. Ask it for the failing job, root cause and owning file.
3. **Run the blocked-upgrades check first.** Run the `/deps-check` skill. If the bump is a blocked one (TypeScript 7 or ESLint 10 while the peer range is still old), **stop and report.** Do not work around it. Do not use overrides or `--legacy-peer-deps`. Do not close #272, #386 or #387.
3. **Run the blocked-upgrades check first.** Run the `/deps-check` skill for upgrades tracked in [AGENTS.md](../../AGENTS.md). If the published peer ranges exclude the proposed version, **stop and report** the conflicting range. Keep the PR open and do not use overrides or `--legacy-peer-deps`.
4. **Read the changelog and migration notes** of the bumped package. Use the release notes on the package's GitHub page or on the registry. Note every breaking change.
5. **Fix real breakages in code.** Change call sites to match the new API. Do not add `@ts-ignore`, `eslint-disable`, `//nolint`, overrides, or loosened configs. Do not delete or weaken tests (system rule 1). If a test must change, stop and ask the maintainer.
6. **Regenerate lock files with the tool, never by hand.**
Expand Down
20 changes: 6 additions & 14 deletions .claude/skills/deps-check/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,12 @@ name: deps-check
description: "Use at session start, or when a dependency upgrade is proposed, to check the blocked dependency upgrades listed in CLAUDE.md (TypeScript 7 and ESLint 10) against the npm registry."
---

This is the session-start check from `CLAUDE.md`. Run it every session. It only reads the registry. It changes nothing.
Run the session-start check in [AGENTS.md](../../../AGENTS.md) every session. This check only reads the registry.

## Steps

1. Run the registry checks:
```sh
npm view @typescript-eslint/parser@latest version peerDependencies.typescript
npm view @typescript-eslint/parser@canary version peerDependencies.typescript
npm view eslint-plugin-react@latest version peerDependencies.eslint
```
2. TypeScript 7 entry. It is blocked while the peer range ends `<7` (for example `<6.1.0`). Report blocked or unblocked, with the version and the peer range seen for both `@latest` and `@canary`. Unblocked means a release accepts TypeScript 7.
3. ESLint 10 entry. It is blocked while the `eslint-plugin-react` peer range lacks `^10`. Report blocked or unblocked, with the version and the peer range seen. Other plugins already accept `^10`: `eslint-plugin-react-hooks@7.1.1` and `@typescript-eslint/*@8.69.0`.
4. Report one line per entry: name, blocked or unblocked, version, peer range. Then say what blocks it, in one line.
5. If an entry is unblocked, list its unblock steps from `CLAUDE.md`. Do not perform them unless the maintainer asks.
- TypeScript 7: do T055 and T056 in `specs/009-remediate-security-dependabot/tasks.md`. Bump `typescript` and `@typescript-eslint/*` in `web/package.json`. Fix real type errors, with no `@ts-ignore`. Merge Dependabot #272. Mark the tasks `[X]`. Delete the TypeScript entry from `CLAUDE.md`.
- ESLint 10: bump `eslint` and `@eslint/js` together in `web/package.json`. Fix real lint errors, with no `eslint-disable`. Merge #386, and #387 if it is open. Delete the ESLint entry from `CLAUDE.md`.
6. Never close #272, #386 or #387. Never use `--legacy-peer-deps` or overrides to get around a peer range.
1. Run the registry queries in the blocked dependency upgrades section of `AGENTS.md`.
2. For TypeScript (#272) and the paired ESLint engine and preset (#857 and #628), check whether each published peer range accepts the proposed version. Report TypeScript results for both the latest and canary tags.
3. Report each upgrade on one line with its status, package versions and peer ranges. Identify the package that blocks the upgrade, if any.
4. If an upgrade is unblocked, list its migration steps from `AGENTS.md`. Perform them only when the maintainer asks.
5. Keep the tracked PRs open. Never use `--legacy-peer-deps` or overrides to bypass a peer range.
12 changes: 6 additions & 6 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,13 @@ Architecture, commands, and binding rules for AI agents. Humans: [`README.md`](R

Run every session.

**TypeScript 7** — `npm view @typescript-eslint/parser@latest version peerDependencies.typescript` and same for `@canary`.
- Blocked while the peer range ends `<7` (e.g. `<6.1.0`): Dependabot #272 fails `npm ci` (`ERESOLVE`). No workarounds/overrides/code fixes; don't close #272.
- Unblocked (a release accepts TS 7): do T055/T056 in `specs/009-remediate-security-dependabot/tasks.md` — bump `typescript` + `@typescript-eslint/*` in `web/package.json`, fix real type errors (no `@ts-ignore`), merge #272, mark tasks `[X]`, delete this entry.
**TypeScript 7 (#272).** Check the published TypeScript peer ranges for both `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` with `npm view <package>@latest version peerDependencies.typescript`. Repeat for `@canary`. Keep #272 open and use a supported TypeScript 6.x release while the proposed compiler is outside those ranges.
- Once a release supports the target version, refresh #272 against `master`, upgrade the compiler, parser and plugin together, and regenerate `web/package-lock.json`. Migrate the compiler API calls in `web/scripts/i18n-migrate.ts` and verify its dry run alongside the build. Fix type errors at source, merge after CI passes, complete T055/T056 in `specs/009-remediate-security-dependabot/tasks.md`, and remove this entry.

**ESLint 10** — `npm view eslint-plugin-react@latest version peerDependencies.eslint`.
- Blocked while the range lacks `^10`: upgrading `eslint` 9.39.5 to 10.x fails `npm ci` because `eslint-plugin-react@7.37.5` peers `^3 || … || ^9.7`. Keep `eslint` and `@eslint/js` on major 9 together: `@eslint/js@10.0.1` declares an optional peer on `eslint@^10.0.0`, which conflicts when ESLint 9 is installed. Other plugins already accept `^10` (`eslint-plugin-react-hooks@7.1.1`, `@typescript-eslint/*@8.69.0`). Do not bypass peer checks with `--legacy-peer-deps` or overrides.
- Unblocked: bump `eslint` + `@eslint/js` together in `web/package.json`, fix real lint errors (no `eslint-disable`), merge #386 (and #387 if open), delete this entry.
**ESLint 10 (#857 and #628).** Run `npm view eslint-plugin-react@latest version peerDependencies.eslint`. Keep `eslint` and `@eslint/js` on compatible 9.x releases until a published React plugin supports ESLint 10.
- Upgrade the React plugin, ESLint and its JS preset in one PR. Regenerate the lockfile, verify `npm ci` and `npm ls eslint @eslint/js` in `web/`, and fix lint errors at source. Remove this entry once the combined upgrade merges.

Both upgrades require a supported peer dependency tree. Preserve peer checks and the existing lint and type checks. [Dashboard upgrade blockers](docs/dependencies.md#dashboard-upgrade-blockers)

## System prompt overrides

Expand Down
15 changes: 13 additions & 2 deletions docs/dependencies.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,10 +359,11 @@ React 18 + TypeScript strict + Vite dashboard (`web/package.json` version
**Styling / build**
- `tailwindcss` `^4.3.3`, `autoprefixer` `^10.5.4`, `postcss` `^8.5.26` (dev) — `postcss.config.js` wires Tailwind + autoprefixer; `tailwind.config.ts` defines the design tokens used throughout `src/styles` and Tailwind classes app-wide.
- `vite` `^8.2.2`, `@vitejs/plugin-react` `^6.1.1` (dev) — `vite.config.ts` drives the dev server (with the API/WS proxy to the in-cluster API used by `make web-dev`), production build, and is the engine behind `vitest.config.ts`.
- `typescript` `^6.0.3` (dev) — strict-mode compile per `tsconfig.json`; `npm run build` is `tsc -b && vite build`.
- `typescript` `^6.0.3` (dev) type-checks the dashboard during `npm run build` and supplies the compiler API used by `npm run i18n:migrate`.

**Lint** (dev, all wired directly in `eslint.config.js`)
- `eslint` `^9.39.5`, `@eslint/js` `^10.0.1`, `@typescript-eslint/eslint-plugin` `^8.68.0`, `@typescript-eslint/parser` `^8.68.0`, `eslint-plugin-react` `^7.37.5`, `eslint-plugin-react-hooks` `^7.1.1`, `globals` `^17.11.0` — flat-config ESLint enforcing `strict`, `@typescript-eslint/no-explicit-any: error`, `@typescript-eslint/no-floating-promises: error`, run via `npm run lint`.
- `eslint` and `@eslint/js` both use `^9.39.5`. The flat config uses `@typescript-eslint/eslint-plugin` `^8.72.1` with `@typescript-eslint/parser` `^8.68.0` for rules including `no-explicit-any` and `no-floating-promises`.
- `eslint-plugin-react` `^7.37.5`, `eslint-plugin-react-hooks` `^7.1.1`, `eslint-plugin-formatjs` `^8.1.3` and `globals` `^17.14.0` provide the remaining rules and environment definitions for `npm run lint`.

**Testing — unit tier (Vitest)**
- `vitest` `^4.1.11`, `@vitest/coverage-v8` `^4.1.10` (dev) — `vitest.config.ts` (jsdom environment, coverage thresholds), run via `npm test`/`test:cover`.
Expand All @@ -377,6 +378,16 @@ React 18 + TypeScript strict + Vite dashboard (`web/package.json` version
**Types**
- `@types/react` `^19.2.18`, `@types/react-dom` `^19.2.5`, `@types/node` `^26.4.0` (dev) — type definitions consumed implicitly by TypeScript, no direct import.

#### Dashboard upgrade blockers

**ESLint 10.** #857 requests ESLint 10.14.0. Gameplane uses React version detection in `eslint-plugin-react@7.37.5`. Loading the recommended `react/display-name` rule calls `context.getFilename()`, which ESLint 10 removed. The plugin therefore limits its ESLint peer range to 9.x and earlier. [Failed install on #857](https://github.com/GameplanePanel/Gameplane/actions/runs/42612725409/job/129148915676) · [Plugin call site](https://github.com/jsx-eslint/eslint-plugin-react/blob/v7.37.5/lib/util/version.js#L31) · [Upstream compatibility patch](https://github.com/jsx-eslint/eslint-plugin-react/pull/4022)

#628 updates the JS preset to 10.0.1. Its optional peer requires ESLint 10 whenever ESLint is installed. Although CI passes, `npm ls --package-lock-only eslint @eslint/js` reports the installed 9.39.5 as invalid. Upgrade the React plugin, engine and preset together once a compatible plugin ships. [Preset update](https://github.com/GameplanePanel/Gameplane/pull/628) · [Prior install fix](https://github.com/GameplanePanel/Gameplane/pull/574)

**TypeScript 7.** #272 requests 7.0.2. On November 10, 2026, both `@typescript-eslint/parser` and `@typescript-eslint/eslint-plugin` required TypeScript `>=4.8.4 <6.1.0` on `latest` (8.72.2) and `canary` (8.72.3-alpha.7). npm stops at installation, before the compiler runs. Both packages also reject TypeScript 7 at startup. Gameplane’s i18n migration script uses `ts.SyntaxKind` and `ts.createSourceFile`. The 7.0.2 root module exports only version information. [Failed install on #272](https://github.com/GameplanePanel/Gameplane/actions/runs/35788085422/job/106949735140) · [Parser startup check](https://github.com/typescript-eslint/typescript-eslint/blob/v8.72.2/packages/parser/src/index.ts#L5-L18) · [Gameplane migration script](../web/scripts/i18n-migrate.ts)

Upstream’s experimental TypeScript 7.1 backend uses a second compiler alongside TypeScript 6 and requires a different parser configuration. A direct upgrade needs published parser and plugin support for the target compiler and a working migration script. From `web/`, exercise the script with `npm run i18n:migrate -- --dry-run src` as well as running the dashboard build. [Upstream backend configuration](https://github.com/typescript-eslint/typescript-eslint/blob/5ccbc78a631ae8a450179b8975be6d02e11d3a9b/docs/packages/Parser.mdx#L353-L387)

## Test-only

### test/e2e
Expand Down
2 changes: 1 addition & 1 deletion docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ opt-out), and a monthly workflow refreshes the pins. Authoring rules live in
Status as of 2026-10-14. Task counts come from each spec's `tasks.md`.

- **Spec 002, Nuclear Option module and load-balancer IP pool override** (`specs/002-nuclear-option-ip-pool/`): 136 of 143 tasks done. Blocked: the server does not bind UDP 7777, so no join client can be built until a real-client packet capture documents the handshake (maintainer decision, 2026-10-11). Unblocked by: that packet capture. The join test, its bucket and the coverage row wait on it.
- **Spec 009, code scanning remediation and Dependabot** (`specs/009-remediate-security-dependabot/`): 80 of 82 tasks done. Blocked: TypeScript 7 is blocked because the `@typescript-eslint` peer range stops before TypeScript 7, and ESLint 10 is blocked because `eslint-plugin-react` does not accept `^10`. Unblocked by: a `@typescript-eslint` release that accepts TypeScript 7 (then T055/T056 and PR #272), and an `eslint-plugin-react` release that accepts `^10` (then PR #386, and #387 if open).
- **Spec 009, code scanning remediation and Dependabot** (`specs/009-remediate-security-dependabot/`) has 80 of 82 tasks done. T055/T056 and #272 await TypeScript 7 support in the lint parser and plugin. The ESLint 10 engine and preset upgrades (#857 and #628) can proceed together once the React lint plugin supports ESLint 10. [Dashboard upgrade blockers](dependencies.md#dashboard-upgrade-blockers)
- **Spec 013, expand test coverage** (`specs/done_013-expand-test-coverage/`): 39 of 62 tasks done. No external blocker is named. Open work is the live web e2e specs, the optional-components e2e, the Postgres e2e, docs and checks, and the archive step. Some tasks wait for the first green CI run of their job, and the archive waits until every PR is merged. Open PRs for this spec are in progress.
- **Spec 019, app localization and community language packs** (`specs/019-localization-language-packs/`): 0 of 105 tasks checked; the four design decisions are settled. The implementation is on open PR #668 and is not yet on `master`. Unblocked by: merging PR #668, which needs human approval. The first step is the `i18n/` module and checker.
- **Spec 021, edit game configuration from server Settings** (`specs/done_021-settings-game-config/`): done. All 24 tasks complete; merged in PR #568 and PR #652, then archived.
Expand Down
10 changes: 4 additions & 6 deletions web/specs.md
Original file line number Diff line number Diff line change
Expand Up @@ -1192,7 +1192,7 @@ openEventStream(opts: EventStreamOptions)
- `@xterm/addon-fit@0.10.0` — xterm fit-to-container addon

**Dev:**
- `typescript@5.6.2` — strict type checking
- `typescript@6.0.3` — strict type checking and the compiler API used by the i18n migration script
- `vite@5.4.8` — build + dev server
- `@vitejs/plugin-react@4.3.1` — React JSX transform + fast refresh
- `vitest@2.1.1` — unit test runner (Jest-like API, Vite-integrated)
Expand All @@ -1204,11 +1204,9 @@ openEventStream(opts: EventStreamOptions)
- `vitest-websocket-mock@0.4.0` — WebSocket mock for unit tests
- `@playwright/test@1.59.1` — browser e2e testing (mock + live modes)
- `jsdom@25.0.1` — DOM implementation for unit tests
- `eslint@9.11.1` — JavaScript linter
- `@typescript-eslint/eslint-plugin@8.7.0` — TypeScript linting rules
- `@typescript-eslint/parser@8.7.0` — TypeScript AST parser for ESLint
- `eslint-plugin-react@7.37.0` — React-specific rules
- `eslint-plugin-react-hooks@5.0.0` — React Hooks rules
- `eslint@9.39.5` and `@eslint/js@9.39.5` — JavaScript linter and recommended preset
- `@typescript-eslint/eslint-plugin@8.72.1` and `@typescript-eslint/parser@8.72.1` — TypeScript rules and parser
- `eslint-plugin-react@7.37.5` and `eslint-plugin-react-hooks@7.1.1` — React and React Hooks rules
- `tailwindcss@3.4.13` + `postcss@8.4.47` + `autoprefixer@10.4.20` — CSS processing
- `@tanstack/router-devtools@1.75.0` — TanStack Router dev tools (optional, for debugging)

Expand Down
Loading