mirror of
https://github.com/google-gemini/gemini-cli.git
synced 2026-05-15 06:12:50 -07:00
Add support for a shellToolRcFile setting
This commit is contained in:
@@ -925,6 +925,7 @@ export async function loadCliConfig(
|
||||
toolDiscoveryCommand: settings.tools?.discoveryCommand,
|
||||
toolCallCommand: settings.tools?.callCommand,
|
||||
mcpServerCommand,
|
||||
shellToolRcFile: settings.tools?.shell?.rcFile,
|
||||
mcpServers,
|
||||
mcpEnablementCallbacks,
|
||||
mcpEnabled,
|
||||
|
||||
@@ -1637,6 +1637,16 @@ const SETTINGS_SCHEMA = {
|
||||
'Enable shell output efficiency optimizations for better performance.',
|
||||
showInDialog: false,
|
||||
},
|
||||
rcFile: {
|
||||
type: 'string',
|
||||
label: 'Shell Tool RC File',
|
||||
category: 'Tools',
|
||||
requiresRestart: false,
|
||||
default: undefined as string | undefined,
|
||||
description:
|
||||
'The path to a bash file (e.g., .bashrc) to source before executing shell commands.',
|
||||
showInDialog: false,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
|
||||
@@ -602,6 +602,7 @@ export interface ConfigParameters {
|
||||
toolDiscoveryCommand?: string;
|
||||
toolCallCommand?: string;
|
||||
mcpServerCommand?: string;
|
||||
shellToolRcFile?: string;
|
||||
mcpServers?: Record<string, MCPServerConfig>;
|
||||
mcpEnablementCallbacks?: McpEnablementCallbacks;
|
||||
userMemory?: string | HierarchicalMemory;
|
||||
@@ -779,6 +780,7 @@ export class Config implements McpContext, AgentLoopContext {
|
||||
private readonly toolDiscoveryCommand: string | undefined;
|
||||
private readonly toolCallCommand: string | undefined;
|
||||
private readonly mcpServerCommand: string | undefined;
|
||||
private readonly shellToolRcFile: string | undefined;
|
||||
private readonly mcpEnabled: boolean;
|
||||
private readonly extensionsEnabled: boolean;
|
||||
private mcpServers: Record<string, MCPServerConfig> | undefined;
|
||||
@@ -1047,6 +1049,7 @@ export class Config implements McpContext, AgentLoopContext {
|
||||
this.toolDiscoveryCommand = params.toolDiscoveryCommand;
|
||||
this.toolCallCommand = params.toolCallCommand;
|
||||
this.mcpServerCommand = params.mcpServerCommand;
|
||||
this.shellToolRcFile = params.shellToolRcFile;
|
||||
this.mcpServers = params.mcpServers;
|
||||
this.mcpEnablementCallbacks = params.mcpEnablementCallbacks;
|
||||
this.mcpEnabled = params.mcpEnabled ?? true;
|
||||
@@ -2318,6 +2321,10 @@ export class Config implements McpContext, AgentLoopContext {
|
||||
return this.mcpServerCommand;
|
||||
}
|
||||
|
||||
getShellToolRcFile(): string | undefined {
|
||||
return this.shellToolRcFile;
|
||||
}
|
||||
|
||||
/**
|
||||
* The user configured MCP servers (via gemini settings files).
|
||||
*
|
||||
|
||||
@@ -164,6 +164,7 @@ describe('ShellTool', () => {
|
||||
addPersistentApproval: vi.fn(),
|
||||
addSessionApproval: vi.fn(),
|
||||
},
|
||||
getShellToolRcFile: vi.fn().mockReturnValue(undefined),
|
||||
} as unknown as Config;
|
||||
|
||||
const bus = createMockMessageBus();
|
||||
@@ -486,6 +487,25 @@ EOF`;
|
||||
expect(mockShellExecutionService.mock.calls[0][0]).toMatch(/\nEOF\n\)\n/);
|
||||
});
|
||||
|
||||
it('should source rcfile when shellToolRcFile setting is present', async () => {
|
||||
const rcFilePath = '~/.geminirc';
|
||||
(mockConfig.getShellToolRcFile as Mock).mockReturnValue(rcFilePath);
|
||||
|
||||
const invocation = shellTool.build({ command: 'my-command' });
|
||||
const promise = invocation.execute({ abortSignal: mockAbortSignal });
|
||||
resolveShellExecution();
|
||||
await promise;
|
||||
|
||||
expect(mockShellExecutionService).toHaveBeenCalledWith(
|
||||
expect.stringContaining(`source ${rcFilePath} && my-command`),
|
||||
expect.any(String),
|
||||
expect.any(Function),
|
||||
expect.any(AbortSignal),
|
||||
false,
|
||||
expect.any(Object),
|
||||
);
|
||||
});
|
||||
|
||||
it('should format error messages correctly', async () => {
|
||||
const error = new Error('wrapped command failed');
|
||||
const invocation = shellTool.build({ command: 'user-command' });
|
||||
|
||||
@@ -462,13 +462,19 @@ export class ShellToolInvocation extends BaseToolInvocation<
|
||||
const combinedController = new AbortController();
|
||||
|
||||
const onAbort = () => combinedController.abort();
|
||||
let strippedCommandWithRc = strippedCommand;
|
||||
const rcFilePath = this.context.config.getShellToolRcFile();
|
||||
if (rcFilePath) {
|
||||
strippedCommandWithRc = `source ${rcFilePath} && ${strippedCommand}`;
|
||||
}
|
||||
|
||||
try {
|
||||
tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'gemini-shell-'));
|
||||
tempFilePath = path.join(tempDir, 'pgrep.tmp');
|
||||
|
||||
// pgrep is not available on Windows, so we can't get background PIDs
|
||||
const commandToExecute = this.wrapCommandForPgrep(
|
||||
strippedCommand,
|
||||
strippedCommandWithRc,
|
||||
tempFilePath,
|
||||
isWindows,
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user