From 2620fda5007bd408fe067a0f93c712992aa020c4 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Thu, 5 Feb 2026 00:13:55 +0700 Subject: [PATCH] Skip CLI-dependent tests in CI --- .../agent/providers/claude-agent.test.ts | 18 ++++++++++++------ .../agent/providers/opencode-agent.test.ts | 14 +++++++++++++- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/server/src/server/agent/providers/claude-agent.test.ts b/packages/server/src/server/agent/providers/claude-agent.test.ts index 88238a1ce..c66cb172c 100644 --- a/packages/server/src/server/agent/providers/claude-agent.test.ts +++ b/packages/server/src/server/agent/providers/claude-agent.test.ts @@ -18,12 +18,6 @@ import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; import { createTestLogger } from "../../../test-utils/test-logger.js"; import { ClaudeAgentClient, convertClaudeHistoryEntry } from "./claude-agent.js"; import { useTempClaudeConfigDir } from "../../test-utils/claude-config.js"; -import { - hydrateStreamState, - type StreamItem, - type AgentToolCallData, - isAgentToolCallItem, -} from "../../../../../app/src/types/stream.js"; import type { AgentStreamEventPayload } from "../../messages.js"; import type { AgentProvider, @@ -41,6 +35,9 @@ const createHTTPServer = createServer; const hasClaudeCredentials = !!process.env.CLAUDE_SESSION_TOKEN || !!process.env.ANTHROPIC_API_KEY; +type StreamItem = any; +type AgentToolCallData = any; + function tmpCwd(): string { const dir = mkdtempSync(path.join(os.tmpdir(), "claude-agent-e2e-")); try { @@ -231,6 +228,10 @@ async function startAgentMcpServer(): Promise { "ClaudeAgentClient (SDK integration)", () => { const logger = createTestLogger(); + let hydrateStreamState: (updates: unknown[]) => unknown = () => { + throw new Error("hydrateStreamState not initialized"); + }; + let isAgentToolCallItem: (item: unknown) => boolean = () => false; let agentMcpServer: AgentMcpServerHandle; let restoreClaudeConfigDir: (() => void) | null = null; const buildConfig = ( @@ -253,6 +254,11 @@ async function startAgentMcpServer(): Promise { beforeAll(() => { restoreClaudeConfigDir = useTempClaudeConfigDir(); }); + beforeAll(async () => { + const stream = await import("../../../../../app/src/types/stream.js"); + hydrateStreamState = stream.hydrateStreamState as typeof hydrateStreamState; + isAgentToolCallItem = stream.isAgentToolCallItem as typeof isAgentToolCallItem; + }); beforeAll(async () => { agentMcpServer = await startAgentMcpServer(); }); diff --git a/packages/server/src/server/agent/providers/opencode-agent.test.ts b/packages/server/src/server/agent/providers/opencode-agent.test.ts index 17979872a..deb43ff6a 100644 --- a/packages/server/src/server/agent/providers/opencode-agent.test.ts +++ b/packages/server/src/server/agent/providers/opencode-agent.test.ts @@ -2,6 +2,7 @@ import { beforeAll, describe, expect, test, vi } from "vitest"; import { mkdtempSync, realpathSync, rmSync, writeFileSync } from "node:fs"; import os from "node:os"; import path from "node:path"; +import { execFileSync } from "node:child_process"; import { createTestLogger } from "../../../test-utils/test-logger.js"; import { OpenCodeAgentClient } from "./opencode-agent.js"; @@ -74,7 +75,18 @@ async function collectTurnEvents( return result; } -describe("OpenCodeAgentClient", () => { +function isBinaryInstalled(binary: string): boolean { + try { + const out = execFileSync("which", [binary], { encoding: "utf8" }).trim(); + return out.length > 0; + } catch { + return false; + } +} + +const hasOpenCode = isBinaryInstalled("opencode"); + +(hasOpenCode ? describe : describe.skip)("OpenCodeAgentClient", () => { const logger = createTestLogger(); const buildConfig = (cwd: string): AgentSessionConfig => ({ provider: "opencode",