mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-12 21:53:00 -06:00
refactor: centralize isolated agent test ownership (#115340)
This commit is contained in:
committed by
GitHub
parent
4683c752ed
commit
6de618315a
@@ -1,6 +1,9 @@
|
||||
// Builds CI node/Vitest shard plans from the full suite configuration.
|
||||
import { relative } from "node:path";
|
||||
import { agentsCoreIsolatedTestFiles } from "../../test/vitest/vitest.agents-paths.mjs";
|
||||
import {
|
||||
agentVitestProjectOwners,
|
||||
embeddedAgentVitestProjectOwners,
|
||||
} from "../../test/vitest/vitest.agents-paths.mjs";
|
||||
import { commandsLightTestFiles } from "../../test/vitest/vitest.commands-light-paths.mjs";
|
||||
import { fullSuiteVitestShards } from "../../test/vitest/vitest.test-shards.mjs";
|
||||
import { toolingIsolatedTestFiles } from "../../test/vitest/vitest.tooling-isolated-paths.mjs";
|
||||
@@ -523,7 +526,7 @@ function resolveAgentCoreShardName(file) {
|
||||
}
|
||||
|
||||
function createAgentCoreSplitShards() {
|
||||
const isolatedTests = new Set(agentsCoreIsolatedTestFiles);
|
||||
const isolatedTests = new Set(agentVitestProjectOwners.coreIsolated.include);
|
||||
const groups = new Map();
|
||||
for (const file of listTestFiles("src/agents")) {
|
||||
const name = relative("src/agents", file).replaceAll("\\", "/");
|
||||
@@ -553,7 +556,7 @@ function createAgentCoreSplitShards() {
|
||||
if (shardName === "agentic-agents-core-runner-cli") {
|
||||
return createStripedBatches(includePatterns, AGENTS_CORE_RUNNER_CLI_STRIPES).map(
|
||||
(batch, index) => ({
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
configs: [agentVitestProjectOwners.core.config],
|
||||
includePatterns: batch,
|
||||
requiresDist: false,
|
||||
shardName: `${shardName}-${index + 1}`,
|
||||
@@ -562,7 +565,7 @@ function createAgentCoreSplitShards() {
|
||||
}
|
||||
return [
|
||||
{
|
||||
configs: ["test/vitest/vitest.agents-core.config.ts"],
|
||||
configs: [agentVitestProjectOwners.core.config],
|
||||
includePatterns,
|
||||
requiresDist: false,
|
||||
shardName,
|
||||
@@ -574,8 +577,8 @@ function createAgentCoreSplitShards() {
|
||||
return [
|
||||
...sharedShards,
|
||||
{
|
||||
configs: ["test/vitest/vitest.agents-core-isolated.config.ts"],
|
||||
includePatterns: agentsCoreIsolatedTestFiles,
|
||||
configs: [agentVitestProjectOwners.coreIsolated.config],
|
||||
includePatterns: agentVitestProjectOwners.coreIsolated.include,
|
||||
requiresDist: false,
|
||||
shardName: "agentic-agents-core-isolated",
|
||||
},
|
||||
@@ -1192,23 +1195,18 @@ const SPLIT_NODE_SHARDS = new Map([
|
||||
...createAgentCoreSplitShards(),
|
||||
{
|
||||
shardName: "agentic-agents-embedded",
|
||||
configs: [
|
||||
"test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
],
|
||||
configs: embeddedAgentVitestProjectOwners.map((owner) => owner.config),
|
||||
env: AGENTS_EMBEDDED_AGENT_ENV,
|
||||
requiresDist: false,
|
||||
},
|
||||
{
|
||||
shardName: "agentic-agents-support",
|
||||
configs: ["test/vitest/vitest.agents-support.config.ts"],
|
||||
configs: [agentVitestProjectOwners.support.config],
|
||||
requiresDist: false,
|
||||
},
|
||||
{
|
||||
shardName: "agentic-agents-tools",
|
||||
configs: ["test/vitest/vitest.agents-tools.config.ts"],
|
||||
configs: [agentVitestProjectOwners.tools.config],
|
||||
requiresDist: false,
|
||||
},
|
||||
{
|
||||
|
||||
+7
-16
@@ -5,6 +5,7 @@ import fs from "node:fs";
|
||||
import { createRequire } from "node:module";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { embeddedAgentVitestProjectOwners } from "../test/vitest/vitest.agents-paths.mjs";
|
||||
import { toolingIsolatedTestFiles } from "../test/vitest/vitest.tooling-isolated-paths.mjs";
|
||||
import { isUiTestTarget } from "../test/vitest/vitest.ui-paths.mjs";
|
||||
import { boundaryTestFiles } from "../test/vitest/vitest.unit-paths.mjs";
|
||||
@@ -39,22 +40,6 @@ const GATEWAY_SERVER_VITEST_CONFIG = "test/vitest/vitest.gateway-server.config.t
|
||||
const GATEWAY_VITEST_CONFIG = "test/vitest/vitest.gateway.config.ts";
|
||||
export const VITEST_CONFIG_NO_OUTPUT_TIMEOUT_MS = new Map([
|
||||
["test/vitest/vitest.e2e.config.ts", DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
[
|
||||
"test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS,
|
||||
],
|
||||
[
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS,
|
||||
],
|
||||
[
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS,
|
||||
],
|
||||
[
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS,
|
||||
],
|
||||
[GATEWAY_VITEST_CONFIG, DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
["test/vitest/vitest.ui-e2e.config.ts", DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
["test/vitest/vitest.full-agentic.config.ts", DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
@@ -70,6 +55,12 @@ export const VITEST_CONFIG_NO_OUTPUT_TIMEOUT_MS = new Map([
|
||||
[GATEWAY_CORE_VITEST_CONFIG, DEFAULT_EXTRA_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
[GATEWAY_SERVER_VITEST_CONFIG, DEFAULT_EXTRA_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS],
|
||||
]);
|
||||
for (const owner of embeddedAgentVitestProjectOwners) {
|
||||
VITEST_CONFIG_NO_OUTPUT_TIMEOUT_MS.set(
|
||||
owner.config,
|
||||
DEFAULT_LONG_RUNNING_VITEST_NO_OUTPUT_TIMEOUT_MS,
|
||||
);
|
||||
}
|
||||
export const TOOLING_EXCLUDED_TESTS = new Set([
|
||||
...boundaryTestFiles,
|
||||
"test/scripts/docker-build-helper.test.ts",
|
||||
|
||||
@@ -7,9 +7,8 @@ import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import {
|
||||
agentsCoreIsolatedTestFiles,
|
||||
agentsEmbeddedIncompleteTurnTestFiles,
|
||||
agentsEmbeddedOverflowCompactionTestFiles,
|
||||
agentVitestProjectOwners,
|
||||
embeddedAgentVitestProjectOwners,
|
||||
isAgentsCoreIsolatedTestFile,
|
||||
} from "../test/vitest/vitest.agents-paths.mjs";
|
||||
import { isChannelSurfaceTestFile } from "../test/vitest/vitest.channel-paths.mjs";
|
||||
@@ -90,19 +89,18 @@ import {
|
||||
} from "./run-vitest.mjs";
|
||||
|
||||
const DEFAULT_VITEST_CONFIG = "test/vitest/vitest.unit.config.ts";
|
||||
const AGENTS_EMBEDDED_AGENT_TEST_ROOT = "src/agents/embedded-agent-runner";
|
||||
const AGENTS_CORE_ISOLATED_VITEST_CONFIG = "test/vitest/vitest.agents-core-isolated.config.ts";
|
||||
const AGENTS_CORE_VITEST_CONFIG = "test/vitest/vitest.agents-core.config.ts";
|
||||
const AGENTS_EMBEDDED_AGENT_VITEST_CONFIG = "test/vitest/vitest.agents-embedded-agent.config.ts";
|
||||
const AGENTS_EMBEDDED_AGENT_TEST_ROOT = agentVitestProjectOwners.embedded.root;
|
||||
const AGENTS_CORE_ISOLATED_VITEST_CONFIG = agentVitestProjectOwners.coreIsolated.config;
|
||||
const AGENTS_CORE_VITEST_CONFIG = agentVitestProjectOwners.core.config;
|
||||
const AGENTS_EMBEDDED_AGENT_VITEST_CONFIG = agentVitestProjectOwners.embedded.config;
|
||||
const AGENTS_EMBEDDED_AGENT_INCOMPLETE_TURN_VITEST_CONFIG =
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts";
|
||||
agentVitestProjectOwners.embeddedIncompleteTurn.config;
|
||||
const AGENTS_EMBEDDED_AGENT_OVERFLOW_COMPACTION_VITEST_CONFIG =
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts";
|
||||
const AGENTS_EMBEDDED_AGENT_RUN_VITEST_CONFIG =
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts";
|
||||
const AGENTS_SUPPORT_VITEST_CONFIG = "test/vitest/vitest.agents-support.config.ts";
|
||||
const AGENTS_TOOLS_VITEST_CONFIG = "test/vitest/vitest.agents-tools.config.ts";
|
||||
const AGENTS_VITEST_CONFIG = "test/vitest/vitest.agents.config.ts";
|
||||
agentVitestProjectOwners.embeddedOverflowCompaction.config;
|
||||
const AGENTS_EMBEDDED_AGENT_RUN_VITEST_CONFIG = agentVitestProjectOwners.embeddedRun.config;
|
||||
const AGENTS_SUPPORT_VITEST_CONFIG = agentVitestProjectOwners.support.config;
|
||||
const AGENTS_TOOLS_VITEST_CONFIG = agentVitestProjectOwners.tools.config;
|
||||
const AGENTS_VITEST_CONFIG = agentVitestProjectOwners.all.config;
|
||||
const ACP_VITEST_CONFIG = "test/vitest/vitest.acp.config.ts";
|
||||
const AUTO_REPLY_CORE_VITEST_CONFIG = "test/vitest/vitest.auto-reply-core.config.ts";
|
||||
const AUTO_REPLY_VITEST_CONFIG = "test/vitest/vitest.auto-reply.config.ts";
|
||||
@@ -2802,7 +2800,7 @@ function listUnitFastFullSuiteTestTargets() {
|
||||
}
|
||||
|
||||
function listAgentsCoreFullSuiteTestTargets(cwd) {
|
||||
const isolatedTests = new Set(agentsCoreIsolatedTestFiles);
|
||||
const isolatedTests = new Set(agentVitestProjectOwners.coreIsolated.include);
|
||||
const agentsDir = path.join(cwd, "src/agents");
|
||||
if (!fs.existsSync(agentsDir)) {
|
||||
return [];
|
||||
@@ -4041,7 +4039,7 @@ function classifyTarget(arg, cwd) {
|
||||
return configTargetKind;
|
||||
}
|
||||
if (isAgentsCoreIsolatedTestFile(relative)) {
|
||||
return "agentsCoreIsolated";
|
||||
return agentVitestProjectOwners.coreIsolated.kind;
|
||||
}
|
||||
if (isControlUiE2eTarget(relative)) {
|
||||
return "uiE2e";
|
||||
@@ -4249,33 +4247,41 @@ function classifyTarget(arg, cwd) {
|
||||
if (isPathAtOrUnder(relative, "src/auto-reply")) {
|
||||
return "autoReply";
|
||||
}
|
||||
if (isPathAtOrUnder(relative, "src/agents")) {
|
||||
if (isPathAtOrUnder(relative, agentVitestProjectOwners.all.root)) {
|
||||
// Focused runs must preserve the full suite's isolated harness and hook-timeout contracts.
|
||||
if (relative === "src/agents" || relative === AGENTS_EMBEDDED_AGENT_TEST_ROOT) {
|
||||
return "agent";
|
||||
if (
|
||||
relative === agentVitestProjectOwners.all.root ||
|
||||
relative === AGENTS_EMBEDDED_AGENT_TEST_ROOT
|
||||
) {
|
||||
return agentVitestProjectOwners.all.kind;
|
||||
}
|
||||
if (agentsEmbeddedIncompleteTurnTestFiles.includes(relative)) {
|
||||
return "agentEmbeddedIncompleteTurn";
|
||||
if (agentVitestProjectOwners.embeddedIncompleteTurn.include.includes(relative)) {
|
||||
return agentVitestProjectOwners.embeddedIncompleteTurn.kind;
|
||||
}
|
||||
if (agentsEmbeddedOverflowCompactionTestFiles.includes(relative)) {
|
||||
return "agentEmbeddedOverflowCompaction";
|
||||
if (agentVitestProjectOwners.embeddedOverflowCompaction.include.includes(relative)) {
|
||||
return agentVitestProjectOwners.embeddedOverflowCompaction.kind;
|
||||
}
|
||||
if (isPathAtOrUnder(relative, `${AGENTS_EMBEDDED_AGENT_TEST_ROOT}/run`)) {
|
||||
return "agentEmbeddedRun";
|
||||
if (isPathAtOrUnder(relative, agentVitestProjectOwners.embeddedRun.root)) {
|
||||
return agentVitestProjectOwners.embeddedRun.kind;
|
||||
}
|
||||
if (isPathAtOrUnder(relative, AGENTS_EMBEDDED_AGENT_TEST_ROOT)) {
|
||||
return isGlobTarget(relative) ? "agent" : "agentEmbedded";
|
||||
return isGlobTarget(relative)
|
||||
? agentVitestProjectOwners.all.kind
|
||||
: agentVitestProjectOwners.embedded.kind;
|
||||
}
|
||||
if (isPathAtOrUnder(relative, "src/agents/tools")) {
|
||||
return "agentTools";
|
||||
if (isPathAtOrUnder(relative, agentVitestProjectOwners.tools.root)) {
|
||||
return agentVitestProjectOwners.tools.kind;
|
||||
}
|
||||
if (isGlobTarget(relative)) {
|
||||
const owner = relative.slice("src/agents/".length).split("/", 1)[0];
|
||||
return isGlobTarget(owner) ? "agent" : "agentSupport";
|
||||
const owner = relative.slice(agentVitestProjectOwners.all.root.length + 1).split("/", 1)[0];
|
||||
return isGlobTarget(owner)
|
||||
? agentVitestProjectOwners.all.kind
|
||||
: agentVitestProjectOwners.support.kind;
|
||||
}
|
||||
return isFileLikeTarget(relative) && path.posix.dirname(relative) === "src/agents"
|
||||
? "agentCore"
|
||||
: "agentSupport";
|
||||
return isFileLikeTarget(relative) &&
|
||||
path.posix.dirname(relative) === agentVitestProjectOwners.core.root
|
||||
? agentVitestProjectOwners.core.kind
|
||||
: agentVitestProjectOwners.support.kind;
|
||||
}
|
||||
if (isPathAtOrUnder(relative, "src/plugins")) {
|
||||
return "plugin";
|
||||
@@ -4439,14 +4445,7 @@ export function buildVitestRunPlans(
|
||||
for (const targetArg of activeTargetArgs) {
|
||||
if (!watchMode && toRepoRelativeTarget(targetArg, cwd) === AGENTS_EMBEDDED_AGENT_TEST_ROOT) {
|
||||
// The recursive parent spans four harness owners; keep every isolated project intact.
|
||||
const embeddedTargetsByKind = [
|
||||
["agentEmbedded", [`${AGENTS_EMBEDDED_AGENT_TEST_ROOT}/*.test.ts`]],
|
||||
["agentEmbeddedIncompleteTurn", agentsEmbeddedIncompleteTurnTestFiles],
|
||||
["agentEmbeddedOverflowCompaction", agentsEmbeddedOverflowCompactionTestFiles],
|
||||
["agentEmbeddedRun", [`${AGENTS_EMBEDDED_AGENT_TEST_ROOT}/run`]],
|
||||
];
|
||||
|
||||
for (const [kind, targets] of embeddedTargetsByKind) {
|
||||
for (const { kind, include: targets } of embeddedAgentVitestProjectOwners) {
|
||||
const current = groupedTargets.get(kind) ?? [];
|
||||
for (const target of targets) {
|
||||
if (!current.includes(target)) {
|
||||
|
||||
@@ -12,10 +12,8 @@ import {
|
||||
import { expectNoNodeFsScans } from "../../src/test-utils/fs-scan-assertions.js";
|
||||
import { listGitTrackedFiles, sortRepoPaths, toRepoPath } from "../../src/test-utils/repo-files.js";
|
||||
import {
|
||||
agentsEmbeddedIncompleteTurnTestFiles,
|
||||
agentsEmbeddedOverflowCompactionTestFiles,
|
||||
agentsEmbeddedRunTestPatterns,
|
||||
agentsEmbeddedTestPatterns,
|
||||
agentVitestProjectOwners,
|
||||
embeddedAgentVitestProjectOwners,
|
||||
} from "../vitest/vitest.agents-paths.mjs";
|
||||
import { commandsLightTestFiles } from "../vitest/vitest.commands-light-paths.mjs";
|
||||
import { createPluginsVitestConfig } from "../vitest/vitest.plugins.config.ts";
|
||||
@@ -1111,26 +1109,23 @@ describe("scripts/lib/ci-node-test-plan.mjs", () => {
|
||||
const shard = createNodeTestShards().find(
|
||||
(candidate) => candidate.shardName === "agentic-agents-embedded",
|
||||
);
|
||||
const incompleteTurnFiles = new Set(agentsEmbeddedIncompleteTurnTestFiles);
|
||||
const overflowCompactionFiles = new Set(agentsEmbeddedOverflowCompactionTestFiles);
|
||||
const incompleteTurnFiles = new Set(agentVitestProjectOwners.embeddedIncompleteTurn.include);
|
||||
const overflowCompactionFiles = new Set(
|
||||
agentVitestProjectOwners.embeddedOverflowCompaction.include,
|
||||
);
|
||||
const actual = [
|
||||
...fg
|
||||
.sync(agentsEmbeddedTestPatterns)
|
||||
.sync(agentVitestProjectOwners.embedded.include)
|
||||
.filter((file) => !incompleteTurnFiles.has(file) && !overflowCompactionFiles.has(file)),
|
||||
...agentsEmbeddedIncompleteTurnTestFiles,
|
||||
...agentsEmbeddedOverflowCompactionTestFiles,
|
||||
...fg.sync(agentsEmbeddedRunTestPatterns),
|
||||
...agentVitestProjectOwners.embeddedIncompleteTurn.include,
|
||||
...agentVitestProjectOwners.embeddedOverflowCompaction.include,
|
||||
...fg.sync(agentVitestProjectOwners.embeddedRun.include),
|
||||
].toSorted((left, right) => left.localeCompare(right));
|
||||
const expected = listTestFiles("src/agents/embedded-agent-runner").toSorted((left, right) =>
|
||||
left.localeCompare(right),
|
||||
);
|
||||
|
||||
expect(shard?.configs).toEqual([
|
||||
"test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
]);
|
||||
expect(shard?.configs).toEqual(embeddedAgentVitestProjectOwners.map((owner) => owner.config));
|
||||
expect(actual).toEqual(expected);
|
||||
expect(new Set(actual).size).toBe(actual.length);
|
||||
});
|
||||
|
||||
@@ -33,7 +33,7 @@ import {
|
||||
} from "../../scripts/test-projects.test-support.mjs";
|
||||
import { captureReaddirSyncCallsDuring } from "../../src/test-utils/fs-scan-assertions.js";
|
||||
import { toRepoPath } from "../../src/test-utils/repo-files.js";
|
||||
import { agentsCoreIsolatedTestFiles } from "../vitest/vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "../vitest/vitest.agents-paths.mjs";
|
||||
import {
|
||||
channelConfigContractPatterns,
|
||||
channelRegistryContractPatterns,
|
||||
@@ -2617,7 +2617,7 @@ describe("scripts/test-projects changed-target routing", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it.each(agentsCoreIsolatedTestFiles)(
|
||||
it.each(agentVitestProjectOwners.coreIsolated.include)(
|
||||
"routes isolated agent test %s to the isolated agents-core shard",
|
||||
(testFile) => {
|
||||
expect(buildVitestRunPlans([testFile])).toEqual([
|
||||
|
||||
@@ -7,6 +7,11 @@ import { createAgentsEmbeddedIncompleteTurnVitestConfig } from "./vitest/vitest.
|
||||
import { createAgentsEmbeddedOverflowCompactionVitestConfig } from "./vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts";
|
||||
import { createAgentsEmbeddedRunVitestConfig } from "./vitest/vitest.agents-embedded-agent-run.config.ts";
|
||||
import { createAgentsEmbeddedVitestConfig } from "./vitest/vitest.agents-embedded-agent.config.ts";
|
||||
import {
|
||||
agentVitestProjectConfigs,
|
||||
agentVitestProjectOwners,
|
||||
embeddedAgentVitestProjectOwners,
|
||||
} from "./vitest/vitest.agents-paths.mjs";
|
||||
import { createAgentsSupportVitestConfig } from "./vitest/vitest.agents-support.config.ts";
|
||||
import { createAgentsToolsVitestConfig } from "./vitest/vitest.agents-tools.config.ts";
|
||||
import { createAgentsVitestConfig } from "./vitest/vitest.agents.config.ts";
|
||||
@@ -63,6 +68,28 @@ describe("projects vitest config", () => {
|
||||
expect(requireTestConfig(baseConfig).projects).toEqual([...rootVitestProjects]);
|
||||
});
|
||||
|
||||
it("keeps root and full-suite agent projects aligned with canonical owners", () => {
|
||||
const agenticShard = fullSuiteVitestShards.find((shard) => shard.name === "agentic");
|
||||
const agentConfigs = new Set(agentVitestProjectConfigs);
|
||||
|
||||
expect(rootVitestProjects.filter((config) => agentConfigs.has(config))).toEqual(
|
||||
agentVitestProjectConfigs,
|
||||
);
|
||||
expect(agenticShard?.projects.filter((config) => agentConfigs.has(config))).toEqual(
|
||||
agentVitestProjectConfigs,
|
||||
);
|
||||
expect(agentConfigs.size).toBe(agentVitestProjectConfigs.length);
|
||||
});
|
||||
|
||||
it("keeps all embedded harnesses under their canonical embedded owner", () => {
|
||||
expect(embeddedAgentVitestProjectOwners).toEqual([
|
||||
agentVitestProjectOwners.embedded,
|
||||
agentVitestProjectOwners.embeddedIncompleteTurn,
|
||||
agentVitestProjectOwners.embeddedOverflowCompaction,
|
||||
agentVitestProjectOwners.embeddedRun,
|
||||
]);
|
||||
});
|
||||
|
||||
it("keeps root watch projects aligned with dedicated extension shard lanes", () => {
|
||||
const extensionShard = fullSuiteVitestShards.find(
|
||||
(shard) => shard.config === "test/vitest/vitest.full-extensions.config.ts",
|
||||
|
||||
@@ -9,7 +9,7 @@ import { normalizeConfigPath, normalizeConfigPaths } from "./helpers/vitest-conf
|
||||
import { createAcpVitestConfig } from "./vitest/vitest.acp.config.ts";
|
||||
import { createAgentsCoreIsolatedVitestConfig } from "./vitest/vitest.agents-core-isolated.config.ts";
|
||||
import { createAgentsCoreVitestConfig } from "./vitest/vitest.agents-core.config.ts";
|
||||
import { agentsCoreIsolatedTestFiles } from "./vitest/vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest/vitest.agents-paths.mjs";
|
||||
import { createAgentsVitestConfig } from "./vitest/vitest.agents.config.ts";
|
||||
import { createAutoReplyCoreVitestConfig } from "./vitest/vitest.auto-reply-core.config.ts";
|
||||
import { createAutoReplyReplyVitestConfig } from "./vitest/vitest.auto-reply-reply.config.ts";
|
||||
@@ -663,7 +663,7 @@ describe("scoped vitest configs", () => {
|
||||
const sharedConfig = requireTestConfig(defaultAgentsCoreConfig);
|
||||
const isolatedConfig = requireTestConfig(defaultAgentsCoreIsolatedConfig);
|
||||
|
||||
const scopedIsolatedFiles = agentsCoreIsolatedTestFiles.map((file) =>
|
||||
const scopedIsolatedFiles = agentVitestProjectOwners.coreIsolated.include.map((file) =>
|
||||
file.replace("src/agents/", ""),
|
||||
);
|
||||
expect(sharedConfig.exclude).toEqual(expect.arrayContaining(scopedIsolatedFiles));
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// Vitest agents core isolated config separates suites with conflicting module mocks.
|
||||
import { agentsCoreIsolatedTestFiles } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsCoreIsolatedVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsCoreIsolatedTestFiles, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.coreIsolated;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
isolate: true,
|
||||
name: "agents-core-isolated",
|
||||
name: owner.name,
|
||||
passWithNoTests: true,
|
||||
useNonIsolatedRunner: false,
|
||||
});
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
// Vitest agents core config wires the agents core test shard.
|
||||
import { agentsCoreIsolatedTestFiles, agentsCoreTestPatterns } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsCoreVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsCoreTestPatterns, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.core;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
exclude: agentsCoreIsolatedTestFiles,
|
||||
exclude: owner.exclude,
|
||||
fileParallelism: false,
|
||||
name: "agents-core",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
// Vitest embedded agent incomplete-turn config isolates the expensive harness warmup.
|
||||
import { agentsEmbeddedIncompleteTurnTestFiles } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsEmbeddedIncompleteTurnVitestConfig(
|
||||
env?: Record<string, string | undefined>,
|
||||
) {
|
||||
return createScopedVitestConfig(agentsEmbeddedIncompleteTurnTestFiles, {
|
||||
dir: "src/agents/embedded-agent-runner",
|
||||
const owner = agentVitestProjectOwners.embeddedIncompleteTurn;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
fileParallelism: false,
|
||||
name: "agents-embedded-agent-incomplete-turn",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
// Vitest embedded agent overflow config isolates the expensive harness warmup.
|
||||
import { agentsEmbeddedOverflowCompactionTestFiles } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsEmbeddedOverflowCompactionVitestConfig(
|
||||
env?: Record<string, string | undefined>,
|
||||
) {
|
||||
return createScopedVitestConfig(agentsEmbeddedOverflowCompactionTestFiles, {
|
||||
dir: "src/agents/embedded-agent-runner",
|
||||
const owner = agentVitestProjectOwners.embeddedOverflowCompaction;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
fileParallelism: false,
|
||||
name: "agents-embedded-agent-overflow-compaction",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// Vitest embedded agent run config keeps the run subtree in a bounded serial shard.
|
||||
import { agentsEmbeddedRunTestPatterns } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsEmbeddedRunVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsEmbeddedRunTestPatterns, {
|
||||
dir: "src/agents/embedded-agent-runner/run",
|
||||
const owner = agentVitestProjectOwners.embeddedRun;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
fileParallelism: false,
|
||||
name: "agents-embedded-agent-run",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,23 +1,17 @@
|
||||
// Vitest agents embedded agent config wires the agents embedded agent test shard.
|
||||
import {
|
||||
agentsEmbeddedIncompleteTurnTestFiles,
|
||||
agentsEmbeddedOverflowCompactionTestFiles,
|
||||
agentsEmbeddedTestPatterns,
|
||||
} from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsEmbeddedVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsEmbeddedTestPatterns, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.embedded;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
exclude: [
|
||||
...agentsEmbeddedIncompleteTurnTestFiles,
|
||||
...agentsEmbeddedOverflowCompactionTestFiles,
|
||||
],
|
||||
exclude: owner.exclude,
|
||||
fileParallelism: false,
|
||||
// Cold shared harness imports exceed the generic limit on 2-vCPU hosted release runners.
|
||||
hookTimeout: 600_000,
|
||||
name: "agents-embedded-agent",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,11 +1,25 @@
|
||||
export const agentsAllTestPatterns: string[];
|
||||
export const agentsCoreIsolatedTestFiles: string[];
|
||||
export type AgentVitestProjectOwner = {
|
||||
kind: string;
|
||||
name: string;
|
||||
config: string;
|
||||
root: string;
|
||||
dir: string;
|
||||
include: string[];
|
||||
exclude: string[];
|
||||
};
|
||||
|
||||
export const agentVitestProjectOwners: {
|
||||
all: AgentVitestProjectOwner;
|
||||
coreIsolated: AgentVitestProjectOwner;
|
||||
core: AgentVitestProjectOwner;
|
||||
embedded: AgentVitestProjectOwner;
|
||||
embeddedIncompleteTurn: AgentVitestProjectOwner;
|
||||
embeddedOverflowCompaction: AgentVitestProjectOwner;
|
||||
embeddedRun: AgentVitestProjectOwner;
|
||||
support: AgentVitestProjectOwner;
|
||||
tools: AgentVitestProjectOwner;
|
||||
};
|
||||
|
||||
export const agentVitestProjectConfigs: string[];
|
||||
export const embeddedAgentVitestProjectOwners: AgentVitestProjectOwner[];
|
||||
export function isAgentsCoreIsolatedTestFile(file: string): boolean;
|
||||
export const agentsCoreTestPatterns: string[];
|
||||
export const agentsEmbeddedTestPatterns: string[];
|
||||
export const agentsEmbeddedIncompleteTurnTestFiles: string[];
|
||||
export const agentsEmbeddedOverflowCompactionTestFiles: string[];
|
||||
export const agentsEmbeddedRunTestPatterns: string[];
|
||||
export const agentsToolsTestPatterns: string[];
|
||||
export const agentsSupportTestPatterns: string[];
|
||||
export const agentsSupportExcludePatterns: string[];
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
// Test routing globs for agent core, embedded-agent, tool, and support suites.
|
||||
export const agentsAllTestPatterns = ["src/agents/**/*.test.ts"];
|
||||
// Canonical agent project ownership for focused runs, full suites, and CI.
|
||||
const agentsRoot = "src/agents";
|
||||
const embeddedRoot = `${agentsRoot}/embedded-agent-runner`;
|
||||
|
||||
// These suites install mocks for shared runtime, network, or plugin modules.
|
||||
// Keep their module graphs separate from the shared agents-core worker.
|
||||
export const agentsCoreIsolatedTestFiles = [
|
||||
// These suites mock shared runtime, network, or plugin modules and cannot
|
||||
// share the non-isolated core worker without leaking module state.
|
||||
const coreIsolatedFiles = [
|
||||
"src/agents/image-generation-task-status.test.ts",
|
||||
"src/agents/media-generation-task-status-shared.test.ts",
|
||||
"src/agents/mcp-http-fetch.test.ts",
|
||||
@@ -16,32 +17,113 @@ export const agentsCoreIsolatedTestFiles = [
|
||||
"src/agents/subagent-orphan-recovery.test.ts",
|
||||
"src/agents/video-generation-task-status.test.ts",
|
||||
];
|
||||
const incompleteTurnFiles = [`${embeddedRoot}/run.incomplete-turn.test.ts`];
|
||||
const overflowCompactionFiles = [`${embeddedRoot}/run.overflow-compaction.test.ts`];
|
||||
|
||||
const agentsCoreIsolatedTestFileSet = new Set(agentsCoreIsolatedTestFiles);
|
||||
export const agentVitestProjectOwners = {
|
||||
all: {
|
||||
kind: "agent",
|
||||
name: "agents",
|
||||
config: "test/vitest/vitest.agents.config.ts",
|
||||
root: agentsRoot,
|
||||
dir: agentsRoot,
|
||||
include: [`${agentsRoot}/**/*.test.ts`],
|
||||
exclude: [],
|
||||
},
|
||||
coreIsolated: {
|
||||
kind: "agentsCoreIsolated",
|
||||
name: "agents-core-isolated",
|
||||
config: "test/vitest/vitest.agents-core-isolated.config.ts",
|
||||
root: agentsRoot,
|
||||
dir: agentsRoot,
|
||||
include: coreIsolatedFiles,
|
||||
exclude: [],
|
||||
},
|
||||
core: {
|
||||
kind: "agentCore",
|
||||
name: "agents-core",
|
||||
config: "test/vitest/vitest.agents-core.config.ts",
|
||||
root: agentsRoot,
|
||||
dir: agentsRoot,
|
||||
include: [`${agentsRoot}/*.test.ts`],
|
||||
exclude: coreIsolatedFiles,
|
||||
},
|
||||
embedded: {
|
||||
kind: "agentEmbedded",
|
||||
name: "agents-embedded-agent",
|
||||
config: "test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
root: embeddedRoot,
|
||||
dir: agentsRoot,
|
||||
include: [`${embeddedRoot}/*.test.ts`],
|
||||
exclude: [...incompleteTurnFiles, ...overflowCompactionFiles],
|
||||
},
|
||||
embeddedIncompleteTurn: {
|
||||
kind: "agentEmbeddedIncompleteTurn",
|
||||
name: "agents-embedded-agent-incomplete-turn",
|
||||
config: "test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
root: embeddedRoot,
|
||||
dir: embeddedRoot,
|
||||
include: incompleteTurnFiles,
|
||||
exclude: [],
|
||||
},
|
||||
embeddedOverflowCompaction: {
|
||||
kind: "agentEmbeddedOverflowCompaction",
|
||||
name: "agents-embedded-agent-overflow-compaction",
|
||||
config: "test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
root: embeddedRoot,
|
||||
dir: embeddedRoot,
|
||||
include: overflowCompactionFiles,
|
||||
exclude: [],
|
||||
},
|
||||
embeddedRun: {
|
||||
kind: "agentEmbeddedRun",
|
||||
name: "agents-embedded-agent-run",
|
||||
config: "test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
root: `${embeddedRoot}/run`,
|
||||
dir: `${embeddedRoot}/run`,
|
||||
include: [`${embeddedRoot}/run/**/*.test.ts`],
|
||||
exclude: [],
|
||||
},
|
||||
support: {
|
||||
kind: "agentSupport",
|
||||
name: "agents-support",
|
||||
config: "test/vitest/vitest.agents-support.config.ts",
|
||||
root: agentsRoot,
|
||||
dir: agentsRoot,
|
||||
include: [`${agentsRoot}/*/**/*.test.ts`],
|
||||
exclude: [`${embeddedRoot}/**`, `${agentsRoot}/tools/**`],
|
||||
},
|
||||
tools: {
|
||||
kind: "agentTools",
|
||||
name: "agents-tools",
|
||||
config: "test/vitest/vitest.agents-tools.config.ts",
|
||||
root: `${agentsRoot}/tools`,
|
||||
dir: agentsRoot,
|
||||
include: [`${agentsRoot}/tools/**/*.test.ts`],
|
||||
exclude: [],
|
||||
},
|
||||
};
|
||||
|
||||
export const agentVitestProjectConfigs = [
|
||||
agentVitestProjectOwners.coreIsolated.config,
|
||||
agentVitestProjectOwners.core.config,
|
||||
agentVitestProjectOwners.embedded.config,
|
||||
agentVitestProjectOwners.embeddedIncompleteTurn.config,
|
||||
agentVitestProjectOwners.embeddedOverflowCompaction.config,
|
||||
agentVitestProjectOwners.embeddedRun.config,
|
||||
agentVitestProjectOwners.support.config,
|
||||
agentVitestProjectOwners.tools.config,
|
||||
];
|
||||
|
||||
export const embeddedAgentVitestProjectOwners = [
|
||||
agentVitestProjectOwners.embedded,
|
||||
agentVitestProjectOwners.embeddedIncompleteTurn,
|
||||
agentVitestProjectOwners.embeddedOverflowCompaction,
|
||||
agentVitestProjectOwners.embeddedRun,
|
||||
];
|
||||
|
||||
const coreIsolatedFileSet = new Set(coreIsolatedFiles);
|
||||
|
||||
export function isAgentsCoreIsolatedTestFile(value) {
|
||||
return agentsCoreIsolatedTestFileSet.has(value.replaceAll("\\", "/"));
|
||||
return coreIsolatedFileSet.has(value.replaceAll("\\", "/"));
|
||||
}
|
||||
|
||||
export const agentsCoreTestPatterns = ["src/agents/*.test.ts"];
|
||||
|
||||
export const agentsEmbeddedTestPatterns = ["src/agents/embedded-agent-runner/*.test.ts"];
|
||||
|
||||
export const agentsEmbeddedIncompleteTurnTestFiles = [
|
||||
"src/agents/embedded-agent-runner/run.incomplete-turn.test.ts",
|
||||
];
|
||||
|
||||
export const agentsEmbeddedOverflowCompactionTestFiles = [
|
||||
"src/agents/embedded-agent-runner/run.overflow-compaction.test.ts",
|
||||
];
|
||||
|
||||
export const agentsEmbeddedRunTestPatterns = ["src/agents/embedded-agent-runner/run/**/*.test.ts"];
|
||||
|
||||
export const agentsToolsTestPatterns = ["src/agents/tools/**/*.test.ts"];
|
||||
|
||||
export const agentsSupportTestPatterns = ["src/agents/*/**/*.test.ts"];
|
||||
|
||||
export const agentsSupportExcludePatterns = [
|
||||
"src/agents/embedded-agent-runner/**",
|
||||
"src/agents/tools/**",
|
||||
];
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// Vitest agents support config wires the agents support test shard.
|
||||
import { agentsSupportExcludePatterns, agentsSupportTestPatterns } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsSupportVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsSupportTestPatterns, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.support;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
exclude: agentsSupportExcludePatterns,
|
||||
name: "agents-support",
|
||||
exclude: owner.exclude,
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
// Vitest agents tools config wires the agents tools test shard.
|
||||
import { agentsToolsTestPatterns } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsToolsVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsToolsTestPatterns, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.tools;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
fileParallelism: false,
|
||||
name: "agents-tools",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
// Vitest agents config wires the agents test shard.
|
||||
import { agentsAllTestPatterns } from "./vitest.agents-paths.mjs";
|
||||
import { agentVitestProjectOwners } from "./vitest.agents-paths.mjs";
|
||||
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
|
||||
|
||||
export function createAgentsVitestConfig(env?: Record<string, string | undefined>) {
|
||||
return createScopedVitestConfig(agentsAllTestPatterns, {
|
||||
dir: "src/agents",
|
||||
const owner = agentVitestProjectOwners.all;
|
||||
return createScopedVitestConfig(owner.include, {
|
||||
dir: owner.dir,
|
||||
env,
|
||||
name: "agents",
|
||||
name: owner.name,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
// Vitest config config wires the config test shard.
|
||||
import { defineConfig } from "vitest/config";
|
||||
import { agentVitestProjectConfigs } from "./vitest.agents-paths.mjs";
|
||||
import {
|
||||
resolveDefaultVitestPool,
|
||||
resolveLocalVitestMaxWorkers,
|
||||
@@ -33,14 +34,7 @@ export const rootVitestProjects = [
|
||||
"test/vitest/vitest.commands-light.config.ts",
|
||||
"test/vitest/vitest.commands.config.ts",
|
||||
"test/vitest/vitest.auto-reply.config.ts",
|
||||
"test/vitest/vitest.agents-core-isolated.config.ts",
|
||||
"test/vitest/vitest.agents-core.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
"test/vitest/vitest.agents-support.config.ts",
|
||||
"test/vitest/vitest.agents-tools.config.ts",
|
||||
...agentVitestProjectConfigs,
|
||||
"test/vitest/vitest.daemon.config.ts",
|
||||
"test/vitest/vitest.media.config.ts",
|
||||
"test/vitest/vitest.unit-fast.config.ts",
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
// Full-suite Vitest shard definitions used by test-projects and CI planning.
|
||||
import { agentVitestProjectConfigs } from "./vitest.agents-paths.mjs";
|
||||
|
||||
export const autoReplyCoreTestInclude = [
|
||||
"src/auto-reply/*.test.ts",
|
||||
"src/auto-reply/usage-bar/*.test.ts",
|
||||
@@ -101,14 +103,7 @@ export const fullSuiteVitestShards = [
|
||||
"test/vitest/vitest.cli.config.ts",
|
||||
"test/vitest/vitest.commands-light.config.ts",
|
||||
"test/vitest/vitest.commands.config.ts",
|
||||
"test/vitest/vitest.agents-core-isolated.config.ts",
|
||||
"test/vitest/vitest.agents-core.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-incomplete-turn.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-overflow-compaction.config.ts",
|
||||
"test/vitest/vitest.agents-embedded-agent-run.config.ts",
|
||||
"test/vitest/vitest.agents-support.config.ts",
|
||||
"test/vitest/vitest.agents-tools.config.ts",
|
||||
...agentVitestProjectConfigs,
|
||||
"test/vitest/vitest.daemon.config.ts",
|
||||
"test/vitest/vitest.plugin-sdk-light.config.ts",
|
||||
"test/vitest/vitest.plugin-sdk.config.ts",
|
||||
|
||||
Reference in New Issue
Block a user