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