diff --git a/.changeset/support-rstest-012.md b/.changeset/support-rstest-012.md new file mode 100644 index 000000000..910988fd7 --- /dev/null +++ b/.changeset/support-rstest-012.md @@ -0,0 +1,5 @@ +--- +"agent-bundle": patch +--- + +Support Rstest 0.12 in `agent-bundle/rstest` and align the MCP App example's browser and core packages. (#868) diff --git a/examples/mcp-app/package.json b/examples/mcp-app/package.json index 2af1997ee..2b0fdbcec 100644 --- a/examples/mcp-app/package.json +++ b/examples/mcp-app/package.json @@ -14,9 +14,8 @@ }, "devDependencies": { "@agent-bundle/runtime": "workspace:*", - "@rstest/browser": "0.11.12", - "@rstest/core": "0.11.12", - "@rstest/playwright": "0.11.12", + "@rstest/browser": "0.12.2", + "@rstest/core": "0.12.2", "@types/react": "19.3.0", "agent-bundle": "workspace:*", "playwright": "1.63.0", diff --git a/packages/agent-bundle/package.json b/packages/agent-bundle/package.json index c21e90e81..919554bcc 100644 --- a/packages/agent-bundle/package.json +++ b/packages/agent-bundle/package.json @@ -143,7 +143,7 @@ }, "peerDependencies": { "@agent-bundle/runtime": ">=0.0.0 <1", - "@rstest/core": "^0.11.10", + "@rstest/core": "^0.11.10 || ^0.12.0", "react": "^19.2.0" }, "peerDependenciesMeta": { diff --git a/packages/workbench/tests/packed-release.e2e.test.ts b/packages/workbench/tests/packed-release.e2e.test.ts index b51853f2c..a19ea7eec 100644 --- a/packages/workbench/tests/packed-release.e2e.test.ts +++ b/packages/workbench/tests/packed-release.e2e.test.ts @@ -1,4 +1,5 @@ import { spawn, type ChildProcess } from 'node:child_process'; +import { once } from 'node:events'; import { access, chmod, cp, mkdir, mkdtemp, readFile, readdir, realpath, writeFile } from 'node:fs/promises'; import { createServer } from 'node:net'; import { tmpdir } from 'node:os'; @@ -70,6 +71,17 @@ const e2e = test.extend({ const isAppRoute = (url: URL): boolean => url.pathname.startsWith('/api/mcp/apps/') || /^\/api\/mcp\/sessions\/[^/]+\/apps$/u.test(url.pathname); +test('treats a signal-terminated packed server as already closed', async () => { + const child = spawn(process.execPath, ['-e', 'setInterval(() => {}, 1_000)'], { stdio: 'ignore' }); + await once(child, 'spawn'); + const exited = once(child, 'exit'); + child.kill('SIGTERM'); + await exited; + expect(child.signalCode).toBe('SIGTERM'); + await expect(closeChild(child)).resolves.toBeUndefined(); + await expect(awaitReady('http://127.0.0.1:0', child, () => '')).rejects.toThrow('exited before readiness'); +}); + e2e('runs every Agent API tool from the installed tarball', { timeout: 360_000 * timeScale }, async ({ page }) => { const { packOutput, tarball } = await sharedPackedTarball('agent-bundle'); const packedAgentBundleIdentity = `${packOutput.name}@${packOutput.version}`; @@ -722,18 +734,20 @@ e2e('runs every Agent API tool from the installed tarball', { timeout: 360_000 * for (const processId of await descendantProcessIds(stoppedChild.pid)) trackedProcessIds.add(processId); } const outageStartedAt = Date.now(); - const recoveredBrowserSession = page.waitForResponse((response) => - response.url() === `${origin}/api/project/session` && response.request().method() === 'GET' && response.ok(), - ); await closeChild(stoppedChild); phase = 'foreground restart/reconnect disconnected state'; await expectHeading(page, 'Foreground connection unavailable'); await expect(page.getByText('Waiting for the foreground server to recover.')).toBeVisible({ timeout: browserTimeout }); phase = 'foreground restart/reconnect browser recovery'; + const recoveredBrowserSession = page.waitForResponse((response) => + response.url() === `${origin}/api/project/session` && response.request().method() === 'GET' && response.ok(), + ); child = startInstalledServer(port); - await awaitReady(origin, child, () => commandOutput); - await expect(page.getByTestId('shell-connection')).toContainText('Foreground server connected', { timeout: browserTimeout }); - const recoveredBrowserSessionResponse = await recoveredBrowserSession; + const [recoveredBrowserSessionResponse] = await Promise.all([ + recoveredBrowserSession, + awaitReady(origin, child, () => commandOutput), + expect(page.getByTestId('shell-connection')).toContainText('Foreground server connected', { timeout: browserTimeout }), + ]); const recoveredBrowserSessionPayload = record(await recoveredBrowserSessionResponse.json(), 'recovered browser session'); const browserGenerationBToken = string(recoveredBrowserSessionPayload.token, 'recovered browser session token'); const recoveredBrowserSessionRequest = browserRequestByPlaywrightRequest.get(recoveredBrowserSessionResponse.request()); diff --git a/packages/workbench/tests/support/packed-release-harness.ts b/packages/workbench/tests/support/packed-release-harness.ts index a9e2b2981..f138d291e 100644 --- a/packages/workbench/tests/support/packed-release-harness.ts +++ b/packages/workbench/tests/support/packed-release-harness.ts @@ -3,18 +3,21 @@ import { chmod, mkdir, writeFile } from 'node:fs/promises'; import { relative, isAbsolute, join } from 'node:path'; import { promisify } from 'node:util'; +import { timeScale } from '../../../agent-bundle/tests/support/time-scale.ts'; + export { installedEnvironment } from '../../../agent-bundle/tests/support/shared-pack.ts'; export const execFile = promisify(executeFile); export const workspaceRoot = process.cwd(); const packedServerStartupBudget = 45_000; +const hasExited = (child: ChildProcess): boolean => child.exitCode !== null || child.signalCode !== null; export const awaitReady = async (origin: string, child: ChildProcess, output: () => string): Promise => { const startedAt = Date.now(); const diagnostics = (): string => `after ${String(Date.now() - startedAt)}ms (PID ${String(child.pid ?? 'unknown')}): ${output()}`; while (Date.now() - startedAt < packedServerStartupBudget) { - if (child.exitCode !== null) throw new Error(`The packed dev server exited before readiness ${diagnostics()}`); + if (hasExited(child)) throw new Error(`The packed dev server exited before readiness ${diagnostics()}`); try { if ((await fetch(origin)).ok) return; } catch { @@ -26,7 +29,7 @@ export const awaitReady = async (origin: string, child: ChildProcess, output: () }; const childExitedWithin = (child: ChildProcess, timeoutMs: number): Promise => { - if (child.exitCode !== null) return Promise.resolve(true); + if (hasExited(child)) return Promise.resolve(true); return new Promise((resolvePromise, rejectPromise) => { const finish = (exited: boolean): void => { clearTimeout(timeout); @@ -43,19 +46,19 @@ const childExitedWithin = (child: ChildProcess, timeoutMs: number): Promise { finish(false); }, timeoutMs); - if (child.exitCode !== null) finish(true); + if (hasExited(child)) finish(true); }); }; export const closeChild = async (child: ChildProcess): Promise => { - if (child.exitCode !== null) return; + if (hasExited(child)) return; const signalAndWait = async (signal: NodeJS.Signals): Promise => { - if (child.exitCode !== null) return true; + if (hasExited(child)) return true; if (!child.kill(signal)) { - if (child.exitCode !== null) return true; + if (hasExited(child)) return true; throw new Error(`The packed dev server could not receive ${signal}.`); } - return childExitedWithin(child, 5_000); + return childExitedWithin(child, 5_000 * timeScale); }; const closeFailures: unknown[] = []; try { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dd3dc3042..c536d530f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,7 +47,7 @@ importers: version: 2.2.5 '@rsbuild/plugin-react': specifier: 2.1.0 - version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23)) '@rslib/core': specifier: 1.0.0 version: 1.0.0(typescript@7.0.2) @@ -142,14 +142,11 @@ importers: specifier: workspace:* version: link:../../packages/rsc-runtime '@rstest/browser': - specifier: 0.11.12 - version: 0.11.12(@rstest/core@0.11.12)(playwright@1.63.0) + specifier: 0.12.2 + version: 0.12.2(@rstest/core@0.12.2)(playwright@1.63.0) '@rstest/core': - specifier: 0.11.12 - version: 0.11.12 - '@rstest/playwright': - specifier: 0.11.12 - version: 0.11.12(@rstest/core@0.11.12)(playwright@1.63.0) + specifier: 0.12.2 + version: 0.12.2 '@types/react': specifier: 19.3.0 version: 19.3.0 @@ -194,7 +191,7 @@ importers: version: 19.3.0(react@19.3.0) react-server-dom-rspack: specifier: 0.1.0 - version: 0.1.0(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + version: 0.1.0(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) zod: specifier: 4.6.4 version: 4.6.4 @@ -204,7 +201,7 @@ importers: version: 2.2.5 '@rsbuild/plugin-react': specifier: 2.1.0 - version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23)) '@rstest/core': specifier: 0.11.12 version: 0.11.12 @@ -222,7 +219,7 @@ importers: version: 1.63.0 rsbuild-plugin-rsc: specifier: 0.1.1 - version: 0.1.1(@rsbuild/core@2.2.5)(react-server-dom-rspack@0.1.0(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) + version: 0.1.1(@rsbuild/core@2.2.5)(react-server-dom-rspack@0.1.0(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)) examples/skills-starter: devDependencies: @@ -273,7 +270,7 @@ importers: version: 2.2.5 '@rsbuild/plugin-react': specifier: 2.1.0 - version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23)) '@rslib/core': specifier: 1.0.0 version: 1.0.0(typescript@7.0.2) @@ -284,7 +281,7 @@ importers: specifier: 1.0.0 version: 1.0.0(jiti@2.7.0) '@rstest/core': - specifier: ^0.11.10 + specifier: ^0.11.10 || ^0.12.0 version: 0.11.12 acorn: specifier: 8.18.0 @@ -487,7 +484,7 @@ importers: version: 2.2.5 '@rsbuild/plugin-react': specifier: 2.1.0 - version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23)) + version: 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23)) '@types/react': specifier: 19.3.0 version: 19.3.0 @@ -502,19 +499,19 @@ importers: version: 3.1.1(@types/react@19.3.0)(react@19.3.0) '@rspress/core': specifier: 2.0.21 - version: 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) + version: 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) '@rspress/plugin-llms': specifier: 2.0.22 - version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(supports-color@7.2.0) + version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(supports-color@7.2.0) '@rspress/plugin-sitemap': specifier: 2.0.22 - version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)) + version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)) '@rspress/plugin-twoslash': specifier: 2.0.22 - version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(react@19.3.0)(supports-color@7.2.0) + version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(react@19.3.0)(supports-color@7.2.0) '@rspress/plugin-typedoc': specifier: 2.0.22 - version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)) + version: 2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)) '@rspress/shared': specifier: 2.0.22 version: 2.0.22(supports-color@7.2.0) @@ -1042,6 +1039,16 @@ packages: peerDependencies: '@redis/client': ^6.2.1 + '@rsbuild/core@2.2.11': + resolution: {integrity: sha512-avPW0j6RaEbtV2mfl0AzTAJEimPX4Xj0pCcZyxNCrE9vkS91HmweM5V7XQj3kI5iTYfHRp9Y6To8RRHYLEvG7A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + core-js: '>= 3.0.0' + peerDependenciesMeta: + core-js: + optional: true + '@rsbuild/core@2.2.5': resolution: {integrity: sha512-nf34ri1iZduYhHUr5Vc79L7Eml+IlN0nFIaF/g3OW4WR/gShxuf5wVXS69/H8FTHJYN4SdYlNcefSZQluEMKgA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1131,81 +1138,161 @@ packages: cpu: [arm64] os: [darwin] + '@rspack/binding-darwin-arm64@2.2.8': + resolution: {integrity: sha512-d6GuY/k7kJk7SOXmruIz0m+2fIXaLv2SnBHEYsbvBzE7ZO6QXq7fSABWFWNnSnNu+brYHA5Dr/skV81bXgTTCw==} + cpu: [arm64] + os: [darwin] + '@rspack/binding-darwin-x64@2.2.3': resolution: {integrity: sha512-5B/c1YTYEz9m7TyqtGQgTmXMr9PoPewyqsyHB4N0AB7nxDhtgmki0GniP2Lqtx3LJzOvQMjwet+I2lmWxvxwCg==} cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@2.2.8': + resolution: {integrity: sha512-xCVou/jJASjEAjwy1T3hPJcJqA5QZASJfUwHqEk+nA0v44MagwH8tM8lsOvRfhzR7N2+YFac1rfZOUT8uM3awg==} + cpu: [x64] + os: [darwin] + '@rspack/binding-linux-arm64-gnu@2.2.3': resolution: {integrity: sha512-sU+jPGD2xz3BxFvsdBQVGce538YHqrSKMB4ZSfKhj6RSKjeGzpJ1BVl8+IndiQsfTgaUxi7N+r5cs/ezGy1TVQ==} cpu: [arm64] os: [linux] libc: [glibc] + '@rspack/binding-linux-arm64-gnu@2.2.8': + resolution: {integrity: sha512-Zy/ss6YAQTjOWKDkcWrbKtu+pySltqT22wn68nlrWKygPWLNmMdU5anlsnwRTIuQ3MF0YJRS42ARauVtlqvRQw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@rspack/binding-linux-arm64-musl@2.2.3': resolution: {integrity: sha512-EQuADbqWbVgNAh5ep/u/B7Z/8UUkZjMLzHAOKZJklBpe4Y8mnhFNjieX0xc9NadR+drj9tqmEANxzTOkFtVPyQ==} cpu: [arm64] os: [linux] libc: [musl] + '@rspack/binding-linux-arm64-musl@2.2.8': + resolution: {integrity: sha512-lxgp5O8PhL3St9p82llHoNoeWzp9jltW5S9F00p00XPJZHUIuxbwfLSzn/6Wg86USEmafLoBkyD9CM8rBd3SNQ==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@rspack/binding-linux-ppc64-gnu@2.2.3': resolution: {integrity: sha512-kyXROzr519a5juBII9ysuc5ZD2apEZ0DJqL5PPCAOVHjzMfThEIBwnX3gicNCmp+kY0CCIOl2LagwbtFaOzoiA==} cpu: [ppc64] os: [linux] libc: [glibc] + '@rspack/binding-linux-ppc64-gnu@2.2.8': + resolution: {integrity: sha512-MY+YqpT02tcDCMgHy+IewQsaz7ql4mbJaAqqMlTIqvQwAUl9dXEP7BL352OgCxm9VRebTldE5lK99A3wVd3zqA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + '@rspack/binding-linux-riscv64-gnu@2.2.3': resolution: {integrity: sha512-F3x6Nu0RUSoLtiaMse3hYQ3Nf5A2de6vTWWDXj14Ll6BpGWXGn+U/eXT/nB199fFnDEYf+CJEa7d6fzcYdwdjA==} cpu: [riscv64] os: [linux] libc: [glibc] + '@rspack/binding-linux-riscv64-gnu@2.2.8': + resolution: {integrity: sha512-wmN9OigSGNGCKY+AOYaWI8LJcIi8qvs5KjueBueCKOnTV6MPIEujA75QZH1pehTTYKvdGv7r2EtUXUmWpn7/SQ==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@rspack/binding-linux-riscv64-musl@2.2.3': resolution: {integrity: sha512-O3HK7OnPvoBxZu4MX2j+t3gk4qiUsFYqj/29L3WgU1iQsdUSIN6PInW2JvbiLqyuzt09VltIEXTKayY8EysCpQ==} cpu: [riscv64] os: [linux] libc: [musl] + '@rspack/binding-linux-riscv64-musl@2.2.8': + resolution: {integrity: sha512-ZcQMYR10hLh581zs9MFnFFn0F7wyt5fkDffyukeMHJEoPJrbkfl6cQtsUdpQnZ+mYGYS5KydD1DT9/eMH65jjw==} + cpu: [riscv64] + os: [linux] + libc: [musl] + '@rspack/binding-linux-s390x-gnu@2.2.3': resolution: {integrity: sha512-SIxfGdwBdAjwJ8pDlPTb8MPIZIv/i2lKHn4/ywuDpFOxlUA4Bo/OKqQOenHx2MFD2mN8jigBZQTF0KVe5YP1uQ==} cpu: [s390x] os: [linux] libc: [glibc] + '@rspack/binding-linux-s390x-gnu@2.2.8': + resolution: {integrity: sha512-ahBiE+Ir1FMYvStYicihhSJlS2YRagxtry0jWH8zW287o7C0eiHJ+pteJHHC15T5RJqm0j6w5TuwYe+F9AYxxg==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@rspack/binding-linux-x64-gnu@2.2.3': resolution: {integrity: sha512-IzQGcw09WYn/IzwB1SQpg7FQ211MBr+fJB2/WoRrPS6CNdtlkDHZaI8z2oq+2Oc5Su21jgX75VlWFajirUx5Dw==} cpu: [x64] os: [linux] libc: [glibc] + '@rspack/binding-linux-x64-gnu@2.2.8': + resolution: {integrity: sha512-dncEI515NoPXh3zzWk06Rb3mhSV76myiFKqXiJ8K4fVAe5x/RlweMhvPhHhm7RnIMeBld7BeStzOqj38XFsWGA==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@rspack/binding-linux-x64-musl@2.2.3': resolution: {integrity: sha512-9OKSx2ickrR+PFal94XE6Hkj49AQ2HI3KuR9XeRkKOwSxjwrskV/Pn1wc2itDOHkm/QHP7k+MttsYb4FGuNIqw==} cpu: [x64] os: [linux] libc: [musl] + '@rspack/binding-linux-x64-musl@2.2.8': + resolution: {integrity: sha512-pfFyU03PjD0GaQG8zOQOHwq51rrJZetXjTGpMmz7iA1hq/f9lChJsDWrC8/7VXeQLwBofLZlOODqe8OM8OBzgA==} + cpu: [x64] + os: [linux] + libc: [musl] + '@rspack/binding-wasm32-wasi@2.2.3': resolution: {integrity: sha512-gici3jWJi0GDy9kbYh57LoA57H8A2EAD9cV2jFKp1YoJ2aX2U9lANh4L+xoKPTvVQYpRvleoA5jkAvyfeLQ5bw==} cpu: [wasm32] + '@rspack/binding-wasm32-wasi@2.2.8': + resolution: {integrity: sha512-3mOJuZTrF56jOh/GD9chLMJKbzPZ6Ty2OIML7+lLz0Yk2XS/xWRfLn85Dmnkb/O6UF65x7+p8VPAIZlBtLTclw==} + cpu: [wasm32] + '@rspack/binding-win32-arm64-msvc@2.2.3': resolution: {integrity: sha512-1MG66kcuqAGFs9ewiBc+/NJSTQr1jHrkZ2nCVMyhukl1o8embmFZa3BCibYgBYs5P7FRc6Sa+CDXcrfDZOLInQ==} cpu: [arm64] os: [win32] + '@rspack/binding-win32-arm64-msvc@2.2.8': + resolution: {integrity: sha512-Cu/RMZT/16s+67xhl6X1pswetL3GLSQl+LnugKRh08Ul21A/tR7vxC4g4aih4u9k5SXCAngxFUt8zAjKnHIBqA==} + cpu: [arm64] + os: [win32] + '@rspack/binding-win32-ia32-msvc@2.2.3': resolution: {integrity: sha512-CAigxxh9DYJmEwH9f6FRkSsmt0GhKVqKaFRVFFrF9WDL7gXP3hyE/h/cCeMdmlTzRt8Mht87AvnDX7PG3neMrA==} cpu: [ia32] os: [win32] + '@rspack/binding-win32-ia32-msvc@2.2.8': + resolution: {integrity: sha512-H/erd6di8OapZhhM0raA/7XduPn9jusfLMeO1XF+AmF9WF3HzHgMjha1j+KwtPgQnaH69w6AhY+G2472VIwQmw==} + cpu: [ia32] + os: [win32] + '@rspack/binding-win32-x64-msvc@2.2.3': resolution: {integrity: sha512-qa5Wc34a+Uux5foZ1Z+9fPQceVRbgTunaIulHezVF/ZxvqKO4DkAC7tFl53shB0YRVBAPg8R78MGd8cByfoxLQ==} cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@2.2.8': + resolution: {integrity: sha512-BziHSUlIQM0MliCqdcHuBXSkQGtPoHQTXJce7fsgnTAzQFgPeog92qTNezYI4IrQ7pQouyiVJ2HPieUbVPRKQQ==} + cpu: [x64] + os: [win32] + '@rspack/binding@2.2.3': resolution: {integrity: sha512-532+T5N6yIdukChiL85H4NFN2vn9oi8wlLa1ByPNtpNYriE9s24fUhn0RiK7w/xACqnNpYmXCqLYCvjOzyCy+w==} + '@rspack/binding@2.2.8': + resolution: {integrity: sha512-c9flkSua3khHnOKBCRk8BkHGOwU9YB7niv+5JfQXiLZIvJmgKsZ7PD8QrFklMhsJT3oVAc6c9GN7/wy1YkACjA==} + '@rspack/core@2.2.3': resolution: {integrity: sha512-VHejw+PDd5B5v6VduFyjLSTIFaHBMNGPMKw+Y0zjkMqjYhDD1hjLOBC5frRKjTWcfYdk+Q73auWPp9k/H9PfIQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1218,6 +1305,18 @@ packages: '@swc/helpers': optional: true + '@rspack/core@2.2.8': + resolution: {integrity: sha512-JugsVrnbMGNYzMH++7gR9enygpP/lAo9PbVRq3XmJg0ryIvCpST0XJjBcccaSjYaaPamsjrddihmgVLMFp+yXw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 + '@swc/helpers': ^0.5.23 + peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true + '@swc/helpers': + optional: true + '@rspack/plugin-react-refresh@2.0.2': resolution: {integrity: sha512-dGNZiCxQxgAUI9sah7gd8u+O7OJZRCmqtEJNDOd8xW5RqcieC86F7p5qcShyw6onH5pKf57evpr2VjGbaFGkZg==} peerDependencies: @@ -1281,11 +1380,11 @@ packages: typescript: optional: true - '@rstest/browser@0.11.12': - resolution: {integrity: sha512-mCrRj8pXvdGeYpouUrFkV/GVLAbq5mOIx94+5jRCSLSgJNBMU1+OGu+aav3kFgyajORKEI+cKWT35hkPMj6+dQ==} + '@rstest/browser@0.12.2': + resolution: {integrity: sha512-K+S2P18Z2N8HQz4vHGwsn2Bvh0FWvpqO97y1Qmwm67IeZsmtIphbRNcC0xMzu+VzPnrVfnU/QjgBmh5hGpssXw==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - '@rstest/core': 0.11.12 + '@rstest/core': 0.12.2 playwright: ^1.49.1 peerDependenciesMeta: playwright: @@ -1304,6 +1403,19 @@ packages: jsdom: optional: true + '@rstest/core@0.12.2': + resolution: {integrity: sha512-vDn3fCWnfv1UnjG0ZBUyDyQstRNEuceBFMLKuvPvsSm+8vTRj3ad0O2izRdj0MuPj4AqzgYVlDMv+cGBYHTUlw==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + happy-dom: ^20.8.3 + jsdom: '>=15.0.0' + peerDependenciesMeta: + happy-dom: + optional: true + jsdom: + optional: true + '@rstest/playwright@0.11.12': resolution: {integrity: sha512-fU9BjRnCTsJNw2oEOY1aq/ozSt5gGuZMW6NwVHZrdxmi/uwypoYIcWSAE/kWukRzAazaSdO+wYZ4fB2IC8kLCA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1709,6 +1821,9 @@ packages: cjs-module-lexer@1.4.3: resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + cjs-module-lexer@2.2.1: + resolution: {integrity: sha512-Ca8swihM+/4yKecYHY52kgJd300hi2lADU/a1RxNTRe+RJ9jvqQlESpbz9DnG9mowez8qwXHB8qYdIUw9e+F5Q==} + cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -3820,6 +3935,13 @@ snapshots: dependencies: '@redis/client': 6.2.1 + '@rsbuild/core@2.2.11': + dependencies: + '@rspack/core': 2.2.8(@swc/helpers@0.5.23) + '@swc/helpers': 0.5.23 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + '@rsbuild/core@2.2.5': dependencies: '@rspack/core': 2.2.3(@swc/helpers@0.5.23) @@ -3827,9 +3949,9 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' - '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23))': + '@rsbuild/plugin-react@2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23))': dependencies: - '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-refresh@0.18.0) + '@rspack/plugin-react-refresh': 2.0.2(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-refresh@0.18.0) react-refresh: 0.18.0 optionalDependencies: '@rsbuild/core': 2.2.5 @@ -3887,33 +4009,63 @@ snapshots: '@rspack/binding-darwin-arm64@2.2.3': optional: true + '@rspack/binding-darwin-arm64@2.2.8': + optional: true + '@rspack/binding-darwin-x64@2.2.3': optional: true + '@rspack/binding-darwin-x64@2.2.8': + optional: true + '@rspack/binding-linux-arm64-gnu@2.2.3': optional: true + '@rspack/binding-linux-arm64-gnu@2.2.8': + optional: true + '@rspack/binding-linux-arm64-musl@2.2.3': optional: true + '@rspack/binding-linux-arm64-musl@2.2.8': + optional: true + '@rspack/binding-linux-ppc64-gnu@2.2.3': optional: true + '@rspack/binding-linux-ppc64-gnu@2.2.8': + optional: true + '@rspack/binding-linux-riscv64-gnu@2.2.3': optional: true + '@rspack/binding-linux-riscv64-gnu@2.2.8': + optional: true + '@rspack/binding-linux-riscv64-musl@2.2.3': optional: true + '@rspack/binding-linux-riscv64-musl@2.2.8': + optional: true + '@rspack/binding-linux-s390x-gnu@2.2.3': optional: true + '@rspack/binding-linux-s390x-gnu@2.2.8': + optional: true + '@rspack/binding-linux-x64-gnu@2.2.3': optional: true + '@rspack/binding-linux-x64-gnu@2.2.8': + optional: true + '@rspack/binding-linux-x64-musl@2.2.3': optional: true + '@rspack/binding-linux-x64-musl@2.2.8': + optional: true + '@rspack/binding-wasm32-wasi@2.2.3': dependencies: '@emnapi/core': 1.11.3 @@ -3921,15 +4073,31 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) optional: true + '@rspack/binding-wasm32-wasi@2.2.8': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3) + optional: true + '@rspack/binding-win32-arm64-msvc@2.2.3': optional: true + '@rspack/binding-win32-arm64-msvc@2.2.8': + optional: true + '@rspack/binding-win32-ia32-msvc@2.2.3': optional: true + '@rspack/binding-win32-ia32-msvc@2.2.8': + optional: true + '@rspack/binding-win32-x64-msvc@2.2.3': optional: true + '@rspack/binding-win32-x64-msvc@2.2.8': + optional: true + '@rspack/binding@2.2.3': optionalDependencies: '@rspack/binding-darwin-arm64': 2.2.3 @@ -3947,24 +4115,47 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 2.2.3 '@rspack/binding-win32-x64-msvc': 2.2.3 + '@rspack/binding@2.2.8': + optionalDependencies: + '@rspack/binding-darwin-arm64': 2.2.8 + '@rspack/binding-darwin-x64': 2.2.8 + '@rspack/binding-linux-arm64-gnu': 2.2.8 + '@rspack/binding-linux-arm64-musl': 2.2.8 + '@rspack/binding-linux-ppc64-gnu': 2.2.8 + '@rspack/binding-linux-riscv64-gnu': 2.2.8 + '@rspack/binding-linux-riscv64-musl': 2.2.8 + '@rspack/binding-linux-s390x-gnu': 2.2.8 + '@rspack/binding-linux-x64-gnu': 2.2.8 + '@rspack/binding-linux-x64-musl': 2.2.8 + '@rspack/binding-wasm32-wasi': 2.2.8 + '@rspack/binding-win32-arm64-msvc': 2.2.8 + '@rspack/binding-win32-ia32-msvc': 2.2.8 + '@rspack/binding-win32-x64-msvc': 2.2.8 + '@rspack/core@2.2.3(@swc/helpers@0.5.23)': dependencies: '@rspack/binding': 2.2.3 optionalDependencies: '@swc/helpers': 0.5.23 - '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-refresh@0.18.0)': + '@rspack/core@2.2.8(@swc/helpers@0.5.23)': + dependencies: + '@rspack/binding': 2.2.8 + optionalDependencies: + '@swc/helpers': 0.5.23 + + '@rspack/plugin-react-refresh@2.0.2(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-refresh@0.18.0)': dependencies: react-refresh: 0.18.0 optionalDependencies: - '@rspack/core': 2.2.3(@swc/helpers@0.5.23) + '@rspack/core': 2.2.8(@swc/helpers@0.5.23) - '@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)': + '@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: '@mdx-js/mdx': 3.1.1(supports-color@7.2.0) '@mdx-js/react': 3.1.1(@types/react@19.3.0)(react@19.3.0) '@rsbuild/core': 2.2.5 - '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.3(@swc/helpers@0.5.23)) + '@rsbuild/plugin-react': 2.1.0(@rsbuild/core@2.2.5)(@rspack/core@2.2.8(@swc/helpers@0.5.23)) '@rspress/shared': 2.0.21(supports-color@7.2.0) '@shikijs/rehype': 4.4.3 '@types/mdast': 4.0.4 @@ -4007,9 +4198,9 @@ snapshots: - micromark-util-types - supports-color - '@rspress/plugin-llms@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(supports-color@7.2.0)': + '@rspress/plugin-llms@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) + '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) remark-mdx: 3.1.1(supports-color@7.2.0) remark-parse: 11.0.0(supports-color@7.2.0) remark-stringify: 11.0.0 @@ -4018,14 +4209,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@rspress/plugin-sitemap@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))': + '@rspress/plugin-sitemap@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))': dependencies: - '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) + '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) - '@rspress/plugin-twoslash@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(react@19.3.0)(supports-color@7.2.0)': + '@rspress/plugin-twoslash@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))(react@19.3.0)(supports-color@7.2.0)': dependencies: '@floating-ui/dom': 1.8.0 - '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) + '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) '@shikijs/twoslash': 4.4.3(supports-color@7.2.0) mdast-util-from-markdown: 2.0.3(supports-color@7.2.0) mdast-util-gfm: 3.1.0(supports-color@7.2.0) @@ -4037,9 +4228,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@rspress/plugin-typedoc@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))': + '@rspress/plugin-typedoc@2.0.22(@rspress/core@2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0))': dependencies: - '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.3(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) + '@rspress/core': 2.0.21(patch_hash=555fe9cee718693c8c981e2ae0e282cb514a1808af1744dfab977ed7ca90fa2c)(@rspack/core@2.2.8(@swc/helpers@0.5.23))(micromark-util-types@2.0.2)(micromark@4.0.3(supports-color@7.2.0))(supports-color@7.2.0) typedoc: 0.28.20 typedoc-plugin-markdown: 4.13.0(typedoc@0.28.20) typescript: 6.0.3 @@ -4079,10 +4270,10 @@ snapshots: optionalDependencies: typescript: 7.0.2 - '@rstest/browser@0.11.12(@rstest/core@0.11.12)(playwright@1.63.0)': + '@rstest/browser@0.12.2(@rstest/core@0.12.2)(playwright@1.63.0)': dependencies: '@jridgewell/trace-mapping': 0.3.31 - '@rstest/core': 0.11.12 + '@rstest/core': 0.12.2 convert-source-map: 2.0.0 open-editor: 6.0.0 pathe: 2.0.3 @@ -4102,6 +4293,15 @@ snapshots: - '@module-federation/runtime-tools' - core-js + '@rstest/core@0.12.2': + dependencies: + '@rsbuild/core': 2.2.11 + '@types/chai': 5.2.3 + cjs-module-lexer: 2.2.1 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + '@rstest/playwright@0.11.12(@rstest/core@0.11.12)(playwright@1.63.0)': dependencies: '@rstest/core': 0.11.12 @@ -4449,6 +4649,8 @@ snapshots: cjs-module-lexer@1.4.3: {} + cjs-module-lexer@2.2.1: {} + cli-highlight@2.1.11: dependencies: chalk: 4.1.2 @@ -5817,6 +6019,12 @@ snapshots: react: 19.3.0 react-dom: 19.3.0(react@19.3.0) + react-server-dom-rspack@0.1.0(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0): + dependencies: + '@rspack/core': 2.2.8(@swc/helpers@0.5.23) + react: 19.3.0 + react-dom: 19.3.0(react@19.3.0) + react@19.3.0: {} readdirp@5.1.1: {} @@ -5987,10 +6195,10 @@ snapshots: optionalDependencies: '@rsbuild/core': 2.2.5 - rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.2.5)(react-server-dom-rspack@0.1.0(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)): + rsbuild-plugin-rsc@0.1.1(@rsbuild/core@2.2.5)(react-server-dom-rspack@0.1.0(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0)): dependencies: '@rsbuild/core': 2.2.5 - react-server-dom-rspack: 0.1.0(@rspack/core@2.2.3(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) + react-server-dom-rspack: 0.1.0(@rspack/core@2.2.8(@swc/helpers@0.5.23))(react-dom@19.3.0(react@19.3.0))(react@19.3.0) run-applescript@7.1.0: {} diff --git a/website/docs/en/examples/mcp-app.mdx b/website/docs/en/examples/mcp-app.mdx index 02d744bfd..987ff0f11 100644 --- a/website/docs/en/examples/mcp-app.mdx +++ b/website/docs/en/examples/mcp-app.mdx @@ -12,7 +12,7 @@ to see how the surfaces fit together instead of studying one of them alone. - **Run from the repository root:** `pnpm example:mcp-app` - **Package:** `@agent-bundle-example/mcp-app` - **Public dependencies:** `agent-bundle` (`workspace:*`), `@agent-bundle/runtime`, `react`, - `zod`; `@rstest/browser`, `@rstest/core`, `@rstest/playwright`, and `playwright` for the + `zod`; `@rstest/browser`, `@rstest/core`, and `playwright` for the browser-app test - **Targets:** `portable`, `codex`, `claude`: every target ships the `status` server and its App - **Credentials:** none: the eval and the fixture check read only checked-in data diff --git a/website/docs/en/guide/development/testing.mdx b/website/docs/en/guide/development/testing.mdx index cefbafe8c..c8e1798b1 100644 --- a/website/docs/en/guide/development/testing.mdx +++ b/website/docs/en/guide/development/testing.mdx @@ -12,6 +12,10 @@ generated entries import it the same way. ## The configuration helper +`agent-bundle/rstest` supports `@rstest/core` versions `^0.11.10 || ^0.12.0`. +For browser tests, keep `@rstest/browser` and `@rstest/core` on the same release; +the MCP App example uses 0.12.2 with `playwright` as its browser provider. + `agent-bundle/rstest` compiles the project once, the same route-graph compilation the build performs, with no artifact build, and returns a plain Rstest configuration object carrying the test manifest, the route loaders, React's `react-server` resolution, and the automatic JSX diff --git a/website/docs/zh/examples/mcp-app.mdx b/website/docs/zh/examples/mcp-app.mdx index 2ccb6beb5..7e0593c6a 100644 --- a/website/docs/zh/examples/mcp-app.mdx +++ b/website/docs/zh/examples/mcp-app.mdx @@ -11,7 +11,7 @@ description: 'MCP App 示例:把一条服务就绪度工作流表达为生成 - **在仓库根目录运行:** `pnpm example:mcp-app` - **包名:** `@agent-bundle-example/mcp-app` - **公开依赖:** `agent-bundle`(`workspace:*`)、`@agent-bundle/runtime`、`react`、`zod`;浏览器端 App - 测试还用到 `@rstest/browser`、`@rstest/core`、`@rstest/playwright` 与 `playwright` + 测试还用到 `@rstest/browser`、`@rstest/core` 与 `playwright` - **Target:** `portable`、`codex`、`claude`,每个 target 都带有 `status` 服务器及其 App - **凭据:** 不需要,eval 与夹具检查只读取签入的数据 - **源码:** [`examples/mcp-app`](https://github.com/ScriptedAlchemy/agent-bundle/tree/main/examples/mcp-app) diff --git a/website/docs/zh/guide/development/testing.mdx b/website/docs/zh/guide/development/testing.mdx index bb7f17ece..ee516c458 100644 --- a/website/docs/zh/guide/development/testing.mdx +++ b/website/docs/zh/guide/development/testing.mdx @@ -10,6 +10,10 @@ description: '通过框架 harness 测试 agent-bundle 路由:rstest 配置辅 ## 配置辅助函数 +`agent-bundle/rstest` 支持 `@rstest/core` 版本 `^0.11.10 || ^0.12.0`。 +运行浏览器测试时,请让 `@rstest/browser` 和 `@rstest/core` 使用相同的版本; +MCP App 示例使用 0.12.2,并用 `playwright` 提供浏览器。 + `agent-bundle/rstest` 会编译项目一次,与构建执行的路由图编译完全相同,但不构建产物,并返回一个普通的 Rstest 配置对象,其中携带测试清单、路由加载器、React 的 `react-server` 解析条件以及自动 JSX 运行时: