Skip to content

Adds MCP E2E test infrastructure#5111

Merged
nikolay-1986 merged 9 commits intomainfrom
testing/mcp-e2e-infrastructure
Apr 7, 2026
Merged

Adds MCP E2E test infrastructure#5111
nikolay-1986 merged 9 commits intomainfrom
testing/mcp-e2e-infrastructure

Conversation

@nikolay-1986
Copy link
Copy Markdown
Collaborator

@nikolay-1986 nikolay-1986 commented Apr 6, 2026

Summary

  • Introduces McpClient — minimal stdio JSON-RPC 2.0 client that spawns gk mcp as a fresh process per call, handles initialize / tools/list / tools/call, and auto-cancels elicitation/create requests
  • Adds findGkCliFromArgs — derives gk proxy path from --user-data-dir electron launch arg (cross-platform: gk.exe on Windows, gk on macOS/Linux)
  • Adds findLatestIpcFile — locates the live IPC discovery file via os.tmpdir(), filters dead processes via process.kill(pid, 0)
  • Adds waitForCliInstall — polls for gk binary appearance (~5–6 s on first run, 30 s timeout)
  • Adds mcpTest Playwright fixture — wires all helpers into a ready-to-use McpClient scoped to the worker VS Code instance; warns if IPC file is not found
  • Exports McpConfigResult type for use in test files
  • stderr is captured in all gk subprocess calls and included in timeout/error messages for easier debugging

Test plan

  • pnpm run lint — no errors
  • pnpm exec tsc --noEmit — no errors
  • Smoke E2E tests (mcp.smoke.test.ts) will use this fixture in the follow-up PR

🤖 Generated with Claude Code

nikolay-1986 and others added 3 commits April 6, 2026 13:07
Introduces McpClient and supporting helpers for testing the GitKraken
MCP server over stdio JSON-RPC 2.0:
  - McpClient: spawns gk CLI, handles initialize/tools/list/tools/call,
    auto-cancels elicitation/create requests
  - findGkCliFromArgs: derives gk path from --user-data-dir launch arg
    (correct for E2E temp directories)
  - findLatestIpcFile: locates the live IPC discovery file by checking
    process liveness via process.kill(pid, 0)
  - waitForCliInstall: polls for gk binary appearance (~5-6s on first run)
  - mcpTest Playwright fixture: wires all helpers into a ready-to-use
    McpClient scoped to the worker VS Code instance

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  - Corrects import order (baseTest before mcpHelper)
  - Adds console.warn when no live IPC file is found so missing
    GK_GL_PATH is surfaced early rather than silently ignored

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
  - Exports McpConfigResult type for use in test files
  - Removes any casts: listTools uses typed result shape,
    elicitation handler uses msg.id directly
  - Adds import for node:process to satisfy no-restricted-globals rule
  - Captures stderr in sendRequests and getMcpConfig and includes it
    in error/timeout messages for easier debugging
  - Adds braces to single-line if statements per no-restricted-syntax rule
  - Fixes import order (node:child_process before node:fs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@augmentcode
Copy link
Copy Markdown

augmentcode bot commented Apr 6, 2026

🤖 Augment PR Summary

Summary: Adds initial MCP end-to-end testing infrastructure for GitLens.

Changes:

  • Introduces a Playwright fixture (mcpTest) that provides a ready-to-use McpClient per worker VS Code instance
  • Adds McpClient, a minimal stdio JSON-RPC 2.0 client that spawns gk mcp per call and supports initialize, tools/list, and tools/call
  • Derives the installed gk proxy path from VS Code’s --user-data-dir used by E2E runs
  • Polls for CLI installation completion (waitForCliInstall) to handle first-run auto-install timing
  • Finds the newest live IPC discovery file in the temp directory and sets GK_GL_PATH when available
  • Auto-cancels elicitation/create requests to avoid hanging interactive prompts during tests
  • Captures subprocess stderr for improved diagnostics on timeouts and parse failures

Technical Notes: IPC discovery files are located under os.tmpdir()/gitkraken/gitlens and are filtered by checking the recorded PID is still alive.

🤖 Was this summary useful? React with 👍 or 👎

Copy link
Copy Markdown

@augmentcode augmentcode bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review completed. 3 suggestions posted.

Fix All in Augment

Comment augment review to trigger a new review at any time.

],
2,
);
return ((msg?.result as { tools?: { name: string }[] })?.tools ?? []).map(t => t.name);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tests/e2e/helpers/mcpHelper.ts:106 — listTools() will return an empty array if the server responds with a JSON-RPC error (since result is undefined), which can mask real MCP failures and make test output misleading.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f3722c7listTools() now checks msg.error and throws with the JSON-RPC error code and message instead of silently returning [].

let stderr = '';
proc.stdout.on('data', (chunk: Buffer) => (stdout += chunk.toString()));
proc.stderr.on('data', (chunk: Buffer) => (stderr += chunk.toString()));
proc.on('close', () => {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tests/e2e/helpers/mcpHelper.ts:145 — getMcpConfig() ignores the process exit code/signal on close, so a failing gk mcp config could still be treated as success if it prints JSON before exiting non-zero.

Severity: medium

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f3722c7getMcpConfig() now checks exit code on close and rejects with stderr when non-zero, before attempting JSON parse.

if (!resolved) {
resolved = true;
clearTimeout(timer);
resolve(undefined);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tests/e2e/helpers/mcpHelper.ts:249 — If stdout closes before the targetId response arrives, sendRequests() resolves undefined without surfacing stderr, which loses useful CLI error details compared to the timeout path.

Severity: low

Fix This in Augment

🤖 Was this useful? React with 👍 or 👎, or 🚀 if it prevented an incident/outage.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f3722c7sendRequests() now rejects with stderr on early process close instead of resolving undefined, consistent with the timeout path.

Addresses review feedback:
- listTools() now throws on JSON-RPC error responses instead of
  silently returning an empty array
- getMcpConfig() checks process exit code and rejects on non-zero
- sendRequests() rejects with stderr when process exits before
  the expected response arrives, instead of resolving undefined

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds E2E test infrastructure for exercising the GitLens MCP server via the gk CLI, providing helpers to locate the CLI/IPC discovery file and a Playwright fixture that exposes a ready-to-use McpClient to tests.

Changes:

  • Introduces McpClient (stdio JSON-RPC) plus helper utilities for locating gk and the IPC discovery file.
  • Adds mcpTest Playwright fixture that creates/configures an McpClient for the current VS Code worker.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

File Description
tests/e2e/helpers/mcpHelper.ts New MCP client + helpers (findGkCliFromArgs, findLatestIpcFile, waitForCliInstall) used by E2E tests.
tests/e2e/fixtures/mcp.ts New Playwright fixture (mcpTest) that wires helpers into a per-test mcpClient.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +43 to +69
export function findLatestIpcFile(): string | undefined {
const tmpDir = path.join(os.tmpdir(), 'gitkraken', 'gitlens');
if (!existsSync(tmpDir)) return undefined;

const candidates = readdirSync(tmpDir)
.filter(f => f.startsWith('gitlens-ipc-server-') && f.endsWith('.json'))
.map(f => {
const fullPath = path.join(tmpDir, f);
try {
return { fullPath: fullPath, mtime: statSync(fullPath).mtime };
} catch {
return null;
}
})
.filter((x): x is { fullPath: string; mtime: Date } => x != null)
.sort((a, b) => b.mtime.getTime() - a.mtime.getTime());

for (const { fullPath } of candidates) {
try {
const data = JSON.parse(readFileSync(fullPath, 'utf8')) as { pid: number };
process.kill(data.pid, 0); // throws if process is dead
return fullPath;
} catch {
// dead process or unreadable file — skip
}
}
return undefined;
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findLatestIpcFile() selects the newest live discovery file in the shared temp directory, which can pick up a different Playwright worker's VS Code session when tests run with fullyParallel and multiple workers. This can make GK_GL_PATH point at the wrong IPC server and cause cross-test flakiness. Consider accepting an expected pid (e.g. vscode.electron.app.process().pid / parsing the pid from the filename) and filtering candidates to that pid before choosing the latest file.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in ec99b5ffindLatestIpcFile() now accepts an optional vscodePid parameter and filters candidates by the pid in the filename (gitlens-ipc-server-{pid}-{port}.json). The fixture passes vscode.electron.app.process().pid to scope the lookup.

Comment on lines +148 to +168
proc.on('close', (code: number | null) => {
// Strip "checking for updates..." noise before parsing
const clean = stdout.replace(/checking for updates\.\.\./gi, '').trim();
if (code != null && code !== 0) {
reject(
new Error(
`gk mcp config exited with code ${code}: ${clean.slice(0, 200)}${stderr ? `\nstderr: ${stderr}` : ''}`,
),
);
return;
}
try {
resolve(JSON.parse(clean) as McpConfigResult);
} catch {
reject(
new Error(
`gk mcp config returned non-JSON: ${clean.slice(0, 200)}${stderr ? `\nstderr: ${stderr}` : ''}`,
),
);
}
});
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The close handler only receives code and treats code == null as success, which can misreport process termination-by-signal as a JSON parse failure (or even a success if stdout happens to be parseable). Consider capturing the signal argument from the close event and rejecting when code == null (or signal != null), including stderr/signal in the error message.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Acknowledged — in practice, signal-based termination only happens via our own timeout handler (which already rejects with a clear message). If the process is killed externally, code=null means stdout is typically empty and the JSON parse error is descriptive enough. Keeping this as-is to avoid over-engineering the test helper, but noted for future reference.

Comment on lines +31 to +37
const gkPath = findGkCliFromArgs(vscode.electron.args);
await waitForCliInstall(gkPath);
const ipcFilePath = findLatestIpcFile();
if (ipcFilePath == null) {
console.warn('[mcpTest] No live IPC file found — GK_GL_PATH will not be set');
}
const client = new McpClient(gkPath, ipcFilePath);
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since Playwright runs E2E with multiple workers, calling findLatestIpcFile() without scoping can select another worker’s discovery file. Consider passing the current worker’s VS Code pid (e.g. vscode.electron.app.process().pid) into the helper so GK_GL_PATH is derived from the correct session.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in ec99b5f — the fixture now passes vscode.electron.app.process().pid to findLatestIpcFile(), scoping the IPC discovery to the current worker's VS Code instance.

findLatestIpcFile() now accepts an optional vscodePid parameter
and filters discovery files by the pid embedded in the filename
(gitlens-ipc-server-{pid}-{port}.json). This prevents parallel
Playwright workers from picking up each other's IPC files.

The mcp fixture passes vscode.electron.app.process().pid to
scope the lookup to the current worker's VS Code instance.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +287 to +290
const payload = `${messages.map(m => JSON.stringify(m)).join('\n')}\n`;
proc.stdin.write(payload);
proc.stdin.end();
});
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sendRequests() ends stdin immediately after writing the initial payload, but the elicitation/create handler later attempts to write a cancel response to proc.stdin. This will trigger ERR_STREAM_WRITE_AFTER_END (or silently fail), which can make tests flaky/hang because elicitation requests won't be cancelled. Keep stdin open until the target response is received / the process exits (e.g., don’t call stdin.end() up-front; instead end/kill as part of the resolve/timeout/close paths).

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 729cf09stdin.end() moved from the initial payload write to the resolve/timeout/close paths. stdin now stays open so elicitation cancel responses can be written back to the server.

Moves proc.stdin.end() from the initial payload write to the
resolve/timeout/close paths. Previously stdin was closed immediately
after sending requests, which would cause ERR_STREAM_WRITE_AFTER_END
if the server sent an elicitation/create request requiring a cancel
response, potentially hanging tests until timeout.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +74 to +77
process.kill(data.pid, 0); // throws if process is dead
return fullPath;
} catch {
// dead process or unreadable file — skip
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

findLatestIpcFile() uses process.kill(pid, 0) to validate the PID is alive, but it treats any thrown error as “dead process”. On some platforms/environments kill(pid, 0) can throw EPERM even when the process exists (insufficient permission), which would incorrectly skip a valid discovery file and leave GK_GL_PATH unset. Consider handling EPERM as “process exists” (only treat ESRCH as dead) so the lookup is robust.

Suggested change
process.kill(data.pid, 0); // throws if process is dead
return fullPath;
} catch {
// dead process or unreadable file — skip
try {
process.kill(data.pid, 0); // throws if process is dead or inaccessible
return fullPath;
} catch (error) {
const code = (error as { code?: string }).code;
if (code === 'EPERM') {
// Process exists but cannot be signaled by this process.
return fullPath;
}
if (code === 'ESRCH') {
// Process is gone — skip this discovery file.
continue;
}
throw error;
}
} catch {
// unreadable or invalid file — skip

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 888ab96 — now handles EPERM as "process exists" and only treats ESRCH as dead. Prevents incorrectly skipping valid discovery files on platforms where kill(pid, 0) throws EPERM for accessible-but-not-signalable processes.

Comment on lines +149 to +153
return new Promise((resolve, reject) => {
const proc = spawn(this.gkPath, args, {
env: this.buildEnv(),
stdio: ['pipe', 'pipe', 'pipe'],
});
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getMcpConfig() spawns gk mcp config ... without any timeout/kill path. If the CLI hangs (e.g., waiting on network/update checks), the E2E run can stall indefinitely. Consider adding a timeout (similar to sendRequests) that terminates the subprocess and rejects with a message that includes captured stderr/stdout.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 888ab96getMcpConfig() now has a 30s timeout (configurable via parameter) that kills the subprocess and rejects with stderr if the CLI hangs.

Comment on lines +269 to +279
rl.on('close', () => {
if (!resolved) {
resolved = true;
clearTimeout(timer);
reject(
new Error(
`McpClient: process exited before response id=${targetId} was received${stderr ? `\nstderr: ${stderr}` : ''}`,
),
);
}
});
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In sendRequests(), failures are detected via the readline interface's close event, but the error message can’t include the child process exit code/signal because proc.on('close', (code, signal) => ...) isn’t tracked. Capturing code/signal (and ideally rejecting based on the process close event) would make debugging flaky CLI failures much easier.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 888ab96sendRequests() now captures code and signal from the process close event and includes them in the early-close error message (e.g. process exited (code=1) or process exited (signal=SIGTERM)).

- findLatestIpcFile: handles EPERM from kill(pid,0) as "process exists"
  instead of incorrectly skipping valid discovery files
- getMcpConfig: adds 30s timeout with proc.kill() to prevent indefinite
  hangs if CLI stalls on network/update checks
- sendRequests: captures process exit code/signal and includes them in
  the early-close error message for easier debugging

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment on lines +289 to +295
// Auto-cancel any elicitation requests so tests don't hang
if (msg.method === 'elicitation/create') {
proc.stdin.write(
`${JSON.stringify({ jsonrpc: '2.0', id: msg.id, result: { action: 'cancel' } })}\n`,
);
return;
}
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In sendRequests(), the line handler will still process messages after resolved is set and after proc.stdin.end() has been called (resolve/timeout paths). If an elicitation/create arrives during this window, proc.stdin.write(...) can throw ERR_STREAM_WRITE_AFTER_END and crash/flakify the test run. Add a if (resolved) return; guard (or at least guard the elicitation branch) and/or close the readline interface / remove listeners before ending stdin.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 9df709f — added if (settled) return guard at the top of the line handler, and rl.close() is now called before stdin.end() on the resolve path. Elicitation writes can no longer reach a closed stdin.

settled = true;
clearTimeout(timer);
// Strip "checking for updates..." noise before parsing
const clean = stdout.replace(/checking for updates\.\.\./gi, '').trim();
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getMcpConfig() strips update-check noise using /checking for updates\.\.\./gi, which is stricter than the production logic (e.g. src/env/node/gk/mcp/integrationBase.ts uses /checking for updates.../i). If the CLI output changes slightly (ellipsis char, extra punctuation/whitespace), this helper may fail to strip it and JSON parsing will break. Consider reusing/mirroring the same more-permissive pattern as the extension code so E2E behavior matches production.

Suggested change
const clean = stdout.replace(/checking for updates\.\.\./gi, '').trim();
const clean = stdout.replace(/checking for updates(?:\s*(?:|\.{3,}))?/gi, '').trim();

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 9df709f — regex changed from /checking for updates\.\.\.\./gi to /checking for updates.../gi to match the permissive pattern used in production (integrationBase.ts).

Comment on lines +4 to +6
export { expect } from '@playwright/test';
export type { McpMessage, McpClient } from '../helpers/mcpHelper.js';

Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description mentions exporting McpConfigResult for use in tests, but this fixture only re-exports McpMessage/McpClient types. If the intent is for tests to import everything MCP-related from ../fixtures/mcp.js, also export McpConfigResult here (or update the description/usage docs to point at helpers/mcpHelper).

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 9df709fMcpConfigResult is now re-exported from the fixture alongside McpMessage and McpClient.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 9df709f — McpConfigResult is now re-exported from the fixture alongside McpMessage and McpClient.

- Removes dead code fallback in callTool() — sendRequests now always
  resolves or rejects, never returns undefined
- Replaces competing rl.on('close') + proc.on('close') with a single
  proc.on('close') handler that has access to exit code/signal directly
- Adds 'if (settled) return' guard in line handler to prevent
  ERR_STREAM_WRITE_AFTER_END on elicitation after resolve/timeout
- Closes readline interface before ending stdin on resolve path
- Aligns "checking for updates" regex with production code (permissive
  dot matching instead of escaped literal dots)
- Exports McpConfigResult type from mcp fixture for test convenience
- Renames 'resolved' flag to 'settled' for consistency with getMcpConfig

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import process from 'node:process';
Copy link

Copilot AI Apr 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the E2E test code, other files consistently import process as a namespace (e.g. import * as process from 'node:process';). Here import process from 'node:process' is inconsistent and can behave differently depending on module interop settings. Please switch to the namespace import for consistency with the rest of tests/e2e (e.g. tests/e2e/baseTest.ts, tests/e2e/playwright.config.ts).

Suggested change
import process from 'node:process';
import * as process from 'node:process';

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 6961a9c — switched to import * as process from 'node:process' for consistency with the rest of tests/e2e.

Aligns with the rest of tests/e2e (baseTest.ts, playwright.config.ts)
which use `import * as process from 'node:process'`.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@nikolay-1986 nikolay-1986 merged commit 8ab3240 into main Apr 7, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants