test: split heavy extension test shards

This commit is contained in:
Peter Steinberger
2026-04-20 16:49:24 +01:00
parent 68b7666d7c
commit 0603ceba23
26 changed files with 503 additions and 104 deletions

View File

@@ -33,12 +33,12 @@ function findExtensionWithoutTests() {
}
describe("scripts/test-extension.mjs", () => {
it("resolves channel-root extensions onto the channel vitest config", () => {
it("resolves split channel extensions onto their own vitest configs", () => {
const plan = resolveExtensionTestPlan({ targetArg: "slack", cwd: process.cwd() });
expect(plan.extensionId).toBe("slack");
expect(plan.extensionDir).toBe(bundledPluginRoot("slack"));
expect(plan.config).toBe("test/vitest/vitest.extension-channels.config.ts");
expect(plan.config).toBe("test/vitest/vitest.extension-slack.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("slack"));
expect(plan.hasTests).toBe(true);
});
@@ -79,11 +79,11 @@ describe("scripts/test-extension.mjs", () => {
expect(plan.hasTests).toBe(true);
});
it("resolves provider extensions onto the provider vitest config", () => {
it("resolves OpenAI onto its own provider vitest config", () => {
const plan = resolveExtensionTestPlan({ targetArg: "openai", cwd: process.cwd() });
expect(plan.extensionId).toBe("openai");
expect(plan.config).toBe("test/vitest/vitest.extension-providers.config.ts");
expect(plan.config).toBe("test/vitest/vitest.extension-provider-openai.config.ts");
expect(plan.roots).toContain(bundledPluginRoot("openai"));
expect(plan.hasTests).toBe(true);
});
@@ -183,7 +183,7 @@ describe("scripts/test-extension.mjs", () => {
expect(plan.roots).toContain(bundledPluginRoot("line"));
expect(plan.roots).not.toContain("src/line");
expect(plan.config).toBe("test/vitest/vitest.extension-channels.config.ts");
expect(plan.config).toBe("test/vitest/vitest.extension-line.config.ts");
expect(plan.hasTests).toBe(true);
});
@@ -294,13 +294,6 @@ describe("scripts/test-extension.mjs", () => {
roots: [bundledPluginRoot("bluebubbles")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-channels.config.ts",
estimatedCost: expect.any(Number),
extensionIds: ["line", "slack"],
roots: [bundledPluginRoot("slack"), bundledPluginRoot("line")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-diffs.config.ts",
estimatedCost: expect.any(Number),
@@ -322,6 +315,13 @@ describe("scripts/test-extension.mjs", () => {
roots: [bundledPluginRoot("irc")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-line.config.ts",
estimatedCost: expect.any(Number),
extensionIds: ["line"],
roots: [bundledPluginRoot("line")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-matrix.config.ts",
estimatedCost: expect.any(Number),
@@ -351,12 +351,19 @@ describe("scripts/test-extension.mjs", () => {
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-providers.config.ts",
config: "test/vitest/vitest.extension-provider-openai.config.ts",
estimatedCost: expect.any(Number),
extensionIds: ["openai"],
roots: [bundledPluginRoot("openai")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-slack.config.ts",
estimatedCost: expect.any(Number),
extensionIds: ["slack"],
roots: [bundledPluginRoot("slack")],
testFileCount: expect.any(Number),
},
{
config: "test/vitest/vitest.extension-telegram.config.ts",
estimatedCost: expect.any(Number),

View File

@@ -4,6 +4,7 @@ import {
applyParallelVitestCachePaths,
buildFullSuiteVitestRunPlans,
buildVitestRunPlans,
listFullExtensionVitestProjectConfigs,
shouldAcquireLocalHeavyCheckLock,
resolveChangedTargetArgs,
resolveParallelFullSuiteConcurrency,
@@ -28,12 +29,89 @@ describe("scripts/test-projects changed-target routing", () => {
).toBeNull();
});
it("ignores changed files that cannot map to test lanes", () => {
it("keeps the broad changed run for shared test helpers", () => {
expect(
resolveChangedTargetArgs(["--changed", "origin/main"], process.cwd(), () => [
"test/helpers/channels/plugin.ts",
]),
).toBeNull();
});
it("keeps the broad changed run for unknown root surfaces", () => {
expect(
resolveChangedTargetArgs(["--changed", "origin/main"], process.cwd(), () => [
"unknown/file.txt",
]),
).toBeNull();
});
it("skips changed docs files that cannot map to test lanes", () => {
expect(
resolveChangedTargetArgs(["--changed", "origin/main"], process.cwd(), () => [
"docs/help/testing.md",
]),
).toBeNull();
).toEqual([]);
});
it("skips root agent guidance changes instead of broad-running tests", () => {
expect(
buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => ["AGENTS.md"]),
).toEqual([]);
});
it("skips app-only changes because app tests are separate from Vitest lanes", () => {
expect(
buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => [
"apps/macos/OpenClaw/AppDelegate.swift",
]),
).toEqual([]);
});
it("adds extension tests for public plugin SDK changes", () => {
const plans = buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => [
"src/plugin-sdk/provider-entry.ts",
]);
expect(plans).toEqual([
{
config: "test/vitest/vitest.unit-fast.config.ts",
forwardedArgs: [],
includePatterns: ["src/plugin-sdk/provider-entry.test.ts"],
watchMode: false,
},
...listFullExtensionVitestProjectConfigs().map((config) => ({
config,
forwardedArgs: [],
includePatterns: null,
watchMode: false,
})),
]);
});
it("routes LM Studio changes to the provider extension lane", () => {
const plans = buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => [
"extensions/lmstudio/src/runtime.ts",
]);
expect(plans).toEqual([
{
config: "test/vitest/vitest.extension-providers.config.ts",
forwardedArgs: [],
includePatterns: ["extensions/lmstudio/src/**/*.test.ts"],
watchMode: false,
},
]);
});
it("routes the top-level extensions target to every extension shard", () => {
expect(buildVitestRunPlans(["extensions"], process.cwd())).toEqual(
listFullExtensionVitestProjectConfigs().map((config) => ({
config,
forwardedArgs: [],
includePatterns: null,
watchMode: false,
})),
);
});
it("narrows default-lane changed source files to include globs", () => {
@@ -115,7 +193,7 @@ describe("scripts/test-projects changed-target routing", () => {
]);
});
it("routes changed plugin-sdk source allowlist files to sibling light tests", () => {
it("keeps changed plugin-sdk allowlist files on sibling light tests plus extension tests", () => {
const plans = buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => [
"src/plugin-sdk/provider-entry.ts",
]);
@@ -127,6 +205,12 @@ describe("scripts/test-projects changed-target routing", () => {
includePatterns: ["src/plugin-sdk/provider-entry.test.ts"],
watchMode: false,
},
...listFullExtensionVitestProjectConfigs().map((config) => ({
config,
forwardedArgs: [],
includePatterns: null,
watchMode: false,
})),
]);
});
@@ -149,7 +233,7 @@ describe("scripts/test-projects changed-target routing", () => {
]);
});
it("keeps non-allowlisted plugin-sdk source files on the heavy lane", () => {
it("keeps non-allowlisted plugin-sdk source files on the heavy lane plus extension tests", () => {
const plans = buildVitestRunPlans(["--changed", "origin/main"], process.cwd(), () => [
"src/plugin-sdk/facade-runtime.ts",
]);
@@ -161,6 +245,12 @@ describe("scripts/test-projects changed-target routing", () => {
includePatterns: ["src/plugin-sdk/**/*.test.ts"],
watchMode: false,
},
...listFullExtensionVitestProjectConfigs().map((config) => ({
config,
forwardedArgs: [],
includePatterns: null,
watchMode: false,
})),
]);
});
@@ -316,16 +406,21 @@ describe("scripts/test-projects full-suite sharding", () => {
"test/vitest/vitest.full-auto-reply.config.ts",
"test/vitest/vitest.extension-acpx.config.ts",
"test/vitest/vitest.extension-bluebubbles.config.ts",
"test/vitest/vitest.extension-channels.config.ts",
"test/vitest/vitest.extension-diffs.config.ts",
"test/vitest/vitest.extension-discord.config.ts",
"test/vitest/vitest.extension-feishu.config.ts",
"test/vitest/vitest.extension-imessage.config.ts",
"test/vitest/vitest.extension-irc.config.ts",
"test/vitest/vitest.extension-line.config.ts",
"test/vitest/vitest.extension-mattermost.config.ts",
"test/vitest/vitest.extension-matrix.config.ts",
"test/vitest/vitest.extension-memory.config.ts",
"test/vitest/vitest.extension-messaging.config.ts",
"test/vitest/vitest.extension-msteams.config.ts",
"test/vitest/vitest.extension-provider-openai.config.ts",
"test/vitest/vitest.extension-providers.config.ts",
"test/vitest/vitest.extension-signal.config.ts",
"test/vitest/vitest.extension-slack.config.ts",
"test/vitest/vitest.extension-telegram.config.ts",
"test/vitest/vitest.extension-voice-call.config.ts",
"test/vitest/vitest.extension-whatsapp.config.ts",
@@ -499,16 +594,21 @@ describe("scripts/test-projects full-suite sharding", () => {
"test/vitest/vitest.auto-reply-reply.config.ts",
"test/vitest/vitest.extension-acpx.config.ts",
"test/vitest/vitest.extension-bluebubbles.config.ts",
"test/vitest/vitest.extension-channels.config.ts",
"test/vitest/vitest.extension-diffs.config.ts",
"test/vitest/vitest.extension-discord.config.ts",
"test/vitest/vitest.extension-feishu.config.ts",
"test/vitest/vitest.extension-imessage.config.ts",
"test/vitest/vitest.extension-irc.config.ts",
"test/vitest/vitest.extension-line.config.ts",
"test/vitest/vitest.extension-mattermost.config.ts",
"test/vitest/vitest.extension-matrix.config.ts",
"test/vitest/vitest.extension-memory.config.ts",
"test/vitest/vitest.extension-messaging.config.ts",
"test/vitest/vitest.extension-msteams.config.ts",
"test/vitest/vitest.extension-provider-openai.config.ts",
"test/vitest/vitest.extension-providers.config.ts",
"test/vitest/vitest.extension-signal.config.ts",
"test/vitest/vitest.extension-slack.config.ts",
"test/vitest/vitest.extension-telegram.config.ts",
"test/vitest/vitest.extension-voice-call.config.ts",
"test/vitest/vitest.extension-whatsapp.config.ts",

View File

@@ -22,14 +22,20 @@ import { createExtensionAcpxVitestConfig } from "./vitest/vitest.extension-acpx.
import { createExtensionBlueBubblesVitestConfig } from "./vitest/vitest.extension-bluebubbles.config.ts";
import { createExtensionChannelsVitestConfig } from "./vitest/vitest.extension-channels.config.ts";
import { createExtensionDiffsVitestConfig } from "./vitest/vitest.extension-diffs.config.ts";
import { createExtensionDiscordVitestConfig } from "./vitest/vitest.extension-discord.config.ts";
import { createExtensionFeishuVitestConfig } from "./vitest/vitest.extension-feishu.config.ts";
import { createExtensionImessageVitestConfig } from "./vitest/vitest.extension-imessage.config.ts";
import { createExtensionIrcVitestConfig } from "./vitest/vitest.extension-irc.config.ts";
import { createExtensionLineVitestConfig } from "./vitest/vitest.extension-line.config.ts";
import { createExtensionMatrixVitestConfig } from "./vitest/vitest.extension-matrix.config.ts";
import { createExtensionMattermostVitestConfig } from "./vitest/vitest.extension-mattermost.config.ts";
import { createExtensionMemoryVitestConfig } from "./vitest/vitest.extension-memory.config.ts";
import { createExtensionMessagingVitestConfig } from "./vitest/vitest.extension-messaging.config.ts";
import { createExtensionMsTeamsVitestConfig } from "./vitest/vitest.extension-msteams.config.ts";
import { createExtensionProviderOpenAiVitestConfig } from "./vitest/vitest.extension-provider-openai.config.ts";
import { createExtensionProvidersVitestConfig } from "./vitest/vitest.extension-providers.config.ts";
import { createExtensionSignalVitestConfig } from "./vitest/vitest.extension-signal.config.ts";
import { createExtensionSlackVitestConfig } from "./vitest/vitest.extension-slack.config.ts";
import { createExtensionTelegramVitestConfig } from "./vitest/vitest.extension-telegram.config.ts";
import { createExtensionVoiceCallVitestConfig } from "./vitest/vitest.extension-voice-call.config.ts";
import { createExtensionWhatsAppVitestConfig } from "./vitest/vitest.extension-whatsapp.config.ts";
@@ -183,14 +189,20 @@ describe("scoped vitest configs", () => {
const defaultExtensionBlueBubblesConfig = createExtensionBlueBubblesVitestConfig({});
const defaultExtensionChannelsConfig = createExtensionChannelsVitestConfig({});
const defaultExtensionDiffsConfig = createExtensionDiffsVitestConfig({});
const defaultExtensionDiscordConfig = createExtensionDiscordVitestConfig({});
const defaultExtensionFeishuConfig = createExtensionFeishuVitestConfig({});
const defaultExtensionImessageConfig = createExtensionImessageVitestConfig({});
const defaultExtensionIrcConfig = createExtensionIrcVitestConfig({});
const defaultExtensionLineConfig = createExtensionLineVitestConfig({});
const defaultExtensionMatrixConfig = createExtensionMatrixVitestConfig({});
const defaultExtensionMattermostConfig = createExtensionMattermostVitestConfig({});
const defaultExtensionMemoryConfig = createExtensionMemoryVitestConfig({});
const defaultExtensionMsTeamsConfig = createExtensionMsTeamsVitestConfig({});
const defaultExtensionMessagingConfig = createExtensionMessagingVitestConfig({});
const defaultExtensionProviderOpenAiConfig = createExtensionProviderOpenAiVitestConfig({});
const defaultExtensionProvidersConfig = createExtensionProvidersVitestConfig({});
const defaultExtensionSignalConfig = createExtensionSignalVitestConfig({});
const defaultExtensionSlackConfig = createExtensionSlackVitestConfig({});
const defaultExtensionTelegramConfig = createExtensionTelegramVitestConfig({});
const defaultExtensionVoiceCallConfig = createExtensionVoiceCallVitestConfig({});
const defaultExtensionWhatsAppConfig = createExtensionWhatsAppVitestConfig({});
@@ -230,7 +242,13 @@ describe("scoped vitest configs", () => {
defaultAcpConfig,
defaultExtensionsConfig,
defaultExtensionChannelsConfig,
defaultExtensionDiscordConfig,
defaultExtensionImessageConfig,
defaultExtensionLineConfig,
defaultExtensionProviderOpenAiConfig,
defaultExtensionProvidersConfig,
defaultExtensionSignalConfig,
defaultExtensionSlackConfig,
defaultInfraConfig,
defaultAutoReplyConfig,
defaultAutoReplyCoreConfig,
@@ -337,17 +355,17 @@ describe("scoped vitest configs", () => {
);
});
it("normalizes extension channel include patterns relative to the scoped dir", () => {
expect(defaultExtensionChannelsConfig.test?.dir).toBe(path.join(process.cwd(), "extensions"));
expect(defaultExtensionChannelsConfig.test?.include).toEqual(
expect.arrayContaining([
"discord/**/*.test.ts",
"line/**/*.test.ts",
"slack/**/*.test.ts",
"signal/**/*.test.ts",
"imessage/**/*.test.ts",
]),
);
it("normalizes split extension channel include patterns relative to the scoped dir", () => {
for (const [config, include] of [
[defaultExtensionDiscordConfig, "discord/**/*.test.ts"],
[defaultExtensionLineConfig, "line/**/*.test.ts"],
[defaultExtensionSlackConfig, "slack/**/*.test.ts"],
[defaultExtensionSignalConfig, "signal/**/*.test.ts"],
[defaultExtensionImessageConfig, "imessage/**/*.test.ts"],
] as const) {
expect(config.test?.dir).toBe(path.join(process.cwd(), "extensions"));
expect(config.test?.include).toEqual([include]);
}
});
it("normalizes bluebubbles extension include patterns relative to the scoped dir", () => {
@@ -385,8 +403,13 @@ describe("scoped vitest configs", () => {
it("normalizes extension provider include patterns relative to the scoped dir", () => {
expect(defaultExtensionProvidersConfig.test?.dir).toBe(path.join(process.cwd(), "extensions"));
expect(defaultExtensionProvidersConfig.test?.include).toEqual(
expect.arrayContaining(["openai/**/*.test.ts", "xai/**/*.test.ts", "google/**/*.test.ts"]),
expect.arrayContaining(["xai/**/*.test.ts", "google/**/*.test.ts"]),
);
expect(defaultExtensionProvidersConfig.test?.include).not.toContain("openai/**/*.test.ts");
expect(defaultExtensionProviderOpenAiConfig.test?.dir).toBe(
path.join(process.cwd(), "extensions"),
);
expect(defaultExtensionProviderOpenAiConfig.test?.include).toEqual(["openai/**/*.test.ts"]);
});
it("normalizes extension messaging include patterns relative to the scoped dir", () => {

View File

@@ -1,8 +1,6 @@
import path from "node:path";
import {
BUNDLED_PLUGIN_PATH_PREFIX,
bundledPluginRoot,
} from "../../scripts/lib/bundled-plugin-paths.mjs";
import { BUNDLED_PLUGIN_PATH_PREFIX } from "../../scripts/lib/bundled-plugin-paths.mjs";
import { splitChannelExtensionTestRoots } from "./vitest.extension-channel-split-paths.mjs";
const normalizeRepoPath = (value) => value.split(path.sep).join("/");
@@ -10,17 +8,13 @@ export const extensionRoutedChannelTestFiles = [];
const extensionRoutedChannelTestFileSet = new Set(extensionRoutedChannelTestFiles);
export const channelTestRoots = [
"src/channels",
bundledPluginRoot("discord"),
bundledPluginRoot("slack"),
bundledPluginRoot("signal"),
bundledPluginRoot("imessage"),
bundledPluginRoot("line"),
];
export const channelTestRoots = ["src/channels", ...splitChannelExtensionTestRoots];
export const extensionChannelTestRoots = channelTestRoots.filter((root) =>
root.startsWith(BUNDLED_PLUGIN_PATH_PREFIX),
const splitChannelExtensionTestRootSet = new Set(splitChannelExtensionTestRoots);
export const extensionChannelTestRoots = channelTestRoots.filter(
(root) =>
root.startsWith(BUNDLED_PLUGIN_PATH_PREFIX) && !splitChannelExtensionTestRootSet.has(root),
);
export const coreChannelTestRoots = channelTestRoots.filter(
(root) => !root.startsWith(BUNDLED_PLUGIN_PATH_PREFIX),

View File

@@ -48,16 +48,21 @@ export const rootVitestProjects = [
"test/vitest/vitest.channels.config.ts",
"test/vitest/vitest.extension-acpx.config.ts",
"test/vitest/vitest.extension-bluebubbles.config.ts",
"test/vitest/vitest.extension-channels.config.ts",
"test/vitest/vitest.extension-diffs.config.ts",
"test/vitest/vitest.extension-discord.config.ts",
"test/vitest/vitest.extension-feishu.config.ts",
"test/vitest/vitest.extension-imessage.config.ts",
"test/vitest/vitest.extension-irc.config.ts",
"test/vitest/vitest.extension-line.config.ts",
"test/vitest/vitest.extension-mattermost.config.ts",
"test/vitest/vitest.extension-matrix.config.ts",
"test/vitest/vitest.extension-memory.config.ts",
"test/vitest/vitest.extension-msteams.config.ts",
"test/vitest/vitest.extension-messaging.config.ts",
"test/vitest/vitest.extension-provider-openai.config.ts",
"test/vitest/vitest.extension-providers.config.ts",
"test/vitest/vitest.extension-signal.config.ts",
"test/vitest/vitest.extension-slack.config.ts",
"test/vitest/vitest.extension-telegram.config.ts",
"test/vitest/vitest.extension-voice-call.config.ts",
"test/vitest/vitest.extension-whatsapp.config.ts",

View File

@@ -0,0 +1,14 @@
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function createSingleChannelExtensionVitestConfig(
extensionId: string,
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig([`${extensionId}/**/*.test.ts`], {
dir: "extensions",
env,
name: `extension-${extensionId}`,
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
});
}

View File

@@ -0,0 +1,44 @@
import { bundledPluginRoot } from "../../scripts/lib/bundled-plugin-paths.mjs";
export const splitChannelExtensionShardSpecs = [
{
id: "discord",
kind: "extensionDiscord",
config: "test/vitest/vitest.extension-discord.config.ts",
},
{
id: "slack",
kind: "extensionSlack",
config: "test/vitest/vitest.extension-slack.config.ts",
},
{
id: "signal",
kind: "extensionSignal",
config: "test/vitest/vitest.extension-signal.config.ts",
},
{
id: "imessage",
kind: "extensionImessage",
config: "test/vitest/vitest.extension-imessage.config.ts",
},
{
id: "line",
kind: "extensionLine",
config: "test/vitest/vitest.extension-line.config.ts",
},
];
export const splitChannelExtensionTestRoots = splitChannelExtensionShardSpecs.map((spec) =>
bundledPluginRoot(spec.id),
);
export function resolveSplitChannelExtensionShard(root) {
const normalizedRoot = root.replaceAll("\\", "/");
return splitChannelExtensionShardSpecs.find(
(spec) => bundledPluginRoot(spec.id) === normalizedRoot,
);
}
export function isSplitChannelExtensionRoot(root) {
return Boolean(resolveSplitChannelExtensionShard(root));
}

View File

@@ -0,0 +1,9 @@
import { createSingleChannelExtensionVitestConfig } from "./vitest.extension-channel-single-config.ts";
export function createExtensionDiscordVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createSingleChannelExtensionVitestConfig("discord", env);
}
export default createExtensionDiscordVitestConfig();

View File

@@ -0,0 +1,9 @@
import { createSingleChannelExtensionVitestConfig } from "./vitest.extension-channel-single-config.ts";
export function createExtensionImessageVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createSingleChannelExtensionVitestConfig("imessage", env);
}
export default createExtensionImessageVitestConfig();

View File

@@ -0,0 +1,9 @@
import { createSingleChannelExtensionVitestConfig } from "./vitest.extension-channel-single-config.ts";
export function createExtensionLineVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createSingleChannelExtensionVitestConfig("line", env);
}
export default createExtensionLineVitestConfig();

View File

@@ -0,0 +1,27 @@
import { providerOpenAiExtensionTestRoots } from "./vitest.extension-provider-paths.mjs";
import { loadPatternListFromEnv } from "./vitest.pattern-file.ts";
import { createScopedVitestConfig } from "./vitest.scoped-config.ts";
export function loadIncludePatternsFromEnv(
env: Record<string, string | undefined> = process.env,
): string[] | null {
return loadPatternListFromEnv("OPENCLAW_VITEST_INCLUDE_FILE", env);
}
export function createExtensionProviderOpenAiVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createScopedVitestConfig(
loadIncludePatternsFromEnv(env) ??
providerOpenAiExtensionTestRoots.map((root) => `${root}/**/*.test.ts`),
{
dir: "extensions",
env,
name: "extension-provider-openai",
passWithNoTests: true,
setupFiles: ["test/setup.extensions.ts"],
},
);
}
export default createExtensionProviderOpenAiVitestConfig();

View File

@@ -14,6 +14,7 @@ export const providerExtensionIds = [
"groq",
"huggingface",
"kimi-coding",
"lmstudio",
"microsoft",
"microsoft-foundry",
"minimax",
@@ -22,7 +23,6 @@ export const providerExtensionIds = [
"moonshot",
"nvidia",
"ollama",
"openai",
"openrouter",
"qianfan",
"stepfun",
@@ -33,8 +33,17 @@ export const providerExtensionIds = [
"zai",
];
export const providerOpenAiExtensionIds = ["openai"];
export const providerExtensionTestRoots = providerExtensionIds.map((id) => bundledPluginRoot(id));
export const providerOpenAiExtensionTestRoots = providerOpenAiExtensionIds.map((id) =>
bundledPluginRoot(id),
);
export function isProviderExtensionRoot(root) {
return providerExtensionTestRoots.includes(root);
}
export function isProviderOpenAiExtensionRoot(root) {
return providerOpenAiExtensionTestRoots.includes(root);
}

View File

@@ -0,0 +1,9 @@
import { createSingleChannelExtensionVitestConfig } from "./vitest.extension-channel-single-config.ts";
export function createExtensionSignalVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createSingleChannelExtensionVitestConfig("signal", env);
}
export default createExtensionSignalVitestConfig();

View File

@@ -0,0 +1,9 @@
import { createSingleChannelExtensionVitestConfig } from "./vitest.extension-channel-single-config.ts";
export function createExtensionSlackVitestConfig(
env: Record<string, string | undefined> = process.env,
) {
return createSingleChannelExtensionVitestConfig("slack", env);
}
export default createExtensionSlackVitestConfig();

View File

@@ -10,7 +10,10 @@ import { mattermostExtensionTestRoots } from "./vitest.extension-mattermost-path
import { memoryExtensionTestRoots } from "./vitest.extension-memory-paths.mjs";
import { messagingExtensionTestRoots } from "./vitest.extension-messaging-paths.mjs";
import { msTeamsExtensionTestRoots } from "./vitest.extension-msteams-paths.mjs";
import { providerExtensionTestRoots } from "./vitest.extension-provider-paths.mjs";
import {
providerExtensionTestRoots,
providerOpenAiExtensionTestRoots,
} from "./vitest.extension-provider-paths.mjs";
import { telegramExtensionTestRoots } from "./vitest.extension-telegram-paths.mjs";
import { voiceCallExtensionTestRoots } from "./vitest.extension-voice-call-paths.mjs";
import { whatsAppExtensionTestRoots } from "./vitest.extension-whatsapp-paths.mjs";
@@ -47,6 +50,7 @@ export function createExtensionsVitestConfig(
...memoryExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...messagingExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...msTeamsExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...providerOpenAiExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...providerExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...telegramExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),
...voiceCallExtensionTestRoots.map((root) => `${root.replace(/^extensions\//u, "")}/**`),

View File

@@ -61,14 +61,20 @@ const SCOPED_PROJECT_GROUP_ORDER_BY_NAME = new Map(
"extension-bluebubbles",
"extension-channels",
"extension-diffs",
"extension-discord",
"extension-feishu",
"extension-imessage",
"extension-irc",
"extension-line",
"extension-mattermost",
"extension-matrix",
"extension-memory",
"extension-messaging",
"extension-msteams",
"extension-provider-openai",
"extension-providers",
"extension-signal",
"extension-slack",
"extension-telegram",
"extension-voice-call",
"extension-whatsapp",

View File

@@ -142,13 +142,18 @@ export const sharedVitestConfig = {
"test/vitest/vitest.extension-acpx.config.ts",
"test/vitest/vitest.extension-bluebubbles-paths.mjs",
"test/vitest/vitest.extension-bluebubbles.config.ts",
"test/vitest/vitest.extension-channel-single-config.ts",
"test/vitest/vitest.extension-channel-split-paths.mjs",
"test/vitest/vitest.extension-channels.config.ts",
"test/vitest/vitest.extension-diffs-paths.mjs",
"test/vitest/vitest.extension-diffs.config.ts",
"test/vitest/vitest.extension-discord.config.ts",
"test/vitest/vitest.extension-feishu-paths.mjs",
"test/vitest/vitest.extension-feishu.config.ts",
"test/vitest/vitest.extension-imessage.config.ts",
"test/vitest/vitest.extension-irc-paths.mjs",
"test/vitest/vitest.extension-irc.config.ts",
"test/vitest/vitest.extension-line.config.ts",
"test/vitest/vitest.extension-mattermost-paths.mjs",
"test/vitest/vitest.extension-mattermost.config.ts",
"test/vitest/vitest.extension-matrix-paths.mjs",
@@ -195,7 +200,10 @@ export const sharedVitestConfig = {
"test/vitest/vitest.extension-zalo-paths.mjs",
"test/vitest/vitest.extension-zalo.config.ts",
"test/vitest/vitest.extension-provider-paths.mjs",
"test/vitest/vitest.extension-provider-openai.config.ts",
"test/vitest/vitest.extension-providers.config.ts",
"test/vitest/vitest.extension-signal.config.ts",
"test/vitest/vitest.extension-slack.config.ts",
"test/vitest/vitest.logging.config.ts",
"test/vitest/vitest.process.config.ts",
"test/vitest/vitest.tasks.config.ts",

View File

@@ -103,16 +103,21 @@ export const fullSuiteVitestShards = [
projects: [
"test/vitest/vitest.extension-acpx.config.ts",
"test/vitest/vitest.extension-bluebubbles.config.ts",
"test/vitest/vitest.extension-channels.config.ts",
"test/vitest/vitest.extension-diffs.config.ts",
"test/vitest/vitest.extension-discord.config.ts",
"test/vitest/vitest.extension-feishu.config.ts",
"test/vitest/vitest.extension-imessage.config.ts",
"test/vitest/vitest.extension-irc.config.ts",
"test/vitest/vitest.extension-line.config.ts",
"test/vitest/vitest.extension-mattermost.config.ts",
"test/vitest/vitest.extension-matrix.config.ts",
"test/vitest/vitest.extension-memory.config.ts",
"test/vitest/vitest.extension-messaging.config.ts",
"test/vitest/vitest.extension-msteams.config.ts",
"test/vitest/vitest.extension-provider-openai.config.ts",
"test/vitest/vitest.extension-providers.config.ts",
"test/vitest/vitest.extension-signal.config.ts",
"test/vitest/vitest.extension-slack.config.ts",
"test/vitest/vitest.extension-telegram.config.ts",
"test/vitest/vitest.extension-voice-call.config.ts",
"test/vitest/vitest.extension-whatsapp.config.ts",