diff --git a/vitest.config.ts b/vitest.config.ts index 88c06dd8d8..bd474d7b72 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,12 +1,33 @@ import { defineConfig } from 'vitest/config'; +import os from 'node:os'; + +function resolveMaxWorkers(): number | undefined { + // Allow callers (CI/agents) to override without editing config. + const raw = process.env.VITEST_MAX_WORKERS; + if (raw) { + const parsed = Number(raw); + if (Number.isFinite(parsed) && parsed > 0) { + return parsed; + } + } + + // Vitest v3 defaults to `pool: "forks"` and scales worker processes with CPU. + // This repo's tests can spawn many Node processes (CLI invocations, temp FS), + // so cap parallelism to avoid runaway CPU/memory usage in automation. + const cpuCount = typeof os.availableParallelism === 'function' + ? os.availableParallelism() + : os.cpus().length; + return Math.min(4, Math.max(1, cpuCount)); +} export default defineConfig({ test: { globals: true, environment: 'node', globalSetup: './vitest.setup.ts', - // Keep default pool settings; some tests rely on process.chdir, - // which is not supported in worker threads + // Tests rely on per-file process isolation (e.g., `process.cwd()` assumptions). + pool: 'forks', + maxWorkers: resolveMaxWorkers(), include: ['test/**/*.test.ts'], coverage: { reporter: ['text', 'json', 'html'],