





















@@ -83,7 +83,7 @@ afterEach(() => {
8383});
84848585function buildPreparedCliRunContext(params: {
86-provider: "claude-cli" | "codex-cli";
86+provider: "claude-cli" | "codex-cli" | "google-gemini-cli";
8787model: string;
8888runId: string;
8989prompt?: string;
@@ -106,33 +106,46 @@ function buildPreparedCliRunContext(params: {
106106// Produces a prepared context without invoking prepare.runtime, keeping spawn
107107// assertions focused on execute/runtime behavior.
108108const workspaceDir = params.workspaceDir ?? "/tmp";
109-const baseBackend =
110-params.provider === "claude-cli"
111- ? {
112-command: "claude",
113-args: ["-p", "--output-format", "stream-json"],
114-output: "jsonl" as const,
115-input: "stdin" as const,
116-modelArg: "--model",
117-sessionArg: "--session-id",
118-sessionMode: "always" as const,
119-systemPromptFileArg: "--append-system-prompt-file",
120-systemPromptWhen: "first" as const,
121-serialize: true,
122-}
123- : {
124-command: "codex",
125-args: ["exec", "--json"],
126-resumeArgs: ["exec", "resume", "{sessionId}", "--skip-git-repo-check"],
127-output: "text" as const,
128-input: "arg" as const,
129-modelArg: "--model",
130-sessionMode: "existing" as const,
131-systemPromptFileConfigArg: "-c",
132-systemPromptFileConfigKey: "model_instructions_file",
133-systemPromptWhen: "first" as const,
134-serialize: true,
135-};
109+const baseBackend = (() => {
110+if (params.provider === "claude-cli") {
111+return {
112+command: "claude",
113+args: ["-p", "--output-format", "stream-json"],
114+output: "jsonl" as const,
115+input: "stdin" as const,
116+modelArg: "--model",
117+sessionArg: "--session-id",
118+sessionMode: "always" as const,
119+systemPromptFileArg: "--append-system-prompt-file",
120+systemPromptWhen: "first" as const,
121+serialize: true,
122+};
123+}
124+if (params.provider === "google-gemini-cli") {
125+return {
126+command: "gemini",
127+args: ["--skip-trust", "--output-format", "json", "--prompt", "{prompt}"],
128+output: "json" as const,
129+input: "arg" as const,
130+modelArg: "--model",
131+sessionMode: "existing" as const,
132+serialize: true,
133+};
134+}
135+return {
136+command: "codex",
137+args: ["exec", "--json"],
138+resumeArgs: ["exec", "resume", "{sessionId}", "--skip-git-repo-check"],
139+output: "text" as const,
140+input: "arg" as const,
141+modelArg: "--model",
142+sessionMode: "existing" as const,
143+systemPromptFileConfigArg: "-c",
144+systemPromptFileConfigKey: "model_instructions_file",
145+systemPromptWhen: "first" as const,
146+serialize: true,
147+};
148+})();
136149const backend = { ...baseBackend, ...params.backend };
137150return {
138151params: {
@@ -158,7 +171,12 @@ function buildPreparedCliRunContext(params: {
158171id: params.provider,
159172config: backend,
160173bundleMcp: params.provider === "claude-cli",
161-pluginId: params.provider === "claude-cli" ? "anthropic" : "openai",
174+pluginId:
175+params.provider === "claude-cli"
176+ ? "anthropic"
177+ : params.provider === "google-gemini-cli"
178+ ? "google"
179+ : "openai",
162180resolveExecutionArgs: params.resolveExecutionArgs,
163181},
164182preparedBackend: {
@@ -562,6 +580,30 @@ describe("runCliAgent spawn path", () => {
562580);
563581});
564582583+it("logs Gemini CLI runtime env key diagnostics without debug output enabled", async () => {
584+mockSuccessfulCliRun();
585+const infoSpy = vi.spyOn(cliBackendLog, "info");
586+587+await executePreparedCliRun(
588+buildPreparedCliRunContext({
589+provider: "google-gemini-cli",
590+model: "gemini-3.1-pro-preview",
591+runId: "run-gemini-env-diagnostics",
592+preparedEnv: {
593+GEMINI_CLI_HOME: "/tmp/openclaw-gemini-profile-home",
594+GEMINI_CLI_SYSTEM_SETTINGS_PATH: "/tmp/openclaw-gemini-system-settings.json",
595+},
596+}),
597+);
598+599+const envLog = infoSpy.mock.calls
600+.map((call) => String(call[0]))
601+.find((line) => line.startsWith("cli env auth:"));
602+expect(envLog).toContain("runtimeChild=GEMINI_CLI_HOME,GEMINI_CLI_SYSTEM_SETTINGS_PATH");
603+expect(envLog).not.toContain("/tmp/openclaw-gemini-profile-home");
604+expect(envLog).not.toContain("/tmp/openclaw-gemini-system-settings.json");
605+});
606+565607it("passes OpenClaw skills to Claude as a session plugin", async () => {
566608const workspaceDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-cli-skills-"));
567609const skillDir = path.join(workspaceDir, "skills", "weather");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。