diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 6572dd8..be8c50d 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -3,12 +3,19 @@ updates:
- package-ecosystem: npm
directory: /
schedule:
- interval: weekly
+ interval: monthly
+ open-pull-requests-limit: 1
groups:
workspace-dependencies:
patterns:
- '*'
+
- package-ecosystem: github-actions
directory: /
schedule:
- interval: weekly
+ interval: monthly
+ open-pull-requests-limit: 1
+ groups:
+ github-actions-dependencies:
+ patterns:
+ - '*'
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index cd22001..60bde7c 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,11 +20,11 @@ jobs:
name: Quality and build
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
- - uses: pnpm/action-setup@v5
+ - uses: actions/checkout@v7
+ - uses: pnpm/action-setup@v6
with:
version: 11.21.0
- - uses: actions/setup-node@v6
+ - uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: pnpm
@@ -39,11 +39,11 @@ jobs:
name: Browser smoke
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v6
- - uses: pnpm/action-setup@v5
+ - uses: actions/checkout@v7
+ - uses: pnpm/action-setup@v6
with:
version: 11.21.0
- - uses: actions/setup-node@v6
+ - uses: actions/setup-node@v7
with:
node-version-file: .nvmrc
cache: pnpm
diff --git a/.gitignore b/.gitignore
index 55105f4..9b3b53e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
node_modules/
.pnpm-store/
.next/
+apps/world-lab/next-env.d.ts
dist/
coverage/
playwright-report/
diff --git a/AGENTS.md b/AGENTS.md
index e50e279..ab300ab 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -29,4 +29,7 @@ These instructions apply throughout the repository.
- Update architecture, security, testing, and roadmap docs when changing the corresponding contract.
- Do not commit `.env` files, credentials, generated build output, test reports, or caches.
- Use Conventional Commit messages. Keep pull requests within one roadmap milestone.
-- Before handing off a change, run `pnpm validate`; run `pnpm test:e2e` for World Lab behavior changes.
+- Coding agents write and update appropriate tests, configure automatic GitHub CI, and provide the exact local validation commands for the repository owner to run.
+- The repository owner runs local formatting checks, lint, type checking, tests, builds, and Playwright. Coding agents must not run local validation unless the owner explicitly requests it in that session.
+- Automatic GitHub CI may run after a branch is pushed. Coding agents may inspect CI status and failure logs.
+- Coding agents must never claim local tests passed unless the repository owner supplied the results.
diff --git a/apps/game-api/package.json b/apps/game-api/package.json
index 8aee15a..a228a3e 100644
--- a/apps/game-api/package.json
+++ b/apps/game-api/package.json
@@ -18,7 +18,7 @@
"hono": "4.13.2"
},
"devDependencies": {
- "@types/node": "26.2.0",
+ "@types/node": "24.13.3",
"esbuild": "0.28.2",
"tsx": "4.23.12",
"vitest": "4.1.10"
diff --git a/apps/world-lab/next-env.d.ts b/apps/world-lab/next-env.d.ts
deleted file mode 100644
index dea511f..0000000
--- a/apps/world-lab/next-env.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-///
-///
-
-// This file is managed by Next.js.
diff --git a/apps/world-lab/package.json b/apps/world-lab/package.json
index dbf93f3..b20ec4a 100644
--- a/apps/world-lab/package.json
+++ b/apps/world-lab/package.json
@@ -9,7 +9,7 @@
"lint": "eslint .",
"start": "next start",
"test": "vitest run",
- "typecheck": "tsc --noEmit"
+ "typecheck": "next typegen && tsc --noEmit"
},
"dependencies": {
"@agentborne/shared": "workspace:*",
diff --git a/docs/TESTING.md b/docs/TESTING.md
index 31020c6..0e1053f 100644
--- a/docs/TESTING.md
+++ b/docs/TESTING.md
@@ -2,6 +2,8 @@
Default validation is deterministic, offline except for dependency/browser installation and the World Lab basemap requested during manual viewing. No test calls a model provider.
+Coding agents write and update appropriate tests, configure automatic GitHub CI, and provide exact validation commands. The repository owner runs local formatting, lint, type checking, tests, builds, and Playwright unless they explicitly request an agent to run validation in that session. Agents may inspect automatic CI after a branch is pushed, but must not claim local checks passed unless the owner supplied the results.
+
## Local sequence
```bash
@@ -23,6 +25,8 @@ development server on another port, run for example
`pnpm validate` aggregates formatting, lint, type checking, unit/integration tests, and builds. Browser smoke coverage remains separate because it installs and starts Chromium.
+The World Lab typecheck runs `next typegen` before TypeScript. Next.js manages `apps/world-lab/next-env.d.ts`; the file remains in `tsconfig.json` but is ignored by Git so development, builds, and type generation can recreate it without dirtying the working tree.
+
## Layers
- Shared schema unit tests cover the four allowed requested-action forms and reject invented verbs.
diff --git a/package.json b/package.json
index 8298a3e..48da11c 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
},
"devDependencies": {
"@playwright/test": "1.62.1",
- "@types/node": "26.2.0",
+ "@types/node": "24.13.3",
"eslint": "9.39.5",
"eslint-config-next": "16.3.1",
"prettier": "3.9.6",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f01ffdd..f65c589 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -11,8 +11,8 @@ importers:
specifier: 1.62.1
version: 1.62.1
'@types/node':
- specifier: 26.2.0
- version: 26.2.0
+ specifier: 24.13.3
+ version: 24.13.3
eslint:
specifier: 9.39.5
version: 9.39.5(supports-color@7.2.0)
@@ -42,8 +42,8 @@ importers:
version: 4.13.2
devDependencies:
'@types/node':
- specifier: 26.2.0
- version: 26.2.0
+ specifier: 24.13.3
+ version: 24.13.3
esbuild:
specifier: 0.28.2
version: 0.28.2
@@ -52,7 +52,7 @@ importers:
version: 4.23.12
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
apps/world-lab:
dependencies:
@@ -70,7 +70,7 @@ importers:
version: 6.3.0
next:
specifier: 16.3.1
- version: 16.3.1(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ version: 16.3.1(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.62.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
react:
specifier: 19.2.8
version: 19.2.8
@@ -80,7 +80,7 @@ importers:
devDependencies:
'@testing-library/jest-dom':
specifier: 7.0.1
- version: 7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)))
+ version: 7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)))
'@testing-library/react':
specifier: 16.3.2
version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
@@ -95,13 +95,13 @@ importers:
version: 19.2.4(@types/react@19.2.18)
'@vitejs/plugin-react':
specifier: 6.0.5
- version: 6.0.5(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 6.0.5(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
jsdom:
specifier: 30.0.1
version: 30.0.1
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
packages/agent-runtime:
dependencies:
@@ -114,7 +114,7 @@ importers:
devDependencies:
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
packages/shared:
dependencies:
@@ -124,7 +124,7 @@ importers:
devDependencies:
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
packages/world-engine:
dependencies:
@@ -137,7 +137,7 @@ importers:
devDependencies:
vitest:
specifier: 4.1.10
- version: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ version: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
packages:
'@adobe/css-tools@4.5.0':
@@ -1452,10 +1452,10 @@ packages:
integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==,
}
- '@types/node@26.2.0':
+ '@types/node@24.13.3':
resolution:
{
- integrity: sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==,
+ integrity: sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==,
}
'@types/react-dom@19.2.4':
@@ -4273,10 +4273,10 @@ packages:
}
engines: { node: '>= 0.4' }
- undici-types@8.3.0:
+ undici-types@7.18.2:
resolution:
{
- integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==,
+ integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==,
}
undici@8.10.0:
@@ -5130,7 +5130,7 @@ snapshots:
picocolors: 1.1.1
pretty-format: 27.5.1
- '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)))':
+ '@testing-library/jest-dom@7.0.1(@testing-library/dom@10.4.1)(vitest@4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)))':
dependencies:
'@adobe/css-tools': 4.5.0
'@testing-library/dom': 10.4.1
@@ -5140,7 +5140,7 @@ snapshots:
picocolors: 1.1.1
redent: 3.0.0
optionalDependencies:
- vitest: 4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ vitest: 4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
'@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
dependencies:
@@ -5178,9 +5178,9 @@ snapshots:
'@types/json5@0.0.29': {}
- '@types/node@26.2.0':
+ '@types/node@24.13.3':
dependencies:
- undici-types: 8.3.0
+ undici-types: 7.18.2
'@types/react-dom@19.2.4(@types/react@19.2.18)':
dependencies:
@@ -5351,10 +5351,10 @@ snapshots:
'@unrs/resolver-binding-win32-x64-msvc@1.12.2':
optional: true
- '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))':
+ '@vitejs/plugin-react@6.0.5(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))':
dependencies:
'@rolldown/pluginutils': 1.0.1
- vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)
'@vitest/expect@4.1.10':
dependencies:
@@ -5365,13 +5365,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.1
- '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))':
+ '@vitest/mocker@4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))':
dependencies:
'@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)
'@vitest/pretty-format@4.1.10':
dependencies:
@@ -6534,7 +6534,7 @@ snapshots:
natural-compare@1.4.0: {}
- next@16.3.1(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.62.1)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ next@16.3.1(@babel/core@7.29.7(supports-color@7.2.0))(@playwright/test@1.62.1)(@types/node@24.13.3)(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
dependencies:
'@next/env': 16.3.1
'@swc/helpers': 0.5.23
@@ -6554,7 +6554,7 @@ snapshots:
'@next/swc-win32-arm64-msvc': 16.3.1
'@next/swc-win32-x64-msvc': 16.3.1
'@playwright/test': 1.62.1
- sharp: 0.35.3(@types/node@26.2.0)
+ sharp: 0.35.3(@types/node@24.13.3)
transitivePeerDependencies:
- '@babel/core'
- '@types/node'
@@ -6843,7 +6843,7 @@ snapshots:
es-errors: 1.3.0
es-object-atoms: 1.1.2
- sharp@0.35.3(@types/node@26.2.0):
+ sharp@0.35.3(@types/node@24.13.3):
dependencies:
'@img/colour': 1.1.0
detect-libc: 2.1.2
@@ -6874,7 +6874,7 @@ snapshots:
'@img/sharp-win32-arm64': 0.35.3
'@img/sharp-win32-ia32': 0.35.3
'@img/sharp-win32-x64': 0.35.3
- '@types/node': 26.2.0
+ '@types/node': 24.13.3
optional: true
shebang-command@2.0.0:
@@ -7107,7 +7107,7 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
- undici-types@8.3.0: {}
+ undici-types@7.18.2: {}
undici@8.10.0: {}
@@ -7148,7 +7148,7 @@ snapshots:
dependencies:
punycode: 2.3.1
- vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12):
+ vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.5
@@ -7156,15 +7156,15 @@ snapshots:
rolldown: 1.2.4
tinyglobby: 0.2.17
optionalDependencies:
- '@types/node': 26.2.0
+ '@types/node': 24.13.3
esbuild: 0.28.2
fsevents: 2.3.3
tsx: 4.23.12
- vitest@4.1.10(@types/node@26.2.0)(jsdom@30.0.1)(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)):
+ vitest@4.1.10(@types/node@24.13.3)(jsdom@30.0.1)(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)):
dependencies:
'@vitest/expect': 4.1.10
- '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12))
+ '@vitest/mocker': 4.1.10(vite@8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12))
'@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.10
@@ -7181,10 +7181,10 @@ snapshots:
tinyexec: 1.3.0
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vite: 8.2.1(@types/node@26.2.0)(esbuild@0.28.2)(tsx@4.23.12)
+ vite: 8.2.1(@types/node@24.13.3)(esbuild@0.28.2)(tsx@4.23.12)
why-is-node-running: 2.3.0
optionalDependencies:
- '@types/node': 26.2.0
+ '@types/node': 24.13.3
jsdom: 30.0.1
transitivePeerDependencies:
- msw